fix(istruttoria): amount_basis configurabile + totali dual-track + use_taxable_only flag

Gate check (_compute_gate_check) esteso:
- amount_basis legge dal gate_rules dello schema bando:
  'imponibile_always' | 'imponibile_only_ordinario' | 'totale_always'
- Backward compat con vecchio flag iva_ordinario_imponibile_only
- Totali retrocompatibili: grand_total resta dichiarato, aggiunti
  grand_total_declared, grand_total_verified, per_category_verified,
  any_verified, all_verified, amount_basis, use_taxable_only

Il FE ora riceve use_taxable_only e sceglie dinamicamente le label
delle colonne (Imponibile/Totale dichiarato/ammesso).

Parte del refactor istruttore a tabelle inline.
This commit is contained in:
BFLOWS
2026-04-18 12:27:09 +02:00
parent f9f543b008
commit 7fd56175ef

View File

@@ -62,8 +62,25 @@ def _compute_gate_check(practice: RemissionPractice) -> GateCheckResult:
rules = practice.schema_snapshot.get("gate_rules", {}) or {}
sections = practice.schema_snapshot.get("sections", []) or []
iva_ordinario_only_taxable = rules.get("iva_ordinario_imponibile_only", True)
use_taxable_only = (practice.iva_regime == "ORDINARIO" and iva_ordinario_only_taxable)
# Base di calcolo ammissibile configurata per il bando:
# - "imponibile_always" -> sempre imponibile
# - "imponibile_only_ordinario" -> imponibile se regime ordinario, totale altrimenti
# - "totale_always" -> sempre totale
# Default: imponibile_only_ordinario (comportamento foglio excel originale)
amount_basis = rules.get("amount_basis")
if not amount_basis:
# backward compat: se c'era il vecchio flag booleano
if rules.get("iva_ordinario_imponibile_only", True):
amount_basis = "imponibile_only_ordinario"
else:
amount_basis = "totale_always"
if amount_basis == "imponibile_always":
use_taxable_only = True
elif amount_basis == "totale_always":
use_taxable_only = False
else: # imponibile_only_ordinario
use_taxable_only = (practice.iva_regime == "ORDINARIO")
per_category_declared = {}
per_category_verified = {}
@@ -192,7 +209,9 @@ def _compute_gate_check(practice: RemissionPractice) -> GateCheckResult:
"amount_erogato": float(amt_erogato),
"any_verified": any_verified,
"all_verified": all_verified,
"residuo_da_restituire": float(max(amt_erogato - Decimal(str(remission_due)), Decimal("0")))
"residuo_da_restituire": float(max(amt_erogato - Decimal(str(remission_due)), Decimal("0"))),
"amount_basis": amount_basis,
"use_taxable_only": use_taxable_only
}
)