Squash al branch-ului de lucru plan13-s2. Clase: ofacturare (nucleul formularului unificat), ofacturare_comun, ferestre_cere_date, ocomenzi, caut_ora (lista de preturi in combo-urile de cautare), omodificari. Programe: ofacturare impartit - ofacturare_antet, ofacturare_rutare_scriere si ogrid_latimi sunt fisiere noi; oproceduri_facturare primeste discountul pe linie si cota standard de TVA cand articolul nu are cota pe politica. Documentatie: capcana SQLExec no_data_found, conventia de encoding, depanarea testelor VFP si regulile de lucru - conflictele cu modificarile venite din alte proiecte sunt rezolvate pastrand ambele parti. Loguri de rulare a testelor scoase din versionare; testele raman. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PkyjGyrV2S7932om4kfSiK
283 lines
10 KiB
Plaintext
283 lines
10 KiB
Plaintext
* 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
|