# Fluxul facturilor (ROAACNPRO)

Document de referință minimal: ce fișiere trebuie verificate/modificate când se schimbă
ceva la facturare. Backend = Oracle (prin `goExecutor`/`goConn`), front-end = VFP9.

## Componentele cheie

| Rol | Fișier | Observații |
|-----|--------|-----------|
| Formularul de facturare | clasa `frm_factura` din `Clase/oacnpro.vcx` (cod în `.vct`) | **se editează în IDE VFP**, nu manual |
| Procedurile de facturare VFP | `Programe/proceduri_acnpro.prg` | `factura_salvare_db`, `make_cfactura`, `factura_acn` |
| Rapoarte facturare | `Programe/proceduri_acnpro_rapoarte.prg` + `Rapoarte/*.frx` | relistare/printare factură |
| Calcul + salvare valori în Oracle | `PACK_FACTURARE.pck` (pachet PL/SQL) | **sursa de adevăr** pentru valori |
| Framework facturare partajat | `COMUN/programe/ofacturare_comun.prg`, `oproceduri_facturare.prg` | partajat între aplicațiile ROA; a se evita modificarea |

## Lanțul de calcul (form → pachet → rapoarte)

1. **Introducere / import** (`frm_factura` + `factura_acn`): articolele intră în cursorul
   `crsFactura` (creat în `make_cfactura`, `proceduri_acnpro.prg`). Import din
   contract/tranzit/cheiaj prin `Insert Into crsFactura(...)` în `factura_acn`.
2. **Preview pe ecran** (`frm_factura.CalculeazaPreturiRand` + `CalculeazaTotaluri`):
   calculează valorile fiecărui rând **doar pentru afișare**.
3. **Salvare** (`factura_salvare_db`): copiază rândurile din `crsFactura` în cursorul
   `crsvanztemp`, apoi le trimite în Oracle prin `PACK_FACTURARE` (un apel per rând).
4. **Calcul autoritar** (`PACK_FACTURARE`): recalculează și stochează
   `total_fara_tva / total_tva / total_cu_tva` în `vanzari` (antet) și `vanzari_detalii` (rânduri).
5. **Relistare / lista de facturi**: `proceduri_acnpro_rapoarte.prg` și interogările din
   `proceduri_acnpro.prg` (~liniile 1180, 1222) **citesc** valorile deja calculate din Oracle
   (`v.total_cu_tva` etc.) — **nu recalculează**.

> **Regula de sincronizare:** valorile reale sunt cele calculate de `PACK_FACTURARE` la salvare.
> Preview-ul din `frm_factura` trebuie să folosească **aceleași formule** ca pachetul, iar
> `factura_salvare_db` trebuie să trimită corect toți parametrii relevanți. Dacă cele două
> diverg, ecranul arată altceva decât factura salvată/relistată.

## Structura `crsFactura` (rândul de factură în memorie)

Definit în `make_cfactura` (`proceduri_acnpro.prg`). Câmpuri relevante:

- `pretval` = preț unitar în valută (prețul introdus de operator; baza calculului)
- `Curs` = curs valutar; `Pret` = preț unitar în lei = `pretval * Curs`
- `cantitate`
- `proc_tva` = multiplicatorul de TVA (ex. **1.19**, nu 19). La salvare e trimis ca `proc_tvav`.
- `pret_cu_tva` N(1) = flag: 1 = `pretval` este **cu TVA inclus**, 0 = fără TVA
- Lei: `valftva` (fără TVA), `valtva` (TVA), `valctva` (cu TVA)
- Valută: `valval` (fără TVA), `tvaval` (TVA), `totval` (cu TVA)

## Formule TVA

Cu `proc_tva` = multiplicator (1 + cotă/100):

- **Preț fără TVA** (`pret_cu_tva = 0`): `valftva = Pret*cant`; `valtva = valftva*(proc_tva-1)`;
  `valctva = valftva + valtva`.
- **Preț cu TVA inclus** (`pret_cu_tva = 1`, calcul invers, identic cu `PACK_FACTURARE`,
  `V_PRET_CU_TVA = 1`, PACK_FACTURARE.pck ~15700–15922):
  `valctva = Pret*cant`; `valtva = valctva*(proc_tva-1)/proc_tva`; `valftva = valctva - valtva`.

Rotunjiri: lei la `gnPC`, valută la `gnPval` (opțiuni firmă `PC` / `PPRETV` în pachet).

## Unde modific când...

- **Calculul valorilor pe rând (preview)** → `frm_factura.CalculeazaPreturiRand` (IDE VFP).
- **Ce se trimite la salvare în Oracle** → `factura_salvare_db` (insert `crsvanztemp` + apel pachet).
- **Calculul/stocarea finală a valorilor** → `PACK_FACTURARE.pck` (a se ține sincron cu preview-ul).
- **Coloane noi pe rândul de factură** → `make_cfactura` (cursor) + grid `grdFactura` (IDE VFP)
  + import în `factura_acn` + insert în `factura_salvare_db`.
- **Aspectul facturii tipărite / relistare** → `proceduri_acnpro_rapoarte.prg` + `Rapoarte/*.frx`.
- **Lista de facturi** → interogările din `proceduri_acnpro.prg` (citesc din `vanzari`).

## Exemplu real: suport „preț cu TVA inclus" (v2.0.4)

Lanțul complet care a trebuit atins pentru o singură funcționalitate:
1. `make_cfactura` — coloană nouă `pret_cu_tva N(1)` în `crsFactura`.
2. `frm_factura.CalculeazaPreturiRand` — branch pe `pret_cu_tva` (calcul invers).
3. `grdFactura` — coloană checkbox editabilă legată de `crsFactura.pret_cu_tva`.
4. `factura_salvare_db` — trimite `Nvl(pret_cu_tva,0)` (nu mai e hardcodat 0) către pachet.

Pachetul și rapoartele **aveau deja** suport pentru `pret_cu_tva`, deci nu au fost modificate —
exemplu tipic de „verifică întâi ce face deja pachetul/raportul".
