Files
comun/utile/Teste/editare_factura/test_s4b_dialog.prg
Marius Mutu 40a112a42d #6 editare factura emisa: S4b etapa 2 - butonul, dialogul si tipul lui id_articol
Enumerarea diferentelor dintre rulaje si articole capata interfata: buton pe
pagina de articole, dialog cu grid si comutator de directie, plus verificarea la
salvare. Dialogul propune, nu decide - aplicarea ramane o apasare explicita.

- omodificari.vc2: cmdSincronizeazaArticole pe PAGE3, dezactivat odata cu restul
  paginii cand documentul e blocat in eFactura; frm_sincronizare_articole,
  derivata din frm_termin_renunt. Gridul e legat de propunere_afisata, cursor
  stabil creat in Load si doar golit si reumplut - propunere_sincronizare se
  recreeaza la fiecare apel, deci o legare directa s-ar rupe la prima comutare
  de directie.
- id_articol trece de la I la N(20), in toate cele 6 locuri scrise pentru acest
  punct. Restul codebase-ului foloseste dintotdeauna N(20): valorile reale trec
  de 2^31 pe 89.8% din NOM_ARTICOLE, iar un camp I le trunchia tacit, asa incat
  potrivirea pe id_articol cadea si iesea perechea Adaugare+Semnalare in locul
  unei Modificari. Nu e o schimbare de design, e revenire la conventia casei.
- doua accesari This. in loc de Thisform. in Click-ul butonului de adaugare
  articol: proprietatile sunt ale formularului, iar scurtcircuitul OR le
  evalua exact cand documentul avea articole - orice click real dadea eroare.
- teste: test_s4b_dialog (35/0) acopera instantierea, comutarea directiei si
  aplicarea la salvare; test_s4b_sincronizare (42/0) capata cazul id_articol
  3598545102, care ar fi picat inainte de schimbarea de tip.

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

505 lines
21 KiB
Plaintext

