Files
comun/utile/Teste/facturare_unificat/test_s3b_paritate_emitere.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

591 lines
25 KiB
Plaintext

* test_s3b_paritate_emitere.prg
* Headless: criteriul 1 de "gata" din docs\cercetare\s3b_alte_date_analitice.md sectiunea 10 -
* paritate de EMITERE intre calea veche (frm_alte_date, dialogul modal creat de
* frm_facturare_articole.inainte_de_do_termin, ofacturare.vc2:14923) si formularul unificat
* (frm_facturare_articole2, care are grupul de incasare inline), pe toate patru tipurile de
* incasare: 1=Fara incasare, 2=Chitanta, 3=Bon fiscal, 4=POS Card.
*
* Se compara doua marimi, cerute explicit de criteriu:
* (a) numarul alocat -> poDate.nr_incasare, scris de actualizeaza_tipincasare (ramurile 1/2:
* nr_incasare=0; ramura 3: do_aloca_nr_bon; ramura 4: do_aloca_nr_pos) si de ControlSource-ul
* clb_nrchit.text_simplu1 ("poDate.nr_incasare", ofacturare.vc2:16558 /
* ferestre_cere_date.vc2:2490);
* (b) lcListaIncasare - stringul asamblat in do_scrie_factura inainte de scrie_factura2
* (ofacturare.vc2:14227-14253 pentru calea veche, 19967-19993 pentru cea noua).
*
* De ce lcListaIncasare se calculeaza cu o REPLICA, nu prin apelul codului real:
* lcListaIncasare e o variabila LOCAL in do_scrie_factura, iar do_scrie_factura EMITE documentul
* (scrie in Oracle). Testul nu are voie sa emita. In loc de asta:
* - blocul de asamblare din cele doua do_scrie_factura e comparat CA TEXT, in test, si trebuie sa
* fie identic (assert dedicat);
* - replica din acest fisier (intre marcajele REPLICA-LISTA) e comparata CA TEXT cu blocul din
* sursa, dupa normalizare (fara comentarii && , fara spatii de indentare, fara linii goale) -
* assert dedicat. Daca sursa se schimba si replica nu, testul cade.
* La fel pentru pasul de emitere dinaintea lui do_scrie_factura: poDate.ntip_incasare se calculeaza
* din opt_incasat.Value cu aceeasi expresie pe ambele cai (ferestre_cere_date.vc2:3067 in
* frm_alte_date.inainte_de_do_termin, ofacturare.vc2:20673 in
* frm_facturare_articole2.inainte_de_do_termin) - cele doua linii sunt comparate ca text.
* Comutarea POS (incasatCARD = incasat; incasat = 0) e ferestre_cere_date.vc2:3100-3104 respectiv
* ofacturare.vc2:20680-20683 - aceleasi doua atribuiri, sub garzi echivalente (plReturn / gnButon).
*
* SECVENTIAL, nu simultan: frm_alte_date e creata, parcursa pe toate patru tipurile si eliberata
* COMPLET inainte sa existe frm_facturare_articole2. Ambele forme au propriul cboTipFactura cu
* RowSource identic ("... into cursor cTipFacturaX", ofacturare.vc2:16157 si
* ferestre_cere_date.vc2:2388), reevaluat la fiecare actualizeaza_tipincasare - doua forme vii
* simultan se bat pe acelasi nume de cursor. Acelasi poDate pentru ambele faze, cu starea
* restaurata explicit intre faze.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3b_paritate_emitere.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3b_paritate_emitere.log
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gcSursaNou, gcSursaVechi, gcAcestFisier, glPOSDisponibil
glPOSDisponibil = .F.
gcAcestFisier = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3b_paritate_emitere.prg"
gcSursaNou = "D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2"
gcSursaVechi = "D:\ROA\ROAFACTURARE\COMUN\clase\ferestre_cere_date.vc2"
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3b_paritate_emitere.log"
IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out")
MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out"
ENDIF
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog)
gnFail = 0
gnPass = 0
ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
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
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE
PUBLIC gcMockUltimMesaj, gnMockUltimTip
gcMockUltimMesaj = ""
gnMockUltimTip = 0
DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna)
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
gnScadereStoc = 0
gnIdUtil = 8
* singura plaja pentru tipul 26 e legata de sucursala 167; mediul lasa gnIdSucursala pe 110 (sau
* null), iar filtrul NVL(id_sucursala,-99) IN (v_id_sucursala,-99) din pack_serii_numere nu o prinde
gnIdSucursala = 167
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
DO AfLog WITH "gnScadereStoc=" + TRANSFORM(gnScadereStoc) + " gnPc=" + TRANSFORM(gnPc) + ;
" gnIdUtil=" + TRANSFORM(gnIdUtil) + " gnIdSucursala=" + TRANSFORM(gnIdSucursala)
* fara asta, un lacat pe plajele de serii blocheaza rularea la infinit, invizibil in log
SQLSETPROP(gnHandle, "QueryTimeOut", 45)
IF TYPE('goExecutor.nHandle') = 'N' AND goExecutor.nHandle > 0 AND goExecutor.nHandle <> gnHandle
SQLSETPROP(goExecutor.nHandle, "QueryTimeOut", 45)
ENDIF
DO AfLog WITH "QueryTimeOut gnHandle=" + TRANSFORM(SQLGETPROP(gnHandle, "QueryTimeOut")) + ;
" goExecutor.nHandle=" + TRANSFORM(goExecutor.nHandle)
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE
IF USED('crscursuri')
USE IN crscursuri
ENDIF
CREATE CURSOR crscursuri (curs N(12,4), nume_val C(10), multiplicator N(6))
DO creeaza_facturacrs WITH '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
DO ProbaTextSursa
DO ProbaParitateEmitere
DO Final
*=====================================================================================
* Partea 1 - aserturile pe TEXTUL sursei: cele doua cai asambleaza identic, si replica
* din acest fisier e identica cu sursa.
*=====================================================================================
PROCEDURE ProbaTextSursa
LOCAL lcAncora, lnCate, i
LOCAL ARRAY laSursa[1], laPoz[1]
IF !FILE(gcSursaNou)
DO Assert WITH .F., "sursa " + gcSursaNou + " exista"
RETURN
ENDIF
lnCate = ALINES(laSursa, FILETOSTR(gcSursaNou), 0)
DO AfLog WITH "ofacturare.vc2: " + TRANSFORM(lnCate) + " linii"
* blocul de asamblare incepe cu acest If si tine pana la Endif-ul de dupa lcListaIncasare = [NULL]
lcAncora = "IF INLIST(PODATE.NTIP_INCASARE, 11, 2, 3)"
DIMENSION laPoz[2]
laPoz[1] = 0
laPoz[2] = 0
LOCAL lnGasit
lnGasit = 0
FOR i = 1 TO lnCate
IF UPPER(NormalizeazaLinie(laSursa[i])) == lcAncora
lnGasit = lnGasit + 1
IF lnGasit <= 2
laPoz[lnGasit] = i
ENDIF
ENDIF
ENDFOR
DO AfLog WITH "ancora blocului de asamblare gasita de " + TRANSFORM(lnGasit) + " ori, la liniile " + ;
TRANSFORM(laPoz[1]) + " si " + TRANSFORM(laPoz[2])
DO Assert WITH lnGasit = 2, "blocul lcListaIncasare apare exact de doua ori in ofacturare.vc2 (calea veche + calea noua)"
IF lnGasit <> 2
RETURN
ENDIF
LOCAL lcA, lcB, lcRep
lcA = ExtrageBloc(gcSursaNou, laPoz[1], 30)
lcB = ExtrageBloc(gcSursaNou, laPoz[2], 30)
DO AfLog WITH "bloc vechi (ofacturare.vc2:" + TRANSFORM(laPoz[1]) + ") normalizat, " + TRANSFORM(LEN(lcA)) + " octeti"
DO AfLog WITH "bloc nou (ofacturare.vc2:" + TRANSFORM(laPoz[2]) + ") normalizat, " + TRANSFORM(LEN(lcB)) + " octeti"
DO Assert WITH lcA == lcB, "asamblarea lcListaIncasare e identica in do_scrie_factura al celor doua cai"
IF !(lcA == lcB)
DO AfLog WITH "vechi=[" + lcA + "]"
DO AfLog WITH "nou =[" + lcB + "]"
ENDIF
* replica din acest fisier, intre marcaje, trebuie sa fie aceeasi bucata de cod
lcRep = ExtrageIntreMarcaje(gcAcestFisier, "*--REPLICA-LISTA-START--*", "*--REPLICA-LISTA-END--*")
DO AfLog WITH "replica din test normalizata, " + TRANSFORM(LEN(lcRep)) + " octeti"
DO Assert WITH lcRep == lcB, "replica ListaIncasare() din test e identica cu blocul din sursa"
IF !(lcRep == lcB)
DO AfLog WITH "replica=[" + lcRep + "]"
DO AfLog WITH "sursa =[" + lcB + "]"
ENDIF
* linia care calculeaza ntip_incasare din opt_incasat.Value, pe ambele cai
LOCAL lcNtipNou, lcNtipVechi, lcNtipVechiNorm
lcNtipNou = CautaLinie(gcSursaNou, "PODATE.NTIP_INCASARE = IIF(")
lcNtipVechi = CautaLinie(gcSursaVechi, "PODATE.NTIP_INCASARE = IIF(")
* calea noua citeste modul de incasare prin nmod_incasare(), nu direct opt_incasat.Value (container ct_incasare)
lcNtipVechiNorm = STRTRAN(lcNtipVechi, "THISFORM.OPT_INCASAT.VALUE", "THISFORM.NMOD_INCASARE()")
DO AfLog WITH "ntip nou =[" + lcNtipNou + "]"
DO AfLog WITH "ntip vechi =[" + lcNtipVechi + "] normalizat=[" + lcNtipVechiNorm + "]"
DO Assert WITH !EMPTY(lcNtipNou) AND lcNtipNou == lcNtipVechiNorm, ;
"expresia poDate.ntip_incasare = Iif(opt_incasat.Value...) e identica pe ambele cai"
ENDPROC
*=====================================================================================
* Partea 2 - proba de runtime, pe cele doua forme, secvential
*=====================================================================================
PROCEDURE ProbaParitateEmitere
PRIVATE poDate, poGeneratorNumere, loVechi, loNou, i
LOCAL laTip[4], laNume[4], laVechi[4,4], laNou[4,4]
laTip[1] = 1
laTip[2] = 2
laTip[3] = 3
laTip[4] = 4
laNume[1] = "Fara incasare"
laNume[2] = "Chitanta"
laNume[3] = "Bon fiscal"
laNume[4] = "POS Card"
poDate = CREATEOBJECT("oDateFactura", 25000, 1)
poDate.nIdTipDoc = 5
poDate.totalctva = 1000
DO AfLog WITH "poDate.tip=" + TRANSFORM(poDate.tip) + " poDate.eProforma=" + TRANSFORM(poDate.eProforma) + ;
" poDate.incasat=" + TRANSFORM(poDate.incasat) + " poDate.nract=" + TRANSFORM(poDate.nract)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poGeneratorNumere.ResetNumere()
DO ProbaSerii WITH poDate.nIdTipDoc
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
* tipul 26 (POS/card) nu are plaje in acest mediu la fiecare rulare; fara pre-proba,
* do_aloca_nr_pos blocheaza rularea in interiorul apelului Oracle, fara nimic in log
LOCAL lnRandPOS
lnRandPOS = RanduriSerii(26)
glPOSDisponibil = (lnRandPOS > 0)
DO AfLog WITH "pre-proba plaje: tip 3 randuri=" + TRANSFORM(RanduriSerii(3)) + ;
" tip 16 randuri=" + TRANSFORM(RanduriSerii(16)) + " tip 26 randuri=" + TRANSFORM(lnRandPOS) + ;
" -> POS " + IIF(glPOSDisponibil, "probabil", "NEPROBABIL in acest mediu")
LOCAL lnStartIncasat, lnStartCard, lnStartTichete, lnStartCasa, lnStartTipInc, lnStartNrInc, lnStartPos
lnStartIncasat = poDate.incasat
lnStartCard = poDate.incasatCARD
lnStartTichete = poDate.incasatTichete
lnStartCasa = poDate.id_casa
lnStartTipInc = poDate.ntip_incasare
lnStartNrInc = poDate.nr_incasare
lnStartPos = poDate.nIncasatPos
DO AfLog WITH "stare start poDate: incasat=" + TRANSFORM(lnStartIncasat) + " incasatCARD=" + TRANSFORM(lnStartCard) + ;
" incasatTichete=" + TRANSFORM(lnStartTichete) + " id_casa=" + TRANSFORM(lnStartCasa) + ;
" ntip_incasare=" + TRANSFORM(lnStartTipInc) + " nr_incasare=" + TRANSFORM(lnStartNrInc) + ;
" nIncasatPos=" + TRANSFORM(lnStartPos)
LOCAL lnTip, lcNumeTip
* ---------- FAZA 1: calea veche - frm_alte_date ----------
DO AsiguraSaftTipFacturi
loVechi = CREATEOBJECT('frm_alte_date')
DO Assert WITH VARTYPE(loVechi) = 'O', "Createobject frm_alte_date (calea veche)"
IF VARTYPE(loVechi) <> 'O'
RETURN
ENDIF
loVechi.Visible = .F.
loVechi.nnrbon = poDate.nract
FOR i = 1 TO 4
lnTip = laTip[i]
lcNumeTip = laNume[i]
IF lnTip = 4 AND !glPOSDisponibil
DO AfLog WITH "vechi [" + lcNumeTip + "]: SARIT - nu exista plaje de serii pentru tipul 26 in acest mediu"
LOOP
ENDIF
loVechi.opt_incasat.Value = lnTip
DO AfLog WITH "vechi [" + lcNumeTip + "]: dupa opt_incasat.Value=" + TRANSFORM(lnTip) + ;
" nr_incasare=" + TRANSFORM(poDate.nr_incasare) + " incasat=" + TRANSFORM(poDate.incasat) + ;
" incasatCARD=" + TRANSFORM(poDate.incasatCARD) + " id_casa=" + TRANSFORM(poDate.id_casa) + ;
" nIncasatPos=" + TRANSFORM(poDate.nIncasatPos) + " nnrbon=" + TRANSFORM(loVechi.nnrbon) + ;
" numere=" + StareToate()
laVechi[i,1] = poDate.nr_incasare
DO AplicaTermin WITH loVechi.opt_incasat.Value
laVechi[i,2] = poDate.ntip_incasare
laVechi[i,3] = ListaIncasare()
laVechi[i,4] = "incasat=" + TRANSFORM(poDate.incasat) + "|card=" + TRANSFORM(poDate.incasatCARD) + ;
"|tichete=" + TRANSFORM(poDate.incasatTichete) + "|casa=" + TRANSFORM(poDate.id_casa)
DO AfLog WITH "vechi [" + lcNumeTip + "]: dupa emitere ntip_incasare=" + TRANSFORM(laVechi[i,2]) + ;
" nr_incasare=" + TRANSFORM(laVechi[i,1]) + " campuri=" + laVechi[i,4]
DO AfLog WITH "vechi [" + lcNumeTip + "]: lcListaIncasare=[" + laVechi[i,3] + "]"
* dezaloca si readu campurile la starea de start, ca tipul urmator sa porneasca identic
loVechi.opt_incasat.Value = 1
poDate.incasatCARD = lnStartCard
poDate.incasatTichete = lnStartTichete
DO AfLog WITH "vechi [" + lcNumeTip + "]: dezalocat, numere=" + StareToate()
DO Assert WITH !EsteAlocat(3) AND !EsteAlocat(16) AND !EsteAlocat(26), ;
"vechi [" + lcNumeTip + "] nimic alocat dupa comutarea inapoi pe Fara incasare (" + StareToate() + ")"
ENDFOR
loVechi.Release()
RELEASE loVechi
DO AfLog WITH "dupa Release loVechi: USED('saft_tip_facturi')=" + TRANSFORM(USED('saft_tip_facturi')) + ;
" USED('cTipFacturaX')=" + TRANSFORM(USED('cTipFacturaX'))
poDate.incasat = lnStartIncasat
poDate.incasatCARD = lnStartCard
poDate.incasatTichete = lnStartTichete
poDate.id_casa = lnStartCasa
poDate.ntip_incasare = lnStartTipInc
poDate.nr_incasare = lnStartNrInc
poDate.nIncasatPos = lnStartPos
DO AfLog WITH "poDate resetat inainte de faza 2: incasat=" + TRANSFORM(poDate.incasat) + ;
" nr_incasare=" + TRANSFORM(poDate.nr_incasare) + " numere=" + StareToate()
* ---------- FAZA 2: calea noua - frm_facturare_articole2 ----------
DO AsiguraSaftTipFacturi
loNou = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loNou) = 'O', "Createobject frm_facturare_articole2 (calea noua)"
IF VARTYPE(loNou) <> 'O'
RETURN
ENDIF
loNou.Visible = .F.
loNou.nnrbon = poDate.nract
FOR i = 1 TO 4
lnTip = laTip[i]
lcNumeTip = laNume[i]
IF lnTip = 4 AND !glPOSDisponibil
DO AfLog WITH "nou [" + lcNumeTip + "]: SARIT - nu exista plaje de serii pentru tipul 26 in acest mediu"
LOOP
ENDIF
loNou.seteaza_mod_incasare(lnTip)
DO Assert WITH loNou.nmod_incasare() = lnTip, "[" + lcNumeTip + "] nmod_incasare() reflecta seteaza_mod_incasare(" + TRANSFORM(lnTip) + ")"
DO AfLog WITH "nou [" + lcNumeTip + "]: dupa opt_incasat.Value=" + TRANSFORM(lnTip) + ;
" nr_incasare=" + TRANSFORM(poDate.nr_incasare) + " incasat=" + TRANSFORM(poDate.incasat) + ;
" incasatCARD=" + TRANSFORM(poDate.incasatCARD) + " id_casa=" + TRANSFORM(poDate.id_casa) + ;
" nIncasatPos=" + TRANSFORM(poDate.nIncasatPos) + " nnrbon=" + TRANSFORM(loNou.nnrbon) + ;
" numere=" + StareToate()
laNou[i,1] = poDate.nr_incasare
DO AplicaTermin WITH loNou.nmod_incasare()
laNou[i,2] = poDate.ntip_incasare
laNou[i,3] = ListaIncasare()
laNou[i,4] = "incasat=" + TRANSFORM(poDate.incasat) + "|card=" + TRANSFORM(poDate.incasatCARD) + ;
"|tichete=" + TRANSFORM(poDate.incasatTichete) + "|casa=" + TRANSFORM(poDate.id_casa)
DO AfLog WITH "nou [" + lcNumeTip + "]: dupa emitere ntip_incasare=" + TRANSFORM(laNou[i,2]) + ;
" nr_incasare=" + TRANSFORM(laNou[i,1]) + " campuri=" + laNou[i,4]
DO AfLog WITH "nou [" + lcNumeTip + "]: lcListaIncasare=[" + laNou[i,3] + "]"
DO Assert WITH laNou[i,1] = laVechi[i,1], "[" + lcNumeTip + "] poDate.nr_incasare identic (vechi=" + ;
TRANSFORM(laVechi[i,1]) + " nou=" + TRANSFORM(laNou[i,1]) + ")"
DO Assert WITH laNou[i,3] == laVechi[i,3], "[" + lcNumeTip + "] lcListaIncasare identic (vechi=[" + ;
laVechi[i,3] + "] nou=[" + laNou[i,3] + "])"
DO Assert WITH laNou[i,2] = laVechi[i,2], "[" + lcNumeTip + "] poDate.ntip_incasare identic (vechi=" + ;
TRANSFORM(laVechi[i,2]) + " nou=" + TRANSFORM(laNou[i,2]) + ")"
DO Assert WITH laNou[i,4] == laVechi[i,4], "[" + lcNumeTip + "] campurile care intra in lcListaIncasare identice (vechi=" + ;
laVechi[i,4] + " nou=" + laNou[i,4] + ")"
loNou.seteaza_mod_incasare(1)
DO Assert WITH loNou.nmod_incasare() = 1, "[" + lcNumeTip + "] nmod_incasare() reflecta seteaza_mod_incasare(1) (dezalocare)"
loNou.actualizeaza_tipincasare()
poDate.incasatCARD = lnStartCard
poDate.incasatTichete = lnStartTichete
DO AfLog WITH "nou [" + lcNumeTip + "]: dezalocat, numere=" + StareToate()
DO Assert WITH !EsteAlocat(3) AND !EsteAlocat(16) AND !EsteAlocat(26), ;
"nou [" + lcNumeTip + "] nimic alocat dupa comutarea inapoi pe Fara incasare (" + StareToate() + ")"
ENDFOR
DO AfLog WITH "stare finala numere (asteptat nimic alocat): " + StareToate()
DO Assert WITH !EsteAlocat(3) AND !EsteAlocat(16) AND !EsteAlocat(26), "nimic ramas alocat la finalul rularii"
loNou.Release()
RELEASE loNou
ENDPROC
* Pasul de emitere dinaintea lui do_scrie_factura, comun celor doua cai:
* ferestre_cere_date.vc2:3067 + 3100-3104 (frm_alte_date.inainte_de_do_termin)
* ofacturare.vc2:20673 + 20680-20683 (frm_facturare_articole2.inainte_de_do_termin)
PROCEDURE AplicaTermin
LPARAMETERS tnValoareOpt
poDate.ntip_incasare = Iif(tnValoareOpt=2, 11, IIF(tnValoareOpt = 3, 2, IIF(tnValoareOpt = 4, 3, 0)))
IF poDate.nIncasatPos = 1
poDate.incasatCARD = poDate.incasat
poDate.incasat = 0
ENDIF
ENDPROC
* Replica blocului din do_scrie_factura. Corpul dintre marcaje e comparat ca text cu sursa
* (ProbaTextSursa) - nu edita aici fara sa verifici sursa.
FUNCTION ListaIncasare
LOCAL lcListaIncasare
lcListaIncasare = ''
*--REPLICA-LISTA-START--*
If Inlist(poDate.ntip_incasare, 11, 2, 3)
Do Case
Case poDate.ntip_incasare = 11
If poDate.incasat <> 0
lcListaIncasare = lcListaIncasare + ['11|] + Alltrim(Str(poDate.incasat,18,gnPc)) + [|] + Alltrim(Str(poDate.id_casa)) + [;']
Endif
Case poDate.ntip_incasare = 3
If poDate.incasatCARD <> 0
lcListaIncasare = lcListaIncasare + ['3|] + Alltrim(Str(poDate.incasatCARD,18,gnPc)) + [|] + Alltrim(Str(poDate.id_casa)) + [;']
Endif
Otherwise
If poDate.incasat <> 0
lcListaIncasare = lcListaIncasare + ['2|] + Alltrim(Str(poDate.incasat,18,gnPc)) + [|] + Alltrim(Str(poDate.id_casa)) + [;']
Endif
If poDate.incasatCARD <> 0
lcListaIncasare = lcListaIncasare + ['3|] + Alltrim(Str(poDate.incasatCARD,18,gnPc)) + [|] + Alltrim(Str(poDate.id_casa)) + [;']
Endif
If poDate.incasatTichete <> 0
lcListaIncasare = lcListaIncasare + ['5|] + Alltrim(Str(poDate.incasatTichete,18,gnPc)) + [|] + Alltrim(Str(poDate.id_casa)) + [;']
Endif
Endcase
If Empty(m.lcListaIncasare)
lcListaIncasare = [NULL]
Endif
Else
lcListaIncasare = [NULL]
Endif
*--REPLICA-LISTA-END--*
RETURN lcListaIncasare
ENDFUNC
*=====================================================================================
* Ajutoare de text
*=====================================================================================
* taie comentariul && , spatiile de la capete si tab-urile de indentare
FUNCTION NormalizeazaLinie
LPARAMETERS tcLinie
LOCAL lcL, lnP
* marcajul de comentariu se construieste din CHR(38): scris literal, compilatorul VFP il ia
* drept inceput de comentariu si taie restul liniei, chiar si intre ghilimele
lcL = CHRTRAN(tcLinie, CHR(9), " ")
lnP = AT(CHR(38) + CHR(38), lcL)
IF lnP > 0
lcL = LEFT(lcL, lnP - 1)
ENDIF
RETURN ALLTRIM(lcL)
ENDFUNC
* concateneaza tnCate linii din fisier incepand de la tnStart, normalizate si fara linii goale
FUNCTION ExtrageBloc
LPARAMETERS tcFisier, tnStart, tnCate
LOCAL lcRez, i, lcL, lnCate
LOCAL ARRAY laF[1]
lcRez = ""
lnCate = ALINES(laF, FILETOSTR(tcFisier), 0)
FOR i = tnStart TO MIN(tnStart + tnCate - 1, lnCate)
lcL = UPPER(NormalizeazaLinie(laF[i]))
IF !EMPTY(lcL)
lcRez = lcRez + lcL + CHR(10)
ENDIF
ENDFOR
RETURN lcRez
ENDFUNC
* extrage din fisier liniile dintre cele doua marcaje, normalizate, fara linii goale
FUNCTION ExtrageIntreMarcaje
LPARAMETERS tcFisier, tcStart, tcStop
LOCAL lcRez, i, lnCate, llIn, lcL
LOCAL ARRAY laF[1]
lcRez = ""
llIn = .F.
lnCate = ALINES(laF, FILETOSTR(tcFisier), 0)
FOR i = 1 TO lnCate
lcL = ALLTRIM(CHRTRAN(laF[i], CHR(9), " "))
IF lcL == tcStop
EXIT
ENDIF
IF llIn
lcL = UPPER(NormalizeazaLinie(laF[i]))
IF !EMPTY(lcL)
lcRez = lcRez + lcL + CHR(10)
ENDIF
ENDIF
IF lcL == tcStart
llIn = .T.
ENDIF
ENDFOR
RETURN lcRez
ENDFUNC
* prima linie normalizata (majuscule) care contine tcFragment
FUNCTION CautaLinie
LPARAMETERS tcFisier, tcFragment
LOCAL i, lnCate, lcL
LOCAL ARRAY laF[1]
lnCate = ALINES(laF, FILETOSTR(tcFisier), 0)
FOR i = 1 TO lnCate
lcL = UPPER(NormalizeazaLinie(laF[i]))
IF tcFragment $ lcL
RETURN lcL
ENDIF
ENDFOR
RETURN ""
ENDFUNC
*=====================================================================================
* Ajutoare de mediu, preluate din test_s3b_incasare_paritate_campuri.prg
*=====================================================================================
PROCEDURE AsiguraSaftTipFacturi
* cboTipFactura (RowSourceType=3) citeste cursorul local saft_tip_facturi ca pe un tabel la
* instantiere (ofacturare.vc2:16157, ferestre_cere_date.vc2:2388). Structura copiata din
* update_saft_tip_facturi (updateserver.prg:669-691), fara apel la server.
IF !USED('saft_tip_facturi')
CREATE CURSOR saft_tip_facturi (cod N(3) NULL, tip_saftname C(200) NULL)
INSERT INTO saft_tip_facturi (cod, tip_saftname) VALUES (NULL, '')
INDEX ON cod TAG cod
ENDIF
ENDPROC
FUNCTION EsteAlocat
LPARAMETERS tnTip
LOCAL lcCursor
IF poGeneratorNumere.paPlaje(tnTip, 6)
lcCursor = poGeneratorNumere.paPlaje(tnTip, 8)
IF EMPTY(NVL(lcCursor, [])) OR !USED(lcCursor)
RETURN .F.
ENDIF
RETURN RECCOUNT(lcCursor) > 0
ELSE
RETURN poGeneratorNumere.paPlaje(tnTip, 1) <> 0
ENDIF
ENDFUNC
FUNCTION StareNumar
LPARAMETERS tnTip
LOCAL lcCursor, lnCount
IF poGeneratorNumere.paPlaje(tnTip, 6)
lcCursor = poGeneratorNumere.paPlaje(tnTip, 8)
IF EMPTY(NVL(lcCursor, [])) OR !USED(lcCursor)
lnCount = 0
ELSE
lnCount = RECCOUNT(lcCursor)
ENDIF
RETURN "buffer:" + TRANSFORM(lnCount)
ELSE
RETURN "array:" + TRANSFORM(poGeneratorNumere.paPlaje(tnTip, 1))
ENDIF
ENDFUNC
FUNCTION StareToate
RETURN "3=" + StareNumar(3) + "|16=" + StareNumar(16) + "|26=" + StareNumar(26)
ENDFUNC
PROCEDURE ProbaSerii
LPARAMETERS tnIdTipDoc
LOCAL lnOk, laErr[1], i, lcSql
PRIVATE pnIdTipDoc, pnRezultat
pnIdTipDoc = tnIdTipDoc
pnRezultat = 0
lcSql = "{call " + gcS + ".pack_serii_numere.verifica_cursor_serii(?pnIdTipDoc,?gnIdUtil,?gnIdSucursala,?@pnRezultat)}"
FOR i = 1 TO 3
lnOk = SQLEXEC(gnHandle, lcSql, "crsprobaserii")
IF lnOk > 0
DO AfLog WITH "proba serii OK la incercarea " + TRANSFORM(i) + ", pnRezultat=" + TRANSFORM(pnRezultat) + " randuri=" + TRANSFORM(RECCOUNT("crsprobaserii"))
USE IN (SELECT("crsprobaserii"))
EXIT
ELSE
AERROR(laErr)
DO AfLog WITH "proba serii ESEC la incercarea " + TRANSFORM(i) + ": " + TRANSFORM(laErr[1]) + " / " + TRANSFORM(laErr[2]) + " / " + TRANSFORM(laErr[5])
ENDIF
ENDFOR
ENDPROC
* 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 "pre-proba plaje tip " + TRANSFORM(tnIdTipDoc) + " ESEC: " + TRANSFORM(laErr[2])
ENDIF
RETURN lnRanduri
ENDFUNC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO AfLog WITH "PASS: " + tcMsg
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL: " + tcMsg
ENDIF
ENDPROC
PROCEDURE AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gnFail = gnFail + 1
* plafon de scriere: o eroare intr-o bucla peste liniile unui .vc2 a produs un log de 3 MB
IF gnFail <= 200
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDIF
IF gnFail = 201
DO AfLog WITH "ERROR: peste 200 de erori, restul nu se mai scriu in log"
ENDIF
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC