User Stories Completed: - US-001: Eliminare SolduriCompactCard de pe Desktop - US-002: Eliminare Icoane din Header-ul CollapsibleCard - US-003: Reorganizare TreasuryDualCard - Text Înainte de Grafice - US-004: Reorganizare ClientiBalanceCard - Text Înainte de Grafice - US-005: Reorganizare FurnizoriBalanceCard - Text Înainte de Grafice - US-006: Grafice Colapsabile în TreasuryDualCard - US-007: Grafice Colapsabile în ClientiBalanceCard - US-008: Grafice Colapsabile în FurnizoriBalanceCard - US-009: Grafice Colapsabile în CashFlowMetricCard Additional Improvements: - Add cache metadata display (CacheFooter component) for all dashboard cards - Add @cached decorators to get_monthly_flows and get_indicators_with_sparklines - Fix financial indicators calculations and sparkline sync - Add state reset on company change to prevent stale data - New shared components: CacheFooter.vue, authRedirect.js - Enhanced FinancialIndicatorsCard with sparklines and period selection Squashed from branch: ralph/dashboard-desktop-cleanup (11 commits) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
97 lines
3.1 KiB
Markdown
97 lines
3.1 KiB
Markdown
# Claude Rules: Financial Indicators
|
|
<!-- paths: backend/modules/reports/services/financial_indicators_service.py, backend/modules/reports/services/dashboard_service.py, backend/modules/reports/models/financial_indicators.py -->
|
|
|
|
## Surse de Date - OBLIGATORIU
|
|
|
|
### Preferință: VBAL (Balanța de Verificare)
|
|
|
|
**ÎNTOTDEAUNA** folosește tabelul `VBAL` pentru calculul indicatorilor financiari, NU `vbalanta_parteneri`.
|
|
|
|
| Indicator | Tabel | Conturi | Coloane |
|
|
|-----------|-------|---------|---------|
|
|
| Vânzări/Cifra Afaceri | VBAL | 70x | TOTCRED - TOTDEB(709) |
|
|
| Cheltuieli | VBAL | 6x | TOTDEB - TOTCRED(609) |
|
|
| Încasări clienți | VBAL | 4111, 461 | RULCRED (lunar), TOTCRED (YTD) |
|
|
| Plăți furnizori | VBAL | 401, 404, 462 | RULDEB (lunar), TOTDEB (YTD) |
|
|
| Solduri bilanțiere | VBAL | diverse | SOLDDEB, SOLDCRED |
|
|
|
|
### Excepție: ACT (Registru Jurnal)
|
|
|
|
Pentru **Achiziții YTD** se folosește tabelul `ACT` deoarece captează și achizițiile directe pe cheltuieli (6x = 4x):
|
|
|
|
```sql
|
|
-- Achiziții totale (stocuri + cheltuieli directe)
|
|
SELECT SUM(CASE WHEN (SCD LIKE '3%' OR SCD LIKE '6%')
|
|
AND (SCC LIKE '4%' OR SCC LIKE '46%')
|
|
THEN SUMA ELSE 0 END)
|
|
FROM ACT WHERE STERS = 0
|
|
```
|
|
|
|
## Structura VBAL
|
|
|
|
```sql
|
|
SELECT
|
|
cont, -- Cont contabil (ex: '4111', '701')
|
|
solddeb1, -- Sold debitor la 1 ianuarie
|
|
soldcred1, -- Sold creditor la 1 ianuarie
|
|
ruldeb, -- Rulaj DEBIT luna curentă
|
|
rulcred, -- Rulaj CREDIT luna curentă
|
|
totdeb, -- Total DEBIT YTD (de la 1 ianuarie)
|
|
totcred, -- Total CREDIT YTD (de la 1 ianuarie)
|
|
solddeb, -- Sold final debitor
|
|
soldcred -- Sold final creditor
|
|
FROM {schema}.VBAL
|
|
WHERE AN = :an AND LUNA = :luna
|
|
```
|
|
|
|
### Când să folosești fiecare coloană:
|
|
|
|
| Nevoie | Coloană | Exemplu |
|
|
|--------|---------|---------|
|
|
| Valoare lunară | `RULDEB`, `RULCRED` | Încasări luna curentă |
|
|
| Valoare YTD | `TOTDEB`, `TOTCRED` | Cifra de Afaceri YTD |
|
|
| Sold curent | `SOLDDEB`, `SOLDCRED` | Sold clienți |
|
|
| Sold început an | `SOLDDEB1`, `SOLDCRED1` | Active la 1 ianuarie |
|
|
|
|
## TVA în Indicatori
|
|
|
|
### Cu TVA (fluxuri de numerar reale):
|
|
- ✅ Cash Flow (încasări/plăți)
|
|
- ✅ Solduri clienți/furnizori
|
|
- ✅ DSO, DPO (zile încasare/plată)
|
|
|
|
### Fără TVA (indicatori economici):
|
|
- ✅ Cifra de Afaceri (Clasa 7)
|
|
- ✅ Cheltuieli (Clasa 6)
|
|
- ✅ Profit Brut
|
|
- ✅ Achiziții (din ACT)
|
|
|
|
## Pattern-uri de Cod
|
|
|
|
### Query VBAL cu agregare pe conturi:
|
|
|
|
```python
|
|
query = f"""
|
|
SELECT
|
|
NVL(SUM(CASE WHEN CONT LIKE '70%' THEN TOTCRED ELSE 0 END), 0) -
|
|
NVL(SUM(CASE WHEN CONT = '709' THEN TOTDEB ELSE 0 END), 0) as cifra_afaceri
|
|
FROM {schema}.VBAL
|
|
WHERE AN = :an AND LUNA = :luna
|
|
"""
|
|
```
|
|
|
|
### Cache decorator:
|
|
|
|
```python
|
|
@staticmethod
|
|
@cached(cache_type='fin_indicator_name', key_params=['company_id', 'luna', 'an'])
|
|
async def get_indicator(...):
|
|
...
|
|
```
|
|
|
|
## NU folosi
|
|
|
|
- ❌ `vbalanta_parteneri` pentru calcule agregate (doar pentru rapoarte pe parteneri)
|
|
- ❌ `SOLDDEB`/`SOLDCRED` pentru Clasa 6/7 (conturile se închid lunar, sold=0)
|
|
- ❌ Hardcodare valori TVA (19%, 9%) în formule
|