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

366 lines
14 KiB
Plaintext

* test_s4d_zi_curs.prg
* Headless: S4d - data cursului valutar, reactiva (frm_facturare_articole2, v2).
* Acopera direct: metoda noua do_actualizeaza_vizibilitate_curs (COMUN\clase\ofacturare.vc2)
* si proprietatea noua loRezultat.lForteazaCursVizibil pusa de incarca_cursor_articole
* (COMUN\programe\ofacturare.prg:444-637) la eroarea Oracle -20005.
*
* Cazuri:
* T1. incarca_cursor_articole, mock Oracle -20005 (FARA/-1/20005) -> loRezultat.lForteazaCursVizibil = .T.
* T2. incarca_cursor_articole, mock succes (PLIN/1/0) -> loRezultat.lForteazaCursVizibil = .F.
* T3. incarca_cursor_articole, mock alta eroare (FARA/-1/1400) -> loRezultat.lForteazaCursVizibil = .F.
* T4. do_actualizeaza_vizibilitate_curs, poDate.in_valuta = 1 -> Visible = .T.
* T5. do_actualizeaza_vizibilitate_curs, in_valuta=0, 0 linii tip_valuta=1 -> Visible = .F.
* T6. do_actualizeaza_vizibilitate_curs, in_valuta=0, 1 linie tip_valuta=1 -> Visible = .T. (apare reactiv)
* T7. dupa stergerea liniei din T6 -> Visible = .F. (dispare reactiv)
* T8. do_actualizeaza_vizibilitate_curs(.T.), in_valuta=0, 0 linii tip_valuta=1 -> Visible = .T. (fortare -20005)
* T9. formular pe retur (tip 8): clb_zi_curs eliminat la Init; do_actualizeaza_vizibilitate_curs()
* nu arunca eroare (garda do_exista_obiect).
* T10. do_incarca_articole (tip=4, mock Oracle -20005): Return .F., si daca clb_zi_curs.Visible e
* citibil headless, verifica ca a devenit .T. (fortat de lForteazaCursVizibil). Citirea insasi
* e proba - daca nu e citibila, cazul se raporteaza informativ, nu esec.
*
* Oracle NU se atinge pe calea articolelor: goExecutor -> oExecutorMock (mock_cursor_articole.prg,
* deja folosit de test_s3_4_cursor_articole.prg si test_s4_3_incarca_filtrat.prg pentru exact acelasi
* scenariu -20005). poGeneratorNumere -> oGeneratorMock. amessagebox/facturi_duplicate ->
* mock_validare_antet.prg (T10, valideaza_antet ruleaza REAL).
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s4d_zi_curs.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4d_zi_curs.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 1.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr
PUBLIC gcMockApeluri, gnMockNumar, gcMockSql, gnMockSucces, gnMockEroare, gcMockMod, gcMockCurs
PUBLIC gnMockRaspuns, gcMockDuplicat, goExecutorReal
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4d_zi_curs.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
gnErr = 0
gcCaz = ""
gcErr = ""
gcMockApeluri = ""
gnMockNumar = 0
gcMockSql = ""
gnMockSucces = 1
gnMockEroare = 0
gcMockMod = "PLIN"
gcMockCurs = ""
gnMockRaspuns = 6
gcMockDuplicat = ""
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
LOCAL lcProc
lcProc = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", ;
"D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_cursor_articole.prg", ;
&lcProc, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg"
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;])
gnScadereStoc = 1
DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna)
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE
update_jtva_coloane([JV], [jtva_coloane_temp])
PRIVATE poDate, poGeneratorNumere, plVizibil, pnTotalDiscountAvize
plVizibil = .F.
pnTotalDiscountAvize = 0
poGeneratorNumere = CREATEOBJECT("oGeneratorMock")
poDate = NULL
goExecutorReal = goExecutor
goExecutor = CREATEOBJECT("oExecutorMock")
goExecutor.oReal = goExecutorReal
DO TestFlagEroare WITH "T1", 1, "FARA", -1, 20005, .T.
DO TestFlagEroare WITH "T2", 1, "PLIN", 1, 0, .F.
DO TestFlagEroare WITH "T3", 1, "FARA", -1, 1400, .F.
DO TestVizibilitate
DO TestRetur
DO TestIncarcaArticoleEroare
DO Final
*----------------------------------------------------------------------------------------
* T1-T3: proprietatea noua loRezultat.lForteazaCursVizibil pe incarca_cursor_articole.
PROCEDURE TestFlagEroare
LPARAMETERS tcCaz, tnTip, tcMod, tnSucces, tnEroare, tlAsteptat
LOCAL loRez
gcCaz = "[" + tcCaz + " mod=" + tcMod + " succes=" + TRANSFORM(tnSucces) + " eroare=" + TRANSFORM(tnEroare) + "] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH tnTip, tcMod, tnSucces, tnEroare, 0
loRez = incarca_cursor_articole(tnTip, .F., poGeneratorNumere)
DO Assert WITH VARTYPE(loRez) = 'O', "incarca_cursor_articole a intors obiect"
IF VARTYPE(loRez) <> 'O'
RETURN
ENDIF
DO Assert WITH PEMSTATUS(loRez, 'lForteazaCursVizibil', 5), "lForteazaCursVizibil materializata pe loRezultat"
DO Assert WITH loRez.lForteazaCursVizibil = tlAsteptat, "lForteazaCursVizibil = " + TRANSFORM(tlAsteptat) + " (obtinut: " + TRANSFORM(loRez.lForteazaCursVizibil) + ")"
DO Assert WITH loRez.nSucces = tnSucces, "nSucces = " + TRANSFORM(tnSucces) + " (obtinut: " + TRANSFORM(loRez.nSucces) + ")"
ENDPROC
*----------------------------------------------------------------------------------------
* T4-T8: matricea de vizibilitate a do_actualizeaza_vizibilitate_curs pe formularul instantiat.
PROCEDURE TestVizibilitate
LOCAL loForm, llVal, lnErrAntes, llCitibil
gcCaz = "[T4-T8 vizibilitate] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 1, "PLIN", 1, 0, 0
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
DO Assert WITH loForm.do_exista_obiect('clb_zi_curs'), "clb_zi_curs prezent (tip normal, nu retur)"
* T4: in_valuta = 1 -> vizibil neconditionat
poDate.in_valuta = 1
loForm.do_actualizeaza_vizibilitate_curs()
DO Assert WITH gnErr = 0, "T4 fara eroare (gcErr: " + gcErr + ")"
lnErrAntes = gnErr
llVal = .F.
llVal = loForm.clb_zi_curs.Visible
llCitibil = (gnErr = lnErrAntes)
IF llCitibil
DO Assert WITH llVal, "T4: clb_zi_curs.Visible = .T. cu in_valuta=1"
ELSE
DO AfLog WITH "INFO T4: clb_zi_curs.Visible nu s-a putut citi headless (eroare la citire)"
ENDIF
* T5: in_valuta = 0, 0 linii tip_valuta=1 -> ascuns
poDate.in_valuta = 0
loForm.do_actualizeaza_vizibilitate_curs()
DO Assert WITH gnErr = 0, "T5 fara eroare (gcErr: " + gcErr + ")"
IF llCitibil
llVal = loForm.clb_zi_curs.Visible
DO Assert WITH !llVal, "T5: clb_zi_curs.Visible = .F. cu in_valuta=0 si 0 linii valuta"
ENDIF
* T6: adauga o linie tip_valuta=1 -> apare reactiv
SELECT crsfactura
APPEND BLANK
REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH 501, denumire WITH "ARTICOL VALUTA T6", ;
cantitate WITH 1, cu_tva WITH 0, tip_valuta WITH 1, Curs WITH 5, multiplicator WITH 1, ;
pretftva WITH 100, pretctva WITH 119, vpretftva WITH 20, vpretctva WITH 23.80, ;
proc_Tvav WITH 1.19
loForm.do_actualizeaza_vizibilitate_curs()
DO Assert WITH gnErr = 0, "T6 fara eroare (gcErr: " + gcErr + ")"
IF llCitibil
llVal = loForm.clb_zi_curs.Visible
DO Assert WITH llVal, "T6: clb_zi_curs.Visible = .T. dupa adaugarea unei linii tip_valuta=1"
ENDIF
* T7: sterge linia -> dispare reactiv
SELECT crsfactura
LOCATE FOR id_articol = 501
IF FOUND()
DELETE
ENDIF
loForm.do_actualizeaza_vizibilitate_curs()
DO Assert WITH gnErr = 0, "T7 fara eroare (gcErr: " + gcErr + ")"
IF llCitibil
llVal = loForm.clb_zi_curs.Visible
DO Assert WITH !llVal, "T7: clb_zi_curs.Visible = .F. dupa stergerea liniei tip_valuta=1"
ENDIF
* T8: fortare (semnal -20005) cu in_valuta=0 si 0 linii valuta -> vizibil oricum
loForm.do_actualizeaza_vizibilitate_curs(.T.)
DO Assert WITH gnErr = 0, "T8 fara eroare (gcErr: " + gcErr + ")"
IF llCitibil
llVal = loForm.clb_zi_curs.Visible
DO Assert WITH llVal, "T8: clb_zi_curs.Visible = .T. cu tlForteazaVizibil=.T., indiferent de continutul grilei"
ENDIF
IF !llCitibil
DO AfLog WITH "DATORIE: clb_zi_curs.Visible nu s-a putut verifica headless in T4-T8 (proba doar structurala: gnErr=0 pe fiecare apel)"
ENDIF
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
* T9: pe retur (tip 8), clb_zi_curs e eliminat la Init; metoda noua nu trebuie sa arunce eroare.
PROCEDURE TestRetur
LOCAL loForm
gcCaz = "[T9 retur tip=8] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 8, "PLIN", 1, 0, 0
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2 (tip retur)"
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
DO Assert WITH !loForm.do_exista_obiect('clb_zi_curs'), "clb_zi_curs eliminat la Init pe retur (tip 8)"
loForm.do_actualizeaza_vizibilitate_curs()
DO Assert WITH gnErr = 0, "do_actualizeaza_vizibilitate_curs() pe retur nu arunca eroare (gcErr: " + gcErr + ")"
loForm.do_actualizeaza_vizibilitate_curs(.T.)
DO Assert WITH gnErr = 0, "do_actualizeaza_vizibilitate_curs(.T.) pe retur nu arunca eroare (gcErr: " + gcErr + ")"
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
* T10: do_incarca_articole pe un tip care CHEAMA incarca_cursor_articole (nu e in llCautareInLinie),
* cu mock Oracle -20005. Verifica Return .F. si, daca citibil, revenirea vizibila a campului.
PROCEDURE TestIncarcaArticoleEroare
LOCAL loForm, llRezultat, llVal, lnErrAntes, llCitibil
gcCaz = "[T10 do_incarca_articole tip=4, mock -20005] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 4, "FARA", -1, 20005, 0
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2 (tip=4)"
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
llRezultat = loForm.do_incarca_articole()
DO Assert WITH !llRezultat, "do_incarca_articole() Return .F. pe eroare Oracle -20005"
DO Assert WITH !EMPTY(gcMockSql), "incarca_cursor_articole a fost apelat (gcMockSql nevid) pe tip=4"
IF loForm.do_exista_obiect('clb_zi_curs')
lnErrAntes = gnErr
llVal = .F.
llVal = loForm.clb_zi_curs.Visible
llCitibil = (gnErr = lnErrAntes)
IF llCitibil
DO Assert WITH llVal, "T10: clb_zi_curs.Visible = .T. dupa -20005 in do_incarca_articole (fortat de lForteazaCursVizibil)"
ELSE
DO AfLog WITH "DATORIE: clb_zi_curs.Visible nu s-a putut verifica headless in T10"
ENDIF
ELSE
DO AfLog WITH "INFO T10: clb_zi_curs nu exista pe formularul instantiat (tip=4 neasteptat sa-l elimine)"
ENDIF
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
PROCEDURE Reseteaza
LPARAMETERS tnTip, tcMod, tnSucces, tnEroare, tnInValuta
LOCAL lnIdSet
DO Inchide WITH 'crsarticole'
DO Inchide WITH 'crsarticole1'
DO Inchide WITH 'crsfactura'
DO Inchide WITH 'crscursuri'
DO Inchide WITH 'crspolitici'
DO Inchide WITH 'crscontracte'
DO Inchide WITH 'crsgestiunidest'
DO Inchide WITH 'crsCtrTemp'
DO Inchide WITH 'CrsCotaTva'
SELECT 0
IF !USED('saft_tip_facturi')
CREATE CURSOR saft_tip_facturi (cod N(3) NULL, tip_saftname C(200) NULL)
INSERT INTO saft_tip_facturi (cod, tip_saftname) VALUES (NULL, '')
INDEX ON cod TAG cod
ENDIF
DO creeaza_facturacrs WITH 'crsfactura'
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
gcMockApeluri = ""
gcMockSql = ""
gcMockCurs = ""
gcErr = ""
gnMockNumar = 100
gnMockRaspuns = 6
gcMockDuplicat = ""
gcMockMod = tcMod
gnMockSucces = tnSucces
gnMockEroare = tnEroare
lnIdSet = 29000 + tnTip
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip)
poDate.dataireg = DATE(gnAn, gnLuna, 1)
poDate.dataact = poDate.dataireg
poDate.zi_curs = poDate.dataireg
poDate.id_fdoc = 1
poDate.fdoc = "FEL TEST"
poDate.nract = 79
poDate.serie_act = "TST"
poDate.id_client = 1
poDate.id_furnizor = 1
poDate.nrfactachi = 1
poDate.id_valuta = 1
poDate.in_valuta = tnInValuta
poDate.listaid = "1"
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
gcMockApeluri = ""
ENDPROC
PROCEDURE Inchide
LPARAMETERS tcAlias
IF USED(tcAlias)
USE IN (tcAlias)
ENDIF
ENDPROC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO AfLog WITH "PASS: " + gcCaz + tcMsg
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
gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10)
gnErr = gnErr + 1
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
IF TYPE('goExecutorReal') = 'O'
goExecutor = goExecutorReal
ENDIF
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC