#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
This commit is contained in:
590
utile/Teste/facturare_unificat/test_s3b_paritate_emitere.prg
Normal file
590
utile/Teste/facturare_unificat/test_s3b_paritate_emitere.prg
Normal file
@@ -0,0 +1,590 @@
|
||||
* 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
|
||||
Reference in New Issue
Block a user