{"id":"c0025","filename":"c0025_faza1_entitetski_model.dok.json","weise3_id":"","tip":"plan_faza","naziv":"c0025 — FAZA 1: Entitetski model (firma hijerarhija + partner + osoba + tenant)","kreator":"CC","datum":"2026-05-03T13:44:22.604125+00:00","snippet":"","status":"","prev_weise3":"","bunker_l":"#00d4ff","full":{"tip":"plan_faza","kreator":"CC","nastao":"2026-05-03T13:44:22.604125+00:00","naziv":"c0025 — FAZA 1: Entitetski model (firma hijerarhija + partner + osoba + tenant)","prev_chain":"c0024_master_plan_univerzalni_propter_multitenant.dok.json","parent_master":"c0024","cilj":"Svaki realni entitet (pravne i fizicke osobe, podruznice, skladista, tenanti) zivi kao dokarh u Krunici.","koraci":{"1.1":{"naziv":"Prosirenje firme.dokarh (c0023)","akcije":["Dodati polja: parent_firma_id, root_tenant_id, tip (root|sub|client), pravni_oblik_kod (HR/DE/EU enums)","Dodati: zaposlenici[] (lista osoba_id), djelatnici_pristup (mapa osoba_id -> uloga[])","Dodati: branding (boja, font, logo_path, slogan) — koristi se u PDF generatoru","PUT /firme/{wid} radi verziranje (novi dokarh, prev_chain link)"],"fajlovi":["api/firme.py","media/firme/_aliases.json"]},"1.2":{"naziv":"Novi: api/osobe.py — fizicke osobe","akcije":["POST /api/v1/osobe/ — kreiraj osobu","GET /api/v1/osobe/{wid} | /by-oib/{oib} | /by-email/{email}","Polja: ime, prezime, oib_jmbg, email, telefon, adresa, grad, drzava, web, jezik_komunikacije","role[]: lista (vlasnik | zaposlenik | kontakt | kupac | dobavljac | slusatelj | pacijent | knjigovodja | tehnicar | optometrist)","Storage: media/osobe/{wid}.dokarh","WeisE3 stabilan: sha3(GENESIS::OSOBA::ime_prezime_normalizirano::oib_jmbg::FENIX2026)"],"fajlovi":["api/osobe.py"]},"1.3":{"naziv":"Novi: api/partneri_v2.py — generalni partner (firma ILI osoba)","akcije":["NAPOMENA: stari services/partneri.py ostaje za legacy. Novi je v2 — referenca na firma/osoba dokarh.","POST /api/v1/partneri/ — kreira partnera (firma_id ili osoba_id, ne oboje)","Polja: partner_tip (firma|osoba), partner_id, tenant_id, uloga[], primarni_kanal_tip","Indeks: partneri po tenant_id (jedan tenant ima svoje partnere)"],"fajlovi":["api/partneri_v2.py"]},"1.4":{"naziv":"Novi: api/podruznice.py + api/skladista.py","akcije":["POST /api/v1/podruznice/ — kreiraj podruznicu (parent_firma_id obavezan)","POST /api/v1/skladista/ — kreiraj skladiste (parent_podruznica_id obavezan)","Polja podruznica: parent_firma_id, naziv, adresa, grad, drzava, voditelj_osoba_id","Polja skladiste: parent_podruznica_id, naziv, lokacija_unutar_zgrade, kapacitet_jmj, tip (glavni|prikaz|kontrolni)","Brand: optika ima podruznice \"Optika Zagreb\", \"Optika Split\"; svaka ima 1+ skladista"],"fajlovi":["api/podruznice.py","api/skladista.py"]},"1.5":{"naziv":"Novi: api/tenants.py — multi-tenant scope","akcije":["tenant.dokarh: tenant_id (slug), root_firma_id, tip (root|sub|service|client_pool), parent_tenant_id, dozvole_matrica","POST /api/v1/tenants/ — kreira novi tenant (Konjik root, Limit service-pod-Konjik, Optika sub-pod-Konjik)","Dozvole_matrica: koje role iz koje firme smiju citati / pisati / brisati u ovom tenantu","Helper: get_user_tenants(osoba_wid) -> lista tenanata u kojima je osoba clan (bilo kojom rolom)"],"fajlovi":["api/tenants.py"]},"1.6":{"naziv":"Bootstrap: kreiranje konjik_doo, limit, optika tenanta","akcije":["Script: scripts/bootstrap_konjik_limit_optika.py","Kreira: firma.konjik_doo (root), firma.limit (sub-pod-konjik), firma.optika_konjik (sub-pod-konjik)","Kreira tenant: konjik (root), limit_klijenti (service), optika_pacijenti (sub)","Patch postojece: firma.viskovic_bau dobija parent_firma_id = limit (jer je Limitov komitent)","Migracija: Pisarovic ponuda dobija tenant_id = limit_klijenti"],"fajlovi":["scripts/bootstrap_konjik_limit_optika.py"]},"1.7":{"naziv":"ZAKON.py provjere","akcije":["ZAKON 19 prijedlog: Svaki novi dokarh tip (firma, osoba, partner, podruznica, skladiste, tenant) mora imati prazan/test instance koji se moze validirati shemski.","JSON Schema fajlovi: schema/firma.schema.json, schema/osoba.schema.json..."],"fajlovi":["ZAKON.py","schema/*.schema.json"]}},"acceptance_kriteriji":["GET /api/v1/firme/by-slug/konjik_doo -> 200, vraca root firmu","GET /api/v1/firme/by-slug/limit -> 200, parent_firma_id = konjik_doo weise3","GET /api/v1/firme/by-slug/viskovic_bau -> 200, parent_firma_id = limit weise3","POST /api/v1/osobe/ s pravim podacima Ivan Brtan -> 200, weise3 vraca","POST /api/v1/podruznice/ za Optika Zagreb -> 200, parent firma optika_konjik","GET /api/v1/tenants/limit -> 200, tip=service, parent_tenant_id=konjik","ZAKON.py: svi zakoni prolaze; ako c0025 dodaje ZAKON 19 — i on prolazi","Playwright: 5 testova pokriva firma/osoba/podruznica/skladiste/tenant CRUD"]}}