# Cercetare: TVA calculat vs salvat (#7) + denormalizare VANZARI (#8)

Sursele principale sunt fisierele "curate" din arhiva de migrare Oracle
`D:\ROA\DATABASE\SCRIPTURI_CLAR\...` (nu in working copy VFP git — DDL/PL-SQL nu e versionat in
`ROAFACTURARE`), plus `D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2` (working copy VFP, text
`.vc2` deja la zi).

Cea mai recenta definitie **completa** a pachetului `PACK_FACTURARE` (COMUN, folosit de toate
produsele ROA care factureaza) e in
`D:\ROA\DATABASE\SCRIPTURI_CLAR\2026\03\ff_2026_03_23_04_COMUN_PACK_FACTURARE.sql` (16948 linii).
Toate liniile citate mai jos fara alta mentiune sunt din acest fisier.

---

## SUBIECT A — TVA calculat, nu salvat (#7)

### 1. Structura VANZARI / VANZARI_DETALII (coloane pret/TVA)

Nu exista `CREATE TABLE VANZARI_DETALII` in arhiva cautata (tabela e mai veche decat
`SCRIPTURI_CLAR`, care incepe efectiv din 2009; originea e probabil in
`D:\ROA\DATABASE\SCRIPTURI\2006-2008`, nu am parcurs exhaustiv acel arhiv de migrari vechi).
Coloanele efective au fost confirmate prin utilizarea lor in cod (view-uri + SQL dinamic VFP):

**VANZARI_DETALII** (per linie articol):
- `PRET` — pret unitar (fara/cu TVA, in functie de flag)
- `DIFERENTA` — ajustare pret (folosita in `calculeaza_total_*_fact`)
- `DISCOUNT_UNITAR`
- `CANTITATE`
- `PRET_CU_TVA` — flag NUMBER(1): 1 = pretul de mai sus e cu TVA inclus, 0 = fara TVA
  (`ff_2026_07_27_01_FACTURARE.sql:25,43` — `b.pret_cu_tva`)
- `PROC_TVAV` — procent TVA ca multiplicator (ex. 1.19), nu procent brut
  (`ff_2026_07_27_01_FACTURARE.sql:26` — `b.proc_tvav`)
- `PRET_ACHIZITIE` (`ff_2026_07_27_01_FACTURARE.sql:105,130`)
- `ID_ARTICOL`, `ID_VALUTA`, `ID_POL` (politica de pret), `SERIE`, `STERS`, `ID_VANZARE`,
  `ID_VANZARE_DET` (`ff_2026_07_27_01_FACTURARE.sql:11-76`)
- `TAXCODE` — adaugata `2022\03\ff_2022_03_24_01_COMUN_SAFT.sql:6` (cod taxa SAFT)
- `ID_JTVA_COLOANA_EX` — adaugata `2019\08\ff_2019_08_20_04_COMUN.sql:7`
- `LOT` — adaugata `2024\06\ff_2024_06_04_01_COMUN_FACTURARE.sql:3`

**NU exista** o coloana de TVA calculata/salvata per linie (nici `valoare_tva`, nici
`pret_fara_tva` rezultat) — doar inputurile (`pret`, `pret_cu_tva` flag, `proc_tvav`), confirmand
exact ce zice todo #7: TVA e derivat, nu stocat.

**VANZARI** (antet factura) — coloane denormalizate relevante TVA, toate adaugate prin
`2017\03\ff_2017_03_28_01_FACTURARE.sql:9-38`:
- `DISCOUNT_TVA` — "TVA DISCOUNT (DISCOUNT * MAX(PROC_TVA) ARTICOLE)"
- `TOTAL_FARA_TVA`, `TOTAL_TVA`, `TOTAL_CU_TVA` — totaluri pe document (denormalizate)
- `VALOARE_ACHIZITIE`
- vezi si Subiect B pt. `SERIE_INCASAT`/`NR_INCASAT`/`SUMA_INCASAT`/`TIP_INCASAT`/`AVIZE`

### 2. Unde se calculeaza TVA-ul pe linie — toate locurile

