# Plan: Curățare Cod ROA2WEB (High ROI, Low Risk) ## Sumar Executiv Arhitectura ROA2WEB este **solidă** pentru o echipă de 1-2 developeri. Nu necesită schimbări arhitecturale. Acest plan conține doar **optimizări tactice sigure** cu randament mare. --- ## Acțiuni de Curățare (Prioritizate) ### 1. Elimină Store Duplication ✅ **ROI**: ⭐⭐⭐⭐⭐ | **Risc**: Foarte Scăzut | **Efort**: 15 min **Problema**: `sharedStores.js` identic în 2 module (42 linii duplicate) **Fișiere de șters**: - `src/modules/reports/stores/sharedStores.js` - `src/modules/data-entry/stores/sharedStores.js` **Soluție**: Instantiază stores direct în `App.vue` ```javascript // App.vue import { createAuthStore } from '@shared/stores/auth' import { createCompaniesStore } from '@shared/stores/companies' import { createAccountingPeriodStore } from '@shared/stores/accountingPeriod' import authApi from '@shared/services/authApi' const useAuthStore = createAuthStore(authApi) const useCompanyStore = createCompaniesStore(authApi, useAuthStore) const useAccountingPeriodStore = createAccountingPeriodStore(authApi) ``` **Verificare**: App funcționează normal, stores disponibile în componente --- ### 2. Factory pentru API Services ✅ **ROI**: ⭐⭐⭐⭐ | **Risc**: Scăzut | **Efort**: 30 min **Problema**: `api.js` duplicat în module (70% cod identic, 156 linii total) **Fișier de creat**: `src/shared/services/createApiService.js` ```javascript // createApiService.js (~50 linii) import axios from 'axios' export function createApiService(basePath, options = {}) { const api = axios.create({ baseURL: import.meta.env.BASE_URL + `api/${basePath}`, headers: { 'Content-Type': 'application/json' } }) api.interceptors.request.use(config => { const token = localStorage.getItem('access_token') if (token) config.headers.Authorization = `Bearer ${token}` if (options.injectCompany) { // Logic pentru X-Selected-Company header } if (config.data instanceof FormData) { delete config.headers['Content-Type'] } return config }) api.interceptors.response.use( response => response, error => { if (error.response?.status === 401) { localStorage.removeItem('access_token') window.location.href = '/login' } return Promise.reject(error) } ) return api } ``` **Fișiere simplificate** (5 linii fiecare): ```javascript // src/modules/reports/services/api.js import { createApiService } from '@shared/services/createApiService' export default createApiService('reports') // src/modules/data-entry/services/api.js import { createApiService } from '@shared/services/createApiService' export default createApiService('data-entry', { injectCompany: true }) ``` **Verificare**: Login funcționează, API calls returnează date --- ### 3. Dependențe OCR Opționale (Lazy Loading) ✅ **ROI**: ⭐⭐⭐⭐ | **Risc**: Foarte Scăzut | **Efort**: 30 min **Problema**: PaddleOCR + pytesseract se instalează și încarcă mereu, chiar dacă nu sunt folosite **Soluție**: Fă-le opționale via `.env` și lazy loading **Fișier `.env`** - adaugă: ```env # OCR Engines (true = instalează și încarcă, false = skip) OCR_ENABLE_PADDLEOCR=false OCR_ENABLE_TESSERACT=false ``` **Fișier `backend/requirements.txt`** - mută în secțiune opțională: ``` # Required OCR python-doctr[torch]>=0.8.0 # Optional OCR (install only if needed) # paddleocr>=2.7.0 # Uncomment if OCR_ENABLE_PADDLEOCR=true # paddlepaddle>=2.5.0 # Uncomment if OCR_ENABLE_PADDLEOCR=true # pytesseract>=0.3.10 # Uncomment if OCR_ENABLE_TESSERACT=true ``` **SAU** creează `requirements-ocr-optional.txt`: ``` paddleocr>=2.7.0 paddlepaddle>=2.5.0 pytesseract>=0.3.10 ``` **Fișier OCR service** - lazy import: ```python # backend/modules/data_entry/services/ocr_service.py import os from functools import lru_cache @lru_cache() def get_paddleocr(): if os.getenv('OCR_ENABLE_PADDLEOCR', 'false').lower() == 'true': from paddleocr import PaddleOCR return PaddleOCR(use_angle_cls=True, lang='ro') return None @lru_cache() def get_tesseract(): if os.getenv('OCR_ENABLE_TESSERACT', 'false').lower() == 'true': import pytesseract return pytesseract return None ``` **Beneficiu**: - Păstrează alternativele pentru viitor - Nu se instalează/încarcă dacă nu sunt necesare - Startup mai rapid când sunt dezactivate - ~500MB saved când `false` **Verificare**: - Cu `false`: App pornește fără PaddleOCR/Tesseract instalate - Cu `true`: OCR fallback funcționează --- ### 4. Consolidare Design Tokens CSS ✅ **ROI**: ⭐⭐⭐ | **Risc**: Scăzut | **Efort**: 1 oră **Problema**: 3 fișiere cu tokens overlap: `variables.css`, `tokens.css`, `md3-tokens.css` **Soluție**: Consolidează în `src/assets/css/core/design-tokens.css` **Pași**: 1. Creează `design-tokens.css` unificat 2. Migrează variabilele din cele 3 fișiere 3. Actualizează importurile în `main.css` 4. Șterge fișierele vechi **Verificare**: Testează light mode ȘI dark mode pe toate paginile --- ## Acțiuni Opționale (Dacă Ai Timp) ### 5. Split receiptStore (Opțional) **ROI**: ⭐⭐⭐ | **Risc**: Mediu | **Efort**: 2-3 ore **Problema**: 606 linii într-un singur store **Soluție**: Split în 3 stores (receipts, workflow, nomenclatures) **De făcut doar dacă**: Lucrezi frecvent pe data-entry module --- ### 6. Simplificare Cache (Opțional) **ROI**: ⭐⭐ | **Risc**: Mediu | **Efort**: 2-3 ore **Problema**: 7 fișiere cache, unele nefolosite **Soluție**: Reduce la 3 fișiere **De făcut doar dacă**: Ai nevoie să modifici cache logic --- ## Impact Total (Acțiuni 1-4) | Metrică | Înainte | După | Diferență | |---------|---------|------|-----------| | Linii cod duplicat | ~200 | ~50 | **-150** | | OCR deps obligatorii | 3 | 0 | **opționale via .env** | | Fișiere CSS tokens | 3 | 1 | **-2** | | Store duplication | 42 linii | 0 | **-42** | | Startup time (OCR off) | ~5s | ~2s | **-3s** | | **Timp total** | - | - | **~2.5 ore** | --- ## Ordinea Recomandată 1. **[15 min]** Elimină store duplication 2. **[30 min]** Factory pentru API services 3. **[30 min]** OCR dependencies opționale (lazy loading) 4. **[1 oră]** Consolidare CSS tokens **Total**: ~2.5 ore pentru toate 4 acțiunile principale --- ## Verificare Finală După fiecare acțiune: - [ ] App pornește fără erori - [ ] Login funcționează - [ ] Un raport se încarcă - [ ] O chitanță se creează - [ ] Dark mode arată corect --- ## Ce NU Schimbăm - ✅ Arhitectura Layered - potrivită pentru echipa de 1-2 devs - ✅ Module isolation (reports, data-entry, telegram) - ✅ Router/Store Factory patterns - ✅ Auth middleware - ✅ Cache decorator `@cached` - ✅ Oracle pool singleton --- *Plan simplificat: doar curățare cod cu randament mare și risc minim.*