{"id":"c0975","filename":"c0975_fenix_v4_invoicing_modul.dok.json","weise3_id":"v4_invoicing_0013_2026_05_18","tip":"sprint","naziv":"Fenix V4 — Invoicing Modul (globalni fakturni sustav)","kreator":"CC + Ivan Brtan","datum":"2026-05-18","snippet":"","status":"","prev_weise3":"","bunker_l":"#00d4ff","full":{"tip":"sprint","naziv":"Fenix V4 — Invoicing Modul (globalni fakturni sustav)","revision":"0013","datum":"2026-05-18","autor":"CC + Ivan Brtan","sto_treba":"Prekopiraj invoicing logiku iz fina-connect u Fenix V4 kao superiorniji async FastAPI modul. 10x bolji kod: RRIF matematika, multi-jurisdikcija, async, puni audit trail.","faze":[{"naziv":"tax.py","status":"DONE","opis":"Multi-jurisdikcija engine: HR PDV, DE MwSt, AT USt, CH MWST. RRIF standard: aggregate base → round(HALF_UP) → tax na zbroju. 4 decimale za unit_price."},{"naziv":"models.py","status":"DONE","opis":"SQLAlchemy 2.x async modeli. Invoice, Line, Profile, Sequence, Acknowledgement, Event. ZAKON 27 polja: weise3_id, bunker_seal_id, created_at."},{"naziv":"schemas.py","status":"DONE","opis":"Pydantic v2 ZAKON 26 TypedDict schema. InvoiceIn/Out, InvoiceLineIn, TaxGroupOut, AcknowledgeOut, InvoicePortalOut, InvoiceStatusUpdate."},{"naziv":"service.py","status":"DONE","opis":"Business logika. next_invoice_number (SELECT FOR UPDATE), create_invoice, change_status (_ALLOWED_TRANSITIONS graph), acknowledge_invoice (idempotent), recalculate_invoice."},{"naziv":"router.py","status":"DONE","opis":"FastAPI router. Internal JWT: CRUD + status + recalculate. Public portal (token-based): GET + POST acknowledge. Bilingual HR/DE poruka."},{"naziv":"migration 0013","status":"DONE","opis":"Alembic pure SQL (jedan op.execute() po naredbi — asyncpg limit). 6 tablica + 5 enum tipova. FK prema company (V4 naziv, ne companies_company)."},{"naziv":"main.py integracija","status":"DONE","opis":"Router registriran na /api/v4/invoicing/*. dilithium-py instaliran. 7 endpointa aktivna."}],"endpointi":["POST   /api/v4/invoicing/invoices","GET    /api/v4/invoicing/invoices","GET    /api/v4/invoicing/invoices/{invoice_id}","PATCH  /api/v4/invoicing/invoices/{invoice_id}/status","POST   /api/v4/invoicing/invoices/{invoice_id}/recalculate","GET    /api/v4/invoicing/portal/{token}","POST   /api/v4/invoicing/portal/{token}/acknowledge"],"razlike_od_fina_connect":["Async SQLAlchemy 2.x (ne sync Django ORM)","RRIF standard: aggregate base ROUND_HALF_UP (ne round po liniji)","Multi-jurisdikcija: HR/DE/AT/CH u jednom enginu","Status transition graph: _ALLOWED_TRANSITIONS dict","InvoiceEvent immutable audit log (INSERT only)","InvoiceAcknowledgement: idempotent po invoice+IP, SHA-256 content hash","SELECT FOR UPDATE na InvoiceSequence (nema race condition)","ZAKON 27 trojka na svim modelima","client_token UUID za portal (ne session/login)","Bilingual portal: HR i DE","unit_price NUMERIC(14,4) za 4 decimale (RRIF standard)"],"zakon":["ZAKON 26","ZAKON 27","ZAKON 32","ZAKON 0"],"napomena":"fina-connect invoicing zamrznut — sav novi razvoj u V4. Taj modul je globalni standard koji se poziva iz svake prilike.","weise3_id":"v4_invoicing_0013_2026_05_18","bunker_seal_id":""}}