ROAFACTURARE 2.11.15 (r18015): programe/ofacturare_editare.prg, programe/ofacturare_stoc.prg. docs: conventia de encoding .sc2/.vc2 corectata la cp1250; cercetarile trans-proiect mutate din ROAFACTURARE in docs/cercetare (r18014); actualizari reguli_lucru, oracle_export, flux-editare-vfp-text, scripturi-migrare-db, flux-modificare-stergere-nota-jurnal, todos. .gitignore: watchdog_out si PNG-urile din rularile headless (r18008). Text FoxBin2Prg regenerat: clase/comun.vc2, ferestre/frm_import_note_facturi_clienti.sc2, ferestre/frm_initializare_facturi_balanta.sc2. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AV7dQbTLAqvrtQbH7zxXxw
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
- PACKAGE SPEC (
.pck:1187-1189): dupa declaratiaactualizeaza_vanzari, s-a inseratPROCEDURE recalculeaza_totaluri_vanzari(V_ID_VANZARE IN NUMBER, V_DISCOUNT IN NUMBER DEFAULT NULL);— text identic cu cel din brief. - PACKAGE BODY (
.pck:16015-16025, dupaEND actualizeaza_vanzari;): s-a inserat procedura noua, corpul fiind blocul de agregare dinscrie_in_vanzari(.pck:13762-13954) cu substitutiile cerute, plus SELECT-ul de discount/in_valuta/discount_evidentiat inainte, plusdiscountin UPDATE, fara handler de exceptie — toate exact ca in sectiunea 7 a specificatiei. - Antet de 6 randuri (4 randuri text + 1 rand
--gol + titlu), fara referinte la planuri/rapoarte. - 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 incasare — serie_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)
- Prima rulare a omis complet linia
discount = lnDiscountFactura,dinUPDATE(am copiat doar eliminarea coloanelor de incasare, am uitat adaugarea cerincetei separat in brief). Prins de verificarea numerica (lnDiscountFacturaaparea de 8 ori in loc de 9) inainte de a scrie raportul; corectat si re-rulat. - Prima rulare a scris
PACKAGE "PACK_FACTURARE" issiPACKAGE BODY PACK_FACTURARE isfara prefixulCREATE OR REPLACEpe linia de SPEC (l-am adaugat doar pe linia de BODY). Ar fi dat eroare de sintaxa la aplicare —PACKAGE ... issingur 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 siscripturi-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 inD:\ROA\DATABASE\SCRIPTURI_CLAR, nu am dat commit — conform interdictiilor din brief.