{"id":"c0117","filename":"c0117_genesispos_cc1_frontend_plan.dok.json","weise3_id":"385626a8fd3aca9573f05f76266e518c9ae7c4d0627d4e4b40be3b2b9637cfb9","tip":"plan_izvrsavanja","naziv":"GenosisPOS CC1 — Frontend / PWA / QR Prikaz","kreator":"cc_claude","datum":"2026-05-08","snippet":"","status":"PLAN_DOGOVOREN","prev_weise3":"","bunker_l":"#3e6f6e","full":{"tip":"plan_izvrsavanja","naziv":"GenosisPOS CC1 — Frontend / PWA / QR Prikaz","nastao":"2026-05-08","datum":"2026-05-08","kreator":"cc_claude","sustav":"genesispos","weise3_id":"385626a8fd3aca9573f05f76266e518c9ae7c4d0627d4e4b40be3b2b9637cfb9","prethodni":"c0116_cc1_cc2_merge_integration.dok.json","verzija":"1.0","status":"PLAN_DOGOVOREN","dogovor":"Ivan Seki, 2026-05-08 — split CC1/CC2 potvrđen, QR dodan","sto_treba":"CC1 izvršava frontend/PWA/template zadatke na GenosisPOS-u. Teritorij: templates/, static/, migrations/ (samo nova polja), order_intake.py, nginx CSP. Ne dira backend/fiscal/alati.","teritorij":{"smije":["pos/templates/","pos/static/","pos/migrations/ (samo weise3_id/bunker_seal_id polja)","pos/ai/order_intake.py","/etc/nginx/sites-enabled/genesispos"],"ne_smije":["pos/services/","pos/alati/","pos/tasks.py","pos/fiscal/","pos/views.py (API logika)","pos/models.py (poslovna logika)"]},"zadaci":[{"id":"T01","naziv":"CDN → Lokalni aseti","problem":"kasa.html učitava Tailwind/HTMX/Alpine.js/Dexie.js s CDN-a — offline fail","zakoni":["ZAKON 29"],"chain":"c0119"},{"id":"T02","naziv":"Service Worker precache lista","problem":"SW ne cachira lokalne asete eksplicitno — offline blagajna puca","zakoni":["ZAKON 33"],"chain":"c0120"},{"id":"T03","naziv":"ZAKON 27 migracija — 15 modela","problem":"POSCompany, POSTerminal, POSCashier, POSSession, POSProduct, POSCategory, Table i 8 ostalih nemaju weise3_id/bunker_seal_id","zakoni":["ZAKON 27"],"chain":"c0121"},{"id":"T04","naziv":"Complaint model konsolidacija","problem":"Dva complaint modela (Complaint + POSComplaint) dijele data","zakoni":["ZAKON 32"],"chain":"c0122"},{"id":"T05","naziv":"SemanticStripper u order_intake.py","problem":"AI order parsing nema normalizaciju — isti tekst kroz različite kanale = duplikati","zakoni":["ZAKON 31"],"chain":"c0123"},{"id":"T06","naziv":"QR Prikaz na računu — Porezna uprava","problem":"Račun ne prikazuje QR za provjeru fiskalnosti","novo":true,"opis":"CC2 generira fiscal_qr_url i PNG. CC1 ga prikazuje u receipt_print.html. JS offline fallback generira QR lokalno ako server PNG nije dostupan. URL format: https://porezna.gov.hr/provjera-racuna/?zki={ZKI}&datIzd={datum}&oib={OIB}","fajlovi":["pos/templates/pos/receipt_print.html","pos/templates/pos/receipt_qr.html","pos/static/pos/js/receipt_qr.js","pos/static/pos/vendor/qrcode.min.js"],"zakoni":["ZAKON 29","ZAKON 33"],"chain":"c0124"},{"id":"T07","naziv":"nginx CSP header za genesispos","problem":"Nema Content-Security-Policy headera na genesispos.online — ZAKON 29 kršenje","zakoni":["ZAKON 29"],"chain":"c0125"}],"definicija_done":["kasa.html učitava 0 CDN resursa","SW cachira sve lokalne asete eksplicitno","15 modela imaju weise3_id i bunker_seal_id","Jedan Complaint model (POSComplaint), drugi deprecated","order_intake.py prolazi SemanticStripper","Isprintani račun ima QR koji vodi na porezna.gov.hr s ispravnim ZKI/OIB","CSP header aktivan na genesispos.online","python manage.py check → 0 errors","python manage.py test pos → sve zeleno"],"qr_specifikacija":{"url_format":"https://porezna.gov.hr/provjera-racuna/?zki={ZKI}&datIzd={dd.MM.yyyyTHH:mm:ss}&oib={OIB}","zki_format":"32-char hex, MD5(RSA-SHA1 potpis), case-insensitive","dat_izd_format":"dd.MM.yyyyTHH:mm:ss — identičan kao za ZKI računanje","oib_format":"11-cifarski OIB izdavatelja","sto_radi":"Porezna uprava šalje ZKI na FINA CIS, FINA vraća JIR ako je račun fiskalkan. User vidi: Račun je fiskaliziran + JIR.","offline_fallback":"JavaScript qrcode.js generira QR lokalno od ZKI+OIB+datum koji su dostupni u DOM data-atributima"},"faze":[{"faza":1,"naziv":"CDN eliminacija + SW precache","zadaci":["T01","T02"]},{"faza":2,"naziv":"Model compliance","zadaci":["T03","T04"]},{"faza":3,"naziv":"Input normalizacija","zadaci":["T05"]},{"faza":4,"naziv":"QR prikaz + CSP","zadaci":["T06","T07"]}],"zakon":"ZAKON 27 + ZAKON 29 + ZAKON 31 + ZAKON 32 + ZAKON 33 — svaki zadatak uklanja specifično kršenje","plan_url":"https://genesis.limit-connect.com/plans/cc1_genesispos_frontend.md","v_url":"https://genesis.limit-connect.com/v/385626a8fd3aca9573f05f76266e518c9ae7c4d0627d4e4b40be3b2b9637cfb9"}}