{"id":"c0982","filename":"c0982_db_dedup_pkey_fix.dok.json","weise3_id":"WEISE3::a5076c3d3e34e464040bdf583f758807::CC::dokarh::FENIX2026","tip":"fix+critical","naziv":"DB dedup + PRIMARY KEY fix — invoicing_invoice + invoiceitem","kreator":"genesis","datum":"2026-05-18","snippet":"","status":"","prev_weise3":"","bunker_l":"#00d4ff","full":{"tip":"fix+critical","naziv":"DB dedup + PRIMARY KEY fix — invoicing_invoice + invoiceitem","sustav":"fina-connect","git_commit":"4d1fbbf7","server":"NEW (31.70.90.84)","datum":"2026-05-18","problem":"invoicing_invoice i invoicing_invoiceitem NISU imali PRIMARY KEY constraint. Cijela tablica bila duplirana (svaki invoice 2x, svaka stavka 3x). Ukupno: 30.656 invoice redova umjesto 15.335, 29.616 item redova umjesto 9.876.","uzrok":"Import/migracija podataka pokrenuta vise puta bez provjere duplikata. Baza radila funkcionalno jer Django ORM ne ovisi o DB-level PK.","rjesenje":["DELETE invoice duplikata (DELETE 15321): zadrzi MIN(ctid) po id","DELETE item duplikata (DELETE 19740): zadrzi MIN(ctid) po id","ALTER TABLE invoicing_invoice ADD PRIMARY KEY (id)","ALTER TABLE invoicing_invoiceitem ADD PRIMARY KEY (id)","ALTER TABLE invoicing_invoiceacknowledgement ADD FOREIGN KEY -> invoicing_invoice(id)","VACUUM ANALYZE obje tablice","Migracija 0043 kao record u django_migrations","Backup: invoicing_invoice_backup_20260518, invoicing_invoiceitem_backup_20260518"],"provjera":"VIS-R-2026-004: 6 stavki, subtotal=1300.00 = sum(items). Django check: 0 errors.","zakon":["ZAKON 32"],"napomene":"Stari racuni (id 1-5000) imaju nekonzistentne stored subtotals (kalkulirani od starih cijena). Nije dio ovog fixa. Backup tablice dostupne za provjeru.","weise3_id":"WEISE3::a5076c3d3e34e464040bdf583f758807::CC::dokarh::FENIX2026"}}