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
591 lines
25 KiB
Plaintext
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
|