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
347 lines
13 KiB
Plaintext
347 lines
13 KiB
Plaintext
* test_q8_numar_ars.prg
|
|
* Headless: verifica reparatia Q8 (decizia 69, amendata 21.08.2026) - garda "s-a schimbat tipul documentului?"
|
|
* trebuie sa ruleze INAINTE de alocarea numarului (_cbbase1.LostFocus()) in do_schimba_tipdoc, DOAR pe calea
|
|
* unificata (frm_facturare_articole2). Pe calea veche (frm_date_factura), Marius a decis sa se lase
|
|
* comportamentul preexistent (numarul se arde la simpla intrare-iesire din combo-ul de tip) - vezi
|
|
* docs\raport_q8_numar_ars.md. Generatorul e oGeneratorMock (mock_generator_numere.prg, subclasa de test a
|
|
* lui oGeneratorNumere) - NU atinge Oracle, jurnalizeaza aloca_numar/dezaloca_numar/creeaza_cursor_serii in
|
|
* gcMockApeluri. NU se consuma numere reale din serii.
|
|
*
|
|
* REZULTAT ASTEPTAT (declarat inainte de rulare):
|
|
* A. FARA schimbare de tip (combo pus pe aceeasi valoare ca poDate.nIdTipDoc), in doua situatii (A1/A2):
|
|
* - frm_date_factura (calea veche, nereparata): ALOC#1 ruleaza inaintea garzii, indiferent de
|
|
* poDate.nract la intrare - poDate.nract SE ARDE (devine numarul alocat de mock), gcMockApeluri
|
|
* NU ramane gol (comportament preexistent, pastrat intentionat).
|
|
* - frm_facturare_articole2 (calea unificata, reparata): garda ruleaza prima - poDate.nract ramane
|
|
* neschimbat, gcMockApeluri ramane gol.
|
|
* B. CU schimbare reala de tip (FACTURA(5) -> PROFORMA(23)), pe ambele forme: poDate.nIdTipDoc = 23,
|
|
* gcMockApeluri contine dezaloca_numar(5), creeaza_cursor_serii(23) si aloca_numar(23); poDate.nract <> 0
|
|
* la final (pe calea veche mai apare si o pereche redundanta aloca_numar(5)/dezaloca_numar(5) din ALOC#1 -
|
|
* tolerata, testul verifica prezenta secventei, nu absenta altor apeluri).
|
|
* C. Amprentele (nIdTipDoc, nract, gcMockApeluri) DIFERA intentionat intre frm_date_factura si
|
|
* frm_facturare_articole2, pentru A1/A2/B - dovada ca cele doua cai NU mai sunt unificate pe Q8 (decizia
|
|
* lui Marius de a lasa calea veche neatinsa).
|
|
*
|
|
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_q8_numar_ars.prg"
|
|
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_q8_numar_ars.log
|
|
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 1.
|
|
|
|
SET SAFETY OFF
|
|
SET TALK OFF
|
|
SET NOTIFY OFF
|
|
PUBLIC gcLog, gnFail, gnPass, gcCaz, gcErr, gcMockApeluri, gnMockNumar
|
|
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_q8_numar_ars.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
|
|
gcCaz = ""
|
|
gcErr = ""
|
|
gcMockApeluri = ""
|
|
gnMockNumar = 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
|
|
LOCAL lcProc
|
|
lcProc = SET("PROCEDURE")
|
|
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.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
|
|
|
|
PRIVATE poDate, poGeneratorNumere, plVizibil, poDateGestiuneDest
|
|
plVizibil = .F.
|
|
poGeneratorNumere = CREATEOBJECT("oGeneratorMock")
|
|
DO Assert WITH VARTYPE(poGeneratorNumere) = 'O' AND poGeneratorNumere.Class == "Ogeneratormock", "generator mock instantiat"
|
|
poDateGestiuneDest = CREATEOBJECT("oDateGestiune")
|
|
|
|
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'
|
|
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
|
|
|
|
* --- A1: fara schimbare, nract=0 la intrare (cazul din verif_nract_do_cauta.md) ---
|
|
DO CazFaraSchimbare WITH 'frm_date_factura', "FACTURA", 0
|
|
DO CazFaraSchimbare WITH 'frm_facturare_articole2', "FACTURA", 0
|
|
|
|
* --- A2: fara schimbare, nract deja alocat (neregresie) ---
|
|
DO CazFaraSchimbare WITH 'frm_date_factura', "FACTURA", 777
|
|
DO CazFaraSchimbare WITH 'frm_facturare_articole2', "FACTURA", 777
|
|
|
|
* --- B: schimbare reala FACTURA -> PROFORMA ---
|
|
DO CazCuSchimbare WITH 'frm_date_factura', "FACTURA", "PROFORMA"
|
|
DO CazCuSchimbare WITH 'frm_facturare_articole2', "FACTURA", "PROFORMA"
|
|
|
|
* --- C: paritate amprente intre cele doua forme, pe fiecare caz ---
|
|
DO Paritate WITH "FACTURA", 0
|
|
DO Paritate WITH "FACTURA", 777
|
|
DO ParitateSchimbare WITH "FACTURA", "PROFORMA"
|
|
|
|
DO Final
|
|
|
|
*----------------------------------------------------------------------------------------
|
|
PROCEDURE CazFaraSchimbare
|
|
LPARAMETERS tcClasa, tcFel, tnNractInitial
|
|
LOCAL loF, loCombo, lnIdTipDoc
|
|
gcCaz = "[FaraSchimbare " + tcClasa + " " + tcFel + " nract0=" + TRANSFORM(tnNractInitial) + "] "
|
|
lnIdTipDoc = IdTipDoc(tcFel)
|
|
|
|
poDate = NULL
|
|
poDate = CREATEOBJECT("oDateFactura", 25001, 1)
|
|
poDate.nIdTipDoc = lnIdTipDoc
|
|
poGeneratorNumere.ResetNumere()
|
|
gnMockNumar = 100
|
|
gcMockApeluri = ""
|
|
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
|
|
poDate.dataact = DATE(gnAn, gnLuna, 1)
|
|
poDate.dataireg = poDate.dataact
|
|
poDate.id_client = 0
|
|
poDate.nract = tnNractInitial
|
|
gcErr = ""
|
|
|
|
loF = CREATEOBJECT(tcClasa)
|
|
DO Assert WITH VARTYPE(loF) = 'O', "CREATEOBJECT " + tcClasa + " reusit"
|
|
IF VARTYPE(loF) <> 'O'
|
|
RETURN
|
|
ENDIF
|
|
IF tcClasa == 'frm_date_factura'
|
|
loCombo = loF.ct_clb_fdoc._combobox1
|
|
ELSE
|
|
loCombo = loF.clb_fdoc.cboFdoc
|
|
ENDIF
|
|
loCombo.Value = tcFel && aceeasi valoare - fara schimbare de tip
|
|
|
|
gcMockApeluri = ""
|
|
gcErr = ""
|
|
loF.do_schimba_tipdoc()
|
|
|
|
IF tcClasa == 'frm_date_factura'
|
|
&& calea veche: nereparata, decizia lui Marius din 21.08.2026 - numarul se arde la intrare-iesire din combo
|
|
DO Assert WITH poDate.nract <> tnNractInitial, "poDate.nract ars la intrare-iesire din combo (preexistent), a ramas " + TRANSFORM(poDate.nract)
|
|
DO Assert WITH !EMPTY(gcMockApeluri), "apel generator preexistent (numarul se arde) - jurnal gol, neasteptat"
|
|
ELSE
|
|
DO Assert WITH poDate.nract = tnNractInitial, "poDate.nract neschimbat (" + TRANSFORM(tnNractInitial) + "), a ramas " + TRANSFORM(poDate.nract)
|
|
DO Assert WITH EMPTY(gcMockApeluri), "niciun apel generator (aloca/dezaloca/creeaza_cursor_serii), gasit: " + STRTRAN(gcMockApeluri, CHR(13) + CHR(10), " | ")
|
|
ENDIF
|
|
DO Assert WITH poDate.nIdTipDoc = lnIdTipDoc, "nIdTipDoc neschimbat"
|
|
DO Assert WITH EMPTY(gcErr), "fara erori VFP: " + gcErr
|
|
|
|
loF.Release()
|
|
RELEASE loF
|
|
ENDPROC
|
|
|
|
PROCEDURE CazCuSchimbare
|
|
LPARAMETERS tcClasa, tcDin, tcIn
|
|
LOCAL loF, loCombo, lnIdTipDocDin, lnIdTipDocIn
|
|
gcCaz = "[CuSchimbare " + tcClasa + " " + tcDin + "->" + tcIn + "] "
|
|
lnIdTipDocDin = IdTipDoc(tcDin)
|
|
lnIdTipDocIn = IdTipDoc(tcIn)
|
|
|
|
poDate = NULL
|
|
poDate = CREATEOBJECT("oDateFactura", 25001, 1)
|
|
poDate.nIdTipDoc = lnIdTipDocDin
|
|
poGeneratorNumere.ResetNumere()
|
|
gnMockNumar = 100
|
|
gcMockApeluri = ""
|
|
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
|
|
poDate.dataact = DATE(gnAn, gnLuna, 1)
|
|
poDate.dataireg = poDate.dataact
|
|
poDate.id_client = 0
|
|
poDate.nract = 555 && numar deja alocat pe tipul vechi, ca sa verific dezaloca_numar(vechi)
|
|
gcErr = ""
|
|
|
|
loF = CREATEOBJECT(tcClasa)
|
|
DO Assert WITH VARTYPE(loF) = 'O', "CREATEOBJECT " + tcClasa + " reusit"
|
|
IF VARTYPE(loF) <> 'O'
|
|
RETURN
|
|
ENDIF
|
|
IF tcClasa == 'frm_date_factura'
|
|
loCombo = loF.ct_clb_fdoc._combobox1
|
|
ELSE
|
|
loCombo = loF.clb_fdoc.cboFdoc
|
|
ENDIF
|
|
loCombo.Value = tcIn
|
|
|
|
gcMockApeluri = ""
|
|
gcErr = ""
|
|
loF.do_schimba_tipdoc()
|
|
|
|
DO Assert WITH poDate.nIdTipDoc = lnIdTipDocIn, "nIdTipDoc = " + TRANSFORM(lnIdTipDocIn) + " dupa schimbare, e " + TRANSFORM(poDate.nIdTipDoc)
|
|
DO Assert WITH ("dezaloca_numar(" + TRANSFORM(lnIdTipDocDin) + ")") $ gcMockApeluri, "dezaloca_numar(" + TRANSFORM(lnIdTipDocDin) + ") in jurnal"
|
|
DO Assert WITH ("creeaza_cursor_serii(" + TRANSFORM(lnIdTipDocIn) + ")") $ gcMockApeluri, "creeaza_cursor_serii(" + TRANSFORM(lnIdTipDocIn) + ") in jurnal"
|
|
DO Assert WITH ("aloca_numar(" + TRANSFORM(lnIdTipDocIn) + ")") $ gcMockApeluri, "aloca_numar(" + TRANSFORM(lnIdTipDocIn) + ") in jurnal"
|
|
DO Assert WITH poDate.nract <> 0, "poDate.nract alocat (<>0) dupa schimbare"
|
|
DO Assert WITH EMPTY(gcErr), "fara erori VFP: " + gcErr
|
|
DO AfLog WITH " " + gcCaz + "GENERATOR: " + STRTRAN(gcMockApeluri, CHR(13) + CHR(10), " | ")
|
|
|
|
loF.Release()
|
|
RELEASE loF
|
|
ENDPROC
|
|
|
|
PROCEDURE Paritate
|
|
LPARAMETERS tcFel, tnNractInitial
|
|
LOCAL lcVechi, lcNou
|
|
gcCaz = "[Paritate FaraSchimbare " + tcFel + " nract0=" + TRANSFORM(tnNractInitial) + "] "
|
|
lcVechi = AmprentaFaraSchimbare('frm_date_factura', tcFel, tnNractInitial)
|
|
lcNou = AmprentaFaraSchimbare('frm_facturare_articole2', tcFel, tnNractInitial)
|
|
&& calea veche pastreaza bug-ul preexistent (Marius, 21.08.2026) - amprentele trebuie sa DIFERE
|
|
IF lcVechi <> lcNou
|
|
gnPass = gnPass + 1
|
|
DO AfLog WITH "OK " + gcCaz + "amprente diverg intentionat (vechi arde numarul, nou nu):"
|
|
DO AfLog WITH " vechi: " + STRTRAN(lcVechi, CHR(13) + CHR(10), " | ")
|
|
DO AfLog WITH " nou : " + STRTRAN(lcNou, CHR(13) + CHR(10), " | ")
|
|
ELSE
|
|
gnFail = gnFail + 1
|
|
DO AfLog WITH "FAIL " + gcCaz + "amprente identice (asteptat: sa difere)"
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROCEDURE ParitateSchimbare
|
|
LPARAMETERS tcDin, tcIn
|
|
LOCAL lcVechi, lcNou
|
|
gcCaz = "[Paritate CuSchimbare " + tcDin + "->" + tcIn + "] "
|
|
lcVechi = AmprentaCuSchimbare('frm_date_factura', tcDin, tcIn)
|
|
lcNou = AmprentaCuSchimbare('frm_facturare_articole2', tcDin, tcIn)
|
|
&& calea veche pastreaza ALOC#1 (pereche redundanta aloca/dezaloca pe tipul vechi) - amprentele trebuie sa DIFERE
|
|
IF lcVechi <> lcNou
|
|
gnPass = gnPass + 1
|
|
DO AfLog WITH "OK " + gcCaz + "amprente diverg intentionat (vechi are alocare/dezalocare redundanta):"
|
|
DO AfLog WITH " vechi: " + STRTRAN(lcVechi, CHR(13) + CHR(10), " | ")
|
|
DO AfLog WITH " nou : " + STRTRAN(lcNou, CHR(13) + CHR(10), " | ")
|
|
ELSE
|
|
gnFail = gnFail + 1
|
|
DO AfLog WITH "FAIL " + gcCaz + "amprente identice (asteptat: sa difere)"
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
FUNCTION AmprentaFaraSchimbare
|
|
LPARAMETERS tcClasa, tcFel, tnNractInitial
|
|
LOCAL loF, loCombo, lcA, lnIdTipDoc
|
|
lnIdTipDoc = IdTipDoc(tcFel)
|
|
poDate = NULL
|
|
poDate = CREATEOBJECT("oDateFactura", 25001, 1)
|
|
poDate.nIdTipDoc = lnIdTipDoc
|
|
poGeneratorNumere.ResetNumere()
|
|
gnMockNumar = 100
|
|
gcMockApeluri = ""
|
|
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
|
|
poDate.dataact = DATE(gnAn, gnLuna, 1)
|
|
poDate.dataireg = poDate.dataact
|
|
poDate.id_client = 0
|
|
poDate.nract = tnNractInitial
|
|
gcErr = ""
|
|
|
|
loF = CREATEOBJECT(tcClasa)
|
|
IF VARTYPE(loF) <> 'O'
|
|
RETURN "CREATEOBJECT " + tcClasa + " ESUAT" + CHR(13) + CHR(10) + gcErr
|
|
ENDIF
|
|
IF tcClasa == 'frm_date_factura'
|
|
loCombo = loF.ct_clb_fdoc._combobox1
|
|
ELSE
|
|
loCombo = loF.clb_fdoc.cboFdoc
|
|
ENDIF
|
|
loCombo.Value = tcFel
|
|
|
|
gcMockApeluri = ""
|
|
gcErr = ""
|
|
loF.do_schimba_tipdoc()
|
|
|
|
lcA = "nract=" + TRANSFORM(poDate.nract) + CHR(13) + CHR(10)
|
|
lcA = lcA + "nidtipdoc=" + TRANSFORM(poDate.nIdTipDoc) + CHR(13) + CHR(10)
|
|
lcA = lcA + "GENERATOR:" + CHR(13) + CHR(10) + gcMockApeluri
|
|
lcA = lcA + "ERORI:" + CHR(13) + CHR(10) + gcErr
|
|
|
|
loF.Release()
|
|
RELEASE loF
|
|
RETURN lcA
|
|
ENDFUNC
|
|
|
|
FUNCTION AmprentaCuSchimbare
|
|
LPARAMETERS tcClasa, tcDin, tcIn
|
|
LOCAL loF, loCombo, lcA
|
|
poDate = NULL
|
|
poDate = CREATEOBJECT("oDateFactura", 25001, 1)
|
|
poDate.nIdTipDoc = IdTipDoc(tcDin)
|
|
poGeneratorNumere.ResetNumere()
|
|
gnMockNumar = 100
|
|
gcMockApeluri = ""
|
|
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
|
|
poDate.dataact = DATE(gnAn, gnLuna, 1)
|
|
poDate.dataireg = poDate.dataact
|
|
poDate.id_client = 0
|
|
poDate.nract = 555
|
|
gcErr = ""
|
|
|
|
loF = CREATEOBJECT(tcClasa)
|
|
IF VARTYPE(loF) <> 'O'
|
|
RETURN "CREATEOBJECT " + tcClasa + " ESUAT" + CHR(13) + CHR(10) + gcErr
|
|
ENDIF
|
|
IF tcClasa == 'frm_date_factura'
|
|
loCombo = loF.ct_clb_fdoc._combobox1
|
|
ELSE
|
|
loCombo = loF.clb_fdoc.cboFdoc
|
|
ENDIF
|
|
loCombo.Value = tcIn
|
|
|
|
gcMockApeluri = ""
|
|
gcErr = ""
|
|
loF.do_schimba_tipdoc()
|
|
|
|
lcA = "nidtipdoc=" + TRANSFORM(poDate.nIdTipDoc) + CHR(13) + CHR(10)
|
|
lcA = lcA + "nract_alocat=" + TRANSFORM(poDate.nract <> 0) + CHR(13) + CHR(10)
|
|
lcA = lcA + "GENERATOR:" + CHR(13) + CHR(10) + gcMockApeluri
|
|
lcA = lcA + "ERORI:" + CHR(13) + CHR(10) + gcErr
|
|
|
|
loF.Release()
|
|
RELEASE loF
|
|
RETURN lcA
|
|
ENDFUNC
|
|
|
|
FUNCTION IdTipDoc
|
|
LPARAMETERS tcFel
|
|
RETURN IIF(tcFel == "PROFORMA", 23, IIF(tcFel == "BON FISCAL", 3, 5))
|
|
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
|
|
gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + CHR(13) + CHR(10)
|
|
ENDPROC
|
|
|
|
PROCEDURE Final
|
|
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail)
|
|
DO AfLog WITH "END " + TTOC(DATETIME())
|
|
QUIT
|
|
ENDPROC
|