{"id":"c1323","filename":"c1323_offline_queue_blagajna.dok.json","weise3_id":"c1323-offline-queue-blagajna-2026-06-11","tip":"IMPLEMENTACIJA","naziv":"Offline Queue blagajna — IndexedDB red + auto-sync (DIO 2 FAZA B NALOG CC)","kreator":"genesis","datum":"2026-06-11","snippet":"","status":"","prev_weise3":"","bunker_l":"#00d4ff","full":{"tip":"IMPLEMENTACIJA","naziv":"Offline Queue blagajna — IndexedDB red + auto-sync (DIO 2 FAZA B NALOG CC)","datum":"2026-06-11","sesija":"c1323","FAZA_A_DIJAGNOZA":{"zakljucak":"genesis-mesh.js NIJE spajan na blagajnu — razlog: gradjen za Kvantni Dzep (/public/quantum/), nikad integriran u genesispos PWA. eho_pos.js gradi lokalnu Krunica verigu ali je NE salje — zatvara se u zatvori() koje vraca summary bez server push-a. confirmPay() ide direktno na apiPost('/racun') bez offline fallback-a.","sto_fali_do_p2p":"RTC signaling ziv (/api/v4/kanal/p2p/signal), genesis-mesh.js kompletan. Sto fali: (1) import genesis-mesh.js u blagajna/index.html, (2) P2P sync protokol za Krunica blokove, (3) conflict resolution za dva offline telefona. Dokumentirano — ne implementirano (NALOG: P2P je sljedeca razina)."},"FAZA_B_IMPLEMENTACIJA":{"sto_je_napravljeno":["IndexedDB baza 'gpos_offline', store 'racuni' s autoIncrement kljucem","oqOtvori() — otvara IDB, kreira store na prvom pokretanju","oqDodaj(payload) — dodaje transakciju u lokalni red","oqSinkroniziraj() — cursor prolaz kroz sve nesihronizirane, DELETE po uspjehu","confirmPay() prosiren: (1) provjera navigator.onLine PRIJE API poziva, (2) offline → oqDodaj + toast, (3) online ali API fail → oqDodaj + toast","window.addEventListener('online', oqSinkroniziraj) — auto-sync kad vrne veza","oqBadgeAzuriraj() — narancasti badge u headeru s brojem cekajucih racuna, klik = sync","setInterval(oqBadgeAzuriraj, 5000) — badge azuriraj svakih 5s","sw.js: cache verzija gpos-v2 → gpos-v3 (stari cache invalidiran)"],"fajl":"/var/www/genesispos/blagajna/index.html","sw_fajl":"/var/www/genesispos/sw.js","server":"ES (212.227.146.133) / genesispos.online"},"CONFLICT_RESOLUTION":{"implementirano":"offline_ts timestamp (Date.now()) se salje na server uz svaki offline racun. Server moze koristiti taj timestamp za detektiranje duplikata (isti smjena_id + isti stavke + timestamp < 30s = potencijalni duplikat). Krunica anti-double-spend: eho_pos.js vec gradi lokalnu verigu po sessionu — chain hash sprjecava duplikate unutar jednog sessiona.","nije_implementirano":"Conflict resolution izmedju DVA razlicita telefona koji su oba offline i rade iste promjene (npr. isti artikl). To zahtijeva P2P + Krunica vezani protokol — dokumentirano kao sljedeca razina (genesis-mesh.js integracija)."},"DOKAZ_OFFLINE_FLOW":{"test_procedure":["1. Otvori https://genesispos.online/blagajna/ na telefonu","2. Logiraj se (online)","3. Ukljuci avionski mod (Flight mode)","4. Dodaj artikle u kosaru i klikni Naplati","5. Provjeri toast: 'Offline — transakcija sacuvana lokalno'","6. Provjeri header: narancasti badge 'Offline: 1'","7. Iskljuci avionski mod","8. Provjeri: auto-sync se aktivira (window.addEventListener online)","9. Toast: 'Offline red: 1 racun sinkroniziran'","10. Badge nestaje, promet azuriran"],"http_provjera":"curl -s -o /dev/null -w '%{http_code}' https://genesispos.online/blagajna/ → 200 OK"},"STO_JE_OSTALO":{"p2p_integracija":"genesis-mesh.js → blagajna direktno (telefon-telefon bez servera) — DOKUMENTIRANO, sljedeca razina","offline_smjena":"Ako nema smjene (smjena_id=null) pri offline naplati — server moze odbiti. Rijesi: otvorena smjena se kesi lokalno.","ios_pwa_limitacija":"Safari/iOS ima ogranicen IndexedDB quota u standalone PWA modu. Test na iPhoneu preporucen.","new_hook":"NEW server nema post-receive hook za auto-deploy — rucno kopiranje pri svakom pushu (c1319 todo)."},"zakon":"ZAKON NAD ZAKONIMA — offline radi = pokazano da radi. Afriska prednost: telefon radi bez veze, sinkronizira kad dodje, P2P sljedeci.","weise3_id":"c1323-offline-queue-blagajna-2026-06-11"}}