{"id":"c1086","filename":"c1086_komitenti_command_center_plan.dok.json","weise3_id":"","tip":"plan","naziv":"Komitenti Command Center — Dashboard Upgrade (Konjik d.o.o.)","kreator":"CC claude-sonnet-4-6 + Ivan Seki","datum":"","snippet":"","status":"PLAN_SPREMAN","prev_weise3":"","bunker_l":"#00d4ff","full":{"tip":"plan","naziv":"Komitenti Command Center — Dashboard Upgrade (Konjik d.o.o.)","sto_treba":"Nadograditi /hr/komitenti/ u Command Center standard: ikone uvijek vidljive, bulk import (CSV/JSON/XLS/TXT), Synesis 87→7 grupiranje, grid/lista preklapanje, POS optimizacija. Bez sidebar-a.","url_referenca":"https://limit-connect.com/hr/dashboard/","arhitektura":{"layout":"BEZ sidebara — gornji sticky toolbar: logo + tražilica (centar) + 3 gumba + hamburger","tri_gumba":["+ Novi","↑ Import (CSV/JSON/XLS/TXT)","⊕ Synesis moduli"],"hamburger":"Profil | Postavke | Prečice | Odjava","search":"Cmd+K shortcut, instant 200ms debounce, sticky na scrollu","prikaz":"Grid (desktop) / Lista (mobile/POS) — toggle gumb","server":"MAR (212.227.181.201), /var/www/fenix-v4/","postojeci_kod":{"lista_template":"/var/www/fenix-v4/templates/komitenti/lista.html","router_api":"/var/www/fenix-v4/komitenti/router.py","lookup":"/var/www/fenix-v4/komitenti/lookup.py (OIB+VIES+Synesis lookup)","fina_bridge":"/var/www/fenix-v4/fina_bridge/reader.py (FinaPartner dataclass — mapping poznat)","genesis_chat":"/var/www/fenix-v4/static/js/genesis-chat.js (GenesisKanal — spreman za embed)"}},"dio_1":{"naziv":"Backend — novi API endpointi","fajl":"/var/www/fenix-v4/komitenti/router.py (proširiti) + import.py (novi)","faze":[{"rb":1,"naziv":"POST /api/v4/komitenti/import/preview/","status":"TODO","opis":"Dry-run: prihvati multipart file (CSV/JSON/XLS/TXT), auto-detect format, parsiraj, vrati preview prvih 20 redaka + mapping prijedlog kolona → Company polja. Detektiraj duplikate po OIB-u. BEZ zapisa u bazu.","output":"{format, ukupno, preview:[{row, mapped, duplikat, greska}], mapping:{col→field}, nepoznate_kolone:[]}"},{"rb":2,"naziv":"POST /api/v4/komitenti/import/","status":"TODO","opis":"Pravi uvoz: isti file + potvrđeni mapping iz preview-a. Za svaki red: OIB duplikat check → preskoči, validan → Company create s WeisE3 + BunkerSeal (ZAKON 27). ZAKON 2: Brsljani push za svaki novi komitent. Vrati report.","output":"{uvezeno:N, preskoceno:N, greske:[{row, razlog}], weise3_ids:[]}","zakon":["ZAKON_2","ZAKON_3","ZAKON_27","ZAKON_38_T0_za_mapping_sugestije"]},{"rb":3,"naziv":"GET /api/v4/komitenti/synesis/modules/","status":"TODO","opis":"Vrati grupiranih 87 Synesis modula u 7 kategorija. Statički JSON u kodu — ne treba baza. Svaki modul ima: naziv, grupa, import_podrzan (bool), fenix_ekvivalent (string ili null).","grupe":["Partneri","Dokumenti","Zaposlenici","Zalihe","Blagajna","Porezi","Ostalo"],"napomena":"Mapping modula vidljiv u fina_bridge/reader.py — FinaPartner, FinaInvoice, itd."},{"rb":4,"naziv":"Proširiti GET /api/v4/komitenti/ — zadnji_dok polje","status":"TODO","opis":"Trenutno doc_count postoji ali zadnji_dok nije u KomitentOut. Dodati zadnji_dok: datetime | None u KomitentOut + subquery u list_komitenti. Potrebno za karticu."}]},"dio_2":{"naziv":"Frontend — nova lista_v2.html + import modal + Synesis panel","fajl":"/var/www/fenix-v4/templates/komitenti/lista.html (zamjena ili v2)","zakon":["ZAKON_41_bez_CDN","ZAKON_29_CSP","ZAKON_40_genesis_auth"],"faze":[{"rb":1,"naziv":"Ikone na kartici — uvijek vidljive (bez hover)","status":"TODO","opis":"Zamijeniti hover-only .km-card-acts s .km-card-actions uvijek vidljivim redom na dnu kartice. 4 ikone + ⋮ dropdown. Ikone: 📂 Arhiva | 📤 Upload | 💬 GenesisKanal | ✏ Uredi | ⋮ Više.","genesis_chat_init":"GenesisChat.init({ref_id: kid, context: 'komitent', lang: 'hr'}) — genesis-chat.js već postoji na /static/js/genesis-chat.js","vise_dropdown":["Fakture","Synesis moduli","Deaktiviraj"]},{"rb":2,"naziv":"Command Center toolbar","status":"TODO","opis":"Novi km-toolbar: logo lijevo + tražilica centar (Cmd+K fokus) + 3 gumba desno + hamburger. Sticky na scrollu. Tražilica: placeholder 'Traži komitenta... (Cmd+K)', autocomplete na /api/v4/komitenti/search/."},{"rb":3,"naziv":"Grid/Lista toggle — POS optimizacija","status":"TODO","opis":"Dva prikaza: Grid (kartice, desktop) i Lista (kompaktni redovi, mobile/POS). Toggle gumb u toolbaru, localStorage pamti izbor. Na ekranima <480px auto-prebaci na Listu. Sticky search koji ne nestaje pri scrollu."},{"rb":4,"naziv":"Import modal — drag&drop, 4 formata","status":"TODO","opis":"Modal otvoren na gumb ↑ Import. Faza 1: drag&drop zona ili file input, auto-detect format (CSV/JSON/XLS/TXT). Faza 2: POST preview/ → prikaži tablicu prvih 20 + mapping dropdowni po stupcu. Faza 3: Confirm → POST import/ → progress (N/N) → report. CSV/JSON: vanilla JS parse. XLS: čitaj kao tekst (tab-separated fallback) ili pošalji raw na backend. ZAKON 41: bez SheetJS CDN.","xls_napomena":"XLS/XLSX: backend prima raw bytes, Python openpyxl (već u venv ako postoji) ili fallback CSV parse"},{"rb":5,"naziv":"Synesis panel — 7 kategorija","status":"TODO","opis":"Otvara se na ⊕ Synesis gumb. Slide-in panel s desne strane (ne modal, ne sidebar). 7 kartica kategorija, svaka razvija listu modula. Modul koji ima fenix_ekvivalent — link na naš modul. Modul koji ima import_podrzan — gumb Import koji otvara Import modal prefiltriran za tu kategoriju."}]},"napomene_za_cc":["Sav kod ide u fenix-v4 na MAR server (212.227.181.201, ssh genesis-mar)","Nakon izmjena: systemctl reload gunicorn-fenix-v4 na MAR","XLS import: provjeri je li openpyxl u /var/www/fenix-v4/.venv — ako nije, koristi CSV fallback i javi","GenesisKanal embed: <script src='/static/js/genesis-chat.js'></script> + GenesisChat.init({ref_id, context, lang})","Import endpointi: dodati u /var/www/fenix-v4/config/urls.py (provjeri da su registrirani)","ZAKON 32: svaki P1 fix ima vlastiti cNNNN.dok.json — ne spajaj više fixeva u jedan commit"],"zakon":["ZAKON_2","ZAKON_3","ZAKON_27","ZAKON_29","ZAKON_38","ZAKON_40","ZAKON_41"],"status":"PLAN_SPREMAN","autor":"CC claude-sonnet-4-6 + Ivan Seki"}}