* test_s5_al_doilea_intrare.prg * Inchide golul "al doilea punct de intrare" din docs\livrare_s5.md, sectiunea 5: agatarea din * comun.vc2:2491-2493 (afisjurcom.do_modifica, "Registrul jurnal" ROACONT/ROAGEST, textual identica * cu cea din ofacturare_comun.vc2:3828-3830, deja testata cu scriere reala in test_s5_scriere_reala.prg) * nu trecuse inca prin nicio scriere reala. * * Diferenta functionala fata de do_editare_factura (frm_facturi), singura care conteaza pentru acest * test: afisjurcom.do_modifica NU apeleaza IncarcaVanzareDinNota direct - apeleaza * PregatesteArticoleFacturaEditare('tact') (comun.vc2:2436) INAINTE de Createobject(frm_modific2024), * care populeaza tvanz (si crsArticoleFactura) pe alta cale de cod. Testul reproduce EXACT secventa * comun.vc2:2222-2569 (do_modifica), mai putin partea de UI (grid-ul actjur, frm_modific2024 - nu * garda "Used('tvanz') And Reccount('tvanz')=1" testata prin PregatesteArticoleFacturaEditare reala, * nici SCAN pe articole, care ramane la verificarea vizuala a lui Marius, per briefing), pe aceeasi * nota folosita deja de test_s5_scriere_reala.prg/test_s5_discount_valuta.prg (id_vanzare=1049) - * SINGURA din documentele de test cunoscute care are simultan rand real in VANZARI si nota in luna * curenta (cerinta lui afisjurcom.do_modifica, linia 2265-2268). * * Fara nicio modificare de articole (ca in blocul C din test_s5_discount_valuta.prg): dovedeste ca * PE ACEASTA CALE lnSucces ajunge > 0 dupa finalizeaza_modificare_nota, garda noua se satisface real * (nu doar static) si ScrieArticoleFacturaEditate se executa cu tvanz.id_vanzare corect. Tranzactia * se inchide cu COMMIT (Thisform.do_inchide_tranzactie(Iif(lnSucces<0,2,1)), comun.vc2:2541) - lantul * reuseste, deci NU ROLLBACK (spre deosebire de celelalte suite S5 cu esec provocat deliberat). * * ATENTIE - GASIT SI REPARAT IN TIMPUL SCRIERII ACESTUI TEST (nu ramane in fisierul final): o prima * varianta apela ScrieArticoleFacturaEditate FARA sa incarce intai 'tvd' (frm_modific2024, sarit aici * deliberat, e cel care il populeaza in fluxul real, din crsArticoleFactura). Garda externa * (Used('tvanz') And Reccount('tvanz')=1) s-a satisfacut, dar garda INTERNA de no-op a helperului * (!Used('tvd')) a facut din apel un no-op TACUT (intoarce tot .T.) - fara sa corecteze reset-ul * STERS=0 pe care actualizeaza_vanzari il face pe TOT documentul (acelasi mecanism documentat in * rec_s5_scriere_reala.md), iar tranzactia a COMMIS reset-ul necorectat: o linie definitiv stearsa * in testele anterioare (det=1582, id_vanzare=1049) a fost reinviata real in Oracle. Reparat imediat * (UPDATE vanzari_detalii SET STERS=1 WHERE id_vanzare_det=1582, COMMIT, verificat prin sqlplus) - * varianta finala incarca 'tvd' cu IncarcaArticoleFactura chiar dupa PregatesteArticoleFacturaEditare * (ca sa reproduca ce ar face Load()-ul lui frm_modific2024), deci helperul chiar corecteaza reset-ul, * la fel ca in fluxul real. CONSUMA UN COD (finalizeaza_modificare_nota il realoca la orice salvare, * chiar fara modificari de articole - acelasi efect ca blocul C din test_s5_discount_valuta.prg). * * Harness: do_deschide/inchide_tranzactie reproduse inline dupa _frm_base.vc2:252-302 (identic cu * celelalte suite S5 cu scriere reala). Nu atinge cod de aplicatie, nu instantiaza afisjurcom sau * frm_modific2024 (evita riscul de UI blocanta headless). QUIT la final. SET SAFETY OFF SET TALK OFF LOCAL lcLog lcLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s5_al_doilea_intrare_log.txt' STRTOFILE('start ' + TTOC(DATETIME()) + CHR(13) + CHR(10), lcLog) PUBLIC gcErrLog, gcTestLog, gnPass, gnFail gcErrLog = lcLog gcTestLog = lcLog gnPass = 0 gnFail = 0 ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg ADDITIVE DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' IF gnHandle <= 0 STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), lcLog, 1) QUIT ENDIF SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\oscrie_in_fisiere.prg ADDITIVE PUBLIC gnIdVanzareTest gnIdVanzareTest = 1049 DO test_al_doilea_intrare WITH gnIdVanzareTest, lcLog STRTOFILE(CHR(13) + CHR(10) + 'REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), lcLog, 1) STRTOFILE('done ' + TTOC(DATETIME()) + CHR(13) + CHR(10), lcLog, 1) QUIT PROCEDURE asserteaza LPARAMETERS tcNume, tlConditie, tcValoare IF m.tlConditie gnPass = gnPass + 1 STRTOFILE('PASS ' + m.tcNume + ' [' + m.tcValoare + ']' + CHR(13) + CHR(10), gcTestLog, 1) ELSE gnFail = gnFail + 1 STRTOFILE('FAIL ' + m.tcNume + ' [' + m.tcValoare + ']' + CHR(13) + CHR(10), gcTestLog, 1) ENDIF ENDPROC *-- executa SELECT-ul prin goExecutor (cai care CITESC - fara risc) si intoarce codul de succes PROCEDURE ExecSel LPARAMETERS tcSql, tcCursor LOCAL lnQ IF USED(tcCursor) USE IN (tcCursor) ENDIF lnQ = goExecutor.oExecute(tcSql, tcCursor) RETURN lnQ ENDPROC *-- reproduce _frm_base.vc2:252-265 (do_deschide_tranzactie / Thisform.do_deschide_tranzactie()), *-- fara sa instantieze niciun formular PROCEDURE MyDeschideTranzactie LOCAL llReturn, lnSuccesLocal IF TYPE('goExecutor') = 'O' goExecutor.oExecuta([select * from dual]) ENDIF lnSuccesLocal = SQLSetprop(gnHandle, "Transactions", 2) llReturn = IIF(lnSuccesLocal < 0, .F., .T.) RETURN llReturn ENDPROC *-- reproduce _frm_base.vc2:279-302 (do_inchide_tranzactie / Thisform.do_inchide_tranzactie()), *-- fara sa instantieze niciun formular PROCEDURE MyInchideTranzactie LPARAMETERS tnTip LOCAL llReturn, lnSuccesLocal IF tnTip = 1 lnSuccesLocal = SQLCOMMIT(gnHandle) ELSE lnSuccesLocal = SQLROLLBACK(gnHandle) ENDIF IF lnSuccesLocal < 0 llReturn = .F. ELSE lnSuccesLocal = SQLSetprop(gnHandle, "Transactions", 1) llReturn = IIF(lnSuccesLocal < 0, .F., .T.) ENDIF RETURN llReturn ENDPROC PROCEDURE test_al_doilea_intrare LPARAMETERS tnIdVanzare, tcLog *-- pnAn/pnLuna/lnCod/lnIdFact/lnIdfactd/lnIdSet/pdDataOra PRIVATE - finalizeaza_modificare_nota *-- foloseste ?pnLuna/?pnAn/?pdDataOra ca bind-variabile in josul stivei (comun.vc2:2487-2488) PRIVATE pnAn, pnLuna, lnCod, lnIdFact, lnIdfactd, lnIdSet, pdDataOra LOCAL lcSql, lnQ, lnSters, llEProforma, llSters, llGestInvantar, llRul, lnSucces LOCAL lnCodInainte, lnCodDupa, lnDiscInainte, lnFtvaInainte, lnTvaInainte, lnCtvaInainte LOCAL lnDiscDupa, lnFtvaDupa, lnTvaDupa, lnCtvaDupa, lnNrLiniiInainte, lnNrLiniiDupa LOCAL llBlocExecutat llBlocExecutat = .F. STRTOFILE(CHR(13) + CHR(10) + '========== al doilea punct de intrare (afisjurcom.do_modifica, comun.vc2:2222-2569), ' + ; 'id_vanzare=' + TRANSFORM(tnIdVanzare) + ' ==========' + CHR(13) + CHR(10), tcLog, 1) *-- starea documentului INAINTE, citita direct din VANZARI (echivalentul "cod-ul se realoca la fiecare salvare") lcSql = [select cod, nvl(sters,0) as sters, discount, total_fara_tva, total_tva, total_cu_tva, ] + ; [extract(year from data_act) as anact, extract(month from data_act) as lunaact ] + ; [from vanzari where id_vanzare = ] + TRANSFORM(tnIdVanzare) lnQ = ExecSel(lcSql, 'v_vz0') IF lnQ <= 0 OR RECCOUNT('v_vz0') <> 1 DO asserteaza WITH '0: VANZARI citit', .F., 'lnQ=' + TRANSFORM(lnQ) RETURN ENDIF SELECT v_vz0 lnCod = cod lnCodInainte = cod lnDiscInainte = NVL(discount, 0) lnFtvaInainte = total_fara_tva lnTvaInainte = total_tva lnCtvaInainte = total_cu_tva USE IN v_vz0 lcSql = [select count(*) as nr from vanzari_detalii where id_vanzare = ] + TRANSFORM(tnIdVanzare) + [ and sters = 0] lnQ = ExecSel(lcSql, 'v_cnt0') lnNrLiniiInainte = IIF(lnQ > 0, v_cnt0.nr, -1) USE IN v_cnt0 STRTOFILE(' VANZARI inainte: cod=' + TRANSFORM(lnCodInainte) + ' discount=' + TRANSFORM(lnDiscInainte) + ; ' ftva=' + TRANSFORM(lnFtvaInainte) + ' tva=' + TRANSFORM(lnTvaInainte) + ' ctva=' + TRANSFORM(lnCtvaInainte) + ; ' linii active=' + TRANSFORM(lnNrLiniiInainte) + CHR(13) + CHR(10), tcLog, 1) *-- 1) "Select actjur" (comun.vc2:2253-2263) - un rand din vact_tot, exact ca gridul registrului jurnal lcSql = [select cod, an, luna, id_set, sters, id_fact, id_factd, dataora from vact_tot ] + ; [where cod = ] + TRANSFORM(lnCod) + [ and rownum = 1] lnQ = ExecSel(lcSql, 'actjur') IF lnQ <= 0 OR RECCOUNT('actjur') <> 1 DO asserteaza WITH '1: actjur (randul din registrul jurnal) gasit pentru cod=' + TRANSFORM(lnCod), .F., 'lnQ=' + TRANSFORM(lnQ) RETURN ENDIF SELECT actjur pnAn = an pnLuna = luna lnIdSet = id_set lnSters = sters lnIdFact = id_fact lnIdfactd = id_factd pdDataOra = NULL STRTOFILE(' actjur: cod=' + TRANSFORM(lnCod) + ' an/luna=' + TRANSFORM(pnAn) + '/' + TRANSFORM(pnLuna) + ; ' id_set=' + TRANSFORM(lnIdSet) + ' sters=' + TRANSFORM(lnSters) + ' id_fact=' + TRANSFORM(lnIdFact) + CHR(13) + CHR(10), tcLog, 1) *-- 2) garzile din do_modifica (comun.vc2:2265-2290), fara UI DO asserteaza WITH '2: nota din luna curenta (garda comun.vc2:2265)', (pnAn * 12) + pnLuna = (gnAn * 12) + gnLuna, ; TRANSFORM(pnAn) + '/' + TRANSFORM(pnLuna) + ' vs curent ' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) IF (pnAn * 12) + pnLuna <> (gnAn * 12) + gnLuna RETURN ENDIF DO asserteaza WITH '3: id_set NU e in intervalul ROAPRODUCTIE (30000-30009, comun.vc2:2278)', !BETWEEN(lnIdSet, 30000, 30009), TRANSFORM(lnIdSet) IF BETWEEN(lnIdSet, 30000, 30009) RETURN ENDIF llSters = (lnSters = 1) DO asserteaza WITH '4: nota nu e deja stearsa (llSters=.F.)', !llSters, TRANSFORM(lnSters) llGestInvantar = (lnIdSet = 90101) DO asserteaza WITH '5: nu e nota de inventariere (id_set<>90101, ramura pdDataOra=actjur.dataora nu se activeaza)', !llGestInvantar, TRANSFORM(lnIdSet) IF llGestInvantar pdDataOra = actjur.dataora ENDIF *-- 3) cursoarele notei (actactan/tact/trul/trul_obinv) - identic cu comun.vc2:2313-2427, *-- deja extras ca helper si folosit de test_s5_scriere_reala.prg pe aceeasi nota IF !IncarcaCursoareModificareNota(lnCod, pnAn, pnLuna, .F.) DO asserteaza WITH '6: IncarcaCursoareModificareNota', .F., 'a esuat' RETURN ENDIF DO asserteaza WITH '6: nota are randuri in actactan/tact', RECCOUNT('actactan') > 0, TRANSFORM(RECCOUNT('actactan')) IF RECCOUNT('actactan') = 0 RETURN ENDIF *-- 4) cu_Tva pe tact - a doua reasignare, comun.vc2:2433 (identica cu ofacturare_comun.vc2/test_s5_scriere_reala.prg) SELECT a.*, IIF(NVL(id_jtva_coloana, 0) = 0, 0, 1) AS cu_Tva FROM tact a INTO CURSOR tact READWRITE *-- 5) PregatesteArticoleFacturaEditare('tact') - comun.vc2:2436, DIFERENTA functionala fata de *-- ofacturare_comun.vc2/do_editare_factura (care apeleaza IncarcaVanzareDinNota direct); aici *-- populeaza tvanz SI crsArticoleFactura, calea specifica acestui punct de intrare IF USED('tvanz') USE IN tvanz ENDIF IF USED('crsArticoleFactura') USE IN crsArticoleFactura ENDIF LOCAL llGasitTvanz llGasitTvanz = PregatesteArticoleFacturaEditare('tact') DO asserteaza WITH '7: PregatesteArticoleFacturaEditare gaseste documentul in VANZARI (calea specifica acestui punct de intrare)', ; llGasitTvanz, TRANSFORM(llGasitTvanz) DO asserteaza WITH '8: garda noua satisfacuta REAL (nu static): Used(tvanz) And Reccount(tvanz)=1', ; USED('tvanz') AND RECCOUNT('tvanz') = 1, 'Used=' + TRANSFORM(USED('tvanz')) + ' Reccount=' + IIF(USED('tvanz'), TRANSFORM(RECCOUNT('tvanz')), '-') DO asserteaza WITH '9: tvanz.id_vanzare corect (populat de PregatesteArticoleFacturaEditare, nu presupus)', ; USED('tvanz') AND RECCOUNT('tvanz') = 1 AND tvanz.id_vanzare = tnIdVanzare, ; IIF(USED('tvanz') AND RECCOUNT('tvanz') = 1, TRANSFORM(tvanz.id_vanzare), 'tvanz gol') DO asserteaza WITH '10: crsArticoleFactura precarcat (acelasi apel)', USED('crsArticoleFactura'), TRANSFORM(USED('crsArticoleFactura')) *-- frm_modific2024 SARIT (nu se instantiaza - risc de UI blocanta headless, verificare vizuala *-- ramane la Marius, per briefing); buton=1 fortat direct, ca in celelalte suite S5. In fluxul *-- real, Load()-ul formularului populeaza 'tvd' din crsArticoleFactura - reprodus aici explicit, *-- FARA nicio modificare, ca ScrieArticoleFacturaEditate sa nu fie no-op (vezi ATENTIE din antet) IF USED('tvd') USE IN tvd ENDIF IncarcaArticoleFactura(tnIdVanzare, 'tvd') DO asserteaza WITH '10b: tvd incarcat cu liniile active reale (ca Load()-ul lui frm_modific2024)', ; USED('tvd') AND RECCOUNT('tvd') = lnNrLiniiInainte, 'Reccount=' + IIF(USED('tvd'), TRANSFORM(RECCOUNT('tvd')), '-') + ' asteptat=' + TRANSFORM(lnNrLiniiInainte) *-- 6) ramura buton=1 (comun.vc2:2447-2493), copiata identic; llRul=.T. neconditionat (:2449, *-- "este posibil sa modific si rul, rul_obinv" - asa cum scrie codul, nu dupa Reccount(trul)) llRul = .T. lnSucces = 0 TRY IF MyDeschideTranzactie() SELECT actactan IF !llSters lnSucces = OSCRIE_IN_FISIERE(2, .T., llRul) ELSE lnSucces = 1 ENDIF STRTOFILE(' OSCRIE_IN_FISIERE(2,...) => ' + TRANSFORM(lnSucces) + CHR(13) + CHR(10), tcLog, 1) IF lnSucces > 0 IF USED('actactan') USE IN actactan ENDIF SELECT tact IF gnAn >= IIF(TYPE('gnAnFormNou') = 'U', 2007, gnAnFormNou) REPLACE id_jtva_coloana WITH NULL, proc_tva WITH 0 FOR cu_Tva = 0 ENDIF SELECT * FROM tact INTO CURSOR actactan READWRITE REPLACE ALL id_util WITH gnIdUtil, sters WITH 0 IF llRul IF USED('rul_temp') USE IN RUL_TEMP ENDIF SELECT * FROM trul INTO CURSOR RUL_TEMP READWRITE REPLACE ALL id_util WITH gnIdUtil, sters WITH 0 IF USED('rul_temp_obinv') USE IN RUL_TEMP_OBINV ENDIF SELECT * FROM trul_obinv INTO CURSOR RUL_TEMP_OBINV READWRITE REPLACE ALL id_util WITH gnIdUtil, sters WITH 0 ENDIF lnSucces = OSCRIE_IN_FISIERE(0, .T., llRul) STRTOFILE(' OSCRIE_IN_FISIERE(0,...) => ' + TRANSFORM(lnSucces) + CHR(13) + CHR(10), tcLog, 1) ENDIF IF lnSucces > 0 lcSql = [begin pack_contafin.finalizeaza_modificare_nota(?pnLuna,?pnAn,?pdDataOra,] + ALLTRIM(STR(lnIdSet)) + [,] + ; ALLTRIM(STR(lnCod)) + [,] + ALLTRIM(STR(lnIdFact)) + [,] + ALLTRIM(STR(lnIdfactd)) + [,?gnIdUtil); end;] lnSucces = IIF(goExecutor.oExecuta(lcSql), 1, -1) STRTOFILE(' finalizeaza_modificare_nota => ' + TRANSFORM(lnSucces) + CHR(13) + CHR(10), tcLog, 1) ENDIF DO asserteaza WITH '11: lantul pana la finalizeaza_modificare_nota a reusit (lnSucces>0)', lnSucces > 0, 'lnSucces=' + TRANSFORM(lnSucces) *-- blocul nou, comun.vc2:2491-2493, identic textual cu ofacturare_comun.vc2:3828-3830 IF lnSucces > 0 AND "OFACTURARE_EDITARE" $ UPPER(SET("Procedure")) AND USED('tvanz') AND RECCOUNT('tvanz') = 1 llBlocExecutat = .T. lnSucces = IIF(ScrieArticoleFacturaEditate(tvanz.id_vanzare, 'tvd', 'tvanz'), 1, -1) STRTOFILE(' ScrieArticoleFacturaEditate => ' + TRANSFORM(lnSucces) + CHR(13) + CHR(10), tcLog, 1) ELSE STRTOFILE(' ATENTIE: blocul ScrieArticoleFacturaEditate NU s-a executat' + CHR(13) + CHR(10), tcLog, 1) ENDIF *-- comun.vc2:2541 - Thisform.do_inchide_tranzactie(Iif(lnSucces<0,2,1)) IF MyInchideTranzactie(IIF(lnSucces < 0, 2, 1)) STRTOFILE(' tranzactie inchisa cu ' + IIF(lnSucces < 0, 'ROLLBACK', 'COMMIT') + CHR(13) + CHR(10), tcLog, 1) ELSE STRTOFILE(' FAIL la inchiderea tranzactiei' + CHR(13) + CHR(10), tcLog, 1) ENDIF ELSE STRTOFILE(' FAIL: deschiderea tranzactiei a esuat' + CHR(13) + CHR(10), tcLog, 1) ENDIF CATCH TO loExc STRTOFILE(' EXCEPTIE in lantul de scriere: ' + TRANSFORM(loExc.ErrorNo) + ' [' + loExc.Message + '] ' + ; loExc.Procedure + ':' + TRANSFORM(loExc.LineNo) + ' -> ROLLBACK' + CHR(13) + CHR(10), tcLog, 1) lnSucces = -99 MyInchideTranzactie(2) ENDTRY DO asserteaza WITH '12: blocul ScrieArticoleFacturaEditate S-A EXECUTAT pe aceasta cale (garda satisfacuta)', ; llBlocExecutat, TRANSFORM(llBlocExecutat) DO asserteaza WITH '13: lantul complet (inclusiv ScrieArticoleFacturaEditate prin acest punct de intrare) a reusit', ; lnSucces > 0, 'lnSucces=' + TRANSFORM(lnSucces) IF USED('actactan') USE IN actactan ENDIF IF USED('tact') USE IN tact ENDIF IF USED('rul_temp') USE IN rul_temp ENDIF IF USED('trul') USE IN trul ENDIF IF USED('rul_temp_obinv') USE IN rul_temp_obinv ENDIF IF USED('trul_obinv') USE IN trul_obinv ENDIF IF USED('crsArticoleFactura') USE IN crsArticoleFactura ENDIF IF USED('tvd') USE IN tvd ENDIF IF USED('tvanz') USE IN tvanz ENDIF IF USED('actjur') USE IN actjur ENDIF *-- verificare de fond: lantul a COMIS (lnSucces>0) - COD-ul se realoca (ca in blocul C din *-- test_s5_discount_valuta.prg), dar continutul liniilor si totalurile raman identice, pentru ca *-- 'tvd' a fost incarcat fara nicio modificare (vezi ATENTIE din antet) lcSql = [select cod, nvl(discount,0) as discount, total_fara_tva, total_tva, total_cu_tva from vanzari where id_vanzare = ] + TRANSFORM(tnIdVanzare) lnQ = ExecSel(lcSql, 'v_vz1') IF lnQ > 0 AND RECCOUNT('v_vz1') = 1 lnCodDupa = v_vz1.cod lnDiscDupa = v_vz1.discount lnFtvaDupa = v_vz1.total_fara_tva lnTvaDupa = v_vz1.total_tva lnCtvaDupa = v_vz1.total_cu_tva ENDIF USE IN v_vz1 lcSql = [select count(*) as nr from vanzari_detalii where id_vanzare = ] + TRANSFORM(tnIdVanzare) + [ and sters = 0] lnQ = ExecSel(lcSql, 'v_cnt1') lnNrLiniiDupa = IIF(lnQ > 0, v_cnt1.nr, -1) USE IN v_cnt1 STRTOFILE(' DUPA COMMIT: cod=' + TRANSFORM(lnCodDupa) + ' (era ' + TRANSFORM(lnCodInainte) + ') discount=' + TRANSFORM(lnDiscDupa) + ; ' ftva=' + TRANSFORM(lnFtvaDupa) + ' tva=' + TRANSFORM(lnTvaDupa) + ' ctva=' + TRANSFORM(lnCtvaDupa) + ; ' linii active=' + TRANSFORM(lnNrLiniiDupa) + CHR(13) + CHR(10), tcLog, 1) DO asserteaza WITH '14: COD s-a realocat la salvare (ca la orice trecere prin finalizeaza_modificare_nota, chiar fara modificari)', ; lnCodDupa <> lnCodInainte, TRANSFORM(lnCodInainte) + ' -> ' + TRANSFORM(lnCodDupa) DO asserteaza WITH '15: discount/totalurile raman neschimbate (nicio modificare in tvd)', ; ABS(lnDiscDupa - lnDiscInainte) < 0.0001 AND ABS(lnFtvaDupa - lnFtvaInainte) < 0.0001 ; AND ABS(lnTvaDupa - lnTvaInainte) < 0.0001 AND ABS(lnCtvaDupa - lnCtvaInainte) < 0.0001, ; 'disc=' + TRANSFORM(lnDiscDupa) + ' ftva=' + TRANSFORM(lnFtvaDupa) + ' tva=' + TRANSFORM(lnTvaDupa) + ' ctva=' + TRANSFORM(lnCtvaDupa) DO asserteaza WITH '16: numarul de linii active ramane neschimbat (idempotent, ca la reeditare fara modificari)', ; lnNrLiniiDupa = lnNrLiniiInainte, 'dupa=' + TRANSFORM(lnNrLiniiDupa) + ' inainte=' + TRANSFORM(lnNrLiniiInainte) *-- verificarea CRITICA: linia definitiv stearsa in testele anterioare (det=1582) trebuie sa *-- RAMANA stearsa - exact reset-ul pe care ScrieArticoleFacturaEditate trebuie sa-l corecteze LOCAL lnStersLiniaVecheStearsa lcSql = [select nvl(sters,0) as sters from vanzari_detalii where id_vanzare_det = 1582] lnQ = ExecSel(lcSql, 'v_1582') lnStersLiniaVecheStearsa = IIF(lnQ > 0 AND RECCOUNT('v_1582') = 1, v_1582.sters, -1) USE IN v_1582 DO asserteaza WITH '17: linia definitiv stearsa in testele anterioare (det=1582) a ramas stearsa dupa aceasta salvare', ; lnStersLiniaVecheStearsa = 1, 'sters=' + TRANSFORM(lnStersLiniaVecheStearsa) 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