{"id":"c0128","filename":"c0128_sesija_cc2_genesispos_20260508.dok.json","weise3_id":"WEISE3::c0128_sesija_cc2_genesispos_20260508::CC2::genesispos::FENIX2026","tip":"sesija","naziv":"CC2 — GenosisPOS backend + SW offline fix (20260508)","kreator":"CC2 (claude-sonnet-4-6)","datum":"2026-05-08","snippet":"=== SPRINT: GenosisPOS backend T01-T08 === · T01 — threading.Thread → push_to_brsljani_task (Celery) ·   omega_engine._push_to_brsljani_async: daemon thread zamijenjen Celery async taskom","status":"","prev_weise3":"","bunker_l":"#00d4ff","full":{"tip":"sesija","naziv":"CC2 — GenosisPOS backend + SW offline fix (20260508)","datum":"2026-05-08","autor":"CC2 (claude-sonnet-4-6)","lanac_seq":128,"prev":"c0127","sto_je_napravljeno":["=== SPRINT: GenosisPOS backend T01-T08 ===","T01 — threading.Thread → push_to_brsljani_task (Celery)","  omega_engine._push_to_brsljani_async: daemon thread zamijenjen Celery async taskom","  Nema više mogućnosti worker connection leaka pri visokom prometu","T02 — BPZ-9 L0-L8 full 9-layer seal (pos/services/bpz9.py)","  BPZ9Sealer klasa: integrity, timestamp, identity, chain, operator,","  quantum (ML-KEM-1024 placeholder za FenixVault), cross-chain, lifecycle, master","  omega_engine._compute_bunker_seal migriran s L2 na L0-L8","T03 — Trojna pohrana ZAKON 3: Krunica + Dvorac (pos/tasks.py)","  trojna_pohrana_task: Noga 1 Krunica (ChainBlock sha3), Noga 2 Dvorac (vault)","  Poziva se iz finalize_receipt NAKON Bršljan pusha — nikad ne blokira fiskalizaciju","T04 — BasePOSAlat.on_demand(context: dict) → dict","  Dodan lifecycle hook za reprint/export/custom on-demand operacije","  Sprječava AttributeError na terminalima s on-demand akcijama","T05 — QR fiscal generacija (pos/fiscal/hr/qr_gen.py) + migration 0019","  build_verification_url: Porezna uprava HR URL format","  generate_qr_png: qrcode[pil]+Pillow, graceful degradation bez paketa","  attach_qr_to_receipt: PNG u /media/pos/qr/, relativan path na modelu","  migration 0019: fiscal_qr_url URLField + fiscal_qr_image CharField na POSReceipt","  attach_qr_after_fiscalize Celery task dodan","T06 — FISCAL_HR_DEMO_MODE env safety flag (pos/fiscal/factory.py)","  FISCAL_HR_DEMO_MODE=1: forced demo ZKI/QR bez FINA certa","  FISCAL_HR_DEMO_MODE=0 + nema certa: log warning + graceful fallback","T07 — SI FURS sandbox readiness (pos/fiscal/si/__init__.py)","  SANDBOX_READY=True, PRODUCTION_READY=False","  REQUIRED_ENV_VARS, sandbox/prod endpoint URL-ovi, get_status() helper","  Ceka FURS sandbox certifikat i registraciju na edavki.durs.si","T08 — Offline API Bundle (pos/views.py + pos/urls.py)","  GET /hr/pos/api/kasa/<terminal_id>/offline-bundle/","  Vraća products (15), categories (6), terminal metadata, settings, demo_flag","  Cache-Control: public, max-age=1800 za SW offline caching","=== LIVE PROVJERA: offline-bundle na mobitelu u PWA ===","Pronađena 4 kritična CC1 buga koji su blokirali PWA na mobitelu — svi popravljeni:","BUG 1 — SW registration path: /pos/static/pos/omega/sw.js → 404","  Fix: app.js promijenjen na /static/pos/omega/sw.js","BUG 2 — SW scope: /pos/ ne pokriva /hr/pos/omega/kasa/... → SW nikad aktivan","  Fix: scope promijenjen na /hr/pos/ u app.js","BUG 3 — nginx nema Service-Worker-Allowed header → browser odbija cross-path scope","  Fix: limit-connect nginx config: location = /static/pos/omega/sw.js","       add_header Service-Worker-Allowed '/hr/pos/'; no-cache","BUG 4 — OFFLINE_ASSETS i fetch handler koristili /pos/ prefix → 404 na svemu","  Fix: sw.js v2.2 — sve putanje migriranne na /hr/pos/; dynamic bundle via SET_TERMINAL","       app.js: detektira terminal_id iz URL-a, šalje postMessage SW-u","       manifest start_url: /pos/omega/ → /hr/pos/omega/","=== VERIFIKACIJA ===","service-worker-allowed: /hr/pos/ ✓","sw.js VERSION = omega-sw-2.2 ✓","manifest start_url = /hr/pos/omega/ ✓","offline-bundle: 200, products=15, categories=6, demo=True ✓","manage.py check: 0 errors ✓","migration 0019 applied ✓","29/29 zakona ✓"],"commitovi":["68effbc — feat(pos): CC2 GenosisPOS backend T01-T08 (11 fajlova, 694 insertija)","df3d4c5 — fix(pos): offline-bundle terminal filter + timezone.now() import","70dad16 — fix(pos): SW scope /hr/pos/, Service-Worker-Allowed, manifest start_url, offline-bundle URL"],"novi_fajlovi":["pos/services/bpz9.py","pos/fiscal/hr/qr_gen.py","pos/fiscal/si/__init__.py","pos/migrations/0019_fiscal_qr_fields.py"],"otvoreni_threadovi":["qrcode[pil] + Pillow nisu instalirani na serveru — QR generacija tiho preskočena dok se ne instaliraju","FURS SI sandbox certifikat pending — kontakt edavki@gov.si","FenixVault ML-KEM-1024 L5 BPZ9 sloj je placeholder — aktivacija čeka produkcijski cert","Dvorac vault L5 = base64 placeholder — zamijeniti ML-DSA-65 enkripcijon"],"weise3_id":"WEISE3::c0128_sesija_cc2_genesispos_20260508::CC2::genesispos::FENIX2026","_opp_seal":"BPZ9-L0-SESIJA"}}