* test_s13_mesaj_cota_lipsa.prg * Headless: do_adauga_tot semnaleaza, la finalul adaugarii in masa, liniile a caror cota de TVA nu * are coloana de jurnal (explicatie TVA) in perioada de lucru - in loc sa le lase sa cada abia la * scriere, in Oracle, cu "Nu a fost gasita cota de TVA! (FACT-013 : )". * * Nomenclatorul e cel REAL, citit din MARIUSM_AUTO@ROA_CENTRAL prin update_jtva_coloane([JV], ...) * si filtrat exact ca in ofacturare.prg:237 (ramura tva_incasare = 0). Perioada de lucru se fixeaza * pe 2026/08, unde COTE_TVA are 0/11/19/21 - deci 19% GASESTE coloana, iar 24% NU. * * crsarticole se construieste direct (ca in test_s4e_0_adauga_articol.prg): do_adauga_tot citeste * doar cursorul, nu gridul. Ce se probeaza e traseul real do_adauga_tot -> do_adauga_articol -> * do_initializeaza_articol -> crsfactura, nu incarcarea candidatilor. * * CAZ_A (v2, mixt): doua articole, unul pe 19% si unul pe 24% -> un singur mesaj, care numeste * articolul de 24% si cota lui, nu si pe cel de 19%; ambele linii RAMAN in crsfactura. * CAZ_B (v2, curat): doua articole pe 19% -> niciun mesaj. * CAZ_C (v1, mixt): acelasi scenariu ca A, pe frm_facturare_articole (copia veche a metodei). * * amessagebox e mocat (mock_validare_antet.prg, pus PRIMUL in SET PROCEDURE) - textul complet al * mesajului ajunge in gcMockApeluri, cu CHR(13) transformat in "|". * * SET TABLEPROMPT OFF e obligatoriu: fara el, un fisier lipsa (saft_taxtable.dbf) scoate dialogul * modal "Open" din do_adauga_articol si rularea pare agatata la nesfarsit, fara nimic in log. * * Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s13_mesaj_cota_lipsa.prg" * Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s13_mesaj_cota_lipsa.log * Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 0; gnAn/gnLuna = 2026/08. SET SAFETY OFF SET TALK OFF SET NOTIFY OFF = SYS(2335, 0) SET TABLEPROMPT OFF SET DELETED ON SET EXACT ON SET CENTURY ON SET DATE DMY SET NULLDISPLAY TO '' PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr PUBLIC gcMockApeluri, gnMockRaspuns, gcMockDuplicat gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s13_mesaj_cota_lipsa.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 = "" gnMockRaspuns = 6 gcMockDuplicat = "" ON ERROR DO CtErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() ON SHUTDOWN QUIT DO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8 IF TYPE('gnHandle') <> 'N' OR gnHandle <= 0 DO CtLog 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_generator_numere.prg", &lcProc IF !actualizeaza_optiuni_program() DO CtLog WITH "FAIL: actualizeaza_optiuni_program()" DO Final ENDIF gnIdUtil = 8 goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) gnScadereStoc = 0 DO CtLog 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 *-- nomenclatorul real, filtrat exact ca in ofacturare.prg:237 (ramura tva_incasare = 0) update_jtva_coloane([JV], [jtva_coloane_temp]) update_saft_taxtable() SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane DO CtLog WITH "jtva_coloane reccount=" + TRANSFORM(RECCOUNT('jtva_coloane')) SELECT jtva_coloane SET FILTER TO LOCATE FOR cota_tva = 19 DO Assert WITH FOUND(), "premisa: cota 19 ARE coloana de jurnal in 2026/08" LOCATE FOR cota_tva = 24 DO Assert WITH !FOUND(), "premisa: cota 24 NU are coloana de jurnal in 2026/08" PRIVATE poDate, poGeneratorNumere, plVizibil, pnTotalDiscountAvize plVizibil = .F. pnTotalDiscountAvize = 0 poDate = NULL poGeneratorNumere = CREATEOBJECT("oGeneratorMock") DO CazMixt WITH 'frm_facturare_articole2', "[CAZ_A v2 mixt] " DO CazCurat WITH 'frm_facturare_articole2', "[CAZ_B v2 curat] " DO CazMixt WITH 'frm_facturare_articole', "[CAZ_C v1 mixt] " DO Final *---------------------------------------------------------------------------------------- * Un articol pe 19% (are coloana) si unul pe 24% (nu are) -> exact un mesaj, care numeste doar * articolul de 24%. Ambele linii raman pe document. PROCEDURE CazMixt LPARAMETERS tcClasa, tcCaz LOCAL loForm, lnRecDupa gcCaz = tcCaz DO CtLog WITH "PAS: " + gcCaz + tcClasa DO Reseteaza WITH 3 DO CreeazaCrsArticole INSERT INTO crsarticole VALUES (1, 401, "ARTICOL COTA 19", 5, 0, 0, 100, 0, 1.19, 0, "BUC", ; 21, "371", 1, 0, 1, 1, 0, 0, "CM401", "", "RON") INSERT INTO crsarticole VALUES (2, 402, "ARTICOL COTA 24", 3, 0, 0, 200, 0, 1.24, 0, "BUC", ; 21, "371", 1, 0, 1, 1, 0, 0, "CM402", "", "RON") GO TOP IN crsarticole loForm = CREATEOBJECT(tcClasa) DO Assert WITH VARTYPE(loForm) = 'O', "Createobject " + tcClasa IF VARTYPE(loForm) <> 'O' RETURN ENDIF gcErr = "" gnErr = 0 gcMockApeluri = "" loForm.do_adauga_tot() DO CtLog WITH " mesaje: " + CHR(13) + CHR(10) + gcMockApeluri DO Assert WITH "explicatie de TVA" $ gcMockApeluri, "mesajul agregat a fost afisat" DO Assert WITH "pentru 1 linii" $ gcMockApeluri, "mesajul numara exact o linie" DO Assert WITH "ARTICOL COTA 24" $ gcMockApeluri, "mesajul numeste articolul de 24%" DO Assert WITH "24.00%" $ gcMockApeluri, "mesajul numeste cota 24.00%" DO Assert WITH !("ARTICOL COTA 19" $ gcMockApeluri), "mesajul NU semnaleaza articolul de 19%" DO Assert WITH RECCOUNT('crsfactura') = 2, "ambele linii raman pe document (Reccount=" + TRANSFORM(RECCOUNT('crsfactura')) + ")" IF USED('crsfactura') lnRecDupa = RECNO('crsfactura') DO Assert WITH BETWEEN(lnRecDupa, 1, RECCOUNT('crsfactura')), ; "pozitia in crsfactura e restaurata, nu EOF (Recno=" + TRANSFORM(lnRecDupa) + ")" SELECT crsfactura LOCATE FOR id_articol = 402 DO Assert WITH FOUND() AND NVL(id_jtva_coloana, 0) = 0, "linia de 24% a ramas fara id_jtva_coloana" LOCATE FOR id_articol = 401 DO Assert WITH FOUND() AND NVL(id_jtva_coloana, 0) > 0, "linia de 19% si-a gasit coloana" ENDIF DO Inchide WITH 'crsarticole' loForm.Release() RELEASE loForm ENDPROC *---------------------------------------------------------------------------------------- * Doar cote valabile -> niciun mesaj (cazul normal nu se deranjeaza). PROCEDURE CazCurat LPARAMETERS tcClasa, tcCaz LOCAL loForm gcCaz = tcCaz DO CtLog WITH "PAS: " + gcCaz + tcClasa DO Reseteaza WITH 3 DO CreeazaCrsArticole INSERT INTO crsarticole VALUES (1, 411, "ARTICOL BUN UNU", 5, 0, 0, 100, 0, 1.19, 0, "BUC", ; 21, "371", 1, 0, 1, 1, 0, 0, "CM411", "", "RON") INSERT INTO crsarticole VALUES (2, 412, "ARTICOL BUN DOI", 3, 0, 0, 200, 0, 1.19, 0, "BUC", ; 21, "371", 1, 0, 1, 1, 0, 0, "CM412", "", "RON") GO TOP IN crsarticole loForm = CREATEOBJECT(tcClasa) IF VARTYPE(loForm) <> 'O' DO Assert WITH .F., "Createobject " + tcClasa RETURN ENDIF gcErr = "" gnErr = 0 gcMockApeluri = "" loForm.do_adauga_tot() DO CtLog WITH " mesaje: [" + gcMockApeluri + "]" DO Assert WITH !("explicatie de TVA" $ gcMockApeluri), "niciun mesaj pe cazul normal" DO Assert WITH RECCOUNT('crsfactura') = 2, "ambele linii adaugate (Reccount=" + TRANSFORM(RECCOUNT('crsfactura')) + ")" DO Inchide WITH 'crsarticole' loForm.Release() RELEASE loForm ENDPROC *---------------------------------------------------------------------------------------- PROCEDURE CreeazaCrsArticole SELECT 0 CREATE CURSOR crsarticole (id_c N(20), id_articol N(20), denumire C(100), cantitate N(20,4), ; gestionabil N(1), opt_facturare N(3), Pret N(20,4), pret_val N(20,4), proc_tvav N(20,4), ; preturi_cu_tva N(1), um C(10), id_gestiune N(20), cont C(10), id_valuta N(10), tip_valuta N(1), ; Curs N(20,4), multiplicator N(10), discount_unitar N(20,4), discount_unitar_val N(20,4), ; codmat C(50), codbare C(50), nume_val C(20)) ENDPROC PROCEDURE Reseteaza LPARAMETERS tnTip 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' DO Inchide WITH 'saft_tip_facturi' 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 = "" gcErr = "" gnErr = 0 gnMockRaspuns = 6 gcMockDuplicat = "" lnIdSet = 26000 + 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 = 78 poDate.serie_act = "TST" poDate.id_client = 1 poDate.id_furnizor = 1 poDate.nrfactachi = 1 poDate.id_valuta = 1 poDate.in_valuta = 0 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 CtLog WITH "PASS: " + gcCaz + tcMsg ELSE gnFail = gnFail + 1 DO CtLog WITH "FAIL: " + gcCaz + tcMsg ENDIF ENDPROC PROCEDURE CtLog LPARAMETERS tcMsg STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1) ENDPROC PROCEDURE CtErr LPARAMETERS tnErr, tcMsg, tcProg, tnLine gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10) gnErr = gnErr + 1 DO CtLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg ENDPROC PROCEDURE Final DO CtLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr) DO CtLog WITH "END " + TTOC(DATETIME()) QUIT ENDPROC