Gå til indholdet

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

Regeltype Trigger Beskrivelse Returværdi
Subsite Assignment Ny ordre modtages Tildel en subsite til ordren baseret på ordredata number (subsite ID)
Order Modification Ny ordre modtages Modificer ordrefelter (adresser, noter, valuta, fragt, mm.) Order (det modificerede ordre-objekt)
Sticker Assignment Ny ordre modtages Tildel stickers til ordren string eller string[] (sticker identifiers)
Return Shipment Provider Returlabel oprettes Vælg fragtleverandør til returlabels string (shipper identifier)
Auto Print Choose Autoprint udløses Vælg printer eller printstation for autoprint { printStationId?: number, printerId?: string }
Product Import Modify Produkt importeres Modificer produktfelter under import Product (det modificerede produkt-objekt)
Product Import Filter Produkt importeres Filtrer produkter fra under import boolean (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:
  4. Navn – et beskrivende navn (f.eks. “SKI-ordrer til Offentligt Udbud”)
  5. Type – vælg den regeltype du ønsker
  6. Aktiv – sæt flueben for at aktivere reglen
  7. Enable Log – sæt flueben for at logge alle kørsler (anbefalet i testfasen)
  8. Skriv dit JavaScript i editoren
  9. Test scriptet inden du gemmer (fold “Test Script”-panelet ud)
  10. 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

Funktion Beskrivelse
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:

Felt Type Beskrivelse
order.orderID number Ordre-ID
order.reference string Ordrereference
order.subSite number Nuværende subsite-ID
order.currency string Valutakode
order.status string Ordrestatus
order.cargoMethod string Fragtmetode
order.note string Kundenote
order.internalNote string Intern note
order.deliveryNote string Leveringsnote
order.address Address Faktureringsadresse
order.deliveryAddress Address Leveringsadresse
order.lines OrderLine[] Ordrelinjer
order.extra Record Ekstra 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:
  5. Input Context – de data din regel modtog (det faktiske ordre-objekt)
  6. 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