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
200 lines
8.4 KiB
Plaintext
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
|