Išankstinis maisto užsakymas

Išbandykite patys

Paruošėme veikiančią demonstracinę versiją. Ją galite atsidaryti savo telefone ir pereiti visą kelią, kurį pereis jūsų klientas — nuo meniu iki numerio, kurį jis pasakys kasoje. Užtruks apie penkias minutes.

Instrukcija padalinta pagal tris vaidmenis — kiekvienas skaito savo dalį. Demonstracijai su trimis įrenginiais — scenarijus.

Pradėkite nuo čia Nuskenuokite kodą
telefono kamera
Kasininko planšetė emsi.sprendimai.cloud/pos/demo „Pradėti pamainą“ → 🔊 patikrinti garsą
Slaptažodžio nereikia Vairuotojui ir kasininkui — atidarykite ir naudokitės iškart.
Administratoriaus skydelis emsi.sprendimai.cloud/admin/demo slaptažodis emsi-demo-2026

DEMO degalinė, Vievis

Tikri pinigai niekur nejuda

Degalinės, prekės ir kainos yra išgalvotos. Mokėjimas imituojamas — kortelės duomenų įvesti nereikia ir nepavyks. Nieko nesugadinsite: bet kada galima grąžinti viską į pradinę būklę.

1

Kaip klientas

Eikite tiksliai tuo keliu, kuriuo eis vairuotojas, sustojęs jūsų degalinėje: kodas ant kolonėlės — telefonas — kasa.

  1. Nuskenuokite kodą aukščiau telefono kamera.

    Kodas veda tiesiai į Vievio degalinės meniu — rinktis degalinės nereikia. Tikrovėje kiekviena degalinė turės savo kodą, priklijuotą prie kasos ar ant kolonėlės.

  2. Pažiūrėkite į meniu. Kairėje kiekvienos prekės — gaminimo trukmė, ne nuotrauka.

    Vairuotojo klausimas yra „ar spėsiu, kol atvažiuosiu“, todėl minutės yra pirmas dalykas, kurį jis mato.

  3. Įdėkite mėsainį ir kavą.

    Apačioje pasirodys „apie 8 min.“, nors mėsainis gaminamas 8 minutes, o kava 3. Laikas yra ilgiausios prekės, o ne suma — virtuvė gamina abi kartu.

  4. Krepšelyje įveskite bet kokį el. pašto adresą ir spauskite apmokėti.

    Daugiau nieko neprašome — nei vardo, nei telefono. Tik adreso kvitui.

  5. Apmokėjimo lange spauskite „Mokėti kortele“. Kortelės duomenys jau įrašyti ir neredaguojami.

  6. Nepadėkite telefono — jo ekranas keisis pats, kai kasininkas veiks.

Jūsų numeris

100

Pasakykite šį numerį kasoje

Tai ir yra visas produktas. Numeris — vienintelis dalykas, kurį klientas turės pasakyti balsu, todėl jis piešiamas kaip degalinės kainų lenta. Ekranas atsinaujina pats: kai kasininkas paspaus mygtuką, užrašas pasikeis be jokio perkrovimo.

2

Kaip kasininkas

Dabar pažiūrėkite, ką tuo pačiu metu mato degalinės darbuotojas. Telefoną palikite šalia — stebėkite abu ekranus kartu.

Kasininko ekranas — kompiuteryje ar planšetėje emsi.sprendimai.cloud/pos/demo
  1. Atidarykite nuorodą ir spauskite „Pradėti pamainą“.

    Šis paspaudimas reikalingas, kad naršyklė leistų garsinį signalą — be prisilietimo ji garso neleidžia.

  2. Jūsų užsakymas jau turi būti lentoje, stulpelyje „Nauji“.

    Jis atsirado per mažiau nei sekundę, be jokio perkrovimo, su garsu. Ant kortelės — ženklas APMOKĖTA INTERNETU, kad niekas neprašytų sumokėti dar kartą.

  3. Spauskite „Priimti“ ir pažiūrėkite į telefoną.

    Užrašas pasikeis į „Gaminama“ su numatomu laiku. Laikas skaičiuojamas nuo priėmimo — gaminimas prasideda tada, kai kasininkas paspaudžia.

  4. Spauskite „Paruošta“.

    Telefone: „Prieikite prie kasos ir pasakykite 100“. Tai ta akimirka, dėl kurios visa sistema ir daroma.

  5. Spauskite „Atiduota“ — kortelė dingsta, ratas užsidaro.

  6. Pasižiūrėkite ir „Likučius“ — ten kasininkas žymi, kad prekės nebėra, ir įjungia pauzę.

