Folderul docs\ era pana acum in afara oricarui control de versiuni - nici git, nici SVN - desi contine planurile pe puncte, proiectarile si rapoartele de cercetare pe care se sprijina modificarile din cod. O stergere acolo era definitiva. Fisierele intermediare (handoff-uri intre sesiuni, diff-uri deja aplicate) au fost sterse inainte, nu versionate: ce era durabil in ele a intrat in antetele fisierelor de test la care se refereau. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SN8snvkk94KuhWwoXUUey3
13 KiB
Verificare discount pe linie de factura — frm_facturare_articole / VANZARI_DETALII
Investigatie read-only. Toate liniile citate au fost verificate pe fisierul text real din working
copy (ofacturare.vc2, 23087 linii, ultima scriere 07.08 22:18) si pe scripturile DDL din
D:\ROA\DATABASE\SCRIPTURI_CLAR. Nu s-a executat nimic pe baza de date.
1. Confirmare/infirmare afirmatii initiale
Concluzie: toate afirmatiile despre frm_facturare_articole sunt corecte, cu linii care se
potrivesc exact sau aproape exact. Confirmat via vfp_symbols.ps1 -Where ca formularul
frm_facturare_articole ocupa exact ofacturare.vc2:10968-15739.
Dovezi:
Column5.ControlSource = "discountctva",Column5.Name = "cDiscountCTva",Column5.ReadOnly = .T.— confirmat laofacturare.vc2:12311-12317(identic cu afirmatia).Column9.ControlSource = "vdiscountftva",Column9.Name = "cVdiscountftva", faraReadOnly— confirmat laofacturare.vc2:12340-12345(identic).- Capete de coloana:
Caption = "Discount unitar cu TVA"la:12409,Caption = "Discount unitar in valuta fara TVA"la:12546— ambele confirmate exact. - Excludere reciproca pe valuta la
ofacturare.vc2:15269-15278:confirmat identic (linii exacte, nu doar apropiate).15269 If poDate.in_valuta = 0 15270 Thisform.grd_factura.RemoveObject([cVpretFtva]) 15271 Thisform.grd_factura.RemoveObject([cVdiscountftva]) 15272 Thisform.grd_factura.RemoveObject([cVvaldiminuatftva]) 15273 Else 15274 Thisform.grd_factura.RemoveObject([cPretFtva]) 15275 Thisform.grd_factura.RemoveObject([cDiscountctva]) VANZARI_DETALII.DISCOUNT_UNITAR NUMBER(22,6)— confirmat, dar cu precizare: linia corecta inff_2024_06_13_02_COMUN_FACTURARE.sqle:3(nu si:9/:16cum lasa sa se inteleaga formularea initiala — acelea suntVANZARI_DETALII_TEMPsi, respectiv,CRM_POLITICI_PRET_ART, vezi punctul 4).
2. Consecinta practica pe ecran
Concluzie: pe factura in lei, coloana vizibila e "Discount unitar cu TVA" (discountctva)
si e needitabila in grid (ReadOnly = .T.). Pe factura in valuta, coloana vizibila e
"Discount unitar in valuta fara TVA" (vdiscountftva) si este editabila direct in grid
(nicio proprietate ReadOnly setata pe coloana sau pe Text1-ul ei → mosteneste default-ul VFP,
.F.).
Dovezi:
- Ramane pe ecran: cand
in_valuta = 0se elimina cele 3 coloane "V..." (inclusivcVdiscountftva) → ramanecDiscountCTva. Candin_valuta <> 0se eliminacDiscountctva(si celelalte 3 coloane fara "V") → ramanecVdiscountftva. (:15269-15278, citat mai sus). - Ca sa nu presupun ca lipsa lui
Column9.ReadOnlyinseamna implicit editabil, am verificat lantul de clase: grid-ulgrd_facturaeADD OBJECT 'grd_factura' AS _grdrow(:12263), faraReadOnlyla nivel de grid intre:12263-12364; clasa_grdrow(_grd_base.vc2:445) nu seteazaReadOnlynicaieri in propriul body, iar parintele ei_grdbase/_gridde asemenea nu (singurele 3 aparitii deReadOnlyin_grd_base.vc2sunt in clasa separata_grdfooter, neinrudita). Deci Column9 chiar e editabila. - Confirmare suplimentara: in formularul
frm_facturare_articole2(prototip separat, clasa laofacturare.vc2:15741-19355, NU formularul in productie), aceleasi doua coloane apar cuReadOnlyexplicit:Column5.ReadOnly = .F.(:16657) siColumn9.ReadOnly = .F.(:16688) — adica in prototip discountul e editabil in ambele monede direct din grid; in formularul real doar varianta in valuta e editabila din grid.
3. Poate operatorul introduce azi un discount pe linie, si pe ce cale
Concluzie: da, poate — dar nu prin do_calculeaza_discount de la
frm_facturare_articole:13405-13424 (asta calculeaza discountul global pe toata factura,
Thisform.ndiscfactron/ndiscfactval, nicio legatura cu discountctva/vdiscountftva pe
linie — vezi corectia de la final). Calea reala e formularul frm_articol_factura
(ofacturare.vc2:1108-2659), deschis din do_adauga_articol la adaugarea unui articol
(:12873, ofrmadarticol.Show(1) doar daca !tlImplicit). Acolo exista metoda
frm_articol_factura.do_calculeaza_discount (:1874-1976) legata de 3 controale editabile:
Clb_procent_discount.Text_simplu1 (procent), Clb_discount_unitar.tx_suma_nat/tx_suma_val
(suma in lei / valuta), Clb_discountctva.tx_suma_nat/tx_suma_val (varianta cu TVA) — toate cu
handler Valid/InteractiveChange care apeleaza do_calculeaza_discount(valoare, tip) cu
tip=1 procent, tip=2 lei, tip=3 valuta (:2602-2624, :2646-2649).
Lantul, cu linii:
- Operator tasteaza in unul din campurile de mai sus →
Valid/InteractiveChange→Thisform.do_calculeaza_discount(valoare, tip)(ofacturare.vc2:2602-2649). do_calculeaza_discount(:1874-1976) scrie in obiectulpoArticol:poArticol.discount_unitar,discount_unitar_val,discount_unitar_ctva,discount_unitar_ctva_val(ex.:1898-1906,:1943-1951).- La revenirea in
do_adauga_articol(:12813-13086),poArticole scris incrsfacturaprinGather/Replace:(linii12956 Replace id_temp With Recno(), codmat With Nvl(poArticol.codmat, Space(50)), ; ... 12957 discountftva With poArticol.discount_unitar, discountctva With poArticol.discount_unitar_ctva, ; vdiscountftva With Nvl(poArticol.discount_unitar_val, 0), vdiscountctva With Nvl(poArticol.discount_unitar_ctva_val, 0)12956-12957; varianta pentru selectie multipla de articole la13003-13005). discount_unitarinitial (inainte de tastare) e preluat dincrsarticole(cursorul de stoc, populat inainte de deschiderea dialogului) prindo_initializeaza_articol(:13618si urm.):toArticol.discount_unitar = Nvl(toArticol.discount_unitar, 0)(:13630) — deci daca stocul / politica de pret vine deja cu un discount populat, acela e valoarea implicita afisata in dialog, pe care operatorul o poate suprascrie.- Cale suplimentara, directa: pe factura in valuta, cum
cVdiscountftvae editabil in grid (punctul 2), operatorul poate scrie si direct in celulavdiscountftvadingrd_factura— dar fara niciunValid/InteractiveChangepropriu definit pentru acea coloana infrm_facturare_articole(cautat explicitcVdiscountftva/cDiscountCTvain intervalul10968-15739: singurele hit-uri sunt definitiile de coloana siRemoveObject, niciun handler de eveniment) — editarea directa in grid NU declanseaza recalcularea automata avvaldiminuatftva/totaluri, doar modifica valoarea bruta incrsfactura.
4. Structura reala a coloanelor de discount pe VANZARI_DETALII
Concluzie: nu exista un CREATE TABLE VANZARI_DETALII in SCRIPTURI_CLAR (arhiva incepe din
2009, iar tabela exista deja atunci — coloana DISCOUNT_UNITAR era deja in uz in pachete PL/SQL
din 2009, deci a fost creata inainte de arhiva). Singura coloana de discount pe
VANZARI_DETALII/VANZARI_DETALII_TEMP gasita in SCRIPTURI_CLAR e DISCOUNT_UNITAR, si
singura modificare de tip/precizie inregistrata e cea din 2024.
Dovezi (cronologic, tot ce am gasit cu DISCOUNT in contextul acestei tabele):
- Nu exista niciun
CREATE TABLE VANZARI_DETALIIsauALTER TABLE VANZARI_DETALII ADD DISCOUNT...in toata arhivaSCRIPTURI_CLAR(2009-2026). Cel mai vechi hit peDISCOUNT_UNITARlegat de aceasta tabela e o declaratie de variabilaV_DISCOUNT_UNITAR VANZARI_DETALII.DISCOUNT_UNITAR%TYPEin pachetulPACK_FACTURARE, prezenta deja in scripturile din 2009 (ex.2009\9\ff_2009_09_03_01_FACTURARE_PACK_FACTURARE.sql) — coloana exista deja atunci. - Singura modificare de precizie gasita:
ff_2024_06_13_02_COMUN_FACTURARE.sql:3—alter table VANZARI_DETALII modify discount_unitar NUMBER(22,6);— si simetric pentruVANZARI_DETALII_TEMPla linia:9, si pentruCRM_POLITICI_PRET_ART(tabela de politici de pret) la linia:16. Deci forma finala confirmata:DISCOUNT_UNITAR NUMBER(22,6), o singura coloana de discount (valoare, nu procent), identica pe toate cele 3 tabele. - Nu exista alte coloane
DISCOUNT%/VDISCOUNT%la nivel Oracle peVANZARI_DETALII— cele patru campuri VFPdiscountftva/discountctva/vdiscountftva/vdiscountctvadincrsfacturaNU au corespondent 1:1 in schema Oracle; la scriere (Gather/Replaceindo_adauga_articol, punctul 3) doardiscount_unitar(si varianta cu TVA calculata din el) ajunge, prin campurile intermediare, la coloana unica Oracle. - Convenția de interogare a bazei de dezvoltare, gasita in
COMUN\docs\scripturi-migrare-db.md:36-40: sursa de referinta pentru DDL e schema de dezvoltareMARIUSM_AUTO(bazata peROA_CENTRAL), interogata pringoExecutor, niciodata o schema de client. Nu am rulat nimic pe baza — doar raportez conventia, asa cum a cerut sarcina.
5. Coloana de procent de discount pe VANZARI_DETALII / campul procdisc
Concluzie: nu exista o coloana de procent de discount pe VANZARI_DETALII (doar
DISCOUNT_UNITAR, o valoare absoluta). Campul procdisc din frm_facturare_articole2 e doar un
camp de lucru in grid, fara nicio scriere in cursorul local si fara corespondent Oracle —
practic un camp scaffolded si neconectat.
Dovezi:
- Cautare
DISCOUNT+PROCENT/PROCinff_2024_06_13_02_COMUN_FACTURARE.sql(scriptul care fixeaza forma finala a coloanelor de discount): nicio potrivire — confirma ca nu exista un "procent discount" ca si coloana peVANZARI_DETALII. procdiscapare o singura data in totofacturare.vc2:Column14.ControlSource = "procdisc"la:16721, in interiorul claseifrm_facturare_articole2(15741-19355— prototip, nu formularul in productie).- Nicio instructiune
Gather/Replace ... procdisc With ...in tot fisierul (cautat pe totofacturare.vc2) — camp fara sursa de populare in cod. - Toate celelalte aparitii de "procdisc" din fisier sunt de fapt variabila de memorie
gnMemProcDisc("memorare procent discount" — o optiune de aplicatie care controleaza daca procentul de discount tastat se retine intre articole,:2299,:2441,:12835etc.), fara legatura cu campul de cursorprocdisc. - Cautare
PROCDISCinSCRIPTURI_CLAR: doar 2 hit-uri, ambele in scripturi din 2015 pentru tabela de optiuni firma (co_2015_12_09_01_OPTIUNI.sql,ff_2015_12_09_01_OPTIUNI.sql) — legate de aceeasi optiunegnMemProcDisc, nu deVANZARI_DETALII.
Ce era gresit in afirmatiile de mai sus
- Formularea "linia 3, 9, 16" pentru coloana Oracle
DISCOUNT_UNITARgrupa laolalta 3 tabele diferite (VANZARI_DETALIIla:3,VANZARI_DETALII_TEMPla:9,CRM_POLITICI_PRET_ARTla:16) ca si cum ar fi acelasi lucru repetat de 3 ori — corect ca valoare (toate devinNUMBER(22,6)), dar sunt 3 tabele distincte, nu 3 confirmari ale aceleiasi coloane. - Cea mai importanta corectie: linia indicata pentru "de unde se scrie discountctva/vdiscountftva
— din
do_calculeaza_discount(ofacturare.vc2:13405-13424)" trimite la metoda gresita.frm_facturare_articole.do_calculeaza_discountde la acea linie calculeaza discountul global pe factura (Thisform.ndiscfactron/ndiscfactval), nu discountul pe linie. Metoda care chiar calculeazadiscount_unitar/discount_unitar_ctva(sursa reala pentrudiscountctvasivdiscountftva) efrm_articol_factura.do_calculeaza_discount, o metoda cu acelasi nume dar in alta clasa, laofacturare.vc2:1874-1976. Cele doua metode au nume identic dar apartin la doua clase diferite din acelasi fisier — o capcana reala de grep fara indexul de simboluri.
Necunoscute ramase
- Nu am verificat daca
crsarticole(cursorul de stoc din care pleacapoArticol.discount_unitarlado_initializeaza_articol:13630) e populat vreodata cu un discount nenul direct dintr-o interogare de politica de pret (CRM_POLITICI_PRET_ART) inainte de a ajunge in dialogulfrm_articol_factura— am gasit doar ca acea tabela are aceeasi coloanadiscount_unitar(NUMBER(22,6)), nu am urmarit interogarea SQL efectiva care umplecrsarticole/crsartselectate(cod probabil inPrograme/, in afaraofacturare.vc2, netrasat din lipsa de timp alocat). - Nu am confirmat pe date reale (Oracle) daca exista astazi randuri cu
DISCOUNT_UNITARpopulat peVANZARI_DETALIIprovenind din editarea directa in grid pe factura in valuta (punctul 2/3, ultimul paragraf) — doar am aratat ca acea cale exista in cod, fara handler de recalcul. - Nu am cautat daca
frm_facturare_articole2(prototipul) e instantiat undeva in productie sau e cu adevarat mort/nefolosit — task-ul l-a framat deja ca "prototip" si am pastrat presupunerea.