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

295 lines
12 KiB
Plaintext

* test_s4e_0_adauga_articol.prg
* Headless: do_adauga_articol pe frm_facturare_articole2 (COMUN\clase\ofacturare.vc2) NU mai arunca
* "1925 Unknown member GRD_ARTICOLE/GRD_CONTRACTE/TXTCODMAT" la prima executie pe formularul unificat
* (S4e-0: loGrid = Thisform.grd_factura in loc de grd_contracte/grd_articole la intrare, plus blocul de
* SetFocus neconditionat de la coada metodei colapsat pe grd_factura in loc de txtCodmat/txtArticole/
* grd_articole/grd_contracte - toate patru inexistente pe formularul unificat).
*
* crsarticole e construit direct (nu prin Oracle) - do_urmator/do_adauga_tot citesc doar cursorul,
* pozitionat explicit de test inainte de apel, deci nu depind de gridul nematerializat headless
* (capcana grid-coloane-nu-se-materializeaza-headless: aici nu se citeste nimic DIN grid, doar se cere
* SetFocus pe el la coada).
*
* CAZ_A (do_urmator, ramura de refuz): gestionabil=1, cantitate=-1, tip=3 -> do_verifica_articol
* refuza (stoc insuficient), gnButon ramane <>1 -> se ajunge pe a DOUA aparitie a blocului de SetFocus
* colapsat (:18789-18800 dinainte de fix), fara nicio adaugare in crsfactura. Verifica ca simpla
* INTRARE in metoda (Local lcCursor, loGrid = grd_factura) si iesirea pe ramura de refuz nu mai
* arunca amprenta veche.
* CAZ_B (do_adauga_tot, ramura de succes): gestionabil=0, tip=3, tlImplicit=.T. (dat de do_adauga_tot
* insusi) -> do_verifica_articol accepta, Do Case intra pe "gestionabil=0" cu tlImplicit=.T. -> NU
* deschide niciun formular modal (poArticol=calculeaza_totaluri(poArticol); gnButon=1) -> ajunge pe
* PRIMA aparitie a blocului de SetFocus (:18776-18787 dinainte de fix) dupa ce randul a fost deja
* scris in crsfactura. Verifica randul ajuns in crsfactura (id_articol/cantitate/denumire) si
* scaderea cantitatii in crsarticole (Replace ... For id_c, ramura Inlist(tip,3,4,21,25,28,42,47)).
*
* Deliberat NU se cheama Thisform.Show(): pe masina de dezvoltare ecranul e partajat, iar afisarea unui
* formular (chiar modeless) ar muta focus-ul real Windows la SetFocus() - interzis explicit. Fara Show,
* Thisform.grd_factura.SetFocus() (ultima instructiune din metoda, dupa ce randul a fost deja scris)
* poate arunca o eroare headless-only (fereastra nu exista) - se accepta si se ignora daca apare, CU
* CONDITIA sa nu fie amprenta veche (GRD_ARTICOLE/GRD_CONTRACTE/TXTCODMAT/TXTARTICOLE): ON ERROR
* jurnalizeaza si executia continua (SetFocus e ultima linie a metodei, deci nu afecteaza randul deja
* scris in crsfactura).
*
* amessagebox e mocat (mock_validare_antet.prg) ca sa nu apara dialogul real pe ramura de refuz.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s4e_0_adauga_articol.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4e_0_adauga_articol.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 1.
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_s4e_0_adauga_articol.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])
PRIVATE poDate, poGeneratorNumere, plVizibil, pnTotalDiscountAvize
plVizibil = .F.
pnTotalDiscountAvize = 0
poDate = NULL
poGeneratorNumere = CREATEOBJECT("oGeneratorMock")
DO CazUrmatorRefuz
DO CazAdaugaTotSucces
DO Final
*----------------------------------------------------------------------------------------
* CAZ_A: do_urmator pe articol negestionabil... nu, gestionabil=1 cu cantitate<=0 -> refuz stoc
PROCEDURE CazUrmatorRefuz
LOCAL loForm
gcCaz = "[CAZ_A do_urmator_refuz] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 3
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, 201, "ARTICOL REFUZ", -1, 1, 0, 100, 0, 1.19, 0, "BUC", ;
21, "371", 1, 0, 1, 1, 0, 0, "CM201", "", "RON")
GO TOP IN crsarticole
SELECT crsarticole
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
gcErr = ""
gnErr = 0
gcMockApeluri = ""
loForm.do_urmator()
DO Assert WITH !("GRD_ARTICOLE" $ UPPER(gcErr)), "fara amprenta GRD_ARTICOLE in gcErr"
DO Assert WITH !("GRD_CONTRACTE" $ UPPER(gcErr)), "fara amprenta GRD_CONTRACTE in gcErr"
DO Assert WITH !("TXTCODMAT" $ UPPER(gcErr)), "fara amprenta TXTCODMAT in gcErr"
DO Assert WITH !("TXTARTICOLE" $ UPPER(gcErr)), "fara amprenta TXTARTICOLE in gcErr"
DO Assert WITH RECCOUNT('crsfactura') = 0, "refuz de stoc: crsfactura ramane gol"
DO Assert WITH "amessagebox(" $ gcMockApeluri, "mesajul de refuz a fost afisat (mocat)"
DO Inchide WITH 'crsarticole'
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
* CAZ_B: do_adauga_tot pe doua articole negestionabile (tlImplicit=.T. dat de do_adauga_tot insusi,
* deci fara formular modal) -> ambele trebuie sa ajunga in crsfactura
PROCEDURE CazAdaugaTotSucces
LOCAL loForm
gcCaz = "[CAZ_B do_adauga_tot_succes] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 3
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, 301, "ARTICOL UNU", 5, 0, 0, 100, 0, 1.19, 0, "BUC", ;
21, "371", 1, 0, 1, 1, 0, 0, "CM301", "", "RON")
INSERT INTO crsarticole VALUES (2, 302, "ARTICOL DOI", 3, 0, 0, 200, 0, 1.19, 0, "BUC", ;
21, "371", 1, 0, 1, 1, 0, 0, "CM302", "", "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
gcErr = ""
gnErr = 0
gcMockApeluri = ""
loForm.do_adauga_tot()
DO Assert WITH !("GRD_ARTICOLE" $ UPPER(gcErr)), "fara amprenta GRD_ARTICOLE in gcErr"
DO Assert WITH !("GRD_CONTRACTE" $ UPPER(gcErr)), "fara amprenta GRD_CONTRACTE in gcErr"
DO Assert WITH !("TXTCODMAT" $ UPPER(gcErr)), "fara amprenta TXTCODMAT in gcErr"
DO Assert WITH !("TXTARTICOLE" $ UPPER(gcErr)), "fara amprenta TXTARTICOLE in gcErr"
DO Assert WITH RECCOUNT('crsfactura') = 2, "ambele randuri au ajuns in crsfactura (Reccount=" + TRANSFORM(RECCOUNT('crsfactura')) + ")"
IF RECCOUNT('crsfactura') >= 1
SELECT crsfactura
GO TOP
DO Assert WITH id_articol = 301 AND cantitate = 5 AND ALLTRIM(denumire) == "ARTICOL UNU", "randul 1: id_articol/cantitate/denumire corecte"
ENDIF
IF RECCOUNT('crsfactura') >= 2
SELECT crsfactura
GO 2
DO Assert WITH id_articol = 302 AND cantitate = 3 AND ALLTRIM(denumire) == "ARTICOL DOI", "randul 2: id_articol/cantitate/denumire corecte"
ENDIF
DO Assert WITH USED('crsarticole') AND RECCOUNT('crsarticole') = 2, "crsarticole ramane deschis dupa adaugare"
IF USED('crsarticole')
SELECT crsarticole
LOCATE FOR id_c = 1
DO Assert WITH FOUND() AND cantitate = 0, "crsarticole id_c=1: cantitate scazuta la 0 (5-5)"
LOCATE FOR id_c = 2
DO Assert WITH FOUND() AND cantitate = 0, "crsarticole id_c=2: cantitate scazuta la 0 (3-3)"
ENDIF
DO Inchide WITH 'crsarticole'
loForm.Release()
RELEASE loForm
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
* 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"
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