Calculul e centralizat in doua straturi Oracle, apelate de fiecare punct de consum (VFP nu face
calcul TVA local — doar construieste SQL dinamic care cheama functiile Oracle):

- **`PACK_SESIUNE.calculeaza_pret_fara_tva/tva/cu_tva`** — motorul de rotunjire per-unitate de
  pret (nu e in `PACK_FACTURARE`; pachetul `PACK_SESIUNE` nu a fost gasit definit separat in
  arhiva cautata — cautare punctuala pe cateva luni din 2025/2026, fara succes; probabil e intr-un
  script `COMUN_PACK_SESIUNE` mai vechi, netestat exhaustiv).
- **`PACK_FACTURARE.calculeaza_pret`** (linia 14557) — wrapper subtire peste cele 3 functii
  `PACK_SESIUNE` de mai sus.
- **`PACK_FACTURARE.calculeaza_sume`** (linia 14631, spec 980) — calculeaza suma_fara_tva /
  suma_tva / suma_cu_tva pe linie (cantitate * pret), delegand catre:
  - **`calculeaza_total_fara_tva`** (linia 15745/15769) — delega la `pack_sesiune.calculeaza_total_fara_tva`
  - **`calculeaza_total_tva`** (linia 15850/15874) — delega la `pack_sesiune.calculeaza_total_tva`
  - **`calculeaza_total_cu_tva`** (linia 15638/15662) — delega la `pack_sesiune.calculeaza_total_cu_tva`
  - variantele `_fact` (`calculeaza_total_fara_tva_fact` 15794, `calculeaza_total_tva_fact` 15899,
    `calculeaza_total_cu_tva_fact` 15687) au **formula proprie inline** (nu delega la
    `pack_sesiune`), documentata explicit in cod ca fiind "folosita in view-ul
    fact_vrap_centralizator_fact" (comentarii 15686, 15744, 15793, 15848, 15897).

  Formula `_fact` (exemplu `calculeaza_total_tva_fact`, 15899-15949) e explicit ROUND-based, cu
  ramuri separate pentru `discount_evidentiat` — aici e punctul central de rotunjire per linie.

- **Puncte de CONSUM ale acestor functii** (unde efectiv se calculeaza TVA afisat/raportat):
  - Views `fact_vrap_fact_articole` si `fact_vrap_articole_vandute`
    (`ff_2026_07_27_01_FACTURARE.sql:18-44, 131-196` — apeleaza
    `calculeaza_total_fara_tva`/`calculeaza_total_tva` direct in `SELECT`)
  - Raport VFP dinamic: `COMUN\programe\oproceduri_rapoarte_fact.prg:581-590` — SQL construit in
    VFP apeleaza direct `pack_sesiune.calculeaza_pret_cu_tva(...)` si
    `pack_sesiune.calculeaza_total_cu_tva(...)` pentru listare/relistare rapoarte articole vandute.
  - `PACK_FACTURARE.scrie_in_vanzari` (13468) si `finalizeaza_avize_lucrare` (14807) — calculeaza
    si scriu `VANZARI.TOTAL_FARA_TVA`/`TOTAL_CU_TVA` folosind `calculeaza_total_fara_tva_fact` in
    subquery-uri (13716-13786, 14965-15008).
  - `verifica_total_document` (16009) — vezi punctul 5, verifica totalul calculat vs. cel din
    notele contabile si genereaza o corectie.

  Nu am gasit un apel VFP direct catre `calculeaza_pret(` sau `calculeaza_sume(` in working copy
  `ROAFACTURARE`/`COMUN` (grep pe nume exact, fara rezultate) — deci formularul de introducere
  factura in VFP nu recalculeaza local pretul/TVA-ul linie cu linie prin apel explicit de
  procedura; cel mai probabil articolele + preturile lor (deja cu `pret`, `pret_cu_tva`,
  `proc_tvav`) vin dintr-un cursor Oracle (`PACK_FACTURARE.cursor_preturi`, spec 335, body 2121)
  populat cand se adauga articolul, iar TVA vizibila in grid e calculata la afisare din acele
  coloane brute — nu am gasit expresia VFP exacta (`cursor_preturi` e ~500 linii, nu am parcurs
  linie cu linie in bugetul acestei cercetari).

