Nazad na projekte

Glavna tehnička studija slučaja

SyncPlate

Višekorisnička restoranska platforma koja obuhvata POS, zalihe, zaposlene, HACCP, plaćanja, povezane uređaje i nemačke fiskalne tokove na vebu, Androidu i iOS-u.

Uloga
Autor, vlasnik proizvoda i full-stack programer
Trenutni status
U aktivnom razvoju · Započeto u maju 2024.

Pregled

Pregled

Višekorisnička restoranska platforma sa 14 Laravel domenskih modula, odvojenim bazama po korisniku, Zigbee/MQTT integracijom za HACCP senzore i jednom Expo bazom koda za veb, Android, iOS i namenske platne terminale.

Poslovni problem

Restoran istovremeno upravlja porudžbinama, zaposlenima, zalihama, uređajima, plaćanjima i poreskim obavezama, dok nemački propisi dodatno zahtevaju potpisane račune, nepromenljive revizijske tragove i DSFinV-K izvoz. Najteži deo nije broj funkcija, već izolacija svakog korisnika, dokazivost svakog fiskalnog zapisa i predvidivost svakog toka dok više ljudi i uređaja menja isto stanje tokom gužve.

Moj doprinos

  • Razvio i testirao višekorisničku Laravel 12 platformu sa 14 domenskih modula, centralnom bazom za usmeravanje i odvojenom bazom za svakog korisnika.
  • Preveo procese poručivanja, prodaje, zaliha, fiskalizacije, HACCP-a i IoT-a u zahteve za Redis Streams okosnicu sa transactional outbox obrascem i idempotentnim potrošačima.
  • Istražio nemačke fiskalne zahteve i povezao ih sa mogućnostima provajdera za fiskaly TSE potpisivanje, DSFinV-K izvoz, dnevni obračun i GoBD revizijski zapis povezan heševima.
  • Implementirao operativnu analitiku i tokove povezane sa prognozama za prodaju, zalihe, nabavku, proizvodnju, optimizaciju menija i trendove.
  • Vodio i validirao tok senzorskih podataka od Zigbee-a preko MQTT-a do API-ja, uključujući neprekidnu HACCP telemetriju i uparivanje uređaja iz administratorskog interfejsa.
  • Koordinirao i validirao isporuku jedne Expo baze koda za veb, Android, iOS i namenske terminale, uključujući Stripe Terminal i tri načina povezivanja termalnih štampača.

Praktične integracije uređaja

POS, plaćanja i hardver

Praktičan razvoj, integracija i testiranje Stripe platnih terminala, SUNMI Android POS uređaja, ESC/POS štampanja računa, QZ Tray-a i fiskaly TSE-a — uključujući uparivanje uređaja, praćenje statusa, komunikaciju sa štampačima i dijagnostiku grešaka povezivanja i integracije.

POS sistemiStripe TerminalSUNMI POS uređajiESC/POSQZ Trayfiskaly TSEBluetooth štampanjeMrežno štampanjeAndroid POS

Tehnički izazovi

Tehnički izazovi

01

Izolacija korisnika bez posebne verzije za svakog klijenta

Centralna baza za usmeravanje određuje korisnika, nakon čega se zahtev izvršava nad njegovom zasebnom bazom. Jedna baza koda, bez deljenih redova i bez putanje za curenje podataka između korisnika.

02

Događaji koji preživljavaju pad sistema

Domenski događaji upisuju se u istoj transakciji kao i podaci koji su ih izazvali, a zatim prosleđuju u Redis Streams. Potrošači čuvaju stanje idempotentnosti, pa ponovno izvršavanje ne može dvaput obračunati prodaju.

03

Fiskalni propisi kao zamenjivi drajver

Nemačka zahteva TSE potpisivanje i DSFinV-K, dok druge zemlje imaju druge zahteve. Provajderi navode mogućnosti kroz ugovore, pa nova zemlja znači novi drajver, a ne prepisivanje sistema.

04

Prognoze koje prepoznaju sopstvenu grešku

Prognoziranje potražnje nije samo poziv modela: servis proverava rezultate na istorijskim podacima, koriguje odstupanje i prati sopstvenu grešku, uz vremenske prilike i praznike kao ulazne podatke.

05

Od senzora do baze bez ručne intervencije

Zigbee temperaturni senzori šalju podatke preko MQTT-a Python mostu koji prosleđuje telemetriju API-ju, dok se novi hardver uparuje iz administratorskog interfejsa umesto komandne linije.

06

Jedna baza koda, četiri veoma različita okruženja

Veb, Android, iOS i namenski platni terminali dele jednu Expo bazu koda, dok su Stripe Terminal, Sunmi štampanje, Bluetooth ESC/POS i QZ Tray dostupni kroz provere mogućnosti uređaja.

