Tema 13 · POS sinchroniniai įvykiai

POS sinchroniniai įvykiai automatizacijoms

POS sinchroniniai įvykiai leidžia automatizacijoms įsiterpti prieš arba po kvito, sąskaitos faktūros ir išankstinės sąskaitos spausdinimo ar apmokėjimo veiksmų.

Funkcionalumas naudojamas tada, kai POS procese reikia atlikti pritaikytas validacijas arba papildyti spausdinamą turinį. Pavyzdžiui, prieš fiskalinio kvito apmokėjimą galima sustabdyti mokėjimą ir neperduoti kvito į kasos aparatą, o spausdinimo metu galima pridėti tekstą, brūkšninius kodus arba QR kodus.

Funkcionalumas veikia su POS komunikatoriaus versija 0.0.82 ir naujesne.

Palaikomi įvykiai

  • POS - prieš pardavimo apmokėjimą (fiskalinis, griežta struktūra)
  • POS - po pardavimo apmokėjimo (nefiskalinis)
  • POS - prieš sąskaitos faktūros spausdinimą (nefiskalinis)
  • POS - prieš užsakymo spausdinimą (nefiskalinis)
  • POS - prieš išankstinės sąskaitos spausdinimą (ASPA nefiskalinis)
  • POS - prieš išankstinės sąskaitos spausdinimą (RASO, EMPIRIJA nefiskalinis, griežta struktūra)
  • POS - po išankstinės sąskaitos spausdinimo (RASO, EMPIRIJA nefiskalinis)

Kontekstas automatizacijoje

Automatizacija per initial gauna visą POS veiksmo kontekstą, kad scenarijuje nereikėtų papildomai kviesti duomenų užklausų:

  • kvito informaciją;
  • kvito eilutes;
  • kasos aparatą;
  • klientą;
  • įmonę;
  • vartotoją;
  • prekes;
  • prekių matavimo vienetus;
  • prekių grupių medį.

products ir productUoms perduodami atskirai, o ne prie kvito eilučių. Prekių grupių medis perduodamas pilnas, išlaikant hierarchijos eiliškumą.

Po pardavimo apmokėjimo įvykyje initial.isPaymentSuccessful saugo true arba false reikšmę pagal tai, ar mokėjimas buvo sėkmingas.

Fiskaliniai ir nefiskaliniai kvitai

Fiskalinio kvito atveju automatizacija gali tik įsiterpti į numatytas spausdinimo vietas:

  • pridėti kvito header;
  • pridėti kvito footer;
  • pridėti eilutės header;
  • pridėti eilutės footer;
  • ASPA atveju - papildomai keisti eilučių informaciją pagal leidžiamą struktūrą.

Nefiskalinio kvito atveju spausdinamas turinys formuojamas vietoj esamo kvito. Tai taikoma, pavyzdžiui, sąskaitos faktūros, užsakymo arba ASPA išankstinės sąskaitos spausdinimui.

Išankstinės sąskaitos spausdinimo atveju:

  • ASPA scenarijus yra nefiskalinis, todėl turinys formuojamas kaip nefiskaliniame kvite;
  • RASO ir EMPIRIJA scenarijai turi griežtą struktūrą, todėl galima pridėti tik antraštes, poraštes ir leistinus eilučių papildymus.

Klaidos pranešimas

Jeigu output perduodamas message, jis traktuojamas kaip klaida.

Fiskalinio kvito atveju, kai įvykis vykdomas prieš apmokėjimą, message veikia kaip kontrolė: mokėjimas sustabdomas ir kvitas nesiunčiamas į fiskalinį įrenginį.

Asinchroniniuose arba po apmokėjimo vykdomuose scenarijuose klaida registruojama žurnale, tačiau vartotojui pranešimas nerodomas.

Spausdinamų eilučių tipai

Galimi spausdinamų eilučių tipai:

  • QR;
  • CODE_128;
  • CODE_39;
  • UPC_A;
  • EAN_8;
  • CODE_93;
  • CODA_BAR;
  • UPC_E;
  • EAN_13;
  • ITF;
  • TEXT.

Ne visi fiskaliniai įrenginiai palaiko tuos pačius eilučių tipus. Jei panaudojamas tipas ne iš sąrašo, visas kodas laikomas nevalidžiu ir automatizacija nesuveikia, nors Veiksmų istorijoje gali būti rodoma kaip sėkminga.

POS - prieš pardavimo apmokėjimą (fiskalinis, griežta struktūra)

Pavyzdys papildo fiskalinio kvito eilutes pagrindiniu prekės brūkšniniu kodu ir įterpia kvito antraštę bei poraštę.

