Affärsregler
Affärsregler (Business Rules) är en tilläggstjänst till LogTrade Distribution 2.0. Funktionen används för att automatiskt välja transportör och transportprodukt baserat på ett fördefinierat regelverk. På så sätt kan man automatiskt välja det mest ekonomiskt fördelaktiga transportalternativet.
För att godtycklig transportör, transportörsprodukt och transportörstjänster ska kunna väljas in är funktionen baserad på att regelverket väljer en sändningsmall som sändningen i sin tur baseras på. Detta gör det också möjligt att komplettera sändningen med valfria fasta uppgifter, exempelvis en viss tranportörstjänst.
Användning
I LogTrade Distribution lägger man först upp de sändningsmallar som ska användas av affärsreglerna, och därefter lägger man upp en sorterad lista av regler. Regeln anger vilka kriterier som ska vara uppfyllda för att regeln ska matcha, och anger namnet på tillhörande sändningsmall. När en sändnings skapas evalueras reglerna i tur och ordning och den första regel som matchar bestämmer vilken sändningsmall som sändningen ska baseras på. Sändningen fylls därefter på med specifika värden, antingen med uppgifter som överförts via ERP-gränssnittet, eller manuellt via användargränssnittet.
Teknik
Syntax
Syntaxen för regler i Affärsregler är baserat på den öppna internetstandarden XPath 1.0, ett språk som normalt används för att ställa frågor mot en XML-datakälla. XPath är en standard som också används i andra internetstandarder såsom XSLT, XQuery och XPointer.
XPath definition: http://www.w3.org/TR/xpath
Introduktion till XPath: http://www.w3schools.com/XPath/default.asp
Regelverket
Till skillnad från normal användning av XPath där en fråga kan evalueras till ett värde, eller en lista av matchande XML-noder, är en regel i Affärsregler begränsad till att enbart evalueras till värdet sant eller falskt. En annan skillnad är att användandet av XPath-prefix inte används.
Sändningsdata
Regelverket evalueras mot en XML-representation av de sändningsdata som ligger som grund för sändningen. Schemat för denna XML-representation är densamma som används i ERP-gränssnittet för typen Shipment, och återfinns alltså i den WSDL-definition som används för ERP-gränssnittets web service, och som finns dokumenterade i ett separat dokument. I typen Shipment finns också fälten CustomData1 till CustomData5 som kan användas för att överföra andra uppgifter än rena sändningsdata, dessa kan användas av regelverket för att testa valfria kriteria. Exempelvis kan man skicka med en flagga som anger om sändningen ska till en privatkund eller ett företag, vilket ju påverkar vilken transportörsprodukt som är aktuell att använda, exempelvis Postens produkt Företagspaket kontra Postpaket.
Exempel
Sändningsdata
<?xml version="1.0" encoding="utf-16"?>
<Shipment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://services.logtrade.info/Logtrade.Distribution">
<ForwarderCode>AnyForwarder</ForwarderCode>
<TestFlag>false</TestFlag>
<SenderAddressId>1</SenderAddressId>
<ShipmentDate>2009-03-25T00:00:00</ShipmentDate>
<ProductCode>AnyProduct</ProductCode>
<ShipmentAddresses>
<ShipmentAddress>
<CustomData1>F</CustomData1>
<AddressType>Recipient</AddressType>
<Name>LogTrade Barlink AB</Name>
<Address1>Jungmansgatan 12</Address1>
<ZipCode>211 19</ZipCode>
<City>Malmö</City>
<CountryCode>SE</CountryCode>
<ContactPerson>LogTrade Kundtjänst</ContactPerson>
</ShipmentAddress>
</ShipmentAddresses>
<ShipmentServices>
<ShipmentServiceBase xsi:type="GenericForwarderCashOnDeliveryService">
<Amount>1200</Amount>
<CurrencyCode>SEK</CurrencyCode>
<Reference>42300098794231874</Reference>
<AccountType>PostalGiro</AccountType>
<AccountNumber>123456-7</AccountNumber>
<ReferenceType>OCR</ReferenceType>
</ShipmentServiceBase>
</ShipmentServices>
<GoodsItems>
<GoodsItem>
<GoodsDescription>Datorutrustning</GoodsDescription>
<NumberOfPackages>2</NumberOfPackages>
<TypeOfPackages>Paket</TypeOfPackages>
<GrossWeight>12</GrossWeight>
<Volume>0</Volume>
<LoadingMeters>0</LoadingMeters>
<TypeOfPackageCode>PC</TypeOfPackageCode>
</GoodsItem>
</GoodsItems>
</Shipment>
Ovanstående sändning består av 2 kolli på tillsammans totalt 12 kg, med tilläggstjänsten efterkrav på 1200 kronor. CustomData1 har fått värdet F för att markera att sändningen skickas till ett företag.
Regler
En regel består som nämnts tidigare av en XPath-funktion som ska returnera ett värde av typen boolean. Uttrycken evalueras alltid med noden Shipment förvald. Regler kan också byggas på i komplexitet genom att kombinera flera olika funktioner med operatorerna and och or.
Exempel på regler:
Denna regel returnerar sant om sändningen ska levereras till Norge:
ShipmentAddresses/ShipmentAddress[AddressType='Recipient']/CountryCode='NO' or ShipmentAddresses/ShipmentAddress[AddressType='Delivery']/CountryCode='NO'
Denna regel returnerar sant om sändningen består av ett kolli på totalt max 10 kg, och där CustomData har värdet F:
sum(//NumberOfPackages) = 1 and sum(//GrossWeight) <= 10 and CustomData1=’F’
Denna regel returnerar sant om sändningen består av max två kolli på totalt max 20 kg:
sum(//NumberOfPackages)<=2 and sum(//GrossWeight) =< 20
Denna regel returnerar sant om sändningen består av max två kolli med max kollivikt 20 kg:
sum(//NumberOfPackages)<=2 and count(GoodsItems/GoodsItem[GrossWeight>20])=0
Denna regel returnerar sant om sändningens totala volym är större än 0,8 kubikmeter:
sum(GoodsItems/GoodsItem/Volume) > 0.8
Denna regel returnerar sant om sändningen har tilläggstjänsten efterkrav:
count(//ShipmentServiceBase[@xsi:type='GenericForwarderCashOnDeliveryService'])>0
Denna regel returnerar alltid sant, och kan exempelvis användas den för sista regeln i listan:
true()
Kontrollera att inget mått är över 1.2m:
(count(GoodsItems/GoodsItem/PackageItems/PackageItem[Width > 1.2]) = 0 and
count(GoodsItems/GoodsItem/PackageItems/PackageItem[Length > 1.2]) = 0 and
count(GoodsItems/GoodsItem/PackageItems/PackageItem[Height > 1.2]) = 0)
Vikt mellan 20-30 kg:
(GoodsItems/GoodsItem/GrossWeight >= 20
or
GoodsItems/GoodsItem/GrossWeight <= 30)
Antal kollin är 1:
sum(GoodsItems/GoodsItem/NumberOfPackages) = 1
Mottagaren är i Norge:
ShipmentAddresses/ShipmentAddress[AddressType='Recipient']/CountryCode = 'NO'
Mottagaren ej är i Sverige:
ShipmentAddresses/ShipmentAddress[AddressType='Recipient']/CountryCode != 'SE'
Totala vikten av sändningen är lika med eller under 100 kg:
(sum(/GoodsItems/GoodsItem/Grossweight) <= 100)
Mottagaren är inom EU:
contains('BE,BG,CY,DK,EE,FI,FR,GR,IE,IT,LT,LI,LU,MT,NL,AT,PL,PT,RU,SK,SI,ES,UK,SE,CZ,DE,HU',ShipmentAddresses/ShipmentAddress[AddressType='Recipient']/CountryCode)