Mapa platforme

Za šta je backend zaista odgovoran.

Četrnaest modula u jednoj Laravel bazi koda, nazvanih kao u trenutnom direktorijumu app/Modules i grupisanih prema odgovornosti.

Usluga i sala

4 modula

  • OrderRačuni, sledovi i podele
  • TableRaspored sale i trenutna zauzetost
  • OnlineOrderingPorudžbine van objekta u istom redu
  • DlvPorudžbine za dostavu i otprema

Roba i proizvodnja

4 modula

  • CatalogMeni, stavke i izmene
  • InventoryNivoi, količine i jedinice pakovanja
  • ProcurementDobavljači i poručivanje
  • DiscountPravila cena i promocije

Novac i propisi

4 modula

  • CashOdgovornost za kasu po smeni
  • AccountingIzvoz za knjigovodstvo
  • AuditLogGoBD trag povezan heševima
  • BillingObračun svakog korisnika

Platforma

2 modula

  • SettingsPodešavanja po korisniku
  • SuperAdminAdministracija korisnika

Uređaji

Hardver kojim platforma upravlja.

Restoran nije samo jedan uređaj. Svaka klasa uređaja prolazi proveru mogućnosti, pa objekat bez dodatnog hardvera i dalje dobija funkcionalnu kasu, dok onaj sa svim uređajima ne mora da koristi drugi sistem.

Naplata

Platforma direktno upravlja svim čitačima preko Stripe Terminala, pa je izbor uređaja stvar konfiguracije objekta, a ne zasebne putanje u kodu.

Beli pametni čitač kartica Stripe Reader S700 prikazan pod uglom

Stripe Reader S700

Stripe Terminal

Kasa na pultu. Expo klijent radi na samom čitaču, pa se porudžbina i kartično plaćanje obavljaju na jednom ekranu umesto usklađivanja dva uređaja.

Crni ručni čitač kartica BBPOS WisePOS E sa simbolom za beskontaktno plaćanje iznad ekrana

BBPOS WisePOS E

Stripe Terminal

Čitač koji ostaje na pultu. Pripada fiksnoj kasi, a ne određenoj osobi, pa je radno mesto spremno bez obzira na to ko ga koristi.

Crni ručni Sunmi Android terminal sa termalnim štampačem ugrađenim u gornji deo kućišta

SUNMI POS Devices

SUNMI SDK · Android POS

Ručni Android uređaj sa ugrađenim štampačem. Porudžbina, plaćanje i račun na jednom uređaju — upravo je to njegova prednost.

Crni BBPOS WisePad 3 PIN uređaj prikazan spreda i sa strane, sa iznosom prodaje na ekranu

BBPOS WisePad 3

Stripe Terminal

Bluetooth PIN uređaj uparen sa telefonom ili tabletom, za naplatu karticom za stolom bez posebnog pametnog čitača na tom radnom mestu.

Tap to Pay ekran na telefonu sa simbolom za beskontaktno plaćanje iznad poruke Hold Here to Pay

Tap to Pay

Phone as reader

Bez dodatnog čitača — telefon u kecelji konobara postaje beskontaktni terminal. Najpovoljniji način da se tokom jedne prometne večeri otvori druga kasa.

Ništa od ovoga nije uslov za korišćenje sistema. Objekat koji već ima kartični terminal svoje banke može da ga zadrži bez promena: kasa evidentira prodaju kao kartično plaćanje, a operater je potvrđuje kada samostalni terminal prijavi uspešnu transakciju. Nema migracije niti raskida ugovora. Integrisani čitač uklanja samo taj jedan ručni korak — ne uslovljava rad kase.

Štampanje

Iza jednog interfejsa za štampanje nalaze se tri načina povezivanja — mrežni ESC/POS, Bluetooth ESC/POS i Sunmi SDK — a klijent bira odgovarajući način za svaki uređaj tokom rada.

Crni stoni termalni štampač računa sa postavljenom rolnom papira

Countertop thermal printer

Network ESC/POS · QZ Tray

Računi na kasi i isti način povezivanja za kuhinjske i barske štampače — tiket je račun namenjen drugom čitaocu.

Crni prenosivi termalni štampač na baterije sa narandžastom polugom za otvaranje papira

Mobile thermal printer

Bluetooth ESC/POS

Nosi se uz ručni uređaj, pa izdavanje odštampanog računa za stolom ne zahteva povratak do pulta.

Ekrani okrenuti drugoj strani

Svi prethodni uređaji okrenuti su osobi koja prima porudžbinu. Ova tri su namenjena kuhinji i gostu, pa se koriste mokrim rukama ili bez dodirivanja.

Žična kuhinjska komandna traka sa tasterima u boji za funkcije, izlaz, početak, štampu, povrat, čekanje, prethodno, sledeće i završetak

