Files
comun/utile/Teste/facturare_unificat/test_s5c_emitere_reala_ui.prg
Marius Mutu 8e022d332e #13: formular de facturare unificat - etapa curenta
Squash al branch-ului de lucru plan13-s2.

Clase: ofacturare (nucleul formularului unificat), ofacturare_comun,
ferestre_cere_date, ocomenzi, caut_ora (lista de preturi in combo-urile de
cautare), omodificari.

Programe: ofacturare impartit - ofacturare_antet, ofacturare_rutare_scriere si
ogrid_latimi sunt fisiere noi; oproceduri_facturare primeste discountul pe linie
si cota standard de TVA cand articolul nu are cota pe politica.

Documentatie: capcana SQLExec no_data_found, conventia de encoding, depanarea
testelor VFP si regulile de lucru - conflictele cu modificarile venite din alte
proiecte sunt rezolvate pastrand ambele parti.

Loguri de rulare a testelor scoase din versionare; testele raman.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PkyjGyrV2S7932om4kfSiK
2026-09-09 21:38:25 +03:00

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