Tikrovėje planšetė susiejama vienkartiniu kodu

Demonstracijoje ekranas atsidaro iš karto, kad nereikėtų laukti kodo. Tikroje degalinėje planšetę vieną kartą susieja administratorius — kasininkas prie jos neprisijungia asmeniškai. Priešingu atveju kas rytą kas nors ieškotų slaptažodžio, o po mėnesio jis kabotų ant lipduko.

3

Kaip administratorius

Nešiojamame kompiuteryje. Skydelis leidžia sukelti situacijas, kurių laukti natūraliai užtruktų valandas: nepavykusį mokėjimą, nutrūkusį ryšį, laiku nepriimtą užsakymą. Vairuotojas ir kasininkas jo nemato.

Demo valdymo skydelis emsi.sprendimai.cloud/admin/demo
Slaptažodis emsi-demo-2026
Būsena ir stebėsena /admin/busena · spausdinami QR — /admin/qr
  1. Atidarykite skydelį ir įveskite slaptažodį — įrenginys jį prisimena savaitę.

    Slaptažodis sąmoningai paprastas demonstracijai. Tikroje sistemoje administratoriai turės asmenines paskyras.

  2. Prieš kiekvieną demonstraciją — „Atstatyti duomenis“.

    Ištrina visus užsakymus ir grąžina pradinį meniu bei likučius. Aplinka atvira, todėl joje gali būti ankstesnių bandymų palikimas.

  3. „Sugeneruoti apmokėtą užsakymą“ — užsakymas pasirinktai degalinei be telefono.

    Eina tuo pačiu keliu kaip tikras: rezervavimas, mokėjimas, numeris. Naudinga, kai norite parodyti kasininko pusę nelaukdami, kol kas nors užsisakys.

  4. Perjungikliai: „Sekantis mokėjimas nepavyks“ ir „Nutrūkęs planšetės ryšys“.

    Pirmasis vienkartinis — parodęs nesėkmę išsijungia pats. Antrasis iškart parodo įspėjimą planšetėje; neužmirškite išjungti.

  5. Laikai: automatinis atšaukimas, neatsiimta po, krepšelio rezervacija.

    Demonstracijai galima sumažinti iki 1 min. Laikrodis nepagreitinamas — keičiamos tik ribos. „Paleisti planuoklio ciklą“ iškviečia foninį darbą nelaukiant 30 s. Sumažinkite tik prieš tą sceną, kuriai to reikia: su 1 min. riba bet kuris nepriimtas užsakymas atšaukiamas po minutės.

  6. „Būsena“ rodo aktyvius užsakymus pagal degalines, planšečių ryšį ir klaidas.

    Tas pats vertinimas, kurį sistema daro pati kas 30 s: jei užsakymas be reakcijos ilgiau nei 15 min. arba planšetė tyli, o užsakymai laukia, atsakingam žmogui išsiunčiamas el. laiškas, o išorinis stebėtojas mato „nesveika“. Ta pati problema laiške nekartojama 30 min.

Rodykite Vievį

Kauno demo degalinė dirba 6–23 val. — vakare ji užsakymų nepriims, ir tai teisinga, bet atrodys kaip gedimas. Vievis dirba visą parą; jo QR kodas — šio dokumento pradžioje.

4

Demonstracijos scenarijus — trys įrenginiai

