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

783 lines
31 KiB
Plaintext

* test_s8_cablare_incarcare.prg
* Headless: proba cablarii incarcarii in masa pe frm_facturare_articole2 (S8, propunerea
* docs\propunere_s8_cablare_incarcare_v2.md sectiunea 7). Testul apasa BUTONUL
* (but_incarca_articole.Click(), care trece prin _cmd_base.Click si macro-expandeaza cAction),
* niciodata metoda do_incarca_articole direct - veriga de rutare era exact ce lipsea in probele
* anterioare.
*
* Asertiuni (A1-A10 din sectiunea 7.2, plus cele doua structurale de rutare din 7.1):
* A1 but_incarca_articole.cAction = 'do_incarca_articole' (+ PEMSTATUS do_adauga_tot pe instanta)
* A2 dupa Click: Reccount('crsarticole') > 0
* A3 dupa Click: Reccount('crsfactura') > 0 <- trece datorita cablarii (W1)
* A4 Reccount('crsfactura') = Reccount('crsarticole') (comanda fara linii sarite)
* A5 zero linii cu id_jtva_coloana = 0 in crsfactura <- trece datorita W3
* A6 SUM(valctva) din crsfactura > 0
* A7 comanda cu linie de discount (cantitate negativa): zero apeluri amessagebox <- W2
* A8 neregresie tip 1 (lista de preturi, llCautareInLinie): crsfactura ramane gol
* A9 garda de tipuri, contract (tip 2): crsfactura ramane gol SI zero amessagebox
* A11 taxcode din crsfactura = valoarea derivata de cod <- trece datorita W4
* A10 emitere reala prin but_termin1.Click(): rand in VANZARI cu TIP = 3 si
* VANZARI_DETALII.ID_JTVA_COLOANA > 0 pe toate liniile (numai daca A1-A9 sunt verzi)
*
* Sursele se aleg din date la rulare (SELECT peste COMENZI + apel pack_facturare.cursor_comanda,
* exact interogarea folosita de incarca_cursor_articole) - id-urile fixe nu tin: o comanda emisa
* de o rulare anterioara intoarce 0 linii la urmatoarea (2478/2479, consumate la S6-2).
* sursa A (A2-A6, A10): comanda fara linii cu cantitate negativa si cu id_c distincte
* sursa B (A7): comanda cu cel putin o linie negativa, toate negativele negestionabile
* Clientii cu 'CLIENT' in nume sunt exclusi: valideaza_antet (ofacturare_antet.prg:881) deschide
* pentru ei dialogul "in loc de BON FISCAL", care ar polua asertiunile de zero-amessagebox.
*
* Mock: mock_validare_antet.prg (amessagebox + facturi_duplicate -> gcMockApeluri). amessagebox e
* apelat din interiorul unei metode .vcx, deci se reincarca cu SET PROCEDURE ... ADDITIVE imediat
* inainte de fiecare Click; nu se probeaza precedenta mock-ului chemand amessagebox direct.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s8_cablare_incarcare.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s8_cablare_incarcare.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8 (inainte de creeaza_cursor_serii);
* gnIdSucursala = 167; gnScadereStoc = 0; gnFactSeturi = 0.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET DECIMALS TO 4
SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcLog, gnPass, gnFail, gnErr, gcCaz, gcMock, gcNumere
PUBLIC gcMockApeluri, gnMockRaspuns, gcMockDuplicat
PUBLIC gnComandaA, gnComandaB, goDriverMsg, gcClaseVazute
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s8_cablare_incarcare.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)
gnPass = 0
gnFail = 0
gnErr = 0
gcCaz = ""
gcMockApeluri = ""
gnMockRaspuns = 6
gcMockDuplicat = ""
gnComandaA = 0
gnComandaB = 0
gcClaseVazute = ";"
gcNumere = ""
gcMock = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg"
*-- poDate & co. se declara SI se initializeaza la nivelul programului principal: metodele din
*-- .vcx le vad numai daca variabila exista deja pe stiva de sub ele. Un PRIVATE declarat intr-o
*-- procedura si asignat in alta ramane invizibil in forma (eroarea "Alias 'PODATE' is not found").
PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest, pnTotalDiscountAvize, plVizibil
poDate = NULL
poGeneratorNumere = NULL
poDateGestiuneDest = NULL
pnTotalDiscountAvize = 0
plVizibil = .F.
ON ERROR DO S8Err WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
TRY
*-- stub_verificare PRIMUL: "Do Form verificare" (ofacturare.vc2:20126) rezolva la stub, nu la
*-- formularul real. test_init_env_auto_roafacturare.prg:78 adauga ADDITIV, deci nu-l pierde.
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\achizitie_import\stub_verificare"
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 S8Log WITH 'EROARE: conectare Oracle esuata'
DO S8Final
ENDIF
SQLSETPROP(gnHandle, "QueryTimeOut", 45)
DO S8Log WITH 'ENV OK gnHandle=' + TRANSFORM(gnHandle) + ' gcS=' + gcS
DO S8Log WITH 'DIAG SET_PATH stub inca in fata: ' + FULLPATH('verificare.scx')
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
SET PROCEDURE TO (gcMock) ADDITIVE
IF !actualizeaza_optiuni_program()
DO S8Log WITH 'EROARE: actualizeaza_optiuni_program()'
DO S8Final
ENDIF
gnScadereStoc = 0
gnFactSeturi = 0
gnIdSucursala = 167
goExecutor.oExecuta([begin pack_contafin.set_id_sucursala(?gnIdSucursala); end;])
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
DO S8Log WITH 'optiuni OK gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ' gnFactSeturi=' + TRANSFORM(gnFactSeturi) + ;
' gnIdSucursala=' + TRANSFORM(gnIdSucursala) + ' gnIdUtil=' + TRANSFORM(gnIdUtil) + ;
' gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna)
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
*-- cboTipFactura cere RowSource pe saft_tip_facturi la constructia formularului
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
*-- confirmarile pe forma modala MESSAGEBOX_FORM (ex. "Doriti sa se inchida comanda?" la tip 3)
*-- nu trec prin functia amessagebox, deci mock-ul nu le acopera - timer + driver, ca la S6-2
goDriverMsg = CREATEOBJECT('driverMsgS8')
_SCREEN.AddObject('tmrS8', 'Timer')
_SCREEN.tmrS8.Interval = 200
BINDEVENT(_SCREEN.tmrS8, 'Timer', goDriverMsg, 'Executa')
_SCREEN.tmrS8.Enabled = .T.
DO S8Log WITH CHR(13) + CHR(10) + '===== ALEGEREA SURSELOR DIN DATE ====='
DO AlegeSurse
DO S8Log WITH CHR(13) + CHR(10) + '===== A1 + rutare (structural, fara rulare de sursa) ====='
DO CazRutare
DO S8Log WITH CHR(13) + CHR(10) + '===== A7 - comanda cu linie de discount (cantitate negativa) ====='
DO CazDiscount
DO S8Log WITH CHR(13) + CHR(10) + '===== A8 - neregresie tip 1 (lista de preturi) ====='
DO CazListaPreturi
DO S8Log WITH CHR(13) + CHR(10) + '===== A9 - garda de tipuri, contract (tip 2) ====='
DO CazContract
DO S8Log WITH CHR(13) + CHR(10) + '===== A2-A6 (+ A10) - comanda curata ====='
DO CazComanda
DO S8Final
CATCH TO loExc
DO S8Log WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ;
' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']'
DO S8Final
ENDTRY
QUIT
*==================================================================================
* AlegeSurse: scaneaza comenzile descrescator si cheama pack_facturare.cursor_comanda (aceeasi
* interogare pe care o face incarca_cursor_articole) pana gaseste ambele surse.
PROCEDURE AlegeSurse
LOCAL lnQ, lnCnt, lnNeg, lnNegGest, lnDistinctIdC, lnIncercari
poDate = CREATEOBJECT('empty')
ADDPROPERTY(poDate, 'zi_curs', DATE(gnAn, gnLuna, 1))
ADDPROPERTY(poDate, 'tip', 3)
ADDPROPERTY(poDate, 'listaid', '')
lnQ = goExecutor.oExecute([select c.id_comanda, p.nume from comenzi c, nom_parteneri p ] + ;
[where c.id_part = p.id_part and upper(p.nume) not like '%CLIENT%' order by c.id_comanda desc], 'crsComLista')
IF lnQ < 0 OR !USED('crsComLista')
DO Assert WITH .F., 'lista de comenzi citita din Oracle: ' + TRANSFORM(goExecutor.oPrelucrareEroare())
RETURN
ENDIF
lnIncercari = 0
SELECT crsComLista
SCAN WHILE lnIncercari < 80 AND (gnComandaA = 0 OR gnComandaB = 0)
lnIncercari = lnIncercari + 1
poDate.listaid = ALLTRIM(TRANSFORM(crsComLista.id_comanda))
DO Inchide WITH 'crsAlegere'
lnQ = goExecutor.oExecute([{call ] + gcS + [.pack_facturare.cursor_comanda(?poDate.zi_curs,?poDate.tip,?poDate.listaid,?gnIdUtil)}], 'crsAlegere')
IF lnQ >= 0 AND USED('crsAlegere') AND RECCOUNT('crsAlegere') > 0
SELECT crsAlegere
lnCnt = RECCOUNT('crsAlegere')
COUNT FOR cantitate < 0 TO lnNeg
COUNT FOR cantitate < 0 AND NVL(gestionabil, 0) = 1 TO lnNegGest
SELECT DISTINCT id_c FROM crsAlegere INTO CURSOR crsIdC
lnDistinctIdC = RECCOUNT('crsIdC')
USE IN crsIdC
DO CASE
CASE gnComandaA = 0 AND lnNeg = 0 AND lnDistinctIdC = lnCnt
gnComandaA = crsComLista.id_comanda
DO S8Log WITH ' sursa A = comanda ' + TRANSFORM(gnComandaA) + ' (linii=' + TRANSFORM(lnCnt) + ', fara negative, id_c distincte)'
CASE gnComandaB = 0 AND lnNeg > 0 AND lnNegGest = 0
gnComandaB = crsComLista.id_comanda
DO S8Log WITH ' sursa B = comanda ' + TRANSFORM(gnComandaB) + ' (linii=' + TRANSFORM(lnCnt) + ', negative=' + ;
TRANSFORM(lnNeg) + ', toate negestionabile)'
ENDCASE
ENDIF
SELECT crsComLista
ENDSCAN
DO Inchide WITH 'crsAlegere'
DO Inchide WITH 'crsComLista'
DO S8Log WITH ' comenzi inspectate=' + TRANSFORM(lnIncercari)
DO Assert WITH gnComandaA > 0, 'sursa A (comanda tip 3 fara linii negative) gasita in date'
IF gnComandaB = 0
DO S8Log WITH ' ATENTIE: nicio comanda cu linie de discount negestionabila in primele ' + ;
TRANSFORM(lnIncercari) + ' comenzi - A7 ramane NEEXERCITATA pe date'
ENDIF
ENDPROC
*==================================================================================
* A1 + asertiunile structurale de rutare (sectiunea 7.1): butonul duce la metoda, iar metoda
* care muta liniile exista pe instanta v2.
PROCEDURE CazRutare
LOCAL loForm
gcCaz = '[A1] '
DO CuratieCrs
DO creeaza_facturacrs WITH 'crsfactura'
poDate = CREATEOBJECT("oDateFactura", 25002, 3)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
loForm = CREATEOBJECT('frm_facturare_articole2')
IF VARTYPE(loForm) <> 'O'
DO Assert WITH .F., 'Createobject frm_facturare_articole2'
RETURN
ENDIF
DO Assert WITH LOWER(ALLTRIM(loForm.but_incarca_articole.cAction)) == 'do_incarca_articole', ;
'[RUTARE] butonul Incarca articole duce la do_incarca_articole (cAction=[' + ;
ALLTRIM(TRANSFORM(loForm.but_incarca_articole.cAction)) + '])'
DO Assert WITH PEMSTATUS(loForm, 'do_adauga_tot', 5), ;
'[RUTARE] metoda do_adauga_tot exista pe instanta v2'
loForm.Release()
RELEASE loForm
DO CuratieCrs
ENDPROC
*==================================================================================
* A2-A6 pe sursa A, apoi A10 (emitere reala) daca tot ce s-a rulat pana aici e verde.
PROCEDURE CazComanda
LOCAL loSursa, loForm, lnArt, lnFact, lnZero, lnSuma, lnFailInainte, lnIdVz, lcSerie, lnNract
LOCAL lnRau, lnNenul, lnAstept, llSaft
gcCaz = '[A2-A6] '
IF gnComandaA = 0
DO Assert WITH .F., 'A2-A6: nu exista sursa A aleasa - cazul nu s-a rulat'
RETURN
ENDIF
lnFailInainte = gnFail
loSursa = CreeazaSursaComanda(gnComandaA)
IF ISNULL(loSursa)
DO Assert WITH .F., 'sursa A citita din Oracle (id_comanda=' + TRANSFORM(gnComandaA) + ')'
RETURN
ENDIF
loForm = PregatesteFormular(3, loSursa)
IF ISNULL(loForm)
RETURN
ENDIF
DO ApasaIncarca WITH loForm
lnArt = IIF(USED('crsarticole'), RECCOUNT('crsarticole'), 0)
lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0)
DO S8Log WITH ' dupa Click: crsarticole=' + TRANSFORM(lnArt) + ' crsfactura=' + TRANSFORM(lnFact)
DO Assert WITH lnArt > 0, 'A2: Reccount(crsarticole) > 0 dupa Click, e=' + TRANSFORM(lnArt)
DO Assert WITH lnFact > 0, 'A3: Reccount(crsfactura) > 0 dupa Click (cablarea W1), e=' + TRANSFORM(lnFact)
DO Assert WITH lnFact = lnArt, 'A4: Reccount(crsfactura) = Reccount(crsarticole), ' + ;
TRANSFORM(lnFact) + ' vs ' + TRANSFORM(lnArt)
lnZero = -1
lnSuma = 0
IF lnFact > 0
SELECT crsfactura
COUNT FOR NVL(id_jtva_coloana, 0) = 0 TO lnZero
SUM valctva TO lnSuma
ENDIF
DO Assert WITH lnZero = 0, 'A5: zero linii cu id_jtva_coloana = 0 in crsfactura (W3), e=' + TRANSFORM(lnZero)
DO Assert WITH lnSuma > 0, 'A6: SUM(valctva) din crsfactura > 0, e=' + TRANSFORM(lnSuma)
*-- A11 (W4): taxcode ajunge in crsfactura cu exact valoarea pe care o deriva codul, nu "nenul".
*-- frm_articol_factura.Init cheama UpdateExplicatieSAFT doar sub If m.gl406 (ofacturare.vc2:2523),
*-- iar GetTaxCode intoarce NULL daca gl406 e stins - deci fara SAFT valoarea legitima e 0 (din
*-- AddProperty), nu un cod. Asteptarea se calculeaza cu aceeasi functie, ramura cu ramura.
*-- Fara W4 taxcode nu e in listele Gather, deci ramane NULL pe fiecare rand: -999 <> asteptat.
llSaft = (TYPE('gl406') = 'L' AND gl406)
lnRau = 0
lnNenul = 0
IF lnFact > 0
SELECT crsfactura
SCAN
lnAstept = IIF(m.llSaft, NVL(GetTaxCode(gnAn, gnLuna, poDate.dataact, NVL(crsfactura.id_jtva_coloana, 0), .F.), -999), 0)
IF NVL(crsfactura.taxcode, -999) <> m.lnAstept
lnRau = lnRau + 1
DO S8Log WITH ' A11 nepotrivire: id_jtva_coloana=' + TRANSFORM(NVL(crsfactura.id_jtva_coloana, 0)) + ;
' taxcode=' + TRANSFORM(crsfactura.taxcode) + ' asteptat=' + TRANSFORM(m.lnAstept)
ENDIF
IF NVL(crsfactura.taxcode, 0) <> 0
lnNenul = lnNenul + 1
ENDIF
ENDSCAN
ENDIF
DO S8Log WITH ' A11: gl406=' + TRANSFORM(m.llSaft) + ' linii cu taxcode nenul=' + TRANSFORM(lnNenul) + '/' + TRANSFORM(lnFact)
DO Assert WITH lnFact > 0 AND lnRau = 0, ;
'A11: taxcode din crsfactura = valoarea derivata de cod (W4), linii nepotrivite=' + TRANSFORM(lnRau)
IF lnNenul = 0
DO S8Log WITH ' A11 ATENTIE: toate liniile au taxcode 0 - asertiunea e conforma cu codul, dar ' + ;
'NU exercita culegerea unei valori reale (gl406 stins sau explicatii SAFT neconfigurate)'
ENDIF
*-- A10: numai daca tot lantul A1-A9 e verde (sectiunea 7.2)
IF gnFail = 0 AND lnFailInainte = 0
gcCaz = '[A10] '
lcSerie = ALLTRIM(NVL(poDate.serie_act, ''))
lnNract = poDate.nract
DO S8Log WITH ' A10: emit cu serie_act=' + lcSerie + ' nract=' + TRANSFORM(lnNract)
loForm.do_calculeaza_totaluri()
DOEVENTS FORCE
SET PROCEDURE TO (gcMock) ADDITIVE
gcMockApeluri = ''
loForm.but_termin1.Click()
DOEVENTS FORCE
lnIdVz = NVL(poDate.nid_vanzare, 0)
DO S8Log WITH ' A10: but_termin1.Click() -> poDate.nid_vanzare=' + TRANSFORM(lnIdVz)
DO S8Log WITH ' A10: apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']'
IF lnIdVz > 0
gcNumere = gcNumere + 'SCRIS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' id_vanzare=' + TRANSFORM(lnIdVz) + ';'
DO VerificaVanzare WITH lnIdVz
ELSE
gcNumere = gcNumere + 'ARS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (alocat, nescris);'
DO Assert WITH .F., 'A10: documentul s-a scris (poDate.nid_vanzare > 0), e=' + TRANSFORM(lnIdVz)
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
ENDIF
ELSE
DO S8Log WITH ' A10 NERULAT: exista esecuri anterioare (fail=' + TRANSFORM(gnFail) + ')'
gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(NVL(poDate.serie_act, '')) + ' nract=' + TRANSFORM(poDate.nract) + ';'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
ENDIF
DO Elibereaza WITH loForm
DO Goleste
ENDPROC
*==================================================================================
* A7: comanda cu linie de discount. Fara garda de gestionabilitate (W2), bucla din do_adauga_tot
* ajunge la dialogul "Nu ati selectat toata cantitatea"; cu garda, nu se cheama deloc amessagebox.
PROCEDURE CazDiscount
LOCAL loSursa, loForm, lnNeg
gcCaz = '[A7] '
IF gnComandaB = 0
DO S8Log WITH ' A7 NEEXERCITATA: nicio comanda cu linie de discount negestionabila in date'
RETURN
ENDIF
loSursa = CreeazaSursaComanda(gnComandaB)
IF ISNULL(loSursa)
DO Assert WITH .F., 'sursa B citita din Oracle (id_comanda=' + TRANSFORM(gnComandaB) + ')'
RETURN
ENDIF
loForm = PregatesteFormular(3, loSursa)
IF ISNULL(loForm)
RETURN
ENDIF
DO ApasaIncarca WITH loForm
lnNeg = 0
IF USED('crsfactura') AND RECCOUNT('crsfactura') > 0
SELECT crsfactura
COUNT FOR cantitate < 0 TO lnNeg
ENDIF
DO S8Log WITH ' dupa Click: crsarticole=' + TRANSFORM(IIF(USED('crsarticole'), RECCOUNT('crsarticole'), 0)) + ;
' crsfactura=' + TRANSFORM(IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0)) + ' din care negative=' + TRANSFORM(lnNeg)
DO S8Log WITH ' apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']'
DO Assert WITH !('amessagebox' $ LOWER(gcMockApeluri)), ;
'A7: zero apeluri amessagebox pe comanda cu linie de discount (W2), jurnal=[' + ;
STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']'
DO Assert WITH lnNeg > 0, 'A7 (diagnostic): linia de discount a ajuns in crsfactura, negative=' + TRANSFORM(lnNeg)
gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(NVL(poDate.serie_act, '')) + ' nract=' + TRANSFORM(poDate.nract) + ' (A7);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO Elibereaza WITH loForm
DO Goleste
ENDPROC
*==================================================================================
* A8: tip 1 (lista de preturi) - llCautareInLinie sare peste incarcarea in masa, deci nici
* do_adauga_tot nu se cheama; crsfactura ramane gol.
PROCEDURE CazListaPreturi
LOCAL loForm, lnFact
gcCaz = '[A8] '
loForm = PregatesteFormular(1, NULL)
IF ISNULL(loForm)
RETURN
ENDIF
DO ApasaIncarca WITH loForm
lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0)
DO S8Log WITH ' dupa Click: crsarticole=' + TRANSFORM(IIF(USED('crsarticole'), RECCOUNT('crsarticole'), 0)) + ;
' crsfactura=' + TRANSFORM(lnFact)
DO S8Log WITH ' apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']'
DO Assert WITH lnFact = 0, 'A8: pe tip 1 (cautare in linie) crsfactura ramane gol dupa Click, e=' + TRANSFORM(lnFact)
DO Assert WITH !('nu ati ales' $ LOWER(gcMockApeluri)), ;
'A8: antetul a trecut validarea (Click-ul a ajuns la ramura llCautareInLinie, nu s-a oprit in valideaza_antet)'
gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(NVL(poDate.serie_act, '')) + ' nract=' + TRANSFORM(poDate.nract) + ' (A8);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO Elibereaza WITH loForm
DO Goleste
ENDPROC
*==================================================================================
* A9: contract (tip 2) - incarcarea in masa RULEAZA (crsarticole se umple), dar garda de tipuri
* din do_incarca_articole nu cheama do_adauga_tot; crsfactura ramane gol si nu apare niciun dialog.
* Contractul se alege incercand candidatii pe rand: unul fara linii ar declansa "Nu exista
* articole pentru optiunile alese!" din incarca_cursor_articole si ar strica asertiunea.
PROCEDURE CazContract
LOCAL lnI, llGasit
gcCaz = '[A9] '
IF goExecutor.oExecute([select ct.id_ctr from fact_vcontracte ct, nom_parteneri p ] + ;
[where ct.id_part = p.id_part and upper(p.denumire) not like '%CLIENT%' order by ct.id_ctr desc], 'crsCtrLista') < 0
DO Assert WITH .F., 'A9: lista de contracte citita din Oracle'
RETURN
ENDIF
llGasit = .F.
lnI = 0
SELECT crsCtrLista
SCAN WHILE lnI < 6 AND !llGasit
lnI = lnI + 1
llGasit = IncearcaContract(crsCtrLista.id_ctr)
SELECT crsCtrLista
ENDSCAN
DO Inchide WITH 'crsCtrLista'
IF !llGasit
DO Assert WITH .F., 'A9: niciun contract cu articole in primii ' + TRANSFORM(lnI) + ' candidati - cazul nu s-a exercitat'
ENDIF
ENDPROC
FUNCTION IncearcaContract
LPARAMETERS tnIdCtr
LOCAL loSursa, loForm, lnArt, lnFact
loSursa = CreeazaSursaContract(tnIdCtr)
IF ISNULL(loSursa)
RETURN .F.
ENDIF
loForm = PregatesteFormular(2, loSursa)
IF ISNULL(loForm)
RETURN .F.
ENDIF
DO ApasaIncarca WITH loForm
lnArt = IIF(USED('crsarticole'), RECCOUNT('crsarticole'), 0)
lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0)
DO S8Log WITH ' contract ' + TRANSFORM(tnIdCtr) + ': crsarticole=' + TRANSFORM(lnArt) + ' crsfactura=' + TRANSFORM(lnFact)
IF lnArt > 0
DO S8Log WITH ' apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']'
DO Assert WITH lnFact = 0, 'A9: pe tip 2 (contract) crsfactura ramane gol dupa Click - garda de tipuri, e=' + TRANSFORM(lnFact)
DO Assert WITH !('amessagebox' $ LOWER(gcMockApeluri)), ;
'A9: zero apeluri amessagebox pe contract, jurnal=[' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']'
ENDIF
gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(NVL(poDate.serie_act, '')) + ' nract=' + TRANSFORM(poDate.nract) + ' (A9 ctr ' + TRANSFORM(tnIdCtr) + ');'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO Elibereaza WITH loForm
DO Goleste
RETURN (lnArt > 0)
ENDFUNC
*==================================================================================
* PregatesteFormular: poDate + generator + crsfactura gol + formular v2, gata de Click.
* Scrie direct in poDate / poGeneratorNumere / poDateGestiuneDest - PRIVATE-urile declarate de
* apelant sunt vizibile aici (nu se transmit prin referinta: @ pe PRIVATE e capcana platita deja).
* Intoarce NULL daca ceva din pregatire a esuat (a asertat deja).
FUNCTION PregatesteFormular
LPARAMETERS tnTip, toSursa
LOCAL loForm, lnIdSet
DO CuratieCrs
SELECT 0
lnIdSet = 25000 + tnTip - 1
IF ISNULL(toSursa)
poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip)
ELSE
poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip, toSursa)
ENDIF
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poDateGestiuneDest = CREATEOBJECT("oDateGestiune")
*-- tip 1 nu are sursa: antetul se completeaza cu un client real, altfel valideaza_antet
*-- respinge inainte sa se ajunga la ramura llCautareInLinie (si A8 ar trece degeaba)
IF ISNULL(toSursa)
IF goExecutor.oExecute([select id_part, nume from nom_parteneri where upper(nume) not like '%CLIENT%' and rownum = 1], 'crsPart') >= 0 ;
AND USED('crsPart') AND RECCOUNT('crsPart') > 0
SELECT crsPart
poDate.id_client = id_part
poDate.nume_client = ALLTRIM(NVL(nume, ''))
USE IN crsPart
ENDIF
ENDIF
IF EMPTY(NVL(poDate.id_fdoc, 0))
poDate.id_fdoc = 1
ENDIF
poDate.id_delegat = 39
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
IF poDate.rezultat_serii <> 3
DO Assert WITH .F., 'rezultat_serii = 3 (o singura plaja, fara dialog) pe tip ' + TRANSFORM(tnTip) + ', e=' + TRANSFORM(poDate.rezultat_serii)
RETURN NULL
ENDIF
poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc)
poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL)
DO S8Log WITH ' tip=' + TRANSFORM(tnTip) + ' nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ;
' serie_act=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ;
' listaid=[' + TRANSFORM(poDate.listaid) + '] id_client=' + TRANSFORM(poDate.id_client)
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
*-- crsfactura gol INAINTE de formular, ca in factureaza() pe ramura llFacturareNoua; coloana
*-- gestiune e ceruta de coloana combo a grilei (tehnica din test_s4_3_neregresie_masa.prg)
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
loForm = CREATEOBJECT('frm_facturare_articole2')
IF VARTYPE(loForm) <> 'O'
DO Assert WITH .F., 'Createobject frm_facturare_articole2 pe tip ' + TRANSFORM(tnTip)
RETURN NULL
ENDIF
loForm.WindowType = 0
loForm.Show()
DOEVENTS FORCE
RETURN loForm
ENDFUNC
*==================================================================================
* ApasaIncarca: singura cale prin care testul declanseaza incarcarea. Mock-ul se reincarca imediat
* inainte, ca sa castige rezolutia de nume pentru amessagebox-ul apelat din interiorul .vcx.
PROCEDURE ApasaIncarca
LPARAMETERS toForm
SET PROCEDURE TO (gcMock) ADDITIVE
gcMockApeluri = ''
toForm.but_incarca_articole.Click()
DOEVENTS FORCE
ENDPROC
*==================================================================================
* A10: documentul scris in Oracle - tip si id_jtva_coloana pe toate liniile.
PROCEDURE VerificaVanzare
LPARAMETERS tnIdVz
LOCAL lnTip, lnLinii, lnZero
IF goExecutor.oExecute([select tip from vanzari where id_vanzare = ] + TRANSFORM(tnIdVz), 'crsVz') < 0 OR RECCOUNT('crsVz') <> 1
DO Assert WITH .F., 'A10: VANZARI contine documentul id_vanzare=' + TRANSFORM(tnIdVz)
DO Inchide WITH 'crsVz'
RETURN
ENDIF
SELECT crsVz
lnTip = tip
USE IN crsVz
DO Assert WITH lnTip = 3, 'A10: VANZARI.TIP = 3 pe documentul emis, e=' + TRANSFORM(lnTip)
IF goExecutor.oExecute([select nvl(id_jtva_coloana,0) as id_jtva_coloana from vanzari_detalii where id_vanzare = ] + TRANSFORM(tnIdVz), 'crsVzD') < 0
DO Assert WITH .F., 'A10: VANZARI_DETALII citit pentru id_vanzare=' + TRANSFORM(tnIdVz)
RETURN
ENDIF
SELECT crsVzD
lnLinii = RECCOUNT('crsVzD')
COUNT FOR id_jtva_coloana <= 0 TO lnZero
USE IN crsVzD
DO Assert WITH lnLinii > 0, 'A10: VANZARI_DETALII are linii, e=' + TRANSFORM(lnLinii)
DO Assert WITH lnZero = 0, 'A10: ID_JTVA_COLOANA > 0 pe toate liniile, linii cu 0/null=' + TRANSFORM(lnZero)
ENDPROC
*==================================================================================
* Sursa reala pentru comanda (tip 3) - campurile citite de oDateFactura.Init pe ramura tnTip=3
* (ofacturare_comun.prg:315). listaid trebuie caracter (do_scrie_factura face Val(poDate.listaid)).
FUNCTION CreeazaSursaComanda
LPARAMETERS tnIdComanda
LOCAL lnQ, loSursa
loSursa = NULL
lnQ = goExecutor.oExecute([select c.id_part, p.nume, p.cod_fiscal, c.id_comanda, c.nr_comanda, c.id_sectie ] + ;
[from comenzi c, nom_parteneri p where c.id_part = p.id_part and c.id_comanda = ] + TRANSFORM(tnIdComanda), 'crsSursaCom')
IF lnQ < 0 OR !USED('crsSursaCom') OR RECCOUNT('crsSursaCom') <> 1
DO S8Log WITH ' EROARE sursa comanda ' + TRANSFORM(tnIdComanda) + ': ' + TRANSFORM(goExecutor.oPrelucrareEroare())
DO Inchide WITH 'crsSursaCom'
RETURN loSursa
ENDIF
SELECT crsSursaCom
SCATTER NAME loSursa MEMO
USE IN crsSursaCom
loSursa.id_comanda = ALLTRIM(TRANSFORM(loSursa.id_comanda))
loSursa.nr_comanda = ALLTRIM(TRANSFORM(loSursa.nr_comanda))
RETURN loSursa
ENDFUNC
* Sursa reala pentru contract (tip 2). FACT_VCONTRACTE nu are id_sectie/sectie/responsabil/valuta -
* se completeaza cu valori neutre, ca la S6-2.
FUNCTION CreeazaSursaContract
LPARAMETERS tnIdCtr
LOCAL lnQ, loSursa
loSursa = NULL
lnQ = goExecutor.oExecute([select ct.id_part, p.denumire, p.cod_fiscal, ct.id_ctr, ct.contract ] + ;
[from fact_vcontracte ct, nom_parteneri p where ct.id_part = p.id_part and ct.id_ctr = ] + TRANSFORM(tnIdCtr), 'crsSursaCtr')
IF lnQ < 0 OR !USED('crsSursaCtr') OR RECCOUNT('crsSursaCtr') <> 1
DO S8Log WITH ' EROARE sursa contract ' + TRANSFORM(tnIdCtr) + ': ' + TRANSFORM(goExecutor.oPrelucrareEroare())
DO Inchide WITH 'crsSursaCtr'
RETURN loSursa
ENDIF
SELECT crsSursaCtr
SCATTER NAME loSursa MEMO
USE IN crsSursaCtr
ADDPROPERTY(loSursa, 'id_sectie', 0)
ADDPROPERTY(loSursa, 'sectie', '')
ADDPROPERTY(loSursa, 'id_responsabil', 0)
ADDPROPERTY(loSursa, 'responsabil', '')
ADDPROPERTY(loSursa, 'id_valuta', 1)
ADDPROPERTY(loSursa, 'nume_val', 'RON')
RETURN loSursa
ENDFUNC
*==================================================================================
PROCEDURE Elibereaza
LPARAMETERS toForm
IF TYPE('toForm') = 'O' AND !ISNULL(toForm)
TRY
toForm.Release()
CATCH
ENDTRY
ENDIF
DO CuratieCrs
ENDPROC
PROCEDURE CuratieCrs
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 'crsComTemp'
DO Inchide WITH 'crsartselectate'
DO Inchide WITH 'jtva_coloane'
ENDPROC
PROCEDURE Inchide
LPARAMETERS tcAlias
IF USED(tcAlias)
USE IN (tcAlias)
ENDIF
ENDPROC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO S8Log WITH 'PASS: ' + gcCaz + tcMsg
ELSE
gnFail = gnFail + 1
DO S8Log WITH 'FAIL: ' + gcCaz + tcMsg
ENDIF
ENDPROC
PROCEDURE S8Log
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE S8Err
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gnErr = gnErr + 1
DO S8Log WITH 'ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
ENDPROC
PROCEDURE S8Final
LOCAL lnI
IF TYPE('_SCREEN.tmrS8') = 'O'
_SCREEN.tmrS8.Enabled = .F.
TRY
_SCREEN.RemoveObject('tmrS8')
CATCH
ENDTRY
ENDIF
*-- formele ramase deschise arunca "Unhandled Structured Exception" la QUIT (caseta modala =
*-- rulare atarnata), asa ca se inchid explicit inainte
FOR lnI = _SCREEN.FormCount TO 1 STEP -1
TRY
_SCREEN.Forms(lnI).Release()
CATCH
ENDTRY
ENDFOR
DO S8Log WITH CHR(13) + CHR(10) + 'NUMERE: ' + gcNumere
DO S8Log WITH 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + ' err=' + TRANSFORM(gnErr)
DO S8Log WITH 'END ' + TTOC(DATETIME())
QUIT
ENDPROC
PROCEDURE Goleste
poDate = NULL
poGeneratorNumere = NULL
poDateGestiuneDest = NULL
ENDPROC
*==================================================================================
* driverMsgS8: apasa automat cmdYes/cmdOk pe forma modala MESSAGEBOX_FORM (ex. "Doriti sa se
* inchida comanda?" la emiterea pe tip 3) - acele dialoguri nu trec prin functia amessagebox, deci
* mock-ul nu le acopera. Garda de reintrare lBusy: do_termin cedeaza controlul buclei de mesaje.
* Nu atinge in niciun fel FRM_FACTURARE_ARTICOLE2.
DEFINE CLASS driverMsgS8 AS Custom
lBusy = .F.
PROCEDURE Executa
IF This.lBusy
RETURN
ENDIF
This.lBusy = .T.
IF TYPE('_SCREEN.tmrS8') = 'O'
_SCREEN.tmrS8.Enabled = .F.
ENDIF
TRY
LOCAL lnI, loMsgForm, lcClasa
loMsgForm = NULL
FOR lnI = 1 TO _SCREEN.FormCount
lcClasa = UPPER(_SCREEN.Forms(lnI).Class)
IF 'MESSAGEBOX_FORM' $ lcClasa
loMsgForm = _SCREEN.Forms(lnI)
ENDIF
IF !(lcClasa $ gcClaseVazute)
gcClaseVazute = gcClaseVazute + lcClasa + ';'
DO S8Log WITH ' [diag timer] forma noua: ' + lcClasa + ' Caption=[' + TRANSFORM(_SCREEN.Forms(lnI).Caption) + ']'
ENDIF
ENDFOR
IF !ISNULL(loMsgForm)
TRY
DO CASE
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5)
DO S8Log WITH ' [driver msg] apas cmgBotones.cmdYes'
loMsgForm.cmgBotones.cmdYes.Click()
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5)
DO S8Log WITH ' [driver msg] apas cmgBotones.cmdOk'
loMsgForm.cmgBotones.cmdOk.Click()
ENDCASE
CATCH TO loExcMsg
DO S8Log WITH ' [driver msg] CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message
ENDTRY
ENDIF
CATCH TO loExcTop
DO S8Log WITH ' [driver] CATCH ' + TRANSFORM(loExcTop.ErrorNo) + ' ' + loExcTop.Message
FINALLY
IF TYPE('_SCREEN.tmrS8') = 'O'
_SCREEN.tmrS8.Enabled = .T.
ENDIF
This.lBusy = .F.
ENDTRY
ENDPROC
ENDDEFINE