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
1152 lines
47 KiB
Plaintext
1152 lines
47 KiB
Plaintext
* test_s5c_emitere_reala_ui.prg
|
|
* S5c, proba CAPAT-LA-CAPAT pe flux real (pasii C0-C10 din docs\propunere_s5c_factura_din_proforma.md
|
|
* par. 5.3): dintr-o proforma EMISA se genereaza o factura reala prin frm_facturare_articole2, si se
|
|
* verifica in Oracle cele patru clauze din "Gata cand" - numar nou, gestiune descarcata ca la un
|
|
* document necopiat, rand TIP = 4 in VANZARI_CORESP catre proforma sursa, proforma nemarcata FACTURAT.
|
|
*
|
|
* C0 - sonda plaje (tipdoc 5 FACTURA, 6 AVIZ, 23 PROFORMA) si sonda cursor_preturi pe tip 1 / 22
|
|
* C0b - sonda note de verificat (daca > 0, "Do Form verificare" s-ar deschide; e ocolit prin stub)
|
|
* C1 - emitere PROFORMA reala (nIdTipDoc = 23 -> eProforma = 1 prin nIdTipDoc_Assign)
|
|
* C2 - semnalul de copiere: completeaza_setari_document(<sursa cu eproforma=1>, .T.) pe poDate nou
|
|
* C3 - liniile documentului copiat, pe CALEA VIE a formularului v2: do_adauga_articol_cautat
|
|
* (cautare in grid), nu do_adauga_tot - cod mort pe v2, fara niciun caction si fara apelant
|
|
* C4 - do_scrie_factura() -> .T., poDate.nid_vanzare = id nou
|
|
* C5 - VANZARI: eproforma = 0 si numar_act diferit de al proformei
|
|
* C6 - VANZARI_CORESP: exact un rand sters=0, tip=4, fact=<factura>, aviz=<proforma>
|
|
* C7 - VANZARI.FACTURAT pe proforma: 0/NULL, neschimbat fata de starea dinainte
|
|
* C8 - VANZARI_CANTITATI pe liniile proformei: 0 randuri
|
|
* C9 - gestiunea: profilul VANZARI_DETALII al facturii din proforma == cel al documentului de
|
|
* control de la C10 (paritate; cu gnScadereStoc = 0 nu se poate cere id_gestiune > 0 fara
|
|
* dialoguri modale per linie - vezi raportul)
|
|
* C10 - neregresie: al doilea document emis in aceeasi sesiune, pe ACELASI poDate dupa Reset(1)
|
|
* (exact bucla din factureaza, ofacturare.prg:428-441), NU primeste legatura TIP = 4
|
|
*
|
|
* CONSUMA NUMERE DE DOCUMENT REALE in MARIUSM_AUTO: o proforma + doua documente. Nimic nu se sterge.
|
|
*
|
|
* Mediu, capcane deja platite:
|
|
* - stub_verificare PRIMUL in SET PATH (plain, nu ADDITIVE), ca "Do Form verificare" sa nu fie modal;
|
|
* - crsfactura are nevoie de coloana "gestiune" (grd_factura.cGestiune e legat la ea, iar
|
|
* creeaza_facturacrs nu o are) - fara ea frm_facturare_articole2 agata la CREATEOBJECT;
|
|
* - gnIdUtil = 8 INAINTE de creeaza_cursor_serii (seriile sunt pe utilizator);
|
|
* - gnIdSucursala ramane cel dat de mediu (NULL): plaja de proforma ID_PLAJA=67 are ID_SUCURSALA
|
|
* NULL, iar fortarea sucursalei 167 ar aduce si plaja 54 -> doua plaje -> dialog de alegere;
|
|
* - gnScadereStoc = 0, altfel apar dialoguri modale per linie;
|
|
* - mock_amessagebox incarcat cu SET PROCEDURE ADDITIVE si REINCARCAT chiar inainte de fiecare apel
|
|
* riscant (o FUNCTION definita in acest .prg NU castiga pentru apelurile din metodele .vcx);
|
|
* - driver pe Timer pentru MESSAGEBOX_FORM (formular modal propriu, neacoperit de mock).
|
|
*
|
|
* Rulare: powershell -ExecutionPolicy Bypass -File test_s5c_emitere_reala_ui.ps1
|
|
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5c_emitere_reala_ui.log
|
|
* (mirror pentru harness: ...\facturare_unificat\test_s5c_emitere_reala_ui_log.txt)
|
|
|
|
SET SAFETY OFF
|
|
SET TALK OFF
|
|
SET NOTIFY OFF
|
|
SET DELETED ON
|
|
SET EXACT ON
|
|
SET CENTURY ON
|
|
SET DATE DMY
|
|
SET DECIMALS TO 4
|
|
SET NULLDISPLAY TO ''
|
|
SET MULTILOCKS ON
|
|
CLOSE DATABASES
|
|
|
|
PUBLIC gcLog, gcUILog, gcSyncDir, gnPass, gnFail, gnSarit, gcCaz
|
|
PUBLIC gcDir
|
|
gcDir = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\"
|
|
gcLog = gcDir + "out\test_s5c_emitere_reala_ui.log"
|
|
gcUILog = gcDir + "test_s5c_emitere_reala_ui_log.txt"
|
|
gcSyncDir = gcDir + "uisync_s5c\"
|
|
IF !DIRECTORY(gcDir + "out")
|
|
MD (gcDir + "out")
|
|
ENDIF
|
|
IF !DIRECTORY(gcSyncDir)
|
|
MD (gcSyncDir)
|
|
ENDIF
|
|
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog)
|
|
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
|
|
gnPass = 0
|
|
gnFail = 0
|
|
gnSarit = 0
|
|
gcCaz = ""
|
|
|
|
* rezultate intermediare, vizibile in toate procedurile
|
|
PUBLIC gnIdProf, gnNrProf, gcSerieProf, gnIdFact, gnNrFact, gnIdCtrl
|
|
PUBLIC gnTipDoc, gnIdTipDocFact, glProformaEmisa, gnFacturatInainte, gdZiCurs, glPlajaProforma
|
|
PUBLIC gcStrategieLinii
|
|
gcStrategieLinii = ''
|
|
gnIdProf = 0
|
|
gnNrProf = 0
|
|
gcSerieProf = ""
|
|
gnIdFact = 0
|
|
gnNrFact = 0
|
|
gnIdCtrl = 0
|
|
gnTipDoc = 0
|
|
gnIdTipDocFact = 5
|
|
glProformaEmisa = .F.
|
|
glPlajaProforma = .F.
|
|
gnFacturatInainte = -1
|
|
gdZiCurs = {}
|
|
|
|
ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
|
|
ON SHUTDOWN QUIT
|
|
|
|
TRY
|
|
*-- stub_verificare PRIMUL (SET PATH plain): test_init_env_auto_roafacturare face SET PATH ADDITIVE,
|
|
*-- care adauga DUPA, deci stubul pastreaza prioritatea fata de COMUN\FERESTRE
|
|
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\achizitie_import\stub_verificare"
|
|
|
|
DO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
|
|
IF TYPE('gnHandle') <> 'N' OR gnHandle <= 0
|
|
DO AfLog WITH "FAIL: conexiune Oracle esuata"
|
|
DO Final
|
|
ENDIF
|
|
SQLSETPROP(gnHandle, "QueryTimeOut", 60)
|
|
IF TYPE('goExecutor.nHandle') = 'N' AND goExecutor.nHandle > 0 AND goExecutor.nHandle <> gnHandle
|
|
SQLSETPROP(goExecutor.nHandle, "QueryTimeOut", 60)
|
|
ENDIF
|
|
|
|
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
|
|
SET CLASSLIB TO gridextras.vcx ADDITIVE
|
|
SET CLASSLIB TO _cb_base.vcx ADDITIVE
|
|
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg" ADDITIVE
|
|
*-- mock ULTIMUL: la nume duplicat castiga fisierul de proceduri deschis cel mai recent
|
|
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE
|
|
|
|
PUBLIC gcMockUltimMesaj, gnMockUltimTip
|
|
gcMockUltimMesaj = ""
|
|
gnMockUltimTip = 0
|
|
|
|
*-- gnButon / pnButon sunt publice in aplicatia reala; driverul pe Timer si do_scrie_factura
|
|
*-- trebuie sa scrie in aceeasi variabila, nu in cate un private de scop
|
|
IF TYPE('gnButon') = 'U'
|
|
PUBLIC gnButon
|
|
ENDIF
|
|
IF TYPE('pnButon') = 'U'
|
|
PUBLIC pnButon
|
|
ENDIF
|
|
gnButon = 1
|
|
pnButon = 1
|
|
|
|
IF !actualizeaza_optiuni_program()
|
|
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
|
|
DO Final
|
|
ENDIF
|
|
gnScadereStoc = 0
|
|
gnModTotFact = 0
|
|
gnFactSeturi = 0
|
|
gnListareAvizBonFiscal = 0
|
|
gnid_part_casa = 0
|
|
*-- cu gnIdSucursala NULL, cursor_preturi intoarce un articol fara cota de TVA si emiterea
|
|
*-- moare cu "Nu a fost gasita cota de TVA! (FACT-013)". 167 e sucursala cu date complete.
|
|
gnIdSucursala = 167
|
|
goExecutor.oExecuta([begin pack_contafin.set_id_sucursala(?gnIdSucursala); end;])
|
|
gnIdUtil = 8
|
|
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
|
|
DO AfLog WITH "ENV OK gnHandle=" + TRANSFORM(gnHandle) + " gcS=" + TRANSFORM(gcS) + ;
|
|
" gnLuna=" + TRANSFORM(gnLuna) + " gnAn=" + TRANSFORM(gnAn) + ;
|
|
" gnIdSucursala=" + TRANSFORM(gnIdSucursala) + " gnScadereStoc=" + TRANSFORM(gnScadereStoc)
|
|
|
|
*-- driver pe Timer pentru formularele modale proprii (MESSAGEBOX_FORM), neacoperite de mock
|
|
PUBLIC goDrv5c
|
|
goDrv5c = CREATEOBJECT('driverModal5c')
|
|
_SCREEN.AddObject('tmrDrv5c', 'Timer')
|
|
_SCREEN.tmrDrv5c.Interval = 200
|
|
BINDEVENT(_SCREEN.tmrDrv5c, 'Timer', goDrv5c, 'Executa')
|
|
_SCREEN.tmrDrv5c.Enabled = .T.
|
|
_SCREEN.Caption = 'S5c - factura din proforma (proba capat-la-capat)'
|
|
|
|
PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest
|
|
poDate = NULL
|
|
update_jtva_coloane([JV], [jtva_coloane_temp])
|
|
update_saft_taxtable()
|
|
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
|
|
poDateGestiuneDest = CREATEOBJECT("oDateGestiune")
|
|
|
|
gdZiCurs = DataCursValid()
|
|
DO AfLog WITH "zi_curs folosita pentru toate documentele: " + DTOC(gdZiCurs)
|
|
|
|
DO TestC0_Sonde
|
|
DO HarnessStep WITH 0, 'env_gata', 20
|
|
|
|
DO TestC1_EmiteProforma
|
|
DO HarnessStep WITH 1, 'proforma_emisa', 20
|
|
|
|
DO TestC2C4_FacturaDinProforma
|
|
DO HarnessStep WITH 2, 'factura_emisa', 20
|
|
|
|
DO TestC5C8_VerificariOracle
|
|
|
|
DO TestC10_Neregresie
|
|
DO HarnessStep WITH 3, 'neregresie_emis', 20
|
|
|
|
DO TestC9_ParitateGestiune
|
|
|
|
IF TYPE('_SCREEN.tmrDrv5c') = 'O'
|
|
_SCREEN.tmrDrv5c.Enabled = .F.
|
|
ENDIF
|
|
DO Final
|
|
|
|
CATCH TO loExcTop
|
|
DO AfLog WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExcTop.ErrorNo) + ' Message=' + loExcTop.Message + ;
|
|
' Proc=' + loExcTop.Procedure + ' Line=' + TRANSFORM(loExcTop.LineNo) + ' [' + loExcTop.LineContents + ']'
|
|
TRY
|
|
IF TYPE('poDate') = 'O' AND !ISNULL(poDate) AND NVL(poDate.nid_vanzare, 0) >= 9999999999
|
|
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
|
|
DO AfLog WITH 'numar dezalocat dupa abandon'
|
|
ENDIF
|
|
CATCH TO loExcDez
|
|
DO AfLog WITH 'dezalocare esuata: ' + loExcDez.Message
|
|
ENDTRY
|
|
DO Final
|
|
ENDTRY
|
|
|
|
QUIT
|
|
|
|
*==================================================================================
|
|
* C0 - sondele de mediu: plaje de serii si disponibilitatea articolelor pe tip
|
|
*==================================================================================
|
|
PROCEDURE TestC0_Sonde
|
|
LOCAL lnR5, lnR6, lnR23, lnArt1, lnArt22, lnNote
|
|
gcCaz = "[C0 sonde mediu] "
|
|
|
|
gnIdUtil = 8
|
|
lnR5 = RanduriSerii(5)
|
|
lnR6 = RanduriSerii(6)
|
|
lnR23 = RanduriSerii(23)
|
|
DO AfLog WITH "C0 plaje: tipdoc 5(FACTURA)=" + TRANSFORM(lnR5) + " tipdoc 6(AVIZ)=" + TRANSFORM(lnR6) + ;
|
|
" tipdoc 23(PROFORMA)=" + TRANSFORM(lnR23)
|
|
|
|
glPlajaProforma = (lnR23 = 1)
|
|
IF !glPlajaProforma
|
|
DO Sarit WITH "C0: tipdoc 23 (PROFORMA) are " + TRANSFORM(lnR23) + " plaje (nu exact una) - C1 nu se ruleaza"
|
|
ENDIF
|
|
IF lnR5 <= 0 AND lnR6 <= 0
|
|
DO Sarit WITH "C0: nu exista plaje nici pentru tipdoc 5, nici pentru 6 - documentul copiat nu se poate numerota"
|
|
ENDIF
|
|
|
|
*-- ce tip de operatie are articole reale in acest mediu; tip 1 (factura din lista de preturi)
|
|
*-- da nIdTipDoc = 5 FACTURA, tip 22 (aviz din lista de preturi) da nIdTipDoc = 6 AVIZ
|
|
lnArt1 = ArticoleDisponibile(1)
|
|
lnArt22 = ArticoleDisponibile(22)
|
|
DO AfLog WITH "C0 cursor_preturi: tip 1 -> " + TRANSFORM(lnArt1) + " articole, tip 22 -> " + TRANSFORM(lnArt22) + " articole"
|
|
|
|
DO CASE
|
|
CASE lnArt1 > 0 AND lnR5 > 0
|
|
gnTipDoc = 1
|
|
gnIdTipDocFact = 5
|
|
CASE lnArt22 > 0 AND lnR6 > 0
|
|
gnTipDoc = 22
|
|
gnIdTipDocFact = 6
|
|
OTHERWISE
|
|
gnTipDoc = 0
|
|
ENDCASE
|
|
DO AfLog WITH "C0 ales: tip operatie=" + TRANSFORM(gnTipDoc) + " nIdTipDoc document copiat=" + TRANSFORM(gnIdTipDocFact) + ;
|
|
IIF(gnTipDoc = 22, " (AVIZ, nu FACTURA - tip 1 nu are articole in acest mediu)", "")
|
|
DO Assert WITH gnTipDoc > 0, "exista un tip de operatie cu articole reale si plaja de numere"
|
|
|
|
*-- C0b: note de verificat pe firma de test. Traseul e oricum liber (stub_verificare), dar
|
|
*-- se consemneaza pentru raport.
|
|
lnNote = -1
|
|
TRY
|
|
lnNote = QNum([select nvl(pack_contafin.verifica_note_contabile(1),0) as n from dual], 'n')
|
|
CATCH TO loExcN
|
|
DO AfLog WITH "C0b: verifica_note_contabile a esuat (" + loExcN.Message + ")"
|
|
ENDTRY
|
|
DO AfLog WITH "C0b note de verificat = " + TRANSFORM(lnNote) + ;
|
|
IIF(lnNote > 0, " -> in productie s-ar deschide Do Form verificare (aici: stub_verificare)", " -> traseu liber")
|
|
ENDPROC
|
|
|
|
*==================================================================================
|
|
* C1 - emiterea unei proforme reale
|
|
*==================================================================================
|
|
PROCEDURE TestC1_EmiteProforma
|
|
LOCAL lnScris
|
|
gcCaz = "[C1 emitere proforma] "
|
|
IF gnTipDoc = 0
|
|
DO Sarit WITH "C1 sarit: nu exista tip de operatie utilizabil"
|
|
RETURN
|
|
ENDIF
|
|
IF !glPlajaProforma
|
|
DO Sarit WITH "C1 sarit: plajele de proforma nu permit emiterea fara dialog de alegere a seriei"
|
|
RETURN
|
|
ENDIF
|
|
|
|
IF !PregatesteDocument(gnTipDoc, 23)
|
|
DO Sarit WITH "C1 sarit: pregatirea documentului proforma a esuat (vezi liniile de mai sus)"
|
|
RETURN
|
|
ENDIF
|
|
DO Assert WITH poDate.eProforma = 1, "poDate.eProforma = 1 dupa nIdTipDoc = 23 (proprietate derivata), e=" + TRANSFORM(poDate.eProforma)
|
|
|
|
lnScris = ScrieDocument("C1 proforma")
|
|
IF !lnScris
|
|
DO Sarit WITH "C1 sarit: proforma nu s-a scris - restul probei foloseste o proforma existenta"
|
|
DO CurataDocument
|
|
RETURN
|
|
ENDIF
|
|
|
|
gnIdProf = NVL(poDate.nid_vanzare, 0)
|
|
gnNrProf = NVL(poDate.nract, 0)
|
|
gcSerieProf = ALLTRIM(NVL(poDate.serie_act, ''))
|
|
glProformaEmisa = .T.
|
|
DO AfLog WITH "C1 PROFORMA emisa: id_vanzare=" + TRANSFORM(gnIdProf) + " serie=[" + gcSerieProf + "] numar=" + TRANSFORM(gnNrProf)
|
|
DO Assert WITH gnIdProf > 0, "proforma are id_vanzare real (" + TRANSFORM(gnIdProf) + ")"
|
|
DO Assert WITH QNum([select nvl(eproforma,0) as n from vanzari where id_vanzare = ] + TRANSFORM(gnIdProf), 'n') = 1, ;
|
|
"VANZARI.EPROFORMA = 1 pe documentul scris"
|
|
|
|
DO CurataDocument
|
|
ENDPROC
|
|
|
|
*==================================================================================
|
|
* C2-C4 - copierea proformei si emiterea documentului real
|
|
*==================================================================================
|
|
PROCEDURE TestC2C4_FacturaDinProforma
|
|
LOCAL loSursa, lnScris
|
|
gcCaz = "[C2 semnal copiere] "
|
|
|
|
IF gnIdProf <= 0
|
|
*-- fallback: o proforma deja emisa in MARIUSM_AUTO (C1 sarit). Se cere sa aiba linii, ca sa
|
|
*-- fie o sursa reala de copiere, si sa nu fie inca facturata.
|
|
gnIdProf = QNum([select nvl(max(v.id_vanzare),0) as n from vanzari v where v.sters = 0 ] + ;
|
|
[and nvl(v.eproforma,0) = 1 and nvl(v.facturat,0) = 0 ] + ;
|
|
[and exists (select 1 from vanzari_detalii d where d.id_vanzare = v.id_vanzare)], 'n')
|
|
IF gnIdProf <= 0
|
|
gnIdProf = QNum([select nvl(max(id_vanzare),0) as n from vanzari where sters = 0 ] + ;
|
|
[and nvl(eproforma,0) = 1 and nvl(facturat,0) = 0], 'n')
|
|
ENDIF
|
|
IF gnIdProf <= 0
|
|
gnIdProf = QNum([select nvl(max(id_vanzare),0) as n from vanzari where sters = 0 and nvl(eproforma,0) = 1], 'n')
|
|
ENDIF
|
|
IF gnIdProf <= 0
|
|
DO Sarit WITH "C2-C4 sarit: nu exista nicio proforma in schema"
|
|
RETURN
|
|
ENDIF
|
|
gnNrProf = QNum([select nvl(numar_act,0) as n from vanzari where id_vanzare = ] + TRANSFORM(gnIdProf), 'n')
|
|
DO AfLog WITH "C2 sursa = proforma EXISTENTA id_vanzare=" + TRANSFORM(gnIdProf) + " numar=" + TRANSFORM(gnNrProf) + ;
|
|
" tip=" + TRANSFORM(QNum([select nvl(tip,0) as n from vanzari where id_vanzare = ] + TRANSFORM(gnIdProf), 'n')) + ;
|
|
" linii=" + TRANSFORM(QNum([select count(*) as n from vanzari_detalii where id_vanzare = ] + TRANSFORM(gnIdProf), 'n')) + ;
|
|
" linii cu gestiune=" + TRANSFORM(QNum([select count(*) as n from vanzari_detalii where nvl(id_gestiune,0) > 0 ] + ;
|
|
[and id_vanzare = ] + TRANSFORM(gnIdProf), 'n'))
|
|
ENDIF
|
|
|
|
gnFacturatInainte = QNum([select nvl(facturat,0) as n from vanzari where id_vanzare = ] + TRANSFORM(gnIdProf), 'n')
|
|
DO AfLog WITH "C2 VANZARI.FACTURAT pe proforma, INAINTE = " + TRANSFORM(gnFacturatInainte)
|
|
|
|
loSursa = SursaProforma(gnIdProf)
|
|
IF ISNULL(loSursa)
|
|
DO Sarit WITH "C2-C4 sarit: nu s-a putut citi randul proformei din VANZARI"
|
|
RETURN
|
|
ENDIF
|
|
|
|
IF !PregatesteDocument(gnTipDoc, gnIdTipDocFact, loSursa)
|
|
DO Sarit WITH "C2-C4 sarit: pregatirea documentului copiat a esuat"
|
|
RETURN
|
|
ENDIF
|
|
|
|
DO Assert WITH poDate.lProformaSursa = .T., "poDate.lProformaSursa = .T. dupa completeaza_setari_document(sursa, .T.)"
|
|
DO Assert WITH poDate.nIdProformaSursa = gnIdProf, "poDate.nIdProformaSursa = " + TRANSFORM(gnIdProf) + ", e=" + TRANSFORM(poDate.nIdProformaSursa)
|
|
DO Assert WITH poDate.eProforma = 0, "documentul copiat NU e proforma (eProforma=0), e=" + TRANSFORM(poDate.eProforma)
|
|
|
|
gcCaz = "[C3 articole] "
|
|
DO Assert WITH RECCOUNT('crsfactura') > 0, "do_adauga_articol_cautat a produs linii in crsfactura (" + TRANSFORM(RECCOUNT('crsfactura')) + ")"
|
|
*-- proba directa a lui FACT-013 pe calea vie: cota se deriva din proc_tvav in do_adauga_articol_cautat
|
|
DO Assert WITH LiniiCu('id_jtva_coloana > 0') = RECCOUNT('crsfactura'), ;
|
|
"toate liniile au id_jtva_coloana > 0 (fara FACT-013), linii cu cota=" + TRANSFORM(LiniiCu('id_jtva_coloana > 0')) + ;
|
|
" din " + TRANSFORM(RECCOUNT('crsfactura'))
|
|
DO Assert WITH LiniiCu('cantitate > 0') = RECCOUNT('crsfactura'), ;
|
|
"toate liniile au cantitate > 0 dupa tastarea in grid, linii=" + TRANSFORM(LiniiCu('cantitate > 0'))
|
|
|
|
gcCaz = "[C4 do_scrie_factura] "
|
|
lnScris = ScrieDocument("C4 factura din proforma")
|
|
DO Assert WITH lnScris, "do_scrie_factura() a intors .T."
|
|
IF lnScris
|
|
gnIdFact = NVL(poDate.nid_vanzare, 0)
|
|
gnNrFact = NVL(poDate.nract, 0)
|
|
DO AfLog WITH "C4 document emis: id_vanzare=" + TRANSFORM(gnIdFact) + " serie=[" + ALLTRIM(NVL(poDate.serie_act,'')) + ;
|
|
"] numar=" + TRANSFORM(gnNrFact)
|
|
DO Assert WITH gnIdFact > 0 AND gnIdFact < 9999999999, "poDate.nid_vanzare e id real (" + TRANSFORM(gnIdFact) + ")"
|
|
ENDIF
|
|
|
|
*-- formularul si cursoarele se elibereaza, dar poDate RAMANE - C10 il refoloseste, ca bucla din factureaza
|
|
DO CurataFormular
|
|
ENDPROC
|
|
|
|
*==================================================================================
|
|
* C5-C8 - verificarile in Oracle
|
|
*==================================================================================
|
|
PROCEDURE TestC5C8_VerificariOracle
|
|
LOCAL lnEpro, lnNr, lnCoresp, lnFact, lnCant, lnSumaCant
|
|
IF gnIdFact <= 0
|
|
gcCaz = "[C5-C8] "
|
|
DO Sarit WITH "C5-C8 sarite: documentul din proforma nu s-a scris"
|
|
RETURN
|
|
ENDIF
|
|
|
|
gcCaz = "[C5 numar nou] "
|
|
lnEpro = QNum([select nvl(eproforma,0) as n from vanzari where id_vanzare = ] + TRANSFORM(gnIdFact), 'n')
|
|
lnNr = QNum([select nvl(numar_act,0) as n from vanzari where id_vanzare = ] + TRANSFORM(gnIdFact), 'n')
|
|
DO AfLog WITH "C5 VANZARI(" + TRANSFORM(gnIdFact) + "): eproforma=" + TRANSFORM(lnEpro) + " numar_act=" + TRANSFORM(lnNr) + ;
|
|
" (proforma avea numar_act=" + TRANSFORM(gnNrProf) + ")"
|
|
DO Assert WITH lnEpro = 0, "documentul emis NU e proforma (VANZARI.EPROFORMA = 0)"
|
|
DO Assert WITH lnNr > 0 AND lnNr <> gnNrProf, "documentul are numar propriu, diferit de al proformei"
|
|
|
|
gcCaz = "[C6 legatura TIP = 4] "
|
|
lnCoresp = QNum([select count(*) as n from vanzari_coresp where sters = 0 and tip = 4 and id_vanzare_fact = ] + ;
|
|
TRANSFORM(gnIdFact) + [ and id_vanzare_aviz = ] + TRANSFORM(gnIdProf), 'n')
|
|
DO AfLog WITH "C6 VANZARI_CORESP sters=0 tip=4 fact=" + TRANSFORM(gnIdFact) + " aviz=" + TRANSFORM(gnIdProf) + " -> " + TRANSFORM(lnCoresp)
|
|
DO Assert WITH lnCoresp = 1, "exact un rand TIP = 4 catre proforma sursa"
|
|
|
|
gcCaz = "[C7 proforma nemarcata FACTURAT] "
|
|
lnFact = QNum([select nvl(facturat,0) as n from vanzari where id_vanzare = ] + TRANSFORM(gnIdProf), 'n')
|
|
DO AfLog WITH "C7 VANZARI.FACTURAT pe proforma, DUPA = " + TRANSFORM(lnFact) + " (inainte " + TRANSFORM(gnFacturatInainte) + ")"
|
|
IF glProformaEmisa
|
|
DO Assert WITH lnFact = 0, "proforma NU e marcata FACTURAT (0 sau NULL)"
|
|
ELSE
|
|
DO AfLog WITH "C7 informativ: proforma imprumutata avea deja FACTURAT=" + TRANSFORM(gnFacturatInainte)
|
|
ENDIF
|
|
DO Assert WITH lnFact = gnFacturatInainte, "FACTURAT neschimbat de emiterea facturii"
|
|
|
|
gcCaz = "[C8 proforma nu misca stocul] "
|
|
lnCant = QNum([select count(*) as n from vanzari_cantitati vc, vanzari_detalii vd ] + ;
|
|
[where vc.id_vanzare_det = vd.id_vanzare_det and vd.id_vanzare = ] + TRANSFORM(gnIdProf), 'n')
|
|
DO AfLog WITH "C8 VANZARI_CANTITATI pe liniile proformei -> " + TRANSFORM(lnCant)
|
|
IF glProformaEmisa
|
|
DO Assert WITH lnCant = 0, "proforma nu are randuri in VANZARI_CANTITATI"
|
|
ELSE
|
|
DO AfLog WITH "C8 informativ (proforma nu a fost emisa de acest test)"
|
|
ENDIF
|
|
|
|
lnSumaCant = QNum([select nvl(sum(cantitate),0) as n from vanzari_detalii where id_vanzare = ] + TRANSFORM(gnIdFact), 'n')
|
|
DO AfLog WITH "C9a VANZARI_DETALII pe documentul emis: sum(cantitate) = " + TRANSFORM(lnSumaCant)
|
|
DO Assert WITH lnSumaCant > 0, "documentul emis are linii cu cantitate > 0"
|
|
ENDPROC
|
|
|
|
*==================================================================================
|
|
* C10 - al doilea document in aceeasi sesiune, pe ACELASI poDate dupa Reset(1)
|
|
*==================================================================================
|
|
PROCEDURE TestC10_Neregresie
|
|
LOCAL lnScris, lnCoresp
|
|
gcCaz = "[C10 neregresie semnal] "
|
|
IF gnIdFact <= 0
|
|
DO Sarit WITH "C10 sarit: documentul din proforma nu s-a scris"
|
|
RETURN
|
|
ENDIF
|
|
IF TYPE('poDate') <> 'O' OR ISNULL(poDate)
|
|
DO Sarit WITH "C10 sarit: poDate nu mai exista"
|
|
RETURN
|
|
ENDIF
|
|
|
|
*-- exact ce face bucla din factureaza (ofacturare.prg:428-441) la raspuns DA
|
|
poDate.Reset(1)
|
|
poDateGestiuneDest.Reset()
|
|
DO Assert WITH poDate.lProformaSursa = .F., "dupa Reset(1) lProformaSursa = .F., e=" + TRANSFORM(poDate.lProformaSursa)
|
|
DO Assert WITH poDate.nIdProformaSursa = 0, "dupa Reset(1) nIdProformaSursa = 0, e=" + TRANSFORM(poDate.nIdProformaSursa)
|
|
|
|
IF !PregatesteDocument(gnTipDoc, gnIdTipDocFact, NULL, .T.)
|
|
DO Sarit WITH "C10 sarit: pregatirea documentului de control a esuat"
|
|
RETURN
|
|
ENDIF
|
|
|
|
lnScris = ScrieDocument("C10 document de control")
|
|
IF !lnScris
|
|
DO Sarit WITH "C10 sarit: documentul de control nu s-a scris"
|
|
DO CurataDocument
|
|
RETURN
|
|
ENDIF
|
|
gnIdCtrl = NVL(poDate.nid_vanzare, 0)
|
|
DO AfLog WITH "C10 document de control emis: id_vanzare=" + TRANSFORM(gnIdCtrl) + " numar=" + TRANSFORM(NVL(poDate.nract,0))
|
|
|
|
lnCoresp = QNum([select count(*) as n from vanzari_coresp where tip = 4 and id_vanzare_fact = ] + TRANSFORM(gnIdCtrl), 'n')
|
|
DO AfLog WITH "C10 VANZARI_CORESP tip=4 fact=" + TRANSFORM(gnIdCtrl) + " -> " + TRANSFORM(lnCoresp)
|
|
DO Assert WITH lnCoresp = 0, "al doilea document NU primeste legatura TIP = 4 (semnalul e curatat de Reset)"
|
|
|
|
DO CurataDocument
|
|
ENDPROC
|
|
|
|
*==================================================================================
|
|
* C9 - paritatea profilului de gestiune intre documentul din proforma si cel de control
|
|
*==================================================================================
|
|
PROCEDURE TestC9_ParitateGestiune
|
|
LOCAL lnL1, lnL2, lnG1, lnG2, lnC1, lnC2
|
|
gcCaz = "[C9 gestiune, paritate] "
|
|
IF gnIdFact <= 0 OR gnIdCtrl <= 0
|
|
DO Sarit WITH "C9 sarit: lipseste unul dintre cele doua documente comparate"
|
|
RETURN
|
|
ENDIF
|
|
lnL1 = QNum([select count(*) as n from vanzari_detalii where id_vanzare = ] + TRANSFORM(gnIdFact), 'n')
|
|
lnL2 = QNum([select count(*) as n from vanzari_detalii where id_vanzare = ] + TRANSFORM(gnIdCtrl), 'n')
|
|
lnG1 = QNum([select count(*) as n from vanzari_detalii where nvl(id_gestiune,0) > 0 and id_vanzare = ] + TRANSFORM(gnIdFact), 'n')
|
|
lnG2 = QNum([select count(*) as n from vanzari_detalii where nvl(id_gestiune,0) > 0 and id_vanzare = ] + TRANSFORM(gnIdCtrl), 'n')
|
|
lnC1 = QNum([select nvl(sum(cantitate),0) as n from vanzari_detalii where id_vanzare = ] + TRANSFORM(gnIdFact), 'n')
|
|
lnC2 = QNum([select nvl(sum(cantitate),0) as n from vanzari_detalii where id_vanzare = ] + TRANSFORM(gnIdCtrl), 'n')
|
|
DO AfLog WITH "C9 din proforma (" + TRANSFORM(gnIdFact) + "): linii=" + TRANSFORM(lnL1) + " cu id_gestiune=" + TRANSFORM(lnG1) + ;
|
|
" sum(cantitate)=" + TRANSFORM(lnC1)
|
|
DO AfLog WITH "C9 de control (" + TRANSFORM(gnIdCtrl) + "): linii=" + TRANSFORM(lnL2) + " cu id_gestiune=" + TRANSFORM(lnG2) + ;
|
|
" sum(cantitate)=" + TRANSFORM(lnC2)
|
|
DO Assert WITH lnL1 = lnL2, "acelasi numar de linii ca documentul necopiat"
|
|
DO Assert WITH lnG1 = lnG2, "acelasi numar de linii cu id_gestiune ca documentul necopiat"
|
|
DO Assert WITH ABS(lnC1 - lnC2) < 0.0005, "aceeasi cantitate totala ca documentul necopiat"
|
|
ENDPROC
|
|
|
|
*==================================================================================
|
|
* Pregatirea unui document: poDate + serie/numar + articole + cursoare + formular
|
|
* toSursa <> NULL -> ramura de copiere din completeaza_setari_document
|
|
* tlRefolosestePoDate = .T. -> nu se creeaza poDate nou (C10, dupa Reset)
|
|
*==================================================================================
|
|
FUNCTION PregatesteDocument
|
|
LPARAMETERS tnTip, tnIdTipDoc, toSursa, tlRefolosestePoDate
|
|
LOCAL lnIdSet, lnArt, ldDoc, lnAdaugate
|
|
*-- frm_facturare_articole2.Init isi pune This.lCopiere din PARAMETRUL sau toFactura
|
|
*-- (ofacturare.vc2:20850 si :20915), iar factureaza il creeaza FARA parametru
|
|
*-- (ofacturare.prg:248) - deci pe v2 lCopiere ramane .F. si la copiere. Se reproduce identic.
|
|
lnIdSet = 25000 + tnTip - 1 + gnScadereStoc * 10
|
|
IF !tlRefolosestePoDate
|
|
poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip)
|
|
ELSE
|
|
poDate.id_set = lnIdSet
|
|
poDate.Tip = tnTip
|
|
ENDIF
|
|
|
|
poDate.nIdTipDoc = tnIdTipDoc
|
|
|
|
IF TYPE('toSursa') = 'O' AND !ISNULL(toSursa)
|
|
poDate.completeaza_setari_document(toSursa, .T.)
|
|
*-- nIdTipDoc se pastreaza: completeaza_setari_document nu il atinge pe ramura de copiere
|
|
poDate.nIdTipDoc = tnIdTipDoc
|
|
ENDIF
|
|
|
|
*-- la copiere clientul si delegatul vin din proforma; valorile de mai jos sunt doar plasa
|
|
IF EMPTY(NVL(poDate.id_client, 0))
|
|
poDate.id_client = 463
|
|
ENDIF
|
|
IF EMPTY(NVL(poDate.id_delegat, 0))
|
|
poDate.id_delegat = 256
|
|
ENDIF
|
|
|
|
*-- documentul se dateaza in luna deschisa a mediului
|
|
IF MONTH(poDate.Data) <> gnLuna OR YEAR(poDate.Data) <> gnAn
|
|
ldDoc = DATE(gnAn, gnLuna, MIN(DAY(poDate.Data), 28))
|
|
poDate.dataireg = ldDoc
|
|
poDate.dataact = ldDoc
|
|
poDate.datascad = ldDoc + 30
|
|
DO AfLog WITH " document datat in luna deschisa: " + DTOC(ldDoc)
|
|
ENDIF
|
|
*-- cursor_preturi refuza o zi fara curs EURO ("Nu este setat cursul din data de ...");
|
|
*-- se foloseste ultima zi acoperita de VCURS din luna deschisa
|
|
poDate.zi_curs = gdZiCurs
|
|
|
|
*-- gnIdUtil = 8 INAINTE de creeaza_cursor_serii (seriile sunt pe utilizator)
|
|
gnIdUtil = 8
|
|
poGeneratorNumere.ResetNumere()
|
|
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
|
|
DO AfLog WITH " creeaza_cursor_serii(" + TRANSFORM(poDate.nIdTipDoc) + ") -> rezultat_serii=" + TRANSFORM(poDate.rezultat_serii)
|
|
IF poDate.rezultat_serii = 3
|
|
poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc)
|
|
ENDIF
|
|
poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL)
|
|
poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract)
|
|
*-- gnIdUtil ramane 8: listele de preturi sunt pe utilizator, iar cu -3 cursor_preturi
|
|
*-- intoarce zero articole
|
|
DO AfLog WITH " serie_act=[" + TRANSFORM(NVL(poDate.serie_act,'')) + "] nract=" + TRANSFORM(NVL(poDate.nract,0))
|
|
IF EMPTY(NVL(poDate.nract, 0))
|
|
DO AfLog WITH " EROARE: nu s-a alocat numar de document"
|
|
RETURN .F.
|
|
ENDIF
|
|
|
|
USE IN (SELECT('jtva_coloane'))
|
|
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
|
|
|
|
DO LogJtva
|
|
lnArt = IncarcaArticole()
|
|
IF lnArt <= 0
|
|
DO AfLog WITH " EROARE: nu exista articole utilizabile"
|
|
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
|
|
RETURN .F.
|
|
ENDIF
|
|
DO AfLog WITH " crslinii5c Reccount=" + TRANSFORM(lnArt)
|
|
|
|
*-- crsfactura are nevoie de coloana "gestiune" (grd_factura.cGestiune e legat la ea); fara ea
|
|
*-- frm_facturare_articole2 agata la CREATEOBJECT pe combo-ul coloanei
|
|
creeaza_facturacrs([crsfactura])
|
|
SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE
|
|
USE IN crsfactura
|
|
SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE
|
|
USE IN crsfact_tmp
|
|
|
|
IF poDate.in_valuta = 1
|
|
SELECT DISTINCT Curs, nume_val, id_valuta, multiplicator FROM crsarticole WITH (Buffering = .T.) ;
|
|
WHERE tip_valuta = 1 ORDER BY nume_val INTO CURSOR crscursuri
|
|
SELECT crscursuri
|
|
poDate.Curs = Curs
|
|
poDate.multiplicator = multiplicator
|
|
ELSE
|
|
citeste_cursuri_zi(poDate.zi_curs)
|
|
IF USED('crscursuri') AND RECCOUNT('crscursuri') = 0
|
|
USE IN crscursuri
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF TYPE('crsarticole.nume_lista_preturi') <> 'U'
|
|
IF USED('crspolitici')
|
|
USE IN crspolitici
|
|
ENDIF
|
|
CREATE CURSOR crspolitici (id_pol N(20), nume_lista_preturi c(100))
|
|
INSERT INTO crspolitici(id_pol, nume_lista_preturi) VALUES (-9999, '<TOATE>')
|
|
INSERT INTO crspolitici(id_pol, nume_lista_preturi) ;
|
|
SELECT DISTINCT id_pol, nume_lista_preturi FROM crsarticole ORDER BY nume_lista_preturi
|
|
ENDIF
|
|
|
|
*-- pe traseul v2 din factureaza (ramura llFacturareNoua) crsarticole NU exista: formularul se
|
|
*-- deschide doar cu crsfactura, iar liniile se cauta in grid. Se inchide dupa ce crspolitici
|
|
*-- si crscursuri au fost construite, ca formularul sa vada exact ce vede in productie.
|
|
IF USED('crsarticole')
|
|
USE IN crsarticole
|
|
ENDIF
|
|
|
|
PUBLIC goFrm5c
|
|
goFrm5c = CREATEOBJECT('frm_facturare_articole2')
|
|
DO AfLog WITH " CREATEOBJECT frm_facturare_articole2 OK, VARTYPE=" + VARTYPE(goFrm5c) + ;
|
|
" lCopiere=" + TRANSFORM(goFrm5c.lCopiere)
|
|
goFrm5c.WindowType = 0
|
|
goFrm5c.Show()
|
|
DOEVENTS FORCE
|
|
DO AfLog WITH " formular afisat modeless"
|
|
|
|
lnAdaugate = AdaugaLiniiCautate(1)
|
|
DOEVENTS FORCE
|
|
DO AfLog WITH " linii adaugate prin do_adauga_articol_cautat: " + TRANSFORM(lnAdaugate) + ;
|
|
" -> Reccount(crsfactura)=" + TRANSFORM(RECCOUNT('crsfactura'))
|
|
DO LogLiniiFactura
|
|
goFrm5c.do_calculeaza_totaluri()
|
|
DOEVENTS FORCE
|
|
DO AfLog WITH " totaluri: nbazaron=" + TRANSFORM(goFrm5c.nbazaron) + " ntvaron=" + TRANSFORM(goFrm5c.ntvaron)
|
|
|
|
RETURN (RECCOUNT('crsfactura') > 0)
|
|
ENDFUNC
|
|
|
|
*==================================================================================
|
|
* Calea VIE de adaugare a liniilor pe frm_facturare_articole2 pentru tipurile din
|
|
* lista de preturi (1, 22, 5, 29, 7, 10, 45): cautare in grid, nu incarcare in masa.
|
|
* Reproduce exact grd_factura.cDenumire.cCboDenumire.LostFocus (ofacturare.vc2:21647):
|
|
* APPEND BLANK pe crsfactura (But_nou1 / do_adauga) -> SCATTER randul articolului ->
|
|
* do_adauga_articol_cautat(loArticol, loArticol.cantitate).
|
|
* Cantitatea se tasteaza apoi in grid: do_initializeaza_articol o zeroeaza pentru tipurile
|
|
* 1,2,5,6,22,23,29,41,7,10 (ofacturare.vc2:19692-19695), deci o scriem noi si recalculam
|
|
* linia ca in LostFocus-ul coloanelor de valori.
|
|
*==================================================================================
|
|
FUNCTION AdaugaLiniiCautate
|
|
LPARAMETERS tnCantitate
|
|
LOCAL lnAdaugate, loArticol, loArt, llOk
|
|
lnAdaugate = 0
|
|
IF !USED('crslinii5c') OR RECCOUNT('crslinii5c') = 0
|
|
DO AfLog WITH " AdaugaLiniiCautate: crslinii5c gol"
|
|
RETURN 0
|
|
ENDIF
|
|
SELECT crslinii5c
|
|
GO TOP
|
|
SCAN
|
|
SCATTER NAME loArticol MEMO
|
|
SELECT crsfactura
|
|
APPEND BLANK
|
|
llOk = .F.
|
|
TRY
|
|
llOk = goFrm5c.do_adauga_articol_cautat(loArticol, NVL(loArticol.cantitate, 1))
|
|
CATCH TO loExcAd
|
|
DO AfLog WITH " do_adauga_articol_cautat CATCH " + TRANSFORM(loExcAd.ErrorNo) + " " + ;
|
|
loExcAd.Message + " Line=" + TRANSFORM(loExcAd.LineNo)
|
|
ENDTRY
|
|
IF llOk
|
|
lnAdaugate = lnAdaugate + 1
|
|
SELECT crsfactura
|
|
REPLACE cantitate WITH tnCantitate
|
|
SCATTER NAME loArt MEMO
|
|
loArt = calculeaza_totaluri(loArt)
|
|
GATHER NAME loArt MEMO
|
|
ELSE
|
|
DO AfLog WITH " linia pentru id_articol=" + TRANSFORM(crslinii5c.id_articol) + " a fost refuzata"
|
|
SELECT crsfactura
|
|
IF !EOF() AND !BOF()
|
|
DELETE
|
|
ENDIF
|
|
ENDIF
|
|
SELECT crslinii5c
|
|
ENDSCAN
|
|
SELECT crsfactura
|
|
GO TOP
|
|
RETURN lnAdaugate
|
|
ENDFUNC
|
|
|
|
*-- do_scrie_factura, cu mock-ul reincarcat chiar inainte (SET PROCEDURE nu executa nimic, deci
|
|
*-- reincarcarea insasi nu poate deschide un dialog)
|
|
FUNCTION ScrieDocument
|
|
LPARAMETERS tcEticheta
|
|
LOCAL llScris, loAC
|
|
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE
|
|
*-- inainte_de_do_termin citeste gnButon; simpla atribuire il creeaza vizibil pentru apelati
|
|
gnButon = 1
|
|
pnButon = 1
|
|
llScris = .F.
|
|
|
|
*-- do_scrie_factura se cheama direct, ca in rularea precedenta, dar precedat de cele doua
|
|
*-- atribuiri pe care le face inainte_de_do_termin inainte de el (ofacturare.vc2:20684 si
|
|
*-- :20764): fara dataora_exp, scrie_factura2 primeste to_date('00000000000000') si Oracle
|
|
*-- raspunde ORA-01843. inainte_de_do_termin intreg NU se cheama: valideaza_antet deschide
|
|
*-- dialoguri modale de antet care au omorat procesul - ramane datorie deschisa.
|
|
loAC = NULL
|
|
TRY
|
|
loAC = goFrm5c.ActiveControl
|
|
CATCH TO loExcAC
|
|
DO AfLog WITH " " + tcEticheta + ": ActiveControl indisponibil (" + loExcAC.Message + ")"
|
|
ENDTRY
|
|
DO AfLog WITH " " + tcEticheta + ": ActiveControl VARTYPE=" + VARTYPE(loAC) + ;
|
|
IIF(VARTYPE(loAC) = 'O', " [" + loAC.Name + "]", "")
|
|
|
|
poDate.totalctva = goFrm5c.ntotalron
|
|
IF EMPTY(NVL(poDate.dataora_exp, {}))
|
|
poDate.dataora_exp = Get_Ora()
|
|
ENDIF
|
|
DO AfLog WITH " " + tcEticheta + ": apelez do_scrie_factura(), totalctva=" + ;
|
|
TRANSFORM(poDate.totalctva) + " dataora_exp=" + TRANSFORM(poDate.dataora_exp)
|
|
TRY
|
|
llScris = goFrm5c.do_scrie_factura()
|
|
CATCH TO loExcS
|
|
DO AfLog WITH " " + tcEticheta + ": CATCH ErrorNo=" + TRANSFORM(loExcS.ErrorNo) + " " + loExcS.Message + ;
|
|
" Proc=" + loExcS.Procedure + " Line=" + TRANSFORM(loExcS.LineNo)
|
|
ENDTRY
|
|
DOEVENTS FORCE
|
|
DO AfLog WITH " " + tcEticheta + ": do_scrie_factura() -> " + TRANSFORM(llScris) + ;
|
|
" poDate.nid_vanzare=" + TRANSFORM(NVL(poDate.nid_vanzare, 0))
|
|
IF !llScris
|
|
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
|
|
ENDIF
|
|
RETURN llScris
|
|
ENDFUNC
|
|
|
|
*-- articolele reale ale tipului curent
|
|
FUNCTION IncarcaArticole
|
|
LOCAL lcSql, lnSucces
|
|
lcSql = [{call ] + gcS + [.pack_facturare.cursor_preturi(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ;
|
|
[?poDate.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}]
|
|
IF USED('crsarticole')
|
|
USE IN crsarticole
|
|
ENDIF
|
|
lnSucces = goExecutor.oExecute(lcSql, [crsarticole])
|
|
IF lnSucces < 0
|
|
DO AfLog WITH " EROARE cursor_preturi: " + goExecutor.oPrelucrareEroare()
|
|
RETURN 0
|
|
ENDIF
|
|
IF RECCOUNT('crsarticole') = 0
|
|
RETURN 0
|
|
ENDIF
|
|
*-- crsarticole ramane intreg (crspolitici se construieste din el, ca in productie). Liniile
|
|
*-- documentului se aleg separat, in crslinii5c: cel mult doua, cu pret si cu cota de TVA
|
|
*-- prezenta in jtva_coloane - un articol fara cota duce la "Nu a fost gasita cota de TVA!
|
|
*-- (FACT-013)" in initializeaza_date_factura. Gestionabilele se incearca primele: numai ele
|
|
*-- pot proba clauza "descarca gestiunea normal".
|
|
IF USED('crslinii5c')
|
|
USE IN crslinii5c
|
|
ENDIF
|
|
SELECT TOP 2 a.* FROM crsarticole a INNER JOIN jtva_coloane j ;
|
|
ON ROUND((j.cota_tva + 100) / 100, 2) = ROUND(Nvl(a.proc_tvav,0), 2) ;
|
|
WHERE Nvl(a.gestionabil,0) = 1 AND Nvl(a.pret,0) > 0 ;
|
|
ORDER BY a.id_articol INTO CURSOR crslinii5c READWRITE
|
|
gcStrategieLinii = "gestionabile cu cota in jtva_coloane"
|
|
IF RECCOUNT('crslinii5c') = 0
|
|
USE IN crslinii5c
|
|
SELECT TOP 2 a.* FROM crsarticole a INNER JOIN jtva_coloane j ;
|
|
ON ROUND((j.cota_tva + 100) / 100, 2) = ROUND(Nvl(a.proc_tvav,0), 2) ;
|
|
WHERE Nvl(a.gestionabil,0) = 0 AND Nvl(a.pret,0) > 0 ;
|
|
ORDER BY a.id_articol INTO CURSOR crslinii5c READWRITE
|
|
gcStrategieLinii = "negestionabile cu cota in jtva_coloane"
|
|
ENDIF
|
|
IF RECCOUNT('crslinii5c') = 0
|
|
USE IN crslinii5c
|
|
SELECT TOP 2 * FROM crsarticole ORDER BY id_articol INTO CURSOR crslinii5c READWRITE
|
|
gcStrategieLinii = "primele doua din lista (nicio potrivire de cota)"
|
|
ENDIF
|
|
DO AfLog WITH " strategie linii: " + gcStrategieLinii
|
|
GO TOP IN crslinii5c
|
|
SCAN
|
|
DO AfLog WITH " linie: id_articol=" + TRANSFORM(crslinii5c.id_articol) + " [" + ;
|
|
ALLTRIM(TRANSFORM(crslinii5c.denumire)) + "] pret=" + TRANSFORM(crslinii5c.pret) + ;
|
|
" proc_tvav=" + TRANSFORM(crslinii5c.proc_tvav) + " gestionabil=" + TRANSFORM(crslinii5c.gestionabil)
|
|
ENDSCAN
|
|
GO TOP IN crslinii5c
|
|
RETURN RECCOUNT('crslinii5c')
|
|
ENDFUNC
|
|
|
|
*-- sonda read-only: cate articole intoarce cursor_preturi pentru un tip de operatie
|
|
FUNCTION ArticoleDisponibile
|
|
LPARAMETERS tnTip
|
|
LOCAL lnRez, lcSql, lnSucces, lnIdSet
|
|
PRIVATE poDateSonda
|
|
lnRez = 0
|
|
lnIdSet = 25000 + tnTip - 1 + gnScadereStoc * 10
|
|
poDateSonda = CREATEOBJECT("oDateFactura", lnIdSet, tnTip)
|
|
lcSql = [{call ] + gcS + [.pack_facturare.cursor_preturi(?gdZiCurs,?poDateSonda.tip,?poDateSonda.id_valuta,] + ;
|
|
[?poDateSonda.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}]
|
|
IF USED('crssonda')
|
|
USE IN crssonda
|
|
ENDIF
|
|
lnSucces = goExecutor.oExecute(lcSql, [crssonda])
|
|
IF lnSucces < 0
|
|
DO AfLog WITH " sonda articole tip " + TRANSFORM(tnTip) + " ESEC: " + goExecutor.oPrelucrareEroare()
|
|
ELSE
|
|
lnRez = RECCOUNT('crssonda')
|
|
ENDIF
|
|
IF USED('crssonda')
|
|
USE IN crssonda
|
|
ENDIF
|
|
RELEASE poDateSonda
|
|
RETURN lnRez
|
|
ENDFUNC
|
|
|
|
*-- obiect sursa echivalent cu SCATTER NAME loFactura MEMO din crsFacturi, pe randul proformei
|
|
FUNCTION SursaProforma
|
|
LPARAMETERS tnIdProf
|
|
LOCAL loSursa, lnQ
|
|
IF USED('crsprofsrc')
|
|
USE IN crsprofsrc
|
|
ENDIF
|
|
*-- randul se citeste din FACT_VFACTURI2, view-ul din spatele lui crsFacturi
|
|
*-- (oproceduri_facturare.prg:463): do_copiaza face SCATTER exact pe el, deci si numele
|
|
*-- clientului trebuie sa fie cel real - unul inventat schimba validarile de antet
|
|
lnQ = goExecutor.oExecute([select id_vanzare, nvl(eproforma,0) as eproforma, serie_act, numar_act, ] + ;
|
|
[id_part, client, id_lucrare, lucrare, id_sectie, sectie, id_agent, nume_agent, ] + ;
|
|
[id_delegat, delegat, bidelegat, cnpdelegat, nrinmat, id_masina, tip ] + ;
|
|
[from fact_vfacturi2 where id_vanzare = ] + TRANSFORM(tnIdProf), 'crsprofsrc')
|
|
IF lnQ < 0 OR !USED('crsprofsrc') OR RECCOUNT('crsprofsrc') = 0
|
|
DO AfLog WITH " view FACT_VFACTURI2 indisponibil (" + goExecutor.oPrelucrareEroare() + ;
|
|
"), revin la VANZARI"
|
|
lnQ = goExecutor.oExecute([select v.id_vanzare, nvl(v.eproforma,0) as eproforma, v.serie_act, v.numar_act, ] + ;
|
|
[v.id_part, ' ' as client, v.id_lucrare, ' ' as lucrare, v.id_sectie, ' ' as sectie, ] + ;
|
|
[v.id_agent, ' ' as nume_agent, v.id_delegat, ' ' as delegat, ' ' as bidelegat, ] + ;
|
|
[' ' as cnpdelegat, ' ' as nrinmat, v.id_masina, v.tip ] + ;
|
|
[from vanzari v where v.id_vanzare = ] + TRANSFORM(tnIdProf), 'crsprofsrc')
|
|
ENDIF
|
|
IF lnQ < 0 OR !USED('crsprofsrc') OR RECCOUNT('crsprofsrc') = 0
|
|
DO AfLog WITH " EROARE citire proforma sursa: " + goExecutor.oPrelucrareEroare()
|
|
RETURN NULL
|
|
ENDIF
|
|
SELECT crsprofsrc
|
|
GO TOP
|
|
loSursa = CREATEOBJECT('Empty')
|
|
AddProperty(loSursa, 'id_vanzare', crsprofsrc.id_vanzare)
|
|
AddProperty(loSursa, 'eproforma', crsprofsrc.eproforma)
|
|
AddProperty(loSursa, 'serie_act', NVL(crsprofsrc.serie_act, ''))
|
|
AddProperty(loSursa, 'numar_act', NVL(crsprofsrc.numar_act, 0))
|
|
AddProperty(loSursa, 'id_part', crsprofsrc.id_part)
|
|
AddProperty(loSursa, 'client', ALLTRIM(NVL(crsprofsrc.client, '')))
|
|
AddProperty(loSursa, 'id_lucrare', crsprofsrc.id_lucrare)
|
|
AddProperty(loSursa, 'lucrare', ALLTRIM(NVL(crsprofsrc.lucrare, '')))
|
|
AddProperty(loSursa, 'id_sectie', crsprofsrc.id_sectie)
|
|
AddProperty(loSursa, 'sectie', ALLTRIM(NVL(crsprofsrc.sectie, '')))
|
|
AddProperty(loSursa, 'id_agent', crsprofsrc.id_agent)
|
|
AddProperty(loSursa, 'nume_agent', ALLTRIM(NVL(crsprofsrc.nume_agent, '')))
|
|
AddProperty(loSursa, 'id_delegat', crsprofsrc.id_delegat)
|
|
AddProperty(loSursa, 'delegat', ALLTRIM(NVL(crsprofsrc.delegat, '')))
|
|
AddProperty(loSursa, 'BIdelegat', ALLTRIM(NVL(crsprofsrc.bidelegat, '')))
|
|
AddProperty(loSursa, 'CNPdelegat', ALLTRIM(NVL(crsprofsrc.cnpdelegat, '')))
|
|
AddProperty(loSursa, 'nrinmat', ALLTRIM(NVL(crsprofsrc.nrinmat, '')))
|
|
AddProperty(loSursa, 'id_masina', crsprofsrc.id_masina)
|
|
AddProperty(loSursa, 'tip', crsprofsrc.tip)
|
|
DO AfLog WITH " sursa proforma: id_vanzare=" + TRANSFORM(loSursa.id_vanzare) + " eproforma=" + TRANSFORM(loSursa.eproforma) + ;
|
|
" serie=[" + ALLTRIM(TRANSFORM(loSursa.serie_act)) + "] numar=" + TRANSFORM(loSursa.numar_act) + ;
|
|
" tip=" + TRANSFORM(loSursa.tip)
|
|
USE IN crsprofsrc
|
|
RETURN loSursa
|
|
ENDFUNC
|
|
|
|
PROCEDURE CurataFormular
|
|
IF TYPE('goFrm5c') = 'O' AND !ISNULL(goFrm5c)
|
|
TRY
|
|
goFrm5c.Release()
|
|
CATCH TO loExcR
|
|
DO AfLog WITH " Release formular: CATCH " + TRANSFORM(loExcR.ErrorNo) + " " + loExcR.Message
|
|
ENDTRY
|
|
ENDIF
|
|
goFrm5c = NULL
|
|
LOCAL lcC, lnI, laC[7]
|
|
laC[1] = 'crspolitici'
|
|
laC[2] = 'crscursuri'
|
|
laC[3] = 'crsfactura'
|
|
laC[4] = 'crsarticole'
|
|
laC[5] = 'crsfacturaset'
|
|
laC[6] = 'crsfacturafinala'
|
|
laC[7] = 'crslinii5c'
|
|
FOR lnI = 1 TO 7
|
|
lcC = laC[lnI]
|
|
IF USED(lcC)
|
|
USE IN (lcC)
|
|
ENDIF
|
|
ENDFOR
|
|
ENDPROC
|
|
|
|
PROCEDURE CurataDocument
|
|
DO CurataFormular
|
|
IF TYPE('poDate') = 'O' AND !ISNULL(poDate)
|
|
poDate = NULL
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
*==================================================================================
|
|
* Utilitare
|
|
*==================================================================================
|
|
PROCEDURE LogJtva
|
|
LOCAL lcCote
|
|
lcCote = ''
|
|
IF !USED('jtva_coloane')
|
|
DO AfLog WITH " jtva_coloane INEXISTENT"
|
|
RETURN
|
|
ENDIF
|
|
SELECT jtva_coloane
|
|
SCAN
|
|
lcCote = lcCote + ' ' + TRANSFORM(jtva_coloane.id_jtva_coloana) + '/' + ;
|
|
TRANSFORM(ROUND((jtva_coloane.cota_tva + 100) / 100, 2))
|
|
ENDSCAN
|
|
GO TOP IN jtva_coloane
|
|
DO AfLog WITH " jtva_coloane: " + TRANSFORM(RECCOUNT('jtva_coloane')) + " randuri (id/proc_tvav):" + lcCote
|
|
ENDPROC
|
|
|
|
*-- cate linii din crsfactura satisfac o conditie (expresie VFP peste campurile cursorului)
|
|
FUNCTION LiniiCu
|
|
LPARAMETERS tcCond
|
|
LOCAL lnR, lnN
|
|
IF !USED('crsfactura')
|
|
RETURN 0
|
|
ENDIF
|
|
lnN = 0
|
|
lnR = RECNO('crsfactura')
|
|
SELECT crsfactura
|
|
GO TOP
|
|
SCAN
|
|
IF EVALUATE(tcCond)
|
|
lnN = lnN + 1
|
|
ENDIF
|
|
ENDSCAN
|
|
IF BETWEEN(lnR, 1, RECCOUNT('crsfactura'))
|
|
GO lnR IN crsfactura
|
|
ENDIF
|
|
RETURN lnN
|
|
ENDFUNC
|
|
|
|
PROCEDURE LogLiniiFactura
|
|
LOCAL lnR
|
|
IF !USED('crsfactura')
|
|
RETURN
|
|
ENDIF
|
|
lnR = RECNO('crsfactura')
|
|
SELECT crsfactura
|
|
GO TOP
|
|
SCAN
|
|
DO AfLog WITH " crsfactura: id_articol=" + TRANSFORM(crsfactura.id_articol) + ;
|
|
" cantitate=" + TRANSFORM(crsfactura.cantitate) + ;
|
|
" pretftva=" + TRANSFORM(crsfactura.pretftva) + ;
|
|
" proc_tvav=" + TRANSFORM(crsfactura.proc_tvav) + ;
|
|
" id_jtva_coloana=" + TRANSFORM(crsfactura.id_jtva_coloana) + ;
|
|
" id_gestiune=" + TRANSFORM(crsfactura.id_gestiune)
|
|
ENDSCAN
|
|
IF BETWEEN(lnR, 1, RECCOUNT('crsfactura'))
|
|
GO lnR IN crsfactura
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROCEDURE AfLog
|
|
LPARAMETERS tcMsg
|
|
SET SAFETY OFF
|
|
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
|
|
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcUILog, 1)
|
|
ENDPROC
|
|
|
|
PROCEDURE AfErr
|
|
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
|
|
DO AfLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + TRANSFORM(tcProg) + ':' + TRANSFORM(tnLine) + '] ' + TRANSFORM(tcMsg)
|
|
ENDPROC
|
|
|
|
PROCEDURE Assert
|
|
LPARAMETERS tlCond, tcMsg
|
|
IF tlCond
|
|
gnPass = gnPass + 1
|
|
DO AfLog WITH 'PASS: ' + gcCaz + tcMsg
|
|
ELSE
|
|
gnFail = gnFail + 1
|
|
DO AfLog WITH 'FAIL: ' + gcCaz + tcMsg
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROCEDURE Sarit
|
|
LPARAMETERS tcMsg
|
|
gnSarit = gnSarit + 1
|
|
DO AfLog WITH 'SARIT: ' + gcCaz + tcMsg
|
|
ENDPROC
|
|
|
|
PROCEDURE Final
|
|
DO AfLog WITH ''
|
|
DO AfLog WITH 'DOCUMENTE CONSUMATE: proforma id_vanzare=' + TRANSFORM(gnIdProf) + ' numar=' + TRANSFORM(gnNrProf) + ;
|
|
' | din proforma id_vanzare=' + TRANSFORM(gnIdFact) + ' numar=' + TRANSFORM(gnNrFact) + ;
|
|
' | control id_vanzare=' + TRANSFORM(gnIdCtrl)
|
|
DO AfLog WITH 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + ' sarit=' + TRANSFORM(gnSarit)
|
|
DO AfLog WITH 'END ' + TTOC(DATETIME())
|
|
DO HarnessDone WITH 'gata pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + ' sarit=' + TRANSFORM(gnSarit)
|
|
QUIT
|
|
ENDPROC
|
|
|
|
*-- ultima zi din luna deschisa acoperita de VCURS pentru EURO; cursor_preturi refuza o zi fara curs
|
|
FUNCTION DataCursValid
|
|
LOCAL ldRez, lcSql, lnQ, lcUltima
|
|
ldRez = DATE(gnAn, gnLuna, 1)
|
|
lcUltima = TRANSFORM(gnAn) + PADL(TRANSFORM(gnLuna), 2, '0') + '01'
|
|
IF USED('crscurszi')
|
|
USE IN crscurszi
|
|
ENDIF
|
|
lcSql = [select to_char(max(data),'YYYYMMDD') as d from vcurs ] + ;
|
|
[where upper(nume_val) = 'EURO' and data <= last_day(to_date('] + lcUltima + [','YYYYMMDD'))]
|
|
lnQ = goExecutor.oExecute(lcSql, 'crscurszi')
|
|
IF lnQ >= 0 AND USED('crscurszi') AND RECCOUNT('crscurszi') > 0
|
|
GO TOP IN crscurszi
|
|
IF !ISNULL(crscurszi.d) AND LEN(ALLTRIM(crscurszi.d)) = 8
|
|
ldRez = CTOD(SUBSTR(crscurszi.d,7,2) + '/' + SUBSTR(crscurszi.d,5,2) + '/' + SUBSTR(crscurszi.d,1,4))
|
|
ENDIF
|
|
ELSE
|
|
DO AfLog WITH " DataCursValid ESEC: " + goExecutor.oPrelucrareEroare()
|
|
ENDIF
|
|
IF USED('crscurszi')
|
|
USE IN crscurszi
|
|
ENDIF
|
|
RETURN ldRez
|
|
ENDFUNC
|
|
|
|
*-- cate randuri de plaja intoarce verifica_cursor_serii pentru un tip de document, fara sa aloce
|
|
FUNCTION RanduriSerii
|
|
LPARAMETERS tnIdTipDoc
|
|
LOCAL lnOk, lnRanduri, lcSql
|
|
LOCAL ARRAY laErr[1]
|
|
PRIVATE pnIdTipDoc, pnRezultat
|
|
pnIdTipDoc = tnIdTipDoc
|
|
pnRezultat = 0
|
|
lnRanduri = -1
|
|
lcSql = "{call " + gcS + ".pack_serii_numere.verifica_cursor_serii(?pnIdTipDoc,?gnIdUtil,?gnIdSucursala,?@pnRezultat)}"
|
|
lnOk = SQLEXEC(gnHandle, lcSql, "crsprobapl")
|
|
IF lnOk > 0
|
|
lnRanduri = RECCOUNT("crsprobapl")
|
|
USE IN (SELECT("crsprobapl"))
|
|
ELSE
|
|
AERROR(laErr)
|
|
DO AfLog WITH ' sonda plaje tip ' + TRANSFORM(tnIdTipDoc) + ' ESEC: ' + TRANSFORM(laErr[2])
|
|
ENDIF
|
|
RETURN lnRanduri
|
|
ENDFUNC
|
|
|
|
*-- interogare scalara; -999999 = esec
|
|
FUNCTION QNum
|
|
LPARAMETERS tcSql, tcCamp
|
|
LOCAL lnQ, lnVal
|
|
lnVal = -999999
|
|
IF USED('crsq5c')
|
|
USE IN crsq5c
|
|
ENDIF
|
|
lnQ = goExecutor.oExecute(tcSql, 'crsq5c')
|
|
IF lnQ >= 0 AND USED('crsq5c') AND RECCOUNT('crsq5c') > 0
|
|
GO TOP IN crsq5c
|
|
lnVal = NVL(EVALUATE('crsq5c.' + tcCamp), 0)
|
|
ELSE
|
|
DO AfLog WITH ' QNum ESEC [' + tcSql + '] -> ' + goExecutor.oPrelucrareEroare()
|
|
ENDIF
|
|
IF USED('crsq5c')
|
|
USE IN crsq5c
|
|
ENDIF
|
|
RETURN lnVal
|
|
ENDFUNC
|
|
|
|
*==================================================================================
|
|
*-- driverModal5c: apasa automat Da/OK pe formularele modale proprii (MESSAGEBOX_FORM),
|
|
*-- care nu trec prin amessagebox si deci nu sunt acoperite de mock
|
|
DEFINE CLASS driverModal5c AS Custom
|
|
nUltimTick = 0
|
|
nUltimPuls = 0
|
|
nUltimStrain = 0
|
|
nApasari = 0
|
|
nAcelasi = 0
|
|
cUltimText = ''
|
|
|
|
PROCEDURE Executa
|
|
LOCAL lnI, loMsgForm, loStrain, lcClasa, lcTxt, llGata
|
|
TRY
|
|
llGata = .F.
|
|
loMsgForm = NULL
|
|
loStrain = NULL
|
|
FOR lnI = 1 TO _SCREEN.FormCount
|
|
lcClasa = UPPER(_SCREEN.Forms(lnI).Class)
|
|
IF 'MESSAGEBOX_FORM' $ lcClasa
|
|
loMsgForm = _SCREEN.Forms(lnI)
|
|
EXIT
|
|
ENDIF
|
|
IF !('FRM_FACTURARE_ARTICOLE2' $ lcClasa) AND ISNULL(loStrain)
|
|
loStrain = _SCREEN.Forms(lnI)
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
*-- formular strain blocant (ex. "Do Form verificare", ofacturare.vc2:20242): in productie
|
|
*-- operatorul il inchide cu Termin. Se face acelasi lucru: gnButon = 1 + Release.
|
|
IF ISNULL(loMsgForm) AND !ISNULL(loStrain) AND (SECONDS() - This.nUltimStrain > 3)
|
|
This.nUltimStrain = SECONDS()
|
|
DO AfLog WITH ' [timer] formular strain Class=[' + loStrain.Class + '] Name=[' + ;
|
|
loStrain.Name + '] Caption=[' + TRANSFORM(loStrain.Caption) + '] -> gnButon=1, Release'
|
|
gnButon = 1
|
|
pnButon = 1
|
|
loStrain.Release()
|
|
ENDIF
|
|
*-- puls: daca timerul inceteaza sa mai scrie, blocajul e intr-un dialog nativ care
|
|
*-- opreste bucla de evenimente, nu intr-un MESSAGEBOX_FORM
|
|
IF SECONDS() - This.nUltimPuls > 5
|
|
This.nUltimPuls = SECONDS()
|
|
lcTxt = ''
|
|
FOR lnI = 1 TO _SCREEN.FormCount
|
|
lcTxt = lcTxt + ' ' + _SCREEN.Forms(lnI).Class
|
|
ENDFOR
|
|
DO AfLog WITH ' [timer] puls FormCount=' + TRANSFORM(_SCREEN.FormCount) + lcTxt
|
|
ENDIF
|
|
*-- fara RETURN: in VFP, RETURN in interiorul unui TRY da eroarea 2060
|
|
IF ISNULL(loMsgForm) OR (SECONDS() - This.nUltimTick < 1.5)
|
|
llGata = .T.
|
|
ENDIF
|
|
IF !llGata
|
|
*-- racire de 1.5s: apasarile la 200ms reintra in Boton_Click pe un formular deja
|
|
*-- in curs de inchidere si omoara procesul vfp9
|
|
This.nUltimTick = SECONDS()
|
|
This.nApasari = This.nApasari + 1
|
|
lcTxt = ''
|
|
IF PEMSTATUS(loMsgForm, 'edtMensaje', 5)
|
|
lcTxt = LEFT(STRTRAN(STRTRAN(TRANSFORM(loMsgForm.edtMensaje.Value), CHR(13), ' '), CHR(10), ' '), 300)
|
|
ENDIF
|
|
DO AfLog WITH ' [timer] modal #' + TRANSFORM(This.nApasari) + ' Caption=[' + ;
|
|
TRANSFORM(loMsgForm.Caption) + '] text=[' + lcTxt + ']'
|
|
IF lcTxt == This.cUltimText
|
|
This.nAcelasi = This.nAcelasi + 1
|
|
ELSE
|
|
This.nAcelasi = 1
|
|
This.cUltimText = lcTxt
|
|
ENDIF
|
|
DO CASE
|
|
CASE This.nApasari > 40
|
|
DO AfLog WITH ' [timer] peste 40 de dialoguri modale - opresc driverul'
|
|
_SCREEN.tmrDrv5c.Enabled = .F.
|
|
CASE This.nAcelasi > 3
|
|
DO AfLog WITH ' [timer] acelasi dialog de ' + TRANSFORM(This.nAcelasi) + ' ori - Hide()'
|
|
loMsgForm.Hide()
|
|
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5)
|
|
loMsgForm.cmgBotones.cmdYes.Click()
|
|
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5)
|
|
loMsgForm.cmgBotones.cmdOk.Click()
|
|
ENDCASE
|
|
ENDIF
|
|
CATCH TO loExcMsg
|
|
DO AfLog WITH ' [timer] CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message
|
|
ENDTRY
|
|
ENDPROC
|
|
ENDDEFINE
|