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.
Automatizacija per initial gauna visą POS veiksmo kontekstą, kad scenarijuje nereikėtų papildomai kviesti duomenų užklausų:
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.
Fiskalinio kvito atveju automatizacija gali tik įsiterpti į numatytas spausdinimo vietas:
header;footer;header;footer;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:
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.
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.
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
}
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" }
]
]
}
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" }
]
]
}
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" }
]
]
}
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
}