Files
comun/utile/Teste/editare_factura/probe_s12_gestiune.prg
Marius Mutu 8e022d332e #13: formular de facturare unificat - etapa curenta
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
2026-09-09 21:38:25 +03:00

279 lines
9.7 KiB
Plaintext

* probe_s12_gestiune.prg
* Proba care APARA reparatia FACT-007 (docs\propunere_fact007_gestiune.md, aplicata in
* ofacturare_editare.prg): verifica ca id_gestiune ajunge de la VANZARI_DETALII pana la
* argumentul V_ID_GESTIUNE al apelului pack_facturare.adauga_articol_factura, cu NULL in sursa
* mapat la -1000. Cade daca reparatia dispare sau daca e inlocuita cu o alta valoare (ex. 0).
* NIMIC nu se scrie in Oracle: citirile sunt reale, dar do_scrie_articole() ruleaza cu goExecutor
* mockat (tipar identic cu test_s11_izolare_camp_1472.prg).
*
* Pasul 1: sursa reala (VVANZARI_ARTICOLE prin IncarcaArticoleFactura) - construieste harta
* id_temp -> gestiune asteptata (NULL -> -1000).
* Pasul 2: crsfactura dupa IncarcaLiniiFacturaEditare - compara linie cu linie cu harta.
* Pasul 3: SQL-ul generat de do_scrie_articole, argumentul 6 (V_ID_GESTIUNE) per apel, comparat
* cu harta.
* Pasul 4: rerulare pe acelasi crsfactura - verifica idempotenta rezultatului.
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_gestiune_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
*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul
LOCAL lcProcExistent
lcProcExistent = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.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 gcGestiuniSql
gcGestiuniSql = ''
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, lnRanduri, lnCorecte, lcAsteptatGestiuni, lnGestAsteptata
*!* PASUL 1: sursa reala, inainte de orice prelucrare; construieste harta id_temp -> gestiune asteptata
IncarcaArticoleFactura(tnIdV, 'crs_src_probe')
IF USED('crs_gest_expect')
USE IN crs_gest_expect
ENDIF
CREATE CURSOR crs_gest_expect (id_temp N(10), gest_exp N(10))
INDEX ON id_temp TAG id_temp
STRTOFILE('--- PAS 1: sursa VVANZARI_ARTICOLE (crs_src_probe) ---' + CHR(13) + CHR(10), gcErrLog, 1)
LOCAL lnIdTempSrc, lnGestExpSrc
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)) + CHR(13) + CHR(10), gcErrLog, 1)
lnIdTempSrc = id_vanzare_det
lnGestExpSrc = NVL(id_gestiune,-1000)
INSERT INTO crs_gest_expect (id_temp, gest_exp) VALUES (lnIdTempSrc, lnGestExpSrc)
ENDSCAN
DO asserteaza WITH 'P1 sursa contine cel putin o linie', RECCOUNT('crs_src_probe') > 0, TRANSFORM(RECCOUNT('crs_src_probe'))
*!* PASUL 2: incarcarea de editare
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)
lnRanduri = 0
lnCorecte = 0
lcAsteptatGestiuni = ''
SELECT crsfactura
SCAN
lnRanduri = lnRanduri + 1
lnGestAsteptata = GestiuneAsteptata(id_temp)
STRTOFILE(' id_temp=' + TRANSFORM(id_temp) + ;
' id_articol=' + IIF(ISNULL(id_articol), 'NULL', TRANSFORM(id_articol)) + ;
' id_gestiune=' + IIF(ISNULL(id_gestiune), 'NULL', TRANSFORM(id_gestiune)) + ;
' gestionabil=' + TRANSFORM(gestionabil) + CHR(13) + CHR(10), gcErrLog, 1)
IF NVL(id_gestiune,-9999999) = lnGestAsteptata
lnCorecte = lnCorecte + 1
ENDIF
lcAsteptatGestiuni = lcAsteptatGestiuni + ALLTRIM(STR(lnGestAsteptata)) + ';'
ENDSCAN
DO asserteaza WITH 'P2 liniile din crsfactura poarta gestiunea din sursa (NULL -> -1000)', ;
lnCorecte = lnRanduri AND lnRanduri > 0, TRANSFORM(lnCorecte) + '/' + TRANSFORM(lnRanduri)
*!* normalizare locala: fara virgule in sirurile din SQL, ca argumentul 6 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
*!* PASUL 3: ce ajunge in SQL, cu mock (nimic nu se executa in Oracle)
DO RuleazaCuMock WITH 'PAS3'
DO asserteaza WITH 'P3 argumentul 6 (V_ID_GESTIUNE) e gestiunea sursei pe fiecare apel', ;
gcGestiuniSql == lcAsteptatGestiuni, gcGestiuniSql + ' <> ' + lcAsteptatGestiuni
*!* PASUL 4: idempotenta - a doua rulare pe acelasi crsfactura trebuie sa dea acelasi rezultat
GO TOP IN crsfactura
DO RuleazaCuMock WITH 'PAS4-idempotenta'
DO asserteaza WITH 'P4 a doua rulare da acelasi argument 6 (idempotenta)', ;
gcGestiuniSql == lcAsteptatGestiuni, gcGestiuniSql + ' <> ' + lcAsteptatGestiuni
ENDPROC
*==============================================================================================
* RuleazaCuMock: do_scrie_articole() cu goExecutor mockat; strange argumentul 6 al fiecarui apel
* pack_facturare.adauga_articol_factura in gcGestiuniSql, 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('MockGoExecutorS12Gest')
goExecutor = loMock
llReturn = loForm.do_scrie_articole()
goExecutor = loExecutorReal
SQLROLLBACK(gnHandle)
SQLSetProp(gnHandle, 'Transactions', 1)
gcGestiuniSql = loMock.cGestiuni
STRTOFILE(tcPrefix + ' do_scrie_articole()=' + TRANSFORM(llReturn) + ;
' apeluri_articol=' + TRANSFORM(loMock.nApeluriArticol) + ;
' argumente_6=[' + gcGestiuniSql + ']' + 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 GestiuneAsteptata
LPARAMETERS tnIdTemp
LOCAL lnRet, lnSelPrev
lnSelPrev = SELECT()
SELECT crs_gest_expect
IF SEEK(m.tnIdTemp)
lnRet = gest_exp
ELSE
lnRet = -9999999
ENDIF
SELECT (lnSelPrev)
RETURN lnRet
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 MockGoExecutorS12Gest AS Custom
cGestiuni = ''
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.cGestiuni = THIS.cGestiuni + ALLTRIM(GETWORDNUM(lcRest, 6, ',')) + ';'
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 'MockGoExecutorS12Gest: ' + THIS.cEroare
ENDFUNC
ENDDEFINE