# 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".