Rule Engine

Hvad er Rule Engine?

Rule Engine giver dig mulighed for at opsætte JavaScript-regler der automatisk kører, når bestemte hændelser sker i systemet – f.eks. når en ny ordre modtages, eller når et produkt importeres. Reglerne skrives direkte i en editor (samme editor som VS Code) med fuld autokomplettering og fejlkontrol.

Kun én regel pr. type kan være aktiv ad gangen. Når du aktiverer en regel, deaktiveres andre regler af samme type automatisk.

Tilgængelige regeltyper

RegeltypeTriggerBeskrivelseReturværdi
Subsite AssignmentNy ordre modtagesTildel en subsite til ordren baseret på ordredatanumber (subsite ID)
Order ModificationNy ordre modtagesModificer ordrefelter (adresser, noter, valuta, fragt, mm.)Order (det modificerede ordre-objekt)
Sticker AssignmentNy ordre modtagesTildel stickers til ordrenstring eller string[] (sticker identifiers)
Return Shipment ProviderReturlabel oprettesVælg fragtleverandør til returlabelsstring (shipper identifier)
Auto Print ChooseAutoprint udløsesVælg printer eller printstation for autoprint{ printStationId?: number, printerId?: string }
Product Import ModifyProdukt importeresModificer produktfelter under importProduct (det modificerede produkt-objekt)
Product Import FilterProdukt importeresFiltrer produkter fra under importboolean (true = importer, false = spring over)

Sådan opretter du en regel

  1. Gå til Rule Engine i menuen (kræver Rule Engine-rettighed)
  2. Klik Opret regel
  3. Udfyld:
    • Navn – et beskrivende navn (f.eks. “SKI-ordrer til Offentligt Udbud”)
    • Type – vælg den regeltype du ønsker
    • Aktiv – sæt flueben for at aktivere reglen
    • Enable Log – sæt flueben for at logge alle kørsler (anbefalet i testfasen)
  4. Skriv dit JavaScript i editoren
  5. Test scriptet inden du gemmer (fold “Test Script”-panelet ud)
  6. Klik Gem

Editor og Reference Card

Når du vælger en regeltype, viser editoren automatisk et Reference Card med alle tilgængelige variabler og deres typer. Du får også fuld TypeScript-autokomplettering – prøv at skrive order. og se de tilgængelige felter.

Tilgængelige funktioner

FunktionBeskrivelse
log("besked")Skriver en besked til ordrens transaktionslog – nyttig til debugging og sporbarhed
return <værdi>Returnerer resultatet af reglen – hvad du returnerer afhænger af regeltypen

Ordre-objekt (tilgængeligt i de fleste regeltyper)

De vigtigste felter på order:

FeltTypeBeskrivelse
order.orderIDnumberOrdre-ID
order.referencestringOrdrereference
order.subSitenumberNuværende subsite-ID
order.currencystringValutakode
order.statusstringOrdrestatus
order.cargoMethodstringFragtmetode
order.notestringKundenote
order.internalNotestringIntern note
order.deliveryNotestringLeveringsnote
order.addressAddressFaktureringsadresse
order.deliveryAddressAddressLeveringsadresse
order.linesOrderLine[]Ordrelinjer
order.extraRecordEkstra felter

Addressfelter: namestreetcityzipmailphonecompanyNumbercompanyNamecountryeanstreet2state

OrderLinefelter: lineIDtitlepriceitemNumberamountamountDeliverednoteextrauom

Test af regler

Før du gemmer en regel, kan du teste den:

  1. Fold “Test Script”-panelet ud nederst på siden
  2. Indtast et Order ID (eller de felter regeltypen kræver)
  3. Klik Test Script
  4. Resultatet vises med:
    • Input Context – de data din regel modtog (det faktiske ordre-objekt)
    • Output Result – hvad din regel returnerede, inkl. eventuelle log()-beskeder

Testen kører scriptet mod rigtige data, men anvender ikke ændringerne – så det er sikkert at teste med produktionsordrer.

Logning

Når Enable Log er slået til, logges alle kørsler med succes/fejl-status, eksekveringstid og kontekst. Se loggen via Logs-knappen i regellisten, eller i transaktionsloggen på den enkelte regel.


Eksempel 1: Subsite Assignment – SKI-ordrer til Offentligt Udbud

Scenarie: Alle ordrer hvor referencen indeholder “SKI-” skal automatisk tildeles subsite 4 (“Offentligt Udbud”).

Opsætning:

  • Navn: SKI-ordrer til Offentligt Udbud
  • Type: Subsite Assignment
  • Aktiv: Ja
  • Enable Log: Ja (til test)

Script:

// =============================================================
// Subsite Assignment: SKI-ordrer til Offentligt Udbud
// =============================================================
// Hvis ordrens reference indeholder "SKI-", tildel subsite 4
// (Offentligt Udbud). Ellers returner null for at beholde
// den nuværende subsite uændret.
// =============================================================

// Hent referencen fra ordren og normaliser til uppercase for sikker sammenligning
var reference = (order.reference || "").toUpperCase();

// Tjek om referencen indeholder SKI-præfikset
if (reference.includes("SKI-")) {

// Log til transaktionsloggen så det er synligt på ordren
log("Reference indeholder SKI- (" + order.reference + ") - tildeler subsite 4 (Offentligt Udbud)");

// Returner subsite-ID 4 for at tildele "Offentligt Udbud"
return 4;
}

// Ingen SKI-reference fundet - returner null for at lade subsite være uændret
return null;

