Išankstinis maisto užsakymas
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.
DEMO degalinė, Vievis
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ę.
Eikite tiksliai tuo keliu, kuriuo eis vairuotojas, sustojęs jūsų degalinėje: kodas ant kolonėlės — telefonas — kasa.
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.
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.
Į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.
Krepšelyje įveskite bet kokį el. pašto adresą ir spauskite apmokėti.
Daugiau nieko neprašome — nei vardo, nei telefono. Tik adreso kvitui.
Apmokėjimo lange spauskite „Mokėti kortele“. Kortelės duomenys jau įrašyti ir neredaguojami.
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.
Dabar pažiūrėkite, ką tuo pačiu metu mato degalinės darbuotojas. Telefoną palikite šalia — stebėkite abu ekranus kartu.
Atidarykite nuorodą ir spauskite „Pradėti pamainą“.
Šis paspaudimas reikalingas, kad naršyklė leistų garsinį signalą — be prisilietimo ji garso neleidžia.
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ą.
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.
Spauskite „Paruošta“.
Telefone: „Prieikite prie kasos ir pasakykite 100“. Tai ta akimirka, dėl kurios visa sistema ir daroma.
Spauskite „Atiduota“ — kortelė dingsta, ratas užsidaro.
Pasižiūrėkite ir „Likučius“ — ten kasininkas žymi, kad prekės nebėra, ir įjungia pauzę.
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.
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.
Atidarykite skydelį ir įveskite slaptažodį — įrenginys jį prisimena savaitę.
Slaptažodis sąmoningai paprastas demonstracijai. Tikroje sistemoje administratoriai turės asmenines paskyras.
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.
„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.
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.
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.
„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.
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.
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.
| Kas | Ką padaryti |
|---|---|
| Vairuotojas | Telefonas mobiliais duomenimis, ne Wi-Fi — vairuotojas degalinėje irgi be Wi-Fi. Naršyklė uždaryta, pradedama nuo QR. |
| Kasininkas | Planš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. |
Ką parodo: minutės vietoje nuotraukos, degalinės kaina, užsakymas planšetėje per sekundę su garsu, numeris kasoje.
| Nr. | Kas | Ką daryti | Ką pamatysite |
|---|---|---|---|
| 1.1 | Vairuotojas | Nuskenuoti 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.2 | Kasininkas | Nieko nespausti — pažiūrėti į lentą. | Kortelė stulpelyje „Nauji“ atsirado be perkrovimo, su garsu, su ženklu APMOKĖTA INTERNETU. |
| 1.3 | Kasininkas | „Priimti“. | Telefone — „Gaminama, bus paruošta apie…“. Laikas skaičiuojamas nuo priėmimo. |
| 1.4 | Kasininkas | „Paruošta“, tada „Atiduota“. | Telefone — didelis numeris ir „Pasakykite šį numerį kasoje“. Po „Atiduota“ kortelė dingsta. |
Ką parodo: prekė baigiasi pati; kasininko žymėjimas turi pirmenybę prieš skaičius; pauzė piko metu.
| Nr. | Kas | Ką daryti | Ką pamatysite |
|---|---|---|---|
| 2.1 | Vairuotojas | Užsisakyti Sumuštinį su kumpiu (Vievyje jo vienas). Atnaujinti meniu. | Prekės nebėra — pasibaigė pati. |
| 2.2 | Kasininkas | „Likučiai“ → ties Dešrainiu pažymėti „Parduota“. | Telefone atnaujinus — Dešrainis dingo iš karto. Kasininkas mato lentyną, sistema — tik skaičius. |
| 2.3 | Kasininkas | „Nepriimame užsakymų“. | Telefone meniu matomas, užsakyti negalima, parašyta kodėl. |
| 2.4 | Vairuotojas | Pabandyti užsisakyti. | Neleidžia. Kasininkas spaudžia „Vėl priimti užsakymus“ — vėl galima. |
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. | Kas | Ką daryti | Ką pamatysite |
|---|---|---|---|
| 3.1 | Administratorius | „Sugeneruoti apmokėtą užsakymą“ Vieviui. | Planšetėje — nauja kortelė. |
| 3.2 | Kasininkas | „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.3 | Administratorius | Įjungti „Sekantis mokėjimas nepavyks“. | — |
| 3.4 | Vairuotojas | Užsisakyti bet ką. | „Mokėjimas nepavyko“, užsakymas nesukurtas. Perjungiklis išsijungė pats — kitas mokėjimas pavyks. |
| 3.5 | Administratorius | Dabar „Laikai“ → Automatinis atšaukimas → 1. „Sugeneruoti apmokėtą užsakymą“. | Planšetėje kortelė „Nauji“. |
| 3.6 | Kasininkas | Nepriimti. Palaukti minutę. | — |
| 3.7 | Administratorius | „Paleisti planuoklio ciklą“. Po to laikus grąžinti į numatytuosius. | Kortelė dingsta; užsakymo puslapyje — „Užsakymas atšauktas · Pinigai nenuskaityti“. |
Ką parodo: sistema pati pasako, kai degalinė negirdi; tamsus režimas ekranui, kuris dega visą parą.
| Nr. | Kas | Ką daryti | Ką pamatysite |
|---|---|---|---|
| 4.1 | Administratorius | Įjungti „Nutrūkęs planšetės ryšys“. | Planšetėje — raudona juosta iškart. Išjungti. |
| 4.2 | Administratorius | Atidaryti /admin/busena. | Užsakymai pagal degalines, planšečių ryšys, paskutinės klaidos. Kai problema — el. laiškas atsakingam žmogui. |
| 4.3 | Kasininkas | Paspausti ☾ lentos viršuje. | Tamsus režimas — įsimenamas tam įrenginiui. |
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.
Šie atvejai svarbesni už sklandų ratą — būtent jie nulems, ar personalas priims sistemą.
Sąžiningiau pasakyti dabar, nei nustebinti vėliau.
Į š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.
Rašykite viską, kas užkliuvo — net smulkmenas. Šiame etape pakeisti ekraną pigu; po paleidimo brangu.
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ę.
Trumpai, be detalių: kaip sistema sudėta, kuo remiasi ir kaip saugoma. Visas kodas — privačioje Git saugykloje, su versijų istorija ir automatiniais testais.
| Sluoksnis | Sprendimas | Kodėl |
|---|---|---|
| Programa | Next.js 16 (React 19, TypeScript), Node.js 20 | Vienas kodas klientui, kasininkui ir administratoriui; serverio pusėje renderinama, telefonui nereikia diegti programėlės. |
| Duomenys | PostgreSQL 16, Drizzle ORM, versijuojamos SQL migracijos | Likučių rezervavimas remiasi eilučių užraktais (SELECT … FOR UPDATE) — du vienu metu užsakantys klientai negali gauti to paties paskutinio vieneto. |
| Foniniai darbai | Atskiras 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ė gyvai | Server-Sent Events | Užsakymas lentoje per <1 s be perkrovimo; paprastesnis už WebSocket, veikia per įprastą HTTPS. |
| Mokėjimai | Abstrakcija su dviem keliais: rezervuoti→nuskaityti priėmus arba nuskaityti iš karto | 1 etape — imitacija. Tikra bendrovė prijungiama kaip atskiras modulis, nekeičiant likusios sistemos. Webhook'ai tikrinami parašu. |
| Talpinimas | Linux (Ubuntu 24.04), nginx, systemd, Let's Encrypt TLS | Dabar — kūrėjo demonstracinė aplinka ES. Galutinis talpinimas — jūsų sprendimas (2 etapo klausimas). |
| Stebėsena | Bū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. |
HttpOnly, SameSite=Lax, Secure per HTTPS. Vartai vykdomi prieš kiekvieną užklausą — naujas maršrutas apsaugotas savaime.noindex ir neindeksuojama..env (teisės 600), niekada kode ar saugykloje. Servisai paleidžiami su systemd apribojimais (NoNewPrivileges, ProtectSystem=strict, ProtectHome).npm audit — 0 pažeidžiamumų (2026-09-14, Next 16.3.5). Atnaujinama prieš kiekvieną diegimą.strict, ESLint; domeno logika architektūriškai atskirta nuo HTTP ir DB (saugoma lint taisykle).Prieigą prie kodo saugyklos peržiūrai, techninę specifikaciją (§ nuorodos kode veda į ją), DB schemą ir migracijas, testų ataskaitą, diegimo aprašą. Klausimams — tando.lt.