// Į Veiksmų istoriją įrašom visą kontekstą, kurį galima panaudoti čia. Pvz initial.client.name
log.debug(initial)

const lines = {}

function getBarcodeType(value) {
    const barcode = String(value || "").trim()

    if (/^\d{13}$/.test(barcode)) return "EAN_13"
    if (/^\d{8}$/.test(barcode)) return "EAN_8"
    if (/^\d{12}$/.test(barcode)) return "UPC_A"

    return "CODE_128"
}

for (const line of initial.lines) {
    const productUom = initial.productUoms?.[line.productUnitOfMeasureId]
    const mainBarcode = productUom?.barcodes?.find(barcode => barcode.isMain === true)

    if (!mainBarcode?.barcode) continue

    lines[line.id] = {
        text: "Mano pavadinimas",
        footer: [
            {
                type: getBarcodeType(mainBarcode.barcode),
                value: mainBarcode.barcode
            }
        ]
    }
}

output = {
    // message: "Klaidos pranešimas",
    header: [
        { type: "QR", value: "https://www.rivile.lt" },
        { type: "TEXT", value: "Antraštė" }
    ],
    footer: [
        { type: "QR", value: "https://www.google.com" },
        { type: "TEXT", value: "Poraštė" }
    ],
    lines
}

POS - po pardavimo apmokėjimo (nefiskalinis)

Po apmokėjimo galima spausdinti papildomus nefiskalinius kvitus. initial.isPaymentSuccessful rodo, ar mokėjimas buvo sėkmingas.

log.debug(initial)

// initial.isPaymentSuccessful saugo true arba false reikšmę priklausomai nuo to ar buvo sėkmingas ar nepavykęs mokėjimas.

output = {
    // message: "Klaidos pranešimas",
    receipts: [
        [
            { type: "TEXT", value: "Pirmas kvitas" },
            { type: "QR", value: "https://www.rivile.lt" }
        ],
        [
            { type: "TEXT", value: "Antras kvitas" },
            { type: "EAN_13", value: "123456789012" }
        ]
    ]
}

POS - prieš sąskaitos faktūros spausdinimą (nefiskalinis)

Prieš sąskaitos faktūros spausdinimą formuojamas nefiskalinis turinys.

log.debug(initial)

output = {
    // message: "Klaidos pranešimas",
    receipts: [
        [
            { type: "TEXT", value: "Pirmas kvitas" },
            { type: "QR", value: "https://www.rivile.lt" }
        ],
        [
            { type: "TEXT", value: "Antras kvitas" },
            { type: "EAN_13", value: "123456789012" }
        ]
    ]
}

POS - prieš išankstinės sąskaitos spausdinimą (ASPA nefiskalinis)

ASPA išankstinės sąskaitos atveju pirmas kvitas yra pati išankstinė sąskaita, o sekantys kvitai - papildomi nefiskaliniai kvitai.

log.debug(initial)

output = {
    // message: "Klaidos pranešimas",
    receipts: [
        [
            // Pirmas kvitas yra kartu ir išankstinė sąskaita
            { type: "TEXT", value: "Pirmas kvitas" },
            { type: "QR", value: "https://www.rivile.lt" }
        ],
        [
            // Sekantys kvitai yra papildomi paprasti nefiskaliniai kvitai
            { type: "TEXT", value: "Antras kvitas" },
            { type: "EAN_13", value: "123456789012" }
        ]
    ]
}

POS - prieš išankstinės sąskaitos spausdinimą (RASO, EMPIRIJA nefiskalinis, griežta struktūra)

RASO ir EMPIRIJA išankstinės sąskaitos scenarijuose taikoma griežta struktūra, todėl naudojami header, footer ir eilučių papildymai.

// Į Veiksmų istoriją įrašom visą kontekstą, kurį galima panaudoti čia. Pvz initial.client.name
log.debug(initial)

const lines = {}

for (const line of initial.lines) {
    lines[line.id] = {
        text: "Pakeistas prekės pavadinimas",
        header: [
            { type: "EAN_13", value: "123456789012" },
            { type: "TEXT", value: "Eilutės Antraštė" }
        ],
        footer: [
            { type: "EAN_13", value: "210987654321" },
            { type: "TEXT", value: "Eilutės Poraštė" }
        ]
    }
}

output = {
    // message: "Klaidos pranešimas",
    header: [
        { type: "QR", value: "https://www.rivile.lt" },
        { type: "TEXT", value: "Antraštė" }
    ],
    footer: [
        { type: "QR", value: "https://www.google.com" },
        { type: "TEXT", value: "Poraštė" }
    ],
    lines
}