VEX GLASS — SHELL APP (Centru de Comandă)
==========================================

PAGINA ADMIN — 4 taburi:
- 🧑 UTILIZATORI: roluri, blocare, adaos invizibil + 🔐 ACCES sisteme per user
- 📋 PROIECTE: listare globală, ștergere (super-admin)
- ⚙️ SISTEME: toggle global vizibilitate per sistem (super-admin)
- 🛠️ MENTENANȚĂ: ACTIVAȚI/DEZACTIVAȚI blocare totală (super-admin)

PAGINA OFERTĂ UNIFICATĂ (OfferScreen):
- Card client cu buton Versiuni (icon mic, 28px)
- Listă sisteme cu: 👁 PDF (deschide PDF salvat din storage), ▼ Detalii (expandează items), ✎ Modifică, 🗑 Șterge
- Card Total cu buton ✎ Adaos / Discount — modal pentru editare GLOBALĂ (propagă la TOATE sistemele, recalculează totaluri)
- Bară de acțiuni: 📄 Vezi PDF-uri (deschide toate PDF-urile preview în tab-uri), 💬 WhatsApp (direct via wa.me cu link la PDF), 🖨 Tipărește, 💾 Salvează versiune
- Bară FIXĂ jos (sticky) cu: TOTAL + 📄 PDF + 💬 WA + 💾 — VIZIBILĂ MEREU indiferent câte sisteme

VIZIBILITATE SISTEME — 2 niveluri:
  GLOBAL (tab Sisteme) — afectează toți utilizatorii
  PER-USER (🔐 ACCES) — override individual, prioritate
Super-adminul vede TOATE sistemele întotdeauna.

ROLURI:
- USER (vânzător): default
- ADMIN: vede tot, NU șterge proiecte și NU controlează sistemele
- SUPER-ADMIN: doar emailuri hardcodate (ADMIN_EMAILS în app.jsx ~414)

SISTEME ACTIVE pentru TESTARE (config.php):
  - STICLĂ SECURIZATĂ (real, /vexglass/sticla/)
  - VEX LINEAR (real, balustradă)
  - VEX OPTIMA (test, /vexglass/sticla/?sys_code=optima)
  - VEX SMART (test, /vexglass/sticla/?sys_code=smart)
  - VEX SLIM (test, /vexglass/sticla/?sys_code=slim)
Cele 3 sisteme TEST folosesc calculatorul sticla, dar se salvează în DB
ca system_code diferit (optima/smart/slim). Util pentru testarea
ofertei consolidate cu mai multe sisteme. Înlocuiește URL-urile cu '#' și
available=false când nu mai e nevoie de ele.

FIȘIERE:
- index.php, app.jsx, .htaccess
- config.php : SUPABASE creds + lista sistemelor
- setup_supabase.sql, setup_versions.sql, setup_preview_pdf.sql, fix_trigger.sql
- setup_admin_delete.sql            : definește is_current_user_super_admin()
- setup_system_visibility.sql       : tabela vizibilitate GLOBALĂ
- setup_user_system_visibility.sql  : tabela vizibilitate PER-USER
- setup_maintenance.sql             : tabela app_maintenance (single-row)

ORDINEA RULĂRII SQL (în Supabase Studio):
  1. setup_supabase.sql
  2. setup_versions.sql
  3. setup_preview_pdf.sql
  4. fix_trigger.sql
  5. setup_admin_delete.sql
  6. setup_system_visibility.sql
  7. setup_user_system_visibility.sql
  8. setup_maintenance.sql

DEPLOY:
1. Upload toate fișierele în /vexglass/interfata/
2. Rulează SQL-urile noi
3. Ctrl+Shift+R

DIAGNOSTIC RAPID:
  -- Maintenance status
  SELECT enabled, message, updated_at FROM app_maintenance WHERE id = 1;
  -- Vizibilitate globală
  SELECT * FROM system_visibility WHERE is_visible = false;
  -- Override-uri per user
  SELECT u.email, usv.system_code, usv.is_visible
  FROM user_system_visibility usv JOIN auth.users u ON u.id = usv.user_id;

PDF AUTO-SAVE LA OFERTĂ:
La apăsarea butonului „📋 Ofertă" în orice calculator (sticla/balustradă) în shell mode:
1. Se salvează datele curente ale sistemului în DB
2. Se generează PDF-ul sistemului curent (scope='current') → upload la
   /storage/project-pdfs/{user_id}/{child_id}/preview.pdf
3. Dacă există alte sisteme în proiect: se generează PDF-ul CONSOLIDAT
   (scope='all', cu toate sistemele) → upload la
   /storage/project-pdfs/{user_id}/{parent_id}/preview.pdf
4. Navigare la shell ?view=offer

În OfferScreen:
- Click 👁 pe un sistem → deschide PDF-ul ACELUI sistem (child.preview_pdf_path)
- Click „📄 PDF" jos / bottom bar → deschide PDF-ul CONSOLIDAT al întregului proiect
  (parent.preview_pdf_path), fallback la PDF-urile per sistem dacă lipsește
- WhatsApp 💬 → folosește URL semnat 7 zile la PDF-ul consolidat (sau primul disponibil)

CLEANUP PREVIEW PDFs (setup_pdf_cleanup.sql):
Funcție DB `cleanup_old_preview_pdfs(days_threshold)` care:
1. Șterge fișierele preview.pdf din storage mai vechi de N zile
2. Curăță referințele DB (preview_pdf_path → NULL)
Apelată automat din client la fiecare app load, dar max 1x/zi (localStorage gate).
Pentru a forța manual: SELECT cleanup_old_preview_pdfs(0);

CONFIGURARE pg_cron OPȚIONALĂ (Supabase Pro+):
Pentru cleanup automat la 1 AM indiferent dacă cineva e online:
  CREATE EXTENSION IF NOT EXISTS pg_cron;
  SELECT cron.schedule('vexglass-cleanup-previews', '0 1 * * *',
    $$SELECT public.cleanup_old_preview_pdfs(1);$$);

ADAOS / DISCOUNT / TVA — VALIDARE:
- Discount nu poate fi > Adaos (buton "Aplică" se dezactivează + mesaj roșu)
- TVA configurabil (default derivat din DB sau 21%)
- Click pe orice câmp → text selectat automat (poți tasta direct noua valoare)

COST DE ACHIZIȚIE (formula corectă):
  base = total_no_vat / ((1 + adaos/100) * (1 - discount/100))
  cost_achizitie = base * (1 + tva_pct/100)
TVA% se derivă PER COPIL din raportul total_with_vat / total_no_vat.
