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
292 lines
10 KiB
Plaintext
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
|