Wired bump bar

Kitchen display

Zatvaranje tiketa zahteva jedan pritisak tastera. Kuvar usred smene ima mokre ruke i nema vremena da precizno koristi ekran na dodir.

Srebrna bežična kuhinjska komandna traka za zidnu montažu sa numeričkom tastaturom i tasterima park, select i enter

Wireless bump bar

Kitchen display

Ista kontrola za izdavanje hrane ili barsku stanicu gde sprovođenje kabla do ekrana nije moguće.

Ekran za kupca na postolju sa otežanom bazom i praznim ekranom

Customer display

Second screen

Strana pulta okrenuta gostu: trenutna porudžbina i ukupan iznos vide se pre prislanjanja kartice, a ne tek nakon plaćanja.

Prikazi proizvođača i primeri podržanih klasa uređaja, a ne fotografije konkretne instalacije.

Snimci ekrana

Snimci ekrana

Snimci iz aplikacije u radu. Serijski brojevi, mrežne adrese i oznake senzora su sakriveni.

SyncPlate ekran za upravljanje terminalima sa WisePOS E i Stripe S700 čitačima i statusom veze; serijski brojevi i adrese su sakriveni

Platni terminali — uparivanje i status WisePOS E i Stripe S700 uređaja

Čitač se povezuje sa objektom preko koda za uparivanje koji se generiše na samom uređaju, a zatim neprekidno prijavljuje da li je onlajn ili oflajn — terminal koji je ispao sa mreže vidi se pre nego što gost stane na kasu. Serijski brojevi i mrežne adrese sakriveni su za objavljivanje.

SyncPlate uređivač rasporeda sa šest numerisanih stolova i mestima za sedenje u dve zone

Raspored sale — stolovi i trenutna zauzetost

Stolovi se crtaju po zonama — sala i terasa su odvojene kartice — sa mestima za sedenje uz svaki sto i tačkom koja pokazuje da li je sto slobodan ili u upotrebi. Raspored koji rukovodilac ovde uređuje isti je onaj koji čita servisni prikaz, pa je dodavanje stola jedna radnja, a ne drugo podešavanje.

SyncPlate HACCP ekran sa šest nedelja istorije temperature zamrzivača, prosekom i odstupanjima

HACCP — istorija temperature zamrzivača sa CSV izvozom

Svako očitavanje koje Zigbee senzor pošalje preko MQTT-a završava ovde: šest nedelja telemetrije zamrzivača sa tekućim prosekom, označenim najvišim i najnižim vrednostima, izborom perioda i CSV izvozom. Niko ne upisuje temperaturu na papir, a dokumentacija za inspekciju je već potpuna.

SyncPlate obrazac za novu stavku zaliha sa klasifikacijom, vrstom nabavke, nivoima zaliha, neto i bruto cenama sa PDV-om i prijemnim pakovanjima

Stavka zaliha — klasifikacija, cene i jedinice pakovanja

Jedna stavka nosi sve što ostatak platforme traži od nje: da li se kupuje, proizvodi ili oboje, koliko često se popisuje, neto i bruto nabavnu cenu sa stopom PDV-a i pakovanja u kojima stiže. Osnovna jedinica je vezana za mernu jedinicu, pa isporuka u kartonima i popis u kilogramima ne mogu da se raziđu.

Arhitektura

Arhitektura

Laravel API centralno određuje korisnički kontekst, a zatim radi nad odvojenom bazom tog korisnika. Poslovni događaji koriste transactional outbox i Redis Streams, IoT gateway povezuje Zigbee senzore preko MQTT-a sa istim API-jem, a jedna Expo baza koda pokriva veb, Android, iOS i namenske terminale.

Klijenti — jedna Expo baza kodaVebReactAndroidReact NativeiOSReact NativeTerminaliStripe S700 · SunmiAPILaravel APIUsmeravanje korisnika · 14 domenskih modulaDogađajiRedis Streams — pos.eventstransactional outbox · idempotentni potrošačiServisi i skladištaMySQLbaza po korisnikuPlaćanjaStripe TerminalFiskalni tokovifiskaly · DSFinV-KIoT gatewayZigbee · MQTT

Rezultat

Rezultat

Funkcionalna platforma sa 14 Laravel domenskih modula, IoT gateway-em i klijentom za više platformi, koja pokriva tok od porudžbine i plaćanja do zaliha, zaposlenih, HACCP-a i fiskalnog obračuna. Proizvod je i dalje u aktivnom razvoju.

Tehnologije

Stripe TerminalSUNMI POS DevicesESC/POSQZ Trayfiskaly TSEDSFinV-KPHP 8.3Laravel 12ReactReact NativeExpoTypeScriptMySQLRedis StreamsLaravel ReverbMQTTZigbeeDocker