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.5 KiB
Plaintext
200 lines
8.5 KiB
Plaintext
* test_s3_controale.prg
|
|
* Headless: controalele de antet adaugate pe frm_facturare_articole2 exista dupa Createobject,
|
|
* iar frm_date_factura (calea veche, neatinsa) le are in continuare.
|
|
*
|
|
* Rezultat asteptat (declarat inainte de rulare), pe poDate tip 1, gnScadereStoc = 0 (fara gestiune
|
|
* sursa: Init-ul de antet elimina Ct_clb_gestiune_init pe tip 1, deci dupa pasul 1 acesta e ABSENT):
|
|
* frm_facturare_articole2: Clb_dataireg, Ct_clb_politici_preturi(*), txtCodFiscal, lblCodFiscal,
|
|
* txtSoldLei, lblSoldLei, But_verifica1 -> PEMSTATUS(...,5) = .T.
|
|
* Ct_clb_gestiune_init -> prezent DOAR daca Init-ul de antet (pasul 1) nu e inca portat; dupa
|
|
* pasul 1 e eliminat pe tip 1 (ca pe frm_date_factura). Se logheaza, nu se asserteaza.
|
|
* (*) dupa pasul 1, pe factura Ct_clb_politici_preturi e eliminat (control doar de aviz).
|
|
* Clb_dataireg.Text_simplu1.ControlSource = 'poDate.dataireg'
|
|
* Prezenta = apartenenta la colectia Objects (PEMSTATUS/TYPE raman .T. dupa RemoveObject).
|
|
* frm_date_factura (acelasi poDate): Clb_dataireg, txtCodFiscal, lblCodFiscal, txtSoldLei,
|
|
* lblSoldLei, But_verifica1 -> .T.; Ct_clb_gestiune_init -> .F. (eliminat de Init pe tip 1).
|
|
*
|
|
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3_controale.prg"
|
|
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_controale.log
|
|
|
|
SET SAFETY OFF
|
|
SET TALK OFF
|
|
SET NOTIFY OFF
|
|
PUBLIC gcLog, gnFail, gnPass
|
|
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_controale.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
|
|
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
|
|
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE
|
|
PUBLIC gcMockUltimMesaj, gnMockUltimTip
|
|
gcMockUltimMesaj = ""
|
|
gnMockUltimTip = 0
|
|
DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna)
|
|
IF !actualizeaza_optiuni_program()
|
|
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
|
|
DO Final
|
|
ENDIF
|
|
gnScadereStoc = 0
|
|
* seriile de facturi (tipdoc 5) sunt pe utilizator in MARIUSM_AUTO: utilizatorul 8 are plaja activa 2010-2099
|
|
gnIdUtil = 8
|
|
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
|
|
DO AfLog WITH "gnScadereStoc=" + TRANSFORM(gnScadereStoc) + " gnScadentaAutomata=" + TRANSFORM(gnScadentaAutomata)
|
|
|
|
PRIVATE poDate, poGeneratorNumere, plVizibil
|
|
plVizibil = .F.
|
|
DO AfLog WITH "creez poDate"
|
|
poDate = CREATEOBJECT("oDateFactura", 25000, 1)
|
|
DO AfLog WITH "poDate creat"
|
|
poDate.nIdTipDoc = 5
|
|
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
|
|
poGeneratorNumere.ResetNumere()
|
|
DO AfLog WITH "generator creat"
|
|
DO ProbaSerii WITH poDate.nIdTipDoc
|
|
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
|
|
DO AfLog WITH "poDate tip=1 rezultat_serii=" + TRANSFORM(poDate.rezultat_serii) + " ultim amessagebox=[" + gcMockUltimMesaj + "]"
|
|
IF USED('crscursuri')
|
|
USE IN crscursuri
|
|
ENDIF
|
|
CREATE CURSOR crscursuri (curs N(12,4), nume_val C(10), multiplicator N(6))
|
|
DO creeaza_facturacrs WITH 'crsfactura'
|
|
* grd_factura.cGestiune e legat la crsFactura.gestiune, camp inexistent in creeaza_facturacrs (nume_gestiune)
|
|
SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE
|
|
USE IN crsfactura
|
|
SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE
|
|
USE IN crsfact_tmp
|
|
* gridextras.vcx e referit din ofacturare.vcx cu cale relativa (..\utile\gridextras), rezolvabila doar din exe/IDE
|
|
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
|
|
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
|
|
* grd_factura.cCodMat.cboCodmat e declarat AS combosql OF cautare.vcx, dar clasa e definita in _cb_base.vcx
|
|
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE
|
|
|
|
LOCAL loNou, loVechi, lcC
|
|
DO AfLog WITH "creez frm_facturare_articole2"
|
|
* clasa REALA (nu subclasa: pe o subclasa RemoveObject nu scoate membrii definiti in parinte).
|
|
* Atentie: metoda Error a prototipului face SET STEP ON - orice eroare in Init deschide debugger-ul
|
|
* si blocheaza rularea headless; diagnosticul se face atunci cu o subclasa cu Error care logheaza.
|
|
loNou = CREATEOBJECT('frm_facturare_articole2')
|
|
DO Assert WITH VARTYPE(loNou) = 'O', "Createobject frm_facturare_articole2"
|
|
IF VARTYPE(loNou) = 'O'
|
|
LOCAL laC[6], i
|
|
laC[1] = "Clb_dataireg"
|
|
laC[2] = "txtCodFiscal"
|
|
laC[3] = "lblCodFiscal"
|
|
laC[4] = "txtSoldLei"
|
|
laC[5] = "lblSoldLei"
|
|
laC[6] = "But_verifica1"
|
|
FOR i = 1 TO 6
|
|
DO Assert WITH ObjExists(loNou, laC[i]), "nou: " + laC[i] + " prezent"
|
|
ENDFOR
|
|
DO AfLog WITH "nou: Ct_clb_gestiune_init prezent=" + TRANSFORM(ObjExists(loNou, 'Ct_clb_gestiune_init')) + ;
|
|
" Ct_clb_politici_preturi prezent=" + TRANSFORM(ObjExists(loNou, 'Ct_clb_politici_preturi'))
|
|
DO Assert WITH loNou.Clb_dataireg.Text_simplu1.ControlSource == 'poDate.dataireg', "nou: Clb_dataireg.ControlSource"
|
|
DO Assert WITH loNou.Clb_dataireg.Top >= 30, "nou: Clb_dataireg sub bara de titlu (Top=" + TRANSFORM(loNou.Clb_dataireg.Top) + ")"
|
|
DO Assert WITH PEMSTATUS(loNou, 'cgestiune_init', 5) AND PEMSTATUS(loNou, 'lcopiere', 5) AND PEMSTATUS(loNou, 'nid_tip', 5) ;
|
|
AND PEMSTATUS(loNou, 'nsoldlei', 5) AND PEMSTATUS(loNou, 'nsoldvaluta', 5) AND PEMSTATUS(loNou, 'ntip', 5), "nou: proprietati *p: materializate"
|
|
* C6: Error nu mai face SET STEP ON - o eroare provocata nu blocheaza rularea
|
|
LOCAL llErr
|
|
llErr = .F.
|
|
TRY
|
|
loNou.metoda_inexistenta_s3()
|
|
CATCH
|
|
llErr = .T.
|
|
ENDTRY
|
|
DO Assert WITH llErr, "C6: eroarea provocata (metoda inexistenta) a fost prinsa, fara blocaj"
|
|
loNou.Error(1, 'test', 1)
|
|
DO Assert WITH .T., "C6: apel direct o.Error(1,'test',1) a revenit"
|
|
loNou.Release()
|
|
RELEASE loNou
|
|
ENDIF
|
|
|
|
loVechi = CREATEOBJECT('frm_date_factura')
|
|
DO Assert WITH VARTYPE(loVechi) = 'O', "Createobject frm_date_factura"
|
|
IF VARTYPE(loVechi) = 'O'
|
|
FOR i = 1 TO 6
|
|
DO Assert WITH ObjExists(loVechi, laC[i]), "vechi: " + laC[i] + " prezent"
|
|
ENDFOR
|
|
DO Assert WITH !ObjExists(loVechi, 'Ct_clb_gestiune_init'), "vechi: Ct_clb_gestiune_init eliminat pe tip 1"
|
|
loVechi.Release()
|
|
RELEASE loVechi
|
|
ENDIF
|
|
|
|
DO Final
|
|
|
|
PROCEDURE ProbaSerii
|
|
* apel direct al procedurii Oracle din creeaza_cursor_serii: logheaza eroarea reala (goExecutor
|
|
* ar deschide amessagebox modal, care agata rularea headless) si incalzeste starea pachetului
|
|
LPARAMETERS tnIdTipDoc
|
|
LOCAL lnOk, laErr[1], i, lcSql
|
|
PRIVATE pnIdTipDoc, pnRezultat
|
|
pnIdTipDoc = tnIdTipDoc
|
|
pnRezultat = 0
|
|
lcSql = "{call " + gcS + ".pack_serii_numere.verifica_cursor_serii(?pnIdTipDoc,?gnIdUtil,?gnIdSucursala,?@pnRezultat)}"
|
|
FOR i = 1 TO 3
|
|
lnOk = SQLEXEC(gnHandle, lcSql, "crsprobaserii")
|
|
IF lnOk > 0
|
|
DO AfLog WITH "proba serii OK la incercarea " + TRANSFORM(i) + ", pnRezultat=" + TRANSFORM(pnRezultat) + " randuri=" + TRANSFORM(RECCOUNT("crsprobaserii"))
|
|
USE IN (SELECT("crsprobaserii"))
|
|
EXIT
|
|
ELSE
|
|
AERROR(laErr)
|
|
DO AfLog WITH "proba serii ESEC la incercarea " + TRANSFORM(i) + ": " + TRANSFORM(laErr[1]) + " / " + TRANSFORM(laErr[2]) + " / " + TRANSFORM(laErr[5])
|
|
ENDIF
|
|
ENDFOR
|
|
ENDPROC
|
|
|
|
FUNCTION ObjExists
|
|
* prezenta reala in colectia Objects, cautare recursiva - controalele pot fi in containere
|
|
LPARAMETERS toContainer, tcName
|
|
LOCAL i, loO
|
|
FOR i = 1 TO toContainer.Objects.Count
|
|
loO = toContainer.Objects(i)
|
|
IF UPPER(loO.Name) == UPPER(tcName)
|
|
RETURN .T.
|
|
ENDIF
|
|
IF TYPE('loO.Objects.Count') = 'N'
|
|
IF ObjExists(loO, tcName)
|
|
RETURN .T.
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
RETURN .F.
|
|
ENDFUNC
|
|
|
|
PROCEDURE Assert
|
|
LPARAMETERS tlCond, tcMsg
|
|
IF tlCond
|
|
gnPass = gnPass + 1
|
|
DO AfLog WITH "PASS: " + tcMsg
|
|
ELSE
|
|
gnFail = gnFail + 1
|
|
DO AfLog WITH "FAIL: " + 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 " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
|
|
ENDPROC
|
|
|
|
PROCEDURE Final
|
|
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail)
|
|
DO AfLog WITH "END " + TTOC(DATETIME())
|
|
QUIT
|
|
ENDPROC
|