* probe_s12_stoc.prg * Proba de izolare pentru FACT-008 ("Articolul ... nu mai e in stoc!"): verifica daca pretv_orig * (pretul de vanzare din STOC ales la emiterea initiala) supravietuieste traseului de reemitere. * pack_facturare.descarca_gestiune cauta randul de stoc cu A.PRETV = V_PRETV_ALES, iar * V_PRETV_ALES vine din VANZARI_DETALII_TEMP.PRETV_ORIG, adica din argumentul 22 al apelului * pack_facturare.adauga_articol_factura, adica din crsfactura.pretv_orig. * Asertiunile sunt scrise in sensul CORECT (pretv_orig <> 0 pe liniile gestionabile), deci ele * PICA atat timp cat defectul exista si TREC dupa reparatie. * NIMIC nu se scrie in Oracle: citirile sunt reale, do_scrie_articole() ruleaza cu goExecutor * mockat (tipar identic cu probe_s12_gestiune.prg / test_s11_izolare_camp_1472.prg). * * Pasul 1: sursa reala (VVANZARI_ARTICOLE prin IncarcaArticoleFactura). * Pasul 2: crsfactura dupa IncarcaLiniiFacturaEditare - pretv_orig per linie. * Pasul 3: SQL-ul generat de do_scrie_articole, argumentul 22 (V_PRETV_ORIG) per apel. LPARAMETERS tnIdV SET SAFETY OFF SET TALK OFF PUBLIC gcErrLog, gnPass, gnFail PUBLIC poDate IF VARTYPE(tnIdV) = 'C' tnIdV = VAL(tnIdV) ENDIF IF EMPTY(tnIdV) tnIdV = 631 ENDIF gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s12_stoc_ctrlneg_log_' + ; STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt' STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' doc = ' + TRANSFORM(tnIdV) + CHR(13) + CHR(10), gcErrLog) ON ERROR DO probe_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() ON SHUTDOWN QUIT DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' IF gnHandle <= 0 STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) QUIT ENDIF gnIdUtil = 8 SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE LOCAL lcProcExistent lcProcExistent = SET("PROCEDURE") SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent lcProcExistent = SET("PROCEDURE") SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\mock_incarca_linii_prefix.prg", &lcProcExistent LOCAL lcPathVechi, lcPathNou lcPathVechi = SET("PATH") lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi SET PATH TO &lcPathNou PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip gnMockRaspuns = 7 gcMockUltimMesaj = '' gnMockUltimTip = 0 gnPass = 0 gnFail = 0 PUBLIC gcPretvSql, gcContSql gcPretvSql = '' gcContSql = '' DO Diagnostic WITH tnIdV STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) QUIT *============================================================================================== PROCEDURE Diagnostic LPARAMETERS tnIdV LOCAL lnDiscRon, lnDiscVal, lnGestionabile, lnCuPretv, lnArg, lnArgNenule, lnArgTotal LOCAL lnCuCont, lnSrcCuCont, lnCtTotal, lnCtNenule IncarcaArticoleFactura(tnIdV, 'crs_src_probe') STRTOFILE('--- PAS 1: sursa VVANZARI_ARTICOLE (crs_src_probe) ---' + CHR(13) + CHR(10), gcErrLog, 1) SELECT crs_src_probe SCAN STRTOFILE(' id_vanzare_det=' + TRANSFORM(id_vanzare_det) + ; ' id_articol=' + TRANSFORM(NVL(id_articol,-1)) + ; ' id_gestiune=' + IIF(ISNULL(id_gestiune), 'NULL', TRANSFORM(id_gestiune)) + ; ' in_stoc=' + TRANSFORM(NVL(in_stoc,-1)) + ; ' cont=[' + NVL(cont,'') + ']' + ; ' pret_achizitie=' + TRANSFORM(NVL(pret_achizitie,-1)) + CHR(13) + CHR(10), gcErrLog, 1) ENDSCAN SELECT COUNT(*) AS n FROM crs_src_probe WHERE !EMPTY(NVL(cont,'')) INTO CURSOR crs_cnt_cont lnSrcCuCont = crs_cnt_cont.n USE IN crs_cnt_cont DO asserteaza WITH 'P1 sursa contine cel putin o linie', RECCOUNT('crs_src_probe') > 0, TRANSFORM(RECCOUNT('crs_src_probe')) lnDiscRon = 0 lnDiscVal = 0 poDate = IncarcaAntetFacturaEditare(tnIdV, @lnDiscRon, @lnDiscVal) DO asserteaza WITH 'P2 antetul documentului ' + TRANSFORM(tnIdV) + ' s-a incarcat', VARTYPE(poDate) = 'O', VARTYPE(poDate) IF VARTYPE(poDate) <> 'O' RETURN ENDIF IncarcaLiniiFacturaEditare(poDate, tnIdV) DO asserteaza WITH 'P2 liniile s-au incarcat in crsfactura', ; USED('crsfactura') AND RECCOUNT('crsfactura') > 0, TRANSFORM(IIF(USED('crsfactura'), RECCOUNT('crsfactura'), -1)) IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0 RETURN ENDIF STRTOFILE('--- PAS 2: crsfactura dupa IncarcaLiniiFacturaEditare ---' + CHR(13) + CHR(10), gcErrLog, 1) lnGestionabile = 0 lnCuPretv = 0 lnCuCont = 0 SELECT crsfactura SCAN STRTOFILE(' id_temp=' + TRANSFORM(id_temp) + ; ' id_gestiune=' + IIF(ISNULL(id_gestiune), 'NULL', TRANSFORM(id_gestiune)) + ; ' gestionabil=' + TRANSFORM(gestionabil) + ; ' pret_achizitie=' + TRANSFORM(pret_achizitie) + ; ' cont=[' + Cont + ']' + ; ' pretv_orig=' + TRANSFORM(pretv_orig) + CHR(13) + CHR(10), gcErrLog, 1) IF !EMPTY(Cont) lnCuCont = lnCuCont + 1 ENDIF IF gestionabil = 1 lnGestionabile = lnGestionabile + 1 IF pretv_orig <> 0 lnCuPretv = lnCuPretv + 1 ENDIF ENDIF ENDSCAN DO asserteaza WITH 'P2 documentul are cel putin o linie gestionabila', lnGestionabile > 0, TRANSFORM(lnGestionabile) DO asserteaza WITH 'P2 crsfactura.pretv_orig e nenul pe liniile gestionabile', ; lnCuPretv = lnGestionabile AND lnGestionabile > 0, TRANSFORM(lnCuPretv) + '/' + TRANSFORM(lnGestionabile) DO asserteaza WITH 'P2 crsfactura.Cont e completat pe toate liniile care au CONT in sursa', ; lnCuCont = lnSrcCuCont AND lnSrcCuCont > 0, TRANSFORM(lnCuCont) + '/' + TRANSFORM(lnSrcCuCont) *!* normalizare locala: fara virgule in sirurile din SQL, ca argumentul 22 sa fie extractibil SELECT crsfactura REPLACE ALL explicatie WITH 'probe-s12', serie WITH '', lot WITH '', opt_facturare WITH 0 IN crsfactura GO TOP IN crsfactura DO RuleazaCuMock WITH 'PAS3' lnArgTotal = 0 lnArgNenule = 0 FOR lnArg = 1 TO GETWORDCOUNT(gcPretvSql, ';') lnArgTotal = lnArgTotal + 1 IF VAL(GETWORDNUM(gcPretvSql, lnArg, ';')) <> 0 lnArgNenule = lnArgNenule + 1 ENDIF ENDFOR DO asserteaza WITH 'P3 argumentul 22 (V_PRETV_ORIG) e nenul pe fiecare apel de articol', ; lnArgTotal > 0 AND lnArgNenule = lnArgTotal, gcPretvSql lnCtTotal = 0 lnCtNenule = 0 FOR lnArg = 1 TO GETWORDCOUNT(gcContSql, ';') lnCtTotal = lnCtTotal + 1 IF !EMPTY(STRTRAN(GETWORDNUM(gcContSql, lnArg, ';'), CHR(39), '')) lnCtNenule = lnCtNenule + 1 ENDIF ENDFOR DO asserteaza WITH 'P3 argumentul 16 (V_CONT) e nevid pe fiecare apel de articol', ; lnCtTotal > 0 AND lnCtNenule = lnCtTotal, gcContSql ENDPROC *============================================================================================== * RuleazaCuMock: do_scrie_articole() cu goExecutor mockat; strange argumentul 22 al fiecarui apel * pack_facturare.adauga_articol_factura in gcPretvSql, separat prin ';'. *============================================================================================== PROCEDURE RuleazaCuMock LPARAMETERS tcPrefix LOCAL loForm, loMock, loExecutorReal, llReturn loForm = CREATEOBJECT('frm_facturare_articole2') IF TYPE('plRegenerareEditare') <> 'U' RELEASE plRegenerareEditare ENDIF loExecutorReal = goExecutor loMock = CREATEOBJECT('MockGoExecutorS12Stoc') goExecutor = loMock llReturn = loForm.do_scrie_articole() goExecutor = loExecutorReal SQLROLLBACK(gnHandle) SQLSetProp(gnHandle, 'Transactions', 1) gcPretvSql = loMock.cPretv gcContSql = loMock.cCont STRTOFILE(tcPrefix + ' do_scrie_articole()=' + TRANSFORM(llReturn) + ; ' apeluri_articol=' + TRANSFORM(loMock.nApeluriArticol) + ; ' argumente_22=[' + gcPretvSql + ']' + ; ' argumente_16=[' + gcContSql + ']' + CHR(13) + CHR(10), gcErrLog, 1) STRTOFILE(tcPrefix + ' --- ultimul SQL de articol ---' + CHR(13) + CHR(10) + ; TRANSFORM(loMock.cSqlUltim) + CHR(13) + CHR(10), gcErrLog, 1) RELEASE loForm 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: ' + TRANSFORM(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1) ENDIF ENDPROC PROCEDURE probe_error_handler LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) IF TYPE('gnHandle') = 'N' AND gnHandle > 0 SQLROLLBACK(gnHandle) SQLSetProp(gnHandle, 'Transactions', 1) ENDIF gnFail = gnFail + 1 STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) STRTOFILE('end (eroare) ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) QUIT ENDPROC *============================================================================================== DEFINE CLASS MockGoExecutorS12Stoc AS Custom cPretv = '' cCont = '' cSqlUltim = '' nApeluri = 0 nApeluriArticol = 0 cEroare = '' FUNCTION oExecute(tcSql) LOCAL lcSql, lnPoz, lcRest THIS.nApeluri = THIS.nApeluri + 1 IF VARTYPE(m.tcSql) <> 'C' RETURN 1 ENDIF lcSql = m.tcSql lnPoz = AT('adauga_articol_factura(', lcSql) DO WHILE lnPoz > 0 THIS.nApeluriArticol = THIS.nApeluriArticol + 1 lcRest = SUBSTR(lcSql, lnPoz + LEN('adauga_articol_factura(')) THIS.cPretv = THIS.cPretv + ALLTRIM(GETWORDNUM(lcRest, 22, ',')) + ';' THIS.cCont = THIS.cCont + ALLTRIM(GETWORDNUM(lcRest, 16, ',')) + ';' THIS.cSqlUltim = m.tcSql lcSql = lcRest lnPoz = AT('adauga_articol_factura(', lcSql) ENDDO RETURN 1 ENDFUNC FUNCTION oExecuta(tcSql, tcCursor) THIS.nApeluri = THIS.nApeluri + 1 IF VARTYPE(m.tcCursor) = 'C' AND !EMPTY(m.tcCursor) IF USED(m.tcCursor) USE IN (m.tcCursor) ENDIF CREATE CURSOR (m.tcCursor) (xdummy I) ENDIF RETURN .T. ENDFUNC FUNCTION oPrelucrareEroare() RETURN 'MockGoExecutorS12Stoc: ' + THIS.cEroare ENDFUNC ENDDEFINE