Vairuotojas telefonas · Kasininkas planšetė · Administratorius nešiojamas. Apie 25 minutes, keturios dalys. Kiekvienas žingsnis pažymėtas, kas jį atlieka — įrenginį galima duoti į rankas tam, kas tą vaidmenį atliks ir tikrovėje.

0 · Pasiruošimas (10 min., prieš susitikimą)

KasKą padaryti
VairuotojasTelefonas mobiliais duomenimis, ne Wi-Fi — vairuotojas degalinėje irgi be Wi-Fi. Naršyklė uždaryta, pradedama nuo QR.
KasininkasPlanšetėje: tylusis jungiklis išjungtas, garsas iki galo, automatinis ekrano užraktas išjungtas. Atidaryti /pos/demo → „Pradėti pamainą“ → 🔊 „Patikrinti garsą“ — turi girdėtis. Jei tylu — žr. skyrių „Kai kas nors nepavyksta“ apačioje.
Administratorius/admin/demo → slaptažodis emsi-demo-2026 → „Atstatyti duomenis“. Laikų dar nemažinti. Atsispausdinti Vievio QR iš /admin/qr ir padėti ant stalo. Atidaryti /admin/busena antroje kortelėje.

1 · Visas kelias (5 min.)

Ką parodo: minutės vietoje nuotraukos, degalinės kaina, užsakymas planšetėje per sekundę su garsu, numeris kasoje.

Nr.KasKą darytiKą pamatysite
1.1VairuotojasNuskenuoti QR nuo stalo. Įdėti mėsainį ir Americano. Krepšelyje — el. paštas → „Apmokėti“ → „Mokėti kortele“.Meniu eilutėje pirmiausia minutės. Mėsainis 7,40 € prie bazinės 6,90 € — degalinės kainos perrašymas. Juosta rodo ilgiausios prekės laiką, ne sumą.
1.2KasininkasNieko nespausti — pažiūrėti į lentą.Kortelė stulpelyje „Nauji“ atsirado be perkrovimo, su garsu, su ženklu APMOKĖTA INTERNETU.
1.3Kasininkas„Priimti“.Telefone — „Gaminama, bus paruošta apie…“. Laikas skaičiuojamas nuo priėmimo.
1.4Kasininkas„Paruošta“, tada „Atiduota“.Telefone — didelis numeris ir „Pasakykite šį numerį kasoje“. Po „Atiduota“ kortelė dingsta.

2 · Kasininkas valdo lentyną (5 min.)

Ką parodo: prekė baigiasi pati; kasininko žymėjimas turi pirmenybę prieš skaičius; pauzė piko metu.

Nr.KasKą darytiKą pamatysite
2.1VairuotojasUžsisakyti Sumuštinį su kumpiu (Vievyje jo vienas). Atnaujinti meniu.Prekės nebėra — pasibaigė pati.
2.2Kasininkas„Likučiai“ → ties Dešrainiu pažymėti „Parduota“.Telefone atnaujinus — Dešrainis dingo iš karto. Kasininkas mato lentyną, sistema — tik skaičius.
2.3Kasininkas„Nepriimame užsakymų“.Telefone meniu matomas, užsakyti negalima, parašyta kodėl.
2.4VairuotojasPabandyti užsisakyti.Neleidžia. Kasininkas spaudžia „Vėl priimti užsakymus“ — vėl galima.

3 · Kai kas nors ne taip (7 min.)

Ką parodo: atmetimas be grąžinimo procedūros, nepavykęs mokėjimas, laiku nepriimtas užsakymas atšaukiamas pats. Čia pirmą kartą naudojamas nešiojamas.

