Files
comun/docs/cercetare/rec_tva_vanzari.md
Marius Mutu 09ddeabb1c docs: cercetarile trans-proiect din ROAFACTURARE trec in COMUN
Paisprezece rapoarte care nu erau ale ROAFACTURARE traiau in docs\cercetare\ al
acelui proiect: valuta si curs in ofacturare, TVA calculat vs salvat plus
denormalizarea VANZARI, inventarul consumatorilor VANZARI din toata suita ROA,
integrarile de contracte/politici/nomenclator (#10, #11, #12), watchdog-ul VFP
de testare, proiectarea Oracle a scrierii din S5 si view-ul VVANZARI_ARTICOLE.

Motivul mutarii, nu doar al pastrarii: planurile #10, #11 si #12 sunt amanate,
iar indexul lor spune explicit ca se reiau din aceste rapoarte - deci sunt punct
de plecare, nu istoric. Iar tinta lor e COMUN plus ROAPRETURI/ROACONTRACTE.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SN8snvkk94KuhWwoXUUey3
2026-08-11 22:31:53 +03:00

22 KiB

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,43b.pret_cu_tva)
  • PROC_TVAV — procent TVA ca multiplicator (ex. 1.19), nu procent brut (ff_2026_07_27_01_FACTURARE.sql:26b.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_facturaliniile 13981-14339
  • frm_facturare_articole2.do_scrie_facturaliniile 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.