Files
comun/utile/Teste/facturare_unificat/test_s5c_legatura_sql.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

200 lines
8.4 KiB
Plaintext

* test_s5c_legatura_sql.prg
* Headless (-A -T): S5c, contractul Oracle al legaturii proforma -> factura, izolat de UI.
* Ruleaza EXACT blocul anonim pe care il trimite scrie_legatura_proforma() (ofacturare_comun.prg):
* begin pack_facturare.nid_vanzare := <factura>; pack_facturare.clistaid := '<proforma>';
* pack_facturare.scrie_corespondente_vanzari(4); end;
* B1 - numaratoarea initiala a randurilor TIP = 4 din VANZARI_CORESP
* B2 - alege o proforma reala si o factura reala fara corespondente (daca nu exista, SARIT)
* B3 - blocul anonim, in tranzactie MANUALA
* B4 - randul TIP = 4 factura -> proforma exista si e unic
* B5 - efectul colateral masurat: VANZARI.AVIZE al facturii contine seria+numarul proformei
* B6 - ROLLBACK; numaratoarea TIP = 4 revine la valoarea de la B1 (testul nu lasa date in urma)
*
* Nu emite documente si nu consuma numere. Toate scrierile sunt anulate de ROLLBACK-ul de la B6;
* Final() mai face un rollback defensiv si readuce conexiunea pe tranzactie automata.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s5c_legatura_sql.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5c_legatura_sql.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gnSarit, gcCaz, gnH, glManual
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5c_legatura_sql.log"
IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out")
MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out"
ENDIF
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog)
gnFail = 0
gnPass = 0
gnSarit = 0
gcCaz = ""
glManual = .F.
ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF TYPE('gnHandle') <> 'N' OR gnHandle <= 0
DO AfLog WITH "FAIL: conexiune Oracle esuata"
DO Final
ENDIF
SQLSETPROP(gnHandle, "QueryTimeOut", 45)
IF TYPE('goExecutor.nHandle') = 'N' AND goExecutor.nHandle > 0 AND goExecutor.nHandle <> gnHandle
SQLSETPROP(goExecutor.nHandle, "QueryTimeOut", 45)
ENDIF
PUBLIC gcMockUltimMesaj, gnMockUltimTip
gcMockUltimMesaj = ""
gnMockUltimTip = 0
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
* toate scrierile si toate citirile trec prin goExecutor -> tranzactia se deschide pe handle-ul LUI,
* altfel ROLLBACK-ul de la B6 ar anula alta sesiune decat cea care a scris
gnH = IIF(TYPE('goExecutor.nHandle') = 'N' AND goExecutor.nHandle > 0, goExecutor.nHandle, gnHandle)
DO AfLog WITH "ENV OK gnHandle=" + TRANSFORM(gnHandle) + " goExecutor.nHandle=" + TRANSFORM(gnH)
DO TestLegaturaTip4
DO Final
*----------------------------------------------------------------------------------------
PROCEDURE TestLegaturaTip4
LOCAL lnInainte, lnProf, lnFact, lnDupaInsert, lnAvize, lnDupaRollback, lnSucces
gcCaz = "[B legatura TIP = 4 pe contractul Oracle] "
* B1
lnInainte = ValoareScalara([select count(*) as nr from vanzari_coresp where tip = 4])
DO Assert WITH lnInainte >= 0, "B1 numaratoare initiala TIP = 4 citita, e=" + TRANSFORM(lnInainte)
IF lnInainte < 0
RETURN
ENDIF
DO AfLog WITH "B1: vanzari_coresp tip=4 inainte = " + TRANSFORM(lnInainte)
* B2 - nu se inventeaza date: fara proforma sau fara factura libera, pasul e SARIT
lnProf = ValoareScalara([select id_vanzare as nr from (select id_vanzare from vanzari ] + ;
[where sters = 0 and nvl(eproforma,0) = 1 order by id_vanzare desc) where rownum = 1])
lnFact = ValoareScalara([select id_vanzare as nr from (select v.id_vanzare from vanzari v ] + ;
[where v.sters = 0 and nvl(v.eproforma,0) = 0 and v.tip in (1,5,7,10) ] + ;
[and not exists (select 1 from vanzari_coresp c where c.id_vanzare_fact = v.id_vanzare) ] + ;
[order by v.id_vanzare desc) where rownum = 1])
DO AfLog WITH "B2: lnProf=" + TRANSFORM(lnProf) + " lnFact=" + TRANSFORM(lnFact)
IF lnProf <= 0 OR lnFact <= 0
DO AfLog WITH "SARIT - " + gcCaz + "nu exista in MARIUSM_AUTO o proforma (lnProf=" + TRANSFORM(lnProf) + ;
") si/sau o factura fara corespondente (lnFact=" + TRANSFORM(lnFact) + ")"
gnSarit = gnSarit + 1
RETURN
ENDIF
* tranzactie manuala pe handle-ul lui goExecutor - acelasi tipar ca do_deschide_tranzactie
goExecutor.oExecuta([select * from dual])
lnSucces = SQLSETPROP(gnH, "Transactions", 2)
IF lnSucces < 0
DO Assert WITH .F., "trecerea pe tranzactie manuala a esuat - testul NU se ruleaza (ar lasa date)"
RETURN
ENDIF
glManual = .T.
DO AfLog WITH "tranzactie MANUALA deschisa pe handle " + TRANSFORM(gnH)
* B3 - blocul anonim, identic cu cel construit de scrie_legatura_proforma()
lnSucces = goExecutor.oExecute([begin pack_facturare.nid_vanzare := ] + ALLTRIM(STR(lnFact, 20, 0)) + [;] + ;
[ pack_facturare.clistaid := '] + ALLTRIM(STR(lnProf, 20, 0)) + [';] + ;
[ pack_facturare.scrie_corespondente_vanzari(4); end;])
DO Assert WITH lnSucces >= 0, "B3 blocul anonim s-a executat fara eroare Oracle, succes=" + TRANSFORM(lnSucces) + ;
" eroare=" + IIF(lnSucces < 0, TRANSFORM(goExecutor.cEroare), "")
IF lnSucces < 0
DO FaRollback
RETURN
ENDIF
* B4
lnDupaInsert = ValoareScalara([select count(*) as nr from vanzari_coresp where sters = 0 and tip = 4 ] + ;
[and id_vanzare_fact = ] + ALLTRIM(STR(lnFact, 20, 0)) + ;
[ and id_vanzare_aviz = ] + ALLTRIM(STR(lnProf, 20, 0)))
DO Assert WITH lnDupaInsert = 1, "B4 exact un rand TIP = 4 factura -> proforma, e=" + TRANSFORM(lnDupaInsert)
DO AfLog WITH "B4: randuri tip=4 fact=" + TRANSFORM(lnFact) + " aviz=" + TRANSFORM(lnProf) + " -> " + TRANSFORM(lnDupaInsert)
* B5 - efectul colateral din 1.5, masurat nu presupus: comparatia se face in SQL, ca sa nu depinda
* de formatarea numarului in VFP
lnAvize = ValoareScalara([select count(*) as nr from vanzari f where f.id_vanzare = ] + ALLTRIM(STR(lnFact, 20, 0)) + ;
[ and f.avize like '%' || (select nvl(p.serie_act,'') || chr(32) || p.numar_act from vanzari p ] + ;
[where p.id_vanzare = ] + ALLTRIM(STR(lnProf, 20, 0)) + [) || '%'])
DO Assert WITH lnAvize = 1, "B5 VANZARI.AVIZE al facturii contine seria+numarul proformei (efect colateral cunoscut), e=" + ;
TRANSFORM(lnAvize)
DO AfLog WITH "B5: VANZARI.AVIZE contine seria+numarul proformei -> " + TRANSFORM(lnAvize)
* B6
DO FaRollback
lnDupaRollback = ValoareScalara([select count(*) as nr from vanzari_coresp where tip = 4])
DO Assert WITH lnDupaRollback = lnInainte, ;
"B6 dupa ROLLBACK numaratoarea TIP = 4 revine la valoarea initiala, inainte=" + TRANSFORM(lnInainte) + ;
" dupa=" + TRANSFORM(lnDupaRollback)
DO AfLog WITH "B6: vanzari_coresp tip=4 dupa rollback = " + TRANSFORM(lnDupaRollback)
ENDPROC
PROCEDURE FaRollback
LOCAL lnSucces
IF !glManual
RETURN
ENDIF
lnSucces = SQLROLLBACK(gnH)
DO AfLog WITH "ROLLBACK succes=" + TRANSFORM(lnSucces)
SQLSETPROP(gnH, "Transactions", 1)
glManual = .F.
ENDPROC
FUNCTION ValoareScalara
LPARAMETERS tcSql
LOCAL lnRez, lnSucces
lnRez = -1
lnSucces = goExecutor.oExecute(tcSql, [crsscalar])
IF lnSucces >= 0 AND USED('crsscalar')
IF RECCOUNT('crsscalar') > 0
SELECT crsscalar
GO TOP
lnRez = NVL(crsscalar.nr, 0)
ELSE
lnRez = 0
ENDIF
USE IN (SELECT('crsscalar'))
ELSE
DO AfLog WITH "SQL ESEC: " + TRANSFORM(goExecutor.cEroare) + " | " + tcSql
ENDIF
RETURN lnRez
ENDFUNC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL: " + gcCaz + tcMsg
ENDIF
ENDPROC
PROCEDURE AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gnFail = gnFail + 1
DO AfLog WITH "ERROR " + gcCaz + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
* rollback defensiv: daca testul a cazut in mijloc, nimic nu ramane scris
IF glManual
DO AfLog WITH "rollback defensiv (tranzactia era inca deschisa)"
DO FaRollback
ENDIF
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " sarit=" + TRANSFORM(gnSarit)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC