{"id":"c0028","filename":"c0028_faza4_propter_kanali.dok.json","weise3_id":"","tip":"plan_faza","naziv":"c0028 — FAZA 4: Propter kanali — soba prosirenje + kanal API","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":"c0028 — FAZA 4: Propter kanali — soba prosirenje + kanal API","prev_chain":"c0027","parent_master":"c0024","cilj":"Soba je vrata, kanali su police na zidu. Univerzalan model za prodavatelj-kupac, glazbenik-slusatelj, knjigovodja-komitent, optika-pacijent.","koraci":{"4.1":{"naziv":"propter.soba prosirenje","akcije":["Dodaj: tenant_id, kanali_lista[], soba_tip (klasicna_invoice|glazbenik_slusatelj|knjigovodja_komitent|optika_pacijent|generic)","Backwards compat: postojeca Pisarovic soba dobija tenant_id=limit_klijenti, kanal_lista=[fakture]"],"fajlovi":["api/propter.py"]},"4.2":{"naziv":"propter.kanal — novi entitet","akcije":["POST /api/v1/propter/sobe/{token}/kanali/ -> kreira kanal (npr. \"Glazba Album 2026\", tip=audio_collection)","POST /api/v1/propter/kanali/{kid}/dokumenti/ -> dodaje media dokarh u kanal","GET /api/v1/propter/kanali/{kid} -> lista svih dokarh-a u kanalu","Tipovi kanala (enum): fakture | ugovori | recepti | zalihe | glazba | video_lekcije | fotografije | tekstovi | porezni_dokumenti | jamstva | generic"],"fajlovi":["api/propter_kanali.py"]},"4.3":{"naziv":"Soba template-i po tipu (preset kanali)","akcije":["POST /api/v1/propter/sobe/?template=glazbenik_slusatelj -> automatski dodaje kanali: [glazba, video_lekcije, fotografije, tekstovi]","template=knjigovodja_komitent -> [fakture, ugovori, porezni_dokumenti, izvodi]","template=optika_pacijent -> [recepti, racuni, jamstva, fotografije_dioptrijskih_pomagala]","template=klasicna_invoice -> [fakture] (ono sto Pisarovic ima)"],"fajlovi":["api/propter.py","services/soba_templates.py"]},"4.4":{"naziv":"UI portal page.tsx prosirenje","akcije":["Stranica prikazuje kanale kao tab-ove (Fakture | Ugovori | Glazba | ...)","Svaki tab pokazuje listu dokarh-a u tom kanalu","Klik na audio dokarh -> inline player (HTML5 audio)","Klik na video dokarh -> inline player (HTML5 video)","Klik na image dokarh -> lightbox","Klik na PDF dokarh -> postojeci PDF gumb (regen iz Krunice)"],"fajlovi":["sucelje/web/app/propter/[token]/page.tsx","sucelje/web/app/propter/[token]/KanalTabs.tsx"]},"4.5":{"naziv":"Decision flow per kanal item","akcije":["Postojeci prihvati/odbij/poništi/ipak (c0023) sad rade per dokarh, ne per ponuda","Glazbenik: \"kupi pjesmu\", \"downloaded\", \"review\"","Optika: \"potvrdi recept\", \"naruci\"","Generic decision lifecycle proširen za multi-step (npr. invoice ima samo prihvati/odbij; glazba ima play/preview/buy/download)"],"fajlovi":["api/propter_kanali.py"]}},"acceptance_kriteriji":["POST /sobe/?template=glazbenik_slusatelj -> kreira sobu s 4 unaprijed konfigurirana kanala","POST /kanali/{kid}/dokumenti/ s mp3 weise3 -> dodaje audio media u \"Glazba\" kanal","GET portal /propter/{token}/ -> renderira tab-ove po kanalima, audio player radi","Glazbenik moze imati 100 pjesama u jednom kanalu, svi su zasebni dokarh-i","Knjigovodja Limit ima sobu po komitentu, kanali = fakture + ugovori + izvodi (template knjigovodja_komitent)"]}}