Files
comun/docs/cercetare/rec_s5_script_oracle.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

18 KiB

Verificare script Oracle S5 — PACK_FACTURARE.recalculeaza_totaluri_vanzari

Data: 09.08.2026. Livrabil: docs/ff_2026_08_09_01_COMUN_PACK_FACTURARE.sql (823433 octeti, 17231 randuri; 17010->17231 fata de .pck-ul sursa, +221 randuri de continut adaugat).

Construit programatic dintr-un script PowerShell (nu retastat): citeste PACK_FACTURARE.pck (export proaspat, scratchpad, 810960 octeti, 17011 randuri) ca octeti ASCII, insereaza declaratia noua in SPEC dupa actualizeaza_vanzari si corpul nou in BODY dupa actualizeaza_vanzari, adauga CREATE OR REPLACE pe cele doua linii de start (absente in exportul brut din all_source), antetul si coada, si scrie rezultatul CRLF. Fiecare punct de insertie e verificat printr-un assert pe textul exact al ancorei (throw daca nu se potriveste) — scriptul s-a oprit si a fost corectat de doua ori in timpul lucrului (vezi „Erori prinse" mai jos), rularea finala a trecut toate ancorele.

Ce s-a facut

  1. PACKAGE SPEC (.pck:1187-1189): dupa declaratia actualizeaza_vanzari, s-a inserat PROCEDURE recalculeaza_totaluri_vanzari(V_ID_VANZARE IN NUMBER, V_DISCOUNT IN NUMBER DEFAULT NULL); — text identic cu cel din brief.
  2. PACKAGE BODY (.pck:16015-16025, dupa END actualizeaza_vanzari;): s-a inserat procedura noua, corpul fiind blocul de agregare din scrie_in_vanzari (.pck:13762-13954) cu substitutiile cerute, plus SELECT-ul de discount/in_valuta/discount_evidentiat inainte, plus discount in UPDATE, fara handler de exceptie — toate exact ca in sectiunea 7 a specificatiei.
  3. Antet de 6 randuri (4 randuri text + 1 rand -- gol + titlu), fara referinte la planuri/rapoarte.
  4. Coada: exec pack_migrare.UpdateVersiune('ff_2026_08_09_01_COMUN_PACK_FACTURARE.sql'); commit;

Verificari cerute, cu cifre

CRLF — octeti LF fara CR inainte in fisierul final: 0.

Nume sub 30 caractere'recalculeaza_totaluri_vanzari'.Length = 29. Confirmat.

Diff-ul blocului de agregare — original (.pck:13762-13954, 193 randuri, citat integral in rec_s5_proiectare_oracle.md sectiunea 2) vs. blocul nou din procedura (extras din fisierul livrat). Generat cu diff -u -b (ignora doar diferentele de cantitate de spatiu — necesar pentru ca tot blocul a fost mutat cu un nivel de indentare mai putin, vezi nota de mai jos; -b nu ascunde nicio diferenta de continut). Diff-ul integral:

--- orig_block.txt      (PACK_FACTURARE.pck:13762-13954)
+++ new_block.txt       (recalculeaza_totaluri_vanzari, corpul agregarii)
@@ -1,5 +1,4 @@
-    -- Completare totaluri in vanzari din vanzari_detalii pentru a usura selectiile din fact_vfacturi
-    begin
+-- Completare totaluri in vanzari din vanzari_detalii pentru a usura selectiile din fact_vfacturi
       select DISC_TVA_VAL AS DISCOUNT_TVA,
              VALOARE_ACHIZITIE,
              a.suma_fara_tva_ron - a.disc_fara_tva_ron as TOTAL_FARA_TVA,
@@ -12,11 +11,7 @@
              a.disc_tva_val as TOTVAL,
              id_valuta,
              curs,
-             multiplicator,
-             pack_facturare.cserie_act_incasare as SERIE_INCASAT,
-             pack_facturare.nnumar_act_incasare as NR_INCASAT,
-             pack_facturare.nsuma_incasare AS SUMA_INCASAT,
-             pack_facturare.ntip_doc_incasare as TIP_INCASAT
+           multiplicator
         INTO lnDiscountTVA,
              lnValoareAchizitie,
              lnTotalFaraTVA,
@@ -27,29 +22,25 @@
              lnTotVal,
              lnIdValuta,
              lnCurs,
-             lnMultiplicator,
-             lnSerieIncasat,
-             lnNrIncasat,
-             lnSumaIncasat,
-             lnTipIncasat
-        FROM (select MAX(decode(pack_facturare.nin_valuta,
+           lnMultiplicator
+      FROM (select MAX(decode(lnInValuta,
                                 1,
-                                ROUND(a1.curs * NVL(V_DISCOUNT_FACTURA, 0) /
+                              ROUND(a1.curs * NVL(lnDiscountFactura, 0) /
                                       a1.multiplicator,
                                       lnPreciziePretV),
-                                NVL(V_DISCOUNT_FACTURA, 0))) as DISC_FARA_TVA_RON,
-                     NVL(V_DISCOUNT_FACTURA, 0) as DISC_FARA_TVA_VAL,
-                     pack_facturare.nin_valuta AS IN_VALUTA,
-                     MAX(ROUND(decode(pack_facturare.nin_valuta,
+                              NVL(lnDiscountFactura, 0))) as DISC_FARA_TVA_RON,
+                   NVL(lnDiscountFactura, 0) as DISC_FARA_TVA_VAL,
+                   lnInValuta AS IN_VALUTA,
+                   MAX(ROUND(decode(lnInValuta,
                                       1,
                                       ROUND(a1.curs *
-                                            NVL(V_DISCOUNT_FACTURA, 0) /
+                                          NVL(lnDiscountFactura, 0) /
                                             a1.multiplicator,
                                             lnPreciziePretV),
-                                      NVL(V_DISCOUNT_FACTURA, 0)) *
+                                    NVL(lnDiscountFactura, 0)) *
                                (a1.proc_tvav - 1),
                                lnPreciziePretV)) as DISC_TVA_RON,
-                     MAX(ROUND(NVL(V_DISCOUNT_FACTURA, 0) *
+                   MAX(ROUND(NVL(lnDiscountFactura, 0) *
                                (a1.proc_tvav - 1),
                                lnPreciziePretV)) as DISC_TVA_VAL,
                      sum(pack_facturare.calculeaza_total_fara_tva_fact(a1.pret_ron,
@@ -57,7 +48,7 @@
                                                                        1,
                                                                        NVL(a1.discount_unitar_ron,
                                                                            0),
-                                                                       pack_facturare.ndiscount_evidentiat,
+                                                                     lnDiscountEvidentiat,
                                                                        a1.cantitate,
                                                                        a1.pret_cu_tva,
                                                                        a1.proc_tvav)) AS SUMA_FARA_TVA_RON,
@@ -66,7 +57,7 @@
                                                                   1,
                                                                   NVL(a1.discount_unitar_ron,
                                                                       0),
-                                                                  pack_facturare.ndiscount_evidentiat,
+                                                                lnDiscountEvidentiat,
                                                                   a1.cantitate,
                                                                   a1.pret_cu_tva,
                                                                   a1.proc_tvav)) as SUMA_TVA_RON,
@@ -75,7 +66,7 @@
                                                                        1,
                                                                        NVL(a1.discount_unitar_val,
                                                                            0),
-                                                                       pack_facturare.ndiscount_evidentiat,
+                                                                     lnDiscountEvidentiat,
                                                                        a1.cantitate,
                                                                        a1.pret_cu_tva,
                                                                        a1.proc_tvav)) AS SUMA_FARA_TVA_VAL,
@@ -84,18 +75,18 @@
                                                                   1,
                                                                   NVL(a1.discount_unitar_val,
                                                                       0),
-                                                                  pack_facturare.ndiscount_evidentiat,
+                                                                lnDiscountEvidentiat,
                                                                   a1.cantitate,
                                                                   a1.pret_cu_tva,
                                                                   a1.proc_tvav)) as SUMA_TVA_VAL,
                      sum(round(a1.cantitate * a1.pret_achizitie,
                                lnPrecizieCalcul)) AS VALOARE_ACHIZITIE,
-                     max(decode(pack_facturare.nin_valuta, 1, a1.id_valuta, 0)) as id_valuta,
-                     max(decode(pack_facturare.nin_valuta, 1, a1.curs, 1)) as curs,
-                     max(decode(pack_facturare.nin_valuta, 1, a1.multiplicator, 1)) as multiplicator
+                   max(decode(lnInValuta, 1, a1.id_valuta, 0)) as id_valuta,
+                   max(decode(lnInValuta, 1, a1.curs, 1)) as curs,
+                   max(decode(lnInValuta, 1, a1.multiplicator, 1)) as multiplicator
                 from (select vd.id_vanzare_set,
                              (case
-                               when (pack_facturare.nin_valuta = 1 or
+                             when (lnInValuta = 1 or
                                     vd.id_valuta <>
                                     pack_def.GetIdMonedaNationala()) then
                                 ROUND(vc.curs * vd.pret / vc.multiplicator,
@@ -108,7 +99,7 @@
                              vd.cantitate,
                              vd.diferenta,
                              (case
-                               when (pack_facturare.nin_valuta = 1 or
+                             when (lnInValuta = 1 or
                                     vd.id_valuta <>
                                     pack_def.GetIdMonedaNationala()) then
                                 ROUND(vc.curs * vd.discount_unitar /
@@ -132,8 +123,10 @@
                                      a.id_valuta,
                                      a.pret_cu_tva,
                                      a.pret_achizitie
-                                from VANZARI_DETALII_TEMP a
+                              from VANZARI_DETALII a
                                where nvl(a.id_vanzare_set, 0) = 0
+                               and a.id_vanzare = V_ID_VANZARE
+                               and a.sters = 0
                               union all
                               select b.id_vanzare_set,
                                      b.pret,
@@ -141,7 +134,7 @@
                                      b.cantitate,
                                      0 as diferenta,
                                      b.discount_unitar,
-                                     decode(pack_facturare.nin_valuta,
+                                   decode(lnInValuta,
                                             0,
                                             pack_def.GetIdMonedaNationala(),
                                             c.id_valuta) as id_valuta,
@@ -151,17 +144,19 @@
                                                 0,
                                                 c.pret_achizitie * c.cantitate /
                                                 b.cantitate)) as pret_achizitie
-                                from vanzari_detalii_temp c
+                              from vanzari_detalii c
                                 left join vanzari_seturi b
                                   on b.id_vanzare_set = c.id_vanzare_set
                                where nvl(c.id_vanzare_set, 0) <> 0
-                                 and nvl(pack_facturare.nin_valuta, -1) > -1
+                               and c.id_vanzare = V_ID_VANZARE
+                               and c.sters = 0
+                               and nvl(lnInValuta, -1) > -1
                                group by b.id_vanzare_set,
                                         b.pret,
                                         b.cantitate,
                                         b.discount_unitar,
                                         b.pret_cu_tva,
-                                        decode(pack_facturare.nin_valuta,
+                                      decode(lnInValuta,
                                                0,
                                                pack_def.GetIdMonedaNationala(),
                                                c.id_valuta)) vd
@@ -170,7 +165,8 @@
                          and vd.id_valuta = vc.id_valuta) a1) a;

       update vanzari
-         set discount_tva      = lnDiscountTVA,
+       set discount          = lnDiscountFactura,
+           discount_tva      = lnDiscountTVA,
              valoare_achizitie = lnValoareAchizitie,
              total_fara_tva    = lnTotalFaraTVA,
              total_tva         = lnTotalTVA,
@@ -180,14 +176,5 @@
              totval            = lnTotVal,
              id_valuta         = lnIdValuta,
              curs              = lnCurs,
-             multiplicator     = lnMultiplicator,
-             serie_incasat     = lnSerieIncasat,
-             nr_incasat        = lnNrIncasat,
-             suma_incasat      = lnSumaIncasat,
-             tip_incasat       = lnTipIncasat
+           multiplicator     = lnMultiplicator
        where id_vanzare = V_ID_VANZARE;
-
-    exception
-      when NO_DATA_FOUND then
-        null;
-    end;

Diff-ul contine exact: cele 6 substitutii din tabelul din brief (nin_valuta->lnInValuta x11, ndiscount_evidentiat->lnDiscountEvidentiat x4, NVL(V_DISCOUNT_FACTURA, 0)-> NVL(lnDiscountFactura, 0) x6, cele doua perechi FROM/WHERE), eliminarea celor 4 coloane de incasare din SELECT/INTO/UPDATE (cu fixarea virgulei ramase), adaugarea discount = lnDiscountFactura, in UPDATE si eliminarea wrapper-ului begin ... exception ... end; (cerut explicit: „Fara handler WHEN NO_DATA_FOUND THEN NULL"). Nicio alta diferenta de continut.

Nota pe metoda: -b a fost necesar (nu diff simplu) pentru ca tot blocul, o data scos din begin...end;-ul intern, a coborat cu un nivel de indentare (2 spatii) — o consecinta mecanica, uniforma, a aplatizarii cerute de sectiunea 7, nu o modificare de continut. Fara -b, diff-ul ar fi aratat toate liniile ca schimbate, desi doar spatiul de inceput difera pe liniile neatinse de tabelul de substitutii (verificat separat: liniile fara nicio substitutie, ex. select DISC_TVA_VAL AS DISCOUNT_TVA,, VALOARE_ACHIZITIE,, nu apar deloc in diff-ul de mai sus).

; in comentarii -- in interiorul unei instructiuni — 11 aparitii ale tiparului --.*; in tot fisierul, toate preexistente in codul neatins (scrie_incasari, contabilizeaza_articol etc., linii 5908-14852 din script), niciuna introdusa de mine (verificat separat: 0 in antetul nou, 0 in declaratia SPEC noua, 0 in corpul noii proceduri). Riscul descris in scripturi-migrare-db.md (SP2-0734) se aplica instructiunilor SQL terminate cu ; (CREATE VIEW etc.); intregul script de fata e un singur bloc CREATE OR REPLACE PACKAGE/ PACKAGE BODY terminat cu /, deci riscul nu se aplica structural — dar cifra e cea ceruta.

Constructii peste Oracle 10.2 — scanat corpul noii proceduri pentru LISTAGG|CONTINUE|REGEXP_COUNT|FETCH FIRST|PIVOT|NEXTVAL: 0 aparitii pentru fiecare. Identificatori: cel mai lung e recalculeaza_totaluri_vanzari (29) si lnDiscountEvidentiat (20) — niciunul peste 30.

Numarul de linii — fisier final: 17231 (17230 dupa convenția wc -l, care nu numara ultimul rand fiindca fisierul, la fel ca sursa, nu are newline final); .pck original: 17011 (17010 wc -l). Delta: +221 randuri adaugate (antet 7 + insert SPEC 3 + rand gol inainte de CREATE OR REPLACE PACKAGE BODY 1 + procedura noua in BODY 205 + coada 4 + CREATE OR REPLACE adaugat pe 2 linii existente, fara linii noi acolo).

Coloanele de incasareserie_incasat, nr_incasat, suma_incasat, tip_incasat: 0 aparitii in SELECT/INTO/UPDATE-ul noii proceduri (verificat separat, izolat pe textul extras al procedurii). Apar in continuare de 5 ori fiecare in restul fisierului — in scrie_in_vanzari, neatinsa, unde e corect sa ramana (comportamentul de emitere nu se schimba).

Erori prinse si corectate in timpul lucrului (nu au ajuns in fisierul livrat)

  1. Prima rulare a omis complet linia discount = lnDiscountFactura, din UPDATE (am copiat doar eliminarea coloanelor de incasare, am uitat adaugarea cerincetei separat in brief). Prins de verificarea numerica (lnDiscountFactura aparea de 8 ori in loc de 9) inainte de a scrie raportul; corectat si re-rulat.
  2. Prima rulare a scris PACKAGE "PACK_FACTURARE" is si PACKAGE BODY PACK_FACTURARE is fara prefixul CREATE OR REPLACE pe linia de SPEC (l-am adaugat doar pe linia de BODY). Ar fi dat eroare de sintaxa la aplicare — PACKAGE ... is singur nu e o instructiune DDL valida. Prins prin citirea directa a antetului fisierului scris; corectat si re-rulat.

Ce NU am facut / neverificat

  • Nu am rulat nimic in Oracle — niciun sqlplus, niciun DDL, niciun test de compilare a pachetului. Corectitudinea sintactica dincolo de verificarile de mai sus (paranteze, virgule, cuvinte cheie) nu e garantata decat prin inspectie si prin construirea mecanica din blocul original deja compilat.
  • Coada scriptului foloseste UpdateVersiune('ff_2026_08_09_01_COMUN_PACK_FACTURARE.sql') cu extensia .sql, asa cum cere explicit brief-ul si scripturi-migrare-db.md („script_final = numele fisierului, cu tot cu .sql"). Modelul citat (ff_2026_08_06_10_...sql:17019) foloseste de fapt numele fara .sql — o inconsistenta intre precedent si regula scrisa. Am urmat regula scrisa si instructiunea explicita, nu precedentul; semnalez discrepanta, nu am „reparat-o" in modelul vechi (nu era in scop).
  • Nu am atins versiune_db.txt, nu am scris in D:\ROA\DATABASE\SCRIPTURI_CLAR, nu am dat commit — conform interdictiilor din brief.