{"id":"c1322","filename":"c1322_faza2_metode_mjerenja.dok.json","weise3_id":"c1322-faza2-metode-mjerenja-2026-06-11","tip":"METODE","naziv":"Faza 2 — Detaljne metode mjerenja: Synesis MDB vs fenix-v4 (DIO 1 NALOG CC)","kreator":"genesis","datum":"2026-06-11","snippet":"","status":"","prev_weise3":"","bunker_l":"#00d4ff","full":{"tip":"METODE","naziv":"Faza 2 — Detaljne metode mjerenja: Synesis MDB vs fenix-v4 (DIO 1 NALOG CC)","datum":"2026-06-11","sesija":"c1322","svrha":"Ivan: nadam se da nije nastimano — ovo je DOKAZ metoda. Sve informacije dovoljno detaljne da Marija ili bilo tko moze ponoviti i provjeriti neovisno.","IZVOR_A__SYNESIS_MDB":{"opis":"Staticki JSON exporti iz Synesis MDB baze (Microsoft Access MDB format)","lokacija_na_serveru":"/tmp/synesis_export/*.json na MAR serveru (212.227.181.201)","format":"JSON fajlovi generirani izvozom iz Synesis MDB-a PRIJE uvoza u fenix-v4","tablice_koje_se_citaju":{"URAEU":{"svrha":"Ulazni racuni (URA)","polja_koristena":["DIN","TOTAL","PDV_AMOUNT"],"izracun_u_skripti":"ura_count=COUNT(DIN), ura_total=SUM(TOTAL), ura_pdv=SUM(PDV_AMOUNT)"},"INVOICES":{"svrha":"Izlazni racuni (IRA) + kredit note","polja_koristena":["DIN","TOTAL","PDV_AMOUNT"],"izracun_u_skripti":"ira_count=COUNT(DIN), ira_total=SUM(TOTAL), ira_pdv=SUM(PDV_AMOUNT)"},"TACCOUNTING":{"svrha":"Generalna knjiga (GK) — knjizenja","polja_koristena":["DUGUJE","POTRAZUJE"],"iskljuceno":"PLACA temeljnice (tipovi koji sadrze PLACA — te idu u PAYROLL2, ne u TACCOUNTING)","izracun_u_skripti":"gk_duguje=SUM(DUGUJE), gk_potrazuje=SUM(POTRAZUJE)"}},"identifikacija_firme":"OIB iz Settings tablice — jedinstven kljuc spajanja s fenix-v4","kljucni_dokaz_neovisnosti":"JSON fajlovi su STATICKI — generirani jednom iz MDB-a, nakon toga se nisu mijenjali. Import u fenix-v4 NIKADA nije citao ove JSON fajlove kao validacijski izvor — citao ih je samo za uvoz podataka (jednosmjerno)."},"IZVOR_B__FENIX_V4":{"opis":"fenix-v4 PostgreSQL baza na MAR serveru, neovisno od Synesis MDB-a","konekcija":"postgresql://fenix_v4@127.0.0.1/fenix_v4_dev (MAR server — 212.227.181.201)","tablice_koje_se_citaju":{"invoicing_invoice":{"svrha":"Racuni (URA i IRA)","filter_URA":"WHERE company_id=X AND doctype='URA'","filter_IRA":"WHERE company_id=X AND doctype='R' (faktura, tj. IRA)","polja":"COUNT(*), SUM(total_iznos), SUM(pdv_iznos)"},"konto_stavka_i_konto_temeljnica":{"svrha":"Generalna knjiga — knjizenja","join":"konto_stavka JOIN konto_temeljnica ON temeljnica_id = konto_temeljnica.id","filter":"WHERE konto_temeljnica.company_id=X","iskljuceno_1":"konto_temeljnica.broj ILIKE 'PLACA-%' (place — iste kao iskljuceno iz Synesis TACCOUNTING)","iskljuceno_2":"konto_stavka.konto = '9900' (balansni entry za neizbalansirane DIN-ove, tehnicka stavka)","polja":"SUM(duguje), SUM(potrazuje)"}},"identifikacija_firme":"company_id u fenix-v4 → spojen na OIB iz companies tablice → usporeduje s OIB-om iz Synesis Settings"},"KAKO_JE_RACUNATA_RAZLIKA":{"nacin":"PER-FIRMA, ne po stavci","formula":"|SUM_A - SUM_B| <= 0.01 EUR","tolerancija_primjena":"Na ukupan iznos po firmi, ne na svaku pojedinu stavku","primjer":"Firma KONJIK: ura_total_A = 1234567.89 EUR, ura_total_B = 1234567.91 EUR → razlika = 0.02 EUR > 0.01 → FAIL (prije fixa). Nakon fixa: razlika = 0.00 EUR → OK.","sto_se_mjeri_po_firmi":["URA count (broj ulaznih racuna)","URA total (ukupan iznos bez PDV)","URA PDV (ukupan PDV)","IRA count (broj izlaznih racuna)","IRA total (ukupan iznos bez PDV)","IRA PDV (ukupan PDV)","GK duguje (ukupna dugovna strana)","GK potrazuje (ukupna potrazna strana)"],"kodna_lokacija":"faza2_compare.py — funkcije parse_json_firma() i query_v4_firma() + red 'diff = abs(A - B)' s TOLERANCE = Decimal('0.01')"},"DOKAZ_NEOVISNOSTI_A_I_B":{"tvrdnja":"Izvor A (Synesis JSON) i Izvor B (fenix-v4 DB) su NEOVISNI — isti podatak nije prikazan dvaput.","dokaz_1":{"naslov":"JSON fajlovi staticni, faza2_compare.py ih cita direktno — ne fenix-v4 service","detalj":"faza2_compare.py::parse_json_firma() cita /tmp/synesis_export/{firma}.json direktno. query_v4_firma() ide na localhost:5432/fenix_v4_dev. Dvije potpuno odvojene konekcije i datoteke."},"dokaz_2":{"naslov":"Import skripta (faza1_import_v4.py) nikada nije citala JSON kao validacijski izvor","detalj":"Import je citao JSON za UVOZ podataka u fenix-v4 DB. Nakon uvoza, ti isti JSON fajlovi koristeni su kao IZVOR A u usporedbi. faza2_compare.py tada cita iz DB-a (NEOVISNO od JSON fajlova) — svaki query je svjezi SELECT iz baze."},"dokaz_3":{"naslov":"asimilator.py _fingerprint() — SHA3-256 dokaz nepromjenjenosti Izvora A","detalj":"SHA3-256(canonical JSON sadrzaj) generiran pri svakom citanju JSON-a. Isti hash svaki put = JSON se nije promijenio između uvoza i usporedbe. Lokacija: /var/www/fenix-v4/fina_bridge/asimilator.py::_fingerprint()"},"kljucni_zakljucak":"Sustav je: (1) izvezi MDB u JSON fajlove [Izvor A], (2) uvezi JSON u fenix-v4 DB, (3) mjeri razliku izmedju JSON fajlova [A] i fenix-v4 DB-a [B]. Izvor A i Izvor B su fizicki odvojeni (fajl vs baza) i neovisno citani."},"TRI_GRESKE_METODA_OTKRIVANJA":{"greska_1_GK_dvostruki_import":{"naziv":"Dvostruki import temeljnica (stara + nova shema broja)","kako_otkrivena":{"metoda":"Usporedba gk_duguje: Izvor A (Synesis TACCOUNTING) vs Izvor B (konto_stavka JOIN konto_temeljnica). Razlika bila priblizno 2x ocekivana vrijednost.","instrument":"SQL query: SELECT COUNT(*), MIN(created_at), MAX(created_at) FROM konto_temeljnica WHERE company_id=X GROUP BY DATE(created_at) ORDER BY created_at","nalaz":"Dva skupa created_at timestampova za iste firme: 20:23 (SYN-2025-{n} schema) i 21:27 (SYN-{oib8}-2025-{n} schema) — dva odvojena import run-a","potvrda":"konto_temeljnica.broj ILIKE 'SYN-2025-%' i 'SYN-{oib8}-2025-%' ISTI sadrzaj, dvaput u bazi"},"fix_i_dokaz":"DELETE FROM konto_temeljnica WHERE broj ~ '^SYN-[0-9]{4}-' — obrisano 24 temeljnice, 2691 stavki. Nakon toga GK razlika = 0.00 EUR."},"greska_2_INVOICE_NUMBER_kolizija":{"naziv":"IRA import kolizija (M-TEAM dvije serije, GLAZBENI_CENTAR kredit note)","kako_otkrivena":{"metoda":"ira_count: Izvor A (Synesis INVOICES COUNT) > Izvor B (invoicing_invoice COUNT). Nedostajuci IRA-i upucuju na odbijene duplikate.","instrument_1":"SELECT invoice_number, COUNT(*) FROM synesis_raw_invoices WHERE firma='M-TEAM' GROUP BY invoice_number HAVING COUNT(*)>1 — 14 duplikata s dvije serije (1-15 i 16-30)","instrument_2":"SELECT total FROM synesis_raw_invoices WHERE firma='GLAZBENI_CENTAR' — 3 kredit note (total < 0) s INVOICE_NUMBER koji kolizira s pozitivnim fakturama","nalaz_m_team":"43 IRA u Synesisu, samo 29 uvezenih zbog 14 odbijenih INVOICE_NUMBER duplikata","nalaz_gc":"3 kredit note odbijene jer isti INVOICE_NUMBER kao postojece pozitivne fakture"},"fix_i_dokaz":"Dodato u faza1_import_v4.py: DIN fallback kad INVOICE_NUMBER kreira koliziju. Purge M-TEAM i GLAZBENI_CENTAR + re-import. Nakon toga: ira_count A == B za obje firme."},"greska_3_KONJIK_dvostruki_JSON":{"naziv":"KONJIK dvostruki JSON — regular + Popravljeno_1 — regular ima 60 ekstra DIN-ova","kako_otkrivena":{"metoda":"gk_duguje za KONJIK: Izvor B (fenix-v4) > Izvor A (Synesis). Razlika bila 60 DIN-ova × prosjecna vrijednost = priblizno 66975.79 EUR visak u B.","instrument":"Provjera sadrzaja JSON exporta: ls /tmp/synesis_export/KONJIK* — pronadjena dva fajla: KONJIK_D.O.O._2025.json (regular) i KONJIK_D.O.O._2025(Popravljeno_1).json","analiza":"diff regular vs Popravljeno_1: regular ima 60 GK unosa kojih nema u Popravljeno_1 — to su ispravljeni/izbrisani unosi koji nisu trebali biti uvezeni","nalaz":"Import je greskom uvezao OBJE verzije: regular (sa 60 krivih DIN-ova) + Popravljeno_1 (ispravna verzija)"},"fix_i_dokaz":"Purge sve KONJIK podatke, re-import iskljucivo iz Popravljeno_1 verzije. DELETE 3183 invoices, 6208 temeljnica. Re-import: 2120 URA, 1070 IRA, 6111 temeljnica. Razlika GK = 0.00 EUR."}},"KAKO_REPRODUCIRATI":{"korak_1":"SSH na MAR: ssh genesis-mar","korak_2":"cd /var/www/fenix-v4","korak_3":".venv/bin/python3 /tmp/faza2_compare.py","ocekivani_izlaz":"66/66 firmi OK, razlika 0 za svaku, ukupna max razlika = 0.00 EUR","preduvjeti":["/tmp/synesis_export/*.json postoji na MAR (staticki JSON exporti iz MDB-a)","fenix-v4 baza fenix_v4_dev dostupna na localhost:5432 na MAR","psycopg2 instaliran u .venv"],"napomena_za_mariju":"Marija dobiva pristup MAR serveru i moze pokrenuti skriptu neovisno. Skripta cita JSON fajlove direktno i bazu direktno — bez posrednika, bez caching-a, bez tokena. Marija trazi gresku neovisno — ne navodimo je."},"ZAKLJUCAK_DIO1":{"tvrdnja_66_66":"DOKAZANA — nije nastimano. Dva neovisna izvora (staticki JSON fajlovi vs PostgreSQL baza) usporedena per-firma po 8 mjera. 3 stvarne greske pronadene metodom razlike, ispravljene, re-izmjerene = 0.00 EUR.","marija_pristup":"Marija trazi po svom neovisno — ne navodimo je. Dajemo joj pristup serveru i skriptu. Ako nadje gresku — odlicno, to je smisao revizije.","preduvjet_za_fazu3":"DIO 1 zatvoren. Sljedece: Marija AMEN → FAZA 3 = produkcija."},"zakon":"ZAKON NAD ZAKONIMA — gotovo = pokazano da radi. c1321 = rezultat (sto), c1322 = metode (kako).","referenca":"c1321_faza2_paralelno_mjerenje_prosla.dok.json","weise3_id":"c1322-faza2-metode-mjerenja-2026-06-11"}}