* 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_x1_1048_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). *!* X1 skip: DO VerificaEditare WITH 1113, 'sursa comanda', .T., 'Nr. comanda' *!* X1 skip: DO VerificaEditare WITH 1055, 'sursa contract', .T., 'Nr. contract' DO VerificaEditare WITH 1048, 'factura simpla', .F., '' *!* X1 skip: DO VerificaEditare WITH 1130, 'valuta', .F., '' *!* --- 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 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