{ "projectName": "dashboard-solduri-v2", "branchName": "ralph/dashboard-solduri", "description": "Adăugare secțiune Solduri în Dashboard: mobil = prima pagină swipe (grid 2x2), grafice = paginile 2-5 (păstrate ca în main). Desktop = Secțiune Solduri + Secțiune Grafice, fără titluri.", "cssRules": { "documentation": [ "docs/ONBOARDING_CSS.md", "docs/DESIGN_TOKENS.md", "docs/CSS_PATTERNS.md", "docs/MOBILE_PATTERNS.md" ], "goldenRules": [ "Folosește DOAR design tokens - NICIODATĂ valori hardcodate", "NU modifica cardurile grafice originale (TreasuryDualCard, etc.) - rămân IDENTICE", "Testează în AMBELE teme (light + dark mode)", "Mobile: touch targets minim 44x44px", "Mobile: prima pagină swipe = grid 2x2 solduri", "Mobile: paginile 2-5 swipe = cardurile grafice ORIGINALE din main" ] }, "referenceFiles": { "dashboardView": "src/modules/reports/views/DashboardView.vue", "swipeableCards": "src/shared/components/mobile/SwipeableCards.vue", "graficcards": [ "src/modules/reports/components/dashboard/cards/TreasuryDualCard.vue", "src/modules/reports/components/dashboard/cards/CashFlowMetricCard.vue", "src/modules/reports/components/dashboard/cards/ClientiBalanceCard.vue", "src/modules/reports/components/dashboard/cards/FurnizoriBalanceCard.vue" ], "backupComponents": "/tmp/dashboard-backup/" }, "userStories": [ { "id": "US-2001", "title": "Creare componentă SolduriCompactCard reutilizabilă", "description": "Ca dezvoltator, vreau o componentă card compactă pentru solduri pentru că o voi folosi în grid 2x2 pe mobil și desktop", "priority": 1, "acceptanceCriteria": [ "Creează SolduriCompactCard.vue în src/modules/reports/components/solduri/", "Props: type (trezorerie|clienti|furnizori|tva), total, breakdown (object), casaTotal, bancaTotal (pentru trezorerie)", "Afișează: icon + label (uppercase) + valoare principală formatată românesc", "Click pe card expandează/colapsează breakdown-ul (conturi pentru trezorerie, buckets pentru clienți/furnizori)", "Folosește design tokens: var(--space-md), var(--text-lg), var(--surface-card)", "npm run typecheck passes" ], "passes": true, "notes": "Completed in iteration 1" }, { "id": "US-2002", "title": "Grid 2x2 Solduri pentru prima pagină swipe pe mobil", "description": "Ca utilizator pe mobil, vreau prima pagină din swipe să fie un grid 2x2 cu 4 carduri solduri", "priority": 2, "acceptanceCriteria": [ "Modifică SwipeableCards în DashboardView să aibă 5 pagini (sau folosește totalCards=5)", "Prima pagină (card-0 sau echivalent) conține un div cu grid 2x2", "Grid-ul conține 4 SolduriCompactCard: Trezorerie | Clienți / Furnizori | TVA", "Fiecare card primește date din dashboardStore", "Touch target minim 44x44px pentru fiecare card", "npm run typecheck passes", "Verify in browser mobil că prima pagină e grid-ul cu 4 solduri compacte" ], "passes": true, "notes": "Verified in browser - Grid 2x2 shows correctly with 4 SolduriCompactCard on first swipe page" }, { "id": "US-2003", "title": "Păstrare carduri grafice originale pe paginile 2-5 mobil", "description": "Ca utilizator pe mobil, vreau paginile 2-5 din swipe să fie cardurile cu grafice originale, exact ca în main", "priority": 3, "acceptanceCriteria": [ "Pagina 2 (card-1): TreasuryDualCard cu EXACT aceleași props ca în main", "Pagina 3 (card-2): CashFlowMetricCard cu EXACT aceleași props ca în main", "Pagina 4 (card-3): ClientiBalanceCard cu EXACT aceleași props ca în main", "Pagina 5 (card-4): FurnizoriBalanceCard cu EXACT aceleași props ca în main", "NU modifica componentele grafice - doar le folosești în SwipeableCards", "npm run typecheck passes", "Verify în browser că swipe funcționează fluid între toate 5 paginile" ], "passes": true, "notes": "Verified - Pages 2-5 show original graph cards (TreasuryDualCard, CashFlowMetricCard, etc.). Swipe works fluid." }, { "id": "US-2004", "title": "Secțiune Solduri pe Desktop (sus, fără titlu)", "description": "Ca utilizator pe desktop, vreau să văd soldurile într-o secțiune separată sus, fără titlu vizibil", "priority": 4, "acceptanceCriteria": [ "Pe desktop (v-if !isMobile), adaugă o secțiune nouă cu clasa desktop-solduri-section", "Secțiunea conține 4 SolduriCompactCard în grid responsive (grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)))", "Fără titlu sau header de secțiune - doar cardurile direct", "Sub această secțiune rămân cardurile grafice originale (metrics-row existent)", "npm run typecheck passes", "Verify în browser desktop că soldurile sunt sus, graficele jos" ], "passes": true, "notes": "Completed in iteration 1" }, { "id": "US-2005", "title": "Eliminare MaturityAndDetailsCard de pe Dashboard", "description": "Ca utilizator, vreau Dashboard-ul să nu mai aibă tabelul detaliat de scadențe (există pagina Maturity Analysis)", "priority": 5, "acceptanceCriteria": [ "Șterge MaturityAndDetailsCard din template-ul DashboardView.vue", "Șterge div-ul .comparison-row care conținea cardul", "Șterge importul MaturityAndDetailsCard din script setup", "npm run typecheck passes", "Verify: Dashboard nu mai are tabel de analiză scadențe" ], "passes": true, "notes": "Completed in iteration 2" }, { "id": "US-2006", "title": "Integrare date Solduri din dashboardStore", "description": "Ca dezvoltator, vreau cardurile solduri să folosească datele existente din dashboardStore fără API calls noi", "priority": 6, "acceptanceCriteria": [ "SolduriCompactCard pentru Trezorerie: treasuryData.breakdown.casa.total + banca.total, breakdown items", "SolduriCompactCard pentru Clienți: netBalanceData.clienti_total, breakdown.clienti", "SolduriCompactCard pentru Furnizori: netBalanceData.furnizori_total, breakdown.furnizori", "SolduriCompactCard pentru TVA: calculat sau din dashboardStore.summary", "npm run typecheck passes" ], "passes": true, "notes": "Completed in iteration 3" }, { "id": "US-2007", "title": "Indicatori vizuali pentru starea financiară", "description": "Ca utilizator, vreau să văd indicatori de avertizare pe cardurile solduri pentru probleme financiare", "priority": 7, "acceptanceCriteria": [ "Indicator dot roșu pe card Clienți dacă restanță > 20% din total", "Indicator dot roșu pe card Furnizori dacă restanță > 20% din total", "TVA: text roșu var(--red-600) dacă negativ (de plată), verde var(--green-600) dacă pozitiv (de recuperat)", "npm run typecheck passes", "Verify în browser că indicatorii sunt vizibili în ambele teme" ], "passes": true, "notes": "Completed in iteration 4" }, { "id": "US-2008", "title": "Buton Refresh în header Dashboard", "description": "Ca utilizator, vreau un buton de refresh în header pentru actualizare manuală a datelor", "priority": 8, "acceptanceCriteria": [ "Pe mobil: adaugă action cu icon pi-refresh în MobileTopBar actions", "Pe desktop: adaugă Button cu icon refresh lângă titlul Dashboard", "Click declanșează reload date din dashboardStore", "Icon se rotește (animație CSS) în timpul încărcării", "npm run typecheck passes" ], "passes": true, "notes": "Completed in iteration 5" } ] }