Nr.KasKą darytiKą pamatysite
3.1Administratorius„Sugeneruoti apmokėtą užsakymą“ Vieviui.Planšetėje — nauja kortelė.
3.2Kasininkas„Atmesti“ → pasirinkti priežastį.Vairuotojo telefone (atidarius užsakymo nuorodą) — priežastis ir „Pinigai nenuskaityti“. Grąžinimo procedūros nereikia — jei mokėjimų bendrovė palaiko rezervavimą.
3.3AdministratoriusĮjungti „Sekantis mokėjimas nepavyks“.—
3.4VairuotojasUžsisakyti bet ką.„Mokėjimas nepavyko“, užsakymas nesukurtas. Perjungiklis išsijungė pats — kitas mokėjimas pavyks.
3.5AdministratoriusDabar „Laikai“ → Automatinis atšaukimas → 1. „Sugeneruoti apmokėtą užsakymą“.Planšetėje kortelė „Nauji“.
3.6KasininkasNepriimti. Palaukti minutę.—
3.7Administratorius„Paleisti planuoklio ciklą“. Po to laikus grąžinti į numatytuosius.Kortelė dingsta; užsakymo puslapyje — „Užsakymas atšauktas · Pinigai nenuskaityti“.

4 · Naktinė pamaina (3 min.)

Ką parodo: sistema pati pasako, kai degalinė negirdi; tamsus režimas ekranui, kuris dega visą parą.

Nr.KasKą darytiKą pamatysite
4.1AdministratoriusĮjungti „Nutrūkęs planšetės ryšys“.Planšetėje — raudona juosta iškart. Išjungti.
4.2AdministratoriusAtidaryti /admin/busena.Užsakymai pagal degalines, planšečių ryšys, paskutinės klaidos. Kai problema — el. laiškas atsakingam žmogui.
4.3KasininkasPaspausti ☾ lentos viršuje.Tamsus režimas — įsimenamas tam įrenginiui.

Jei sugenda vidury

Administratorius spaudžia „Atstatyti duomenis“ — viskas švaru per sekundę. Planšetėje ir telefone užtenka atnaujinti puslapį; telefone užsakymo nuoroda dingsta, bet QR nuo stalo veda atgal į meniu.

5

Kai kas nors nepavyksta

Šie atvejai svarbesni už sklandų ratą — būtent jie nulems, ar personalas priims sistemą.

6

Ko dar nėra

Sąžiningiau pasakyti dabar, nei nustebinti vėliau.

7

Ko laukiame iš jūsų

Į šiuos klausimus atsakymo laukiame būtent po demonstracijos — pamatę, kaip veikia, galėsite spręsti konkrečiai.

Pilnas klausimų sąrašas — dokumente „Kaip tai veiks“. Čia surašėme tuos, kuriuos demonstracija padeda apsispręsti.

8

Pastabos

Rašykite viską, kas užkliuvo — net smulkmenas. Šiame etape pakeisti ekraną pigu; po paleidimo brangu.

Naudingiausia mums žinoti

  • Kur suabejojote, ką spausti toliau.
  • Kokių žodžių ar užrašų nesuprato jūsų kolega.
  • Ko pasigedote, ką kasininkas paklaustų pirmą dieną.
  • Kas, jūsų akimis, tiesiog nereikalinga.

Jei kas nors atrodo sugedę

Greičiausiai tai vienas iš dviejų dalykų: rinkotės Kauno degalinę po 23 valandos, arba likutis pasibaigė ankstesnių bandymų metu. Administratorius gali paspausti „Atstatyti duomenis“ skydelyje (3 skyrius) — arba parašykite mums, grąžinsime viską į pradinę būklę per minutę.

9

Techninė informacija — IT skyriui

Trumpai, be detalių: kaip sistema sudėta, kuo remiasi ir kaip saugoma. Visas kodas — privačioje Git saugykloje, su versijų istorija ir automatiniais testais.

