* test_s8_matrice_surse.prg * Test pe fluxul real al editarii unei facturi emise, pe cate un document din fiecare tip de sursa * (lista de preturi/comanda, aviz, factura din aviz, factura din contract), fiecare editat de doua * ori: o data pornit ca din ROAFACTURARE (frm_facturi.do_editare_factura, ofacturare_comun.vc2: * 3742-3837), o data ca din registrul jurnal ROACONT (afisjurcom.do_modifica, comun.vc2:2222-2569). * Harnessul reproduce ambele lanturi identic cu test_s5_scriere_reala.prg si * test_s5_al_doilea_intrare.prg (aceleasi helpere MyDeschide/InchideTranzactie, acelasi ocolire a * UI-ului cu buton=1 fortat), dar FARA nicio editare de linii - S5/S7 acopera deja modificarile de * continut; aici se verifica doar ca reeditarea (fara nimic schimbat) trece corect prin ambele * puncte de intrare, pe fiecare tip de document sursa. * * Ce verifica dupa fiecare editare (VerificaDupaEditare): nota veche (vact_tot, cod dinainte) are * STERS=1, nota noua (cod nou) exista si e activa cu acelasi id_fact, VANZARI.id_fact ramane * neschimbat, VANZARI/VANZARI_DETALII raman sincronizate (numar de linii active si totalurile * denormalizate identice cu inainte de editare, fara_tva+tva=cu_tva), rulajele sunt refacute * (Reccount(trul)>0 pe nota noua) si totalurile de control ACT/RUL (ActualizeazaVerdictActRul, * omodificari.vc2) raman concordante fata de inainte de editare - CalculeazaTotaluriS4b instantiaza * frm_modific2024 exact ca test_verdict_act_rul.prg, fara UI. Suplimentar: gcMockUltimMesaj * (mock_amessagebox.prg) trebuie sa ramana gol dupa lantul de scriere - dovada ca verifica_stoc * (oscrie_in_fisiere.prg:92-106, apelata doar cand tnScrie_Sterge=2 And !tlModificare) nu s-a * declansat, pentru ca ambele lanturi trec tlModificare=.T. la OSCRIE_IN_FISIERE. * * Matricea completa (4 documente, cate unul din fiecare tip de sursa) e definita in gaMatriceS8, dar * NUMAI id_vanzare=1048 e activ in gaCazuriActive - celelalte trei se consuma ireversibil (cod se * realoca, note vechi raman sterse) si se ruleaza separat, dupa ce felia asta trece. Cazurile * neactive sunt doar loghate, fara niciun acces la Oracle. Codul e parametrizat pe id_vanzare - * activarea unui caz nou inseamna doar adaugarea lui in gaCazuriActive. * * Documentele de test se editeaza exclusiv prin fluxul aplicatiei (OSCRIE_IN_FISIERE, * finalizeaza_modificare_nota, ScrieArticoleFacturaEditate) - interogarile SQL sunt doar de citire. * QUIT la final. SET SAFETY OFF SET TALK OFF LOCAL lcLog lcLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s8_matrice_surse_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() *-- mock amessagebox incarcat PRIMUL, inaintea lantului real (la nume duplicat castiga primul gasit) 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 LOCAL lnVerifMock lnVerifMock = amessagebox('verificare mock', 4+32, 'test') STRTOFILE('verificare mock amessagebox = ' + TRANSFORM(lnVerifMock) + ; IIF(lnVerifMock = 6, ' (OK, mock activ)', ' (ATENTIE: amessagebox real, risc de blocaj)') + CHR(13) + CHR(10), lcLog, 1) 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 *-- garda de referinte din do_editare_factura sta in odocumente.prg, care nu e in mediul de test SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\odocumente.prg ADDITIVE *!* test_init_env_auto incarca clasa omodificari din working copy-ul ROACONT (alt SET PATH) - *!* o eliberam si o reincarcam pe cea de sub test, cu cale completa (necesar pt. frm_modific2024) RELEASE CLASSLIB omodificari SET CLASSLIB TO D:\ROA\ROAFACTURARE\COMUN\clase\omodificari.vcx ADDITIVE IF TYPE('gnPC') <> 'N' PUBLIC gnPC gnPC = 2 ENDIF PUBLIC gcMockUltimMesaj, gnMockUltimTip gcMockUltimMesaj = '' gnMockUltimTip = 0 *-- rezultatul CalculeazaTotaluriS4b, populat la fiecare apel (PUBLIC - citit imediat de apelant) PUBLIC gnS4bAct, gnS4bRul, gcS4bVerdict, gnS4bRulReccount, glS4bOk gnS4bAct = 0 gnS4bRul = 0 gcS4bVerdict = '' gnS4bRulReccount = -1 glS4bOk = .F. *-- matricea completa S8 (extensibila) - un singur document activ in aceasta rulare LOCAL ARRAY gaMatriceS8(4,2) gaMatriceS8(1,1) = 1048 gaMatriceS8(1,2) = 'lista de preturi (tip 1)' gaMatriceS8(2,1) = 1052 gaMatriceS8(2,2) = 'aviz (tip 22)' gaMatriceS8(3,1) = 1054 gaMatriceS8(3,2) = 'factura din aviz (tip 4)' gaMatriceS8(4,1) = 1055 gaMatriceS8(4,2) = 'factura din contract (tip 2)' *-- toate cele 4 documente din matrice au fost deja editate si verificate (rec_s8_matrice.md); *-- 0 = niciun caz activ implicit, ca o rulare accidentala sa nu consume alte documente LOCAL ARRAY gaCazuriActive(1) gaCazuriActive(1) = 0 LOCAL lnI FOR lnI = 1 TO ALEN(gaMatriceS8, 1) IF ASCAN(gaCazuriActive, gaMatriceS8(lnI, 1)) = 0 STRTOFILE(CHR(13) + CHR(10) + '========== SARIT (nu se consuma inca in aceasta rulare): id_vanzare=' + ; TRANSFORM(gaMatriceS8(lnI, 1)) + ' [' + gaMatriceS8(lnI, 2) + ']' + CHR(13) + CHR(10), lcLog, 1) ELSE DO VerificaDocumentMatriceS8 WITH gaMatriceS8(lnI, 1), gaMatriceS8(lnI, 2), lcLog ENDIF ENDFOR 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 si intoarce codul de succes; cursorul vechi se inchide intai 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), 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), 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 *-- totalurile de control S4b (Total ACT, Total RUL, verdict) pe nota (cod,an,luna), calculate exact *-- ca test_verdict_act_rul.prg: incarca cursoarele notei, instantiaza frm_modific2024 fara UI (doar *-- ca sa ruleze ActualizeazaVerdictActRul), citeste proprietatile si elibereaza tot. Rezultatul se *-- intoarce in gnS4bAct/gnS4bRul/gcS4bVerdict/gnS4bRulReccount/glS4bOk (citite imediat de apelant) PROCEDURE CalculeazaTotaluriS4b LPARAMETERS tnCod, tnAn, tnLuna, tcEticheta, tcLog LOCAL llOk, lnIdSet, loForm glS4bOk = .F. gnS4bAct = 0 gnS4bRul = 0 gcS4bVerdict = '' gnS4bRulReccount = -1 llOk = IncarcaCursoareModificareNota(tnCod, tnAn, tnLuna, .F.) IF !llOk OR !USED('tact') OR RECCOUNT('tact') = 0 STRTOFILE(' [' + tcEticheta + '] CalculeazaTotaluriS4b: IncarcaCursoareModificareNota a esuat pentru cod=' + TRANSFORM(tnCod) + CHR(13) + CHR(10), tcLog, 1) RETURN ENDIF SELECT a.*, IIF(NVL(id_jtva_coloana, 0) = 0, 0, 1) AS cu_Tva FROM tact a INTO CURSOR tact READWRITE GO TOP IN tact lnIdSet = tact.id_set IF !USED('crsJtvaTemp') update_jtva_coloane("", "crsJtvaTemp", 6) ENDIF SELECT tact loForm = CREATEOBJECT([frm_modific2024], lnIdSet) loForm.WindowType = 0 loForm.Show() gnS4bAct = loForm.nTotalActRon gnS4bRul = loForm.nTotalRulRon gcS4bVerdict = loForm.pgfArticole.PAGE3.lblVerdictArt.Caption gnS4bRulReccount = IIF(USED('trul'), RECCOUNT('trul'), -1) glS4bOk = .T. loForm.Release() STRTOFILE(' [' + tcEticheta + '] S4b cod=' + TRANSFORM(tnCod) + ': ACT=' + TRANSFORM(gnS4bAct) + ' RUL=' + TRANSFORM(gnS4bRul) + ; ' verdict=[' + m.gcS4bVerdict + '] Reccount(trul)=' + TRANSFORM(gnS4bRulReccount) + CHR(13) + CHR(10), tcLog, 1) 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('tvanz') USE IN tvanz ENDIF IF USED('tvd') USE IN tvd ENDIF ENDPROC *-- verificarile comune de dupa un commit reusit (ambele puncte de intrare le folosesc identic): *-- stare VANZARI dupa, nota veche/noua din vact_tot, totalurile de control S4b dupa editare PROCEDURE VerificaDupaEditare LPARAMETERS tnIdVanzare, tcEtapa, tnCodInainte, tnIdFactInainte, tnTotFtvaInainte, tnTotTvaInainte, ; tnTotCtvaInainte, tnNrActiveInainte, tnActBaseline, tnRulBaseline, tnAn, tnLuna, tcLog LOCAL lcSql, lnQ, lnCodDupa, lnIdFactDupa, lnStersDupa, lnTotFtvaDupa, lnTotTvaDupa, lnTotCtvaDupa, lnNrActiveDupa LOCAL lnStersNotaVeche, lnStersNotaNoua, lnIdFactNotaNoua lcSql = [select cod, nvl(sters,0) as sters, id_fact, total_fara_tva, total_tva, total_cu_tva from vanzari where id_vanzare = ] + TRANSFORM(tnIdVanzare) lnQ = ExecSel(lcSql, 'v_va1') IF lnQ <= 0 OR RECCOUNT('v_va1') <> 1 DO asserteaza WITH tcEtapa + ': VANZARI citit dupa commit', .F., 'lnQ=' + TRANSFORM(lnQ) RETURN ENDIF SELECT v_va1 lnCodDupa = cod lnIdFactDupa = id_fact lnStersDupa = sters lnTotFtvaDupa = total_fara_tva lnTotTvaDupa = total_tva lnTotCtvaDupa = total_cu_tva USE IN v_va1 lcSql = [select count(*) as nr from vanzari_detalii where id_vanzare = ] + TRANSFORM(tnIdVanzare) + [ and sters = 0] lnQ = ExecSel(lcSql, 'v_va_cnt1') lnNrActiveDupa = IIF(lnQ > 0, v_va_cnt1.nr, -1) USE IN v_va_cnt1 STRTOFILE(' VANZARI dupa: cod=' + TRANSFORM(lnCodDupa) + ' (era ' + TRANSFORM(tnCodInainte) + ') id_fact=' + TRANSFORM(lnIdFactDupa) + ; ' sters=' + TRANSFORM(lnStersDupa) + ' ftva=' + TRANSFORM(lnTotFtvaDupa) + ' tva=' + TRANSFORM(lnTotTvaDupa) + ; ' ctva=' + TRANSFORM(lnTotCtvaDupa) + ' linii active=' + TRANSFORM(lnNrActiveDupa) + CHR(13) + CHR(10), tcLog, 1) DO asserteaza WITH tcEtapa + ': VANZARI.COD s-a realocat la salvare, documentul ramane activ', ; lnCodDupa <> tnCodInainte AND lnStersDupa = 0, TRANSFORM(tnCodInainte) + ' -> ' + TRANSFORM(lnCodDupa) DO asserteaza WITH tcEtapa + ': id_fact ramane neschimbat', lnIdFactDupa = tnIdFactInainte, TRANSFORM(tnIdFactInainte) + ' -> ' + TRANSFORM(lnIdFactDupa) DO asserteaza WITH tcEtapa + ': numarul de linii active ramane neschimbat (reeditare fara modificari)', ; lnNrActiveDupa = tnNrActiveInainte, 'dupa=' + TRANSFORM(lnNrActiveDupa) + ' inainte=' + TRANSFORM(tnNrActiveInainte) DO asserteaza WITH tcEtapa + ': totalurile din VANZARI sunt coerente (fara_tva+tva=cu_tva)', ; ABS((lnTotFtvaDupa + lnTotTvaDupa) - lnTotCtvaDupa) < 0.01, TRANSFORM(lnTotFtvaDupa) + ' + ' + TRANSFORM(lnTotTvaDupa) + ' = ' + TRANSFORM(lnTotCtvaDupa) DO asserteaza WITH tcEtapa + ': totalurile denormalizate raman egale cu cele dinainte (reeditare fara modificari)', ; ABS(lnTotFtvaDupa - tnTotFtvaInainte) < 0.01 AND ABS(lnTotTvaDupa - tnTotTvaInainte) < 0.01 AND ABS(lnTotCtvaDupa - tnTotCtvaInainte) < 0.01, ; 'ftva=' + TRANSFORM(lnTotFtvaDupa) + ' tva=' + TRANSFORM(lnTotTvaDupa) + ' ctva=' + TRANSFORM(lnTotCtvaDupa) *-- nota veche/nota noua, exact ca gridul registrului jurnal (vact_tot) lcSql = [select nvl(sters,0) as sters from vact_tot where cod = ] + TRANSFORM(tnCodInainte) + [ and rownum = 1] lnQ = ExecSel(lcSql, 'v_va_nv') lnStersNotaVeche = IIF(lnQ > 0 AND RECCOUNT('v_va_nv') = 1, v_va_nv.sters, -1) USE IN v_va_nv DO asserteaza WITH tcEtapa + ': nota veche (cod=' + TRANSFORM(tnCodInainte) + ') are STERS=1', lnStersNotaVeche = 1, 'sters=' + TRANSFORM(lnStersNotaVeche) lcSql = [select nvl(sters,0) as sters, id_fact from vact_tot where cod = ] + TRANSFORM(lnCodDupa) + [ and rownum = 1] lnQ = ExecSel(lcSql, 'v_va_nn') lnStersNotaNoua = IIF(lnQ > 0 AND RECCOUNT('v_va_nn') = 1, v_va_nn.sters, -1) lnIdFactNotaNoua = IIF(lnQ > 0 AND RECCOUNT('v_va_nn') = 1, v_va_nn.id_fact, -1) USE IN v_va_nn DO asserteaza WITH tcEtapa + ': nota noua (cod=' + TRANSFORM(lnCodDupa) + ') exista si e activa (STERS=0)', lnStersNotaNoua = 0, 'sters=' + TRANSFORM(lnStersNotaNoua) DO asserteaza WITH tcEtapa + ': nota noua pastreaza acelasi id_fact', lnIdFactNotaNoua = tnIdFactInainte, TRANSFORM(lnIdFactNotaNoua) + ' vs ' + TRANSFORM(tnIdFactInainte) *-- rulajele refacute + totalurile de control S4b concordante fata de dinainte de editare DO CalculeazaTotaluriS4b WITH lnCodDupa, tnAn, tnLuna, tcEtapa + ' [dupa]', tcLog DO asserteaza WITH tcEtapa + ': totalurile de control S4b calculabile pe nota noua', glS4bOk, TRANSFORM(glS4bOk) DO asserteaza WITH tcEtapa + ': rulajele au fost refacute pe nota noua (Reccount(trul)>0)', gnS4bRulReccount > 0, TRANSFORM(gnS4bRulReccount) DO asserteaza WITH tcEtapa + ': Total ACT ramane concordant fata de inainte de editare (fara modificari de linii)', ; ABS(gnS4bAct - tnActBaseline) < 0.01, TRANSFORM(tnActBaseline) + ' -> ' + TRANSFORM(gnS4bAct) DO asserteaza WITH tcEtapa + ': Total RUL ramane concordant fata de inainte de editare (fara modificari de linii)', ; ABS(gnS4bRul - tnRulBaseline) < 0.01, TRANSFORM(tnRulBaseline) + ' -> ' + TRANSFORM(gnS4bRul) STRTOFILE(' REZUMAT ' + tcEtapa + ': cod ' + TRANSFORM(tnCodInainte) + ' -> ' + TRANSFORM(lnCodDupa) + CHR(13) + CHR(10), tcLog, 1) ENDPROC *-- primul punct de intrare: ofacturare_comun.vc2:3742-3837 (do_editare_factura, apelat din *-- frm_facturi), reprodus fara UI si fara nicio editare de linii PROCEDURE EditeazaDinRoafacturare LPARAMETERS tnIdVanzare, tcSursa, tcLog PRIVATE pnAn, pnLuna, lnCod, lnIdFact LOCAL lcEtapa, lcSql, lnQ, lnSters, llEProforma, lnIdSet, lnIdFactD, lnSucces, llBlocatReferinte LOCAL lnCodInainte, lnIdFactInainte, lnTotFtvaInainte, lnTotTvaInainte, lnTotCtvaInainte, lnNrActiveInainte LOCAL lnActBaseline, lnRulBaseline, llS4bBaselineOk, llGasitRand lcEtapa = tcSursa + ' / intrare ROAFACTURARE (do_editare_factura)' STRTOFILE(CHR(13) + CHR(10) + '========== ' + lcEtapa + ', id_vanzare=' + TRANSFORM(tnIdVanzare) + ' ==========' + CHR(13) + CHR(10), tcLog, 1) *-- 1) starea documentului inainte (VANZARI.COD se realoca la fiecare salvare) lcSql = [select cod, nvl(sters,0) as sters, id_fact, eproforma, 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_ra0') IF lnQ <= 0 OR RECCOUNT('v_ra0') <> 1 DO asserteaza WITH lcEtapa + ': VANZARI citit inainte', .F., 'lnQ=' + TRANSFORM(lnQ) RETURN ENDIF SELECT v_ra0 lnCod = cod lnCodInainte = cod lnIdFact = id_fact lnIdFactInainte = id_fact llEProforma = (NVL(eproforma, 0) = 1) pnAn = anact pnLuna = lunaact lnSters = sters lnTotFtvaInainte = total_fara_tva lnTotTvaInainte = total_tva lnTotCtvaInainte = total_cu_tva USE IN v_ra0 STRTOFILE(' VANZARI inainte: cod=' + TRANSFORM(lnCodInainte) + ' id_fact=' + TRANSFORM(lnIdFactInainte) + ' sters=' + TRANSFORM(lnSters) + ; ' an/luna=' + TRANSFORM(pnAn) + '/' + TRANSFORM(pnLuna) + ' ftva=' + TRANSFORM(lnTotFtvaInainte) + ' tva=' + TRANSFORM(lnTotTvaInainte) + ; ' ctva=' + TRANSFORM(lnTotCtvaInainte) + CHR(13) + CHR(10), tcLog, 1) *-- 2) garzile din do_editare_factura, fara UI DO asserteaza WITH lcEtapa + ': document editabil (nesters, neproforma)', lnSters <> 1 AND !llEProforma, 'sters=' + TRANSFORM(lnSters) + ' eproforma=' + TRANSFORM(llEProforma) IF lnSters = 1 OR llEProforma RETURN ENDIF DO asserteaza WITH lcEtapa + ': document din luna curenta', (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 llBlocatReferinte = ReferinteDocumenteNota(pnAn, pnLuna, lnCod) OR EsteInEFactura(lnIdFact) DO asserteaza WITH lcEtapa + ': document fara referinte / netrimis in eFactura', !llBlocatReferinte, TRANSFORM(llBlocatReferinte) IF llBlocatReferinte RETURN ENDIF *-- 3) instantaneul liniilor + totalurile de control S4b, INAINTE de editare (baseline concordanta) lcSql = [select count(*) as nr from vanzari_detalii where id_vanzare = ] + TRANSFORM(tnIdVanzare) + [ and sters = 0] lnQ = ExecSel(lcSql, 'v_ra_cnt0') lnNrActiveInainte = IIF(lnQ > 0, v_ra_cnt0.nr, -1) USE IN v_ra_cnt0 DO CalculeazaTotaluriS4b WITH lnCod, pnAn, pnLuna, lcEtapa + ' [inainte]', tcLog lnActBaseline = gnS4bAct lnRulBaseline = gnS4bRul llS4bBaselineOk = glS4bOk DO asserteaza WITH lcEtapa + ': totalurile de control S4b (ACT/RUL) calculabile inainte de editare', llS4bBaselineOk, TRANSFORM(llS4bBaselineOk) *-- 4) cursoarele notei + tvanz/tvd, exact ca do_editare_factura IF !IncarcaCursoareModificareNota(lnCod, pnAn, pnLuna, .F.) DO asserteaza WITH lcEtapa + ': IncarcaCursoareModificareNota', .F., 'a esuat' RETURN ENDIF DO asserteaza WITH lcEtapa + ': nota are randuri (actactan)', RECCOUNT('actactan') > 0, TRANSFORM(RECCOUNT('actactan')) IF RECCOUNT('actactan') = 0 RETURN ENDIF SELECT actactan llGasitRand = .F. IF lnIdFact > 0 LOCATE FOR NVL(id_fact, 0) = lnIdFact llGasitRand = FOUND() ENDIF IF !llGasitRand GO TOP lnIdFact = id_fact ENDIF lnIdSet = id_set lnIdFactD = NVL(id_factd, 0) SELECT a.*, IIF(NVL(id_jtva_coloana, 0) = 0, 0, 1) AS cu_Tva FROM tact a INTO CURSOR tact READWRITE IF !IncarcaVanzareDinNota('tact') DO asserteaza WITH lcEtapa + ': IncarcaVanzareDinNota', .F., 'nu a gasit randul din VANZARI' RETURN ENDIF IncarcaArticoleFactura(tnIdVanzare, 'tvd') DO asserteaza WITH lcEtapa + ': tvd incarcat cu liniile active reale', ; USED('tvd') AND RECCOUNT('tvd') = lnNrActiveInainte, 'Reccount=' + IIF(USED('tvd'), TRANSFORM(RECCOUNT('tvd')), '-') + ' asteptat=' + TRANSFORM(lnNrActiveInainte) *-- 5) fara nicio modificare de articole - buton=1 fortat direct (inainte_de_do_termin NU se executa) buton = 1 *-- 6) ramura buton=1 (ofacturare_comun.vc2:3799-3837), copiata identic; tlModificare=.T. la *-- OSCRIE_IN_FISIERE - verifica_stoc (oscrie_in_fisiere.prg:92) nu se declanseaza pe aceasta ramura gcMockUltimMesaj = '' lnSucces = 0 TRY IF MyDeschideTranzactie() SELECT actactan lnSucces = OSCRIE_IN_FISIERE(2, .T., .T.) 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 REPLACE id_jtva_coloana WITH NULL, proc_tva WITH 0 FOR cu_Tva = 0 SELECT * FROM tact INTO CURSOR actactan READWRITE REPLACE ALL id_util WITH gnIdUtil, sters WITH 0 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 lnSucces = OSCRIE_IN_FISIERE(0, .T., .T.) 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,Null,] + 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 IF lnSucces > 0 AND "OFACTURARE_EDITARE" $ UPPER(SET("Procedure")) AND USED('tvanz') AND RECCOUNT('tvanz') = 1 lnSucces = IIF(ScrieArticoleFacturaEditate(tvanz.id_vanzare), 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 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 lcEtapa + ': lantul de scriere a mers pana la capat (COMMIT)', lnSucces > 0, 'lnSucces=' + TRANSFORM(lnSucces) DO asserteaza WITH lcEtapa + ': verificarile de stoc de la emitere NU s-au declansat (niciun mesaj afisat)', EMPTY(gcMockUltimMesaj), '[' + gcMockUltimMesaj + ']' 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('tvd') USE IN tvd ENDIF IF USED('tvanz') USE IN tvanz ENDIF IF lnSucces <= 0 STRTOFILE(' scrierea nu s-a produs - fara verificari dupa' + CHR(13) + CHR(10), tcLog, 1) RETURN ENDIF *-- 7) verificarile de dupa commit, comune ambelor puncte de intrare DO VerificaDupaEditare WITH tnIdVanzare, lcEtapa, lnCodInainte, lnIdFactInainte, lnTotFtvaInainte, lnTotTvaInainte, ; lnTotCtvaInainte, lnNrActiveInainte, lnActBaseline, lnRulBaseline, pnAn, pnLuna, tcLog ENDPROC *-- al doilea punct de intrare: comun.vc2:2222-2569 (afisjurcom.do_modifica, registrul jurnal *-- ROACONT), reprodus fara UI si fara nicio editare de linii - identic cu *-- test_s5_al_doilea_intrare.prg, cu adaugarea verificarilor de dupa commit (VerificaDupaEditare) PROCEDURE EditeazaDinRegistruJurnal LPARAMETERS tnIdVanzare, tcSursa, tcLog PRIVATE pnAn, pnLuna, lnCod, lnIdFact, lnIdfactd, lnIdSet, pdDataOra LOCAL lcEtapa, lcSql, lnQ, lnSters, llSters, llGestInvantar, llRul, lnSucces, llBlocExecutat, llGasitTvanz LOCAL lnCodInainte, lnIdFactInainte, lnTotFtvaInainte, lnTotTvaInainte, lnTotCtvaInainte, lnNrActiveInainte LOCAL lnActBaseline, lnRulBaseline, llS4bBaselineOk llBlocExecutat = .F. lcEtapa = tcSursa + ' / intrare registru jurnal ROACONT (afisjurcom.do_modifica)' STRTOFILE(CHR(13) + CHR(10) + '========== ' + lcEtapa + ', id_vanzare=' + TRANSFORM(tnIdVanzare) + ' ==========' + CHR(13) + CHR(10), tcLog, 1) *-- 1) starea documentului inainte (cod-ul curent, dupa eventuala editare anterioara) lcSql = [select cod, nvl(sters,0) as sters, id_fact, 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_rj0') IF lnQ <= 0 OR RECCOUNT('v_rj0') <> 1 DO asserteaza WITH lcEtapa + ': VANZARI citit inainte', .F., 'lnQ=' + TRANSFORM(lnQ) RETURN ENDIF SELECT v_rj0 lnCod = cod lnCodInainte = cod lnIdFactInainte = id_fact lnTotFtvaInainte = total_fara_tva lnTotTvaInainte = total_tva lnTotCtvaInainte = total_cu_tva USE IN v_rj0 lcSql = [select count(*) as nr from vanzari_detalii where id_vanzare = ] + TRANSFORM(tnIdVanzare) + [ and sters = 0] lnQ = ExecSel(lcSql, 'v_rj_cnt0') lnNrActiveInainte = IIF(lnQ > 0, v_rj_cnt0.nr, -1) USE IN v_rj_cnt0 STRTOFILE(' VANZARI inainte: cod=' + TRANSFORM(lnCodInainte) + ' id_fact=' + TRANSFORM(lnIdFactInainte) + ; ' ftva=' + TRANSFORM(lnTotFtvaInainte) + ' tva=' + TRANSFORM(lnTotTvaInainte) + ' ctva=' + TRANSFORM(lnTotCtvaInainte) + ; ' linii active=' + TRANSFORM(lnNrActiveInainte) + CHR(13) + CHR(10), tcLog, 1) *-- 2) "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 lcEtapa + ': 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 USE IN actjur 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) *-- 3) garzile din do_modifica (comun.vc2:2265-2290), fara UI DO asserteaza WITH lcEtapa + ': nota din luna curenta', (pnAn * 12) + pnLuna = (gnAn * 12) + gnLuna, TRANSFORM(pnAn) + '/' + TRANSFORM(pnLuna) IF (pnAn * 12) + pnLuna <> (gnAn * 12) + gnLuna RETURN ENDIF DO asserteaza WITH lcEtapa + ': id_set NU e in intervalul ROAPRODUCTIE (30000-30009)', !BETWEEN(lnIdSet, 30000, 30009), TRANSFORM(lnIdSet) IF BETWEEN(lnIdSet, 30000, 30009) RETURN ENDIF llSters = (lnSters = 1) DO asserteaza WITH lcEtapa + ': nota nu e deja stearsa', !llSters, TRANSFORM(lnSters) llGestInvantar = (lnIdSet = 90101) DO asserteaza WITH lcEtapa + ': nu e nota de inventariere', !llGestInvantar, TRANSFORM(lnIdSet) IF llGestInvantar pdDataOra = actjur.dataora ENDIF *-- 4) totalurile de control S4b, INAINTE de editare (baseline concordanta) DO CalculeazaTotaluriS4b WITH lnCod, pnAn, pnLuna, lcEtapa + ' [inainte]', tcLog lnActBaseline = gnS4bAct lnRulBaseline = gnS4bRul llS4bBaselineOk = glS4bOk DO asserteaza WITH lcEtapa + ': totalurile de control S4b (ACT/RUL) calculabile inainte de editare', llS4bBaselineOk, TRANSFORM(llS4bBaselineOk) *-- 5) cursoarele notei (actactan/tact/trul/trul_obinv) IF !IncarcaCursoareModificareNota(lnCod, pnAn, pnLuna, .F.) DO asserteaza WITH lcEtapa + ': IncarcaCursoareModificareNota', .F., 'a esuat' RETURN ENDIF DO asserteaza WITH lcEtapa + ': nota are randuri (actactan)', RECCOUNT('actactan') > 0, TRANSFORM(RECCOUNT('actactan')) IF RECCOUNT('actactan') = 0 RETURN ENDIF SELECT a.*, IIF(NVL(id_jtva_coloana, 0) = 0, 0, 1) AS cu_Tva FROM tact a INTO CURSOR tact READWRITE *-- 6) PregatesteArticoleFacturaEditare('tact') - calea specifica acestui punct de intrare, *-- populeaza tvanz SI crsArticoleFactura IF USED('tvanz') USE IN tvanz ENDIF IF USED('crsArticoleFactura') USE IN crsArticoleFactura ENDIF llGasitTvanz = PregatesteArticoleFacturaEditare('tact') DO asserteaza WITH lcEtapa + ': PregatesteArticoleFacturaEditare gaseste documentul in VANZARI', llGasitTvanz, TRANSFORM(llGasitTvanz) DO asserteaza WITH lcEtapa + ': garda Used(tvanz) And Reccount(tvanz)=1 satisfacuta', ; USED('tvanz') AND RECCOUNT('tvanz') = 1, 'Used=' + TRANSFORM(USED('tvanz')) + ' Reccount=' + IIF(USED('tvanz'), TRANSFORM(RECCOUNT('tvanz')), '-') IF USED('tvd') USE IN tvd ENDIF IncarcaArticoleFactura(tnIdVanzare, 'tvd') DO asserteaza WITH lcEtapa + ': tvd incarcat cu liniile active reale', ; USED('tvd') AND RECCOUNT('tvd') = lnNrActiveInainte, 'Reccount=' + IIF(USED('tvd'), TRANSFORM(RECCOUNT('tvd')), '-') + ' asteptat=' + TRANSFORM(lnNrActiveInainte) *-- 7) fara nicio modificare de articole; ramura buton=1 (comun.vc2:2447-2493), llRul=.T. *-- neconditionat (:2449); tlModificare=.T. la OSCRIE_IN_FISIERE - verifica_stoc nu se declanseaza llRul = .T. gcMockUltimMesaj = '' 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 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 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 lcEtapa + ': blocul ScrieArticoleFacturaEditate s-a executat pe aceasta cale (garda satisfacuta)', llBlocExecutat, TRANSFORM(llBlocExecutat) DO asserteaza WITH lcEtapa + ': lantul complet a reusit (COMMIT)', lnSucces > 0, 'lnSucces=' + TRANSFORM(lnSucces) DO asserteaza WITH lcEtapa + ': verificarile de stoc de la emitere NU s-au declansat (niciun mesaj afisat)', EMPTY(gcMockUltimMesaj), '[' + gcMockUltimMesaj + ']' 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 lnSucces <= 0 STRTOFILE(' scrierea nu s-a produs - fara verificari dupa' + CHR(13) + CHR(10), tcLog, 1) RETURN ENDIF *-- 8) verificarile de dupa commit, comune ambelor puncte de intrare DO VerificaDupaEditare WITH tnIdVanzare, lcEtapa, lnCodInainte, lnIdFactInainte, lnTotFtvaInainte, lnTotTvaInainte, ; lnTotCtvaInainte, lnNrActiveInainte, lnActBaseline, lnRulBaseline, pnAn, pnLuna, tcLog ENDPROC *-- orchestreaza cele doua editari (ROAFACTURARE, apoi registrul jurnal ROACONT) pe acelasi document, *-- identificat exclusiv prin id_vanzare (VANZARI.COD se realoca la fiecare salvare, deci a doua *-- editare porneste automat de pe cod-ul lasat de prima) PROCEDURE VerificaDocumentMatriceS8 LPARAMETERS tnIdVanzare, tcSursa, tcLog STRTOFILE(CHR(13) + CHR(10) + '###### document id_vanzare=' + TRANSFORM(tnIdVanzare) + ' [' + tcSursa + '] ######' + CHR(13) + CHR(10), tcLog, 1) DO EditeazaDinRoafacturare WITH tnIdVanzare, tcSursa, tcLog DO EditeazaDinRegistruJurnal WITH tnIdVanzare, tcSursa, tcLog 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