Files
comun/utile/Teste/editare_factura/test_s8_x2_stare.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

685 lines
34 KiB
Plaintext

* test_s8_pas7_cablare.prg
* Verifica pasul 7 din docs\propunere_s8_incarcare.md §6: cablarea celei de-a treia optiuni de
* meniu si corpul real al lui frm_facturi.do_editare_unificata (COMUN\clase\ofacturare_comun.vc2).
* Traseul REAL: Newobject('frm_facturi') + .do_editare_unificata() (nu Createobject direct pe
* frm_facturare_articole2 - asta ar proba doar codul formularului, nu rutarea).
* Documente reale, in luna curenta a calendarului (gnAn/gnLuna), care trec toate garzile
* (nesters, ne-eproforma, tip valid, fara referinte, fara urmasi, ne-eFactura), gasite prin
* interogare read-only pe MARIUSM_AUTO:
* 1113 - sursa COMANDA (tip=3, id_comanda=2479)
* 1055 - sursa CONTRACT (tip=2, id_ctr=234)
* 1048 - factura SIMPLA, lista de preturi (tip=1, fara comanda/ctr)
* 1130 - VALUTA (tip=5, in_valuta=1)
* Nu scrie in Oracle - doar SELECT; verifica ca formularul deschis nici el nu scrie
* (G8: dataoras/id_utils neschimbate pe VANZARI/VANZARI_DETALII).
*
* frm_facturare_articole2 (ofacturare.vc2:15894) nu suprascrie WindowType, iar _frm_base il
* seteaza pe 1 = modal - .Show() blocheaza pana la inchiderea ferestrei, headless nu are cine
* sa o inchida in mod normal. Solutie: driverS8p7 (Custom, BINDEVENT pe un Timer de pe _SCREEN,
* acelasi tipar ca driverMsgS8 din test_s8_cablare_incarcare.prg) - un modal inca pompeaza
* mesaje Windows, deci timerul tot mai ruleaza in interiorul lui .Show(); cand gaseste forma
* deschisa ii citeste prezenta/eticheta lui Ct_clb_altele (din colectia Objects, nu PEMSTATUS -
* RemoveObject scoate din Objects dar PEMSTATUS ramane .T., vezi memoria pemstatus-dupa-
* removeobject) si o elibereaza, ceea ce incheie .Show() si intoarce controlul in
* do_editare_unificata, apoi in acest test. Nu modifica NIMIC in codul de productie.
*
* Extindere S8 (blocarea grupurilor B si C la editare, docs\raport_s8_grup_bc.md): driverS8p7
* citeste in plus, din Objects, starea needitabila a controalelor clb_fdoc.cboFdoc, Ct_clb_altele,
* Ct_clb_nume_client, Ct_clb_valuta, Clb_zi_curs, ct_contabilitate.Ct_clb_gestiune_init,
* Ct_clb_politici_preturi, but_incarca_articole, but_cursuri, ct_incasare, chk_incasare - fiecare
* verificat doar daca e prezent (unele sunt scoase de Init in functie de tip/gnScadereStoc,
* independent de lEditare). Proba de neregresie pe document nou (VerificaDocumentNou) NU trece
* prin factureaza()/poGeneratorNumere (interzis, arde numere) - construieste poDate manual cu
* Createobject('oDateFactura',0,0) (Init nu ruleaza, ramane pe defaults, lEditare=.F. ca la orice
* document nou) si instantiaza formularul direct cu Newobject, FARA .Show() (Init ruleaza oricum
* la construire; fara Show() nu exista blocaj modal, deci nu e nevoie de driver aici).
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s8_x2_stare_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul -
*!* mock-ul se pune in fata listei existente, altfel amessagebox() real blocheaza headless
LOCAL lcProcExistent
lcProcExistent = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent
PUBLIC gnPass, gnFail, gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns
gcMockUltimMesaj = ''
gnMockUltimTip = 0
gnMockRaspuns = 6
gnPass = 0
gnFail = 0
*!* --- driver care inchide fereastra modala frm_facturare_articole2, vezi antetul fisierului ---
PUBLIC goDriverS8p7
goDriverS8p7 = Createobject('driverS8p7')
_SCREEN.AddObject('tmrS8p7', 'Timer')
_SCREEN.tmrS8p7.Interval = 150
Bindevent(_SCREEN.tmrS8p7, 'Timer', goDriverS8p7, 'Executa')
_SCREEN.tmrS8p7.Enabled = .T.
*!* --- verificare statica: corpul do_editare_unificata nu contine nicio referinta la alocarea
*!* de numere (factureaza/poGeneratorNumere/creeaza_cursor_serii) ---
LOCAL lcSrc, lcTail, lnStart, lnEnd, lcMetoda
lcSrc = FILETOSTR('D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vc2')
lnStart = AT('PROCEDURE do_editare_unificata' + CHR(13) + CHR(10), lcSrc)
DO asserteaza WITH 'static: metoda do_editare_unificata gasita in sursa', lnStart > 0, TRANSFORM(lnStart)
IF lnStart > 0
lcTail = SUBSTR(lcSrc, lnStart)
lnEnd = AT('ENDPROC', lcTail)
lcMetoda = UPPER(SUBSTR(lcTail, 1, lnEnd + 6))
DO asserteaza WITH 'static G2: fara FACTUREAZA( in do_editare_unificata', 'FACTUREAZA(' $ lcMetoda = .F., ''
DO asserteaza WITH 'static G2: fara POGENERATORNUMERE in do_editare_unificata', 'POGENERATORNUMERE' $ lcMetoda = .F., ''
DO asserteaza WITH 'static G2: fara CREEAZA_CURSOR_SERII in do_editare_unificata', 'CREEAZA_CURSOR_SERII' $ lcMetoda = .F., ''
ENDIF
*!* --- crsfacturi, exact ca in oproceduri_facturare.vizualizare_facturi, pe cele 4 documente ---
Private poFacturi
poFacturi = Null
IF Used('crsfacturi')
Use In crsfacturi
ENDIF
LOCAL lcSchema, lcSelect, lcOrder, lcFiltru
lcSchema = ['ales n(1),id_vanzare n(20),id_comanda n(20),dataora t,dataora_exp t,data_act d,data_scad d,sters n(1),dataoras t,numar_act n(14),serie_act c(10),'+] + ;
['tip n(5),id_part n(10),discount n(17,4),disc_fara_tva n(17,4),discount_evidentiat n(1),text_aditional M,facturat n(1),data_facturat t,'+] + ;
['explicatie c(240),altele c(200),client c(100),cod n(20),id_util I,utilizator c(30),utils c(30),utilfact c(30),delegat c(70),'+] + ;
['bidelegat c(30),cnpdelegat c(15),nume_agent c(70),nrinmat c(10),total_fara_tva n(20,4),total_tva n(20,4),total_cu_tva n(20,4),id_gestiune n(10),'+] + ;
['serie_chit c(20),nr_incasare n(10),incasat n(17,4),in_valuta n(1),sucursala c(100),id_ruta n(10),ruta c(100),curs n(20,4),multiplicator n(10),nume_val c(50),'+] + ;
['valuta c(50), id_valuta n(5), valval n(20,4), tvaval n(20,4), totval n(20,4),'+] + ;
['id_delegat n(10),id_agent n(10),id_masina n(10),valoarea N(20,4),nume_gestiune C(50),id_sectie n(5),sectie c(50),id_lucrare n(20), lucrare c(200),'+] + ;
['tip_incasare n(10),afisare_scadenta n(1),id_ordl n(10),tva_incasare n(1),listare_detaliata n(1),'+] + ;
['id_facturare n(10),adresa_facturare c(250),email_facturare c(100),adresa_client c(250),email_client c(100),adresa_beneficiar c(250),email_beneficiar c(100),'+] + ;
['id_beneficiar n(20),beneficiar C(100),tip_factura N(5),ctip_factura C(100), id_ctr N(10), contract C(100),eproforma N(1),tip_saft N(3) null,tip_saftname V(250) null,'+]+;
['id_livrare N(10),adresa_livrare V(250), denumire_adresa_livrare V(100), email_livrare V(100),institutie_publica N(1) null,efactura N(1) null,cod_fiscal C(20),id_fact N(20)']
lcSelect = ['select 0 as ales,id_vanzare,id_comanda,dataora,dataora_exp,data_act,data_scad,sters,dataoras,numar_act,serie_act,'+] + ;
['tip,id_part,discount,disc_fara_tva,discount_evidentiat,text_aditional,facturat,data_facturat,'+] + ;
['explicatie,altele,client,cod,id_util,utilizator,utils,utilfact,delegat,bidelegat,cnpdelegat,'+] + ;
['nume_agent,nrinmat,total_fara_tva,total_tva,total_cu_tva,id_gestiune,serie_chit,nr_incasare,incasat,'+] + ;
['in_valuta,sucursala,id_ruta,ruta,curs,multiplicator,nume_val,'+] + ;
['valuta,id_valuta,valval,tvaval,totval,'+] + ;
['id_delegat,id_agent,id_masina,valoarea,'+] + ;
['nume_gestiune,id_sectie,sectie,id_lucrare,lucrare,tip_incasare,afisare_scadenta,id_ordl,tva_incasare,listare_detaliata,'+] + ;
['id_facturare,adresa_facturare,email_facturare,adresa_client,email_client,adresa_beneficiar,email_beneficiar,'+] + ;
['id_beneficiar, beneficiar, tip_factura, ctip_factura, id_ctr, contract, eproforma,tip_saft,tip_saftname, '+]+;
['id_livrare,adresa_livrare,denumire_adresa_livrare,email_livrare,institutie_publica,efactura,cod_fiscal,id_fact from fact_vfacturi where ']
lcOrder = [data_act,numar_act]
lcFiltru = [id_vanzare in (1113, 1055, 1048, 1130)]
gencursor('poFacturi', 'crsfacturi', lcSelect, lcFiltru, lcSchema, lcOrder, .F., [], .F., [])
poFacturi.ca_baza1.afisare()
DO asserteaza WITH 'crsfacturi incarcat cu cele 4 documente reale (rownum=4)', Used('crsfacturi') AND Reccount('crsfacturi') = 4, IIF(Used('crsfacturi'), TRANSFORM(Reccount('crsfacturi')), 'crsfacturi lipsa')
*!* Ct_clb_altele (infirmare §3.2, vezi raport): document CU sursa -> prezent, etichetat din
*!* poDate.tip; factura SIMPLA -> absent, identic cu introducerea unei facturi noi (G10).
DO LogStare WITH 'INAINTE 1113'
DO VerificaEditare WITH 1113, 'sursa comanda', .T., 'Nr. comanda'
DO LogStare WITH 'DUPA 1113'
DO LogStare WITH 'INAINTE 1055'
DO VerificaEditare WITH 1055, 'sursa contract', .T., 'Nr. contract'
DO LogStare WITH 'DUPA 1055'
DO LogStare WITH 'INAINTE 1048'
DO VerificaEditare WITH 1048, 'factura simpla', .F., ''
DO LogStare WITH 'DUPA 1048'
DO LogStare WITH 'INAINTE 1130'
DO VerificaEditare WITH 1130, 'valuta', .F., ''
DO LogStare WITH 'DUPA 1130'
*!* --- S8 incasarea la editare (D1/D3/D4, docs\propunere_s8_incasare_la_editare.md) - foloseste
*!* Show() real, deci trebuie sa ruleze inainte de teardown-ul lui tmrS8p7 de mai jos.
*!* 1071: tip_incasare=11 (chitanta) -> mod 2. 1072: tip_incasare=2 (bon fiscal) -> mod 3,
*!* cazul in care hardcodarea veche "mod 2" ar fi aratat gresit.
DO VerificaIncasareLaEditare WITH 1071, 'chitanta, tip_incasare=11', 119, 44, 11, 2
DO VerificaIncasareLaEditare WITH 1072, 'bon fiscal, tip_incasare=2', 119, 66, 2, 3
_SCREEN.tmrS8p7.Enabled = .F.
Try
_SCREEN.RemoveObject('tmrS8p7')
Catch
Endtry
*!* --- S8 grupurile B/C: neregresie pe document NOU (docs\raport_s8_grup_bc.md) ---
DO VerificaDocumentNou
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE LogStare
LPARAMETERS tcEticheta
LOCAL lnI, lcAliasuri, laAliasuri[1], lnCnt, lcForme, lnJ
lcAliasuri = ''
lnCnt = AUSED(laAliasuri)
FOR lnI = 1 TO m.lnCnt
lcAliasuri = lcAliasuri + laAliasuri[m.lnI, 1] + ','
ENDFOR
lcForme = ''
FOR lnJ = 1 TO _SCREEN.FormCount
lcForme = lcForme + Upper(_SCREEN.Forms(m.lnJ).Class) + ','
ENDFOR
STRTOFILE('STARE [' + m.tcEticheta + '] select=' + Alias() + ' aused(' + Transform(m.lnCnt) + ')=' + m.lcAliasuri + ' forme(' + Transform(_SCREEN.FormCount) + ')=' + m.lcForme + ' driver.lBusy=' + Transform(goDriverS8p7.lBusy) + ' driver.lGasit=' + Transform(goDriverS8p7.lGasit) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
PROCEDURE VerificaEditare
LPARAMETERS tnIdVanzare, tcEticheta, tlCtClbAsteptat, tcCtClbEtichetaAsteptata
LOCAL lcPrefix, lnSucces, loFrm, lnI, llGasitForm
LOCAL lcSnapPlajeA, lcSnapPlajeB, lcSnapDetA, lcSnapDetB
LOCAL ltDataorasVanzareA, lnIdUtilsVanzareA
lcPrefix = TRANSFORM(m.tnIdVanzare) + ' [' + m.tcEticheta + ']'
gcMockUltimMesaj = ''
*!* --- G2: snapshot generator de numere, INAINTE ---
IF Used('v_plaje_a')
Use In v_plaje_a
ENDIF
lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_a')
goExecutor.oReset()
lcSnapPlajeA = CursorToSnapshot('v_plaje_a')
Use In v_plaje_a
*!* --- G8: snapshot dataoras/id_utils, INAINTE ---
IF Used('v_g8a')
Use In v_g8a
ENDIF
lnSucces = goExecutor.oExecute([select dataoras, id_utils from vanzari where id_vanzare = ] + Transform(m.tnIdVanzare), 'v_g8a')
goExecutor.oReset()
DO asserteaza WITH lcPrefix + ': martor G8 antet Oracle a reusit', lnSucces >= 0 AND Used('v_g8a') AND Reccount('v_g8a') = 1, Transform(lnSucces)
ltDataorasVanzareA = v_g8a.dataoras
lnIdUtilsVanzareA = Nvl(v_g8a.id_utils, 0)
Use In v_g8a
IF Used('v_g8d_a')
Use In v_g8d_a
ENDIF
lnSucces = goExecutor.oExecute([select id_vanzare_det, dataoras, id_utils from vanzari_detalii where id_vanzare = ] + Transform(m.tnIdVanzare) + [ order by id_vanzare_det], 'v_g8d_a')
goExecutor.oReset()
lcSnapDetA = CursorToSnapshot('v_g8d_a')
Use In v_g8d_a
*!* --- codul testat: traseul real, prin frm_facturi.do_editare_unificata ---
*!* Init-ul clasei presupune crsfacturi ca zona curenta (la fel ca in test_s7_urmasi.prg) -
*!* interogarile martor de mai sus au schimbat zona curenta intre timp, se restaureaza aici
Select crsfacturi
loFrm = Newobject('frm_facturi', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vcx')
DO asserteaza WITH lcPrefix + ': Newobject(frm_facturi) reuseste', Vartype(m.loFrm) == 'O', Vartype(m.loFrm)
IF Vartype(m.loFrm) <> 'O'
RETURN
ENDIF
Select crsfacturi
Locate For id_vanzare = m.tnIdVanzare
DO asserteaza WITH lcPrefix + ': documentul e in crsfacturi', Found(), Transform(Found())
IF !Found()
loFrm.Release()
RETURN
ENDIF
*!* --- driverS8p7 gaseste si inchide formularul unificat (FARA but_termin1.Click()), vezi
*!* antetul fisierului; .do_editare_unificata() nu revine decat dupa ce fereastra s-a inchis ---
goDriverS8p7.Reseteaza()
loFrm.do_editare_unificata()
DO asserteaza WITH lcPrefix + ': formularul unificat s-a deschis (traseul direct, fara factureaza())', goDriverS8p7.lGasit, Transform(goDriverS8p7.lGasit)
*!* --- Ct_clb_altele: prezenta citita din colectia Objects a formularului, cat timp era deschis
*!* (infirmarea §3.2 - vezi raport) ---
DO asserteaza WITH lcPrefix + ': Ct_clb_altele prezenta = ' + Iif(m.tlCtClbAsteptat, 'prezent', 'absent'), ;
goDriverS8p7.lCtClbPrezent == m.tlCtClbAsteptat, Transform(goDriverS8p7.lCtClbPrezent)
IF m.tlCtClbAsteptat
DO asserteaza WITH lcPrefix + ': Ct_clb_altele eticheta = [' + m.tcCtClbEtichetaAsteptata + ']', ;
Upper(goDriverS8p7.cCtClbEticheta) == Upper(m.tcCtClbEtichetaAsteptata), goDriverS8p7.cCtClbEticheta
ENDIF
*!* --- grupul B si C (S8, decizia 25): needitabile la editare, verificate doar cand controlul
*!* mai exista (unele sunt scoase de Init dupa tip/gnScadereStoc, independent de lEditare) ---
DO VerificaBlocajGrupBC WITH m.lcPrefix
*!* --- G5: totalul afisat de do_calculeaza_totaluri (chemat inainte de Show, in do_editare_unificata)
*!* ramane egal cu totalul deja scris in VANZARI - prinde o reevaluare tacita a cursului/preturilor ---
Select crsfacturi
IF Nvl(crsfacturi.in_valuta, 0) = 1
DO asserteaza WITH lcPrefix + ' G5: total afisat (valuta) = VANZARI.totval', ;
Round(goDriverS8p7.nTotalVal, 2) == Round(Nvl(crsfacturi.totval, 0), 2), Transform(goDriverS8p7.nTotalVal) + ' vs ' + Transform(crsfacturi.totval)
ELSE
DO asserteaza WITH lcPrefix + ' G5: total afisat (lei) = VANZARI.total_cu_tva', ;
Round(goDriverS8p7.nTotalRon, 2) == Round(Nvl(crsfacturi.total_cu_tva, 0), 2), Transform(goDriverS8p7.nTotalRon) + ' vs ' + Transform(crsfacturi.total_cu_tva)
ENDIF
loFrm.Release()
*!* --- G9: niciun dialog modal la deschidere ---
DO asserteaza WITH lcPrefix + ' G9: niciun amessagebox la deschidere', Empty(gcMockUltimMesaj), gcMockUltimMesaj
*!* --- G2: snapshot generator de numere, DUPA - identic caracter cu caracter ---
IF Used('v_plaje_b')
Use In v_plaje_b
ENDIF
lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_b')
goExecutor.oReset()
lcSnapPlajeB = CursorToSnapshot('v_plaje_b')
Use In v_plaje_b
DO asserteaza WITH lcPrefix + ' G2: vplaje_numere identic inainte/dupa (niciun numar alocat)', m.lcSnapPlajeA == m.lcSnapPlajeB, ''
*!* --- G8: dataoras/id_utils neschimbate pe VANZARI si VANZARI_DETALII ---
IF Used('v_g8a2')
Use In v_g8a2
ENDIF
lnSucces = goExecutor.oExecute([select dataoras, id_utils from vanzari where id_vanzare = ] + Transform(m.tnIdVanzare), 'v_g8a2')
goExecutor.oReset()
*!* Nvl pe TTOC: dataoras e NULL pe documentele de test - NULL == NULL da .NULL. in VFP (nu .T.),
*!* fals negativ fara el
DO asserteaza WITH lcPrefix + ' G8: VANZARI.dataoras neschimbat', ;
Nvl(Ttoc(v_g8a2.dataoras), 'NULL') == Nvl(Ttoc(m.ltDataorasVanzareA), 'NULL'), Nvl(Ttoc(v_g8a2.dataoras), 'NULL')
DO asserteaza WITH lcPrefix + ' G8: VANZARI.id_utils neschimbat', Nvl(v_g8a2.id_utils, 0) == m.lnIdUtilsVanzareA, Transform(Nvl(v_g8a2.id_utils, 0))
Use In v_g8a2
IF Used('v_g8d_b')
Use In v_g8d_b
ENDIF
lnSucces = goExecutor.oExecute([select id_vanzare_det, dataoras, id_utils from vanzari_detalii where id_vanzare = ] + Transform(m.tnIdVanzare) + [ order by id_vanzare_det], 'v_g8d_b')
goExecutor.oReset()
lcSnapDetB = CursorToSnapshot('v_g8d_b')
Use In v_g8d_b
DO asserteaza WITH lcPrefix + ' G8: VANZARI_DETALII dataoras/id_utils identice (nicio scriere)', m.lcSnapDetA == m.lcSnapDetB, ''
*!* --- G11 partial: fara nicio scriere pe VANZARI_DETALII (G8), nu s-a putut genera nicio miscare
*!* de stoc noua pe acest document; nu masoara direct un tabel de stoc - proba indirecta, partiala ---
DO asserteaza WITH lcPrefix + ' G11 partial (derivat din G8): nicio scriere pe VANZARI_DETALII => stoc agregat neschimbat pe acest document', m.lcSnapDetA == m.lcSnapDetB, ''
ENDPROC
*!* S8 - blocarea grupurilor B si C la editare (docs\raport_s8_grup_bc.md). Citeste starea deja
*!* capturata de goDriverS8p7 (formularul e inchis pana aici) si asearta doar cand controlul e
*!* prezent - unele sunt scoase de Init dupa tip/gnScadereStoc, independent de lEditare.
PROCEDURE VerificaBlocajGrupBC
LPARAMETERS tcPrefix
IF goDriverS8p7.lCtClbPrezent
DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_altele (sursa) needitabil', !goDriverS8p7.lCtClbAlteleActiv, Transform(goDriverS8p7.lCtClbAlteleActiv)
ENDIF
DO asserteaza WITH tcPrefix + ' grupB: clb_fdoc.cboFdoc (tip document) needitabil', ;
goDriverS8p7.lClbFdocPrezent AND !goDriverS8p7.lClbFdocActiv, Transform(goDriverS8p7.lClbFdocActiv)
DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_nume_client (client) needitabil', ;
goDriverS8p7.lCtClbNumeClientPrezent AND !goDriverS8p7.lCtClbNumeClientActiv, Transform(goDriverS8p7.lCtClbNumeClientActiv)
IF goDriverS8p7.lCtClbValutaPrezent
DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_valuta needitabil', !goDriverS8p7.lCtClbValutaActiv, Transform(goDriverS8p7.lCtClbValutaActiv)
ENDIF
IF goDriverS8p7.lClbZiCursPrezent
DO asserteaza WITH tcPrefix + ' grupB: Clb_zi_curs needitabil', !goDriverS8p7.lClbZiCursActiv, Transform(goDriverS8p7.lClbZiCursActiv)
ENDIF
IF goDriverS8p7.lCtClbGestiuneInitPrezent
DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_gestiune_init (gestiune sursa) needitabil', !goDriverS8p7.lCtClbGestiuneInitActiv, Transform(goDriverS8p7.lCtClbGestiuneInitActiv)
ENDIF
IF goDriverS8p7.lCtClbPolPreturiPrezent
DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_politici_preturi needitabil', !goDriverS8p7.lCtClbPolPreturiActiv, Transform(goDriverS8p7.lCtClbPolPreturiActiv)
ENDIF
DO asserteaza WITH tcPrefix + ' grupB: but_incarca_articole needitabil (G2: evita poGeneratorNumere.verifica_numar)', ;
goDriverS8p7.lButIncarcaArticolePrezent AND !goDriverS8p7.lButIncarcaArticoleActiv, Transform(goDriverS8p7.lButIncarcaArticoleActiv)
DO asserteaza WITH tcPrefix + ' grupB: but_cursuri needitabil', ;
goDriverS8p7.lButCursuriPrezent AND !goDriverS8p7.lButCursuriActiv, Transform(goDriverS8p7.lButCursuriActiv)
IF goDriverS8p7.lCtIncasarePrezent
DO asserteaza WITH tcPrefix + ' grupC: ct_incasare needitabil', !goDriverS8p7.lCtIncasareActiv, Transform(goDriverS8p7.lCtIncasareActiv)
DO asserteaza WITH tcPrefix + ' grupC: chk_incasare needitabil', goDriverS8p7.lChkIncasarePrezent AND !goDriverS8p7.lChkIncasareActiv, Transform(goDriverS8p7.lChkIncasareActiv)
ENDIF
ENDPROC
*!* S8 - neregresie: pe document NOU, grupurile B/C raman editabile (docs\raport_s8_grup_bc.md).
*!* NU trece prin factureaza()/poGeneratorNumere (interzis - arde numere din plaje reale). poDate
*!* construit manual cu Createobject('oDateFactura',0,0): Init-ul clasei NU ruleaza (tnIdSet=0),
*!* deci ramane pe defaults din PropValue - inclusiv lEditare=.F., exact ca la orice document nou
*!* (vezi si test_s8_pas3_garda_alte_date.prg, acelasi tipar). tip=3 (comanda) e ales ca sa
*!* pastreze Ct_clb_altele si Ct_clb_nume_client prezente (paralel cu documentul 1113 de mai sus);
*!* nu are cursul din zi (citeste_cursuri_zi nu se cheama pentru tip=3), deci fara SELECT Oracle.
*!* Instantiat direct cu Newobject, FARA .Show() - Init ruleaza oricum la construire, iar fara
*!* Show() nu exista blocajul modal (WindowType=1 conteaza doar cand se cheama .Show()), deci nu e
*!* nevoie de driverS8p7 aici.
PROCEDURE VerificaDocumentNou
PRIVATE poDate
LOCAL loForm
poDate = Createobject('oDateFactura', 0, 0)
poDate.tip = 3
poDate.id_client = 0
poDate.incasat = 0
loForm = Newobject('frm_facturare_articole2', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vcx')
DO asserteaza WITH 'document nou: Newobject(frm_facturare_articole2) reuseste (fara Show, fara factureaza)', Vartype(m.loForm) == 'O', Vartype(m.loForm)
IF Vartype(m.loForm) <> 'O'
RETURN
ENDIF
DO asserteaza WITH 'document nou: poDate.lEditare = .F. (stare naturala, nesetata de nimeni)', !poDate.lEditare, Transform(poDate.lEditare)
IF loForm.do_exista_obiect('Ct_clb_altele')
DO asserteaza WITH 'document nou grupB: Ct_clb_altele ramane editabil', loForm.Ct_clb_altele.lactiv, Transform(loForm.Ct_clb_altele.lactiv)
ENDIF
DO asserteaza WITH 'document nou grupB: clb_fdoc.cboFdoc ramane editabil', loForm.clb_fdoc.cboFdoc.Enabled, Transform(loForm.clb_fdoc.cboFdoc.Enabled)
DO asserteaza WITH 'document nou grupB: Ct_clb_nume_client ramane editabil', loForm.Ct_clb_nume_client.lactiv, Transform(loForm.Ct_clb_nume_client.lactiv)
IF loForm.do_exista_obiect('Ct_clb_valuta')
DO asserteaza WITH 'document nou grupB: Ct_clb_valuta ramane editabil', loForm.Ct_clb_valuta.lactiv, Transform(loForm.Ct_clb_valuta.lactiv)
ENDIF
IF loForm.do_exista_obiect('Clb_zi_curs')
DO asserteaza WITH 'document nou grupB: Clb_zi_curs ramane editabil', !loForm.Clb_zi_curs.text_simplu1.ReadOnly, Transform(loForm.Clb_zi_curs.text_simplu1.ReadOnly)
ENDIF
IF loForm.do_exista_obiect('Ct_clb_gestiune_init', loForm.ct_contabilitate)
DO asserteaza WITH 'document nou grupB: Ct_clb_gestiune_init ramane editabil', loForm.ct_contabilitate.Ct_clb_gestiune_init.lactiv, Transform(loForm.ct_contabilitate.Ct_clb_gestiune_init.lactiv)
ENDIF
IF loForm.do_exista_obiect('Ct_clb_politici_preturi')
DO asserteaza WITH 'document nou grupB: Ct_clb_politici_preturi ramane editabil', loForm.Ct_clb_politici_preturi.lactiv, Transform(loForm.Ct_clb_politici_preturi.lactiv)
ENDIF
DO asserteaza WITH 'document nou grupB: but_incarca_articole ramane editabil', loForm.but_incarca_articole.Enabled, Transform(loForm.but_incarca_articole.Enabled)
DO asserteaza WITH 'document nou grupB: but_cursuri ramane editabil', loForm.but_cursuri.Enabled, Transform(loForm.but_cursuri.Enabled)
IF loForm.do_exista_obiect('ct_incasare')
DO asserteaza WITH 'document nou grupC: ct_incasare ramane editabil', loForm.ct_incasare.Enabled, Transform(loForm.ct_incasare.Enabled)
DO asserteaza WITH 'document nou grupC: chk_incasare ramane editabil', loForm.chk_incasare.Enabled, Transform(loForm.chk_incasare.Enabled)
ENDIF
loForm.Release()
ENDPROC
*!* S8 - incasarea la editare (D1/D3/D4, docs\propunere_s8_incasare_la_editare.md). Replica
*!* dovedita a corpului do_editare_unificata (ofacturare_comun.vc2:3890+) pana la Createobject,
*!* promovata din investigatia I1 (probe_defect5_latent.prg) in setul permanent de probe - acolo
*!* s-a confirmat ca poDate, declarat PRIVATE aici, ramane vizibil dupa Createobject/Show()
*!* (aceeasi vizibilitate dinamica pe care se bazeaza si codul de productie pentru poDate/
*!* poGeneratorNumere). driverS8p7 e refolosit doar ca sa inchida modalul Show().
PROCEDURE VerificaIncasareLaEditare
LPARAMETERS tnIdVanzare, tcEticheta, tnIncasatAsteptat, tnNrIncasareAsteptat, tnTipIncasareAsteptat, tnModAsteptat
LOCAL lcPrefix, lnSucces, loForm, pnDiscountRon, pnDiscountValuta
LOCAL lnSters, llEProforma, lnTipDoc, lcSnapPlajeA, lcSnapPlajeB
PRIVATE pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzareP, poDate
Store 0 To pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzareP
lcPrefix = Transform(m.tnIdVanzare) + ' [incasare ' + m.tcEticheta + ']'
gcMockUltimMesaj = ''
IF Used('v_plaje_inc_a')
Use In v_plaje_inc_a
ENDIF
lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_inc_a')
goExecutor.oReset()
lcSnapPlajeA = CursorToSnapshot('v_plaje_inc_a')
Use In v_plaje_inc_a
lnSucces = goExecutor.oExecute('select id_vanzare,cod,data_act,sters,id_fact,eproforma,tip,incasat from fact_vfacturi where id_vanzare=' + Transform(m.tnIdVanzare), 'crsIncUnic')
goExecutor.oReset()
DO asserteaza WITH lcPrefix + ': documentul a putut fi reincarcat', lnSucces >= 0 AND Used('crsIncUnic') AND Reccount('crsIncUnic') = 1, Transform(lnSucces)
IF !(lnSucces >= 0 AND Used('crsIncUnic') AND Reccount('crsIncUnic') = 1)
RETURN
ENDIF
SELECT crsIncUnic
lnIdVanzareP = id_vanzare
lnCod = cod
pnAn = Year(data_act)
pnLuna = Month(data_act)
lnSters = sters
lnIdFact = id_fact
llEProforma = (eproforma = 1)
lnTipDoc = tip
Use In crsIncUnic
DO asserteaza WITH lcPrefix + ': garzile do_editare_unificata trecute (nesters/neproforma/tip valid/luna curenta)', ;
lnSters = 0 AND !llEProforma AND !Inlist(lnTipDoc,44,45,46,51) AND (pnAn*12+pnLuna) == (gnAn*12+gnLuna), ''
DO asserteaza WITH lcPrefix + ': fara referinte (incasari/plati)', !ReferinteDocumenteNota(pnAn, pnLuna, lnCod), ''
DO asserteaza WITH lcPrefix + ': nu e in eFactura', !EsteInEFactura(lnIdFact), ''
DO asserteaza WITH lcPrefix + ': fara urmasi', !DocumentAreUrmasi(lnIdVanzareP), ''
poDate = IncarcaAntetFacturaEditare(lnIdVanzareP, @pnDiscountRon, @pnDiscountValuta)
DO asserteaza WITH lcPrefix + ': IncarcaAntetFacturaEditare reuseste', Vartype(m.poDate) == 'O', Vartype(m.poDate)
IF Vartype(m.poDate) <> 'O'
RETURN
ENDIF
IncarcaLiniiFacturaEditare(poDate, lnIdVanzareP)
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
IF Used('jtva_coloane')
Use In jtva_coloane
ENDIF
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
loForm = Createobject('frm_facturare_articole2')
DO asserteaza WITH lcPrefix + ': formularul se deschide fara eroare (defectul 5 latent nu se activeaza)', Vartype(m.loForm) == 'O', Vartype(m.loForm)
IF Vartype(m.loForm) <> 'O'
RETURN
ENDIF
DO asserteaza WITH lcPrefix + ': G9 niciun amessagebox la Createobject/Init', Empty(gcMockUltimMesaj), gcMockUltimMesaj
*!* --- asertiunile care prind regresia D1/D3/D4 ---
DO asserteaza WITH lcPrefix + ': poDate.incasat = valoarea din baza (NU suprascrisa cu totalctva)', ;
Round(Nvl(poDate.incasat,-1),2) == Round(m.tnIncasatAsteptat,2), Transform(Nvl(poDate.incasat,-1))
DO asserteaza WITH lcPrefix + ': poDate.nr_incasare nu a fost zeroit', ;
Nvl(poDate.nr_incasare,-1) == m.tnNrIncasareAsteptat, Transform(Nvl(poDate.nr_incasare,-1))
DO asserteaza WITH lcPrefix + ': poDate.ntip_incasare incarcat corect', ;
Nvl(poDate.ntip_incasare,-1) == m.tnTipIncasareAsteptat, Transform(Nvl(poDate.ntip_incasare,-1))
DO asserteaza WITH lcPrefix + ': modul afisat (opt_incasat.Value) corespunde tip_incasare', ;
loForm.ct_incasare.opt_incasat.Value == m.tnModAsteptat - 1, Transform(loForm.ct_incasare.opt_incasat.Value)
DO asserteaza WITH lcPrefix + ': chk_incasare.Value = 1 (document incasat)', loForm.chk_incasare.Value == 1, Transform(loForm.chk_incasare.Value)
DO asserteaza WITH lcPrefix + ': grupC ct_incasare needitabil', !loForm.ct_incasare.Enabled, Transform(loForm.ct_incasare.Enabled)
DO asserteaza WITH lcPrefix + ': grupC chk_incasare needitabil', !loForm.chk_incasare.Enabled, Transform(loForm.chk_incasare.Enabled)
loForm.ndiscfactron = pnDiscountRon
loForm.ndiscfactval = pnDiscountValuta
loForm.do_calculeaza_totaluri()
*!* nemodal: eliberarea din Timer, in interiorul propriului Show() modal, blocheaza VFP in Release()
loForm.WindowType = 0
goDriverS8p7.Reseteaza()
loForm.Show()
DO asserteaza WITH lcPrefix + ': niciun amessagebox pe parcursul Show()', Empty(gcMockUltimMesaj), gcMockUltimMesaj
Try
loForm.Release()
Catch
Endtry
IF Used('v_plaje_inc_b')
Use In v_plaje_inc_b
ENDIF
lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_inc_b')
goExecutor.oReset()
lcSnapPlajeB = CursorToSnapshot('v_plaje_inc_b')
Use In v_plaje_inc_b
DO asserteaza WITH lcPrefix + ' G2: vplaje_numere identic inainte/dupa (niciun numar alocat)', m.lcSnapPlajeA == m.lcSnapPlajeB, ''
ENDPROC
PROCEDURE CursorToSnapshot
LPARAMETERS tcAlias
LOCAL lcResult, lnI
lcResult = ''
SELECT (m.tcAlias)
SCAN
FOR lnI = 1 TO FCOUNT()
lcResult = lcResult + Transform(Evaluate(Field(m.lnI))) + '|'
ENDFOR
lcResult = lcResult + Chr(10)
ENDSCAN
RETURN m.lcResult
ENDPROC
PROCEDURE asserteaza
LPARAMETERS tcNume, tlConditie, tcValoare
IF m.tlConditie
gnPass = gnPass + 1
STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1)
ELSE
gnFail = gnFail + 1
STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + Transform(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
*!* driverS8p7: gaseste FRM_FACTURARE_ARTICOLE2 in _SCREEN.Forms in timp ce .Show() e blocat pe
*!* modal (un modal tot pompeaza mesaje Windows, deci timerul de pe _SCREEN tot ruleaza - acelasi
*!* tipar ca driverMsgS8 din test_s8_cablare_incarcare.prg, folosit acolo pentru MESSAGEBOX_FORM).
*!* Citeste Ct_clb_altele din Objects (nu PEMSTATUS - RemoveObject scoate din Objects, PEMSTATUS
*!* ramane .T.) inainte sa elibereze forma, ceea ce incheie .Show() si reda controlul apelantului.
DEFINE CLASS driverS8p7 AS Custom
lBusy = .F.
lGasit = .F.
lCtClbPrezent = .F.
lCtClbAlteleActiv = .F.
cCtClbEticheta = ''
nTotalRon = 0
nTotalVal = 0
*!* grupul B si C (S8, docs\raport_s8_grup_bc.md) - Prezent = mai exista in Objects (nu a fost
*!* scos de Init dupa tip/gnScadereStoc), Activ = NU e blocat (Enabled / lactiv / !ReadOnly, dupa
*!* mecanismul folosit de fiecare control)
lClbFdocPrezent = .F.
lClbFdocActiv = .F.
lCtClbNumeClientPrezent = .F.
lCtClbNumeClientActiv = .F.
lCtClbValutaPrezent = .F.
lCtClbValutaActiv = .F.
lClbZiCursPrezent = .F.
lClbZiCursActiv = .F.
lCtClbGestiuneInitPrezent = .F.
lCtClbGestiuneInitActiv = .F.
lCtClbPolPreturiPrezent = .F.
lCtClbPolPreturiActiv = .F.
lButIncarcaArticolePrezent = .F.
lButIncarcaArticoleActiv = .F.
lButCursuriPrezent = .F.
lButCursuriActiv = .F.
lCtIncasarePrezent = .F.
lCtIncasareActiv = .F.
lChkIncasarePrezent = .F.
lChkIncasareActiv = .F.
PROCEDURE Reseteaza
This.lGasit = .F.
This.lCtClbPrezent = .F.
This.lCtClbAlteleActiv = .F.
This.cCtClbEticheta = ''
This.nTotalRon = 0
This.nTotalVal = 0
This.lClbFdocPrezent = .F.
This.lClbFdocActiv = .F.
This.lCtClbNumeClientPrezent = .F.
This.lCtClbNumeClientActiv = .F.
This.lCtClbValutaPrezent = .F.
This.lCtClbValutaActiv = .F.
This.lClbZiCursPrezent = .F.
This.lClbZiCursActiv = .F.
This.lCtClbGestiuneInitPrezent = .F.
This.lCtClbGestiuneInitActiv = .F.
This.lCtClbPolPreturiPrezent = .F.
This.lCtClbPolPreturiActiv = .F.
This.lButIncarcaArticolePrezent = .F.
This.lButIncarcaArticoleActiv = .F.
This.lButCursuriPrezent = .F.
This.lButCursuriActiv = .F.
This.lCtIncasarePrezent = .F.
This.lCtIncasareActiv = .F.
This.lChkIncasarePrezent = .F.
This.lChkIncasareActiv = .F.
ENDPROC
PROCEDURE Executa
IF This.lBusy OR This.lGasit
RETURN
ENDIF
This.lBusy = .T.
TRY
LOCAL lnI, lnJ, lnJ2, loFrm2, loObj, loObj2
FOR lnI = 1 TO _SCREEN.FormCount
IF Upper(_SCREEN.Forms(m.lnI).Class) == 'FRM_FACTURARE_ARTICOLE2'
loFrm2 = _SCREEN.Forms(m.lnI)
This.lGasit = .T.
This.nTotalRon = Nvl(loFrm2.ntotalron, 0)
This.nTotalVal = Nvl(loFrm2.ntotalval, 0)
FOR lnJ = 1 TO loFrm2.Objects.Count
loObj = loFrm2.Objects(m.lnJ)
DO CASE
CASE Upper(loObj.Name) == 'CT_CLB_ALTELE'
This.lCtClbPrezent = .T.
This.lCtClbAlteleActiv = loObj.lactiv
This.cCtClbEticheta = Alltrim(loObj.clb_tx_cautare.lb_SIMPLU1.Caption)
CASE Upper(loObj.Name) == 'CLB_FDOC'
This.lClbFdocPrezent = .T.
This.lClbFdocActiv = loObj.cboFdoc.Enabled
CASE Upper(loObj.Name) == 'CT_CLB_NUME_CLIENT'
This.lCtClbNumeClientPrezent = .T.
This.lCtClbNumeClientActiv = loObj.lactiv
CASE Upper(loObj.Name) == 'CT_CLB_VALUTA'
This.lCtClbValutaPrezent = .T.
This.lCtClbValutaActiv = loObj.lactiv
CASE Upper(loObj.Name) == 'CLB_ZI_CURS'
This.lClbZiCursPrezent = .T.
This.lClbZiCursActiv = !loObj.text_simplu1.ReadOnly
CASE Upper(loObj.Name) == 'CT_CLB_POLITICI_PRETURI'
This.lCtClbPolPreturiPrezent = .T.
This.lCtClbPolPreturiActiv = loObj.lactiv
CASE Upper(loObj.Name) == 'BUT_INCARCA_ARTICOLE'
This.lButIncarcaArticolePrezent = .T.
This.lButIncarcaArticoleActiv = loObj.Enabled
CASE Upper(loObj.Name) == 'BUT_CURSURI'
This.lButCursuriPrezent = .T.
This.lButCursuriActiv = loObj.Enabled
CASE Upper(loObj.Name) == 'CT_INCASARE'
This.lCtIncasarePrezent = .T.
This.lCtIncasareActiv = loObj.Enabled
CASE Upper(loObj.Name) == 'CHK_INCASARE'
This.lChkIncasarePrezent = .T.
This.lChkIncasareActiv = loObj.Enabled
CASE Upper(loObj.Name) == 'CT_CONTABILITATE'
FOR lnJ2 = 1 TO loObj.Objects.Count
loObj2 = loObj.Objects(m.lnJ2)
IF Upper(loObj2.Name) == 'CT_CLB_GESTIUNE_INIT'
This.lCtClbGestiuneInitPrezent = .T.
This.lCtClbGestiuneInitActiv = loObj2.lactiv
ENDIF
ENDFOR
ENDCASE
ENDFOR
loFrm2.Release()
EXIT
ENDIF
ENDFOR
CATCH TO loExcS8p7
STRTOFILE('DRIVER EROARE ' + TRANSFORM(loExcS8p7.ErrorNo) + ' ' + loExcS8p7.Message + CHR(13) + CHR(10), gcErrLog, 1)
FINALLY
This.lBusy = .F.
ENDTRY
ENDPROC
ENDDEFINE