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
541 lines
27 KiB
Plaintext
541 lines
27 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_base_triaj_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 VerificaEditare WITH 1113, 'sursa comanda', .T., 'Nr. comanda'
|
|
DO VerificaEditare WITH 1055, 'sursa contract', .T., 'Nr. contract'
|
|
DO VerificaEditare WITH 1048, 'factura simpla', .F., ''
|
|
DO VerificaEditare WITH 1130, 'valuta', .F., ''
|
|
|
|
_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
|
|
|
|
|
|
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
|