Files
roa2web-service-auto/scripts/ralph/prd.json
Claude Agent 043797edaa feat(mobile-fixes-phase4): Complete US-405 - Fix batchProgressStore - Restaurare Joburi Failed
Implemented by Ralph autonomous loop.
Iteration: 4

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-12 19:31:08 +00:00

162 lines
7.9 KiB
JSON

{
"projectName": "mobile-fixes-phase4",
"branchName": "ralph/unified-mobile-md",
"description": "Fix layout mobil: ascundere header desktop, butoane filter/export vizibile, MobileDrawerMenu cu ANALIZE, persistență bonuri cu eroare",
"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",
"Verifică CSS_PATTERNS.md înainte de a scrie CSS nou",
"Testează în AMBELE teme (light + dark mode)",
"NICIODATĂ :deep() în componente (PrimeVue → vendor/)",
"Mobile: toate paginile folosesc MobileTopBar + MobileBottomNav",
"Mobile: filtrele se pun în BottomSheet, NU inline",
"Mobile: v-if='isMobile' pentru componente mobile-only",
"Desktop: v-if='!isMobile' pentru componente desktop-only"
],
"mobileLayoutTokens": {
"topBarHeight": "56px",
"bottomNavHeight": "56px",
"fabSize": "56px",
"fabBottomOffset": "72px",
"touchTargetMin": "48px"
}
},
"userStories": [
{
"id": "US-401",
"title": "Fix Layout Principal - Ascundere Header Desktop pe Mobil",
"description": "Ca utilizator mobil vreau să văd doar MobileTopBar și MobileBottomNav, nu header-ul desktop",
"priority": 1,
"acceptanceCriteria": [
"AppHeader.vue sau componenta părinte are v-if='!isMobile' pentru a se ascunde pe mobil",
"Sidebar-ul desktop (navigation cu Rapoarte/Introduceri Date/Sistem) este ascuns pe mobil cu v-if='!isMobile'",
"MobileTopBar este singurul header vizibil pe viewport < 768px",
"Nu există suprapunere între header desktop și MobileTopBar",
"isMobile computed folosește window.innerWidth < 768 și este reactiv la resize",
"npm run build passes",
"Verify in browser (375x667): Header desktop cu 'Selectare perioada' și 'AXN' NU este vizibil"
],
"passes": true,
"notes": "Completed in iteration 1"
},
{
"id": "US-402",
"title": "Fix MobileTopBar - Butoane Filter/Export Vizibile",
"description": "Ca utilizator mobil pe pagina Facturi/Bonuri vreau să văd butoanele de filtrare și export în header",
"priority": 2,
"acceptanceCriteria": [
"După US-401, pe InvoicesView.vue butoanele Filter/Refresh/Export sunt vizibile în MobileTopBar",
"Pe ReceiptsListView.vue butoanele Filter/Export/More sunt vizibile în MobileTopBar",
"Butoanele au dimensiune touch target minim 48px",
"npm run build passes",
"Verify in browser (375x667): Butoanele sunt vizibile și clickable pe pagina Facturi"
],
"passes": true,
"notes": "Completed - CSS media queries hide desktop header, buttons visible at 375x667. Touch targets 48px verified."
},
{
"id": "US-403",
"title": "Fix MobileDrawerMenu - Secțiunea ANALIZE Vizibilă",
"description": "Ca utilizator mobil vreau să văd secțiunea ANALIZE în hamburger menu",
"priority": 3,
"acceptanceCriteria": [
"Click pe butonul Meniu din MobileTopBar deschide MobileDrawerMenu (nu sidebar desktop)",
"MobileDrawerMenu afișează secțiunile: PRINCIPALE, RAPOARTE, ANALIZE, ADMINISTRARE",
"Secțiunea ANALIZE conține: Scadențe (/reports/maturity-analysis), Facturi Detaliate (/reports/detailed-invoices)",
"Link-urile din ANALIZE navighează corect și închid drawer-ul",
"npm run build passes",
"Verify in browser (375x667): Click pe Meniu → apare MobileDrawerMenu cu secțiunea ANALIZE vizibilă"
],
"passes": true,
"notes": "Completed in iteration 3"
},
{
"id": "US-404",
"title": "Fix Spațiu Blank - Padding Corect pentru Mobile",
"description": "Ca utilizator mobil vreau ca paginile să nu aibă spațiu blank excesiv în partea de sus",
"priority": 4,
"acceptanceCriteria": [
"Paginile de rapoarte au padding-top: 56px (doar MobileTopBar height) pe mobil",
"Nu există spațiu blank între MobileTopBar și conținut",
"Tab-urile Clienți/Furnizori sunt imediat sub MobileTopBar pe InvoicesView",
"Status chips sunt imediat sub MobileTopBar pe ReceiptsListView",
"npm run build passes",
"Verify in browser (375x667): Conținutul începe imediat sub MobileTopBar, fără gap de ~120px"
],
"passes": true,
"notes": "Completed with US-401/US-402 - hiding desktop header eliminated the blank space. Screenshots confirm content starts immediately below MobileTopBar."
},
{
"id": "US-405",
"title": "Fix batchProgressStore - Restaurare Joburi Failed",
"description": "Ca utilizator care a uploadat bonuri cu erori OCR vreau ca acestea să rămână vizibile după refresh",
"priority": 5,
"acceptanceCriteria": [
"În batchProgressStore.js, funcția restoreJobsFromBatch() include joburi cu status 'failed' (nu doar pending/processing)",
"Batch-ul NU este șters din localStorage dacă are joburi failed nerezolvate",
"După refresh, bonurile cu eroare sunt afișate în listă",
"unifiedItems computed include joburile failed pentru afișare",
"npm run build passes"
],
"passes": true,
"notes": "Completed in iteration 4"
},
{
"id": "US-406",
"title": "Fix UI Bonuri cu Eroare - Afișare Corectă pe Mobil",
"description": "Ca utilizator mobil vreau să văd clar că un bon are eroare, nu 'în procesare'",
"priority": 6,
"acceptanceCriteria": [
"Bonurile cu status 'failed' afișează chip/badge 'Eroare' cu culoare roșie (var(--red-500))",
"NU afișează 'În procesare' sau spinner pentru bonuri failed",
"Mesajul de eroare este vizibil (truncat cu ellipsis dacă e prea lung)",
"Utilizatorul poate vedea eroarea completă la click/hover",
"npm run build passes",
"Verify in browser (375x667): Bon cu eroare arată 'Eroare' nu 'În procesare'"
],
"passes": false,
"notes": "Depinde de US-405 - bonurile failed trebuie să fie în listă mai întâi"
},
{
"id": "US-407",
"title": "Fix Editare Bonuri cu Eroare",
"description": "Ca utilizator care are un bon cu eroare OCR vreau să pot edita bonul pentru a corecta erorile manual",
"priority": 7,
"acceptanceCriteria": [
"Click pe bon cu eroare deschide formularul de editare (ReceiptCreateUnifiedView)",
"La salvare, processing_status este resetat la NULL în baza de date",
"După salvare, bonul poate fi trimis pe workflow (Submit for Approval)",
"Backend endpoint PATCH /receipts/{id} resetează processing_status la NULL când se salvează modificări",
"npm run build passes",
"Verify in browser: Editează bon cu eroare → Salvează → Statusul nu mai arată eroare"
],
"passes": false,
"notes": ""
},
{
"id": "US-408",
"title": "Verificare Finală - Toate Fix-urile Funcționează",
"description": "Ca developer vreau să confirm că toate fix-urile din Phase 4 funcționează corect",
"priority": 8,
"acceptanceCriteria": [
"Viewport 375x667: Header desktop (Selectare perioada, AXN) NU este vizibil",
"Viewport 375x667: MobileTopBar cu butoane Filter/Export este vizibil",
"Click pe Meniu deschide MobileDrawerMenu cu secțiunea ANALIZE",
"Pagina Facturi: Tab-uri Clienți/Furnizori imediat sub header, fără spațiu blank",
"Pagina Bonuri: Status chips imediat sub header, fără spațiu blank",
"Upload bon cu eroare: Afișează 'Eroare' nu 'În procesare'",
"Refresh după upload cu eroare: Bonul cu eroare rămâne vizibil în listă",
"npm run build passes"
],
"passes": false,
"notes": ""
}
]
}