* test_s8_editare_incarcare.prg * Suita COMPLETA a pasului 8 (docs\propunere_s8_incarcare.md §5.1): G1-G11 intr-o singura rulare, * traseul REAL Newobject('frm_facturi') + .do_editare_unificata() (nu Createobject direct pe * frm_facturare_articole2 - proba doar codul, nu rutarea, cf. handoff §4.0a). * * NU inlocuieste test_s8_pas7_cablare.prg (ramane pe loc, neatins) - o completeaza cu: * - un al treilea tip de sursa (1047, DEVIZE AUTO, fara delegat) * - un document AVIZ pozitiv (1110, tip=22) si unul NEGATIV/istoric (953, tip=23, respins de garda * "luna curenta") - Ct_clb_politici_preturi ramane totusi neexercitat, vezi raportul (motivat mai jos) * - G3/G4/G4b (linii) verificate si pe traseul COMPLET, nu doar pe IncarcaLiniiFacturaEditare izolat * - R1: curatenie de aliasuri + jurnal AUSED() intre cazuri (lectia din triaj_s8_regresie_28fail.md) * - R2: diagnostic care distinge, cand formularul NU se deschide, intre iesire CU mesaj de garda, * iesire silentioasa CONFIRMATA prin IncarcaAntetFacturaEditare (ofacturare_editare.prg:83-86) si * iesire silentioasa NEEXPLICATA de acea cale (candidat: cursa driverului/Timer) * * Documente reale, gasite prin interogare read-only pe MARIUSM_AUTO (probe_s8p8_candidati.prg, * probe_s8p8_garzi.prg - pastrate ca dovada in acest director): * 1113 - sursa COMANDA (tip=3) [reluat din pas7, stabil 133/0 x3] * 1055 - sursa CONTRACT (tip=2) [reluat din pas7] * 1048 - factura SIMPLA, lista de preturi (tip=1) [reluat din pas7] * 1130 - VALUTA (tip=5) [reluat din pas7] * 1047 - DEVIZE AUTO (tip=-12), FARA DELEGAT (id_delegat=0/NULL) - singurul document din toata * schema care trece toate garzile do_editare_unificata SI nu are delegat (interogarea D din * probe_s8p8_candidati_log.txt: 0 rezultate pe tip 1-4 fara delegat, 1 rezultat pe orice tip * valid - exact acesta). Deja folosit, izolat, in test_s8_pas6_linii.prg. * 1110 - AVIZ DIN LISTA DE PRETURI (tip=22), luna curenta, toate garzile trec (probe_s8p8_garzi). * CORECTAT fata de prima trecere a acestei suite (vezi docs\raport_s8_pas8_suita.md §2/§10): * la editare, IncarcaAntetFacturaEditare (ofacturare_editare.prg:94) seteaza intotdeauna * nIdTipDoc = nIdTipDocFactura pentru documente ne-proforma, deci llAviz = (poDate.nIdTipDoc * = poDate.nIdTipDocAvizExpeditie) e mereu .F. la editare, indiferent de poDate.tip - ramura * "aviz" a Do Case-ului din Init (ofacturare.vc2 ~21030) nu se activeaza NICIODATA la editare. * Toate documentele editate, aviz sau nu, trec prin ramura "factura" (~21148+), care scoate * Ct_clb_politici_preturi NECONDITIONAT pentru orice tip. Deci controlul lipseste la editare * pe toate tipurile, nu doar pe 22 - exercita restul traseului de aviz (G1-G9,G11). * 953 - AVIZ SUBUNITATI (tip=23), mai 2022 (istoric) - caz NEGATIV. Premiza initiala ("tip 23/41 * pastreaza Ct_clb_politici_preturi la editare") s-a dovedit FALSA (vezi 1110 mai sus - acea * ramura nu se activeaza deloc la editare). Documentul ramane util ca proba a garzii "luna * curenta": probe_s8p8_garzi_log.txt arata ca 953 cade pe ea (documentul e din mai 2022, * sesiunea de test ruleaza in luna contabila curenta august 2026) - respins CU mesaj, nu * silentios, fara sa deschida formularul si fara sa consume niciun numar (G2). * * Nu scrie in Oracle - doar SELECT; verifica ca formularul deschis nici el nu scrie (G8). SET SAFETY OFF SET TALK OFF PUBLIC gcErrLog gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s8_editare_incarcare_log.txt' STRTOFILE('start ' + Transform(Datetime()) + 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 *!* gnScadereStoc: neinitializat de test_init_env_auto_roafacturare.prg. Documentele tip 1-5 nu-l *!* citesc (cad in ramura OTHERWISE a Do Case-ului din Init, care nu-l testeaza), dar 1110 (tip=22) *!* intra pe ramura "CASE gnScadereStoc=0 AND poDate.tip=22" - fara variabila declarata, VFP arunca *!* "Variable GNSCADERESTOC is not found". Precedent: creeaza_documente_s8.prg (acelasi director) *!* seteaza explicit gnScadereStoc=0 ca parte a mediului de test, nu a codului de productie. PUBLIC gnScadereStoc gnScadereStoc = 0 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 (acelasi tipar validat in *!* test_s8_pas7_cablare.prg / driverS8p7 - Timer legat de _SCREEN prin Bindevent, viu in interiorul *!* Show()-ului modal, care citeste formularul din colectia Objects si il elibereaza) --- PUBLIC goDriverS8p7 goDriverS8p7 = Createobject('driverS8p7') _SCREEN.AddObject('tmrS8p8', 'Timer') _SCREEN.tmrS8p8.Interval = 150 Bindevent(_SCREEN.tmrS8p8, 'Timer', goDriverS8p7, 'Executa') _SCREEN.tmrS8p8.Enabled = .T. *!* --- verificare statica G2: 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 toate documentele de test --- 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, 1047, 1110, 953)] gencursor('poFacturi', 'crsfacturi', lcSelect, lcFiltru, lcSchema, lcOrder, .F., [], .F., []) poFacturi.ca_baza1.afisare() DO asserteaza WITH 'crsfacturi incarcat cu cele 7 documente reale (rownum=7)', Used('crsfacturi') AND Reccount('crsfacturi') = 7, IIF(Used('crsfacturi'), TRANSFORM(Reccount('crsfacturi')), 'crsfacturi lipsa') *!* ===================================================================================== *!* Cazurile POZITIVE - documentul trebuie sa se deschida (G1-G9, G11, plus G3/G4/G4b pe linii) *!* Ct_clb_altele (infirmare §3.2 din propunerea S8): document CU sursa comanda/contract -> prezent, *!* etichetat; factura simpla/valuta/aviz(tip22)/devize(tip-12) editate (nu copiate) -> absent, G10. *!* ===================================================================================== DO VerificaEditare WITH 1113, 'sursa comanda', .T., 'Nr. comanda', .T. DO VerificaEditare WITH 1055, 'sursa contract', .T., 'Nr. contract', .T. DO VerificaEditare WITH 1048, 'factura simpla', .F., '', .T. DO VerificaEditare WITH 1130, 'valuta', .F., '', .T. *!* 1047/1110: nici tip=-12 (DEVIZE AUTO), nici tip=22 (aviz lista preturi) nu se incadreaza in *!* Inlist(poDate.tip,1,5,10,48,49) - unicul grup pe care Init il scoate la editare (llCopiere=.F.) *!* in ramura "factura" (llAviz e mereu .F. la editare, cf. IncarcaAntetFacturaEditare:94, care *!* seteaza mereu nIdTipDocFactura pentru documente ne-proforma - ramura de aviz din Do Case NU se *!* activeaza niciodata la editare, indiferent de poDate.tip). Deci Ct_clb_altele RAMANE prezent, *!* dar FARA eticheta schimbata (niciun Case din Do Case-ul "gnScadereStoc=0" nu acopera 22/-12) - *!* verificat pe rulare (test_s8_p8_candidati/garzi + prima trecere a acestei suite). Nu se *!* verifica eticheta exacta (ramane design-time, neschimbata de do_schimba_explicatia). DO VerificaEditare WITH 1047, 'DEVIZE AUTO, fara delegat', .T., '', .T. DO VerificaEditare WITH 1110, 'aviz din lista de preturi (tip=22)', .T., '', .F. *!* ===================================================================================== *!* Cazul NEGATIV - 953, aviz istoric (tip=23), respins de garda "luna curenta" *!* ===================================================================================== DO VerificaEditareRespinsa WITH 953, 'aviz istoric tip=23, respins - luna curenta', 'luna curenta' *!* --- S8 incasarea la editare (D1/D3/D4) - foloseste Show() real, deci trebuie sa ruleze inainte *!* de teardown-ul lui tmrS8p8 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 mintit. 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.tmrS8p8.Enabled = .F. Try _SCREEN.RemoveObject('tmrS8p8') Catch Endtry *!* --- S8 grupurile B/C: neregresie pe document NOU --- DO VerificaDocumentNou STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) STRTOFILE('end ' + Transform(Datetime()) + CHR(13) + CHR(10), gcErrLog, 1) QUIT *!* ===================================================================================== *!* R1: curatenie intre cazuri - inchide aliasurile care raman deschise dupa *!* IncarcaLiniiFacturaEditare/do_calculeaza_totaluri/Init-ul formularului (gasite la X2, *!* docs\raport_s8_driver_determinist.md): CRSGESTIUNI, JTVA_COLOANE(_TEMP), SAFT_TAXTABLE, *!* CRSCURSURI. Nu produc FAIL azi (X2: Select crsfacturi/crsfactura restaureaza mereu zona *!* corecta), dar cresc numarul de work area-uri intre cazuri - se inchid explicit aici ca sa nu *!* se acumuleze pe 8 cazuri (limita VFP de work areas e departe, dar igiena conteaza pe R1). *!* ===================================================================================== PROCEDURE CurataAliasuriReziduale LOCAL laAlias(1), lnI, lcA laAlias(1) = 'CRSGESTIUNI' DIMENSION laAlias(9) laAlias(2) = 'JTVA_COLOANE' laAlias(3) = 'JTVA_COLOANE_TEMP' laAlias(4) = 'SAFT_TAXTABLE' laAlias(5) = 'CRSCURSURI' laAlias(6) = 'CRSARTICOLE_DOC' laAlias(7) = 'CRSARTICOLE_EDITARE' laAlias(8) = 'V_ANTET_EDITARE' laAlias(9) = 'CRSFACTURA' FOR lnI = 1 TO ALEN(laAlias) lcA = laAlias(lnI) IF Used(m.lcA) Use In (m.lcA) ENDIF ENDFOR ENDPROC *!* R1: jurnal AUSED() - numarul de work area-uri deschise, ca sa se vada ca starea de start e *!* aceeasi la fiecare caz (semnalul de scurgere din triaj: 16 -> 16 -> 17 -> 17, in crestere) PROCEDURE LogAUsed LPARAMETERS tcEticheta LOCAL lnN, laAliasuri(1), lnI, lcLista lnN = AUSED(laAliasuri) lcLista = '' FOR lnI = 1 TO m.lnN lcLista = lcLista + laAliasuri(m.lnI,1) + ' ' ENDFOR STRTOFILE('AUSED ' + m.tcEticheta + ' = ' + TRANSFORM(m.lnN) + ' [' + m.lcLista + ']' + CHR(13) + CHR(10), gcErrLog, 1) ENDPROC PROCEDURE VerificaEditare LPARAMETERS tnIdVanzare, tcEticheta, tlCtClbAsteptat, tcCtClbEtichetaAsteptata, tlVerificaLinii LOCAL lcPrefix, lnSucces, loFrm, lnI, llGasitForm LOCAL lcSnapPlajeA, lcSnapPlajeB, lcSnapDetA, lcSnapDetB LOCAL ltDataorasVanzareA, lnIdUtilsVanzareA lcPrefix = TRANSFORM(m.tnIdVanzare) + ' [' + m.tcEticheta + ']' gcMockUltimMesaj = '' *!* --- R1: curatenie + jurnal AUSED INAINTE de caz --- DO CurataAliasuriReziduale DO LogAUsed WITH lcPrefix + ' INAINTE' *!* --- 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 *!* --- martor G3/G4/G4b: interogare INDEPENDENTA pe VANZARI_DETALII+NOM_ARTICOLE, INAINTE de *!* codul testat (acelasi tipar ca test_s8_pas6_linii.prg, dar aici pe traseul COMPLET) --- LOCAL lnMartorLinii lnMartorLinii = 0 IF m.tlVerificaLinii IF Used('v_g4pre') Use In v_g4pre ENDIF lnSucces = goExecutor.oExecute([select count(*) as nr from vanzari_detalii where id_vanzare = ] + Transform(m.tnIdVanzare) + [ and sters = 0], 'v_g4pre') goExecutor.oReset() DO asserteaza WITH lcPrefix + ': martor G3 Oracle a reusit', lnSucces >= 0 AND Used('v_g4pre'), Transform(lnSucces) lnMartorLinii = Nvl(v_g4pre.nr, 0) Use In v_g4pre IF Used('v_g4') Use In v_g4 ENDIF lnSucces = goExecutor.oExecute([select vd.id_vanzare_det, vd.cantitate, vd.taxcode, vd.lot, vd.serie, ] + ; [na.in_stoc from vanzari_detalii vd left join nom_articole na on na.id_articol = vd.id_articol ] + ; [where vd.id_vanzare = ] + Transform(m.tnIdVanzare) + [ and vd.sters = 0 order by vd.id_vanzare_det], 'v_g4') goExecutor.oReset() DO asserteaza WITH lcPrefix + ': martor G4/G4b Oracle a reusit', lnSucces >= 0 AND Used('v_g4'), Transform(lnSucces) ENDIF *!* --- R2 diagnostic PRE: IncarcaAntetFacturaEditare, apel direct izolat - baseline. Daca *!* traseul complet de mai jos nu deschide formularul, aceasta valoare arata daca poarta *!* silentioasa (cale 11, ofacturare_editare.prg:83-86) era deja activa INAINTE de orice *!* interferenta a traseului complet (frm_facturi/driver) --- LOCAL poDateDiagPre, lnDiscRPre, lnDiscVPre poDateDiagPre = IncarcaAntetFacturaEditare(m.tnIdVanzare, @lnDiscRPre, @lnDiscVPre) DO asserteaza WITH lcPrefix + ': diagnostic - IncarcaAntetFacturaEditare (apel direct, izolat) reuseste', Vartype(poDateDiagPre) == 'O', Vartype(poDateDiagPre) IF Used('v_antet_editare') Use In v_antet_editare ENDIF *!* --- G1/G6/G7: poDateDiagPre e chiar obiectul pe care do_editare_unificata il va construi mai *!* jos (aceeasi functie, acelasi id_vanzare, fara nicio scriere intre timp) - comparat cu randul *!* deja incarcat in crsfacturi (acelasi SELECT ca fact_vfacturi, martor independent) --- IF Vartype(poDateDiagPre) == 'O' Select crsfacturi Locate For id_vanzare = m.tnIdVanzare IF Found() DO asserteaza WITH lcPrefix + ' G1: serie_act = VANZARI', Alltrim(Nvl(poDateDiagPre.serie_act,'')) == Alltrim(Nvl(crsfacturi.serie_act,'')), poDateDiagPre.serie_act DO asserteaza WITH lcPrefix + ' G1: nract = VANZARI', poDateDiagPre.nract == Nvl(crsfacturi.numar_act,0), Transform(poDateDiagPre.nract) DO asserteaza WITH lcPrefix + ' G1: dataact = VANZARI', poDateDiagPre.dataact == crsfacturi.data_act, Dtoc(poDateDiagPre.dataact) DO asserteaza WITH lcPrefix + ' G1: datascad = VANZARI (sau ambele NULL)', Iif(Isnull(crsfacturi.data_scad), Isnull(poDateDiagPre.datascad), poDateDiagPre.datascad == crsfacturi.data_scad), Transform(poDateDiagPre.datascad) DO asserteaza WITH lcPrefix + ' G6: discount_evidentiat = VANZARI', poDateDiagPre.discount_evidentiat == Nvl(crsfacturi.discount_evidentiat,0), Transform(poDateDiagPre.discount_evidentiat) IF poDateDiagPre.in_valuta = 0 DO asserteaza WITH lcPrefix + ' G6: discount (lei) = VANZARI', Round(lnDiscRPre,2) == Round(Nvl(crsfacturi.discount,0),2), Transform(lnDiscRPre) ENDIF DO asserteaza WITH lcPrefix + ' G7: id_delegat = VANZARI (sau ambele NULL - cazul "fara delegat")', ; Iif(Isnull(crsfacturi.id_delegat), Isnull(poDateDiagPre.id_delegat), Nvl(poDateDiagPre.id_delegat,0) == Nvl(crsfacturi.id_delegat,0)), Transform(Nvl(poDateDiagPre.id_delegat,-1)) DO asserteaza WITH lcPrefix + ' G7: nume_delegat = VANZARI', Alltrim(Nvl(poDateDiagPre.nume_delegat,'')) == Alltrim(Nvl(crsfacturi.delegat,'')), poDateDiagPre.nume_delegat DO asserteaza WITH lcPrefix + ' G7: adresa_facturare = VANZARI', Alltrim(Nvl(poDateDiagPre.adresa_facturare,'')) == Alltrim(Nvl(crsfacturi.adresa_facturare,'')), poDateDiagPre.adresa_facturare DO asserteaza WITH lcPrefix + ' G7: listare_detaliata = VANZARI', poDateDiagPre.nListareDetaliata == Nvl(crsfacturi.listare_detaliata,0), Transform(poDateDiagPre.nListareDetaliata) DO asserteaza WITH lcPrefix + ' G7: efactura = VANZARI', poDateDiagPre.eFactura == Nvl(crsfacturi.efactura,0), Transform(poDateDiagPre.eFactura) DO asserteaza WITH lcPrefix + ' G7: id_ruta = VANZARI (sau ambele NULL)', Iif(Isnull(crsfacturi.id_ruta), Isnull(poDateDiagPre.id_ruta), poDateDiagPre.id_ruta == crsfacturi.id_ruta), Transform(poDateDiagPre.id_ruta) ENDIF ENDIF *!* --- 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()) --- goDriverS8p7.Reseteaza() loFrm.do_editare_unificata() IF !goDriverS8p7.lGasit *!* --- R2: iesirea a esuat - distinge CU MESAJ (garda explicita) de SILENTIOASA, si in acest *!* caz distinge daca poarta 11 (IncarcaAntetFacturaEditare->NULL) e cauza confirmata --- DO asserteaza WITH lcPrefix + ': formularul unificat s-a deschis (traseul direct, fara factureaza())', .F., 'NU s-a deschis' IF !Empty(gcMockUltimMesaj) DO asserteaza WITH lcPrefix + ' diagnostic: iesire CU MESAJ de garda (nu silentioasa) - mesaj=[' + gcMockUltimMesaj + ']', .F., gcMockUltimMesaj ELSE LOCAL poDateDiagPost, lnDiscRPost, lnDiscVPost poDateDiagPost = IncarcaAntetFacturaEditare(m.tnIdVanzare, @lnDiscRPost, @lnDiscVPost) IF Vartype(poDateDiagPost) <> 'O' DO asserteaza WITH lcPrefix + ' diagnostic: iesire silentioasa CONFIRMATA - cale 11 (ofacturare_editare.prg:83-86), IncarcaAntetFacturaEditare revine .NULL. si la apel direct chiar acum', .F., 'confirmat cale 11' ELSE DO asserteaza WITH lcPrefix + ' diagnostic: iesire silentioasa NEEXPLICATA de cale 11 (IncarcaAntetFacturaEditare reuseste izolat chiar acum) - candidat: cale 3 (glLunaInchisa) sau cursa driverului/Timer', .F., 'neexplicat, nu e cale 11' ENDIF IF Used('v_antet_editare') Use In v_antet_editare ENDIF ENDIF Try loFrm.Release() Catch Endtry DO CurataAliasuriReziduale DO LogAUsed WITH lcPrefix + ' DUPA (esec deschidere)' RETURN ENDIF 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 --- DO asserteaza WITH lcPrefix + ': Ct_clb_altele prezenta = ' + Iif(m.tlCtClbAsteptat, 'prezent', 'absent'), ; goDriverS8p7.lCtClbPrezent == m.tlCtClbAsteptat, Transform(goDriverS8p7.lCtClbPrezent) IF m.tlCtClbAsteptat AND !Empty(m.tcCtClbEtichetaAsteptata) 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 --- DO VerificaBlocajGrupBC WITH m.lcPrefix *!* --- G5: totalul afisat = totalul deja scris in VANZARI --- 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 *!* --- G3/G4/G4b: crsfactura ramane deschis dupa ce driverul a eliberat formularul (nu e *!* proprietate a obiectului, e o zona de lucru globala populata inaintea Createobject) --- IF m.tlVerificaLinii DO asserteaza WITH lcPrefix + ' G3: crsfactura a ramas deschis dupa inchiderea formularului', Used('crsfactura'), Transform(Used('crsfactura')) IF Used('crsfactura') AND Used('v_g4') DO asserteaza WITH lcPrefix + ' G3: Reccount(crsfactura)=' + Transform(Reccount('crsfactura')) + ' = martor(' + Transform(m.lnMartorLinii) + ')', ; Reccount('crsfactura') == m.lnMartorLinii, Transform(Reccount('crsfactura')) LOCAL lnDetTemp, llGasitLinie Select v_g4 Scan lnDetTemp = v_g4.id_vanzare_det Select crsfactura Locate For id_temp = m.lnDetTemp llGasitLinie = Found() DO asserteaza WITH lcPrefix + ' det=' + Transform(m.lnDetTemp) + ': gasit in crsfactura', m.llGasitLinie, Transform(m.llGasitLinie) IF m.llGasitLinie DO asserteaza WITH lcPrefix + ' det=' + Transform(m.lnDetTemp) + ' G4: cantitate', Round(crsfactura.cantitate,4) == Round(v_g4.cantitate,4), Transform(crsfactura.cantitate) DO asserteaza WITH lcPrefix + ' det=' + Transform(m.lnDetTemp) + ' G4: taxcode', Nvl(crsfactura.taxcode,0) == Nvl(v_g4.taxcode,0), Transform(Nvl(crsfactura.taxcode,0)) DO asserteaza WITH lcPrefix + ' det=' + Transform(m.lnDetTemp) + ' G4b: gestionabil = in_stoc curent(' + Transform(Nvl(v_g4.in_stoc,0)) + ')', ; crsfactura.gestionabil == Iif(Nvl(v_g4.in_stoc,0) <> 0, 1, 0), Transform(crsfactura.gestionabil) ENDIF Select v_g4 Endscan ENDIF IF Used('v_g4') Use In v_g4 ENDIF 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() 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; proba indirecta, partiala (forma completa a G11 cere S9/reemitere) --- DO asserteaza WITH lcPrefix + ' G11 partial (derivat din G8): nicio scriere pe VANZARI_DETALII => stoc agregat neschimbat pe acest document', m.lcSnapDetA == m.lcSnapDetB, '' *!* --- R1: curatenie + jurnal AUSED DUPA caz --- DO CurataAliasuriReziduale DO LogAUsed WITH lcPrefix + ' DUPA' ENDPROC *!* Caz NEGATIV: documentul e respins de o garda CU MESAJ a do_editare_unificata (aici, "luna *!* curenta") - formularul nu trebuie sa se deschida, trebuie sa apara mesajul asteptat, si G2 *!* (niciun numar alocat) trebuie sa ramana curat chiar si pe calea de refuz. PROCEDURE VerificaEditareRespinsa LPARAMETERS tnIdVanzare, tcEticheta, tcMesajContine LOCAL lcPrefix, lnSucces, loFrm, lcSnapPlajeA, lcSnapPlajeB lcPrefix = Transform(m.tnIdVanzare) + ' [' + m.tcEticheta + ']' gcMockUltimMesaj = '' DO CurataAliasuriReziduale DO LogAUsed WITH lcPrefix + ' INAINTE' IF Used('v_plaje_resp_a') Use In v_plaje_resp_a ENDIF lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_resp_a') goExecutor.oReset() lcSnapPlajeA = CursorToSnapshot('v_plaje_resp_a') Use In v_plaje_resp_a 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 goDriverS8p7.Reseteaza() loFrm.do_editare_unificata() DO asserteaza WITH lcPrefix + ': formularul NU s-a deschis (garda a respins documentul)', !goDriverS8p7.lGasit, Transform(goDriverS8p7.lGasit) DO asserteaza WITH lcPrefix + ': a aparut un mesaj de garda (refuz explicat, nu iesire silentioasa)', !Empty(gcMockUltimMesaj), gcMockUltimMesaj DO asserteaza WITH lcPrefix + ': mesajul contine [' + m.tcMesajContine + ']', m.tcMesajContine $ Lower(gcMockUltimMesaj), gcMockUltimMesaj Try loFrm.Release() Catch Endtry IF Used('v_plaje_resp_b') Use In v_plaje_resp_b ENDIF lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_resp_b') goExecutor.oReset() lcSnapPlajeB = CursorToSnapshot('v_plaje_resp_b') Use In v_plaje_resp_b DO asserteaza WITH lcPrefix + ' G2: vplaje_numere identic inainte/dupa (refuz, dar tot fara numar ars)', m.lcSnapPlajeA == m.lcSnapPlajeB, '' DO CurataAliasuriReziduale DO LogAUsed WITH lcPrefix + ' DUPA' ENDPROC *!* S8 - blocarea grupurilor B si C la editare. Citeste starea deja capturata de goDriverS8p7 *!* (formularul e inchis pana aici) si asearta doar cand controlul e prezent. 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 (acelasi tipar validat in *!* test_s8_pas7_cablare.prg). NU trece prin factureaza()/poGeneratorNumere. PROCEDURE VerificaDocumentNou PRIVATE poDate LOCAL loForm poDate = Createobject('oDateFactura', 0, 0) poDate.tip = 3 poDate.id_client = 0 poDate.incasat = 0 *!* Init-ul lui frm_facturare_articole2 presupune 'crsfactura' deja deschis (in productie, *!* creeaza_facturacrs('crsfactura') ruleaza in factureaza() inainte de Createobject, pentru *!* orice document, nou sau editat). R1 (curatenie de aliasuri intre cazuri) inchide crsfactura *!* dupa fiecare caz anterior - fara acest bloc, acest test ar depinde tacit de un leftover *!* (exact cum facea, neintentionat, test_s8_pas7_cablare.prg). IF !Used('crsfactura') creeaza_facturacrs('crsfactura') ENDIF 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) *!* but_cursuri.Enabled = Used('crscursuri') AND Reccount('crscursuri')>0 (ofacturare.vc2:20918), *!* iar citeste_cursuri_zi() ruleaza in Init doar pentru Inlist(poDate.tip,1,22,5,29,7,10,45) *!* (:20899) - tip=3 (comanda) NU e in acea lista, deci but_cursuri e NATURAL needitabil pe un *!* document nou de acest tip, indiferent de lEditare. Prima trecere a acestei suite astepta *!* .T. aici (copiat din test_s8_pas7_cablare.prg) si a picat: R1 (curatenie de aliasuri intre *!* cazuri) a inchis 'crscursuri' ramas din cazul anterior, care mascase adevaratul comportament - *!* asertiunea veche trecea din intamplare, nu din cauza codului. Corectata aici la valoarea reala. DO asserteaza WITH 'document nou grupB: but_cursuri needitabil natural (tip=3 nu incarca crscursuri in Init, independent de lEditare)', !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). Replica dovedita a corpului do_editare_unificata pana la *!* Createobject (acelasi tipar validat in test_s8_pas7_cablare.prg). 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 = '' DO CurataAliasuriReziduale DO LogAUsed WITH lcPrefix + ' INAINTE' 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, '' DO CurataAliasuriReziduale DO LogAUsed WITH lcPrefix + ' DUPA' 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 (acelasi tipar ca test_s8_pas7_cablare.prg). Citeste Ct_clb_altele din Objects (nu *!* PEMSTATUS) 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 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