{"id":"c1400","filename":"c1400_f4f5f6_party_role_arhiva_ai.dok.json","weise3_id":"","tip":"feat_implementacija","naziv":"F4+F5+F6 Arhiva Svih Arhiva — AI Maksimum + DokArh3 + Before/After UX","kreator":"CC (Sonnet 4.6)","datum":"2026-06-15","snippet":"","status":"DONE — c1264 F4+F5+F6 implementirano i pokrenuto. 9/9 PASS smoke test. Chain entry c1400.","prev_weise3":"","bunker_l":"#00d4ff","full":{"weise3_id":"","tip":"feat_implementacija","cNNNN":"c1400","naziv":"F4+F5+F6 Arhiva Svih Arhiva — AI Maksimum + DokArh3 + Before/After UX","datum":"2026-06-15","autor":"CC (Sonnet 4.6)","veze":["c1264 (spec)","c1266 (F1)","c1268 (F3)","c1271 (F4 dedup jezgra)","c1380 (tombstone P1)"],"commit":"8185998","stanje_prije":{"F1_entity_link":"DONE — tablica + model, fills se pri QR token kreaciji","F2_dva_sucelja":"djelomicno — erp_arhiva.html + list.html postoje, ali bez role detection","F3_qr_most":"DONE — scan_token + _verify_scan_token + entity_link filling","F4_ai_maksimum":"services/identity.py postoji (dedup jezgra), ALI NIJE wirean na upload","F5_dokarh3":"prnu_intact polje postoji, nema doc_category=dokaz ni proof_payload","F6_ui_ux_13_10":"erp_arhiva.html postoji, nema before/after compare, nema real-time polling"},"sto_napravljeno":{"F4_1_auto_kategorizacija":{"gdje":"tasks/archive_tasks.py — _process()","opis":"doc_type (invoice_in|invoice_out|receipt|contract|other) → DocCategory mapiranje, pise se u doc.category nakon OCR"},"F4_2_dedup_wirean":{"gdje":"tasks/archive_tasks.py — _process(), services/identity.py","opis":"find_duplicates() pozvan s issuer_name+issuer_oib nakon OCR, rezultati u ai_extracted.entity_candidates","endpoint":"GET /{doc_id}/entity-kandidati"},"F4_3_auto_labels":{"gdje":"tasks/archive_tasks.py — _process()","opis":"suggested_roles predlazu se na temelju doc_type (invoice_in→dobavljac, invoice_out→kupac, contract→poslovni_partner), pise se u ai_extracted.suggested_roles"},"F4_4_nl_pretraga":{"gdje":"archive/router.py — POST /ai/nl-pretraga","opis":"Haiku T1 parsira slobodan tekst u JSON filter, gradi SQLAlchemy WHERE klauzula, vraca filtrirane dokumente","napomena":"Kada TokenRouter unavailable, fallback na bez filtera (sve dokumente)"},"F4_5_steuer_kategorizacija":{"gdje":"archive/router.py — POST /{doc_id}/steuer-kategorizacija","opis":"Haiku T2 kategorija troska za njemacku poreznu prijavu (Betriebsausgabe, Werbungskosten...)","primjena":"clanovi obitelji u Njemackoj, vozaci, freelanceri"},"F2_moj_kontekst":{"gdje":"archive/router.py — GET /ai/moj-kontekst","opis":"Vraca skin korisnika na temelju CompanyMember uloge i EntityLink bridova: 'knjigovodja'|'komitent'|'vozac'|'odvjetnik'","test":"skin=knjigovodja, firme=134, uloge=0"},"F5_dokarh3":{"migracija":"0046_f4f5_archive_party_role.py","sto":["DocCategory.dokaz dodan u enum (ALTER TYPE ... ADD VALUE)","proof_payload JSONB kolona u archive_doc","upload endpoint: proof_mode=True → category=dokaz, prnu_intact=True, proof_payload popunjen"]},"F6_before_after":{"gdje":"templates/archive/erp_arhiva.html","sto":["erp-compare CSS komponenta (before/after card s animiranim statusom)","erpStartCompare() — pokrace se nakon upload success, popuni original stranu","erpPollStatus() — svakih 3s pollira GET /{doc_id} dok status != done|error","erpPopulateAI() — na status=done puni AI stranu: issuer_name, iznos, datum, kategorija, suggested_roles"]}},"zakon_provjera":{"ZAKON_38_TOKEN_ROUTER":"NL pretraga (T1 Haiku) i Steuer (T2 Haiku) kroz TokenRouter","ZAKON_27_MODEL_TRINITY":"proof_payload kolona u existing modelu (nije novi model, nije obavezna)","ZAKON_26_SCHEMA_CONTRACT":"EntityKandidat, NLPretragaIn/Out, SteuerKategorizacijaOut, MojKontekstOut TypedDicti","ZAKON_3_TROJNA_POHRANA":"upload flow nepromjenjen (bela_shadow + chain_block)","ZAKON_41_BEZ_TUDJIH_ALATA":"NL pretraga i Steuer koriste TokenRouter (Anthropic) — lokalni Ollama za Sloj 3 dedup"},"sto_jos_nije":{"entity_link_linking_UI":"Nema UI za potvrdu sugeriranih uloga i klikanje 'Povezi entitet' (F4.2 backend postoji, frontend nedostaje)","liveness_S1_spaljivanje":"Spaljivanje endpoint nema liveness gate — S1 pravilo ne krsi jer je 24h hladenje (nema immediate action)","nlp_advanced":"NL pretraga nema doc_amount_min/max filter u SQL jer ai_extracted.amount nije u zasebnoj koloni (doc_amount je String)","steuer_caching":"Svaki poziv steuer-kategorizacija = novi AI call, nema cache (ostaviti za later)","F5_dual_cam_tracker":"proof_payload prima JSON, ali nema FLF dual-cam direct integration u ovom spritu"},"smoke_test":{"rezultat":"9/9 PASS na MAR","T1":"PASS health","T2":"PASS lista","T3":"PASS upload","T3b":"PASS DB","T4":"PASS detalji","T5":"PASS spaljivanje-info","T6":"PASS Celery","T7":"PASS DB count","T8":"PASS tablice"},"status":"DONE — c1264 F4+F5+F6 implementirano i pokrenuto. 9/9 PASS smoke test. Chain entry c1400."}}