* test_s4b_dialog.prg
* Smoke test pentru clasa noua frm_sincronizare_articole (COMUN\clase\omodificari.vc2, la finalul
* fisierului) - dialogul S4b etapa 2 (buton cmdSincronizeazaArticole + AfiseazaDialogSincronizareArticole
* in frm_modific2024). Complet headless, FARA Oracle: tvd/trul se construiesc in test (helperele
* AdaugaTvd/AdaugaTrul, copiate din test_s4b_sincronizare.prg, acelasi folder), dummyform (copiat din
* acelasi fisier) se refoloseste ca oFormArticole. Logica pura din spatele dialogului
* (ConstruiestePropunereSincronizare/AplicaSincronizareArticole, ofacturare_editare.prg) e deja
* acoperita de test_s4b_sincronizare.prg (35/0) - aici se verifica DOAR ca dialogul (Load/Init/
* ConstruiesteEnumerare/inainte_de_do_termin/Unload) leaga corect gridul de propunere_afisata,
* comuta directia fara sa dubleze/ramana cu randuri vechi, si activeaza/dezactiveaza But_termin1.
*
* Clasa e OF "_frm_child.vcx" (WindowType=1, modala), dar modalitatea se declanseaza la .Show(), nu
* la Createobject() - niciun test de aici cheama .Show(), deci nimic nu ramane blocat headless.
* Mediul de clase/proceduri e cel din Programe\roafacturare.prg (SET PATH + SET CLASSLIB, replicat
* aici ca sa rezolve lantul de mostenire _frm_child.vcx -> _frm_base.vcx -> _baza.vcx si controalele
* _grdrow/_optiongrup/_label), FARA test_init_env_auto (acela deschide o conexiune Oracle reala,
* nefolositoare aici si interzisa de scopul sarcinii).
*
* Nu scrie in Oracle. Nu da COMMIT. QUIT la final.
SET SAFETY OFF
SET TALK OFF
LOCAL lcLog
lcLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s4b_dialog_log.txt'
STRTOFILE('start ' + TTOC(DATETIME()) + CHR(13) + CHR(10), lcLog)
PUBLIC gcErrLog, gnPass, gnFail
gcErrLog = lcLog
gnPass = 0
gnFail = 0
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
IF Type('gnPC') <> 'N'
PUBLIC gnPC
gnPC = 2
ENDIF
*!* defensiv - Column.InputMask din grdPropunere foloseste get_mask(12,gnPCANT)/get_mask(12,gnPPRET);
*!* sub -A -T coloanele de grid nu se materializeaza (nu se evalueaza InputMask), dar le definim oricum
IF Type('gnPCANT') <> 'N'
PUBLIC gnPCANT
gnPCANT = 3
ENDIF
IF Type('gnPPRET') <> 'N'
PUBLIC gnPPRET
gnPPRET = 4
ENDIF
CLOSE DATABASES
Set Century On
Set Deleted On
Set Date To Dmy
Set Exact On
Set NullDisplay To ''
Set Decimals To 6
LOCAL gcAppPath, lcPath
gcAppPath = 'D:\ROA\ROAFACTURARE\'
SET DEFAULT TO (gcAppPath)
lcPath = gcAppPath + 'Date;' + ;
gcAppPath + 'Include;' + ;
gcAppPath + 'FERESTRE;' + ;
gcAppPath + 'GRAFICE;' + ;
gcAppPath + 'CLASE;' + ;
gcAppPath + 'MENIURI;' + ;
gcAppPath + 'PROGRAME;' + ;
gcAppPath + 'RAPOARTE;' + ;
gcAppPath + 'COMUN\CLASE;' + ;
gcAppPath + 'COMUN\FERESTRE;' + ;
gcAppPath + 'COMUN\PROGRAME;' + ;
gcAppPath + 'COMUN\GRAFICE;' + ;
gcAppPath + 'COMUN\RAPOARTE;' + ;
gcAppPath + 'COMUN\UTILE\CALENDAR;' + ;
gcAppPath + 'COMUN\UTILE\CTL32;' + ;
gcAppPath + 'COMUN\UTILE\HPDF;' + ;
gcAppPath + 'COMUN\UTILE\HPDF\REPORTOUTPUT;' + ;
gcAppPath + 'COMUN\UTILE\WEB;' + ;
gcAppPath + 'COMUN\UTILE\EMAIL;' + ;
gcAppPath + 'COMUN\UTILE\NFJSON;' + ;
gcAppPath + 'COMUN\UTILE\NFXML;' + ;
'D:\ROA\COMUNROA\'
SET PATH TO &lcPath ADDITIVE
*!* CLASE - lantul replicat din Programe\roafacturare.prg, fara init_program/Oracle
SET CLASSLIB TO (gcAppPath + 'comun\clase\appwiz.vcx') ADDITIVE
SET CLASSLIB TO registry ADDITIVE
SET CLASSLIB TO cauta_alfa_forms ADDITIVE
SET CLASSLIB TO ofacturare.vcx ADDITIVE
SET CLASSLIB TO ofacturare_comun.vcx ADDITIVE
SET CLASSLIB TO omodificari.vcx ADDITIVE
SET CLASSLIB TO accessibility.vcx ADDITIVE
SET CLASSLIB TO ocriterii.vcx ADDITIVE
SET CLASSLIB TO ctl32_statusbar.vcx ADDITIVE
SET CLASSLIB TO ctl32_common.vcx ADDITIVE
SET CLASSLIB TO ctl32_structs.vcx ADDITIVE
SET CLASSLIB TO ctl32_progressbar.vcx ADDITIVE
SET CLASSLIB TO DECABAZA ADDITIVE
SET CLASSLIB TO onomenclatoare ADDITIVE
SET CLASSLIB TO onomenclatoare2 ADDITIVE
SET CLASSLIB TO ofacturare ADDITIVE
SET CLASSLIB TO ofacturare_rapoarte ADDITIVE
SET CLASSLIB TO orapoarte ADDITIVE
SET CLASSLIB TO ferestre_oracle ADDITIVE
SET CLASSLIB TO Messagebox ADDITIVE
SET CLASSLIB TO otoolbar ADDITIVE
SET CLASSLIB TO onom_curs ADDITIVE
SET CLASSLIB TO comun ADDITIVE
SET CLASSLIB TO ferestre_cere_date ADDITIVE
SET CLASSLIB TO baza ADDITIVE
SET CLASSLIB TO caut ADDITIVE
SET CLASSLIB TO ointroduceri ADDITIVE
SET CLASSLIB TO serii_numere ADDITIVE
SET CLASSLIB TO caut_ora ADDITIVE
SET CLASSLIB TO wwdialogs.vcx ADDITIVE
SET CLASSLIB TO _calendar.vcx ADDITIVE
SET CLASSLIB TO locale ADDITIVE
SET CLASSLIB TO overificari ADDITIVE
SET CLASSLIB TO ocomenzi ADDITIVE
*!* PROCEDURI - doar cele chiar necesare logicii testate (fara Oracle)
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\proceduri_comune.prg ADDITIVE
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
*!* MEDIU - fara goApp, _frmbase.Init trimite .F. in SetFont si accessibility deschide GETFONT(),
*!* dialog modal care atarna rularea headless; gcAcces e cerut de actualizeaza_drepturi
PUBLIC goApp, gcAcces
gcAcces = [1;2;3;4;5;6;7;8;]
goApp = Createobject("wzApplication")
*============================================================================================
* T1 - instantiere pe dataset cu Modificare+Adaugare+Semnalare+N-A: fara eroare, propunere_afisata
* identica (camp cu camp) cu propunere_sincronizare, But_termin1.Enabled = .T.
*============================================================================================
CreeazaTvdTest()
CreeazaTrulTest()
AdaugaTvd(800, 2, 10, 1, 1, 'ARTICOL 800', 'COD800', 20)
AdaugaTrul(800, 4, 0, 16, 0, 1, '371', 1.19)
AdaugaTrul(900, 1, 0, 50, 0, 2, '371', 1.19)
AdaugaTvd(1000, 1, 1, 1, 1, 'ARTICOL 1000', 'COD1000', 1)
AdaugaTvd(1100, 1, 1, 1, 0, 'ARTICOL 1100', 'COD1100', 1)
LOCAL loForm1
loForm1 = Createobject('frm_sincronizare_articole')
DO asserteaza WITH 'T1 instantiere fara eroare (Modificare+Adaugare+Semnalare+N-A)', ;
Vartype(loForm1) == 'O' AND Upper(loForm1.Class) == 'FRM_SINCRONIZARE_ARTICOLE', TRANSFORM(Vartype(loForm1))
IF Vartype(loForm1) == 'O'
DO asserteaza WITH 'T1 propunere_afisata exista si e deschisa', Used('propunere_afisata'), ''
DO asserteaza WITH 'T1 propunere_sincronizare exista (sursa copiata de ConstruiesteEnumerare)', Used('propunere_sincronizare'), ''
IF Used('propunere_afisata') AND Used('propunere_sincronizare')
DO asserteaza WITH 'T1 propunere_afisata are 4 randuri (800 Modificare, 900 Adaugare, 1000 Semnalare, 1100 N-A)', ;
Reccount('propunere_afisata') == 4, TRANSFORM(Reccount('propunere_afisata'))
DO asserteaza WITH 'T1 acelasi numar de randuri in propunere_sincronizare si propunere_afisata', ;
Reccount('propunere_sincronizare') == Reccount('propunere_afisata'), ;
TRANSFORM(Reccount('propunere_sincronizare')) + '/' + TRANSFORM(Reccount('propunere_afisata'))
LOCAL lnMismatch1
lnMismatch1 = VerificaCursoareIdentice('propunere_sincronizare', 'propunere_afisata')
DO asserteaza WITH 'T1 propunere_afisata identica camp-cu-camp cu propunere_sincronizare', lnMismatch1 == 0, TRANSFORM(lnMismatch1)
ENDIF
DO asserteaza WITH 'T1 But_termin1.Enabled = .T. (exista Modificare 800 si Adaugare 900)', loForm1.But_termin1.Enabled, TRANSFORM(loForm1.But_termin1.Enabled)
loForm1.Release()
ENDIF
*============================================================================================
* T2 - But_termin1.Enabled = .F. cand propunerea e goala (document identic)
*============================================================================================
CreeazaTvdTest()
CreeazaTrulTest()
AdaugaTvd(100, 5, 10, 1, 1, 'ARTICOL 100', 'COD100', 50)
AdaugaTrul(100, 5, 0, 10, 0, 1, '371', 1)
LOCAL loForm2
loForm2 = Createobject('frm_sincronizare_articole')
DO asserteaza WITH 'T2 instantiere pe document identic: fara eroare', Vartype(loForm2) == 'O', TRANSFORM(Vartype(loForm2))
IF Vartype(loForm2) == 'O'
DO asserteaza WITH 'T2 propunere_afisata goala (nimic de sincronizat)', Reccount('propunere_afisata') == 0, TRANSFORM(Reccount('propunere_afisata'))
DO asserteaza WITH 'T2 But_termin1.Enabled = .F. (propunere goala)', !loForm2.But_termin1.Enabled, TRANSFORM(loForm2.But_termin1.Enabled)
loForm2.Release()
ENDIF
*============================================================================================
* T2b - But_termin1.Enabled = .F. cand propunerea contine DOAR N-A/Semnalare (niciun aplicabil)
*============================================================================================
CreeazaTvdTest()
CreeazaTrulTest()
AdaugaTvd(500, 1, 99, 1, 0, 'ARTICOL 500 SERVICIU', 'COD500', 99)
AdaugaTvd(1000, 1, 1, 1, 1, 'ARTICOL 1000', 'COD1000', 1)
LOCAL loForm2b
loForm2b = Createobject('frm_sincronizare_articole')
DO asserteaza WITH 'T2b instantiere pe document doar N-A/Semnalare: fara eroare', Vartype(loForm2b) == 'O', TRANSFORM(Vartype(loForm2b))
IF Vartype(loForm2b) == 'O'
DO asserteaza WITH 'T2b propunere_afisata are 2 randuri (500 N-A, 1000 Semnalare), niciunul aplicabil', ;
Reccount('propunere_afisata') == 2, TRANSFORM(Reccount('propunere_afisata'))
DO asserteaza WITH 'T2b But_termin1.Enabled = .F. (doar N-A/Semnalare)', !loForm2b.But_termin1.Enabled, TRANSFORM(loForm2b.But_termin1.Enabled)
loForm2b.Release()
ENDIF
*============================================================================================
* T3 - comutarea directiei: optDirectie.Click() reumple propunere_afisata (nu dubleaza, nu ramane veche)
*============================================================================================
CreeazaTvdTest()
CreeazaTrulTest()
AdaugaTvd(800, 2, 10, 1, 1, 'ARTICOL 800', 'COD800', 20)
AdaugaTrul(800, 4, 0, 16, 0, 1, '371', 1.19)
AdaugaTrul(900, 1, 0, 50, 0, 2, '371', 1.19)
AdaugaTvd(1000, 1, 1, 1, 1, 'ARTICOL 1000', 'COD1000', 1)
LOCAL loForm3
loForm3 = Createobject('frm_sincronizare_articole')
DO asserteaza WITH 'T3 instantiere: fara eroare', Vartype(loForm3) == 'O', TRANSFORM(Vartype(loForm3))
IF Vartype(loForm3) == 'O'
DO asserteaza WITH 'T3 initial (RUL_SURSA implicit): 3 randuri (800 Modificare, 900 Adaugare, 1000 Semnalare)', ;
Reccount('propunere_afisata') == 3, TRANSFORM(Reccount('propunere_afisata'))
SELECT propunere_afisata
LOCATE FOR id_articol == 900
DO asserteaza WITH 'T3 initial: 900 e Adaugare (doar in trul)', Found() AND Alltrim(actiune) == 'Adaugare', Iif(Found(), Alltrim(actiune), 'lipsa')
LOCATE FOR id_articol == 1000
DO asserteaza WITH 'T3 initial: 1000 e Semnalare (doar in tvd, stocat)', Found() AND Alltrim(actiune) == 'Semnalare', Iif(Found(), Alltrim(actiune), 'lipsa')
loForm3.optDirectie.Value = 2
loForm3.optDirectie.Click()
DO asserteaza WITH 'T3 dupa comutare: cDirectie == ARTICOLE_SURSA', Alltrim(loForm3.cDirectie) == 'ARTICOLE_SURSA', loForm3.cDirectie
DO asserteaza WITH 'T3 dupa comutare: propunere_afisata tot 3 randuri (reumpluta, nu dublata)', ;
Reccount('propunere_afisata') == 3, TRANSFORM(Reccount('propunere_afisata'))
SELECT propunere_afisata
LOCATE FOR id_articol == 900
DO asserteaza WITH 'T3 dupa comutare: 900 e acum Semnalare (rolul s-a inversat, nu a ramas Adaugare)', ;
Found() AND Alltrim(actiune) == 'Semnalare', Iif(Found(), Alltrim(actiune), 'lipsa')
LOCATE FOR id_articol == 1000
DO asserteaza WITH 'T3 dupa comutare: 1000 e acum Adaugare (rolul s-a inversat)', ;
Found() AND Alltrim(actiune) == 'Adaugare', Iif(Found(), Alltrim(actiune), 'lipsa')
LOCATE FOR id_articol == 800
DO asserteaza WITH 'T3 dupa comutare: 800 tot Modificare (in ambele directii)', ;
Found() AND Alltrim(actiune) == 'Modificare', Iif(Found(), Alltrim(actiune), 'lipsa')
loForm3.Release()
ENDIF
*============================================================================================
* T4 - inainte_de_do_termin() aplica efectiv in tvd (RUL_SURSA), cu oFormArticole = dummyform
*============================================================================================
CreeazaTvdTest()
CreeazaTrulTest()
AdaugaTvd(800, 2, 10, 1, 1, 'ARTICOL 800', 'COD800', 20)
AdaugaTrul(800, 4, 0, 16, 0, 1, '371', 1.19)
AdaugaTrul(900, 1, 0, 50, 0, 2, '371', 1.19)
LOCAL loDummy4, loForm4, llRet4
loDummy4 = Createobject('dummyform')
loForm4 = Createobject('frm_sincronizare_articole')
DO asserteaza WITH 'T4 instantiere: fara eroare', Vartype(loForm4) == 'O', TRANSFORM(Vartype(loForm4))
IF Vartype(loForm4) == 'O'
loForm4.oFormArticole = loDummy4
llRet4 = loForm4.inainte_de_do_termin()
DO asserteaza WITH 'T4 inainte_de_do_termin() intoarce .T.', llRet4 == .T., TRANSFORM(llRet4)
SELECT tvd
LOCATE FOR id_articol == 800
DO asserteaza WITH 'T4 aplicat in tvd: 800 modificat (cantitate=4, pret=16)', Found() AND cantitate == 4 AND pret == 16, ;
TRANSFORM(cantitate) + '/' + TRANSFORM(pret)
LOCATE FOR id_articol == 900
DO asserteaza WITH 'T4 aplicat in tvd: 900 adaugat (linie noua, cantitate=1, pret=50)', Found() AND cantitate == 1 AND pret == 50, ;
TRANSFORM(cantitate) + '/' + TRANSFORM(pret)
DO asserteaza WITH 'T4 dummyform.AdaugaLinieTvdDinArticol apelat o singura data (Adaugarea 900)', loDummy4.nAdaugaCalls == 1, TRANSFORM(loDummy4.nAdaugaCalls)
DO asserteaza WITH 'T4 dummyform.ActualizeazaBaraTotaluri apelat (Pemstatus + lnAplicate>0)', loDummy4.nBaraCalls >= 1, TRANSFORM(loDummy4.nBaraCalls)
loForm4.Release()
ENDIF
*============================================================================================
* T5 - oFormArticole ramas .F. (implicit): nicio eroare, se aplica tot REPLACE-ul de baza pe tvd
*============================================================================================
CreeazaTvdTest()
CreeazaTrulTest()
AdaugaTvd(800, 2, 10, 1, 1, 'ARTICOL 800', 'COD800', 20)
AdaugaTrul(800, 4, 0, 16, 0, 1, '371', 1.19)
LOCAL loForm5, llRet5
loForm5 = Createobject('frm_sincronizare_articole')
DO asserteaza WITH 'T5 instantiere: fara eroare', Vartype(loForm5) == 'O', TRANSFORM(Vartype(loForm5))
IF Vartype(loForm5) == 'O'
DO asserteaza WITH 'T5 oFormArticole implicit e .F. (nesetat)', Vartype(loForm5.oFormArticole) == 'L' AND !loForm5.oFormArticole, TRANSFORM(Vartype(loForm5.oFormArticole))
llRet5 = loForm5.inainte_de_do_termin()
DO asserteaza WITH 'T5 inainte_de_do_termin() cu oFormArticole=.F.: fara eroare, intoarce .T.', llRet5 == .T., TRANSFORM(llRet5)
SELECT tvd
LOCATE FOR id_articol == 800
DO asserteaza WITH 'T5 REPLACE de baza tot s-a aplicat pe 800 (cantitate=4, pret=16), fara toForm', Found() AND cantitate == 4 AND pret == 16, ;
TRANSFORM(cantitate) + '/' + TRANSFORM(pret)
loForm5.Release()
ENDIF
*============================================================================================
* T6 - Unload/Release inchide propunere_afisata
*============================================================================================
CreeazaTvdTest()
CreeazaTrulTest()
AdaugaTvd(100, 5, 10, 1, 1, 'ARTICOL 100', 'COD100', 50)
AdaugaTrul(100, 5, 0, 10, 0, 1, '371', 1)
LOCAL loForm6
loForm6 = Createobject('frm_sincronizare_articole')
DO asserteaza WITH 'T6 instantiere: fara eroare', Vartype(loForm6) == 'O', TRANSFORM(Vartype(loForm6))
IF Vartype(loForm6) == 'O'
DO asserteaza WITH 'T6 inainte de Release: propunere_afisata deschisa', Used('propunere_afisata'), ''
loForm6.Release()
DO asserteaza WITH 'T6 dupa Release: propunere_afisata inchisa (Unload a facut Use In)', !Used('propunere_afisata'), TRANSFORM(Used('propunere_afisata'))
ENDIF
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), lcLog, 1)
IF Used('tvd')
Use In tvd
ENDIF
IF Used('trul')
Use In trul
ENDIF
IF Used('propunere_sincronizare')
Use In propunere_sincronizare
ENDIF
IF Used('propunere_afisata')
Use In propunere_afisata
ENDIF
QUIT
*!* --- helpere de constructie a cursoarelor de test (copiate din test_s4b_sincronizare.prg) ---
PROCEDURE CreeazaTvdTest
CreeazaCursorArticoleGol('tvd')
ENDPROC
PROCEDURE CreeazaTrulTest
IF Used('trul')
Use In trul
ENDIF
CREATE CURSOR trul (id_articol I, denumire C(100), codmat C(30), um C(10), cant N(12,3), cante N(12,3), ;
pretvtva N(14,4), id_tip_rulaj I, sters I, id_gestiune I, cont C(20), proc_tvav N(6,4))
ENDPROC
*!* adauga o linie in tvd, cu valoarea data explicit (nu recalculata aici - fixture, nu logica de productie)
PROCEDURE AdaugaTvd
LPARAMETERS tnIdArticol, tnCantitate, tnPret, tnPretCuTva, tnInStoc, tcDenumire, tcCodmat, tnValoare
SELECT tvd
APPEND BLANK
REPLACE id_vanzare WITH 1, id_vanzare_det WITH Recno('tvd'), id_articol WITH m.tnIdArticol, ;
cantitate WITH m.tnCantitate, pret WITH m.tnPret, pret_cu_tva WITH m.tnPretCuTva, proc_tvav WITH 1, ;
discount_unitar WITH 0, sters WITH 0, denumire WITH m.tcDenumire, codmat WITH m.tcCodmat, ;
in_stoc WITH m.tnInStoc, valoare WITH m.tnValoare, lmodificat WITH .F. IN tvd
ENDPROC
*!* adauga o linie in trul: id_articol, cant, cante, pretvtva, id_tip_rulaj, id_gestiune, cont, proc_tvav
PROCEDURE AdaugaTrul
LPARAMETERS tnIdArticol, tnCant, tnCante, tnPretvtva, tnIdTipRulaj, tnIdGestiune, tcCont, tnProcTvav
SELECT trul
APPEND BLANK
REPLACE id_articol WITH m.tnIdArticol, cant WITH m.tnCant, cante WITH m.tnCante, pretvtva WITH m.tnPretvtva, ;
id_tip_rulaj WITH m.tnIdTipRulaj, sters WITH 0, um WITH 'BUC', id_gestiune WITH m.tnIdGestiune, ;
cont WITH m.tcCont, proc_tvav WITH m.tnProcTvav, denumire WITH 'ARTICOL ' + Transform(m.tnIdArticol), ;
codmat WITH 'COD' + Transform(m.tnIdArticol) IN trul
ENDPROC
*!* compara doua cursoare cu structura identica (id_articol/denumire/codmat/cantitate_veche/cantitate_noua/
*!* pret_vechi/pret_nou/actiune/motiv), matching pe id_articol; intoarce numarul de randuri nepotrivite
*!* (lipsa in tinta sau cu vreun camp diferit)
PROCEDURE VerificaCursoareIdentice
LPARAMETERS tcSursa, tcTinta
LOCAL lnMismatch, lnIdArt, lcDenSursa, lcCodSursa, lnCvSursa, lnCnSursa, lnPvSursa, lnPnSursa, lcActSursa, lcMotSursa
lnMismatch = 0
SELECT (tcSursa)
SCAN
lnIdArt = id_articol
lcDenSursa = Alltrim(denumire)
lcCodSursa = Alltrim(codmat)
lnCvSursa = cantitate_veche
lnCnSursa = cantitate_noua
lnPvSursa = pret_vechi
lnPnSursa = pret_nou
lcActSursa = Alltrim(actiune)
lcMotSursa = Alltrim(motiv)
SELECT (tcTinta)
LOCATE FOR id_articol == m.lnIdArt
IF !Found()
lnMismatch = lnMismatch + 1
ELSE
IF !(Alltrim(denumire) == m.lcDenSursa AND Alltrim(codmat) == m.lcCodSursa AND ;
cantitate_veche == m.lnCvSursa AND cantitate_noua == m.lnCnSursa AND ;
pret_vechi == m.lnPvSursa AND pret_nou == m.lnPnSursa AND ;
Alltrim(actiune) == m.lcActSursa AND Alltrim(motiv) == m.lcMotSursa)
lnMismatch = lnMismatch + 1
ENDIF
ENDIF
SELECT (tcSursa)
ENDSCAN
RETURN m.lnMismatch
ENDPROC
PROCEDURE asserteaza
LPARAMETERS tcNume, tlConditie, tcValoare
IF m.tlConditie
gnPass = gnPass + 1
STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1)
ELSE
gnFail = gnFail + 1
STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + m.tcValoare + ')' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
*!* test-double pentru frm_modific2024 - oglindeste EXACT calculeaza_valori_articol/AdaugaLinieTvdDinArticol/
*!* ActualizeazaBaraTotaluri din omodificari.vc2, copiat din test_s4b_sincronizare.prg (acelasi folder)
DEFINE CLASS dummyform AS Custom
nCalcCalls = 0
nAdaugaCalls = 0
nBaraCalls = 0
PROCEDURE calculeaza_valori_articol
LOCAL lnCantitate, lnPretNet, lnProcTvav, lnValoare
This.nCalcCalls = This.nCalcCalls + 1
SELECT tvd
lnCantitate = Nvl(cantitate,0)
lnPretNet = Nvl(pret,0) - Nvl(discount_unitar,0)
lnProcTvav = Nvl(proc_tvav,1)
lnValoare = Round(m.lnCantitate * Iif(Nvl(pret_cu_tva,0) = 0, m.lnPretNet * m.lnProcTvav, m.lnPretNet), gnPC)
REPLACE lmodificat WITH .T., valoare WITH m.lnValoare IN tvd
This.ActualizeazaBaraTotaluri()
ENDPROC
PROCEDURE AdaugaLinieTvdDinArticol
LPARAMETERS toArticol
LOCAL lnPretRon, lnDiscountRon, lnPret, lnDiscount
This.nAdaugaCalls = This.nAdaugaCalls + 1
lnPretRon = Iif(toArticol.preturi_cu_tva = 0, toArticol.pretftva, toArticol.pretctva)
lnDiscountRon = Iif(toArticol.preturi_cu_tva = 0, toArticol.discount_unitar, toArticol.discount_unitar_ctva)
lnPret = m.lnPretRon * 1 / 1
lnDiscount = m.lnDiscountRon * 1 / 1
SELECT tvd
APPEND BLANK
REPLACE id_vanzare WITH 1, id_vanzare_det WITH 0, id_articol WITH toArticol.id_articol, ;
cantitate WITH toArticol.cantitate, pret WITH m.lnPret, pret_cu_tva WITH toArticol.preturi_cu_tva, ;
proc_tvav WITH toArticol.proc_tvav, discount_unitar WITH m.lnDiscount, ;
id_gestiune WITH toArticol.id_gestiune, cont WITH toArticol.Cont, sters WITH 0, ;
denumire WITH toArticol.denumire, codmat WITH toArticol.codmat, ;
pret_achizitie WITH Nvl(toArticol.pret_achizitie,0), lmodificat WITH .T. IN tvd
This.calculeaza_valori_articol()
ENDPROC
PROCEDURE ActualizeazaBaraTotaluri
This.nBaraCalls = This.nBaraCalls + 1
ENDPROC
ENDDEFINE