SluoksnisSprendimasKodėl
ProgramaNext.js 16 (React 19, TypeScript), Node.js 20Vienas kodas klientui, kasininkui ir administratoriui; serverio pusėje renderinama, telefonui nereikia diegti programėlės.
DuomenysPostgreSQL 16, Drizzle ORM, versijuojamos SQL migracijosLikučių rezervavimas remiasi eilučių užraktais (SELECT … FOR UPDATE) — du vienu metu užsakantys klientai negali gauti to paties paskutinio vieneto.
Foniniai darbaiAtskiras planuoklio procesas kas 30 s su DB užraktu (pg_try_advisory_lock)Automatinis atšaukimas, rezervacijų atlaisvinimas, dienos likučiai, įspėjimai. Antra serverio kopija darbų nedubliuotų.
Planšetė gyvaiServer-Sent EventsUžsakymas lentoje per <1 s be perkrovimo; paprastesnis už WebSocket, veikia per įprastą HTTPS.
MokėjimaiAbstrakcija su dviem keliais: rezervuoti→nuskaityti priėmus arba nuskaityti iš karto1 etape — imitacija. Tikra bendrovė prijungiama kaip atskiras modulis, nekeičiant likusios sistemos. Webhook'ai tikrinami parašu.
TalpinimasLinux (Ubuntu 24.04), nginx, systemd, Let's Encrypt TLSDabar — kūrėjo demonstracinė aplinka ES. Galutinis talpinimas — jūsų sprendimas (2 etapo klausimas).
StebėsenaBūsenos taškas (200/503), išorinis stebėtojas kas 2 min., įspėjimai el. paštu, paruošta klaidų sekimo integracija (Sentry)Tyli klaida čia reiškia nepagamintą maistą — sistema pati praneša, kai degalinė negirdi arba užsakymas be reakcijos.

Sauga

  • Trys prieigos lygiai, trys skirtingi raktai. Kliento užsakymo nuoroda — atsitiktinis 128 bitų žetonas (neatspėjamas, be prisijungimo). Planšetė — vienkartiniu kodu susiejamas įrenginio raktas, saugomas tik maiša (SHA-256), lyginamas pastoviu laiku. Administratoriaus skydelis — slaptažodis; slapuke tik jo maiša.
  • Slapukai: HttpOnly, SameSite=Lax, Secure per HTTPS. Vartai vykdomi prieš kiekvieną užklausą — naujas maršrutas apsaugotas savaime.
  • Įvestis tikrinama schemomis (zod) kiekviename API taške; į DB — tik parametrizuotos užklausos per ORM. Kiekiai ir būsenų perėjimai papildomai saugomi DB apribojimais.
  • Asmens duomenys: renkamas tik el. paštas kvitui. Demonstracinėje aplinkoje — jokių tikrų duomenų; ji pažymėta noindex ir neindeksuojama.
  • Paslaptys — tik serverio .env (teisės 600), niekada kode ar saugykloje. Servisai paleidžiami su systemd apribojimais (NoNewPrivileges, ProtectSystem=strict, ProtectHome).
  • Priklausomybės: npm audit — 0 pažeidžiamumų (2026-09-14, Next 16.3.5). Atnaujinama prieš kiekvieną diegimą.
  • Kas dar ne 1 etape: asmeninės administratorių paskyros su rolėmis, dviejų veiksnių patvirtinimas, audito žurnalas — numatyta 2 etapui, kai atsiras tikri administratoriai ir tikri pinigai.

Kokybės kontrolė

  • 315 vienetinių ir integracinių testų — tarp jų lenktynių testas su dviem tikromis DB jungtimis, įrodantis, kad paskutinį vienetą gauna lygiai vienas klientas.
  • 53 naršyklės testai (Playwright) — telefono ir planšetės ekranai, tamsus režimas, WCAG AA kontrastas, visi prieigos vartai.
  • Priėmimo kriterijų patikra paleidžiama prieš gyvą aplinką prieš kiekvieną demonstraciją — 15 punktų, testų pavadinimai sutampa su specifikacijos formuluotėmis.
  • Statinė analizė: TypeScript strict, ESLint; domeno logika architektūriškai atskirta nuo HTTP ir DB (saugoma lint taisykle).

Ką galime pateikti IT skyriui

Prieigą prie kodo saugyklos peržiūrai, techninę specifikaciją (§ nuorodos kode veda į ją), DB schemą ir migracijas, testų ataskaitą, diegimo aprašą. Klausimams — tando.lt.