{"id":"c0888","filename":"c0888_arhiva_1_5_token_generator.dok.json","weise3_id":"","tip":"dokument","naziv":"(bez naziva)","kreator":"genesis","datum":"","snippet":"","status":"","prev_weise3":"","bunker_l":"#00d4ff","full":{"_header":{"type":"TASK","id":"c0888","naziv":"ARHIVA-1.5 — Token Generator UI za QR kampanju","status":"TODO","priority":"P1","autor":"CC Agent","kreiran":"2026-05-16T22:45:00Z","sesija":"2026-05-16_fenix_v3_campaign","procjena_sati":4,"bloker_za":"QR kampanja launch"},"problem":{"opis":"Dispo i vozači trebaju jednostavan UI da kreiraju QR kodove za upload. Sada je backend spreman (ScanToken model postoji), trebam samo UI.","uzrok":"Završena je backend struktura ali nedostaje frontend","impact":"Bez ovoga, vozači ne mogu skenirati QR i uploadati dokumente — kampanja je blokirana"},"specifikacija":{"feature_id":"ARHIVA-1.5","ruta":"/hr/documents/arhiva/tokens/","view_klasa":"ScanTokenGeneratorView","model":"ScanToken (already exists)","template":"arhiva/token_generator.html"},"sjecisni_dijelovi":[{"dio":1,"naziv":"View — ScanTokenGeneratorView","lokacija":"/var/www/fenix-v3/arhiva/views.py","akcije":["- Kreiraj CBV (LoginRequired)","- GET: prikaži formu + listu aktivnih tokena","- POST: kreiraj novi ScanToken sa parametrima","  - komitent (FK ili choice)","  - upload_limit (int, default 50)","  - expires_days (int, default 7)","- Vrni JSON: {token, qr_url, whatsapp_link, expires_at}"]},{"dio":2,"naziv":"Template — token_generator.html","lokacija":"/var/www/fenix-v3/templates/arhiva/token_generator.html","akcije":["- Bootstrap/Tailwind form","- Dva tab-a: CREATE TOKEN | ACTIVE TOKENS","- Tab 1: form s dropdown komitente, input upload_limit","- Tab 2: tablica aktivnih tokena (QR + copy link + WhatsApp button)","- Modal za QR prikaz","- Komponente:","  - <select name='komitent'> — iz ScanToken choices","  - <input type='number' name='upload_limit' min=1 max=500>","  - <button onclick='generateQR()'>Generiraj QR</button>","  - <div id='qr-modal'> s <img src='/beta/qr/{token}.png'>","  - <a href='whatsapp://send?text=...' class='whatsapp-btn'>"]},{"dio":3,"naziv":"URL routing","lokacija":"/var/www/fenix-v3/core/urls_hr.py","akcije":["- path('documents/arhiva/tokens/', ScanTokenGeneratorView.as_view(), name='arhiva_token_generator')","- path('api/v1/arhiva/tokens/', TokenListAPIView.as_view(), name='api_token_list') — za AJAX"]},{"dio":4,"naziv":"QR generator endpoint (već postoji?)","lokacija":"/var/www/fenix-v3/arhiva/views.py","akcije":["- GET /beta/qr/{token}.png → generiraj QR sa PyQR ili qrcode","- QR sadržaj: 'https://limit-connect.com/beta/scan/{token}/'","- Cache: RedisCache 24h (token se ne mijenja)"]},{"dio":5,"naziv":"JavaScript — QR modal + copy","lokacija":"/var/www/fenix-v3/static/arhiva/token_generator.js","akcije":["- document.querySelector('#generateBtn').onclick → POST /api/v1/arhiva/tokens/","- Prikaži QR u modalnom dijaloškom okviru","- Button 'Copy link' → kopira u clipboard","- Button 'Share WhatsApp' → otvori WhatsApp s predloženum tekstom"]}],"testiranje":{"test_sljedovi":["1. Login kao dispo (test korisnik sa kompanijom)","2. Idi na /hr/documents/arhiva/tokens/","3. Odaberi komitenta 'Forma Ideale'","4. Unesi 'upload_limit' = 50","5. Klikni 'Generiraj QR'","6. Modal pokazuje QR kod","7. Klikni 'Copy link' → provjerI je li link u clipboardu","8. Klikni 'Send WhatsApp' → provjeri je li WhatsApp otvoren","9. Tablica 'Active tokens' pokazuje novi token sa statusom"],"provjere":["- ScanToken je kreiran u bazi","- QR je dostupan na /beta/qr/{token}.png","- Link vodi na /beta/scan/{token}/ — provjera da landing stranica radi","- Token ima je li expires_at postavljen?"]},"dependencije":["- ScanToken model mora biti migriran (trebam provjeriti)","- qrcode library trebam pip install","- ScanToken.objects.create() mora raditi"],"blockers":["DNS fix — dok se ne fixa limit-connect.com na EU, /beta/ ne radi javno","Folija middleware instalacija — nije kritično za ovo, ali trebalo bi"],"acceptance_criteria":["✓ Form je dostupan na /hr/documents/arhiva/tokens/","✓ Vozač može kliknuti 'Generiraj QR'","✓ QR kod se prikazuje i skenira se","✓ Link 'Copy' kopira URL u clipboard","✓ WhatsApp button otvara aplikaciju sa predloženum tekstom","✓ Tablica pokazuje sve aktivne tokene","✓ Token se ističe nakon 7 dana (ili custom expiry)"],"napomene":{"arhitektura":"ScanToken je already u modelu, trebam samo UI wrapper","slicne_komponente":["- /hr/companies/ — seznam kompanije (similar pattern)","- /hr/documents/arhiva/ — list view (copy styling)","- /beta/manifest.json — već ima QR generator (inspect sources)"],"performance":"QR je statički, cache 24h. Bez performansnfih briga.","security":"LoginRequired mixin, CsrfViewMixin (Django default), token je random UUID"}}}