### 3. Ce inseamna "preturi_cu_tva" / `pret_cu_tva`

- Pe linie: `VANZARI_DETALII.PRET_CU_TVA` — NUMBER(1), 0/1, transmis ca parametru `V_PRET_CU_TVA`
  / `V_PRET_ARE_TVA` la toate functiile de calcul de mai sus (controleaza care ramura de formula
  se aplica — pornind de la pret cu TVA sau fara TVA).
- In grid-ul VFP exista o coloana **checkbox** `cPret_cu_tva` in
  `D:\ROA\ROAFACTURARE\Clase\ofundal_facturare.vc2:696-699` (`_grdrow2.cPret_cu_tva...`) — probabil
  afiseaza/permite editarea flagului per linie in formular.
- **Nu am gasit** coloana `PRET_CU_TVA` (sau similara) direct pe `CRM_POLITICI_PRETURI` in
  scripturile de migrare cautate (am cautat `ALTER TABLE CRM_POLITICI_PRETURI ADD`, fara hit
  pe acest nume) — deci originea exacta a valorii implicite per politica de pret ("politica are
  bifat 'preturi fara TVA'", cum descrie todo #7) nu e confirmata cu `fisier:linie`; e probabil
  citita/propagata in `PACK_FACTURARE.cursor_preturi` (2121) sau
  `citeste_setari_pol_pret` (spec 324, body 2025) cand se adauga articolul pe factura — nu am
  parcurs acele corpuri in detaliu (buget de cercetare).

### 4. Locuri de atins daca s-ar salva `pret_cu_tva`/`valoare_tva` per linie real (nu calculat)

Enumerare pe baza punctelor de consum gasite mai sus:

1. **DDL**: `ALTER TABLE VANZARI_DETALII ADD (valoare_tva, pret_fara_tva_calculat, ...)` — coloane
   noi + migrare date istorice.
2. **`PACK_FACTURARE`** (Oracle, `ff_2026_03_23_04_COMUN_PACK_FACTURARE.sql`):
   - `adauga_articol_factura` (spec 529, body 4972) — punctul unde se insereaza linia in
     `VANZARI_DETALII_TEMP`; ar trebui sa scrie valoarea (eventual editata de user) in loc s-o
     lase doar pe `pret`/`pret_cu_tva`/`proc_tvav`.
   - `calculeaza_sume` (14631) — daca valoarea e editabila, aceasta procedura ar trebui sa
     citeasca valoarea salvata in loc s-o recalculeze, sau sa fie ocolita.
   - `scrie_in_vanzari` (13468) si `finalizeaza_avize_lucrare` (14807) — subquery-urile care insumeaza
     `calculeaza_total_fara_tva_fact`/`calculeaza_total_tva_fact` pe toate liniile
     (13716-13786, 14965-15008) ar trebui sa insumeze coloana noua in loc s-o recalculeze.
   - `verifica_total_document` (16009) — logica de reconciliere total-vs-note-contabile ar trebui
     ajustata (vezi punct 5) daca totalul nu se mai deriva strict din formula.
3. **Views Oracle**: `fact_vrap_fact_articole`, `fact_vrap_articole_vandute`
   (`ff_2026_07_27_01_FACTURARE.sql:10-257`), `fact_vfacturi`/`fact_vfacturi2` (vezi Subiect B #11)
   — toate ar trebui sa citeasca noua coloana in loc de `calculeaza_total_*`.
4. **VFP**: `COMUN\programe\oproceduri_rapoarte_fact.prg:581-590` — SQL-ul de raport care apeleaza
   direct `pack_sesiune.calculeaza_pret_cu_tva`/`calculeaza_total_cu_tva`.
5. **VFP grid formular**: `D:\ROA\ROAFACTURARE\Clase\ofundal_facturare.vc2` (coloana
   `cPret_cu_tva` + coloanele de pret/valoare din grid — nu identificate exhaustiv, cautare
   punctuala doar pe flag).
6. **Rapoarte `.frx`** care afiseaza TVA pe linie de factura (ex. `usr_factura*.fr2` — 25 de
   fisiere gasite cu referinta la `PACK_FACTURARE`, listate la cautarea initiala; nu au fost
   deschise individual).

Estimare: minim **6 zone distincte** (DDL, pachet Oracle ~4 proceduri, 3-4 views, 1 program raport
VFP, grid formular, rapoarte `.frx`) — consistent cu observatia ca e o schimbare "de volum", nu
locala.

### 5. Mecanism existent de ajustare/rotunjire

**Da, exista, dar la nivel contabil, nu la nivel de linie facturata / vizibil userului.**

`PACK_FACTURARE.verifica_total_document` (linia 16009-16188+) compara totalul FTVA/TVA asteptat
(`pack_facturare.ntotftva`, populat din VFP la `pnTotalFtva`/`Thisform.nbazaron`) cu suma reala din
notele contabile generate (`ACT_TEMP`, grupate pe conturi `4111`/`4427`/`418`/`4428`). Daca difera
(16082-16083: `NVL(pack_facturare.ntotftva,0) <> V_TOTFTVA_VER`), calculeaza diferenta
`pack_facturare.ndifftva := pack_facturare.ntotftva - V_TOTFTVA_VER` (16085) si **insereaza automat
o linie de corectie in `ACT_TEMP`** (16086-16188, INSERT cu `suma => pack_facturare.ndifftva`) —
adica ajustarea de rotunjire se absoarbe silentios in nota contabila, nu apare ca linie editabila
pe factura si nu se reflecta in `VANZARI_DETALII`. Aceasta e probabil exact mecanismul care face ca
utilizatorul sa nu poata corecta manual TVA-ul afisat: rotunjirea se "repara" doar in contabilitate,
dupa fapt.

---

## SUBIECT B — Denormalizare VANZARI, bug facturi din avize + numerar (#8)

### 6. Locatia `PACK_FACTURARE`

Nu exista fisier `.pck`/`.sql` cu acest pachet in working copy `ROAFACTURARE` (nici in `COMUN/`
local) — **e in afara working copy-ului VFP**, in arhiva DDL/PL-SQL Oracle
`D:\ROA\DATABASE\SCRIPTURI_CLAR\`. Cea mai recenta versiune completa (16948 linii):

  `D:\ROA\DATABASE\SCRIPTURI_CLAR\2026\03\ff_2026_03_23_04_COMUN_PACK_FACTURARE.sql`

(exista si un diff mai nou, doar pe view-uri, `2026\07\ff_2026_07_27_01_FACTURARE.sql` — vezi #11).
Istoricul complet de modificari e in `SCRIPTURI_CLAR\<an>\<luna>\ff_..._COMUN_PACK_FACTURARE.sql`
respectiv `..._FACTURARE.sql` (zeci de fisiere, 2006-2026).

### 7. Procedura care scrie in VANZARI valorile denormalizate

**`PACK_FACTURARE.scrie_in_vanzari`** (spec linia 894, body **linia 13468-13908**) — apelata din
`finalizeaza_factura` (linia **14740**). Face `UPDATE VANZARI SET ...` cu (13886-13898):

```
total_fara_tva    = lnTotalFaraTVA,
...
total_cu_tva      = lnTotalCuTVA,
...
serie_incasat     = lnSerieIncasat,
nr_incasat        = lnNrIncasat,
suma_incasat      = lnSumaIncasat,
tip_incasat       = lnTipIncasat
```

unde `lnSerieIncasat`/`lnNrIncasat`/`lnSumaIncasat`/`lnTipIncasat` sunt populate (13727-13730) din
variabilele **de pachet** `pack_facturare.cserie_act_incasare`, `.nnumar_act_incasare`,
`.nsuma_incasare`, `.ntip_doc_incasare` (declarate 179-182).

O a doua ramura echivalenta exista in **`finalizeaza_avize_lucrare`** (spec 1011, body
**14807-15176**), care face acelasi UPDATE (15124-15130) — pentru ramura "avize pe lucrare".

Variabilele de pachet `cserie_act_incasare`/`nnumar_act_incasare`/`ntip_doc_incasare`/
`nsuma_incasare` sunt setate **doar** de **`PACK_FACTURARE.scrie_incasari`** (spec 864, body
**13070-13139**), apelata condiționat (`IF V_LISTA_INCASARE IS NOT NULL`) din:
- `scrie_factura2` — linia **6178** (ramura factura normala / comanda / contract)
- `scrie_factura_avize` — linia **7008** (ramura **factura din aviz**)

Sunt resetate la `NULL` in `initializeaza_date_factura` (comentariu 1384-1386, cod la
**1876-1880**) — fix explicit din 03.07.2020: *"ramaneau completate pe facturile urmatoare de la o
factura anterioara"*.

`VANZARI.AVIZE` (seria/numarul avizelor facturate) e scris de
**`scrie_corespondente_vanzari`** (spec 1057, body **15421-15457**, comentariu la linia **15445**:
*"Completez VANZARI.AVIZE redundant, pentru a nu face mai rapid fact_vfacturi"*) — nu am confirmat
in acest buget de cercetare din ce apeleaza `finalizeaza_factura` daca `scrie_corespondente_vanzari`
ruleaza necondiționat pe toate tipurile sau doar pe unele (`V_TIP` e parametru) — merita verificat
punctual daca se investigheaza bug-ul mai departe.

### 8. Coloanele denormalizate din VANZARI si ramura care le populeaza

Toate adaugate prin `2017\03\ff_2017_03_28_01_FACTURARE.sql:9-38` (comentariu fisier, linia 1-4:
*"adaugare coloane in vanzari pentru denormalizarea join-urilor din fact_vfacturi"*):

| Coloana | Comentariu DB (linia 44-54 din script) | Populata de |
|---|---|---|
| `DISCOUNT_TVA` | TVA DISCOUNT (DISCOUNT * MAX(PROC_TVA) ARTICOLE) | `scrie_in_vanzari` |
| `VALOARE_ACHIZITIE` | Valoare la pret achizitie articole | `scrie_in_vanzari` |
| `TOTAL_FARA_TVA` | Total fara TVA lei | `scrie_in_vanzari` (13886), `finalizeaza_avize_lucrare` (15124) |
| `TOTAL_TVA` | Total TVA lei | idem |
| `TOTAL_CU_TVA` | Total cu TVA lei | `scrie_in_vanzari` (13888), `finalizeaza_avize_lucrare` (15126) |
| `SERIE_INCASAT` | Seria chitanta/bon fiscal | `scrie_in_vanzari` (13895), din `pack_facturare.cserie_act_incasare` (setat de `scrie_incasari`) |
| `NR_INCASAT` | Nr chitanta/bon fiscal | idem (13896) |
| `SUMA_INCASAT` | Suma chitanta/bon fiscal | idem (13897) |
| `TIP_INCASAT` | 11=CHITANTA, 2=BON FISCAL | idem (13898); vezi si `nTipIncasareCardBancar`=3, `nTipIncasareTichete`=5 |
| `AVIZE` | Serie/numar avize facturate (max 1000 caractere, comentariu la linia 1490) | `scrie_corespondente_vanzari` (15421) |

### 9. Tipurile de factura/aviz si ramificarea codului

Din `VANZARI.TIP` (CASE explicit in view `fact_vfacturi2`,
`ff_2017_03_28_01_FACTURARE.sql:89-171`) — cateva valori cheie:
`1`=POLITICA PRETURI, `2`=CONTRACT, `3`=COMANDA, **`4`=FACT. DIN AVIZ**, `21`=AVIZ PE BAZA DE
COMANDA, `24`=AVIZ DE RETUR, `43`=BON FISCAL MAGAZIN, etc. (lista completa la liniile citate).

Ramificare in VFP, `D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2`, metoda
**`do_scrie_factura`** — exista **doua copii aproape identice** ale acestei logici, in doua clase
diferite (confirmat via `vfp_symbols.ps1 -Where`):
- `frm_facturare_articole.do_scrie_factura` — **liniile 13981-14339**
- `frm_facturare_articole2.do_scrie_factura` — **liniile 18004-18331**

Structura `DO CASE` (identica in ambele, ex. clasa 1 la liniile 14067-14174):
- `poDate.eProforma = 1` → `{call pack_facturare.scrie_proforma(...)}` (14071)
- `poDate.Tip = 4` → **`{call pack_facturare.scrie_factura_avize(...)}`** (14103) — "facturare din
  aviz" (comentariu 14086-14087)
- `poDate.Tip IN (3,21,25,28,42,47)` → `{call pack_facturare.scrie_factura2(...)}` (14130) —
  "facturare pe baza de comanda / avize pe baza de comanda"
- `Otherwise` → `{call pack_facturare.scrie_factura2(...)}` (14158) — politica de preturi/contract

Inainte de asta, lista de incasare `lcListaIncasare` se construieste (14012-14038) din
`poDate.ntip_incasare` (11=chitanta, 2=bon fiscal, 3=POS/card), comun tuturor ramurilor.

### 10. Ramura "factura din aviz" + "achitata numerar" — ce ar trebui sa scrie si ipoteza de cauza

**Ce se intampla, pas cu pas** (`Tip = 4`, `ntip_incasare` in (11,2,3)):

1. VFP (`ofacturare.vc2:14012-14038`) construieste `lcListaIncasare` de forma
   `'11|<suma>|<id_casa>;'` (chitanta) sau `'2|...'`/`'3|...'` (bon fiscal/card) — **daca**
   `ntip_incasare` nu e in (11,2,3), `lcListaIncasare = [NULL]` (literal SQL NULL).
2. VFP construieste `lcSql = {call pack_facturare.scrie_factura_avize(pnDiscount, serie_chit,
   nr_incasare, lcListaIncasare, id_delegat, id_masina, id_facturare, listare_detaliata,
   dataora_exp, id_agent, text_aditional, discount_evidentiat, param_aditional, ?@nid_vanzare)}`
   (14103-14115) — semnatura corespunde exact cu procedura Oracle activa
   `scrie_factura_avize` (linia **6675-7041**, care NU are `V_TOTFTVA`/`V_TOTTVA` ca prime
   argumente, spre deosebire de `scrie_factura2` — asta e corect, nu e discrepanta de parametri).
3. In Oracle, `scrie_factura_avize` (7007-7012): `IF V_LISTA_INCASARE IS NOT NULL THEN
   pack_facturare.scrie_incasari(...)` — deci **doar daca** `lcListaIncasare` nu e literalul
   `NULL` se seteaza variabilele de pachet `cserie_act_incasare`/etc.
4. `scrie_factura_avize` seteaza `pack_facturare.clistaid_avize := ...V_LISTAID` (7020) — lista de
   ID-uri de avize facturate, folosita ulterior de `scrie_corespondente_vanzari` pentru
   `VANZARI.AVIZE`.
5. `scrie_factura_avize` cheama `finalizeaza_factura` (7026-7034), care cheama `scrie_in_vanzari`
   (14740) → scrie `serie_incasat`/`nr_incasat`/`suma_incasat`/`tip_incasat` din variabilele de
   pachet setate la pasul 3.

**La nivel de cod citit, lantul pare corect cablat** — parametrii trec prin, semnaturile se
potrivesc, iar cele doua clase VFP (`frm_facturare_articole` si `frm_facturare_articole2`) au
logica identica pentru aceasta ramura.

**IPOTEZA (cauza posibila a bug-ului, nedemonstrata prin citire de cod — necesita investigatie
suplimentara/testare)**:
- Daca ordinea reala de operatii difera de `ordine_operatii_facturare.txt` (ex. daca intre pasul 3
  si pasul 5 se mai apeleaza `initializeaza_date_factura` pentru alt document/lucru din aceeasi
  sesiune, inainte ca `finalizeaza_factura` sa apuce sa citeasca variabilele de pachet), fix-ul din
  03.07.2020 (linia 1876-1880, reset la NULL) ar putea sterge datele de incasare **inainte** ca
  `scrie_in_vanzari` sa le foloseasca — dar nu am gasit in codul citit un asemenea apel intercalat.
- Alternativ: daca pe ramura aviz `scrie_corespondente_vanzari` (care scrie `VANZARI.AVIZE`) nu e
  apelata necondiționat din `finalizeaza_factura` pentru `TIP=4` (nu am verificat corpul complet al
  `finalizeaza_factura`, liniile 14723-14807, dincolo de apelul la `scrie_in_vanzari`) — merita
  verificat explicit daca acel apel exista si e neconditionat de tip.
- Nu am verificat daca exista vreo diferenta intre `scrie_factura_avize` si
  `scrie_factura_avize_retur` (spec 667, alta ramura pentru tip retur din aviz) in privinta
  apelului `scrie_incasari`/`scrie_in_vanzari` — posibil ca bug-ul sa fie specific ramurii de retur,
  nu celei simple.

Recomandare pentru pasul urmator (daca se investigheaza mai departe): instrumentare/breakpoint pe
`scrie_in_vanzari` (13468) intr-un mediu de test, pentru o factura Tip=4 platita numerar, verificand
valorile efective ale `pack_facturare.cserie_act_incasare`/`nnumar_act_incasare`/`nsuma_incasare`/
`ntip_doc_incasare` chiar inainte de UPDATE (13886-13898).

### 11. Cele doua view-uri de facturi

- **`fact_vfacturi`** — view-ul "original" (pe model relational, cu join-uri catre `VANZARI_DETALII`
  / `ACT` / etc., fara denormalizare). Redefinit de multe ori de-a lungul timpului; cea mai recenta
  gasita: `D:\ROA\DATABASE\SCRIPTURI_CLAR\2023\11\ff_2023_11_17_01_COMUN.sql` (si
  `2023\02\ff_2023_02_08_01_COMUN.sql`) — nu am deschis continutul exact in acest buget.
- **`fact_vfacturi2`** — view-ul cu totaluri **denormalizate din VANZARI** (`total_fara_tva`,
  `total_tva`, `total_cu_tva`, `serie_incasat`, `nr_incasat`, `suma_incasat`, `tip_incasat`,
  `avize` citite direct din coloanele `VANZARI`, nu recalculate din `VANZARI_DETALII`/`ACT`).
  Definit initial in **`D:\ROA\DATABASE\SCRIPTURI_CLAR\2017\03\ff_2017_03_28_01_FACTURARE.sql:59-236`**,
  cu comentariul explicit (linia 3): *"View fact_vfacturi2 - temporar, urmand a inlocui view-ul
  fact_vfacturi, dupa completarea coloanelor din vanzari pentru datele existente deja"*.

Separat, exista si o a doua pereche de view-uri, mai recenta si mai granulara (pe linie de
articol, nu pe factura): **`fact_vrap_fact_articole`** / **`fact_vrap_articole_vandute`**, definite
in `D:\ROA\DATABASE\SCRIPTURI_CLAR\2026\07\ff_2026_07_27_01_FACTURARE.sql:10-257` — acestea NU
citesc din coloane denormalizate, ci calculeaza TVA live prin `pack_facturare.calculeaza_total_*`
(vezi Subiect A #2). Nu sunt aceleasi cu perechea mentionata in cerinta (care pare sa se refere la
`fact_vfacturi`/`fact_vfacturi2`), dar sunt relevante daca se cauta "view-ul cu totaluri din
vanzari" generic.

---

## Note metodologice

- `PACK_SESIUNE` (motorul de rotunjire per-pret, apelat de `PACK_FACTURARE`) nu a fost gasit
  definit ca fisier separat in cautarile punctuale facute (cateva luni din 2025-2026); daca se
  continua investigatia pe rotunjire, merita o cautare dedicata `create or replace package
  pack_sesiune` in `D:\ROA\DATABASE\SCRIPTURI_CLAR`.
- Arhiva `D:\ROA\DATABASE\SCRIPTURI_CLAR` e foarte mare (mii de fisiere, 2009-2026); cautarile de
  mai sus au fost tintite (nume de coloane/proceduri cunoscute), nu exhaustive — un `grep` complet
  pe intreg arhivul repetat timeout la 20s in unele incercari initiale.
- Nu am gasit apeluri catre `PACK_FACTURARE` din `D:\ROA\ROAFACTURARE` propriu-zis (in afara
  `COMUN\clase\ofacturare.vc2`) — pachetul e consumat exclusiv prin acea clasa si prin
  `COMUN\programe\oproceduri_rapoarte_fact.prg`.