Sådan tester du:

  1. Find en ordre med en SKI-reference (f.eks. ordre med reference “SKI-2024-00412”)
  2. Fold “Test Script”-panelet ud og indtast ordrens ID
  3. Klik “Test Script”
  4. Forventet resultat: 4 (i Output Result)
  5. Test også med en ordre uden SKI-reference – forventet resultat: null

Resultat: Når en ny ordre modtages med reference “SKI-2024-00412”, sættes dens subsite automatisk til 4. Ændringen logges i ordrens transaktionslog.


Eksempel 2: Order Modification – Kontaktperson og kemikalie-advarsel

Scenarie: To automatiske ændringer på indgående ordrer:

  1. Hvis leveringsadressen har et firmanavn, kopier faktureringsadressens navn over som kontaktperson på leveringsadressen
  2. Hvis ordrelinjerne indeholder produkter med “kemikalie” i titlen, sæt en intern note som advarsel

Opsætning:

  • Navn: Firmakontakt + Kemikalie-advarsel
  • Type: Order Modification
  • Aktiv: Ja
  • Enable Log: Ja (til test)

Script:

// =============================================================
// Order Modification: Firmakontakt og kemikalie-advarsel
// =============================================================
// Regel 1: Hvis leveringsadressen har et firmanavn (companyName),
// kopiér faktureringsadressens navn til leveringsadressens
// kontaktperson-felt (name), så pakkeshops og fragtmænd
// ved hvem pakken er til.
//
// Regel 2: Hvis én eller flere ordrelinjer har "kemikalie" i titlen,
// sæt en intern note der advarer lagerpersonalet om at
// bruge udstyr og ekstra indpakning.
// =============================================================

var modified = false;

// ---------------------------------------------------------------
// Regel 1: Kopier billing-navn til delivery kontaktperson
// ---------------------------------------------------------------
// Tjek om leveringsadressen har et firmanavn - det indikerer en
// virksomhedslevering, hvor kontaktpersonen ofte mangler
var hasDeliveryCompany = order.deliveryAddress
&& order.deliveryAddress.companyName
&& order.deliveryAddress.companyName.trim() !== "";

if (hasDeliveryCompany) {

// Hent faktureringsadressens navn - det er typisk kontaktpersonen
var billingName = (order.address && order.address.name) ? order.address.name.trim() : "";

if (billingName !== "") {

// Sæt kontaktpersonen på leveringsadressen til billing-navnet
order.deliveryAddress.name = billingName;

log("Delivery har firma (" + order.deliveryAddress.companyName + ") - sætter kontaktperson: " + billingName);
modified = true;
}
}

// ---------------------------------------------------------------
// Regel 2: Kemikalie-advarsel i intern note
// ---------------------------------------------------------------
// Gennemgå alle ordrelinjer og tjek om nogen indeholder "kemikalie"
var hasChemicals = false;
var chemicalTitles = [];

for (var i = 0; i < order.lines.length; i++) {
var title = (order.lines[i].title || "").toLowerCase();

// Søg efter "kemikalie" i produkttitlen
if (title.includes("kemikalie")) {
hasChemicals = true;
chemicalTitles.push(order.lines[i].title);
}
}

if (hasChemicals) {

// Sæt intern note med tydelig advarsel til lagerpersonalet
order.internalNote = "FARLIG: Husk udstyr og ekstra indpakning";

log("Kemikalier fundet i " + chemicalTitles.length + " linje(r): " + chemicalTitles.join(", "));
modified = true;
}

// ---------------------------------------------------------------
// Returner det modificerede ordre-objekt
// ---------------------------------------------------------------
// Order Modification forventer at vi returnerer hele ordre-objektet.
// Systemet sammenligner automatisk med originalen og anvender kun
// de felter der faktisk er ændret.
return order;

Sådan tester du:

Test regel 1 (kontaktperson):

  1. Find en ordre hvor leveringsadressen har et firmanavn men mangler kontaktperson
  2. Indtast ordrens ID og klik “Test Script”
  3. I Output Result: tjek at deliveryAddress.name nu har billing-adressen navn

Test regel 2 (kemikalie):

  1. Find en ordre med en produktlinje der indeholder “kemikalie” i titlen
  2. Indtast ordrens ID og klik “Test Script”
  3. I Output Result: tjek at internalNote er sat til “FARLIG: Husk udstyr og ekstra indpakning”
  4. I log-output: tjek at de fundne kemikalie-titler er listet

Resultat: Når en ny ordre modtages:

  • Har leveringsadressen et firmanavn? Billing-kontaktpersonen kopieres automatisk over
  • Indeholder ordrelinjerne kemikalier? Intern note sættes med en advarsel til lageret
  • Alle ændringer logges i ordrens transaktionslog med detaljerede log-beskeder

Gode råd

  • Test altid med rigtige ordrer før du aktiverer en regel
  • Brug log() til at skrive beskeder der ender i ordrens transaktionslog – det gør fejlsøgning nemt
  • Returner null fra Subsite Assignment og Sticker Assignment for at “gøre ingenting”
  • Enable Log i testfasen, så du kan se alle kørsler og evt. fejl under Logs
  • Kun én aktiv regel pr. type – har du brug for flere betingelser, kombiner dem i ét script (som i Eksempel 2)
  • Scriptet har en timeout på 5 sekunder – hold logikken simpel og undgå tunge loops
  • Editoren viser syntaksfejl i realtid – du kan ikke gemme et script med errors

For spørgsmål og support kan du ringe til os på telefon 39391310 eller sende os en e-mail på support@lagersystem.dk
Kontakt support