* 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