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

292 lines
10 KiB
Plaintext

* 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 : <id intern>)".
*
* 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