Raport stocuri marfa 371 pe vechimi (dosar credit banca)

Sectiune dedicata pentru banca cu sumar pe grupe x bucket vechime
(0-6 luni, 6-12 luni, 1-2 ani, 2-3 ani, >3 ani), detaliu articole
si reconciliere contra sold contabil 371 din balanta (vbal).

- queries.py: STOCURI_371_SUMAR (ROLLUP grupa/subgrupa), STOCURI_371_DETALIU,
  STOCURI_371_SOLD_CONTABIL (sold sintetic din vbal, an/luna snapshot).
  Filtru stoc (cants+cant-cante) <> 0 pentru acoperire cu soldul contabil.
- main.py: CLI --aging-dates pentru evolutie multi-data a stocului >3 ani,
  pagina PDF dedicata cu nota metodologica + reconciliere (marker la diff >1%).
- recommendations.py: alerta CONCENTRARE cand stoc 371 >3 ani depaseste prag.
- config.py: threshold aged_stock_371_pct (default 15%).
- run.bat: header documentar cu argumentele disponibile + exemple.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Agent
2026-04-23 15:34:14 +00:00
parent 3f410c3fb8
commit 7afacd6664
5 changed files with 343 additions and 10 deletions

View File

@@ -297,7 +297,26 @@ class RecommendationsEngine:
vezi_detalii='Sheet: Rotatie Stocuri'
)
# 3. Check cash conversion cycle
# 3. Check aged stock 371 (bank collateral haircut risk)
stocuri_371 = results.get('stocuri_371_detaliu')
if stocuri_371 is not None and not stocuri_371.empty and 'VALOARE' in stocuri_371.columns:
valoare_total = stocuri_371['VALOARE'].sum()
if valoare_total > 0 and 'BUCKET_VECHIME' in stocuri_371.columns:
peste_3 = stocuri_371[stocuri_371['BUCKET_VECHIME'] == '>3 ani']['VALOARE'].sum()
procent = peste_3 / valoare_total
prag = self.thresholds.get('aged_stock_371_pct', 0.15)
if procent > prag:
self._add_recommendation(
categorie='Stoc 371',
indicator='Marfa invechita cont 371',
valoare=f'{procent*100:.1f}%',
status='CONCENTRARE',
explicatie=f'{procent*100:.1f}% din valoarea stocului 371 are >3 ani ({peste_3:,.0f} RON). Banca aplica haircut la evaluare colateral.',
recomandare='Lichidare / provizionare recomandata inainte de depunere dosar credit.',
vezi_detalii='Sheet: stocuri_371_detaliu'
)
# 4. Check cash conversion cycle
ciclu = results.get('ciclu_conversie_cash')
if ciclu is not None and not ciclu.empty:
dio_row = ciclu[ciclu['INDICATOR'].str.contains('stoc|DIO', case=False, na=False)]