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

391 lines
16 KiB
Plaintext

* test_s4f_cautare_retur.prg
* Headless: do_adauga_articol_cautat (frm_facturare_articole2, ofacturare.vc2:18929) pe un document
* de retur (poDate.tip = 8) trebuie sa delege la calea veche do_adauga_articol, care alege gestiunea
* reala - nu la Gather-ul direct din toArticol (care scria sentinela id_gestiune = -1000, S4f).
*
* crsarticole e construit direct (nu prin Oracle), cu UN singur rand deja "incarcat" pe document
* (ca dupa butonul Incarca articole / do_adauga_tot), gestionabil=0 ca sa ocoleasca do_alege_stoc
* (nu se testeaza alegerea de gestiune cu formular modal, doar rutarea - pattern validat deja de
* test_s4e_0_adauga_articol.prg CazAdaugaTotSucces). cantitate NEGATIVA (-2): pe tip 8/9,
* do_verifica_articol respinge orice cantitate >= 0 (ofacturare.vc2:20913).
*
* toArticol simuleaza obiectul scatter-uit din crsCodmat/crsDenumire (combo-ul de cautare in linie)
* dupa do_initializeaza_articol - doar proprietatile citite de do_initializeaza_articol INAINTE de
* ramura noua (um, preturi_cu_tva, discount_unitar(_val), proc_tvav, Pret, pret_val, cantitate,
* id_articol); campurile ramurii vechi (Gather in crsfactura) nu mai sunt atinse pe acest traseu.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s4f_cautare_retur.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4f_cautare_retur.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 1.
*
* CazNegasitTip8/CazNegasitTip41 (garda S4f: articol nevandut pe documentul returnat) - articolul
* cautat NU e printre randurile din crsarticole. Pe tip 8/9 noua garda din do_adauga_articol_cautat
* (ofacturare.vc2:18945-18949) trebuie sa afiseze mesajul (mocat de mock_validare_antet.prg, incarcat
* PRIMUL - vezi SET PROCEDURE mai jos) si sa intoarca .F. fara sa scrie in crsfactura. Pe tip 41
* garda nu se aplica (caz imposibil, cf. docs\verificare_s4f_caz_accesibil.md) - comportamentul ramane
* neschimbat: cade prin la Gather-ul vechi, scrie cu id_gestiune=-1000 (sentinela, nu regresie).
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
SET TABLEPROMPT OFF
PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr
PUBLIC gcMockApeluri, gnMockRaspuns, gcMockDuplicat, gnMockNumar
gnMockNumar = 0
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4f_cautare_retur.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 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\facturare_unificat\mock_validare_antet.prg", ;
"D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg", &lcProc
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
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
PRIVATE poDate, poGeneratorNumere, plVizibil, pnTotalDiscountAvize
plVizibil = .F.
pnTotalDiscountAvize = 0
poDate = NULL
poGeneratorNumere = CREATEOBJECT("oGeneratorMock")
DO CazCautareRetur
DO CazNegasitTip8
DO CazNegasitTip41
DO Final
*----------------------------------------------------------------------------------------
* CAZ: cautare in linie pe document retur (tip 8) - trebuie sa delege la do_adauga_articol,
* care scrie id_gestiune REAL (77, din crsarticole), nu sentinela -1000 din do_initializeaza_articol.
PROCEDURE CazCautareRetur
LOCAL loForm, loArticol
gcCaz = "[CAZ_S4f cautare_retur] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 8
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))
* cantitate POZITIVA: do_adauga_articol cheama din nou do_initializeaza_articol pe poArticol
* (scatter din acest rand), care inverseaza semnul pentru tip 8/9 (:19898) - abia dupa aceea
* do_verifica_articol cere tnCantitate NEGATIV ca sa accepte pe retur (:20916)
INSERT INTO crsarticole VALUES (1, 555001, "ARTICOL RETUR TEST", 2, 0, 0, 100, 0, 1.19, 0, "BUC", ;
77, "371", 1, 0, 1, 1, 0, 0, "CM555001", "", "RON")
GO TOP IN crsarticole
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
* obiectul cautat in combo (cCodMat/cDenumire), dupa Scatter din crsCodmat/crsDenumire
loArticol = CREATEOBJECT('Empty')
ADDPROPERTY(loArticol, 'id_articol', 555001)
ADDPROPERTY(loArticol, 'denumire', "ARTICOL RETUR TEST")
ADDPROPERTY(loArticol, 'codmat', "CM555001")
ADDPROPERTY(loArticol, 'um', "BUC")
ADDPROPERTY(loArticol, 'preturi_cu_tva', 0)
ADDPROPERTY(loArticol, 'discount_unitar', 0)
ADDPROPERTY(loArticol, 'discount_unitar_val', 0)
ADDPROPERTY(loArticol, 'proc_tvav', 1.19)
ADDPROPERTY(loArticol, 'Pret', 100)
ADDPROPERTY(loArticol, 'pret_val', 0)
ADDPROPERTY(loArticol, 'cantitate', 2)
gcErr = ""
gnErr = 0
gcMockApeluri = ""
DO AfLog WITH "DIAG poDate.tip=" + TRANSFORM(poDate.tip) + " crsarticole.id_articol(inainte)=" + TRANSFORM(crsarticole.id_articol) + " cantitate=" + TRANSFORM(crsarticole.cantitate)
loForm.do_adauga_articol_cautat(loArticol, loArticol.cantitate)
DO AfLog WITH "DIAG dupa apel: gcErr=[" + gcErr + "] gcMockApeluri=[" + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13)+CHR(10), ' | ') + "]"
DO AfLog WITH "DIAG crsfactura reccount=" + TRANSFORM(RECCOUNT('crsfactura')) + " crsarticole reccount=" + TRANSFORM(IIF(USED('crsarticole'), RECCOUNT('crsarticole'), -1))
IF USED('crsarticole')
DO AfLog WITH "DIAG crsarticole dupa: id_articol=" + TRANSFORM(crsarticole.id_articol) + " cantitate=" + TRANSFORM(crsarticole.cantitate)
ENDIF
DO Assert WITH !("GRD_ARTICOLE" $ UPPER(gcErr)), "fara amprenta GRD_ARTICOLE in gcErr"
DO Assert WITH !("TXTCODMAT" $ UPPER(gcErr)), "fara amprenta TXTCODMAT in gcErr"
DO Assert WITH RECCOUNT('crsfactura') = 1, "randul a ajuns in crsfactura pe calea veche (Reccount=" + TRANSFORM(RECCOUNT('crsfactura')) + ")"
IF RECCOUNT('crsfactura') >= 1
SELECT crsfactura
GO TOP
DO Assert WITH id_gestiune <> -1000, "id_gestiune NU ramane sentinela -1000, e=" + TRANSFORM(id_gestiune)
DO Assert WITH id_gestiune = 77, "id_gestiune vine din crsarticole (gestiunea reala), e=" + TRANSFORM(id_gestiune)
DO Assert WITH id_articol = 555001, "id_articol corect in crsfactura"
ENDIF
DO Inchide WITH 'crsarticole'
loForm.Release()
RELEASE loForm, loArticol
ENDPROC
*----------------------------------------------------------------------------------------
* CAZ (a): tip 8, articolul cautat NU e in crsarticole (nevandut pe documentul returnat) - garda
* noua trebuie sa refuze: .F., fara rand nou in crsfactura, mesaj afisat (mocat).
PROCEDURE CazNegasitTip8
LOCAL loForm, loArticol, llRet
gcCaz = "[CAZ_S4f negasit_tip8] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 8
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))
* alt articol, deja incarcat pe document - id_articol diferit de cel cautat mai jos (555001)
INSERT INTO crsarticole VALUES (1, 999002, "ALT ARTICOL PE DOCUMENT", 2, 0, 0, 100, 0, 1.19, 0, "BUC", ;
77, "371", 1, 0, 1, 1, 0, 0, "CM999002", "", "RON")
GO TOP IN crsarticole
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
loArticol = CREATEOBJECT('Empty')
ADDPROPERTY(loArticol, 'id_articol', 555001)
ADDPROPERTY(loArticol, 'denumire', "ARTICOL NEVANDUT")
ADDPROPERTY(loArticol, 'codmat', "CM555001")
ADDPROPERTY(loArticol, 'um', "BUC")
ADDPROPERTY(loArticol, 'preturi_cu_tva', 0)
ADDPROPERTY(loArticol, 'discount_unitar', 0)
ADDPROPERTY(loArticol, 'discount_unitar_val', 0)
ADDPROPERTY(loArticol, 'proc_tvav', 1.19)
ADDPROPERTY(loArticol, 'Pret', 100)
ADDPROPERTY(loArticol, 'pret_val', 0)
ADDPROPERTY(loArticol, 'cantitate', 2)
gcErr = ""
gnErr = 0
gcMockApeluri = ""
llRet = loForm.do_adauga_articol_cautat(loArticol, loArticol.cantitate)
DO AfLog WITH "DIAG llRet=" + TRANSFORM(llRet) + " gcMockApeluri=[" + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13)+CHR(10), ' | ') + "]"
DO AfLog WITH "DIAG crsfactura reccount=" + TRANSFORM(RECCOUNT('crsfactura'))
DO Assert WITH gnErr = 0, "fara eroare VFP la refuz (tip 8, articol negasit)"
DO Assert WITH llRet = .F., "do_adauga_articol_cautat intoarce .F. (tip 8, articol negasit)"
DO Assert WITH RECCOUNT('crsfactura') = 0, "crsfactura neschimbat (Reccount=" + TRANSFORM(RECCOUNT('crsfactura')) + ")"
DO Assert WITH "amessagebox(" $ gcMockApeluri, "mesajul de refuz a fost afisat (mocat)"
DO Assert WITH "NU A FOST VANDUT" $ UPPER(gcMockApeluri), "textul mesajului explica motivul refuzului"
DO Inchide WITH 'crsarticole'
loForm.Release()
RELEASE loForm, loArticol
ENDPROC
*----------------------------------------------------------------------------------------
* CAZ (c): tip 41, articolul cautat NU e in crsarticole - garda noua NU se aplica (scopata la 8/9).
* Comportamentul trebuie sa ramana neschimbat: cade prin la Gather-ul vechi, .T., id_gestiune=-1000.
PROCEDURE CazNegasitTip41
LOCAL loForm, loArticol, llRet
gcCaz = "[CAZ_S4f negasit_tip41] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 41
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))
INSERT INTO crsarticole VALUES (1, 999002, "ALT ARTICOL PE DOCUMENT", 2, 0, 0, 100, 0, 1.19, 0, "BUC", ;
77, "371", 1, 0, 1, 1, 0, 0, "CM999002", "", "RON")
GO TOP IN crsarticole
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
loArticol = CREATEOBJECT('Empty')
ADDPROPERTY(loArticol, 'id_articol', 555001)
ADDPROPERTY(loArticol, 'denumire', "ARTICOL NEVANDUT")
ADDPROPERTY(loArticol, 'codmat', "CM555001")
ADDPROPERTY(loArticol, 'um', "BUC")
ADDPROPERTY(loArticol, 'preturi_cu_tva', 0)
ADDPROPERTY(loArticol, 'discount_unitar', 0)
ADDPROPERTY(loArticol, 'discount_unitar_val', 0)
ADDPROPERTY(loArticol, 'proc_tvav', 1.19)
ADDPROPERTY(loArticol, 'Pret', 100)
ADDPROPERTY(loArticol, 'pret_val', 0)
ADDPROPERTY(loArticol, 'cantitate', 2)
* tip 41 nu delega (nu are echivalent al do_adauga_articol) - cade in Gather-ul vechi, care mai
* citeste si aceste proprietati din obiectul cautat (neatinse de do_initializeaza_articol)
ADDPROPERTY(loArticol, 'Curs', 1)
ADDPROPERTY(loArticol, 'multiplicator', 1)
ADDPROPERTY(loArticol, 'codbare', "")
* calea veche (Gather direct in crsfactura, fara Append Blank propriu) presupune ca grilul
* a pozitionat deja un rand gol pe crsfactura - ca la LostFocus pe ultima linie a grid-ului
SELECT crsfactura
APPEND BLANK
gcErr = ""
gnErr = 0
gcMockApeluri = ""
llRet = loForm.do_adauga_articol_cautat(loArticol, loArticol.cantitate)
DO AfLog WITH "DIAG llRet=" + TRANSFORM(llRet) + " gcErr=[" + gcErr + "] gcMockApeluri=[" + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13)+CHR(10), ' | ') + "]"
DO AfLog WITH "DIAG crsfactura reccount=" + TRANSFORM(RECCOUNT('crsfactura'))
DO Assert WITH gnErr = 0, "fara eroare VFP (tip 41, articol negasit)"
DO Assert WITH llRet = .T., "do_adauga_articol_cautat intoarce .T. (tip 41, comportament neschimbat)"
DO Assert WITH RECCOUNT('crsfactura') = 1, "randul ajunge in crsfactura pe calea veche (Reccount=" + TRANSFORM(RECCOUNT('crsfactura')) + ")"
DO Assert WITH !("amessagebox(" $ gcMockApeluri), "nicio garda pe tip 41 (scopata la 8/9)"
IF RECCOUNT('crsfactura') >= 1
SELECT crsfactura
GO TOP
DO Assert WITH id_gestiune = -1000, "id_gestiune ramane sentinela -1000 pe tip 41 (neschimbat, nu regresie)"
ENDIF
DO Inchide WITH 'crsarticole'
loForm.Release()
RELEASE loForm, loArticol
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'
DO Inchide WITH 'jtva_coloane'
SELECT 0
* cboTipFactura (frm_facturare_articole2) cere RowSource pe saft_tip_facturi la constructie
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"
* jtva_coloane real (do_initializeaza_articol face Select jtva_coloane pe fiecare articol)
DO Inchide WITH 'jtva_coloane'
IF poDate.tva_incasare = 0
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane
ELSE
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane
ENDIF
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 AfLog WITH "PASS: " + gcCaz + tcMsg
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 + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10)
gnErr = gnErr + 1
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC