#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:
2026-09-09 21:38:25 +03:00
parent d1d0d7c37f
commit 8e022d332e
259 changed files with 57305 additions and 1576 deletions

View File

@@ -0,0 +1,84 @@
"""
Verifica ca ordinea campurilor din creeaza_cursor_gol si reordoneaza
(combosql_cautare, ofacturare.vc2) e identica pe fiecare ramura (codmat/denumire)
si ca fiecare lista are 20 de campuri. Iese cu cod != 0 daca nu.
"""
import re
import sys
PATH = r"D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2"
def campuri_create_cursor(bloc):
# "codmat C(100), denumire C(100), ..." -> ["codmat", "denumire", ...]
interior = bloc[bloc.index('(m.tcCursor) (') + len('(m.tcCursor) ('):bloc.rindex(')')]
nume = re.findall(r'(\w+)\s+[CN]\(', interior)
return nume
def campuri_select(bloc):
# "Select codmat, denumire, ... From (m.tcRaw)" -> ["codmat", "denumire", ...]
interior = bloc[len('Select '):bloc.index('From (m.tcRaw)')]
interior = re.sub(r';\s*', ' ', interior) # elimina continuarile de linie
nume = [c.strip() for c in interior.split(',') if c.strip()]
return nume
def extrage_ramuri(text, nume_metoda, extractor, marker_inceput, marker_sfarsit):
start = text.index('PROCEDURE ' + nume_metoda)
end = text.index('ENDPROC', start)
corp = text[start:end]
if_pos = corp.index('If This.pFieldActiv = [codmat]')
else_pos = corp.index('Else', if_pos)
endif_pos = corp.index('Endif', else_pos)
bloc_codmat = corp[if_pos:else_pos]
bloc_denumire = corp[else_pos:endif_pos]
bloc_codmat = bloc_codmat[bloc_codmat.index(marker_inceput):]
bloc_codmat = bloc_codmat[:bloc_codmat.index(marker_sfarsit) + len(marker_sfarsit)]
bloc_denumire = bloc_denumire[bloc_denumire.index(marker_inceput):]
bloc_denumire = bloc_denumire[:bloc_denumire.index(marker_sfarsit) + len(marker_sfarsit)]
return extractor(bloc_codmat), extractor(bloc_denumire)
def main():
text = open(PATH, 'rb').read().decode('cp1250')
cg_codmat, cg_denumire = extrage_ramuri(
text, 'creeaza_cursor_gol', campuri_create_cursor, 'Create Cursor', '))')
ro_codmat, ro_denumire = extrage_ramuri(
text, 'reordoneaza', campuri_select, 'Select', 'Into Cursor (m.tcCursor)')
erori = []
for eticheta, lista in [
('creeaza_cursor_gol/codmat', cg_codmat),
('creeaza_cursor_gol/denumire', cg_denumire),
('reordoneaza/codmat', ro_codmat),
('reordoneaza/denumire', ro_denumire),
]:
if len(lista) != 20:
erori.append('%s are %d campuri, nu 20: %s' % (eticheta, len(lista), lista))
if cg_codmat != ro_codmat:
erori.append('ramura codmat: creeaza_cursor_gol != reordoneaza\n %s\n %s' % (cg_codmat, ro_codmat))
if cg_denumire != ro_denumire:
erori.append('ramura denumire: creeaza_cursor_gol != reordoneaza\n %s\n %s' % (cg_denumire, ro_denumire))
if erori:
print('FAIL')
for e in erori:
print(' -', e)
sys.exit(1)
print('OK: 4 liste (2 metode x 2 ramuri), 20 campuri fiecare, ordine identica intre metode.')
print(' codmat: ', cg_codmat)
print(' denumire: ', cg_denumire)
if __name__ == '__main__':
main()

View File

@@ -0,0 +1,20 @@
-- Pregatirea sursei V1 pentru test_s6_3d_abd_pretd.prg. DOAR pe MARIUSM_AUTO@ROA_CENTRAL.
-- Nu e script de produs.
--
-- De ce: singurul aviz nefacturat cu PRETD NULL nativ este 131, iar acela cade in Oracle
-- ("Nu au fost gasite articolele! FACT-015" in scrie_factura_avize) - defect al sursei, nu al
-- garzii noi din do_scrie_articole. Ca sa se poata arata ca V1 SCRIE un document dintr-o sursa
-- cu pretd NULL, avizul 667 (SSS 111, client 614, 1 linie, 1000 buc, nefacturat) primeste
-- PRETD NULL. PRET era 0, ceea ce ar fi deschis dialogul "totalul 0"; se pune 10.
--
-- Valorile de dinainte (citite din baza, 01.09.2026):
-- id_vanzare_det 955 pret 0 pretd 0 lot NULL
update vanzari_detalii
set pretd = null,
pret = 10
where id_vanzare = 667;
commit;
select id_vanzare_det, cantitate, pret, pretd, lot from vanzari_detalii where id_vanzare = 667;

View File

@@ -0,0 +1,24 @@
-- Pregatirea sursei pentru test_s6_3d_abd_pretd.prg. DOAR pe MARIUSM_AUTO@ROA_CENTRAL.
-- Nu e script de produs: nu se aplica la clienti, nu intra in registrul de migrari.
--
-- De ce: in MARIUSM_AUTO nu exista niciun aviz nefacturat cu LOT completat, deci livrabilul B
-- (lot trimis de v2) nu se poate proba pe date reale. Avizul 683 (SSS 100020, client 614
-- ROMFAST S.R.L., 4 linii, 9 bucati, nefacturat) e consumat oricum de proba, deci se completeaza
-- LOT pe liniile lui. In acelasi timp i se pune PRETD pe NULL, ca sa exercite si garda noua
-- Iif(Isnull(poArt.pretd),[NULL],...) pe traseul v2.
--
-- Valorile de dinainte, citite din baza inainte de rulare (23:xx, 01.09.2026):
-- id_vanzare_det 979 lot NULL pretd 0
-- id_vanzare_det 980 lot NULL pretd 0
-- id_vanzare_det 981 lot NULL pretd 0
-- id_vanzare_det 982 lot NULL pretd 0
update vanzari_detalii
set lot = 'LOT13-' || to_char(id_vanzare_det),
pretd = null
where id_vanzare = 683;
commit;
select id_vanzare_det, cantitate, pret, pretd, lot
from vanzari_detalii where id_vanzare = 683 order by id_vanzare_det;

View File

@@ -0,0 +1,459 @@
*!* 01.09.2026
*!* Biblioteca de comparatie documente v1/v2 (S6-0): fara efecte laterale, doar SELECT, nu emite
*!* nimic. Compara doua documente identificate prin SERIE_ACT + NRACT (nu ID_FACT - offset
*!* constant intre ID_FACT si ID_VANZARE, vezi docs\propunere_s6_test_flux_real.md 4.1a) pe
*!* VANZARI, VANZARI_DETALII, ACT si RUL.
*!*
*!* Functii publice (consumate de testele S6-1...S6-5):
*!* CompDoc(tcSerie1, tnNr1, tcSerie2, tnNr2, tcEticheta)
*!* ruleaza toate cele patru comparatii de mai jos si intoarce numarul total de esecuri
*!* CompVanzari(tcSerie1, tnNr1, tcSerie2, tnNr2, tcEticheta)
*!* antetul (VANZARI): campurile de paritate + totalurile denormalizate, egalitate exacta
*!* CompVanzariDetalii(tcSerie1, tnNr1, tcSerie2, tnNr2, tcEticheta)
*!* liniile (VANZARI_DETALII), linie cu linie, sortate dupa id_articol, pret, proc_tvav, plus
*!* invariantul minim (count, sum(cantitate), sum(cantitate*pret), setul de id_jtva_coloana)
*!* CompAct(tcSerie1, tnNr1, tcSerie2, tnNr2, tcEticheta)
*!* multimea de randuri ACT, jonctiune pe serie_act+nract, comparata sortat (nu depinde de
*!* ordinea de inserare)
*!* CompRul(tcSerie1, tnNr1, tcSerie2, tnNr2, tcEticheta)
*!* multimea de randuri RUL; gol pe ambele parti = PASS, dar raportat explicit ca paritate
*!* vida/neconcludenta (RUL are randuri doar cu gnScadereStoc = 1)
*!*
*!* Fiecare functie de mai sus intoarce numarul de esecuri (0 = paritate completa pe campurile
*!* comparate) si scrie fiecare FAIL/REZUMAT in gcLog daca apelantul l-a definit PUBLIC (conventia
*!* din acest director); altfel scrie in propriul log implicit (out\lib_comparatie_documente.log).
*!* Cere conexiune Oracle deja deschisa (goExecutor functional, gnIdUtil setat de apelant) - nu
*!* deschide conexiune proprie si nu face niciun INSERT/UPDATE/DELETE/DDL.
*!*
*!* Incarcare: SET PROCEDURE TO lib_comparatie_documente ADDITIVE (dupa test_init_env_auto_*).
*!* Restul functiilor (Cdoc*) sunt suportul intern, neconsumat direct de teste.
#DEFINE CDOC_LOG_IMPLICIT "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\lib_comparatie_documente.log"
*----------------------------------------------------------------------------------------
FUNCTION CompDoc
LPARAMETERS tcSerie1, tnNr1, tcSerie2, tnNr2, tcEticheta
LOCAL nFail
tcEticheta = IIF(EMPTY(tcEticheta), '[fara eticheta]', tcEticheta)
DO CdocLog WITH "===== CompDoc " + tcEticheta + " : " + ALLTRIM(tcSerie1) + " " + TRANSFORM(tnNr1) + ;
" vs " + ALLTRIM(tcSerie2) + " " + TRANSFORM(tnNr2) + " ====="
nFail = 0
nFail = nFail + CompVanzari(tcSerie1, tnNr1, tcSerie2, tnNr2, tcEticheta)
nFail = nFail + CompVanzariDetalii(tcSerie1, tnNr1, tcSerie2, tnNr2, tcEticheta)
nFail = nFail + CompAct(tcSerie1, tnNr1, tcSerie2, tnNr2, tcEticheta)
nFail = nFail + CompRul(tcSerie1, tnNr1, tcSerie2, tnNr2, tcEticheta)
DO CdocLog WITH "TOTAL CompDoc " + tcEticheta + " esecuri=" + TRANSFORM(nFail)
RETURN nFail
ENDFUNC
*----------------------------------------------------------------------------------------
* VANZARI - antetul, campurile din 5.2 (paritate) + totalurile denormalizate (egalitate exacta)
FUNCTION CompVanzari
LPARAMETERS tcSerie1, tnNr1, tcSerie2, tnNr2, tcEticheta
LOCAL nId1, nId2, nFail, lcCampuri, lcSql, nCnt
tcEticheta = IIF(EMPTY(tcEticheta), '[fara eticheta]', tcEticheta)
nFail = 0
nId1 = CdocGasesteIdVanzare(tcSerie1, tnNr1)
nId2 = CdocGasesteIdVanzare(tcSerie2, tnNr2)
IF nId1 <= 0 OR nId2 <= 0
DO CdocLog WITH "FAIL " + tcEticheta + " VANZARI: document negasit, serie1=" + ;
ALLTRIM(TRANSFORM(tcSerie1)) + " nr1=" + TRANSFORM(tnNr1) + " id1=" + TRANSFORM(nId1) + ;
", serie2=" + ALLTRIM(TRANSFORM(tcSerie2)) + " nr2=" + TRANSFORM(tnNr2) + " id2=" + TRANSFORM(nId2)
RETURN 1
ENDIF
lcCampuri = "TIP, ID_PART, ID_GESTIUNE, ID_AGENT, ID_SECTIE, ID_SUCURSALA, ID_RUTA, ID_CTR, " + ;
"ID_COMANDA, ID_DELEGAT, ID_MASINA, IN_VALUTA, ID_VALUTA, CURS, MULTIPLICATOR, DISCOUNT, " + ;
"DISCOUNT_EVIDENTIAT, DISCOUNT_TVA, TVA_INCASARE, TEXT_ADITIONAL, LISTARE_DETALIATA, " + ;
"AFISARE_SCADENTA, COEFICIENT_K, TIP_FACTURA, TIP_SAFT, EFACTURA, EPROFORMA, ID_FACTURARE, " + ;
"ID_BENEFICIAR, NR_PERSOANE, NRINMAT, COD, ID_LUCRARE, ID_PUNCTVANZARE, VALOARE_ACHIZITIE, " + ;
"DIFTOTFTVA, DIFTOTTVA, COMANDA, CONTRACT, AVIZE, TIP_INCASAT, SERIE_INCASAT, NR_INCASAT, " + ;
"SUMA_INCASAT, SERIE_ACT, FACTURAT, TOTAL_FARA_TVA, TOTAL_TVA, TOTAL_CU_TVA, VALVAL, TVAVAL, TOTVAL"
nCnt = OCCURS(",", lcCampuri) + 1
lcSql = [select ] + lcCampuri + [ from vanzari where id_vanzare = ] + ALLTRIM(STR(nId1, 20, 0))
IF goExecutor.oExecute(lcSql, 'crslibv1') < 0
DO CdocLog WITH "FAIL " + tcEticheta + " VANZARI: select document 1 esuat - " + goExecutor.oPrelucrareEroare()
RETURN 1
ENDIF
lcSql = [select ] + lcCampuri + [ from vanzari where id_vanzare = ] + ALLTRIM(STR(nId2, 20, 0))
IF goExecutor.oExecute(lcSql, 'crslibv2') < 0
DO CdocLog WITH "FAIL " + tcEticheta + " VANZARI: select document 2 esuat - " + goExecutor.oPrelucrareEroare()
DO CdocInchide WITH 'crslibv1'
RETURN 1
ENDIF
IF !USED('crslibv1') OR RECCOUNT('crslibv1') = 0 OR !USED('crslibv2') OR RECCOUNT('crslibv2') = 0
DO CdocLog WITH "FAIL " + tcEticheta + " VANZARI: unul din documente nu are rand in VANZARI"
nFail = 1
ELSE
nFail = CdocComparaCampuri('crslibv1', 'crslibv2', lcCampuri, tcEticheta, ;
"VANZARI id1=" + TRANSFORM(nId1) + " id2=" + TRANSFORM(nId2))
ENDIF
DO CdocInchide WITH 'crslibv1'
DO CdocInchide WITH 'crslibv2'
DO CdocLog WITH "REZUMAT " + tcEticheta + " VANZARI id1=" + TRANSFORM(nId1) + " id2=" + ;
TRANSFORM(nId2) + " campuri=" + TRANSFORM(nCnt) + " esecuri=" + TRANSFORM(nFail)
RETURN nFail
ENDFUNC
*----------------------------------------------------------------------------------------
* VANZARI_DETALII - linie cu linie (sortate 5.3) + invariantul minim
FUNCTION CompVanzariDetalii
LPARAMETERS tcSerie1, tnNr1, tcSerie2, tnNr2, tcEticheta
LOCAL nId1, nId2, nFail, lcCampuri, lcSql, nCnt1, nCnt2, i
tcEticheta = IIF(EMPTY(tcEticheta), '[fara eticheta]', tcEticheta)
nFail = 0
nCnt1 = 0
nCnt2 = 0
nId1 = CdocGasesteIdVanzare(tcSerie1, tnNr1)
nId2 = CdocGasesteIdVanzare(tcSerie2, tnNr2)
IF nId1 <= 0 OR nId2 <= 0
DO CdocLog WITH "FAIL " + tcEticheta + " VANZARI_DETALII: document negasit (vezi CompVanzari)"
RETURN 1
ENDIF
lcCampuri = "ID_ARTICOL, ID_POL, CANTITATE, PRET, PRET_CU_TVA, PROC_TVAV, DISCOUNT_UNITAR, " + ;
"ID_GESTIUNE, ID_JTVA_COLOANA, ID_JTVA_COLOANA_EX, ID_VALUTA, CONT, EXPLICATIE, SERIE, LOT, " + ;
"TAXCODE, CUSTODIE, ID_RATA, ID_CTR, ID_VANZARE_SET, PRET_ACHIZITIE, PRETD, ID_VALUTAD, DIFERENTA"
lcSql = [select ] + lcCampuri + [ from vanzari_detalii where sters = 0 and id_vanzare = ] + ;
ALLTRIM(STR(nId1, 20, 0)) + [ order by id_articol, pret, proc_tvav]
IF goExecutor.oExecute(lcSql, 'crslibd1') < 0
DO CdocLog WITH "FAIL " + tcEticheta + " VANZARI_DETALII: select document 1 esuat - " + goExecutor.oPrelucrareEroare()
RETURN 1
ENDIF
lcSql = [select ] + lcCampuri + [ from vanzari_detalii where sters = 0 and id_vanzare = ] + ;
ALLTRIM(STR(nId2, 20, 0)) + [ order by id_articol, pret, proc_tvav]
IF goExecutor.oExecute(lcSql, 'crslibd2') < 0
DO CdocLog WITH "FAIL " + tcEticheta + " VANZARI_DETALII: select document 2 esuat - " + goExecutor.oPrelucrareEroare()
DO CdocInchide WITH 'crslibd1'
RETURN 1
ENDIF
nCnt1 = IIF(USED('crslibd1'), RECCOUNT('crslibd1'), 0)
nCnt2 = IIF(USED('crslibd2'), RECCOUNT('crslibd2'), 0)
IF nCnt1 <> nCnt2
nFail = nFail + 1
DO CdocLog WITH "FAIL " + tcEticheta + " VANZARI_DETALII numar de linii diferit: v1=" + ;
TRANSFORM(nCnt1) + " v2=" + TRANSFORM(nCnt2)
ELSE
FOR i = 1 TO nCnt1
GO i IN crslibd1
GO i IN crslibd2
nFail = nFail + CdocComparaCampuri('crslibd1', 'crslibd2', lcCampuri, tcEticheta, ;
"VANZARI_DETALII linia " + TRANSFORM(i) + " (sortata)")
ENDFOR
ENDIF
* invariantul minim din 5.3, chiar cand liniile nu sunt identice camp cu camp
nFail = nFail + CdocInvariantDetalii('crslibd1', nCnt1, 'crslibd2', nCnt2, tcEticheta)
DO CdocInchide WITH 'crslibd1'
DO CdocInchide WITH 'crslibd2'
DO CdocLog WITH "REZUMAT " + tcEticheta + " VANZARI_DETALII id1=" + TRANSFORM(nId1) + " id2=" + ;
TRANSFORM(nId2) + " linii1=" + TRANSFORM(nCnt1) + " linii2=" + TRANSFORM(nCnt2) + ;
" esecuri=" + TRANSFORM(nFail)
RETURN nFail
ENDFUNC
*----------------------------------------------------------------------------------------
* ACT - multimea de randuri (5.4), jonctiune pe serie_act+nract, comparata sortat
FUNCTION CompAct
LPARAMETERS tcSerie1, tnNr1, tcSerie2, tnNr2, tcEticheta
LOCAL nFail, lcCampuri, lcOrder, lcSql, nCnt1, nCnt2, i
tcEticheta = IIF(EMPTY(tcEticheta), '[fara eticheta]', tcEticheta)
nFail = 0
nCnt1 = 0
nCnt2 = 0
lcCampuri = "SCD, SCC, SUMA, ID_JTVA_COLOANA, ID_SET, ID_PARTD, ID_PARTC, ID_SECTIE, " + ;
"ID_VENCHELT, ID_CTR, PROC_TVA, NEIMPOZAB, TAXCODE, EXPLICATIA4"
lcOrder = " order by " + lcCampuri
lcSql = [select ] + lcCampuri + [ from act where sters = 0 and serie_act = '] + ALLTRIM(TRANSFORM(tcSerie1)) + ;
[' and nract = ] + ALLTRIM(STR(tnNr1, 20, 0)) + lcOrder
IF goExecutor.oExecute(lcSql, 'crsliba1') < 0
DO CdocLog WITH "FAIL " + tcEticheta + " ACT: select document 1 esuat - " + goExecutor.oPrelucrareEroare()
RETURN 1
ENDIF
lcSql = [select ] + lcCampuri + [ from act where sters = 0 and serie_act = '] + ALLTRIM(TRANSFORM(tcSerie2)) + ;
[' and nract = ] + ALLTRIM(STR(tnNr2, 20, 0)) + lcOrder
IF goExecutor.oExecute(lcSql, 'crsliba2') < 0
DO CdocLog WITH "FAIL " + tcEticheta + " ACT: select document 2 esuat - " + goExecutor.oPrelucrareEroare()
DO CdocInchide WITH 'crsliba1'
RETURN 1
ENDIF
nCnt1 = IIF(USED('crsliba1'), RECCOUNT('crsliba1'), 0)
nCnt2 = IIF(USED('crsliba2'), RECCOUNT('crsliba2'), 0)
IF nCnt1 = 0 OR nCnt2 = 0
nFail = nFail + 1
DO CdocLog WITH "FAIL " + tcEticheta + " ACT: unul din documente nu are randuri (v1=" + ;
TRANSFORM(nCnt1) + " v2=" + TRANSFORM(nCnt2) + ")"
ELSE
IF nCnt1 <> nCnt2
nFail = nFail + 1
DO CdocLog WITH "FAIL " + tcEticheta + " ACT numar de randuri diferit: v1=" + ;
TRANSFORM(nCnt1) + " v2=" + TRANSFORM(nCnt2)
ENDIF
FOR i = 1 TO MIN(nCnt1, nCnt2)
GO i IN crsliba1
GO i IN crsliba2
nFail = nFail + CdocComparaCampuri('crsliba1', 'crsliba2', lcCampuri, tcEticheta, ;
"ACT rand " + TRANSFORM(i) + " (sortat)")
ENDFOR
ENDIF
DO CdocInchide WITH 'crsliba1'
DO CdocInchide WITH 'crsliba2'
DO CdocLog WITH "REZUMAT " + tcEticheta + " ACT randuri1=" + TRANSFORM(nCnt1) + " randuri2=" + ;
TRANSFORM(nCnt2) + " esecuri=" + TRANSFORM(nFail)
RETURN nFail
ENDFUNC
*----------------------------------------------------------------------------------------
* RUL - multimea de randuri (5.5); gol pe ambele parti = PASS, raportat ca paritate vida/neconcludenta
FUNCTION CompRul
LPARAMETERS tcSerie1, tnNr1, tcSerie2, tnNr2, tcEticheta
LOCAL nFail, lcCampuri, lcOrder, lcSql, nCnt1, nCnt2, i
tcEticheta = IIF(EMPTY(tcEticheta), '[fara eticheta]', tcEticheta)
nFail = 0
nCnt1 = 0
nCnt2 = 0
lcCampuri = "ID_ARTICOL, ID_GESTIUNE, ID_GESTIUNEC, CANT, PRET, PRETV, PROC_TVAV, VALOARE, " + ;
"VALOAREV, VALTVA, VALTVAV, DISCUNITAR, PROC_DISC, ID_TIP_RULAJ, ID_SET, CONT, SERIE, LOT, " + ;
"TAXCODE, ID_JTVA_COLOANA"
lcOrder = " order by " + lcCampuri
lcSql = [select ] + lcCampuri + [ from rul where sters = 0 and serie_act = '] + ALLTRIM(TRANSFORM(tcSerie1)) + ;
[' and nract = ] + ALLTRIM(STR(tnNr1, 20, 0)) + lcOrder
IF goExecutor.oExecute(lcSql, 'crslibr1') < 0
DO CdocLog WITH "FAIL " + tcEticheta + " RUL: select document 1 esuat - " + goExecutor.oPrelucrareEroare()
RETURN 1
ENDIF
lcSql = [select ] + lcCampuri + [ from rul where sters = 0 and serie_act = '] + ALLTRIM(TRANSFORM(tcSerie2)) + ;
[' and nract = ] + ALLTRIM(STR(tnNr2, 20, 0)) + lcOrder
IF goExecutor.oExecute(lcSql, 'crslibr2') < 0
DO CdocLog WITH "FAIL " + tcEticheta + " RUL: select document 2 esuat - " + goExecutor.oPrelucrareEroare()
DO CdocInchide WITH 'crslibr1'
RETURN 1
ENDIF
nCnt1 = IIF(USED('crslibr1'), RECCOUNT('crslibr1'), 0)
nCnt2 = IIF(USED('crslibr2'), RECCOUNT('crslibr2'), 0)
IF nCnt1 = 0 AND nCnt2 = 0
DO CdocLog WITH "PASS " + tcEticheta + " RUL: gol pe ambele parti - paritate VIDA, NECONCLUDENTA " + ;
"(RUL are randuri doar cu gnScadereStoc = 1)"
ELSE
IF nCnt1 = 0 OR nCnt2 = 0
nFail = nFail + 1
DO CdocLog WITH "FAIL " + tcEticheta + " RUL: gol doar pe o parte (v1=" + TRANSFORM(nCnt1) + ;
" v2=" + TRANSFORM(nCnt2) + ") - diferenta reala, nu paritate vida"
ELSE
IF nCnt1 <> nCnt2
nFail = nFail + 1
DO CdocLog WITH "FAIL " + tcEticheta + " RUL numar de randuri diferit: v1=" + ;
TRANSFORM(nCnt1) + " v2=" + TRANSFORM(nCnt2)
ENDIF
FOR i = 1 TO MIN(nCnt1, nCnt2)
GO i IN crslibr1
GO i IN crslibr2
nFail = nFail + CdocComparaCampuri('crslibr1', 'crslibr2', lcCampuri, tcEticheta, ;
"RUL rand " + TRANSFORM(i) + " (sortat)")
ENDFOR
ENDIF
ENDIF
DO CdocInchide WITH 'crslibr1'
DO CdocInchide WITH 'crslibr2'
DO CdocLog WITH "REZUMAT " + tcEticheta + " RUL randuri1=" + TRANSFORM(nCnt1) + " randuri2=" + ;
TRANSFORM(nCnt2) + " esecuri=" + TRANSFORM(nFail)
RETURN nFail
ENDFUNC
*----------------------------------------------------------------------------------------
* Suport intern - nu se consuma direct din testele S6-1...S6-5
*----------------------------------------------------------------------------------------
* gaseste id_vanzare pornind de la serie_act+numar_act; 0 = negasit, -1 = eroare Oracle
* ORDER BY id_vanzare DESC: (serie_act,numar_act) nu e garantat unic pe tot istoricul (numere
* vechi, dinainte de seria de teste, pot coincide) - apelantii cauta mereu documentul scris ACUM,
* deci cel mai mare id_vanzare e alegerea corecta (descoperit la coliziunea SSS 1001: id_vanzare
* 451 din 2009 vs. 1623 scris azi de acest test)
FUNCTION CdocGasesteIdVanzare
LPARAMETERS tcSerie, tnNr
LOCAL lcSql
lcSql = [select id_vanzare as nr from vanzari where sters = 0 and serie_act = '] + ;
ALLTRIM(TRANSFORM(tcSerie)) + [' and numar_act = ] + ALLTRIM(STR(tnNr, 20, 0)) + ;
[ order by id_vanzare desc]
RETURN CdocValoareScalara(lcSql, 'crslibidv')
ENDFUNC
* executa un select ... as nr FROM ... si intoarce prima valoare; -1 = eroare Oracle
FUNCTION CdocValoareScalara
LPARAMETERS tcSql, tcCursorTmp
LOCAL lnRez, lnSucces, lcCur
lcCur = IIF(EMPTY(tcCursorTmp), 'crslibscalar', tcCursorTmp)
lnRez = -1
lnSucces = goExecutor.oExecute(tcSql, lcCur)
IF lnSucces >= 0 AND USED(lcCur)
IF RECCOUNT(lcCur) > 0
SELECT (lcCur)
GO TOP
lnRez = NVL(EVALUATE(lcCur + '.nr'), 0)
ELSE
lnRez = 0
ENDIF
USE IN (lcCur)
ELSE
DO CdocLog WITH "SQL ESEC: " + TRANSFORM(goExecutor.oPrelucrareEroare()) + " | " + tcSql
ENDIF
RETURN lnRez
ENDFUNC
* egalitate NULL-safe intre doua valori de cursor (numeric, caracter sau logic)
FUNCTION CdocEgal
LPARAMETERS tu1, tu2
IF ISNULL(tu1) AND ISNULL(tu2)
RETURN .T.
ENDIF
IF ISNULL(tu1) OR ISNULL(tu2)
RETURN .F.
ENDIF
IF VARTYPE(tu1) = 'C' OR VARTYPE(tu2) = 'C'
RETURN ALLTRIM(TRANSFORM(tu1)) == ALLTRIM(TRANSFORM(tu2))
ENDIF
RETURN tu1 = tu2
ENDFUNC
* compara toate campurile din tcListaCampuri (lista "camp1, camp2, ...") intre doua alias-uri
* POZITIONATE deja pe randul de comparat; logheaza fiecare FAIL si intoarce numarul de esecuri.
* Lista se primeste ca sir, nu ca array: un array trecut ca parametru intre functii isi pierde
* pentru compilator statutul de array (ambiguitate cu un apel de program), de-aici array-ul local
* construit chiar in aceasta functie.
FUNCTION CdocComparaCampuri
LPARAMETERS tcAlias1, tcAlias2, tcListaCampuri, tcEticheta, tcContext
LOCAL ARRAY laCampuri[1]
LOCAL nCnt, nFail, i, lcCamp, lu1, lu2
nCnt = ALINES(laCampuri, tcListaCampuri, 1, ",")
nFail = 0
FOR i = 1 TO nCnt
lcCamp = laCampuri[i]
lu1 = EVALUATE(tcAlias1 + '.' + lcCamp)
lu2 = EVALUATE(tcAlias2 + '.' + lcCamp)
IF !CdocEgal(lu1, lu2)
nFail = nFail + 1
DO CdocLog WITH "FAIL " + tcEticheta + " " + tcContext + " camp=" + lcCamp + ;
" v1=" + TRANSFORM(lu1) + " v2=" + TRANSFORM(lu2)
ENDIF
ENDFOR
RETURN nFail
ENDFUNC
* invariantul minim de pe VANZARI_DETALII (5.3): count(*), sum(cantitate), sum(cantitate*pret),
* setul de id_jtva_coloana - valabil chiar cand liniile nu sunt identice camp cu camp
FUNCTION CdocInvariantDetalii
LPARAMETERS tcAlias1, tnCnt1, tcAlias2, tnCnt2, tcEticheta
LOCAL nFail, nSumCant1, nSumCant2, nSumVal1, nSumVal2, lcSet1, lcSet2, lcCod
nFail = 0
nSumCant1 = 0
nSumVal1 = 0
lcSet1 = ''
IF USED(tcAlias1) AND tnCnt1 > 0
SELECT (tcAlias1)
GO TOP
SCAN
nSumCant1 = nSumCant1 + NVL(cantitate, 0)
nSumVal1 = nSumVal1 + NVL(cantitate, 0) * NVL(pret, 0)
lcCod = TRANSFORM(NVL(id_jtva_coloana, 0))
IF !(";" + lcCod + ";" $ ";" + lcSet1)
lcSet1 = lcSet1 + lcCod + ";"
ENDIF
ENDSCAN
ENDIF
nSumCant2 = 0
nSumVal2 = 0
lcSet2 = ''
IF USED(tcAlias2) AND tnCnt2 > 0
SELECT (tcAlias2)
GO TOP
SCAN
nSumCant2 = nSumCant2 + NVL(cantitate, 0)
nSumVal2 = nSumVal2 + NVL(cantitate, 0) * NVL(pret, 0)
lcCod = TRANSFORM(NVL(id_jtva_coloana, 0))
IF !(";" + lcCod + ";" $ ";" + lcSet2)
lcSet2 = lcSet2 + lcCod + ";"
ENDIF
ENDSCAN
ENDIF
IF !CdocEgal(ROUND(nSumCant1, 6), ROUND(nSumCant2, 6))
nFail = nFail + 1
DO CdocLog WITH "FAIL " + tcEticheta + " VANZARI_DETALII invariant sum(cantitate) diferit: v1=" + ;
TRANSFORM(nSumCant1) + " v2=" + TRANSFORM(nSumCant2)
ENDIF
IF !CdocEgal(ROUND(nSumVal1, 2), ROUND(nSumVal2, 2))
nFail = nFail + 1
DO CdocLog WITH "FAIL " + tcEticheta + " VANZARI_DETALII invariant sum(cantitate*pret) diferit: v1=" + ;
TRANSFORM(nSumVal1) + " v2=" + TRANSFORM(nSumVal2)
ENDIF
IF !(CdocSortSet(lcSet1) == CdocSortSet(lcSet2))
nFail = nFail + 1
DO CdocLog WITH "FAIL " + tcEticheta + " VANZARI_DETALII invariant set id_jtva_coloana diferit: v1=" + ;
lcSet1 + " v2=" + lcSet2
ENDIF
RETURN nFail
ENDFUNC
* normalizeaza un set ";"-delimitat de coduri numerice ca sa nu depinda de ordinea de aparitie
FUNCTION CdocSortSet
LPARAMETERS tcSet
LOCAL ARRAY laSet[1]
LOCAL nCnt, i, j, lcTmp, lcRez
nCnt = ALINES(laSet, tcSet, 1, ";")
IF nCnt = 0
RETURN ''
ENDIF
FOR i = 1 TO nCnt - 1
FOR j = i + 1 TO nCnt
IF VAL(laSet[j]) < VAL(laSet[i])
lcTmp = laSet[i]
laSet[i] = laSet[j]
laSet[j] = lcTmp
ENDIF
ENDFOR
ENDFOR
lcRez = ''
FOR i = 1 TO nCnt
lcRez = lcRez + laSet[i] + ";"
ENDFOR
RETURN lcRez
ENDFUNC
* elibereaza un alias daca e deschis
PROCEDURE CdocInchide
LPARAMETERS tcAlias
IF USED(tcAlias)
USE IN (tcAlias)
ENDIF
ENDPROC
* scrie in gcLog (daca apelantul l-a definit PUBLIC) sau in logul implicit al bibliotecii
PROCEDURE CdocLog
LPARAMETERS tcMsg
LOCAL lcLog
lcLog = IIF(TYPE('gcLog') = 'C' AND !EMPTY(gcLog), gcLog, CDOC_LOG_IMPLICIT)
IF !DIRECTORY(JUSTPATH(lcLog))
MD (JUSTPATH(lcLog))
ENDIF
STRTOFILE(tcMsg + CHR(13) + CHR(10), lcLog, 1)
ENDPROC

View File

@@ -0,0 +1,229 @@
* mock_caut_antet.prg - inlocuieste dialogurile modale de cautare apelate din do_cauta_* (ocautare.prg,
* oproceduri_facturare.prg, oproceduri_comune.prg) cu functii care intorc o valoare fixa si inregistreaza
* apelul (nume + argumente) in gcMockApeluri (PUBLIC, declarat de test). Se incarca ULTIMUL cu
* SET PROCEDURE ... ADDITIVE. Valorile intoarse se controleaza prin PUBLIC gnMockIdPart (id-ul
* partenerului intors de CautPartenerContabilitate) si gnMockButon (valoarea pusa in gnButon de
* fiecare "dialog", ca in productie unde dialogul seteaza gnButon la inchidere).
PROCEDURE MockLog
LPARAMETERS tcNume, tcArgs
IF TYPE("gcLog") = "C"
STRTOFILE("MOCK " + tcNume + CHR(13) + CHR(10), gcLog, 1)
ENDIF
IF TYPE('gcMockApeluri') = 'C'
gcMockApeluri = gcMockApeluri + tcNume + "(" + tcArgs + ")" + CHR(13) + CHR(10)
ENDIF
IF TYPE('gnMockButon') = 'N'
gnButon = gnMockButon
ENDIF
ENDPROC
FUNCTION MockArgs
LPARAMETERS tnCount, t1, t2, t3, t4, t5, t6, t7
LOCAL lcA, i
lcA = ""
FOR i = 1 TO tnCount
lcA = lcA + IIF(i > 1, ",", "") + TRANSFORM(EVALUATE("t" + TRANSFORM(i)))
ENDFOR
RETURN lcA
ENDFUNC
PROCEDURE CautPartenerContabilitate
LPARAMETERS toHash
LOCAL loR
DO MockLog WITH "CautPartenerContabilitate", "cTitlu=" + TRANSFORM(toHash.GetValue('cTitlu')) + ";cCont=" + TRANSFORM(toHash.GetValue('cCont')) + ";dDataDoc=" + TRANSFORM(toHash.GetValue('dDataDoc'))
loR = CREATEOBJECT("Empty")
ADDPROPERTY(loR, "id_part", IIF(TYPE('gnMockIdPart') = 'N', gnMockIdPart, 0))
ADDPROPERTY(loR, "denumire", "PARTENER MOCK")
ADDPROPERTY(loR, "cod_fiscal", "RO1234567")
RETURN loR
ENDPROC
FUNCTION caut_avize
LPARAMETERS tnIdClient
LOCAL lcXml
DO MockLog WITH "caut_avize", MockArgs(PCOUNT(), tnIdClient)
CREATE CURSOR crsMockAvize (id_vanzare N(10), id_comanda N(10), serie_act C(10), numar_act N(10))
INSERT INTO crsMockAvize VALUES (101, 0, "AV", 7)
INSERT INTO crsMockAvize VALUES (102, 555, "AV", 8)
CURSORTOXML("crsMockAvize", "lcXml", 1, 0, 0, "1")
USE IN crsMockAvize
RETURN lcXml
ENDFUNC
FUNCTION caut_comanda_clienti
LPARAMETERS tnIdClient
LOCAL loR
DO MockLog WITH "caut_comanda_clienti", MockArgs(PCOUNT(), tnIdClient)
loR = CREATEOBJECT("Empty")
ADDPROPERTY(loR, "id_comanda", "301")
ADDPROPERTY(loR, "nr_comanda", "CMD-301 ")
ADDPROPERTY(loR, "id_part", tnIdClient)
ADDPROPERTY(loR, "nume", "PARTENER MOCK")
RETURN loR
ENDFUNC
FUNCTION caut_comanda_client
LPARAMETERS tnIdClient
LOCAL loR
DO MockLog WITH "caut_comanda_client", MockArgs(PCOUNT(), tnIdClient)
loR = CREATEOBJECT("Empty")
ADDPROPERTY(loR, "id_comanda", "302")
ADDPROPERTY(loR, "nr_comanda", "CMD-302 ")
ADDPROPERTY(loR, "id_part", tnIdClient)
ADDPROPERTY(loR, "nume", "PARTENER MOCK")
RETURN loR
ENDFUNC
FUNCTION caut_comanda_gestiune
LPARAMETERS tnIdGest
LOCAL loR
DO MockLog WITH "caut_comanda_gestiune", MockArgs(PCOUNT(), tnIdGest)
loR = CREATEOBJECT("Empty")
ADDPROPERTY(loR, "id_comanda", "303")
ADDPROPERTY(loR, "nr_comanda", "CMD-303 ")
ADDPROPERTY(loR, "id_part", tnIdGest)
ADDPROPERTY(loR, "nume", "GESTIUNE MOCK")
RETURN loR
ENDFUNC
FUNCTION caut_contract_facturare
LPARAMETERS tnIdClient, tcTipuri
LOCAL lcXml
DO MockLog WITH "caut_contract_facturare", MockArgs(PCOUNT(), tnIdClient, tcTipuri)
CREATE CURSOR crsMockCtr (id_ctr N(10), contract C(20), scadenta_incasare N(5), afisare_scadenta N(1), opt_facturare N(2))
INSERT INTO crsMockCtr VALUES (401, "CTR-401", 15, 1, 3)
INSERT INTO crsMockCtr VALUES (402, "CTR-402", 30, 0, 4)
CURSORTOXML("crsMockCtr", "lcXml", 1, 0, 0, "1")
USE IN crsMockCtr
RETURN lcXml
ENDFUNC
FUNCTION caut_facturi_client
LPARAMETERS tnIdClient
LOCAL loR
DO MockLog WITH "caut_facturi_client", MockArgs(PCOUNT(), tnIdClient)
loR = CREATEOBJECT("Empty")
ADDPROPERTY(loR, "id_fact", 501)
ADDPROPERTY(loR, "serie_act", "FA")
ADDPROPERTY(loR, "nract", 77)
RETURN loR
ENDFUNC
FUNCTION caut_facturi_multiple_client
LPARAMETERS tnIdClient, tnInValuta, tnIdValuta, tlMultiple
LOCAL lcXml
DO MockLog WITH "caut_facturi_multiple_client", MockArgs(PCOUNT(), tnIdClient, tnInValuta, tnIdValuta, tlMultiple)
CREATE CURSOR crsMockFact (id_vanzare N(10), serie_act C(10), numar_act N(10))
INSERT INTO crsMockFact VALUES (601, "FA", 11)
INSERT INTO crsMockFact VALUES (602, "", 12)
CURSORTOXML("crsMockFact", "lcXml", 1, 0, 0, "1")
USE IN crsMockFact
RETURN lcXml
ENDFUNC
FUNCTION caut_fdoc
LOCAL loR
DO MockLog WITH "caut_fdoc", ""
loR = CREATEOBJECT("Empty")
ADDPROPERTY(loR, "id_fdoc", 9)
ADDPROPERTY(loR, "fel_document", "FEL MOCK")
RETURN loR
ENDFUNC
FUNCTION caut_gestiune
LPARAMETERS t1, t2
LOCAL loR
DO MockLog WITH "caut_gestiune", MockArgs(PCOUNT(), t1, t2)
loR = CREATEOBJECT("Empty")
ADDPROPERTY(loR, "id_gestiune", 701)
ADDPROPERTY(loR, "nume_gestiune", "GESTIUNE INIT MOCK")
RETURN loR
ENDFUNC
FUNCTION caut_gestiune_sursa
LPARAMETERS tcTipuri
LOCAL loR
DO MockLog WITH "caut_gestiune_sursa", MockArgs(PCOUNT(), tcTipuri)
loR = CREATEOBJECT("Empty")
ADDPROPERTY(loR, "id_gestiune", 702)
ADDPROPERTY(loR, "nume_gestiune", "GESTIUNE SURSA MOCK")
RETURN loR
ENDFUNC
FUNCTION caut_gestiune_dest
LPARAMETERS tnIdGest, tcTipuri
LOCAL loR
DO MockLog WITH "caut_gestiune_dest", MockArgs(PCOUNT(), tnIdGest, tcTipuri)
loR = CREATEOBJECT("Empty")
ADDPROPERTY(loR, "id_gestiune", 703)
ADDPROPERTY(loR, "nume_gestiune", "GESTIUNE DEST MOCK")
ADDPROPERTY(loR, "id_tipgest", 4)
ADDPROPERTY(loR, "Cont", "371")
ADDPROPERTY(loR, "acont", NULL)
RETURN loR
ENDFUNC
FUNCTION caut_locatie_restaurant
LOCAL loR
DO MockLog WITH "caut_locatie_restaurant", ""
loR = CREATEOBJECT("Empty")
ADDPROPERTY(loR, "id_rest_locatie", "801")
ADDPROPERTY(loR, "locatie", "LOCATIE MOCK")
RETURN loR
ENDFUNC
PROCEDURE caut_lucrare
LPARAMETERS t1, t2, t3
LOCAL loR
DO MockLog WITH "caut_lucrare", MockArgs(PCOUNT(), t1, t2, t3)
loR = CREATEOBJECT("Empty")
ADDPROPERTY(loR, "id_lucrare", 901)
ADDPROPERTY(loR, "nrord", "LUCR-901")
RETURN loR
ENDPROC
PROCEDURE caut_politici_curente_util
LOCAL loR
DO MockLog WITH "caut_politici_curente_util", ""
loR = CREATEOBJECT("Empty")
ADDPROPERTY(loR, "id_pol", 1001)
ADDPROPERTY(loR, "nume", "POLITICA MOCK")
RETURN loR
ENDPROC
FUNCTION caut_sectie
LPARAMETERS t1, t2, t3, t4, t5
LOCAL loR
DO MockLog WITH "caut_sectie", MockArgs(PCOUNT(), t1, t2, t3, t4, t5)
loR = CREATEOBJECT("Empty")
ADDPROPERTY(loR, "id_sectie", 1101)
ADDPROPERTY(loR, "sectie", "SECTIE MOCK")
RETURN loR
ENDFUNC
FUNCTION caut_valuta
LPARAMETERS t1, t2, t3
LOCAL loR
DO MockLog WITH "caut_valuta", MockArgs(PCOUNT(), t1, t2, t3)
loR = CREATEOBJECT("Empty")
ADDPROPERTY(loR, "id_valuta", 2)
ADDPROPERTY(loR, "nume_val", "EUR")
RETURN loR
ENDFUNC
FUNCTION caut_venchelt
LPARAMETERS t1, t2, t3, t4, t5, t6, t7
LOCAL loR
DO MockLog WITH "caut_venchelt", MockArgs(PCOUNT(), t1, t2, t3, t4, t5, t6, t7)
loR = CREATEOBJECT("Empty")
ADDPROPERTY(loR, "id_venchelt", 1201)
ADDPROPERTY(loR, "explicatie", "VENIT MOCK")
RETURN loR
ENDFUNC
PROCEDURE VerificaCodFiscal
LPARAMETERS toDate, tnOptiune, toPartener
DO MockLog WITH "VerificaCodFiscal", "denumire=" + TRANSFORM(toDate.denumire) + ";cod_fiscal=" + TRANSFORM(toDate.cod_fiscal) + ";tip=" + TRANSFORM(toDate.tip_verificare) + ";opt=" + TRANSFORM(tnOptiune)
RETURN 1
ENDPROC

View File

@@ -0,0 +1,69 @@
* mock_cursor_articole.prg - suportul headless al lui test_s3_4_cursor_articole.prg.
* oExecutorMock (subclasa de test a lui oexecutor) intercepteaza DOAR apelul pe cursorul crsarticole:
* jurnalizeaza SQL-ul in gcMockSql, construieste un cursor sintetic dupa gcMockMod (PLIN / PLIN2 = si
* crsarticole1 pentru contracte / GOL / FARA = niciun cursor) si intoarce gnMockSucces cu nEroare =
* gnMockEroare. Orice alt apel (citeste_cursuri_zi) merge la executorul real, prin This.oReal.
* vizualizeaza_curs e inlocuita ca sa nu deschida formularul de cursuri la esecul Oracle -20005; se
* incarca ULTIMA cu SET PROCEDURE ... ADDITIVE, ca sa castige la rezolutia de nume.
* Publicele asteptate de la test: gcMockSql, gcMockMod, gnMockSucces, gnMockEroare, gcMockCurs.
DEFINE CLASS oExecutorMock AS oexecutor
oReal = NULL
PROCEDURE oExecute
LPARAMETERS tcSql, tcCursor, tlProgress, tcTitluProgress, tnHandle, tlShowError, tlQuitOnError, tlReconnect
IF !(UPPER(ALLTRIM(TRANSFORM(tcCursor))) == 'CRSARTICOLE')
RETURN This.oReal.oExecute(tcSql, tcCursor)
ENDIF
gcMockSql = gcMockSql + TRANSFORM(tcSql) + CHR(13) + CHR(10)
This.nEroare = gnMockEroare
This.nSucces = gnMockSucces
DO CreeazaArticole WITH gcMockMod
RETURN gnMockSucces
ENDPROC
FUNCTION oPrelucrareEroare
RETURN "MOCK eroare Oracle " + TRANSFORM(This.nEroare)
ENDFUNC
ENDDEFINE
* cursorul sintetic de articole: campurile citite de blocul testat (gestionabil, curs/nume_val/id_valuta/
* multiplicator/tip_valuta pentru crscursuri, nume_lista_preturi/id_pol pentru crspolitici, id_gestiune/
* nume_gestiune pentru crsgestiunidest) plus campurile luate cu Scatter pe ramura tnTip = 30
PROCEDURE CreeazaArticole
LPARAMETERS tcMod
IF USED('crsarticole')
USE IN crsarticole
ENDIF
IF USED('crsarticole1')
USE IN crsarticole1
ENDIF
IF tcMod == "FARA"
RETURN
ENDIF
CREATE CURSOR crsarticole (id_c N(20), id_articol N(20), id_gestiune N(20), nume_gestiune C(100), ;
cont C(4), um C(10), id_valuta N(10), gestionabil N(1), tip_valuta N(1), curs N(20,4), ;
multiplicator N(10), codmat C(100), preta N(20,4), pretd N(20,4), id_valuta_d N(15), ;
denumire C(100), pretftva N(20,4), pretctva N(20,4), cantitate N(20,4), tvav N(20,4), ;
proc_tvav N(20,4), preturi_cu_tva N(1), nume_val C(20), nume_lista_preturi C(100), id_pol N(20))
IF tcMod == "GOL"
RETURN
ENDIF
INSERT INTO crsarticole VALUES (1, 11, 21, "GEST A", "371", "BUC", 1, 1, 1, 4.9, 1, "CM1", ;
10, 11, 1, "Articol A", 100, 119, 2, 19, 1.19, 0, "EUR", "LISTA A", 31)
INSERT INTO crsarticole VALUES (2, 12, 22, "GEST B", "371", "BUC", 2, 0, 1, 5.1, 1, "CM2", ;
20, 21, 2, "Articol B", 200, 238, 3, 38, 1.19, 0, "USD", "LISTA B", 32)
GO TOP IN crsarticole
IF tcMod == "PLIN2"
CREATE CURSOR crsarticole1 (id_ctr N(20), numar_contract C(100), data D NULL, numar C(50) NULL)
INSERT INTO crsarticole1 VALUES (41, "CTR A", DATE(2026, 1, 1), "A1")
INSERT INTO crsarticole1 VALUES (42, "CTR B", DATE(2026, 2, 1), "B1")
GO TOP IN crsarticole1
ENDIF
ENDPROC
* fara formularul de cursuri in headless - jurnalizeaza doar ca a fost chemata
PROCEDURE vizualizeaza_curs
LPARAMETERS tdDataCurs
gcMockCurs = gcMockCurs + "vizualizeaza_curs(" + TRANSFORM(tdDataCurs) + ")" + CHR(13) + CHR(10)
ENDPROC

View File

@@ -0,0 +1,49 @@
* mock_cursor_preturi.prg - suport headless pentru test_s4_3b_combosql_filtrat.prg.
* oExecutorMockPret (subclasa de test a lui oexecutor) intercepteaza DOAR apelurile pe cursoarele
* brute ale cautarii in linie (crsCodmatRaw / crsDenumireRaw, adica {call ... cursor_preturi ...}):
* jurnalizeaza SQL-ul in gcMockSql si construieste un cursor sintetic dupa structura lui
* cursor_preturi (24 coloane). Orice alt apel (cCboGestiune -> VNOM_GESTIUNI, oAntetFacturare etc.)
* merge la executorul real, prin This.oReal. Se incarca cu SET PROCEDURE ... ADDITIVE dupa harness.
* Publicele asteptate de la test: gcMockSql, gnMockSucces, gnMockEroare.
DEFINE CLASS oExecutorMockPret AS oexecutor
oReal = NULL
PROCEDURE oExecute
LPARAMETERS tcSql, tcCursor, tlProgress, tcTitluProgress, tnHandle, tlShowError, tlQuitOnError, tlReconnect
LOCAL lcCur
lcCur = UPPER(ALLTRIM(TRANSFORM(tcCursor)))
IF lcCur == 'CRSCODMATRAW' OR lcCur == 'CRSDENUMIRERAW'
gcMockSql = gcMockSql + TRANSFORM(tcSql) + CHR(13) + CHR(10)
DO CreeazaRaw WITH lcCur
This.nEroare = gnMockEroare
This.nSucces = gnMockSucces
RETURN gnMockSucces
ENDIF
RETURN This.oReal.oExecute(tcSql, tcCursor)
ENDPROC
FUNCTION oPrelucrareEroare
RETURN "MOCK eroare Oracle " + TRANSFORM(This.nEroare)
ENDFUNC
ENDDEFINE
* cursorul brut sintetic: aceeasi ordine de coloane ca {call pack_facturare.cursor_preturi(...)}
* (24 coloane); campurile cerute de reordonarea locala (codmat/denumire/um/pret/proc_tvav/...).
PROCEDURE CreeazaRaw
LPARAMETERS tcCur
IF USED(tcCur)
USE IN (tcCur)
ENDIF
CREATE CURSOR (tcCur) (id_c N(20), id_articol N(20), lot C(20) NULL, serie C(20) NULL, ;
id_pol N(20), id_valuta N(10), nume_lista_preturi C(100), discount_unitar N(20,4), ;
discount_unitar_val N(20,4), codmat C(100), codbare C(50), denumire C(100), um C(10), ;
gestionabil N(1), cantitate N(20,4), proc_tvav N(20,4), preturi_cu_tva N(1), ;
curs N(20,4), multiplicator N(10), pret N(20,4), pret_val N(20,4), tip_valuta N(1), ;
nume_val C(20), modificabil N(1))
INSERT INTO (tcCur) VALUES (1, 11, NULL, NULL, 31, 1, "LISTA A", 0, 0, ;
"CM1", "CB1", "Articol A", "BUC", 1, 100, 1.19, 0, 4.9, 1, 100, 100, 1, "RON", 1)
INSERT INTO (tcCur) VALUES (2, 12, NULL, NULL, 32, 1, "LISTA B", 0, 0, ;
"CM2", "CB2", "Articol B", "BUC", 0, 200, 1.19, 0, 4.9, 1, 200, 200, 1, "RON", 1)
GO TOP IN (tcCur)
ENDPROC

View File

@@ -0,0 +1,72 @@
* mock_generator_numere.prg - oGeneratorMock, subclasa de test a lui oGeneratorNumere (oserii_numere.prg) care NU
* atinge Oracle: creeaza_cursor_serii construieste un cursor local de serii (FACTURA 5 / PROFORMA 23 -> 3 = cu serie si
* plaje, serii diferite; BON FISCAL 3 -> 2 = fara serie, cu plaje), aloca_numar intoarce un contor local (PUBLIC
* gnMockNumar), dezaloca_numar pune numarul pe 0; toate jurnalizeaza in gcMockApeluri (PUBLIC, declarat de test).
* Se incarca cu SET PROCEDURE ... ADDITIVE dupa harness (are nevoie de oserii_numere.prg pentru clasa parinte).
*----------------------------------------------------------------------------------------
* generator de numere fara Oracle (serii locale, alocare/dezalocare jurnalizate)
DEFINE CLASS oGeneratorMock AS oGeneratorNumere
* seriile: FACTURA (5) si PROFORMA (23) -> 3 (cu serie si plaje, serii diferite), BON FISCAL (3) -> 2 (fara
* serie, cu plaje); cursorul are aceleasi campuri citite de getSerieCursor/getLungimeSerie/aloca_numar
FUNCTION creeaza_cursor_serii
LPARAMETERS tnIdTipDoc
LOCAL lcCursor, lnRezultat, lcAlias
lcAlias = ALIAS()
lcCursor = [crsseriitemp] + ALLTRIM(STR(tnIdTipDoc))
IF USED(lcCursor)
USE IN (lcCursor)
ENDIF
CREATE CURSOR (lcCursor) (id_serie N(10), serie C(10), lungime N(3))
DO CASE
CASE tnIdTipDoc = 23
INSERT INTO (lcCursor) VALUES (9023, "PRO", 5)
lnRezultat = 3
CASE tnIdTipDoc = 3
INSERT INTO (lcCursor) VALUES (9003, "", 5)
lnRezultat = 2
OTHERWISE
INSERT INTO (lcCursor) VALUES (9005, "FAC", 5)
lnRezultat = 3
ENDCASE
GO TOP IN (lcCursor)
This.paPlaje(tnIdTipDoc, 2) = lcCursor
This.paPlaje(tnIdTipDoc, 3) = (MOD(lnRezultat, 2) = 1)
This.paPlaje(tnIdTipDoc, 4) = (lnRezultat >= 2)
gcMockApeluri = gcMockApeluri + "creeaza_cursor_serii(" + TRANSFORM(tnIdTipDoc) + ") -> " + TRANSFORM(lnRezultat) + CHR(13) + CHR(10)
IF !EMPTY(lcAlias)
SELECT (lcAlias)
ENDIF
RETURN lnRezultat
ENDFUNC
FUNCTION aloca_numar
LPARAMETERS tnIdTipDoc, tnIdGestiune
LOCAL lcCursor, lnIdSerie, lcAlias
gnMockNumar = gnMockNumar + 1
lnIdSerie = NULL
IF !ISNULL(This.paPlaje(tnIdTipDoc, 2))
lcCursor = This.paPlaje(tnIdTipDoc, 2)
IF USED(lcCursor)
lcAlias = ALIAS()
SELECT (lcCursor)
lnIdSerie = id_serie
IF !EMPTY(lcAlias)
SELECT (lcAlias)
ENDIF
ENDIF
ENDIF
This.paPlaje(tnIdTipDoc, 1) = gnMockNumar
This.paPlaje(tnIdTipDoc, 5) = lnIdSerie
gcMockApeluri = gcMockApeluri + "aloca_numar(" + TRANSFORM(tnIdTipDoc) + ") -> " + TRANSFORM(gnMockNumar) + CHR(13) + CHR(10)
RETURN gnMockNumar
ENDFUNC
PROCEDURE dezaloca_numar
LPARAMETERS tnIdTipDoc
gcMockApeluri = gcMockApeluri + "dezaloca_numar(" + TRANSFORM(tnIdTipDoc) + ") numar=" + TRANSFORM(This.paPlaje(tnIdTipDoc, 1)) + CHR(13) + CHR(10)
IF !ISNULL(This.paPlaje(tnIdTipDoc, 2))
This.paPlaje(tnIdTipDoc, 1) = 0
ENDIF
ENDPROC
ENDDEFINE

View File

@@ -0,0 +1,29 @@
* mock_validare_antet.prg - pentru test_s3_validare_antet.prg: inlocuieste amessagebox si facturi_duplicate
* (ambele din oproceduri_comune.prg) cu functii care inregistreaza apelul (text + tip + titlu, respectiv
* cont + serie + numar) in gcMockApeluri (PUBLIC, declarat de test) si intorc valori programate:
* amessagebox -> gnMockRaspuns (PUBLIC; implicit 6)
* facturi_duplicate -> gcMockDuplicat (PUBLIC; implicit "" = fara dubluri; netrivial = simuleaza dubluri)
* Se pune PRIMUL in SET PROCEDURE (la nume duplicat castiga primul fisier din lista).
PROCEDURE MockJurnal
LPARAMETERS tcLinie
IF TYPE('gcMockApeluri') = 'C'
gcMockApeluri = gcMockApeluri + tcLinie + CHR(13) + CHR(10)
ENDIF
ENDPROC
FUNCTION amessagebox
LPARAMETERS tcMessage, tnDialogBoxType, tcTitle, tcFont, tnTimeOut, tnTimeoutValue
LOCAL lnRaspuns
lnRaspuns = IIF(TYPE('gnMockRaspuns') = 'N', gnMockRaspuns, 6)
DO MockJurnal WITH "amessagebox([" + STRTRAN(TRANSFORM(tcMessage), CHR(13), "|") + "]," + TRANSFORM(tnDialogBoxType) + ",[" + TRANSFORM(tcTitle) + "]) -> " + TRANSFORM(lnRaspuns)
RETURN lnRaspuns
ENDFUNC
FUNCTION facturi_duplicate
LPARAMETERS tcCont, tnIdFact, tcSerie, tnNumar, tcAltele
LOCAL lcR
lcR = IIF(TYPE('gcMockDuplicat') = 'C', gcMockDuplicat, "")
DO MockJurnal WITH "facturi_duplicate(" + TRANSFORM(tcCont) + "," + TRANSFORM(tnIdFact) + ",[" + TRANSFORM(tcSerie) + "]," + TRANSFORM(tnNumar) + ") -> [" + lcR + "]"
RETURN lcR
ENDFUNC

View File

@@ -0,0 +1,58 @@
* probe_campuri_crsarticole.prg
* READ-ONLY: listeaza structura si prima linie a cursor_preturi(tnTip=22), ca sa gasesc campurile
* de pret pentru un test ulterior (fara nicio scriere in Oracle).
SET SAFETY OFF
SET TALK OFF
LOCAL lcLog
lcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_campuri_crsarticole.log"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), lcLog)
ON ERROR DO ProbeErr 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
STRTOFILE("EROARE: conectare Oracle esuata" + CHR(13)+CHR(10), lcLog, 1)
QUIT
ENDIF
LOCAL lcSql, lnOk
PRIVATE pdZiCurs, pnTip, pnIdValuta, pnIdGestiuneInit, pnLuna, pnAn, pnIdUtil, pnIdSucursala
pdZiCurs = {^2026-08-10}
pnTip = 22
pnIdValuta = NULL
pnIdGestiuneInit = NULL
pnLuna = 8
pnAn = 2026
pnIdUtil = -3
pnIdSucursala = 167
lcSql = [{call ] + gcS + [.pack_facturare.cursor_preturi(?pdZiCurs,?pnTip,?pnIdValuta,?pnIdGestiuneInit,?pnLuna,?pnAn,?pnIdUtil,?pnIdSucursala)}]
lnOk = goExecutor.oExecute(lcSql, 'crsprobe')
IF lnOk < 0
STRTOFILE("EROARE: " + goExecutor.oPrelucrareEroare() + CHR(13)+CHR(10), lcLog, 1)
ELSE
LOCAL laF[1], lnCate, i
lnCate = AFIELDS(laF, 'crsprobe')
STRTOFILE("Reccount=" + TRANSFORM(RECCOUNT('crsprobe')) + " campuri=" + TRANSFORM(lnCate) + CHR(13)+CHR(10), lcLog, 1)
FOR i = 1 TO lnCate
STRTOFILE(" " + laF[i,1] + " " + laF[i,2] + "(" + TRANSFORM(laF[i,3]) + "," + TRANSFORM(laF[i,4]) + ")" + CHR(13)+CHR(10), lcLog, 1)
ENDFOR
IF RECCOUNT('crsprobe') > 0
SELECT crsprobe
GO TOP
LOCAL lcLinie
lcLinie = ''
FOR i = 1 TO lnCate
lcLinie = lcLinie + laF[i,1] + "=[" + TRANSFORM(EVALUATE(laF[i,1])) + "] "
ENDFOR
STRTOFILE(lcLinie + CHR(13)+CHR(10), lcLog, 1)
ENDIF
USE IN crsprobe
ENDIF
STRTOFILE("END " + TTOC(DATETIME()) + CHR(13)+CHR(10), lcLog, 1)
QUIT
PROCEDURE ProbeErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE("ON ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg + CHR(13)+CHR(10), "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_campuri_crsarticole.log", 1)
ENDPROC

View File

@@ -0,0 +1,72 @@
* probe_emitere_reala.prg
* Proba READ-ONLY (fara scriere, fara alocare de numere): verifica daca cursor_preturi
* intoarce randuri pentru clientul RAJA (id_part=463) cu poDate.tip=5 (FACTURA), ca sa decida
* daca CreeazaDocument din test_s3b_emitere_reala.prg poate folosi tnTip=5 direct, sau daca
* trebuie sa refoloseasca tiparul tnTip=22 (deja dovedit in creeaza_documente_s8.prg) cu
* poDate.nIdTipDoc suprascris pe 5.
SET SAFETY OFF
SET TALK OFF
LOCAL lcLog
lcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_emitere_reala.log"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), lcLog)
ON ERROR DO ProbeErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
PUBLIC gcS
gcS = 'MARIUSM_AUTO'
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
STRTOFILE("EROARE: conectare Oracle esuata" + CHR(13)+CHR(10), lcLog, 1)
QUIT
ENDIF
STRTOFILE("Oracle conectat, gnHandle=" + TRANSFORM(gnHandle) + CHR(13)+CHR(10), lcLog, 1)
LOCAL lcSql, lnOk
PRIVATE pdZiCurs, pnTip, pnIdValuta, pnIdGestiuneInit, pnLuna, pnAn, pnIdUtil, pnIdSucursala
pdZiCurs = {^2026-08-10}
pnIdValuta = NULL
pnIdGestiuneInit = NULL
pnLuna = 8
pnAn = 2026
pnIdUtil = -3
pnIdSucursala = NULL
LOCAL ARRAY laTipuri[5], laSucursale[5]
laTipuri[1] = 1
laTipuri[2] = 2
laTipuri[3] = 3
laTipuri[4] = 4
laTipuri[5] = 22
laSucursale[1] = 167
laSucursale[2] = 167
laSucursale[3] = 167
laSucursale[4] = 167
laSucursale[5] = 167
LOCAL lnIdx
FOR lnIdx = 1 TO 5
pnTip = laTipuri[lnIdx]
pnIdSucursala = laSucursale[lnIdx]
lcSql = [{call ] + gcS + [.pack_facturare.cursor_preturi(?pdZiCurs,?pnTip,?pnIdValuta,?pnIdGestiuneInit,?pnLuna,?pnAn,?pnIdUtil,?pnIdSucursala)}]
lnOk = goExecutor.oExecute(lcSql, 'crsprobe')
IF lnOk < 0
STRTOFILE("tip=" + TRANSFORM(pnTip) + " sucursala=" + TRANSFORM(NVL(pnIdSucursala,-1)) + " EROARE: " + goExecutor.oPrelucrareEroare() + CHR(13)+CHR(10), lcLog, 1)
ELSE
STRTOFILE("tip=" + TRANSFORM(pnTip) + " sucursala=" + TRANSFORM(NVL(pnIdSucursala,-1)) + " OK, Reccount=" + TRANSFORM(RECCOUNT('crsprobe')) + CHR(13)+CHR(10), lcLog, 1)
IF RECCOUNT('crsprobe') > 0
SELECT crsprobe
GO TOP
STRTOFILE(" prima linie: id_articol=" + TRANSFORM(NVL(id_articol,-1)) + " denumire=" + TRANSFORM(NVL(denumire,'')) + ;
" id_valuta=" + TRANSFORM(NVL(id_valuta,-1)) + " tip_valuta=" + TRANSFORM(NVL(tip_valuta,-1)) + CHR(13)+CHR(10), lcLog, 1)
ENDIF
IF USED('crsprobe')
USE IN crsprobe
ENDIF
ENDIF
ENDFOR
STRTOFILE("END " + TTOC(DATETIME()) + CHR(13)+CHR(10), lcLog, 1)
QUIT
PROCEDURE ProbeErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE("ON ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg + CHR(13)+CHR(10), "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_emitere_reala.log", 1)
ENDPROC

View File

@@ -0,0 +1,108 @@
* probe_named_notation_odbc.prg
* Verifica daca driverul ODBC Oracle folosit de acest produs (prin goExecutor -> SQLExec, acelasi
* drum ca productia, NU sqlplus) accepta notatia cu nume (param=>valoare) in interiorul escape-ului
* {call ...}, asa cum e folosita in S4g (COMUN\clase\ofacturare.vc2, docs\raport_s4g_vfp.md) pentru
* al 29-lea argument V_CONT_VENIT.
*
* Metoda: procedura de test proprie, minimala, creata si stearsa in schema MARIUSM_AUTO. Procedura
* nu scrie nimic - ridica mereu RAISE_APPLICATION_ERROR cu parametrii primiti inclusi in text, asa
* ca reusita apelului {call} (ajuns pana in PL/SQL) e vizibila direct in mesajul de eroare capturat
* de goExecutor.cEroare, fara sa fie nevoie de parametri OUT sau de scriere de date. Doua apeluri:
* unul pur pozitional (control), unul cu ultimul argument in named notation (cazul S4g).
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\probe_named_notation_odbc.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_named_notation_odbc.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
CLOSE DATABASES
PUBLIC gcLog, gcCaz
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_named_notation_odbc.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)
gcCaz = ""
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
gnIdUtil = 8
DO AfLog WITH "ENV OK"
LOCAL lcProc, lnSucces, lcSql
lcProc = "wip13_test_named_notation_odbc"
*----------------------------------------------------------------------------------------
* setup: procedura de test, minimala, doar ridica eroare cu parametrii primiti - nimic scris
gcCaz = "[setup] "
lcSql = "CREATE OR REPLACE PROCEDURE " + lcProc + "(p1 IN NUMBER, p2 IN NUMBER, p3 IN VARCHAR2 DEFAULT 'DEFAULT_VAL') AS" + ;
" BEGIN RAISE_APPLICATION_ERROR(-20999, 'GOT p1=' || p1 || ' p2=' || p2 || ' p3=' || NVL(p3,'NULL')); END;"
lnSucces = goExecutor.oExecute(lcSql)
DO AfLog WITH "CREATE PROCEDURE: lnSucces=" + TRANSFORM(lnSucces) + " eroare=" + goExecutor.cEroare
IF lnSucces < 0
DO AfLog WITH "STOP: nu s-a putut crea procedura de test - verdict NECONCLUDENT"
DO Final
ENDIF
*----------------------------------------------------------------------------------------
* control: apel pur pozitional, acelasi drum (goExecutor -> SQLExec -> ODBC -> Oracle)
gcCaz = "[pozitional] "
lcSql = "{call " + lcProc + "(1,2,'posval')}"
lnSucces = goExecutor.oExecute(lcSql)
DO AfLog WITH "POZITIONAL sql=[" + lcSql + "] lnSucces=" + TRANSFORM(lnSucces) + " nEroare=" + TRANSFORM(goExecutor.nEroare) + " eroare=[" + goExecutor.cEroare + "]"
LOCAL llPozitionalOk
llPozitionalOk = "GOT p1=1 p2=2 p3=posval" $ goExecutor.cEroare
*----------------------------------------------------------------------------------------
* cazul S4g: ultimul argument in named notation, dupa argumente pozitionale
gcCaz = "[named-notation] "
lcSql = "{call " + lcProc + "(1,2,P3=>'namedval')}"
lnSucces = goExecutor.oExecute(lcSql)
DO AfLog WITH "NAMED sql=[" + lcSql + "] lnSucces=" + TRANSFORM(lnSucces) + " nEroare=" + TRANSFORM(goExecutor.nEroare) + " eroare=[" + goExecutor.cEroare + "]"
LOCAL llNamedOk
llNamedOk = "GOT p1=1 p2=2 p3=namedval" $ goExecutor.cEroare
*----------------------------------------------------------------------------------------
* teardown: sterge procedura de test, indiferent de rezultat
gcCaz = "[teardown] "
lnSucces = goExecutor.oExecute("DROP PROCEDURE " + lcProc)
DO AfLog WITH "DROP PROCEDURE: lnSucces=" + TRANSFORM(lnSucces) + " eroare=" + goExecutor.cEroare
*----------------------------------------------------------------------------------------
DO AfLog WITH "CONTROL (pozitional) OK=" + TRANSFORM(llPozitionalOk)
DO AfLog WITH "NAMED NOTATION OK=" + TRANSFORM(llNamedOk)
IF llPozitionalOk AND llNamedOk
DO AfLog WITH "VERDICT: MERGE - named notation acceptata de driverul ODBC in interiorul {call ...}"
ELSE
IF !llPozitionalOk
DO AfLog WITH "VERDICT: NECONCLUDENT - nici apelul pur pozitional (control) nu a ajuns curat in PL/SQL"
ELSE
DO AfLog WITH "VERDICT: NU MERGE - named notation respinsa/alterata de driverul ODBC (control a mers, named nu)"
ENDIF
ENDIF
DO Final
*----------------------------------------------------------------------------------------
PROCEDURE AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + gcCaz + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,78 @@
# probe_run.ps1 - lansator minimal, fara capturi, pentru probe_totaluri.prg.
# Precompileaza izolat (_precompile.ps1), lanseaza .fxp cu fereastra impinsa off-screen
# (SWP_NOACTIVATE), asteapta out\probe_totaluri.log (semnal final scris de proba), apoi
# opreste procesul. O singura rulare vfp9.exe per apel.
$ErrorActionPreference = 'Stop'
$TestDir = $PSScriptRoot
$TestPrg = Join-Path $TestDir 'probe_totaluri.prg'
$TestFxp = Join-Path $TestDir 'probe_totaluri.fxp'
$OutLog = Join-Path $TestDir 'out\probe_totaluri.log'
$SyncDir = Join-Path $TestDir 'uisync_probe'
$DoneFile = Join-Path $SyncDir 'done.txt'
$Vfp = 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe'
$Precompile = Join-Path (Split-Path $TestDir -Parent) '_precompile.ps1'
Add-Type @"
using System;
using System.Runtime.InteropServices;
public class Win32UiProbe {
[DllImport("user32.dll")]
public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
[DllImport("user32.dll")]
public static extern bool IsWindow(IntPtr hWnd);
public static readonly IntPtr HWND_BOTTOM = new IntPtr(1);
public const uint SWP_NOSIZE = 0x0001;
public const uint SWP_NOACTIVATE = 0x0010;
}
"@
function Push-Offscreen([IntPtr]$Hwnd) {
if ($Hwnd -eq [IntPtr]::Zero -or -not [Win32UiProbe]::IsWindow($Hwnd)) { return }
[Win32UiProbe]::SetWindowPos($Hwnd, [Win32UiProbe]::HWND_BOTTOM, -4000, 0, 0, 0, ([Win32UiProbe]::SWP_NOSIZE -bor [Win32UiProbe]::SWP_NOACTIVATE)) | Out-Null
}
function Stop-VfpProprii([string]$Marker) {
Get-CimInstance Win32_Process -Filter "Name='vfp9.exe'" -ErrorAction SilentlyContinue | ForEach-Object {
if ($_.CommandLine -and $_.CommandLine.ToLower().Contains($Marker.ToLower())) {
Stop-Process -Id $_.ProcessId -Force -ErrorAction SilentlyContinue
}
}
}
if (-not (Test-Path (Join-Path $TestDir 'out'))) { New-Item -ItemType Directory -Path (Join-Path $TestDir 'out') | Out-Null }
if (-not (Test-Path $SyncDir)) { New-Item -ItemType Directory -Path $SyncDir | Out-Null }
Get-ChildItem -Path $SyncDir -File -ErrorAction SilentlyContinue | Remove-Item -Force -ErrorAction SilentlyContinue
if (Test-Path $OutLog) { Remove-Item $OutLog -Force }
Stop-VfpProprii $TestDir
Start-Sleep -Milliseconds 500
Write-Host "Precompilez: $Precompile -Prg $TestPrg"
$pc = Start-Process powershell -WindowStyle Hidden -ArgumentList @('-ExecutionPolicy','Bypass','-File', "`"$Precompile`"", '-Prg', "`"$TestPrg`"") -Wait -PassThru
Start-Sleep -Seconds 2
Stop-VfpProprii $TestDir
Start-Sleep -Seconds 2
if (-not (Test-Path $TestFxp)) { Write-Warning "Nu s-a generat $TestFxp"; exit 1 }
Write-Host "Lansez VFP: $Vfp -A $TestFxp"
$proc = Start-Process -FilePath $Vfp -ArgumentList @('-A', "`"$TestFxp`"") -PassThru
$hwnd = [IntPtr]::Zero
$deadline = (Get-Date).AddSeconds(150)
$doneSeen = $false
while ((Get-Date) -lt $deadline) {
if (-not $proc.HasExited) {
$proc.Refresh()
if ($hwnd -eq [IntPtr]::Zero -and $proc.MainWindowHandle -ne [IntPtr]::Zero) { $hwnd = $proc.MainWindowHandle }
Push-Offscreen $hwnd
}
if (Test-Path $DoneFile) { $doneSeen = $true; break }
if ($proc.HasExited) { break }
Start-Sleep -Milliseconds 500
}
if ($doneSeen) {
Write-Host "done.txt detectat: $((Get-Content $DoneFile -Raw).Trim())"
} else {
Write-Warning "TIMEOUT sau proces iesit fara done.txt."
}
Start-Sleep -Milliseconds 800
if ($proc -and -not $proc.HasExited) { try { $proc.Kill() } catch {} }
Stop-VfpProprii $TestDir
Write-Host "GATA."

View File

@@ -0,0 +1,208 @@
* probe_s4g_e2e_positional.prg
* Proba end-to-end (S4g, reparatie pozitionala): apel real prin goExecutor catre
* pack_facturare.adauga_articol_factura, cu argumentele 28/29 pozitionale asa cum le scrie
* acum COMUN\clase\ofacturare.vc2 (do_scrie_articole, ambele clase). Verifica ca apelul
* AJUNGE in PL/SQL (nu doar ca sirul se construieste corect) si ca V_CONT_VENIT (poz. 29)
* ajunge in VANZARI_DETALII_TEMP.CONT_VENIT. Tranzactie cu ROLLBACK, zero date consumate.
*
* Rulare: vfp9.exe -A -T "...\probe_s4g_e2e_positional.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_s4g_e2e_positional.log
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
CLOSE DATABASES
PUBLIC gcLog, gcCaz
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_s4g_e2e_positional.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)
gcCaz = ""
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
gnIdUtil = 8
DO AfLog WITH "ENV OK"
PRIVATE lnSucces, lcSql, lnIdArticol, lnIdTemp1, lnIdTemp2, lnIdTemp3, lcContAsteptat, lcContObtinut1, lcContObtinut2, lcContObtinut3, ;
lnTransOriginal, lnCantObtinut1, lnCantObtinut2, lnCantObtinut3
*----------------------------------------------------------------------------------------
* confirmare diagnostic: VANZARI_DETALII_TEMP e GTT cu ON COMMIT DELETE ROWS
gcCaz = "[diag-gtt] "
lnSucces = goExecutor.oExecute([select temporary, duration from user_tables where table_name = 'VANZARI_DETALII_TEMP'],[crsgtt])
IF lnSucces >= 0 AND USED('crsgtt') AND RECCOUNT('crsgtt') = 1
DO AfLog WITH "DIAG user_tables VANZARI_DETALII_TEMP: temporary=[" + ALLTRIM(crsgtt.temporary) + "] duration=[" + ALLTRIM(NVL(crsgtt.duration,'<NULL>')) + "]"
DO Assert WITH ALLTRIM(crsgtt.temporary) == "Y" AND ALLTRIM(NVL(crsgtt.duration,'')) == "SYS$TRANSACTION", ;
"VANZARI_DETALII_TEMP e GTT ON COMMIT DELETE ROWS (TEMPORARY=Y, DURATION=SYS$TRANSACTION)"
ELSE
DO AfLog WITH "DIAG user_tables: lnSucces=" + TRANSFORM(lnSucces) + " used=" + TRANSFORM(USED('crsgtt'))
ENDIF
IF USED('crsgtt')
USE IN crsgtt
ENDIF
* tranzactie manuala, ca sa nu piarda autocommit-ul randul din GTT (ON COMMIT DELETE ROWS)
* inainte ca SELECT-ul de verificare sa apuce sa-l citeasca; se restaureaza la iesire (Final)
lnTransOriginal = SQLGetprop(goExecutor.nHandle,"Transactions")
DO AfLog WITH "DIAG Transactions inainte de proba=" + TRANSFORM(lnTransOriginal)
SQLSetprop(goExecutor.nHandle,"Transactions",2)
*----------------------------------------------------------------------------------------
* date reale de ancora: un articol si o coloana JTVA valida, plus contul de venit derivat
* (aceeasi formula pe care o cablaza VFP - reprodusa aici direct pe date, nu prin apel la
* deriva_cont_venit_fara_pol, ca sa nu depinda de alt fisier .prg pentru proba)
gcCaz = "[setup] "
lnSucces = goExecutor.oExecute([select id_articol from nom_articole where id_articol > 0 and rownum = 1],[crsart])
DO Assert WITH lnSucces >= 0 AND USED('crsart') AND RECCOUNT('crsart') = 1, "articol de ancora gasit"
lnIdArticol = 0
IF USED('crsart') AND RECCOUNT('crsart') = 1
lnIdArticol = crsart.id_articol
ENDIF
IF USED('crsart')
USE IN crsart
ENDIF
lnSucces = goExecutor.oExecute([select nvl((select cont_venit from vcoresp_cont_venchelt where cont = 'ZZ_INEXISTENT' and cont_venit is not null),] + ;
[case when substr('ZZ_INEXISTENT',1,1) in ('6','7') then 'ZZ_INEXISTENT' else '704' end) as cont_venit from dual],[crscv])
lcContAsteptat = "704"
IF USED('crscv')
USE IN crscv
ENDIF
lnIdTemp1 = -999901
lnIdTemp2 = -999902
lnIdTemp3 = -999903
*----------------------------------------------------------------------------------------
* (a) linie FARA id_pol -> id_pol=NULL, cont_venit pozitional pe locul 29 = '704'
gcCaz = "[a-fara-id_pol] "
lcSql = [begin pack_facturare.adauga_articol_factura(] + Transform(lnIdTemp1) + [,] + Transform(lnIdArticol) + ;
[,'','',NULL,-1000,0,0,NULL,0,3,0,1,10,0,NULL,1,1,176,NULL,NULL,0,NULL,NULL,] + Transform(gnIdUtil) + ;
[,NULL,NULL,NULL,'] + lcContAsteptat + ['); end;]
lnSucces = goExecutor.oExecute(lcSql)
DO AfLog WITH "(a) sql=[" + lcSql + "] lnSucces=" + TRANSFORM(lnSucces) + " nEroare=" + TRANSFORM(goExecutor.nEroare) + " eroare=[" + goExecutor.cEroare + "]"
DO Assert WITH lnSucces >= 0, "(a) apelul RPC trece (ajunge in PL/SQL, fara eroare ODBC/PLSQL)"
lcContObtinut1 = "?"
IF lnSucces >= 0
LOCAL lnDiagSucces
lnDiagSucces = goExecutor.oExecute([select id_temp, nvl(cont_venit,'<NULL>') as cont_venit from vanzari_detalii_temp where id_temp < 0],[crsdiag])
DO AfLog WITH "DIAG toate id_temp<0: lnSucces=" + TRANSFORM(lnDiagSucces) + " used=" + TRANSFORM(USED('crsdiag')) + " reccount=" + IIF(USED('crsdiag'),TRANSFORM(RECCOUNT('crsdiag')),"n/a")
IF USED('crsdiag')
SELECT crsdiag
SCAN
DO AfLog WITH "DIAG rand: id_temp=" + TRANSFORM(crsdiag.id_temp) + " cont_venit=" + ALLTRIM(crsdiag.cont_venit)
ENDSCAN
USE IN crsdiag
ENDIF
DO AfLog WITH "DIAG SQLGetprop Transactions=" + TRANSFORM(SQLGetprop(goExecutor.nHandle,"Transactions")) + " nHandle=" + TRANSFORM(goExecutor.nHandle)
lnSucces = goExecutor.oExecute([select nvl(cont_venit,'<NULL>') as cont_venit, nvl(cantitate,-1) as cantitate from vanzari_detalii_temp where id_temp = ] + Transform(lnIdTemp1),[crsverif1])
DO AfLog WITH "(a) verif: lnSucces=" + TRANSFORM(lnSucces) + " used=" + TRANSFORM(USED('crsverif1')) + " reccount=" + IIF(USED('crsverif1'),TRANSFORM(RECCOUNT('crsverif1')),"n/a") + " eroare=[" + goExecutor.cEroare + "]"
lnCantObtinut1 = -1
IF lnSucces >= 0 AND USED('crsverif1') AND RECCOUNT('crsverif1') = 1
lcContObtinut1 = ALLTRIM(crsverif1.cont_venit)
lnCantObtinut1 = crsverif1.cantitate
ENDIF
IF USED('crsverif1')
USE IN crsverif1
ENDIF
ENDIF
DO Assert WITH lcContObtinut1 == lcContAsteptat, "(a) CONT_VENIT in VANZARI_DETALII_TEMP = [" + lcContAsteptat + "], obtinut [" + lcContObtinut1 + "]"
DO Assert WITH lnCantObtinut1 = 10, "(a) CANTITATE (aliniere pozitionala, poz. 14) = 10, obtinut [" + TRANSFORM(lnCantObtinut1) + "]"
*----------------------------------------------------------------------------------------
* (b) linie CU id_pol -> id_pol populat, cont_venit pozitional pe locul 29 = NULL explicit
gcCaz = "[b-cu-id_pol] "
lcSql = [begin pack_facturare.adauga_articol_factura(] + Transform(lnIdTemp2) + [,] + Transform(lnIdArticol) + ;
[,'','',63,-1000,0,0,NULL,0,3,0,1,10,0,NULL,1,1,176,NULL,NULL,0,NULL,NULL,] + Transform(gnIdUtil) + ;
[,NULL,NULL,NULL,NULL); end;]
lnSucces = goExecutor.oExecute(lcSql)
DO AfLog WITH "(b) sql=[" + lcSql + "] lnSucces=" + TRANSFORM(lnSucces) + " nEroare=" + TRANSFORM(goExecutor.nEroare) + " eroare=[" + goExecutor.cEroare + "]"
DO Assert WITH lnSucces >= 0, "(b) apelul RPC trece (ajunge in PL/SQL, fara eroare ODBC/PLSQL)"
lcContObtinut2 = "?"
IF lnSucces >= 0
lnSucces = goExecutor.oExecute([select nvl(cont_venit,'<NULL>') as cont_venit, nvl(cantitate,-1) as cantitate from vanzari_detalii_temp where id_temp = ] + Transform(lnIdTemp2),[crsverif2])
DO AfLog WITH "(b) verif: lnSucces=" + TRANSFORM(lnSucces) + " used=" + TRANSFORM(USED('crsverif2')) + " reccount=" + IIF(USED('crsverif2'),TRANSFORM(RECCOUNT('crsverif2')),"n/a") + " eroare=[" + goExecutor.cEroare + "]"
lnCantObtinut2 = -1
IF lnSucces >= 0 AND USED('crsverif2') AND RECCOUNT('crsverif2') = 1
lcContObtinut2 = ALLTRIM(crsverif2.cont_venit)
lnCantObtinut2 = crsverif2.cantitate
ENDIF
IF USED('crsverif2')
USE IN crsverif2
ENDIF
ENDIF
DO Assert WITH lcContObtinut2 == "<NULL>", "(b) CONT_VENIT ramane NULL (comportament neschimbat), obtinut [" + lcContObtinut2 + "]"
DO Assert WITH lnCantObtinut2 = 10, "(b) CANTITATE (aliniere pozitionala, poz. 14) = 10, obtinut [" + TRANSFORM(lnCantObtinut2) + "]"
*----------------------------------------------------------------------------------------
* (c) linie de RATA reala (id_articol=NULL SI id_pol=NULL deodata) - combinatia gasita in
* productie pe VANZARI_DETALII pentru liniile financiare scrise de do_adauga_rata, sursa
* PACK_FACTURARE.cursor_contract (ramura CTR_SCADENTAR, "NULL AS ID_POL" + "null as id_articol")
gcCaz = "[c-rata-fara-articol-si-pol] "
lcSql = [begin pack_facturare.adauga_articol_factura(] + Transform(lnIdTemp3) + ;
[,NULL,'','',NULL,-1000,0,0,NULL,0,3,0,1,10,0,NULL,1,1,176,NULL,NULL,0,NULL,NULL,] + Transform(gnIdUtil) + ;
[,NULL,NULL,NULL,'] + lcContAsteptat + ['); end;]
lnSucces = goExecutor.oExecute(lcSql)
DO AfLog WITH "(c) sql=[" + lcSql + "] lnSucces=" + TRANSFORM(lnSucces) + " nEroare=" + TRANSFORM(goExecutor.nEroare) + " eroare=[" + goExecutor.cEroare + "]"
DO Assert WITH lnSucces >= 0, "(c) apelul RPC trece cu id_articol=NULL si id_pol=NULL (ajunge in PL/SQL, fara eroare ODBC/PLSQL)"
lcContObtinut3 = "?"
IF lnSucces >= 0
lnSucces = goExecutor.oExecute([select nvl(cont_venit,'<NULL>') as cont_venit, nvl(cantitate,-1) as cantitate from vanzari_detalii_temp where id_temp = ] + Transform(lnIdTemp3),[crsverif3])
DO AfLog WITH "(c) verif: lnSucces=" + TRANSFORM(lnSucces) + " used=" + TRANSFORM(USED('crsverif3')) + " reccount=" + IIF(USED('crsverif3'),TRANSFORM(RECCOUNT('crsverif3')),"n/a") + " eroare=[" + goExecutor.cEroare + "]"
lnCantObtinut3 = -1
IF lnSucces >= 0 AND USED('crsverif3') AND RECCOUNT('crsverif3') = 1
lcContObtinut3 = ALLTRIM(crsverif3.cont_venit)
lnCantObtinut3 = crsverif3.cantitate
ENDIF
IF USED('crsverif3')
USE IN crsverif3
ENDIF
ENDIF
DO Assert WITH lcContObtinut3 == lcContAsteptat, "(c) CONT_VENIT in VANZARI_DETALII_TEMP = [" + lcContAsteptat + "], obtinut [" + lcContObtinut3 + "]"
DO Assert WITH lnCantObtinut3 = 10, "(c) CANTITATE (aliniere pozitionala, poz. 14) = 10, obtinut [" + TRANSFORM(lnCantObtinut3) + "]"
*----------------------------------------------------------------------------------------
gcCaz = "[rollback] "
lnSucces = goExecutor.oExecute("ROLLBACK")
DO AfLog WITH "ROLLBACK: lnSucces=" + TRANSFORM(lnSucces) + " eroare=" + goExecutor.cEroare
SQLSetprop(goExecutor.nHandle,"Transactions",lnTransOriginal)
DO AfLog WITH "DIAG Transactions restaurat la=" + TRANSFORM(SQLGetprop(goExecutor.nHandle,"Transactions"))
DO Final
*----------------------------------------------------------------------------------------
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
DO AfLog WITH "PASS: " + gcCaz + tcMsg
ELSE
DO AfLog WITH "FAIL: " + gcCaz + tcMsg
ENDIF
ENDPROC
PROCEDURE AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + gcCaz + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,198 @@
* probe_s6_3_surse.prg - alege sursele pentru S6-3 (paritate v1/v2 pe AVIZ tip 4 si RETUR tip 8)
* din MARIUSM_AUTO. Nu emite nimic, nu aloca numere: doar SELECT + apelurile de cursor pe care le
* face incarca_cursor_articole (pack_facturare.cursor_avize si pack_facturare.cursor_retur).
* Sunt necesare DOUA surse distincte per tip: prima emitere consuma sursa (avizul se marcheaza
* facturat, cantitatea de retur se epuizeaza), deci v1 si v2 nu pot pleca din acelasi document.
* Clientii cu 'CLIENT' in nume se exclud: valideaza_antet le deschide dialogul "in loc de BON FISCAL".
* Rulare: vfp9.exe -A -T probe_s6_3_surse.prg
SET SAFETY OFF
SET TALK OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET DECIMALS TO 4
SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcLog
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_s6_3_surse.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)
*-- poDate + pnTotalDiscountAvize la nivelul programului principal: cursor_avize primeste
*-- ?@pnTotalDiscountAvize prin referinta, iar oExecute il rezolva din stiva apelantului.
PRIVATE poDate, pnTotalDiscountAvize
poDate = NULL
pnTotalDiscountAvize = 0
ON ERROR DO PsLog WITH 'ON ERROR ' + TRANSFORM(ERROR()) + ' [' + PROGRAM() + ':' + TRANSFORM(LINENO()) + '] ' + MESSAGE()
ON SHUTDOWN QUIT
TRY
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 PsLog WITH 'EROARE: conectare Oracle esuata'
QUIT
ENDIF
SQLSETPROP(gnHandle, "QueryTimeOut", 45)
IF !actualizeaza_optiuni_program()
DO PsLog WITH 'EROARE: actualizeaza_optiuni_program()'
QUIT
ENDIF
gnScadereStoc = 0
gnFactSeturi = 0
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 PsLog WITH 'ENV OK gnHandle=' + TRANSFORM(gnHandle) + ' gcS=' + gcS + ' gnAn=' + TRANSFORM(gnAn) + ;
' gnLuna=' + TRANSFORM(gnLuna) + ' gl406=' + TRANSFORM(TYPE('gl406') = 'L' AND gl406)
DO PsLog WITH 'gcCondSucursala=[' + TRANSFORM(gcCondSucursala) + ']'
poDate = CREATEOBJECT('empty')
ADDPROPERTY(poDate, 'listaid', '')
ADDPROPERTY(poDate, 'in_valuta', 0)
DO PsLog WITH CHR(13) + CHR(10) + '===== AVIZE NEFACTURATE (sursa tip 4) ====='
DO SondaAvize
DO PsLog WITH CHR(13) + CHR(10) + '===== FACTURI RETURNABILE (sursa tip 8, lei) ====='
DO SondaRetur
DO PsLog WITH CHR(13) + CHR(10) + 'END ' + TTOC(DATETIME())
CATCH TO loExc
DO PsLog WITH 'CATCH ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' ' + loExc.Message + ;
' Proc=' + loExc.Procedure + ':' + TRANSFORM(loExc.LineNo)
ENDTRY
QUIT
*==================================================================================
* Avizele nefacturate, grupate pe client - filtrul e cel din caut_avize
* (oproceduri_facturare.prg:2038): tip in (21,22,26,42), facturat = 0, plus gcCondSucursala.
PROCEDURE SondaAvize
LOCAL lnQ, lcLista, lnI, lnLinii, lnNeg, lnGest, lnClienti
lnQ = goExecutor.oExecute([select a.id_part, p.nume, count(*) as nr ] + ;
[from vanzari a, nom_parteneri p ] + ;
[where a.id_part = p.id_part and a.sters = 0 and a.tip in (21,22,26,42) and a.facturat = 0 ] + ;
STRTRAN(gcCondSucursala, [id_sucursala], [a.id_sucursala]) + ;
[ and upper(p.nume) not like '%CLIENT%' group by a.id_part, p.nume order by 3 desc], 'crsAvClienti')
IF lnQ < 0 OR !USED('crsAvClienti')
DO PsLog WITH 'EROARE lista clienti cu avize: ' + TRANSFORM(goExecutor.oPrelucrareEroare())
RETURN
ENDIF
lnClienti = RECCOUNT('crsAvClienti')
DO PsLog WITH 'clienti cu avize nefacturate (fara CLIENT in nume) = ' + TRANSFORM(lnClienti)
IF lnClienti = 0
RETURN
ENDIF
lnI = 0
SELECT crsAvClienti
SCAN WHILE lnI < 12
lnI = lnI + 1
LOCAL lnIdPart, lcNume
lnIdPart = crsAvClienti.id_part
lcNume = ALLTRIM(NVL(crsAvClienti.nume, ''))
*-- lista de id_vanzare exact ca in do_cauta_avize (ofacturare_antet.prg:73-77)
DO Inchide WITH 'crsAvDoc'
IF goExecutor.oExecute([select a.id_vanzare, a.serie_act, a.numar_act, a.tip ] + ;
[from vanzari a where a.sters = 0 and a.tip in (21,22,26,42) and a.facturat = 0 ] + ;
STRTRAN(gcCondSucursala, [id_sucursala], [a.id_sucursala]) + ;
[ and a.id_part = ] + TRANSFORM(lnIdPart) + [ order by a.id_vanzare], 'crsAvDoc') < 0
DO PsLog WITH ' client ' + TRANSFORM(lnIdPart) + ': EROARE avize'
SELECT crsAvClienti
LOOP
ENDIF
lcLista = cursor2lista('crsAvDoc', 'id_vanzare', ',')
poDate.listaid = lcLista
pnTotalDiscountAvize = 0
DO Inchide WITH 'crsartav'
lnQ = goExecutor.oExecute([{call ] + gcS + [.pack_facturare.cursor_avize(?poDate.listaid,?gnIdUtil,?@pnTotalDiscountAvize)}], 'crsartav')
lnLinii = IIF(lnQ >= 0 AND USED('crsartav'), RECCOUNT('crsartav'), -1)
lnNeg = 0
lnGest = 0
IF lnLinii > 0
SELECT crsartav
COUNT FOR cantitate < 0 TO lnNeg
COUNT FOR NVL(gestionabil, 0) = 1 TO lnGest
ENDIF
DO PsLog WITH ' client ' + TRANSFORM(lnIdPart) + ' [' + lcNume + '] avize=' + ;
TRANSFORM(RECCOUNT('crsAvDoc')) + ' listaid=[' + lcLista + '] -> cursor_avize linii=' + ;
TRANSFORM(lnLinii) + ' negative=' + TRANSFORM(lnNeg) + ' gestionabile=' + TRANSFORM(lnGest) + ;
' discountAvize=' + TRANSFORM(pnTotalDiscountAvize)
DO Inchide WITH 'crsartav'
DO Inchide WITH 'crsAvDoc'
SELECT crsAvClienti
ENDSCAN
DO Inchide WITH 'crsAvClienti'
ENDPROC
*==================================================================================
* Facturile din care se poate face retur - filtrul e cel din caut_facturi_multiple_client
* (oproceduri_facturare.prg:2110): fact_vfacturi, tip in (...), in_valuta = 0.
PROCEDURE SondaRetur
LOCAL lnQ, lnI, lnLinii, lnNeg, lnGest, lnTotal
lnQ = goExecutor.oExecute([select f.id_vanzare, f.id_part, p.nume, f.serie_act, f.numar_act, f.tip ] + ;
[from fact_vfacturi f, nom_parteneri p ] + ;
[where f.id_part = p.id_part and f.sters = 0 and f.tip in (1,2,3,4,5,6,10,-1,-2,-3,-4,-11) ] + ;
[and f.in_valuta = 0 ] + STRTRAN(gcCondSucursala, [id_sucursala], [f.id_sucursala]) + ;
[ and upper(p.nume) not like '%CLIENT%' order by f.id_vanzare desc], 'crsRetLista')
IF lnQ < 0 OR !USED('crsRetLista')
DO PsLog WITH 'EROARE lista facturi returnabile: ' + TRANSFORM(goExecutor.oPrelucrareEroare())
RETURN
ENDIF
lnTotal = RECCOUNT('crsRetLista')
DO PsLog WITH 'facturi returnabile in lei (fara CLIENT in nume) = ' + TRANSFORM(lnTotal)
IF lnTotal = 0
RETURN
ENDIF
lnI = 0
SELECT crsRetLista
SCAN WHILE lnI < 20
lnI = lnI + 1
LOCAL lnIdVz, lnIdPart2, lcNume2, lcSerie2, lnNr2
lnIdVz = crsRetLista.id_vanzare
lnIdPart2 = crsRetLista.id_part
lcNume2 = ALLTRIM(NVL(crsRetLista.nume, ''))
lcSerie2 = ALLTRIM(NVL(crsRetLista.serie_act, ''))
lnNr2 = NVL(crsRetLista.numar_act, 0)
poDate.listaid = ALLTRIM(TRANSFORM(lnIdVz))
poDate.in_valuta = 0
DO Inchide WITH 'crsartret'
lnQ = goExecutor.oExecute([{call ] + gcS + [.pack_facturare.cursor_retur(?poDate.in_valuta,?poDate.listaid,?gnIdUtil)}], 'crsartret')
lnLinii = IIF(lnQ >= 0 AND USED('crsartret'), RECCOUNT('crsartret'), -1)
lnNeg = 0
lnGest = 0
IF lnLinii > 0
SELECT crsartret
COUNT FOR cantitate < 0 TO lnNeg
COUNT FOR NVL(gestionabil, 0) = 1 TO lnGest
ENDIF
DO PsLog WITH ' factura ' + TRANSFORM(lnIdVz) + ' (' + lcSerie2 + ' ' + TRANSFORM(lnNr2) + ') client ' + ;
TRANSFORM(lnIdPart2) + ' [' + lcNume2 + '] -> cursor_retur linii=' + TRANSFORM(lnLinii) + ;
' negative=' + TRANSFORM(lnNeg) + ' gestionabile=' + TRANSFORM(lnGest)
DO Inchide WITH 'crsartret'
SELECT crsRetLista
ENDSCAN
DO Inchide WITH 'crsRetLista'
ENDPROC
*==================================================================================
PROCEDURE Inchide
LPARAMETERS tcAlias
IF USED(tcAlias)
USE IN (tcAlias)
ENDIF
ENDPROC
PROCEDURE PsLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC

View File

@@ -0,0 +1,21 @@
$ErrorActionPreference = 'Stop'
$dir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat'
$prg = Join-Path $dir 'probe_s6_3_surse.prg'
$log = Join-Path $dir 'out\probe_s6_3_surse.log'
$vfp = 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe'
$viu = Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*probe_s6_3_surse*' }
if ($viu) { "Ruleaza deja (PID " + ($viu.ProcessId -join ',') + ")"; exit 1 }
Set-Location $dir
Remove-Item (Join-Path $dir 'probe_s6_3_surse.FXP') -ErrorAction SilentlyContinue
Remove-Item $log -ErrorAction SilentlyContinue
$p = Start-Process -FilePath $vfp -ArgumentList '-A', '-T', $prg -PassThru
"lansat PID " + $p.Id
$null = $p.WaitForExit(240000)
if (-not $p.HasExited) {
"ATARNAT dupa 240s - omor instanta"
Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*probe_s6_3_surse*' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force }
}
if (Test-Path $log) { Get-Content $log } else { "Log inexistent: $log" }

View File

@@ -0,0 +1,112 @@
* probe_s8_surse.prg - alege sursele pentru test_s8_cablare_incarcare (comanda tip 3 din
* MARIUSM_AUTO): una obisnuita si una cu linie de discount (cantitate negativa).
* Cheama direct pack_facturare.cursor_comanda, exact cum o face incarca_cursor_articole.
* Rulare: vfp9.exe -A -T probe_s8_surse.prg
SET SAFETY OFF
SET TALK OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET DECIMALS TO 4
SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcLog
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_s8_surse.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)
ON ERROR DO PsLog WITH 'ON ERROR ' + TRANSFORM(ERROR()) + ' [' + PROGRAM() + ':' + TRANSFORM(LINENO()) + '] ' + MESSAGE()
ON SHUTDOWN QUIT
TRY
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 PsLog WITH 'EROARE: conectare Oracle esuata'
QUIT
ENDIF
SQLSETPROP(gnHandle, "QueryTimeOut", 45)
IF !actualizeaza_optiuni_program()
DO PsLog WITH 'EROARE: actualizeaza_optiuni_program()'
QUIT
ENDIF
gnScadereStoc = 0
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 PsLog WITH 'ENV OK gnHandle=' + TRANSFORM(gnHandle) + ' gcS=' + gcS
LOCAL lnQ
lnQ = goExecutor.oExecute([select c.id_comanda, c.nr_comanda, c.id_part, p.nume ] + ;
[from comenzi c, nom_parteneri p where c.id_part = p.id_part ] + ;
[order by c.id_comanda desc], 'crsCom')
IF lnQ < 0 OR !USED('crsCom')
DO PsLog WITH 'EROARE lista comenzi: ' + TRANSFORM(goExecutor.oPrelucrareEroare())
QUIT
ENDIF
DO PsLog WITH 'comenzi total=' + TRANSFORM(RECCOUNT('crsCom'))
PRIVATE poDate
poDate = CREATEOBJECT('empty')
ADDPROPERTY(poDate, 'zi_curs', DATE())
ADDPROPERTY(poDate, 'tip', 3)
ADDPROPERTY(poDate, 'listaid', '')
LOCAL lnI, lnNeg, lnGest, lnCnt, lcLinie, lnCandidati
lnCandidati = 0
SELECT crsCom
GO TOP
SCAN WHILE lnCandidati < 60
lnCandidati = lnCandidati + 1
poDate.listaid = ALLTRIM(TRANSFORM(crsCom.id_comanda))
lcLinie = 'id_comanda=' + PADR(poDate.listaid, 8) + ' nr=' + PADR(ALLTRIM(TRANSFORM(crsCom.nr_comanda)), 10) + ;
' client=' + PADR(ALLTRIM(NVL(crsCom.nume, '')), 30)
IF USED('crsart')
USE IN crsart
ENDIF
lnQ = goExecutor.oExecute([{call ] + gcS + [.pack_facturare.cursor_comanda(?poDate.zi_curs,?poDate.tip,?poDate.listaid,?gnIdUtil)}], 'crsart')
IF lnQ < 0
DO PsLog WITH lcLinie + ' -> EROARE ' + TRANSFORM(goExecutor.oPrelucrareEroare())
ELSE
lnCnt = RECCOUNT('crsart')
lnNeg = 0
lnGest = 0
IF lnCnt > 0
SELECT crsart
COUNT FOR cantitate < 0 TO lnNeg
COUNT FOR NVL(gestionabil, 0) = 1 TO lnGest
ENDIF
DO PsLog WITH lcLinie + ' -> linii=' + TRANSFORM(lnCnt) + ' negative=' + TRANSFORM(lnNeg) + ' gestionabile=' + TRANSFORM(lnGest)
ENDIF
SELECT crsCom
ENDSCAN
*-- structura cursorului, o singura data, pe ultima comanda cu linii
IF USED('crsart') AND RECCOUNT('crsart') > 0
LOCAL ARRAY laF[1]
LOCAL lnF, lcS
lnF = AFIELDS(laF, 'crsart')
lcS = ''
FOR lnI = 1 TO lnF
lcS = lcS + laF[lnI, 1] + ' '
ENDFOR
DO PsLog WITH 'CAMPURI crsarticole: ' + lcS
ENDIF
DO PsLog WITH 'END ' + TTOC(DATETIME())
CATCH TO loExc
DO PsLog WITH 'CATCH ' + TRANSFORM(loExc.ErrorNo) + ' ' + loExc.Message + ' [' + loExc.Procedure + ':' + TRANSFORM(loExc.LineNo) + ']'
ENDTRY
QUIT
PROCEDURE PsLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC

View File

@@ -0,0 +1,21 @@
$ErrorActionPreference = 'Stop'
$dir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat'
$prg = Join-Path $dir 'probe_s8_surse.prg'
$log = Join-Path $dir 'out\probe_s8_surse.log'
$vfp = 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe'
$viu = Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*probe_s8_surse*' }
if ($viu) { "Ruleaza deja (PID " + ($viu.ProcessId -join ',') + ")"; exit 1 }
Set-Location $dir
Remove-Item (Join-Path $dir 'probe_s8_surse.FXP') -ErrorAction SilentlyContinue
Remove-Item $log -ErrorAction SilentlyContinue
$p = Start-Process -FilePath $vfp -ArgumentList '-A', '-T', $prg -PassThru
"lansat PID " + $p.Id
$null = $p.WaitForExit(240000)
if (-not $p.HasExited) {
"ATARNAT dupa 240s - omor instanta"
Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*probe_s8_surse*' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force }
}
if (Test-Path $log) { Get-Content $log } else { "Log inexistent: $log" }

View File

@@ -0,0 +1,32 @@
SET SAFETY OFF
SET TALK OFF
LOCAL lcLog
lcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_stare_finala.log"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), lcLog)
ON ERROR DO PErr 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
STRTOFILE("EROARE conectare" + CHR(13)+CHR(10), lcLog, 1)
QUIT
ENDIF
gnIdUtil = 8
gnIdSucursala = 167
PRIVATE poGeneratorNumere
poGeneratorNumere = CREATEOBJECT('oGeneratorNumere')
poGeneratorNumere.ResetNumere()
LOCAL ARRAY laTip[3]
laTip[1] = 3
laTip[2] = 16
laTip[3] = 26
LOCAL i, lnRezSerii
FOR i = 1 TO 3
lnRezSerii = poGeneratorNumere.creeaza_cursor_serii(laTip[i])
STRTOFILE("tip=" + TRANSFORM(laTip[i]) + " rezultat_serii=" + TRANSFORM(lnRezSerii) + ;
" paPlaje(tip,1)=" + TRANSFORM(NVL(poGeneratorNumere.paPlaje(laTip[i],1),-999)) + CHR(13)+CHR(10), lcLog, 1)
ENDFOR
STRTOFILE("END " + TTOC(DATETIME()) + CHR(13)+CHR(10), lcLog, 1)
QUIT
PROCEDURE PErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE("ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg + CHR(13)+CHR(10), "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_stare_finala.log", 1)
ENDPROC

View File

@@ -0,0 +1,378 @@
* test_s3b_dupa_ui.prg
* UI VIZIBIL: capturi "DUPA" pe frm_facturare_articole2 (COMUN\clase\ofacturare.vc2), dupa
* aplatizarea chenarelor (BorderWidth=0 pe containere, confirmata in binar). Copie a
* test_s3b_referinta_ui.prg cu ACELASI mediu / aceiasi 4 pasi / aceleasi etichete de pas, dar cu
* iesirile in fisiere separate (nu suprascrie referinta) ca sa poata fi comparate una langa alta.
*
* Rulare: powershell -ExecutionPolicy Bypass -File test_s3b_dupa_ui.ps1 (timeout >= 300s)
* Log: facturare_unificat\probe_totaluri_log.txt ; capturi in screenshots_dupa\ ;
* geometrie in out\geom_dupa_<eticheta>.tsv
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcUILog, gcSyncDir, gnFail, gnPass
gcUILog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\probe_totaluri_log.txt"
gcSyncDir = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\uisync_probe\"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
gnFail = 0
gnPass = 0
PUBLIC gcRaport
gcRaport = ""
ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out")
MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out"
ENDIF
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", "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.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
* seriile de facturi (tipdoc 5) si de incasare (3/16/26) sunt pe utilizator in MARIUSM_AUTO
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
DO AfLog WITH "gnScadereStoc=" + TRANSFORM(gnScadereStoc)
* gridextras.vcx e referit din ofacturare.vcx cu cale relativa, rezolvabila doar din exe/IDE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
* grd_factura.cCodMat.cboCodmat e declarat AS combosql OF cautare.vcx, dar clasa e in _cb_base.vcx
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
* cboTipFactura (RowSourceType=3) citeste cursorul local saft_tip_facturi ca pe un tabel -
* fara el deschis explicit, Createobject('frm_facturare_articole2') da "File 'saft_tip_facturi.dbf' does not exist"
IF !USED('saft_tip_facturi')
update_saft_tip_facturi()
ENDIF
PRIVATE poDate, poGeneratorNumere, loForm, lcTsv, lcRaportFile
lcRaportFile = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_dupa_raport.txt"
* document nou: poDate.incasat ramane 0 la construire - identic Scenariul A din test_s3b_incasare_nealocare.prg
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)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poGeneratorNumere.ResetNumere()
DO ProbaSerii WITH poDate.nIdTipDoc
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
DO Final
ENDIF
DO Assert WITH ObjExists(loForm, 'opt_incasat'), "opt_incasat prezent (poDate.tip intre 1 si 4, deci grupul de incasare exista)"
loForm.WindowType = 0
loForm.Show()
loForm.WindowState = 2
DOEVENTS FORCE
* PROBA aseaza_totaluri(): dovada daca metoda ruleaza si daca scrierile ei sunt anulate ulterior
LOCAL lcC, loErr, lcAntePost
PRIVATE pcProbeLog
pcProbeLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_totaluri.log"
STRTOFILE("PROBA aseaza_totaluri - " + TTOC(DATETIME()) + CHR(13) + CHR(10), pcProbeLog)
DO ProbeDumpBanda WITH loForm, "INAINTE"
TRY
loForm.aseaza_totaluri()
STRTOFILE("aseaza_totaluri() a rulat FARA eroare" + CHR(13) + CHR(10), pcProbeLog, 1)
CATCH TO loErr
STRTOFILE("aseaza_totaluri() a ARUNCAT eroare: " + loErr.Message + " la linia " + TRANSFORM(loErr.LineNo) + " in " + loErr.Procedure + CHR(13) + CHR(10), pcProbeLog, 1)
ENDTRY
DOEVENTS FORCE
DO ProbeDumpBanda WITH loForm, "DUPA (imediat, fara alt eveniment)"
STRTOFILE("ltotaluri_asezate=" + TRANSFORM(loForm.ltotaluri_asezate) + CHR(13) + CHR(10), pcProbeLog, 1)
WITH loForm.clb_total_baza.lb_explicatie
lcC = "lb_explicatie: Caption=[" + .Caption + "] AutoSize=" + TRANSFORM(.AutoSize) + " Width=" + TRANSFORM(.Width) + ;
" FontName=" + .FontName + " FontSize=" + TRANSFORM(.FontSize) + " FontBold=" + TRANSFORM(.FontBold) + ;
" TXTWIDTH=" + TRANSFORM(TXTWIDTH(ALLTRIM(.Caption), .FontName, .FontSize, IIF(.FontBold, "B", ""))) + ;
" FONTMETRIC(6)=" + TRANSFORM(FONTMETRIC(6, .FontName, .FontSize, IIF(.FontBold, "B", ""))) + ;
" PRODUS+4=" + TRANSFORM(CEILING(TXTWIDTH(ALLTRIM(.Caption), .FontName, .FontSize, IIF(.FontBold, "B", "")) * FONTMETRIC(6, .FontName, .FontSize, IIF(.FontBold, "B", ""))) + 4)
STRTOFILE(lcC + CHR(13) + CHR(10), pcProbeLog, 1)
ENDWITH
WITH loForm.clb_total_baza.lb_nume_nat
lcC = "lb_nume_nat: Caption=[" + .Caption + "] AutoSize=" + TRANSFORM(.AutoSize) + " Width=" + TRANSFORM(.Width) + ;
" FontName=" + .FontName + " FontSize=" + TRANSFORM(.FontSize) + " FontBold=" + TRANSFORM(.FontBold) + ;
" TXTWIDTH=" + TRANSFORM(TXTWIDTH(ALLTRIM(.Caption), .FontName, .FontSize, IIF(.FontBold, "B", ""))) + ;
" FONTMETRIC(6)=" + TRANSFORM(FONTMETRIC(6, .FontName, .FontSize, IIF(.FontBold, "B", ""))) + ;
" PRODUS+4=" + TRANSFORM(CEILING(TXTWIDTH(ALLTRIM(.Caption), .FontName, .FontSize, IIF(.FontBold, "B", "")) * FONTMETRIC(6, .FontName, .FontSize, IIF(.FontBold, "B", ""))) + 4)
STRTOFILE(lcC + CHR(13) + CHR(10), pcProbeLog, 1)
ENDWITH
* al doilea apel direct - daca DUPA1 ramane pe valorile vechi, verificam daca inca o rulare produce alta geometrie
* (adica scrierile ei ies, dar sunt suprascrise de altceva DUPA ce iese din metoda, nu ignorate de la inceput)
TRY
loForm.aseaza_totaluri()
CATCH TO loErr
STRTOFILE("al doilea apel a ARUNCAT eroare: " + loErr.Message + CHR(13) + CHR(10), pcProbeLog, 1)
ENDTRY
DO ProbeDumpBanda WITH loForm, "DUPA AL DOILEA APEL (fara DOEVENTS intre)"
DOEVENTS FORCE
DO ProbeDumpBanda WITH loForm, "DUPA AL DOILEA APEL + DOEVENTS FORCE"
* PEMSTATUS: confirma daca ltotaluri_asezate exista cu adevarat ca membru pe instanta
STRTOFILE("PEMSTATUS ltotaluri_asezate (5=property)=" + TRANSFORM(PEMSTATUS(loForm, 'ltotaluri_asezate', 5)) + CHR(13) + CHR(10), pcProbeLog, 1)
* Ipoteza Anchor: un resize REAL de fereastra (WindowState 2->0->2, ca la Show() initial)
* reseteaza Left/Width ale containerelor ancorate DUPA ce codul din Resize() le-a scris?
loForm.WindowState = 0
DOEVENTS FORCE
loForm.WindowState = 2
DOEVENTS FORCE
DO ProbeDumpBanda WITH loForm, "DUPA WindowState 2->0->2 (resize real de fereastra)"
DO AfLog WITH "Proba scrisa in " + pcProbeLog
STRTOFILE(gcRaport, lcRaportFile)
DO AfLog WITH "Raport geometrie scris in " + lcRaportFile
* nicio alocare de numar nu s-a facut (opt_incasat.Value neschimbat) - Release direct, fara curatenie
loForm.Release()
RELEASE loForm
DO Final
*----------------------------------------------------------------------------------------
PROCEDURE DumpSiAnalizeaza
* Parcurge Thisform.Objects (top-level, fara recursie in containere), scrie .tsv cu
* Name/Class/Left/Top/Width/Height/Visible pentru fiecare obiect cu geometrie, apoi
* calculeaza suprapuneri (2D), iesire din zona utila a formularului si perechi lipite
* (<4px) pe orizontala/verticala, doar intre controale Visible=.T. Adauga sectiunea la gcRaport.
LPARAMETERS toForm, tcEticheta, tcTsvPath
LOCAL i, j, loO, lcOut, lnN, lnCount, llVis
LOCAL ARRAY laN[400], laC[400], laL[400], laT[400], laW[400], laH[400], laV[400]
lnN = 0
lcOut = "Name" + CHR(9) + "Class" + CHR(9) + "Left" + CHR(9) + "Top" + CHR(9) + "Width" + CHR(9) + "Height" + CHR(9) + "Visible" + CHR(13) + CHR(10)
lnCount = toForm.Objects.Count
FOR i = 1 TO lnCount
loO = toForm.Objects(i)
IF TYPE('loO.Left') = 'N' AND TYPE('loO.Top') = 'N' AND TYPE('loO.Width') = 'N' AND TYPE('loO.Height') = 'N' AND lnN < 400
llVis = IIF(TYPE('loO.Visible') = 'L', loO.Visible, .T.)
lnN = lnN + 1
laN[lnN] = loO.Name
laC[lnN] = loO.Class
laL[lnN] = loO.Left
laT[lnN] = loO.Top
laW[lnN] = loO.Width
laH[lnN] = loO.Height
laV[lnN] = llVis
lcOut = lcOut + loO.Name + CHR(9) + loO.Class + CHR(9) + TRANSFORM(loO.Left) + CHR(9) + TRANSFORM(loO.Top) + CHR(9) + TRANSFORM(loO.Width) + CHR(9) + TRANSFORM(loO.Height) + CHR(9) + TRANSFORM(llVis) + CHR(13) + CHR(10)
ENDIF
ENDFOR
STRTOFILE(lcOut, tcTsvPath)
DO AfLog WITH "GEOMETRIE [" + tcEticheta + "]: " + TRANSFORM(lnN) + " controale cu geometrie din " + TRANSFORM(lnCount) + " obiecte totale -> " + tcTsvPath
LOCAL lnAL, lnAT, lnAR, lnAB, lnBL, lnBT, lnBR, lnBB, lnOvX, lnOvY, lnGap
LOCAL lcSectiune
lcSectiune = "=== " + tcEticheta + " (forma " + TRANSFORM(toForm.Width) + "x" + TRANSFORM(toForm.Height) + ") ===" + CHR(13) + CHR(10)
FOR i = 1 TO lnN
IF !laV[i]
LOOP
ENDIF
lnAL = laL[i]
lnAT = laT[i]
lnAR = laL[i] + laW[i]
lnAB = laT[i] + laH[i]
IF lnAL < 0 OR lnAT < 0 OR lnAR > toForm.Width OR lnAB > toForm.Height
lcSectiune = lcSectiune + "IESIT: " + laN[i] + " (" + laC[i] + ") Left=" + TRANSFORM(lnAL) + " Top=" + TRANSFORM(lnAT) + " Right=" + TRANSFORM(lnAR) + " Bottom=" + TRANSFORM(lnAB) + CHR(13) + CHR(10)
ENDIF
FOR j = i + 1 TO lnN
IF !laV[j]
LOOP
ENDIF
lnBL = laL[j]
lnBT = laT[j]
lnBR = laL[j] + laW[j]
lnBB = laT[j] + laH[j]
lnOvX = MIN(lnAR, lnBR) - MAX(lnAL, lnBL)
lnOvY = MIN(lnAB, lnBB) - MAX(lnAT, lnBT)
IF lnOvX > 0 AND lnOvY > 0
lcSectiune = lcSectiune + "SUPRAPUNERE: " + laN[i] + " (" + laC[i] + ") x " + laN[j] + " (" + laC[j] + ") " + TRANSFORM(lnOvX) + "x" + TRANSFORM(lnOvY) + "px" + CHR(13) + CHR(10)
ELSE
IF lnOvY > 0 AND lnOvX <= 0 AND -lnOvX < 4
lnGap = -lnOvX
lcSectiune = lcSectiune + "LIPIT-ORIZ: " + laN[i] + " - " + laN[j] + " gap=" + TRANSFORM(lnGap) + "px" + CHR(13) + CHR(10)
ENDIF
IF lnOvX > 0 AND lnOvY <= 0 AND -lnOvY < 4
lnGap = -lnOvY
lcSectiune = lcSectiune + "LIPIT-VERT: " + laN[i] + " - " + laN[j] + " gap=" + TRANSFORM(lnGap) + "px" + CHR(13) + CHR(10)
ENDIF
ENDIF
ENDFOR
ENDFOR
gcRaport = gcRaport + lcSectiune + CHR(13) + CHR(10)
ENDPROC
PROCEDURE DumpGrilaRecursiv
* Harta de geometrie recursiva: coboara in .Objects pe oricate niveluri (containere compozite
* clb_tx_simplu / ct_clb_cautare / etc.), scrie Name ca traseu punctat de la formular
* (Ct_clb_agent.clb_tx_cautare.Lb_simplu1), plus AbsLeft/AbsTop absolute fata de formular
* si Caption/Value taiat la 40 caractere - necesare ca sa se detecteze suprapunerile si
* textele taiate din interiorul containerelor, invizibile in harta plata geom_dupa_*.tsv.
LPARAMETERS toForm, tcTsvPath
LOCAL lcOut
lcOut = "Name" + CHR(9) + "Class" + CHR(9) + "Left" + CHR(9) + "Top" + CHR(9) + "Width" + CHR(9) + "Height" + CHR(9) + "Visible" + CHR(9) + "AbsLeft" + CHR(9) + "AbsTop" + CHR(9) + "Caption" + CHR(13) + CHR(10)
lcOut = lcOut + ColectGrila(toForm, "", 0, 0, 0, .T.)
STRTOFILE(lcOut, tcTsvPath)
DO AfLog WITH "GEOMETRIE-GRILA: scris " + tcTsvPath
ENDPROC
FUNCTION ColectGrila
* Recursie pe .Objects (nu PEMSTATUS) - garda Type('loO.Left')='N' fiindca nu orice membru
* are geometrie (separatoare, columns de grid etc. nu ajung aici, gridurile nu au .Objects).
* coloana Visible e vizibilitatea EFECTIVA (proprie AND a parintelui) - un copil dintr-un
* container ascuns are Visible propriu .T. dar nu se deseneaza.
LPARAMETERS toContainer, tcPrefix, tnParentAbsLeft, tnParentAbsTop, tnDepth, tlParentVisEff
LOCAL i, loO, lcName, lnAbsL, lnAbsT, lcCaption, llVisEff, lcVisTxt, lcOut
IF tnDepth > 15
RETURN ""
ENDIF
lcOut = ""
FOR i = 1 TO toContainer.Objects.Count
loO = toContainer.Objects(i)
IF TYPE('loO.Left') = 'N' AND TYPE('loO.Top') = 'N' AND TYPE('loO.Width') = 'N' AND TYPE('loO.Height') = 'N'
lcName = IIF(EMPTY(tcPrefix), loO.Name, tcPrefix + "." + loO.Name)
lnAbsL = tnParentAbsLeft + loO.Left
lnAbsT = tnParentAbsTop + loO.Top
lcCaption = ""
IF TYPE('loO.Caption') = 'C'
lcCaption = loO.Caption
ELSE
IF TYPE('loO.Value') = 'C'
lcCaption = loO.Value
ENDIF
ENDIF
lcCaption = STRTRAN(lcCaption, CHR(9), " ")
lcCaption = LEFT(lcCaption, 40)
llVisEff = IIF(TYPE('loO.Visible') = 'L', loO.Visible, .T.) AND tlParentVisEff
lcVisTxt = TRANSFORM(llVisEff)
lcOut = lcOut + lcName + CHR(9) + loO.Class + CHR(9) + TRANSFORM(loO.Left) + CHR(9) + TRANSFORM(loO.Top) + CHR(9) + TRANSFORM(loO.Width) + CHR(9) + TRANSFORM(loO.Height) + CHR(9) + lcVisTxt + CHR(9) + TRANSFORM(lnAbsL) + CHR(9) + TRANSFORM(lnAbsT) + CHR(9) + lcCaption + CHR(13) + CHR(10)
IF TYPE('loO.Objects.Count') = 'N'
lcOut = lcOut + ColectGrila(loO, lcName, lnAbsL, lnAbsT, tnDepth + 1, llVisEff)
ENDIF
ENDIF
ENDFOR
RETURN lcOut
ENDFUNC
PROCEDURE ProbeDumpBanda
* Logheaza Left/Width pentru cele sase containere ale benzii de totaluri, cu eticheta data.
LPARAMETERS toForm, tcEticheta
LOCAL lcL, laNume[6], i
laNume[1] = "clb_total_baza"
laNume[2] = "clb_discount_articole"
laNume[3] = "clb_discount"
laNume[4] = "clb_motiv_discount"
laNume[5] = "clb_total_tva"
laNume[6] = "clb_total_factura"
lcL = "--- " + tcEticheta + " ---" + CHR(13) + CHR(10)
FOR i = 1 TO 6
lcL = lcL + laNume[i] + " Left=" + TRANSFORM(EVALUATE("toForm." + laNume[i] + ".Left")) + ;
" Width=" + TRANSFORM(EVALUATE("toForm." + laNume[i] + ".Width")) + ;
" Anchor=" + TRANSFORM(EVALUATE("toForm." + laNume[i] + ".Anchor")) + CHR(13) + CHR(10)
ENDFOR
STRTOFILE(lcL, pcProbeLog, 1)
ENDPROC
PROCEDURE ProbaSerii
* apel direct al procedurii Oracle din creeaza_cursor_serii: logheaza eroarea reala (goExecutor
* ar deschide amessagebox modal, care agata rularea headless) si incalzeste starea pachetului
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
FUNCTION ObjExists
* cautare recursiva: controalele mutate in containere nu mai sunt in Objects direct
LPARAMETERS toContainer, tcName
LOCAL i, loO
FOR i = 1 TO toContainer.Objects.Count
loO = toContainer.Objects(i)
IF UPPER(loO.Name) == UPPER(tcName)
RETURN .T.
ENDIF
IF TYPE('loO.Objects.Count') = 'N'
IF ObjExists(loO, tcName)
RETURN .T.
ENDIF
ENDIF
ENDFOR
RETURN .F.
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), gcUILog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gnFail = gnFail + 1
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail)
DO AfLog WITH "END " + TTOC(DATETIME())
DO HarnessDone WITH 'done'
QUIT
ENDPROC

View File

@@ -0,0 +1,19 @@
*!* 31.08.2026
*!* subagent masuratoare argumente
*!* rutine de proba pentru masurarea comportamentului VFP la argumente in plus, apelate din alt fisier (IN)
PROCEDURE rutina_noparam_ext
lcVal = ''
IF PARAMETERS() >= 1
lcVal = TRANSFORM(p1)
ENDIF
RETURN 'noparam_ext OK, PARAMETERS()=' + TRANSFORM(PARAMETERS())
PROCEDURE rutina_1p_ext
LPARAMETERS p1
RETURN '1p_ext OK, p1=' + TRANSFORM(p1) + ', PARAMETERS()=' + TRANSFORM(PARAMETERS())
FUNCTION rutina_2p_ext
LPARAMETERS p1, p2
lcP2 = IIF(VARTYPE(p2) = 'L' AND ISNULL(p2), 'NULL', IIF(VARTYPE(p2)='L', TRANSFORM(p2) + '(bool.F=lipsa)', TRANSFORM(p2)))
RETURN '2p_ext OK, p1=' + TRANSFORM(p1) + ', p2=' + lcP2 + ', VARTYPE(p2)=' + VARTYPE(p2) + ', PARAMETERS()=' + TRANSFORM(PARAMETERS())

View File

@@ -0,0 +1,32 @@
param([Parameter(Mandatory=$true)][string]$Nume, [int]$TimeoutMs = 300000)
$ErrorActionPreference = 'Stop'
$dir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat'
$prg = Join-Path $dir ($Nume + '.prg')
$log = Join-Path $dir ('out\' + $Nume + '.log')
$vfp = 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe'
if (-not (Test-Path $prg)) { "Nu exista $prg"; exit 1 }
$viu = Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like ('*' + $Nume + '*') }
if ($viu) {
"Ruleaza deja o instanta a suitei (PID " + ($viu.ProcessId -join ',') + "). Nu lansez a doua."
exit 1
}
Set-Location $dir
Remove-Item (Join-Path $dir ($Nume + '.FXP')) -ErrorAction SilentlyContinue
Remove-Item $log -ErrorAction SilentlyContinue
$p = Start-Process -FilePath $vfp -ArgumentList '-A', '-T', $prg -PassThru
"lansat PID " + $p.Id
$null = $p.WaitForExit($TimeoutMs)
if (-not $p.HasExited) {
"ATARNAT dupa " + [int]($TimeoutMs/1000) + "s - omor instanta (filtrat pe CommandLine)"
Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like ('*' + $Nume + '*') } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force }
}
if (Test-Path $log) {
Get-Content $log
} else {
"Log inexistent: $log"
}

View File

@@ -0,0 +1,445 @@
* test_decizia7_plafon_grid.prg
* Headless: decizia 7 - plafonul Rol B (tipurile 1,22,29,23) validat la editarea cantitatii
* in grid, frm_facturare_articole2 (v2), eveniment grd_factura.cCantitate.Text1.Valid
* (COMUN\clase\ofacturare.vc2, dupa grd_factura.cCodMat.cboCodmat.LostFocus).
*
* Executa direct METODA REALA (nu recalcul in paralel): instantiaza frm_facturare_articole2,
* seteaza cantitatea veche pe randul din crsfactura si This.Value (cantitatea noua) pe
* controlul real din grid, apoi apeleaza loForm.grd_factura.cCantitate.Text1.Valid() ca functie.
* NU se foloseste This.OldValue: sub -A -T (si, s-a verificat, si pe un textbox obisnuit,
* non-grid) PEMSTATUS/AMEMBERS nu-l listeaza si scrierea directa arunca eroare 1734 - This.OldValue
* nu e o proprietate reflectabila/setabila din afara ciclului real de focus. Garda din cod
* foloseste de aceea crsfactura.cantitate (valoarea veche, inca nescrisa la momentul Valid, cf.
* deciziei orchestratorului) pentru comparatia "s-a schimbat cantitatea?", nu This.OldValue.
* Plafonul e citit LIVE din Oracle (pack_facturare.plafon_disponibil_articol, id_articol=315554536)
* chiar de metoda testata - testul NU recalculeaza plafonul separat, doar il citeste o data la
* inceput ca sa aleaga cantitati sigur sub / sigur peste (marja 100, impotriva driftului intre
* citiri - vezi docs\raport_s4_2.md §6.3 vs. valoarea gasita live aici, deja diferita cu +3).
*
* CAPCANA platita: setarea directa a This.Value pe un control legat prin ControlSource face
* write-through IMEDIAT in crsfactura.cantitate (verificat cu un probe dedicat - nu exista sesiune
* reala de editare in afara unui ciclu real de focus tastat, deci nu exista buffer amanat). Fara
* corectie, garda vedea mereu This.Value = crsfactura.cantitate (ambele = valoarea noua) si nu se
* declansa niciodata. Ordinea corecta, aplicata mai jos: seteaza This.Value (noua cantitate), APOI
* REPLACE cantitate WITH <valoarea veche> IN crsfactura - reface exact starea din Valid() real
* (This.Value = nou, crsfactura.cantitate = vechi), fara sa atinga This.Value.
*
* Sase cazuri (C1-C4 initiale + C5/C6 adaugate la review-ul codului comis, care a gasit doi
* defecti reali - vezi docs\raport_decizia_7_implementare.md §9):
* C1. Sub plafon (tip=1, gestionabil=1): Valid() nu refuza (rezultat <> .F.), nicio caseta de
* mesaj, gnErr=0; simuleaza commit-ul cadrului (REPLACE cu This.Value) si verifica
* crsfactura.cantitate = valoarea noua; verifica si ca pointerul ramane pe randul editat.
* C2. Peste plafon (tip=1, gestionabil=1): Valid() intoarce exact .F., crsfactura.cantitate
* RAMANE valoarea veche (nescrisa), caseta afisata cu Thisform.cmesaj_cantitate; verifica
* si ca pointerul ramane pe randul editat.
* C3. Neregresie tip disjunct (tip=3, in afara {1,22,29,23}): cantitate uriasa (peste orice
* plafon plauzibil) trece neconditionat, fara nicio caseta de mesaj (dovada ca garda nu
* s-a declansat deloc, deci nici apelul Oracle).
* C4. Neregresie gestionabil=0 (tip=1): aceeasi cantitate uriasa trece neconditionat, fara
* caseta de mesaj (garda gestionabil=1 nu se declanseaza).
* C5. Doua articole DIFERITE pe aceeasi factura: editarea articolului A la o cantitate mica
* nu trebuie sa refuze desi articolul B (needitat) are o cantitate uriasa - prinde
* tautologia "id_articol = crsfactura.id_articol" din FOR-ul CALCULATE original.
* C6. Acelasi articol pe doua linii: suma celor doua linii peste plafon refuza (C6a), sub
* plafon trece (C6b), fara sa numere randul editat de doua ori; verifica in ambele
* subcazuri ca pointerul ramane pe randul editat dupa Valid().
*
* Sablon urmat: test_s4c_discount_grid.prg (harness identic, acelasi env auto). mock_amessagebox.prg
* incarcat PRIMUL in SET PROCEDURE (la nume duplicat castiga primul fisier din lista).
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_decizia7_plafon_grid.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_decizia7_plafon_grid.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO (schema/instanta CONTAFIN_ORACLE); gnIdUtil = 8, gnIdSucursala = 167,
* gnScadereStoc = 1. id_articol=315554536 (acelasi din raport_s4_2.md §6), plafon citit live la rulare.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr
PUBLIC gnScadereStoc, gcMockUltimMesaj, gnMockUltimTip, gnIdArticolTest, gnPlafonLive
gnScadereStoc = 1
gnIdArticolTest = 315554536
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_decizia7_plafon_grid.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
gnErr = 0
gcCaz = ""
gcErr = ""
gcMockUltimMesaj = ""
gnMockUltimTip = 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
LOCAL lcProc
lcProc = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProc
gnIdUtil = 8
gnIdSucursala = 167
goExecutor.oExecute([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
gnScadereStoc = 1
DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) + " gnIdSucursala=" + TRANSFORM(gnIdSucursala)
*-- plafon live, citit o singura data - alege cantitatile de test, nu recalculeaza rezultatul Valid()
LOCAL lcSqlPlafon
lcSqlPlafon = [SELECT pack_facturare.plafon_disponibil_articol(] + Alltrim(Str(gnIdArticolTest)) + [,] + ;
Alltrim(Str(gnLuna)) + [,] + Alltrim(Str(gnAn)) + [,8,167,NULL,NULL) AS plafon FROM dual]
IF goExecutor.oExecute(lcSqlPlafon, 'crsplafonlive') < 0
DO AfLog WITH "FAIL: plafon live " + goExecutor.oPrelucrareEroare()
DO Final
ENDIF
gnPlafonLive = crsplafonlive.plafon
Use In (Select('crsplafonlive'))
DO AfLog WITH "plafon live pentru id_articol=" + Transform(gnIdArticolTest) + " = " + Transform(gnPlafonLive)
PRIVATE poDate
poDate = NULL
DO TestC1
DO TestC2
DO TestC3
DO TestC4
DO TestC5
DO TestC6
DO Final
*----------------------------------------------------------------------------------------
* C1: sub plafon - Valid() nu refuza, nicio caseta, commit-ul simulat scrie noua cantitate.
PROCEDURE TestC1
LOCAL loForm, lnVechi, lnNou, llRezultat
gcCaz = "[C1: sub plafon] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 1
lnVechi = 1
lnNou = Int(gnPlafonLive / 2)
SELECT crsfactura
APPEND BLANK
REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH gnIdArticolTest, denumire WITH "ARTICOL PLAFON", ;
cantitate WITH lnVechi, gestionabil WITH 1, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2 (tip=1)"
loForm.grd_factura.cCantitate.Text1.Value = lnNou
*-- setarea directa a lui .Value scrie imediat in crsfactura (write-through, fara sesiune
*-- reala de editare) - restaureaza campul la valoarea veche ca sa reproduca exact starea
*-- din Valid() real (This.Value = nou, crsfactura.cantitate = vechi)
SELECT crsfactura
REPLACE cantitate WITH lnVechi IN crsfactura
gcMockUltimMesaj = ""
llRezultat = loForm.grd_factura.cCantitate.Text1.Valid()
DO Assert WITH gnErr = 0, "fara eroare VFP (gcErr: " + gcErr + ")"
DO Assert WITH llRezultat <> .F., "Valid() nu refuza sub plafon (plafon=" + Transform(gnPlafonLive) + ", cerut=" + Transform(lnNou) + ")"
DO Assert WITH Empty(gcMockUltimMesaj), "nicio caseta de mesaj sub plafon (primit: [" + gcMockUltimMesaj + "])"
DO Assert WITH Recno('crsfactura') = 1, "pointerul ramane pe randul editat dupa Valid() cu succes (obtinut: " + Transform(Recno('crsfactura')) + ")"
SELECT crsfactura
GO TOP IN crsfactura
REPLACE cantitate WITH lnNou IN crsfactura
DO Assert WITH crsfactura.cantitate = lnNou, "cantitate scrisa dupa commit simulat (obtinut: " + Transform(crsfactura.cantitate) + ")"
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
* C2: peste plafon - Valid() refuza (.F. exact), crsfactura.cantitate ramane valoarea veche,
* caseta afisata cu Thisform.cmesaj_cantitate.
PROCEDURE TestC2
LOCAL loForm, lnVechi, lnNou, llRezultat
gcCaz = "[C2: peste plafon] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 1
lnVechi = 1
lnNou = gnPlafonLive + 100
SELECT crsfactura
APPEND BLANK
REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH gnIdArticolTest, denumire WITH "ARTICOL PLAFON", ;
cantitate WITH lnVechi, gestionabil WITH 1, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2 (tip=1)"
loForm.grd_factura.cCantitate.Text1.Value = lnNou
SELECT crsfactura
REPLACE cantitate WITH lnVechi IN crsfactura
gcMockUltimMesaj = ""
llRezultat = loForm.grd_factura.cCantitate.Text1.Valid()
DO Assert WITH gnErr = 0, "fara eroare VFP (gcErr: " + gcErr + ")"
DO Assert WITH llRezultat = .F., "Valid() refuza peste plafon (plafon=" + Transform(gnPlafonLive) + ", cerut=" + Transform(lnNou) + ")"
DO Assert WITH 'Acest articol nu este pe stoc!' $ gcMockUltimMesaj, "caseta cu Thisform.cmesaj_cantitate (primit: [" + gcMockUltimMesaj + "])"
DO Assert WITH Recno('crsfactura') = 1, "pointerul ramane pe randul editat dupa Valid() cu refuz (obtinut: " + Transform(Recno('crsfactura')) + ")"
SELECT crsfactura
GO TOP IN crsfactura
DO Assert WITH crsfactura.cantitate = lnVechi, "cantitate NESCHIMBATA la refuz (obtinut: " + Transform(crsfactura.cantitate) + ")"
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
* C3: neregresie tip disjunct (tip=3, Rol A) - cantitate uriasa trece neconditionat, garda
* nu se declanseaza (nicio caseta de mesaj).
PROCEDURE TestC3
LOCAL loForm, lnVechi, lnNou, llRezultat
gcCaz = "[C3: neregresie tip=3] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 3
lnVechi = 1
lnNou = gnPlafonLive + 1000000
SELECT crsfactura
APPEND BLANK
REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH gnIdArticolTest, denumire WITH "ARTICOL PLAFON", ;
cantitate WITH lnVechi, gestionabil WITH 1, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2 (tip=3)"
loForm.grd_factura.cCantitate.Text1.Value = lnNou
SELECT crsfactura
REPLACE cantitate WITH lnVechi IN crsfactura
gcMockUltimMesaj = ""
llRezultat = loForm.grd_factura.cCantitate.Text1.Valid()
DO Assert WITH gnErr = 0, "fara eroare VFP (gcErr: " + gcErr + ")"
DO Assert WITH llRezultat <> .F., "Valid() nu refuza pe tip disjunct (tip=3)"
DO Assert WITH Empty(gcMockUltimMesaj), "garda plafon nu s-a declansat pe tip=3 (primit: [" + gcMockUltimMesaj + "])"
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
* C4: neregresie gestionabil=0 (tip=1) - cantitate uriasa trece neconditionat, garda
* gestionabil=1 nu se declanseaza (nicio caseta de mesaj).
PROCEDURE TestC4
LOCAL loForm, lnVechi, lnNou, llRezultat
gcCaz = "[C4: neregresie gestionabil=0] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 1
lnVechi = 1
lnNou = gnPlafonLive + 1000000
SELECT crsfactura
APPEND BLANK
REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH gnIdArticolTest, denumire WITH "ARTICOL PLAFON", ;
cantitate WITH lnVechi, gestionabil WITH 0, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2 (tip=1, gestionabil=0)"
loForm.grd_factura.cCantitate.Text1.Value = lnNou
SELECT crsfactura
REPLACE cantitate WITH lnVechi IN crsfactura
gcMockUltimMesaj = ""
llRezultat = loForm.grd_factura.cCantitate.Text1.Valid()
DO Assert WITH gnErr = 0, "fara eroare VFP (gcErr: " + gcErr + ")"
DO Assert WITH llRezultat <> .F., "Valid() nu refuza pe gestionabil=0"
DO Assert WITH Empty(gcMockUltimMesaj), "garda plafon nu s-a declansat pe gestionabil=0 (primit: [" + gcMockUltimMesaj + "])"
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
* C5: doua articole DIFERITE pe aceeasi factura - articolul B (alt id_articol, cantitate uriasa,
* needitat) nu trebuie sa intre in suma articolului A (cel editat). Prinde tautologia
* "id_articol = crsfactura.id_articol" din FOR-ul CALCULATE (mereu .T. in scanul CALCULATE).
PROCEDURE TestC5
LOCAL loForm, lnNou, llRezultat
gcCaz = "[C5: doua articole diferite] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 1
lnNou = 5
SELECT crsfactura
APPEND BLANK
REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH gnIdArticolTest, denumire WITH "ARTICOL A", ;
cantitate WITH 1, gestionabil WITH 1, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1
APPEND BLANK
REPLACE id_temp WITH 2, id_c WITH 0, id_articol WITH 888888888, denumire WITH "ARTICOL B", ;
cantitate WITH 50000, gestionabil WITH 1, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2 (tip=1, 2 articole)"
SELECT crsfactura
GO 1 IN crsfactura
loForm.grd_factura.cCantitate.Text1.Value = lnNou
SELECT crsfactura
GO 1 IN crsfactura
REPLACE cantitate WITH 1 IN crsfactura
gcMockUltimMesaj = ""
llRezultat = loForm.grd_factura.cCantitate.Text1.Valid()
DO Assert WITH gnErr = 0, "fara eroare VFP (gcErr: " + gcErr + ")"
DO Assert WITH llRezultat <> .F., "Valid() nu refuza A (5, mult sub plafonul " + Transform(gnPlafonLive) + ") desi B are 50000 pe alt articol"
DO Assert WITH Empty(gcMockUltimMesaj), "nicio caseta - suma NU trebuie sa includa articolul B (primit: [" + gcMockUltimMesaj + "])"
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
* C6: acelasi articol pe doua linii - randul needitat (100) plus randul editat trebuie sa
* refuze peste plafon si sa treaca sub plafon, fara sa numere randul editat de doua ori
* (verifica excluderea Recno() <> lnRecnoCrt cu filtrul de id_articol corect).
PROCEDURE TestC6
LOCAL loForm, lnNou, llRezultat
gcCaz = "[C6a: acelasi articol, 2 linii, peste plafon] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 1
SELECT crsfactura
APPEND BLANK
REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH gnIdArticolTest, denumire WITH "ARTICOL A linia 1", ;
cantitate WITH 100, gestionabil WITH 1, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1
APPEND BLANK
REPLACE id_temp WITH 2, id_c WITH 0, id_articol WITH gnIdArticolTest, denumire WITH "ARTICOL A linia 2", ;
cantitate WITH 1, gestionabil WITH 1, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2 (tip=1, acelasi articol pe 2 linii)"
*-- C6a: editez linia 2 la o valoare care duce totalul (100 + noua) peste plafon
lnNou = gnPlafonLive + 100
SELECT crsfactura
GO 2 IN crsfactura
loForm.grd_factura.cCantitate.Text1.Value = lnNou
SELECT crsfactura
GO 2 IN crsfactura
REPLACE cantitate WITH 1 IN crsfactura
gcMockUltimMesaj = ""
llRezultat = loForm.grd_factura.cCantitate.Text1.Valid()
DO Assert WITH gnErr = 0, "fara eroare VFP (gcErr: " + gcErr + ")"
DO Assert WITH llRezultat = .F., "Valid() refuza cand suma celor 2 linii (100+" + Transform(lnNou) + ") depaseste plafonul " + Transform(gnPlafonLive)
DO Assert WITH Recno('crsfactura') = 2, "pointerul ramane pe linia 2 dupa refuz (obtinut: " + Transform(Recno('crsfactura')) + ")"
loForm.Release()
RELEASE loForm
gcCaz = "[C6b: acelasi articol, 2 linii, sub plafon] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 1
SELECT crsfactura
APPEND BLANK
REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH gnIdArticolTest, denumire WITH "ARTICOL A linia 1", ;
cantitate WITH 100, gestionabil WITH 1, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1
APPEND BLANK
REPLACE id_temp WITH 2, id_c WITH 0, id_articol WITH gnIdArticolTest, denumire WITH "ARTICOL A linia 2", ;
cantitate WITH 1, gestionabil WITH 1, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1
loForm = CREATEOBJECT('frm_facturare_articole2')
*-- C6b: editez linia 2 la o valoare care lasa totalul (100 + noua) sub plafon
lnNou = 5000
SELECT crsfactura
GO 2 IN crsfactura
loForm.grd_factura.cCantitate.Text1.Value = lnNou
SELECT crsfactura
GO 2 IN crsfactura
REPLACE cantitate WITH 1 IN crsfactura
gcMockUltimMesaj = ""
llRezultat = loForm.grd_factura.cCantitate.Text1.Valid()
DO Assert WITH gnErr = 0, "fara eroare VFP (gcErr: " + gcErr + ")"
DO Assert WITH llRezultat <> .F., "Valid() nu refuza cand suma celor 2 linii (100+" + Transform(lnNou) + ") ramane sub plafonul " + Transform(gnPlafonLive)
DO Assert WITH Recno('crsfactura') = 2, "pointerul ramane pe linia 2 dupa succes (obtinut: " + Transform(Recno('crsfactura')) + ")"
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
PROCEDURE Reseteaza
LPARAMETERS tnTip
LOCAL lnIdSet
DO Inchide WITH 'crsfactura'
SELECT 0
DO creeaza_facturacrs WITH 'crsfactura'
gcErr = ""
gnErr = 0
gcMockUltimMesaj = ""
gnMockUltimTip = 0
lnIdSet = 29000 + tnTip
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip)
poDate.dataireg = DATE(gnAn, gnLuna, 1)
poDate.dataact = poDate.dataireg
poDate.zi_curs = poDate.dataireg
poDate.id_fdoc = 1
poDate.fdoc = "FEL TEST"
poDate.nract = 79
poDate.serie_act = "TST"
poDate.id_client = 1
poDate.id_furnizor = 1
poDate.id_valuta = 1
poDate.in_valuta = 0
ENDPROC
PROCEDURE Inchide
LPARAMETERS tcAlias
IF USED(tcAlias)
USE IN (tcAlias)
ENDIF
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 AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10)
gnErr = gnErr + 1
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,145 @@
* test_jtva_v2_constatare.prg
* Headless, read-only, fara formulare, fara emitere: constatare pe date deja existente in
* MARIUSM_AUTO@ROA_CENTRAL despre tiparul ID_JTVA_COLOANA/PROC_TVA/TAXCODE gol pe documentele
* emise de frm_facturare_articole2 (v2), gasit in S6-2 pe comanda SSS656/id_vanzare=1114.
* Nu emite nimic, doar SELECT.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_jtva_v2_constatare.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_jtva_v2_constatare.log
SET SAFETY OFF
SET TALK OFF
CLOSE DATABASES
PUBLIC gcLog
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_jtva_v2_constatare.log"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog)
TRY
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 JLog WITH 'EROARE: conectare Oracle esuata'
DO JFinal
ENDIF
DO JLog WITH 'ENV OK gnHandle=' + TRANSFORM(gnHandle)
DO JLog WITH CHR(13) + CHR(10) + '===== 1. cele 4 documente cunoscute (VANZARI + rezumat VANZARI_DETALII + rezumat ACT) ====='
DO Raporteaza WITH 1111
DO Raporteaza WITH 1112
DO Raporteaza WITH 1113
DO Raporteaza WITH 1114
DO JLog WITH CHR(13) + CHR(10) + '===== 2. esantion productie recenta (v1), serie <> SSS, tip in (2,3), ordonat id_vanzare desc ====='
LOCAL lcSql
lcSql = [select id_vanzare, tip, id_part, serie_act, numar_act as nract, total_fara_tva, total_tva from vanzari ] + ;
[where serie_act <> 'SSS' and tip in (2,3) and rownum <= 15 order by id_vanzare desc]
IF goExecutor.oExecute(lcSql, 'crsesantion') < 0
DO JLog WITH 'EROARE esantion productie: ' + goExecutor.oPrelucrareEroare()
ELSE
SELECT crsesantion
SCAN
DO Raporteaza WITH id_vanzare
ENDSCAN
USE IN crsesantion
ENDIF
DO JLog WITH CHR(13) + CHR(10) + '===== 3. documente istorice ale clientilor 2873 si 2874 (test decisiv client vs formular) ====='
lcSql = [select id_vanzare, tip, id_part, serie_act, numar_act as nract, total_fara_tva, total_tva from vanzari ] + ;
[where id_part in (2873,2874) and rownum <= 20 order by id_part, id_vanzare desc]
IF goExecutor.oExecute(lcSql, 'crsclienti') < 0
DO JLog WITH 'EROARE esantion clienti: ' + goExecutor.oPrelucrareEroare()
ELSE
SELECT crsclienti
SCAN
DO Raporteaza WITH id_vanzare
ENDSCAN
USE IN crsclienti
ENDIF
DO JFinal
CATCH TO loExc
DO JLog WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ;
' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo)
DO JFinal
ENDTRY
QUIT
*----------------------------------------------------------------------------------------
* Raporteaza: pentru un id_vanzare dat, scrie in log randul VANZARI relevant, rezumatul
* VANZARI_DETALII (jonctiune pe id_vanzare) si rezumatul ACT (jonctiune pe serie_act+nract).
PROCEDURE Raporteaza
LPARAMETERS tnIdVanzare
LOCAL lcSql, lcSerieAct, lnNract, lcJtvaSet, lcTaxSet
lcSql = [select id_vanzare, tip, id_part, serie_act, numar_act as nract, total_fara_tva, total_tva, ] + ;
[total_cu_tva from vanzari where id_vanzare = ] + TRANSFORM(tnIdVanzare)
IF goExecutor.oExecute(lcSql, 'crsv') < 0
DO JLog WITH 'EROARE VANZARI id_vanzare=' + TRANSFORM(tnIdVanzare) + ': ' + goExecutor.oPrelucrareEroare()
RETURN
ENDIF
IF !USED('crsv') OR RECCOUNT('crsv') = 0
DO JLog WITH 'VANZARI id_vanzare=' + TRANSFORM(tnIdVanzare) + ' NEGASIT'
IF USED('crsv')
USE IN crsv
ENDIF
RETURN
ENDIF
SELECT crsv
lcSerieAct = ALLTRIM(NVL(serie_act, ''))
lnNract = NVL(nract, 0)
DO JLog WITH 'VANZARI id_vanzare=' + TRANSFORM(tnIdVanzare) + ' tip=' + TRANSFORM(tip) + ;
' id_part=' + TRANSFORM(id_part) + ' serie_act=' + lcSerieAct + ' nract=' + TRANSFORM(lnNract) + ;
' total_fara_tva=' + TRANSFORM(total_fara_tva) + ' total_tva=' + TRANSFORM(total_tva) + ;
' total_cu_tva=' + TRANSFORM(total_cu_tva)
USE IN crsv
* rezumat VANZARI_DETALII (jonctiune pe id_vanzare)
lcSql = [select count(*) as nlinii, sum(nvl(proc_tvav,0)) as sumproc, ] + ;
[min(nvl(id_jtva_coloana,-1)) as minjtva, max(nvl(id_jtva_coloana,-1)) as maxjtva, ] + ;
[sum(case when id_jtva_coloana is null then 1 else 0 end) as njtvanull, ] + ;
[sum(case when taxcode is null then 1 else 0 end) as ntaxnull from vanzari_detalii ] + ;
[where sters = 0 and id_vanzare = ] + TRANSFORM(tnIdVanzare)
IF goExecutor.oExecute(lcSql, 'crsd') < 0
DO JLog WITH ' EROARE VANZARI_DETALII: ' + goExecutor.oPrelucrareEroare()
ELSE
SELECT crsd
DO JLog WITH ' VANZARI_DETALII linii=' + TRANSFORM(nlinii) + ' sum_proc_tvav=' + TRANSFORM(sumproc) + ;
' id_jtva_coloana[min,max]=[' + TRANSFORM(minjtva) + ',' + TRANSFORM(maxjtva) + ']' + ;
' linii_jtva_null=' + TRANSFORM(njtvanull) + ' linii_taxcode_null=' + TRANSFORM(ntaxnull)
USE IN crsd
ENDIF
* rezumat ACT (jonctiune pe serie_act+nract)
IF EMPTY(lcSerieAct) OR lnNract = 0
DO JLog WITH ' ACT: fara serie_act/nract, sarit'
RETURN
ENDIF
lcSql = [select count(*) as nlinii, sum(nvl(suma,0)) as sumasuma, ] + ;
[min(nvl(id_jtva_coloana,-1)) as minjtva, max(nvl(id_jtva_coloana,-1)) as maxjtva, ] + ;
[sum(case when id_jtva_coloana is null then 1 else 0 end) as njtvanull, ] + ;
[sum(nvl(proc_tva,0)) as sumproctva, ] + ;
[sum(case when taxcode is null then 1 else 0 end) as ntaxnull from act where sters = 0 ] + ;
[and serie_act = '] + lcSerieAct + [' and nract = ] + TRANSFORM(lnNract)
IF goExecutor.oExecute(lcSql, 'crsa') < 0
DO JLog WITH ' EROARE ACT: ' + goExecutor.oPrelucrareEroare()
ELSE
SELECT crsa
DO JLog WITH ' ACT linii=' + TRANSFORM(nlinii) + ' suma=' + TRANSFORM(sumasuma) + ;
' id_jtva_coloana[min,max]=[' + TRANSFORM(minjtva) + ',' + TRANSFORM(maxjtva) + ']' + ;
' linii_jtva_null=' + TRANSFORM(njtvanull) + ' sum_proc_tva=' + TRANSFORM(sumproctva) + ;
' linii_taxcode_null=' + TRANSFORM(ntaxnull)
USE IN crsa
ENDIF
ENDPROC
PROCEDURE JLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE JFinal
DO JLog WITH 'END ' + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,346 @@
* test_q8_numar_ars.prg
* Headless: verifica reparatia Q8 (decizia 69, amendata 21.08.2026) - garda "s-a schimbat tipul documentului?"
* trebuie sa ruleze INAINTE de alocarea numarului (_cbbase1.LostFocus()) in do_schimba_tipdoc, DOAR pe calea
* unificata (frm_facturare_articole2). Pe calea veche (frm_date_factura), Marius a decis sa se lase
* comportamentul preexistent (numarul se arde la simpla intrare-iesire din combo-ul de tip) - vezi
* docs\raport_q8_numar_ars.md. Generatorul e oGeneratorMock (mock_generator_numere.prg, subclasa de test a
* lui oGeneratorNumere) - NU atinge Oracle, jurnalizeaza aloca_numar/dezaloca_numar/creeaza_cursor_serii in
* gcMockApeluri. NU se consuma numere reale din serii.
*
* REZULTAT ASTEPTAT (declarat inainte de rulare):
* A. FARA schimbare de tip (combo pus pe aceeasi valoare ca poDate.nIdTipDoc), in doua situatii (A1/A2):
* - frm_date_factura (calea veche, nereparata): ALOC#1 ruleaza inaintea garzii, indiferent de
* poDate.nract la intrare - poDate.nract SE ARDE (devine numarul alocat de mock), gcMockApeluri
* NU ramane gol (comportament preexistent, pastrat intentionat).
* - frm_facturare_articole2 (calea unificata, reparata): garda ruleaza prima - poDate.nract ramane
* neschimbat, gcMockApeluri ramane gol.
* B. CU schimbare reala de tip (FACTURA(5) -> PROFORMA(23)), pe ambele forme: poDate.nIdTipDoc = 23,
* gcMockApeluri contine dezaloca_numar(5), creeaza_cursor_serii(23) si aloca_numar(23); poDate.nract <> 0
* la final (pe calea veche mai apare si o pereche redundanta aloca_numar(5)/dezaloca_numar(5) din ALOC#1 -
* tolerata, testul verifica prezenta secventei, nu absenta altor apeluri).
* C. Amprentele (nIdTipDoc, nract, gcMockApeluri) DIFERA intentionat intre frm_date_factura si
* frm_facturare_articole2, pentru A1/A2/B - dovada ca cele doua cai NU mai sunt unificate pe Q8 (decizia
* lui Marius de a lasa calea veche neatinsa).
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_q8_numar_ars.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_q8_numar_ars.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 1.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gcCaz, gcErr, gcMockApeluri, gnMockNumar
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_q8_numar_ars.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
gcCaz = ""
gcErr = ""
gcMockApeluri = ""
gnMockNumar = 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
LOCAL lcProc
lcProc = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProc, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg"
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
gnScadereStoc = 1
DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna)
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
PRIVATE poDate, poGeneratorNumere, plVizibil, poDateGestiuneDest
plVizibil = .F.
poGeneratorNumere = CREATEOBJECT("oGeneratorMock")
DO Assert WITH VARTYPE(poGeneratorNumere) = 'O' AND poGeneratorNumere.Class == "Ogeneratormock", "generator mock instantiat"
poDateGestiuneDest = CREATEOBJECT("oDateGestiune")
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
* --- A1: fara schimbare, nract=0 la intrare (cazul din verif_nract_do_cauta.md) ---
DO CazFaraSchimbare WITH 'frm_date_factura', "FACTURA", 0
DO CazFaraSchimbare WITH 'frm_facturare_articole2', "FACTURA", 0
* --- A2: fara schimbare, nract deja alocat (neregresie) ---
DO CazFaraSchimbare WITH 'frm_date_factura', "FACTURA", 777
DO CazFaraSchimbare WITH 'frm_facturare_articole2', "FACTURA", 777
* --- B: schimbare reala FACTURA -> PROFORMA ---
DO CazCuSchimbare WITH 'frm_date_factura', "FACTURA", "PROFORMA"
DO CazCuSchimbare WITH 'frm_facturare_articole2', "FACTURA", "PROFORMA"
* --- C: paritate amprente intre cele doua forme, pe fiecare caz ---
DO Paritate WITH "FACTURA", 0
DO Paritate WITH "FACTURA", 777
DO ParitateSchimbare WITH "FACTURA", "PROFORMA"
DO Final
*----------------------------------------------------------------------------------------
PROCEDURE CazFaraSchimbare
LPARAMETERS tcClasa, tcFel, tnNractInitial
LOCAL loF, loCombo, lnIdTipDoc
gcCaz = "[FaraSchimbare " + tcClasa + " " + tcFel + " nract0=" + TRANSFORM(tnNractInitial) + "] "
lnIdTipDoc = IdTipDoc(tcFel)
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", 25001, 1)
poDate.nIdTipDoc = lnIdTipDoc
poGeneratorNumere.ResetNumere()
gnMockNumar = 100
gcMockApeluri = ""
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
poDate.dataact = DATE(gnAn, gnLuna, 1)
poDate.dataireg = poDate.dataact
poDate.id_client = 0
poDate.nract = tnNractInitial
gcErr = ""
loF = CREATEOBJECT(tcClasa)
DO Assert WITH VARTYPE(loF) = 'O', "CREATEOBJECT " + tcClasa + " reusit"
IF VARTYPE(loF) <> 'O'
RETURN
ENDIF
IF tcClasa == 'frm_date_factura'
loCombo = loF.ct_clb_fdoc._combobox1
ELSE
loCombo = loF.clb_fdoc.cboFdoc
ENDIF
loCombo.Value = tcFel && aceeasi valoare - fara schimbare de tip
gcMockApeluri = ""
gcErr = ""
loF.do_schimba_tipdoc()
IF tcClasa == 'frm_date_factura'
&& calea veche: nereparata, decizia lui Marius din 21.08.2026 - numarul se arde la intrare-iesire din combo
DO Assert WITH poDate.nract <> tnNractInitial, "poDate.nract ars la intrare-iesire din combo (preexistent), a ramas " + TRANSFORM(poDate.nract)
DO Assert WITH !EMPTY(gcMockApeluri), "apel generator preexistent (numarul se arde) - jurnal gol, neasteptat"
ELSE
DO Assert WITH poDate.nract = tnNractInitial, "poDate.nract neschimbat (" + TRANSFORM(tnNractInitial) + "), a ramas " + TRANSFORM(poDate.nract)
DO Assert WITH EMPTY(gcMockApeluri), "niciun apel generator (aloca/dezaloca/creeaza_cursor_serii), gasit: " + STRTRAN(gcMockApeluri, CHR(13) + CHR(10), " | ")
ENDIF
DO Assert WITH poDate.nIdTipDoc = lnIdTipDoc, "nIdTipDoc neschimbat"
DO Assert WITH EMPTY(gcErr), "fara erori VFP: " + gcErr
loF.Release()
RELEASE loF
ENDPROC
PROCEDURE CazCuSchimbare
LPARAMETERS tcClasa, tcDin, tcIn
LOCAL loF, loCombo, lnIdTipDocDin, lnIdTipDocIn
gcCaz = "[CuSchimbare " + tcClasa + " " + tcDin + "->" + tcIn + "] "
lnIdTipDocDin = IdTipDoc(tcDin)
lnIdTipDocIn = IdTipDoc(tcIn)
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", 25001, 1)
poDate.nIdTipDoc = lnIdTipDocDin
poGeneratorNumere.ResetNumere()
gnMockNumar = 100
gcMockApeluri = ""
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
poDate.dataact = DATE(gnAn, gnLuna, 1)
poDate.dataireg = poDate.dataact
poDate.id_client = 0
poDate.nract = 555 && numar deja alocat pe tipul vechi, ca sa verific dezaloca_numar(vechi)
gcErr = ""
loF = CREATEOBJECT(tcClasa)
DO Assert WITH VARTYPE(loF) = 'O', "CREATEOBJECT " + tcClasa + " reusit"
IF VARTYPE(loF) <> 'O'
RETURN
ENDIF
IF tcClasa == 'frm_date_factura'
loCombo = loF.ct_clb_fdoc._combobox1
ELSE
loCombo = loF.clb_fdoc.cboFdoc
ENDIF
loCombo.Value = tcIn
gcMockApeluri = ""
gcErr = ""
loF.do_schimba_tipdoc()
DO Assert WITH poDate.nIdTipDoc = lnIdTipDocIn, "nIdTipDoc = " + TRANSFORM(lnIdTipDocIn) + " dupa schimbare, e " + TRANSFORM(poDate.nIdTipDoc)
DO Assert WITH ("dezaloca_numar(" + TRANSFORM(lnIdTipDocDin) + ")") $ gcMockApeluri, "dezaloca_numar(" + TRANSFORM(lnIdTipDocDin) + ") in jurnal"
DO Assert WITH ("creeaza_cursor_serii(" + TRANSFORM(lnIdTipDocIn) + ")") $ gcMockApeluri, "creeaza_cursor_serii(" + TRANSFORM(lnIdTipDocIn) + ") in jurnal"
DO Assert WITH ("aloca_numar(" + TRANSFORM(lnIdTipDocIn) + ")") $ gcMockApeluri, "aloca_numar(" + TRANSFORM(lnIdTipDocIn) + ") in jurnal"
DO Assert WITH poDate.nract <> 0, "poDate.nract alocat (<>0) dupa schimbare"
DO Assert WITH EMPTY(gcErr), "fara erori VFP: " + gcErr
DO AfLog WITH " " + gcCaz + "GENERATOR: " + STRTRAN(gcMockApeluri, CHR(13) + CHR(10), " | ")
loF.Release()
RELEASE loF
ENDPROC
PROCEDURE Paritate
LPARAMETERS tcFel, tnNractInitial
LOCAL lcVechi, lcNou
gcCaz = "[Paritate FaraSchimbare " + tcFel + " nract0=" + TRANSFORM(tnNractInitial) + "] "
lcVechi = AmprentaFaraSchimbare('frm_date_factura', tcFel, tnNractInitial)
lcNou = AmprentaFaraSchimbare('frm_facturare_articole2', tcFel, tnNractInitial)
&& calea veche pastreaza bug-ul preexistent (Marius, 21.08.2026) - amprentele trebuie sa DIFERE
IF lcVechi <> lcNou
gnPass = gnPass + 1
DO AfLog WITH "OK " + gcCaz + "amprente diverg intentionat (vechi arde numarul, nou nu):"
DO AfLog WITH " vechi: " + STRTRAN(lcVechi, CHR(13) + CHR(10), " | ")
DO AfLog WITH " nou : " + STRTRAN(lcNou, CHR(13) + CHR(10), " | ")
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL " + gcCaz + "amprente identice (asteptat: sa difere)"
ENDIF
ENDPROC
PROCEDURE ParitateSchimbare
LPARAMETERS tcDin, tcIn
LOCAL lcVechi, lcNou
gcCaz = "[Paritate CuSchimbare " + tcDin + "->" + tcIn + "] "
lcVechi = AmprentaCuSchimbare('frm_date_factura', tcDin, tcIn)
lcNou = AmprentaCuSchimbare('frm_facturare_articole2', tcDin, tcIn)
&& calea veche pastreaza ALOC#1 (pereche redundanta aloca/dezaloca pe tipul vechi) - amprentele trebuie sa DIFERE
IF lcVechi <> lcNou
gnPass = gnPass + 1
DO AfLog WITH "OK " + gcCaz + "amprente diverg intentionat (vechi are alocare/dezalocare redundanta):"
DO AfLog WITH " vechi: " + STRTRAN(lcVechi, CHR(13) + CHR(10), " | ")
DO AfLog WITH " nou : " + STRTRAN(lcNou, CHR(13) + CHR(10), " | ")
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL " + gcCaz + "amprente identice (asteptat: sa difere)"
ENDIF
ENDPROC
FUNCTION AmprentaFaraSchimbare
LPARAMETERS tcClasa, tcFel, tnNractInitial
LOCAL loF, loCombo, lcA, lnIdTipDoc
lnIdTipDoc = IdTipDoc(tcFel)
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", 25001, 1)
poDate.nIdTipDoc = lnIdTipDoc
poGeneratorNumere.ResetNumere()
gnMockNumar = 100
gcMockApeluri = ""
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
poDate.dataact = DATE(gnAn, gnLuna, 1)
poDate.dataireg = poDate.dataact
poDate.id_client = 0
poDate.nract = tnNractInitial
gcErr = ""
loF = CREATEOBJECT(tcClasa)
IF VARTYPE(loF) <> 'O'
RETURN "CREATEOBJECT " + tcClasa + " ESUAT" + CHR(13) + CHR(10) + gcErr
ENDIF
IF tcClasa == 'frm_date_factura'
loCombo = loF.ct_clb_fdoc._combobox1
ELSE
loCombo = loF.clb_fdoc.cboFdoc
ENDIF
loCombo.Value = tcFel
gcMockApeluri = ""
gcErr = ""
loF.do_schimba_tipdoc()
lcA = "nract=" + TRANSFORM(poDate.nract) + CHR(13) + CHR(10)
lcA = lcA + "nidtipdoc=" + TRANSFORM(poDate.nIdTipDoc) + CHR(13) + CHR(10)
lcA = lcA + "GENERATOR:" + CHR(13) + CHR(10) + gcMockApeluri
lcA = lcA + "ERORI:" + CHR(13) + CHR(10) + gcErr
loF.Release()
RELEASE loF
RETURN lcA
ENDFUNC
FUNCTION AmprentaCuSchimbare
LPARAMETERS tcClasa, tcDin, tcIn
LOCAL loF, loCombo, lcA
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", 25001, 1)
poDate.nIdTipDoc = IdTipDoc(tcDin)
poGeneratorNumere.ResetNumere()
gnMockNumar = 100
gcMockApeluri = ""
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
poDate.dataact = DATE(gnAn, gnLuna, 1)
poDate.dataireg = poDate.dataact
poDate.id_client = 0
poDate.nract = 555
gcErr = ""
loF = CREATEOBJECT(tcClasa)
IF VARTYPE(loF) <> 'O'
RETURN "CREATEOBJECT " + tcClasa + " ESUAT" + CHR(13) + CHR(10) + gcErr
ENDIF
IF tcClasa == 'frm_date_factura'
loCombo = loF.ct_clb_fdoc._combobox1
ELSE
loCombo = loF.clb_fdoc.cboFdoc
ENDIF
loCombo.Value = tcIn
gcMockApeluri = ""
gcErr = ""
loF.do_schimba_tipdoc()
lcA = "nidtipdoc=" + TRANSFORM(poDate.nIdTipDoc) + CHR(13) + CHR(10)
lcA = lcA + "nract_alocat=" + TRANSFORM(poDate.nract <> 0) + CHR(13) + CHR(10)
lcA = lcA + "GENERATOR:" + CHR(13) + CHR(10) + gcMockApeluri
lcA = lcA + "ERORI:" + CHR(13) + CHR(10) + gcErr
loF.Release()
RELEASE loF
RETURN lcA
ENDFUNC
FUNCTION IdTipDoc
LPARAMETERS tcFel
RETURN IIF(tcFel == "PROFORMA", 23, IIF(tcFel == "BON FISCAL", 3, 5))
ENDFUNC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL: " + gcCaz + tcMsg
ENDIF
ENDPROC
PROCEDURE AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + CHR(13) + CHR(10)
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,291 @@
* test_s13_mesaj_cota_lipsa.prg
* Headless: do_adauga_tot semnaleaza, la finalul adaugarii in masa, liniile a caror cota de TVA nu
* are coloana de jurnal (explicatie TVA) in perioada de lucru - in loc sa le lase sa cada abia la
* scriere, in Oracle, cu "Nu a fost gasita cota de TVA! (FACT-013 : <id intern>)".
*
* Nomenclatorul e cel REAL, citit din MARIUSM_AUTO@ROA_CENTRAL prin update_jtva_coloane([JV], ...)
* si filtrat exact ca in ofacturare.prg:237 (ramura tva_incasare = 0). Perioada de lucru se fixeaza
* pe 2026/08, unde COTE_TVA are 0/11/19/21 - deci 19% GASESTE coloana, iar 24% NU.
*
* crsarticole se construieste direct (ca in test_s4e_0_adauga_articol.prg): do_adauga_tot citeste
* doar cursorul, nu gridul. Ce se probeaza e traseul real do_adauga_tot -> do_adauga_articol ->
* do_initializeaza_articol -> crsfactura, nu incarcarea candidatilor.
*
* CAZ_A (v2, mixt): doua articole, unul pe 19% si unul pe 24% -> un singur mesaj, care numeste
* articolul de 24% si cota lui, nu si pe cel de 19%; ambele linii RAMAN in crsfactura.
* CAZ_B (v2, curat): doua articole pe 19% -> niciun mesaj.
* CAZ_C (v1, mixt): acelasi scenariu ca A, pe frm_facturare_articole (copia veche a metodei).
*
* amessagebox e mocat (mock_validare_antet.prg, pus PRIMUL in SET PROCEDURE) - textul complet al
* mesajului ajunge in gcMockApeluri, cu CHR(13) transformat in "|".
*
* SET TABLEPROMPT OFF e obligatoriu: fara el, un fisier lipsa (saft_taxtable.dbf) scoate dialogul
* modal "Open" din do_adauga_articol si rularea pare agatata la nesfarsit, fara nimic in log.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s13_mesaj_cota_lipsa.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s13_mesaj_cota_lipsa.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 0; gnAn/gnLuna = 2026/08.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
= SYS(2335, 0)
SET TABLEPROMPT OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET NULLDISPLAY TO ''
PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr
PUBLIC gcMockApeluri, gnMockRaspuns, gcMockDuplicat
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s13_mesaj_cota_lipsa.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
gnErr = 0
gcCaz = ""
gcErr = ""
gcMockApeluri = ""
gnMockRaspuns = 6
gcMockDuplicat = ""
ON ERROR DO CtErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8
IF TYPE('gnHandle') <> 'N' OR gnHandle <= 0
DO CtLog WITH "FAIL: conexiune Oracle esuata"
DO Final
ENDIF
LOCAL lcProc
lcProc = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", ;
"D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg", &lcProc
IF !actualizeaza_optiuni_program()
DO CtLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
gnScadereStoc = 0
DO CtLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna)
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE
*-- nomenclatorul real, filtrat exact ca in ofacturare.prg:237 (ramura tva_incasare = 0)
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane
DO CtLog WITH "jtva_coloane reccount=" + TRANSFORM(RECCOUNT('jtva_coloane'))
SELECT jtva_coloane
SET FILTER TO
LOCATE FOR cota_tva = 19
DO Assert WITH FOUND(), "premisa: cota 19 ARE coloana de jurnal in 2026/08"
LOCATE FOR cota_tva = 24
DO Assert WITH !FOUND(), "premisa: cota 24 NU are coloana de jurnal in 2026/08"
PRIVATE poDate, poGeneratorNumere, plVizibil, pnTotalDiscountAvize
plVizibil = .F.
pnTotalDiscountAvize = 0
poDate = NULL
poGeneratorNumere = CREATEOBJECT("oGeneratorMock")
DO CazMixt WITH 'frm_facturare_articole2', "[CAZ_A v2 mixt] "
DO CazCurat WITH 'frm_facturare_articole2', "[CAZ_B v2 curat] "
DO CazMixt WITH 'frm_facturare_articole', "[CAZ_C v1 mixt] "
DO Final
*----------------------------------------------------------------------------------------
* Un articol pe 19% (are coloana) si unul pe 24% (nu are) -> exact un mesaj, care numeste doar
* articolul de 24%. Ambele linii raman pe document.
PROCEDURE CazMixt
LPARAMETERS tcClasa, tcCaz
LOCAL loForm, lnRecDupa
gcCaz = tcCaz
DO CtLog WITH "PAS: " + gcCaz + tcClasa
DO Reseteaza WITH 3
DO CreeazaCrsArticole
INSERT INTO crsarticole VALUES (1, 401, "ARTICOL COTA 19", 5, 0, 0, 100, 0, 1.19, 0, "BUC", ;
21, "371", 1, 0, 1, 1, 0, 0, "CM401", "", "RON")
INSERT INTO crsarticole VALUES (2, 402, "ARTICOL COTA 24", 3, 0, 0, 200, 0, 1.24, 0, "BUC", ;
21, "371", 1, 0, 1, 1, 0, 0, "CM402", "", "RON")
GO TOP IN crsarticole
loForm = CREATEOBJECT(tcClasa)
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject " + tcClasa
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
gcErr = ""
gnErr = 0
gcMockApeluri = ""
loForm.do_adauga_tot()
DO CtLog WITH " mesaje: " + CHR(13) + CHR(10) + gcMockApeluri
DO Assert WITH "explicatie de TVA" $ gcMockApeluri, "mesajul agregat a fost afisat"
DO Assert WITH "pentru 1 linii" $ gcMockApeluri, "mesajul numara exact o linie"
DO Assert WITH "ARTICOL COTA 24" $ gcMockApeluri, "mesajul numeste articolul de 24%"
DO Assert WITH "24.00%" $ gcMockApeluri, "mesajul numeste cota 24.00%"
DO Assert WITH !("ARTICOL COTA 19" $ gcMockApeluri), "mesajul NU semnaleaza articolul de 19%"
DO Assert WITH RECCOUNT('crsfactura') = 2, "ambele linii raman pe document (Reccount=" + TRANSFORM(RECCOUNT('crsfactura')) + ")"
IF USED('crsfactura')
lnRecDupa = RECNO('crsfactura')
DO Assert WITH BETWEEN(lnRecDupa, 1, RECCOUNT('crsfactura')), ;
"pozitia in crsfactura e restaurata, nu EOF (Recno=" + TRANSFORM(lnRecDupa) + ")"
SELECT crsfactura
LOCATE FOR id_articol = 402
DO Assert WITH FOUND() AND NVL(id_jtva_coloana, 0) = 0, "linia de 24% a ramas fara id_jtva_coloana"
LOCATE FOR id_articol = 401
DO Assert WITH FOUND() AND NVL(id_jtva_coloana, 0) > 0, "linia de 19% si-a gasit coloana"
ENDIF
DO Inchide WITH 'crsarticole'
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
* Doar cote valabile -> niciun mesaj (cazul normal nu se deranjeaza).
PROCEDURE CazCurat
LPARAMETERS tcClasa, tcCaz
LOCAL loForm
gcCaz = tcCaz
DO CtLog WITH "PAS: " + gcCaz + tcClasa
DO Reseteaza WITH 3
DO CreeazaCrsArticole
INSERT INTO crsarticole VALUES (1, 411, "ARTICOL BUN UNU", 5, 0, 0, 100, 0, 1.19, 0, "BUC", ;
21, "371", 1, 0, 1, 1, 0, 0, "CM411", "", "RON")
INSERT INTO crsarticole VALUES (2, 412, "ARTICOL BUN DOI", 3, 0, 0, 200, 0, 1.19, 0, "BUC", ;
21, "371", 1, 0, 1, 1, 0, 0, "CM412", "", "RON")
GO TOP IN crsarticole
loForm = CREATEOBJECT(tcClasa)
IF VARTYPE(loForm) <> 'O'
DO Assert WITH .F., "Createobject " + tcClasa
RETURN
ENDIF
gcErr = ""
gnErr = 0
gcMockApeluri = ""
loForm.do_adauga_tot()
DO CtLog WITH " mesaje: [" + gcMockApeluri + "]"
DO Assert WITH !("explicatie de TVA" $ gcMockApeluri), "niciun mesaj pe cazul normal"
DO Assert WITH RECCOUNT('crsfactura') = 2, "ambele linii adaugate (Reccount=" + TRANSFORM(RECCOUNT('crsfactura')) + ")"
DO Inchide WITH 'crsarticole'
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
PROCEDURE CreeazaCrsArticole
SELECT 0
CREATE CURSOR crsarticole (id_c N(20), id_articol N(20), denumire C(100), cantitate N(20,4), ;
gestionabil N(1), opt_facturare N(3), Pret N(20,4), pret_val N(20,4), proc_tvav N(20,4), ;
preturi_cu_tva N(1), um C(10), id_gestiune N(20), cont C(10), id_valuta N(10), tip_valuta N(1), ;
Curs N(20,4), multiplicator N(10), discount_unitar N(20,4), discount_unitar_val N(20,4), ;
codmat C(50), codbare C(50), nume_val C(20))
ENDPROC
PROCEDURE Reseteaza
LPARAMETERS tnTip
LOCAL lnIdSet
DO Inchide WITH 'crsarticole'
DO Inchide WITH 'crsarticole1'
DO Inchide WITH 'crsfactura'
DO Inchide WITH 'crscursuri'
DO Inchide WITH 'crspolitici'
DO Inchide WITH 'crscontracte'
DO Inchide WITH 'crsgestiunidest'
DO Inchide WITH 'crsCtrTemp'
DO Inchide WITH 'CrsCotaTva'
DO Inchide WITH 'saft_tip_facturi'
SELECT 0
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
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
gcMockApeluri = ""
gcErr = ""
gnErr = 0
gnMockRaspuns = 6
gcMockDuplicat = ""
lnIdSet = 26000 + tnTip
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip)
poDate.dataireg = DATE(gnAn, gnLuna, 1)
poDate.dataact = poDate.dataireg
poDate.zi_curs = poDate.dataireg
poDate.id_fdoc = 1
poDate.fdoc = "FEL TEST"
poDate.nract = 78
poDate.serie_act = "TST"
poDate.id_client = 1
poDate.id_furnizor = 1
poDate.nrfactachi = 1
poDate.id_valuta = 1
poDate.in_valuta = 0
poDate.listaid = "1"
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
gcMockApeluri = ""
ENDPROC
PROCEDURE Inchide
LPARAMETERS tcAlias
IF USED(tcAlias)
USE IN (tcAlias)
ENDIF
ENDPROC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO CtLog WITH "PASS: " + gcCaz + tcMsg
ELSE
gnFail = gnFail + 1
DO CtLog WITH "FAIL: " + gcCaz + tcMsg
ENDIF
ENDPROC
PROCEDURE CtLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE CtErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10)
gnErr = gnErr + 1
DO CtLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
DO CtLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr)
DO CtLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,534 @@
* test_s3_4_cursor_articole.prg
* Headless: dovedeste ca extragerea constructiei cursorului de articole din bucla procedurii factureaza
* (COMUN\programe\ofacturare.prg:261-438, starea dinaintea S3-4a) intr-o functie globala
* (incarca_cursor_articole, COMUN\programe\ofacturare.prg) e o REFACTORIZARE PURA: pe aceleasi
* intrari, cele doua implementari lasa in urma exact aceleasi cursoare (structura + continut), acelasi
* rezultat, acelasi SQL trimis la Oracle, aceleasi apeluri de generator, acelasi dialog si aceleasi erori.
*
* Implementarea de REFERINTA (PROCEDURE BlocVechi, la finalul fisierului) e o copie VERBATIM a blocului
* din backup (COMUN\programe\ofacturare.pre_s3_4a.bak.prg:261-438), dedentata cu doua taburi, plus o
* singura linie de marcaj (glVechiArticole = .T.) pe pozitia ELSE-ului "am articole" - exact acolo unde
* functia noua pune loRezultat.lArticole = .T. Generata mecanic, nu transcrisa de mana.
*
* Oracle NU se atinge pe calea articolelor: goExecutor e inlocuit temporar cu oExecutorMock, care
* intercepteaza doar apelul pe cursorul crsarticole (jurnalizeaza SQL-ul si construieste un cursor
* sintetic controlat de test) si trimite orice alt apel la executorul real (citeste_cursuri_zi ramane
* real). Generatorul de numere e oGeneratorMock, vizualizeaza_curs e mock. NU se consuma numere reale.
*
* REZULTAT ASTEPTAT (declarat inainte de rulare):
* A. Pentru fiecare caz, amprenta VECHI == amprenta NOU. Amprenta cuprinde: rezultatul (nSucces,
* cCursor, lArticole), formularul de articole ales de apelant (lcObject), cursoarele crsarticole,
* crsarticole1, crsfactura, crscursuri, crspolitici, crscontracte, crsgestiunidest, crsCtrTemp
* (deschis/nu, reccount, structura, continut), aliasul selectat la iesire, poDate.Curs /
* .multiplicator / .id_agent, jurnalul generatorului, SQL-ul trimis, ultimul dialog, erorile VFP.
* B. Cazuri: toate cele 12 ramuri ale Do Case-ului pe tnTip (inclusiv copierea si ramura fara potrivire),
* ambele valori pentru in_valuta, eProforma = 1, cele doua esecuri (Oracle -20005 si alta eroare) si
* cursorul gol.
* C. SQL-ul jurnalizat e nevid si identic intre cele doua implementari pe fiecare ramura - dovada ca
* Do Case-ul a fost mutat neschimbat.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3_4_cursor_articole.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_4_cursor_articole.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 1.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gcCaz, gcErr, gcMockApeluri, gnMockNumar
PUBLIC gcMockSql, gnMockSucces, gnMockEroare, gcMockMod, gcMockCurs, gcMockUltimMesaj, gnMockUltimTip
PUBLIC glVechiArticole, gnVechiSucces, gcVechiCursor, gcVechiObject, goExecutorReal
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_4_cursor_articole.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
gcCaz = ""
gcErr = ""
gcMockApeluri = ""
gnMockNumar = 0
gcMockSql = ""
gnMockSucces = 1
gnMockEroare = 0
gcMockMod = "PLIN"
gcMockCurs = ""
gcMockUltimMesaj = ""
gnMockUltimTip = 0
glVechiArticole = .F.
gnVechiSucces = 0
gcVechiCursor = ""
gcVechiObject = ""
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
LOCAL lcProc
lcProc = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", ;
"D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_cursor_articole.prg", ;
&lcProc, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg"
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
gnScadereStoc = 1
DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna)
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
* jtva_coloane_temp e nevoie ramurii tnTip = 30 (update_jtva_coloane), la fel ca in factureaza
DO AfLog WITH "PAS: update_jtva_coloane"
update_jtva_coloane([JV], [jtva_coloane_temp])
DO AfLog WITH "PAS: jtva_coloane_temp gata"
PRIVATE poDate, poGeneratorNumere, plVizibil, poDateGestiuneDest, pnTotalDiscountAvize
plVizibil = .F.
pnTotalDiscountAvize = 0
poGeneratorNumere = CREATEOBJECT("oGeneratorMock")
poDateGestiuneDest = CREATEOBJECT("oDateGestiune")
poDate = NULL
goExecutorReal = goExecutor
goExecutor = CREATEOBJECT("oExecutorMock")
goExecutor.oReal = goExecutorReal
* --- ramurile Do Case-ului pe tnTip (eticheta = ramura acoperita) ---
DO Caz WITH 1, .F., "PLIN", 1, 0, 0, 0, "lista de preturi"
DO Caz WITH 22, .F., "PLIN", 1, 0, 0, 0, "lista de preturi"
DO Caz WITH 5, .F., "PLIN", 1, 0, 1, 0, "lista de preturi, in valuta"
DO Caz WITH 29, .F., "PLIN", 1, 0, 0, 0, "lista de preturi"
DO Caz WITH 7, .F., "PLIN", 1, 0, 0, 0, "lista de preturi"
DO Caz WITH 10, .F., "PLIN", 1, 0, 0, 0, "lista de preturi"
DO Caz WITH 23, .F., "PLIN", 1, 0, 0, 0, "lista de preturi"
DO Caz WITH 2, .F., "PLIN2", 1, 0, 0, 0, "contract"
DO Caz WITH 26, .F., "PLIN2", 1, 0, 0, 0, "contract"
DO Caz WITH 6, .F., "PLIN2", 1, 0, 0, 0, "contract"
DO Caz WITH 52, .F., "PLIN", 1, 0, 1, 0, "contract in valuta"
DO Caz WITH 3, .F., "PLIN", 1, 0, 0, 0, "comanda"
DO Caz WITH 21, .F., "PLIN", 1, 0, 0, 0, "comanda"
DO Caz WITH 25, .F., "PLIN", 1, 0, 0, 0, "comanda"
DO Caz WITH 28, .F., "PLIN", 1, 0, 0, 0, "comanda"
DO Caz WITH 42, .F., "PLIN", 1, 0, 0, 0, "comanda"
DO Caz WITH 47, .F., "PLIN", 1, 0, 0, 0, "comanda"
DO Caz WITH 4, .F., "PLIN", 1, 0, 0, 0, "avize"
DO Caz WITH 41, .F., "PLIN", 1, 0, 0, 0, "gestiune (transfer subunitati)"
DO Caz WITH 30, .F., "PLIN", 1, 0, 0, 0, "aviz din NIR"
DO Caz WITH 27, .F., "PLIN", 1, 0, 0, 0, "lucrare (crsgestiunidest)"
DO Caz WITH 8, .F., "PLIN", 1, 0, 0, 0, "retur"
DO Caz WITH 9, .F., "PLIN", 1, 0, 0, 0, "retur"
DO Caz WITH 24, .F., "PLIN", 1, 0, 0, 0, "aviz retur"
DO Caz WITH 45, .F., "PLIN", 1, 0, 0, 0, "preturi pe locatie"
DO Caz WITH 48, .F., "PLIN", 1, 0, 0, 0, "articole k"
DO Caz WITH 49, .F., "PLIN", 1, 0, 0, 0, "articole k"
DO Caz WITH 1, .T., "PLIN", 1, 0, 0, 0, "copiere document"
DO Caz WITH 99, .F., "PLIN", 1, 0, 0, 0, "fara ramura in Do Case"
* --- variante pe acelasi tnTip ---
DO Caz WITH 1, .F., "PLIN", 1, 0, 0, 1, "proforma (gestionabil = 0)"
DO Caz WITH 1, .F., "GOL", 1, 0, 0, 0, "cursor gol"
DO Caz WITH 1, .F., "FARA", -1, 20005, 0, 0, "esec Oracle -20005"
DO Caz WITH 1, .F., "FARA", -1, 1400, 0, 0, "esec Oracle, alta eroare"
* contract fara al doilea cursor (crsarticole1) nu se poate testa headless: VFP deschide dialogul
* "locate file" cand aliasul lipseste in Select ... From (lcCursor + [1]) - comportament preexistent
DO Final
*----------------------------------------------------------------------------------------
* implementarea de REFERINTA - copie verbatim a blocului din ofacturare.pre_s3_4a.bak.prg:261-438
PROCEDURE BlocVechi
LPARAMETERS tnTip, tlCopiere
LOCAL lcCursor, lcObject, lcSqlCursor, lnSucces, loArticole, llCopiere
llCopiere = tlCopiere
glVechiArticole = .F.
Do Case
Case m.llCopiere
lcSqlCursor = [{call pack_facturare.cursor_retur_document(?poDate.in_valuta,?poDate.listaid,1,?poDate.eProforma,?gnIdUtil)}]
*!* modificare v 2.0.93 ; modificare v 2.0.95 : am adaugat 49
Case Inlist(tnTip, 48, 49)
lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_articole_k(?poDate.zi_curs,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}]
*!* modificare v 2.0.93 ^
*!* modificare v 2.0.87
Case tnTip = 45
lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_preturi(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ;
[?poDate.listaid,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}]
*!* modificare v 2.0.87 ^
Case Inlist(tnTip, 1, 22, 5, 29, 7, 10, 23) && lista de preturi
&& modificare v 2.0.56 : am adaugat 10
lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_preturi(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ;
[?poDate.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}]
Case Inlist(tnTip, 2, 26, 6, 52) && contract
poDate.id_agent = 0
*!* modificare v 2.0.67
*!* lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_contract(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ;
*!* [?poDate.listaid,?poDate.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala,?@pnTipFacturare,] + ;
*!* [?@poDate.id_agent,?@poDate.nume_agent)}]
lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_contract(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ;
[?poDate.listaid,?poDate.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala,?@poDate.id_agent,?@poDate.nume_agent)}]
*!* modificare v 2.0.67 ^
Case Inlist(tnTip, 3, 21, 25, 28, 42, 47) && comenzi
lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_comanda(?poDate.zi_curs,?poDate.tip,?poDate.listaid,?gnIdUtil)}]
Case tnTip = 4 && din avize
lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_avize(?poDate.listaid,?gnIdUtil,?@pnTotalDiscountAvize)}]
Case Inlist(tnTip, 41) && transfer intre subunitati pe baza de lista de preturi + retur transfer
lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_gestiune(?poDate.zi_curs,?poDate.id_pol,] + ;
[?poDate.id_client,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}]
Case tnTip = 30 && transfer intre subunitati pe baza de NIR
lcSqlCursor = [{call pack_facturare.cursor_aviz_nir(?poDate.id_client,?poDate.id_furnizor,?poDate.nrfactachi,?gnIdSucursala)}]
*!* modificare v 2.0.90 ^
Case tnTip = 27
lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_lucrare(?poDate.zi_curs,?poDate.id_client,] + ;
[?poDate.id_lucrare,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}]
*!* modificare v 2.0.56
Case Inlist(tnTip, 8, 9, 24) && 8,9 = facturi de retur, 24 = aviz retur
lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_retur(?poDate.in_valuta,?poDate.listaid,?gnIdUtil)}]
Endcase
lcCursor = [crsarticole]
lnSucces = goExecutor.oExecute(lcSqlCursor, lcCursor)
If lnSucces < 0
AMESSAGEBOX(goExecutor.oPrelucrareEroare(), 16, "Eroare")
If goExecutor.nEroare = 20005
vizualizeaza_curs(poDate.zi_curs)
ENDIF
*!* nu inchid crsCtrTemp
*!* modificare v 2.0.56
*!* poGeneratorNumere.dezaloca_numar(pnIdTipDoc)
*!* modificare v 2.0.56 ^
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) && 29.03.2021 deblochez numarul ca sa il pot reda pe acelasi cand se reincarca formularul
Else
If Reccount(lcCursor) = 0 And (!Used(lcCursor + '1') Or (Used(lcCursor + '1') And Reccount(lcCursor + '1') = 0))
AMESSAGEBOX("Nu exista articole pentru optiunile alese!", 48, "Atentie")
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
Use In (SELECT('crsCtrTemp'))
ELSE
glVechiArticole = .T.
* Daca este o proforma, consider toate articolele negestionabile, pentru a nu mai alege din stoc
* 12.03.2021
IF poDate.eProforma = 1
UPDATE (m.lcCursor) SET gestionabil = 0
GO TOP IN (m.lcCursor)
ENDIF
creeaza_facturacrs([crsfactura])
If tnTip = 30 && Aviz din NIR
* populez factura cu articolele din NIR
Local lcIdJtva
Select (lcCursor)
Scan
Scatter Name loArticole Memo
Select crsfactura
update_jtva_coloane([JV], 'CrsCotaTva', 0)
Select CrsCotaTva
Locate For cota_tva = (loArticole.proc_tvav * 100 - 100)
If Found()
lcIdJtva = id_jtva_coloana
Else
lcIdJtva = Null
Endif
Use In CrsCotaTva
Insert Into crsfactura ;
(id_c, id_temp, id_articol, id_gestiune, Cont, um, ;
id_valuta, gestionabil, tip_valuta, Curs, multiplicator, id_jtva_coloana, codmat, ;
pret_achizitie, pretd, id_valuta_d, denumire, pretftva, pretctva, valftva, valtva, valctva, ;
cantitate, discountftva, discountctva, valdiscountftva, valdiscounttva, ;
valdiscountctva, valdiminuatftva, valdiminuattva, valdiminuatctva, proc_tvav, cu_tva, serie, ;
id_set_fact, explicatie, id_pol, id_ctr ) ;
Values (;
loArticole.id_c, loArticole.id_c, loArticole.id_articol, loArticole.id_gestiune, loArticole.Cont, loArticole.um, ;
loArticole.id_valuta, loArticole.gestionabil, loArticole.tip_valuta, loArticole.Curs, ;
loArticole.multiplicator, lcIdJtva, Nvl(loArticole.codmat, ' '), ;
loArticole.preta, loArticole.pretd, loArticole.id_valuta_d, loArticole.denumire, ;
loArticole.pretftva, loArticole.pretctva, ;
Round(loArticole.cantitate * loArticole.pretftva, gnpc), ;
Round(loArticole.cantitate * loArticole.tvav, gnpc), ;
Round(loArticole.cantitate * loArticole.pretctva, gnpc), ;
loArticole.cantitate, 0, 0, 0, 0, ;
0, Round(loArticole.cantitate * loArticole.pretftva, gnpc), Round(loArticole.cantitate * loArticole.tvav, gnpc), ;
Round(loArticole.cantitate * loArticole.pretctva, gnpc), loArticole.proc_tvav, loArticole.preturi_cu_tva, '', ;
Null, '', Null, Null)
Select (lcCursor)
Endscan
Release lcIdJtva
Select crsfactura
Release loArticole
ENDIF && tnTip = 30
If tnTip = 27
lcObject = [frm_avizare_lucrare]
Create Cursor crsgestiunidest(id_gestiune N(20), nume_gestiune c(100))
Select crsgestiunidest
Append Blank
Replace id_gestiune With - 9999, nume_gestiune With '<TOATE>'
Insert Into crsgestiunidest(id_gestiune, nume_gestiune) ;
Select Distinct id_gestiune, nume_gestiune From (lcCursor) Order By nume_gestiune
Else
Local llFacturareNoua
llFacturareNoua = (Type('plFacturareNoua') = 'L' And m.plFacturareNoua)
lcObject = IIF(m.llFacturareNoua, [frm_facturare_articole2], [frm_facturare_articole])
Endif
*!* modificare v 2.0.67
*!* Endif
*!* modificare v 2.0.67 ^
*!* modificare v 2.0.56
*!* If Type('crsarticole.curs')<>'U'
*!* Select Distinct Curs,nume_val From crsArticole With (Buffering = .T.) Where tip_valuta = 1 Into Cursor crscursuri
*!* If poDate.in_valuta = 1
*!* Select crscursuri
*!* poDate.Curs = Curs
*!* Endif
If poDate.in_valuta = 1
Select Distinct Curs, nume_val, id_valuta, multiplicator From (lcCursor) 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 Reccount('crscursuri') = 0
Use In crscursuri
Endif
*!* modificare v 2.0.56 ^
Endif
If Type(lcCursor + '.nume_lista_preturi') <> 'U'
Create Cursor crspolitici (id_pol N(20), nume_lista_preturi c(100))
Select crspolitici
*!* modificare v 2.0.77
*!* Append Blank
*!* Replace id_pol With -9999,nume_lista_preturi With '<TOATE>'
Insert Into crspolitici(id_pol, nume_lista_preturi) Values (-9999, '<TOATE>')
*!* modificare v 2.0.77 ^
Insert Into crspolitici(id_pol, nume_lista_preturi) ;
Select Distinct id_pol, nume_lista_preturi From (lcCursor) Order By nume_lista_preturi
Endif
*!* modificare v 2.0.67
If Inlist(tnTip, 2, 6, 26)
Create Cursor crscontracte(id_ctr N(20), numar_contract c(100), Data d Null, numar c(50) Null)
Select crscontracte
Append Blank
Replace id_ctr With - 9999, numar_contract With '<TOATE>'
Insert Into crscontracte(id_ctr, numar_contract, Data, numar) ;
Select Distinct id_ctr, numar_contract, Data, numar From (lcCursor + [1]) Order By Data, numar
Endif
*!* modificare v 2.0.67 ^
Endif
Endif
gnVechiSucces = lnSucces
gcVechiCursor = IIF(TYPE('lcCursor') = 'C', lcCursor, '')
gcVechiObject = IIF(TYPE('lcObject') = 'C', lcObject, '')
ENDPROC
*----------------------------------------------------------------------------------------
PROCEDURE Caz
LPARAMETERS tnTip, tlCopiere, tcMod, tnSucces, tnEroare, tnInValuta, tnEProforma, tcEticheta
LOCAL lcVechi, lcNou, lcSqlVechi, lcSqlNou, loRez
gcCaz = "[tip=" + TRANSFORM(tnTip) + IIF(tlCopiere, " copiere", "") + " " + tcMod + ;
" succes=" + TRANSFORM(tnSucces) + " eroare=" + TRANSFORM(tnEroare) + ;
" valuta=" + TRANSFORM(tnInValuta) + " proforma=" + TRANSFORM(tnEProforma) + ;
" " + tcEticheta + "] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH tnTip, tcMod, tnSucces, tnEroare, tnInValuta, tnEProforma
DO BlocVechi WITH tnTip, tlCopiere
lcSqlVechi = gcMockSql
lcVechi = Amprenta(gnVechiSucces, gcVechiCursor, glVechiArticole, gcVechiObject)
DO Reseteaza WITH tnTip, tcMod, tnSucces, tnEroare, tnInValuta, tnEProforma
loRez = incarca_cursor_articole(tnTip, tlCopiere, poGeneratorNumere)
lcSqlNou = gcMockSql
IF VARTYPE(loRez) <> 'O'
gnFail = gnFail + 1
DO AfLog WITH "FAIL " + gcCaz + "incarca_cursor_articole nu a intors obiect: " + gcErr
RETURN
ENDIF
lcNou = Amprenta(loRez.nSucces, loRez.cCursor, loRez.lArticole, ObiectNou(tnTip, loRez.lArticole))
IF lcVechi == lcNou
gnPass = gnPass + 1
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL " + gcCaz + "amprente diferite:"
DO AfLog WITH "--- VECHI ---"
DO AfLog WITH lcVechi
DO AfLog WITH "--- NOU ---"
DO AfLog WITH lcNou
ENDIF
DO Assert WITH lcSqlVechi == lcSqlNou, "SQL identic; vechi=[" + STRTRAN(lcSqlVechi, CHR(13) + CHR(10), " ") + "] nou=[" + STRTRAN(lcSqlNou, CHR(13) + CHR(10), " ") + "]"
DO Assert WITH !EMPTY(lcSqlNou), "SQL jurnalizat nevid"
DO Assert WITH TRANSFORM(loRez.cSql) + CHR(13) + CHR(10) == lcSqlNou, "loRez.cSql = SQL-ul trimis executorului"
DO Assert WITH loRez.nSucces = tnSucces, "loRez.nSucces = " + TRANSFORM(tnSucces)
DO Assert WITH loRez.cCursor == [crsarticole], "loRez.cCursor = crsarticole"
DO Assert WITH loRez.lArticole = (tcMod == "PLIN" OR tcMod == "PLIN2"), "loRez.lArticole = " + TRANSFORM(tcMod == "PLIN" OR tcMod == "PLIN2")
ENDPROC
*----------------------------------------------------------------------------------------
FUNCTION Amprenta
LPARAMETERS tnSucces, tcCursor, tlArticole, tcObject
LOCAL lcA, lcCRLF
lcCRLF = CHR(13) + CHR(10)
lcA = "REZ: succes=" + TRANSFORM(tnSucces) + " cursor=" + TRANSFORM(tcCursor) + ;
" articole=" + TRANSFORM(tlArticole) + " obiect=" + TRANSFORM(tcObject) + lcCRLF
lcA = lcA + "ALIAS=" + TRANSFORM(ALIAS()) + lcCRLF
lcA = lcA + "poDate: curs=" + TRANSFORM(poDate.Curs) + " mult=" + TRANSFORM(poDate.multiplicator) + ;
" id_agent=" + TRANSFORM(poDate.id_agent) + " nract=" + TRANSFORM(poDate.nract) + ;
" gestionabil_proforma=" + TRANSFORM(poDate.eProforma) + lcCRLF
lcA = lcA + DumpCursor('crsarticole') + DumpCursor('crsarticole1') + DumpCursor('crsfactura') + ;
DumpCursor('crscursuri') + DumpCursor('crspolitici') + DumpCursor('crscontracte') + ;
DumpCursor('crsgestiunidest') + DumpCursor('crsCtrTemp')
lcA = lcA + "GENERATOR:" + lcCRLF + gcMockApeluri
lcA = lcA + "DIALOG: [" + TRANSFORM(gcMockUltimMesaj) + "] tip=" + TRANSFORM(gnMockUltimTip) + lcCRLF
lcA = lcA + "CURS:" + lcCRLF + gcMockCurs
lcA = lcA + "ERORI:" + lcCRLF + gcErr
RETURN lcA
ENDFUNC
*----------------------------------------------------------------------------------------
FUNCTION DumpCursor
LPARAMETERS tcAlias
LOCAL lcA, lnRec, lnSel, i, j, lcCRLF
LOCAL ARRAY laF[1, 1]
lcCRLF = CHR(13) + CHR(10)
IF !USED(tcAlias)
RETURN "[" + tcAlias + "] inchis" + lcCRLF
ENDIF
lnSel = SELECT()
SELECT (tcAlias)
lnRec = RECNO()
lcA = "[" + tcAlias + "] rec=" + TRANSFORM(RECCOUNT()) + " recno=" + TRANSFORM(lnRec) + ;
" campuri=" + TRANSFORM(FCOUNT()) + lcCRLF
=AFIELDS(laF)
FOR i = 1 TO ALEN(laF, 1)
lcA = lcA + " " + ALLTRIM(laF[i, 1]) + " " + laF[i, 2] + TRANSFORM(laF[i, 3]) + "," + TRANSFORM(laF[i, 4]) + lcCRLF
ENDFOR
SCAN
lcA = lcA + " |"
FOR j = 1 TO FCOUNT()
lcA = lcA + TRANSFORM(EVALUATE(FIELD(j))) + "|"
ENDFOR
lcA = lcA + lcCRLF
ENDSCAN
IF lnRec > 0 AND lnRec <= RECCOUNT()
GO lnRec
ENDIF
SELECT (lnSel)
RETURN lcA
ENDFUNC
*----------------------------------------------------------------------------------------
* ce ramane in factureaza dupa extragere: alegerea formularului de articole (linia :439 de azi)
FUNCTION ObiectNou
LPARAMETERS tnTip, tlArticole
LOCAL llFacturareNoua
IF !tlArticole
RETURN ''
ENDIF
IF tnTip = 27
RETURN [frm_avizare_lucrare]
ENDIF
llFacturareNoua = (TYPE('plFacturareNoua') = 'L' AND m.plFacturareNoua)
RETURN IIF(m.llFacturareNoua, [frm_facturare_articole2], [frm_facturare_articole])
ENDFUNC
*----------------------------------------------------------------------------------------
PROCEDURE Reseteaza
LPARAMETERS tnTip, tcMod, tnSucces, tnEroare, tnInValuta, tnEProforma
LOCAL lnIdSet
DO Inchide WITH 'crsarticole'
DO Inchide WITH 'crsarticole1'
DO Inchide WITH 'crsfactura'
DO Inchide WITH 'crscursuri'
DO Inchide WITH 'crspolitici'
DO Inchide WITH 'crscontracte'
DO Inchide WITH 'crsgestiunidest'
DO Inchide WITH 'crsCtrTemp'
DO Inchide WITH 'CrsCotaTva'
SELECT 0
gcMockMod = tcMod
gnMockSucces = tnSucces
gnMockEroare = tnEroare
gcMockSql = ""
gcMockCurs = ""
gcMockUltimMesaj = ""
gnMockUltimTip = 0
gcErr = ""
gnMockNumar = 100
glVechiArticole = .F.
gnVechiSucces = 0
gcVechiCursor = ""
gcVechiObject = ""
lnIdSet = 25000 + tnTip - 1 + gnScadereStoc * 10
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip)
poDate.nIdTipDoc = IIF(tnTip < 21 OR INLIST(tnTip, 45, 48, 49, 51, 52), 5, 6)
poDate.tip = tnTip
poDate.zi_curs = DATE(gnAn, gnLuna, 1)
poDate.dataact = poDate.zi_curs
poDate.dataireg = poDate.zi_curs
poDate.in_valuta = tnInValuta
poDate.eProforma = tnEProforma
poDate.id_valuta = 1
poDate.listaid = '1'
poDate.id_gestiune_init = 1
poDate.id_pol = 1
poDate.id_client = 1
poDate.id_furnizor = 1
poDate.nrfactachi = 1
poDate.id_lucrare = 1
poDate.nract = 0
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
gcMockApeluri = ""
ENDPROC
PROCEDURE Inchide
LPARAMETERS tcAlias
IF USED(tcAlias)
USE IN (tcAlias)
ENDIF
ENDPROC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL: " + gcCaz + tcMsg
ENDIF
ENDPROC
PROCEDURE AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ")" + CHR(13) + CHR(10)
ENDPROC
PROCEDURE Final
IF TYPE('goExecutorReal') = 'O'
goExecutor = goExecutorReal
ENDIF
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,503 @@
* test_s3_4b_incarca_articole.prg
* Headless: do_incarca_articole pe frm_facturare_articole2 (COMUN\clase\ofacturare.vc2) - metoda
* noua, inerta pana la S3-4c, care valideaza antetul si apeleaza incarca_cursor_articole (S3-4a)
* direct din scope-ul formularului, unde poDate/poGeneratorNumere sunt Private-urile lui factureaza.
*
* Spre deosebire de testele S3-1..S3-3, crsfactura NU e populat dinainte - doar structura goala
* (creeaza_facturacrs), pentru ca grd_factura.Column1.ControlSource e calificat ("crsFactura.denumire"),
* legat la Createobject: fara alias-ul deschis (macar gol), Createobject arunca eroarea 13 "Alias
* 'CRSFACTURA' is not found" - constatare pe cod, nu presupunere. do_incarca_articole e cel care
* (re)populeaza cursorul.
*
* Cazuri:
* A. antet valid (tip 30, aviz din NIR - singura ramura in care incarca_cursor_articole populeaza
* crsfactura direct, nu doar structura goala) -> Return .T., Reccount('crsfactura')>0,
* o.lArticoleIncarcate=.T., but_incarca_articole.Visible=.F., grd_factura.RecordSource='crsfactura'.
* B. antet invalid (dataireg gol) -> Return .F., crsfactura ramane gol, lArticoleIncarcate=.F.
* C. incarca_cursor_articole esueaza (executor mock cu eroare) -> Return .F., crsfactura ramane gol,
* lArticoleIncarcate=.F., but_incarca_articole.Visible ramane .T.
* D. antet valid, document in valuta (tip 5 -> poDate.in_valuta=1 in Init) -> dupa succes, butonul
* but_cursuri (care a inlocuit gridul de cursuri, mutat in frm_cursuri_valutare) devine Enabled,
* pe crscursuri populat exclusiv din crsarticole mockuit (determinist).
* Pentru toate cazurile, but_cursuri exista dar porneste dezactivat la Createobject (Init,
* crscursuri inca inexistent). B/C se opresc devreme (Return .F. inaintea liniei care
* recalculeaza Enabled) -> ramane dezactivat determinist. A (tip 30, fara valuta) nu forteaza
* in_valuta, dar citeste_cursuri_zi merge pe Oracle real (necontrolabil in test) - se verifica
* invariantul Enabled==(Used si Reccount(crscursuri)>0), nu o valoare fixa.
*
* S3-4d (bug #16 pe calea plFacturareNoua, docs\nota_executie_s3_4.md:320-367) - PROCEDURE CazReincercare,
* pe ACEEASI instanta de formular, antet cu valori distincte (tip 30/AVIZ, ca la C):
* E. esecul executorului (ca la C) nu distruge antetul: dupa Return .F., aceeasi instanta (amprenta
* SYS(1272,loForm) neschimbata) si toate campurile de antet capturate inainte raman identice,
* lArticoleIncarcate=.F., but_incarca_articole.Visible=.T. (se poate reincerca).
* F. comutare mock pe succes si reincercare pe ACEEASI instanta -> Return .T., crsfactura populat,
* lArticoleIncarcate=.T., butonul ascuns, antetul tot neschimbat fata de valorile initiale.
* G. numarul nu se arde a doua oara: do_incarca_articole apeleaza necondiotionat poGeneratorNumere.verifica_numar
* inaintea lui incarca_cursor_articole (ofacturare.vc2:18058-18060) - pe cod, nici verifica_numar
* (oserii_numere.prg:227, doar dezaloca daca numarul nu se potriveste cu paPlaje) nici incarca_cursor_articole
* (ofacturare.prg:513-519, doar dezaloca pe eroare/cursor gol) nu apeleaza aloca_numar - pe tot
* traseul E+F se asearta 0 apeluri aloca_numar in gcMockApeluri (ContaLinii); dezaloca_numar se observa
* 1 data (din ramura de eroare a lui E, mostenita neschimbata din codul vechi) - fapt masurat, nu defect
* (niciun numar nou nu s-a alocat la reincercare).
*
* fix do_sterge (docs\verif_referinte_moarte_articole2.md, ofacturare.vc2:18894-18968) - PROCEDURE
* CazSterge, pe o instanta cu crsfactura populat (2 randuri, cazul A):
* H1. do_sterge() pe primul rand (raman randuri) -> fara ERROR, Reccount('crsfactura') scade cu 1.
* H2. do_sterge() pe ultimul rand ramas -> fara ERROR, Reccount('crsfactura') = 0. Inainte de fix,
* ambele ramuri de focus final loveau Thisform.txtArticoleLista/txtArticole/grd_contracte -
* controale absente pe frm_facturare_articole2.
*
* Oracle NU se atinge pe calea articolelor/generatorului: goExecutor -> oExecutorMock, poGeneratorNumere
* -> oGeneratorMock (mock_cursor_articole.prg / mock_generator_numere.prg, ca in test_s3_4_cursor_articole).
* amessagebox/facturi_duplicate -> mock_validare_antet.prg (oAntetFacturare.valideaza_antet ruleaza REAL).
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3_4b_incarca_articole.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_4b_incarca_articole.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 1.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gcCaz, gcErr
PUBLIC gcMockApeluri, gnMockNumar, gcMockSql, gnMockSucces, gnMockEroare, gcMockMod, gcMockCurs
PUBLIC gnMockRaspuns, gcMockDuplicat, goExecutorReal
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_4b_incarca_articole.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
gcCaz = ""
gcErr = ""
gcMockApeluri = ""
gnMockNumar = 0
gcMockSql = ""
gnMockSucces = 1
gnMockEroare = 0
gcMockMod = "PLIN"
gcMockCurs = ""
gnMockRaspuns = 6
gcMockDuplicat = ""
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
LOCAL lcProc
lcProc = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", ;
"D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_cursor_articole.prg", ;
&lcProc, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg"
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
* seriile de facturi/avize sunt pe utilizator in MARIUSM_AUTO: utilizatorul 8 are plaja activa
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
gnScadereStoc = 1
DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna)
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
* gridextras.vcx / _cb_base.vcx sunt referite din ofacturare.vcx cu cale relativa sau cu clasa
* rezolvata doar din exe/IDE (grd_factura.cCodMat.cboCodmat) - trebuie inregistrate explicit headless
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE
* jtva_coloane_temp, ca in factureaza / test_s3_4_cursor_articole - ramura tnTip = 30 din
* incarca_cursor_articole foloseste update_jtva_coloane
update_jtva_coloane([JV], [jtva_coloane_temp])
PRIVATE poDate, poGeneratorNumere, plVizibil, pnTotalDiscountAvize
plVizibil = .F.
pnTotalDiscountAvize = 0
poGeneratorNumere = CREATEOBJECT("oGeneratorMock")
poDate = NULL
goExecutorReal = goExecutor
goExecutor = CREATEOBJECT("oExecutorMock")
goExecutor.oReal = goExecutorReal
DO Caz WITH "A_ANTET_VALID"
DO Caz WITH "B_ANTET_INVALID"
DO Caz WITH "C_CURSOR_ESUEAZA"
DO Caz WITH "D_ANTET_VALID_VALUTA"
DO CazReincercare
DO CazSterge
DO Final
*----------------------------------------------------------------------------------------
PROCEDURE Caz
LPARAMETERS tcCaz
LOCAL loForm, llRezultat
gcCaz = "[" + tcCaz + "] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH tcCaz
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
DO Assert WITH PEMSTATUS(loForm, 'lArticoleIncarcate', 5), "lArticoleIncarcate materializata"
DO Assert WITH !loForm.lArticoleIncarcate, "lArticoleIncarcate = .F. la Createobject"
DO Assert WITH ObjExists(loForm, 'but_incarca_articole'), "but_incarca_articole prezent"
DO Assert WITH loForm.but_incarca_articole.Visible, "but_incarca_articole vizibil la Createobject"
* crscursuri nu exista inca la Init - but_cursuri exista in Objects, dar porneste dezactivat;
* PEMSTATUS ramane .T. si dupa RemoveObject, deci proba reala de prezenta e ObjExists
DO Assert WITH ObjExists(loForm, 'but_cursuri'), "but_cursuri prezent la Createobject"
DO Assert WITH !loForm.but_cursuri.Enabled, "but_cursuri dezactivat la Createobject"
* grd_factura.Column1.ControlSource e calificat ("crsFactura.denumire") - crsfactura trebuie sa
* existe (structura goala, creeaza_facturacrs) chiar la Createobject, altfel eroare 13 la legare;
* "fara articole incarcate" se verifica prin Reccount = 0, nu prin alias inchis
DO Assert WITH USED('crsfactura') AND RECCOUNT('crsfactura') = 0, "crsfactura deschis dar gol inainte de do_incarca_articole"
llRezultat = loForm.do_incarca_articole()
DO CASE
CASE tcCaz == "A_ANTET_VALID"
DO Assert WITH llRezultat, "Return .T. pe antet valid"
DO Assert WITH USED('crsfactura'), "crsfactura deschis dupa succes"
DO Assert WITH USED('crsfactura') AND RECCOUNT('crsfactura') > 0, "crsfactura populat dupa succes"
DO Assert WITH loForm.lArticoleIncarcate, "lArticoleIncarcate = .T. dupa succes"
DO Assert WITH !loForm.but_incarca_articole.Visible, "but_incarca_articole invizibil dupa succes"
DO Assert WITH UPPER(loForm.grd_factura.RecordSource) == 'CRSFACTURA', "grd_factura.RecordSource = crsfactura"
* tip 30 nu forteaza poDate.in_valuta=1 - starea butonului de cursuri trebuie sa ramana in
* acord cu starea reala a lui crscursuri (populat sau nu de citeste_cursuri_zi), nu presupusa
* fix pe .F.
DO Assert WITH ObjExists(loForm, 'but_cursuri'), "but_cursuri prezent dupa succes (fara valuta)"
DO Assert WITH loForm.but_cursuri.Enabled == (USED('crscursuri') AND RECCOUNT('crscursuri') > 0), "but_cursuri.Enabled in acord cu starea lui crscursuri"
CASE tcCaz == "B_ANTET_INVALID"
DO Assert WITH !llRezultat, "Return .F. pe antet invalid"
DO Assert WITH USED('crsfactura') AND RECCOUNT('crsfactura') = 0, "crsfactura tot gol dupa antet invalid"
DO Assert WITH !loForm.lArticoleIncarcate, "lArticoleIncarcate tot .F. dupa antet invalid"
DO Assert WITH loForm.but_incarca_articole.Visible, "but_incarca_articole tot vizibil dupa antet invalid"
DO Assert WITH "Nu ati completat data inregistrarii!" $ gcMockApeluri, "mesajul de validare a fost dat"
* Return .F. e devreme, inaintea liniei care recalculeaza Enabled - butonul ramane dezactivat
DO Assert WITH ObjExists(loForm, 'but_cursuri'), "but_cursuri prezent dupa antet invalid"
DO Assert WITH !loForm.but_cursuri.Enabled, "but_cursuri tot dezactivat dupa antet invalid"
CASE tcCaz == "C_CURSOR_ESUEAZA"
DO Assert WITH !llRezultat, "Return .F. pe esec cursor articole"
DO Assert WITH USED('crsfactura') AND RECCOUNT('crsfactura') = 0, "crsfactura tot gol dupa esec cursor"
DO Assert WITH !loForm.lArticoleIncarcate, "lArticoleIncarcate tot .F. dupa esec cursor"
DO Assert WITH loForm.but_incarca_articole.Visible, "but_incarca_articole tot vizibil dupa esec cursor"
DO Assert WITH ObjExists(loForm, 'but_cursuri'), "but_cursuri prezent dupa esec cursor"
DO Assert WITH !loForm.but_cursuri.Enabled, "but_cursuri tot dezactivat dupa esec cursor"
CASE tcCaz == "D_ANTET_VALID_VALUTA"
DO Assert WITH llRezultat, "Return .T. pe antet valid, document in valuta"
DO Assert WITH loForm.lArticoleIncarcate, "lArticoleIncarcate = .T. dupa succes (valuta)"
DO Assert WITH USED('crscursuri') AND RECCOUNT('crscursuri') > 0, "crscursuri populat dupa succes (valuta)"
DO Assert WITH ObjExists(loForm, 'but_cursuri'), "but_cursuri prezent dupa succes (valuta)"
DO Assert WITH loForm.but_cursuri.Enabled, "but_cursuri activat dupa succes (valuta)"
ENDCASE
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
* S3-4d, E+F+G: acelasi formular, doua apeluri do_incarca_articole (esec apoi reincercare cu succes) -
* nu foloseste Reseteaza/Caz (care recreeaza poDate/loForm la fiecare caz) ca sa dovedeasca persistenta
* aceleiasi instante si a antetului intre cele doua apeluri.
PROCEDURE CazReincercare
LOCAL loForm, llR1, llR2, lcAmprenta
LOCAL ldDataIreg, ldZiCurs, lnIdClient, lnIdFurnizor, lcSerieAct, lnNract, lnIdValuta, lnNrFactAchi, lcFdoc, lnIdFdoc
LOCAL lnAlocaNumar, lnDezalocaNumar
gcCaz = "[E_ANTET_SUPRAVIETUIESTE] "
DO AfLog WITH "PAS: " + gcCaz
* Reseteaza pe un tcCaz oarecare (cade pe OTHERWISE -> tip 30, mod PLIN) - antetul si mock-ul de
* eroare se suprascriu imediat mai jos, cu valori distincte fata de A/B/C/D
DO Reseteaza WITH "E_ANTET_SUPRAVIETUIESTE"
poDate.dataireg = DATE(gnAn, gnLuna, 15)
poDate.dataact = poDate.dataireg
poDate.zi_curs = poDate.dataireg
poDate.id_client = 42
poDate.id_furnizor = 7
poDate.serie_act = "EFG"
poDate.nract = 555
poDate.id_valuta = 3
poDate.nrfactachi = 9
poDate.fdoc = "NOTA HANDOFF"
poDate.id_fdoc = 2
* fortez esecul cursorului de articole, ca la C_CURSOR_ESUEAZA
gcMockMod = "FARA"
gnMockSucces = -1
gnMockEroare = 1400
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
lcAmprenta = SYS(1272, loForm)
ldDataIreg = poDate.dataireg
ldZiCurs = poDate.zi_curs
lnIdClient = poDate.id_client
lnIdFurnizor = poDate.id_furnizor
lcSerieAct = poDate.serie_act
lnNract = poDate.nract
lnIdValuta = poDate.id_valuta
lnNrFactAchi = poDate.nrfactachi
lcFdoc = poDate.fdoc
lnIdFdoc = poDate.id_fdoc
* marcheaza inceputul ferestrei de masurare pentru G (apelurile generatorului pe tot traseul E+F)
gcMockApeluri = ""
llR1 = loForm.do_incarca_articole()
DO Assert WITH !llR1, "Return .F. pe esecul executorului"
DO Assert WITH SYS(1272, loForm) == lcAmprenta, "aceeasi instanta de formular dupa esec (amprenta neschimbata)"
DO Assert WITH poDate.dataireg == ldDataIreg, "dataireg neschimbata dupa esec"
DO Assert WITH poDate.zi_curs == ldZiCurs, "zi_curs neschimbata dupa esec"
DO Assert WITH poDate.id_client == lnIdClient, "id_client neschimbat dupa esec"
DO Assert WITH poDate.id_furnizor == lnIdFurnizor, "id_furnizor neschimbat dupa esec"
DO Assert WITH poDate.serie_act == lcSerieAct, "serie_act neschimbata dupa esec"
DO Assert WITH poDate.nract == lnNract, "nract neschimbat dupa esec"
DO Assert WITH poDate.id_valuta == lnIdValuta, "id_valuta neschimbat dupa esec"
DO Assert WITH poDate.nrfactachi == lnNrFactAchi, "nrfactachi neschimbat dupa esec"
DO Assert WITH poDate.fdoc == lcFdoc, "fdoc neschimbat dupa esec"
DO Assert WITH poDate.id_fdoc == lnIdFdoc, "id_fdoc neschimbat dupa esec"
DO Assert WITH !loForm.lArticoleIncarcate, "lArticoleIncarcate = .F. dupa esec"
DO Assert WITH loForm.but_incarca_articole.Visible, "but_incarca_articole vizibil dupa esec (se poate reincerca)"
DO Assert WITH USED('crsfactura') AND RECCOUNT('crsfactura') = 0, "crsfactura tot gol dupa esec"
gcCaz = "[F_REINCERCARE_REUSESTE] "
DO AfLog WITH "PAS: " + gcCaz
gcMockMod = "PLIN"
gnMockSucces = 1
gnMockEroare = 0
llR2 = loForm.do_incarca_articole()
DO Assert WITH llR2, "Return .T. la reincercare"
DO Assert WITH SYS(1272, loForm) == lcAmprenta, "aceeasi instanta de formular dupa reincercare (amprenta neschimbata)"
DO Assert WITH USED('crsfactura') AND RECCOUNT('crsfactura') > 0, "crsfactura populat dupa reincercare"
DO Assert WITH loForm.lArticoleIncarcate, "lArticoleIncarcate = .T. dupa reincercare"
DO Assert WITH !loForm.but_incarca_articole.Visible, "but_incarca_articole ascuns dupa reincercare"
DO Assert WITH poDate.dataireg == ldDataIreg, "dataireg neschimbata dupa reincercare"
DO Assert WITH poDate.zi_curs == ldZiCurs, "zi_curs neschimbata dupa reincercare"
DO Assert WITH poDate.id_client == lnIdClient, "id_client neschimbat dupa reincercare"
DO Assert WITH poDate.id_furnizor == lnIdFurnizor, "id_furnizor neschimbat dupa reincercare"
DO Assert WITH poDate.serie_act == lcSerieAct, "serie_act neschimbata dupa reincercare"
DO Assert WITH poDate.nract == lnNract, "nract neschimbat dupa reincercare"
DO Assert WITH poDate.id_valuta == lnIdValuta, "id_valuta neschimbat dupa reincercare"
DO Assert WITH poDate.nrfactachi == lnNrFactAchi, "nrfactachi neschimbat dupa reincercare"
DO Assert WITH poDate.fdoc == lcFdoc, "fdoc neschimbat dupa reincercare"
DO Assert WITH poDate.id_fdoc == lnIdFdoc, "id_fdoc neschimbat dupa reincercare"
gcCaz = "[G_NUMAR_NU_SE_ARDE] "
DO AfLog WITH "PAS: " + gcCaz
lnAlocaNumar = ContaLinii(gcMockApeluri, "aloca_numar(")
lnDezalocaNumar = ContaLinii(gcMockApeluri, "dezaloca_numar(")
DO AfLog WITH gcCaz + "apeluri generator pe traseul E+F: " + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), " | ")
DO Assert WITH lnAlocaNumar = 0, "aloca_numar NU e apelat pe traseul E+F (niciun numar nou la reincercare) - observat " + TRANSFORM(lnAlocaNumar)
DO AfLog WITH gcCaz + "dezaloca_numar observat de " + TRANSFORM(lnDezalocaNumar) + " ori pe traseul E+F (din ramura de eroare a lui incarca_cursor_articole la E, neschimbata de S3-4a/b - comportament curent, nu defect)"
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
* fix do_sterge (docs\verif_referinte_moarte_articole2.md): metoda incheia focusul pe
* Thisform.txtArticoleLista/txtArticole/grd_contracte - controale absente pe frm_facturare_articole2,
* deci orice stergere de articol arunca "membru inexistent" (ON ERROR global marcheaza gnFail, nu
* trece tacut). Proba centrala: EMPTY(gcErr) dupa fiecare apel. Doua sub-cazuri, pe aceeasi instanta,
* populata cu 2 randuri (mock PLIN din mock_cursor_articole.prg): stergerea unui rand cu randuri
* ramase (Reccount('crsfactura')>0) si stergerea ultimului rand (Reccount ajunge la 0).
PROCEDURE CazSterge
LOCAL loForm
gcCaz = "[H_STERGE]"
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH "A_ANTET_VALID"
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
DO Assert WITH loForm.do_incarca_articole(), "do_incarca_articole reuseste (precondimtie do_sterge)"
DO Assert WITH RECCOUNT('crsfactura') = 2, "crsfactura are 2 randuri dupa incarcare (precondimtie)"
gnMockRaspuns = 6
gcErr = ""
SELECT crsfactura
GO TOP
loForm.do_sterge()
DO Assert WITH EMPTY(gcErr), "H1: do_sterge nu arunca eroare cu randuri ramase - " + gcErr
DO Assert WITH RECCOUNT('crsfactura') = 1, "H1: un rand a fost sters (ramane 1 din 2)"
gcErr = ""
SELECT crsfactura
GO TOP
loForm.do_sterge()
DO Assert WITH EMPTY(gcErr), "H2: do_sterge nu arunca eroare la ultimul rand (Reccount ajunge la 0) - " + gcErr
DO Assert WITH RECCOUNT('crsfactura') = 0, "H2: ultimul rand a fost sters (Reccount = 0)"
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
* numara liniile din tcTexto (jurnalul gcMockApeluri, separat pe linii CHR(13)+CHR(10)) care incep
* efectiv cu tcPrefix - simplul "$" ar confunda "aloca_numar(" cu "dezaloca_numar(" (substring)
FUNCTION ContaLinii
LPARAMETERS tcTexto, tcPrefix
LOCAL ARRAY laLinii[1]
LOCAL lnI, lnN, lnCont
lnCont = 0
IF EMPTY(tcTexto)
RETURN 0
ENDIF
lnN = ALINES(laLinii, tcTexto)
FOR lnI = 1 TO lnN
IF LEFT(ALLTRIM(laLinii[lnI]), LEN(tcPrefix)) == tcPrefix
lnCont = lnCont + 1
ENDIF
ENDFOR
RETURN lnCont
ENDFUNC
*----------------------------------------------------------------------------------------
PROCEDURE Reseteaza
LPARAMETERS tcCaz
LOCAL lnIdSet, lnTip
DO Inchide WITH 'crsarticole'
DO Inchide WITH 'crsarticole1'
DO Inchide WITH 'crsfactura'
DO Inchide WITH 'crscursuri'
DO Inchide WITH 'crspolitici'
DO Inchide WITH 'crscontracte'
DO Inchide WITH 'crsgestiunidest'
DO Inchide WITH 'crsCtrTemp'
DO Inchide WITH 'CrsCotaTva'
SELECT 0
* grd_factura.Column1.ControlSource e calificat ("crsFactura.denumire", nu "denumire") - Createobject
* leaga acest control chiar la instantiere si arunca eroarea 13 daca alias-ul nu exista inca; se
* creeaza structura GOALA (0 randuri), la fel ca first pasul din incarca_cursor_articole
DO creeaza_facturacrs WITH 'crsfactura'
* grd_factura.cGestiune e legat la crsFactura.gestiune, camp inexistent in creeaza_facturacrs
* (are nume_gestiune) - ca in test_s3_controale.prg
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
gcMockApeluri = ""
gcMockSql = ""
gcMockCurs = ""
gcErr = ""
gnMockNumar = 100
gnMockRaspuns = 6
gcMockDuplicat = ""
DO CASE
CASE tcCaz == "C_CURSOR_ESUEAZA"
gcMockMod = "FARA"
gnMockSucces = -1
gnMockEroare = 1400
OTHERWISE
gcMockMod = "PLIN"
gnMockSucces = 1
gnMockEroare = 0
ENDCASE
* tip 5 (lista de preturi) forteaza poDate.in_valuta=1 in oDateFactura::Init (ofacturare_comun.prg:248)
* - singurul mod headless, fara mock suplimentar, de a obtine cazul "document in valuta"
lnTip = IIF(tcCaz == "D_ANTET_VALID_VALUTA", 5, 30)
lnIdSet = 25000 + lnTip - 1 + gnScadereStoc * 10
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", lnIdSet, lnTip)
IF lnTip = 30
poDate.nIdTipDoc = 6 && AVIZ, ca in factureaza pentru tnTip = 30
ENDIF
poDate.dataireg = DATE(gnAn, gnLuna, 1)
poDate.dataact = poDate.dataireg
poDate.zi_curs = poDate.dataireg
poDate.id_fdoc = 1
poDate.fdoc = "FEL TEST"
poDate.nract = 77
poDate.serie_act = "TST"
poDate.id_client = 1
poDate.id_furnizor = 1
poDate.nrfactachi = 1
* valideaza_antet (ofacturare_antet.prg:787) cere id_valuta cand !llAviz si in_valuta=1 - doar
* cazul D (tip 5) intra pe aceasta ramura, dar setarea e inofensiva si pentru celelalte cazuri
poDate.id_valuta = 1
IF tcCaz == "B_ANTET_INVALID"
poDate.dataireg = {}
ENDIF
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
gcMockApeluri = ""
ENDPROC
PROCEDURE Inchide
LPARAMETERS tcAlias
IF USED(tcAlias)
USE IN (tcAlias)
ENDIF
ENDPROC
FUNCTION ObjExists
* prezenta reala in colectia Objects (nu doar PEMSTATUS, care ramane .T. si dupa RemoveObject
* pe o proprietate mostenita din parinte)
LPARAMETERS toForm, tcName
LOCAL i
FOR i = 1 TO toForm.Objects.Count
IF UPPER(toForm.Objects(i).Name) == UPPER(tcName)
RETURN .T.
ENDIF
ENDFOR
RETURN .F.
ENDFUNC
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 AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10)
gnFail = gnFail + 1
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
IF TYPE('goExecutorReal') = 'O'
goExecutor = goExecutorReal
ENDIF
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,199 @@
* test_s3_controale.prg
* Headless: controalele de antet adaugate pe frm_facturare_articole2 exista dupa Createobject,
* iar frm_date_factura (calea veche, neatinsa) le are in continuare.
*
* Rezultat asteptat (declarat inainte de rulare), pe poDate tip 1, gnScadereStoc = 0 (fara gestiune
* sursa: Init-ul de antet elimina Ct_clb_gestiune_init pe tip 1, deci dupa pasul 1 acesta e ABSENT):
* frm_facturare_articole2: Clb_dataireg, Ct_clb_politici_preturi(*), txtCodFiscal, lblCodFiscal,
* txtSoldLei, lblSoldLei, But_verifica1 -> PEMSTATUS(...,5) = .T.
* Ct_clb_gestiune_init -> prezent DOAR daca Init-ul de antet (pasul 1) nu e inca portat; dupa
* pasul 1 e eliminat pe tip 1 (ca pe frm_date_factura). Se logheaza, nu se asserteaza.
* (*) dupa pasul 1, pe factura Ct_clb_politici_preturi e eliminat (control doar de aviz).
* Clb_dataireg.Text_simplu1.ControlSource = 'poDate.dataireg'
* Prezenta = apartenenta la colectia Objects (PEMSTATUS/TYPE raman .T. dupa RemoveObject).
* frm_date_factura (acelasi poDate): Clb_dataireg, txtCodFiscal, lblCodFiscal, txtSoldLei,
* lblSoldLei, But_verifica1 -> .T.; Ct_clb_gestiune_init -> .F. (eliminat de Init pe tip 1).
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3_controale.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_controale.log
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_controale.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
* seriile de facturi (tipdoc 5) sunt pe utilizator in MARIUSM_AUTO: utilizatorul 8 are plaja activa 2010-2099
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
DO AfLog WITH "gnScadereStoc=" + TRANSFORM(gnScadereStoc) + " gnScadentaAutomata=" + TRANSFORM(gnScadentaAutomata)
PRIVATE poDate, poGeneratorNumere, plVizibil
plVizibil = .F.
DO AfLog WITH "creez poDate"
poDate = CREATEOBJECT("oDateFactura", 25000, 1)
DO AfLog WITH "poDate creat"
poDate.nIdTipDoc = 5
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poGeneratorNumere.ResetNumere()
DO AfLog WITH "generator creat"
DO ProbaSerii WITH poDate.nIdTipDoc
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
DO AfLog WITH "poDate tip=1 rezultat_serii=" + TRANSFORM(poDate.rezultat_serii) + " ultim amessagebox=[" + gcMockUltimMesaj + "]"
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'
* grd_factura.cGestiune e legat la crsFactura.gestiune, camp inexistent in creeaza_facturacrs (nume_gestiune)
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
* gridextras.vcx e referit din ofacturare.vcx cu cale relativa (..\utile\gridextras), rezolvabila doar din exe/IDE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
* grd_factura.cCodMat.cboCodmat e declarat AS combosql OF cautare.vcx, dar clasa e definita in _cb_base.vcx
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE
LOCAL loNou, loVechi, lcC
DO AfLog WITH "creez frm_facturare_articole2"
* clasa REALA (nu subclasa: pe o subclasa RemoveObject nu scoate membrii definiti in parinte).
* Atentie: metoda Error a prototipului face SET STEP ON - orice eroare in Init deschide debugger-ul
* si blocheaza rularea headless; diagnosticul se face atunci cu o subclasa cu Error care logheaza.
loNou = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loNou) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loNou) = 'O'
LOCAL laC[6], i
laC[1] = "Clb_dataireg"
laC[2] = "txtCodFiscal"
laC[3] = "lblCodFiscal"
laC[4] = "txtSoldLei"
laC[5] = "lblSoldLei"
laC[6] = "But_verifica1"
FOR i = 1 TO 6
DO Assert WITH ObjExists(loNou, laC[i]), "nou: " + laC[i] + " prezent"
ENDFOR
DO AfLog WITH "nou: Ct_clb_gestiune_init prezent=" + TRANSFORM(ObjExists(loNou, 'Ct_clb_gestiune_init')) + ;
" Ct_clb_politici_preturi prezent=" + TRANSFORM(ObjExists(loNou, 'Ct_clb_politici_preturi'))
DO Assert WITH loNou.Clb_dataireg.Text_simplu1.ControlSource == 'poDate.dataireg', "nou: Clb_dataireg.ControlSource"
DO Assert WITH loNou.Clb_dataireg.Top >= 30, "nou: Clb_dataireg sub bara de titlu (Top=" + TRANSFORM(loNou.Clb_dataireg.Top) + ")"
DO Assert WITH PEMSTATUS(loNou, 'cgestiune_init', 5) AND PEMSTATUS(loNou, 'lcopiere', 5) AND PEMSTATUS(loNou, 'nid_tip', 5) ;
AND PEMSTATUS(loNou, 'nsoldlei', 5) AND PEMSTATUS(loNou, 'nsoldvaluta', 5) AND PEMSTATUS(loNou, 'ntip', 5), "nou: proprietati *p: materializate"
* C6: Error nu mai face SET STEP ON - o eroare provocata nu blocheaza rularea
LOCAL llErr
llErr = .F.
TRY
loNou.metoda_inexistenta_s3()
CATCH
llErr = .T.
ENDTRY
DO Assert WITH llErr, "C6: eroarea provocata (metoda inexistenta) a fost prinsa, fara blocaj"
loNou.Error(1, 'test', 1)
DO Assert WITH .T., "C6: apel direct o.Error(1,'test',1) a revenit"
loNou.Release()
RELEASE loNou
ENDIF
loVechi = CREATEOBJECT('frm_date_factura')
DO Assert WITH VARTYPE(loVechi) = 'O', "Createobject frm_date_factura"
IF VARTYPE(loVechi) = 'O'
FOR i = 1 TO 6
DO Assert WITH ObjExists(loVechi, laC[i]), "vechi: " + laC[i] + " prezent"
ENDFOR
DO Assert WITH !ObjExists(loVechi, 'Ct_clb_gestiune_init'), "vechi: Ct_clb_gestiune_init eliminat pe tip 1"
loVechi.Release()
RELEASE loVechi
ENDIF
DO Final
PROCEDURE ProbaSerii
* apel direct al procedurii Oracle din creeaza_cursor_serii: logheaza eroarea reala (goExecutor
* ar deschide amessagebox modal, care agata rularea headless) si incalzeste starea pachetului
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
FUNCTION ObjExists
* prezenta reala in colectia Objects, cautare recursiva - controalele pot fi in containere
LPARAMETERS toContainer, tcName
LOCAL i, loO
FOR i = 1 TO toContainer.Objects.Count
loO = toContainer.Objects(i)
IF UPPER(loO.Name) == UPPER(tcName)
RETURN .T.
ENDIF
IF TYPE('loO.Objects.Count') = 'N'
IF ObjExists(loO, tcName)
RETURN .T.
ENDIF
ENDIF
ENDFOR
RETURN .F.
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
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,401 @@
* test_s3_do_cauta.prg
* Headless: paritatea cautarilor de antet (do_cauta_* + do_verifica) intre calea veche (frm_date_factura /
* frm_date_aviz, metode in .vcx) si formularul unificat (frm_facturare_articole2 -> oAntetFacturare din
* ofacturare_antet.prg), cu dialogurile modale inlocuite de mock_caut_antet.prg si amessagebox de
* mock_amessagebox.prg.
*
* REZULTAT ASTEPTAT (declarat inainte de rulare):
* A. Pentru fiecare caz (metoda, tip, varianta) se construieste ACELASI poDate de doua ori (oDateFactura +
* aceleasi valori de intrare), se creeaza formularul vechi pe primul si unificatul pe al doilea, se
* apeleaza metoda pe fiecare si se compara amprenta: toate proprietatile poDate (AMEMBERS, camp cu camp,
* TRANSFORM), proprietatile de formular scrise de metode (nSoldLei, nSoldValuta, cgestiune_init, tooltip
* client), lista apelurilor catre dialoguri (nume + argumente - dovedeste ramura aleasa si parametrii:
* ex. caut_contract_facturare(id) pe factura vs (id,[3,4]) pe aviz; cCont 4111 / 357 / 461 la client),
* mesajele amessagebox (text + tip) si erorile VFP (numar + mesaj). Asteptat: IDENTIC pe toate cazurile, cu
* exceptia lui poDate.nract cand la Init calea veche a ars deja un numar (cascada de LostFocus) si unificatul
* nu - acolo se verifica tiparul (vechi>0, nou=0, neschimbat de metoda) si se normalizeaza doar acea cheie.
* B. Cazuri (tip -> metode), variante: NORMAL (id_client real), IDCLIENT0 (id_client = 0 -> mesaj "Nu ati
* ales clientul!" / "gestiunea"), SAMECLIENT (dialogul intoarce acelasi id_client -> listaid/descriere NU
* se golesc pe factura), BUTON0 (dialogul seteaza gnButon = 0 -> lucrare/sectie/venchelt pe factura
* pun Null, pe aviz (lucrare/sectie) pastreaza valoarea intoarsa), VALUTA0 (tip 9 fara valuta -> mesaj):
* - factura: 1: client(NORMAL,SAMECLIENT), fdoc, lucrare(NORMAL,BUTON0), sectie(NORMAL,BUTON0),
* venchelt(NORMAL,BUTON0), responsabil, verifica, altele(=nimic); 2: altele(->contract), contract(IDCLIENT0),
* gestiune_init; 3: client, altele(->comanda), comanda(IDCLIENT0); 4: altele(->avize), avize(IDCLIENT0);
* 5: valuta; 7: altele(->factura), factura(IDCLIENT0); 8: altele(->facturi); 9: facturi(VALUTA0,NORMAL);
* 45: altele(->locatii), locatii.
* - aviz: 21: client, altele(->comanda), comanda, lucrare(NORMAL,BUTON0), sectie(BUTON0), venchelt(BUTON0),
* responsabil, gestiune_init, fdoc; 22: client; 23: client, altele(->gestiune_dest), gestiune_dest(IDCLIENT0),
* politica; 24: altele(->avize); 25: client, comanda; 26: altele(->contract), contract; 28: client;
* 41: client, gestiune_dest; 42: client.
* C. Netestabil headless: focusul de dupa cautare (SetFocus fara Show - daca ridica eroare, eroarea e parte
* din amprenta si trebuie sa fie identica pe ambele cai); selectia reala din dialog (mock cu valoare fixa);
* raspunsul Oracle la pack_facturare.cauta_date_comanda (real, acelasi pe ambele cai).
* D. Neregresie calea veche: test_s3_neregresie_vechi.prg CURENT vs BACKUP (amprenta Init) - separat.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3_do_cauta.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_do_cauta.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8 (seriile pe utilizator); gnScadereStoc = 1; rezultat_serii
* real (creeaza_cursor_serii, numarul se dezaloca dupa fiecare caz) ca sa existe clb_serie_act pe ambele.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gcCaz, gcErr, gcMockApeluri, gnMockIdPart, gnMockButon, gcBaza, gnDivergenteQ8
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_do_cauta.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
gcCaz = ""
gcErr = ""
gcMockApeluri = ""
gnMockIdPart = 0
gnMockButon = 1
gnDivergenteQ8 = 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
* la nume duplicat castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul: mock-urile se pun in fata
LOCAL lcProc
lcProc = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_caut_antet.prg", &lcProc
PUBLIC gcMockUltimMesaj, gnMockUltimTip
gcMockUltimMesaj = ""
gnMockUltimTip = 0
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
gnScadereStoc = 1
DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) + " gnScadereStoc=" + TRANSFORM(gnScadereStoc)
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
* dovada ca ofacturare_antet.prg e incarcat de harness si ca mock-urile castiga rezolutia
DO Assert WITH TYPE('CREATEOBJECT("oAntetFacturare")') = 'O', "oAntetFacturare instantiabil (ofacturare_antet.prg in SET PROCEDURE)"
LOCAL loMock
loMock = caut_fdoc()
DO Assert WITH VARTYPE(loMock) = 'O' AND loMock.fel_document == "FEL MOCK", "mock caut_fdoc activ"
DO AfLog WITH "asertiuni initiale: pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " erori=[" + gcErr + "]"
gcErr = ""
PRIVATE poDate, poGeneratorNumere, plVizibil, poDateGestiuneDest
plVizibil = .F.
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poDateGestiuneDest = CREATEOBJECT("oDateGestiune")
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
* doi clienti reali (GetSoldClient si cauta_date_comanda cer id-uri existente)
PUBLIC gnIdClient1, gnIdClient2
gnIdClient1 = 0
gnIdClient2 = 0
IF SQLEXEC(gnHandle, "select min(id_part) as id1, max(id_part) as id2 from nom_parteneri", "crsclient") > 0
gnIdClient1 = NVL(crsclient.id1, 0)
gnIdClient2 = NVL(crsclient.id2, 0)
USE IN crsclient
ENDIF
DO AfLog WITH "clienti de test: " + TRANSFORM(gnIdClient1) + " / " + TRANSFORM(gnIdClient2)
* ---- factura ----
DO Caz WITH 1, "do_cauta_client", "NORMAL"
DO Caz WITH 1, "do_cauta_client", "SAMECLIENT"
DO Caz WITH 1, "do_cauta_fdoc", "NORMAL"
DO Caz WITH 1, "do_cauta_lucrare", "NORMAL"
DO Caz WITH 1, "do_cauta_lucrare", "BUTON0"
DO Caz WITH 1, "do_cauta_sectie", "NORMAL"
DO Caz WITH 1, "do_cauta_sectie", "BUTON0"
DO Caz WITH 1, "do_cauta_venchelt", "NORMAL"
DO Caz WITH 1, "do_cauta_venchelt", "BUTON0"
DO Caz WITH 1, "do_cauta_responsabil", "NORMAL"
DO Caz WITH 1, "do_verifica", "NORMAL"
DO Caz WITH 1, "do_cauta_altele", "NORMAL"
DO Caz WITH 2, "do_cauta_altele", "NORMAL"
DO Caz WITH 2, "do_cauta_contract", "IDCLIENT0"
DO Caz WITH 2, "do_cauta_gestiune_init", "NORMAL"
DO Caz WITH 3, "do_cauta_client", "NORMAL"
DO Caz WITH 3, "do_cauta_altele", "NORMAL"
DO Caz WITH 3, "do_cauta_comanda", "IDCLIENT0"
DO Caz WITH 4, "do_cauta_altele", "NORMAL"
DO Caz WITH 4, "do_cauta_avize", "IDCLIENT0"
DO Caz WITH 5, "do_cauta_valuta", "NORMAL"
DO Caz WITH 7, "do_cauta_altele", "NORMAL"
DO Caz WITH 7, "do_cauta_factura", "IDCLIENT0"
DO Caz WITH 8, "do_cauta_altele", "NORMAL"
DO Caz WITH 9, "do_cauta_facturi", "VALUTA0"
DO Caz WITH 9, "do_cauta_facturi", "NORMAL"
DO Caz WITH 45, "do_cauta_altele", "NORMAL"
DO Caz WITH 45, "do_cauta_locatii", "NORMAL"
* ---- aviz ----
DO Caz WITH 21, "do_cauta_client", "NORMAL"
DO Caz WITH 21, "do_cauta_altele", "NORMAL"
DO Caz WITH 21, "do_cauta_comanda", "NORMAL"
DO Caz WITH 21, "do_cauta_lucrare", "NORMAL"
DO Caz WITH 21, "do_cauta_lucrare", "BUTON0"
DO Caz WITH 21, "do_cauta_sectie", "BUTON0"
DO Caz WITH 21, "do_cauta_venchelt", "BUTON0"
DO Caz WITH 21, "do_cauta_responsabil", "NORMAL"
DO Caz WITH 21, "do_cauta_gestiune_init", "NORMAL"
DO Caz WITH 21, "do_cauta_fdoc", "NORMAL"
DO Caz WITH 22, "do_cauta_client", "NORMAL"
DO Caz WITH 23, "do_cauta_client", "NORMAL"
DO Caz WITH 23, "do_cauta_altele", "NORMAL"
DO Caz WITH 23, "do_cauta_gestiune_dest", "IDCLIENT0"
DO Caz WITH 23, "do_cauta_politica", "NORMAL"
DO Caz WITH 24, "do_cauta_altele", "NORMAL"
DO Caz WITH 25, "do_cauta_client", "NORMAL"
DO Caz WITH 25, "do_cauta_comanda", "NORMAL"
DO Caz WITH 26, "do_cauta_altele", "NORMAL"
DO Caz WITH 26, "do_cauta_contract", "NORMAL"
DO Caz WITH 28, "do_cauta_client", "NORMAL"
DO Caz WITH 41, "do_cauta_client", "NORMAL"
DO Caz WITH 41, "do_cauta_gestiune_dest", "NORMAL"
DO Caz WITH 42, "do_cauta_client", "NORMAL"
DO Final
*----------------------------------------------------------------------------------------
PROCEDURE Caz
LPARAMETERS tnTip, tcMetoda, tcVar
LOCAL llAviz, lcVechi, lcNou, lcBazaVechi, lcBazaNou, lcExclus
llAviz = INLIST(tnTip, 21, 22, 23, 24, 25, 26, 28, 29, 41, 42, 47)
gcCaz = "[tip=" + TRANSFORM(tnTip) + " " + tcMetoda + " " + tcVar + "] "
lcVechi = Amprenta(tnTip, llAviz, IIF(llAviz, 'frm_date_aviz', 'frm_date_factura'), tcMetoda, tcVar)
lcBazaVechi = gcBaza
lcNou = Amprenta(tnTip, llAviz, 'frm_facturare_articole2', tcMetoda, tcVar)
lcBazaNou = gcBaza
* proprietatile poDate care difera deja dupa Init (inainte de apel) tin de Init (focus headless), nu de
* metoda testata: cand e exact divergenta Q8 (nract ars la Init pe calea veche) se verifica tiparul si se
* normalizeaza in loc sa se excluda, ca sa ramana comparat tot restul amprentei, inclusiv nract dupa apel
lcExclus = CheiDiferite(lcBazaVechi, lcBazaNou)
IF !EMPTY(lcExclus)
DO AfLog WITH " > " + gcCaz + "INIT-DIF (Q8, normalizat, nu exclus): " + lcExclus
lcVechi = NormalizeazaInitDifQ8(lcVechi, lcNou, lcBazaVechi, lcBazaNou, lcExclus)
ENDIF
IF lcVechi == lcNou
gnPass = gnPass + 1
DO AfLog WITH "OK " + gcCaz + TRANSFORM(OCCURS(CHR(10), lcVechi)) + " linii amprenta"
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL " + gcCaz + "amprente diferite:"
DO DifLinii WITH lcVechi, lcNou
ENDIF
ENDPROC
FUNCTION NormalizeazaInitDifQ8
* Q8: pe calea veche, cascada de LostFocus de la Init arde un numar inainte ca metoda testata sa ruleze;
* pe calea unificata nu se aloca nimic. Se verifica tiparul (nu doar cheia nract, ci si valorile) si ca
* metoda testata nu mai atinge nract pe nicio cale, apoi se normalizeaza doar nract, restul ramane comparat.
LPARAMETERS tcVechi, tcNou, tcBazaVechi, tcBazaNou, tcExclus
LOCAL lnBazaVechi, lnBazaNou, lnFinalVechi, lnFinalNou, lcVechiNorm
DO Assert WITH tcExclus == "poDate.nract=(vechi " + ValoareCheieDC(tcBazaVechi, "poDate.nract") + " / nou " + ValoareCheieDC(tcBazaNou, "poDate.nract") + "), ", "Q8: singura cheie care difera la Init e poDate.nract, nu altceva"
lnBazaVechi = VAL(ValoareCheieDC(tcBazaVechi, "poDate.nract"))
lnBazaNou = VAL(ValoareCheieDC(tcBazaNou, "poDate.nract"))
DO Assert WITH lnBazaVechi > 0, "Q8: la Init, pe calea veche nract e deja ars (cascada de LostFocus)"
DO Assert WITH lnBazaNou = 0, "Q8: la Init, pe calea unificata nract ramane 0"
lnFinalVechi = VAL(ValoareCheieDC(tcVechi, "poDate.nract"))
lnFinalNou = VAL(ValoareCheieDC(tcNou, "poDate.nract"))
DO Assert WITH lnFinalVechi = lnBazaVechi, "Q8: metoda testata nu mai modifica nract pe calea veche fata de Init"
DO Assert WITH lnFinalNou = lnBazaNou, "Q8: metoda testata nu mai modifica nract pe calea unificata fata de Init"
gnDivergenteQ8 = gnDivergenteQ8 + 1
DO AfLog WITH "DIVERGENTA-ASTEPTATA (Q8): " + gcCaz + "la Init, calea veche a ars deja un numar (nract=" + TRANSFORM(lnBazaVechi) + "), unificatul nu a alocat nimic (nract=0); neschimbat de metoda testata"
lcVechiNorm = STRTRAN(tcVechi, "poDate.nract=" + TRANSFORM(lnFinalVechi) + CHR(13) + CHR(10), "poDate.nract=" + TRANSFORM(lnFinalNou) + CHR(13) + CHR(10), 1, 1)
RETURN lcVechiNorm
ENDFUNC
FUNCTION ValoareCheieDC
* valoarea unei chei "cheie=valoare" dintr-o amprenta poDate, cautata linie cu linie
LPARAMETERS tcAmprenta, tcCheie
LOCAL laL[1], lnL, i
lnL = ALINES(laL, tcAmprenta)
FOR i = 1 TO lnL
IF LEFT(laL[i], LEN(tcCheie) + 1) == tcCheie + "="
RETURN SUBSTR(laL[i], LEN(tcCheie) + 2)
ENDIF
ENDFOR
RETURN "<lipsa>"
ENDFUNC
FUNCTION Amprenta
LPARAMETERS tnTip, tlAviz, tcClasa, tcMetoda, tcVar
LOCAL loF, lcA, lcCmd
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", 25000 + tnTip, tnTip)
poDate.nIdTipDoc = IIF(tlAviz, poDate.nIdTipDocAvizExpeditie, poDate.nIdTipDocFactura)
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
poDate.dataact = DATE(gnAn, gnLuna, 1)
poDate.dataireg = poDate.dataact
poDate.id_client = IIF(tcVar == "IDCLIENT0", 0, gnIdClient1)
poDate.nume_client = IIF(tcVar == "IDCLIENT0", "", "CLIENT INITIAL")
poDate.listaid = "999"
poDate.descriere = "DESCRIERE INITIALA"
poDate.text_aditional = "TEXT INITIAL"
IF tnTip = 9
poDate.id_valuta = IIF(tcVar == "VALUTA0", 0, 2)
ENDIF
gnMockIdPart = IIF(tcVar == "SAMECLIENT", gnIdClient1, gnIdClient2)
gnMockButon = IIF(tcVar == "BUTON0", 0, 1)
gnButon = 1
poDateGestiuneDest.Reset()
gcErr = ""
gcMockApeluri = ""
gcMockUltimMesaj = ""
gnMockUltimTip = 0
DO AfLog WITH " > " + gcCaz + "creez " + tcClasa
loF = CREATEOBJECT(tcClasa)
IF VARTYPE(loF) <> 'O'
RETURN "CREATEOBJECT " + tcClasa + " ESUAT" + CHR(13) + CHR(10) + gcErr
ENDIF
gcErr = ""
* focusul pleaca de pe controlul lasat de Init inainte de apel: pe frm_date_factura Init lasa focusul pe
* combo-ul fdoc, al carui LostFocus (do_schimba_tipdoc -> clb_serie_act.genereazaNumar) ar scrie poDate.nract
* la primul SetFocus din metoda testata; efectul tine de evenimentele formularului, nu de metoda.
* Doar pe factura: pe aviz vechiul nu are combo, iar pe unificat Clb_dataact.LostFocus ar scrie datascad (S3-3)
IF !tlAviz
loF.clb_dataact.SetFocus()
ENDIF
gcBaza = AmprentaPoDate()
gcMockApeluri = ""
gcErr = ""
lcCmd = "loF." + tcMetoda + "()"
DO AfLog WITH " > " + gcCaz + "apelez " + lcCmd
&lcCmd
DO AfLog WITH " > " + gcCaz + "apel incheiat"
lcA = "metoda=" + tcMetoda + CHR(13) + CHR(10)
lcA = lcA + AmprentaPoDate()
* soldul exista doar pe frm_date_factura si pe unificat; pe aviz unificatul nu trebuie sa-l scrie
IF PEMSTATUS(loF, "nSoldLei", 5)
IF tlAviz
DO Assert WITH loF.nSoldLei = 0 AND loF.nSoldValuta = 0, "pe aviz nSoldLei/nSoldValuta raman 0 (" + tcClasa + ")"
DO AfLog WITH " > " + gcCaz + "sold pe " + tcClasa + ": " + TRANSFORM(loF.nSoldLei) + "/" + TRANSFORM(loF.nSoldValuta)
ELSE
lcA = lcA + "form.nSoldLei=" + TRANSFORM(loF.nSoldLei) + CHR(13) + CHR(10)
lcA = lcA + "form.nSoldValuta=" + TRANSFORM(loF.nSoldValuta) + CHR(13) + CHR(10)
ENDIF
ENDIF
lcA = lcA + "form.cgestiune_init=" + TRANSFORM(loF.cgestiune_init) + CHR(13) + CHR(10)
lcA = lcA + "form.tooltip_client=" + TRANSFORM(loF.Ct_clb_nume_client.clb_TX_CAUTARE.text_SIMPLU1.ToolTipText) + CHR(13) + CHR(10)
lcA = lcA + "gest_dest=" + TRANSFORM(poDateGestiuneDest.id_gestiune) + "|" + TRANSFORM(poDateGestiuneDest.id_tipgest) + "|" + TRANSFORM(poDateGestiuneDest.Cont) + "|" + TRANSFORM(poDateGestiuneDest.acont) + CHR(13) + CHR(10)
lcA = lcA + "gnButon=" + TRANSFORM(gnButon) + CHR(13) + CHR(10)
lcA = lcA + "APELURI:" + CHR(13) + CHR(10) + gcMockApeluri
lcA = lcA + "MESAJ=" + gcMockUltimMesaj + "|" + TRANSFORM(gnMockUltimTip) + CHR(13) + CHR(10)
lcA = lcA + "ERORI:" + CHR(13) + CHR(10) + gcErr
loF.Release()
RELEASE loF
IF poDate.rezultat_serii <> 0
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
ENDIF
RETURN lcA
ENDFUNC
FUNCTION AmprentaPoDate
LOCAL laM[1], lnN, i, lcA, lcV
lcA = ""
lnN = AMEMBERS(laM, poDate, 0)
ASORT(laM)
FOR i = 1 TO lnN
IF TYPE("poDate." + laM[i]) $ "CNDTLY"
lcV = TRANSFORM(EVALUATE("poDate." + laM[i]))
ELSE
lcV = "<" + TYPE("poDate." + laM[i]) + ">"
ENDIF
lcA = lcA + "poDate." + LOWER(laM[i]) + "=" + lcV + CHR(13) + CHR(10)
ENDFOR
RETURN lcA
ENDFUNC
FUNCTION CheiDiferite
* cheile (poDate.x=) ale liniilor care difera intre doua amprente poDate, cu valorile, separate prin virgula
LPARAMETERS tcV, tcN
LOCAL laV[1], laN[1], lnV, lnN, i, lcChei, lcCheie, lcLinie
lnV = ALINES(laV, tcV)
lnN = ALINES(laN, tcN)
lcChei = ""
FOR i = 1 TO MAX(lnV, lnN)
IF i > lnV OR i > lnN OR !(laV[i] == laN[i])
lcLinie = IIF(i <= lnV, laV[i], laN[i])
lcCheie = LEFT(lcLinie, AT("=", lcLinie))
IF !(lcCheie + "(" $ lcChei)
lcChei = lcChei + lcCheie + "(vechi " + IIF(i <= lnV, SUBSTR(laV[i], LEN(lcCheie) + 1), "<lipsa>") ;
+ " / nou " + IIF(i <= lnN, SUBSTR(laN[i], LEN(lcCheie) + 1), "<lipsa>") + "), "
ENDIF
ENDIF
ENDFOR
RETURN lcChei
ENDFUNC
FUNCTION FaraChei
* scoate dintr-o amprenta liniile a caror cheie (pana la =) apare in lista de chei
LPARAMETERS tcA, tcChei
LOCAL laL[1], lnL, i, lcR, lnEq
lnL = ALINES(laL, tcA)
lcR = ""
FOR i = 1 TO lnL
lnEq = AT("=", laL[i])
IF lnEq = 0 OR !(LEFT(laL[i], lnEq) + "(" $ tcChei)
lcR = lcR + laL[i] + CHR(13) + CHR(10)
ENDIF
ENDFOR
RETURN lcR
ENDFUNC
PROCEDURE DifLinii
LPARAMETERS tcV, tcN
LOCAL laV[1], laN[1], lnV, lnN, i, lnMax
lnV = ALINES(laV, tcV)
lnN = ALINES(laN, tcN)
lnMax = MAX(lnV, lnN)
FOR i = 1 TO lnMax
IF i > lnV OR i > lnN OR !(laV[i] == laN[i])
DO AfLog WITH " vechi: " + IIF(i <= lnV, laV[i], "<lipsa>")
DO AfLog WITH " nou : " + IIF(i <= lnN, laN[i], "<lipsa>")
ENDIF
ENDFOR
ENDPROC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL: " + gcCaz + tcMsg
ENDIF
ENDPROC
PROCEDURE AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + CHR(13) + CHR(10)
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " divergente-asteptate(Q8)=" + TRANSFORM(gnDivergenteQ8)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,351 @@
* test_s3_init_antet.prg
* Headless: paritatea antetului dupa Init intre calea veche (frm_date_factura / frm_date_aviz) si
* formularul unificat (frm_facturare_articole2), pe acelasi poDate, pentru toate tipurile de document.
*
* REZULTAT ASTEPTAT (declarat inainte de rulare, derivat din Do Case-urile din Init-urile sursa,
* ofacturare.vc2 frm_date_factura.Init si frm_date_aviz.Init; "prezent" = apartenenta la colectia
* Objects a formularului - dupa RemoveObject, PEMSTATUS(...,5) si TYPE() raman .T./'O'):
*
* A. Paritate completa vechi vs unificat, pentru fiecare control de antet al formularului-sursa
* (mapare de nume: Ct_clb_fdoc -> clb_fdoc, Clb_serie_act -> Clb_serie_act1), pe
* gnScadereStoc in {0,1} x tip factura {1,2,3,4,5,7,8,9,10,45,48,49,52} x tip aviz
* {21,22,23,24,25,26,28,29,41,42,47} x rezultat_serii {valoarea reala din Oracle, 0 fortat}.
* Asteptat: prezenta identica pe toate; etichetele ct_clb_altele / ct_clb_nume_client identice cand
* Init le seteaza (23/25/41); eticheta implicita a clientului difera prin proiectare: "Nume client" pe
* vechi, "Client" pe prototip (ADD OBJECT, inventarul S1) - se asserteaza "Client" pe unificat.
* B. Esantion declarat explicit (din cod):
* - factura tip 1, gnScadereStoc=0: eliminate ct_clb_gestiune_init, ct_clb_responsabil, ct_clb_altele,
* ct_clb_valuta (in_valuta=0); prezente clb_dataireg, clb_dataact, clb_data_scadenta, clb_zi_curs,
* clb_nract, ct_clb_nume_client, ct_clb_venchelt, ct_clb_sectie, ct_clb_lucrare, ed_tx_simplu1.
* - factura tip 2, gnScadereStoc=0: ct_clb_altele prezent cu eticheta "Nr. contract".
* - factura tip 8: clb_zi_curs eliminat.
* - factura tip 5 (in_valuta=1): ct_clb_valuta prezent.
* - aviz tip 22, gnScadereStoc=0: eliminate ct_clb_responsabil, ct_clb_gestiune_init,
* ct_clb_politici_preturi, ct_clb_altele.
* - aviz tip 23: ct_clb_venchelt eliminat; etichete "Gestiune sursa" (client) / "Gestiune destinatie" (altele);
* ct_clb_politici_preturi prezent.
* - aviz tip 41: Lb_titlu_alb_b121.Caption = "RETUR TRANSFER" pe ambele; etichete "Retur de la" / "Retur la".
* - aviz tip 21, gnScadereStoc=1: ct_clb_gestiune_init prezent (ramane pe 21,25,26,28,42,47).
* C. Pe unificat, in plus fata de sursa:
* - factura: Ct_clb_politici_preturi ABSENT; aviz: txtCodFiscal, lblCodFiscal, txtSoldLei, lblSoldLei,
* But_verifica1 ABSENTE; aviz: clb_fdoc.cboFdoc.Enabled = .F. si Value = "AVIZ".
* - Clb_serie_act1.nid_tipdoc = poDate.nIdTipDoc (6 pe aviz, nu 5 din ADD OBJECT) cand e prezent.
* - Createobject pe aviz NU cade (cboFdoc.Init cu nIdTipDocAvizExpeditie).
* - tip 1 cu id_client real: nSoldLei/nSoldValuta identice cu frm_date_factura.
* D. Neregresie calea veche: test_s3_neregresie_vechi.prg (acelasi inventar rulat numai pe vechi,
* comparat cu backup-ul .pre_s3_1.bak.vcx).
*
* Netestabil headless: focusul final (SetFocus fara Show) - ramane pentru testul UI.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3_init_antet.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_init_antet.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; seriile de facturi (tipdoc 5) sunt pe utilizator -> gnIdUtil = 8.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gcCaz
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_init_antet.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
gcCaz = ""
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
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) + " gnScadentaAutomata=" + TRANSFORM(gnScadentaAutomata)
* gridextras.vcx e referit din ofacturare.vcx cu cale relativa (..\utile\gridextras), rezolvabila doar din exe/IDE
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
PRIVATE poDate, poGeneratorNumere, plVizibil
plVizibil = .F.
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
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'
* grd_factura.cGestiune e legat la crsFactura.gestiune, camp inexistent in creeaza_facturacrs (nume_gestiune)
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
* un client real pentru cazul id_client <> 0 (GetSoldClient)
LOCAL lnIdClient
lnIdClient = 0
IF SQLEXEC(gnHandle, "select min(id_part) as id_part from nom_parteneri", "crsclient") > 0
lnIdClient = NVL(crsclient.id_part, 0)
USE IN crsclient
ENDIF
DO AfLog WITH "id_client de test=" + TRANSFORM(lnIdClient)
LOCAL laFact[13], laAviz[11], lnStoc, i, lnTip, lnSerii, lcSerii
laFact[1] = 1
laFact[2] = 2
laFact[3] = 3
laFact[4] = 4
laFact[5] = 5
laFact[6] = 7
laFact[7] = 8
laFact[8] = 9
laFact[9] = 10
laFact[10] = 45
laFact[11] = 48
laFact[12] = 49
laFact[13] = 52
laAviz[1] = 21
laAviz[2] = 22
laAviz[3] = 23
laAviz[4] = 24
laAviz[5] = 25
laAviz[6] = 26
laAviz[7] = 28
laAviz[8] = 29
laAviz[9] = 41
laAviz[10] = 42
laAviz[11] = 47
FOR lnStoc = 0 TO 1
gnScadereStoc = lnStoc
FOR lnSerii = 1 TO 2
lcSerii = IIF(lnSerii = 1, "real", "0")
FOR i = 1 TO 13
DO Caz WITH laFact[i], .F., lcSerii, 0
ENDFOR
FOR i = 1 TO 11
DO Caz WITH laAviz[i], .T., lcSerii, 0
ENDFOR
ENDFOR
ENDFOR
* cazul cu client real (sold)
gnScadereStoc = 0
IF lnIdClient <> 0
DO Caz WITH 1, .F., "real", lnIdClient
ENDIF
DO Final
*----------------------------------------------------------------------------------------
PROCEDURE Caz
LPARAMETERS tnTip, tlAviz, tcSerii, tnIdClient
LOCAL loVechi, loNou, lcVechi, lnCtrl, lcCtrl, lcCtrlNou, llV, llN, lcEtV, lcEtN
gcCaz = "[tip=" + TRANSFORM(tnTip) + " stoc=" + TRANSFORM(gnScadereStoc) + " serii=" + tcSerii + IIF(tnIdClient <> 0, " client=" + TRANSFORM(tnIdClient), "") + "] "
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", 25000 + tnTip - 1 + gnScadereStoc * 10, tnTip)
poDate.nIdTipDoc = IIF(tlAviz, 6, 5)
IF tnIdClient <> 0
poDate.id_client = tnIdClient
ENDIF
poGeneratorNumere.ResetNumere()
IF tcSerii = "real"
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
ELSE
poDate.rezultat_serii = 0
ENDIF
DO AfLog WITH gcCaz + "in_valuta=" + TRANSFORM(poDate.in_valuta) + " rezultat_serii=" + TRANSFORM(poDate.rezultat_serii) + " amessagebox=[" + gcMockUltimMesaj + "]"
gcMockUltimMesaj = ""
lcVechi = IIF(tlAviz, 'frm_date_aviz', 'frm_date_factura')
loVechi = CREATEOBJECT(lcVechi)
IF VARTYPE(loVechi) <> 'O'
DO Assert WITH .F., "Createobject " + lcVechi
RETURN
ENDIF
loNou = CREATEOBJECT('frm_facturare_articole2')
IF VARTYPE(loNou) <> 'O'
DO Assert WITH .F., "Createobject frm_facturare_articole2"
loVechi.Release()
RETURN
ENDIF
* A. paritate prezenta pe controalele formularului-sursa
LOCAL laCtrl[21]
IF tlAviz
lnCtrl = 14
laCtrl[1] = "Clb_dataireg"
laCtrl[2] = "Clb_dataact"
laCtrl[3] = "Clb_zi_curs"
laCtrl[4] = "Ct_clb_fdoc"
laCtrl[5] = "Clb_serie_act"
laCtrl[6] = "Clb_nract"
laCtrl[7] = "Ct_clb_nume_client"
laCtrl[8] = "Ct_clb_altele"
laCtrl[9] = "Ct_clb_gestiune_init"
laCtrl[10] = "Ct_clb_politici_preturi"
laCtrl[11] = "Ct_clb_venchelt"
laCtrl[12] = "Ct_clb_sectie"
laCtrl[13] = "Ct_clb_responsabil"
laCtrl[14] = "Ct_clb_lucrare"
ELSE
lnCtrl = 21
laCtrl[1] = "Clb_dataireg"
laCtrl[2] = "Clb_dataact"
laCtrl[3] = "Clb_data_scadenta"
laCtrl[4] = "Clb_zi_curs"
laCtrl[5] = "Ct_clb_fdoc"
laCtrl[6] = "Clb_serie_act"
laCtrl[7] = "Clb_nract"
laCtrl[8] = "Ct_clb_nume_client"
laCtrl[9] = "txtCodFiscal"
laCtrl[10] = "lblCodFiscal"
laCtrl[11] = "txtSoldLei"
laCtrl[12] = "lblSoldLei"
laCtrl[13] = "But_verifica1"
laCtrl[14] = "Ct_clb_altele"
laCtrl[15] = "Ct_clb_gestiune_init"
laCtrl[16] = "Ct_clb_valuta"
laCtrl[17] = "Ct_clb_venchelt"
laCtrl[18] = "Ct_clb_sectie"
laCtrl[19] = "Ct_clb_responsabil"
laCtrl[20] = "Ct_clb_lucrare"
laCtrl[21] = "Ed_tx_simplu1"
ENDIF
FOR i = 1 TO lnCtrl
lcCtrl = laCtrl[i]
lcCtrlNou = ICASE(lcCtrl == "Ct_clb_fdoc", "clb_fdoc", lcCtrl == "Clb_serie_act", "Clb_serie_act1", lcCtrl)
llV = ObjExists(loVechi, lcCtrl)
llN = ObjExists(loNou, lcCtrlNou)
DO Assert WITH llV = llN, "prezenta " + lcCtrl + " vechi=" + TRANSFORM(llV) + " nou=" + TRANSFORM(llN)
ENDFOR
* etichete
IF ObjExists(loVechi, "Ct_clb_altele") AND ObjExists(loNou, "Ct_clb_altele")
lcEtV = loVechi.Ct_clb_altele.clb_tx_cautare.Lb_simplu1.Caption
lcEtN = loNou.Ct_clb_altele.clb_tx_cautare.Lb_simplu1.Caption
DO Assert WITH lcEtV == lcEtN, "eticheta altele vechi=[" + lcEtV + "] nou=[" + lcEtN + "]"
ENDIF
IF ObjExists(loVechi, "Ct_clb_nume_client") AND ObjExists(loNou, "Ct_clb_nume_client")
lcEtV = loVechi.Ct_clb_nume_client.clb_tx_cautare.Lb_simplu1.Caption
lcEtN = loNou.Ct_clb_nume_client.clb_tx_cautare.Lb_simplu1.Caption
IF lcEtV == "Nume client"
* eticheta implicita difera prin proiectare (prototip: "Client"); Init n-a schimbat-o
DO Assert WITH lcEtN == "Client", "eticheta client implicita nou=[" + lcEtN + "] asteptat [Client]"
ELSE
DO Assert WITH lcEtV == lcEtN, "eticheta client vechi=[" + lcEtV + "] nou=[" + lcEtN + "]"
ENDIF
ENDIF
* nid_tip
DO Assert WITH loNou.nid_tip = poDate.tip AND loVechi.nid_tip = poDate.tip, "nid_tip = poDate.tip"
* C. specific unificat
IF tlAviz
DO Assert WITH !ObjExists(loNou, "txtCodFiscal") AND !ObjExists(loNou, "lblCodFiscal") AND !ObjExists(loNou, "txtSoldLei") ;
AND !ObjExists(loNou, "lblSoldLei") AND !ObjExists(loNou, "But_verifica1"), "aviz: controalele de client/sold eliminate"
DO Assert WITH !loNou.clb_fdoc.cboFdoc.Enabled, "aviz: cboFdoc dezactivat"
DO Assert WITH ALLTRIM(loNou.clb_fdoc.cboFdoc.Value) == "AVIZ", "aviz: cboFdoc.Value=[" + TRANSFORM(loNou.clb_fdoc.cboFdoc.Value) + "]"
IF tnTip = 41
DO Assert WITH loNou.Lb_titlu_alb_b121.Caption == "RETUR TRANSFER" AND loVechi.Lb_titlu_alb_b121.Caption == "RETUR TRANSFER", ;
"aviz 41: titlu nou=[" + loNou.Lb_titlu_alb_b121.Caption + "] vechi=[" + loVechi.Lb_titlu_alb_b121.Caption + "]"
ENDIF
ELSE
DO Assert WITH !ObjExists(loNou, "Ct_clb_politici_preturi"), "factura: Ct_clb_politici_preturi eliminat"
DO Assert WITH loNou.clb_fdoc.cboFdoc.Enabled, "factura: cboFdoc activ"
IF tnIdClient <> 0
DO Assert WITH loNou.nSoldLei = loVechi.nSoldLei AND loNou.nSoldValuta = loVechi.nSoldValuta, ;
"sold client nou=" + TRANSFORM(loNou.nSoldLei) + "/" + TRANSFORM(loNou.nSoldValuta) + " vechi=" + TRANSFORM(loVechi.nSoldLei) + "/" + TRANSFORM(loVechi.nSoldValuta)
ENDIF
ENDIF
IF ObjExists(loNou, "Clb_serie_act1")
DO Assert WITH loNou.Clb_serie_act1.nid_tipdoc = poDate.nIdTipDoc, "Clb_serie_act1.nid_tipdoc=" + TRANSFORM(loNou.Clb_serie_act1.nid_tipdoc) + " asteptat " + TRANSFORM(poDate.nIdTipDoc)
ENDIF
* B. esantionul declarat explicit
DO CASE
CASE !tlAviz AND tnTip = 1 AND gnScadereStoc = 0
DO Assert WITH !ObjExists(loNou, "Ct_clb_gestiune_init") AND !ObjExists(loNou, "Ct_clb_responsabil") AND !ObjExists(loNou, "Ct_clb_altele") AND !ObjExists(loNou, "Ct_clb_valuta"), "B: tip 1 eliminate gestiune_init/responsabil/altele/valuta"
DO Assert WITH ObjExists(loNou, "Clb_dataireg") AND ObjExists(loNou, "Clb_dataact") AND ObjExists(loNou, "Clb_data_scadenta") AND ObjExists(loNou, "Clb_zi_curs") ;
AND ObjExists(loNou, "Clb_nract") AND ObjExists(loNou, "Ct_clb_nume_client") AND ObjExists(loNou, "Ct_clb_venchelt") AND ObjExists(loNou, "Ct_clb_sectie") ;
AND ObjExists(loNou, "Ct_clb_lucrare") AND ObjExists(loNou, "Ed_tx_simplu1"), "B: tip 1 prezente restul"
CASE !tlAviz AND tnTip = 2 AND gnScadereStoc = 0
DO Assert WITH ObjExists(loNou, "Ct_clb_altele") AND loNou.Ct_clb_altele.clb_tx_cautare.Lb_simplu1.Caption == "Nr. contract", "B: tip 2 altele = Nr. contract"
CASE !tlAviz AND tnTip = 8
DO Assert WITH !ObjExists(loNou, "Clb_zi_curs"), "B: tip 8 clb_zi_curs eliminat"
CASE !tlAviz AND tnTip = 5
DO Assert WITH ObjExists(loNou, "Ct_clb_valuta"), "B: tip 5 ct_clb_valuta prezent"
CASE tlAviz AND tnTip = 22 AND gnScadereStoc = 0
DO Assert WITH !ObjExists(loNou, "Ct_clb_responsabil") AND !ObjExists(loNou, "Ct_clb_gestiune_init") AND !ObjExists(loNou, "Ct_clb_politici_preturi") AND !ObjExists(loNou, "Ct_clb_altele"), "B: tip 22 eliminate responsabil/gestiune_init/politici/altele"
CASE tlAviz AND tnTip = 23
DO Assert WITH !ObjExists(loNou, "Ct_clb_venchelt") AND ObjExists(loNou, "Ct_clb_politici_preturi"), "B: tip 23 venchelt eliminat, politici prezent"
DO Assert WITH loNou.Ct_clb_nume_client.clb_tx_cautare.Lb_simplu1.Caption == "Gestiune sursa" AND loNou.Ct_clb_altele.clb_tx_cautare.Lb_simplu1.Caption == "Gestiune destinatie", "B: tip 23 etichete gestiune sursa/destinatie"
CASE tlAviz AND tnTip = 41
DO Assert WITH loNou.Ct_clb_nume_client.clb_tx_cautare.Lb_simplu1.Caption == "Retur de la" AND loNou.Ct_clb_altele.clb_tx_cautare.Lb_simplu1.Caption == "Retur la", "B: tip 41 etichete retur"
CASE tlAviz AND tnTip = 21 AND gnScadereStoc = 1
DO Assert WITH ObjExists(loNou, "Ct_clb_gestiune_init"), "B: tip 21 stoc=1 gestiune_init prezent"
ENDCASE
loNou.Release()
loVechi.Release()
RELEASE loNou, loVechi
IF poDate.rezultat_serii <> 0
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
ENDIF
ENDPROC
FUNCTION ObjExists
* prezenta reala in colectia Objects, cautare recursiva - controalele pot fi in containere
LPARAMETERS toContainer, tcName
LOCAL i, loO
FOR i = 1 TO toContainer.Objects.Count
loO = toContainer.Objects(i)
IF UPPER(loO.Name) == UPPER(tcName)
RETURN .T.
ENDIF
IF TYPE('loO.Objects.Count') = 'N'
IF ObjExists(loO, tcName)
RETURN .T.
ENDIF
ENDIF
ENDFOR
RETURN .F.
ENDFUNC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL: " + gcCaz + tcMsg
ENDIF
ENDPROC
PROCEDURE AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
* preexistent pe calea veche, vizibil doar fiindca testul tine formularul vechi viu cand Init-ul unificat muta
* focusul: _combobox1.LostFocus -> do_schimba_tipdoc -> clb_serie_act eliminat la rezultat_serii=0 (1925)
IF tnErr = 1925 AND UPPER(tcProg) == "FRM_DATE_FACTURA.DO_SCHIMBA_TIPDOC" AND "CLB_SERIE_ACT" $ UPPER(tcMsg)
DO AfLog WITH "PREEXISTENT (vechi, neconsiderat) " + gcCaz + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
RETURN
ENDIF
gnFail = gnFail + 1
DO AfLog WITH "ERROR " + gcCaz + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,162 @@
* test_s3_neregresie_vechi.prg <CURENT|BACKUP>
* Headless: amprenta antetului dupa Init NUMAI pe calea veche (frm_date_factura / frm_date_aviz),
* pe toate tipurile, scrisa intr-un fisier text; rulat o data pe binarul curent (CURENT) si o data
* pe backup-ul ofacturare.pre_s3_1.bak.vcx (BACKUP), in lansari separate. Asteptat: cele doua
* fisiere de amprenta sunt IDENTICE (diff gol) - clasele-sursa nu au fost atinse.
*
* Amprenta per caz: controale prezente (colectia Objects), etichetele altele/client, nid_tip,
* clb_serie_act.nid_tipdoc, Height.
*
* Rulare (cate o lansare per apel):
* vfp9.exe -A -T "...\test_s3_neregresie_vechi.prg" CURENT
* vfp9.exe -A -T "...\test_s3_neregresie_vechi.prg" BACKUP
* Iesire: ...\out\neregresie_vechi_CURENT.txt / neregresie_vechi_BACKUP.txt, log neregresie_vechi_<mod>.log
LPARAMETERS tcMod
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
tcMod = UPPER(ALLTRIM(IIF(EMPTY(tcMod), "CURENT", tcMod)))
PUBLIC gcLog, gcOut, gnFail
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\neregresie_vechi_" + tcMod + ".log"
gcOut = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\neregresie_vechi_" + tcMod + ".txt"
IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out")
MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out"
ENDIF
STRTOFILE("START " + tcMod + " " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog)
STRTOFILE("", gcOut)
gnFail = 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
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
IF tcMod = "BACKUP"
RELEASE CLASSLIB "D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vcx"
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.pre_s3_1.bak.vcx" ADDITIVE
ENDIF
DO AfLog WITH "CLASSLIB ofacturare: " + IIF("OFACTURARE.PRE_S3_1.BAK.VCX" $ UPPER(SET("CLASSLIB")), "BACKUP", "CURENT")
PRIVATE poDate, poGeneratorNumere, plVizibil
plVizibil = .F.
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
LOCAL laFact[13], laAviz[11], lnStoc, i, lnSerii, lcSerii
laFact[1] = 1
laFact[2] = 2
laFact[3] = 3
laFact[4] = 4
laFact[5] = 5
laFact[6] = 7
laFact[7] = 8
laFact[8] = 9
laFact[9] = 10
laFact[10] = 45
laFact[11] = 48
laFact[12] = 49
laFact[13] = 52
laAviz[1] = 21
laAviz[2] = 22
laAviz[3] = 23
laAviz[4] = 24
laAviz[5] = 25
laAviz[6] = 26
laAviz[7] = 28
laAviz[8] = 29
laAviz[9] = 41
laAviz[10] = 42
laAviz[11] = 47
FOR lnStoc = 0 TO 1
gnScadereStoc = lnStoc
FOR lnSerii = 1 TO 2
lcSerii = IIF(lnSerii = 1, "real", "0")
FOR i = 1 TO 13
DO Caz WITH laFact[i], .F., lcSerii
ENDFOR
FOR i = 1 TO 11
DO Caz WITH laAviz[i], .T., lcSerii
ENDFOR
ENDFOR
ENDFOR
DO Final
PROCEDURE Caz
LPARAMETERS tnTip, tlAviz, tcSerii
LOCAL loVechi, lcVechi, lcAmprenta, i, lcCaz
lcCaz = "[tip=" + TRANSFORM(tnTip) + " stoc=" + TRANSFORM(gnScadereStoc) + " serii=" + tcSerii + "]"
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", 25000 + tnTip - 1 + gnScadereStoc * 10, tnTip)
poDate.nIdTipDoc = IIF(tlAviz, 6, 5)
poGeneratorNumere.ResetNumere()
IF tcSerii = "real"
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
ELSE
poDate.rezultat_serii = 0
ENDIF
lcVechi = IIF(tlAviz, 'frm_date_aviz', 'frm_date_factura')
loVechi = CREATEOBJECT(lcVechi)
IF VARTYPE(loVechi) <> 'O'
gnFail = gnFail + 1
DO AfLog WITH "FAIL " + lcCaz + " Createobject " + lcVechi
RETURN
ENDIF
lcAmprenta = lcCaz + " in_valuta=" + TRANSFORM(poDate.in_valuta) + " rezultat_serii=" + TRANSFORM(poDate.rezultat_serii) + " obj="
FOR i = 1 TO loVechi.Objects.Count
lcAmprenta = lcAmprenta + loVechi.Objects(i).Name + ","
ENDFOR
IF ObjExists(loVechi, "Ct_clb_altele")
lcAmprenta = lcAmprenta + " altele=[" + loVechi.Ct_clb_altele.clb_tx_cautare.Lb_simplu1.Caption + "]"
ENDIF
IF ObjExists(loVechi, "Ct_clb_nume_client")
lcAmprenta = lcAmprenta + " client=[" + loVechi.Ct_clb_nume_client.clb_tx_cautare.Lb_simplu1.Caption + "]"
ENDIF
IF ObjExists(loVechi, "Clb_serie_act")
lcAmprenta = lcAmprenta + " serie.nid_tipdoc=" + TRANSFORM(loVechi.Clb_serie_act.nid_tipdoc)
ENDIF
lcAmprenta = lcAmprenta + " nid_tip=" + TRANSFORM(loVechi.nid_tip) + " Height=" + TRANSFORM(loVechi.Height)
STRTOFILE(lcAmprenta + CHR(13) + CHR(10), gcOut, 1)
loVechi.Release()
RELEASE loVechi
IF poDate.rezultat_serii <> 0
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
ENDIF
ENDPROC
FUNCTION ObjExists
LPARAMETERS toForm, tcName
LOCAL i
FOR i = 1 TO toForm.Objects.Count
IF UPPER(toForm.Objects(i).Name) == UPPER(tcName)
RETURN .T.
ENDIF
ENDFOR
RETURN .F.
ENDFUNC
PROCEDURE AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gnFail = gnFail + 1
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL fail=" + TRANSFORM(gnFail) + " randuri amprenta=" + TRANSFORM(ALINES(laX, FILETOSTR(gcOut)))
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,362 @@
* test_s3_tipdoc.prg
* Headless: paritatea lui do_schimba_tipdoc intre calea veche (frm_date_factura, metoda in .vcx) si formularul
* unificat (frm_facturare_articole2.do_schimba_tipdoc -> oAntetFacturare.alege_tipdoc / schimba_tipdoc din
* ofacturare_antet.prg + efectele pe controale ramase in .vcx). Generatorul de numere e o SUBCLASA de test a lui
* oGeneratorNumere (oGeneratorMock, mock_generator_numere.prg) care NU atinge Oracle la alocare/dezalocare: aloca_numar
* intoarce un contor local si jurnalizeaza apelul; dezaloca_numar jurnalizeaza si pune numarul pe 0;
* creeaza_cursor_serii construieste un cursor local de serii (FACTURA/PROFORMA cu serie+plaje, BON FISCAL fara
* serie cu plaje) - fara Oracle (pe MARIUSM_AUTO proforma n-are plaje si goExecutor deschide un dialog real).
* NU se consuma numere reale din serii.
*
* REZULTAT ASTEPTAT (declarat inainte de rulare):
* A. Pentru fiecare caz (fel initial -> fel ales) se construieste ACELASI poDate (tip 1, nIdTipDoc = FACTURA),
* se creeaza formularul vechi / unificatul, se pune valoarea in combo (ct_clb_fdoc._combobox1 / clb_fdoc.cboFdoc)
* si se apeleaza do_schimba_tipdoc(). Se compara amprenta: poDate.nIdTipDoc, eProforma, eBonFiscal, id_fdoc,
* fdoc, serie_act, nract, rezultat_serii, starea controlului serie (nid_tipdoc, nTip, vizibilitati), jurnalul
* generatorului (aloca/dezaloca, in ordine, cu tipul de document) si erorile VFP.
* A2. Calea veche pastreaza un apel neconditionat catre _cbbase1.LostFocus() inaintea garzii de schimbare de tip
* (bug preexistent, lasat constient); calea unificata nu mai are acest apel. Efectul e o divergenta cu tipar
* fix: fara schimbare de tip, calea veche arde un numar suplimentar iar unificatul nu aloca nimic; cu schimbare
* de tip, calea veche contine in plus perechea aloca_numar(tip vechi)/dezaloca_numar(tip vechi) inaintea garzii,
* iar numarul final e mai mare cu exact 1 fata de unificat. Testul normalizeaza aceasta divergenta (o verifica
* explicit, cu asertiuni, apoi o scoate din amprenta) si compara restul IDENTIC - vezi NormalizeazaFaraSchimbare
* / NormalizeazaCuSchimbare mai jos. Daca divergenta iese din acest tipar, normalizarea nu se potriveste si
* testul PICA.
* B. Cazuri: FACTURA->FACTURA (fara schimbare: nIdTipDoc ramane 5, dar _cbbase1.LostFocus() se apeleaza
* neconditionat pe calea veche - regenerarea numarului e divergenta asteptata A2, nu identitate),
* FACTURA->PROFORMA (nIdTipDoc 23), FACTURA->BON FISCAL (nIdTipDoc 3), PROFORMA->FACTURA (pornind cu
* nIdTipDoc 23), BON FISCAL->PROFORMA.
* C. Asteptat in plus, declarat: dupa FACTURA->PROFORMA poDate.nIdTipDoc = poDate.nIdTipDocProforma = 23 pe
* ambele; dupa ->BON FISCAL = 3; jurnalul contine dezaloca_numar(tip vechi) inainte de alocarea pe tipul nou.
* D. Netestabil headless: secventa reala LostFocus/Valid la iesirea din combo (test_s3_tipdoc_ui.prg).
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3_tipdoc.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_tipdoc.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 1.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gcCaz, gcErr, gcMockApeluri, gnMockNumar, gnDivergenteQ8
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_tipdoc.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
gcCaz = ""
gcErr = ""
gcMockApeluri = ""
gnMockNumar = 0
gnDivergenteQ8 = 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
LOCAL lcProc
lcProc = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProc, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg"
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
gnScadereStoc = 1
DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna)
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
DO Assert WITH TYPE('CREATEOBJECT("oAntetFacturare")') = 'O', "oAntetFacturare instantiabil"
PRIVATE poDate, poGeneratorNumere, plVizibil, poDateGestiuneDest
plVizibil = .F.
poGeneratorNumere = CREATEOBJECT("oGeneratorMock")
DO Assert WITH VARTYPE(poGeneratorNumere) = 'O' AND poGeneratorNumere.Class == "Ogeneratormock", "generator mock instantiat (subclasa oGeneratorNumere)"
poDateGestiuneDest = CREATEOBJECT("oDateGestiune")
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 Caz WITH "FACTURA", "FACTURA"
DO Caz WITH "FACTURA", "PROFORMA"
DO Caz WITH "FACTURA", "BON FISCAL"
DO Caz WITH "PROFORMA", "FACTURA"
DO Caz WITH "BON FISCAL", "PROFORMA"
DO Final
*----------------------------------------------------------------------------------------
PROCEDURE Caz
LPARAMETERS tcDin, tcIn
LOCAL lcVechi, lcNou, lnAsteptat, lcVechiNorm, lnTipVechi, lnTipNou
gcCaz = "[" + tcDin + " -> " + tcIn + "] "
lcVechi = Amprenta('frm_date_factura', tcDin, tcIn)
lcNou = Amprenta('frm_facturare_articole2', tcDin, tcIn)
lnTipVechi = IdTipDoc(tcDin)
lnTipNou = IdTipDoc(tcIn)
IF tcDin == tcIn
lcVechiNorm = NormalizeazaFaraSchimbare(lcVechi, lcNou, lnTipVechi)
ELSE
lcVechiNorm = NormalizeazaCuSchimbare(lcVechi, lcNou, lnTipVechi, lnTipNou)
ENDIF
IF lcVechiNorm == lcNou
gnPass = gnPass + 1
DO AfLog WITH "OK " + gcCaz + "amprente identice dupa normalizarea divergentei Q8 (" + TRANSFORM(OCCURS(CHR(10), lcNou)) + " linii)"
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL " + gcCaz + "amprente diferite dupa normalizare (divergenta neasteptata):"
DO DifLinii WITH lcVechiNorm, lcNou
ENDIF
lnAsteptat = IdTipDoc(tcIn)
DO Assert WITH ("poDate.nidtipdoc=" + TRANSFORM(lnAsteptat) + CHR(13)) $ lcVechi, "asteptat nIdTipDoc=" + TRANSFORM(lnAsteptat) + " dupa schimbare"
IF !(tcDin == tcIn)
DO Assert WITH ("dezaloca_numar(" + TRANSFORM(IdTipDoc(tcDin)) + ")") $ lcVechi, "asteptat dezaloca_numar pe tipul vechi " + TRANSFORM(IdTipDoc(tcDin))
ENDIF
ENDPROC
FUNCTION NormalizeazaFaraSchimbare
* Q8, fara schimbare de tip: calea veche arde un numar la intrare-iesire din combo, unificatul nu aloca nimic
LPARAMETERS tcVechi, tcNou, tnTip
LOCAL lcJurnalVechi, lcJurnalNou, lnNractVechi, lnNractNou, lcVechiNorm
lcJurnalVechi = Jurnal(tcVechi)
lcJurnalNou = Jurnal(tcNou)
lnNractVechi = VAL(ValoareCheie(tcVechi, "poDate.nract"))
lnNractNou = VAL(ValoareCheie(tcNou, "poDate.nract"))
DO Assert WITH lnNractNou = 0, "Q8: pe calea unificata nract ramane neatins la intrare-iesire fara schimbare de tip"
DO Assert WITH EMPTY(lcJurnalNou), "Q8: pe calea unificata jurnalul generatorului ramane gol fara schimbare de tip"
DO Assert WITH lnNractVechi > 0, "Q8: pe calea veche nract se arde la intrare-iesire din combo, chiar fara schimbare de tip"
DO Assert WITH OCCURS("aloca_numar(" + TRANSFORM(tnTip) + ") -> ", lcJurnalVechi) = 1, "Q8: pe calea veche se aloca exact un numar, pe tipul curent " + TRANSFORM(tnTip) + ", la intrare-iesire fara schimbare de tip"
gnDivergenteQ8 = gnDivergenteQ8 + 1
DO AfLog WITH "DIVERGENTA-ASTEPTATA (Q8): " + gcCaz + "fara schimbare de tip, calea veche arde numarul (nract=" + TRANSFORM(lnNractVechi) + "), unificatul nu aloca nimic (nract=0)"
lcVechiNorm = InlocuiesteJurnal(tcVechi, "")
lcVechiNorm = STRTRAN(lcVechiNorm, "poDate.nract=" + TRANSFORM(lnNractVechi) + CHR(13) + CHR(10), "poDate.nract=0" + CHR(13) + CHR(10), 1, 1)
RETURN lcVechiNorm
ENDFUNC
FUNCTION NormalizeazaCuSchimbare
* Q8, cu schimbare de tip: calea veche are in plus perechea aloca_numar(tip vechi)/dezaloca_numar(tip vechi)
* inaintea garzii, iar numarul final e mai mare cu exact 1 fata de unificat
LPARAMETERS tcVechi, tcNou, tnTipVechi, tnTipNou
LOCAL lcJurnalVechi, lnNractVechi, lnNractNou, lcMarcaj, lnPozAloc, lnN
LOCAL lcLiniaAloc, lcLiniaDezaloc, lcBloc, lcJurnalRedus, lcLiniaAlocFinalaVechi, lcLiniaAlocFinalaNou, lcVechiNorm
lcJurnalVechi = Jurnal(tcVechi)
lnNractVechi = VAL(ValoareCheie(tcVechi, "poDate.nract"))
lnNractNou = VAL(ValoareCheie(tcNou, "poDate.nract"))
lcMarcaj = "aloca_numar(" + TRANSFORM(tnTipVechi) + ") -> "
lnPozAloc = AT(lcMarcaj, lcJurnalVechi)
DO Assert WITH lnPozAloc > 0, "Q8: perechea redundanta aloca_numar(tip vechi) prezenta pe calea veche"
IF lnPozAloc = 0
RETURN tcVechi && divergenta neasteptata, comparatia finala ramane nenormalizata si pica
ENDIF
lnN = VAL(SUBSTR(lcJurnalVechi, lnPozAloc + LEN(lcMarcaj)))
lcLiniaAloc = lcMarcaj + TRANSFORM(lnN) + CHR(13) + CHR(10)
lcLiniaDezaloc = "dezaloca_numar(" + TRANSFORM(tnTipVechi) + ") numar=" + TRANSFORM(lnN) + CHR(13) + CHR(10)
lcBloc = lcLiniaAloc + lcLiniaDezaloc
DO Assert WITH (lcBloc $ lcJurnalVechi), "Q8: perechea aloca_numar/dezaloca_numar pe tipul vechi " + TRANSFORM(tnTipVechi) + " apare adiacent, in aceasta ordine"
lcJurnalRedus = STRTRAN(lcJurnalVechi, lcBloc, "", 1, 1)
lcLiniaAlocFinalaVechi = "aloca_numar(" + TRANSFORM(tnTipNou) + ") -> " + TRANSFORM(lnNractVechi) + CHR(13) + CHR(10)
lcLiniaAlocFinalaNou = "aloca_numar(" + TRANSFORM(tnTipNou) + ") -> " + TRANSFORM(lnNractNou) + CHR(13) + CHR(10)
DO Assert WITH lnNractVechi = lnNractNou + 1, "Q8: numarul final pe calea veche (" + TRANSFORM(lnNractVechi) + ") e cu exact 1 mai mare decat pe calea unificata (" + TRANSFORM(lnNractNou) + ")"
DO Assert WITH (lcLiniaAlocFinalaVechi $ lcJurnalRedus), "Q8: dupa scoaterea perechii redundante, ultima alocare e pe tipul nou " + TRANSFORM(tnTipNou) + " cu numarul " + TRANSFORM(lnNractVechi)
lcJurnalRedus = STRTRAN(lcJurnalRedus, lcLiniaAlocFinalaVechi, lcLiniaAlocFinalaNou, 1, 1)
gnDivergenteQ8 = gnDivergenteQ8 + 1
DO AfLog WITH "DIVERGENTA-ASTEPTATA (Q8): " + gcCaz + "calea veche contine in plus perechea aloca_numar(" + TRANSFORM(tnTipVechi) + ")/dezaloca_numar(" + TRANSFORM(tnTipVechi) + ") inaintea garzii; numar final " + TRANSFORM(lnNractVechi) + " (veche) vs " + TRANSFORM(lnNractNou) + " (unificat)"
lcVechiNorm = InlocuiesteJurnal(tcVechi, lcJurnalRedus)
lcVechiNorm = STRTRAN(lcVechiNorm, "poDate.nract=" + TRANSFORM(lnNractVechi) + CHR(13) + CHR(10), "poDate.nract=" + TRANSFORM(lnNractNou) + CHR(13) + CHR(10), 1, 1)
RETURN lcVechiNorm
ENDFUNC
FUNCTION ValoareCheie
* valoarea unei chei "cheie=valoare" dintr-o amprenta, cautata linie cu linie
LPARAMETERS tcAmprenta, tcCheie
LOCAL laL[1], lnL, i
lnL = ALINES(laL, tcAmprenta)
FOR i = 1 TO lnL
IF LEFT(laL[i], LEN(tcCheie) + 1) == tcCheie + "="
RETURN SUBSTR(laL[i], LEN(tcCheie) + 2)
ENDIF
ENDFOR
RETURN "<lipsa>"
ENDFUNC
FUNCTION Jurnal
* liniile jurnalului generatorului (intre GENERATOR: si ERORI:) dintr-o amprenta
LPARAMETERS tcAmprenta
LOCAL laL[1], lnL, i, lnStart, lnStop, lcR
lnL = ALINES(laL, tcAmprenta)
lnStart = 0
lnStop = 0
FOR i = 1 TO lnL
IF laL[i] == "GENERATOR:"
lnStart = i + 1
ENDIF
IF laL[i] == "ERORI:" AND lnStart > 0
lnStop = i - 1
EXIT
ENDIF
ENDFOR
lcR = ""
FOR i = lnStart TO lnStop
lcR = lcR + laL[i] + CHR(13) + CHR(10)
ENDFOR
RETURN lcR
ENDFUNC
FUNCTION InlocuiesteJurnal
* inlocuieste in amprenta continutul dintre GENERATOR: si ERORI: cu jurnalul dat
LPARAMETERS tcAmprenta, tcJurnalNou
LOCAL laL[1], lnL, i, lnStart, lnStop, lcR
lnL = ALINES(laL, tcAmprenta)
lnStart = 0
lnStop = 0
FOR i = 1 TO lnL
IF laL[i] == "GENERATOR:"
lnStart = i + 1
ENDIF
IF laL[i] == "ERORI:" AND lnStart > 0
lnStop = i - 1
EXIT
ENDIF
ENDFOR
lcR = ""
FOR i = 1 TO lnStart - 1
lcR = lcR + laL[i] + CHR(13) + CHR(10)
ENDFOR
lcR = lcR + tcJurnalNou
FOR i = lnStop + 1 TO lnL
lcR = lcR + laL[i] + CHR(13) + CHR(10)
ENDFOR
RETURN lcR
ENDFUNC
FUNCTION IdTipDoc
LPARAMETERS tcFel
RETURN IIF(tcFel == "PROFORMA", 23, IIF(tcFel == "BON FISCAL", 3, 5))
ENDFUNC
FUNCTION Amprenta
LPARAMETERS tcClasa, tcDin, tcIn
LOCAL loF, lcA, loCombo, loSerie
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", 25001, 1)
poDate.nIdTipDoc = IdTipDoc(tcDin)
poGeneratorNumere.ResetNumere()
gnMockNumar = 100
gcMockApeluri = ""
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
poDate.dataact = DATE(gnAn, gnLuna, 1)
poDate.dataireg = poDate.dataact
poDate.id_client = 0
gcErr = ""
DO AfLog WITH " > " + gcCaz + "creez " + tcClasa + " (rezultat_serii=" + TRANSFORM(poDate.rezultat_serii) + ")"
loF = CREATEOBJECT(tcClasa)
IF VARTYPE(loF) <> 'O'
RETURN "CREATEOBJECT " + tcClasa + " ESUAT" + CHR(13) + CHR(10) + gcErr
ENDIF
gcErr = ""
gcMockApeluri = ""
IF tcClasa == 'frm_date_factura'
loCombo = loF.ct_clb_fdoc._combobox1
ELSE
loCombo = loF.clb_fdoc.cboFdoc
ENDIF
lcA = "combo.initial=" + TRANSFORM(loCombo.Value) + CHR(13) + CHR(10)
loCombo.Value = tcIn
lcA = lcA + "combo.ales=" + TRANSFORM(loCombo.Value) + CHR(13) + CHR(10)
lcA = lcA + "INIT: nidtipdoc=" + TRANSFORM(poDate.nIdTipDoc) + " nract=" + TRANSFORM(poDate.nract) + " serie=" + TRANSFORM(poDate.serie_act) + CHR(13) + CHR(10)
gcMockApeluri = ""
gcErr = ""
DO AfLog WITH " > " + gcCaz + "apelez " + tcClasa + ".do_schimba_tipdoc()"
loF.do_schimba_tipdoc()
lcA = lcA + "poDate.nidtipdoc=" + TRANSFORM(poDate.nIdTipDoc) + CHR(13) + CHR(10)
lcA = lcA + "poDate.eproforma=" + TRANSFORM(poDate.eProforma) + CHR(13) + CHR(10)
lcA = lcA + "poDate.ebonfiscal=" + TRANSFORM(poDate.eBonFiscal) + CHR(13) + CHR(10)
lcA = lcA + "poDate.id_fdoc=" + TRANSFORM(poDate.id_fdoc) + CHR(13) + CHR(10)
lcA = lcA + "poDate.fdoc=" + TRANSFORM(poDate.fdoc) + CHR(13) + CHR(10)
lcA = lcA + "poDate.serie_act=" + TRANSFORM(poDate.serie_act) + CHR(13) + CHR(10)
lcA = lcA + "poDate.nract=" + TRANSFORM(poDate.nract) + CHR(13) + CHR(10)
lcA = lcA + "poDate.rezultat_serii=" + TRANSFORM(poDate.rezultat_serii) + CHR(13) + CHR(10)
IF tcClasa == 'frm_date_factura'
loSerie = IIF(PEMSTATUS(loF, 'clb_serie_act', 5), loF.clb_serie_act, NULL)
ELSE
loSerie = IIF(PEMSTATUS(loF, 'clb_serie_act1', 5), loF.clb_serie_act1, NULL)
ENDIF
IF VARTYPE(loSerie) = 'O'
lcA = lcA + "serie.nid_tipdoc=" + TRANSFORM(loSerie.nid_tipdoc) + " nTip=" + TRANSFORM(loSerie.nTip) ;
+ " cb.vis=" + TRANSFORM(loSerie._cbbase1.Visible) + " tx.vis=" + TRANSFORM(loSerie.text_simplu1.Visible) ;
+ " cb.val=" + TRANSFORM(loSerie._cbbase1.Value) + CHR(13) + CHR(10)
ELSE
lcA = lcA + "serie=<lipsa>" + CHR(13) + CHR(10)
ENDIF
lcA = lcA + "GENERATOR:" + CHR(13) + CHR(10) + gcMockApeluri
lcA = lcA + "ERORI:" + CHR(13) + CHR(10) + gcErr
loF.Release()
RELEASE loF
RETURN lcA
ENDFUNC
PROCEDURE DifLinii
LPARAMETERS tcV, tcN
LOCAL laV[1], laN[1], lnV, lnN, i, lnMax
lnV = ALINES(laV, tcV)
lnN = ALINES(laN, tcN)
lnMax = MAX(lnV, lnN)
FOR i = 1 TO lnMax
IF i > lnV OR i > lnN OR !(laV[i] == laN[i])
DO AfLog WITH " vechi: " + IIF(i <= lnV, laV[i], "<lipsa>")
DO AfLog WITH " nou : " + IIF(i <= lnN, laN[i], "<lipsa>")
ENDIF
ENDFOR
ENDPROC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL: " + gcCaz + tcMsg
ENDIF
ENDPROC
PROCEDURE AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + CHR(13) + CHR(10)
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " divergente-asteptate(Q8)=" + TRANSFORM(gnDivergenteQ8)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,237 @@
* test_s3_tipdoc_ui.prg
* UI VIZIBIL (harness ui_harness.prg + vfp_ui_harness.ps1, fereastra off-screen, capturi PrintWindow, FARA input
* real - doar SetFocus programatic, care declanseaza secventa reala LostFocus/Valid intre controale): ce nu e
* testabil headless din S3-3, pe frm_facturare_articole2 (unificat) si, pentru paritate, pe frm_date_factura (vechi).
* Oracle doar pentru mediu (harness, optiuni, setari document); seriile/numerele prin mock_generator_numere.prg (fara
* Oracle); dialogurile de cautare prin mock_caut_antet.prg; amessagebox prin mock_amessagebox.prg.
*
* REZULTAT ASTEPTAT (declarat inainte de rulare), pe fiecare formular (vechi, apoi unificat), tip 1, FACTURA:
* pas0 deschidere: Show() reuseste; ActiveControl dupa Init = combo-ul felului de document (vechi: _combobox1,
* unificat: cboFdoc) - regula din Init (in_valuta=0 -> focus pe fdoc).
* pas1 schimbare FACTURA -> PROFORMA prin combo + mutarea focusului pe clb_dataact (vechi si unificat: cboFdoc.LostFocus - Valid NU se declanseaza la SetFocus programatic, masurat S3-3
* -> do_schimba_tipdoc): poDate.nIdTipDoc = 23, serie_act = 'PRO' (serie reinitializata), nract realocat
* (jurnal: dezaloca_numar(5) ... aloca_numar(23)); identic pe ambele.
* pas2 intrare si iesire din combo FARA schimbare: nIdTipDoc ramane 23; _cbbase1.LostFocus() e apelat neconditionat, dar cu
* numarul deja alocat pe aceeasi serie genereazaNumar nu realoca (jurnal gol) - IDENTIC cu calea veche, documentat.
* pas3 iesire din serie (focus pe _cbbase1, apoi pe clb_nract): genereazaNumar -> verifica_serie pe aceeasi serie
* (paPlaje id_serie = cursor) -> fara realocare daca numarul e deja alocat; jurnal identic pe ambele.
* pas4 cautare client prin lupa (img_cautare.Click -> do_apeleaza -> do_cauta_client, dialog = mock): poDate.id_client
* = gnMockIdPart si ActiveControl.Name dupa cautare identic intre vechi si unificat.
* pas5 inchidere prin do_renunt().
* Se compara amprentele vechi vs unificat pe fiecare pas (cu maparea numelor _combobox1 <-> cboFdoc).
* Daca SetFocus programatic nu declanseaza LostFocus/Valid in mediul harness-ului (fereastra fara focus de sistem),
* testul o spune (FAIL cu jurnal gol pe pas1) - nu se simuleaza nimic prin input real.
*
* Rulare: powershell -ExecutionPolicy Bypass -File test_s3_tipdoc_ui.ps1 (din facturare_unificat\)
* Log: facturare_unificat\test_s3_tipdoc_ui_log.txt ; capturi in screenshots_tipdoc\
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcUILog, gcSyncDir, gnFail, gnPass, gcCaz, gcErr, gcMockApeluri, gnMockNumar, gnMockIdPart, gnMockButon
gcUILog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3_tipdoc_ui_log.txt"
gcSyncDir = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\uisync\"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
gnFail = 0
gnPass = 0
gcCaz = ""
gcErr = ""
gcMockApeluri = ""
gnMockNumar = 0
gnMockIdPart = 0
gnMockButon = 1
ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
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
LOCAL lcProc
lcProc = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_caut_antet.prg", &lcProc, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg", "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg"
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
gnScadereStoc = 1
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna)
PRIVATE poDate, poGeneratorNumere, plVizibil, poDateGestiuneDest
plVizibil = .F.
poGeneratorNumere = CREATEOBJECT("oGeneratorMock")
poDateGestiuneDest = CREATEOBJECT("oDateGestiune")
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
PUBLIC gnIdClient1
gnIdClient1 = 0
IF SQLEXEC(gnHandle, "select max(id_part) as id1 from nom_parteneri", "crsclient") > 0
gnIdClient1 = NVL(crsclient.id1, 0)
USE IN crsclient
ENDIF
gnMockIdPart = gnIdClient1
PUBLIC gaAmpr[2, 6]
STORE "" TO gaAmpr
LOCAL lnF, lcClasa, loF, loCombo, loSerie, lnPas
FOR lnF = 1 TO 2
lcClasa = IIF(lnF = 1, 'frm_date_factura', 'frm_facturare_articole2')
gcCaz = "[" + lcClasa + "] "
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", 25001, 1)
poDate.nIdTipDoc = poDate.nIdTipDocFactura
poGeneratorNumere.ResetNumere()
gnMockNumar = 100
gcMockApeluri = ""
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
poDate.dataact = DATE(gnAn, gnLuna, 1)
poDate.dataireg = poDate.dataact
poDate.id_client = 0
gcErr = ""
loF = CREATEOBJECT(lcClasa)
IF VARTYPE(loF) <> 'O'
DO AfLog WITH "FAIL " + gcCaz + "CREATEOBJECT esuat: " + gcErr
gnFail = gnFail + 1
LOOP
ENDIF
loF.WindowType = 0
loF.Show()
DOEVENTS FORCE
* pas0
gaAmpr[lnF, 1] = "ActiveControl=" + Nume(loF) + " nIdTipDoc=" + TRANSFORM(poDate.nIdTipDoc) + " serie=" + TRANSFORM(poDate.serie_act) + " nract=" + TRANSFORM(poDate.nract) + " err=[" + gcErr + "]"
DO AfLog WITH "PAS0 " + gcCaz + gaAmpr[lnF, 1]
DO HarnessStep WITH (lnF - 1) * 6 + 0, lcClasa + ' deschis', 5
* pas1: FACTURA -> PROFORMA
IF lnF = 1
loCombo = loF.ct_clb_fdoc._combobox1
ELSE
loCombo = loF.clb_fdoc.cboFdoc
ENDIF
gcErr = ""
gcMockApeluri = ""
loCombo.SetFocus()
loCombo.Value = "PROFORMA"
loF.clb_dataact.SetFocus()
DOEVENTS FORCE
gaAmpr[lnF, 2] = "ActiveControl=" + Nume(loF) + " nIdTipDoc=" + TRANSFORM(poDate.nIdTipDoc) + " serie=" + TRANSFORM(poDate.serie_act) + " nract=" + TRANSFORM(poDate.nract) + " rez=" + TRANSFORM(poDate.rezultat_serii) + " jurnal=" + Plat(gcMockApeluri) + " err=[" + gcErr + "]"
DO AfLog WITH "PAS1 " + gcCaz + gaAmpr[lnF, 2]
DO HarnessStep WITH (lnF - 1) * 6 + 1, 'FACTURA -> PROFORMA', 5
* pas2: intrare/iesire fara schimbare
gcErr = ""
gcMockApeluri = ""
loCombo.SetFocus()
loF.clb_dataact.SetFocus()
DOEVENTS FORCE
gaAmpr[lnF, 3] = "ActiveControl=" + Nume(loF) + " nIdTipDoc=" + TRANSFORM(poDate.nIdTipDoc) + " serie=" + TRANSFORM(poDate.serie_act) + " nract=" + TRANSFORM(poDate.nract) + " jurnal=" + Plat(gcMockApeluri) + " err=[" + gcErr + "]"
DO AfLog WITH "PAS2 " + gcCaz + gaAmpr[lnF, 3]
DO HarnessStep WITH (lnF - 1) * 6 + 2, 'combo fara schimbare', 5
* pas3: iesire din serie
IF lnF = 1
loSerie = loF.clb_serie_act
ELSE
loSerie = loF.clb_serie_act1
ENDIF
gcErr = ""
gcMockApeluri = ""
loSerie._cbbase1.SetFocus()
loF.clb_nract.SetFocus()
DOEVENTS FORCE
gaAmpr[lnF, 4] = "ActiveControl=" + Nume(loF) + " nIdTipDoc=" + TRANSFORM(poDate.nIdTipDoc) + " serie=" + TRANSFORM(poDate.serie_act) + " nract=" + TRANSFORM(poDate.nract) + " jurnal=" + Plat(gcMockApeluri) + " err=[" + gcErr + "]"
DO AfLog WITH "PAS3 " + gcCaz + gaAmpr[lnF, 4]
DO HarnessStep WITH (lnF - 1) * 6 + 3, 'iesire din serie', 5
* pas4: cautare client prin lupa (dialog = mock)
gcErr = ""
gcMockApeluri = ""
loF.ct_clb_nume_client.img_cautare.Click()
DOEVENTS FORCE
gaAmpr[lnF, 5] = "ActiveControl=" + Nume(loF) + " id_client=" + TRANSFORM(poDate.id_client) + " nume=" + TRANSFORM(poDate.nume_client) + " apeluri=" + Plat(gcMockApeluri) + " err=[" + gcErr + "]"
DO AfLog WITH "PAS4 " + gcCaz + gaAmpr[lnF, 5]
DO HarnessStep WITH (lnF - 1) * 6 + 4, 'cautare client', 5
* pas5: inchidere
gcErr = ""
loF.do_renunt()
DOEVENTS FORCE
gaAmpr[lnF, 6] = "inchis=" + TRANSFORM(VARTYPE(loF) <> 'O') + " err=[" + gcErr + "]"
DO AfLog WITH "PAS5 " + gcCaz + gaAmpr[lnF, 6]
IF VARTYPE(loF) = 'O'
loF.Release()
ENDIF
RELEASE loF
DO HarnessStep WITH (lnF - 1) * 6 + 5, 'inchis', 5
ENDFOR
* comparatia vechi vs unificat, cu maparea numelor
LOCAL i, lcV, lcN
FOR i = 1 TO 6
gcCaz = "[pas" + TRANSFORM(i - 1) + "] "
lcV = STRTRAN(UPPER(gaAmpr[1, i]), "_COMBOBOX1", "CBOFDOC")
lcN = UPPER(gaAmpr[2, i])
IF lcV == lcN
gnPass = gnPass + 1
DO AfLog WITH "OK " + gcCaz + "identic"
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL " + gcCaz + "difera:" + CHR(13) + CHR(10) + " vechi: " + lcV + CHR(13) + CHR(10) + " nou : " + lcN
ENDIF
ENDFOR
* asteptarile declarate, pe unificat
gcCaz = "[asteptat unificat] "
DO Assert WITH "ACTIVECONTROL=CBOFDOC" $ UPPER(gaAmpr[2, 1]), "pas0: focus initial pe cboFdoc"
DO Assert WITH "nIdTipDoc=23" $ gaAmpr[2, 2] AND "serie=PRO" $ gaAmpr[2, 2] AND "aloca_numar(23)" $ gaAmpr[2, 2] AND "dezaloca_numar(5)" $ gaAmpr[2, 2], "pas1: PROFORMA, serie PRO, numar realocat"
DO Assert WITH "nIdTipDoc=23" $ gaAmpr[2, 3], "pas2: tip neschimbat"
DO Assert WITH ("id_client=" + TRANSFORM(gnIdClient1)) $ gaAmpr[2, 5], "pas4: id_client din dialogul (mock) de client"
DO Final
*----------------------------------------------------------------------------------------
FUNCTION Nume
LPARAMETERS toF
LOCAL lcN
lcN = "<niciunul>"
IF VARTYPE(toF.ActiveControl) = 'O'
lcN = toF.ActiveControl.Name
ENDIF
RETURN lcN
ENDFUNC
FUNCTION Plat
LPARAMETERS tcS
RETURN STRTRAN(STRTRAN(tcS, CHR(13) + CHR(10), "; "), CHR(10), "; ")
ENDFUNC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL: " + gcCaz + tcMsg
ENDIF
ENDPROC
PROCEDURE AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcUILog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " @" + tcProg + ":" + TRANSFORM(tnLine) + "; "
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail)
DO AfLog WITH "END " + TTOC(DATETIME())
DO HarnessDone WITH 'done'
QUIT
ENDPROC

View File

@@ -0,0 +1,12 @@
# test_s3_tipdoc_ui.ps1 - wrapper peste harness-ul generic (vfp_ui_harness.ps1) pentru test_s3_tipdoc_ui.prg.
# Rulare: powershell -ExecutionPolicy Bypass -File test_s3_tipdoc_ui.ps1 (timeout recomandat >= 600s)
# 12 pasi: 0-5 pe frm_date_factura (vechi), 6-11 pe frm_facturare_articole2 (unificat). Fereastra vfp9 e mutata
# off-screen de harness, capturile se fac cu PrintWindow, fara input real (masina e partajata).
$ErrorActionPreference = 'Stop'
$Teste = $PSScriptRoot
& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') `
-TestPrg (Join-Path $Teste 'test_s3_tipdoc_ui.prg') `
-Steps @('vechi_deschis','vechi_proforma','vechi_fara_schimbare','vechi_iesire_serie','vechi_cautare_client','vechi_inchis', `
'nou_deschis','nou_proforma','nou_fara_schimbare','nou_iesire_serie','nou_cautare_client','nou_inchis') `
-SyncDir (Join-Path $Teste 'uisync') `
-ShotsDir (Join-Path $Teste 'screenshots_tipdoc')

View File

@@ -0,0 +1,343 @@
* test_s3_validare_antet.prg
* Headless: paritatea validarii antetului (inainte_de_do_termin) intre calea veche (frm_date_factura /
* frm_date_aviz) si formularul unificat (frm_facturare_articole2 -> oAntetFacturare.valideaza_antet din
* ofacturare_antet.prg). amessagebox si facturi_duplicate sunt inlocuite de mock_validare_antet.prg (jurnal
* al apelurilor + raspuns programat), deci nu se atinge Oracle la verificarea dublurilor.
*
* REZULTAT ASTEPTAT (declarat inainte de rulare):
* A. Pentru fiecare caz (tip, stricaciune) se construieste ACELASI poDate valid, i se strica EXACT campul
* cazului, se creeaza formularul vechi si unificatul si se apeleaza inainte_de_do_termin() pe fiecare.
* Se compara: jurnalul apelurilor (mesaj + tip + titlu; facturi_duplicate cu contul), valoarea intoarsa
* si erorile VFP. Pe unificat, cand antetul TRECE, metoda continua cu validarea articolelor existenta in
* prototip (cursor crsfactura gol -> "Nu ati ales articolele ..." si Return .F.); de aceea pentru cazurile
* care trec se compara separat: pe vechi inainte_de_do_termin() = .T., pe unificat
* oAntet.valideaza_antet(form) = .T. si jurnalul unificat = jurnalul vechi + mesajul de articole.
* B. Cazuri obligatorii (nota S3, Pasul 3): dataireg gol (1 si 21); id_client gol pe 1 (mesaj) si pe 21
* (fara mesaj - trece); id_pol gol pe 23 (mesaj) si pe 21 (fara); listaid gol pe 2 ("contractul") si pe
* 26 ("contractul"); duplicat pe cont 4111 (tip 1) vs 418 (tip 21) - se verifica ARGUMENTUL primit de
* facturi_duplicate prin mock. Plus: fiecare Case din ambele surse, ordinea (doua campuri stricate ->
* mesajul primului Case), copierea (lCopiere), avertismentul "CLIENT ... BON FISCAL" pe factura.
* C. Asteptat: toate cazurile IDENTIC (mesaj, tip, titlu, ordine, Return) intre vechi si unificat; contul
* din facturi_duplicate = '4111' pe factura, '418' pe aviz.
* D. Netestabil headless: SetFocus pe controlul invalid (fara Show). Daca ridica eroare (ex. 1925 pe un control
* eliminat de Init), eroarea e parte din amprenta si trebuie sa fie identica pe ambele cai - inclusiv pe
* unificat, unde vine din oAntet prin metoda formularului (asta cere ca frm_facturare_articole2 sa NU aiba
* override Error: un Error cu cod, chiar DoDefault(), o inghitea - C6 bis). Asert explicit pe tip 1
* COPIERE_DESCR_GOL.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3_validare_antet.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_validare_antet.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 1.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gcCaz, gcErr, gcMockApeluri, gnMockRaspuns, gcMockDuplicat
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_validare_antet.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
gcCaz = ""
gcErr = ""
gcMockApeluri = ""
gnMockRaspuns = 6
gcMockDuplicat = ""
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
LOCAL lcProc
lcProc = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", &lcProc
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
gnScadereStoc = 1
DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) + " gnScadereStoc=" + TRANSFORM(gnScadereStoc)
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
DO Assert WITH TYPE('CREATEOBJECT("oAntetFacturare")') = 'O', "oAntetFacturare instantiabil"
gcMockApeluri = ""
facturi_duplicate('X', 0, '', 0, '')
DO Assert WITH "facturi_duplicate(X" $ gcMockApeluri, "mock facturi_duplicate activ"
gcMockApeluri = ""
amessagebox("proba", 48, "T")
DO Assert WITH "amessagebox([proba]" $ gcMockApeluri, "mock amessagebox activ"
DO AfLog WITH "asertiuni initiale: pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " erori=[" + gcErr + "]"
gcErr = ""
PRIVATE poDate, poGeneratorNumere, plVizibil, poDateGestiuneDest
plVizibil = .F.
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poDateGestiuneDest = CREATEOBJECT("oDateGestiune")
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
PUBLIC gnIdClient1
gnIdClient1 = 0
IF SQLEXEC(gnHandle, "select min(id_part) as id1 from nom_parteneri", "crsclient") > 0
gnIdClient1 = NVL(crsclient.id1, 0)
USE IN crsclient
ENDIF
DO AfLog WITH "client de test: " + TRANSFORM(gnIdClient1)
* ---- cazuri: tip, stricaciune, asteptat (TRECE = antetul trece; altfel fragmentul de mesaj asteptat) ----
DO Caz WITH 1, "VALID", "TRECE"
DO Caz WITH 21, "VALID", "TRECE"
DO Caz WITH 1, "DATAIREG_GOL", "Nu ati completat data inregistrarii!"
DO Caz WITH 21, "DATAIREG_GOL", "Nu ati completat data inregistrarii!"
DO Caz WITH 1, "DATAACT_GOL", "Nu ati completat data documentului!"
DO Caz WITH 21, "DATAACT_GOL", "Nu ati completat data documentului!"
DO Caz WITH 1, "DATASCAD_GOL", "Nu ati completat data scadenta!"
DO Caz WITH 21, "DATASCAD_GOL", "TRECE"
DO Caz WITH 1, "IDFDOC_GOL", "Nu ati ales felul documentului!"
DO Caz WITH 21, "IDFDOC_GOL", "Nu ati ales felul documentului!"
DO Caz WITH 5, "ZICURS_GOL", "Nu ati completat ziua cursului valutar!"
DO Caz WITH 5, "IDVALUTA_GOL", "Nu ati completat valuta!"
DO Caz WITH 1, "NRACT_GOL", "Nu ati completat numarul documentului!"
DO Caz WITH 21, "NRACT_GOL", "Nu ati completat numarul documentului!"
DO Caz WITH 1, "DATAIREG_ALTA_LUNA", "Data inregistrarii trebuie sa fie din luna"
DO Caz WITH 21, "DATAIREG_ALTA_LUNA", "Data inregistrarii trebuie sa fie din luna"
DO Caz WITH 1, "DATASCAD_MICA", "Data scadenta trebuie sa fie mai mare"
DO Caz WITH 1, "DATAACT_MARE", "Data documentului trebuie sa fie mai mica"
DO Caz WITH 21, "DATAACT_MARE", "Data documentului trebuie sa fie mai mica"
DO Caz WITH 1, "IDCLIENT_GOL", "Nu ati ales clientul!"
DO Caz WITH 21, "IDCLIENT_GOL", "TRECE"
DO Caz WITH 7, "DESCRIERE_GOL", "Nu ati ales factura!"
DO Caz WITH 8, "DESCRIERE_GOL", "Nu ati ales factura/facturile pentru care se face returul!"
DO Caz WITH 1, "COPIERE_DESCR_GOL", "Nu ati ales factura de copiat!"
DO Caz WITH 21, "COPIERE_DESCR_GOL", "Nu ati ales avizul de copiat!"
DO Caz WITH 2, "LISTAID_GOL", "Nu ati ales contractul!"
DO Caz WITH 3, "LISTAID_GOL", "Nu ati ales comanda!"
DO Caz WITH 4, "LISTAID_GOL", "Nu ati ales avizul!"
DO Caz WITH 45, "LISTAID_GOL", "Nu ati ales locatia!"
DO Caz WITH 1, "LISTAID_GOL", "TRECE"
DO Caz WITH 26, "LISTAID_GOL", "Nu ati ales contractul!"
DO Caz WITH 21, "LISTAID_GOL", "Nu ati ales comanda!"
DO Caz WITH 23, "LISTAID_GOL", "Nu ati ales gestiunea destinatie!"
DO Caz WITH 41, "LISTAID_GOL", "Nu ati ales gestiunea catre care se face returul!"
DO Caz WITH 22, "LISTAID_GOL", "TRECE"
DO Caz WITH 23, "IDPOL_GOL", "Nu ati ales politica de preturi!"
DO Caz WITH 41, "IDPOL_GOL", "Nu ati ales politica de preturi!"
DO Caz WITH 21, "IDPOL_GOL", "TRECE"
DO Caz WITH 1, "DOUA_DATAIREG_NRACT", "Nu ati completat data inregistrarii!"
DO Caz WITH 21, "DOUA_DATAIREG_NRACT", "Nu ati completat data inregistrarii!"
DO Caz WITH 1, "DUPLICAT_NU", "Facturi dublate"
DO Caz WITH 21, "DUPLICAT_NU", "Avize dublate"
DO Caz WITH 1, "DUPLICAT_DA", "TRECE"
DO Caz WITH 21, "DUPLICAT_DA", "TRECE"
DO Caz WITH 1, "CLIENT_DIVERSI_NU", "in loc de BON FISCAL"
DO Caz WITH 1, "CLIENT_DIVERSI_DA", "TRECE"
DO Final
*----------------------------------------------------------------------------------------
PROCEDURE Caz
LPARAMETERS tnTip, tcStrica, tcAsteptat
LOCAL llAviz, lcVechi, lcNou, llTrece, lcCont
llAviz = INLIST(tnTip, 21, 22, 23, 24, 25, 26, 28, 29, 41, 42, 47)
llTrece = (tcAsteptat == "TRECE")
gcCaz = "[tip=" + TRANSFORM(tnTip) + " " + tcStrica + "] "
lcVechi = Amprenta(tnTip, llAviz, IIF(llAviz, 'frm_date_aviz', 'frm_date_factura'), tcStrica, llTrece)
lcNou = Amprenta(tnTip, llAviz, 'frm_facturare_articole2', tcStrica, llTrece)
IF lcVechi == lcNou
gnPass = gnPass + 1
DO AfLog WITH "OK " + gcCaz + TRANSFORM(OCCURS(CHR(10), lcVechi)) + " linii amprenta"
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL " + gcCaz + "amprente diferite:"
DO DifLinii WITH lcVechi, lcNou
ENDIF
* asteptarea declarata: mesajul (sau trecerea) si contul la dubluri
IF llTrece
DO Assert WITH "RETURN=.T." $ lcVechi, "asteptat: antetul trece (Return .T. pe vechi)"
lcCont = IIF(llAviz, "facturi_duplicate(418,", "facturi_duplicate(4111,")
DO Assert WITH lcCont $ lcVechi, "asteptat: " + lcCont + " in jurnal"
ELSE
DO Assert WITH tcAsteptat $ lcVechi, "asteptat mesajul [" + tcAsteptat + "] in jurnal"
DO Assert WITH "RETURN=.F." $ lcVechi, "asteptat: Return .F."
ENDIF
ENDPROC
FUNCTION Amprenta
LPARAMETERS tnTip, tlAviz, tcClasa, tcStrica, tlTrece
LOCAL loF, lcA, llR, llAntet, lcJurnalAntet
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", 25000 + tnTip, tnTip)
poDate.nIdTipDoc = IIF(tlAviz, poDate.nIdTipDocAvizExpeditie, poDate.nIdTipDocFactura)
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
* antet valid
poDate.dataireg = DATE(gnAn, gnLuna, 1)
poDate.dataact = poDate.dataireg
poDate.datascad = poDate.dataact + 1
poDate.zi_curs = poDate.dataact
IF EMPTY(NVL(poDate.id_fdoc, 0))
poDate.id_fdoc = 1
poDate.fdoc = "FEL TEST"
ENDIF
poDate.nract = 77
poDate.serie_act = "TST"
poDate.id_client = gnIdClient1
poDate.nume_client = "PARTENER TEST"
poDate.listaid = "999"
poDate.descriere = "DESCRIERE INITIALA"
poDate.id_pol = 3
IF poDate.in_valuta = 1
poDate.id_valuta = 2
poDate.nume_valuta = "EUR"
ENDIF
gnMockRaspuns = 6
gcMockDuplicat = ""
* stricaciunea cazului
DO CASE
CASE tcStrica == "VALID"
CASE tcStrica == "DATAIREG_GOL"
poDate.dataireg = {}
CASE tcStrica == "DATAACT_GOL"
poDate.dataact = {}
CASE tcStrica == "DATASCAD_GOL"
poDate.datascad = {}
CASE tcStrica == "IDFDOC_GOL"
poDate.id_fdoc = 0
CASE tcStrica == "ZICURS_GOL"
poDate.zi_curs = {}
CASE tcStrica == "IDVALUTA_GOL"
poDate.id_valuta = 0
CASE tcStrica == "NRACT_GOL"
poDate.nract = 0
CASE tcStrica == "DATAIREG_ALTA_LUNA"
poDate.dataireg = GOMONTH(DATE(gnAn, gnLuna, 1), 1)
poDate.dataact = poDate.dataireg
poDate.datascad = poDate.dataact + 1
CASE tcStrica == "DATASCAD_MICA"
poDate.datascad = poDate.dataact - 1
CASE tcStrica == "DATAACT_MARE"
poDate.dataireg = DATE(gnAn, gnLuna, 1)
poDate.dataact = poDate.dataireg + 1
poDate.datascad = poDate.dataact + 1
CASE tcStrica == "IDCLIENT_GOL"
poDate.id_client = 0
CASE tcStrica == "DESCRIERE_GOL" OR tcStrica == "COPIERE_DESCR_GOL"
poDate.descriere = ""
CASE tcStrica == "LISTAID_GOL"
poDate.listaid = ""
CASE tcStrica == "IDPOL_GOL"
poDate.id_pol = 0
CASE tcStrica == "DOUA_DATAIREG_NRACT"
poDate.dataireg = {}
poDate.nract = 0
CASE tcStrica == "DUPLICAT_NU"
gcMockDuplicat = "DUBLURA TEST 1"
gnMockRaspuns = 7
CASE tcStrica == "DUPLICAT_DA"
gcMockDuplicat = "DUBLURA TEST 1"
gnMockRaspuns = 6
CASE tcStrica == "CLIENT_DIVERSI_NU"
poDate.nume_client = "CLIENTI DIVERSI"
gnMockRaspuns = 7
CASE tcStrica == "CLIENT_DIVERSI_DA"
poDate.nume_client = "CLIENTI DIVERSI"
gnMockRaspuns = 6
ENDCASE
gcErr = ""
gcMockApeluri = ""
DO AfLog WITH " > " + gcCaz + "creez " + tcClasa
loF = CREATEOBJECT(tcClasa)
IF VARTYPE(loF) <> 'O'
RETURN "CREATEOBJECT " + tcClasa + " ESUAT" + CHR(13) + CHR(10) + gcErr
ENDIF
IF tcStrica == "COPIERE_DESCR_GOL"
loF.lCopiere = .T.
ENDIF
gcErr = ""
gcMockApeluri = ""
lcA = ""
IF tlTrece AND tcClasa == 'frm_facturare_articole2'
* pe unificat antetul trece si se continua cu articolele: se izoleaza validarea de antet
llAntet = loF.oAntet.valideaza_antet(loF)
lcJurnalAntet = gcMockApeluri
lcA = "RETURN=" + TRANSFORM(llAntet) + CHR(13) + CHR(10) + "JURNAL:" + CHR(13) + CHR(10) + lcJurnalAntet
lcA = lcA + "ERORI:" + CHR(13) + CHR(10) + gcErr
gcMockApeluri = ""
gcErr = ""
llR = loF.inainte_de_do_termin()
DO Assert WITH llR = .F. AND "Nu ati ales articolele" $ gcMockApeluri, "unificat: dupa antet valid se ajunge la validarea articolelor (crsfactura gol)"
* erorile corpului de articole (prototip, perimetrul S4: ex. grd_articole inexistent) se logheaza, nu se compara
DO AfLog WITH " > " + gcCaz + "unificat inainte_de_do_termin: " + TRANSFORM(llR) + " | " + STRTRAN(gcMockApeluri, CHR(13) + CHR(10), " ") + " | erori articole: " + STRTRAN(gcErr, CHR(13) + CHR(10), "; ")
gcErr = ""
ELSE
llR = loF.inainte_de_do_termin()
lcA = "RETURN=" + TRANSFORM(llR) + CHR(13) + CHR(10) + "JURNAL:" + CHR(13) + CHR(10) + gcMockApeluri
IF tcClasa == 'frm_facturare_articole2' AND tnTip = 1 AND tcStrica == "COPIERE_DESCR_GOL"
* ct_clb_altele e eliminat de Init pe tip 1 (gnScadereStoc=1, fara copiere): SetFocus da 1925 pe ambele
* cai; pe unificat eroarea vine din oAntet prin metoda formularului si trebuie sa ajunga la ON ERROR
* (fara override Error pe frm_facturare_articole2)
DO Assert WITH "1925" $ gcErr, "eroarea din oAntet apelat prin inainte_de_do_termin ajunge la ON ERROR"
ENDIF
lcA = lcA + "ERORI:" + CHR(13) + CHR(10) + gcErr
ENDIF
loF.Release()
RELEASE loF
IF poDate.rezultat_serii <> 0
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
ENDIF
RETURN lcA
ENDFUNC
PROCEDURE DifLinii
LPARAMETERS tcV, tcN
LOCAL laV[1], laN[1], lnV, lnN, i, lnMax
lnV = ALINES(laV, tcV)
lnN = ALINES(laN, tcN)
lnMax = MAX(lnV, lnN)
FOR i = 1 TO lnMax
IF i > lnV OR i > lnN OR !(laV[i] == laN[i])
DO AfLog WITH " vechi: " + IIF(i <= lnV, laV[i], "<lipsa>")
DO AfLog WITH " nou : " + IIF(i <= lnN, laN[i], "<lipsa>")
ENDIF
ENDFOR
ENDPROC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL: " + gcCaz + tcMsg
ENDIF
ENDPROC
PROCEDURE AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + CHR(13) + CHR(10)
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,342 @@
* test_s3b_dupa_ui.prg
* UI VIZIBIL: capturi "DUPA" pe frm_facturare_articole2 (COMUN\clase\ofacturare.vc2), dupa
* aplatizarea chenarelor (BorderWidth=0 pe containere, confirmata in binar). Copie a
* test_s3b_referinta_ui.prg cu ACELASI mediu / aceiasi 4 pasi / aceleasi etichete de pas, dar cu
* iesirile in fisiere separate (nu suprascrie referinta) ca sa poata fi comparate una langa alta.
*
* Rulare: powershell -ExecutionPolicy Bypass -File test_s3b_dupa_ui.ps1 (timeout >= 300s)
* Log: facturare_unificat\test_s3b_dupa_ui_log.txt ; capturi in screenshots_dupa\ ;
* geometrie in out\geom_dupa_<eticheta>.tsv
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcUILog, gcSyncDir, gnFail, gnPass
gcUILog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3b_dupa_ui_log.txt"
gcSyncDir = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\uisync_dupa\"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
gnFail = 0
gnPass = 0
PUBLIC gcRaport
gcRaport = ""
ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out")
MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out"
ENDIF
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", "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.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
* seriile de facturi (tipdoc 5) si de incasare (3/16/26) sunt pe utilizator in MARIUSM_AUTO
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
DO AfLog WITH "gnScadereStoc=" + TRANSFORM(gnScadereStoc)
* gridextras.vcx e referit din ofacturare.vcx cu cale relativa, rezolvabila doar din exe/IDE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
* grd_factura.cCodMat.cboCodmat e declarat AS combosql OF cautare.vcx, dar clasa e in _cb_base.vcx
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
* cboTipFactura (RowSourceType=3) citeste cursorul local saft_tip_facturi ca pe un tabel -
* fara el deschis explicit, Createobject('frm_facturare_articole2') da "File 'saft_tip_facturi.dbf' does not exist"
IF !USED('saft_tip_facturi')
update_saft_tip_facturi()
ENDIF
PRIVATE poDate, poGeneratorNumere, loForm, lcTsv, lcRaportFile
lcRaportFile = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_dupa_raport.txt"
* document nou: poDate.incasat ramane 0 la construire - identic Scenariul A din test_s3b_incasare_nealocare.prg
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)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poGeneratorNumere.ResetNumere()
DO ProbaSerii WITH poDate.nIdTipDoc
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
DO Final
ENDIF
DO Assert WITH ObjExists(loForm, 'opt_incasat'), "opt_incasat prezent (poDate.tip intre 1 si 4, deci grupul de incasare exista)"
loForm.WindowType = 0
loForm.Show()
loForm.WindowState = 2
DOEVENTS FORCE
* pas0: stare initiala dupa Createobject - ambele acordeoane plaite (lalte_date_deschis=.F., lincasare_deschis=.F. by design)
DO AfLog WITH "PAS0 stare initiala: lalte_date_deschis=" + TRANSFORM(loForm.lalte_date_deschis) + " lincasare_deschis=" + TRANSFORM(loForm.lincasare_deschis)
lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_dupa_stare_initiala.tsv"
DO DumpSiAnalizeaza WITH loForm, "stare initiala (ambele plaite)", lcTsv
DO DumpGrilaRecursiv WITH loForm, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_grila_stare_initiala.tsv"
DO HarnessStep WITH 0, 'stare_initiala', 6
* pas1: Alte date deschis - caseta se seteaza INAINTE de comutare (metoda citeste caseta)
loForm.chk_alte_date.Value = 1
loForm.do_comuta_alte_date()
DOEVENTS FORCE
DO AfLog WITH "PAS1 alte date deschis: lalte_date_deschis=" + TRANSFORM(loForm.lalte_date_deschis) + " lincasare_deschis=" + TRANSFORM(loForm.lincasare_deschis)
lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_dupa_alte_date.tsv"
DO DumpSiAnalizeaza WITH loForm, "Alte date deschis", lcTsv
DO DumpGrilaRecursiv WITH loForm, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_grila_alte_date.tsv"
DO HarnessStep WITH 1, 'alte_date_deschis', 6
* pas2: Alte date inchis la loc, Incasare deschis
* bifarea casetei aloca o chitanta reala in MARIUSM_AUTO - vezi curatenia de dinainte de Release
loForm.chk_alte_date.Value = 0
loForm.do_comuta_alte_date()
loForm.chk_incasare.Value = 1
loForm.do_comuta_incasare()
DOEVENTS FORCE
DO AfLog WITH "PAS2 incasare deschis: lalte_date_deschis=" + TRANSFORM(loForm.lalte_date_deschis) + " lincasare_deschis=" + TRANSFORM(loForm.lincasare_deschis)
lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_dupa_incasare.tsv"
DO DumpSiAnalizeaza WITH loForm, "Incasare deschis", lcTsv
DO DumpGrilaRecursiv WITH loForm, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_grila_incasare.tsv"
DO HarnessStep WITH 2, 'incasare_deschis', 6
* pas3: Alte date deschis din nou - ambele deschise simultan
loForm.chk_alte_date.Value = 1
loForm.do_comuta_alte_date()
DOEVENTS FORCE
DO AfLog WITH "PAS3 ambele deschise: lalte_date_deschis=" + TRANSFORM(loForm.lalte_date_deschis) + " lincasare_deschis=" + TRANSFORM(loForm.lincasare_deschis)
lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_dupa_ambele.tsv"
DO DumpSiAnalizeaza WITH loForm, "Ambele deschise", lcTsv
DO DumpGrilaRecursiv WITH loForm, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_grila_ambele.tsv"
DO HarnessStep WITH 3, 'ambele_deschise', 6
STRTOFILE(gcRaport, lcRaportFile)
DO AfLog WITH "Raport geometrie scris in " + lcRaportFile
* curatenie obligatorie: bifarea casetei la pasul 2 a alocat o chitanta reala in MARIUSM_AUTO,
* iar debifarea ruleaza ramura "fara incasare", care dezaloca 16/3/26
loForm.chk_incasare.Value = 0
loForm.do_comuta_incasare()
DO Assert WITH loForm.nmod_incasare() = 1, "dupa curatenie: nmod_incasare()=1 (fara incasare)"
loForm.Release()
RELEASE loForm
DO Final
*----------------------------------------------------------------------------------------
PROCEDURE DumpSiAnalizeaza
* Parcurge Thisform.Objects (top-level, fara recursie in containere) - dupa S7 NU mai vede cele
* 30 de controale mutate in ct_document/ct_contabilitate/ct_livrare/ct_incasare; harta completa
* e cea scrisa de DumpGrilaRecursiv. Scrie .tsv cu
* Name/Class/Left/Top/Width/Height/Visible pentru fiecare obiect cu geometrie, apoi
* calculeaza suprapuneri (2D), iesire din zona utila a formularului si perechi lipite
* (<4px) pe orizontala/verticala, doar intre controale Visible=.T. Adauga sectiunea la gcRaport.
LPARAMETERS toForm, tcEticheta, tcTsvPath
LOCAL i, j, loO, lcOut, lnN, lnCount, llVis
LOCAL ARRAY laN[400], laC[400], laL[400], laT[400], laW[400], laH[400], laV[400]
lnN = 0
lcOut = "Name" + CHR(9) + "Class" + CHR(9) + "Left" + CHR(9) + "Top" + CHR(9) + "Width" + CHR(9) + "Height" + CHR(9) + "Visible" + CHR(13) + CHR(10)
lnCount = toForm.Objects.Count
FOR i = 1 TO lnCount
loO = toForm.Objects(i)
IF TYPE('loO.Left') = 'N' AND TYPE('loO.Top') = 'N' AND TYPE('loO.Width') = 'N' AND TYPE('loO.Height') = 'N' AND lnN < 400
llVis = IIF(TYPE('loO.Visible') = 'L', loO.Visible, .T.)
lnN = lnN + 1
laN[lnN] = loO.Name
laC[lnN] = loO.Class
laL[lnN] = loO.Left
laT[lnN] = loO.Top
laW[lnN] = loO.Width
laH[lnN] = loO.Height
laV[lnN] = llVis
lcOut = lcOut + loO.Name + CHR(9) + loO.Class + CHR(9) + TRANSFORM(loO.Left) + CHR(9) + TRANSFORM(loO.Top) + CHR(9) + TRANSFORM(loO.Width) + CHR(9) + TRANSFORM(loO.Height) + CHR(9) + TRANSFORM(llVis) + CHR(13) + CHR(10)
ENDIF
ENDFOR
STRTOFILE(lcOut, tcTsvPath)
DO AfLog WITH "GEOMETRIE [" + tcEticheta + "]: " + TRANSFORM(lnN) + " controale cu geometrie din " + TRANSFORM(lnCount) + " obiecte totale -> " + tcTsvPath
LOCAL lnAL, lnAT, lnAR, lnAB, lnBL, lnBT, lnBR, lnBB, lnOvX, lnOvY, lnGap
LOCAL lcSectiune
lcSectiune = "=== " + tcEticheta + " (forma " + TRANSFORM(toForm.Width) + "x" + TRANSFORM(toForm.Height) + ") ===" + CHR(13) + CHR(10)
FOR i = 1 TO lnN
IF !laV[i]
LOOP
ENDIF
lnAL = laL[i]
lnAT = laT[i]
lnAR = laL[i] + laW[i]
lnAB = laT[i] + laH[i]
IF lnAL < 0 OR lnAT < 0 OR lnAR > toForm.Width OR lnAB > toForm.Height
lcSectiune = lcSectiune + "IESIT: " + laN[i] + " (" + laC[i] + ") Left=" + TRANSFORM(lnAL) + " Top=" + TRANSFORM(lnAT) + " Right=" + TRANSFORM(lnAR) + " Bottom=" + TRANSFORM(lnAB) + CHR(13) + CHR(10)
ENDIF
FOR j = i + 1 TO lnN
IF !laV[j]
LOOP
ENDIF
lnBL = laL[j]
lnBT = laT[j]
lnBR = laL[j] + laW[j]
lnBB = laT[j] + laH[j]
lnOvX = MIN(lnAR, lnBR) - MAX(lnAL, lnBL)
lnOvY = MIN(lnAB, lnBB) - MAX(lnAT, lnBT)
IF lnOvX > 0 AND lnOvY > 0
lcSectiune = lcSectiune + "SUPRAPUNERE: " + laN[i] + " (" + laC[i] + ") x " + laN[j] + " (" + laC[j] + ") " + TRANSFORM(lnOvX) + "x" + TRANSFORM(lnOvY) + "px" + CHR(13) + CHR(10)
ELSE
IF lnOvY > 0 AND lnOvX <= 0 AND -lnOvX < 4
lnGap = -lnOvX
lcSectiune = lcSectiune + "LIPIT-ORIZ: " + laN[i] + " - " + laN[j] + " gap=" + TRANSFORM(lnGap) + "px" + CHR(13) + CHR(10)
ENDIF
IF lnOvX > 0 AND lnOvY <= 0 AND -lnOvY < 4
lnGap = -lnOvY
lcSectiune = lcSectiune + "LIPIT-VERT: " + laN[i] + " - " + laN[j] + " gap=" + TRANSFORM(lnGap) + "px" + CHR(13) + CHR(10)
ENDIF
ENDIF
ENDFOR
ENDFOR
gcRaport = gcRaport + lcSectiune + CHR(13) + CHR(10)
ENDPROC
PROCEDURE DumpGrilaRecursiv
* Harta de geometrie recursiva: coboara in .Objects pe oricate niveluri (containere compozite
* clb_tx_simplu / ct_clb_cautare / etc.), scrie Name ca traseu punctat de la formular
* (Ct_clb_agent.clb_tx_cautare.Lb_simplu1), plus AbsLeft/AbsTop absolute fata de formular
* si Caption/Value taiat la 40 caractere - necesare ca sa se detecteze suprapunerile si
* textele taiate din interiorul containerelor, invizibile in harta plata geom_dupa_*.tsv.
LPARAMETERS toForm, tcTsvPath
LOCAL lcOut
lcOut = "Name" + CHR(9) + "Class" + CHR(9) + "Left" + CHR(9) + "Top" + CHR(9) + "Width" + CHR(9) + "Height" + CHR(9) + "Visible" + CHR(9) + "AbsLeft" + CHR(9) + "AbsTop" + CHR(9) + "Caption" + CHR(13) + CHR(10)
lcOut = lcOut + ColectGrila(toForm, "", 0, 0, 0, .T.)
STRTOFILE(lcOut, tcTsvPath)
DO AfLog WITH "GEOMETRIE-GRILA: scris " + tcTsvPath
ENDPROC
FUNCTION ColectGrila
* Recursie pe .Objects (nu PEMSTATUS) - garda Type('loO.Left')='N' fiindca nu orice membru
* are geometrie (separatoare, columns de grid etc. nu ajung aici, gridurile nu au .Objects).
* coloana Visible e vizibilitatea EFECTIVA (proprie AND a parintelui) - un copil dintr-un
* container ascuns are Visible propriu .T. dar nu se deseneaza.
LPARAMETERS toContainer, tcPrefix, tnParentAbsLeft, tnParentAbsTop, tnDepth, tlParentVisEff
LOCAL i, loO, lcName, lnAbsL, lnAbsT, lcCaption, llVisEff, lcVisTxt, lcOut
IF tnDepth > 15
RETURN ""
ENDIF
lcOut = ""
FOR i = 1 TO toContainer.Objects.Count
loO = toContainer.Objects(i)
IF TYPE('loO.Left') = 'N' AND TYPE('loO.Top') = 'N' AND TYPE('loO.Width') = 'N' AND TYPE('loO.Height') = 'N'
lcName = IIF(EMPTY(tcPrefix), loO.Name, tcPrefix + "." + loO.Name)
lnAbsL = tnParentAbsLeft + loO.Left
lnAbsT = tnParentAbsTop + loO.Top
lcCaption = ""
IF TYPE('loO.Caption') = 'C'
lcCaption = loO.Caption
ELSE
IF TYPE('loO.Value') = 'C'
lcCaption = loO.Value
ENDIF
ENDIF
lcCaption = STRTRAN(lcCaption, CHR(9), " ")
lcCaption = LEFT(lcCaption, 40)
llVisEff = IIF(TYPE('loO.Visible') = 'L', loO.Visible, .T.) AND tlParentVisEff
lcVisTxt = TRANSFORM(llVisEff)
lcOut = lcOut + lcName + CHR(9) + loO.Class + CHR(9) + TRANSFORM(loO.Left) + CHR(9) + TRANSFORM(loO.Top) + CHR(9) + TRANSFORM(loO.Width) + CHR(9) + TRANSFORM(loO.Height) + CHR(9) + lcVisTxt + CHR(9) + TRANSFORM(lnAbsL) + CHR(9) + TRANSFORM(lnAbsT) + CHR(9) + lcCaption + CHR(13) + CHR(10)
IF TYPE('loO.Objects.Count') = 'N'
lcOut = lcOut + ColectGrila(loO, lcName, lnAbsL, lnAbsT, tnDepth + 1, llVisEff)
ENDIF
ENDIF
ENDFOR
RETURN lcOut
ENDFUNC
PROCEDURE ProbaSerii
* apel direct al procedurii Oracle din creeaza_cursor_serii: logheaza eroarea reala (goExecutor
* ar deschide amessagebox modal, care agata rularea headless) si incalzeste starea pachetului
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
FUNCTION ObjExists
* Cautare RECURSIVA: dupa S7 controalele de sub grila nu mai sunt in Thisform.Objects, ci in
* containerele lor - o cautare plata ar raporta tacut "lipseste".
LPARAMETERS toContainer, tcName
LOCAL i, loO
FOR i = 1 TO toContainer.Objects.Count
loO = toContainer.Objects(i)
IF UPPER(loO.Name) == UPPER(tcName)
RETURN .T.
ENDIF
IF TYPE('loO.Objects.Count') = 'N'
IF ObjExists(loO, tcName)
RETURN .T.
ENDIF
ENDIF
ENDFOR
RETURN .F.
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), gcUILog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gnFail = gnFail + 1
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail)
DO AfLog WITH "END " + TTOC(DATETIME())
DO HarnessDone WITH 'done'
QUIT
ENDPROC

View File

@@ -0,0 +1,12 @@
# test_s3b_dupa_ui.ps1 - wrapper peste harness-ul generic (vfp_ui_harness.ps1) pentru
# test_s3b_dupa_ui.prg. Capturi "DUPA" pe frm_facturare_articole2 (ofacturare.vc2), dupa
# aplatizarea chenarelor - aceiasi 4 pasi si aceleasi nume de fisiere PNG ca la referinta, dar in
# folder separat (screenshots_dupa\), ca sa nu suprascrie screenshots_referinta\.
# Rulare: powershell -ExecutionPolicy Bypass -File test_s3b_dupa_ui.ps1 (timeout >= 300s)
$ErrorActionPreference = 'Stop'
$Teste = $PSScriptRoot
& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') `
-TestPrg (Join-Path $Teste 'test_s3b_dupa_ui.prg') `
-Steps @('stare_initiala','alte_date_deschis','incasare_deschis','ambele_deschise') `
-SyncDir (Join-Path $Teste 'uisync_dupa') `
-ShotsDir (Join-Path $Teste 'screenshots_dupa')

View File

@@ -0,0 +1,807 @@
* test_s3b_emitere_paritate_2.prg
* Continuare a test_s3b_emitere_reala.prg (docs\raport_s3b_emitere_reala.md) si a notei care l-a
* corectat (docs\nota_verificare_emitere_reala.md): acolo singura combinatie care a scris REAL in
* VANZARI a fost tnTip=22 (AVIZ) + tip incasare 1 (Fara incasare) - orice incasare reala pe AVIZ
* (tip 2/3/4) intorcea poDate.nid_vanzare=9999999999 (sentinela), fara rand nou in VANZARI.
*
* CAUZA GASITA (verificata direct in sursa PL/SQL, PACK_FACTURARE PACKAGE BODY, MARIUSM_AUTO):
* - scrie_factura2 (linia ~4886) apeleaza contabilizeaza_articol() pentru fiecare linie, care la
* randul ei alege contul de debit dupa pack_facturare.ntip (linia ~6266):
* WHEN ntip <= 20 OR ntip IN (nTipFacturaHotel,nTipFacturaRestaurant,nTipNotaPlata,
* nTipVanzareRetail,48,49,51,52) THEN V_SCD := scd_articol -- 4111, cont client normal
* WHEN ntip IN (28,29) THEN V_SCD := '461' -- aviz catre clienti debitori
* ELSE V_SCD := '418' -- aviz, cont DIFERIT
* AVIZ (ntip=22) cade pe ramura ELSE -> cont 418, nu 4111.
* - scrie_incasari() posteaza incasarea pe contul standard de creanta client (4111-style), asteptat
* de pack_contafin.verifica_note_contabile(1) sa se stinga cu nota de vanzare a documentului.
* Cand documentul insusi a postat pe 418 (nu 4111), cele doua note nu se compenseaza -> notele nu
* se balanseaza -> scrie_factura2 (linia ~5064) ia ramura "IF verifica_note_contabile(1)>0":
* V_ID_VANZARE:=NULL, deschide V_CURSOR_VERIFICARE in loc sa finalizeze. In VFP
* (ofacturare.vc2:14404/20126), asta declanseaza "Do Form verificare" (real, modal) - inlocuit
* aici cu acelasi stub_verificare deja folosit ("gnButon=1" in Init). Chiar cu stub-ul confirmand,
* poDate.nid_vanzare a ramas la valoarea implicita din clasa (ofacturare_comun.prg:186,
* nid_vanzare=9999999999) - document NESCRIS.
* - FACTURA normala (ntip<=20, deci Tip=1) intra pe ramura ntip<=20 -> cont 4111, acelasi cont pe
* care il asteapta scrie_incasari() -> notele se balanseaza -> scrie_factura2 finalizeaza direct,
* fara sa mai treaca prin verificare.
*
* FIX DE TEST (nu de productie): sursa articolelor ramane cursor_preturi cu tnTip=22 (singura care
* intoarce randuri reale in acest mediu, RAJA id_part=463 - probe_emitere_reala.prg), dar poDate.Tip
* se suprascrie pe 1 (FACTURA) DUPA ce crsfactura e deja populat (do_adauga_tot/do_calculeaza_totaluri)
* si INAINTE de do_scrie_articole()/do_termin() - exact acelasi tipar deja folosit in productie pentru
* bonul fiscal de magazin ("hacuiesc Tip = 43 ... apoi pun tipul la loc", ofacturare.vc2:14247-14259):
* acolo poDate.Tip controleaza ce se scrie in VANZARI_DETALII_TEMP.TIP (deci pack_facturare.ntip),
* independent de sursa preturilor. poDate.nIdTipDoc NU se suprascrie (ramane 5=FACTURA, valoarea
* implicita din clasa, deja dovedita ca aloca numere reale in test_s3b_paritate_emitere.prg) - deci
* seria/numerotarea documentului e cea de FACTURA, consistenta cu Tip=1.
*
* Verificat, nu presupus: pentru fiecare document se citeste randul din VANZARI dupa scriere (nu doar
* raspunsul VFP) si se compara MAX(ID_VANZARE)/COUNT(*) inainte/dupa fiecare rulare.
*
* SECVENTIAL: intai toate 4 tipurile de incasare pe formularul VECHI (frm_alte_date, prin driverul pe
* Timer, mecanism identic cu test_s3b_emitere_reala.prg), apoi (intr-un bloc separat, cu Release()
* complet inainte) o incercare pe formularul NOU (frm_facturare_articole2) - cunoscut ca hangs la
* CREATEOBJECT pe coloana Gestiune a grilei (docs\raport_s3b_emitere_reala.md sectiunea 3); daca se
* manifesta din nou, ramane documentat aici, nu ocolit tacit.
*
* CONSUMA DATE REALE: fiecare document scris ramane in VANZARI (client 463, RAJA); tipurile 2/3/4
* aloca si numere reale de chitanta/bon fiscal/pos (seriile 16/3/26). Niciun rollback, nicio stergere.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3b_emitere_paritate_2.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3b_emitere_paritate_2.log
*
* 26.08.2026: blocaj "Do Form verificare" pe formularul REAL (bucla messagebox REZULTATE VERIFICARI +
* CATCH 103). Cauza: test_init_env_auto_roafacturare.prg:81 "SET PATH TO &lcPath ADDITIVE" are lcPath
* terminat in backslash, care inghite cuvantul ADDITIVE (ultimul element devine "COMUNROA\ ADDITIVE")
* si INLOCUIESTE path-ul, stergand stub_verificare de pe prima pozitie - asa ca verificare.scx se
* rezolva la COMUN\FERESTRE (real). Fix test: re-asertare "SET PATH TO stub;" + SET('PATH') dupa
* test_init_env + in driver eliberare DIRECTA (Release) a _FRMBASE in loc de do_termin, cu garda
* glVerifTratatAD (plasa de siguranta anti-bucla).
SET SAFETY OFF
SET TALK OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET DECIMALS TO 4
SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcLog, gnPass, gnFail
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3b_emitere_paritate_2.log"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcLog)
gnPass = 0
gnFail = 0
ON ERROR DO S3bErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
TRY
LOCAL lcAppPathLocal, lcSql
lcAppPathLocal = "D:\ROA\ROAFACTURARE\"
*-- stub_verificare PRIMUL (SET PATH plain, nu ADDITIVE) - vezi test_s3b_emitere_reala.prg
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 S3bLog WITH 'EROARE: conectare Oracle esuata'
DO S3bFinal
ENDIF
DO S3bLog WITH 'test_init_env_auto_roafacturare OK, gnHandle=' + TRANSFORM(gnHandle)
*-- goLog scrie fiecare SQL trimis prin oExecute/oExecuta, dar numai daca fisierul exista deja
PUBLIC gcSqlTrace
gcSqlTrace = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\sql_trace_2.log"
STRTOFILE("", gcSqlTrace)
IF TYPE('goLog') = 'O'
goLog.cLogFile = gcSqlTrace
ENDIF
IF TYPE('poLog') = 'O'
poLog.cLogFile = gcSqlTrace
ENDIF
*-- fara asta, un lacat Oracle 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
SET PATH TO (lcAppPathLocal + "COMUN\utile\gridextras") ADDITIVE
SET CLASSLIB TO gridextras.vcx ADDITIVE
SET CLASSLIB TO _cb_base.vcx ADDITIVE
DO S3bLog WITH 'SET CLASSLIB suplimentar OK'
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE
DO S3bLog WITH 'mock_amessagebox OK'
*-- CdocGasesteIdVanzare: dovada de scriere pe jonctiunea serie_act + nract
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\lib_comparatie_documente.prg" ADDITIVE
IF !actualizeaza_optiuni_program()
DO S3bLog WITH 'EROARE: actualizeaza_optiuni_program()'
DO S3bFinal
ENDIF
gnScadereStoc = 0
gnModTotFact = 0
gnFactSeturi = 0
gnListareAvizBonFiscal = 0
gnid_part_casa = 0
gnIdUtil = 8
*-- 167: singura sucursala cu plaje pentru chitanta/bon fiscal/pos in acest mediu (16/3/26)
gnIdSucursala = 167
lcSql = [begin pack_contafin.set_id_sucursala(?gnIdSucursala); end;]
goExecutor.oExecuta(lcSql)
DO S3bLog WITH 'actualizeaza_optiuni_program OK, gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ' gnIdSucursala=' + TRANSFORM(gnIdSucursala)
*-- test_init_env:81 "SET PATH TO &lcPath ADDITIVE" (lcPath cu backslash final) inghite cuvantul
*-- ADDITIVE si INLOCUIESTE path-ul, stergand stub_verificare - re-asertare: stub PRIMUL + restul
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\achizitie_import\stub_verificare;" + SET('PATH')
DO S3bLog WITH 'stub_verificare re-asertat PRIMUL in SET PATH'
PUBLIC gcMockUltimMesaj, gnMockUltimTip
gcMockUltimMesaj = ''
gnMockUltimTip = 0
*----- driver: conduce frm_alte_date (singurul modal ramas, doar pe calea veche) -----
PUBLIC goDriverAD, glDlgTratatAD, gnTipIncasareCerut, gnNrIncasareCapturat, gcClaseVazute, gnDrvDeadline, glVerifTratatAD
glDlgTratatAD = .F.
gnTipIncasareCerut = 1
gnNrIncasareCapturat = 0
gcClaseVazute = ';'
gnDrvDeadline = SECONDS() + 20
glVerifTratatAD = .F.
goDriverAD = CREATEOBJECT('driverAlteDateAD')
_SCREEN.AddObject('tmrDrvAD', 'Timer')
_SCREEN.tmrDrvAD.Interval = 200
BINDEVENT(_SCREEN.tmrDrvAD, 'Timer', goDriverAD, 'Executa')
_SCREEN.tmrDrvAD.Enabled = .T.
_SCREEN.Caption = 'S3b - emitere paritate 2 (FACTURA, Tip=1)'
DO S3bLog WITH 'driver+timer pregatiti'
DO S3bLog WITH 'pre-proba plaje: tip3=' + TRANSFORM(RanduriSerii(3)) + ' tip16=' + TRANSFORM(RanduriSerii(16)) + ;
' tip26=' + TRANSFORM(RanduriSerii(26)) + ' tip5(factura)=' + TRANSFORM(RanduriSerii(5))
DO S3bLog WITH CHR(13)+CHR(10) + '===== STARE VANZARI INAINTE ====='
DO LogStareVanzari
CREATE CURSOR crsRezultate (tip_incasare N(1), forma C(10), id_vanzare N(10), cod N(10), ;
serie_act C(10), id_fact N(10), nr_incasare_asteptat N(10), nr_incasat N(10), ;
tip_incasat N(10), suma_incasat N(18,2), serie_incasat C(10), total_cu_tva N(18,2), ;
pret_det N(18,4))
LOCAL laNumeTip[4]
laNumeTip[1] = 'Fara incasare'
laNumeTip[2] = 'Chitanta'
laNumeTip[3] = 'Bon fiscal'
laNumeTip[4] = 'POS Card'
LOCAL lnTip, lnIdVz
*-- FORMA VECHE, toate patru tipurile
FOR lnTip = 1 TO 4
DO S3bLog WITH CHR(13)+CHR(10) + '===== TIP ' + TRANSFORM(lnTip) + ' (' + laNumeTip[lnTip] + ') - FORMA VECHE ====='
lnIdVz = CreeazaDocumentIncasare(lnTip, .F.)
DO InregistreazaRezultat WITH lnTip, 'vechi', lnIdVz
ENDFOR
*-- FORMA NOUA, toate patru tipurile - separat, ca un hang/crash pe una sa nu piarda dovada
*-- celorlalte (log-ul e scris incremental, STRTOFILE cu append, la fiecare pas). TRY/CATCH per
*-- tip, ca o eroare neasteptata (necunoscuta inca pe calea noua) sa nu opreasca tot scriptul
*-- inainte de comparatie si de starea finala VANZARI.
FOR lnTip = 1 TO 4
DO S3bLog WITH CHR(13)+CHR(10) + '===== TIP ' + TRANSFORM(lnTip) + ' (' + laNumeTip[lnTip] + ') - FORMA NOUA ====='
TRY
lnIdVz = CreeazaDocumentIncasare(lnTip, .T.)
DO InregistreazaRezultat WITH lnTip, 'nou', lnIdVz
CATCH TO loExcNou
DO S3bLog WITH ' CATCH forma noua tip=' + TRANSFORM(lnTip) + ' ErrorNo=' + TRANSFORM(loExcNou.ErrorNo) + ;
' Message=' + loExcNou.Message + ' Proc=' + loExcNou.Procedure + ' Line=' + TRANSFORM(loExcNou.LineNo)
IF TYPE('goFrmS3b') = 'O' AND !ISNULL(goFrmS3b)
TRY
goFrmS3b.Release()
CATCH
ENDTRY
ENDIF
goFrmS3b = NULL
DO InregistreazaRezultat WITH lnTip, 'nou', 0
ENDTRY
ENDFOR
DO S3bLog WITH CHR(13)+CHR(10) + '===== COMPARATIE VECHI / NOU, PE TIP ====='
DO ComparaRezultate
DO S3bLog WITH CHR(13)+CHR(10) + '===== STARE VANZARI DUPA ====='
DO LogStareVanzari
_SCREEN.tmrDrvAD.Enabled = .F.
DO S3bFinal
CATCH TO loExc
DO S3bLog WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']'
DO S3bFinal
ENDTRY
QUIT
*==================================================================================
PROCEDURE S3bLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13)+CHR(10), gcLog, 1)
ENDPROC
PROCEDURE S3bErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
DO S3bLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
ENDPROC
PROCEDURE S3bFinal
DO S3bLog WITH CHR(13)+CHR(10) + 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail)
DO S3bLog WITH 'END ' + TTOC(DATETIME())
QUIT
ENDPROC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO S3bLog WITH 'PASS: ' + tcMsg
ELSE
gnFail = gnFail + 1
DO S3bLog WITH 'FAIL: ' + tcMsg
ENDIF
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 S3bLog WITH 'pre-proba plaje tip ' + TRANSFORM(tnIdTipDoc) + ' ESEC: ' + TRANSFORM(laErr[2])
ENDIF
RETURN lnRanduri
ENDFUNC
PROCEDURE LogStareVanzari
LOCAL lnQ
lnQ = goExecutor.oExecute([select max(id_vanzare) as maxid, count(*) as cnt from vanzari], 'crsMaxVz')
IF lnQ > 0
DO S3bLog WITH ' MAX(ID_VANZARE)=' + TRANSFORM(crsMaxVz.maxid) + ' COUNT(*)=' + TRANSFORM(crsMaxVz.cnt)
USE IN crsMaxVz
ELSE
DO S3bLog WITH ' EROARE citire stare VANZARI: ' + goExecutor.oPrelucrareEroare()
ENDIF
lnQ = goExecutor.oExecute([select tip_incasat, max(nr_incasat) as maxnr, count(*) as nr ] + ;
[from vanzari where tip_incasat is not null group by tip_incasat order by tip_incasat], 'crsMaxInc')
IF lnQ > 0
SELECT crsMaxInc
SCAN
DO S3bLog WITH ' tip_incasat=' + TRANSFORM(tip_incasat) + ' max(nr_incasat)=' + TRANSFORM(maxnr) + ' nr_documente=' + TRANSFORM(nr)
ENDSCAN
USE IN crsMaxInc
ELSE
DO S3bLog WITH ' EROARE citire stare incasat: ' + goExecutor.oPrelucrareEroare()
ENDIF
ENDPROC
*-- citeste randul VANZARI scris pentru id_vanzare si-l adauga in crsRezultate
PROCEDURE InregistreazaRezultat
LPARAMETERS tnTip, tcForma, tnIdVz
IF tnIdVz <= 0
DO S3bLog WITH ' ' + tcForma + ' tip=' + TRANSFORM(tnTip) + ': documentul NU s-a scris (id_vanzare=0), fara rand in VANZARI'
INSERT INTO crsRezultate (tip_incasare, forma, id_vanzare) VALUES (tnTip, tcForma, 0)
RETURN
ENDIF
LOCAL lnQ
lnQ = goExecutor.oExecute([select id_vanzare, tip, cod, serie_act, nvl(id_fact,0) as id_fact, ] + ;
[nvl(nr_incasat,0) as nr_incasat, nvl(tip_incasat,0) as tip_incasat, nvl(suma_incasat,0) as suma_incasat, ] + ;
[nvl(serie_incasat,'') as serie_incasat, total_cu_tva, ] + ;
[(select max(nvl(d.pret,0)) from vanzari_detalii d where d.id_vanzare = v.id_vanzare ] + ;
[and nvl(d.sters,0) = 0) as pret_det from vanzari v where v.id_vanzare = ] + TRANSFORM(tnIdVz), 'crsVz1')
IF lnQ <= 0 OR RECCOUNT('crsVz1') <> 1
DO S3bLog WITH ' ' + tcForma + ' tip=' + TRANSFORM(tnTip) + ': EROARE citire VANZARI id_vanzare=' + TRANSFORM(tnIdVz)
INSERT INTO crsRezultate (tip_incasare, forma, id_vanzare) VALUES (tnTip, tcForma, tnIdVz)
RETURN
ENDIF
SELECT crsVz1
INSERT INTO crsRezultate (tip_incasare, forma, id_vanzare, cod, serie_act, id_fact, ;
nr_incasare_asteptat, nr_incasat, tip_incasat, suma_incasat, serie_incasat, total_cu_tva, pret_det) ;
VALUES (tnTip, tcForma, tnIdVz, crsVz1.cod, NVL(crsVz1.serie_act,''), crsVz1.id_fact, ;
gnNrIncasareCapturat, crsVz1.nr_incasat, crsVz1.tip_incasat, crsVz1.suma_incasat, NVL(crsVz1.serie_incasat,''), crsVz1.total_cu_tva, ;
NVL(crsVz1.pret_det,0))
DO S3bLog WITH ' ' + tcForma + ' tip=' + TRANSFORM(tnTip) + ': id_vanzare=' + TRANSFORM(tnIdVz) + ' vanzari.tip=' + TRANSFORM(crsVz1.tip) + ;
' cod=' + TRANSFORM(crsVz1.cod) + ' serie_act=' + TRANSFORM(crsVz1.serie_act) + ' id_fact=' + TRANSFORM(crsVz1.id_fact) + ;
' nr_incasat=' + TRANSFORM(crsVz1.nr_incasat) + ' (asteptat ' + TRANSFORM(gnNrIncasareCapturat) + ') tip_incasat=' + TRANSFORM(crsVz1.tip_incasat) + ;
' suma_incasat=' + TRANSFORM(crsVz1.suma_incasat) + ' serie_incasat=[' + TRANSFORM(crsVz1.serie_incasat) + ']' + ;
' total_cu_tva=' + TRANSFORM(crsVz1.total_cu_tva) + ' pret_det=' + TRANSFORM(NVL(crsVz1.pret_det,0))
USE IN crsVz1
DO Assert WITH crsRezultate.nr_incasat = gnNrIncasareCapturat, ;
'[' + tcForma + ' tip=' + TRANSFORM(tnTip) + '] VANZARI.NR_INCASAT persistat (' + TRANSFORM(crsRezultate.nr_incasat) + ;
') == poDate.nr_incasare capturat inainte de scriere (' + TRANSFORM(gnNrIncasareCapturat) + ')'
DO Assert WITH crsRezultate.pret_det > 0, ;
'[' + tcForma + ' tip=' + TRANSFORM(tnTip) + '] VANZARI_DETALII.PRET nenul (' + ;
TRANSFORM(crsRezultate.pret_det) + ') - linia are pret, nu doar cantitate'
DO Assert WITH crsRezultate.total_cu_tva > 0, ;
'[' + tcForma + ' tip=' + TRANSFORM(tnTip) + '] VANZARI.TOTAL_CU_TVA nenul (' + ;
TRANSFORM(crsRezultate.total_cu_tva) + ') - documentul are valoare, nu doar rand'
ENDPROC
PROCEDURE ComparaRezultate
LOCAL lnTip, lnRVechi, lnRNou
FOR lnTip = 1 TO 4
SELECT crsRezultate
LOCATE FOR tip_incasare = lnTip AND ALLTRIM(forma) == 'vechi'
IF !FOUND()
DO Assert WITH .F., '[tip=' + TRANSFORM(lnTip) + '] rand vechi gasit in crsRezultate'
LOOP
ENDIF
lnRVechi = RECNO()
LOCATE FOR tip_incasare = lnTip AND ALLTRIM(forma) == 'nou'
IF !FOUND()
DO Assert WITH .F., '[tip=' + TRANSFORM(lnTip) + '] rand nou gasit in crsRezultate'
LOOP
ENDIF
lnRNou = RECNO()
LOCAL lnIdVechi, lnIdNou, lnTipIncVechi, lnTipIncNou, lnSumaVechi, lnSumaNou, lcSerieVechi, lcSerieNou
GO lnRVechi IN crsRezultate
lnIdVechi = crsRezultate.id_vanzare
lnTipIncVechi = crsRezultate.tip_incasat
lnSumaVechi = crsRezultate.suma_incasat
lcSerieVechi = crsRezultate.serie_incasat
GO lnRNou IN crsRezultate
lnIdNou = crsRezultate.id_vanzare
lnTipIncNou = crsRezultate.tip_incasat
lnSumaNou = crsRezultate.suma_incasat
lcSerieNou = crsRezultate.serie_incasat
IF lnIdVechi <= 0 OR lnIdNou <= 0
DO Assert WITH .F., '[tip=' + TRANSFORM(lnTip) + '] ambele documente s-au scris (vechi id_vanzare=' + ;
TRANSFORM(lnIdVechi) + ' nou id_vanzare=' + TRANSFORM(lnIdNou) + ')'
LOOP
ENDIF
DO Assert WITH lnTipIncVechi = lnTipIncNou, '[tip=' + TRANSFORM(lnTip) + '] VANZARI.TIP_INCASAT identic (vechi=' + ;
TRANSFORM(lnTipIncVechi) + ' nou=' + TRANSFORM(lnTipIncNou) + ')'
DO Assert WITH ABS(lnSumaVechi - lnSumaNou) < 0.005, '[tip=' + TRANSFORM(lnTip) + '] VANZARI.SUMA_INCASAT identica (vechi=' + ;
TRANSFORM(lnSumaVechi) + ' nou=' + TRANSFORM(lnSumaNou) + ')'
DO Assert WITH ALLTRIM(lcSerieVechi) == ALLTRIM(lcSerieNou), '[tip=' + TRANSFORM(lnTip) + '] VANZARI.SERIE_INCASAT identica (vechi=[' + ;
ALLTRIM(lcSerieVechi) + '] nou=[' + ALLTRIM(lcSerieNou) + '])'
ENDFOR
ENDPROC
*==================================================================================
* CreeazaDocumentIncasare: emite un document REAL prin fluxul de productie, clasificat FACTURA
* (poDate.Tip=1 de la Init, NU suprascris ulterior - varianta anterioara, cu suprascriere tarzie,
* a rupt txtDataScadenta pe calea veche si opt_incasat pe calea noua, vezi antetul fisierului si
* docs\raport_s3b_emitere_reala_2.md). Sursa articolelor ramane insa cursor_preturi cu pnTipPreturi=22
* (AVIZ din lista de preturi - singura combinatie cu date reale in acest mediu,
* probe_emitere_reala.prg): parametrul de tip trimis la cursor_preturi e o variabila separata,
* NU poDate.tip, ca structura/continutul cursorului nu depinde de valoarea trimisa (doar eligibilitatea
* articolelor pentru acel tip de lista) - poDate.tip ramane 1 (FACTURA) neschimbat pe tot fluxul.
* Intoarce poDate.nid_vanzare (>0 succes) sau 0 (esec, detaliat in log).
FUNCTION CreeazaDocumentIncasare
LPARAMETERS tnTipIncasare, tlFormNou
PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest, pnTipPreturi
LOCAL lnIdSet, lcSqlCursor, lcCursor, lnSucces, lnIdVanzareRezultat, tnTip, tnIdClient, tnIdDelegat
LOCAL lcSerieAlocata, lnNractAlocat
lnIdVanzareRezultat = 0
lcSerieAlocata = ''
lnNractAlocat = 0
gnNrIncasareCapturat = 0
*-- poDate.Tip = 1 (FACTURA) de la Init - ntip<=20, contul de client normal (4111), consistent pe
*-- tot fluxul (vezi antetul fisierului). Sursa preturilor (pnTipPreturi=22) ramane separata.
tnTip = 1
pnTipPreturi = 22
tnIdClient = 463
tnIdDelegat = 256
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
lnIdSet = 25000 + pnTipPreturi - 1 + gnScadereStoc * 10
poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poDateGestiuneDest = CREATEOBJECT("oDateGestiune")
gnIdUtil = 8
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
poDate.id_client = tnIdClient
poDate.id_delegat = tnIdDelegat
poDate.zi_curs = {^2026-08-10}
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 = -3
lcSerieAlocata = ALLTRIM(TRANSFORM(NVL(poDate.serie_act, [])))
lnNractAlocat = poDate.nract
DO S3bLog WITH ' poDate.nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ' poDate.nract=' + TRANSFORM(poDate.nract) + ;
' serie_act=[' + TRANSFORM(NVL(poDate.serie_act,[])) + ']'
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
lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_preturi(?poDate.zi_curs,?pnTipPreturi,?poDate.id_valuta,] + ;
[?poDate.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}]
lcCursor = [crsarticole]
lnSucces = goExecutor.oExecute(lcSqlCursor, lcCursor)
IF lnSucces < 0
DO S3bLog WITH ' EROARE cursor articole: ' + goExecutor.oPrelucrareEroare()
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO S3bCurataJtva
RELEASE poDate, poGeneratorNumere, poDateGestiuneDest
RETURN 0
ENDIF
IF RECCOUNT(lcCursor) = 0
DO S3bLog WITH ' Nu exista articole (Reccount=0) - abandon document'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO S3bCurataJtva
RELEASE poDate, poGeneratorNumere, poDateGestiuneDest
RETURN 0
ENDIF
DO S3bLog WITH ' crsarticole Reccount=' + TRANSFORM(RECCOUNT(lcCursor))
*-- articolul sursa (SERVICII PER BUC, lista de proba) are pretul 0 in acest mediu - cu
*-- poDate.totalctva=0, validarea reala (ofacturare.vc2 "Suma incasata nu poate fi mai mare
*-- decat valoarea facturii") respinge orice incasare nenula, iar fara nicio incasare
*-- lcListaIncasare iese gol (nu 'NULL') -> SQL Oracle malformat. Fortam un pret real de test,
*-- ca actualizeaza_tipincasare (codul real de productie) sa preumple poDate.incasat/incasatCARD
*-- = poDate.totalctva pe cont propriu, exact ca la un document real cu suma de incasat.
*-- Lista de preturi a articolului e in EURO (tip_valuta=1), iar do_scrie_articole
*-- trimite pe ramura aceea vpretftva, derivat din pret_val - fortand doar pret,
*-- documentul iesea cu VANZARI_DETALII.PRET=0. Se forteaza perechea, coerent cu cursul.
SELECT (lcCursor)
REPLACE ALL cantitate WITH 1, ;
pret_val WITH IIF(tip_valuta = 1, 100, 0), ;
pret WITH IIF(tip_valuta = 1, ROUND(100 * IIF(NVL(curs, 0) = 0, 1, curs) / IIF(NVL(multiplicator, 0) = 0, 1, multiplicator), gnPPretV), 100)
=TABLEUPDATE(.T., .T., lcCursor)
GO TOP
DO S3bLog WITH ' crsarticole dupa REPLACE: pret=' + TRANSFORM(pret) + ' cantitate=' + TRANSFORM(cantitate) + ;
' pret_val=' + TRANSFORM(pret_val) + ' tip_valuta=' + TRANSFORM(tip_valuta) + ' curs=' + TRANSFORM(NVL(curs,0)) + ;
' proc_tvav=' + TRANSFORM(proc_tvav) + ' preturi_cu_tva=' + TRANSFORM(preturi_cu_tva) + ' modificabil=' + TRANSFORM(modificabil)
creeaza_facturacrs([crsfactura])
*-- Construim crsfactura DIRECT din crsarticole, cu prelucreaza_facturacrs (ofacturare_comun.prg:1803)
*-- - procedura reala care calculeaza pretctva/valctva/valftva/valtva/valdiminuatctva etc. Ocolim
*-- complet do_adauga_tot()/do_adauga_articol(), care citesc Thisform.grd_articole - grila NU se
*-- materializeaza sub vfp9.exe -A -T (capcana cunoscuta), deci randul adaugat prin ea iese gol
*-- (cantitate=0/pret=NULL) indiferent ce e in crsarticole - verificat cu log dedicat intr-o
*-- rulare anterioara. do_calculeaza_totaluri() (ambele clase, verificat in sursa) citeste STRICT
*-- din crsfactura (Sum(valdiminuatctva) etc.), fara nicio dependenta de grid - deci populand
*-- crsfactura corect pe alta cale, restul fluxului (do_calculeaza_totaluri, do_termin,
*-- do_scrie_articole -> SELECT crsfactura SCAN) functioneaza neschimbat.
LOCAL lnCotaTva, lnIdJtvaColoana, lnSelAnterior
SELECT (lcCursor)
lnCotaTva = ROUND((proc_tvav - 1) * 100, 0)
lnIdJtvaColoana = 0
IF USED('jtva_coloane')
lnSelAnterior = SELECT()
SELECT jtva_coloane
LOCATE FOR cota_tva = lnCotaTva
IF FOUND()
lnIdJtvaColoana = id_jtva_coloana
ENDIF
SELECT (lnSelAnterior)
ENDIF
DO S3bLog WITH ' lookup jtva_coloane: cota_tva=' + TRANSFORM(lnCotaTva) + ' -> id_jtva_coloana=' + TRANSFORM(lnIdJtvaColoana)
SELECT id_articol, id_pol, 1 AS id_vanzare_det, CAST('' AS M) AS explicatie, denumire, lot, serie, codmat, ;
m.lnIdJtvaColoana AS id_jtva_coloana, CAST(NULL AS N(20)) AS id_jtva_coloana_ex, CAST(NULL AS N(6)) AS taxcode, ;
codmat AS codmatf, codbare, 0 AS pret_achizitie, cantitate, proc_tvav, um, ;
preturi_cu_tva AS pret_cu_tva, pret, discount_unitar, pret_val, discount_unitar_val, ;
CAST(NULL AS N(20)) AS id_vanzare_set, CAST(NULL AS N(20)) AS id_gestiune, CAST(NULL AS N(20)) AS id_ctr, ;
CAST('' AS C(100)) AS numar_contract, id_valuta, tip_valuta, curs, multiplicator, nume_val ;
FROM (lcCursor) INTO CURSOR crssursaprelucrare READWRITE
DO prelucreaza_facturacrs WITH 'crssursaprelucrare', 'crsfactura', 0, 0, 0
SELECT (lcCursor)
LOCAL lnIdPolCrs
lnIdPolCrs = NVL(id_pol, 0)
SELECT crsfactura
REPLACE ALL id_pol WITH lnIdPolCrs
USE IN crssursaprelucrare
DO S3bLog WITH ' crsfactura dupa prelucreaza_facturacrs: Reccount=' + TRANSFORM(RECCOUNT('crsfactura'))
IF RECCOUNT('crsfactura') > 0
SELECT crsfactura
GO TOP
DO S3bLog WITH ' crsfactura linia 1: pret_achizitie=' + TRANSFORM(pret_achizitie) + ' cantitate=' + TRANSFORM(cantitate) + ;
' pretctva=' + TRANSFORM(pretctva) + ' valctva=' + TRANSFORM(valctva) + ' valdiminuatctva=' + TRANSFORM(valdiminuatctva) + ;
' proc_tvav=' + TRANSFORM(proc_Tvav) + ' cu_tva=' + TRANSFORM(cu_tva) + ' id_pol=' + TRANSFORM(NVL(id_pol,-1))
ENDIF
IF poDate.in_valuta = 1
SELECT DISTINCT Curs, nume_val, id_valuta, multiplicator FROM (lcCursor) 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 RECCOUNT('crscursuri') = 0
USE IN crscursuri
ENDIF
ENDIF
IF TYPE(lcCursor + '.nume_lista_preturi') <> 'U'
CREATE CURSOR crspolitici (id_pol N(20), nume_lista_preturi c(100))
SELECT crspolitici
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 (lcCursor) ORDER BY nume_lista_preturi
ENDIF
*-- formularul, modeless (apel direct de metode) - vechi sau unificat, dupa tlFormNou
PUBLIC goFrmS3b
IF tlFormNou
goFrmS3b = CREATEOBJECT('frm_facturare_articole2')
ELSE
goFrmS3b = CREATEOBJECT('frm_facturare_articole')
ENDIF
DO S3bLog WITH ' CREATEOBJECT OK, VARTYPE=' + VARTYPE(goFrmS3b)
goFrmS3b.WindowType = 0
goFrmS3b.Show()
DOEVENTS FORCE
DO S3bLog WITH ' formular afisat modeless (' + IIF(tlFormNou, 'NOU frm_facturare_articole2', 'VECHI frm_facturare_articole') + ')'
*-- crsfactura e deja populat direct (prelucreaza_facturacrs, mai sus) - NU mai chemam
*-- goFrmS3b.do_adauga_tot()/do_adauga_articol(), care citesc Thisform.grd_articole (nematerializat
*-- headless pe formularul vechi, si inexistent ca proprietate pe formularul nou - vezi antetul).
goFrmS3b.do_calculeaza_totaluri()
DOEVENTS FORCE
*-- poDate.totalctva se seteaza abia in inainte_de_do_termin; totalul calculat sta in ntotalron
DO S3bLog WITH ' dupa do_calculeaza_totaluri: ntotalron=' + TRANSFORM(goFrmS3b.ntotalron) + ;
' nbazaron=' + TRANSFORM(goFrmS3b.nbazaron) + ' ntvaron=' + TRANSFORM(goFrmS3b.ntvaron) + ;
' (poDate.totalctva inca ' + TRANSFORM(poDate.totalctva) + ')'
*-- poDate.Tip a fost 1 (FACTURA) inca de la Init - vezi antetul functiei. Doar diagnostic aici:
*-- confirma ca .datascad s-a completat singur (tnTip=1<21 la Init, ofacturare_comun.prg:246).
DO S3bLog WITH ' poDate.Tip=' + TRANSFORM(poDate.Tip) + ' poDate.datascad=' + TRANSFORM(NVL(poDate.datascad,{})) + ' inainte de do_termin()'
LOCAL lnScris
IF tlFormNou
*-- opt_incasat e inline pe formular - fara al doilea modal
*-- actualizeaza_tipincasare pune incasat=poDate.totalctva; totalul se umple abia in inainte_de_do_termin, deci il pre-seteaza aici
poDate.totalctva = goFrmS3b.ntotalron
goFrmS3b.seteaza_mod_incasare(tnTipIncasare)
gnNrIncasareCapturat = poDate.nr_incasare
DO S3bLog WITH ' opt_incasat.Value=' + TRANSFORM(tnTipIncasare) + ' -> poDate.nr_incasare=' + TRANSFORM(gnNrIncasareCapturat) + ;
' incasat=' + TRANSFORM(poDate.incasat) + ' incasatCARD=' + TRANSFORM(poDate.incasatCARD)
lnScris = goFrmS3b.do_termin()
ELSE
*-- calea veche: al doilea modal (frm_alte_date) e condus de goDriverAD/tmrDrvAD. Deadline de
*-- gardian, verificat in Executa: daca modalul nu se rezolva in 20s (mesaj necunoscut,
*-- ActiveControl invalid etc.), Executa il forteaza sa se elibereze in loc sa agate rularea
*-- pe ecranul lui Marius (asa cum s-a intamplat o data, PID 9312, vezi handoff).
glDlgTratatAD = .F.
glVerifTratatAD = .F.
gnTipIncasareCerut = tnTipIncasare
gnDrvDeadline = SECONDS() + 20
lnScris = goFrmS3b.do_termin()
LOCAL lnWait
lnWait = 0
*-- INKEY(0.1) proceseaza evenimente SI asteapta real ~100ms, spre deosebire de un
*-- DOEVENTS FORCE gol (care revine aproape instant) - altfel 250 de iteratii s-ar termina
*-- in sub-o-secunda, mult inainte ca gardianul din Executa (20s) sa apuce sa actioneze.
DO WHILE !glDlgTratatAD AND lnWait < 250
=INKEY(0.1)
DOEVENTS FORCE
lnWait = lnWait + 1
ENDDO
IF !glDlgTratatAD
DO S3bLog WITH ' ATENTIE: glDlgTratatAD tot .F. dupa asteptare - posibil modal ramas deschis'
ENDIF
ENDIF
DO S3bLog WITH ' do_termin() -> ' + TRANSFORM(lnScris) + ' poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare,0))
*-- do_termin() intoarce mereu .T. (_frm_base.vc2:363, DoDefault fara RETURN) si nid_vanzare
*-- ramane santinela 9999999999 la esec: singura dovada e randul din VANZARI, pe serie_act + nract.
lnIdVanzareRezultat = CdocGasesteIdVanzare(lcSerieAlocata, lnNractAlocat)
IF lnIdVanzareRezultat < 0
lnIdVanzareRezultat = 0
ENDIF
DO S3bLog WITH ' verificare in VANZARI pe ' + lcSerieAlocata + ' ' + TRANSFORM(lnNractAlocat) + ;
' -> id_vanzare=' + TRANSFORM(lnIdVanzareRezultat)
IF TYPE('goFrmS3b') = 'O' AND !ISNULL(goFrmS3b)
goFrmS3b.Release()
ENDIF
goFrmS3b = NULL
IF USED('crspolitici')
USE IN crspolitici
ENDIF
IF USED('crscursuri')
USE IN crscursuri
ENDIF
IF USED('crsfactura')
USE IN crsfactura
ENDIF
IF USED('crsarticole')
USE IN crsarticole
ENDIF
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
IF USED('jtva_coloane_temp')
USE IN jtva_coloane_temp
ENDIF
RELEASE poDate, poGeneratorNumere, poDateGestiuneDest
RETURN lnIdVanzareRezultat
ENDFUNC
PROCEDURE S3bCurataJtva
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
IF USED('jtva_coloane_temp')
USE IN jtva_coloane_temp
ENDIF
ENDPROC
*==================================================================================
*-- driverAlteDateAD: cauta FRM_ALTE_DATE prin _SCREEN.Forms si ii seteaza opt_incasat.Value la
* gnTipIncasareCerut INAINTE de a-i chema .do_termin() - identic cu test_s3b_emitere_reala.prg.
DEFINE CLASS driverAlteDateAD AS Custom
PROCEDURE Executa
LOCAL lnI, loForm, llGasit, loMsgForm, loCautaAlfaForm, loFormVerif
*-- gardian: daca modalul nu s-a rezolvat in gnDrvDeadline secunde, il eliberam fortat in loc
*-- sa lasam do_termin() agatat pe ecran (asa cum s-a intamplat o data, PID 9312).
IF !glDlgTratatAD AND SECONDS() > gnDrvDeadline
DO S3bLog WITH ' [diag timer] GARDIAN: deadline depasit, eliberez fortat formele deschise'
*-- eliberare pe Forms(1) repetat (nu FOR pe index crescator), ca sterile modificarile
*-- de FormCount la fiecare Release() sa nu sara peste elemente
LOCAL lnGardCicluri
lnGardCicluri = 0
DO WHILE _SCREEN.FormCount > 0 AND lnGardCicluri < 20
TRY
DO S3bLog WITH ' [diag timer] GARDIAN: eliberez ' + UPPER(_SCREEN.Forms(1).Class)
_SCREEN.Forms(1).Release()
CATCH TO loExcGard
DO S3bLog WITH ' [diag timer] GARDIAN: CATCH la Release ' + TRANSFORM(loExcGard.ErrorNo) + ' ' + loExcGard.Message
EXIT
ENDTRY
lnGardCicluri = lnGardCicluri + 1
ENDDO
glDlgTratatAD = .T.
RETURN
ENDIF
llGasit = .F.
loMsgForm = NULL
loCautaAlfaForm = NULL
loFormVerif = NULL
FOR lnI = 1 TO _SCREEN.FormCount
LOCAL lcClasa
lcClasa = UPPER(_SCREEN.Forms(lnI).Class)
IF lcClasa == 'FRM_ALTE_DATE'
loForm = _SCREEN.Forms(lnI)
llGasit = .T.
ENDIF
IF 'MESSAGEBOX_FORM' $ lcClasa
loMsgForm = _SCREEN.Forms(lnI)
ENDIF
IF lcClasa == 'CAUTA_ALFA_FORM'
loCautaAlfaForm = _SCREEN.Forms(lnI)
ENDIF
IF '_FRMBASE' $ lcClasa
loFormVerif = _SCREEN.Forms(lnI)
ENDIF
IF !(lcClasa $ gcClaseVazute)
gcClaseVazute = gcClaseVazute + lcClasa + ';'
DO S3bLog WITH ' [diag timer] forma noua vazuta: ' + lcClasa + ' Caption=[' + TRANSFORM(_SCREEN.Forms(lnI).Caption) + ']'
ENDIF
ENDFOR
*-- confirmare reala neacoperita de mock_amessagebox (forma modala messagebox_form) -
*-- apasa automat cmdYes/cmdOk, ca in productie la raspuns implicit "Da". Textul se logheaza
*-- de fiecare data (nu doar la primul din clasa) - mesajele difera de la un popup la altul.
IF !ISNULL(loMsgForm)
TRY
IF PEMSTATUS(loMsgForm, 'edtMensaje', 5)
DO S3bLog WITH ' [diag timer] messagebox_form text=[' + TRANSFORM(loMsgForm.edtMensaje.Value) + ;
'] caption=[' + TRANSFORM(loMsgForm.Caption) + ']'
ENDIF
CATCH TO loExcTxt
DO S3bLog WITH ' [diag timer] messagebox_form: CATCH la citire text ' + TRANSFORM(loExcTxt.ErrorNo) + ' ' + loExcTxt.Message
ENDTRY
TRY
DO CASE
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5)
DO S3bLog WITH ' [diag timer] messagebox_form: apas cmgBotones.cmdYes'
loMsgForm.cmgBotones.cmdYes.Click()
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5)
DO S3bLog WITH ' [diag timer] messagebox_form: apas cmgBotones.cmdOk'
loMsgForm.cmgBotones.cmdOk.Click()
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdCancel', 5)
DO S3bLog WITH ' [diag timer] messagebox_form: buton necunoscut (nici Yes, nici Ok) - apas cmgBotones.cmdCancel ca sa nu ramana blocat'
loMsgForm.cmgBotones.cmdCancel.Click()
OTHERWISE
DO S3bLog WITH ' [diag timer] messagebox_form: NICIUN buton recunoscut (Yes/Ok/Cancel) - raman blocat pana la gardian (' + ;
TRANSFORM(gnDrvDeadline - SECONDS()) + 's ramase)'
ENDCASE
CATCH TO loExcMsg
DO S3bLog WITH ' [diag timer] messagebox_form: CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message
ENDTRY
ENDIF
*-- cautare partener analitic (POS Card): se inchide fara selectie prin do_termin, inainte de
*-- garda glDlgTratatAD ca sa fie tratat si dupa ce FRM_ALTE_DATE a fost deja rezolvat
IF !ISNULL(loCautaAlfaForm)
TRY
DO S3bLog WITH ' [diag timer] forma cauta_alfa: Caption=[' + TRANSFORM(loCautaAlfaForm.Caption) + '] - apas do_termin()'
loCautaAlfaForm.do_termin()
CATCH TO loExcCautaAlfa
DO S3bLog WITH ' [diag timer] forma cauta_alfa: CATCH ' + TRANSFORM(loExcCautaAlfa.ErrorNo) + ' ' + loExcCautaAlfa.Message
TRY
IF TYPE('loCautaAlfaForm') = 'O' AND !ISNULL(loCautaAlfaForm)
loCautaAlfaForm.Release()
ENDIF
CATCH
ENDTRY
ENDTRY
ENDIF
*-- formularul real verificare (SCX _frmbase12, raportat _FRMBASE) - modal din scrie_factura2,
*-- inainte de garda glDlgTratatAD; plasa de siguranta: eliberare DIRECTA (Release) - do_termin()
*-- re-ruleaza verificarea si arunca bucla pe messagebox "REZULTATE VERIFICARI" + CATCH 103
IF !ISNULL(loFormVerif) AND !glVerifTratatAD
gnButon = 1
glVerifTratatAD = .T.
TRY
DO S3bLog WITH ' [diag timer] forma _FRMBASE (verificare): eliberare directa (Release), gnButon=1'
loFormVerif.Release()
CATCH TO loExcVerif
DO S3bLog WITH ' [diag timer] forma _FRMBASE: CATCH Release ' + TRANSFORM(loExcVerif.ErrorNo) + ' ' + loExcVerif.Message
ENDTRY
ENDIF
IF glDlgTratatAD OR !llGasit
RETURN
ENDIF
*-- loForm.ActiveControl arunca eroarea 1924 "ACTIVECONTROL is not an object" cand formularul
*-- nu are (inca) niciun control cu focus - varianta anterioara o citea fara sa o foloseasca
*-- si asta a cauzat exact blocajul raportat (PID 9312). Nu o mai citim deloc.
TRY
loForm.opt_incasat.Value = gnTipIncasareCerut
gnNrIncasareCapturat = poDate.nr_incasare
DO S3bLog WITH ' driverAlteDateAD: opt_incasat.Value=' + TRANSFORM(gnTipIncasareCerut) + ;
' -> poDate.nr_incasare=' + TRANSFORM(gnNrIncasareCapturat) + ' incasat=' + TRANSFORM(poDate.incasat) + ;
' incasatCARD=' + TRANSFORM(poDate.incasatCARD)
loForm.do_termin()
glDlgTratatAD = .T.
CATCH TO loExcDrv
DO S3bLog WITH ' driverAlteDateAD: CATCH ErrorNo=' + TRANSFORM(loExcDrv.ErrorNo) + ' Message=' + loExcDrv.Message + ;
' Procedure=' + loExcDrv.Procedure + ' LineNo=' + TRANSFORM(loExcDrv.LineNo)
*-- daca formularul a ramas deschis dupa CATCH, il eliberam - altfel do_termin() de mai
*-- sus (cel apelat pe goFrmS3b, care asteapta modalul) ramane agatat la nesfarsit
TRY
IF TYPE('loForm') = 'O' AND !ISNULL(loForm)
loForm.Release()
ENDIF
CATCH
ENDTRY
glDlgTratatAD = .T.
ENDTRY
ENDPROC
ENDDEFINE

View File

@@ -0,0 +1,28 @@
$ErrorActionPreference = 'Stop'
$dir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat'
$prg = Join-Path $dir 'test_s3b_emitere_paritate_2.prg'
$log = Join-Path $dir 'out\test_s3b_emitere_paritate_2.log'
$vfp = 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe'
$viu = Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*test_s3b_emitere_paritate_2*' }
if ($viu) {
"Ruleaza deja o instanta a suitei (PID " + ($viu.ProcessId -join ',') + "). Nu lansez a doua."
exit 1
}
Set-Location $dir
Remove-Item *.FXP, *.fxp -ErrorAction SilentlyContinue
Remove-Item $log -ErrorAction SilentlyContinue
$p = Start-Process -FilePath $vfp -ArgumentList '-A', '-T', $prg -PassThru
"lansat PID " + $p.Id
$null = $p.WaitForExit(240000)
if (-not $p.HasExited) {
"INCA RULEAZA dupa 240s - omor instanta (filtrat pe CommandLine)"
Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*test_s3b_emitere_paritate_2*' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force }
}
if (Test-Path $log) {
Get-Content $log | Select-String -Pattern '^(PASS|FAIL|ERROR|TOTAL|START|END|=====| MAX| tip_incasat| vechi | nou |CATCH)'
} else {
"Log inexistent: $log"
}

View File

@@ -0,0 +1,698 @@
* test_s3b_emitere_reala.prg
* Criteriul 1 de "gata" al S3b, PROBA REALA (nu structurala): emite documente REALE in Oracle
* (MARIUSM_AUTO@ROA_CENTRAL, aprobat explicit de Marius) prin fluxul de emitere efectiv, pe
* fiecare din cele patru tipuri de incasare (1=Fara incasare, 2=Chitanta, 3=Bon fiscal, 4=POS/Card),
* o data pe formularul vechi (frm_facturare_articole) si o data pe cel unificat
* (frm_facturare_articole2), si compara randurile persistate in VANZARI dupa commit.
*
* Sursa documentului e cursor_preturi (lista de preturi, client RAJA id_part=463) cu tnTip=22 -
* singura combinatie confirmata prin proba read-only (probe_emitere_reala.prg) ca intoarce articole
* in acest mediu; tnTip=5 (FACTURA direct) da Reccount=0. Numerotarea/serie a documentului ramane
* cea naturala pentru tnTip=22 (AVIZ, nIdTipDoc=6, plaja globala) - neatinsa, nu conteaza pentru
* criteriul de paritate a INCASARII, care e independent de seria documentului.
*
* Mecanica bazata pe COMUN\utile\Teste\editare_factura\creeaza_documente_s8.prg (mediu Oracle real
* + clase de productie, dovedit ca emite documente reale pentru tnTip=22): dialogul modal de antet
* e inlocuit cu setare directa poDate (ca acolo), iar "Do Form verificare" (ofacturare.vc2:14404 /
* :20126) e ocolit cu acelasi stub versionat COMUN\utile\Teste\achizitie_import\stub_verificare\
* (SET PATH cu el primul).
*
* Diferenta fata de creeaza_documente_s8.prg: al doilea modal (frm_alte_date, doar pe calea veche)
* NU e doar "confirmat" - un driver pe Timer ii seteaza opt_incasat.Value la tipul cerut INAINTE
* sa-i cheme do_termin(), exact tehnica validata structural in test_s3b_paritate_emitere.prg (setarea
* de .Value declanseaza opt_incasat.ProgrammaticChange -> actualizeaza_tipincasare(), cod real).
* Pe calea noua nu exista al doilea modal (opt_incasat e inline pe formular): se seteaza direct pe
* goFrm inainte de goFrm.do_termin().
*
* De ce NU se compara nr_incasare/NR_INCASAT intre vechi si nou (asa cum a facut suita structurala):
* acolo numerele erau dezalocate dupa fiecare tip, deci acelasi numar fizic se realoca in faza 2.
* Aici documentele raman scrise (nu se dezaloca nimic dupa un commit reusit), deci vechi si nou aloca
* NUMERE DIFERITE, consecutive, din aceeasi plaja - egalitatea lor ar fi o eroare, nu o dovada.
* Paritatea reala verificata e (a) consistenta interna - VANZARI.NR_INCASAT persistat == poDate.nr_incasare
* capturat chiar inainte de scriere, pe fiecare document in parte, si (b) egalitatea intre vechi/nou a
* CODULUI de tip (VANZARI.TIP_INCASAT) si a SUMEI (VANZARI.SUMA_INCASAT) - marimi care nu depind de
* alocarea secventiala si trebuie sa fie identice daca cele doua cai proceseaza acelasi lcListaIncasare.
*
* CONSUMA DATE REALE: fiecare pereche (tip, forma) scrie un document nou in VANZARI (client 463),
* iar tipurile 2/3/4 aloca si un numar real de chitanta/bon fiscal/pos (serii 16/3/26). Niciun
* rollback, nicio stergere - documentele raman in schema, de inspectat de Marius.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3b_emitere_reala.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3b_emitere_reala.log
SET SAFETY OFF
SET TALK OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET DECIMALS TO 4
SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcLog, gnPass, gnFail
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3b_emitere_reala.log"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcLog)
gnPass = 0
gnFail = 0
ON ERROR DO S3bErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
TRY
LOCAL lcAppPathLocal, lcSql
lcAppPathLocal = "D:\ROA\ROAFACTURARE\"
*-- stub_verificare PRIMUL (SET PATH plain, nu ADDITIVE): test_init_env_auto_roafacturare.prg
*-- face el insusi SET PATH TO ... ADDITIVE mai jos, care ADAUGA dupa (nu inaintea) intrarilor
*-- deja existente - asta pastreaza stub_verificare cu prioritate fata de COMUN\FERESTRE, ca
*-- "Do Form verificare" (ofacturare.vc2:14404 / :20126) sa rezolve la stub, nu la formularul real
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\achizitie_import\stub_verificare"
*-- mediul REAL, identic cu cel folosit de test_s3b_paritate_emitere.prg (deja dovedit ca
*-- instantiaza fara agatare frm_facturare_articole2 - orice reconstructie manuala a acestui
*-- mediu s-a dovedit incompleta si a agatat headless in interiorul Init-ului formularului nou,
*-- la constructia coloanei Gestiune din grd_factura (vezi raport)
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 S3bLog WITH 'EROARE: conectare Oracle esuata'
DO S3bFinal
ENDIF
DO S3bLog WITH 'test_init_env_auto_roafacturare OK, gnHandle=' + TRANSFORM(gnHandle)
*-- fara asta, un lacat Oracle blocheaza rularea la infinit, invizibil in log
SQLSETPROP(gnHandle, "QueryTimeOut", 45)
*-- clase suplimentare, necesare pentru grd_factura (coloane cu combo pe cursor SQL)
SET PATH TO (lcAppPathLocal + "COMUN\utile\gridextras") ADDITIVE
SET CLASSLIB TO gridextras.vcx ADDITIVE
SET CLASSLIB TO _cb_base.vcx ADDITIVE
DO S3bLog WITH 'SET CLASSLIB suplimentar OK'
*-- mock amessagebox: la nume duplicat castiga fisierul de proceduri deschis cel mai recent
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE
DO S3bLog WITH 'mock_amessagebox OK'
*-- CdocGasesteIdVanzare: dovada de scriere pe jonctiunea serie_act + nract
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\lib_comparatie_documente.prg" ADDITIVE
*-- initializare REALA a optiunilor de program (tehnica din test_s3b_paritate_emitere.prg) -
*-- creeaza dinamic globalele gnXxx/glXxx/gcXxx din tabela OPTIUNI; suprascrise imediat dupa
*-- cu valorile care bypaseaza dialogurile per-linie in mediul headless
IF !actualizeaza_optiuni_program()
DO S3bLog WITH 'EROARE: actualizeaza_optiuni_program()'
DO S3bFinal
ENDIF
gnScadereStoc = 0
gnModTotFact = 0
gnFactSeturi = 0
gnListareAvizBonFiscal = 0
gnid_part_casa = 0
*-- 167: singura sucursala cu plaje pentru chitanta/bon fiscal/pos in acest mediu (16/3/26);
*-- verificat READ-ONLY (probe_emitere_reala.prg) ca nu schimba Reccount(cursor_preturi)
gnIdSucursala = 167
lcSql = [begin pack_contafin.set_id_sucursala(?gnIdSucursala); end;]
goExecutor.oExecuta(lcSql)
DO S3bLog WITH 'actualizeaza_optiuni_program OK, gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ' gnIdSucursala=' + TRANSFORM(gnIdSucursala)
PUBLIC gcMockUltimMesaj, gnMockUltimTip
gcMockUltimMesaj = ''
gnMockUltimTip = 0
*----- driver: conduce frm_alte_date (singurul modal ramas, doar pe calea veche) -----
PUBLIC goDriverAD, glDlgTratatAD, gnTipIncasareCerut, gnNrIncasareCapturat, gcClaseVazute
glDlgTratatAD = .F.
gnTipIncasareCerut = 1
gnNrIncasareCapturat = 0
gcClaseVazute = ';'
goDriverAD = CREATEOBJECT('driverAlteDateAD')
_SCREEN.AddObject('tmrDrvAD', 'Timer')
_SCREEN.tmrDrvAD.Interval = 200
BINDEVENT(_SCREEN.tmrDrvAD, 'Timer', goDriverAD, 'Executa')
_SCREEN.tmrDrvAD.Enabled = .T.
*-- _SCREEN ramane invizibil (default -A -T), ca in test_s3b_paritate_emitere.prg - un GETFILE()
*-- nativ (dialog "Open") aparut la o SET SCREEN VISIBLE = .T. a agatat rularea (vezi raport)
_SCREEN.Caption = 'S3b - emitere reala (paritate incasare vechi/nou)'
DO S3bLog WITH 'driver+timer pregatiti'
*-- pre-proba plajelor 3/16/26 - plasa de siguranta, evita blocaj invizibil daca lipsesc
DO S3bLog WITH 'pre-proba plaje: tip3=' + TRANSFORM(RanduriSerii(3)) + ' tip16=' + TRANSFORM(RanduriSerii(16)) + ;
' tip26=' + TRANSFORM(RanduriSerii(26))
*-- stare INAINTE: ultimul NR_INCASAT emis pe fiecare tip de incasare, in TOATA schema
DO S3bLog WITH CHR(13)+CHR(10) + '===== STARE INAINTE (MAX(NR_INCASAT) pe tip_incasat, toata schema) ====='
DO LogStareMaxIncasat
CREATE CURSOR crsRezultate (tip_incasare N(1), forma C(10), id_vanzare N(10), cod N(10), ;
serie_act C(10), id_fact N(10), nr_incasare_asteptat N(10), nr_incasat N(10), ;
tip_incasat N(10), suma_incasat N(18,2), serie_incasat C(10), total_cu_tva N(18,2))
LOCAL laNumeTip[4]
laNumeTip[1] = 'Fara incasare'
laNumeTip[2] = 'Chitanta'
laNumeTip[3] = 'Bon fiscal'
laNumeTip[4] = 'POS Card'
*-- FORMA NOUA: BLOCATA in aceasta sesiune (vezi docs\raport_s3b_emitere_reala.md) -
*-- frm_facturare_articole2 agata la CREATEOBJECT (Init -> grd_factura.cGestiune.cCboGestiune
*-- -> _cb_base.vc2 combosql.Init:589 -> RefreshData(0):826 -> SelectData():832 -> un dialog
*-- nativ "Open" real, needeterminat cauzal, indiferent de mediu/tip/vizibilitate _SCREEN).
*-- Ramane .F. neconditionat aici; DACA se rezolva blocajul, se schimba in .T. pentru ambele.
PUBLIC glIncercaFormaNoua
glIncercaFormaNoua = .F.
LOCAL lnTip, lnIdVz
FOR lnTip = 1 TO 4
DO S3bLog WITH CHR(13)+CHR(10) + '===== TIP ' + TRANSFORM(lnTip) + ' (' + laNumeTip[lnTip] + ') - FORMA VECHE (tnTip=22) ====='
lnIdVz = CreeazaDocumentIncasare(lnTip, .F.)
DO InregistreazaRezultat WITH lnTip, 'vechi', lnIdVz
IF glIncercaFormaNoua
DO S3bLog WITH CHR(13)+CHR(10) + '===== TIP ' + TRANSFORM(lnTip) + ' (' + laNumeTip[lnTip] + ') - FORMA NOUA (tnTip=3) ====='
lnIdVz = CreeazaDocumentIncasare(lnTip, .T.)
DO InregistreazaRezultat WITH lnTip, 'nou', lnIdVz
ELSE
DO S3bLog WITH ' forma noua SARITA (blocata, vezi raport)'
ENDIF
ENDFOR
DO S3bLog WITH CHR(13)+CHR(10) + '===== COMPARATIE VECHI / NOU, PE TIP ====='
DO ComparaRezultate
DO S3bLog WITH CHR(13)+CHR(10) + '===== STARE DUPA (MAX(NR_INCASAT) pe tip_incasat, toata schema) ====='
DO LogStareMaxIncasat
_SCREEN.tmrDrvAD.Enabled = .F.
DO S3bFinal
CATCH TO loExc
DO S3bLog WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']'
DO S3bFinal
ENDTRY
QUIT
*==================================================================================
PROCEDURE S3bLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13)+CHR(10), gcLog, 1)
ENDPROC
PROCEDURE S3bErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
DO S3bLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
ENDPROC
PROCEDURE S3bFinal
DO S3bLog WITH CHR(13)+CHR(10) + 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail)
DO S3bLog WITH 'END ' + TTOC(DATETIME())
QUIT
ENDPROC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO S3bLog WITH 'PASS: ' + tcMsg
ELSE
gnFail = gnFail + 1
DO S3bLog WITH 'FAIL: ' + tcMsg
ENDIF
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 S3bLog WITH 'pre-proba plaje tip ' + TRANSFORM(tnIdTipDoc) + ' ESEC: ' + TRANSFORM(laErr[2])
ENDIF
RETURN lnRanduri
ENDFUNC
PROCEDURE LogStareMaxIncasat
LOCAL lnQ
lnQ = goExecutor.oExecute([select tip_incasat, max(nr_incasat) as maxnr, count(*) as nr ] + ;
[from vanzari where tip_incasat is not null group by tip_incasat order by tip_incasat], 'crsMaxInc')
IF lnQ > 0
SELECT crsMaxInc
SCAN
DO S3bLog WITH ' tip_incasat=' + TRANSFORM(tip_incasat) + ' max(nr_incasat)=' + TRANSFORM(maxnr) + ' nr_documente=' + TRANSFORM(nr)
ENDSCAN
USE IN crsMaxInc
ELSE
DO S3bLog WITH ' EROARE citire stare incasat: ' + goExecutor.oPrelucrareEroare()
ENDIF
ENDPROC
*-- citeste randul VANZARI scris pentru id_vanzare si-l adauga in crsRezultate
PROCEDURE InregistreazaRezultat
LPARAMETERS tnTip, tcForma, tnIdVz
DO Assert WITH tnIdVz > 0, '[' + tcForma + ' tip=' + TRANSFORM(tnTip) + '] documentul exista in VANZARI (jonctiune serie_act+nract), e=' + TRANSFORM(tnIdVz)
IF tnIdVz <= 0
DO S3bLog WITH ' ' + tcForma + ' tip=' + TRANSFORM(tnTip) + ': documentul NU s-a scris (id_vanzare=0), fara rand in VANZARI'
INSERT INTO crsRezultate (tip_incasare, forma, id_vanzare) VALUES (tnTip, tcForma, 0)
RETURN
ENDIF
LOCAL lnQ
lnQ = goExecutor.oExecute([select id_vanzare, cod, serie_act, nvl(id_fact,0) as id_fact, ] + ;
[nvl(nr_incasat,0) as nr_incasat, nvl(tip_incasat,0) as tip_incasat, nvl(suma_incasat,0) as suma_incasat, ] + ;
[nvl(serie_incasat,'') as serie_incasat, total_cu_tva from vanzari where id_vanzare = ] + TRANSFORM(tnIdVz), 'crsVz1')
IF lnQ <= 0 OR RECCOUNT('crsVz1') <> 1
DO S3bLog WITH ' ' + tcForma + ' tip=' + TRANSFORM(tnTip) + ': EROARE citire VANZARI id_vanzare=' + TRANSFORM(tnIdVz)
INSERT INTO crsRezultate (tip_incasare, forma, id_vanzare) VALUES (tnTip, tcForma, tnIdVz)
RETURN
ENDIF
SELECT crsVz1
INSERT INTO crsRezultate (tip_incasare, forma, id_vanzare, cod, serie_act, id_fact, ;
nr_incasare_asteptat, nr_incasat, tip_incasat, suma_incasat, serie_incasat, total_cu_tva) ;
VALUES (tnTip, tcForma, tnIdVz, crsVz1.cod, NVL(crsVz1.serie_act,''), crsVz1.id_fact, ;
gnNrIncasareCapturat, crsVz1.nr_incasat, crsVz1.tip_incasat, crsVz1.suma_incasat, NVL(crsVz1.serie_incasat,''), crsVz1.total_cu_tva)
DO S3bLog WITH ' ' + tcForma + ' tip=' + TRANSFORM(tnTip) + ': id_vanzare=' + TRANSFORM(tnIdVz) + ' cod=' + TRANSFORM(crsVz1.cod) + ;
' serie_act=' + TRANSFORM(crsVz1.serie_act) + ' id_fact=' + TRANSFORM(crsVz1.id_fact) + ;
' nr_incasat=' + TRANSFORM(crsVz1.nr_incasat) + ' (asteptat ' + TRANSFORM(gnNrIncasareCapturat) + ') tip_incasat=' + TRANSFORM(crsVz1.tip_incasat) + ;
' suma_incasat=' + TRANSFORM(crsVz1.suma_incasat) + ' serie_incasat=[' + TRANSFORM(crsVz1.serie_incasat) + ']' + ;
' total_cu_tva=' + TRANSFORM(crsVz1.total_cu_tva)
USE IN crsVz1
DO Assert WITH crsRezultate.nr_incasat = gnNrIncasareCapturat, ;
'[' + tcForma + ' tip=' + TRANSFORM(tnTip) + '] VANZARI.NR_INCASAT persistat (' + TRANSFORM(crsRezultate.nr_incasat) + ;
') == poDate.nr_incasare capturat inainte de scriere (' + TRANSFORM(gnNrIncasareCapturat) + ')'
ENDPROC
PROCEDURE ComparaRezultate
LOCAL lnTip, lnRVechi, lnRNou
IF !glIncercaFormaNoua
DO S3bLog WITH ' forma noua sarita in aceasta rulare - fara comparatie vechi/nou, doar valorile persistate pe forma veche'
RETURN
ENDIF
FOR lnTip = 1 TO 4
SELECT crsRezultate
LOCATE FOR tip_incasare = lnTip AND forma == 'vechi'
IF !FOUND()
DO Assert WITH .F., '[tip=' + TRANSFORM(lnTip) + '] rand vechi gasit in crsRezultate'
LOOP
ENDIF
lnRVechi = RECNO()
LOCATE FOR tip_incasare = lnTip AND forma == 'nou'
IF !FOUND()
DO Assert WITH .F., '[tip=' + TRANSFORM(lnTip) + '] rand nou gasit in crsRezultate'
LOOP
ENDIF
lnRNou = RECNO()
LOCAL lnIdVechi, lnIdNou, lnTipIncVechi, lnTipIncNou, lnSumaVechi, lnSumaNou, lcSerieVechi, lcSerieNou
GO lnRVechi IN crsRezultate
lnIdVechi = crsRezultate.id_vanzare
lnTipIncVechi = crsRezultate.tip_incasat
lnSumaVechi = crsRezultate.suma_incasat
lcSerieVechi = crsRezultate.serie_incasat
GO lnRNou IN crsRezultate
lnIdNou = crsRezultate.id_vanzare
lnTipIncNou = crsRezultate.tip_incasat
lnSumaNou = crsRezultate.suma_incasat
lcSerieNou = crsRezultate.serie_incasat
IF lnIdVechi <= 0 OR lnIdNou <= 0
DO Assert WITH .F., '[tip=' + TRANSFORM(lnTip) + '] ambele documente s-au scris (vechi id_vanzare=' + ;
TRANSFORM(lnIdVechi) + ' nou id_vanzare=' + TRANSFORM(lnIdNou) + ')'
LOOP
ENDIF
DO Assert WITH lnTipIncVechi = lnTipIncNou, '[tip=' + TRANSFORM(lnTip) + '] VANZARI.TIP_INCASAT identic (vechi=' + ;
TRANSFORM(lnTipIncVechi) + ' nou=' + TRANSFORM(lnTipIncNou) + ')'
DO Assert WITH ABS(lnSumaVechi - lnSumaNou) < 0.005, '[tip=' + TRANSFORM(lnTip) + '] VANZARI.SUMA_INCASAT identica (vechi=' + ;
TRANSFORM(lnSumaVechi) + ' nou=' + TRANSFORM(lnSumaNou) + ')'
DO Assert WITH ALLTRIM(lcSerieVechi) == ALLTRIM(lcSerieNou), '[tip=' + TRANSFORM(lnTip) + '] VANZARI.SERIE_INCASAT identica (vechi=[' + ;
ALLTRIM(lcSerieVechi) + '] nou=[' + ALLTRIM(lcSerieNou) + '])'
ENDFOR
ENDPROC
*==================================================================================
* CreeazaDocumentIncasare: emite un document REAL prin fluxul de productie (tnTip=22, cursor_preturi,
* client RAJA id_part=463), aplicand tipul de incasare cerut pe formularul indicat. Intoarce
* poDate.nid_vanzare (>0 succes) sau 0 (esec, detaliat in log). gnNrIncasareCapturat e umplut cu
* poDate.nr_incasare chiar inainte de do_termin() - marimea persistata se verifica fata de asta.
FUNCTION CreeazaDocumentIncasare
LPARAMETERS tnTipIncasare, tlFormNou
PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest
LOCAL lnIdSet, lcSqlCursor, lcCursor, lnSucces, lnIdVanzareRezultat, tnTip, tnIdClient, tnIdDelegat
LOCAL lcSerieAlocata, lnNractAlocat
lnIdVanzareRezultat = 0
lcSerieAlocata = ''
lnNractAlocat = 0
gnNrIncasareCapturat = 0
*-- FORMA VECHE: tnTip=22 (AVIZ din lista de preturi) - calea PROVENITA, curata, fara efecte
*-- secundare (nu intra pe ramura "comanda" din do_scrie_factura). opt_incasat traieste pe
*-- frm_alte_date (clasa separata), deci nu are restrictia Between(poDate.tip,1,4).
*-- FORMA NOUA: are nevoie de tnTip Between(1,4) ca opt_incasat sa existe inline pe formular
*-- (ofacturare.vc2:21066) - singurele din acel interval cu date reale in cursor_preturi sunt
*-- 3/4 (probe_emitere_reala.prg), dar tnTip=3 declanseaza un MESSAGEBOX_FORM real necunoscut
*-- mock-ului ("Doriti sa se inchida comanda?") si formularul nou insusi agata la CREATEOBJECT
*-- pe coloana Gestiune a grd_factura (vezi raport) - BLOCAT, nerezolvat in aceasta sesiune.
tnTip = IIF(tlFormNou, 3, 22)
tnIdClient = 463
tnIdDelegat = 256
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
lnIdSet = 25000 + tnTip - 1 + gnScadereStoc * 10
poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poDateGestiuneDest = CREATEOBJECT("oDateGestiune")
IF !tlFormNou
poDate.nIdTipDoc = 6 && AVIZ - plaja globala, dovedit (id_vanzare 1061/1062/1063)
ENDIF
gnIdUtil = 8
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
poDate.id_client = tnIdClient
poDate.id_delegat = tnIdDelegat
poDate.zi_curs = {^2026-08-10}
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 = -3
lcSerieAlocata = ALLTRIM(TRANSFORM(NVL(poDate.serie_act, [])))
lnNractAlocat = poDate.nract
DO S3bLog WITH ' poDate.nract=' + TRANSFORM(poDate.nract) + ' serie_act=[' + TRANSFORM(NVL(poDate.serie_act,[])) + ']'
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
lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_preturi(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ;
[?poDate.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}]
lcCursor = [crsarticole]
lnSucces = goExecutor.oExecute(lcSqlCursor, lcCursor)
IF lnSucces < 0
DO S3bLog WITH ' EROARE cursor articole: ' + goExecutor.oPrelucrareEroare()
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO S3bCurataJtva
RELEASE poDate, poGeneratorNumere, poDateGestiuneDest
RETURN 0
ENDIF
IF RECCOUNT(lcCursor) = 0
DO S3bLog WITH ' Nu exista articole (Reccount=0) - abandon document'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO S3bCurataJtva
RELEASE poDate, poGeneratorNumere, poDateGestiuneDest
RETURN 0
ENDIF
DO S3bLog WITH ' crsarticole Reccount=' + TRANSFORM(RECCOUNT(lcCursor))
*-- Lista de preturi a articolului e in EURO (tip_valuta=1), iar do_scrie_articole
*-- trimite pe ramura aceea vpretftva, derivat din pret_val - fortand doar pret,
*-- documentul iesea cu VANZARI_DETALII.PRET=0. Se forteaza perechea, coerent cu cursul.
SELECT (lcCursor)
REPLACE ALL cantitate WITH 1, ;
pret_val WITH IIF(tip_valuta = 1, 100, 0), ;
pret WITH IIF(tip_valuta = 1, ROUND(100 * IIF(NVL(curs, 0) = 0, 1, curs) / IIF(NVL(multiplicator, 0) = 0, 1, multiplicator), gnPPretV), 100)
=TABLEUPDATE(.T., .T., lcCursor)
GO TOP
creeaza_facturacrs([crsfactura])
IF poDate.in_valuta = 1
SELECT DISTINCT Curs, nume_val, id_valuta, multiplicator FROM (lcCursor) 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 RECCOUNT('crscursuri') = 0
USE IN crscursuri
ENDIF
ENDIF
IF TYPE(lcCursor + '.nume_lista_preturi') <> 'U'
CREATE CURSOR crspolitici (id_pol N(20), nume_lista_preturi c(100))
SELECT crspolitici
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 (lcCursor) ORDER BY nume_lista_preturi
ENDIF
*-- formularul, modeless (apel direct de metode) - vechi sau unificat, dupa tlFormNou
PUBLIC goFrmS3b
IF tlFormNou
goFrmS3b = CREATEOBJECT('frm_facturare_articole2')
ELSE
goFrmS3b = CREATEOBJECT('frm_facturare_articole')
ENDIF
DO S3bLog WITH ' CREATEOBJECT OK, VARTYPE=' + VARTYPE(goFrmS3b)
goFrmS3b.WindowType = 0
DO S3bLog WITH ' WindowType=0 OK'
goFrmS3b.Show()
DO S3bLog WITH ' Show() OK'
DOEVENTS FORCE
DO S3bLog WITH ' formular afisat modeless (' + IIF(tlFormNou, 'NOU frm_facturare_articole2', 'VECHI frm_facturare_articole') + ')'
goFrmS3b.do_adauga_tot()
DOEVENTS FORCE
DO S3bLog WITH ' do_adauga_tot() -> Reccount(crsfactura)=' + TRANSFORM(RECCOUNT('crsfactura'))
goFrmS3b.do_calculeaza_totaluri()
DOEVENTS FORCE
*-- CONT_VENIT asteptat, derivat exact ca in do_scrie_articole (ofacturare.vc2:14279), citit
*-- direct din randul crsfactura pe care do_scrie_articole il va scana
LOCAL lcExpContVenit, lnExpIdPol, lnExpIdArticol, lcExpCont, loExecutorReal
SELECT crsfactura
GO TOP
lnExpIdPol = crsfactura.id_pol
lnExpIdArticol = crsfactura.id_articol
lcExpCont = crsfactura.Cont
lcExpContVenit = IIF(EMPTY(NVL(lnExpIdPol, 0)), deriva_cont_venit_fara_pol(lnExpIdArticol, lcExpCont), '<NULL>')
*-- spion pe goExecutor (tehnica SpyS13, probe_s13_toomanycolumns.prg): captureaza SQL-ul real
*-- trimis de do_scrie_articole, fara sa-i schimbe comportamentul (DODEFAULT pe PCOUNT)
loExecutorReal = goExecutor
goExecutor = CREATEOBJECT('SpyContVenit')
goExecutor.nHandle = gnHandle
LOCAL lnScris
IF tlFormNou
*-- opt_incasat e inline pe formular - fara al doilea modal
goFrmS3b.seteaza_mod_incasare(tnTipIncasare)
gnNrIncasareCapturat = poDate.nr_incasare
DO S3bLog WITH ' opt_incasat.Value=' + TRANSFORM(tnTipIncasare) + ' -> poDate.nr_incasare=' + TRANSFORM(gnNrIncasareCapturat) + ;
' incasat=' + TRANSFORM(poDate.incasat) + ' incasatCARD=' + TRANSFORM(poDate.incasatCARD)
lnScris = goFrmS3b.do_termin()
ELSE
*-- calea veche: al doilea modal (frm_alte_date) e condus de goDriverAD/tmrDrvAD
glDlgTratatAD = .F.
gnTipIncasareCerut = tnTipIncasare
lnScris = goFrmS3b.do_termin()
LOCAL lnWait
lnWait = 0
DO WHILE !glDlgTratatAD AND lnWait < 10
DOEVENTS FORCE
lnWait = lnWait + 1
ENDDO
ENDIF
DO S3bLog WITH ' do_termin() -> ' + TRANSFORM(lnScris) + ' poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare,0))
*-- restaureaza goExecutor real si verifica CONT_VENIT trimis de do_scrie_articole
LOCAL lcActualContVenit, lcEticheta
lcEticheta = '[' + IIF(tlFormNou,'nou','vechi') + ' tip=' + TRANSFORM(tnTipIncasare) + ']'
DO Assert WITH goExecutor.cLastArtCall # '', ;
lcEticheta + ' do_scrie_articole a trimis adauga_articol_factura (spion pe goExecutor)'
IF goExecutor.cLastArtCall # ''
lcActualContVenit = ExtrageContVenit(goExecutor.cLastArtCall)
DO Assert WITH lcActualContVenit == lcExpContVenit, ;
lcEticheta + ' CONT_VENIT trimis de do_scrie_articole = [' + lcExpContVenit + '], obtinut [' + lcActualContVenit + ']'
ENDIF
goExecutor = loExecutorReal
*-- do_termin() intoarce mereu .T. (_frm_base.vc2:363, DoDefault fara RETURN) si nid_vanzare
*-- ramane santinela la esec: singura dovada e randul din VANZARI, pe serie_act + nract.
lnIdVanzareRezultat = CdocGasesteIdVanzare(lcSerieAlocata, lnNractAlocat)
IF lnIdVanzareRezultat < 0
lnIdVanzareRezultat = 0
ENDIF
DO S3bLog WITH ' verificare in VANZARI pe ' + lcSerieAlocata + ' ' + TRANSFORM(lnNractAlocat) + ;
' -> id_vanzare=' + TRANSFORM(lnIdVanzareRezultat)
IF TYPE('goFrmS3b') = 'O' AND !ISNULL(goFrmS3b)
goFrmS3b.Release()
ENDIF
goFrmS3b = NULL
IF USED('crspolitici')
USE IN crspolitici
ENDIF
IF USED('crscursuri')
USE IN crscursuri
ENDIF
IF USED('crsfactura')
USE IN crsfactura
ENDIF
IF USED('crsarticole')
USE IN crsarticole
ENDIF
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
IF USED('jtva_coloane_temp')
USE IN jtva_coloane_temp
ENDIF
RELEASE poDate, poGeneratorNumere, poDateGestiuneDest
RETURN lnIdVanzareRezultat
ENDFUNC
PROCEDURE S3bCurataJtva
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
IF USED('jtva_coloane_temp')
USE IN jtva_coloane_temp
ENDIF
ENDPROC
*-- extrage parametrul 29 (CONT_VENIT) dintr-un apel capturat pack_facturare.adauga_articol_factura(...);
*-- pozitia 28 e mereu literalul NULL, deci pos29 e tot ce urmeaza dupa ultima virgula dinaintea "); end;"
FUNCTION ExtrageContVenit
LPARAMETERS tcSql
LOCAL lnEnd, lcParams, lnComma, lcPos29
lnEnd = AT('); end;', tcSql)
IF lnEnd = 0
RETURN '<NEPARSABIL>'
ENDIF
lcParams = LEFT(tcSql, lnEnd - 1)
lnComma = RAT(',', lcParams)
IF lnComma = 0
RETURN '<NEPARSABIL>'
ENDIF
lcPos29 = SUBSTR(lcParams, lnComma + 1)
IF UPPER(lcPos29) == 'NULL'
RETURN '<NULL>'
ENDIF
RETURN STRTRAN(lcPos29, "'", '')
ENDFUNC
*==================================================================================
*-- SpyContVenit: subclasa a lui oexecutor (tehnica SpyS13 din probe_s13_toomanycolumns.prg) -
*-- logheaza in cLastArtCall statementul adauga_articol_factura, apoi executa normal prin
*-- DODEFAULT pe PCOUNT (fara sa schimbe comportamentul real)
DEFINE CLASS SpyContVenit AS oexecutor
cLastArtCall = ''
PROCEDURE oExecute(tcSql, tcCursor, tlProgress, tcTitluProgress, tnHandle, tlShowError, tlQuitOnError, tlReconnect)
LOCAL lnPc, lcS, lnRet
lnPc = PCOUNT()
lcS = IIF(VARTYPE(m.tcSql) = 'C', m.tcSql, '')
IF 'adauga_articol_factura(' $ lcS
THIS.cLastArtCall = lcS
ENDIF
TRY
DO CASE
CASE lnPc <= 1
lnRet = DODEFAULT(m.tcSql)
CASE lnPc = 2
lnRet = DODEFAULT(m.tcSql, m.tcCursor)
CASE lnPc = 3
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress)
CASE lnPc = 4
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress)
CASE lnPc = 5
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle)
CASE lnPc = 6
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError)
CASE lnPc = 7
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError)
OTHERWISE
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError, m.tlReconnect)
ENDCASE
CATCH TO loExSpy
lnRet = -1
THIS.cEroare = 'SpyContVenit: ' + TRANSFORM(loExSpy.Message)
ENDTRY
RETURN lnRet
ENDPROC
ENDDEFINE
*==================================================================================
*-- driverAlteDateAD: cauta FRM_ALTE_DATE prin _SCREEN.Forms si ii seteaza opt_incasat.Value la
* gnTipIncasareCerut INAINTE de a-i chema .do_termin() - acelasi mecanism ca driverAlteDate8 din
* creeaza_documente_s8.prg, cu un singur adaos (selectia tipului de incasare).
DEFINE CLASS driverAlteDateAD AS Custom
PROCEDURE Executa
LOCAL lnI, loForm, llGasit, loMsgForm
llGasit = .F.
loMsgForm = NULL
FOR lnI = 1 TO _SCREEN.FormCount
LOCAL lcClasa
lcClasa = UPPER(_SCREEN.Forms(lnI).Class)
IF lcClasa == 'FRM_ALTE_DATE'
loForm = _SCREEN.Forms(lnI)
llGasit = .T.
ENDIF
IF 'MESSAGEBOX_FORM' $ lcClasa
loMsgForm = _SCREEN.Forms(lnI)
ENDIF
IF !(lcClasa $ gcClaseVazute)
gcClaseVazute = gcClaseVazute + lcClasa + ';'
DO S3bLog WITH ' [diag timer] forma noua vazuta: ' + lcClasa + ' Caption=[' + TRANSFORM(_SCREEN.Forms(lnI).Caption) + ']'
ENDIF
ENDFOR
*-- confirmare reala neacoperita de mock_amessagebox (forma modala messagebox_form) -
*-- apasa automat cmdYes/cmdOk, ca in productie la raspuns implicit "Da"
IF !ISNULL(loMsgForm)
TRY
DO CASE
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5)
DO S3bLog WITH ' [diag timer] messagebox_form: apas cmgBotones.cmdYes'
loMsgForm.cmgBotones.cmdYes.Click()
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5)
DO S3bLog WITH ' [diag timer] messagebox_form: apas cmgBotones.cmdOk'
loMsgForm.cmgBotones.cmdOk.Click()
ENDCASE
CATCH TO loExcMsg
DO S3bLog WITH ' [diag timer] messagebox_form: CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message
ENDTRY
ENDIF
IF glDlgTratatAD OR !llGasit
RETURN
ENDIF
LOCAL loAC
loAC = loForm.ActiveControl
TRY
loForm.opt_incasat.Value = gnTipIncasareCerut
gnNrIncasareCapturat = poDate.nr_incasare
DO S3bLog WITH ' driverAlteDateAD: opt_incasat.Value=' + TRANSFORM(gnTipIncasareCerut) + ;
' -> poDate.nr_incasare=' + TRANSFORM(gnNrIncasareCapturat) + ' incasat=' + TRANSFORM(poDate.incasat) + ;
' incasatCARD=' + TRANSFORM(poDate.incasatCARD)
loForm.do_termin()
glDlgTratatAD = .T.
CATCH TO loExcDrv
DO S3bLog WITH ' driverAlteDateAD: CATCH ErrorNo=' + TRANSFORM(loExcDrv.ErrorNo) + ' Message=' + loExcDrv.Message + ;
' Procedure=' + loExcDrv.Procedure + ' LineNo=' + TRANSFORM(loExcDrv.LineNo)
glDlgTratatAD = .T.
ENDTRY
ENDPROC
ENDDEFINE

View File

@@ -0,0 +1,28 @@
$ErrorActionPreference = 'Stop'
$dir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat'
$prg = Join-Path $dir 'test_s3b_emitere_reala.prg'
$log = Join-Path $dir 'out\test_s3b_emitere_reala.log'
$vfp = 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe'
$viu = Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*test_s3b_emitere_reala*' }
if ($viu) {
"Ruleaza deja o instanta a suitei (PID " + ($viu.ProcessId -join ',') + "). Nu lansez a doua."
exit 1
}
Set-Location $dir
Remove-Item *.FXP, *.fxp -ErrorAction SilentlyContinue
Remove-Item $log -ErrorAction SilentlyContinue
$p = Start-Process -FilePath $vfp -ArgumentList '-A', '-T', $prg -PassThru
"lansat PID " + $p.Id
$null = $p.WaitForExit(300000)
if (-not $p.HasExited) {
"INCA RULEAZA dupa 300s - omor instanta (filtrat pe CommandLine)"
Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*test_s3b_emitere_reala*' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force }
}
if (Test-Path $log) {
Get-Content $log | Select-String -Pattern '^(PASS|FAIL|ERROR|TOTAL|START|END|=====| MAX| tip_incasat| vechi | nou |CATCH)'
} else {
"Log inexistent: $log"
}

View File

@@ -0,0 +1,323 @@
* test_s3b_incasare_nealocare.prg
* Headless: un ciclu complet de bifare/debifare a casetelor "Alte date" si "Incasare" nu lasa
* alocat niciun numar de bon fiscal (3) / chitanta (16) / POS-Card (26), in ambele scenarii de
* start. Sub comutarea pe casete, bifarea "Incasare" ALOCA o chitanta si debifarea o dezaloca
* (ramura "fara incasare" din actualizeaza_tipincasare); invariantul e pe ciclul intreg, nu pe
* apelul individual. Scenariile de start:
* A - document nou (poDate.incasat = 0 la construire)
* B - document copiat cu incasare presetata (poDate.incasat <> 0 la construire,
* asta ALOCA deja chitanta la Init - comportament asteptat, nu un fail)
* Specificatie: docs\nota_s3b_testare.md sectiunea 1.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3b_incasare_nealocare.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3b_incasare_nealocare.log
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3b_incasare_nealocare.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
* seriile de facturi (tipdoc 5) si de incasare (3/16/26) sunt pe utilizator in MARIUSM_AUTO
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
DO AfLog WITH "gnScadereStoc=" + TRANSFORM(gnScadereStoc)
* gridextras.vcx e referit din ofacturare.vcx cu cale relativa, rezolvabila doar din exe/IDE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
* grd_factura.cCodMat.cboCodmat e declarat AS combosql OF cautare.vcx, dar clasa e in _cb_base.vcx
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
* cboTipFactura (RowSourceType=3) citeste cursorul local saft_tip_facturi ca pe un tabel -
* fara el deschis explicit, Createobject('frm_facturare_articole2') da "File 'saft_tip_facturi.dbf' does not exist"
IF !USED('saft_tip_facturi')
update_saft_tip_facturi()
ENDIF
DO Scenariu_A
DO Scenariu_B
DO Final
PROCEDURE Scenariu_A
* Document nou: poDate.incasat ramane 0 la construire - grupul de incasare nu aloca nimic
* la Init, iar togglingul repetat al celor doua acordeoane nu trebuie sa schimbe nimic.
PRIVATE poDate, poGeneratorNumere, loForm, i, lcInitial, lcCurent
DO AfLog WITH "=== Scenariul A: document nou (poDate.incasat = 0 la construire) ==="
poDate = CREATEOBJECT("oDateFactura", 25000, 1)
poDate.nIdTipDoc = 5
poDate.totalctva = 1000
DO AfLog WITH "A: poDate.tip=" + TRANSFORM(poDate.tip) + " poDate.eProforma=" + TRANSFORM(poDate.eProforma) + " poDate.incasat=" + TRANSFORM(poDate.incasat)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poGeneratorNumere.ResetNumere()
DO ProbaSerii WITH poDate.nIdTipDoc
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
DO Assert WITH poDate.incasat = 0, "A: poDate.incasat ramane 0 inainte de instantiere"
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "A: Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
DO Assert WITH ObjExists(loForm, 'opt_incasat'), "A: opt_incasat prezent (poDate.tip intre 1 si 4)"
lcInitial = StareToate()
DO AfLog WITH "A: stare initiala dupa Createobject: " + lcInitial
DO Assert WITH !EsteAlocat(3) AND !EsteAlocat(16) AND !EsteAlocat(26), "A: nimic alocat la construire"
FOR i = 1 TO 5
loForm.chk_incasare.Value = 1
loForm.do_comuta_incasare()
loForm.chk_incasare.Value = 0
loForm.do_comuta_incasare()
ENDFOR
lcCurent = StareToate()
DO AfLog WITH "A: stare dupa 5x ciclu incasare (bifat+debifat): " + lcCurent
DO Assert WITH lcCurent == lcInitial, "A: neschimbat dupa 5x ciclu incasare (bifat+debifat)"
FOR i = 1 TO 5
loForm.chk_alte_date.Value = 1
loForm.do_comuta_alte_date()
loForm.chk_alte_date.Value = 0
loForm.do_comuta_alte_date()
ENDFOR
lcCurent = StareToate()
DO AfLog WITH "A: stare dupa 5x ciclu alte date (bifat+debifat): " + lcCurent
DO Assert WITH lcCurent == lcInitial, "A: neschimbat dupa 5x ciclu alte date (bifat+debifat)"
FOR i = 1 TO 5
loForm.chk_incasare.Value = 1
loForm.do_comuta_incasare()
loForm.chk_alte_date.Value = 1
loForm.do_comuta_alte_date()
loForm.chk_incasare.Value = 0
loForm.do_comuta_incasare()
loForm.chk_alte_date.Value = 0
loForm.do_comuta_alte_date()
ENDFOR
lcCurent = StareToate()
DO AfLog WITH "A: stare dupa 5x ciclu pe ambele casete: " + lcCurent
DO Assert WITH lcCurent == lcInitial, "A: neschimbat dupa 5x ciclu pe ambele casete"
loForm.Release()
RELEASE loForm
ENDPROC
PROCEDURE Scenariu_B
* Document copiat: poDate.incasat <> 0 la construire - Init aloca deja chitanta (16),
* asta e comportamentul ASTEPTAT (nu un fail). Assertul e ca togglingul repetat NU
* mai schimba nimic fata de starea de dupa construire, si ca la final curatenia
* (opt_incasat.Value = 1) dezaloca explicit tot ce a fost alocat.
PRIVATE poDate, poGeneratorNumere, loForm, i, lcDupaConstruire, lcCurent
DO AfLog WITH "=== Scenariul B: document copiat (poDate.incasat <> 0 la construire) ==="
poDate = CREATEOBJECT("oDateFactura", 25000, 1)
poDate.nIdTipDoc = 5
poDate.totalctva = 1000
poDate.incasat = 100
DO AfLog WITH "B: poDate.tip=" + TRANSFORM(poDate.tip) + " poDate.eProforma=" + TRANSFORM(poDate.eProforma) + " poDate.incasat inainte de Createobject=" + TRANSFORM(poDate.incasat)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poGeneratorNumere.ResetNumere()
DO ProbaSerii WITH poDate.nIdTipDoc
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
DO AfLog WITH "B: stare numere inainte de Createobject: " + StareToate()
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "B: Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
DO AfLog WITH "B: poDate.incasat dupa Init=" + TRANSFORM(poDate.incasat) + " (asteptat = poDate.totalctva)"
DO Assert WITH loForm.ct_incasare.opt_incasat.Value = 1, "B: opt_incasat.Value=1 (chitanta) la construire (poDate.incasat era <> 0)"
DO Assert WITH loForm.chk_incasare.Value = 1, "B: caseta Incasare bifata de seteaza_mod_incasare(2) la construire"
DO Assert WITH loForm.nmod_incasare() = 2, "B: nmod_incasare()=2 (chitanta) la construire"
lcDupaConstruire = StareToate()
DO AfLog WITH "B: stare numere dupa construire: " + lcDupaConstruire
DO Assert WITH EsteAlocat(16) AND !EsteAlocat(3) AND !EsteAlocat(26), "B: doar chitanta (16) alocata la construire, nu si bonul/POS-ul"
FOR i = 1 TO 5
loForm.chk_incasare.Value = 0
loForm.do_comuta_incasare()
loForm.chk_incasare.Value = 1
loForm.do_comuta_incasare()
ENDFOR
lcCurent = StareToate()
DO AfLog WITH "B: stare dupa 5x ciclu incasare (debifat+bifat): " + lcCurent
DO Assert WITH lcCurent == lcDupaConstruire, "B: neschimbat dupa 5x ciclu incasare (debifat+bifat)"
FOR i = 1 TO 5
loForm.chk_alte_date.Value = 1
loForm.do_comuta_alte_date()
loForm.chk_alte_date.Value = 0
loForm.do_comuta_alte_date()
ENDFOR
lcCurent = StareToate()
DO AfLog WITH "B: stare dupa 5x ciclu alte date (bifat+debifat): " + lcCurent
DO Assert WITH lcCurent == lcDupaConstruire, "B: neschimbat dupa 5x ciclu alte date (bifat+debifat)"
FOR i = 1 TO 5
loForm.chk_incasare.Value = 0
loForm.do_comuta_incasare()
loForm.chk_alte_date.Value = 1
loForm.do_comuta_alte_date()
loForm.chk_incasare.Value = 1
loForm.do_comuta_incasare()
loForm.chk_alte_date.Value = 0
loForm.do_comuta_alte_date()
ENDFOR
lcCurent = StareToate()
DO AfLog WITH "B: stare dupa 5x ciclu pe ambele casete: " + lcCurent
DO Assert WITH lcCurent == lcDupaConstruire, "B: neschimbat dupa 5x ciclu pe ambele casete"
* Curatenie obligatorie inainte de Release - altfel ramane un numar real alocat in MARIUSM_AUTO.
* "Fara incasare" e acum caseta debifata: opt_incasat.Value=1 inseamna chitanta, nu golire.
loForm.chk_incasare.Value = 0
loForm.do_comuta_incasare()
DO Assert WITH loForm.nmod_incasare() = 1, "B: nmod_incasare()=1 dupa debifarea casetei"
lcCurent = StareToate()
DO AfLog WITH "B: stare numere dupa curatenie (chk_incasare=0): " + lcCurent
DO Assert WITH !EsteAlocat(3) AND !EsteAlocat(16) AND !EsteAlocat(26), "B: toate trei numerele dezalocate dupa curatenie"
loForm.Release()
RELEASE loForm
ENDPROC
FUNCTION EsteAlocat
* .T. daca tipul tnTip are un numar alocat, in oricare din cele doua reprezentari
* (array paPlaje(tip,1) fara buffer, sau cursorul paPlaje(tip,8) cu buffer)
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
* reprezentare textuala a starii unui tip, pentru comparatie exacta inainte/dupa
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
* apel direct al procedurii Oracle din creeaza_cursor_serii: logheaza eroarea reala (goExecutor
* ar deschide amessagebox modal, care agata rularea headless) si incalzeste starea pachetului
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
FUNCTION ObjExists
* prezenta reala in colectia Objects: dupa RemoveObject, PEMSTATUS(...,5) si TYPE() raman .T./'O'
* Cautarea e RECURSIVA: dupa S7 controalele de sub grila stau in containerele ct_*, nu la
* nivel de formular, iar o cautare plata ar raporta tacut "lipseste".
LPARAMETERS toContainer, tcName
LOCAL i, loO
FOR i = 1 TO toContainer.Objects.Count
loO = toContainer.Objects(i)
IF UPPER(loO.Name) == UPPER(tcName)
RETURN .T.
ENDIF
IF TYPE('loO.Objects.Count') = 'N'
IF ObjExists(loO, tcName)
RETURN .T.
ENDIF
ENDIF
ENDFOR
RETURN .F.
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
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,312 @@
* test_s3b_incasare_paritate_campuri.prg
* Headless: pentru fiecare din cele patru tipuri de incasare (1=Fara incasare, 2=Chitanta,
* 3=Bon fiscal, 4=POS Card), formularul nou (frm_facturare_articole2) aduce poDate in aceeasi
* stare ca dialogul vechi (frm_alte_date) - fara sa treaca prin do_scrie_factura/Termina, deci
* fara sa scrie nimic in Oracle si fara sa emita niciun document.
* Specificatie: docs\nota_s3b_testare.md sectiunea 2b. Nu acopera lcListaIncasare/do_scrie_factura
* insusi (ar cere emitere reala sau un mock detaliat pe goExecutor - vezi sectiunea 2a/2b, ultimul
* paragraf) - asta ramane proba manuala a lui Marius, cerut si de raport_s3b_incasare.md sectiunea 10.
*
* ATENTIE la citirea rezultatelor: din cele cinci campuri cerute de specificatie (poDate.incasat,
* incasatCARD, incasatTichete, id_casa, ntip_incasare), doar poDate.incasat si poDate.id_casa sunt
* scrise efectiv de actualizeaza_tipincasare()/Init - verificat pe cod (ofacturare.vc2, ferestre_
* cere_date.vc2). incasatCARD, incasatTichete si ntip_incasare sunt scrise abia in Termina /
* inainte_de_do_termin (calea care emite, exclusa explicit din acest test - sectiunea 2a). Pentru
* aceste trei campuri parizatea verificata aici e reala, dar putin adanca: confirma doar ca NICIUNA
* din cele doua cai nu le atinge la simplul toggle al opt_incasat (raman la valoarea implicita 0 pe
* ambele cai), nu ca Termina le populeaza identic pe ambele cai.
*
* SECVENTIAL, nu simultan: frm_alte_date e creata, testata pe toate cele patru tipuri si eliberata
* COMPLET inainte sa existe frm_facturare_articole2 - niciodata doua forme vii in acelasi timp.
* Motiv: ambele forme au propriul cboTipFactura cu RowSource IDENTIC ("...into cursor cTipFacturaX",
* ofacturare.vc2:16157 si ferestre_cere_date.vc2:2388), reevaluat la fiecare apel al lui
* actualizeaza_tipincasare() (Thisform.cboTipFactura.Refresh(), prima linie a metodei pe ambele
* forme); cu ambele vii simultan in aceeasi sesiune de date (fara DataSession propriu), doua
* comboboxuri concureaza pe acelasi nume de cursor - suspectat ca varianta paralela (rulata de patru
* ori, toate agatate in acelasi punct) bloca aici, la nivel de tabel, fara sa arunce o exceptie
* catchabila prin ON ERROR. Nota cerea "acelasi poDate", nu simultaneitate - pastrata aici prin
* pastrarea aceluiasi obiect poDate intre cele doua faze, cu cele cinci campuri resetate explicit
* la starea de start intre faze (ca a doua forma sa porneasca de la aceeasi stare ca prima).
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3b_incasare_paritate_campuri.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3b_incasare_paritate_campuri.log
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3b_incasare_paritate_campuri.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
* aliniaza sucursala cu singura plaja POS/card existenta, evita blocajul Oracle pe cursor OUT
gnIdSucursala = 167
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
DO AfLog WITH "gnScadereStoc=" + TRANSFORM(gnScadereStoc)
* gridextras.vcx e referit din ofacturare.vcx cu cale relativa, rezolvabila doar din exe/IDE -
* necesar pentru frm_facturare_articole2 (frm_alte_date nu are grid, dar SET-urile sunt ADDITIVE)
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 ProbaParitate
DO Final
PROCEDURE ProbaParitate
* VARIANTA SECVENTIALA (23.08.2026): nota cerea "acelasi poDate", nu "ambele forme vii in
* acelasi timp" - simultaneitatea era detaliu de implementare, nu cerinta (confirmat de
* team-lead). Motivul schimbarii: frm_alte_date SI frm_facturare_articole2 au fiecare propriul
* cboTipFactura, cu RowSource IDENTIC ("select tip_saftname, cod from saft_tip_facturi into
* cursor cTipFacturaX" - ofacturare.vc2:16157, ferestre_cere_date.vc2:2388), refacut la fiecare
* apel al lui actualizeaza_tipincasare() (Thisform.cboTipFactura.Refresh(), prima linie a
* metodei pe ambele forme). Cu ambele forme vii simultan, in aceeasi sesiune de date (fara
* DataSession propriu pe niciuna), doua comboboxuri concureaza pe acelasi nume de cursor tinta -
* suspiciunea unei asteptari de lacat la nivel de tabel, care nu trece prin ON ERROR (nu e o
* exceptie aruncata). Aici: loVechi e creata, testata COMPLET si eliberata inainte sa existe
* loNou - niciodata doua forme vii simultan.
*
* poDate ramane ACELASI obiect intre cele doua faze (nu se recreeaza) - dar cele cinci campuri
* se retin la start si se restaureaza explicit intre faze, ca a doua forma sa porneasca de la
* aceeasi stare ca prima, nu de la ce a lasat prima in urma.
PRIVATE poDate, poGeneratorNumere, loVechi, loNou, i
LOCAL laTip[4], laNume[4], laRezVechi[4,5]
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)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poGeneratorNumere.ResetNumere()
DO ProbaSerii WITH poDate.nIdTipDoc
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
* starea de start a celor cinci campuri, INAINTE de orice forma - se restaureaza intre faze
LOCAL lnStartIncasat, lnStartCard, lnStartTichete, lnStartCasa, lnStartTipInc
lnStartIncasat = poDate.incasat
lnStartCard = poDate.incasatCARD
lnStartTichete = poDate.incasatTichete
lnStartCasa = poDate.id_casa
lnStartTipInc = poDate.ntip_incasare
DO AfLog WITH "stare start poDate: incasat=" + TRANSFORM(lnStartIncasat) + " incasatCARD=" + TRANSFORM(lnStartCard) + ;
" incasatTichete=" + TRANSFORM(lnStartTichete) + " id_casa=" + TRANSFORM(lnStartCasa) + " ntip_incasare=" + TRANSFORM(lnStartTipInc)
LOCAL lnTip, lcNumeTip
* ---------- FAZA 1: doar frm_alte_date (calea veche), complet, apoi Release() ----------
DO AsiguraSaftTipFacturi
DO AfLog WITH "inainte de Createobject frm_alte_date: USED('saft_tip_facturi')=" + TRANSFORM(USED('saft_tip_facturi')) + ;
" USED('cTipFacturaX')=" + TRANSFORM(USED('cTipFacturaX'))
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.
DO AfLog WITH "dupa Createobject frm_alte_date: USED('cTipFacturaX')=" + TRANSFORM(USED('cTipFacturaX'))
FOR i = 1 TO 4
lnTip = laTip[i]
lcNumeTip = laNume[i]
DO AfLog WITH "vechi [" + lcNumeTip + "]: inainte de opt_incasat.Value=, USED('cTipFacturaX')=" + TRANSFORM(USED('cTipFacturaX'))
loVechi.opt_incasat.Value = lnTip
DO AfLog WITH "vechi [" + lcNumeTip + "]: dupa opt_incasat.Value=, USED('cTipFacturaX')=" + TRANSFORM(USED('cTipFacturaX'))
laRezVechi[i,1] = poDate.incasat
laRezVechi[i,2] = poDate.incasatCARD
laRezVechi[i,3] = poDate.incasatTichete
laRezVechi[i,4] = poDate.id_casa
laRezVechi[i,5] = poDate.ntip_incasare
DO AfLog WITH "vechi [" + lcNumeTip + "]: incasat=" + TRANSFORM(laRezVechi[i,1]) + " incasatCARD=" + TRANSFORM(laRezVechi[i,2]) + ;
" incasatTichete=" + TRANSFORM(laRezVechi[i,3]) + " id_casa=" + TRANSFORM(laRezVechi[i,4]) + " ntip_incasare=" + TRANSFORM(laRezVechi[i,5])
DO AfLog WITH "vechi [" + lcNumeTip + "]: stare numere=" + StareToate()
loVechi.opt_incasat.Value = 1
DO AfLog WITH "vechi [" + lcNumeTip + "]: dezalocat, stare numere=" + 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'))
* readuce poDate la starea de start, ca a doua forma sa porneasca identic cu prima
poDate.incasat = lnStartIncasat
poDate.incasatCARD = lnStartCard
poDate.incasatTichete = lnStartTichete
poDate.id_casa = lnStartCasa
poDate.ntip_incasare = lnStartTipInc
DO AfLog WITH "poDate resetat inainte de a doua forma: incasat=" + TRANSFORM(poDate.incasat) + " id_casa=" + TRANSFORM(poDate.id_casa)
* ---------- FAZA 2: doar frm_facturare_articole2 (calea noua) ----------
DO AsiguraSaftTipFacturi
DO AfLog WITH "inainte de Createobject frm_facturare_articole2: USED('saft_tip_facturi')=" + TRANSFORM(USED('saft_tip_facturi')) + ;
" USED('cTipFacturaX')=" + TRANSFORM(USED('cTipFacturaX'))
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.
DO AfLog WITH "dupa Createobject frm_facturare_articole2: USED('cTipFacturaX')=" + TRANSFORM(USED('cTipFacturaX'))
FOR i = 1 TO 4
lnTip = laTip[i]
lcNumeTip = laNume[i]
DO AfLog WITH "nou [" + lcNumeTip + "]: inainte de opt_incasat.Value=, USED('cTipFacturaX')=" + TRANSFORM(USED('cTipFacturaX'))
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=, USED('cTipFacturaX')=" + TRANSFORM(USED('cTipFacturaX'))
DO AfLog WITH "nou [" + lcNumeTip + "]: incasat=" + TRANSFORM(poDate.incasat) + " incasatCARD=" + TRANSFORM(poDate.incasatCARD) + ;
" incasatTichete=" + TRANSFORM(poDate.incasatTichete) + " id_casa=" + TRANSFORM(poDate.id_casa) + " ntip_incasare=" + TRANSFORM(poDate.ntip_incasare)
DO Assert WITH poDate.incasat = laRezVechi[i,1], "[" + lcNumeTip + "] poDate.incasat identic (vechi=" + TRANSFORM(laRezVechi[i,1]) + " nou=" + TRANSFORM(poDate.incasat) + ")"
DO Assert WITH poDate.incasatCARD = laRezVechi[i,2], "[" + lcNumeTip + "] poDate.incasatCARD identic"
DO Assert WITH poDate.incasatTichete = laRezVechi[i,3], "[" + lcNumeTip + "] poDate.incasatTichete identic"
DO Assert WITH poDate.id_casa = laRezVechi[i,4], "[" + lcNumeTip + "] poDate.id_casa identic"
DO Assert WITH poDate.ntip_incasare = laRezVechi[i,5], "[" + lcNumeTip + "] poDate.ntip_incasare identic"
loNou.seteaza_mod_incasare(1)
DO Assert WITH loNou.nmod_incasare() = 1, "[" + lcNumeTip + "] nmod_incasare() reflecta seteaza_mod_incasare(1) (dezalocare)"
DO AfLog WITH "nou [" + lcNumeTip + "]: dezalocat, stare numere=" + 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
DO AfLog WITH "dupa Release loNou: USED('saft_tip_facturi')=" + TRANSFORM(USED('saft_tip_facturi')) + ;
" USED('cTipFacturaX')=" + TRANSFORM(USED('cTipFacturaX'))
ENDPROC
PROCEDURE AsiguraSaftTipFacturi
* cboTipFactura (RowSourceType=3) citeste cursorul local saft_tip_facturi ca pe un tabel la
* instantiere (ofacturare.vc2:16157 - frm_facturare_articole2, ferestre_cere_date.vc2:2388 -
* frm_alte_date). Structura copiata din update_saft_tip_facturi (updateserver.prg:669-691),
* fara apel la server - cursor local, dummy, cu randul gol si indexul pe cod ca in original.
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
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
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View 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

View File

@@ -0,0 +1,28 @@
$ErrorActionPreference = 'Stop'
$dir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat'
$prg = Join-Path $dir 'test_s3b_paritate_emitere.prg'
$log = Join-Path $dir 'out\test_s3b_paritate_emitere.log'
$vfp = 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe'
$viu = Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*test_s3b_paritate_emitere*' }
if ($viu) {
"Ruleaza deja o instanta a suitei (PID " + ($viu.ProcessId -join ',') + "). Nu lansez a doua."
exit 1
}
Set-Location $dir
Remove-Item *.FXP, *.fxp -ErrorAction SilentlyContinue
Remove-Item $log -ErrorAction SilentlyContinue
$p = Start-Process -FilePath $vfp -ArgumentList '-A', '-T', $prg -PassThru
"lansat PID " + $p.Id
$null = $p.WaitForExit(300000)
if (-not $p.HasExited) {
"INCA RULEAZA dupa 300s - omor instanta"
Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*test_s3b_paritate_emitere*' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force }
}
if (Test-Path $log) {
Get-Content $log | Select-String -Pattern '^(PASS|FAIL|ERROR|TOTAL|pre-proba plaje:)'
} else {
"Log inexistent: $log"
}

View File

@@ -0,0 +1,293 @@
* test_s3b_referinta_ui.prg
* UI VIZIBIL: capturi de REFERINTA pe frm_facturare_articole2 (COMUN\clase\ofacturare.vc2) ASA CUM E
* AZI, inainte de orice modificare vizuala. Formular maximizat, apoi do_comuta_alte_date() /
* do_comuta_incasare() pentru cele 4 stari cerute (ambele plaite / alte date deschis / incasare
* deschis / ambele deschise). Pe langa PNG-uri (via harness), dupa fiecare stare extrage geometria
* REALA la runtime (Thisform.Objects: Name/Class/Left/Top/Width/Height/Visible) intr-un .tsv si
* calculeaza suprapuneri / iesiri din zona utila / controale lipite. NU modifica nimic - doar
* citeste stare si captureaza.
*
* Mediu: copiat din test_s3b_incasare_nealocare.prg (validat azi, 14 pass / 0 fail) - poDate cu
* nIdTipDoc=5 (FACTURA, tip 1, opt_incasat prezent), poGeneratorNumere REAL (nu mock), fara nicio
* alocare de numar (poDate.incasat ramane 0 la construire, opt_incasat.Value nu se atinge).
*
* Rulare: powershell -ExecutionPolicy Bypass -File test_s3b_referinta_ui.ps1 (timeout >= 300s)
* Log: facturare_unificat\test_s3b_referinta_ui_log.txt ; capturi in screenshots_referinta\ ;
* geometrie in out\geom_referinta_<eticheta>.tsv
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcUILog, gcSyncDir, gnFail, gnPass
gcUILog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3b_referinta_ui_log.txt"
gcSyncDir = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\uisync_referinta\"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
gnFail = 0
gnPass = 0
PUBLIC gcRaport
gcRaport = ""
ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out")
MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out"
ENDIF
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", "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.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
* seriile de facturi (tipdoc 5) si de incasare (3/16/26) sunt pe utilizator in MARIUSM_AUTO
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
DO AfLog WITH "gnScadereStoc=" + TRANSFORM(gnScadereStoc)
* gridextras.vcx e referit din ofacturare.vcx cu cale relativa, rezolvabila doar din exe/IDE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
* grd_factura.cCodMat.cboCodmat e declarat AS combosql OF cautare.vcx, dar clasa e in _cb_base.vcx
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
* cboTipFactura (RowSourceType=3) citeste cursorul local saft_tip_facturi ca pe un tabel -
* fara el deschis explicit, Createobject('frm_facturare_articole2') da "File 'saft_tip_facturi.dbf' does not exist"
IF !USED('saft_tip_facturi')
update_saft_tip_facturi()
ENDIF
PRIVATE poDate, poGeneratorNumere, loForm, lcTsv, lcRaportFile
lcRaportFile = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_referinta_raport.txt"
* document nou: poDate.incasat ramane 0 la construire - identic Scenariul A din test_s3b_incasare_nealocare.prg
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)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poGeneratorNumere.ResetNumere()
DO ProbaSerii WITH poDate.nIdTipDoc
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
DO Final
ENDIF
DO Assert WITH ObjExists(loForm, 'opt_incasat'), "opt_incasat prezent (poDate.tip intre 1 si 4, deci grupul de incasare exista)"
loForm.WindowType = 0
loForm.Show()
loForm.WindowState = 2
DOEVENTS FORCE
* pas0: stare initiala dupa Createobject - ambele acordeoane plaite (lalte_date_deschis=.F., lincasare_deschis=.F. by design)
DO AfLog WITH "PAS0 stare initiala: lalte_date_deschis=" + TRANSFORM(loForm.lalte_date_deschis) + " lincasare_deschis=" + TRANSFORM(loForm.lincasare_deschis)
lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_referinta_stare_initiala.tsv"
DO DumpSiAnalizeaza WITH loForm, "stare initiala (ambele plaite)", lcTsv
DO HarnessStep WITH 0, 'stare_initiala', 6
* pas1: Alte date deschis - caseta se seteaza INAINTE de comutare (metoda citeste caseta)
loForm.chk_alte_date.Value = 1
loForm.do_comuta_alte_date()
DOEVENTS FORCE
DO AfLog WITH "PAS1 alte date deschis: lalte_date_deschis=" + TRANSFORM(loForm.lalte_date_deschis) + " lincasare_deschis=" + TRANSFORM(loForm.lincasare_deschis)
lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_referinta_alte_date.tsv"
DO DumpSiAnalizeaza WITH loForm, "Alte date deschis", lcTsv
DO HarnessStep WITH 1, 'alte_date_deschis', 6
* pas2: Alte date inchis la loc, Incasare deschis
* bifarea casetei aloca o chitanta reala in MARIUSM_AUTO - vezi curatenia de dinainte de Release
loForm.chk_alte_date.Value = 0
loForm.do_comuta_alte_date()
loForm.chk_incasare.Value = 1
loForm.do_comuta_incasare()
DOEVENTS FORCE
DO AfLog WITH "PAS2 incasare deschis: lalte_date_deschis=" + TRANSFORM(loForm.lalte_date_deschis) + " lincasare_deschis=" + TRANSFORM(loForm.lincasare_deschis)
lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_referinta_incasare.tsv"
DO DumpSiAnalizeaza WITH loForm, "Incasare deschis", lcTsv
DO HarnessStep WITH 2, 'incasare_deschis', 6
* pas3: Alte date deschis din nou - ambele deschise simultan
loForm.chk_alte_date.Value = 1
loForm.do_comuta_alte_date()
DOEVENTS FORCE
DO AfLog WITH "PAS3 ambele deschise: lalte_date_deschis=" + TRANSFORM(loForm.lalte_date_deschis) + " lincasare_deschis=" + TRANSFORM(loForm.lincasare_deschis)
lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_referinta_ambele.tsv"
DO DumpSiAnalizeaza WITH loForm, "Ambele deschise", lcTsv
DO HarnessStep WITH 3, 'ambele_deschise', 6
STRTOFILE(gcRaport, lcRaportFile)
DO AfLog WITH "Raport geometrie scris in " + lcRaportFile
* curatenie obligatorie: bifarea casetei la pasul 2 a alocat o chitanta reala in MARIUSM_AUTO,
* iar debifarea ruleaza ramura "fara incasare", care dezaloca 16/3/26
loForm.chk_incasare.Value = 0
loForm.do_comuta_incasare()
DO Assert WITH loForm.nmod_incasare() = 1, "dupa curatenie: nmod_incasare()=1 (fara incasare)"
loForm.Release()
RELEASE loForm
DO Final
*----------------------------------------------------------------------------------------
PROCEDURE DumpSiAnalizeaza
* Parcurge Thisform.Objects (top-level, fara recursie in containere) - dupa S7 NU mai vede cele
* 30 de controale mutate in ct_document/ct_contabilitate/ct_livrare/ct_incasare; harta completa
* cere enumerare recursiva (vezi test_s5_benzi2_ui.prg). Scrie .tsv cu
* Name/Class/Left/Top/Width/Height/Visible pentru fiecare obiect cu geometrie, apoi
* calculeaza suprapuneri (2D), iesire din zona utila a formularului si perechi lipite
* (<4px) pe orizontala/verticala, doar intre controale Visible=.T. Adauga sectiunea la gcRaport.
LPARAMETERS toForm, tcEticheta, tcTsvPath
LOCAL i, j, loO, lcOut, lnN, lnCount, llVis
LOCAL ARRAY laN[400], laC[400], laL[400], laT[400], laW[400], laH[400], laV[400]
lnN = 0
lcOut = "Name" + CHR(9) + "Class" + CHR(9) + "Left" + CHR(9) + "Top" + CHR(9) + "Width" + CHR(9) + "Height" + CHR(9) + "Visible" + CHR(13) + CHR(10)
lnCount = toForm.Objects.Count
FOR i = 1 TO lnCount
loO = toForm.Objects(i)
IF TYPE('loO.Left') = 'N' AND TYPE('loO.Top') = 'N' AND TYPE('loO.Width') = 'N' AND TYPE('loO.Height') = 'N' AND lnN < 400
llVis = IIF(TYPE('loO.Visible') = 'L', loO.Visible, .T.)
lnN = lnN + 1
laN[lnN] = loO.Name
laC[lnN] = loO.Class
laL[lnN] = loO.Left
laT[lnN] = loO.Top
laW[lnN] = loO.Width
laH[lnN] = loO.Height
laV[lnN] = llVis
lcOut = lcOut + loO.Name + CHR(9) + loO.Class + CHR(9) + TRANSFORM(loO.Left) + CHR(9) + TRANSFORM(loO.Top) + CHR(9) + TRANSFORM(loO.Width) + CHR(9) + TRANSFORM(loO.Height) + CHR(9) + TRANSFORM(llVis) + CHR(13) + CHR(10)
ENDIF
ENDFOR
STRTOFILE(lcOut, tcTsvPath)
DO AfLog WITH "GEOMETRIE [" + tcEticheta + "]: " + TRANSFORM(lnN) + " controale cu geometrie din " + TRANSFORM(lnCount) + " obiecte totale -> " + tcTsvPath
LOCAL lnAL, lnAT, lnAR, lnAB, lnBL, lnBT, lnBR, lnBB, lnOvX, lnOvY, lnGap
LOCAL lcSectiune
lcSectiune = "=== " + tcEticheta + " (forma " + TRANSFORM(toForm.Width) + "x" + TRANSFORM(toForm.Height) + ") ===" + CHR(13) + CHR(10)
FOR i = 1 TO lnN
IF !laV[i]
LOOP
ENDIF
lnAL = laL[i]
lnAT = laT[i]
lnAR = laL[i] + laW[i]
lnAB = laT[i] + laH[i]
IF lnAL < 0 OR lnAT < 0 OR lnAR > toForm.Width OR lnAB > toForm.Height
lcSectiune = lcSectiune + "IESIT: " + laN[i] + " (" + laC[i] + ") Left=" + TRANSFORM(lnAL) + " Top=" + TRANSFORM(lnAT) + " Right=" + TRANSFORM(lnAR) + " Bottom=" + TRANSFORM(lnAB) + CHR(13) + CHR(10)
ENDIF
FOR j = i + 1 TO lnN
IF !laV[j]
LOOP
ENDIF
lnBL = laL[j]
lnBT = laT[j]
lnBR = laL[j] + laW[j]
lnBB = laT[j] + laH[j]
lnOvX = MIN(lnAR, lnBR) - MAX(lnAL, lnBL)
lnOvY = MIN(lnAB, lnBB) - MAX(lnAT, lnBT)
IF lnOvX > 0 AND lnOvY > 0
lcSectiune = lcSectiune + "SUPRAPUNERE: " + laN[i] + " (" + laC[i] + ") x " + laN[j] + " (" + laC[j] + ") " + TRANSFORM(lnOvX) + "x" + TRANSFORM(lnOvY) + "px" + CHR(13) + CHR(10)
ELSE
IF lnOvY > 0 AND lnOvX <= 0 AND -lnOvX < 4
lnGap = -lnOvX
lcSectiune = lcSectiune + "LIPIT-ORIZ: " + laN[i] + " - " + laN[j] + " gap=" + TRANSFORM(lnGap) + "px" + CHR(13) + CHR(10)
ENDIF
IF lnOvX > 0 AND lnOvY <= 0 AND -lnOvY < 4
lnGap = -lnOvY
lcSectiune = lcSectiune + "LIPIT-VERT: " + laN[i] + " - " + laN[j] + " gap=" + TRANSFORM(lnGap) + "px" + CHR(13) + CHR(10)
ENDIF
ENDIF
ENDFOR
ENDFOR
gcRaport = gcRaport + lcSectiune + CHR(13) + CHR(10)
ENDPROC
PROCEDURE ProbaSerii
* apel direct al procedurii Oracle din creeaza_cursor_serii: logheaza eroarea reala (goExecutor
* ar deschide amessagebox modal, care agata rularea headless) si incalzeste starea pachetului
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
FUNCTION ObjExists
* Cautare RECURSIVA: dupa S7 controalele de sub grila nu mai sunt in Thisform.Objects, ci in
* containerele lor - o cautare plata ar raporta tacut "lipseste".
LPARAMETERS toContainer, tcName
LOCAL i, loO
FOR i = 1 TO toContainer.Objects.Count
loO = toContainer.Objects(i)
IF UPPER(loO.Name) == UPPER(tcName)
RETURN .T.
ENDIF
IF TYPE('loO.Objects.Count') = 'N'
IF ObjExists(loO, tcName)
RETURN .T.
ENDIF
ENDIF
ENDFOR
RETURN .F.
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), gcUILog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gnFail = gnFail + 1
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail)
DO AfLog WITH "END " + TTOC(DATETIME())
DO HarnessDone WITH 'done'
QUIT
ENDPROC

View File

@@ -0,0 +1,11 @@
# test_s3b_referinta_ui.ps1 - wrapper peste harness-ul generic (vfp_ui_harness.ps1) pentru
# test_s3b_referinta_ui.prg. Capturi de REFERINTA pe frm_facturare_articole2 (ofacturare.vc2),
# ASA CUM E AZI - nu modifica nimic vizual, doar deschide/inchide acordeoanele Alte date / Incasare.
# Rulare: powershell -ExecutionPolicy Bypass -File test_s3b_referinta_ui.ps1 (timeout >= 300s)
$ErrorActionPreference = 'Stop'
$Teste = $PSScriptRoot
& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') `
-TestPrg (Join-Path $Teste 'test_s3b_referinta_ui.prg') `
-Steps @('stare_initiala','alte_date_deschis','incasare_deschis','ambele_deschise') `
-SyncDir (Join-Path $Teste 'uisync_referinta') `
-ShotsDir (Join-Path $Teste 'screenshots_referinta')

View File

@@ -0,0 +1,302 @@
* test_s3c_1_paritate_sursa.prg
* Headless: paritatea lui oDateFactura.Init cu/ fara parametrul optional de sursa (comanda/contract).
* Dovedeste ca apelul vechi (fara sursa) citeste din goComanda/goContract ca inainte (fallback), iar
* apelul nou (cu toSursa obiect) citeste din parametru chiar si cand globala e populata diferit.
* Nu instantiaza niciun formular: doar oDateFactura + functiile .prg, cu goExecutor inlocuit de
* oExecutorMockS3c (intercepteaza DOAR cursorele crsCtrTemp/crsComTemp din cele doua ramuri de sursa).
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3c_1_paritate_sursa.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3c_1_paritate_sursa.log
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gcCaz, gcErr
PUBLIC goComanda, goContract
PUBLIC gnMockIdCtr, gnMockIdSectie, goExecutorReal
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3c_1_paritate_sursa.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
gcCaz = ""
gcErr = ""
gnMockIdCtr = 0
gnMockIdSectie = 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
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
gnScadereStoc = 1
DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna)
goExecutorReal = goExecutor
goExecutor = CREATEOBJECT("oExecutorMockS3c")
goExecutor.oReal = goExecutorReal
DO CazTipParam
DO CazComandaFallback
DO CazComandaParam
DO CazContractFallback
DO CazContractParam
DO CazContractTip52Fallback
DO CazTip1FaraSursa
DO CazTip1GlobalMurdar
DO Final
*----------------------------------------------------------------------------------------
PROCEDURE CazTipParam
gcCaz = "[S3C0_TIP_PARAM] "
DO AfLog WITH "PAS: " + gcCaz
DO Assert WITH ProbaTipParam(1) == 'L', "Type(param nepasat) = 'L' (nu 'U')"
DO Assert WITH ProbaTipParam(1) <> 'U', "Type(param nepasat) NU e 'U'"
DO Assert WITH ProbaTipParam(1, 2, CREATEOBJECT('Custom')) == 'O', "Type(param obiect pasat) = 'O'"
ENDPROC
*----------------------------------------------------------------------------------------
PROCEDURE CazComandaFallback
gcCaz = "[COMANDA_FALLBACK] "
DO AfLog WITH "PAS: " + gcCaz
goComanda = CreSursaComanda(101, "COMANDA GLOBAL", "CF-G", 1001, "NR-G", 11)
LOCAL lo
lo = CREATEOBJECT("oDateFactura", 25012, 3)
DO Assert WITH VARTYPE(lo) = 'O', "Createobject oDateFactura(tip 3, fara sursa)"
DO Assert WITH lo.id_client = 101, "id_client din goComanda"
DO Assert WITH ALLTRIM(lo.nume_client) == "COMANDA GLOBAL", "nume_client din goComanda"
DO Assert WITH ALLTRIM(lo.cod_fiscal) == "CF-G", "cod_fiscal din goComanda"
DO Assert WITH lo.listaid = 1001, "listaid din goComanda"
DO Assert WITH ALLTRIM(lo.descriere) == "NR-G", "descriere din goComanda"
DO Assert WITH lo.id_sectie = 11, "id_sectie din goComanda"
DO Assert WITH ALLTRIM(lo.sectie) == "SECTIE 11", "sectie derivata din goComanda.id_sectie"
ENDPROC
*----------------------------------------------------------------------------------------
PROCEDURE CazComandaParam
gcCaz = "[COMANDA_PARAM] "
DO AfLog WITH "PAS: " + gcCaz
goComanda = CreSursaComanda(101, "COMANDA GLOBAL", "CF-G", 1001, "NR-G", 11)
LOCAL loSursa, lo
loSursa = CreSursaComanda(201, "COMANDA PARAM", "CF-P", 2001, "NR-P", 22)
lo = CREATEOBJECT("oDateFactura", 25012, 3, loSursa)
DO Assert WITH VARTYPE(lo) = 'O', "Createobject oDateFactura(tip 3, cu sursa)"
DO Assert WITH lo.id_client = 201, "id_client din toSursa (nu globala)"
DO Assert WITH ALLTRIM(lo.nume_client) == "COMANDA PARAM", "nume_client din toSursa"
DO Assert WITH ALLTRIM(lo.cod_fiscal) == "CF-P", "cod_fiscal din toSursa"
DO Assert WITH lo.listaid = 2001, "listaid din toSursa"
DO Assert WITH ALLTRIM(lo.descriere) == "NR-P", "descriere din toSursa"
DO Assert WITH lo.id_sectie = 22, "id_sectie din toSursa"
DO Assert WITH ALLTRIM(lo.sectie) == "SECTIE 22", "sectie derivata din toSursa.id_sectie"
ENDPROC
*----------------------------------------------------------------------------------------
PROCEDURE CazContractFallback
gcCaz = "[CONTRACT_FALLBACK] "
DO AfLog WITH "PAS: " + gcCaz
goContract = CreSursaContract(301, "CONTRACT GLOBAL", "CF-CG", 3001, "CTR-G", 33, "SEC-G", 331, "RESP-G", 1, "RON")
LOCAL lo
lo = CREATEOBJECT("oDateFactura", 25011, 2)
DO Assert WITH VARTYPE(lo) = 'O', "Createobject oDateFactura(tip 2, fara sursa)"
DO Assert WITH lo.id_client = 301, "id_client din goContract"
DO Assert WITH ALLTRIM(lo.nume_client) == "CONTRACT GLOBAL", "nume_client din goContract"
DO Assert WITH ALLTRIM(lo.cod_fiscal) == "CF-CG", "cod_fiscal din goContract"
DO Assert WITH lo.listaid = 3001, "listaid din goContract"
DO Assert WITH ALLTRIM(lo.descriere) == "CTR-G", "descriere din goContract"
DO Assert WITH lo.id_sectie = 33, "id_sectie din goContract"
DO Assert WITH ALLTRIM(lo.sectie) == "SEC-G", "sectie din goContract"
DO Assert WITH lo.id_responsabil = 331, "id_responsabil din goContract"
DO Assert WITH ALLTRIM(lo.responsabil) == "RESP-G", "responsabil din goContract"
DO Assert WITH lo.id_valuta = 1, "id_valuta din goContract"
DO Assert WITH ALLTRIM(lo.nume_valuta) == "RON", "nume_valuta din goContract"
DO Assert WITH gnMockIdCtr = 3001, "SQL fact_vcontracte foloseste goContract.id_ctr"
ENDPROC
*----------------------------------------------------------------------------------------
PROCEDURE CazContractParam
gcCaz = "[CONTRACT_PARAM] "
DO AfLog WITH "PAS: " + gcCaz
goContract = CreSursaContract(301, "CONTRACT GLOBAL", "CF-CG", 3001, "CTR-G", 33, "SEC-G", 331, "RESP-G", 1, "RON")
LOCAL loSursa, lo
loSursa = CreSursaContract(401, "CONTRACT PARAM", "CF-CP", 4001, "CTR-P", 44, "SEC-P", 441, "RESP-P", 2, "EUR")
lo = CREATEOBJECT("oDateFactura", 25011, 2, loSursa)
DO Assert WITH VARTYPE(lo) = 'O', "Createobject oDateFactura(tip 2, cu sursa)"
DO Assert WITH lo.id_client = 401, "id_client din toSursa (nu globala)"
DO Assert WITH ALLTRIM(lo.nume_client) == "CONTRACT PARAM", "nume_client din toSursa"
DO Assert WITH ALLTRIM(lo.cod_fiscal) == "CF-CP", "cod_fiscal din toSursa"
DO Assert WITH lo.listaid = 4001, "listaid din toSursa"
DO Assert WITH ALLTRIM(lo.descriere) == "CTR-P", "descriere din toSursa"
DO Assert WITH lo.id_sectie = 44, "id_sectie din toSursa"
DO Assert WITH ALLTRIM(lo.sectie) == "SEC-P", "sectie din toSursa"
DO Assert WITH lo.id_responsabil = 441, "id_responsabil din toSursa"
DO Assert WITH ALLTRIM(lo.responsabil) == "RESP-P", "responsabil din toSursa"
DO Assert WITH lo.id_valuta = 2, "id_valuta din toSursa"
DO Assert WITH ALLTRIM(lo.nume_valuta) == "EUR", "nume_valuta din toSursa"
DO Assert WITH gnMockIdCtr = 4001, "SQL fact_vcontracte foloseste toSursa.id_ctr"
ENDPROC
*----------------------------------------------------------------------------------------
PROCEDURE CazContractTip52Fallback
gcCaz = "[CONTRACT_TIP52_FALLBACK] "
DO AfLog WITH "PAS: " + gcCaz
goContract = CreSursaContract(301, "CONTRACT GLOBAL", "CF-CG", 3001, "CTR-G", 33, "SEC-G", 331, "RESP-G", 1, "RON")
LOCAL lo
lo = CREATEOBJECT("oDateFactura", 25061, 52)
DO Assert WITH VARTYPE(lo) = 'O', "Createobject oDateFactura(tip 52, fara sursa)"
DO Assert WITH lo.id_client = 301, "id_client din goContract (INLIST acopera tip 52)"
DO Assert WITH lo.listaid = 3001, "listaid din goContract (tip 52)"
ENDPROC
*----------------------------------------------------------------------------------------
PROCEDURE CazTip1FaraSursa
gcCaz = "[TIP1_FARA_SURSA] "
DO AfLog WITH "PAS: " + gcCaz
RELEASE goComanda, goContract
gcErr = ""
LOCAL lo
lo = CREATEOBJECT("oDateFactura", 25010, 1)
DO Assert WITH VARTYPE(lo) = 'O', "Createobject oDateFactura(tip 1) fara eroare"
DO Assert WITH EMPTY(gcErr), "nicio eroare pe tip 1 - " + gcErr
DO Assert WITH ISNULL(lo.id_client), "id_client ramane Null (nicio precompletare)"
DO Assert WITH EMPTY(lo.nume_client), "nume_client ramane gol (nicio precompletare)"
ENDPROC
*----------------------------------------------------------------------------------------
PROCEDURE CazTip1GlobalMurdar
gcCaz = "[TIP1_GLOBAL_MURDAR] "
DO AfLog WITH "PAS: " + gcCaz
goComanda = CreSursaComanda(101, "COMANDA GLOBAL", "CF-G", 1001, "NR-G", 11)
gcErr = ""
LOCAL lo
lo = CREATEOBJECT("oDateFactura", 25010, 1)
DO Assert WITH VARTYPE(lo) = 'O', "Createobject oDateFactura(tip 1) cu globala murdara"
DO Assert WITH EMPTY(gcErr), "nicio eroare pe tip 1 cu globala murdara - " + gcErr
DO Assert WITH ISNULL(lo.id_client), "id_client ramane Null (garda tnTip=3 nu se declanseaza)"
ENDPROC
*----------------------------------------------------------------------------------------
FUNCTION ProbaTipParam
LPARAMETERS tnA, tnB, toC
RETURN TYPE('toC')
ENDFUNC
*----------------------------------------------------------------------------------------
FUNCTION CreSursaComanda
LPARAMETERS tnIdPart, tcNume, tcCodFiscal, tnIdComanda, tcNrComanda, tnIdSectie
CREATE CURSOR _cs (id_part N(10), nume C(50), cod_fiscal C(20), id_comanda N(10), nr_comanda C(20), id_sectie N(10))
INSERT INTO _cs VALUES (tnIdPart, tcNume, tcCodFiscal, tnIdComanda, tcNrComanda, tnIdSectie)
LOCAL loS
SCATTER NAME loS MEMO
USE IN _cs
RETURN loS
ENDFUNC
*----------------------------------------------------------------------------------------
FUNCTION CreSursaContract
LPARAMETERS tnIdPart, tcDenumire, tcCodFiscal, tnIdCtr, tcContract, tnIdSectie, tcSectie, tnIdResp, tcResp, tnIdVal, tcVal
CREATE CURSOR _cc (id_part N(10), denumire C(50), cod_fiscal C(20), id_ctr N(10), contract C(30), id_sectie N(10), ;
sectie C(30), id_responsabil N(10), responsabil C(30), id_valuta N(10), nume_val C(10))
INSERT INTO _cc VALUES (tnIdPart, tcDenumire, tcCodFiscal, tnIdCtr, tcContract, tnIdSectie, tcSectie, tnIdResp, tcResp, tnIdVal, tcVal)
LOCAL loS
SCATTER NAME loS MEMO
USE IN _cc
RETURN loS
ENDFUNC
*----------------------------------------------------------------------------------------
DEFINE CLASS oExecutorMockS3c AS oexecutor
oReal = NULL
PROCEDURE oExecute
LPARAMETERS tcSql, tcCursor, tlProgress, tcTitluProgress, tnHandle, tlShowError, tlQuitOnError, tlReconnect
LOCAL lcCur, lcSql, lnPos
lcCur = UPPER(ALLTRIM(TRANSFORM(tcCursor)))
lcSql = TRANSFORM(tcSql)
IF lcCur == 'CRSCTRTEMP'
lnPos = AT('id_ctr =', lcSql)
IF lnPos > 0
gnMockIdCtr = VAL(SUBSTR(lcSql, lnPos + LEN('id_ctr =')))
ENDIF
DO CreeazaCtrTemp
RETURN 1
ENDIF
IF lcCur == 'CRSCOMTEMP'
lnPos = AT('id_sectie =', lcSql)
IF lnPos > 0
gnMockIdSectie = VAL(SUBSTR(lcSql, lnPos + LEN('id_sectie =')))
ENDIF
DO CreeazaComTemp WITH gnMockIdSectie
RETURN 1
ENDIF
RETURN This.oReal.oExecute(tcSql, tcCursor)
ENDPROC
FUNCTION oPrelucrareEroare
RETURN "MOCK eroare Oracle"
ENDFUNC
ENDDEFINE
*----------------------------------------------------------------------------------------
PROCEDURE CreeazaCtrTemp
IF USED('crsCtrTemp')
USE IN crsCtrTemp
ENDIF
CREATE CURSOR crsCtrTemp (scadenta_incasare N(6), afisare_scadenta N(1), opt_facturare N(1))
RETURN
ENDPROC
*----------------------------------------------------------------------------------------
PROCEDURE CreeazaComTemp
LPARAMETERS tnIdSectie
IF USED('crsComTemp')
USE IN crsComTemp
ENDIF
CREATE CURSOR crsComTemp (sectie C(100))
INSERT INTO crsComTemp VALUES ("SECTIE " + ALLTRIM(STR(tnIdSectie)))
RETURN
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 AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
*----------------------------------------------------------------------------------------
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10)
gnFail = gnFail + 1
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
*----------------------------------------------------------------------------------------
PROCEDURE Final
IF TYPE('goExecutorReal') = 'O'
goExecutor = goExecutorReal
ENDIF
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,215 @@
* test_s3c_4_do_factura_locomanda.prg
* Headless: izoleaza mecanismul din do_factura dupa S3c-4 (ocomenzi.vc2:1580-1596) - SCATTER NAME
* loComanda MEMO pe crsComenzi, trimis explicit la oDateFactura.Init prin toSursa, fara sa mai
* depinda de goComanda. Nu poate rula do_factura insusi (clic pe grid real), reproduce fidel doar
* pasul SCATTER + apelul Init cu parametrul, cf. propunerii docs\propunere_s3c_4_apelanti_reali.md
* sectiunea 6.
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3c_4_do_factura_locomanda.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3c_4_do_factura_locomanda.log
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gcCaz, gcErr
PUBLIC goComanda, loComanda
PUBLIC gnMockIdSectie, goExecutorReal
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3c_4_do_factura_locomanda.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
gcCaz = ""
gcErr = ""
gnMockIdSectie = 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
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
gnScadereStoc = 1
DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna)
goExecutorReal = goExecutor
goExecutor = CREATEOBJECT("oExecutorMockS3c4")
goExecutor.oReal = goExecutorReal
DO CazScatterLoComandaVsGlobalaMurdara
DO CazParitateCandCoincid
DO CazLoComandaNuEAliasGlobalei
DO Final
*----------------------------------------------------------------------------------------
* Pasii 1-5 din propunere: crsComenzi minimal, SCATTER NAME loComanda MEMO (linia din diff),
* goComanda populat diferit (simuland navigare anterioara in grid) - Init trebuie sa citeasca
* din parametrul loComanda, nu din globala murdara.
PROCEDURE CazScatterLoComandaVsGlobalaMurdara
gcCaz = "[LOCOMANDA_VS_GLOBALA_MURDARA] "
DO AfLog WITH "PAS: " + gcCaz
DO CreeazaCrsComenzi
SELECT crsComenzi
GO 1
SCATTER NAME loComanda MEMO
goComanda = CreSursaComanda(999, "GLOBAL MURDAR", "CF-MURDAR", 9999, "NR-MURDAR", 88)
LOCAL lo
lo = CREATEOBJECT("oDateFactura", 30001, 3, loComanda)
DO Assert WITH VARTYPE(lo) = 'O', "Createobject oDateFactura(tip 3, cu loComanda)"
DO Assert WITH lo.id_client = loComanda.id_part, "id_client din loComanda (501), nu din goComanda (999)"
DO Assert WITH ALLTRIM(lo.nume_client) == ALLTRIM(loComanda.nume), "nume_client din loComanda"
DO Assert WITH ALLTRIM(lo.cod_fiscal) == ALLTRIM(NVL(loComanda.cod_fiscal, '')), "cod_fiscal din loComanda"
DO Assert WITH lo.listaid = loComanda.id_comanda, "listaid din loComanda"
DO Assert WITH ALLTRIM(lo.descriere) == ALLTRIM(loComanda.nr_comanda), "descriere din loComanda"
DO Assert WITH lo.id_sectie = loComanda.id_sectie, "id_sectie din loComanda"
DO Assert WITH lo.id_client <> goComanda.id_part, "id_client NU e cel din globala murdara (999)"
DO Assert WITH ALLTRIM(lo.nume_client) <> ALLTRIM(goComanda.nume), "nume_client NU e cel din globala murdara"
ENDPROC
*----------------------------------------------------------------------------------------
* Pasul 6 din propunere: cand goComanda si loComanda coincid pe valori, calea de fallback
* (fara toSursa) si calea cu parametru dau acelasi rezultat.
PROCEDURE CazParitateCandCoincid
gcCaz = "[PARITATE_CAND_COINCID] "
DO AfLog WITH "PAS: " + gcCaz
LOCAL loParam
loParam = CreSursaComanda(501, "COMANDA ROW1", "CF-1", 5001, "NR-1", 71)
goComanda = CreSursaComanda(501, "COMANDA ROW1", "CF-1", 5001, "NR-1", 71)
LOCAL loConParam, loFallback
loConParam = CREATEOBJECT("oDateFactura", 30002, 3, loParam)
loFallback = CREATEOBJECT("oDateFactura", 30003, 3)
DO Assert WITH loConParam.id_client = loFallback.id_client, "id_client identic: param vs fallback"
DO Assert WITH ALLTRIM(loConParam.nume_client) == ALLTRIM(loFallback.nume_client), "nume_client identic: param vs fallback"
DO Assert WITH ALLTRIM(loConParam.cod_fiscal) == ALLTRIM(loFallback.cod_fiscal), "cod_fiscal identic: param vs fallback"
DO Assert WITH loConParam.listaid = loFallback.listaid, "listaid identic: param vs fallback"
DO Assert WITH ALLTRIM(loConParam.descriere) == ALLTRIM(loFallback.descriere), "descriere identic: param vs fallback"
DO Assert WITH loConParam.id_sectie = loFallback.id_sectie, "id_sectie identic: param vs fallback"
ENDPROC
*----------------------------------------------------------------------------------------
* Asertiunea 7 (obligatorie): loComanda nu e alias al lui goComanda. GO 2 pe crsComenzi si
* re-SCATTER pe loComanda schimba doar loComanda; goComanda (nescris in acest pas) ramane
* neschimbat fata de ce a fost setat inainte.
PROCEDURE CazLoComandaNuEAliasGlobalei
gcCaz = "[LOCOMANDA_NU_E_ALIAS] "
DO AfLog WITH "PAS: " + gcCaz
goComanda = CreSursaComanda(501, "COMANDA ROW1", "CF-1", 5001, "NR-1", 71)
SELECT crsComenzi
GO 2
SCATTER NAME loComanda MEMO
DO Assert WITH loComanda.id_part = 502, "loComanda reflecta randul 2 dupa re-SCATTER"
DO Assert WITH goComanda.id_part = 501, "goComanda ramane neschimbat (randul 1) - variabile distincte"
DO Assert WITH loComanda.id_part <> goComanda.id_part, "loComanda nu e alias al goComanda"
ENDPROC
*----------------------------------------------------------------------------------------
PROCEDURE CreeazaCrsComenzi
IF USED('crsComenzi')
USE IN crsComenzi
ENDIF
CREATE CURSOR crsComenzi (id_part N(10), nume C(50), cod_fiscal C(20), id_comanda N(10), nr_comanda C(20), id_sectie N(10))
INSERT INTO crsComenzi VALUES (501, "COMANDA ROW1", "CF-1", 5001, "NR-1", 71)
INSERT INTO crsComenzi VALUES (502, "COMANDA ROW2", "CF-2", 5002, "NR-2", 72)
ENDPROC
*----------------------------------------------------------------------------------------
FUNCTION CreSursaComanda
LPARAMETERS tnIdPart, tcNume, tcCodFiscal, tnIdComanda, tcNrComanda, tnIdSectie
CREATE CURSOR _cs4 (id_part N(10), nume C(50), cod_fiscal C(20), id_comanda N(10), nr_comanda C(20), id_sectie N(10))
INSERT INTO _cs4 VALUES (tnIdPart, tcNume, tcCodFiscal, tnIdComanda, tcNrComanda, tnIdSectie)
LOCAL loS
SCATTER NAME loS MEMO
USE IN _cs4
RETURN loS
ENDFUNC
*----------------------------------------------------------------------------------------
DEFINE CLASS oExecutorMockS3c4 AS oexecutor
oReal = NULL
PROCEDURE oExecute
LPARAMETERS tcSql, tcCursor, tlProgress, tcTitluProgress, tnHandle, tlShowError, tlQuitOnError, tlReconnect
LOCAL lcCur, lcSql, lnPos
lcCur = UPPER(ALLTRIM(TRANSFORM(tcCursor)))
lcSql = TRANSFORM(tcSql)
IF lcCur == 'CRSCOMTEMP'
lnPos = AT('id_sectie =', lcSql)
IF lnPos > 0
gnMockIdSectie = VAL(SUBSTR(lcSql, lnPos + LEN('id_sectie =')))
ENDIF
DO CreeazaComTemp WITH gnMockIdSectie
RETURN 1
ENDIF
RETURN This.oReal.oExecute(tcSql, tcCursor)
ENDPROC
FUNCTION oPrelucrareEroare
RETURN "MOCK eroare Oracle"
ENDFUNC
ENDDEFINE
*----------------------------------------------------------------------------------------
PROCEDURE CreeazaComTemp
LPARAMETERS tnIdSectie
IF USED('crsComTemp')
USE IN crsComTemp
ENDIF
CREATE CURSOR crsComTemp (sectie C(100))
INSERT INTO crsComTemp VALUES ("SECTIE " + ALLTRIM(STR(tnIdSectie)))
RETURN
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 AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
*----------------------------------------------------------------------------------------
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10)
gnFail = gnFail + 1
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
*----------------------------------------------------------------------------------------
PROCEDURE Final
IF TYPE('goExecutorReal') = 'O'
goExecutor = goExecutorReal
ENDIF
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,251 @@
* test_s4_3_incarca_filtrat.prg
* Headless: do_incarca_articole pe frm_facturare_articole2 (COMUN\clase\ofacturare.vc2) NU mai cheama
* incarca_cursor_articole pe tipurile de lista de preturi (1, 22, 5, 29, 7, 10, 45). Verifica ramificarea
* introdusa de S4-3: pe aceste tipuri crsfactura ramane gol si accesibil (gridul devine editabil in linie),
* lArticoleIncarcate devine .T. si butonul de incarcare se ascunde, FARA niciun apel Oracle pe crsarticole
* (probat prin gcMockSql ramas gol - oExecutorMock captureaza DOAR apelurile pe cursorul crsarticole, iar
* incarca_cursor_articole trece intotdeauna prin oExecute cu 'crsarticole').
*
* Asimetrie documentata: 23 NU intra in lista de cautare in linie (ramane pe incarcare in masa, ca azi);
* 23/41 se adauga intr-un pas urmator, impreuna cu decuplarea Rolului B.
*
* Cazuri (toate cu listaid = "1", ca sa treaca valideaza_antet pe tipurile care il cer):
* A1. tip 1 (lista de preturi lei) -> Return .T., gcMockSql gol, crsfactura gol+deschis, lArticoleIncarcate=.T., buton .F.
* A2. tip 5 (lista de preturi valuta) -> identic A1 (in_valuta=1 setat de oDateFactura.Init)
* A3. tip 45 (ROARESTAURANT) -> identic A1
* B. tip 1, antet invalid (dataireg gol) -> Return .F., gcMockSql gol, lArticoleIncarcate=.F., buton .T.
*
* Oracle NU se atinge pe calea articolelor/generatorului: goExecutor -> oExecutorMock (mock_cursor_articole.prg),
* poGeneratorNumere -> oGeneratorMock (mock_generator_numere.prg). amessagebox/facturi_duplicate ->
* mock_validare_antet.prg. oAntetFacturare.valideaza_antet ruleaza REAL.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s4_3_incarca_filtrat.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4_3_incarca_filtrat.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 1.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr
PUBLIC gcMockApeluri, gnMockNumar, gcMockSql, gnMockSucces, gnMockEroare, gcMockMod, gcMockCurs
PUBLIC gnMockRaspuns, gcMockDuplicat, goExecutorReal
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4_3_incarca_filtrat.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
gnErr = 0
gcCaz = ""
gcErr = ""
gcMockApeluri = ""
gnMockNumar = 0
gcMockSql = ""
gnMockSucces = 1
gnMockEroare = 0
gcMockMod = "PLIN"
gcMockCurs = ""
gnMockRaspuns = 6
gcMockDuplicat = ""
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
LOCAL lcProc
lcProc = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", ;
"D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_cursor_articole.prg", ;
&lcProc, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg"
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
gnScadereStoc = 1
DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna)
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE
update_jtva_coloane([JV], [jtva_coloane_temp])
PRIVATE poDate, poGeneratorNumere, plVizibil, pnTotalDiscountAvize
plVizibil = .F.
pnTotalDiscountAvize = 0
poGeneratorNumere = CREATEOBJECT("oGeneratorMock")
poDate = NULL
goExecutorReal = goExecutor
goExecutor = CREATEOBJECT("oExecutorMock")
goExecutor.oReal = goExecutorReal
DO Caz WITH "A1_TIP1", 1, .F.
DO Caz WITH "A2_TIP5", 5, .F.
DO Caz WITH "A3_TIP45", 45, .F.
DO Caz WITH "B_TIP1_INVALID", 1, .T.
DO Final
*----------------------------------------------------------------------------------------
PROCEDURE Caz
LPARAMETERS tcCaz, tnTip, tlAntetInvalid
LOCAL loForm, llRezultat
gcCaz = "[" + tcCaz + "] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH tnTip, tlAntetInvalid
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
DO Assert WITH PEMSTATUS(loForm, 'lArticoleIncarcate', 5), "lArticoleIncarcate materializata"
DO Assert WITH !loForm.lArticoleIncarcate, "lArticoleIncarcate = .F. la Createobject"
DO Assert WITH ObjExists(loForm, 'but_incarca_articole'), "but_incarca_articole prezent"
DO Assert WITH loForm.but_incarca_articole.Visible, "but_incarca_articole vizibil la Createobject"
DO Assert WITH USED('crsfactura') AND RECCOUNT('crsfactura') = 0, "crsfactura deschis dar gol inainte de do_incarca_articole"
llRezultat = loForm.do_incarca_articole()
DO CASE
CASE tlAntetInvalid
DO Assert WITH !llRezultat, "Return .F. pe antet invalid"
DO Assert WITH EMPTY(gcMockSql), "niciun apel pe crsarticole pe antet invalid - gcMockSql gol"
DO Assert WITH USED('crsfactura') AND RECCOUNT('crsfactura') = 0, "crsfactura tot gol dupa antet invalid"
DO Assert WITH !loForm.lArticoleIncarcate, "lArticoleIncarcate tot .F. dupa antet invalid"
DO Assert WITH loForm.but_incarca_articole.Visible, "but_incarca_articole tot vizibil dupa antet invalid"
OTHERWISE
DO Assert WITH llRezultat, "Return .T. pe antet valid"
DO Assert WITH EMPTY(gcMockSql), "incarca_cursor_articole NU a fost apelat - gcMockSql gol pe tip " + TRANSFORM(tnTip)
DO Assert WITH USED('crsfactura'), "crsfactura deschis dupa succes"
DO Assert WITH USED('crsfactura') AND RECCOUNT('crsfactura') = 0, "crsfactura gol (editabil in linie) dupa succes"
DO Assert WITH loForm.lArticoleIncarcate, "lArticoleIncarcate = .T. dupa succes"
DO Assert WITH !loForm.but_incarca_articole.Visible, "but_incarca_articole invizibil dupa succes"
DO Assert WITH UPPER(loForm.grd_factura.RecordSource) == 'CRSFACTURA', "grd_factura.RecordSource = crsfactura"
ENDCASE
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
PROCEDURE Reseteaza
LPARAMETERS tnTip, tlAntetInvalid
LOCAL lnIdSet
DO Inchide WITH 'crsarticole'
DO Inchide WITH 'crsarticole1'
DO Inchide WITH 'crsfactura'
DO Inchide WITH 'crscursuri'
DO Inchide WITH 'crspolitici'
DO Inchide WITH 'crscontracte'
DO Inchide WITH 'crsgestiunidest'
DO Inchide WITH 'crsCtrTemp'
DO Inchide WITH 'CrsCotaTva'
SELECT 0
* cboTipFactura (frm_facturare_articole2) cere RowSource pe saft_tip_facturi la constructie
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
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
gcMockApeluri = ""
gcMockSql = ""
gcMockCurs = ""
gcErr = ""
gnMockNumar = 100
gnMockRaspuns = 6
gcMockDuplicat = ""
gcMockMod = "PLIN"
gnMockSucces = 1
gnMockEroare = 0
lnIdSet = 25000 + tnTip - 1 + gnScadereStoc * 10
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip)
poDate.dataireg = DATE(gnAn, gnLuna, 1)
poDate.dataact = poDate.dataireg
poDate.zi_curs = poDate.dataireg
poDate.id_fdoc = 1
poDate.fdoc = "FEL TEST"
poDate.nract = 77
poDate.serie_act = "TST"
poDate.id_client = 1
poDate.id_furnizor = 1
poDate.nrfactachi = 1
poDate.id_valuta = 1
poDate.listaid = "1"
IF tlAntetInvalid
poDate.dataireg = {}
ENDIF
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
gcMockApeluri = ""
ENDPROC
PROCEDURE Inchide
LPARAMETERS tcAlias
IF USED(tcAlias)
USE IN (tcAlias)
ENDIF
ENDPROC
FUNCTION ObjExists
LPARAMETERS toForm, tcName
LOCAL i
FOR i = 1 TO toForm.Objects.Count
IF UPPER(toForm.Objects(i).Name) == UPPER(tcName)
RETURN .T.
ENDIF
ENDFOR
RETURN .F.
ENDFUNC
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 AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10)
gnErr = gnErr + 1
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
IF TYPE('goExecutorReal') = 'O'
goExecutor = goExecutorReal
ENDIF
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,233 @@
* test_s4_3_neregresie_masa.prg
* Headless: do_incarca_articole pe frm_facturare_articole2 PASTREAZA apelul incarca_cursor_articole pe
* tipurile care nu sunt lista de preturi (comanda 3, avize 4, contract 2) - comportament identic cu S3-4b.
* Verifica ramificarea introdusa de S4-3: pe aceste tipuri se executa incarcarea in masa (probat prin
* gcMockSql care contine {call pack_facturare.cursor_comanda/cursor_avize/cursor_contract}), crsfactura se
* populeaza din cursorul mockuit, lArticoleIncarcate devine .T. si butonul se ascunde.
*
* Cazuri (toate cu listaid = "1", ca sa treaca valideaza_antet - aceste tipuri cer comanda/avizul/contractul):
* C1. tip 3 (comanda) -> Return .T., 'cursor_comanda' $ gcMockSql, crsfactura populat, lArticoleIncarcate=.T., buton .F.
* C2. tip 4 (avize) -> Return .T., 'cursor_avize' $ gcMockSql, la fel.
* C3. tip 2 (contract) -> Return .T., 'cursor_contract' $ gcMockSql, la fel (mock PLIN2: crsarticole1 pentru
* Insert Into crscontracte din incarca_cursor_articole).
*
* Oracle NU se atinge pe calea articolelor/generatorului: goExecutor -> oExecutorMock (mock_cursor_articole.prg),
* poGeneratorNumere -> oGeneratorMock (mock_generator_numere.prg). amessagebox/facturi_duplicate ->
* mock_validare_antet.prg. oAntetFacturare.valideaza_antet ruleaza REAL.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s4_3_neregresie_masa.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4_3_neregresie_masa.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 1.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr
PUBLIC gcMockApeluri, gnMockNumar, gcMockSql, gnMockSucces, gnMockEroare, gcMockMod, gcMockCurs
PUBLIC gnMockRaspuns, gcMockDuplicat, goExecutorReal
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4_3_neregresie_masa.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
gnErr = 0
gcCaz = ""
gcErr = ""
gcMockApeluri = ""
gnMockNumar = 0
gcMockSql = ""
gnMockSucces = 1
gnMockEroare = 0
gcMockMod = "PLIN"
gcMockCurs = ""
gnMockRaspuns = 6
gcMockDuplicat = ""
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
LOCAL lcProc
lcProc = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", ;
"D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_cursor_articole.prg", ;
&lcProc, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg"
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
gnScadereStoc = 1
DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna)
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE
update_jtva_coloane([JV], [jtva_coloane_temp])
PRIVATE poDate, poGeneratorNumere, plVizibil, pnTotalDiscountAvize
plVizibil = .F.
pnTotalDiscountAvize = 0
poGeneratorNumere = CREATEOBJECT("oGeneratorMock")
poDate = NULL
goExecutorReal = goExecutor
goExecutor = CREATEOBJECT("oExecutorMock")
goExecutor.oReal = goExecutorReal
DO Caz WITH "C1_TIP3", 3, "PLIN", "cursor_comanda"
DO Caz WITH "C2_TIP4", 4, "PLIN", "cursor_avize"
DO Caz WITH "C3_TIP2", 2, "PLIN2", "cursor_contract"
DO Final
*----------------------------------------------------------------------------------------
PROCEDURE Caz
LPARAMETERS tcCaz, tnTip, tcMockMod, tcCursorSql
LOCAL loForm, llRezultat
gcCaz = "[" + tcCaz + "] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH tnTip, tcMockMod
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
DO Assert WITH PEMSTATUS(loForm, 'lArticoleIncarcate', 5), "lArticoleIncarcate materializata"
DO Assert WITH !loForm.lArticoleIncarcate, "lArticoleIncarcate = .F. la Createobject"
DO Assert WITH ObjExists(loForm, 'but_incarca_articole'), "but_incarca_articole prezent"
DO Assert WITH loForm.but_incarca_articole.Visible, "but_incarca_articole vizibil la Createobject"
DO Assert WITH USED('crsfactura') AND RECCOUNT('crsfactura') = 0, "crsfactura deschis dar gol inainte de do_incarca_articole"
llRezultat = loForm.do_incarca_articole()
DO Assert WITH llRezultat, "Return .T. pe antet valid"
DO Assert WITH !EMPTY(gcMockSql), "incarca_cursor_articole a fost apelat - gcMockSql nevid"
DO Assert WITH tcCursorSql $ gcMockSql, "apel pe " + tcCursorSql + " in gcMockSql: " + STRTRAN(ALLTRIM(gcMockSql), CHR(13) + CHR(10), " | ")
DO Assert WITH USED('crsarticole') AND RECCOUNT('crsarticole') > 0, "crsarticole populat dupa succes (sursa incarcarii in masa)"
DO Assert WITH loForm.lArticoleIncarcate, "lArticoleIncarcate = .T. dupa succes"
DO Assert WITH !loForm.but_incarca_articole.Visible, "but_incarca_articole invizibil dupa succes"
DO Assert WITH UPPER(loForm.grd_factura.RecordSource) == 'CRSFACTURA', "grd_factura.RecordSource = crsfactura"
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
PROCEDURE Reseteaza
LPARAMETERS tnTip, tcMockMod
LOCAL lnIdSet
DO Inchide WITH 'crsarticole'
DO Inchide WITH 'crsarticole1'
DO Inchide WITH 'crsfactura'
DO Inchide WITH 'crscursuri'
DO Inchide WITH 'crspolitici'
DO Inchide WITH 'crscontracte'
DO Inchide WITH 'crsgestiunidest'
DO Inchide WITH 'crsCtrTemp'
DO Inchide WITH 'CrsCotaTva'
SELECT 0
* cboTipFactura (frm_facturare_articole2) cere RowSource pe saft_tip_facturi la constructie
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
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
gcMockApeluri = ""
gcMockSql = ""
gcMockCurs = ""
gcErr = ""
gnMockNumar = 100
gnMockRaspuns = 6
gcMockDuplicat = ""
gcMockMod = tcMockMod
gnMockSucces = 1
gnMockEroare = 0
lnIdSet = 25000 + tnTip - 1 + gnScadereStoc * 10
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip)
poDate.dataireg = DATE(gnAn, gnLuna, 1)
poDate.dataact = poDate.dataireg
poDate.zi_curs = poDate.dataireg
poDate.id_fdoc = 1
poDate.fdoc = "FEL TEST"
poDate.nract = 77
poDate.serie_act = "TST"
poDate.id_client = 1
poDate.id_furnizor = 1
poDate.nrfactachi = 1
poDate.id_valuta = 1
poDate.listaid = "1"
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
gcMockApeluri = ""
ENDPROC
PROCEDURE Inchide
LPARAMETERS tcAlias
IF USED(tcAlias)
USE IN (tcAlias)
ENDIF
ENDPROC
FUNCTION ObjExists
LPARAMETERS toForm, tcName
LOCAL i
FOR i = 1 TO toForm.Objects.Count
IF UPPER(toForm.Objects(i).Name) == UPPER(tcName)
RETURN .T.
ENDIF
ENDFOR
RETURN .F.
ENDFUNC
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 AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10)
gnErr = gnErr + 1
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
IF TYPE('goExecutorReal') = 'O'
goExecutor = goExecutorReal
ENDIF
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,353 @@
* test_s4_3b_combosql_filtrat.prg
* Headless: S4-3 bucata 2 - combosql (grd_factura.cCodMat.cboCodmat / cDenumire.cCboDenumire) alimentat din
* {call pack_facturare.cursor_preturi(...)} FILTRAT (V_FILTRU_COD/V_FILTRU_DEN), in loc de view-ul static
* vnom_articole; iar linia aleasa ajunge in crsfactura cu pret/TVA/id_jtva_coloana completate prin
* do_adauga_articol_cautat.
*
* Combosql e subclasat ca combosql_cautare (COMUN\clase\ofacturare.vcx); mock-ul intercepteaza
* DOAR cursoarele brute crsCodmatRaw/crsDenumireRaw (oExecutorMockPret din mock_cursor_preturi.prg) si
* jurnalizeaza SQL-ul in gcMockSql. Capcana grid-coloane-nu-se-materializeaza-headless: nu se randeaza
* gridul, se citesc direct cursoarele (scrsCodmat/scrsDenumire/crsfactura) si se apeleaza metodele programatic.
*
* Cazuri:
* A. transport + mapare cboCodmat: RefreshData(1) pe "CM" -> SQL {call ...cursor_preturi...} cu ?pcFiltruCod/
* ?pcFiltruDen, FARA vnom_articole; scrsCodmat are codmat pe coloana 1 si campurile pret/proc_tvav/id_pol/
* gestionabil/preturi_cu_tva prezente.
* B. transport + mapare cCboDenumire: idem, filtrul merge pe denumire, coloana 1 = denumire.
* C. INIT: dupa CREATEOBJECT al formularului, gcMockSql e GOL (niciun {call cursor_preturi} la deschidere).
* D. flux rand: linia aleasa (scatter din crsCodmat) intra in crsfactura prin do_adauga_articol_cautat cu
* codmat/denumire/id_articol/pretftva/proc_tvav/id_jtva_coloana completate.
*
* Oracle NU se atinge pe calea cautarii (mock pe cursor_preturi); restul (oAntetFacturare, cCboGestiune ->
* VNOM_GESTIUNI) merge la executorul real. poGeneratorNumere -> oGeneratorMock. amessagebox -> mock_validare_antet.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s4_3b_combosql_filtrat.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4_3b_combosql_filtrat.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 1.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr
PUBLIC gcMockApeluri, gnMockNumar, gcMockSql, gnMockSucces, gnMockEroare, gcMockMod, gcMockCurs
PUBLIC gnMockRaspuns, gcMockDuplicat, goExecutorReal
PUBLIC gnPc, gnPVal, gnPPretV, gnScadereStoc, gnMemProcDisc
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4_3b_combosql_filtrat.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
gnErr = 0
gcCaz = ""
gcErr = ""
gcMockApeluri = ""
gnMockNumar = 0
gcMockSql = ""
gnMockSucces = 1
gnMockEroare = 0
gcMockMod = "PLIN"
gcMockCurs = ""
gnMockRaspuns = 6
gcMockDuplicat = ""
gnPc = 2
gnPVal = 2
gnPPretV = 4
gnScadereStoc = 1
gnMemProcDisc = 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
LOCAL lcProc
lcProc = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", ;
"D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg", ;
"D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_cursor_preturi.prg", ;
&lcProc
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
gnIdUtil = 8
gnPc = 2
gnPVal = 2
gnPPretV = 4
gnScadereStoc = 1
gnMemProcDisc = 0
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna)
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE
update_jtva_coloane([JV], [jtva_coloane_temp])
* jtva_coloane: cursorul folosit de derivarea id_jtva_coloana din proc_tvav (do_adauga_articol_cautat)
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
CREATE CURSOR jtva_coloane (id_jtva_coloana N(14), denumire C(50), cota_tva N(6,2))
INSERT INTO jtva_coloane VALUES (190, 'TVA 19%', 19)
INSERT INTO jtva_coloane VALUES (210, 'TVA 21%', 21)
INSERT INTO jtva_coloane VALUES (110, 'TVA 11%', 11)
GO TOP IN jtva_coloane
PRIVATE poDate, poGeneratorNumere, plVizibil, pnTotalDiscountAvize
plVizibil = .F.
pnTotalDiscountAvize = 0
poGeneratorNumere = CREATEOBJECT("oGeneratorMock")
poDate = NULL
goExecutorReal = goExecutor
goExecutor = CREATEOBJECT("oExecutorMockPret")
goExecutor.oReal = goExecutorReal
DO Caz_Init
DO Caz_Transport_Cod
DO Caz_Transport_Den
DO Caz_Flux_Rand
DO Final
*----------------------------------------------------------------------------------------
PROCEDURE Caz_Init
gcCaz = "[INIT] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 1, .F.
LOCAL loForm
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
DO Assert WITH UPPER(loForm.grd_factura.cCodMat.cboCodmat.Class) == 'COMBOSQL_CAUTARE', "cboCodmat e combosql_cautare"
DO Assert WITH UPPER(loForm.grd_factura.cDenumire.cCboDenumire.Class) == 'COMBOSQL_CAUTARE', "cCboDenumire e combosql_cautare"
DO Assert WITH EMPTY(gcMockSql), "INIT: niciun {call cursor_preturi} la deschiderea formularului - gcMockSql gol"
DO Assert WITH USED('scrsCodmat'), "INIT: scrsCodmat creat (structura mapata, gol)"
DO Assert WITH UPPER(Field(1, 'scrsCodmat')) == 'CODMAT', "INIT: scrsCodmat coloana 1 = codmat"
DO Assert WITH USED('scrsDenumire'), "INIT: scrsDenumire creat"
DO Assert WITH UPPER(Field(1, 'scrsDenumire')) == 'DENUMIRE', "INIT: scrsDenumire coloana 1 = denumire"
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
PROCEDURE Caz_Transport_Cod
gcCaz = "[TRANSPORT_COD] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 1, .F.
LOCAL loForm, loCombo
loForm = CREATEOBJECT('frm_facturare_articole2')
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
loCombo = loForm.grd_factura.cCodMat.cboCodmat
loCombo.cSearchString = "CM"
DO Assert WITH loCombo.RefreshData(1), "RefreshData(1) intoarce .T."
DO Assert WITH !EMPTY(gcMockSql), "apelul de cautare a trecut prin goExecutor (gcMockSql nevid)"
DO Assert WITH '{CALL' $ UPPER(gcMockSql), "SQL-ul capturat e un {call ...}"
DO Assert WITH 'CURSOR_PRETURI' $ UPPER(gcMockSql), "SQL-ul capturat cheama cursor_preturi"
DO Assert WITH '?PCFILTRUCOD' $ UPPER(gcMockSql), "SQL-ul contine ?pcFiltruCod"
DO Assert WITH '?PCFILTRUDEN' $ UPPER(gcMockSql), "SQL-ul contine ?pcFiltruDen"
DO Assert WITH !('VNOM_ARTICOLE' $ UPPER(gcMockSql)), "SQL-ul NU mai contine vnom_articole"
DO Assert WITH loCombo.cfiltrucod == "CM%", "cfiltrucod = CM% (incepe cu)"
DO Assert WITH EMPTY(loCombo.cfiltruden), "cfiltruden gol pe cautarea dupa cod"
DO Assert WITH USED('scrsCodmat'), "scrsCodmat deschis dupa cautare"
DO Assert WITH UPPER(Field(1, 'scrsCodmat')) == 'CODMAT', "scrsCodmat coloana 1 = codmat"
DO Assert WITH TYPE('scrsCodmat.pret') <> 'U' AND TYPE('scrsCodmat.proc_tvav') <> 'U', "scrsCodmat are pret/proc_tvav"
DO Assert WITH TYPE('scrsCodmat.id_pol') <> 'U' AND TYPE('scrsCodmat.gestionabil') <> 'U', "scrsCodmat are id_pol/gestionabil"
DO Assert WITH TYPE('scrsCodmat.preturi_cu_tva') <> 'U', "scrsCodmat are preturi_cu_tva"
DO Assert WITH RECCOUNT('scrsCodmat') = 2, "scrsCodmat are cele 2 randuri din mock"
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
PROCEDURE Caz_Transport_Den
gcCaz = "[TRANSPORT_DEN] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 1, .F.
LOCAL loForm, loCombo
loForm = CREATEOBJECT('frm_facturare_articole2')
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
loCombo = loForm.grd_factura.cDenumire.cCboDenumire
loCombo.cSearchString = "ART"
DO Assert WITH loCombo.RefreshData(1), "RefreshData(1) intoarce .T. (denumire)"
DO Assert WITH '?PCFILTRUDEN' $ UPPER(gcMockSql), "SQL-ul contine ?pcFiltruDen (denumire)"
DO Assert WITH loCombo.cfiltruden == "ART%", "cfiltruden = ART% (incepe cu)"
DO Assert WITH EMPTY(loCombo.cfiltrucod), "cfiltrucod gol pe cautarea dupa denumire"
DO Assert WITH USED('scrsDenumire'), "scrsDenumire deschis dupa cautare"
DO Assert WITH UPPER(Field(1, 'scrsDenumire')) == 'DENUMIRE', "scrsDenumire coloana 1 = denumire"
DO Assert WITH TYPE('scrsDenumire.pret') <> 'U' AND TYPE('scrsDenumire.id_articol') <> 'U', "scrsDenumire are pret/id_articol"
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
PROCEDURE Caz_Flux_Rand
gcCaz = "[FLUX_RAND] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 1, .F.
LOCAL loForm, loCombo, loArticol
loForm = CREATEOBJECT('frm_facturare_articole2')
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
loCombo = loForm.grd_factura.cCodMat.cboCodmat
loCombo.cSearchString = "CM"
loCombo.RefreshData(1)
DO Assert WITH USED('scrsCodmat') AND RECCOUNT('scrsCodmat') = 2, "scrsCodmat populat (2 randuri) inainte de flux"
* mimic RowSource-ul combobox-ului: crsCodmat = select * from scrsCodmat
SELECT * FROM scrsCodmat INTO CURSOR crsCodmat READWRITE
GO TOP IN crsCodmat
SCATTER NAME loArticol MEMO
SELECT crsfactura
APPEND BLANK
DO Assert WITH RECCOUNT('crsfactura') = 1, "crsfactura are o linie goala (But_nou1) inainte de adaugare"
loForm.do_adauga_articol_cautat(loArticol, loArticol.cantitate)
DO Assert WITH RECCOUNT('crsfactura') = 1, "do_adauga_articol_cautat NU a adaugat o a doua linie (scrie in linia curenta)"
DO Assert WITH ALLTRIM(crsfactura.codmat) == "CM1", "crsfactura.codmat = CM1"
DO Assert WITH ALLTRIM(crsfactura.denumire) == "Articol A", "crsfactura.denumire = Articol A"
DO Assert WITH crsfactura.id_articol = 11, "crsfactura.id_articol = 11"
DO Assert WITH crsfactura.proc_tvav = 1.19, "crsfactura.proc_tvav = 1.19"
DO Assert WITH crsfactura.pretftva = 100, "crsfactura.pretftva = 100 (derivat din pret + proc_tvav)"
DO Assert WITH crsfactura.id_jtva_coloana = 190, "crsfactura.id_jtva_coloana = 190 (derivat din proc_tvav prin jtva_coloane)"
DO Assert WITH crsfactura.id_c = 0, "crsfactura.id_c = 0 (linie libera)"
DO Assert WITH ALLTRIM(crsfactura.um) == "BUC", "crsfactura.um = BUC"
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
PROCEDURE Reseteaza
LPARAMETERS tnTip, tlAntetInvalid
LOCAL lnIdSet
DO Inchide WITH 'crsarticole'
DO Inchide WITH 'crsarticole1'
DO Inchide WITH 'crsfactura'
DO Inchide WITH 'crscursuri'
DO Inchide WITH 'crspolitici'
DO Inchide WITH 'crscontracte'
DO Inchide WITH 'crsgestiunidest'
DO Inchide WITH 'crsCtrTemp'
DO Inchide WITH 'CrsCotaTva'
DO Inchide WITH 'scrsCodmat'
DO Inchide WITH 'crsCodmat'
DO Inchide WITH 'scrsDenumire'
DO Inchide WITH 'crsDenumire'
DO Inchide WITH 'crsCodmatRaw'
DO Inchide WITH 'crsDenumireRaw'
DO Inchide WITH 'scrsGestiuni'
DO Inchide WITH 'crsGestiuni'
SELECT 0
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
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
gcMockApeluri = ""
gcMockSql = ""
gcMockCurs = ""
gcErr = ""
gnMockNumar = 100
gnMockRaspuns = 6
gcMockDuplicat = ""
gcMockMod = "PLIN"
gnMockSucces = 1
gnMockEroare = 0
lnIdSet = 25000 + tnTip - 1 + gnScadereStoc * 10
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip)
poDate.dataireg = DATE(gnAn, gnLuna, 1)
poDate.dataact = poDate.dataireg
poDate.zi_curs = poDate.dataireg
poDate.id_fdoc = 1
poDate.fdoc = "FEL TEST"
poDate.nract = 77
poDate.serie_act = "TST"
poDate.id_client = 1
poDate.id_furnizor = 1
poDate.nrfactachi = 1
poDate.id_valuta = 1
poDate.listaid = "1"
IF tlAntetInvalid
poDate.dataireg = {}
ENDIF
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
gcMockApeluri = ""
ENDPROC
PROCEDURE Inchide
LPARAMETERS tcAlias
IF USED(tcAlias)
USE IN (tcAlias)
ENDIF
ENDPROC
FUNCTION ObjExists
LPARAMETERS toForm, tcName
LOCAL i
FOR i = 1 TO toForm.Objects.Count
IF UPPER(toForm.Objects(i).Name) == UPPER(tcName)
RETURN .T.
ENDIF
ENDFOR
RETURN .F.
ENDFUNC
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 AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10)
gnErr = gnErr + 1
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
IF TYPE('goExecutorReal') = 'O'
goExecutor = goExecutorReal
ENDIF
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,290 @@
* test_s4_3c_combosql_tip41.prg
* Headless: decizia 8 (plan #13) - tip 41 (aviz retur transfer subunitati din lista) intra in
* llCautareInLinie si combosql_cautare.cursor_preturi_call comuta pe {call pack_facturare.cursor_gestiune(...)}
* (gestiunea EXACTA de transfer, poDate.id_pol/poDate.id_client), nu mai pe cursor_preturi
* (grupul de gestiuni, poDate.id_gestiune_init). Clona lui test_s4_3b_combosql_filtrat.prg, tip 41
* in loc de 1, plus proba de neregresie a mass-load-ului (do_incarca_articole nu mai cheama
* incarca_cursor_articole pentru 41, la fel ca celelalte tipuri deja din Inlist).
*
* Mock identic cu test_s4_3b: oExecutorMockPret (mock_cursor_preturi.prg) intercepteaza DOAR
* crsCodmatRaw/crsDenumireRaw dupa numele cursorului, nu dupa continutul SQL - functioneaza
* neschimbat si pentru cursor_gestiune.
*
* Cazuri:
* A. Caz_Transport_Cod: RefreshData(1) pe "CM" -> SQL {call ...cursor_gestiune...} cu ?poDate.id_pol/
* ?poDate.id_client (NU ?poDate.id_gestiune_init), FARA cursor_preturi in text; restul identic
* cu comportamentul de azi pentru celelalte tipuri (cfiltrucod, coloane scrsCodmat).
* B. Caz_NeregresieMasa41: do_incarca_articole() pe tip 41 NU cheama incarca_cursor_articole
* (crsarticole ramane neincarcat) - la fel ca test_s4_3_neregresie_masa.prg pentru celelalte
* tipuri deja in Inlist.
*
* Oracle NU se atinge pe calea cautarii (mock pe cursor_preturi/cursor_gestiune - acelasi mock, dupa
* numele cursorului brut). poGeneratorNumere -> oGeneratorMock. amessagebox/facturi_duplicate ->
* mock_validare_antet.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s4_3c_combosql_tip41.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4_3c_combosql_tip41.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 1.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr
PUBLIC gcMockApeluri, gnMockNumar, gcMockSql, gnMockSucces, gnMockEroare, gcMockMod, gcMockCurs
PUBLIC gnMockRaspuns, gcMockDuplicat, goExecutorReal
PUBLIC gnPc, gnPVal, gnPPretV, gnScadereStoc, gnMemProcDisc
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4_3c_combosql_tip41.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
gnErr = 0
gcCaz = ""
gcErr = ""
gcMockApeluri = ""
gnMockNumar = 0
gcMockSql = ""
gnMockSucces = 1
gnMockEroare = 0
gcMockMod = "PLIN"
gcMockCurs = ""
gnMockRaspuns = 6
gcMockDuplicat = ""
gnPc = 2
gnPVal = 2
gnPPretV = 4
gnScadereStoc = 1
gnMemProcDisc = 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
LOCAL lcProc
lcProc = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", ;
"D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg", ;
"D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_cursor_preturi.prg", ;
&lcProc
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
gnIdUtil = 8
gnPc = 2
gnPVal = 2
gnPPretV = 4
gnScadereStoc = 1
gnMemProcDisc = 0
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna)
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE
update_jtva_coloane([JV], [jtva_coloane_temp])
* jtva_coloane: cursorul folosit de derivarea id_jtva_coloana din proc_tvav (do_adauga_articol_cautat)
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
CREATE CURSOR jtva_coloane (id_jtva_coloana N(14), denumire C(50), cota_tva N(6,2))
INSERT INTO jtva_coloane VALUES (190, 'TVA 19%', 19)
INSERT INTO jtva_coloane VALUES (210, 'TVA 21%', 21)
INSERT INTO jtva_coloane VALUES (110, 'TVA 11%', 11)
GO TOP IN jtva_coloane
PRIVATE poDate, poGeneratorNumere, plVizibil, pnTotalDiscountAvize
plVizibil = .F.
pnTotalDiscountAvize = 0
poGeneratorNumere = CREATEOBJECT("oGeneratorMock")
poDate = NULL
goExecutorReal = goExecutor
goExecutor = CREATEOBJECT("oExecutorMockPret")
goExecutor.oReal = goExecutorReal
DO Caz_Transport_Cod
DO Caz_NeregresieMasa41
DO Final
*----------------------------------------------------------------------------------------
PROCEDURE Caz_Transport_Cod
gcCaz = "[TRANSPORT_COD_TIP41] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 41, .F.
LOCAL loForm, loCombo
loForm = CREATEOBJECT('frm_facturare_articole2')
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
loCombo = loForm.grd_factura.cCodMat.cboCodmat
loCombo.cSearchString = "CM"
DO Assert WITH loCombo.RefreshData(1), "RefreshData(1) intoarce .T."
DO Assert WITH !EMPTY(gcMockSql), "apelul de cautare a trecut prin goExecutor (gcMockSql nevid)"
DO Assert WITH '{CALL' $ UPPER(gcMockSql), "SQL-ul capturat e un {call ...}"
DO Assert WITH 'CURSOR_GESTIUNE' $ UPPER(gcMockSql), "SQL-ul capturat cheama cursor_gestiune (nu cursor_preturi)"
DO Assert WITH !('CURSOR_PRETURI' $ UPPER(gcMockSql)), "SQL-ul NU mai cade pe cursor_preturi pentru tip 41"
DO Assert WITH '?PODATE.ID_POL' $ UPPER(gcMockSql), "SQL-ul contine ?poDate.id_pol"
DO Assert WITH '?PODATE.ID_CLIENT' $ UPPER(gcMockSql), "SQL-ul contine ?poDate.id_client (gestiunea exacta)"
DO Assert WITH !('ID_GESTIUNE_INIT' $ UPPER(gcMockSql)), "SQL-ul NU mai contine id_gestiune_init (grupul de gestiuni)"
DO Assert WITH '?PCFILTRUCOD' $ UPPER(gcMockSql), "SQL-ul contine ?pcFiltruCod"
DO Assert WITH '?PCFILTRUDEN' $ UPPER(gcMockSql), "SQL-ul contine ?pcFiltruDen"
DO Assert WITH loCombo.cfiltrucod == "CM%", "cfiltrucod = CM% (incepe cu)"
DO Assert WITH USED('scrsCodmat'), "scrsCodmat deschis dupa cautare"
DO Assert WITH UPPER(Field(1, 'scrsCodmat')) == 'CODMAT', "scrsCodmat coloana 1 = codmat"
DO Assert WITH TYPE('scrsCodmat.pret') <> 'U' AND TYPE('scrsCodmat.proc_tvav') <> 'U', "scrsCodmat are pret/proc_tvav"
DO Assert WITH TYPE('scrsCodmat.id_pol') <> 'U' AND TYPE('scrsCodmat.gestionabil') <> 'U', "scrsCodmat are id_pol/gestionabil"
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
PROCEDURE Caz_NeregresieMasa41
gcCaz = "[NEREGRESIE_MASA_TIP41] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 41, .F.
LOCAL loForm, llRezultat
loForm = CREATEOBJECT('frm_facturare_articole2')
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
llRezultat = loForm.do_incarca_articole()
DO Assert WITH llRezultat, "do_incarca_articole() Return .T. pe antet valid, gcErr=[" + gcErr + "] gcMockApeluri=[" + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), " | ") + "]"
DO Assert WITH !USED('crsarticole'), "crsarticole NU e deschis (mass-load nu s-a executat pentru tip 41)"
DO Assert WITH loForm.lArticoleIncarcate, "lArticoleIncarcate = .T. (a intrat pe ramura llCautareInLinie)"
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
PROCEDURE Reseteaza
LPARAMETERS tnTip, tlAntetInvalid
LOCAL lnIdSet
DO Inchide WITH 'crsarticole'
DO Inchide WITH 'crsarticole1'
DO Inchide WITH 'crsfactura'
DO Inchide WITH 'crscursuri'
DO Inchide WITH 'crspolitici'
DO Inchide WITH 'crscontracte'
DO Inchide WITH 'crsgestiunidest'
DO Inchide WITH 'crsCtrTemp'
DO Inchide WITH 'CrsCotaTva'
DO Inchide WITH 'scrsCodmat'
DO Inchide WITH 'crsCodmat'
DO Inchide WITH 'scrsDenumire'
DO Inchide WITH 'crsDenumire'
DO Inchide WITH 'crsCodmatRaw'
DO Inchide WITH 'crsDenumireRaw'
DO Inchide WITH 'scrsGestiuni'
DO Inchide WITH 'crsGestiuni'
SELECT 0
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
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
gcMockApeluri = ""
gcMockSql = ""
gcMockCurs = ""
gcErr = ""
gnMockNumar = 100
gnMockRaspuns = 6
gcMockDuplicat = ""
gcMockMod = "PLIN"
gnMockSucces = 1
gnMockEroare = 0
lnIdSet = 25000 + tnTip - 1 + gnScadereStoc * 10
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip)
poDate.dataireg = DATE(gnAn, gnLuna, 1)
poDate.dataact = poDate.dataireg
poDate.zi_curs = poDate.dataireg
poDate.id_fdoc = 1
poDate.fdoc = "FEL TEST"
poDate.nract = 77
poDate.serie_act = "TST"
poDate.id_client = 1
poDate.id_furnizor = 1
poDate.nrfactachi = 1
poDate.id_valuta = 1
poDate.listaid = "1"
IF tnTip = 41
poDate.nIdTipDoc = poDate.nIdTipDocAvizExpeditie
poDate.id_pol = 31
ENDIF
IF tlAntetInvalid
poDate.dataireg = {}
ENDIF
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
gcMockApeluri = ""
ENDPROC
PROCEDURE Inchide
LPARAMETERS tcAlias
IF USED(tcAlias)
USE IN (tcAlias)
ENDIF
ENDPROC
FUNCTION ObjExists
LPARAMETERS toForm, tcName
LOCAL i
FOR i = 1 TO toForm.Objects.Count
IF UPPER(toForm.Objects(i).Name) == UPPER(tcName)
RETURN .T.
ENDIF
ENDFOR
RETURN .F.
ENDFUNC
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 AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10)
gnErr = gnErr + 1
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
IF TYPE('goExecutorReal') = 'O'
goExecutor = goExecutorReal
ENDIF
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,254 @@
* test_s4_4_rol_a_paritate.prg
* Headless: paritate S4-4 (Rol A, do_scrie_factura, COMUN\clase\ofacturare.vc2:20048-20137).
* NU cheama do_scrie_factura si nu scrie nicio factura - compara direct, pe date REALE din
* MARIUSM_AUTO, cele doua cai de calcul al "cantitatii ramase":
* VECHI: acelasi apel Oracle (cursor_comanda / cursor_avize) folosit de incarca_cursor_articole
* ca sa populeze crsarticole inainte de S4-4, urmat de Select crsarticole / Calculate Sum(cantitate)
* (cod care nu mai e eliminat: do_scrie_factura il combina acum cu semnalul Oracle prin Min).
* NOU: apelul Oracle introdus de S4-4 (pack_facturare.cantitate_ramasa_comanda / exista_ramas_avize_lista),
* citit prin SELECT ... FROM dual, la fel cum face acum do_scrie_factura.
* Daca cele doua cai dau aceeasi valoare pe fiecare caz, inlocuirea nu schimba verdictul de care
* depinde dialogul de confirmare (inchidere comanda / aviz de retur).
*
* ID-uri comanda: preluate din docs\raport_s4_2.md sectiunea 4.1 (deja verificate acolo cu SELECT
* direct). ID-uri aviz: din docs\raport_s4_4_oracle_varianta_c.md sectiunea 6 (avize cu corespondenta
* TIP=1 inca prezenta in VANZARI_CORESP) + o combinatie sintetica cu doua avize (mecanism de lista,
* nu caz real - vezi DATORII in raportul final).
*
* TestSecventaNoua (adaugata in review): PROCEDURE Test* de mai sus compara valori, dar nu executa
* niciodata CODUL SCRIS in ofacturare.vc2 (o cerea rescrie propriul apel intr-un cursor cu alt nume,
* 'crstestramas') - de-asta prima rulare a trecut 12/12 cu bug-ul "Use In (crsramasavize)" (paranteze
* = evaluare ca VARIABILA in VFP, nu alias) inca in cod, netestat. TestSecventaNoua reproduce LITERAL
* secventa noua din ambele ramuri (lcSql/goExecutor.oExecute/citire/Use In, ofacturare.vc2:20051-20058
* si :20088-20095), cu aceleasi nume de cursor ca in clasa, si aserteaza explicit ca alias-ul se
* inchide (Used() = .F.) dupa Use In. Nu se cheama do_scrie_factura/do_termin() prin
* CREATEOBJECT('frm_facturare_articole2') urmat de emitere reala: docs\raport_s3b_emitere_reala.md
* documenteaza un blocaj cunoscut la acest CREATEOBJECT cand formularul unificat isi populeaza
* grila cu date reale (coloana Gestiune, combo pe cursor SQL) - risc de agatare pe o masina
* partajata, neasumat pentru un test de acoperire a doua linii.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s4_4_rol_a_paritate.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4_4_rol_a_paritate.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4_4_rol_a_paritate.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
gnErr = 0
gcCaz = ""
gcErr = ""
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
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna)
PRIVATE poDate, pnTotalDiscountAvize
poDate = NULL
pnTotalDiscountAvize = 0
DO TestRamuraComanda
DO TestRamuraAviz
DO TestSecventaNoua
DO Final
*----------------------------------------------------------------------------------------
* Ramura comanda (Case Inlist(poDate.Tip,3,21,25,28,42,47)) - cantitate_ramasa_comanda
PROCEDURE TestRamuraComanda
LOCAL laIds[1], nCnt, i, lnId, lnOldSum, lnNewVal, lcSql
nCnt = ALINES(laIds, "657,1163,2154,1191,1503,1572,2229,2268", 1, ",")
FOR i = 1 TO nCnt
lnId = VAL(laIds[i])
gcCaz = "[comanda id_comanda=" + TRANSFORM(lnId) + "] "
DO AfLog WITH "PAS: " + gcCaz
DO Inchide WITH 'crsarticole'
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", 30000 + lnId, 3)
poDate.zi_curs = DATE(gnAn, gnLuna, 1)
poDate.listaid = ALLTRIM(STR(lnId))
lcSql = [{call pack_facturare.cursor_comanda(?poDate.zi_curs,?poDate.tip,?poDate.listaid,?gnIdUtil)}]
IF goExecutor.oExecute(lcSql, 'crsarticole') < 0
DO Assert WITH .F., "cursor_comanda apel esuat: " + goExecutor.oPrelucrareEroare()
LOOP
ENDIF
lnOldSum = 0
IF USED('crsarticole') AND RECCOUNT('crsarticole') > 0
SELECT crsarticole
CALCULATE SUM(cantitate) TO lnOldSum
ENDIF
lcSql = [SELECT pack_facturare.cantitate_ramasa_comanda(] + ALLTRIM(STR(lnId)) + [) AS ramas FROM dual]
IF goExecutor.oExecute(lcSql, 'crstestramas') < 0
DO Assert WITH .F., "cantitate_ramasa_comanda apel esuat: " + goExecutor.oPrelucrareEroare()
DO Inchide WITH 'crsarticole'
LOOP
ENDIF
lnNewVal = crstestramas.ramas
DO Inchide WITH 'crstestramas'
DO Assert WITH ROUND(NVL(lnOldSum, 0), 2) == ROUND(NVL(lnNewVal, 0), 2), ;
"vechi(Calculate Sum)=" + TRANSFORM(lnOldSum) + " nou(cantitate_ramasa_comanda)=" + TRANSFORM(lnNewVal)
DO Inchide WITH 'crsarticole'
ENDFOR
ENDPROC
*----------------------------------------------------------------------------------------
* Ramura aviz (Case poDate.Tip = 4) - exista_ramas_avize_lista
PROCEDURE TestRamuraAviz
LOCAL laListe[1], nCnt, i, lcLista, lnOldSum, lnNewVal, lcSql
nCnt = ALINES(laListe, "1052|973|140|1052,973", 1, "|")
FOR i = 1 TO nCnt
lcLista = laListe[i]
gcCaz = "[aviz listaid=" + lcLista + "] "
DO AfLog WITH "PAS: " + gcCaz
DO Inchide WITH 'crsarticole'
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", 40000 + i, 4)
poDate.zi_curs = DATE(gnAn, gnLuna, 1)
poDate.listaid = lcLista
pnTotalDiscountAvize = 0
lcSql = [{call pack_facturare.cursor_avize(?poDate.listaid,?gnIdUtil,?@pnTotalDiscountAvize)}]
IF goExecutor.oExecute(lcSql, 'crsarticole') < 0
DO Assert WITH .F., "cursor_avize apel esuat: " + goExecutor.oPrelucrareEroare()
LOOP
ENDIF
lnOldSum = 0
IF USED('crsarticole') AND RECCOUNT('crsarticole') > 0
SELECT crsarticole
CALCULATE SUM(cantitate) TO lnOldSum
ENDIF
lcSql = [SELECT pack_facturare.exista_ramas_avize_lista('] + lcLista + [') AS ramas FROM dual]
IF goExecutor.oExecute(lcSql, 'crstestramas') < 0
DO Assert WITH .F., "exista_ramas_avize_lista apel esuat: " + goExecutor.oPrelucrareEroare()
DO Inchide WITH 'crsarticole'
LOOP
ENDIF
lnNewVal = crstestramas.ramas
DO Inchide WITH 'crstestramas'
DO Assert WITH ROUND(NVL(lnOldSum, 0), 2) == ROUND(NVL(lnNewVal, 0), 2), ;
"vechi(Calculate Sum)=" + TRANSFORM(lnOldSum) + " nou(exista_ramas_avize_lista)=" + TRANSFORM(lnNewVal)
DO Inchide WITH 'crsarticole'
ENDFOR
ENDPROC
*----------------------------------------------------------------------------------------
* Reproduce LITERAL secventa noua din ofacturare.vc2 (aceleasi nume de cursor: crsramasavize,
* crsramascomanda), ca sa execute efectiv codul scris - nu doar o comparatie de valori pe alt
* cursor. Aserteaza explicit ca alias-ul se inchide dupa Use In (Used() = .F.) - exact ce ar fi
* prins bug-ul "Use In (crsramasavize)" (paranteze = evaluare ca variabila in VFP, eroare la
* rulare, alias ramas deschis).
PROCEDURE TestSecventaNoua
LOCAL lcSql, lnCantitateRamasa
gcCaz = "[secventa noua - aviz, listaid=1052] "
DO AfLog WITH "PAS: " + gcCaz
DO Inchide WITH 'crsramasavize'
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", 50001, 4)
poDate.listaid = "1052"
*-- reproducere literala, ofacturare.vc2:20051-20058
lcSql = [SELECT pack_facturare.exista_ramas_avize_lista('] + Alltrim(poDate.listaid) + [') AS ramas FROM dual]
IF goExecutor.oExecute(lcSql,'crsramasavize') < 0
DO Assert WITH .F., "aviz: apelul nou a esuat: " + goExecutor.oPrelucrareEroare()
ELSE
DO Assert WITH USED('crsramasavize'), "aviz: cursorul crsramasavize a fost deschis de oExecute"
lnCantitateRamasa = crsramasavize.ramas
Use In (Select('crsramasavize'))
DO Assert WITH !USED('crsramasavize'), "aviz: Use In (Select(...)) a inchis alias-ul (Used()=.F.)"
DO Assert WITH VARTYPE(lnCantitateRamasa) == 'N', "aviz: lnCantitateRamasa citit ca numeric (" + TRANSFORM(lnCantitateRamasa) + ")"
ENDIF
gcCaz = "[secventa noua - comanda, listaid=1163] "
DO AfLog WITH "PAS: " + gcCaz
DO Inchide WITH 'crsramascomanda'
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", 50002, 3)
poDate.listaid = "1163"
*-- reproducere literala, ofacturare.vc2:20088-20095
lcSql = [SELECT pack_facturare.cantitate_ramasa_comanda(] + Alltrim(Str(Val(poDate.listaid))) + [) AS ramas FROM dual]
IF goExecutor.oExecute(lcSql,'crsramascomanda') < 0
DO Assert WITH .F., "comanda: apelul nou a esuat: " + goExecutor.oPrelucrareEroare()
ELSE
DO Assert WITH USED('crsramascomanda'), "comanda: cursorul crsramascomanda a fost deschis de oExecute"
lnCantitateRamasa = crsramascomanda.ramas
Use In (Select('crsramascomanda'))
DO Assert WITH !USED('crsramascomanda'), "comanda: Use In (Select(...)) a inchis alias-ul (Used()=.F.)"
DO Assert WITH VARTYPE(lnCantitateRamasa) == 'N', "comanda: lnCantitateRamasa citit ca numeric (" + TRANSFORM(lnCantitateRamasa) + ")"
ENDIF
*-- Cazul care probeaza castigul formei Use In (Select(...)) fata de forma bara: alias
*-- INEXISTENT (cursorul n-a fost creat, de exemplu pe o cale unde oExecute ar fi esuat).
*-- Select('alias') intoarce 0 daca alias-ul nu e deschis, iar Use In (0) e no-op - deci
*-- linia nu arunca eroare. Forma bara (Use In crsramasavize) ar arunca "Alias not found".
gcCaz = "[secventa noua - alias inexistent] "
DO AfLog WITH "PAS: " + gcCaz
DO Inchide WITH 'crsramasavize'
DO Assert WITH !USED('crsramasavize'), "alias inexistent: crsramasavize confirmat inchis inainte de proba"
LOCAL lnErrInainte
lnErrInainte = gnErr
Use In (Select('crsramasavize'))
DO Assert WITH gnErr == lnErrInainte, "alias inexistent: Use In (Select(...)) pe alias inchis NU arunca eroare (gnErr neschimbat)"
ENDPROC
*----------------------------------------------------------------------------------------
PROCEDURE Inchide
LPARAMETERS tcAlias
IF USED(tcAlias)
USE IN (tcAlias)
ENDIF
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 AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10)
gnErr = gnErr + 1
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,303 @@
* test_s4_5_do_sterge_garda.prg
* Headless: EXECUTA garda noua Used(lcCursor) din do_sterge (COMUN\clase\ofacturare.vc2:20413-20447),
* singura parte din S4-5 ramasa in acest tur - vezi docs\raport_s4_5_implementare.md pentru motivul
* pentru care extinderea llCautareInLinie la 23 si plafonul Rol B in do_adauga_articol_cautat au fost
* REVENITE (blocaj real gasit prin aceasta suita, nu prin citire de cod).
*
* 1. Garda noua: stergerea unei linii adaugate prin do_adauga_articol_cautat (deci crsarticole
* NEIncarcat - cazul tipurilor din llCautareInLinie, ex. tip 1) nu mai arunca eroare de alias
* la Select(lcCursor). Fara fix, aceasta suita ar fi cazut cu "ERROR ... Alias ... not found".
* 2. Neregresie Rol A: pe un tip comanda (crsarticole incarcat), do_sterge restaureaza cantitatea
* exact ca inainte de fix - fix-ul adauga doar garda, nu schimba continutul Do Case-ului.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s4_5_do_sterge_garda.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4_5_do_sterge_garda.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 1.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr
PUBLIC gcMockApeluri, gnMockRaspuns, gcMockDuplicat, gnMockNumar
PUBLIC gnPc, gnPVal, gnPPretV, gnScadereStoc, gnMemProcDisc
gnMockNumar = 0
gnPc = 2
gnPVal = 2
gnPPretV = 4
gnScadereStoc = 1
gnMemProcDisc = 0
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4_5_do_sterge_garda.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
gnErr = 0
gcCaz = ""
gcErr = ""
gcMockApeluri = ""
gnMockRaspuns = 6
gcMockDuplicat = ""
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
LOCAL lcProc
lcProc = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", ;
"D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg", &lcProc
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
gnIdUtil = 8
gnIdSucursala = 167
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
gnScadereStoc = 1
DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) + " gnIdSucursala=" + TRANSFORM(gnIdSucursala)
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE
update_jtva_coloane([JV], [jtva_coloane_temp])
* jtva_coloane: cursorul folosit de derivarea id_jtva_coloana din proc_tvav (do_adauga_articol_cautat)
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
CREATE CURSOR jtva_coloane (id_jtva_coloana N(14), denumire C(50), cota_tva N(6,2))
INSERT INTO jtva_coloane VALUES (190, 'TVA 19%', 19)
INSERT INTO jtva_coloane VALUES (210, 'TVA 21%', 21)
INSERT INTO jtva_coloane VALUES (110, 'TVA 11%', 11)
GO TOP IN jtva_coloane
PRIVATE poDate, poGeneratorNumere, plVizibil, pnTotalDiscountAvize
plVizibil = .F.
pnTotalDiscountAvize = 0
poDate = NULL
poGeneratorNumere = CREATEOBJECT("oGeneratorMock")
DO TestStergereLinieCautata WITH 315554536
DO TestStergereNeregresieRolA
DO Final
*----------------------------------------------------------------------------------------
* do_sterge: linie adaugata prin do_adauga_articol_cautat pe un tip din llCautareInLinie
* (crsarticole NU e incarcat) - inainte de fix ar fi cazut cu eroare de alias la Select(lcCursor).
PROCEDURE TestStergereLinieCautata
LPARAMETERS tnIdArticol
LOCAL loForm, loArticol
gcCaz = "[do_sterge pe linie cautata, crsarticole neincarcat] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 1
DO Inchide WITH 'crsarticole'
DO Assert WITH !USED('crsarticole'), "precondition: crsarticole NU e deschis"
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
SELECT crsfactura
APPEND BLANK
loArticol = ConstruiesteArticol(tnIdArticol, 1)
loForm.do_adauga_articol_cautat(loArticol, 1)
DO Assert WITH RECCOUNT('crsfactura') = 1, "randul a fost adaugat inainte de stergere"
gcErr = ""
gnErr = 0
gnMockRaspuns = 6 && confirma stergerea
loForm.do_sterge()
DO Assert WITH gnErr = 0, "do_sterge nu arunca nicio eroare cand crsarticole nu e deschis (gnErr=" + TRANSFORM(gnErr) + ")"
DO Assert WITH !("ALIAS" $ UPPER(gcErr)) AND !("CRSARTICOLE" $ UPPER(gcErr)), "fara eroare de alias/crsarticole in gcErr"
DO Assert WITH RECCOUNT('crsfactura') = 0, "randul a fost sters din crsfactura"
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
* Neregresie Rol A: tip comanda (3), crsarticole incarcat - do_sterge trebuie sa refaca
* cantitatea in crsarticole exact ca inainte de fix (fix-ul adauga doar garda Used(), nu schimba
* continutul Do Case-ului pentru tipurile unde crsarticole e Used()).
PROCEDURE TestStergereNeregresieRolA
LOCAL loForm
gcCaz = "[do_sterge neregresie Rol A, tip=3, crsarticole incarcat] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 3
SELECT 0
CREATE CURSOR crsarticole (id_c N(20), id_articol N(20), denumire C(100), cantitate N(20,4), ;
gestionabil N(1), opt_facturare N(3), Pret N(20,4), pret_val N(20,4), proc_tvav N(20,4), ;
preturi_cu_tva N(1), um C(10), id_gestiune N(20), cont C(10), id_valuta N(10), tip_valuta N(1), ;
Curs N(20,4), multiplicator N(10), discount_unitar N(20,4), discount_unitar_val N(20,4), ;
codmat C(50), codbare C(50), nume_val C(20))
INSERT INTO crsarticole VALUES (1, 401, "ARTICOL COMANDA", 7, 0, 0, 100, 0, 1.19, 0, "BUC", ;
21, "371", 1, 0, 1, 1, 0, 0, "CM401", "", "RON")
GO TOP IN crsarticole
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
SELECT crsfactura
APPEND BLANK
REPLACE id_temp WITH 1, id_c WITH 1, id_articol WITH 401, denumire WITH "ARTICOL COMANDA", ;
cantitate WITH 3, opt_facturare WITH 0
GO TOP
gcErr = ""
gnErr = 0
gnMockRaspuns = 6
loForm.do_sterge()
DO Assert WITH gnErr = 0, "do_sterge fara eroare pe tip comanda cu crsarticole incarcat"
DO Assert WITH RECCOUNT('crsfactura') = 0, "randul a fost sters din crsfactura"
IF USED('crsarticole')
SELECT crsarticole
LOCATE FOR id_c = 1
DO Assert WITH FOUND() AND cantitate = 10, "crsarticole id_c=1: cantitate restaurata (7+3=10), Rol A neregresat"
ENDIF
DO Inchide WITH 'crsarticole'
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
* Construieste un obiect cu exact campurile cursorului combosql_cautare (creeaza_cursor_gol),
* ca sa reproduca fidel Scatter Name loArticol MEMO din LostFocus.
FUNCTION ConstruiesteArticol
LPARAMETERS tnIdArticol, tnCantitate
LOCAL loArticol
loArticol = CREATEOBJECT("Empty")
ADDPROPERTY(loArticol, "codmat", "CMTEST")
ADDPROPERTY(loArticol, "denumire", "ARTICOL TEST S4-5")
ADDPROPERTY(loArticol, "um", "BUC")
ADDPROPERTY(loArticol, "pret", 100)
ADDPROPERTY(loArticol, "proc_tvav", 1.19)
ADDPROPERTY(loArticol, "nume_val", "RON")
ADDPROPERTY(loArticol, "codbare", "")
ADDPROPERTY(loArticol, "id_articol", tnIdArticol)
ADDPROPERTY(loArticol, "id_pol", 1)
ADDPROPERTY(loArticol, "gestionabil", 1)
ADDPROPERTY(loArticol, "preturi_cu_tva", 0)
ADDPROPERTY(loArticol, "tip_valuta", 0)
ADDPROPERTY(loArticol, "curs", 1)
ADDPROPERTY(loArticol, "multiplicator", 1)
ADDPROPERTY(loArticol, "id_valuta", 1)
ADDPROPERTY(loArticol, "discount_unitar", 0)
ADDPROPERTY(loArticol, "discount_unitar_val", 0)
ADDPROPERTY(loArticol, "cantitate", tnCantitate)
ADDPROPERTY(loArticol, "nume_lista_preturi", "TEST")
ADDPROPERTY(loArticol, "pret_val", 0)
ADDPROPERTY(loArticol, "id_gestiune", -1000)
ADDPROPERTY(loArticol, "cont", "XXXX")
ADDPROPERTY(loArticol, "id_ctr", 0)
ADDPROPERTY(loArticol, "opt_facturare", 0)
RETURN loArticol
ENDFUNC
*----------------------------------------------------------------------------------------
PROCEDURE Reseteaza
LPARAMETERS tnTip
LOCAL lnIdSet
DO Inchide WITH 'crsarticole'
DO Inchide WITH 'crsarticole1'
DO Inchide WITH 'crsfactura'
DO Inchide WITH 'crscursuri'
DO Inchide WITH 'crspolitici'
DO Inchide WITH 'crscontracte'
DO Inchide WITH 'crsgestiunidest'
DO Inchide WITH 'crsCtrTemp'
DO Inchide WITH 'CrsCotaTva'
DO Inchide WITH 'saft_tip_facturi'
SELECT 0
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
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
gcMockApeluri = ""
gcErr = ""
gnErr = 0
gnMockRaspuns = 6
gcMockDuplicat = ""
lnIdSet = 27000 + tnTip
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip)
poDate.dataireg = DATE(gnAn, gnLuna, 1)
poDate.dataact = poDate.dataireg
poDate.zi_curs = poDate.dataireg
poDate.id_fdoc = 1
poDate.fdoc = "FEL TEST"
poDate.nract = 78
poDate.serie_act = "TST"
poDate.id_client = 1
poDate.id_furnizor = 1
poDate.nrfactachi = 1
poDate.id_valuta = 1
poDate.in_valuta = 0
poDate.listaid = "1"
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
gcMockApeluri = ""
ENDPROC
PROCEDURE Inchide
LPARAMETERS tcAlias
IF USED(tcAlias)
USE IN (tcAlias)
ENDIF
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 AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10)
gnErr = gnErr + 1
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,405 @@
* test_s4c_discount_grid.prg
* Headless: S4c - discountul pe linie de articol editabil in grid, frm_facturare_articole2 (v2).
* Acopera direct campurile scrise de recalc_discount_linie (COMUN\programe\oproceduri_facturare.prg:
* 2398-2446) + calculeaza_totaluri (COMUN\programe\oproceduri_facturare.prg:2259-2394), campul real
* procdisc din creeaza_facturacrs (COMUN\programe\ofacturare_comun.prg:1794), Column14.ReadOnly = .T.
* (COMUN\clase\ofacturare.vc2:17438) si neregresia pe campul memo explicatie la ciclul
* SCATTER/GATHER NAME ... MEMO.
*
* Sase asertiuni:
* T1. recalc_discount_linie(loArt, 100, 2) [discount RON pe pret ftva=1000, cantitate=2,
* proc_tvav=1.19, tip_valuta=0] + calculeaza_totaluri: valdiminuatftva, valdiminuatctva,
* vvaldiminuatftva, vvaldiminuatctva, valdiscountftva, vvaldiscountftva egale cu valorile
* calculate manual dupa aceeasi formula (Do Case tnTip=2, ramura cu_tva=0).
* T2. recalc_discount_linie(loArt, 10, 3) [discount in valuta pe vpretftva=100, Curs=5,
* cantitate=3] + calculeaza_totaluri: aceleasi 6 campuri, ramura tnTip=3/tip_valuta=1.
* T3. procdisc = Round(discountftva/pretftva*100, 2) dupa T1 si T2.
* T4. Garda pretftva=0: recalc_discount_linie nu arunca eroare (gnErr=0) si procdisc=0.
* T5. Column14.ReadOnly = .T. pe grid-ul instantiat (frm_facturare_articole2.grd_factura.Column14).
* T6. explicatie (M) neschimbata dupa un ciclu SCATTER NAME ... MEMO / recalc / GATHER NAME ... MEMO.
*
* Sablon urmat: test_s4e_registru.prg (harness identic, acelasi env auto).
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s4c_discount_grid.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4c_discount_grid.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO (schema/instanta CONTAFIN_ORACLE); gnIdUtil = 8 inainte de
* creeaza_cursor_serii; gnScadereStoc = 1.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr
PUBLIC gcMockApeluri, gnMockRaspuns, gcMockDuplicat, gnMockNumar
PUBLIC gnPc, gnPVal, gnPPretV, gnScadereStoc, gnMemProcDisc
gnMockNumar = 0
gnPc = 2
gnPVal = 2
gnPPretV = 4
gnScadereStoc = 1
gnMemProcDisc = 0
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4c_discount_grid.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
gnErr = 0
gcCaz = ""
gcErr = ""
gcMockApeluri = ""
gnMockRaspuns = 6
gcMockDuplicat = ""
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
LOCAL lcProc
lcProc = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", ;
"D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg", &lcProc
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
gnIdUtil = 8
gnIdSucursala = 167
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
gnScadereStoc = 1
DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) + " gnIdSucursala=" + TRANSFORM(gnIdSucursala)
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
CREATE CURSOR jtva_coloane (id_jtva_coloana N(14), denumire C(50), cota_tva N(6,2))
INSERT INTO jtva_coloane VALUES (190, 'TVA 19%', 19)
INSERT INTO jtva_coloane VALUES (210, 'TVA 21%', 21)
INSERT INTO jtva_coloane VALUES (110, 'TVA 11%', 11)
GO TOP IN jtva_coloane
PRIVATE poDate, poGeneratorNumere, plVizibil, pnTotalDiscountAvize
plVizibil = .F.
pnTotalDiscountAvize = 0
poDate = NULL
poGeneratorNumere = CREATEOBJECT("oGeneratorMock")
DO TestT1
DO TestT2
DO TestT3
DO TestT4
DO TestT5
DO TestT6
DO Final
*----------------------------------------------------------------------------------------
* T1: recalc_discount_linie(loArt, 100, 2) - discount in RON pe o linie RON (tip_valuta=0),
* pretftva=1000, cantitate=2, proc_tvav=1.19. Verifica cele 6 campuri agregate dupa calculeaza_totaluri.
PROCEDURE TestT1
LOCAL loArt, lnValdiminuatftva, lnValdiminuatctva, lnVvaldiminuatftva, lnVvaldiminuatctva, ;
lnValdiscountftva, lnVvaldiscountftva
gcCaz = "[T1: recalc_discount_linie tip=2 (RON)] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 3
SELECT crsfactura
APPEND BLANK
REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH 401, denumire WITH "ARTICOL RON", ;
cantitate WITH 2, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1, ;
pretftva WITH 1000, pretctva WITH 1190, vpretftva WITH 1000, vpretctva WITH 1190, ;
proc_Tvav WITH 1.19, discountftva WITH 0, discountctva WITH 0, vdiscountftva WITH 0, ;
vdiscountctva WITH 0
SELECT crsfactura
SCATTER NAME loArt MEMO
loArt = recalc_discount_linie(loArt, 100, 2)
loArt = calculeaza_totaluri(loArt)
GATHER NAME loArt MEMO
DO Assert WITH gnErr = 0, "recalc_discount_linie + calculeaza_totaluri fara eroare (T1)"
SELECT crsfactura
lnValdiminuatftva = valdiminuatftva
lnValdiminuatctva = valdiminuatctva
lnVvaldiminuatftva = vvaldiminuatftva
lnVvaldiminuatctva = vvaldiminuatctva
lnValdiscountftva = valdiscountftva
lnVvaldiscountftva = vvaldiscountftva
DO Assert WITH discountftva = 100, "discountftva = 100 (obtinut: " + TRANSFORM(discountftva) + ")"
DO Assert WITH discountctva = 119, "discountctva = 119 = 100 + 100*0.19 (obtinut: " + TRANSFORM(discountctva) + ")"
DO Assert WITH lnValdiscountftva = 200, "valdiscountftva = 200 = 100*2 (obtinut: " + TRANSFORM(lnValdiscountftva) + ")"
DO Assert WITH lnVvaldiscountftva = 0, "vvaldiscountftva = 0 (vdiscountftva neatins de editarea RON, obtinut: " + TRANSFORM(lnVvaldiscountftva) + ")"
DO Assert WITH lnValdiminuatftva = 1800, "valdiminuatftva = 1800 = (1000-100)*2 (obtinut: " + TRANSFORM(lnValdiminuatftva) + ")"
DO Assert WITH lnValdiminuatctva = 2142, "valdiminuatctva = 2142 = 1800 + 1800*0.19 (obtinut: " + TRANSFORM(lnValdiminuatctva) + ")"
DO Assert WITH lnVvaldiminuatftva = 2000, "vvaldiminuatftva = 2000 = (1000-0)*2 (obtinut: " + TRANSFORM(lnVvaldiminuatftva) + ")"
DO Assert WITH lnVvaldiminuatctva = 2380, "vvaldiminuatctva = 2380 = 2000 + 2000*0.19 (obtinut: " + TRANSFORM(lnVvaldiminuatctva) + ")"
ENDPROC
*----------------------------------------------------------------------------------------
* T2: recalc_discount_linie(loArt, 10, 3) - discount in valuta pe o linie in valuta (tip_valuta=1),
* vpretftva=100, Curs=5, multiplicator=1, pretftva=500, cantitate=3, proc_tvav=1.19.
PROCEDURE TestT2
LOCAL loArt, lnValdiminuatftva, lnValdiminuatctva, lnVvaldiminuatftva, lnVvaldiminuatctva, ;
lnValdiscountftva, lnVvaldiscountftva
gcCaz = "[T2: recalc_discount_linie tip=3 (valuta)] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 3
SELECT crsfactura
APPEND BLANK
REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH 402, denumire WITH "ARTICOL VALUTA", ;
cantitate WITH 3, cu_tva WITH 0, tip_valuta WITH 1, Curs WITH 5, multiplicator WITH 1, ;
pretftva WITH 500, pretctva WITH 595, vpretftva WITH 100, vpretctva WITH 119, ;
proc_Tvav WITH 1.19, discountftva WITH 0, discountctva WITH 0, vdiscountftva WITH 0, ;
vdiscountctva WITH 0
SELECT crsfactura
SCATTER NAME loArt MEMO
loArt = recalc_discount_linie(loArt, 10, 3)
loArt = calculeaza_totaluri(loArt)
GATHER NAME loArt MEMO
DO Assert WITH gnErr = 0, "recalc_discount_linie + calculeaza_totaluri fara eroare (T2)"
SELECT crsfactura
lnValdiminuatftva = valdiminuatftva
lnValdiminuatctva = valdiminuatctva
lnVvaldiminuatftva = vvaldiminuatftva
lnVvaldiminuatctva = vvaldiminuatctva
lnValdiscountftva = valdiscountftva
lnVvaldiscountftva = vvaldiscountftva
DO Assert WITH vdiscountftva = 10, "vdiscountftva = 10 (obtinut: " + TRANSFORM(vdiscountftva) + ")"
DO Assert WITH discountftva = 50, "discountftva = 50 = 10*5/1 (obtinut: " + TRANSFORM(discountftva) + ")"
DO Assert WITH vdiscountctva = 11.90, "vdiscountctva = 11.90 = 10 + 10*0.19 (obtinut: " + TRANSFORM(vdiscountctva) + ")"
DO Assert WITH lnValdiscountftva = 150, "valdiscountftva = 150 = 50*3 (obtinut: " + TRANSFORM(lnValdiscountftva) + ")"
DO Assert WITH lnVvaldiscountftva = 30, "vvaldiscountftva = 30 = 10*3 (obtinut: " + TRANSFORM(lnVvaldiscountftva) + ")"
DO Assert WITH lnValdiminuatftva = 1350, "valdiminuatftva = 1350 = (500-50)*3 (obtinut: " + TRANSFORM(lnValdiminuatftva) + ")"
DO Assert WITH lnValdiminuatctva = 1606.50, "valdiminuatctva = 1606.50 = 1350 + 1350*0.19 (obtinut: " + TRANSFORM(lnValdiminuatctva) + ")"
DO Assert WITH lnVvaldiminuatftva = 270, "vvaldiminuatftva = 270 = (100-10)*3 (obtinut: " + TRANSFORM(lnVvaldiminuatftva) + ")"
DO Assert WITH lnVvaldiminuatctva = 321.30, "vvaldiminuatctva = 321.30 = 270 + 270*0.19 (obtinut: " + TRANSFORM(lnVvaldiminuatctva) + ")"
ENDPROC
*----------------------------------------------------------------------------------------
* T3: procdisc = Round(discountftva/pretftva*100, 2), verificat pe cele doua randuri ramase
* din T1/T2 (crsfactura nu e resetat intre T1..T3 in mod explicit - se reia cu Reseteaza local).
PROCEDURE TestT3
LOCAL loArt
gcCaz = "[T3: procdisc calculat] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 3
SELECT crsfactura
APPEND BLANK
REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH 401, denumire WITH "ARTICOL RON", ;
cantitate WITH 2, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1, ;
pretftva WITH 1000, pretctva WITH 1190, vpretftva WITH 1000, vpretctva WITH 1190, ;
proc_Tvav WITH 1.19, discountftva WITH 0, discountctva WITH 0, vdiscountftva WITH 0, ;
vdiscountctva WITH 0
SCATTER NAME loArt MEMO
loArt = recalc_discount_linie(loArt, 100, 2)
loArt = calculeaza_totaluri(loArt)
GATHER NAME loArt MEMO
DO Assert WITH procdisc = 10.00, "procdisc = 10.00 = Round(100/1000*100,2) (obtinut: " + TRANSFORM(procdisc) + ")"
SELECT crsfactura
APPEND BLANK
REPLACE id_temp WITH 2, id_c WITH 0, id_articol WITH 402, denumire WITH "ARTICOL VALUTA", ;
cantitate WITH 3, cu_tva WITH 0, tip_valuta WITH 1, Curs WITH 5, multiplicator WITH 1, ;
pretftva WITH 500, pretctva WITH 595, vpretftva WITH 100, vpretctva WITH 119, ;
proc_Tvav WITH 1.19, discountftva WITH 0, discountctva WITH 0, vdiscountftva WITH 0, ;
vdiscountctva WITH 0
SCATTER NAME loArt MEMO
loArt = recalc_discount_linie(loArt, 10, 3)
loArt = calculeaza_totaluri(loArt)
GATHER NAME loArt MEMO
DO Assert WITH procdisc = 10.00, "procdisc = 10.00 = Round(50/500*100,2) (obtinut: " + TRANSFORM(procdisc) + ")"
ENDPROC
*----------------------------------------------------------------------------------------
* T4: garda pretftva=0 - recalc_discount_linie nu arunca eroare (impartire la zero evitata),
* procdisc ramane 0.
PROCEDURE TestT4
LOCAL loArt
gcCaz = "[T4: garda pretftva=0] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 3
SELECT crsfactura
APPEND BLANK
REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH 403, denumire WITH "ARTICOL PRET 0", ;
cantitate WITH 1, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1, ;
pretftva WITH 0, pretctva WITH 0, vpretftva WITH 0, vpretctva WITH 0, ;
proc_Tvav WITH 1.19, discountftva WITH 0, discountctva WITH 0, vdiscountftva WITH 0, ;
vdiscountctva WITH 0
gnErr = 0
gcErr = ""
SCATTER NAME loArt MEMO
loArt = recalc_discount_linie(loArt, 50, 2)
loArt = calculeaza_totaluri(loArt)
GATHER NAME loArt MEMO
DO Assert WITH gnErr = 0, "fara eroare cu pretftva=0 (gcErr: " + gcErr + ")"
SELECT crsfactura
DO Assert WITH procdisc = 0, "procdisc = 0 cu pretftva=0, fara impartire la zero (obtinut: " + TRANSFORM(procdisc) + ")"
DO Assert WITH discountftva = 50, "discountftva tot s-a scris (=50) desi pretftva=0 (obtinut: " + TRANSFORM(discountftva) + ")"
ENDPROC
*----------------------------------------------------------------------------------------
* T5: Column14 (cProcentDiscount) e needitabila pe grid-ul instantiat.
PROCEDURE TestT5
LOCAL loForm
gcCaz = "[T5: frm_facturare_articole2 se instantiaza] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 3
*-- Column14.ReadOnly = .T. e verificat static (diff pe text + reconversie binar->text
*-- byte-identica), NU aici: coloanele de grid nu se materializeaza sub -A -T
*-- (Column14 nu exista ca membru desi ColumnCount=14 - grid neinitializat vizual,
*-- memorie de proiect grid-coloane-nu-se-materializeaza-headless), asa ca un
*-- Thisform.grd_factura.Column14.ReadOnly headless arunca "Unknown member".
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) = 'O'
loForm.Release()
ENDIF
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
* T6: neregresie - campul memo explicatie ramane neschimbat dupa un ciclu
* SCATTER NAME ... MEMO / recalc_discount_linie / calculeaza_totaluri / GATHER NAME ... MEMO.
PROCEDURE TestT6
LOCAL loArt, lcExplicatieInainte, lcExplicatieDupa
gcCaz = "[T6: neregresie explicatie M la SCATTER/GATHER MEMO] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 3
lcExplicatieInainte = "Explicatie test S4c, text lung cu linie noua." + CHR(13) + CHR(10) + "a doua linie, semne: !?.,;:-_()"
SELECT crsfactura
APPEND BLANK
REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH 401, denumire WITH "ARTICOL EXPLICATIE", ;
cantitate WITH 1, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1, ;
pretftva WITH 1000, pretctva WITH 1190, vpretftva WITH 1000, vpretctva WITH 1190, ;
proc_Tvav WITH 1.19, discountftva WITH 0, discountctva WITH 0, vdiscountftva WITH 0, ;
vdiscountctva WITH 0
REPLACE explicatie WITH m.lcExplicatieInainte
SELECT crsfactura
SCATTER NAME loArt MEMO
loArt = recalc_discount_linie(loArt, 100, 2)
loArt = calculeaza_totaluri(loArt)
GATHER NAME loArt MEMO
SELECT crsfactura
lcExplicatieDupa = explicatie
DO Assert WITH lcExplicatieDupa == m.lcExplicatieInainte, ;
"explicatie (M) neschimbata dupa SCATTER/GATHER MEMO (lungime inainte=" + ;
TRANSFORM(LEN(m.lcExplicatieInainte)) + " dupa=" + TRANSFORM(LEN(m.lcExplicatieDupa)) + ")"
ENDPROC
*----------------------------------------------------------------------------------------
PROCEDURE Reseteaza
LPARAMETERS tnTip
LOCAL lnIdSet
DO Inchide WITH 'crsarticole'
DO Inchide WITH 'crsarticole1'
DO Inchide WITH 'crsfactura'
DO Inchide WITH 'crscursuri'
DO Inchide WITH 'crspolitici'
DO Inchide WITH 'crscontracte'
DO Inchide WITH 'crsgestiunidest'
DO Inchide WITH 'crsCtrTemp'
DO Inchide WITH 'CrsCotaTva'
DO Inchide WITH 'saft_tip_facturi'
SELECT 0
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
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
gcMockApeluri = ""
gcErr = ""
gnErr = 0
gnMockRaspuns = 6
gcMockDuplicat = ""
lnIdSet = 29000 + tnTip
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip)
poDate.dataireg = DATE(gnAn, gnLuna, 1)
poDate.dataact = poDate.dataireg
poDate.zi_curs = poDate.dataireg
poDate.id_fdoc = 1
poDate.fdoc = "FEL TEST"
poDate.nract = 79
poDate.serie_act = "TST"
poDate.id_client = 1
poDate.id_furnizor = 1
poDate.nrfactachi = 1
poDate.id_valuta = 1
poDate.in_valuta = 0
poDate.listaid = "1"
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
gcMockApeluri = ""
ENDPROC
PROCEDURE Inchide
LPARAMETERS tcAlias
IF USED(tcAlias)
USE IN (tcAlias)
ENDIF
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 AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10)
gnErr = gnErr + 1
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,365 @@
* test_s4d_zi_curs.prg
* Headless: S4d - data cursului valutar, reactiva (frm_facturare_articole2, v2).
* Acopera direct: metoda noua do_actualizeaza_vizibilitate_curs (COMUN\clase\ofacturare.vc2)
* si proprietatea noua loRezultat.lForteazaCursVizibil pusa de incarca_cursor_articole
* (COMUN\programe\ofacturare.prg:444-637) la eroarea Oracle -20005.
*
* Cazuri:
* T1. incarca_cursor_articole, mock Oracle -20005 (FARA/-1/20005) -> loRezultat.lForteazaCursVizibil = .T.
* T2. incarca_cursor_articole, mock succes (PLIN/1/0) -> loRezultat.lForteazaCursVizibil = .F.
* T3. incarca_cursor_articole, mock alta eroare (FARA/-1/1400) -> loRezultat.lForteazaCursVizibil = .F.
* T4. do_actualizeaza_vizibilitate_curs, poDate.in_valuta = 1 -> Visible = .T.
* T5. do_actualizeaza_vizibilitate_curs, in_valuta=0, 0 linii tip_valuta=1 -> Visible = .F.
* T6. do_actualizeaza_vizibilitate_curs, in_valuta=0, 1 linie tip_valuta=1 -> Visible = .T. (apare reactiv)
* T7. dupa stergerea liniei din T6 -> Visible = .F. (dispare reactiv)
* T8. do_actualizeaza_vizibilitate_curs(.T.), in_valuta=0, 0 linii tip_valuta=1 -> Visible = .T. (fortare -20005)
* T9. formular pe retur (tip 8): clb_zi_curs eliminat la Init; do_actualizeaza_vizibilitate_curs()
* nu arunca eroare (garda do_exista_obiect).
* T10. do_incarca_articole (tip=4, mock Oracle -20005): Return .F., si daca clb_zi_curs.Visible e
* citibil headless, verifica ca a devenit .T. (fortat de lForteazaCursVizibil). Citirea insasi
* e proba - daca nu e citibila, cazul se raporteaza informativ, nu esec.
*
* Oracle NU se atinge pe calea articolelor: goExecutor -> oExecutorMock (mock_cursor_articole.prg,
* deja folosit de test_s3_4_cursor_articole.prg si test_s4_3_incarca_filtrat.prg pentru exact acelasi
* scenariu -20005). poGeneratorNumere -> oGeneratorMock. amessagebox/facturi_duplicate ->
* mock_validare_antet.prg (T10, valideaza_antet ruleaza REAL).
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s4d_zi_curs.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4d_zi_curs.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 1.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr
PUBLIC gcMockApeluri, gnMockNumar, gcMockSql, gnMockSucces, gnMockEroare, gcMockMod, gcMockCurs
PUBLIC gnMockRaspuns, gcMockDuplicat, goExecutorReal
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4d_zi_curs.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
gnErr = 0
gcCaz = ""
gcErr = ""
gcMockApeluri = ""
gnMockNumar = 0
gcMockSql = ""
gnMockSucces = 1
gnMockEroare = 0
gcMockMod = "PLIN"
gcMockCurs = ""
gnMockRaspuns = 6
gcMockDuplicat = ""
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
LOCAL lcProc
lcProc = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", ;
"D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_cursor_articole.prg", ;
&lcProc, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg"
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
gnScadereStoc = 1
DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna)
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE
update_jtva_coloane([JV], [jtva_coloane_temp])
PRIVATE poDate, poGeneratorNumere, plVizibil, pnTotalDiscountAvize
plVizibil = .F.
pnTotalDiscountAvize = 0
poGeneratorNumere = CREATEOBJECT("oGeneratorMock")
poDate = NULL
goExecutorReal = goExecutor
goExecutor = CREATEOBJECT("oExecutorMock")
goExecutor.oReal = goExecutorReal
DO TestFlagEroare WITH "T1", 1, "FARA", -1, 20005, .T.
DO TestFlagEroare WITH "T2", 1, "PLIN", 1, 0, .F.
DO TestFlagEroare WITH "T3", 1, "FARA", -1, 1400, .F.
DO TestVizibilitate
DO TestRetur
DO TestIncarcaArticoleEroare
DO Final
*----------------------------------------------------------------------------------------
* T1-T3: proprietatea noua loRezultat.lForteazaCursVizibil pe incarca_cursor_articole.
PROCEDURE TestFlagEroare
LPARAMETERS tcCaz, tnTip, tcMod, tnSucces, tnEroare, tlAsteptat
LOCAL loRez
gcCaz = "[" + tcCaz + " mod=" + tcMod + " succes=" + TRANSFORM(tnSucces) + " eroare=" + TRANSFORM(tnEroare) + "] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH tnTip, tcMod, tnSucces, tnEroare, 0
loRez = incarca_cursor_articole(tnTip, .F., poGeneratorNumere)
DO Assert WITH VARTYPE(loRez) = 'O', "incarca_cursor_articole a intors obiect"
IF VARTYPE(loRez) <> 'O'
RETURN
ENDIF
DO Assert WITH PEMSTATUS(loRez, 'lForteazaCursVizibil', 5), "lForteazaCursVizibil materializata pe loRezultat"
DO Assert WITH loRez.lForteazaCursVizibil = tlAsteptat, "lForteazaCursVizibil = " + TRANSFORM(tlAsteptat) + " (obtinut: " + TRANSFORM(loRez.lForteazaCursVizibil) + ")"
DO Assert WITH loRez.nSucces = tnSucces, "nSucces = " + TRANSFORM(tnSucces) + " (obtinut: " + TRANSFORM(loRez.nSucces) + ")"
ENDPROC
*----------------------------------------------------------------------------------------
* T4-T8: matricea de vizibilitate a do_actualizeaza_vizibilitate_curs pe formularul instantiat.
PROCEDURE TestVizibilitate
LOCAL loForm, llVal, lnErrAntes, llCitibil
gcCaz = "[T4-T8 vizibilitate] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 1, "PLIN", 1, 0, 0
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
DO Assert WITH loForm.do_exista_obiect('clb_zi_curs'), "clb_zi_curs prezent (tip normal, nu retur)"
* T4: in_valuta = 1 -> vizibil neconditionat
poDate.in_valuta = 1
loForm.do_actualizeaza_vizibilitate_curs()
DO Assert WITH gnErr = 0, "T4 fara eroare (gcErr: " + gcErr + ")"
lnErrAntes = gnErr
llVal = .F.
llVal = loForm.clb_zi_curs.Visible
llCitibil = (gnErr = lnErrAntes)
IF llCitibil
DO Assert WITH llVal, "T4: clb_zi_curs.Visible = .T. cu in_valuta=1"
ELSE
DO AfLog WITH "INFO T4: clb_zi_curs.Visible nu s-a putut citi headless (eroare la citire)"
ENDIF
* T5: in_valuta = 0, 0 linii tip_valuta=1 -> ascuns
poDate.in_valuta = 0
loForm.do_actualizeaza_vizibilitate_curs()
DO Assert WITH gnErr = 0, "T5 fara eroare (gcErr: " + gcErr + ")"
IF llCitibil
llVal = loForm.clb_zi_curs.Visible
DO Assert WITH !llVal, "T5: clb_zi_curs.Visible = .F. cu in_valuta=0 si 0 linii valuta"
ENDIF
* T6: adauga o linie tip_valuta=1 -> apare reactiv
SELECT crsfactura
APPEND BLANK
REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH 501, denumire WITH "ARTICOL VALUTA T6", ;
cantitate WITH 1, cu_tva WITH 0, tip_valuta WITH 1, Curs WITH 5, multiplicator WITH 1, ;
pretftva WITH 100, pretctva WITH 119, vpretftva WITH 20, vpretctva WITH 23.80, ;
proc_Tvav WITH 1.19
loForm.do_actualizeaza_vizibilitate_curs()
DO Assert WITH gnErr = 0, "T6 fara eroare (gcErr: " + gcErr + ")"
IF llCitibil
llVal = loForm.clb_zi_curs.Visible
DO Assert WITH llVal, "T6: clb_zi_curs.Visible = .T. dupa adaugarea unei linii tip_valuta=1"
ENDIF
* T7: sterge linia -> dispare reactiv
SELECT crsfactura
LOCATE FOR id_articol = 501
IF FOUND()
DELETE
ENDIF
loForm.do_actualizeaza_vizibilitate_curs()
DO Assert WITH gnErr = 0, "T7 fara eroare (gcErr: " + gcErr + ")"
IF llCitibil
llVal = loForm.clb_zi_curs.Visible
DO Assert WITH !llVal, "T7: clb_zi_curs.Visible = .F. dupa stergerea liniei tip_valuta=1"
ENDIF
* T8: fortare (semnal -20005) cu in_valuta=0 si 0 linii valuta -> vizibil oricum
loForm.do_actualizeaza_vizibilitate_curs(.T.)
DO Assert WITH gnErr = 0, "T8 fara eroare (gcErr: " + gcErr + ")"
IF llCitibil
llVal = loForm.clb_zi_curs.Visible
DO Assert WITH llVal, "T8: clb_zi_curs.Visible = .T. cu tlForteazaVizibil=.T., indiferent de continutul grilei"
ENDIF
IF !llCitibil
DO AfLog WITH "DATORIE: clb_zi_curs.Visible nu s-a putut verifica headless in T4-T8 (proba doar structurala: gnErr=0 pe fiecare apel)"
ENDIF
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
* T9: pe retur (tip 8), clb_zi_curs e eliminat la Init; metoda noua nu trebuie sa arunce eroare.
PROCEDURE TestRetur
LOCAL loForm
gcCaz = "[T9 retur tip=8] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 8, "PLIN", 1, 0, 0
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2 (tip retur)"
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
DO Assert WITH !loForm.do_exista_obiect('clb_zi_curs'), "clb_zi_curs eliminat la Init pe retur (tip 8)"
loForm.do_actualizeaza_vizibilitate_curs()
DO Assert WITH gnErr = 0, "do_actualizeaza_vizibilitate_curs() pe retur nu arunca eroare (gcErr: " + gcErr + ")"
loForm.do_actualizeaza_vizibilitate_curs(.T.)
DO Assert WITH gnErr = 0, "do_actualizeaza_vizibilitate_curs(.T.) pe retur nu arunca eroare (gcErr: " + gcErr + ")"
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
* T10: do_incarca_articole pe un tip care CHEAMA incarca_cursor_articole (nu e in llCautareInLinie),
* cu mock Oracle -20005. Verifica Return .F. si, daca citibil, revenirea vizibila a campului.
PROCEDURE TestIncarcaArticoleEroare
LOCAL loForm, llRezultat, llVal, lnErrAntes, llCitibil
gcCaz = "[T10 do_incarca_articole tip=4, mock -20005] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 4, "FARA", -1, 20005, 0
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2 (tip=4)"
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
llRezultat = loForm.do_incarca_articole()
DO Assert WITH !llRezultat, "do_incarca_articole() Return .F. pe eroare Oracle -20005"
DO Assert WITH !EMPTY(gcMockSql), "incarca_cursor_articole a fost apelat (gcMockSql nevid) pe tip=4"
IF loForm.do_exista_obiect('clb_zi_curs')
lnErrAntes = gnErr
llVal = .F.
llVal = loForm.clb_zi_curs.Visible
llCitibil = (gnErr = lnErrAntes)
IF llCitibil
DO Assert WITH llVal, "T10: clb_zi_curs.Visible = .T. dupa -20005 in do_incarca_articole (fortat de lForteazaCursVizibil)"
ELSE
DO AfLog WITH "DATORIE: clb_zi_curs.Visible nu s-a putut verifica headless in T10"
ENDIF
ELSE
DO AfLog WITH "INFO T10: clb_zi_curs nu exista pe formularul instantiat (tip=4 neasteptat sa-l elimine)"
ENDIF
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
PROCEDURE Reseteaza
LPARAMETERS tnTip, tcMod, tnSucces, tnEroare, tnInValuta
LOCAL lnIdSet
DO Inchide WITH 'crsarticole'
DO Inchide WITH 'crsarticole1'
DO Inchide WITH 'crsfactura'
DO Inchide WITH 'crscursuri'
DO Inchide WITH 'crspolitici'
DO Inchide WITH 'crscontracte'
DO Inchide WITH 'crsgestiunidest'
DO Inchide WITH 'crsCtrTemp'
DO Inchide WITH 'CrsCotaTva'
SELECT 0
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
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
gcMockApeluri = ""
gcMockSql = ""
gcMockCurs = ""
gcErr = ""
gnMockNumar = 100
gnMockRaspuns = 6
gcMockDuplicat = ""
gcMockMod = tcMod
gnMockSucces = tnSucces
gnMockEroare = tnEroare
lnIdSet = 29000 + tnTip
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip)
poDate.dataireg = DATE(gnAn, gnLuna, 1)
poDate.dataact = poDate.dataireg
poDate.zi_curs = poDate.dataireg
poDate.id_fdoc = 1
poDate.fdoc = "FEL TEST"
poDate.nract = 79
poDate.serie_act = "TST"
poDate.id_client = 1
poDate.id_furnizor = 1
poDate.nrfactachi = 1
poDate.id_valuta = 1
poDate.in_valuta = tnInValuta
poDate.listaid = "1"
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
gcMockApeluri = ""
ENDPROC
PROCEDURE Inchide
LPARAMETERS tcAlias
IF USED(tcAlias)
USE IN (tcAlias)
ENDIF
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 AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10)
gnErr = gnErr + 1
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
IF TYPE('goExecutorReal') = 'O'
goExecutor = goExecutorReal
ENDIF
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,294 @@
* test_s4e_0_adauga_articol.prg
* Headless: do_adauga_articol pe frm_facturare_articole2 (COMUN\clase\ofacturare.vc2) NU mai arunca
* "1925 Unknown member GRD_ARTICOLE/GRD_CONTRACTE/TXTCODMAT" la prima executie pe formularul unificat
* (S4e-0: loGrid = Thisform.grd_factura in loc de grd_contracte/grd_articole la intrare, plus blocul de
* SetFocus neconditionat de la coada metodei colapsat pe grd_factura in loc de txtCodmat/txtArticole/
* grd_articole/grd_contracte - toate patru inexistente pe formularul unificat).
*
* crsarticole e construit direct (nu prin Oracle) - do_urmator/do_adauga_tot citesc doar cursorul,
* pozitionat explicit de test inainte de apel, deci nu depind de gridul nematerializat headless
* (capcana grid-coloane-nu-se-materializeaza-headless: aici nu se citeste nimic DIN grid, doar se cere
* SetFocus pe el la coada).
*
* CAZ_A (do_urmator, ramura de refuz): gestionabil=1, cantitate=-1, tip=3 -> do_verifica_articol
* refuza (stoc insuficient), gnButon ramane <>1 -> se ajunge pe a DOUA aparitie a blocului de SetFocus
* colapsat (:18789-18800 dinainte de fix), fara nicio adaugare in crsfactura. Verifica ca simpla
* INTRARE in metoda (Local lcCursor, loGrid = grd_factura) si iesirea pe ramura de refuz nu mai
* arunca amprenta veche.
* CAZ_B (do_adauga_tot, ramura de succes): gestionabil=0, tip=3, tlImplicit=.T. (dat de do_adauga_tot
* insusi) -> do_verifica_articol accepta, Do Case intra pe "gestionabil=0" cu tlImplicit=.T. -> NU
* deschide niciun formular modal (poArticol=calculeaza_totaluri(poArticol); gnButon=1) -> ajunge pe
* PRIMA aparitie a blocului de SetFocus (:18776-18787 dinainte de fix) dupa ce randul a fost deja
* scris in crsfactura. Verifica randul ajuns in crsfactura (id_articol/cantitate/denumire) si
* scaderea cantitatii in crsarticole (Replace ... For id_c, ramura Inlist(tip,3,4,21,25,28,42,47)).
*
* Deliberat NU se cheama Thisform.Show(): pe masina de dezvoltare ecranul e partajat, iar afisarea unui
* formular (chiar modeless) ar muta focus-ul real Windows la SetFocus() - interzis explicit. Fara Show,
* Thisform.grd_factura.SetFocus() (ultima instructiune din metoda, dupa ce randul a fost deja scris)
* poate arunca o eroare headless-only (fereastra nu exista) - se accepta si se ignora daca apare, CU
* CONDITIA sa nu fie amprenta veche (GRD_ARTICOLE/GRD_CONTRACTE/TXTCODMAT/TXTARTICOLE): ON ERROR
* jurnalizeaza si executia continua (SetFocus e ultima linie a metodei, deci nu afecteaza randul deja
* scris in crsfactura).
*
* amessagebox e mocat (mock_validare_antet.prg) ca sa nu apara dialogul real pe ramura de refuz.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s4e_0_adauga_articol.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4e_0_adauga_articol.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 1.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
SET TABLEPROMPT OFF
PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr
PUBLIC gcMockApeluri, gnMockRaspuns, gcMockDuplicat, gnMockNumar
gnMockNumar = 0
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4e_0_adauga_articol.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
gnErr = 0
gcCaz = ""
gcErr = ""
gcMockApeluri = ""
gnMockRaspuns = 6
gcMockDuplicat = ""
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
LOCAL lcProc
lcProc = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", ;
"D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg", &lcProc
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
gnScadereStoc = 1
DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna)
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE
update_jtva_coloane([JV], [jtva_coloane_temp])
PRIVATE poDate, poGeneratorNumere, plVizibil, pnTotalDiscountAvize
plVizibil = .F.
pnTotalDiscountAvize = 0
poDate = NULL
poGeneratorNumere = CREATEOBJECT("oGeneratorMock")
DO CazUrmatorRefuz
DO CazAdaugaTotSucces
DO Final
*----------------------------------------------------------------------------------------
* CAZ_A: do_urmator pe articol negestionabil... nu, gestionabil=1 cu cantitate<=0 -> refuz stoc
PROCEDURE CazUrmatorRefuz
LOCAL loForm
gcCaz = "[CAZ_A do_urmator_refuz] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 3
SELECT 0
CREATE CURSOR crsarticole (id_c N(20), id_articol N(20), denumire C(100), cantitate N(20,4), ;
gestionabil N(1), opt_facturare N(3), Pret N(20,4), pret_val N(20,4), proc_tvav N(20,4), ;
preturi_cu_tva N(1), um C(10), id_gestiune N(20), cont C(10), id_valuta N(10), tip_valuta N(1), ;
Curs N(20,4), multiplicator N(10), discount_unitar N(20,4), discount_unitar_val N(20,4), ;
codmat C(50), codbare C(50), nume_val C(20))
INSERT INTO crsarticole VALUES (1, 201, "ARTICOL REFUZ", -1, 1, 0, 100, 0, 1.19, 0, "BUC", ;
21, "371", 1, 0, 1, 1, 0, 0, "CM201", "", "RON")
GO TOP IN crsarticole
SELECT crsarticole
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
gcErr = ""
gnErr = 0
gcMockApeluri = ""
loForm.do_urmator()
DO Assert WITH !("GRD_ARTICOLE" $ UPPER(gcErr)), "fara amprenta GRD_ARTICOLE in gcErr"
DO Assert WITH !("GRD_CONTRACTE" $ UPPER(gcErr)), "fara amprenta GRD_CONTRACTE in gcErr"
DO Assert WITH !("TXTCODMAT" $ UPPER(gcErr)), "fara amprenta TXTCODMAT in gcErr"
DO Assert WITH !("TXTARTICOLE" $ UPPER(gcErr)), "fara amprenta TXTARTICOLE in gcErr"
DO Assert WITH RECCOUNT('crsfactura') = 0, "refuz de stoc: crsfactura ramane gol"
DO Assert WITH "amessagebox(" $ gcMockApeluri, "mesajul de refuz a fost afisat (mocat)"
DO Inchide WITH 'crsarticole'
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
* CAZ_B: do_adauga_tot pe doua articole negestionabile (tlImplicit=.T. dat de do_adauga_tot insusi,
* deci fara formular modal) -> ambele trebuie sa ajunga in crsfactura
PROCEDURE CazAdaugaTotSucces
LOCAL loForm
gcCaz = "[CAZ_B do_adauga_tot_succes] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 3
SELECT 0
CREATE CURSOR crsarticole (id_c N(20), id_articol N(20), denumire C(100), cantitate N(20,4), ;
gestionabil N(1), opt_facturare N(3), Pret N(20,4), pret_val N(20,4), proc_tvav N(20,4), ;
preturi_cu_tva N(1), um C(10), id_gestiune N(20), cont C(10), id_valuta N(10), tip_valuta N(1), ;
Curs N(20,4), multiplicator N(10), discount_unitar N(20,4), discount_unitar_val N(20,4), ;
codmat C(50), codbare C(50), nume_val C(20))
INSERT INTO crsarticole VALUES (1, 301, "ARTICOL UNU", 5, 0, 0, 100, 0, 1.19, 0, "BUC", ;
21, "371", 1, 0, 1, 1, 0, 0, "CM301", "", "RON")
INSERT INTO crsarticole VALUES (2, 302, "ARTICOL DOI", 3, 0, 0, 200, 0, 1.19, 0, "BUC", ;
21, "371", 1, 0, 1, 1, 0, 0, "CM302", "", "RON")
GO TOP IN crsarticole
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
gcErr = ""
gnErr = 0
gcMockApeluri = ""
loForm.do_adauga_tot()
DO Assert WITH !("GRD_ARTICOLE" $ UPPER(gcErr)), "fara amprenta GRD_ARTICOLE in gcErr"
DO Assert WITH !("GRD_CONTRACTE" $ UPPER(gcErr)), "fara amprenta GRD_CONTRACTE in gcErr"
DO Assert WITH !("TXTCODMAT" $ UPPER(gcErr)), "fara amprenta TXTCODMAT in gcErr"
DO Assert WITH !("TXTARTICOLE" $ UPPER(gcErr)), "fara amprenta TXTARTICOLE in gcErr"
DO Assert WITH RECCOUNT('crsfactura') = 2, "ambele randuri au ajuns in crsfactura (Reccount=" + TRANSFORM(RECCOUNT('crsfactura')) + ")"
IF RECCOUNT('crsfactura') >= 1
SELECT crsfactura
GO TOP
DO Assert WITH id_articol = 301 AND cantitate = 5 AND ALLTRIM(denumire) == "ARTICOL UNU", "randul 1: id_articol/cantitate/denumire corecte"
ENDIF
IF RECCOUNT('crsfactura') >= 2
SELECT crsfactura
GO 2
DO Assert WITH id_articol = 302 AND cantitate = 3 AND ALLTRIM(denumire) == "ARTICOL DOI", "randul 2: id_articol/cantitate/denumire corecte"
ENDIF
DO Assert WITH USED('crsarticole') AND RECCOUNT('crsarticole') = 2, "crsarticole ramane deschis dupa adaugare"
IF USED('crsarticole')
SELECT crsarticole
LOCATE FOR id_c = 1
DO Assert WITH FOUND() AND cantitate = 0, "crsarticole id_c=1: cantitate scazuta la 0 (5-5)"
LOCATE FOR id_c = 2
DO Assert WITH FOUND() AND cantitate = 0, "crsarticole id_c=2: cantitate scazuta la 0 (3-3)"
ENDIF
DO Inchide WITH 'crsarticole'
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
PROCEDURE Reseteaza
LPARAMETERS tnTip
LOCAL lnIdSet
DO Inchide WITH 'crsarticole'
DO Inchide WITH 'crsarticole1'
DO Inchide WITH 'crsfactura'
DO Inchide WITH 'crscursuri'
DO Inchide WITH 'crspolitici'
DO Inchide WITH 'crscontracte'
DO Inchide WITH 'crsgestiunidest'
DO Inchide WITH 'crsCtrTemp'
DO Inchide WITH 'CrsCotaTva'
DO Inchide WITH 'saft_tip_facturi'
SELECT 0
* cboTipFactura (frm_facturare_articole2) cere RowSource pe saft_tip_facturi la constructie
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
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
gcMockApeluri = ""
gcErr = ""
gnErr = 0
gnMockRaspuns = 6
gcMockDuplicat = ""
lnIdSet = 26000 + tnTip
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip)
poDate.dataireg = DATE(gnAn, gnLuna, 1)
poDate.dataact = poDate.dataireg
poDate.zi_curs = poDate.dataireg
poDate.id_fdoc = 1
poDate.fdoc = "FEL TEST"
poDate.nract = 78
poDate.serie_act = "TST"
poDate.id_client = 1
poDate.id_furnizor = 1
poDate.nrfactachi = 1
poDate.id_valuta = 1
poDate.in_valuta = 0
poDate.listaid = "1"
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
gcMockApeluri = ""
ENDPROC
PROCEDURE Inchide
LPARAMETERS tcAlias
IF USED(tcAlias)
USE IN (tcAlias)
ENDIF
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 AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10)
gnErr = gnErr + 1
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,238 @@
* test_s4e_2_verifica_articol.prg
* Headless: do_verifica_articol pe frm_facturare_articole2 (COMUN\clase\ofacturare.vc2) primeste
* articolul ca parametru explicit (toArticol), decizia 44 - in loc sa citeasca Private-ul poArticol
* populat de apelant. Testul construieste poArticol ad-hoc (CREATEOBJECT('Empty') + AddProperty),
* FARA sa declare Private poArticol in scopul apelant, si verifica ca metoda produce acelasi verdict
* ca inainte de schimbare pe un tabel de cazuri care acopera dimensiunile din nota_executie_s4e.md §8:
* gestionabil (0/1), cantitate (<=0 / >0), opt_facturare (0/3), poDate.tip (3/8/2).
*
* Conditia din cod (neschimbata ca logica, doar poArticol -> toArticol):
* (cantitate>=0 SI tip IN(8,9)) -> refuz (stoc)
* SAU (cantitate<=0 SI NOT(tip=2 SI opt_facturare=3) SI tip NOT IN(8,9)
* SI gestionabil=1 SI gnScadereStoc=1 SI NOT llFacturareFaraStoc) -> refuz (stoc)
* altfel -> accept
*
* Cazuri (tlContract = .F., gnScadereStoc = 1, gnRF_FACTURARE_FARA_STOC nesetat):
* C1. RETUR_POZITIV tip=8 cant=5 gest=1 opt=0 -> refuz (cantitate pozitiva pe retur)
* C2. STOC_INSUFICIENT tip=3 cant=-1 gest=1 opt=0 -> refuz (cazul normal de "nu e pe stoc")
* C3. NEGESTIONABIL tip=3 cant=-1 gest=0 opt=0 -> accept (articol negestionabil, fara plafon)
* C4. CANTITATE_POZITIVA tip=3 cant=5 gest=1 opt=0 -> accept (cantitate pozitiva pe tip normal)
* C5. CONTRACT_OPT3 tip=2 cant=-1 gest=1 opt=3 -> accept (exceptia pret fixat prin contract)
* C6. CONTRACT_OPT0 tip=2 cant=-1 gest=1 opt=0 -> refuz (fara exceptia opt_facturare=3)
* C7. RETUR_NEPOZITIV tip=8 cant=-1 gest=1 opt=0 -> accept (retur cu cantitate nepozitiva)
*
* amessagebox e mocat (mock_validare_antet.prg, ADITIV inainte in SET PROCEDURE) ca sa nu apara
* dialogul real "Acest articol nu este pe stoc!" - apelul se verifica prin gcMockApeluri, nu vizual.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s4e_2_verifica_articol.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4e_2_verifica_articol.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 1.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr
PUBLIC gcMockApeluri, gnMockNumar, gcMockSql, gnMockSucces, gnMockEroare, gcMockMod, gcMockCurs
PUBLIC gnMockRaspuns, gcMockDuplicat, goExecutorReal
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4e_2_verifica_articol.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
gnErr = 0
gcCaz = ""
gcErr = ""
gcMockApeluri = ""
gnMockNumar = 0
gcMockSql = ""
gnMockSucces = 1
gnMockEroare = 0
gcMockMod = "PLIN"
gcMockCurs = ""
gnMockRaspuns = 6
gcMockDuplicat = ""
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
LOCAL lcProc
lcProc = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", ;
"D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_cursor_articole.prg", ;
&lcProc, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg"
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
gnScadereStoc = 1
DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna)
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE
update_jtva_coloane([JV], [jtva_coloane_temp])
PRIVATE poDate, poGeneratorNumere, plVizibil, pnTotalDiscountAvize
plVizibil = .F.
pnTotalDiscountAvize = 0
poGeneratorNumere = CREATEOBJECT("oGeneratorMock")
poDate = NULL
goExecutorReal = goExecutor
goExecutor = CREATEOBJECT("oExecutorMock")
goExecutor.oReal = goExecutorReal
DO Caz WITH "C1_RETUR_POZITIV", 8, 1, 0, 5, .T.
DO Caz WITH "C2_STOC_INSUFICIENT", 3, 1, 0, -1, .T.
DO Caz WITH "C3_NEGESTIONABIL", 3, 0, 0, -1, .F.
DO Caz WITH "C4_CANTITATE_POZITIVA", 3, 1, 0, 5, .F.
DO Caz WITH "C5_CONTRACT_OPT3", 2, 1, 3, -1, .F.
DO Caz WITH "C6_CONTRACT_OPT0", 2, 1, 0, -1, .T.
DO Caz WITH "C7_RETUR_NEPOZITIV", 8, 1, 0, -1, .F.
DO Final
*----------------------------------------------------------------------------------------
* tnTip, tnGestionabil, tnOptFacturare, tnCantitate, tlAsteptatRefuz (.T. = trebuie refuzat)
PROCEDURE Caz
LPARAMETERS tcCaz, tnTip, tnGestionabil, tnOptFacturare, tnCantitate, tlAsteptatRefuz
LOCAL loForm, llRezultat, loArticol
gcCaz = "[" + tcCaz + "] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH tnTip
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
loArticol = CREATEOBJECT('Empty')
AddProperty(loArticol, 'gestionabil', tnGestionabil)
AddProperty(loArticol, 'opt_facturare', tnOptFacturare)
AddProperty(loArticol, 'id_articol', 1)
AddProperty(loArticol, 'denumire', 'ARTICOL TEST')
AddProperty(loArticol, 'nume_lista_preturi', 'LISTA TEST')
gcMockApeluri = ""
llRezultat = loForm.do_verifica_articol(loArticol, .F., tnCantitate)
IF tlAsteptatRefuz
DO Assert WITH !llRezultat, "Return .F. (refuz) asteptat"
DO Assert WITH "amessagebox(" $ gcMockApeluri, "mesaj de stoc afisat (mocat)"
ELSE
DO Assert WITH llRezultat, "Return .T. (accept) asteptat"
DO Assert WITH !("amessagebox(" $ gcMockApeluri), "niciun mesaj de stoc afisat"
ENDIF
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
PROCEDURE Reseteaza
LPARAMETERS tnTip
LOCAL lnIdSet
DO Inchide WITH 'crsarticole'
DO Inchide WITH 'crsarticole1'
DO Inchide WITH 'crsfactura'
DO Inchide WITH 'crscursuri'
DO Inchide WITH 'crspolitici'
DO Inchide WITH 'crscontracte'
DO Inchide WITH 'crsgestiunidest'
DO Inchide WITH 'crsCtrTemp'
DO Inchide WITH 'CrsCotaTva'
SELECT 0
* cboTipFactura (frm_facturare_articole2) cere RowSource pe saft_tip_facturi la constructie
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
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
gcMockApeluri = ""
gcMockSql = ""
gcMockCurs = ""
gcErr = ""
gnMockNumar = 100
gnMockRaspuns = 6
gcMockDuplicat = ""
gcMockMod = "PLIN"
gnMockSucces = 1
gnMockEroare = 0
lnIdSet = 25000 + tnTip
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip)
poDate.dataireg = DATE(gnAn, gnLuna, 1)
poDate.dataact = poDate.dataireg
poDate.zi_curs = poDate.dataireg
poDate.id_fdoc = 1
poDate.fdoc = "FEL TEST"
poDate.nract = 77
poDate.serie_act = "TST"
poDate.id_client = 1
poDate.id_furnizor = 1
poDate.nrfactachi = 1
poDate.id_valuta = 1
poDate.listaid = "1"
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
gcMockApeluri = ""
ENDPROC
PROCEDURE Inchide
LPARAMETERS tcAlias
IF USED(tcAlias)
USE IN (tcAlias)
ENDIF
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 AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10)
gnErr = gnErr + 1
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
IF TYPE('goExecutorReal') = 'O'
goExecutor = goExecutorReal
ENDIF
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,306 @@
* test_s4e_3_linie_libera.prg
* Headless: S4e-3 - validarea de cantitate/stoc pentru linia libera adaugata prin combosql (cautare in
* lista de preturi/registru), pe frm_facturare_articole2 (COMUN\clase\ofacturare.vc2),
* do_adauga_articol_cautat (introdusa la S4-3b, azi extinsa cu apelul do_verifica_articol).
*
* Executa metoda REALA (nu recalculeaza in paralel): APPEND BLANK pe crsfactura (simuleaza But_nou1),
* apoi do_adauga_articol_cautat(loArticol, loArticol.cantitate) - identic cu apelul din LostFocus
* (grd_factura.cCodMat.cboCodmat / cDenumire.cCboDenumire, ofacturare.vc2:21514/:21541).
*
* poArticol e construit dintr-un cursor local cu structura identica cu cursorul brut al cautarii
* (mock_cursor_preturi.prg / cursor_preturi din pack_facturare, 24 coloane) - FARA Oracle si FARA
* combosql_cautare.RefreshData; Oracle nu are ce sa valideze aici (validarea e locala, pe randul deja
* adus). Formularul tot are nevoie de parintele combosql (SET CLASSLIB _cb_base.vcx ADDITIVE) ca sa
* se poata face CREATEOBJECT fara eroare de clasa - combosql_cautare insasi traieste azi direct in
* ofacturare.vc2 (mutata acolo la 30.08.2026, commit e2ee622), nu mai exista ofacturare_cautare.prg.
*
* Gatare disjuncta verificata explicit: tipurile S4e-3 (3,4,21,25,28,42,47) primesc validarea noua;
* tipul 1 (lista de preturi, perimetrul plafonului Rol B - S4-5, poveste separata) NU o primeste -
* cazul ROL_B_DISJUNCT arata ca acelasi articol cu cantitate 0 intra necontestat pe tip 1, exact ca
* inaintea acestei sarcini, si ca do_initializeaza_articol ii zeroeste cantitatea (:19646-19648) -
* spre deosebire de tipurile S4e-3, unde cantitatea ramane cea reala (nu 0) dupa acceptare.
*
* Cazuri:
* STOC_ZERO_T3 tip=3 gest=1 cant=0 -> refuz, linia NU intra (crsfactura revine la 0 randuri)
* STOC_NEGATIV_T3 tip=3 gest=1 cant=-5 -> refuz (aceeasi conditie, cantitate<=0)
* STOC_SUFICIENT_T3 tip=3 gest=1 cant=10 -> accept, intra cu pret/TVA/id_jtva_coloana si
* cantitate REALA (10, nu 0)
* NEGESTIONABIL_T3 tip=3 gest=0 cant=0 -> accept (fara plafon pe articol negestionabil)
* STOC_ZERO_T4 tip=4 gest=1 cant=0 -> refuz (factura din avize)
* STOC_SUFICIENT_T21 tip=21 gest=1 cant=5 -> accept (aviz catre clienti din comanda)
* ROL_B_DISJUNCT_T1 tip=1 gest=1 cant=0 -> accept FARA nicio validare (gatare disjuncta;
* cantitate ajunge 0 in crsfactura - zeroita de
* do_initializeaza_articol, comportament neschimbat)
*
* amessagebox e mocat (mock_validare_antet.prg) ca sa nu apara dialogul real; textul capturat se
* verifica sa fie cel neschimbat "Acest articol nu este pe stoc!" (decizia Marius, nu se schimba).
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s4e_3_linie_libera.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4e_3_linie_libera.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8 inainte de creeaza_cursor_serii; gnScadereStoc = 1.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr
PUBLIC gcMockApeluri, gnMockNumar, gcMockSql, gnMockSucces, gnMockEroare, gcMockMod, gcMockCurs
PUBLIC gnMockRaspuns, gcMockDuplicat, goExecutorReal
PUBLIC gnPc, gnPVal, gnPPretV, gnScadereStoc, gnMemProcDisc
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4e_3_linie_libera.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
gnErr = 0
gcCaz = ""
gcErr = ""
gcMockApeluri = ""
gnMockNumar = 0
gcMockSql = ""
gnMockSucces = 1
gnMockEroare = 0
gcMockMod = "PLIN"
gcMockCurs = ""
gnMockRaspuns = 6
gcMockDuplicat = ""
gnPc = 2
gnPVal = 2
gnPPretV = 4
gnScadereStoc = 1
gnMemProcDisc = 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
LOCAL lcProc
lcProc = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", ;
"D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg", ;
&lcProc
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
gnIdUtil = 8
gnPc = 2
gnPVal = 2
gnPPretV = 4
gnScadereStoc = 1
gnMemProcDisc = 0
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna)
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE
* combosql_cautare traieste azi in ofacturare.vc2 insusi (mutata acolo la 30.08.2026, commit
* e2ee622) - nu mai exista ofacturare_cautare.prg separat, deci nu mai e nimic de inregistrat
* suplimentar aici; SET CLASSLIB _cb_base.vcx de mai sus ramane necesar (parintele combosql).
* jtva_coloane: cursorul folosit de derivarea id_jtva_coloana din proc_tvav (do_adauga_articol_cautat)
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
CREATE CURSOR jtva_coloane (id_jtva_coloana N(14), denumire C(50), cota_tva N(6,2))
INSERT INTO jtva_coloane VALUES (190, 'TVA 19%', 19)
INSERT INTO jtva_coloane VALUES (210, 'TVA 21%', 21)
INSERT INTO jtva_coloane VALUES (110, 'TVA 11%', 11)
GO TOP IN jtva_coloane
PRIVATE poDate, poGeneratorNumere, plVizibil, pnTotalDiscountAvize
plVizibil = .F.
pnTotalDiscountAvize = 0
poGeneratorNumere = CREATEOBJECT("oGeneratorMock")
poDate = NULL
DO Caz WITH "STOC_ZERO_T3", 3, 1, 0, .T., 101, "CM101"
DO Caz WITH "STOC_NEGATIV_T3", 3, 1, -5, .T., 102, "CM102"
DO Caz WITH "STOC_SUFICIENT_T3", 3, 1, 10, .F., 103, "CM103"
DO Caz WITH "NEGESTIONABIL_T3", 3, 0, 0, .F., 104, "CM104"
DO Caz WITH "STOC_ZERO_T4", 4, 1, 0, .T., 105, "CM105"
DO Caz WITH "STOC_SUFICIENT_T21",21, 1, 5, .F., 106, "CM106"
DO Caz WITH "ROL_B_DISJUNCT_T1", 1, 1, 0, .F., 107, "CM107"
DO Final
*----------------------------------------------------------------------------------------
* tcCaz, tnTip, tnGestionabil, tnCantitate, tlAsteptatRefuz, tnIdArticol, tcCodmat
PROCEDURE Caz
LPARAMETERS tcCaz, tnTip, tnGestionabil, tnCantitate, tlAsteptatRefuz, tnIdArticol, tcCodmat
LOCAL loForm, llRezultat, loArticol
gcCaz = "[" + tcCaz + "] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH tnTip
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
loArticol = CreeazaArticolCautat(tnIdArticol, tcCodmat, tnGestionabil, tnCantitate)
SELECT crsfactura
APPEND BLANK
DO Assert WITH RECCOUNT('crsfactura') = 1, "crsfactura are o linie goala (But_nou1) inainte de adaugare"
gcMockApeluri = ""
llRezultat = loForm.do_adauga_articol_cautat(loArticol, loArticol.cantitate)
IF tlAsteptatRefuz
DO Assert WITH !llRezultat, "Return .F. (refuz) asteptat"
DO Assert WITH RECCOUNT('crsfactura') = 0, "linia NU intra in crsfactura dupa refuz"
DO Assert WITH "amessagebox(" $ gcMockApeluri, "mesaj de stoc afisat (mocat)"
DO Assert WITH "nu este pe stoc" $ LOWER(gcMockApeluri), "textul mesajului ramane cel de azi, neschimbat"
ELSE
DO Assert WITH llRezultat, "Return .T. (accept) asteptat"
DO Assert WITH RECCOUNT('crsfactura') = 1, "do_adauga_articol_cautat NU a adaugat o a doua linie"
DO Assert WITH !("amessagebox(" $ gcMockApeluri), "niciun mesaj de stoc la acceptare"
DO Assert WITH crsfactura.id_articol = tnIdArticol, "crsfactura.id_articol corect"
DO Assert WITH ALLTRIM(crsfactura.codmat) == tcCodmat, "crsfactura.codmat corect"
DO Assert WITH crsfactura.proc_tvav = 1.19, "crsfactura.proc_tvav = 1.19 (pastrat din randul cautat)"
DO Assert WITH crsfactura.pretftva = 50, "crsfactura.pretftva = 50 (valoare reala, nu 0 - capcana FACT-013)"
DO Assert WITH crsfactura.id_jtva_coloana = 190, "crsfactura.id_jtva_coloana = 190 (derivat din proc_tvav=1.19)"
IF tnTip = 1
DO Assert WITH crsfactura.cantitate = 0, "ROL_B_DISJUNCT: cantitate ZEROITA de do_initializeaza_articol (tip 1 e in grupul :19646) - neschimbat de S4e-3"
ELSE
DO Assert WITH crsfactura.cantitate = tnCantitate, "cantitate REALA pastrata (tip S4e-3 nu e in grupul zeroit de do_initializeaza_articol)"
ENDIF
ENDIF
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
* construieste poArticol exact ca randul scaterat dintr-un cursor brut de cursor_preturi
* (structura identica cu mock_cursor_preturi.prg / cursor_preturi din pack_facturare)
FUNCTION CreeazaArticolCautat
LPARAMETERS tnIdArticol, tcCodmat, tnGestionabil, tnCantitate
LOCAL loArticol
IF USED('crstestarticols4e3')
USE IN crstestarticols4e3
ENDIF
CREATE CURSOR crstestarticols4e3 (id_c N(20), id_articol N(20), lot C(20) NULL, serie C(20) NULL, ;
id_pol N(20), id_valuta N(10), nume_lista_preturi C(100), discount_unitar N(20,4), ;
discount_unitar_val N(20,4), codmat C(100), codbare C(50), denumire C(100), um C(10), ;
gestionabil N(1), cantitate N(20,4), proc_tvav N(20,4), preturi_cu_tva N(1), ;
curs N(20,4), multiplicator N(10), pret N(20,4), pret_val N(20,4), tip_valuta N(1), ;
nume_val C(20), modificabil N(1))
INSERT INTO crstestarticols4e3 VALUES (0, tnIdArticol, NULL, NULL, 31, 1, "LISTA TEST", 0, 0, ;
tcCodmat, "CB" + TRANSFORM(tnIdArticol), "Articol test " + TRANSFORM(tnIdArticol), "BUC", ;
tnGestionabil, tnCantitate, 1.19, 0, 1, 1, 50, 50, 1, "RON", 1)
GO TOP IN crstestarticols4e3
SCATTER NAME loArticol MEMO
USE IN crstestarticols4e3
RETURN loArticol
ENDFUNC
*----------------------------------------------------------------------------------------
PROCEDURE Reseteaza
LPARAMETERS tnTip
LOCAL lnIdSet
DO Inchide WITH 'crsarticole'
DO Inchide WITH 'crsarticole1'
DO Inchide WITH 'crsfactura'
DO Inchide WITH 'crscursuri'
DO Inchide WITH 'crspolitici'
DO Inchide WITH 'crscontracte'
DO Inchide WITH 'crsgestiunidest'
DO Inchide WITH 'crsCtrTemp'
DO Inchide WITH 'CrsCotaTva'
DO Inchide WITH 'scrsCodmat'
DO Inchide WITH 'crsCodmat'
DO Inchide WITH 'scrsDenumire'
DO Inchide WITH 'crsDenumire'
SELECT 0
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
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
gcMockApeluri = ""
gcMockSql = ""
gcMockCurs = ""
gcErr = ""
gnMockNumar = 100
gnMockRaspuns = 6
gcMockDuplicat = ""
gcMockMod = "PLIN"
gnMockSucces = 1
gnMockEroare = 0
lnIdSet = 26000 + tnTip
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip)
poDate.dataireg = DATE(gnAn, gnLuna, 1)
poDate.dataact = poDate.dataireg
poDate.zi_curs = poDate.dataireg
poDate.id_fdoc = 1
poDate.fdoc = "FEL TEST"
poDate.nract = 77
poDate.serie_act = "TST"
poDate.id_client = 1
poDate.id_furnizor = 1
poDate.nrfactachi = 1
poDate.id_valuta = 1
poDate.in_valuta = 0
poDate.listaid = "1"
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
gcMockApeluri = ""
ENDPROC
PROCEDURE Inchide
LPARAMETERS tcAlias
IF USED(tcAlias)
USE IN (tcAlias)
ENDIF
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 AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10)
gnErr = gnErr + 1
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
IF TYPE('goExecutorReal') = 'O'
goExecutor = goExecutorReal
ENDIF
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,502 @@
* test_s4e_avize.prg
* Headless: S4e-5 - extinderea si proba pe avize (tip 4 si 21,25,28,42,47), nota_executie_s4e.md
* sectiunea "S4e-5 - extinderea si proba pe avize (tip 4 si 21,25,28,42,47)" (~:479). FARA COD NOU -
* repeta probele S4e-4 (test_s4e_registru.prg) pe tip 4 ("factura din avize") si tip 21 (aviz din
* comanda), plus o proba suplimentara ceruta explicit de nota: dovada ca o linie LIBERA in crsfactura
* NU polueaza pnParametruAditional trimis catre Oracle prin scrie_factura_avize.
*
* CONSTATARE DE PROIECTARE (verificata pe cod, nu pe descrierea nota): pentru frm_facturare_articole2
* (clasa vizata de S4e - do_scrie_factura la COMUN\clase\ofacturare.vc2:19983-20322), ramura
* Case poDate.Tip = 4 (:20059-20074) NU foloseste un Calculate Sum(cantitate) local peste crsarticole
* / crsfactura, cum descrie nota - foloseste o functie Oracle server-side, pack_facturare.
* exista_ramas_avize_lista(poDate.listaid), care citeste dupa listaid, nu dupa continutul cursoarelor
* locale. La fel, ramura Case Inlist(poDate.Tip,3,21,25,28,42,47) (:20096-20107) foloseste
* pack_facturare.cantitate_ramasa_comanda(Val(poDate.listaid)). ("Calculate Sum(cantitate)" local
* exista doar in copia VECHE, frm_facturare_articole.do_scrie_factura, :14454/:14485 - alta clasa,
* nu cea vizata de S4e.) Asertiunile B/C de mai jos dovedesc pe rulare, nu doar pe citirea codului,
* ca rezultatul (SQL/suma/pnParametruAditional/dialog) e identic cu si fara linie libera.
*
* Patru grupe de asertiuni:
* A_Tip4 / A_Tip21 (echivalent A2 din test_s4e_registru.prg): do_sterge pe o linie LIBERA lasa
* Sum(crsarticole.cantitate) neschimbat; pe o linie de AVIZ/COMANDA creste cantitatea la id_c
* respectiv cu exact cantitatea stearsa. Ramura Do Case atinsa (ofacturare.vc2:20436):
* "Case (gnScadereStoc=1 And poDate.tip=23) Or Inlist(poDate.tip,3,4,21,25,28,42,47)" - aceeasi
* ca la tip 3 (S4e-4), doar poDate.tip difera.
* BC_Tip4 / BC_Tip21: asertiune DIRECTA - SQL-ul construit, lnCantitateRamasa, pnFacturaRetur (doar
* tip4) si pnParametruAditional sunt IDENTICE intre o rulare cu crsfactura continand doar linii de
* aviz/comanda si o rulare cu ACEEASI stare + o linie LIBERA suplimentara (cantitate mare, 999, ca
* sa iasa in evidenta orice contaminare). Executa SimulaRamuraTip4/SimulaRamuraComanda - o oglinda
* LITERALA a codului de productie citat mai sus (nu apeleaza Thisform.do_scrie_factura, care ar
* scrie in Oracle prin do_scrie_articole - risc si scop in afara perimetrului "fara cod nou").
* Captureaza si TEXTUL dialogului + tipul lui (raspunsul implicit e codificat in tnDialogBoxType,
* 4+32) prin mock_amessebox.prg (gcMockUltimMesaj/gnMockUltimTip) - PROBA PRIN MOCK, NU DIALOGUL
* REAL. Proba manuala pe dialogul real ("Gata cand" oficial al nota) ramane DATORIE DESCHISA -
* vezi raport.
*
* Sablon: test_s4e_registru.prg (S4e-4) + mock_amessagebox din test_s3b_emitere_reala.prg (PUBLIC
* gcMockUltimMesaj/gnMockUltimTip). CAPCANA descoperita aici: mock_validare_antet.prg defineste SI
* EL amessagebox, iar la nume duplicat de PROCEDURE intre fisiere SET PROCEDURE castiga PRIMUL
* fisier din lista (verificat empiric - vezi comentariul de la incarcarea SET PROCEDURE mai jos),
* nu ultimul cum spune antetul mock_amessagebox.prg - deci mock_amessagebox.prg trebuie incarcat
* PRIMUL. Dupa fiecare Calculate/Sum se face GO TOP IN crsarticole (Calculate muta Recno() la EOF
* pe cursorul afectat).
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s4e_avize.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4e_avize.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8 inainte de creeaza_cursor_serii; gnScadereStoc = 1.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr
PUBLIC gcMockApeluri, gnMockRaspuns, gcMockDuplicat, gnMockNumar
PUBLIC gnPc, gnPVal, gnPPretV, gnScadereStoc, gnMemProcDisc
PUBLIC gcMockUltimMesaj, gnMockUltimTip
PUBLIC gcUltimSql, gnUltimRamas, gnUltimFacturaRetur, gnUltimParamAditional
gnMockNumar = 0
gnPc = 2
gnPVal = 2
gnPPretV = 4
gnScadereStoc = 1
gnMemProcDisc = 0
gcMockUltimMesaj = ''
gnMockUltimTip = 0
gcUltimSql = ''
gnUltimRamas = 0
gnUltimFacturaRetur = 0
gnUltimParamAditional = 0
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4e_avize.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
gnErr = 0
gcCaz = ""
gcErr = ""
gcMockApeluri = ""
gnMockRaspuns = 6
gcMockDuplicat = ""
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
LOCAL lcProc
lcProc = SET("PROCEDURE")
* CAPCANA descoperita la scrierea acestui test: mock_validare_antet.prg si mock_amessagebox.prg
* definesc AMANDOUA FUNCTION amessagebox, si comentariile lor de antet se CONTRAZIC despre cine
* castiga la nume duplicat ("primul in lista" vs. "ultima incarcata"). Verificat EMPIRIC aici:
* la nume duplicat de PROCEDURE/FUNCTION intre fisiere SET PROCEDURE, castiga PRIMUL fisier din
* lista curenta a lui SET("PROCEDURE") - exact ce spune antetul mock_validare_antet.prg, NU ce
* spune antetul mock_amessagebox.prg. De-aici, mock_amessagebox.prg trebuie pus PRIMUL ca sa
* castige (necesar pt. captura gcMockUltimMesaj/gnMockUltimTip din TestBC_*); mock_validare_antet.prg
* ramane incarcat dupa el, doar pt. facturi_duplicate (nefolosit de acest test, dar pastrat pt.
* orice alt apel indirect din do_sterge).
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", ;
"D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", ;
"D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg", &lcProc
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
gnIdUtil = 8
gnIdSucursala = 167
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
gnScadereStoc = 1
DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) + " gnIdSucursala=" + TRANSFORM(gnIdSucursala)
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
CREATE CURSOR jtva_coloane (id_jtva_coloana N(14), denumire C(50), cota_tva N(6,2))
INSERT INTO jtva_coloane VALUES (190, 'TVA 19%', 19)
INSERT INTO jtva_coloane VALUES (210, 'TVA 21%', 21)
INSERT INTO jtva_coloane VALUES (110, 'TVA 11%', 11)
GO TOP IN jtva_coloane
PRIVATE poDate, poGeneratorNumere, plVizibil, pnTotalDiscountAvize
plVizibil = .F.
pnTotalDiscountAvize = 0
poDate = NULL
poGeneratorNumere = CREATEOBJECT("oGeneratorMock")
DO TestA_Tip4
DO TestA_Tip21
DO TestBC_Tip4
DO TestBC_Tip21
DO Final
*----------------------------------------------------------------------------------------
* A_Tip4: echivalentul A2 din test_s4e_registru.prg, pe poDate.tip=4. crsarticole cu 3 randuri
* (id_c 1..3); crsfactura cu o linie de aviz (id_c=2) si una libera (id_c=0). Ramura Do Case atinsa
* in do_sterge (ofacturare.vc2:20436): Inlist(poDate.tip,3,4,21,25,28,42,47) - include 4 explicit.
PROCEDURE TestA_Tip4
DO TestARegistru WITH 4
ENDPROC
*----------------------------------------------------------------------------------------
* A_Tip21: identic cu A_Tip4, pe poDate.tip=21 (aviz din comanda). Aceeasi ramura Do Case
* (Inlist include si 21).
PROCEDURE TestA_Tip21
DO TestARegistru WITH 21
ENDPROC
*----------------------------------------------------------------------------------------
* Corpul comun A2-echivalent, parametrizat pe tip (3 la S4e-4, 4/21 aici).
PROCEDURE TestARegistru
LPARAMETERS tnTip
LOCAL loForm, lnSumInainte, lnSumDupa, lnCantId2Inainte, lnCantId2Dupa
gcCaz = "[A tip=" + TRANSFORM(tnTip) + ": do_sterge - linie libera vs linie de aviz/comanda] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH tnTip
SELECT 0
CREATE CURSOR crsarticole (id_c N(20), id_articol N(20), denumire C(100), cantitate N(20,4), ;
gestionabil N(1), opt_facturare N(3), Pret N(20,4), pret_val N(20,4), proc_tvav N(20,4), ;
preturi_cu_tva N(1), um C(10), id_gestiune N(20), cont C(10), id_valuta N(10), tip_valuta N(1), ;
Curs N(20,4), multiplicator N(10), discount_unitar N(20,4), discount_unitar_val N(20,4), ;
codmat C(50), codbare C(50), nume_val C(20))
INSERT INTO crsarticole VALUES (1, 401, "ARTICOL 1", 5, 1, 0, 100, 0, 1.19, 0, "BUC", ;
21, "371", 1, 0, 1, 1, 0, 0, "CM401", "", "RON")
INSERT INTO crsarticole VALUES (2, 402, "ARTICOL 2", 7, 1, 0, 100, 0, 1.19, 0, "BUC", ;
21, "371", 1, 0, 1, 1, 0, 0, "CM402", "", "RON")
INSERT INTO crsarticole VALUES (3, 403, "ARTICOL 3", 3, 1, 0, 100, 0, 1.19, 0, "BUC", ;
21, "371", 1, 0, 1, 1, 0, 0, "CM403", "", "RON")
GO TOP IN crsarticole
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
SELECT crsfactura
APPEND BLANK
REPLACE id_temp WITH 1, id_c WITH 2, id_articol WITH 402, denumire WITH "ARTICOL 2", ;
cantitate WITH 4, opt_facturare WITH 0
APPEND BLANK
REPLACE id_temp WITH 2, id_c WITH 0, id_articol WITH 999, denumire WITH "LINIE LIBERA", ;
cantitate WITH 2, opt_facturare WITH 0
DO Assert WITH RECCOUNT('crsfactura') = 2, "crsfactura are 2 randuri (aviz/comanda + libera)"
*-- pas 1: sterge linia LIBERA (id_c=0) - Sum(crsarticole.cantitate) ramane neschimbat
SELECT crsarticole
CALCULATE SUM(cantitate) TO lnSumInainte
GO TOP IN crsarticole
SELECT crsfactura
LOCATE FOR id_c = 0
DO Assert WITH FOUND(), "linia libera (id_c=0) gasita in crsfactura"
gnErr = 0
gcErr = ""
gnMockRaspuns = 6
loForm.do_sterge()
DO Assert WITH gnErr = 0, "do_sterge (linie libera) fara eroare"
DO Assert WITH RECCOUNT('crsfactura') = 1, "linia libera a fost stearsa din crsfactura"
SELECT crsarticole
CALCULATE SUM(cantitate) TO lnSumDupa
GO TOP IN crsarticole
DO Assert WITH lnSumDupa = lnSumInainte, "Sum(crsarticole.cantitate) neschimbat dupa stergerea liniei LIBERE (inainte=" + ;
TRANSFORM(lnSumInainte) + " dupa=" + TRANSFORM(lnSumDupa) + ")"
*-- pas 2: sterge linia de aviz/comanda (id_c=2) - crsarticole.cantitate la id_c=2 creste cu exact 4
SELECT crsarticole
LOCATE FOR id_c = 2
lnCantId2Inainte = cantitate
GO TOP IN crsarticole
SELECT crsfactura
LOCATE FOR id_c = 2
DO Assert WITH FOUND(), "linia de aviz/comanda (id_c=2) gasita in crsfactura"
gnErr = 0
gcErr = ""
gnMockRaspuns = 6
loForm.do_sterge()
DO Assert WITH gnErr = 0, "do_sterge (linie aviz/comanda) fara eroare"
DO Assert WITH RECCOUNT('crsfactura') = 0, "linia de aviz/comanda a fost stearsa din crsfactura"
SELECT crsarticole
LOCATE FOR id_c = 2
lnCantId2Dupa = cantitate
GO TOP IN crsarticole
DO Assert WITH lnCantId2Dupa = lnCantId2Inainte + 4, "crsarticole.cantitate la id_c=2 a crescut cu exact 4 (inainte=" + ;
TRANSFORM(lnCantId2Inainte) + " dupa=" + TRANSFORM(lnCantId2Dupa) + ")"
DO Inchide WITH 'crsarticole'
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
* BC_Tip4: asertiune directa - SQL/suma/pnFacturaRetur/pnParametruAditional/dialog (text+tip)
* identice intre "fara linie libera" si "cu linie libera" pe ramura tip 4.
PROCEDURE TestBC_Tip4
LOCAL lcSql1, lnRamas1, lnFacturaRetur1, lnParam1, lcMesaj1, lnTip1
LOCAL lcSql2, lnRamas2, lnFacturaRetur2, lnParam2, lcMesaj2, lnTip2
gcCaz = "[BC tip=4: SQL/suma/pnParametruAditional/dialog identice cu si fara linie libera] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 4
poDate.listaid = "1"
*-- baseline: crsfactura cu doar o linie de aviz (fara linie libera)
SELECT crsfactura
APPEND BLANK
REPLACE id_temp WITH 1, id_c WITH 5, id_articol WITH 501, denumire WITH "AVIZ LINIE", ;
cantitate WITH 3, opt_facturare WITH 0
gcMockUltimMesaj = ''
gnMockUltimTip = 0
IF !DO_SimulaRamuraTip4()
DO AfLog WITH "FAIL: SimulaRamuraTip4 (baseline) nu a putut fi executata - vezi asertiunea SELECT de mai sus"
RETURN
ENDIF
lcSql1 = gcUltimSql
lnRamas1 = gnUltimRamas
lnFacturaRetur1 = gnUltimFacturaRetur
lnParam1 = gnUltimParamAditional
lcMesaj1 = gcMockUltimMesaj
lnTip1 = gnMockUltimTip
*-- poluat: aceeasi stare + o linie LIBERA (id_c=0), cantitate mare (999) ca sa iasa in evidenta
SELECT crsfactura
APPEND BLANK
REPLACE id_temp WITH 2, id_c WITH 0, id_articol WITH 999, denumire WITH "LINIE LIBERA", ;
cantitate WITH 999, opt_facturare WITH 0
DO Assert WITH RECCOUNT('crsfactura') = 2, "crsfactura are acum si linia libera (tip 4)"
gcMockUltimMesaj = ''
gnMockUltimTip = 0
IF !DO_SimulaRamuraTip4()
DO AfLog WITH "FAIL: SimulaRamuraTip4 (poluat) nu a putut fi executata - vezi asertiunea SELECT de mai sus"
RETURN
ENDIF
lcSql2 = gcUltimSql
lnRamas2 = gnUltimRamas
lnFacturaRetur2 = gnUltimFacturaRetur
lnParam2 = gnUltimParamAditional
lcMesaj2 = gcMockUltimMesaj
lnTip2 = gnMockUltimTip
DO Assert WITH lcSql1 = lcSql2, "SQL-ul (exista_ramas_avize_lista) identic cu/fara linie libera"
DO Assert WITH lnRamas1 = lnRamas2, "lnCantitateRamasa identic (obtinut: " + TRANSFORM(lnRamas1) + " / " + TRANSFORM(lnRamas2) + ")"
DO Assert WITH lnFacturaRetur1 = lnFacturaRetur2, "pnFacturaRetur identic (obtinut: " + TRANSFORM(lnFacturaRetur1) + " / " + TRANSFORM(lnFacturaRetur2) + ")"
DO Assert WITH lnParam1 = lnParam2, "pnParametruAditional identic (obtinut: " + TRANSFORM(lnParam1) + " / " + TRANSFORM(lnParam2) + ")"
DO Assert WITH lcMesaj1 = lcMesaj2, "textul dialogului (mock) identic cu/fara linie libera (obtinut: [" + lcMesaj1 + "] / [" + lcMesaj2 + "])"
DO Assert WITH lnTip1 = lnTip2, "tipul dialogului / raspunsul implicit (mock) identic cu/fara linie libera (obtinut: " + TRANSFORM(lnTip1) + " / " + TRANSFORM(lnTip2) + ")"
ENDPROC
*----------------------------------------------------------------------------------------
* BC_Tip21: identic cu BC_Tip4, dar pe ramura Inlist(poDate.Tip,3,21,25,28,42,47) - foloseste
* cantitate_ramasa_comanda in loc de exista_ramas_avize_lista, si nu are pnFacturaRetur.
PROCEDURE TestBC_Tip21
LOCAL lcSql1, lnRamas1, lnParam1, lcMesaj1, lnTip1
LOCAL lcSql2, lnRamas2, lnParam2, lcMesaj2, lnTip2
gcCaz = "[BC tip=21: SQL/suma/pnParametruAditional/dialog identice cu si fara linie libera] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 21
poDate.listaid = "1"
SELECT crsfactura
APPEND BLANK
REPLACE id_temp WITH 1, id_c WITH 5, id_articol WITH 501, denumire WITH "COMANDA LINIE", ;
cantitate WITH 3, opt_facturare WITH 0
gcMockUltimMesaj = ''
gnMockUltimTip = 0
IF !DO_SimulaRamuraComanda()
DO AfLog WITH "FAIL: SimulaRamuraComanda (baseline) nu a putut fi executata - vezi asertiunea SELECT de mai sus"
RETURN
ENDIF
lcSql1 = gcUltimSql
lnRamas1 = gnUltimRamas
lnParam1 = gnUltimParamAditional
lcMesaj1 = gcMockUltimMesaj
lnTip1 = gnMockUltimTip
SELECT crsfactura
APPEND BLANK
REPLACE id_temp WITH 2, id_c WITH 0, id_articol WITH 999, denumire WITH "LINIE LIBERA", ;
cantitate WITH 999, opt_facturare WITH 0
DO Assert WITH RECCOUNT('crsfactura') = 2, "crsfactura are acum si linia libera (tip 21)"
gcMockUltimMesaj = ''
gnMockUltimTip = 0
IF !DO_SimulaRamuraComanda()
DO AfLog WITH "FAIL: SimulaRamuraComanda (poluat) nu a putut fi executata - vezi asertiunea SELECT de mai sus"
RETURN
ENDIF
lcSql2 = gcUltimSql
lnRamas2 = gnUltimRamas
lnParam2 = gnUltimParamAditional
lcMesaj2 = gcMockUltimMesaj
lnTip2 = gnMockUltimTip
DO Assert WITH lcSql1 = lcSql2, "SQL-ul (cantitate_ramasa_comanda) identic cu/fara linie libera"
DO Assert WITH lnRamas1 = lnRamas2, "lnCantitateRamasa identic (obtinut: " + TRANSFORM(lnRamas1) + " / " + TRANSFORM(lnRamas2) + ")"
DO Assert WITH lnParam1 = lnParam2, "pnParametruAditional identic (obtinut: " + TRANSFORM(lnParam1) + " / " + TRANSFORM(lnParam2) + ")"
DO Assert WITH lcMesaj1 = lcMesaj2, "textul dialogului (mock) identic cu/fara linie libera (obtinut: [" + lcMesaj1 + "] / [" + lcMesaj2 + "])"
DO Assert WITH lnTip1 = lnTip2, "tipul dialogului / raspunsul implicit (mock) identic cu/fara linie libera (obtinut: " + TRANSFORM(lnTip1) + " / " + TRANSFORM(lnTip2) + ")"
ENDPROC
*----------------------------------------------------------------------------------------
* Oglinda LITERALA a COMUN\clase\ofacturare.vc2:20059-20074 (frm_facturare_articole2.do_scrie_factura,
* Case poDate.Tip = 4). NU apeleaza metoda reala - aceea scrie in Oracle prin do_scrie_articole,
* in afara perimetrului "fara cod nou" al S4e-5. Rezultatul se pune in gcUltimSql/gnUltimRamas/
* gnUltimFacturaRetur/gnUltimParamAditional. Returneaza .F. daca SELECT-ul Oracle a esuat (nu e
* asertiune de esec al S4e-5, ci semnal ca proba nu a putut rula pe acest mediu).
PROCEDURE DO_SimulaRamuraTip4
LOCAL lcSql, lnCantitateRamasa, lnFacturaRetur, lnParamAditional, lnRet
lcSql = [SELECT pack_facturare.exista_ramas_avize_lista('] + Alltrim(poDate.listaid) + [') AS ramas FROM dual]
lnRet = goExecutor.oExecute(lcSql,'crsramasavize')
DO Assert WITH lnRet >= 0, "SELECT exista_ramas_avize_lista a rulat fara eroare (ret=" + TRANSFORM(lnRet) + ")"
IF lnRet < 0
RETURN .F.
ENDIF
lnCantitateRamasa = crsramasavize.ramas
USE IN (SELECT('crsramasavize'))
IF lnCantitateRamasa > 0
lnFacturaRetur = 7 - amessagebox("Doriti sa se inregistreze si avizul de retur?",4+32,"Confirmare")
lnParamAditional = 1
ELSE
lnFacturaRetur = 0
lnParamAditional = 0
ENDIF
gcUltimSql = lcSql
gnUltimRamas = lnCantitateRamasa
gnUltimFacturaRetur = lnFacturaRetur
gnUltimParamAditional = lnParamAditional
RETURN .T.
ENDPROC
*----------------------------------------------------------------------------------------
* Oglinda LITERALA a ofacturare.vc2:20096-20107 (Case Inlist(poDate.Tip,3,21,25,28,42,47)).
PROCEDURE DO_SimulaRamuraComanda
LOCAL lcSql, lnCantitateRamasa, lnParamAditional, lnRet
lcSql = [SELECT pack_facturare.cantitate_ramasa_comanda(] + Alltrim(Str(Val(poDate.listaid))) + [) AS ramas FROM dual]
lnRet = goExecutor.oExecute(lcSql,'crsramascomanda')
DO Assert WITH lnRet >= 0, "SELECT cantitate_ramasa_comanda a rulat fara eroare (ret=" + TRANSFORM(lnRet) + ")"
IF lnRet < 0
RETURN .F.
ENDIF
lnCantitateRamasa = crsramascomanda.ramas
USE IN (SELECT('crsramascomanda'))
lnParamAditional = 0
IF lnCantitateRamasa <> 0
lnParamAditional = 7 - amessagebox("Doriti sa se inchida comanda?",4+32,"Confirmare")
ENDIF
gcUltimSql = lcSql
gnUltimRamas = lnCantitateRamasa
gnUltimParamAditional = lnParamAditional
RETURN .T.
ENDPROC
*----------------------------------------------------------------------------------------
PROCEDURE Reseteaza
LPARAMETERS tnTip
LOCAL lnIdSet
DO Inchide WITH 'crsarticole'
DO Inchide WITH 'crsarticole1'
DO Inchide WITH 'crsfactura'
DO Inchide WITH 'crscursuri'
DO Inchide WITH 'crspolitici'
DO Inchide WITH 'crscontracte'
DO Inchide WITH 'crsgestiunidest'
DO Inchide WITH 'crsCtrTemp'
DO Inchide WITH 'CrsCotaTva'
DO Inchide WITH 'saft_tip_facturi'
SELECT 0
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
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
gcMockApeluri = ""
gcErr = ""
gnErr = 0
gnMockRaspuns = 6
gcMockDuplicat = ""
gcMockUltimMesaj = ''
gnMockUltimTip = 0
lnIdSet = 28000 + tnTip
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip)
poDate.dataireg = DATE(gnAn, gnLuna, 1)
poDate.dataact = poDate.dataireg
poDate.zi_curs = poDate.dataireg
poDate.id_fdoc = 1
poDate.fdoc = "FEL TEST"
poDate.nract = 79
poDate.serie_act = "TST"
poDate.id_client = 1
poDate.id_furnizor = 1
poDate.nrfactachi = 1
poDate.id_valuta = 1
poDate.in_valuta = 0
poDate.listaid = "1"
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
gcMockApeluri = ""
ENDPROC
PROCEDURE Inchide
LPARAMETERS tcAlias
IF USED(tcAlias)
USE IN (tcAlias)
ENDIF
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 AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10)
gnErr = gnErr + 1
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,347 @@
* test_s4e_registru.prg
* Headless: S4e-4 - proba de neregresie a registrului, FARA COD NOU (nota_executie_s4e.md,
* sectiunea "S4e-4 - proba de neregresie a registrului", ~:451). Dovedeste pe RULARE, nu pe
* definitie de camp, ca do_sterge (COMUN\clase\ofacturare.vc2:20391-20458) si structura produsa
* de creeaza_facturacrs (COMUN\programe\ofacturare_comun.prg:1782-1798) raman corecte.
*
* Trei asertiuni:
* A1. Dupa APPEND BLANK pe un cursor creat de creeaza_facturacrs: id_c=0 si opt_facturare=0
* (campuri N() fara NULL, deci implicit 0 la APPEND BLANK - verificat pe rulare).
* A2. crsarticole cu 3 randuri de comanda (id_c 1..3); crsfactura cu o linie de comanda (id_c=2)
* si una libera (id_c=0). do_sterge pe linia LIBERA lasa Calculate Sum(cantitate) peste
* crsarticole NESCHIMBAT (REPLACE ... For id_c=0 nu gaseste niciun rand in crsarticole).
* do_sterge pe linia de COMANDA creste crsarticole.cantitate la id_c=2 cu exact cantitatea
* stearsa - ramura atinsa: "Case (gnScadereStoc=1 And poDate.tip=23) Or Inlist(poDate.tip,
* 3,4,21,25,28,42,47)" (ofacturare.vc2:20432).
* A3. Sum(crsarticole.cantitate) inainte si dupa adaugarea a doua linii libere in crsfactura:
* identic (liniile libere nu ating deloc crsarticole - cursoare separate).
*
* Sablon urmat: test_s4_5_do_sterge_garda.prg (garda Used(lcCursor) din do_sterge, deja verificata
* acolo - nu se reia aici). Dupa fiecare Calculate/Sum se face GO TOP IN crsarticole (Calculate muta
* Recno() la EOF pe cursorul afectat).
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s4e_registru.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4e_registru.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8 inainte de creeaza_cursor_serii; gnScadereStoc = 1.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr
PUBLIC gcMockApeluri, gnMockRaspuns, gcMockDuplicat, gnMockNumar
PUBLIC gnPc, gnPVal, gnPPretV, gnScadereStoc, gnMemProcDisc
gnMockNumar = 0
gnPc = 2
gnPVal = 2
gnPPretV = 4
gnScadereStoc = 1
gnMemProcDisc = 0
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4e_registru.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
gnErr = 0
gcCaz = ""
gcErr = ""
gcMockApeluri = ""
gnMockRaspuns = 6
gcMockDuplicat = ""
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
LOCAL lcProc
lcProc = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", ;
"D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg", &lcProc
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
gnIdUtil = 8
gnIdSucursala = 167
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
gnScadereStoc = 1
DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) + " gnIdSucursala=" + TRANSFORM(gnIdSucursala)
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
CREATE CURSOR jtva_coloane (id_jtva_coloana N(14), denumire C(50), cota_tva N(6,2))
INSERT INTO jtva_coloane VALUES (190, 'TVA 19%', 19)
INSERT INTO jtva_coloane VALUES (210, 'TVA 21%', 21)
INSERT INTO jtva_coloane VALUES (110, 'TVA 11%', 11)
GO TOP IN jtva_coloane
PRIVATE poDate, poGeneratorNumere, plVizibil, pnTotalDiscountAvize
plVizibil = .F.
pnTotalDiscountAvize = 0
poDate = NULL
poGeneratorNumere = CREATEOBJECT("oGeneratorMock")
DO TestA1
DO TestA2
DO TestA3
DO Final
*----------------------------------------------------------------------------------------
* A1: pe rulare, nu pe definitie de camp - APPEND BLANK pe crsfactura creat de creeaza_facturacrs
* trebuie sa produca id_c=0 si opt_facturare=0 (ambele N() fara NULL in ofacturare_comun.prg:1782-1798).
PROCEDURE TestA1
LOCAL lnIdC, lnOptFact
gcCaz = "[A1: APPEND BLANK pe crsfactura din creeaza_facturacrs] "
DO AfLog WITH "PAS: " + gcCaz
DO Inchide WITH 'crstest_a1'
DO creeaza_facturacrs WITH 'crstest_a1'
DO Assert WITH USED('crstest_a1'), "cursorul a fost creat de creeaza_facturacrs"
SELECT crstest_a1
APPEND BLANK
lnIdC = id_c
lnOptFact = opt_facturare
DO Assert WITH lnIdC = 0, "id_c = 0 dupa APPEND BLANK (obtinut: " + TRANSFORM(lnIdC) + ")"
DO Assert WITH lnOptFact = 0, "opt_facturare = 0 dupa APPEND BLANK (obtinut: " + TRANSFORM(lnOptFact) + ")"
DO Inchide WITH 'crstest_a1'
ENDPROC
*----------------------------------------------------------------------------------------
* A2: do_sterge pe tip=3 (comanda), crsarticole cu 3 randuri (id_c 1..3), crsfactura cu o linie
* de comanda (id_c=2) si una libera (id_c=0).
* - stergerea liniei LIBERE: Calculate Sum(cantitate) peste crsarticole ramane neschimbat.
* - stergerea liniei de COMANDA: crsarticole.cantitate la id_c=2 creste cu exact cantitatea stearsa.
PROCEDURE TestA2
LOCAL loForm, lnSumInainte, lnSumDupa, lnCantId2Inainte, lnCantId2Dupa
gcCaz = "[A2: do_sterge - linie libera vs linie de comanda] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 3
SELECT 0
CREATE CURSOR crsarticole (id_c N(20), id_articol N(20), denumire C(100), cantitate N(20,4), ;
gestionabil N(1), opt_facturare N(3), Pret N(20,4), pret_val N(20,4), proc_tvav N(20,4), ;
preturi_cu_tva N(1), um C(10), id_gestiune N(20), cont C(10), id_valuta N(10), tip_valuta N(1), ;
Curs N(20,4), multiplicator N(10), discount_unitar N(20,4), discount_unitar_val N(20,4), ;
codmat C(50), codbare C(50), nume_val C(20))
INSERT INTO crsarticole VALUES (1, 401, "ARTICOL 1", 5, 1, 0, 100, 0, 1.19, 0, "BUC", ;
21, "371", 1, 0, 1, 1, 0, 0, "CM401", "", "RON")
INSERT INTO crsarticole VALUES (2, 402, "ARTICOL 2", 7, 1, 0, 100, 0, 1.19, 0, "BUC", ;
21, "371", 1, 0, 1, 1, 0, 0, "CM402", "", "RON")
INSERT INTO crsarticole VALUES (3, 403, "ARTICOL 3", 3, 1, 0, 100, 0, 1.19, 0, "BUC", ;
21, "371", 1, 0, 1, 1, 0, 0, "CM403", "", "RON")
GO TOP IN crsarticole
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
SELECT crsfactura
APPEND BLANK
REPLACE id_temp WITH 1, id_c WITH 2, id_articol WITH 402, denumire WITH "ARTICOL 2", ;
cantitate WITH 4, opt_facturare WITH 0
APPEND BLANK
REPLACE id_temp WITH 2, id_c WITH 0, id_articol WITH 999, denumire WITH "LINIE LIBERA", ;
cantitate WITH 2, opt_facturare WITH 0
DO Assert WITH RECCOUNT('crsfactura') = 2, "crsfactura are 2 randuri (comanda + libera)"
*-- pas 1: sterge linia LIBERA (id_c=0) - Sum(crsarticole.cantitate) ramane neschimbat
SELECT crsarticole
CALCULATE SUM(cantitate) TO lnSumInainte
GO TOP IN crsarticole
SELECT crsfactura
LOCATE FOR id_c = 0
DO Assert WITH FOUND(), "linia libera (id_c=0) gasita in crsfactura"
gnErr = 0
gcErr = ""
gnMockRaspuns = 6
loForm.do_sterge()
DO Assert WITH gnErr = 0, "do_sterge (linie libera) fara eroare"
DO Assert WITH RECCOUNT('crsfactura') = 1, "linia libera a fost stearsa din crsfactura"
SELECT crsarticole
CALCULATE SUM(cantitate) TO lnSumDupa
GO TOP IN crsarticole
DO Assert WITH lnSumDupa = lnSumInainte, "Sum(crsarticole.cantitate) neschimbat dupa stergerea liniei LIBERE (inainte=" + ;
TRANSFORM(lnSumInainte) + " dupa=" + TRANSFORM(lnSumDupa) + ")"
*-- pas 2: sterge linia de COMANDA (id_c=2) - crsarticole.cantitate la id_c=2 creste cu exact cantitatea stearsa (4)
SELECT crsarticole
LOCATE FOR id_c = 2
lnCantId2Inainte = cantitate
GO TOP IN crsarticole
SELECT crsfactura
LOCATE FOR id_c = 2
DO Assert WITH FOUND(), "linia de comanda (id_c=2) gasita in crsfactura"
gnErr = 0
gcErr = ""
gnMockRaspuns = 6
loForm.do_sterge()
DO Assert WITH gnErr = 0, "do_sterge (linie comanda) fara eroare"
DO Assert WITH RECCOUNT('crsfactura') = 0, "linia de comanda a fost stearsa din crsfactura"
SELECT crsarticole
LOCATE FOR id_c = 2
lnCantId2Dupa = cantitate
GO TOP IN crsarticole
DO Assert WITH lnCantId2Dupa = lnCantId2Inainte + 4, "crsarticole.cantitate la id_c=2 a crescut cu exact 4 (inainte=" + ;
TRANSFORM(lnCantId2Inainte) + " dupa=" + TRANSFORM(lnCantId2Dupa) + ")"
DO Inchide WITH 'crsarticole'
loForm.Release()
RELEASE loForm
ENDPROC
*----------------------------------------------------------------------------------------
* A3: adaugarea a doua linii libere (id_c=0) in crsfactura nu atinge deloc crsarticole -
* Sum(crsarticole.cantitate) identic inainte/dupa.
PROCEDURE TestA3
LOCAL lnSumInainte, lnSumDupa
gcCaz = "[A3: Sum(crsarticole) neschimbat de adaugarea liniilor libere] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 3
SELECT 0
CREATE CURSOR crsarticole (id_c N(20), id_articol N(20), denumire C(100), cantitate N(20,4), ;
gestionabil N(1), opt_facturare N(3), Pret N(20,4), pret_val N(20,4), proc_tvav N(20,4), ;
preturi_cu_tva N(1), um C(10), id_gestiune N(20), cont C(10), id_valuta N(10), tip_valuta N(1), ;
Curs N(20,4), multiplicator N(10), discount_unitar N(20,4), discount_unitar_val N(20,4), ;
codmat C(50), codbare C(50), nume_val C(20))
INSERT INTO crsarticole VALUES (1, 401, "ARTICOL 1", 5, 1, 0, 100, 0, 1.19, 0, "BUC", ;
21, "371", 1, 0, 1, 1, 0, 0, "CM401", "", "RON")
INSERT INTO crsarticole VALUES (2, 402, "ARTICOL 2", 7, 1, 0, 100, 0, 1.19, 0, "BUC", ;
21, "371", 1, 0, 1, 1, 0, 0, "CM402", "", "RON")
GO TOP IN crsarticole
SELECT crsarticole
CALCULATE SUM(cantitate) TO lnSumInainte
GO TOP IN crsarticole
SELECT crsfactura
APPEND BLANK
REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH 991, denumire WITH "LIBERA 1", ;
cantitate WITH 6, opt_facturare WITH 0
APPEND BLANK
REPLACE id_temp WITH 2, id_c WITH 0, id_articol WITH 992, denumire WITH "LIBERA 2", ;
cantitate WITH 9, opt_facturare WITH 0
DO Assert WITH RECCOUNT('crsfactura') = 2, "cele doua linii libere au fost adaugate in crsfactura"
SELECT crsarticole
CALCULATE SUM(cantitate) TO lnSumDupa
GO TOP IN crsarticole
DO Assert WITH lnSumDupa = lnSumInainte, "Sum(crsarticole.cantitate) identic inainte/dupa adaugarea a 2 linii libere (inainte=" + ;
TRANSFORM(lnSumInainte) + " dupa=" + TRANSFORM(lnSumDupa) + ")"
DO Inchide WITH 'crsarticole'
ENDPROC
*----------------------------------------------------------------------------------------
PROCEDURE Reseteaza
LPARAMETERS tnTip
LOCAL lnIdSet
DO Inchide WITH 'crsarticole'
DO Inchide WITH 'crsarticole1'
DO Inchide WITH 'crsfactura'
DO Inchide WITH 'crscursuri'
DO Inchide WITH 'crspolitici'
DO Inchide WITH 'crscontracte'
DO Inchide WITH 'crsgestiunidest'
DO Inchide WITH 'crsCtrTemp'
DO Inchide WITH 'CrsCotaTva'
DO Inchide WITH 'saft_tip_facturi'
SELECT 0
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
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
gcMockApeluri = ""
gcErr = ""
gnErr = 0
gnMockRaspuns = 6
gcMockDuplicat = ""
lnIdSet = 28000 + tnTip
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip)
poDate.dataireg = DATE(gnAn, gnLuna, 1)
poDate.dataact = poDate.dataireg
poDate.zi_curs = poDate.dataireg
poDate.id_fdoc = 1
poDate.fdoc = "FEL TEST"
poDate.nract = 79
poDate.serie_act = "TST"
poDate.id_client = 1
poDate.id_furnizor = 1
poDate.nrfactachi = 1
poDate.id_valuta = 1
poDate.in_valuta = 0
poDate.listaid = "1"
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
gcMockApeluri = ""
ENDPROC
PROCEDURE Inchide
LPARAMETERS tcAlias
IF USED(tcAlias)
USE IN (tcAlias)
ENDIF
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 AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10)
gnErr = gnErr + 1
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,390 @@
* test_s4f_cautare_retur.prg
* Headless: do_adauga_articol_cautat (frm_facturare_articole2, ofacturare.vc2:18929) pe un document
* de retur (poDate.tip = 8) trebuie sa delege la calea veche do_adauga_articol, care alege gestiunea
* reala - nu la Gather-ul direct din toArticol (care scria sentinela id_gestiune = -1000, S4f).
*
* crsarticole e construit direct (nu prin Oracle), cu UN singur rand deja "incarcat" pe document
* (ca dupa butonul Incarca articole / do_adauga_tot), gestionabil=0 ca sa ocoleasca do_alege_stoc
* (nu se testeaza alegerea de gestiune cu formular modal, doar rutarea - pattern validat deja de
* test_s4e_0_adauga_articol.prg CazAdaugaTotSucces). cantitate NEGATIVA (-2): pe tip 8/9,
* do_verifica_articol respinge orice cantitate >= 0 (ofacturare.vc2:20913).
*
* toArticol simuleaza obiectul scatter-uit din crsCodmat/crsDenumire (combo-ul de cautare in linie)
* dupa do_initializeaza_articol - doar proprietatile citite de do_initializeaza_articol INAINTE de
* ramura noua (um, preturi_cu_tva, discount_unitar(_val), proc_tvav, Pret, pret_val, cantitate,
* id_articol); campurile ramurii vechi (Gather in crsfactura) nu mai sunt atinse pe acest traseu.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s4f_cautare_retur.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4f_cautare_retur.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 1.
*
* CazNegasitTip8/CazNegasitTip41 (garda S4f: articol nevandut pe documentul returnat) - articolul
* cautat NU e printre randurile din crsarticole. Pe tip 8/9 noua garda din do_adauga_articol_cautat
* (ofacturare.vc2:18945-18949) trebuie sa afiseze mesajul (mocat de mock_validare_antet.prg, incarcat
* PRIMUL - vezi SET PROCEDURE mai jos) si sa intoarca .F. fara sa scrie in crsfactura. Pe tip 41
* garda nu se aplica (caz imposibil, cf. docs\verificare_s4f_caz_accesibil.md) - comportamentul ramane
* neschimbat: cade prin la Gather-ul vechi, scrie cu id_gestiune=-1000 (sentinela, nu regresie).
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
SET TABLEPROMPT OFF
PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr
PUBLIC gcMockApeluri, gnMockRaspuns, gcMockDuplicat, gnMockNumar
gnMockNumar = 0
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4f_cautare_retur.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
gnErr = 0
gcCaz = ""
gcErr = ""
gcMockApeluri = ""
gnMockRaspuns = 6
gcMockDuplicat = ""
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
LOCAL lcProc
lcProc = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", ;
"D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg", &lcProc
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
gnScadereStoc = 1
DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna)
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
PRIVATE poDate, poGeneratorNumere, plVizibil, pnTotalDiscountAvize
plVizibil = .F.
pnTotalDiscountAvize = 0
poDate = NULL
poGeneratorNumere = CREATEOBJECT("oGeneratorMock")
DO CazCautareRetur
DO CazNegasitTip8
DO CazNegasitTip41
DO Final
*----------------------------------------------------------------------------------------
* CAZ: cautare in linie pe document retur (tip 8) - trebuie sa delege la do_adauga_articol,
* care scrie id_gestiune REAL (77, din crsarticole), nu sentinela -1000 din do_initializeaza_articol.
PROCEDURE CazCautareRetur
LOCAL loForm, loArticol
gcCaz = "[CAZ_S4f cautare_retur] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 8
SELECT 0
CREATE CURSOR crsarticole (id_c N(20), id_articol N(20), denumire C(100), cantitate N(20,4), ;
gestionabil N(1), opt_facturare N(3), Pret N(20,4), pret_val N(20,4), proc_tvav N(20,4), ;
preturi_cu_tva N(1), um C(10), id_gestiune N(20), cont C(10), id_valuta N(10), tip_valuta N(1), ;
Curs N(20,4), multiplicator N(10), discount_unitar N(20,4), discount_unitar_val N(20,4), ;
codmat C(50), codbare C(50), nume_val C(20))
* cantitate POZITIVA: do_adauga_articol cheama din nou do_initializeaza_articol pe poArticol
* (scatter din acest rand), care inverseaza semnul pentru tip 8/9 (:19898) - abia dupa aceea
* do_verifica_articol cere tnCantitate NEGATIV ca sa accepte pe retur (:20916)
INSERT INTO crsarticole VALUES (1, 555001, "ARTICOL RETUR TEST", 2, 0, 0, 100, 0, 1.19, 0, "BUC", ;
77, "371", 1, 0, 1, 1, 0, 0, "CM555001", "", "RON")
GO TOP IN crsarticole
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
* obiectul cautat in combo (cCodMat/cDenumire), dupa Scatter din crsCodmat/crsDenumire
loArticol = CREATEOBJECT('Empty')
ADDPROPERTY(loArticol, 'id_articol', 555001)
ADDPROPERTY(loArticol, 'denumire', "ARTICOL RETUR TEST")
ADDPROPERTY(loArticol, 'codmat', "CM555001")
ADDPROPERTY(loArticol, 'um', "BUC")
ADDPROPERTY(loArticol, 'preturi_cu_tva', 0)
ADDPROPERTY(loArticol, 'discount_unitar', 0)
ADDPROPERTY(loArticol, 'discount_unitar_val', 0)
ADDPROPERTY(loArticol, 'proc_tvav', 1.19)
ADDPROPERTY(loArticol, 'Pret', 100)
ADDPROPERTY(loArticol, 'pret_val', 0)
ADDPROPERTY(loArticol, 'cantitate', 2)
gcErr = ""
gnErr = 0
gcMockApeluri = ""
DO AfLog WITH "DIAG poDate.tip=" + TRANSFORM(poDate.tip) + " crsarticole.id_articol(inainte)=" + TRANSFORM(crsarticole.id_articol) + " cantitate=" + TRANSFORM(crsarticole.cantitate)
loForm.do_adauga_articol_cautat(loArticol, loArticol.cantitate)
DO AfLog WITH "DIAG dupa apel: gcErr=[" + gcErr + "] gcMockApeluri=[" + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13)+CHR(10), ' | ') + "]"
DO AfLog WITH "DIAG crsfactura reccount=" + TRANSFORM(RECCOUNT('crsfactura')) + " crsarticole reccount=" + TRANSFORM(IIF(USED('crsarticole'), RECCOUNT('crsarticole'), -1))
IF USED('crsarticole')
DO AfLog WITH "DIAG crsarticole dupa: id_articol=" + TRANSFORM(crsarticole.id_articol) + " cantitate=" + TRANSFORM(crsarticole.cantitate)
ENDIF
DO Assert WITH !("GRD_ARTICOLE" $ UPPER(gcErr)), "fara amprenta GRD_ARTICOLE in gcErr"
DO Assert WITH !("TXTCODMAT" $ UPPER(gcErr)), "fara amprenta TXTCODMAT in gcErr"
DO Assert WITH RECCOUNT('crsfactura') = 1, "randul a ajuns in crsfactura pe calea veche (Reccount=" + TRANSFORM(RECCOUNT('crsfactura')) + ")"
IF RECCOUNT('crsfactura') >= 1
SELECT crsfactura
GO TOP
DO Assert WITH id_gestiune <> -1000, "id_gestiune NU ramane sentinela -1000, e=" + TRANSFORM(id_gestiune)
DO Assert WITH id_gestiune = 77, "id_gestiune vine din crsarticole (gestiunea reala), e=" + TRANSFORM(id_gestiune)
DO Assert WITH id_articol = 555001, "id_articol corect in crsfactura"
ENDIF
DO Inchide WITH 'crsarticole'
loForm.Release()
RELEASE loForm, loArticol
ENDPROC
*----------------------------------------------------------------------------------------
* CAZ (a): tip 8, articolul cautat NU e in crsarticole (nevandut pe documentul returnat) - garda
* noua trebuie sa refuze: .F., fara rand nou in crsfactura, mesaj afisat (mocat).
PROCEDURE CazNegasitTip8
LOCAL loForm, loArticol, llRet
gcCaz = "[CAZ_S4f negasit_tip8] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 8
SELECT 0
CREATE CURSOR crsarticole (id_c N(20), id_articol N(20), denumire C(100), cantitate N(20,4), ;
gestionabil N(1), opt_facturare N(3), Pret N(20,4), pret_val N(20,4), proc_tvav N(20,4), ;
preturi_cu_tva N(1), um C(10), id_gestiune N(20), cont C(10), id_valuta N(10), tip_valuta N(1), ;
Curs N(20,4), multiplicator N(10), discount_unitar N(20,4), discount_unitar_val N(20,4), ;
codmat C(50), codbare C(50), nume_val C(20))
* alt articol, deja incarcat pe document - id_articol diferit de cel cautat mai jos (555001)
INSERT INTO crsarticole VALUES (1, 999002, "ALT ARTICOL PE DOCUMENT", 2, 0, 0, 100, 0, 1.19, 0, "BUC", ;
77, "371", 1, 0, 1, 1, 0, 0, "CM999002", "", "RON")
GO TOP IN crsarticole
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
loArticol = CREATEOBJECT('Empty')
ADDPROPERTY(loArticol, 'id_articol', 555001)
ADDPROPERTY(loArticol, 'denumire', "ARTICOL NEVANDUT")
ADDPROPERTY(loArticol, 'codmat', "CM555001")
ADDPROPERTY(loArticol, 'um', "BUC")
ADDPROPERTY(loArticol, 'preturi_cu_tva', 0)
ADDPROPERTY(loArticol, 'discount_unitar', 0)
ADDPROPERTY(loArticol, 'discount_unitar_val', 0)
ADDPROPERTY(loArticol, 'proc_tvav', 1.19)
ADDPROPERTY(loArticol, 'Pret', 100)
ADDPROPERTY(loArticol, 'pret_val', 0)
ADDPROPERTY(loArticol, 'cantitate', 2)
gcErr = ""
gnErr = 0
gcMockApeluri = ""
llRet = loForm.do_adauga_articol_cautat(loArticol, loArticol.cantitate)
DO AfLog WITH "DIAG llRet=" + TRANSFORM(llRet) + " gcMockApeluri=[" + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13)+CHR(10), ' | ') + "]"
DO AfLog WITH "DIAG crsfactura reccount=" + TRANSFORM(RECCOUNT('crsfactura'))
DO Assert WITH gnErr = 0, "fara eroare VFP la refuz (tip 8, articol negasit)"
DO Assert WITH llRet = .F., "do_adauga_articol_cautat intoarce .F. (tip 8, articol negasit)"
DO Assert WITH RECCOUNT('crsfactura') = 0, "crsfactura neschimbat (Reccount=" + TRANSFORM(RECCOUNT('crsfactura')) + ")"
DO Assert WITH "amessagebox(" $ gcMockApeluri, "mesajul de refuz a fost afisat (mocat)"
DO Assert WITH "NU A FOST VANDUT" $ UPPER(gcMockApeluri), "textul mesajului explica motivul refuzului"
DO Inchide WITH 'crsarticole'
loForm.Release()
RELEASE loForm, loArticol
ENDPROC
*----------------------------------------------------------------------------------------
* CAZ (c): tip 41, articolul cautat NU e in crsarticole - garda noua NU se aplica (scopata la 8/9).
* Comportamentul trebuie sa ramana neschimbat: cade prin la Gather-ul vechi, .T., id_gestiune=-1000.
PROCEDURE CazNegasitTip41
LOCAL loForm, loArticol, llRet
gcCaz = "[CAZ_S4f negasit_tip41] "
DO AfLog WITH "PAS: " + gcCaz
DO Reseteaza WITH 41
SELECT 0
CREATE CURSOR crsarticole (id_c N(20), id_articol N(20), denumire C(100), cantitate N(20,4), ;
gestionabil N(1), opt_facturare N(3), Pret N(20,4), pret_val N(20,4), proc_tvav N(20,4), ;
preturi_cu_tva N(1), um C(10), id_gestiune N(20), cont C(10), id_valuta N(10), tip_valuta N(1), ;
Curs N(20,4), multiplicator N(10), discount_unitar N(20,4), discount_unitar_val N(20,4), ;
codmat C(50), codbare C(50), nume_val C(20))
INSERT INTO crsarticole VALUES (1, 999002, "ALT ARTICOL PE DOCUMENT", 2, 0, 0, 100, 0, 1.19, 0, "BUC", ;
77, "371", 1, 0, 1, 1, 0, 0, "CM999002", "", "RON")
GO TOP IN crsarticole
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
RETURN
ENDIF
loArticol = CREATEOBJECT('Empty')
ADDPROPERTY(loArticol, 'id_articol', 555001)
ADDPROPERTY(loArticol, 'denumire', "ARTICOL NEVANDUT")
ADDPROPERTY(loArticol, 'codmat', "CM555001")
ADDPROPERTY(loArticol, 'um', "BUC")
ADDPROPERTY(loArticol, 'preturi_cu_tva', 0)
ADDPROPERTY(loArticol, 'discount_unitar', 0)
ADDPROPERTY(loArticol, 'discount_unitar_val', 0)
ADDPROPERTY(loArticol, 'proc_tvav', 1.19)
ADDPROPERTY(loArticol, 'Pret', 100)
ADDPROPERTY(loArticol, 'pret_val', 0)
ADDPROPERTY(loArticol, 'cantitate', 2)
* tip 41 nu delega (nu are echivalent al do_adauga_articol) - cade in Gather-ul vechi, care mai
* citeste si aceste proprietati din obiectul cautat (neatinse de do_initializeaza_articol)
ADDPROPERTY(loArticol, 'Curs', 1)
ADDPROPERTY(loArticol, 'multiplicator', 1)
ADDPROPERTY(loArticol, 'codbare', "")
* calea veche (Gather direct in crsfactura, fara Append Blank propriu) presupune ca grilul
* a pozitionat deja un rand gol pe crsfactura - ca la LostFocus pe ultima linie a grid-ului
SELECT crsfactura
APPEND BLANK
gcErr = ""
gnErr = 0
gcMockApeluri = ""
llRet = loForm.do_adauga_articol_cautat(loArticol, loArticol.cantitate)
DO AfLog WITH "DIAG llRet=" + TRANSFORM(llRet) + " gcErr=[" + gcErr + "] gcMockApeluri=[" + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13)+CHR(10), ' | ') + "]"
DO AfLog WITH "DIAG crsfactura reccount=" + TRANSFORM(RECCOUNT('crsfactura'))
DO Assert WITH gnErr = 0, "fara eroare VFP (tip 41, articol negasit)"
DO Assert WITH llRet = .T., "do_adauga_articol_cautat intoarce .T. (tip 41, comportament neschimbat)"
DO Assert WITH RECCOUNT('crsfactura') = 1, "randul ajunge in crsfactura pe calea veche (Reccount=" + TRANSFORM(RECCOUNT('crsfactura')) + ")"
DO Assert WITH !("amessagebox(" $ gcMockApeluri), "nicio garda pe tip 41 (scopata la 8/9)"
IF RECCOUNT('crsfactura') >= 1
SELECT crsfactura
GO TOP
DO Assert WITH id_gestiune = -1000, "id_gestiune ramane sentinela -1000 pe tip 41 (neschimbat, nu regresie)"
ENDIF
DO Inchide WITH 'crsarticole'
loForm.Release()
RELEASE loForm, loArticol
ENDPROC
*----------------------------------------------------------------------------------------
PROCEDURE Reseteaza
LPARAMETERS tnTip
LOCAL lnIdSet
DO Inchide WITH 'crsarticole'
DO Inchide WITH 'crsarticole1'
DO Inchide WITH 'crsfactura'
DO Inchide WITH 'crscursuri'
DO Inchide WITH 'crspolitici'
DO Inchide WITH 'crscontracte'
DO Inchide WITH 'crsgestiunidest'
DO Inchide WITH 'crsCtrTemp'
DO Inchide WITH 'CrsCotaTva'
DO Inchide WITH 'saft_tip_facturi'
DO Inchide WITH 'jtva_coloane'
SELECT 0
* cboTipFactura (frm_facturare_articole2) cere RowSource pe saft_tip_facturi la constructie
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
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
gcMockApeluri = ""
gcErr = ""
gnErr = 0
gnMockRaspuns = 6
gcMockDuplicat = ""
lnIdSet = 26000 + tnTip
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip)
poDate.dataireg = DATE(gnAn, gnLuna, 1)
poDate.dataact = poDate.dataireg
poDate.zi_curs = poDate.dataireg
poDate.id_fdoc = 1
poDate.fdoc = "FEL TEST"
poDate.nract = 78
poDate.serie_act = "TST"
poDate.id_client = 1
poDate.id_furnizor = 1
poDate.nrfactachi = 1
poDate.id_valuta = 1
poDate.in_valuta = 0
poDate.listaid = "1"
* jtva_coloane real (do_initializeaza_articol face Select jtva_coloane pe fiecare articol)
DO Inchide WITH '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
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
gcMockApeluri = ""
ENDPROC
PROCEDURE Inchide
LPARAMETERS tcAlias
IF USED(tcAlias)
USE IN (tcAlias)
ENDIF
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 AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10)
gnErr = gnErr + 1
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,180 @@
* test_s4g_cont_venit.prg
* Headless: S4g (VFP) - cont de venit derivat pentru articolele fara politica de pret, al 29-lea
* argument (V_CONT_VENIT) pe apelul RPC catre pack_facturare.adauga_articol_factura, cablat in
* do_scrie_articole (COMUN\clase\ofacturare.vc2, frm_facturare_articole si frm_facturare_articole2).
*
* Proba in doua parti, FARA sa invoce do_scrie_articole/formularul complet (ar cere un document
* real scris in VANZARI_DETALII_TEMP - lasat ca datorie explicita in docs\raport_s4g_vfp.md):
*
* PARTEA A - deriva_cont_venit_fara_pol() (COMUN\programe\ofacturare_comun.prg), cele 3 nivele ale
* derivarii (s4g_adaugare_articole_modificare.md sectiunea 3.1), verificate cu date REALE citite
* chiar in test (SELECT direct, nimic scris in Oracle):
* A1: cont de gestiune CU corespondenta reala in vcoresp_cont_venchelt -> exact CONT_VENIT.
* A2: cont de gestiune fara corespondenta, articol cu nom_articole.cont care incepe cu 6/7 ->
* exact acel cont.
* A3: cont de gestiune fara corespondenta, articol fara cont 6xx/7xx -> fallback '704'.
*
* PARTEA B - formula de cablare adaugata in do_scrie_articole (identica cu diff-ul), evaluata pe
* un poArt minimal, cele doua ramuri cerute de story. Pozitional (nu named notation: driverul ODBC
* respinge P=>val in interiorul {call ...}, vezi docs\verificare_named_notation_odbc.md):
* B1: poArt.id_pol populat -> argumentul (poz. 29) e ,NULL explicit (Oracle primeste NULL,
* comportament neschimbat fata de azi).
* B2: poArt.id_pol gol -> argumentul (poz. 29) e ,'<cont derivat>'.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s4g_cont_venit.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4g_cont_venit.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
CLOSE DATABASES
PUBLIC gcLog, gnPass, gnFail, gcCaz, gcErr
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4g_cont_venit.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)
gnPass = 0
gnFail = 0
gcCaz = ""
gcErr = ""
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
gnIdUtil = 8
DO AfLog WITH "ENV OK"
LOCAL lnSucces, lnIdArtAny, lnIdArt67, lnIdArtFallback
*----------------------------------------------------------------------------------------
* orice articol valid, folosit ca ancora pentru A1 (nu conteaza nom_articole.cont acolo,
* corespondenta gaseste raspunsul inaintea CASE-ului de fallback)
gcCaz = "[setup-articol-oarecare] "
IF USED('crssetuparttv')
USE IN crssetuparttv
ENDIF
lnSucces = goExecutor.oExecute([select id_articol from nom_articole where id_articol > 0 and rownum = 1],[crssetuparttv])
DO Assert WITH lnSucces >= 0 AND USED('crssetuparttv') AND RECCOUNT('crssetuparttv') = 1, "exista cel putin un articol in nom_articole"
lnIdArtAny = 0
IF USED('crssetuparttv') AND RECCOUNT('crssetuparttv') = 1
lnIdArtAny = crssetuparttv.id_articol
ENDIF
IF USED('crssetuparttv')
USE IN crssetuparttv
ENDIF
*----------------------------------------------------------------------------------------
* PARTEA A1 - corespondenta cont_venit gaseste raspunsul
gcCaz = "[A1-coresp_cont_venchelt] "
IF USED('crssurscvc')
USE IN crssurscvc
ENDIF
lnSucces = goExecutor.oExecute([select cont, cont_venit from vcoresp_cont_venchelt where cont_venit is not null and rownum = 1],[crssurscvc])
DO Assert WITH lnSucces >= 0 AND USED('crssurscvc') AND RECCOUNT('crssurscvc') = 1, "exista cel putin o corespondenta cont_venit in schema"
IF USED('crssurscvc') AND RECCOUNT('crssurscvc') = 1 AND lnIdArtAny > 0
LOCAL lcContGest, lcAsteptat, lcRezultat
lcContGest = ALLTRIM(crssurscvc.cont)
lcAsteptat = ALLTRIM(crssurscvc.cont_venit)
USE IN crssurscvc
lcRezultat = deriva_cont_venit_fara_pol(lnIdArtAny, lcContGest)
DO Assert WITH lcRezultat == lcAsteptat, "cont_venit din corespondenta: asteptat [" + lcAsteptat + "], obtinut [" + lcRezultat + "]"
ENDIF
*----------------------------------------------------------------------------------------
* PARTEA A2 - fara corespondenta, nom_articole.cont incepe cu 6/7
gcCaz = "[A2-nom_articole 6-7] "
IF USED('crssursart')
USE IN crssursart
ENDIF
lnSucces = goExecutor.oExecute([select id_articol, cont from nom_articole where cont is not null and (substr(cont,1,1) = '6' or substr(cont,1,1) = '7') and rownum = 1],[crssursart])
DO Assert WITH lnSucces >= 0, "select articol cu cont 6xx/7xx executat"
lnIdArt67 = 0
IF USED('crssursart') AND RECCOUNT('crssursart') = 1
LOCAL lcAsteptat2, lcRezultat2
lnIdArt67 = crssursart.id_articol
lcAsteptat2 = ALLTRIM(crssursart.cont)
USE IN crssursart
lcRezultat2 = deriva_cont_venit_fara_pol(lnIdArt67, "ZZ_INEXISTENT")
DO Assert WITH lcRezultat2 == lcAsteptat2, "cont_venit din nom_articole (6/7): asteptat [" + lcAsteptat2 + "], obtinut [" + lcRezultat2 + "]"
ELSE
IF USED('crssursart')
USE IN crssursart
ENDIF
DO AfLog WITH "INFO: niciun articol cu cont 6xx/7xx in schema - A2 sarit (nu e regresie, doar lipsa de date)"
ENDIF
*----------------------------------------------------------------------------------------
* PARTEA A3 - fara corespondenta, fara cont 6/7 -> fallback 704
gcCaz = "[A3-fallback-704] "
IF USED('crssursart3')
USE IN crssursart3
ENDIF
lnSucces = goExecutor.oExecute([select id_articol from nom_articole where id_articol > 0 and (cont is null or substr(cont,1,1) not in ('6','7')) and rownum = 1],[crssursart3])
DO Assert WITH lnSucces >= 0 AND USED('crssursart3') AND RECCOUNT('crssursart3') = 1, "exista cel putin un articol fara cont 6xx/7xx in schema"
lnIdArtFallback = 0
IF USED('crssursart3') AND RECCOUNT('crssursart3') = 1
LOCAL lcRezultat3
lnIdArtFallback = crssursart3.id_articol
USE IN crssursart3
lcRezultat3 = deriva_cont_venit_fara_pol(lnIdArtFallback, "ZZ_INEXISTENT")
DO Assert WITH lcRezultat3 == "704", "fallback 704: obtinut [" + lcRezultat3 + "]"
ENDIF
*----------------------------------------------------------------------------------------
* PARTEA B - formula de cablare, identica cu cea adaugata in do_scrie_articole
gcCaz = "[B1-cu-id_pol] "
LOCAL loArt1, lcArg1
loArt1 = CREATEOBJECT('Empty')
ADDPROPERTY(loArt1, 'id_pol', 63)
ADDPROPERTY(loArt1, 'id_articol', IIF(lnIdArtFallback > 0, lnIdArtFallback, lnIdArtAny))
ADDPROPERTY(loArt1, 'Cont', 'ZZ_INEXISTENT')
lcArg1 = Iif(Empty(Nvl(loArt1.id_pol,0)),[,'] + OracleSpecialCharacters(deriva_cont_venit_fara_pol(loArt1.id_articol,loArt1.Cont)) + ['],[,NULL])
DO Assert WITH lcArg1 == ",NULL", "id_pol populat: argumentul RPC (poz. 29) e ,NULL explicit, obtinut [" + lcArg1 + "]"
gcCaz = "[B2-fara-id_pol] "
LOCAL loArt2, lcArg2
loArt2 = CREATEOBJECT('Empty')
ADDPROPERTY(loArt2, 'id_pol', .NULL.)
ADDPROPERTY(loArt2, 'id_articol', IIF(lnIdArtFallback > 0, lnIdArtFallback, lnIdArtAny))
ADDPROPERTY(loArt2, 'Cont', 'ZZ_INEXISTENT')
lcArg2 = Iif(Empty(Nvl(loArt2.id_pol,0)),[,'] + OracleSpecialCharacters(deriva_cont_venit_fara_pol(loArt2.id_articol,loArt2.Cont)) + ['],[,NULL])
DO Assert WITH LEFT(lcArg2,2) == ",'", "id_pol gol: argumentul RPC (poz. 29) incepe pozitional cu ,' [" + lcArg2 + "]"
DO Assert WITH RIGHT(lcArg2,1) == "'", "argumentul se inchide cu apostrof [" + lcArg2 + "]"
DO Assert WITH lcArg2 == ",'704'", "valoarea trimisa e fallback 704 (Cont test inexistent + articol A3): [" + lcArg2 + "]"
DO Final
*----------------------------------------------------------------------------------------
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 AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10)
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,178 @@
* test_s5_1_configuratie_tip_document.prg
* Headless: S5-1 - cursorul de configurare per tip de document (COMUN\programe\ofacturare.prg,
* creeaza_configuratie_tip_document / configurare_tip_document), fara Oracle si fara formular -
* verifica MECANIC ca datele din cursor corespund literal inventarului verificat pe cod
* (docs\verificare_s5_tabel_sursa.md, sectiunea 1b, Do Case-ul din frm_facturare_articole.Init,
* ofacturare.vc2:15259-15395).
*
* Cazuri:
* A. Creare lenesa: cursorul NU exista inainte de primul apel al configurare_tip_document(),
* exista dupa.
* B. Multimea de tipuri din cursor == exact cele 21 din inventar + randurile speciale -1
* (eProforma) / -2 (lCopiere), comparatie pe lista sortata.
* C. Pentru fiecare din cele 21 de tipuri: titlu, sufix_titlu, cap_cantitate, mesaj_stoc,
* ascunde_discount, sterge_serie, buton_tot, buton_retur, tip_doc - cate o asertiune per camp
* (titlu/sufix_titlu/cap_cantitate/mesaj_stoc comparate ALLTRIM, spatiul final din literalul
* sursa nu se poate observa - campul e C(50) cu padding la dreapta oricum).
* D. Prioritate: configurare_tip_document(3,.T.,.F.) intoarce randul de proforma (tip=-1);
* configurare_tip_document(3,.F.,.T.) intoarce randul de copiere (tip=-2);
* configurare_tip_document(3,.F.,.F.) intoarce randul propriu al tipului 3.
* E. Tip necunoscut (99) intoarce .Null.
* F. Select() al apelantului neschimbat dupa apel.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s5_1_configuratie_tip_document.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5_1_configuratie_tip_document.log
* Fara Oracle, fara formular - doar SET PROCEDURE TO ofacturare.prg.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gcCaz, gcErr
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5_1_configuratie_tip_document.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
gcCaz = ""
gcErr = ""
ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare.prg" ADDITIVE
IF USED('configuratie_tip_document')
USE IN configuratie_tip_document
ENDIF
*----------------------------------------------------------------------------------------
* A. creare lenesa
gcCaz = "[A-lenes] "
DO Assert WITH !USED('configuratie_tip_document'), "cursorul NU exista inainte de primul apel"
PRIVATE loRes0
loRes0 = configurare_tip_document(3, .F., .F.)
DO Assert WITH USED('configuratie_tip_document'), "cursorul exista dupa primul apel"
*----------------------------------------------------------------------------------------
* B. multimea de tipuri
gcCaz = "[B-multime] "
PRIVATE lcTipuri
lcTipuri = ""
SELECT DISTINCT tip FROM configuratie_tip_document ORDER BY tip INTO CURSOR crs_tipuri_test
SELECT crs_tipuri_test
SCAN
lcTipuri = lcTipuri + IIF(EMPTY(lcTipuri), "", ",") + TRANSFORM(tip)
ENDSCAN
USE IN crs_tipuri_test
DO Assert WITH lcTipuri == "-2,-1,1,2,3,4,5,6,7,8,9,10,21,22,23,24,25,26,28,29,41,42,47", "multimea de tipuri = " + lcTipuri
*----------------------------------------------------------------------------------------
* C. campurile fiecarui tip, cate o asertiune per camp
DO Verifica WITH 1, [], [], [Cantitate in stoc], [Acest articol nu este pe stoc!], .F., .T., .F., .T., [factura]
DO Verifica WITH 5, [], [], [Cantitate in stoc], [Acest articol nu este pe stoc!], .F., .T., .F., .T., [factura]
DO Verifica WITH 7, [], [], [Cantitate in stoc], [Acest articol nu este pe stoc!], .F., .T., .F., .T., [factura]
DO Verifica WITH 10, [], [], [Cantitate in stoc], [Acest articol nu este pe stoc!], .F., .T., .F., .T., [factura]
DO Verifica WITH 2, [FACTURA PE CTR.], [descriere], [Cantitate in stoc], [Acest articol nu este pe stoc!], .F., .T., .F., .F., [factura]
DO Verifica WITH 6, [FACTURA PE CTR.], [descriere], [Cantitate in stoc], [Acest articol nu este pe stoc!], .F., .T., .F., .F., [factura]
DO Verifica WITH 3, [FACTURA LA COMANDA], [descriere], [Cantitate comandata], [A fost facturata intreaga cantitate comandata pentru acest articol!], .F., .T., .T., .F., [factura]
DO Verifica WITH 4, [FACTURA DIN AVIZE], [], [], [A fost facturata intreaga cantitate de pe aviz pentru acest articol!], .T., .F., .T., .F., [factura]
DO Verifica WITH 21, [AVIZ DE EXPEDITIE DIN COMANDA], [], [], [A fost avizata intreaga cantitate comandata pentru acest articol!], .T., .T., .T., .F., [aviz]
DO Verifica WITH 28, [AVIZ DE EXPEDITIE DIN COMANDA], [], [], [A fost avizata intreaga cantitate comandata pentru acest articol!], .T., .T., .T., .F., [aviz]
DO Verifica WITH 42, [AVIZ DE EXPEDITIE DIN COMANDA], [], [], [A fost avizata intreaga cantitate comandata pentru acest articol!], .T., .T., .T., .F., [aviz]
DO Verifica WITH 47, [AVIZ DE EXPEDITIE DIN COMANDA], [], [], [A fost avizata intreaga cantitate comandata pentru acest articol!], .T., .T., .T., .F., [aviz]
DO Verifica WITH 22, [AVIZ DE EXPEDITIE DIN LISTA DE PRETURI], [], [], [Acest articol nu este pe stoc!], .T., .T., .F., .F., [aviz]
DO Verifica WITH 29, [AVIZ DE EXPEDITIE DIN LISTA DE PRETURI], [], [], [Acest articol nu este pe stoc!], .T., .T., .F., .F., [aviz]
DO Verifica WITH 23, [TRANSFER <20>NTRE SUBUNITATI], [], [], [Acest articol nu este pe stoc!], .T., .T., .F., .F., [aviz]
DO Verifica WITH 41, [RETUR TRANSFER], [], [], [Acest articol nu este pe stoc!], .T., .T., .F., .F., [aviz]
DO Verifica WITH 25, [TRANSFER <20>NTRE SUBUNITATI PE BAZA DE COMANDA], [], [], [A fost avizata intreaga cantitate comandata pentru acest articol!], .T., .T., .T., .F., [aviz]
DO Verifica WITH 26, [AVIZ DE EXPEDITIE DIN CONTRACTUL], [descriere], [Cantitate in stoc], [Acest articol nu este pe stoc!], .T., .T., .F., .F., [aviz]
DO Verifica WITH 8, [], [], [Cant. max. de returnat], [Nu se mai poate face retur pentru acest articol!], .F., .F., .T., .F., [factura]
DO Verifica WITH 9, [], [], [Cant. max. de returnat], [Nu se mai poate face retur pentru acest articol!], .F., .F., .T., .F., [factura]
DO Verifica WITH 24, [RETUR AVIZ DE EXPEDITIE], [], [Cant. max. de returnat], [Nu se mai poate face retur pentru acest articol!], .F., .T., .T., .F., [factura]
*----------------------------------------------------------------------------------------
* D. prioritate
gcCaz = "[D-prioritate] "
PRIVATE loP, loC, loT
loP = configurare_tip_document(3, .T., .F.)
DO Assert WITH VARTYPE(loP) = 'O' AND ALLTRIM(loP.titlu) == "PROFORMA", "proforma are prioritate peste tip=3"
loC = configurare_tip_document(3, .F., .T.)
DO Assert WITH VARTYPE(loC) = 'O' AND ALLTRIM(loC.titlu) == "COPIERE FACTURA/AVIZ", "copiere are prioritate peste tip=3 (cand nu e proforma)"
DO Assert WITH ALLTRIM(loC.mesaj_stoc) == "A fost facturata intreaga cantitate pentru acest articol!", "mesaj_stoc pe randul de copiere"
loT = configurare_tip_document(3, .F., .F.)
DO Assert WITH VARTYPE(loT) = 'O' AND ALLTRIM(loT.titlu) == "FACTURA LA COMANDA", "fara proforma/copiere se intoarce randul propriu al tipului 3"
*----------------------------------------------------------------------------------------
* E. tip necunoscut
gcCaz = "[E-necunoscut] "
PRIVATE loU
loU = configurare_tip_document(99, .F., .F.)
DO Assert WITH ISNULL(loU), "tip necunoscut (99) intoarce .Null."
*----------------------------------------------------------------------------------------
* F. Select() neschimbat
gcCaz = "[F-select] "
IF USED('crsalias_test')
USE IN crsalias_test
ENDIF
CREATE CURSOR crsalias_test (x N(1))
SELECT crsalias_test
PRIVATE lcAliasInainte, loResF
lcAliasInainte = ALIAS()
loResF = configurare_tip_document(4, .F., .F.)
DO Assert WITH ALIAS() == lcAliasInainte, "Select() al apelantului neschimbat dupa apel (era " + lcAliasInainte + ", e " + ALIAS() + ")"
USE IN crsalias_test
DO Final
*----------------------------------------------------------------------------------------
PROCEDURE Verifica
LPARAMETERS tnTip, tcTitlu, tcSufix, tcCap, tcMesaj, tlAscunde, tlSterge, tlTot, tlRetur, tcTipDoc
LOCAL loRes
gcCaz = "[tip=" + TRANSFORM(tnTip) + "] "
loRes = configurare_tip_document(tnTip, .F., .F.)
DO Assert WITH VARTYPE(loRes) = 'O', "randul exista (nu e .Null.)"
IF VARTYPE(loRes) <> 'O'
RETURN
ENDIF
DO Assert WITH ALLTRIM(loRes.titlu) == tcTitlu, "titlu asteptat [" + tcTitlu + "] gasit [" + ALLTRIM(loRes.titlu) + "]"
DO Assert WITH ALLTRIM(loRes.sufix_titlu) == tcSufix, "sufix_titlu asteptat [" + tcSufix + "] gasit [" + ALLTRIM(loRes.sufix_titlu) + "]"
DO Assert WITH ALLTRIM(loRes.cap_cantitate) == tcCap, "cap_cantitate asteptat [" + tcCap + "] gasit [" + ALLTRIM(loRes.cap_cantitate) + "]"
DO Assert WITH ALLTRIM(loRes.mesaj_stoc) == tcMesaj, "mesaj_stoc asteptat [" + tcMesaj + "] gasit [" + ALLTRIM(loRes.mesaj_stoc) + "]"
DO Assert WITH loRes.ascunde_discount = tlAscunde, "ascunde_discount asteptat " + TRANSFORM(tlAscunde) + " gasit " + TRANSFORM(loRes.ascunde_discount)
DO Assert WITH loRes.sterge_serie = tlSterge, "sterge_serie asteptat " + TRANSFORM(tlSterge) + " gasit " + TRANSFORM(loRes.sterge_serie)
DO Assert WITH loRes.buton_tot = tlTot, "buton_tot asteptat " + TRANSFORM(tlTot) + " gasit " + TRANSFORM(loRes.buton_tot)
DO Assert WITH loRes.buton_retur = tlRetur, "buton_retur asteptat " + TRANSFORM(tlRetur) + " gasit " + TRANSFORM(loRes.buton_retur)
DO Assert WITH ALLTRIM(loRes.tip_doc) == tcTipDoc, "tip_doc asteptat [" + tcTipDoc + "] gasit [" + ALLTRIM(loRes.tip_doc) + "]"
ENDPROC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL: " + gcCaz + tcMsg
ENDIF
ENDPROC
PROCEDURE AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + tcProg + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10)
gnFail = gnFail + 1
DO AfLog WITH "ERR: " + gcCaz + TRANSFORM(tnErr) + " " + tcMsg + " (" + tcProg + ":" + TRANSFORM(tnLine) + ")"
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,228 @@
* test_s5_3a_config_a_b_c.prg
* Headless: legarea configuratiei per tip de document (S5-3a) in frm_facturare_articole2.Init -
* diferentiatorii A (titlu, lb_titlu_alb_b121), B (cap coloana cantitate, grd_factura.cCantitate.header1)
* si C (mesaj de stoc, cmesaj_cantitate), pentru toate cele 21 de tipuri + eProforma + lCopiere.
*
* Literalii asteptati sunt luati din docs\verificare_s5_tabel_sursa.md sectiunea 1b (formularul
* VECHI, sursa de comportament), NU din cursorul din COMUN\programe\ofacturare.prg - ca sa prinda
* si o eventuala greseala de transcriere in cursor, nu doar o neconcordanta intre cursor si Init.
* Diacriticul "I cu sedila" (0xCE in cp1250) e scris cu CHR(206), nu ca literal in fisier, ca sa
* nu depinda de encoding-ul sursei .prg.
*
* B: capul de coloana e citit direct de pe obiectul static grd_factura.cCantitate.header1.Caption -
* nu trece prin ColumnCount/RecordSource (capcana cunoscuta de nematerializare a grid-urilor sub
* -A -T se aplica generarii automate de coloane, nu unui obiect static definit in clasa); testat
* explicit cu TYPE() inainte de citire, ca sa nu falsifice proba daca totusi nu e disponibil.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s5_3a_config_a_b_c.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5_3a_config_a_b_c.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; seriile de facturi (tipdoc 5) sunt pe utilizator -> gnIdUtil = 8.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gcCaz
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5_3a_config_a_b_c.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
gcCaz = ""
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
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
DO AfLog WITH "ENV OK"
* gridextras.vcx e referit din ofacturare.vcx cu cale relativa (..\utile\gridextras), rezolvabila doar din exe/IDE
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
PRIVATE poDate, poGeneratorNumere
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
gnScadereStoc = 0
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'
* grd_factura.cGestiune e legat la crsFactura.gestiune, camp inexistent in creeaza_facturacrs (nume_gestiune)
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
PRIVATE lcDescriere
LOCAL lcDefTitlu, lcDefCap, lcDefMesaj, lcIntre
lcDefTitlu = "FACTURA"
lcDefCap = "Cantitate"
lcDefMesaj = "Acest articol nu este pe stoc!"
lcDescriere = "TEST DESCRIERE S5-3A"
lcIntre = CHR(206) + "NTRE"
* tabel: tip, titlu asteptat, cap coloana asteptat, mesaj de stoc asteptat, nIdTipDoc (5=factura, 6=aviz)
DO Caz WITH 1, lcDefTitlu, "Cantitate in stoc", lcDefMesaj, 5
DO Caz WITH 5, lcDefTitlu, "Cantitate in stoc", lcDefMesaj, 5
DO Caz WITH 7, lcDefTitlu, "Cantitate in stoc", lcDefMesaj, 5
DO Caz WITH 10, lcDefTitlu, "Cantitate in stoc", lcDefMesaj, 5
DO Caz WITH 2, "FACTURA PE CTR. " + lcDescriere, "Cantitate in stoc", lcDefMesaj, 5
DO Caz WITH 6, "FACTURA PE CTR. " + lcDescriere, "Cantitate in stoc", lcDefMesaj, 5
DO Caz WITH 3, "FACTURA LA COMANDA " + lcDescriere, "Cantitate comandata", "A fost facturata intreaga cantitate comandata pentru acest articol!", 5
DO Caz WITH 4, "FACTURA DIN AVIZE", lcDefCap, "A fost facturata intreaga cantitate de pe aviz pentru acest articol!", 5
DO Caz WITH 21, "AVIZ DE EXPEDITIE DIN COMANDA", lcDefCap, "A fost avizata intreaga cantitate comandata pentru acest articol!", 6
DO Caz WITH 28, "AVIZ DE EXPEDITIE DIN COMANDA", lcDefCap, "A fost avizata intreaga cantitate comandata pentru acest articol!", 6
DO Caz WITH 42, "AVIZ DE EXPEDITIE DIN COMANDA", lcDefCap, "A fost avizata intreaga cantitate comandata pentru acest articol!", 6
DO Caz WITH 47, "AVIZ DE EXPEDITIE DIN COMANDA", lcDefCap, "A fost avizata intreaga cantitate comandata pentru acest articol!", 6
DO Caz WITH 22, "AVIZ DE EXPEDITIE DIN LISTA DE PRETURI", lcDefCap, lcDefMesaj, 6
DO Caz WITH 29, "AVIZ DE EXPEDITIE DIN LISTA DE PRETURI", lcDefCap, lcDefMesaj, 6
DO Caz WITH 23, "TRANSFER " + lcIntre + " SUBUNITATI", lcDefCap, lcDefMesaj, 6
DO Caz WITH 41, "RETUR TRANSFER", lcDefCap, lcDefMesaj, 6
DO Caz WITH 25, "TRANSFER " + lcIntre + " SUBUNITATI PE BAZA DE COMANDA", lcDefCap, "A fost avizata intreaga cantitate comandata pentru acest articol!", 6
DO Caz WITH 26, "AVIZ DE EXPEDITIE DIN CONTRACTUL " + lcDescriere, "Cantitate in stoc", lcDefMesaj, 6
DO Caz WITH 8, lcDefTitlu, "Cant. max. de returnat", "Nu se mai poate face retur pentru acest articol!", 5
DO Caz WITH 9, lcDefTitlu, "Cant. max. de returnat", "Nu se mai poate face retur pentru acest articol!", 5
DO Caz WITH 24, "RETUR AVIZ DE EXPEDITIE", "Cant. max. de returnat", "Nu se mai poate face retur pentru acest articol!", 5
* eProforma: prioritate peste orice tip - testat pe tipul 1, care altfel ar seta alt cap/mesaj/titlu
DO CazEProforma WITH 1, "PROFORMA", lcDefCap, lcDefMesaj, 5
* lCopiere: prioritate peste tip - testat pe tipul 2, care altfel ar seta alt titlu/cap/mesaj
DO CazCopiere WITH 2, "COPIERE FACTURA/AVIZ " + lcDescriere, "Cantitate maxima", "A fost facturata intreaga cantitate pentru acest articol!", 5
DO Final
*----------------------------------------------------------------------------------------
PROCEDURE Caz
LPARAMETERS tnTip, tcTitluAst, tcCapAst, tcMesajAst, tnIdTipDoc
LOCAL loNou, lcCapReal
gcCaz = "[tip=" + TRANSFORM(tnTip) + "] "
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", 25000 + tnTip, tnTip)
poDate.nIdTipDoc = tnIdTipDoc
poDate.descriere = lcDescriere
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(tnIdTipDoc)
loNou = CREATEOBJECT('frm_facturare_articole2')
IF VARTYPE(loNou) <> 'O'
DO Assert WITH .F., "Createobject frm_facturare_articole2"
RETURN
ENDIF
DO Verifica WITH loNou, tcTitluAst, tcCapAst, tcMesajAst
loNou.Release()
RELEASE loNou
IF poDate.rezultat_serii <> 0
poGeneratorNumere.dezaloca_numar(tnIdTipDoc)
ENDIF
ENDPROC
PROCEDURE CazEProforma
LPARAMETERS tnTip, tcTitluAst, tcCapAst, tcMesajAst, tnIdTipDoc
LOCAL loNou
gcCaz = "[eProforma tip=" + TRANSFORM(tnTip) + "] "
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", 25100 + tnTip, tnTip)
poDate.nIdTipDoc = tnIdTipDoc
poDate.descriere = lcDescriere
poDate.eProforma = 1
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(tnIdTipDoc)
loNou = CREATEOBJECT('frm_facturare_articole2')
IF VARTYPE(loNou) <> 'O'
DO Assert WITH .F., "Createobject frm_facturare_articole2 (eProforma)"
RETURN
ENDIF
DO Verifica WITH loNou, tcTitluAst, tcCapAst, tcMesajAst
loNou.Release()
RELEASE loNou
IF poDate.rezultat_serii <> 0
poGeneratorNumere.dezaloca_numar(tnIdTipDoc)
ENDIF
ENDPROC
PROCEDURE CazCopiere
LPARAMETERS tnTip, tcTitluAst, tcCapAst, tcMesajAst, tnIdTipDoc
LOCAL loNou, loSursa
gcCaz = "[lCopiere tip=" + TRANSFORM(tnTip) + "] "
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", 25200 + tnTip, tnTip)
poDate.nIdTipDoc = tnIdTipDoc
poDate.descriere = lcDescriere
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(tnIdTipDoc)
loSursa = CREATEOBJECT('Custom')
loNou = CREATEOBJECT('frm_facturare_articole2', loSursa)
IF VARTYPE(loNou) <> 'O'
DO Assert WITH .F., "Createobject frm_facturare_articole2 cu toFactura"
RETURN
ENDIF
DO Assert WITH loNou.lCopiere, "lCopiere trebuie sa fie .T. cand toFactura e obiect"
DO Verifica WITH loNou, tcTitluAst, tcCapAst, tcMesajAst
loNou.Release()
RELEASE loNou
IF poDate.rezultat_serii <> 0
poGeneratorNumere.dezaloca_numar(tnIdTipDoc)
ENDIF
ENDPROC
PROCEDURE Verifica
LPARAMETERS toNou, tcTitluAst, tcCapAst, tcMesajAst
LOCAL lcCapReal
DO Assert WITH toNou.Lb_titlu_alb_b121.Caption == tcTitluAst, "A titlu=[" + toNou.Lb_titlu_alb_b121.Caption + "] asteptat=[" + tcTitluAst + "]"
IF TYPE('toNou.grd_factura.cCantitate.header1.Caption') == 'C'
lcCapReal = toNou.grd_factura.cCantitate.header1.Caption
DO Assert WITH lcCapReal == tcCapAst, "B cap=[" + lcCapReal + "] asteptat=[" + tcCapAst + "]"
ELSE
DO AfLog WITH gcCaz + "NEVERIFICABIL headless: grd_factura.cCantitate.header1.Caption TYPE()=" + TYPE('toNou.grd_factura.cCantitate.header1.Caption')
ENDIF
DO Assert WITH toNou.cmesaj_cantitate == tcMesajAst, "C mesaj=[" + toNou.cmesaj_cantitate + "] asteptat=[" + tcMesajAst + "]"
ENDPROC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL: " + gcCaz + 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
DO AfLog WITH "ERROR " + gcCaz + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,297 @@
* test_s5_3b_discount_serie.prg
* Headless: S5-3b in frm_facturare_articole2.Init - D (ascunderea zonei de discount pe factura)
* si E (eliminarea coloanei cSerie din grd_factura), pentru toate cele 21 de tipuri +
* eProforma + lCopiere, plus reasezarea benzii de totaluri (aseaza_totaluri).
*
* Valorile asteptate pentru D si E sunt scrise HARDCODAT din v1 (nu citite din cursorul
* COMUN\programe\ofacturare.prg), ca sa prinda si o eventuala greseala de transcriere in cursor:
* D (ascunde_discount = .T., 11 tipuri): ofacturare.vc2 (v1) :15304,15323,15333,15342,15352,15361,15371
* -> 4, {21,28,42,47}, {22,29}, 23, 41, 25, 26
* E (sterge_serie = .T., 18 tipuri): confirmat pe v1 de orchestrator -
* 1, 2, 3, 5, 6, 7, 10, 21, 22, 23, 24, 25, 26, 28, 29, 41, 42, 47
* Non-regresie: ck_discountevidentiat.Visible ramane .T. pe toate cazurile (paritate v1 - nu e
* in clb_discount pe v1, tine de discountul pe articole).
*
* ColumnCount asteptat: 14 - (1 daca sterge_serie) - (3, pentru ca poDate.in_valuta ramane la
* valoarea implicita 0 din oDateFactura -> ramura care sterge cVpretFtva/cVdiscountftva/
* cVvaldiminuatftva, ofacturare.vc2:20887-20891).
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s5_3b_discount_serie.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5_3b_discount_serie.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; seriile de facturi (tipdoc 5) sunt pe utilizator -> gnIdUtil = 8.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gcCaz
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5_3b_discount_serie.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
gcCaz = ""
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
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
DO AfLog WITH "ENV OK"
* gridextras.vcx e referit din ofacturare.vcx cu cale relativa (..\utile\gridextras), rezolvabila doar din exe/IDE
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
PRIVATE poDate, poGeneratorNumere
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
gnScadereStoc = 0
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'
* grd_factura.cGestiune e legat la crsFactura.gestiune, camp inexistent in creeaza_facturacrs (nume_gestiune)
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
* tabel: tip, nIdTipDoc (5=factura,6=aviz), ascunde_discount asteptat, sterge_serie asteptat
DO Caz WITH 1, 5, .F., .T.
DO Caz WITH 5, 5, .F., .T.
DO Caz WITH 7, 5, .F., .T.
DO Caz WITH 10, 5, .F., .T.
DO Caz WITH 2, 5, .F., .T.
DO Caz WITH 6, 5, .F., .T.
DO Caz WITH 3, 5, .F., .T.
DO Caz WITH 4, 5, .T., .F.
DO Caz WITH 21, 6, .T., .T.
DO Caz WITH 28, 6, .T., .T.
DO Caz WITH 42, 6, .T., .T.
DO Caz WITH 47, 6, .T., .T.
DO Caz WITH 22, 6, .T., .T.
DO Caz WITH 29, 6, .T., .T.
DO Caz WITH 23, 6, .T., .T.
DO Caz WITH 41, 6, .T., .T.
DO Caz WITH 25, 6, .T., .T.
DO Caz WITH 26, 6, .T., .T.
DO Caz WITH 8, 5, .F., .F.
DO Caz WITH 9, 5, .F., .F.
DO Caz WITH 24, 5, .F., .T.
* eProforma si lCopiere: pe v1 ambele campuri (ascunde_discount, sterge_serie) sunt .F. - vezi §8 din propunere
DO CazEProforma WITH 1, 5, .F., .F.
DO CazCopiere WITH 2, 5, .F., .F.
DO Reasezare
DO Final
*----------------------------------------------------------------------------------------
PROCEDURE Caz
LPARAMETERS tnTip, tnIdTipDoc, tlAscundeAst, tlStergeAst
LOCAL loNou
gcCaz = "[tip=" + TRANSFORM(tnTip) + "] "
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", 26000 + tnTip, tnTip)
poDate.nIdTipDoc = tnIdTipDoc
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(tnIdTipDoc)
loNou = CREATEOBJECT('frm_facturare_articole2')
IF VARTYPE(loNou) <> 'O'
DO Assert WITH .F., "Createobject frm_facturare_articole2"
RETURN
ENDIF
DO Verifica WITH loNou, tnTip, tlAscundeAst, tlStergeAst
loNou.Release()
RELEASE loNou
IF poDate.rezultat_serii <> 0
poGeneratorNumere.dezaloca_numar(tnIdTipDoc)
ENDIF
ENDPROC
PROCEDURE CazEProforma
LPARAMETERS tnTip, tnIdTipDoc, tlAscundeAst, tlStergeAst
LOCAL loNou
gcCaz = "[eProforma tip=" + TRANSFORM(tnTip) + "] "
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", 26100 + tnTip, tnTip)
poDate.nIdTipDoc = tnIdTipDoc
poDate.eProforma = 1
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(tnIdTipDoc)
loNou = CREATEOBJECT('frm_facturare_articole2')
IF VARTYPE(loNou) <> 'O'
DO Assert WITH .F., "Createobject frm_facturare_articole2 (eProforma)"
RETURN
ENDIF
DO Verifica WITH loNou, tnTip, tlAscundeAst, tlStergeAst
loNou.Release()
RELEASE loNou
IF poDate.rezultat_serii <> 0
poGeneratorNumere.dezaloca_numar(tnIdTipDoc)
ENDIF
ENDPROC
PROCEDURE CazCopiere
LPARAMETERS tnTip, tnIdTipDoc, tlAscundeAst, tlStergeAst
LOCAL loNou, loSursa
gcCaz = "[lCopiere tip=" + TRANSFORM(tnTip) + "] "
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", 26200 + tnTip, tnTip)
poDate.nIdTipDoc = tnIdTipDoc
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(tnIdTipDoc)
loSursa = CREATEOBJECT('Custom')
loNou = CREATEOBJECT('frm_facturare_articole2', loSursa)
IF VARTYPE(loNou) <> 'O'
DO Assert WITH .F., "Createobject frm_facturare_articole2 cu toFactura"
RETURN
ENDIF
DO Verifica WITH loNou, tnTip, tlAscundeAst, tlStergeAst
loNou.Release()
RELEASE loNou
IF poDate.rezultat_serii <> 0
poGeneratorNumere.dezaloca_numar(tnIdTipDoc)
ENDIF
ENDPROC
PROCEDURE Verifica
LPARAMETERS toNou, tnTip, tlAscundeAst, tlStergeAst
LOCAL lnColAst, lnColBaza
* D - vizibilitatea zonei de discount pe factura
DO Assert WITH toNou.lb_disc_factura.Visible == !tlAscundeAst, "D lb_disc_factura.Visible=" + TRANSFORM(toNou.lb_disc_factura.Visible) + " asteptat=" + TRANSFORM(!tlAscundeAst)
DO Assert WITH toNou.tx_disc_factura_nat.Visible == !tlAscundeAst, "D tx_disc_factura_nat.Visible=" + TRANSFORM(toNou.tx_disc_factura_nat.Visible) + " asteptat=" + TRANSFORM(!tlAscundeAst)
DO Assert WITH toNou.lb_disc_factura_ron.Visible == !tlAscundeAst, "D lb_disc_factura_ron.Visible=" + TRANSFORM(toNou.lb_disc_factura_ron.Visible) + " asteptat=" + TRANSFORM(!tlAscundeAst)
DO Assert WITH toNou.tx_disc_factura_procent.Visible == !tlAscundeAst, "D tx_disc_factura_procent.Visible=" + TRANSFORM(toNou.tx_disc_factura_procent.Visible) + " asteptat=" + TRANSFORM(!tlAscundeAst)
DO Assert WITH toNou.lb_disc_factura_procent_semn.Visible == !tlAscundeAst, "D lb_disc_factura_procent_semn.Visible=" + TRANSFORM(toNou.lb_disc_factura_procent_semn.Visible) + " asteptat=" + TRANSFORM(!tlAscundeAst)
DO Assert WITH toNou.clb_motiv_discount.Visible == !tlAscundeAst, "D clb_motiv_discount.Visible=" + TRANSFORM(toNou.clb_motiv_discount.Visible) + " asteptat=" + TRANSFORM(!tlAscundeAst)
* Non-regresie: ck_discountevidentiat nu se ascunde niciodata (tine de discountul pe articole)
DO Assert WITH toNou.ck_discountevidentiat.Visible == .T., "D ck_discountevidentiat.Visible=" + TRANSFORM(toNou.ck_discountevidentiat.Visible) + " asteptat=.T. (non-regresie)"
* E - coloana cSerie
* Grid nu are colectia .Objects (doar .Columns), deci do_exista_obiect() arunca eroare pe un
* Grid; TYPE()/PEMSTATUS raman .T./'O' dupa RemoveObject (vezi memoria pemstatus-dupa-removeobject).
* Existenta reala se verifica prin bucla pe .Columns(i).Name, ca do_exista_obiect dar pe colectia
* corecta pentru Grid.
LOCAL llCSerieExista, lnI
llCSerieExista = .F.
FOR lnI = 1 TO toNou.grd_factura.ColumnCount
IF UPPER(toNou.grd_factura.Columns(lnI).Name) == "CSERIE"
llCSerieExista = .T.
EXIT
ENDIF
ENDFOR
DO Assert WITH llCSerieExista == !tlStergeAst, "E cSerie exista=" + TRANSFORM(llCSerieExista) + " asteptat=" + TRANSFORM(!tlStergeAst)
* Init:20887-20895 sterge 3 coloane (cVpretFtva/cVdiscountftva/cVvaldiminuatftva) daca
* poDate.in_valuta = 0, altfel 4 (cPretFtva/cDiscountctva/cPretCtva/cValdiminuatctva).
* oDateFactura.Init seteaza in_valuta = 1 pentru tnTip in (5,6,7,9,10,52) - ofacturare_comun.prg:254.
lnColBaza = IIF(INLIST(tnTip, 5, 6, 7, 9, 10, 52), 14 - 4, 14 - 3)
lnColAst = lnColBaza - IIF(tlStergeAst, 1, 0)
DO Assert WITH toNou.grd_factura.ColumnCount == lnColAst, "E ColumnCount=" + TRANSFORM(toNou.grd_factura.ColumnCount) + " asteptat=" + TRANSFORM(lnColAst)
ENDPROC
PROCEDURE Reasezare
LOCAL loVizibil, loAscuns, lnGap, lnCkAst
gcCaz = "[reasezare] "
lnGap = 24
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", 26301, 1)
poDate.nIdTipDoc = 5
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(5)
loVizibil = CREATEOBJECT('frm_facturare_articole2')
IF poDate.rezultat_serii <> 0
poGeneratorNumere.dezaloca_numar(5)
ENDIF
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", 26304, 4)
poDate.nIdTipDoc = 5
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(5)
loAscuns = CREATEOBJECT('frm_facturare_articole2')
IF poDate.rezultat_serii <> 0
poGeneratorNumere.dezaloca_numar(5)
ENDIF
IF VARTYPE(loVizibil) <> 'O' OR VARTYPE(loAscuns) <> 'O'
DO Assert WITH .F., "Createobject pentru reasezare (tip 1 / tip 4)"
ELSE
* lb_total_tva are Anchor=12 (jos+dreapta - vezi ofacturare.vc2:17942). Creat fara .Show(),
* motorul de anchor al VFP repozitioneaza controalele ancorate la dreapta pastrand offsetul
* design-time fata de marginea din dreapta a formularului, suprascriind orice .Left pus
* programatic in Init - Left ramane 689 (design-time, ofacturare.vc2:17944) indiferent de
* ascunde_discount. E acelasi tipar ca "Anchor=4 face Top design-time sa conteze la rulare"
* (memoria vfp anchor), generalizat la ancorarea pe dreapta; nu e o regresie a S5-3b - firul
* de cod This.lb_total_tva.Left = lnLeft (aseaza_totaluri:18459) e neschimbat, doar ramura de
* care depinde lnLeft e noua. Proba pe lb_total_tva.Left necesita fereastra reala (§9.2,
* datorie deschisa); aici se verifica reasezarea prin ck_discountevidentiat (Anchor=4).
DO AfLog WITH "DIAG lb_total_tva.Left vizibil=" + TRANSFORM(loVizibil.lb_total_tva.Left) + " ascuns=" + TRANSFORM(loAscuns.lb_total_tva.Left) + " (Anchor=12 - neconcludent fara .Show(), vezi comentariu)"
DO Assert WITH loAscuns.ck_discountevidentiat.Left < loVizibil.ck_discountevidentiat.Left, "reasezare ck_discountevidentiat.Left ascuns=" + TRANSFORM(loAscuns.ck_discountevidentiat.Left) + " vizibil=" + TRANSFORM(loVizibil.ck_discountevidentiat.Left)
lnCkAst = MAX(loAscuns.lb_disc_articole.Left + loAscuns.lb_disc_articole.Width, loAscuns.lb_disc_articole_ron.Left + loAscuns.lb_disc_articole_ron.Width) + lnGap
DO Assert WITH loAscuns.ck_discountevidentiat.Left == lnCkAst, "reasezare ck_discountevidentiat.Left=" + TRANSFORM(loAscuns.ck_discountevidentiat.Left) + " asteptat=" + TRANSFORM(lnCkAst)
ENDIF
IF VARTYPE(loVizibil) == 'O'
loVizibil.Release()
ENDIF
RELEASE loVizibil
IF VARTYPE(loAscuns) == 'O'
loAscuns.Release()
ENDIF
RELEASE loAscuns
ENDPROC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL: " + gcCaz + 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
DO AfLog WITH "ERROR " + gcCaz + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,413 @@
* test_s5_benzi2_ui.prg
* UI VIZIBIL: capturi + geometrie pe frm_facturare_articole2 (COMUN\clase\ofacturare.vc2) dupa
* restructurarea S7 - cele 30 de controale de sub grila mutate in ct_document / ct_contabilitate /
* ct_livrare / ct_incasare, iar comutarea mutata pe casetele chk_alte_date / chk_incasare.
* Masoara cele patru combinatii de casete: 0/0, 1/0, 0/1, 1/1.
*
* Enumerarea e RECURSIVA (vezi DumpSiAnalizeaza): o parcurgere plata a lui Thisform.Objects nu mai
* vede controalele mutate in containere si ar raporta tacut "lipsa".
*
* Rulare: powershell -ExecutionPolicy Bypass -File test_s5_benzi2_ui.ps1 (timeout >= 300s)
* Log: facturare_unificat\test_s5_benzi2_ui_log.txt ; capturi in screenshots_benzi2_S7_28_08\ ;
* geometrie in out\geom_benzi2_S7_28_08_<eticheta>.tsv (baseline nou, sect. 10.3 - nu atinge
* familia geom_benzi2_27_08_* / geom_grila_benzi2_27_08_*, criteriu inca valabil)
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcUILog, gcSyncDir, gnFail, gnPass
gcUILog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s5_benzi2_ui_log.txt"
gcSyncDir = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\uisync_benzi2_S7_28_08\"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
gnFail = 0
gnPass = 0
PUBLIC gcRaport
gcRaport = ""
* arii pentru dump-ul recursiv; gnTrunc semnaleaza depasirea plafonului (altfel truncherea e tacuta)
PUBLIC gnN, gnTrunc, gnHGrila00, gnHGrila11
PUBLIC ARRAY gaN[600], gaC[600], gaL[600], gaT[600], gaW[600], gaH[600], gaV[600], gaAL[600], gaAT[600], gaSk[600]
gnN = 0
gnTrunc = 0
gnHGrila00 = 0
gnHGrila11 = 0
ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out")
MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out"
ENDIF
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", "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.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
* seriile de facturi (tipdoc 5) si de incasare (3/16/26) sunt pe utilizator in MARIUSM_AUTO
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
DO AfLog WITH "gnScadereStoc=" + TRANSFORM(gnScadereStoc)
* gridextras.vcx e referit din ofacturare.vcx cu cale relativa, rezolvabila doar din exe/IDE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
* grd_factura.cCodMat.cboCodmat e declarat AS combosql OF cautare.vcx, dar clasa e in _cb_base.vcx
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
* cboTipFactura (RowSourceType=3) citeste cursorul local saft_tip_facturi ca pe un tabel -
* fara el deschis explicit, Createobject('frm_facturare_articole2') da "File 'saft_tip_facturi.dbf' does not exist"
IF !USED('saft_tip_facturi')
update_saft_tip_facturi()
ENDIF
PRIVATE poDate, poGeneratorNumere, loForm, lcTsv, lcRaportFile
lcRaportFile = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_benzi2_S7_28_08_raport.txt"
* document nou: poDate.incasat ramane 0 la construire - identic Scenariul A din test_s3b_incasare_nealocare.prg
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)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poGeneratorNumere.ResetNumere()
DO ProbaSerii WITH poDate.nIdTipDoc
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
DO Final
ENDIF
* ObjExists e recursiv: opt_incasat traieste acum in ct_incasare, nu la nivel de formular
DO Assert WITH ObjExists(loForm, 'ct_incasare'), "ct_incasare prezent (poDate.tip intre 1 si 4, deci grupul de incasare exista)"
DO Assert WITH ObjExists(loForm, 'opt_incasat'), "opt_incasat prezent (in ct_incasare)"
DO Assert WITH ObjExists(loForm, 'Ct_clb_agent'), "Ct_clb_agent prezent (in ct_livrare) - dovada ca enumerarea coboara in containere"
loForm.WindowType = 0
loForm.Show()
loForm.WindowState = 2
DOEVENTS FORCE
* pas0: stare initiala dupa Createobject - ambele casete nebifate (Value=0 design-time).
* Nu se comuta nimic aici: pasul masoara exact starea de dupa construire + maximizare.
DO AfLog WITH "PAS0 stare initiala: chk_alte_date=" + TRANSFORM(loForm.chk_alte_date.Value) + " chk_incasare=" + TRANSFORM(loForm.chk_incasare.Value)
DO VerificaStare WITH loForm, 0, 0, "PAS0 ambele inchise"
lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_benzi2_S7_28_08_stare_initiala.tsv"
DO DumpSiAnalizeaza WITH loForm, "ambele inchise (0/0)", lcTsv
DO HarnessStep WITH 0, 'stare_initiala', 6
* pas1: doar "Alte date" - caseta se seteaza INAINTE de comutare (metoda citeste caseta, nu invers)
loForm.chk_alte_date.Value = 1
loForm.do_comuta_alte_date()
DOEVENTS FORCE
DO AfLog WITH "PAS1 doar alte date: chk_alte_date=" + TRANSFORM(loForm.chk_alte_date.Value) + " chk_incasare=" + TRANSFORM(loForm.chk_incasare.Value)
DO VerificaStare WITH loForm, 1, 0, "PAS1 doar alte date"
lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_benzi2_S7_28_08_alte_date.tsv"
DO DumpSiAnalizeaza WITH loForm, "doar alte date (1/0)", lcTsv
DO HarnessStep WITH 1, 'alte_date_deschis', 6
* pas2: doar "Incasare" - alte date se inchide la loc, incasarea se deschide.
* Bifarea aloca o incasare reala (chitanta) in MARIUSM_AUTO - vezi curatenia de la final.
loForm.chk_alte_date.Value = 0
loForm.do_comuta_alte_date()
loForm.chk_incasare.Value = 1
loForm.do_comuta_incasare()
DOEVENTS FORCE
DO AfLog WITH "PAS2 doar incasare: chk_alte_date=" + TRANSFORM(loForm.chk_alte_date.Value) + " chk_incasare=" + TRANSFORM(loForm.chk_incasare.Value) + " nmod=" + TRANSFORM(loForm.nmod_incasare())
DO VerificaStare WITH loForm, 0, 1, "PAS2 doar incasare"
lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_benzi2_S7_28_08_incasare.tsv"
DO DumpSiAnalizeaza WITH loForm, "doar incasare (0/1)", lcTsv
DO HarnessStep WITH 2, 'incasare_deschis', 6
* pas3: ambele deschise
loForm.chk_alte_date.Value = 1
loForm.do_comuta_alte_date()
DOEVENTS FORCE
DO AfLog WITH "PAS3 ambele deschise: chk_alte_date=" + TRANSFORM(loForm.chk_alte_date.Value) + " chk_incasare=" + TRANSFORM(loForm.chk_incasare.Value)
DO VerificaStare WITH loForm, 1, 1, "PAS3 ambele deschise"
lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_benzi2_S7_28_08_ambele.tsv"
DO DumpSiAnalizeaza WITH loForm, "ambele deschise (1/1)", lcTsv
DO HarnessStep WITH 3, 'ambele_deschise', 6
* grila e maxima cu ambele casete inchise si minima cu ambele deschise
DO Assert WITH gnHGrila00 > gnHGrila11, "grd_factura.Height: maxim la 0/0 (" + TRANSFORM(gnHGrila00) + ") > minim la 1/1 (" + TRANSFORM(gnHGrila11) + ")"
DO Assert WITH gnTrunc = 0, "dump recursiv fara truncare (plafon 600 obiecte)"
STRTOFILE(gcRaport, lcRaportFile)
DO AfLog WITH "Raport geometrie scris in " + lcRaportFile
* Curatenie obligatorie: bifarea casetei la pasul 2 a alocat o chitanta reala (sect. 8.3 punctul 2).
* Debifarea ruleaza ramura "fara incasare" din actualizeaza_tipincasare, care dezaloca 16/3/26.
loForm.chk_incasare.Value = 0
loForm.do_comuta_incasare()
DO AfLog WITH "curatenie: chk_incasare=0, nmod=" + TRANSFORM(loForm.nmod_incasare()) + " poDate.incasat=" + TRANSFORM(poDate.incasat)
DO Assert WITH loForm.nmod_incasare() = 1, "dupa curatenie: nmod_incasare()=1 (fara incasare)"
DO Assert WITH poDate.incasat = 0, "dupa curatenie: poDate.incasat=0 (numarul de chitanta dezalocat)"
loForm.Release()
RELEASE loForm
DO Final
*----------------------------------------------------------------------------------------
PROCEDURE VerificaStare
* Asertiile sect. 10.4 pentru o combinatie de casete. Inaltimile/offseturile sunt constantele
* design-time ale containerelor (ct_incasare 96, ct_document->ct_livrare 268, decalaje 96/176),
* nu valori citite din oasezareoffset - altfel testul s-ar verifica pe sine.
LPARAMETERS toForm, tnAlte, tnInc, tcEticheta
LOCAL llAlte, llInc, lnHLinie, lnHInc, lnHAlte, lnGap, lnLinieTop, lnAlteTop
llAlte = (tnAlte = 1)
llInc = (tnInc = 1)
DO Assert WITH toForm.chk_alte_date.Value = tnAlte, tcEticheta + ": chk_alte_date.Value=" + TRANSFORM(tnAlte)
DO Assert WITH toForm.chk_incasare.Value = tnInc, tcEticheta + ": chk_incasare.Value=" + TRANSFORM(tnInc)
DO Assert WITH toForm.lalte_date_deschis = llAlte, tcEticheta + ": lalte_date_deschis sincronizat cu caseta"
DO Assert WITH toForm.lincasare_deschis = llInc, tcEticheta + ": lincasare_deschis sincronizat cu caseta"
DO Assert WITH toForm.ct_contabilitate.Visible = llAlte, tcEticheta + ": ct_contabilitate.Visible=" + TRANSFORM(llAlte)
DO Assert WITH toForm.ct_livrare.Visible = llAlte, tcEticheta + ": ct_livrare.Visible=" + TRANSFORM(llAlte)
DO Assert WITH toForm.ct_document.Objects.Count > 2, tcEticheta + ": ct_document are continut util (Objects.Count=" + TRANSFORM(toForm.ct_document.Objects.Count) + ")"
DO Assert WITH toForm.ct_document.Visible = llAlte, tcEticheta + ": ct_document.Visible=" + TRANSFORM(llAlte)
DO Assert WITH toForm.ct_incasare.Visible = llInc, tcEticheta + ": ct_incasare.Visible=" + TRANSFORM(llInc)
lnHLinie = toForm.chk_alte_date.Height
lnHInc = IIF(llInc, 96, 0)
lnHAlte = IIF(llAlte, 268, 0)
lnGap = IIF(lnHInc > 0 AND lnHAlte > 0, 8, 0)
lnLinieTop = toForm.Height - 66 - (lnHLinie + lnHInc + lnGap + lnHAlte) - 4
DO Assert WITH toForm.chk_incasare.Top = lnLinieTop, tcEticheta + ": linia de casete la Top=" + TRANSFORM(lnLinieTop)
DO Assert WITH toForm.chk_alte_date.Top = lnLinieTop, tcEticheta + ": chk_alte_date pe aceeasi linie"
DO Assert WITH toForm.grd_factura.Height = MAX(60, lnLinieTop - 4 - toForm.grd_factura.Top), tcEticheta + ": grd_factura.Height pana la 4px sub linia de casete"
IF llInc
DO Assert WITH toForm.ct_incasare.Top = lnLinieTop + lnHLinie, tcEticheta + ": ct_incasare imediat sub linia de casete"
DO Assert WITH toForm.ct_incasare.Height = 96, tcEticheta + ": ct_incasare.Height=96"
DO Assert WITH toForm.nmod_incasare() = 2, tcEticheta + ": nmod_incasare()=2 (chitanta, opt_incasat.Value=1)"
ELSE
DO Assert WITH toForm.nmod_incasare() = 1, tcEticheta + ": nmod_incasare()=1 (fara incasare)"
ENDIF
IF llAlte
lnAlteTop = lnLinieTop + lnHLinie + lnHInc + lnGap
DO Assert WITH toForm.ct_document.Top = lnAlteTop, tcEticheta + ": ct_document la lnAlteTop=" + TRANSFORM(lnAlteTop)
DO Assert WITH toForm.ct_contabilitate.Top - toForm.ct_document.Top = 96, tcEticheta + ": ct_contabilitate decalat 96 fata de ct_document"
DO Assert WITH toForm.ct_livrare.Top - toForm.ct_document.Top = 176, tcEticheta + ": ct_livrare decalat 176 fata de ct_document"
ENDIF
IF llInc AND llAlte
DO Assert WITH toForm.ct_document.Top - (toForm.ct_incasare.Top + toForm.ct_incasare.Height) = 8, tcEticheta + ": gap de 8px intre ct_incasare si ct_document"
ENDIF
IF !llAlte AND !llInc
gnHGrila00 = toForm.grd_factura.Height
ENDIF
IF llAlte AND llInc
gnHGrila11 = toForm.grd_factura.Height
ENDIF
ENDPROC
PROCEDURE DumpSiAnalizeaza
* Enumerare RECURSIVA prin .Objects (ColectGrila): dupa S7 cele 30 de controale de sub grila
* stau in ct_document / ct_contabilitate / ct_livrare / ct_incasare, iar o parcurgere plata a
* lui Thisform.Objects nu le mai vede deloc. Scrie .tsv cu Name ca traseu punctat de la
* formular, geometria proprie, vizibilitatea EFECTIVA (proprie AND a parintilor) si
* AbsLeft/AbsTop acumulate pe coborare. Analiza (suprapuneri 2D, iesire din forma, perechi
* lipite <4px) lucreaza pe coordonate ABSOLUTE, doar intre controale efectiv vizibile.
* Perechile parinte-copil se sar (copilul e prin definitie in parinte), la fel shape-urile
* decorative de grup, care acopera tot containerul lor.
LPARAMETERS toForm, tcEticheta, tcTsvPath
LOCAL i, j, lcOut
gnN = 0
lcOut = "Name" + CHR(9) + "Class" + CHR(9) + "Left" + CHR(9) + "Top" + CHR(9) + "Width" + CHR(9) + "Height" + CHR(9) + "Visible" + CHR(9) + "AbsLeft" + CHR(9) + "AbsTop" + CHR(9) + "Caption" + CHR(13) + CHR(10)
lcOut = lcOut + ColectGrila(toForm, "", 0, 0, 0, .T.)
STRTOFILE(lcOut, tcTsvPath)
DO AfLog WITH "GEOMETRIE [" + tcEticheta + "]: " + TRANSFORM(gnN) + " controale cu geometrie (recursiv, " + TRANSFORM(toForm.Objects.Count) + " la nivel de formular) -> " + tcTsvPath
IF gnTrunc > 0
DO AfLog WITH "ATENTIE: dump truncat, " + TRANSFORM(gnTrunc) + " obiecte peste plafonul de 600"
ENDIF
LOCAL lnAL, lnAT, lnAR, lnAB, lnBL, lnBT, lnBR, lnBB, lnOvX, lnOvY, lnGap
LOCAL lcSectiune
lcSectiune = "=== " + tcEticheta + " (forma " + TRANSFORM(toForm.Width) + "x" + TRANSFORM(toForm.Height) + ", " + TRANSFORM(gnN) + " obiecte) ===" + CHR(13) + CHR(10)
FOR i = 1 TO gnN
IF !gaV[i] OR gaSk[i]
LOOP
ENDIF
lnAL = gaAL[i]
lnAT = gaAT[i]
lnAR = gaAL[i] + gaW[i]
lnAB = gaAT[i] + gaH[i]
IF lnAL < 0 OR lnAT < 0 OR lnAR > toForm.Width OR lnAB > toForm.Height
lcSectiune = lcSectiune + "IESIT: " + gaN[i] + " (" + gaC[i] + ") Left=" + TRANSFORM(lnAL) + " Top=" + TRANSFORM(lnAT) + " Right=" + TRANSFORM(lnAR) + " Bottom=" + TRANSFORM(lnAB) + CHR(13) + CHR(10)
ENDIF
FOR j = i + 1 TO gnN
IF !gaV[j] OR gaSk[j]
LOOP
ENDIF
IF LEFT(gaN[j], LEN(gaN[i]) + 1) == gaN[i] + "." OR LEFT(gaN[i], LEN(gaN[j]) + 1) == gaN[j] + "."
LOOP
ENDIF
lnBL = gaAL[j]
lnBT = gaAT[j]
lnBR = gaAL[j] + gaW[j]
lnBB = gaAT[j] + gaH[j]
lnOvX = MIN(lnAR, lnBR) - MAX(lnAL, lnBL)
lnOvY = MIN(lnAB, lnBB) - MAX(lnAT, lnBT)
IF lnOvX > 0 AND lnOvY > 0
lcSectiune = lcSectiune + "SUPRAPUNERE: " + gaN[i] + " (" + gaC[i] + ") x " + gaN[j] + " (" + gaC[j] + ") " + TRANSFORM(lnOvX) + "x" + TRANSFORM(lnOvY) + "px" + CHR(13) + CHR(10)
ELSE
IF lnOvY > 0 AND lnOvX <= 0 AND -lnOvX < 4
lnGap = -lnOvX
lcSectiune = lcSectiune + "LIPIT-ORIZ: " + gaN[i] + " - " + gaN[j] + " gap=" + TRANSFORM(lnGap) + "px" + CHR(13) + CHR(10)
ENDIF
IF lnOvX > 0 AND lnOvY <= 0 AND -lnOvY < 4
lnGap = -lnOvY
lcSectiune = lcSectiune + "LIPIT-VERT: " + gaN[i] + " - " + gaN[j] + " gap=" + TRANSFORM(lnGap) + "px" + CHR(13) + CHR(10)
ENDIF
ENDIF
ENDFOR
ENDFOR
gcRaport = gcRaport + lcSectiune + CHR(13) + CHR(10)
ENDPROC
FUNCTION ColectGrila
* Recursie pe .Objects (nu PEMSTATUS) - garda Type('loO.Left')='N' fiindca nu orice membru
* are geometrie (separatoare, columns de grid etc. nu ajung aici, gridurile nu au .Objects).
* Umple ariile ga* pentru analiza si intoarce randurile TSV. gaSk marcheaza obiectele scoase
* din analiza de suprapuneri: shape-urile, care sunt chenare decorative peste continutul lor.
LPARAMETERS toContainer, tcPrefix, tnParentAbsLeft, tnParentAbsTop, tnDepth, tlParentVisEff
LOCAL i, loO, lcName, lnAbsL, lnAbsT, lcCaption, llVisEff, lcVisTxt, lcOut
IF tnDepth > 15
RETURN ""
ENDIF
lcOut = ""
FOR i = 1 TO toContainer.Objects.Count
loO = toContainer.Objects(i)
IF TYPE('loO.Left') = 'N' AND TYPE('loO.Top') = 'N' AND TYPE('loO.Width') = 'N' AND TYPE('loO.Height') = 'N'
lcName = IIF(EMPTY(tcPrefix), loO.Name, tcPrefix + "." + loO.Name)
lnAbsL = tnParentAbsLeft + loO.Left
lnAbsT = tnParentAbsTop + loO.Top
lcCaption = ""
IF TYPE('loO.Caption') = 'C'
lcCaption = loO.Caption
ELSE
IF TYPE('loO.Value') = 'C'
lcCaption = loO.Value
ENDIF
ENDIF
lcCaption = STRTRAN(lcCaption, CHR(9), " ")
lcCaption = LEFT(lcCaption, 40)
llVisEff = IIF(TYPE('loO.Visible') = 'L', loO.Visible, .T.) AND tlParentVisEff
lcVisTxt = TRANSFORM(llVisEff)
IF gnN < 600
gnN = gnN + 1
gaN[gnN] = lcName
gaC[gnN] = loO.Class
gaL[gnN] = loO.Left
gaT[gnN] = loO.Top
gaW[gnN] = loO.Width
gaH[gnN] = loO.Height
gaV[gnN] = llVisEff
gaAL[gnN] = lnAbsL
gaAT[gnN] = lnAbsT
gaSk[gnN] = (UPPER(loO.BaseClass) == "SHAPE")
ELSE
gnTrunc = gnTrunc + 1
ENDIF
lcOut = lcOut + lcName + CHR(9) + loO.Class + CHR(9) + TRANSFORM(loO.Left) + CHR(9) + TRANSFORM(loO.Top) + CHR(9) + TRANSFORM(loO.Width) + CHR(9) + TRANSFORM(loO.Height) + CHR(9) + lcVisTxt + CHR(9) + TRANSFORM(lnAbsL) + CHR(9) + TRANSFORM(lnAbsT) + CHR(9) + lcCaption + CHR(13) + CHR(10)
IF TYPE('loO.Objects.Count') = 'N'
lcOut = lcOut + ColectGrila(loO, lcName, lnAbsL, lnAbsT, tnDepth + 1, llVisEff)
ENDIF
ENDIF
ENDFOR
RETURN lcOut
ENDFUNC
PROCEDURE ProbaSerii
* apel direct al procedurii Oracle din creeaza_cursor_serii: logheaza eroarea reala (goExecutor
* ar deschide amessagebox modal, care agata rularea headless) si incalzeste starea pachetului
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
FUNCTION ObjExists
* Cautare RECURSIVA: dupa S7 controalele de sub grila nu mai sunt in Thisform.Objects, ci in
* containerele lor - o cautare plata ar raporta tacut "lipseste".
LPARAMETERS toContainer, tcName
LOCAL i, loO
FOR i = 1 TO toContainer.Objects.Count
loO = toContainer.Objects(i)
IF UPPER(loO.Name) == UPPER(tcName)
RETURN .T.
ENDIF
IF TYPE('loO.Objects.Count') = 'N'
IF ObjExists(loO, tcName)
RETURN .T.
ENDIF
ENDIF
ENDFOR
RETURN .F.
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), gcUILog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gnFail = gnFail + 1
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail)
DO AfLog WITH "END " + TTOC(DATETIME())
DO HarnessDone WITH 'done'
QUIT
ENDPROC

View File

@@ -0,0 +1,13 @@
# test_s5_benzi2_ui.ps1 - wrapper peste harness-ul generic (vfp_ui_harness.ps1) pentru
# test_s5_benzi2_ui.prg. Capturi S7 pe frm_facturare_articole2 (ofacturare.vc2), pe cele patru
# combinatii de casete (0/0, 1/0, 0/1, 1/1).
# Folderele sunt NOI: vfp_ui_harness.ps1 goleste ShotsDir/SyncDir la pornire, deci indreptarea lui
# spre screenshots_benzi2_27_08\ ar sterge capturile de referinta din 27.08.
# Rulare: powershell -ExecutionPolicy Bypass -File test_s5_benzi2_ui.ps1 (timeout >= 300s)
$ErrorActionPreference = 'Stop'
$Teste = $PSScriptRoot
& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') `
-TestPrg (Join-Path $Teste 'test_s5_benzi2_ui.prg') `
-Steps @('stare_initiala','alte_date_deschis','incasare_deschis','ambele_deschise') `
-SyncDir (Join-Path $Teste 'uisync_benzi2_S7_28_08') `
-ShotsDir (Join-Path $Teste 'screenshots_benzi2_S7_28_08')

View File

@@ -0,0 +1,342 @@
* test_s3b_dupa_ui.prg
* UI VIZIBIL: capturi "DUPA" pe frm_facturare_articole2 (COMUN\clase\ofacturare.vc2), dupa
* aplatizarea chenarelor (BorderWidth=0 pe containere, confirmata in binar). Copie a
* test_s3b_referinta_ui.prg cu ACELASI mediu / aceiasi 4 pasi / aceleasi etichete de pas, dar cu
* iesirile in fisiere separate (nu suprascrie referinta) ca sa poata fi comparate una langa alta.
*
* Rulare: powershell -ExecutionPolicy Bypass -File test_s3b_dupa_ui.ps1 (timeout >= 300s)
* Log: facturare_unificat\test_s5_benzi_ui_log.txt ; capturi in screenshots_benzi_27_08\ ;
* geometrie in out\geom_stare_27_08_<eticheta>.tsv
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcUILog, gcSyncDir, gnFail, gnPass
gcUILog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s5_benzi_ui_log.txt"
gcSyncDir = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\uisync_benzi_27_08\"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
gnFail = 0
gnPass = 0
PUBLIC gcRaport
gcRaport = ""
ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out")
MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out"
ENDIF
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", "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.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
* seriile de facturi (tipdoc 5) si de incasare (3/16/26) sunt pe utilizator in MARIUSM_AUTO
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
DO AfLog WITH "gnScadereStoc=" + TRANSFORM(gnScadereStoc)
* gridextras.vcx e referit din ofacturare.vcx cu cale relativa, rezolvabila doar din exe/IDE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
* grd_factura.cCodMat.cboCodmat e declarat AS combosql OF cautare.vcx, dar clasa e in _cb_base.vcx
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
* cboTipFactura (RowSourceType=3) citeste cursorul local saft_tip_facturi ca pe un tabel -
* fara el deschis explicit, Createobject('frm_facturare_articole2') da "File 'saft_tip_facturi.dbf' does not exist"
IF !USED('saft_tip_facturi')
update_saft_tip_facturi()
ENDIF
PRIVATE poDate, poGeneratorNumere, loForm, lcTsv, lcRaportFile
lcRaportFile = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_benzi_27_08_raport.txt"
* document nou: poDate.incasat ramane 0 la construire - identic Scenariul A din test_s3b_incasare_nealocare.prg
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)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poGeneratorNumere.ResetNumere()
DO ProbaSerii WITH poDate.nIdTipDoc
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
DO Final
ENDIF
DO Assert WITH ObjExists(loForm, 'opt_incasat'), "opt_incasat prezent (poDate.tip intre 1 si 4, deci grupul de incasare exista)"
loForm.WindowType = 0
loForm.Show()
loForm.WindowState = 2
DOEVENTS FORCE
* pas0: stare initiala dupa Createobject - ambele acordeoane plaite (lalte_date_deschis=.F., lincasare_deschis=.F. by design)
DO AfLog WITH "PAS0 stare initiala: lalte_date_deschis=" + TRANSFORM(loForm.lalte_date_deschis) + " lincasare_deschis=" + TRANSFORM(loForm.lincasare_deschis)
lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_benzi_27_08_stare_initiala.tsv"
DO DumpSiAnalizeaza WITH loForm, "stare initiala (ambele plaite)", lcTsv
DO DumpGrilaRecursiv WITH loForm, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_grila_benzi_27_08_stare_initiala.tsv"
DO HarnessStep WITH 0, 'stare_initiala', 6
* pas1: Alte date deschis - caseta se seteaza INAINTE de comutare (metoda citeste caseta)
loForm.chk_alte_date.Value = 1
loForm.do_comuta_alte_date()
DOEVENTS FORCE
DO AfLog WITH "PAS1 alte date deschis: lalte_date_deschis=" + TRANSFORM(loForm.lalte_date_deschis) + " lincasare_deschis=" + TRANSFORM(loForm.lincasare_deschis)
lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_benzi_27_08_alte_date.tsv"
DO DumpSiAnalizeaza WITH loForm, "Alte date deschis", lcTsv
DO DumpGrilaRecursiv WITH loForm, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_grila_benzi_27_08_alte_date.tsv"
DO HarnessStep WITH 1, 'alte_date_deschis', 6
* pas2: Alte date inchis la loc, Incasare deschis
* bifarea casetei aloca o chitanta reala in MARIUSM_AUTO - vezi curatenia de dinainte de Release
loForm.chk_alte_date.Value = 0
loForm.do_comuta_alte_date()
loForm.chk_incasare.Value = 1
loForm.do_comuta_incasare()
DOEVENTS FORCE
DO AfLog WITH "PAS2 incasare deschis: lalte_date_deschis=" + TRANSFORM(loForm.lalte_date_deschis) + " lincasare_deschis=" + TRANSFORM(loForm.lincasare_deschis)
lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_benzi_27_08_incasare.tsv"
DO DumpSiAnalizeaza WITH loForm, "Incasare deschis", lcTsv
DO DumpGrilaRecursiv WITH loForm, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_grila_benzi_27_08_incasare.tsv"
DO HarnessStep WITH 2, 'incasare_deschis', 6
* pas3: Alte date deschis din nou - ambele deschise simultan
loForm.chk_alte_date.Value = 1
loForm.do_comuta_alte_date()
DOEVENTS FORCE
DO AfLog WITH "PAS3 ambele deschise: lalte_date_deschis=" + TRANSFORM(loForm.lalte_date_deschis) + " lincasare_deschis=" + TRANSFORM(loForm.lincasare_deschis)
lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_benzi_27_08_ambele.tsv"
DO DumpSiAnalizeaza WITH loForm, "Ambele deschise", lcTsv
DO DumpGrilaRecursiv WITH loForm, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_grila_benzi_27_08_ambele.tsv"
DO HarnessStep WITH 3, 'ambele_deschise', 6
STRTOFILE(gcRaport, lcRaportFile)
DO AfLog WITH "Raport geometrie scris in " + lcRaportFile
* curatenie obligatorie: bifarea casetei la pasul 2 a alocat o chitanta reala in MARIUSM_AUTO,
* iar debifarea ruleaza ramura "fara incasare", care dezaloca 16/3/26
loForm.chk_incasare.Value = 0
loForm.do_comuta_incasare()
DO Assert WITH loForm.nmod_incasare() = 1, "dupa curatenie: nmod_incasare()=1 (fara incasare)"
loForm.Release()
RELEASE loForm
DO Final
*----------------------------------------------------------------------------------------
PROCEDURE DumpSiAnalizeaza
* Parcurge Thisform.Objects (top-level, fara recursie in containere) - dupa S7 NU mai vede cele
* 30 de controale mutate in ct_document/ct_contabilitate/ct_livrare/ct_incasare; harta completa
* e cea scrisa de DumpGrilaRecursiv. Scrie .tsv cu
* Name/Class/Left/Top/Width/Height/Visible pentru fiecare obiect cu geometrie, apoi
* calculeaza suprapuneri (2D), iesire din zona utila a formularului si perechi lipite
* (<4px) pe orizontala/verticala, doar intre controale Visible=.T. Adauga sectiunea la gcRaport.
LPARAMETERS toForm, tcEticheta, tcTsvPath
LOCAL i, j, loO, lcOut, lnN, lnCount, llVis
LOCAL ARRAY laN[400], laC[400], laL[400], laT[400], laW[400], laH[400], laV[400]
lnN = 0
lcOut = "Name" + CHR(9) + "Class" + CHR(9) + "Left" + CHR(9) + "Top" + CHR(9) + "Width" + CHR(9) + "Height" + CHR(9) + "Visible" + CHR(13) + CHR(10)
lnCount = toForm.Objects.Count
FOR i = 1 TO lnCount
loO = toForm.Objects(i)
IF TYPE('loO.Left') = 'N' AND TYPE('loO.Top') = 'N' AND TYPE('loO.Width') = 'N' AND TYPE('loO.Height') = 'N' AND lnN < 400
llVis = IIF(TYPE('loO.Visible') = 'L', loO.Visible, .T.)
lnN = lnN + 1
laN[lnN] = loO.Name
laC[lnN] = loO.Class
laL[lnN] = loO.Left
laT[lnN] = loO.Top
laW[lnN] = loO.Width
laH[lnN] = loO.Height
laV[lnN] = llVis
lcOut = lcOut + loO.Name + CHR(9) + loO.Class + CHR(9) + TRANSFORM(loO.Left) + CHR(9) + TRANSFORM(loO.Top) + CHR(9) + TRANSFORM(loO.Width) + CHR(9) + TRANSFORM(loO.Height) + CHR(9) + TRANSFORM(llVis) + CHR(13) + CHR(10)
ENDIF
ENDFOR
STRTOFILE(lcOut, tcTsvPath)
DO AfLog WITH "GEOMETRIE [" + tcEticheta + "]: " + TRANSFORM(lnN) + " controale cu geometrie din " + TRANSFORM(lnCount) + " obiecte totale -> " + tcTsvPath
LOCAL lnAL, lnAT, lnAR, lnAB, lnBL, lnBT, lnBR, lnBB, lnOvX, lnOvY, lnGap
LOCAL lcSectiune
lcSectiune = "=== " + tcEticheta + " (forma " + TRANSFORM(toForm.Width) + "x" + TRANSFORM(toForm.Height) + ") ===" + CHR(13) + CHR(10)
FOR i = 1 TO lnN
IF !laV[i]
LOOP
ENDIF
lnAL = laL[i]
lnAT = laT[i]
lnAR = laL[i] + laW[i]
lnAB = laT[i] + laH[i]
IF lnAL < 0 OR lnAT < 0 OR lnAR > toForm.Width OR lnAB > toForm.Height
lcSectiune = lcSectiune + "IESIT: " + laN[i] + " (" + laC[i] + ") Left=" + TRANSFORM(lnAL) + " Top=" + TRANSFORM(lnAT) + " Right=" + TRANSFORM(lnAR) + " Bottom=" + TRANSFORM(lnAB) + CHR(13) + CHR(10)
ENDIF
FOR j = i + 1 TO lnN
IF !laV[j]
LOOP
ENDIF
lnBL = laL[j]
lnBT = laT[j]
lnBR = laL[j] + laW[j]
lnBB = laT[j] + laH[j]
lnOvX = MIN(lnAR, lnBR) - MAX(lnAL, lnBL)
lnOvY = MIN(lnAB, lnBB) - MAX(lnAT, lnBT)
IF lnOvX > 0 AND lnOvY > 0
lcSectiune = lcSectiune + "SUPRAPUNERE: " + laN[i] + " (" + laC[i] + ") x " + laN[j] + " (" + laC[j] + ") " + TRANSFORM(lnOvX) + "x" + TRANSFORM(lnOvY) + "px" + CHR(13) + CHR(10)
ELSE
IF lnOvY > 0 AND lnOvX <= 0 AND -lnOvX < 4
lnGap = -lnOvX
lcSectiune = lcSectiune + "LIPIT-ORIZ: " + laN[i] + " - " + laN[j] + " gap=" + TRANSFORM(lnGap) + "px" + CHR(13) + CHR(10)
ENDIF
IF lnOvX > 0 AND lnOvY <= 0 AND -lnOvY < 4
lnGap = -lnOvY
lcSectiune = lcSectiune + "LIPIT-VERT: " + laN[i] + " - " + laN[j] + " gap=" + TRANSFORM(lnGap) + "px" + CHR(13) + CHR(10)
ENDIF
ENDIF
ENDFOR
ENDFOR
gcRaport = gcRaport + lcSectiune + CHR(13) + CHR(10)
ENDPROC
PROCEDURE DumpGrilaRecursiv
* Harta de geometrie recursiva: coboara in .Objects pe oricate niveluri (containere compozite
* clb_tx_simplu / ct_clb_cautare / etc.), scrie Name ca traseu punctat de la formular
* (Ct_clb_agent.clb_tx_cautare.Lb_simplu1), plus AbsLeft/AbsTop absolute fata de formular
* si Caption/Value taiat la 40 caractere - necesare ca sa se detecteze suprapunerile si
* textele taiate din interiorul containerelor, invizibile in harta plata geom_dupa_*.tsv.
LPARAMETERS toForm, tcTsvPath
LOCAL lcOut
lcOut = "Name" + CHR(9) + "Class" + CHR(9) + "Left" + CHR(9) + "Top" + CHR(9) + "Width" + CHR(9) + "Height" + CHR(9) + "Visible" + CHR(9) + "AbsLeft" + CHR(9) + "AbsTop" + CHR(9) + "Caption" + CHR(13) + CHR(10)
lcOut = lcOut + ColectGrila(toForm, "", 0, 0, 0, .T.)
STRTOFILE(lcOut, tcTsvPath)
DO AfLog WITH "GEOMETRIE-GRILA: scris " + tcTsvPath
ENDPROC
FUNCTION ColectGrila
* Recursie pe .Objects (nu PEMSTATUS) - garda Type('loO.Left')='N' fiindca nu orice membru
* are geometrie (separatoare, columns de grid etc. nu ajung aici, gridurile nu au .Objects).
* coloana Visible e vizibilitatea EFECTIVA (proprie AND a parintelui) - un copil dintr-un
* container ascuns are Visible propriu .T. dar nu se deseneaza.
LPARAMETERS toContainer, tcPrefix, tnParentAbsLeft, tnParentAbsTop, tnDepth, tlParentVisEff
LOCAL i, loO, lcName, lnAbsL, lnAbsT, lcCaption, llVisEff, lcVisTxt, lcOut
IF tnDepth > 15
RETURN ""
ENDIF
lcOut = ""
FOR i = 1 TO toContainer.Objects.Count
loO = toContainer.Objects(i)
IF TYPE('loO.Left') = 'N' AND TYPE('loO.Top') = 'N' AND TYPE('loO.Width') = 'N' AND TYPE('loO.Height') = 'N'
lcName = IIF(EMPTY(tcPrefix), loO.Name, tcPrefix + "." + loO.Name)
lnAbsL = tnParentAbsLeft + loO.Left
lnAbsT = tnParentAbsTop + loO.Top
lcCaption = ""
IF TYPE('loO.Caption') = 'C'
lcCaption = loO.Caption
ELSE
IF TYPE('loO.Value') = 'C'
lcCaption = loO.Value
ENDIF
ENDIF
lcCaption = STRTRAN(lcCaption, CHR(9), " ")
lcCaption = LEFT(lcCaption, 40)
llVisEff = IIF(TYPE('loO.Visible') = 'L', loO.Visible, .T.) AND tlParentVisEff
lcVisTxt = TRANSFORM(llVisEff)
lcOut = lcOut + lcName + CHR(9) + loO.Class + CHR(9) + TRANSFORM(loO.Left) + CHR(9) + TRANSFORM(loO.Top) + CHR(9) + TRANSFORM(loO.Width) + CHR(9) + TRANSFORM(loO.Height) + CHR(9) + lcVisTxt + CHR(9) + TRANSFORM(lnAbsL) + CHR(9) + TRANSFORM(lnAbsT) + CHR(9) + lcCaption + CHR(13) + CHR(10)
IF TYPE('loO.Objects.Count') = 'N'
lcOut = lcOut + ColectGrila(loO, lcName, lnAbsL, lnAbsT, tnDepth + 1, llVisEff)
ENDIF
ENDIF
ENDFOR
RETURN lcOut
ENDFUNC
PROCEDURE ProbaSerii
* apel direct al procedurii Oracle din creeaza_cursor_serii: logheaza eroarea reala (goExecutor
* ar deschide amessagebox modal, care agata rularea headless) si incalzeste starea pachetului
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
FUNCTION ObjExists
* Cautare RECURSIVA: dupa S7 controalele de sub grila nu mai sunt in Thisform.Objects, ci in
* containerele lor - o cautare plata ar raporta tacut "lipseste".
LPARAMETERS toContainer, tcName
LOCAL i, loO
FOR i = 1 TO toContainer.Objects.Count
loO = toContainer.Objects(i)
IF UPPER(loO.Name) == UPPER(tcName)
RETURN .T.
ENDIF
IF TYPE('loO.Objects.Count') = 'N'
IF ObjExists(loO, tcName)
RETURN .T.
ENDIF
ENDIF
ENDFOR
RETURN .F.
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), gcUILog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gnFail = gnFail + 1
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail)
DO AfLog WITH "END " + TTOC(DATETIME())
DO HarnessDone WITH 'done'
QUIT
ENDPROC

View File

@@ -0,0 +1,12 @@
# test_s3b_dupa_ui.ps1 - wrapper peste harness-ul generic (vfp_ui_harness.ps1) pentru
# test_s5_benzi_ui.prg. Capturi "DUPA" pe frm_facturare_articole2 (ofacturare.vc2), dupa
# aplatizarea chenarelor - aceiasi 4 pasi si aceleasi nume de fisiere PNG ca la referinta, dar in
# folder separat (screenshots_benzi_27_08\), ca sa nu suprascrie screenshots_referinta\.
# Rulare: powershell -ExecutionPolicy Bypass -File test_s3b_dupa_ui.ps1 (timeout >= 300s)
$ErrorActionPreference = 'Stop'
$Teste = $PSScriptRoot
& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') `
-TestPrg (Join-Path $Teste 'test_s5_benzi_ui.prg') `
-Steps @('stare_initiala','alte_date_deschis','incasare_deschis','ambele_deschise') `
-SyncDir (Join-Path $Teste 'uisync_benzi_27_08') `
-ShotsDir (Join-Path $Teste 'screenshots_benzi_27_08')

View File

@@ -0,0 +1,342 @@
* test_s3b_dupa_ui.prg
* UI VIZIBIL: capturi "DUPA" pe frm_facturare_articole2 (COMUN\clase\ofacturare.vc2), dupa
* aplatizarea chenarelor (BorderWidth=0 pe containere, confirmata in binar). Copie a
* test_s3b_referinta_ui.prg cu ACELASI mediu / aceiasi 4 pasi / aceleasi etichete de pas, dar cu
* iesirile in fisiere separate (nu suprascrie referinta) ca sa poata fi comparate una langa alta.
*
* Rulare: powershell -ExecutionPolicy Bypass -File test_s3b_dupa_ui.ps1 (timeout >= 300s)
* Log: facturare_unificat\test_s5_stare_ui_log.txt ; capturi in screenshots_stare_27_08\ ;
* geometrie in out\geom_stare_27_08_<eticheta>.tsv
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcUILog, gcSyncDir, gnFail, gnPass
gcUILog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s5_stare_ui_log.txt"
gcSyncDir = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\uisync_stare_27_08\"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
gnFail = 0
gnPass = 0
PUBLIC gcRaport
gcRaport = ""
ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out")
MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out"
ENDIF
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", "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.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
* seriile de facturi (tipdoc 5) si de incasare (3/16/26) sunt pe utilizator in MARIUSM_AUTO
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
DO AfLog WITH "gnScadereStoc=" + TRANSFORM(gnScadereStoc)
* gridextras.vcx e referit din ofacturare.vcx cu cale relativa, rezolvabila doar din exe/IDE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
* grd_factura.cCodMat.cboCodmat e declarat AS combosql OF cautare.vcx, dar clasa e in _cb_base.vcx
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
* cboTipFactura (RowSourceType=3) citeste cursorul local saft_tip_facturi ca pe un tabel -
* fara el deschis explicit, Createobject('frm_facturare_articole2') da "File 'saft_tip_facturi.dbf' does not exist"
IF !USED('saft_tip_facturi')
update_saft_tip_facturi()
ENDIF
PRIVATE poDate, poGeneratorNumere, loForm, lcTsv, lcRaportFile
lcRaportFile = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_stare_27_08_raport.txt"
* document nou: poDate.incasat ramane 0 la construire - identic Scenariul A din test_s3b_incasare_nealocare.prg
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)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poGeneratorNumere.ResetNumere()
DO ProbaSerii WITH poDate.nIdTipDoc
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
DO Final
ENDIF
DO Assert WITH ObjExists(loForm, 'opt_incasat'), "opt_incasat prezent (poDate.tip intre 1 si 4, deci grupul de incasare exista)"
loForm.WindowType = 0
loForm.Show()
loForm.WindowState = 2
DOEVENTS FORCE
* pas0: stare initiala dupa Createobject - ambele acordeoane plaite (lalte_date_deschis=.F., lincasare_deschis=.F. by design)
DO AfLog WITH "PAS0 stare initiala: lalte_date_deschis=" + TRANSFORM(loForm.lalte_date_deschis) + " lincasare_deschis=" + TRANSFORM(loForm.lincasare_deschis)
lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_stare_27_08_stare_initiala.tsv"
DO DumpSiAnalizeaza WITH loForm, "stare initiala (ambele plaite)", lcTsv
DO DumpGrilaRecursiv WITH loForm, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_grila_stare_27_08_stare_initiala.tsv"
DO HarnessStep WITH 0, 'stare_initiala', 6
* pas1: Alte date deschis - caseta se seteaza INAINTE de comutare (metoda citeste caseta)
loForm.chk_alte_date.Value = 1
loForm.do_comuta_alte_date()
DOEVENTS FORCE
DO AfLog WITH "PAS1 alte date deschis: lalte_date_deschis=" + TRANSFORM(loForm.lalte_date_deschis) + " lincasare_deschis=" + TRANSFORM(loForm.lincasare_deschis)
lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_stare_27_08_alte_date.tsv"
DO DumpSiAnalizeaza WITH loForm, "Alte date deschis", lcTsv
DO DumpGrilaRecursiv WITH loForm, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_grila_stare_27_08_alte_date.tsv"
DO HarnessStep WITH 1, 'alte_date_deschis', 6
* pas2: Alte date inchis la loc, Incasare deschis
* bifarea casetei aloca o chitanta reala in MARIUSM_AUTO - vezi curatenia de dinainte de Release
loForm.chk_alte_date.Value = 0
loForm.do_comuta_alte_date()
loForm.chk_incasare.Value = 1
loForm.do_comuta_incasare()
DOEVENTS FORCE
DO AfLog WITH "PAS2 incasare deschis: lalte_date_deschis=" + TRANSFORM(loForm.lalte_date_deschis) + " lincasare_deschis=" + TRANSFORM(loForm.lincasare_deschis)
lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_stare_27_08_incasare.tsv"
DO DumpSiAnalizeaza WITH loForm, "Incasare deschis", lcTsv
DO DumpGrilaRecursiv WITH loForm, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_grila_stare_27_08_incasare.tsv"
DO HarnessStep WITH 2, 'incasare_deschis', 6
* pas3: Alte date deschis din nou - ambele deschise simultan
loForm.chk_alte_date.Value = 1
loForm.do_comuta_alte_date()
DOEVENTS FORCE
DO AfLog WITH "PAS3 ambele deschise: lalte_date_deschis=" + TRANSFORM(loForm.lalte_date_deschis) + " lincasare_deschis=" + TRANSFORM(loForm.lincasare_deschis)
lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_stare_27_08_ambele.tsv"
DO DumpSiAnalizeaza WITH loForm, "Ambele deschise", lcTsv
DO DumpGrilaRecursiv WITH loForm, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_grila_stare_27_08_ambele.tsv"
DO HarnessStep WITH 3, 'ambele_deschise', 6
STRTOFILE(gcRaport, lcRaportFile)
DO AfLog WITH "Raport geometrie scris in " + lcRaportFile
* curatenie obligatorie: bifarea casetei la pasul 2 a alocat o chitanta reala in MARIUSM_AUTO,
* iar debifarea ruleaza ramura "fara incasare", care dezaloca 16/3/26
loForm.chk_incasare.Value = 0
loForm.do_comuta_incasare()
DO Assert WITH loForm.nmod_incasare() = 1, "dupa curatenie: nmod_incasare()=1 (fara incasare)"
loForm.Release()
RELEASE loForm
DO Final
*----------------------------------------------------------------------------------------
PROCEDURE DumpSiAnalizeaza
* Parcurge Thisform.Objects (top-level, fara recursie in containere) - dupa S7 NU mai vede cele
* 30 de controale mutate in ct_document/ct_contabilitate/ct_livrare/ct_incasare; harta completa
* e cea scrisa de DumpGrilaRecursiv. Scrie .tsv cu
* Name/Class/Left/Top/Width/Height/Visible pentru fiecare obiect cu geometrie, apoi
* calculeaza suprapuneri (2D), iesire din zona utila a formularului si perechi lipite
* (<4px) pe orizontala/verticala, doar intre controale Visible=.T. Adauga sectiunea la gcRaport.
LPARAMETERS toForm, tcEticheta, tcTsvPath
LOCAL i, j, loO, lcOut, lnN, lnCount, llVis
LOCAL ARRAY laN[400], laC[400], laL[400], laT[400], laW[400], laH[400], laV[400]
lnN = 0
lcOut = "Name" + CHR(9) + "Class" + CHR(9) + "Left" + CHR(9) + "Top" + CHR(9) + "Width" + CHR(9) + "Height" + CHR(9) + "Visible" + CHR(13) + CHR(10)
lnCount = toForm.Objects.Count
FOR i = 1 TO lnCount
loO = toForm.Objects(i)
IF TYPE('loO.Left') = 'N' AND TYPE('loO.Top') = 'N' AND TYPE('loO.Width') = 'N' AND TYPE('loO.Height') = 'N' AND lnN < 400
llVis = IIF(TYPE('loO.Visible') = 'L', loO.Visible, .T.)
lnN = lnN + 1
laN[lnN] = loO.Name
laC[lnN] = loO.Class
laL[lnN] = loO.Left
laT[lnN] = loO.Top
laW[lnN] = loO.Width
laH[lnN] = loO.Height
laV[lnN] = llVis
lcOut = lcOut + loO.Name + CHR(9) + loO.Class + CHR(9) + TRANSFORM(loO.Left) + CHR(9) + TRANSFORM(loO.Top) + CHR(9) + TRANSFORM(loO.Width) + CHR(9) + TRANSFORM(loO.Height) + CHR(9) + TRANSFORM(llVis) + CHR(13) + CHR(10)
ENDIF
ENDFOR
STRTOFILE(lcOut, tcTsvPath)
DO AfLog WITH "GEOMETRIE [" + tcEticheta + "]: " + TRANSFORM(lnN) + " controale cu geometrie din " + TRANSFORM(lnCount) + " obiecte totale -> " + tcTsvPath
LOCAL lnAL, lnAT, lnAR, lnAB, lnBL, lnBT, lnBR, lnBB, lnOvX, lnOvY, lnGap
LOCAL lcSectiune
lcSectiune = "=== " + tcEticheta + " (forma " + TRANSFORM(toForm.Width) + "x" + TRANSFORM(toForm.Height) + ") ===" + CHR(13) + CHR(10)
FOR i = 1 TO lnN
IF !laV[i]
LOOP
ENDIF
lnAL = laL[i]
lnAT = laT[i]
lnAR = laL[i] + laW[i]
lnAB = laT[i] + laH[i]
IF lnAL < 0 OR lnAT < 0 OR lnAR > toForm.Width OR lnAB > toForm.Height
lcSectiune = lcSectiune + "IESIT: " + laN[i] + " (" + laC[i] + ") Left=" + TRANSFORM(lnAL) + " Top=" + TRANSFORM(lnAT) + " Right=" + TRANSFORM(lnAR) + " Bottom=" + TRANSFORM(lnAB) + CHR(13) + CHR(10)
ENDIF
FOR j = i + 1 TO lnN
IF !laV[j]
LOOP
ENDIF
lnBL = laL[j]
lnBT = laT[j]
lnBR = laL[j] + laW[j]
lnBB = laT[j] + laH[j]
lnOvX = MIN(lnAR, lnBR) - MAX(lnAL, lnBL)
lnOvY = MIN(lnAB, lnBB) - MAX(lnAT, lnBT)
IF lnOvX > 0 AND lnOvY > 0
lcSectiune = lcSectiune + "SUPRAPUNERE: " + laN[i] + " (" + laC[i] + ") x " + laN[j] + " (" + laC[j] + ") " + TRANSFORM(lnOvX) + "x" + TRANSFORM(lnOvY) + "px" + CHR(13) + CHR(10)
ELSE
IF lnOvY > 0 AND lnOvX <= 0 AND -lnOvX < 4
lnGap = -lnOvX
lcSectiune = lcSectiune + "LIPIT-ORIZ: " + laN[i] + " - " + laN[j] + " gap=" + TRANSFORM(lnGap) + "px" + CHR(13) + CHR(10)
ENDIF
IF lnOvX > 0 AND lnOvY <= 0 AND -lnOvY < 4
lnGap = -lnOvY
lcSectiune = lcSectiune + "LIPIT-VERT: " + laN[i] + " - " + laN[j] + " gap=" + TRANSFORM(lnGap) + "px" + CHR(13) + CHR(10)
ENDIF
ENDIF
ENDFOR
ENDFOR
gcRaport = gcRaport + lcSectiune + CHR(13) + CHR(10)
ENDPROC
PROCEDURE DumpGrilaRecursiv
* Harta de geometrie recursiva: coboara in .Objects pe oricate niveluri (containere compozite
* clb_tx_simplu / ct_clb_cautare / etc.), scrie Name ca traseu punctat de la formular
* (Ct_clb_agent.clb_tx_cautare.Lb_simplu1), plus AbsLeft/AbsTop absolute fata de formular
* si Caption/Value taiat la 40 caractere - necesare ca sa se detecteze suprapunerile si
* textele taiate din interiorul containerelor, invizibile in harta plata geom_dupa_*.tsv.
LPARAMETERS toForm, tcTsvPath
LOCAL lcOut
lcOut = "Name" + CHR(9) + "Class" + CHR(9) + "Left" + CHR(9) + "Top" + CHR(9) + "Width" + CHR(9) + "Height" + CHR(9) + "Visible" + CHR(9) + "AbsLeft" + CHR(9) + "AbsTop" + CHR(9) + "Caption" + CHR(13) + CHR(10)
lcOut = lcOut + ColectGrila(toForm, "", 0, 0, 0, .T.)
STRTOFILE(lcOut, tcTsvPath)
DO AfLog WITH "GEOMETRIE-GRILA: scris " + tcTsvPath
ENDPROC
FUNCTION ColectGrila
* Recursie pe .Objects (nu PEMSTATUS) - garda Type('loO.Left')='N' fiindca nu orice membru
* are geometrie (separatoare, columns de grid etc. nu ajung aici, gridurile nu au .Objects).
* coloana Visible e vizibilitatea EFECTIVA (proprie AND a parintelui) - un copil dintr-un
* container ascuns are Visible propriu .T. dar nu se deseneaza.
LPARAMETERS toContainer, tcPrefix, tnParentAbsLeft, tnParentAbsTop, tnDepth, tlParentVisEff
LOCAL i, loO, lcName, lnAbsL, lnAbsT, lcCaption, llVisEff, lcVisTxt, lcOut
IF tnDepth > 15
RETURN ""
ENDIF
lcOut = ""
FOR i = 1 TO toContainer.Objects.Count
loO = toContainer.Objects(i)
IF TYPE('loO.Left') = 'N' AND TYPE('loO.Top') = 'N' AND TYPE('loO.Width') = 'N' AND TYPE('loO.Height') = 'N'
lcName = IIF(EMPTY(tcPrefix), loO.Name, tcPrefix + "." + loO.Name)
lnAbsL = tnParentAbsLeft + loO.Left
lnAbsT = tnParentAbsTop + loO.Top
lcCaption = ""
IF TYPE('loO.Caption') = 'C'
lcCaption = loO.Caption
ELSE
IF TYPE('loO.Value') = 'C'
lcCaption = loO.Value
ENDIF
ENDIF
lcCaption = STRTRAN(lcCaption, CHR(9), " ")
lcCaption = LEFT(lcCaption, 40)
llVisEff = IIF(TYPE('loO.Visible') = 'L', loO.Visible, .T.) AND tlParentVisEff
lcVisTxt = TRANSFORM(llVisEff)
lcOut = lcOut + lcName + CHR(9) + loO.Class + CHR(9) + TRANSFORM(loO.Left) + CHR(9) + TRANSFORM(loO.Top) + CHR(9) + TRANSFORM(loO.Width) + CHR(9) + TRANSFORM(loO.Height) + CHR(9) + lcVisTxt + CHR(9) + TRANSFORM(lnAbsL) + CHR(9) + TRANSFORM(lnAbsT) + CHR(9) + lcCaption + CHR(13) + CHR(10)
IF TYPE('loO.Objects.Count') = 'N'
lcOut = lcOut + ColectGrila(loO, lcName, lnAbsL, lnAbsT, tnDepth + 1, llVisEff)
ENDIF
ENDIF
ENDFOR
RETURN lcOut
ENDFUNC
PROCEDURE ProbaSerii
* apel direct al procedurii Oracle din creeaza_cursor_serii: logheaza eroarea reala (goExecutor
* ar deschide amessagebox modal, care agata rularea headless) si incalzeste starea pachetului
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
FUNCTION ObjExists
* Cautare RECURSIVA: dupa S7 controalele de sub grila nu mai sunt in Thisform.Objects, ci in
* containerele lor - o cautare plata ar raporta tacut "lipseste".
LPARAMETERS toContainer, tcName
LOCAL i, loO
FOR i = 1 TO toContainer.Objects.Count
loO = toContainer.Objects(i)
IF UPPER(loO.Name) == UPPER(tcName)
RETURN .T.
ENDIF
IF TYPE('loO.Objects.Count') = 'N'
IF ObjExists(loO, tcName)
RETURN .T.
ENDIF
ENDIF
ENDFOR
RETURN .F.
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), gcUILog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gnFail = gnFail + 1
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail)
DO AfLog WITH "END " + TTOC(DATETIME())
DO HarnessDone WITH 'done'
QUIT
ENDPROC

View File

@@ -0,0 +1,12 @@
# test_s3b_dupa_ui.ps1 - wrapper peste harness-ul generic (vfp_ui_harness.ps1) pentru
# test_s5_stare_ui.prg. Capturi "DUPA" pe frm_facturare_articole2 (ofacturare.vc2), dupa
# aplatizarea chenarelor - aceiasi 4 pasi si aceleasi nume de fisiere PNG ca la referinta, dar in
# folder separat (screenshots_stare_27_08\), ca sa nu suprascrie screenshots_referinta\.
# Rulare: powershell -ExecutionPolicy Bypass -File test_s3b_dupa_ui.ps1 (timeout >= 300s)
$ErrorActionPreference = 'Stop'
$Teste = $PSScriptRoot
& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') `
-TestPrg (Join-Path $Teste 'test_s5_stare_ui.prg') `
-Steps @('stare_initiala','alte_date_deschis','incasare_deschis','ambele_deschise') `
-SyncDir (Join-Path $Teste 'uisync_stare_27_08') `
-ShotsDir (Join-Path $Teste 'screenshots_stare_27_08')

View File

@@ -0,0 +1,580 @@
* test_s5b_proforma.prg
* Headless: S5b in frm_facturare_articole2 (COMUN\clase\ofacturare.vc2).
* M1 - rutarea proformei: verificata STATIC (FILETOSTR + AT pe textul din arbore, fara Oracle,
* fara dialog) - Case poDate.eProforma = 1 e LITERALMENTE prima ramura din Do Case-ul lui
* do_scrie_factura (inaintea Case poDate.Tip = 4 si Case Inlist(poDate.Tip,3,21,25,28,42,47),
* ramurile Rol A / S4-4), iar apelul din acea ramura foloseste pack_facturare.scrie_proforma(
* cu toti cei 16 parametri reali (nu scrie_proforma_old, semnatura veche cu 5). A fost scoasa
* temporar, gresit banuita drept cauza a unui blocaj vfp9.exe - repusa dupa ce o rulare fara ea
* a reprodus identic blocajul (deci FILETOSTR nu era cauza). O rulare reala care ar emite o
* proforma la Oracle ar consuma un numar de document in MARIUSM_AUTO - datorie deschisa (vezi
* docs\raport_s5b_implementare.md).
* Logare DIAG: AfLog scrie si inchide fisierul la fiecare apel (flush per linie), deci un kill in
* mijlocul unei proceduri lasa in log ultima linie reala executata - folosita ca sa localizeze
* blocajul la instructiune, nu doar la procedura.
* M2 - marcheaza_linii_proforma: sentinela -1000/gestionabil=0 aplicata la salvare, pe toate
* liniile din crsfactura, cu restaurarea pozitiei curente (Recno).
* M3 - do_schimba_tipdoc: garda care blocheaza comutarea PROFORMA -> alt tip cat timp crsfactura
* are linii; sensurile FACTURA -> PROFORMA si "fara linii" raman libere.
*
* Proiectare (v2, dupa incidentul cu dialogul modal real din prima rulare):
* - poDate.eProforma se seteaza DIRECT, niciodata prin poDate.nIdTipDoc = 23 sau prin comutarea
* efectiva a tipului (nici la Createobject, nici prin do_schimba_tipdoc). Formularul se
* instantiaza mereu ca FACTURA (nIdTipDoc = 5, tip cu plaje de serii garantat in MARIUSM_AUTO).
* - do_schimba_tipdoc() se cheama DOAR in cazuri unde garda opreste executia inainte de
* alege_tipdoc/schimba_tipdoc (deci inainte de reincarcarea seriilor), sau unde tipul TINTA e
* FACTURA (are plaje). Sensul care ar comuta efectiv catre PROFORMA (fara plaje in acest mediu)
* NU se ruleaza - vezi TestGardaSensLiber.
* - Sonda RanduriSerii() (SQLEXEC direct pe verifica_cursor_serii, fara alocare) verifica plajele
* disponibile INAINTE de orice caz care ar putea comuta efectiv catre un tip nou.
*
* PLASA ANTI-MODAL, v3 - istoric complet in docs\raport_s5b_implementare.md:
* v1 (incident #2 initial): mock_amessagebox.prg incarcat o singura data la inceput, "verde" fara
* sa fi fost dovedit activ.
* v2: auto-proba prin SET PROCEDURE ADDITIVE + apel de proba - ea insasi auto-anulanta (detecta
* pierderea precedentei CHEMAND amessagebox(), exact apelul riscant). Inlocuita cu FUNCTION
* amessagebox definita DIRECT in acest .prg, pe baza experimentului A (precedenta .prg curent
* peste SET PROCEDURE - CONFIRMATA, dar testata doar pentru apel DIRECT din .prg).
* v3 (actuala): experimentul F a aratat ca precedenta din A NU se mosteneste in interiorul unei
* metode compilate SEPARAT (aici: do_schimba_tipdoc, metoda din ofacturare.vcx) - un apel
* amessagebox() facut din interiorul acelei metode NU foloseste FUNCTION amessagebox de mai jos,
* cade prin SET PROCEDURE chain. Deci FUNCTION amessagebox locala protejeaza doar apelurile
* DIRECTE din acest script (ex. proba din experimente); pentru apelul real din do_schimba_tipdoc
* e nevoie SI de reincarcarea `SET PROCEDURE TO mock_amessagebox.prg ADDITIVE` chiar inainte de
* fiecare apel riscant (SET PROCEDURE nu executa nimic, deci nu are cum sa deschida un dialog -
* spre deosebire de v2, unde proba insasi executa amessagebox()). Asta era, de fapt, mecanismul
* CORECT descris in incidentul #2 original din sarcina - confirmat acum experimental, nu doar
* presupus. NEVERIFICAT LA RULARE (nicio lansare disponibila dupa experimentul F) - apelurile
* TestGardaBlocheaza/TestGardaFaraLinii/TestGardaSensLiber raman comentate in lista principala.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s5b_proforma.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5b_proforma.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; seriile de facturi (tipdoc 5) sunt pe utilizator -> gnIdUtil = 8.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gnSarit, gcCaz
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5b_proforma.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
gnSarit = 0
gcCaz = ""
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
* fara asta, un lacat Oracle blocheaza rularea la infinit, invizibil in log (tipar confirmat in test_s3b_emitere_paritate_2.prg)
SQLSETPROP(gnHandle, "QueryTimeOut", 45)
IF TYPE('goExecutor.nHandle') = 'N' AND goExecutor.nHandle > 0 AND goExecutor.nHandle <> gnHandle
SQLSETPROP(goExecutor.nHandle, "QueryTimeOut", 45)
ENDIF
* FUNCTION amessagebox e definita mai jos, in acest .prg - vezi PLASA ANTI-MODAL, v2, in antet
PUBLIC gcMockUltimMesaj, gnMockUltimTip
gcMockUltimMesaj = ""
gnMockUltimTip = 0
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
DO AfLog WITH "ENV OK"
* gridextras.vcx e referit din ofacturare.vcx cu cale relativa (..\utile\gridextras), rezolvabila doar din exe/IDE
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
PRIVATE poDate, poGeneratorNumere
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
gnScadereStoc = 0
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'
* grd_factura.cGestiune e legat la crsFactura.gestiune, camp inexistent in creeaza_facturacrs (nume_gestiune)
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
* sonda plaje - fara alocare, doar SQLEXEC direct pe verifica_cursor_serii (vezi RanduriSerii)
PUBLIC glFacturaAreplaje, glProformaAreplaje
LOCAL lnRandFactura, lnRandProforma
lnRandFactura = RanduriSerii(5)
lnRandProforma = RanduriSerii(23)
glFacturaAreplaje = (lnRandFactura > 0)
glProformaAreplaje = (lnRandProforma > 0)
DO AfLog WITH "pre-proba plaje: tip 5(FACTURA) randuri=" + TRANSFORM(lnRandFactura) + ;
" tip 23(PROFORMA) randuri=" + TRANSFORM(lnRandProforma) + ;
" -> PROFORMA " + IIF(glProformaAreplaje, "probabil", "NEPROBABIL in acest mediu")
DO TestRutareProformaOrdine
DO TestMarcheazaLiniiProforma
DO TestMarcheazaLiniiProformaGol
* Experimentul D (coordonator): instrumenteaza operanzii conditiei gardei M3, FARA sa cheme
* do_schimba_tipdoc() - zero risc. TestGardaBlocheaza/TestGardaFaraLinii/TestGardaSensLiber raman
* comentate pentru aceasta rulare de diagnostic; se repun dupa ce D da raspunsul.
DO TestD_OperandGarda
* DO TestGardaBlocheaza
* DO TestGardaFaraLinii
* DO TestGardaSensLiber
DO Final
*----------------------------------------------------------------------------------------
PROCEDURE TestRutareProformaOrdine
LOCAL lcTxt, lcWindow, lnPosMark, lnPosDoCase, lnPosProforma, lnPosTip4, lnPosInlist, ;
lnPosPrimulCase, lcApel, laMarkeri[16], lnI, llToti16
gcCaz = "[M1 static: ordinea Do Case + forma apelului scrie_proforma] "
DO AfLog WITH "DIAG M1: start"
lcTxt = FILETOSTR("D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2")
DO AfLog WITH "DIAG M1: FILETOSTR OK, len=" + TRANSFORM(LEN(lcTxt))
IF EMPTY(lcTxt)
DO Assert WITH .F., "FILETOSTR ofacturare.vc2 a esuat/gol"
RETURN
ENDIF
* Thisform.marcheaza_linii_proforma() apare o singura data in tot fisierul (metoda noua, doar in
* frm_facturare_articole2) - ancoreaza fereastra de cautare exact pe ramura noua din do_scrie_factura
lnPosMark = AT("Thisform.marcheaza_linii_proforma()", lcTxt)
DO Assert WITH lnPosMark > 0, "Thisform.marcheaza_linii_proforma() apelat din do_scrie_factura"
IF lnPosMark = 0
RETURN
ENDIF
lcWindow = SUBSTR(lcTxt, MAX(lnPosMark - 300, 1), 5000)
lnPosDoCase = AT("Do Case", lcWindow)
lnPosProforma = AT("Case poDate.eProforma = 1", lcWindow)
lnPosTip4 = AT("Case poDate.Tip = 4", lcWindow)
lnPosInlist = AT("Case Inlist(poDate.Tip,3,21,25,28,42,47)", lcWindow)
DO Assert WITH lnPosDoCase > 0 AND lnPosProforma > 0 AND lnPosTip4 > 0 AND lnPosInlist > 0, ;
"toate reperele gasite: DoCase=" + TRANSFORM(lnPosDoCase) + " eProforma=" + TRANSFORM(lnPosProforma) + ;
" Tip4=" + TRANSFORM(lnPosTip4) + " Inlist=" + TRANSFORM(lnPosInlist)
IF lnPosDoCase = 0 OR lnPosProforma = 0 OR lnPosTip4 = 0 OR lnPosInlist = 0
RETURN
ENDIF
DO Assert WITH lnPosDoCase < lnPosProforma AND lnPosProforma < lnPosTip4 AND lnPosTip4 < lnPosInlist, ;
"ordine: Do Case < Case eProforma=1 < Case Tip=4 < Case Inlist(3,21,25,28,42,47)"
* Case eProforma=1 trebuie sa fie LITERALMENTE prima ramura - primul "Case " gasit dupa "Do Case"
* e chiar ea, nu doar "undeva inaintea" ramurilor S4-4 (Rol A) - o proforma tip 3/4 nu poate cadea
* pe ramura Rol A si sa ceara confirmarea "aviz de retur"
lnPosPrimulCase = AT("Case ", SUBSTR(lcWindow, lnPosDoCase + 7)) + lnPosDoCase + 7 - 1
DO Assert WITH lnPosPrimulCase == lnPosProforma, ;
"Case eProforma=1 e prima ramura din Do Case (primul Case dupa Do Case), pozitie prim Case=" + ;
TRANSFORM(lnPosPrimulCase) + " pozitie eProforma=" + TRANSFORM(lnPosProforma)
* forma apelului: pack_facturare.scrie_proforma cu 16 parametri (nu scrie_proforma_old cu 5)
lcApel = SUBSTR(lcWindow, lnPosProforma, lnPosTip4 - lnPosProforma)
DO Assert WITH "pack_facturare.scrie_proforma(" $ lcApel, "apelul contine pack_facturare.scrie_proforma("
DO Assert WITH !("scrie_proforma_old" $ lcApel), "apelul NU foloseste scrie_proforma_old (semnatura veche, 5 parametri)"
laMarkeri[1] = "pnTotalFtva"
laMarkeri[2] = "pnTotalTva"
laMarkeri[3] = "pnDiscount"
laMarkeri[4] = "serie_chit"
laMarkeri[5] = "nr_incasare"
laMarkeri[6] = "lcListaIncasare"
laMarkeri[7] = "id_delegat"
laMarkeri[8] = "id_masina"
laMarkeri[9] = "id_facturare"
laMarkeri[10] = "nListareDetaliata"
laMarkeri[11] = "dataora_exp"
laMarkeri[12] = "id_agent"
laMarkeri[13] = "text_aditional"
laMarkeri[14] = "discount_evidentiat"
laMarkeri[15] = "pnParametruAditional"
laMarkeri[16] = "nid_vanzare"
llToti16 = .T.
FOR lnI = 1 TO 16
IF !(laMarkeri[lnI] $ lcApel)
llToti16 = .F.
DO AfLog WITH " lipseste parametrul [" + laMarkeri[lnI] + "] din apelul scrie_proforma"
ENDIF
ENDFOR
DO Assert WITH llToti16, "toti cei 16 parametri ai scrie_proforma prezenti in apel (semnatura reala, nu cea veche cu 5)"
DO AfLog WITH "DIAG M1: done"
ENDPROC
PROCEDURE TestMarcheazaLiniiProforma
LOCAL loNou, lnRecnoInitial
gcCaz = "[M2 marcheaza_linii_proforma cu linii] "
SELECT crsfactura
ZAP
APPEND BLANK
REPLACE denumire WITH "art1", gestionabil WITH 1, id_gestiune WITH 77
APPEND BLANK
REPLACE denumire WITH "art2", gestionabil WITH 1, id_gestiune WITH 77
APPEND BLANK
REPLACE denumire WITH "art3", gestionabil WITH 1, id_gestiune WITH 77
GO 2 IN crsfactura
lnRecnoInitial = RECNO('crsfactura')
DO AfLog WITH "DIAG M2: crsfactura populat cu 3 randuri, Recno initial=" + TRANSFORM(lnRecnoInitial)
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", 27001, 1)
DO AfLog WITH "DIAG M2: poDate = Createobject(oDateFactura) OK"
poDate.nIdTipDoc = 5
DO AfLog WITH "DIAG M2: poDate.nIdTipDoc = 5 OK"
poGeneratorNumere.ResetNumere()
DO AfLog WITH "DIAG M2: poGeneratorNumere.ResetNumere() OK"
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(5)
DO AfLog WITH "DIAG M2: creeaza_cursor_serii(5) OK, rezultat=" + TRANSFORM(poDate.rezultat_serii)
DO AfLog WITH "DIAG M2: inainte de Createobject frm_facturare_articole2"
loNou = CREATEOBJECT('frm_facturare_articole2')
DO AfLog WITH "DIAG M2: Createobject frm_facturare_articole2 OK, vartype=" + VARTYPE(loNou)
IF VARTYPE(loNou) <> 'O'
DO Assert WITH .F., "Createobject frm_facturare_articole2"
ELSE
loNou.marcheaza_linii_proforma()
DO AfLog WITH "DIAG M2: marcheaza_linii_proforma() OK"
LOCAL lnRecnoDupa
lnRecnoDupa = RECNO('crsfactura')
DO AfLog WITH "DIAG M2: Recno('crsfactura') OK, dupa=" + TRANSFORM(lnRecnoDupa)
DO Assert WITH lnRecnoDupa == lnRecnoInitial, "Recno restaurat, initial=" + TRANSFORM(lnRecnoInitial) + " dupa=" + TRANSFORM(lnRecnoDupa)
DO AfLog WITH "DIAG M2: Assert Recno OK"
SELECT crsfactura
LOCAL llToateMarcate
llToateMarcate = .T.
SCAN
IF gestionabil <> 0 OR id_gestiune <> -1000
llToateMarcate = .F.
ENDIF
ENDSCAN
DO AfLog WITH "DIAG M2: SCAN OK, llToateMarcate=" + TRANSFORM(llToateMarcate)
DO Assert WITH llToateMarcate, "toate liniile gestionabil=0 si id_gestiune=-1000"
GO m.lnRecnoDupa IN crsfactura
DO AfLog WITH "DIAG M2: GO OK"
loNou.Release()
DO AfLog WITH "DIAG M2: loNou.Release() OK"
ENDIF
RELEASE loNou
DO AfLog WITH "DIAG M2: RELEASE loNou OK, rezultat_serii=" + TRANSFORM(poDate.rezultat_serii)
IF poDate.rezultat_serii <> 0
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO AfLog WITH "DIAG M2: dezaloca_numar OK"
ENDIF
DO AfLog WITH "DIAG M2: TestMarcheazaLiniiProforma TERMINAT"
ENDPROC
PROCEDURE TestMarcheazaLiniiProformaGol
LOCAL loNou
gcCaz = "[M2 marcheaza_linii_proforma pe crsfactura gol] "
DO AfLog WITH "DIAG: intrat in TestMarcheazaLiniiProformaGol"
SELECT crsfactura
ZAP
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", 27005, 1)
poDate.nIdTipDoc = 5
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(5)
loNou = CREATEOBJECT('frm_facturare_articole2')
IF VARTYPE(loNou) <> 'O'
DO Assert WITH .F., "Createobject frm_facturare_articole2"
ELSE
LOCAL llEroare
llEroare = .F.
TRY
loNou.marcheaza_linii_proforma()
CATCH
llEroare = .T.
ENDTRY
DO Assert WITH !llEroare, "marcheaza_linii_proforma nu arunca eroare pe crsfactura gol"
loNou.Release()
ENDIF
RELEASE loNou
IF poDate.rezultat_serii <> 0
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
ENDIF
ENDPROC
* Experimentul D (coordonator): reproduce exact contextul lui TestGardaBlocheaza (a treia
* instantiere a formularului, aceleasi valori) dar NU cheama do_schimba_tipdoc() - doar logheaza
* fiecare operand al conditiei gardei (ofacturare.vc2:19788) separat, plus conditia evaluata in
* test. Zero risc: nu se atinge nicio metoda de productie care ar putea deschide un dialog sau
* reincarca serii.
PROCEDURE TestD_OperandGarda
LOCAL loNou, lcValoare, lcValoareUpper, lnReccount, lnEProforma, llConditie
gcCaz = "[D operanzi garda, fara do_schimba_tipdoc] "
DO AfLog WITH "DIAG D: intrat in TestD_OperandGarda"
SELECT crsfactura
ZAP
APPEND BLANK
REPLACE denumire WITH "art1"
DO AfLog WITH "DIAG D: crsfactura populat cu 1 rand"
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", 27010, 1)
poDate.nIdTipDoc = 5
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(5)
DO AfLog WITH "DIAG D: creeaza_cursor_serii(5) OK, rezultat=" + TRANSFORM(poDate.rezultat_serii)
loNou = CREATEOBJECT('frm_facturare_articole2')
DO AfLog WITH "DIAG D: Createobject frm_facturare_articole2 OK, vartype=" + VARTYPE(loNou)
IF VARTYPE(loNou) <> 'O'
DO Assert WITH .F., "Createobject frm_facturare_articole2"
ELSE
poDate.eProforma = 1
loNou.clb_fdoc.cboFdoc.Value = "FACTURA"
DO AfLog WITH "DIAG D: proprietati setate (eProforma=1, cboFdoc.Value=FACTURA)"
lcValoare = loNou.clb_fdoc.cboFdoc.Value
lcValoareUpper = UPPER(lcValoare)
lnReccount = RECCOUNT('crsfactura')
lnEProforma = poDate.eProforma
llConditie = (lnEProforma = 1 AND lcValoareUpper <> "PROFORMA" AND lnReccount > 0)
DO AfLog WITH "DIAG D: cboFdoc.Value=[" + lcValoare + "] (lungime=" + TRANSFORM(LEN(lcValoare)) + ")"
DO AfLog WITH "DIAG D: UPPER(cboFdoc.Value)=[" + lcValoareUpper + "]"
DO AfLog WITH "DIAG D: poDate.eProforma=" + TRANSFORM(lnEProforma)
DO AfLog WITH "DIAG D: Reccount('crsfactura')=" + TRANSFORM(lnReccount)
DO AfLog WITH "DIAG D: CONDITIA GARDEI (eProforma=1 AND Upper(Value)<>PROFORMA AND Reccount>0) = " + TRANSFORM(llConditie)
IF llConditie
DO AfLog WITH "DIAG D: VERDICT: garda S-AR FI DECLANSAT (blocheaza) - do_schimba_tipdoc ar fi intrat pe ramura sigura"
ELSE
DO AfLog WITH "DIAG D: VERDICT: garda NU s-ar fi declansat - do_schimba_tipdoc ar fi CAZUT PRIN ea, spre alege_tipdoc/schimba_tipdoc"
ENDIF
* nu se cheama do_schimba_tipdoc() - experimentul D se opreste aici, deliberat
loNou.Release()
DO AfLog WITH "DIAG D: loNou.Release() OK"
ENDIF
RELEASE loNou
IF poDate.rezultat_serii <> 0
poGeneratorNumere.dezaloca_numar(5)
DO AfLog WITH "DIAG D: dezaloca_numar OK"
ENDIF
DO AfLog WITH "DIAG D: TestD_OperandGarda TERMINAT"
ENDPROC
PROCEDURE TestGardaBlocheaza
LOCAL loNou
gcCaz = "[M3 garda blocheaza PROFORMA->FACTURA cu linii] "
DO AfLog WITH "DIAG: intrat in TestGardaBlocheaza"
SELECT crsfactura
ZAP
APPEND BLANK
REPLACE denumire WITH "art1"
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", 27002, 1)
poDate.nIdTipDoc = 5 && FACTURA la instantiere - are plaje, sigur
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(5)
DO AfLog WITH "DIAG: TestGardaBlocheaza - creeaza_cursor_serii(5) OK, rezultat=" + TRANSFORM(poDate.rezultat_serii)
loNou = CREATEOBJECT('frm_facturare_articole2')
DO AfLog WITH "DIAG: TestGardaBlocheaza - Createobject frm_facturare_articole2 OK"
IF VARTYPE(loNou) <> 'O'
DO Assert WITH .F., "Createobject frm_facturare_articole2"
ELSE
* eProforma setat DIRECT dupa instantiere - nu prin nIdTipDoc, nu comuta efectiv tipul
poDate.eProforma = 1
loNou.clb_fdoc.cboFdoc.Value = "FACTURA"
gcMockUltimMesaj = ""
* FUNCTION amessagebox locala (mai jos in acest .prg) NU protejeaza acest apel - experimentul F
* a demonstrat ca precedenta unei functii definite in .prg-ul curent NU se mosteneste in
* interiorul unei metode compilate separat (aici: do_schimba_tipdoc, metoda din ofacturare.vcx).
* Reincarcarea mock_amessagebox.prg chiar inainte de apel (fara nicio proba prin executie -
* SET PROCEDURE nu executa nimic, deci nu are cum sa deschida un dialog) e mecanismul corect
* pentru un apel facut din interiorul unei metode de clasa.
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE
loNou.do_schimba_tipdoc()
DO AfLog WITH "DIAG: TestGardaBlocheaza - do_schimba_tipdoc() OK"
DO Assert WITH poDate.nIdTipDoc == 5, "poDate.nIdTipDoc neschimbat, ramas=" + TRANSFORM(poDate.nIdTipDoc)
DO Assert WITH "Stergeti articolele" $ gcMockUltimMesaj, "mesajul de refuz s-a declansat, primit=[" + gcMockUltimMesaj + "]"
DO Assert WITH UPPER(loNou.clb_fdoc.cboFdoc.Value) == "PROFORMA", "cboFdoc.Value readus pe PROFORMA, e=" + TRANSFORM(loNou.clb_fdoc.cboFdoc.Value)
loNou.Release()
DO AfLog WITH "DIAG: TestGardaBlocheaza - loNou.Release() OK"
ENDIF
RELEASE loNou
IF poDate.rezultat_serii <> 0
poGeneratorNumere.dezaloca_numar(5)
DO AfLog WITH "DIAG: TestGardaBlocheaza - dezaloca_numar OK"
ENDIF
DO AfLog WITH "DIAG: TestGardaBlocheaza TERMINAT"
ENDPROC
PROCEDURE TestGardaFaraLinii
LOCAL loNou
gcCaz = "[M3 garda nu blocheaza fara linii, tinta FACTURA] "
DO AfLog WITH "DIAG: intrat in TestGardaFaraLinii"
IF !glFacturaAreplaje
DO AfLog WITH "SARIT - " + gcCaz + "nu exista plaje de serii pentru tipul FACTURA in acest mediu"
gnSarit = gnSarit + 1
RETURN
ENDIF
SELECT crsfactura
ZAP
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", 27003, 1)
poDate.nIdTipDoc = 5 && FACTURA la instantiere
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(5)
DO AfLog WITH "DIAG: TestGardaFaraLinii - creeaza_cursor_serii(5) OK, rezultat=" + TRANSFORM(poDate.rezultat_serii)
loNou = CREATEOBJECT('frm_facturare_articole2')
DO AfLog WITH "DIAG: TestGardaFaraLinii - Createobject frm_facturare_articole2 OK"
IF VARTYPE(loNou) <> 'O'
DO Assert WITH .F., "Createobject frm_facturare_articole2"
ELSE
* eProforma fortat direct la 1, dar tinta ramane FACTURA (are plaje) si crsfactura e gol
poDate.eProforma = 1
loNou.clb_fdoc.cboFdoc.Value = "FACTURA"
gcMockUltimMesaj = ""
* vezi TestGardaBlocheaza - reincarcare inainte de apel, mecanismul corect pentru un apel
* facut din interiorul unei metode de clasa (experimentul F)
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE
loNou.do_schimba_tipdoc()
DO AfLog WITH "DIAG: TestGardaFaraLinii - do_schimba_tipdoc() OK"
DO Assert WITH !("Stergeti articolele" $ gcMockUltimMesaj), "fara dialog de refuz cand crsfactura e gol, primit=[" + gcMockUltimMesaj + "]"
loNou.Release()
DO AfLog WITH "DIAG: TestGardaFaraLinii - loNou.Release() OK"
ENDIF
RELEASE loNou
IF poDate.rezultat_serii <> 0
poGeneratorNumere.dezaloca_numar(5)
DO AfLog WITH "DIAG: TestGardaFaraLinii - dezaloca_numar OK"
ENDIF
DO AfLog WITH "DIAG: TestGardaFaraLinii TERMINAT"
ENDPROC
PROCEDURE TestGardaSensLiber
LOCAL loNou, llConditieGarda
gcCaz = "[M3 sensul liber FACTURA->PROFORMA cu linii] "
* Nesigur de rulat: ar comuta efectiv catre PROFORMA, ceea ce ar cere plaje de serii pentru
* tipul de document 23 - PROFORMA, absente in MARIUSM_AUTO (confirmat de sonda de mai sus).
* Nu se cheama do_schimba_tipdoc() aici. Se evalueaza static conditia gardei: cu eProforma=0
* (pornind ca FACTURA) garda nu trebuie sa opreasca trecerea, indiferent daca exista linii.
DO AfLog WITH "SARIT (rulare reala) - " + gcCaz + "nu exista plaje de serii pentru tipul PROFORMA in acest mediu; se evalueaza static conditia gardei"
gnSarit = gnSarit + 1
SELECT crsfactura
ZAP
APPEND BLANK
REPLACE denumire WITH "art1"
APPEND BLANK
REPLACE denumire WITH "art2"
poDate = NULL
poDate = CREATEOBJECT("oDateFactura", 27004, 1)
poDate.nIdTipDoc = 5 && FACTURA
loNou = CREATEOBJECT('frm_facturare_articole2')
IF VARTYPE(loNou) <> 'O'
DO Assert WITH .F., "Createobject frm_facturare_articole2"
ELSE
DO Assert WITH poDate.eProforma == 0, "precontitie eProforma=0 dupa nIdTipDoc=5"
loNou.clb_fdoc.cboFdoc.Value = "PROFORMA"
* conditia gardei din do_schimba_tipdoc (ofacturare.vc2) evaluata direct, fara sa se cheme metoda
llConditieGarda = (poDate.eProforma = 1 AND UPPER(loNou.clb_fdoc.cboFdoc.Value) <> "PROFORMA" AND RECCOUNT('crsfactura') > 0)
DO Assert WITH !llConditieGarda, "conditia gardei e falsa cand eProforma=0 (sensul liber FACTURA->PROFORMA nu e blocat)"
loNou.Release()
ENDIF
RELEASE loNou
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
* FUNCTION amessagebox definita AICI, in .prg-ul care se executa acum - confirmat experimental
* (experimentul A, docs\raport_s5b_implementare.md) ca o procedura/functie din PRG-ul curent are
* precedenta NECONDITIONATA fata de orice SET PROCEDURE ... ADDITIVE, deci apelul nu poate rezolva
* niciodata catre amessagebox() real din COMUN\programe\oproceduri_comune.prg. Corp copiat identic
* din mock_amessagebox.prg (aceeasi semantica: gcMockUltimMesaj/gnMockUltimTip pentru asertii pe
* textul dialogului, gnMockRaspuns/gnMockRaspunsTotal pentru raspunsuri configurabile per caz).
FUNCTION amessagebox
LPARAMETERS tcMessage, tnDialogBoxType, tcTitle, tcFont, tnTimeOut, tnTimeoutValue
LOCAL lnRaspuns
IF TYPE('gnMockRaspunsTotal') = 'N' AND 'Actualizati totalul facturii' $ tcMessage
lnRaspuns = gnMockRaspunsTotal
ELSE
lnRaspuns = IIF(TYPE('gnMockRaspuns') = 'N', gnMockRaspuns, 6)
ENDIF
IF TYPE('gcMockUltimMesaj') = 'C'
gcMockUltimMesaj = TRANSFORM(tcMessage)
gnMockUltimTip = IIF(TYPE('tnDialogBoxType') = 'N', tnDialogBoxType, 0)
ENDIF
RETURN lnRaspuns
ENDFUNC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL: " + gcCaz + 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
DO AfLog WITH "ERROR " + gcCaz + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " sarit=" + TRANSFORM(gnSarit)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,17 @@
# test_s5c_emitere_reala_ui.ps1 - wrapper peste harness-ul generic (vfp_ui_harness.ps1) pentru
# test_s5c_emitere_reala_ui.prg (S5c, proba capat-la-capat: factura din proforma, pasii C0-C10).
# Rulare VIZIBILA (vfp9 -A, fereastra impinsa off-screen de harness), NU -A -T: sub -A -T
# coloanele de grid nu se materializeaza.
# Folderele de sincronizare/capturi sunt noi - harness-ul le goleste la pornire.
# Rulare: powershell -ExecutionPolicy Bypass -File test_s5c_emitere_reala_ui.ps1 (timeout >= 600s)
$ErrorActionPreference = 'Stop'
$Teste = $PSScriptRoot
Get-ChildItem -Path $Teste -Filter '*.FXP' -ErrorAction SilentlyContinue | Remove-Item -Force -ErrorAction SilentlyContinue
Get-ChildItem -Path $Teste -Filter '*.fxp' -ErrorAction SilentlyContinue | Remove-Item -Force -ErrorAction SilentlyContinue
& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') `
-TestPrg (Join-Path $Teste 'test_s5c_emitere_reala_ui.prg') `
-Steps @('env_gata','proforma_emisa','factura_emisa','neregresie_emis') `
-StepTimeoutSec 180 `
-ReadyTimeoutSec 240 `
-SyncDir (Join-Path $Teste 'uisync_s5c') `
-ShotsDir (Join-Path $Teste 'screenshots_s5c_01_09')

View File

@@ -0,0 +1,199 @@
* test_s5c_legatura_sql.prg
* Headless (-A -T): S5c, contractul Oracle al legaturii proforma -> factura, izolat de UI.
* Ruleaza EXACT blocul anonim pe care il trimite scrie_legatura_proforma() (ofacturare_comun.prg):
* begin pack_facturare.nid_vanzare := <factura>; pack_facturare.clistaid := '<proforma>';
* pack_facturare.scrie_corespondente_vanzari(4); end;
* B1 - numaratoarea initiala a randurilor TIP = 4 din VANZARI_CORESP
* B2 - alege o proforma reala si o factura reala fara corespondente (daca nu exista, SARIT)
* B3 - blocul anonim, in tranzactie MANUALA
* B4 - randul TIP = 4 factura -> proforma exista si e unic
* B5 - efectul colateral masurat: VANZARI.AVIZE al facturii contine seria+numarul proformei
* B6 - ROLLBACK; numaratoarea TIP = 4 revine la valoarea de la B1 (testul nu lasa date in urma)
*
* Nu emite documente si nu consuma numere. Toate scrierile sunt anulate de ROLLBACK-ul de la B6;
* Final() mai face un rollback defensiv si readuce conexiunea pe tranzactie automata.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s5c_legatura_sql.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5c_legatura_sql.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gnSarit, gcCaz, gnH, glManual
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5c_legatura_sql.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
gnSarit = 0
gcCaz = ""
glManual = .F.
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
SQLSETPROP(gnHandle, "QueryTimeOut", 45)
IF TYPE('goExecutor.nHandle') = 'N' AND goExecutor.nHandle > 0 AND goExecutor.nHandle <> gnHandle
SQLSETPROP(goExecutor.nHandle, "QueryTimeOut", 45)
ENDIF
PUBLIC gcMockUltimMesaj, gnMockUltimTip
gcMockUltimMesaj = ""
gnMockUltimTip = 0
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
* toate scrierile si toate citirile trec prin goExecutor -> tranzactia se deschide pe handle-ul LUI,
* altfel ROLLBACK-ul de la B6 ar anula alta sesiune decat cea care a scris
gnH = IIF(TYPE('goExecutor.nHandle') = 'N' AND goExecutor.nHandle > 0, goExecutor.nHandle, gnHandle)
DO AfLog WITH "ENV OK gnHandle=" + TRANSFORM(gnHandle) + " goExecutor.nHandle=" + TRANSFORM(gnH)
DO TestLegaturaTip4
DO Final
*----------------------------------------------------------------------------------------
PROCEDURE TestLegaturaTip4
LOCAL lnInainte, lnProf, lnFact, lnDupaInsert, lnAvize, lnDupaRollback, lnSucces
gcCaz = "[B legatura TIP = 4 pe contractul Oracle] "
* B1
lnInainte = ValoareScalara([select count(*) as nr from vanzari_coresp where tip = 4])
DO Assert WITH lnInainte >= 0, "B1 numaratoare initiala TIP = 4 citita, e=" + TRANSFORM(lnInainte)
IF lnInainte < 0
RETURN
ENDIF
DO AfLog WITH "B1: vanzari_coresp tip=4 inainte = " + TRANSFORM(lnInainte)
* B2 - nu se inventeaza date: fara proforma sau fara factura libera, pasul e SARIT
lnProf = ValoareScalara([select id_vanzare as nr from (select id_vanzare from vanzari ] + ;
[where sters = 0 and nvl(eproforma,0) = 1 order by id_vanzare desc) where rownum = 1])
lnFact = ValoareScalara([select id_vanzare as nr from (select v.id_vanzare from vanzari v ] + ;
[where v.sters = 0 and nvl(v.eproforma,0) = 0 and v.tip in (1,5,7,10) ] + ;
[and not exists (select 1 from vanzari_coresp c where c.id_vanzare_fact = v.id_vanzare) ] + ;
[order by v.id_vanzare desc) where rownum = 1])
DO AfLog WITH "B2: lnProf=" + TRANSFORM(lnProf) + " lnFact=" + TRANSFORM(lnFact)
IF lnProf <= 0 OR lnFact <= 0
DO AfLog WITH "SARIT - " + gcCaz + "nu exista in MARIUSM_AUTO o proforma (lnProf=" + TRANSFORM(lnProf) + ;
") si/sau o factura fara corespondente (lnFact=" + TRANSFORM(lnFact) + ")"
gnSarit = gnSarit + 1
RETURN
ENDIF
* tranzactie manuala pe handle-ul lui goExecutor - acelasi tipar ca do_deschide_tranzactie
goExecutor.oExecuta([select * from dual])
lnSucces = SQLSETPROP(gnH, "Transactions", 2)
IF lnSucces < 0
DO Assert WITH .F., "trecerea pe tranzactie manuala a esuat - testul NU se ruleaza (ar lasa date)"
RETURN
ENDIF
glManual = .T.
DO AfLog WITH "tranzactie MANUALA deschisa pe handle " + TRANSFORM(gnH)
* B3 - blocul anonim, identic cu cel construit de scrie_legatura_proforma()
lnSucces = goExecutor.oExecute([begin pack_facturare.nid_vanzare := ] + ALLTRIM(STR(lnFact, 20, 0)) + [;] + ;
[ pack_facturare.clistaid := '] + ALLTRIM(STR(lnProf, 20, 0)) + [';] + ;
[ pack_facturare.scrie_corespondente_vanzari(4); end;])
DO Assert WITH lnSucces >= 0, "B3 blocul anonim s-a executat fara eroare Oracle, succes=" + TRANSFORM(lnSucces) + ;
" eroare=" + IIF(lnSucces < 0, TRANSFORM(goExecutor.cEroare), "")
IF lnSucces < 0
DO FaRollback
RETURN
ENDIF
* B4
lnDupaInsert = ValoareScalara([select count(*) as nr from vanzari_coresp where sters = 0 and tip = 4 ] + ;
[and id_vanzare_fact = ] + ALLTRIM(STR(lnFact, 20, 0)) + ;
[ and id_vanzare_aviz = ] + ALLTRIM(STR(lnProf, 20, 0)))
DO Assert WITH lnDupaInsert = 1, "B4 exact un rand TIP = 4 factura -> proforma, e=" + TRANSFORM(lnDupaInsert)
DO AfLog WITH "B4: randuri tip=4 fact=" + TRANSFORM(lnFact) + " aviz=" + TRANSFORM(lnProf) + " -> " + TRANSFORM(lnDupaInsert)
* B5 - efectul colateral din 1.5, masurat nu presupus: comparatia se face in SQL, ca sa nu depinda
* de formatarea numarului in VFP
lnAvize = ValoareScalara([select count(*) as nr from vanzari f where f.id_vanzare = ] + ALLTRIM(STR(lnFact, 20, 0)) + ;
[ and f.avize like '%' || (select nvl(p.serie_act,'') || chr(32) || p.numar_act from vanzari p ] + ;
[where p.id_vanzare = ] + ALLTRIM(STR(lnProf, 20, 0)) + [) || '%'])
DO Assert WITH lnAvize = 1, "B5 VANZARI.AVIZE al facturii contine seria+numarul proformei (efect colateral cunoscut), e=" + ;
TRANSFORM(lnAvize)
DO AfLog WITH "B5: VANZARI.AVIZE contine seria+numarul proformei -> " + TRANSFORM(lnAvize)
* B6
DO FaRollback
lnDupaRollback = ValoareScalara([select count(*) as nr from vanzari_coresp where tip = 4])
DO Assert WITH lnDupaRollback = lnInainte, ;
"B6 dupa ROLLBACK numaratoarea TIP = 4 revine la valoarea initiala, inainte=" + TRANSFORM(lnInainte) + ;
" dupa=" + TRANSFORM(lnDupaRollback)
DO AfLog WITH "B6: vanzari_coresp tip=4 dupa rollback = " + TRANSFORM(lnDupaRollback)
ENDPROC
PROCEDURE FaRollback
LOCAL lnSucces
IF !glManual
RETURN
ENDIF
lnSucces = SQLROLLBACK(gnH)
DO AfLog WITH "ROLLBACK succes=" + TRANSFORM(lnSucces)
SQLSETPROP(gnH, "Transactions", 1)
glManual = .F.
ENDPROC
FUNCTION ValoareScalara
LPARAMETERS tcSql
LOCAL lnRez, lnSucces
lnRez = -1
lnSucces = goExecutor.oExecute(tcSql, [crsscalar])
IF lnSucces >= 0 AND USED('crsscalar')
IF RECCOUNT('crsscalar') > 0
SELECT crsscalar
GO TOP
lnRez = NVL(crsscalar.nr, 0)
ELSE
lnRez = 0
ENDIF
USE IN (SELECT('crsscalar'))
ELSE
DO AfLog WITH "SQL ESEC: " + TRANSFORM(goExecutor.cEroare) + " | " + tcSql
ENDIF
RETURN lnRez
ENDFUNC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL: " + gcCaz + 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
DO AfLog WITH "ERROR " + gcCaz + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
* rollback defensiv: daca testul a cazut in mijloc, nimic nu ramane scris
IF glManual
DO AfLog WITH "rollback defensiv (tranzactia era inca deschisa)"
DO FaRollback
ENDIF
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " sarit=" + TRANSFORM(gnSarit)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,233 @@
* test_s5c_rutare_copiere.prg
* Headless (-A -T), static, FARA Oracle: probeaza RUTAREA copierii unui document, nu formularul.
* Testul UI existent instantiaza frm_facturare_articole2 direct si sare peste rutarea din
* factureaza() - de aceea nu a prins ca scrie_legatura_proforma() lipsea de pe calea reala (v1).
* R1 - copiere_factura cheama factureaza(toFactura.Tip, toFactura), fara plFacturareNoua
* R2 - plFacturareNoua e declarat Private numai in Clase\ofundal_facturare.vc2 (doua situri)
* si nu apare deloc in COMUN\programe\oproceduri_facturare.prg
* R3 - deci pe calea de copiere llFacturareNoua = .F. -> se emite pe frm_facturare_articole (v1)
* R4 - completeaza_setari_document(toFactura, .T.) se cheama INAINTE de comutarea v1/v2,
* deci poDate.lProformaSursa se ridica si pe traseul v1
* R5 - scrie_legatura_proforma() apare de doua ori in ofacturare.vc2: o data in v1, o data in v2
* R6 - in do_scrie_factura din v1 apelul e conditionat de If m.llReturn si e inainte de
* do_inchide_tranzactie(1) (aceeasi tranzactie)
* R7 - acelasi lucru in do_scrie_factura din v2 (neregresie fata de S5c)
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s5c_rutare_copiere.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5c_rutare_copiere.log
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gnSarit, gcCaz, gcVc2, gcPrgRut, gcPrgFact, gcFundal
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5c_rutare_copiere.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
gnSarit = 0
gcCaz = ""
ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
gcVc2 = "D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2"
gcPrgRut = "D:\ROA\ROAFACTURARE\COMUN\programe\oproceduri_facturare.prg"
gcPrgFact = "D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare.prg"
gcFundal = "D:\ROA\ROAFACTURARE\Clase\ofundal_facturare.vc2"
DO TestCopiereFaraSteagulNou
DO TestSteagulNouDoarPeButoaneleNoi
DO TestSemnalulSeSeteazaInainteDeRutare
DO TestApelPeAmbeleFormulare
DO TestApelInV1
DO TestApelInV2
DO Final
*----------------------------------------------------------------------------------------
* R1: copiere_factura ruteaza catre factureaza fara sa ridice plFacturareNoua
PROCEDURE TestCopiereFaraSteagulNou
LOCAL lcTxt, lcProc
gcCaz = "[R1 copiere_factura -> factureaza fara plFacturareNoua] "
lcTxt = FILETOSTR(gcPrgRut)
IF EMPTY(lcTxt)
DO Assert WITH .F., "FILETOSTR oproceduri_facturare.prg a esuat/gol"
RETURN
ENDIF
lcProc = Fereastra(lcTxt, "PROCEDURE copiere_factura", "ENDPROC")
IF EMPTY(lcProc)
DO Assert WITH .F., "nu s-a putut izola PROCEDURE copiere_factura"
RETURN
ENDIF
DO AfLog WITH "DIAG R1: copiere_factura len=" + TRANSFORM(LEN(lcProc))
DO Assert WITH "factureaza(toFactura.Tip, toFactura)" $ lcProc, ;
"copiere_factura cheama factureaza(toFactura.Tip, toFactura)"
DO Assert WITH OCCURS("plFacturareNoua", lcTxt) = 0, ;
"plFacturareNoua nu apare in oproceduri_facturare.prg, ocurente=" + ;
TRANSFORM(OCCURS("plFacturareNoua", lcTxt))
ENDPROC
* R2 + R3: steagul e ridicat numai de butoanele "Facturare (nou)" / "Avize (nou)"
PROCEDURE TestSteagulNouDoarPeButoaneleNoi
LOCAL lcFundal, lcFact
gcCaz = "[R2/R3 plFacturareNoua ridicat numai in ofundal_facturare] "
lcFundal = FILETOSTR(gcFundal)
lcFact = FILETOSTR(gcPrgFact)
IF EMPTY(lcFundal) OR EMPTY(lcFact)
DO Assert WITH .F., "FILETOSTR ofundal_facturare.vc2 / ofacturare.prg a esuat/gol"
RETURN
ENDIF
DO Assert WITH OCCURS("Private plFacturareNoua", lcFundal) = 2, ;
"doua declaratii Private plFacturareNoua in ofundal_facturare.vc2, ocurente=" + ;
TRANSFORM(OCCURS("Private plFacturareNoua", lcFundal))
DO Assert WITH OCCURS("Private plFacturareNoua", lcFact) = 0, ;
"ofacturare.prg doar citeste steagul, nu il declara"
DO Assert WITH "llFacturareNoua = (Type('plFacturareNoua') = 'L'" $ lcFact, ;
"factureaza decide v1/v2 dupa Type('plFacturareNoua')"
* fara declaratie pe lantul de apel, Type() da 'U' -> llFacturareNoua = .F. -> v1
DO Assert WITH "ofrmdetaliifactura = Createobject('frm_facturare_articole2')" $ lcFact, ;
"ramura llFacturareNoua = .T. instantiaza v2 (deci ramura .F. ramane pe v1)"
ENDPROC
* R4: semnalul lProformaSursa se ridica inaintea comutarii v1/v2, deci si pe traseul v1
PROCEDURE TestSemnalulSeSeteazaInainteDeRutare
LOCAL lcTxt, lnSetare, lnComutare
gcCaz = "[R4 completeaza_setari_document inainte de comutarea v1/v2] "
lcTxt = FILETOSTR(gcPrgFact)
IF EMPTY(lcTxt)
DO Assert WITH .F., "FILETOSTR ofacturare.prg a esuat/gol"
RETURN
ENDIF
lnSetare = AT("poDate.completeaza_setari_document(m.toFactura, .T.)", lcTxt)
lnComutare = AT("llFacturareNoua = (Type('plFacturareNoua')", lcTxt)
DO Assert WITH lnSetare > 0, "completeaza_setari_document(m.toFactura, .T.) prezent, poz=" + TRANSFORM(lnSetare)
DO Assert WITH lnComutare > 0, "comutarea v1/v2 prezenta, poz=" + TRANSFORM(lnComutare)
IF lnSetare > 0 AND lnComutare > 0
DO Assert WITH lnSetare < lnComutare, ;
"semnalul se ridica INAINTE de rutare (comun ambelor formulare), setare=" + ;
TRANSFORM(lnSetare) + " comutare=" + TRANSFORM(lnComutare)
ENDIF
ENDPROC
* R5: apelul exista pe ambele formulare, cate o singura data
PROCEDURE TestApelPeAmbeleFormulare
LOCAL lcTxt, lcV1, lcV2
gcCaz = "[R5 apelul e si pe v1 si pe v2] "
lcTxt = FILETOSTR(gcVc2)
IF EMPTY(lcTxt)
DO Assert WITH .F., "FILETOSTR ofacturare.vc2 a esuat/gol"
RETURN
ENDIF
DO Assert WITH OCCURS("scrie_legatura_proforma()", lcTxt) = 2, ;
"doua apeluri scrie_legatura_proforma() in ofacturare.vc2, ocurente=" + ;
TRANSFORM(OCCURS("scrie_legatura_proforma()", lcTxt))
lcV1 = FereastraClasa(lcTxt, 1)
lcV2 = FereastraClasa(lcTxt, 2)
DO Assert WITH !EMPTY(lcV1), "clasa frm_facturare_articole (v1) izolata"
DO Assert WITH !EMPTY(lcV2), "clasa frm_facturare_articole2 (v2) izolata"
IF !EMPTY(lcV1)
DO Assert WITH OCCURS("scrie_legatura_proforma()", lcV1) = 1, ;
"un apel in clasa v1, ocurente=" + TRANSFORM(OCCURS("scrie_legatura_proforma()", lcV1))
ENDIF
IF !EMPTY(lcV2)
DO Assert WITH OCCURS("scrie_legatura_proforma()", lcV2) = 1, ;
"un apel in clasa v2, ocurente=" + TRANSFORM(OCCURS("scrie_legatura_proforma()", lcV2))
ENDIF
ENDPROC
* R6: pozitia si conditia apelului in do_scrie_factura din v1
PROCEDURE TestApelInV1
gcCaz = "[R6 v1: apel conditionat, inainte de COMMIT] "
DO VerificaMetoda WITH 1, "If m.llReturn"
ENDPROC
* R7: acelasi lucru in v2 (neregresie)
PROCEDURE TestApelInV2
gcCaz = "[R7 v2: apel conditionat, inainte de COMMIT] "
DO VerificaMetoda WITH 2, "If llReturn"
ENDPROC
PROCEDURE VerificaMetoda
LPARAMETERS tnVersiune, tcGarda
LOCAL lcTxt, lcClasa, lcMetoda, lnApel, lnCommit, lcSecventa
lcTxt = FILETOSTR(gcVc2)
lcClasa = FereastraClasa(lcTxt, tnVersiune)
IF EMPTY(lcClasa)
DO Assert WITH .F., "clasa nu s-a putut izola"
RETURN
ENDIF
lcMetoda = Fereastra(lcClasa, CHR(9) + "PROCEDURE do_scrie_factura" + CHR(13), CHR(9) + "ENDPROC")
IF EMPTY(lcMetoda)
DO Assert WITH .F., "nu s-a putut izola do_scrie_factura"
RETURN
ENDIF
DO AfLog WITH "DIAG: do_scrie_factura v" + TRANSFORM(tnVersiune) + " len=" + TRANSFORM(LEN(lcMetoda))
lnApel = AT("scrie_legatura_proforma()", lcMetoda)
lnCommit = AT("Thisform.do_inchide_tranzactie(1)", lcMetoda)
DO Assert WITH lnApel > 0, "apelul e in do_scrie_factura, poz=" + TRANSFORM(lnApel)
DO Assert WITH lnCommit > 0, "do_inchide_tranzactie(1) prezent, poz=" + TRANSFORM(lnCommit)
IF lnApel > 0 AND lnCommit > 0
DO Assert WITH lnApel < lnCommit, ;
"apelul e INAINTE de do_inchide_tranzactie(1), apel=" + TRANSFORM(lnApel) + ;
" commit=" + TRANSFORM(lnCommit)
ENDIF
lcSecventa = tcGarda + CHR(13) + CHR(10) + REPLICATE(CHR(9), 4) + "llReturn = scrie_legatura_proforma()"
DO Assert WITH lcSecventa $ lcMetoda, ;
"apelul e in ramura " + tcGarda + " (nu neconditionat)"
ENDPROC
*----------------------------------------------------------------------------------------
* felie de text intre un marcaj de start si primul marcaj de sfarsit de dupa el
FUNCTION Fereastra
LPARAMETERS tcTxt, tcStart, tcEnd
LOCAL lnStart, lnEnd
lnStart = AT(tcStart, tcTxt)
IF lnStart = 0
RETURN ""
ENDIF
lnEnd = AT(tcEnd, SUBSTR(tcTxt, lnStart))
IF lnEnd = 0
RETURN ""
ENDIF
RETURN SUBSTR(tcTxt, lnStart, lnEnd + LEN(tcEnd) - 1)
ENDFUNC
* corpul clasei frm_facturare_articole (tnVersiune = 1) sau frm_facturare_articole2 (tnVersiune = 2)
FUNCTION FereastraClasa
LPARAMETERS tcTxt, tnVersiune
LOCAL lnV1, lnV2
lnV1 = AT("DEFINE CLASS frm_facturare_articole AS", tcTxt)
lnV2 = AT("DEFINE CLASS frm_facturare_articole2 AS", tcTxt)
IF lnV1 = 0 OR lnV2 = 0 OR lnV1 >= lnV2
RETURN ""
ENDIF
IF tnVersiune = 1
RETURN SUBSTR(tcTxt, lnV1, lnV2 - lnV1)
ENDIF
RETURN SUBSTR(tcTxt, lnV2)
ENDFUNC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL: " + gcCaz + 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
DO AfLog WITH "ERROR " + gcCaz + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " sarit=" + TRANSFORM(gnSarit)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,305 @@
* test_s5c_semnal_proforma.prg
* Headless (-A -T): S5c, semnalul "sursa era proforma" pe oDateFactura (COMUN\programe\ofacturare_comun.prg)
* si pozitia apelului scrie_legatura_proforma() in frm_facturare_articole2.do_scrie_factura
* (COMUN\clase\ofacturare.vc2).
* A1 - completeaza_setari_document(sursa cu eproforma=1, .T.) seteaza lProformaSursa/nIdProformaSursa/listaid
* A2 - aceeasi cale cu eproforma=0 nu ridica semnalul
* A3 - Reset() curata semnalul (fara asta, al doilea document din aceeasi sesiune ar primi legatura falsa)
* A4 - sursa fara proprietatea eproforma: garda PEMSTATUS tine, fara eroare
* A5 - static: apelul scrie_legatura_proforma() e INAINTE de do_inchide_tranzactie(1) (deci inainte de COMMIT)
* A6 - static: apelul e in ramura If llReturn, nu neconditionat; cate o data in v1 si in v2
* A7 - runtime: functia e vizibila si iese curat cand nu exista poDate
* A8 - runtime: cu lProformaSursa = .F. iese fara SQL
* A9 - runtime: garda Between pe nid_vanzare (ramas 9999999999) opreste apelul
*
* Nu emite documente, nu scrie in Oracle. Conexiunea Oracle se face doar pentru globalele de mediu
* (gnZileScadentaFact, gnDiscountEvidentiat) folosite de oDateFactura.Reset.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s5c_semnal_proforma.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5c_semnal_proforma.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gnSarit, gcCaz
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5c_semnal_proforma.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
gnSarit = 0
gcCaz = ""
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
SQLSETPROP(gnHandle, "QueryTimeOut", 45)
IF TYPE('goExecutor.nHandle') = 'N' AND goExecutor.nHandle > 0 AND goExecutor.nHandle <> gnHandle
SQLSETPROP(goExecutor.nHandle, "QueryTimeOut", 45)
ENDIF
PUBLIC gcMockUltimMesaj, gnMockUltimTip
gcMockUltimMesaj = ""
gnMockUltimTip = 0
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
DO AfLog WITH "ENV OK"
PRIVATE poDate
poDate = NULL
DO TestSemnalCopiereProforma
DO TestSemnalCopiereNeproforma
DO TestResetCurataSemnal
DO TestSursaFaraEproforma
DO TestPozitieApelInaintePreCommit
DO TestApelCondionatSiNumaiInV2
DO TestFunctieVizibilaFaraPoDate
DO TestFunctieIeseFaraSemnal
DO TestGardaNidVanzareInitial
DO Final
*----------------------------------------------------------------------------------------
* obiect sursa echivalent cu SCATTER NAME loFactura MEMO din crsFacturi (campurile citite de
* completeaza_setari_document, ramura de copiere)
FUNCTION SursaCopiere
LPARAMETERS tnEProforma, tlFaraEproforma
LOCAL loSursa
loSursa = CREATEOBJECT('Empty')
AddProperty(loSursa, 'id_lucrare', 111)
AddProperty(loSursa, 'lucrare', 'LUCRARE TEST')
AddProperty(loSursa, 'id_sectie', 2)
AddProperty(loSursa, 'sectie', 'SECTIA 2')
AddProperty(loSursa, 'id_agent', 3)
AddProperty(loSursa, 'nume_agent', 'AGENT TEST')
AddProperty(loSursa, 'id_delegat', 4)
AddProperty(loSursa, 'delegat', 'DELEGAT TEST')
AddProperty(loSursa, 'BIdelegat', 'XX')
AddProperty(loSursa, 'CNPdelegat', '1234567890123')
AddProperty(loSursa, 'nrinmat', 'B00XYZ')
AddProperty(loSursa, 'id_masina', 5)
AddProperty(loSursa, 'id_vanzare', 4242424)
AddProperty(loSursa, 'serie_act', 'PRO')
AddProperty(loSursa, 'numar_act', 77)
AddProperty(loSursa, 'id_part', 6)
AddProperty(loSursa, 'client', 'CLIENT TEST')
IF !tlFaraEproforma
AddProperty(loSursa, 'eproforma', tnEProforma)
ENDIF
RETURN loSursa
ENDFUNC
PROCEDURE TestSemnalCopiereProforma
LOCAL loSursa, loD
gcCaz = "[A1 copiere din proforma] "
loSursa = SursaCopiere(1, .F.)
loD = CREATEOBJECT('oDateFactura', 0, 5)
loD.completeaza_setari_document(loSursa, .T.)
DO Assert WITH loD.lProformaSursa = .T., "lProformaSursa = .T., e=" + TRANSFORM(loD.lProformaSursa)
DO Assert WITH loD.nIdProformaSursa = loSursa.id_vanzare, ;
"nIdProformaSursa = id_vanzare sursa (" + TRANSFORM(loSursa.id_vanzare) + "), e=" + TRANSFORM(loD.nIdProformaSursa)
DO Assert WITH loD.listaid = loSursa.id_vanzare, "listaid neatins de modificare, e=" + TRANSFORM(loD.listaid)
DO Assert WITH loD.lCopiere = .T., "lCopiere = .T. (ramura de copiere chiar s-a executat)"
RELEASE loD, loSursa
ENDPROC
PROCEDURE TestSemnalCopiereNeproforma
LOCAL loSursa, loD
gcCaz = "[A2 copiere din document non-proforma] "
loSursa = SursaCopiere(0, .F.)
loD = CREATEOBJECT('oDateFactura', 0, 5)
loD.completeaza_setari_document(loSursa, .T.)
DO Assert WITH loD.lProformaSursa = .F., "lProformaSursa = .F., e=" + TRANSFORM(loD.lProformaSursa)
DO Assert WITH loD.nIdProformaSursa = 0, "nIdProformaSursa = 0, e=" + TRANSFORM(loD.nIdProformaSursa)
RELEASE loD, loSursa
ENDPROC
PROCEDURE TestResetCurataSemnal
LOCAL loSursa, loD
gcCaz = "[A3 Reset curata semnalul] "
loSursa = SursaCopiere(1, .F.)
loD = CREATEOBJECT('oDateFactura', 0, 5)
loD.completeaza_setari_document(loSursa, .T.)
DO Assert WITH loD.lProformaSursa = .T., "preconditie: semnalul e ridicat inainte de Reset"
loD.Reset(5)
DO Assert WITH loD.lProformaSursa = .F., "dupa Reset lProformaSursa = .F., e=" + TRANSFORM(loD.lProformaSursa)
DO Assert WITH loD.nIdProformaSursa = 0, "dupa Reset nIdProformaSursa = 0, e=" + TRANSFORM(loD.nIdProformaSursa)
RELEASE loD, loSursa
ENDPROC
PROCEDURE TestSursaFaraEproforma
LOCAL loSursa, loD, llEroare
gcCaz = "[A4 sursa fara proprietatea eproforma] "
loSursa = SursaCopiere(0, .T.)
loD = CREATEOBJECT('oDateFactura', 0, 5)
llEroare = .F.
TRY
loD.completeaza_setari_document(loSursa, .T.)
CATCH
llEroare = .T.
ENDTRY
DO Assert WITH !llEroare, "garda PEMSTATUS: nu se arunca eroare pe o sursa fara eproforma"
DO Assert WITH loD.lProformaSursa = .F., "lProformaSursa = .F., e=" + TRANSFORM(loD.lProformaSursa)
DO Assert WITH loD.nIdProformaSursa = 0, "nIdProformaSursa = 0, e=" + TRANSFORM(loD.nIdProformaSursa)
RELEASE loD, loSursa
ENDPROC
* fereastra de text a metodei frm_facturare_articole2.do_scrie_factura: ancorata pe
* Thisform.marcheaza_linii_proforma() (apare o singura data in tot fisierul, doar in v2 - vezi
* test_s5b_proforma.prg) si terminata pe primul ENDPROC de dupa
FUNCTION FereastraDoScrieFactura
LPARAMETERS tcTxt
LOCAL lnStart, lnEnd
lnStart = AT("Thisform.marcheaza_linii_proforma()", tcTxt)
IF lnStart = 0
RETURN ""
ENDIF
lnEnd = AT("ENDPROC", SUBSTR(tcTxt, lnStart))
IF lnEnd = 0
RETURN ""
ENDIF
RETURN SUBSTR(tcTxt, lnStart, lnEnd)
ENDFUNC
PROCEDURE TestPozitieApelInaintePreCommit
LOCAL lcTxt, lcMetoda, lnApel, lnCommit
gcCaz = "[A5 static: apelul e inainte de COMMIT] "
lcTxt = FILETOSTR("D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2")
IF EMPTY(lcTxt)
DO Assert WITH .F., "FILETOSTR ofacturare.vc2 a esuat/gol"
RETURN
ENDIF
lcMetoda = FereastraDoScrieFactura(lcTxt)
IF EMPTY(lcMetoda)
DO Assert WITH .F., "nu s-a putut izola do_scrie_factura din frm_facturare_articole2"
RETURN
ENDIF
DO AfLog WITH "DIAG A5: fereastra do_scrie_factura len=" + TRANSFORM(LEN(lcMetoda))
lnApel = AT("scrie_legatura_proforma()", lcMetoda)
lnCommit = AT("Thisform.do_inchide_tranzactie(1)", lcMetoda)
DO Assert WITH lnApel > 0, "scrie_legatura_proforma() apelat din do_scrie_factura, poz=" + TRANSFORM(lnApel)
DO Assert WITH lnCommit > 0, "do_inchide_tranzactie(1) prezent in metoda, poz=" + TRANSFORM(lnCommit)
IF lnApel > 0 AND lnCommit > 0
DO Assert WITH lnApel < lnCommit, ;
"apelul e INAINTE de do_inchide_tranzactie(1) (aceeasi tranzactie), apel=" + TRANSFORM(lnApel) + ;
" commit=" + TRANSFORM(lnCommit)
ENDIF
ENDPROC
PROCEDURE TestApelCondionatSiNumaiInV2
LOCAL lcTxt, lcMetoda, lcSecventa
gcCaz = "[A6 static: apel conditionat, o data in v1 si o data in v2] "
lcTxt = FILETOSTR("D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2")
IF EMPTY(lcTxt)
DO Assert WITH .F., "FILETOSTR ofacturare.vc2 a esuat/gol"
RETURN
ENDIF
lcMetoda = FereastraDoScrieFactura(lcTxt)
IF EMPTY(lcMetoda)
DO Assert WITH .F., "nu s-a putut izola do_scrie_factura din frm_facturare_articole2"
RETURN
ENDIF
* linia de apel e precedata imediat de If llReturn - exact textul scris la write-back
lcSecventa = "If llReturn" + CHR(13) + CHR(10) + REPLICATE(CHR(9), 4) + "llReturn = scrie_legatura_proforma()"
DO Assert WITH lcSecventa $ lcMetoda, "apelul e in ramura If llReturn (nu neconditionat)"
DO Assert WITH OCCURS("scrie_legatura_proforma", lcTxt) = 2, ;
"scrie_legatura_proforma apare de doua ori in ofacturare.vc2 (v1 si v2), ocurente=" + ;
TRANSFORM(OCCURS("scrie_legatura_proforma", lcTxt))
DO Assert WITH OCCURS("scrie_legatura_proforma", lcMetoda) = 1, ;
"unica ocurenta e chiar in do_scrie_factura din frm_facturare_articole2"
ENDPROC
PROCEDURE TestFunctieVizibilaFaraPoDate
LOCAL llRez, llEroare
gcCaz = "[A7 runtime: functia e vizibila si iese curat cand poDate nu e obiect] "
poDate = NULL
llEroare = .F.
llRez = .F.
TRY
llRez = scrie_legatura_proforma()
CATCH
llEroare = .T.
ENDTRY
DO Assert WITH !llEroare, "scrie_legatura_proforma() e vizibila (SET PROCEDURE ofacturare_comun.prg)"
DO Assert WITH TYPE('poDate') <> 'O', "preconditie: Type('poDate') <> 'O', e=" + TYPE('poDate')
DO Assert WITH llRez = .T., "intoarce .T. cand poDate nu e obiect, e=" + TRANSFORM(llRez)
ENDPROC
PROCEDURE TestFunctieIeseFaraSemnal
LOCAL llRez
gcCaz = "[A8 runtime: iese fara SQL cand lProformaSursa = .F.] "
poDate = CREATEOBJECT('oDateFactura', 0, 5)
poDate.lProformaSursa = .F.
poDate.nIdProformaSursa = 0
poDate.nid_vanzare = 123456
llRez = scrie_legatura_proforma()
DO Assert WITH llRez = .T., "intoarce .T. fara sa cheme Oracle, e=" + TRANSFORM(llRez)
poDate = NULL
ENDPROC
PROCEDURE TestGardaNidVanzareInitial
LOCAL llRez, lnInainte
gcCaz = "[A9 runtime: garda Between pe nid_vanzare ramas 9999999999] "
poDate = CREATEOBJECT('oDateFactura', 0, 5)
poDate.lProformaSursa = .T.
poDate.nIdProformaSursa = 4242424
DO Assert WITH poDate.nid_vanzare = 9999999999, ;
"preconditie: nid_vanzare are valoarea initiala, e=" + TRANSFORM(poDate.nid_vanzare)
lnInainte = NumarLegaturi(4242424)
llRez = scrie_legatura_proforma()
DO Assert WITH llRez = .T., "intoarce .T. (garda opreste apelul, nu il raporteaza ca eroare), e=" + TRANSFORM(llRez)
DO Assert WITH NumarLegaturi(4242424) = lnInainte, ;
"nu s-a scris nicio legatura pentru id fictiv, inainte=" + TRANSFORM(lnInainte) + ;
" dupa=" + TRANSFORM(NumarLegaturi(4242424))
poDate = NULL
ENDPROC
FUNCTION NumarLegaturi
LPARAMETERS tnIdProforma
LOCAL lcSql, lnRez
lnRez = -1
lcSql = [select count(*) as nr from vanzari_coresp where tip = 4 and id_vanzare_aviz = ] + ;
ALLTRIM(STR(tnIdProforma, 20, 0))
IF goExecutor.oExecute(lcSql, [crsnrleg]) >= 0 AND USED('crsnrleg')
lnRez = crsnrleg.nr
USE IN (SELECT('crsnrleg'))
ENDIF
RETURN lnRez
ENDFUNC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL: " + gcCaz + 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
DO AfLog WITH "ERROR " + gcCaz + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " sarit=" + TRANSFORM(gnSarit)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,139 @@
*!* 01.09.2026
*!* Headless: valideaza schela de comparatie S6-0 (lib_comparatie_documente.prg) pe perechea deja
*!* emisa de S5c - SSS 645 (id_vanzare 1111) si SSS 646 (id_vanzare 1112). NU emite nimic, doar
*!* SELECT. Verifica: jonctiunea serie_act+nract gaseste id_vanzare corect, CompDoc ruleaza toate
*!* cele patru comparatii fara eroare Oracle, iar cifrele raportate (linii VANZARI_DETALII, randuri
*!* ACT, RUL gol) corespund cu ce s-a verificat deja manual pe MARIUSM_AUTO.
*!*
*!* Cele doua documente nu sunt v1/v2 (unul copiat din proforma, unul de control, ambele pe v2) -
*!* CompDoc e asteptat sa raporteze FAIL-uri legitime; un FAIL legitim raportat corect e succes
*!* pentru aceasta proba.
*!*
*!* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s6_0_schela.prg"
*!* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_0_schela.log
*!* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gnSarit, gcCaz
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_0_schela.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
gnSarit = 0
gcCaz = ""
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
SQLSETPROP(gnHandle, "QueryTimeOut", 45)
IF TYPE('goExecutor.nHandle') = 'N' AND goExecutor.nHandle > 0 AND goExecutor.nHandle <> gnHandle
SQLSETPROP(goExecutor.nHandle, "QueryTimeOut", 45)
ENDIF
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
DO AfLog WITH "ENV OK gnHandle=" + TRANSFORM(gnHandle)
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\lib_comparatie_documente.prg" ADDITIVE
DO TestSchela
DO Final
*----------------------------------------------------------------------------------------
PROCEDURE TestSchela
LOCAL nId1, nId2, nFailCompDoc
gcCaz = "[S6-0 schela SSS 645 vs SSS 646] "
nId1 = CdocGasesteIdVanzare('SSS', 645)
nId2 = CdocGasesteIdVanzare('SSS', 646)
DO Assert WITH nId1 = 1111, "jonctiune serie_act+nract gaseste id_vanzare pt SSS 645, e=" + TRANSFORM(nId1)
DO Assert WITH nId2 = 1112, "jonctiune serie_act+nract gaseste id_vanzare pt SSS 646, e=" + TRANSFORM(nId2)
nFailCompDoc = CompDoc('SSS', 645, 'SSS', 646, ALLTRIM(gcCaz))
DO Assert WITH nFailCompDoc >= 0, "CompDoc a rulat fara eroare Oracle, esecuri raportate=" + TRANSFORM(nFailCompDoc)
DO AfLog WITH "CompDoc a intors esecuri=" + TRANSFORM(nFailCompDoc) + ;
" (documentele nu sunt v1/v2 - esecuri legitime asteptate, vezi raport)"
DO VerificaLinii
DO VerificaAct
DO VerificaRul
ENDPROC
PROCEDURE VerificaLinii
LOCAL n1, n2
n1 = ValoareScalaraLocala([select count(*) as nr from vanzari_detalii where sters = 0 and id_vanzare = 1111])
n2 = ValoareScalaraLocala([select count(*) as nr from vanzari_detalii where sters = 0 and id_vanzare = 1112])
DO Assert WITH n1 = 2, "VANZARI_DETALII are 2 linii pe SSS 645 (id_vanzare 1111), e=" + TRANSFORM(n1)
DO Assert WITH n2 = 2, "VANZARI_DETALII are 2 linii pe SSS 646 (id_vanzare 1112), e=" + TRANSFORM(n2)
ENDPROC
PROCEDURE VerificaAct
LOCAL n1, n2
n1 = ValoareScalaraLocala([select count(*) as nr from act where sters = 0 and serie_act = 'SSS' and nract = 645])
n2 = ValoareScalaraLocala([select count(*) as nr from act where sters = 0 and serie_act = 'SSS' and nract = 646])
DO Assert WITH n1 = 4, "ACT are 4 randuri pe SSS 645, e=" + TRANSFORM(n1)
DO Assert WITH n2 = 4, "ACT are 4 randuri pe SSS 646, e=" + TRANSFORM(n2)
ENDPROC
PROCEDURE VerificaRul
LOCAL n1, n2
n1 = ValoareScalaraLocala([select count(*) as nr from rul where sters = 0 and serie_act = 'SSS' and nract = 645])
n2 = ValoareScalaraLocala([select count(*) as nr from rul where sters = 0 and serie_act = 'SSS' and nract = 646])
DO Assert WITH n1 = 0, "RUL gol pe SSS 645 (gnScadereStoc = 0), e=" + TRANSFORM(n1)
DO Assert WITH n2 = 0, "RUL gol pe SSS 646 (gnScadereStoc = 0), e=" + TRANSFORM(n2)
ENDPROC
FUNCTION ValoareScalaraLocala
LPARAMETERS tcSql
LOCAL lnRez, lnSucces
lnRez = -1
lnSucces = goExecutor.oExecute(tcSql, [crsverif])
IF lnSucces >= 0 AND USED('crsverif')
IF RECCOUNT('crsverif') > 0
SELECT crsverif
GO TOP
lnRez = NVL(crsverif.nr, 0)
ELSE
lnRez = 0
ENDIF
USE IN (SELECT('crsverif'))
ELSE
DO AfLog WITH "SQL ESEC: " + TRANSFORM(goExecutor.oPrelucrareEroare()) + " | " + tcSql
ENDIF
RETURN lnRez
ENDFUNC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL: " + gcCaz + 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
DO AfLog WITH "ERROR " + gcCaz + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " sarit=" + TRANSFORM(gnSarit)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,28 @@
$ErrorActionPreference = 'Stop'
$dir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat'
$prg = Join-Path $dir 'test_s6_0_schela.prg'
$log = Join-Path $dir 'out\test_s6_0_schela.log'
$vfp = 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe'
$viu = Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*test_s6_0_schela*' }
if ($viu) {
"Ruleaza deja o instanta a suitei (PID " + ($viu.ProcessId -join ',') + "). Nu lansez a doua."
exit 1
}
Set-Location $dir
Remove-Item *.FXP, *.fxp -ErrorAction SilentlyContinue
Remove-Item $log -ErrorAction SilentlyContinue
$p = Start-Process -FilePath $vfp -ArgumentList '-A', '-T', $prg -PassThru
"lansat PID " + $p.Id
$null = $p.WaitForExit(240000)
if (-not $p.HasExited) {
"INCA RULEAZA dupa 240s - omor instanta (filtrat pe CommandLine)"
Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*test_s6_0_schela*' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force }
}
if (Test-Path $log) {
Get-Content $log | Select-String -Pattern '^(PASS|FAIL|REZUMAT|TOTAL|START|END|=====|ENV OK|ERROR|CompDoc)'
} else {
"Log inexistent: $log"
}

View File

@@ -0,0 +1,844 @@
* test_s6_1_lista_preturi.prg
* VIZIBIL (grid): proba de paritate v1 vs v2 pe LISTA DE PRETURI (tip 1, tipdoc 5, seria SSS).
* Emite 2 documente REALE in MARIUSM_AUTO@ROA_CENTRAL, cu ACEEASI doua articole (id_articol,
* pret, proc_tvav) si aceeasi cantitate pe ambele forme, ca sa fie comparabile prin CompDoc.
*
* Traseul probat, verificat pe cod (nu presupus) - vezi PROCEDURE AsertiuniRutare:
* v1: incarca_cursor_articole() INAINTE de formular (ofacturare.prg:299, ca in factureaza()) ->
* crsarticole (candidati). Butonul VIU pentru tip 1 e But_urmator1 (caction = do_urmator,
* ofacturare.vc2:11389), care cheama Thisform.do_adauga_articol() (:14868) - tlImplicit=.F.,
* care pentru un articol negestionabil arata modal frm_articol_factura (cantitate/pret) -
* interactiune reala, interzisa pe masina partajata (nicio tastare/click injectat). But_
* urmator_tot1 (do_adauga_tot) NU e vizibil pentru tip 1 (Init nu-l aprinde la Inlist(poDate.
* tip,1,5,7,10), ofacturare.vc2:15275) - deci nu e o alternativa reala.
* OCOLIRE DECLARATA: se cheama Thisform.do_adauga_articol(.T.) direct - ACEEASI functie pe
* care do_urmator() o cheama, doar cu tlImplicit=.T. (parametrul pe care il foloseste si
* do_adauga_tot pentru alte tipuri) - pentru gnScadereStoc=0 asta NU arata niciun formular
* (ofacturare.vc2:13021-13029: ofrmadarticol=Createobject(...); If !tlImplicit ... Else
* poArticol=calculeaza_totaluri(poArticol) - ramura fara Show()). Cantitatea (zeroita de
* do_initializeaza_articol pentru tip 1, :13890) se scrie explicit dupa adaugare, ca pe v2.
* v2: tipul 1 e in llCautareInLinie (Inlist(poDate.tip,1,22,5,29,7,10,45), :19563) - do_incarca_
* articole NU incarca nimic in masa. Liniile intra prin cautarea in grid:
* grd_factura.cDenumire.cCboDenumire.LostFocus / cCodMat.cboCodmat.LostFocus (:21647-21695)
* cheama Thisform.do_adauga_articol_cautat(loArticol, loArticol.cantitate) dupa ce combo-ul a
* gasit randul. Cautarea insasi (tastare in caseta) nu se poate automatiza fara input real
* injectat - se reproduce exact ce face handler-ul DUPA ce combo-ul a gasit randul: APPEND
* BLANK pe crsfactura + do_adauga_articol_cautat(loArticol, cantitate), tehnica validata la
* S5c (test_s5c_emitere_reala_ui.prg, AdaugaLiniiCautate).
*
* Mod VIZIBIL, prin vfp_ui_harness.ps1 (ca la S5c): fereastra reala, off-screen, fara input real
* injectat - doar apeluri de metode / Click() pe obiecte. FRM_ALTE_DATE (v1, .Show(1) neconditionat
* pentru tip <> 30, inainte_de_do_termin) se inchide cu do_termin(), NU Release() - condus de un
* Timer + driver, tiparul validat la S5c/S6-3.
*
* Rulare: powershell -ExecutionPolicy Bypass -File test_s6_1_lista_preturi.ps1 (timeout >= 600s)
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_1_lista_preturi.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8 (inainte de creeaza_cursor_serii); gnIdSucursala = 167;
* gnScadereStoc = 0; gnFactSeturi = 0; SET PATH catre gridextras si stub_verificare.
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 ''
CLOSE DATABASES
PUBLIC gcLog, gnPass, gnFail, gnErr, gcCaz, gcMock, gcNumere
PUBLIC gcMockApeluri, gnMockRaspuns, gcMockDuplicat
PUBLIC gcUltimaSerie, gnUltimulNract, goDriverS61, gcClaseVazute
PUBLIC gcSyncDir, gcUILog, gnCantitateAleasa
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_1_lista_preturi.log"
IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out")
MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out"
ENDIF
gcUILog = gcLog
gcSyncDir = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\uisync_s61\"
IF !DIRECTORY(gcSyncDir)
MD (gcSyncDir)
ENDIF
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog)
gnPass = 0
gnFail = 0
gnErr = 0
gcCaz = ""
gcMockApeluri = ""
gnMockRaspuns = 6
gcMockDuplicat = ""
gcUltimaSerie = ""
gnUltimulNract = 0
gcClaseVazute = ";"
gcNumere = ""
gnCantitateAleasa = 2
gcMock = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg"
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg" ADDITIVE
DO HarnessInit
*-- poDate & co. se declara SI se initializeaza la nivelul programului principal: metodele din .vcx
*-- le vad numai daca variabila exista deja pe stiva de sub ele (capcana platita la S8).
PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest
poDate = NULL
poGeneratorNumere = NULL
poDateGestiuneDest = NULL
ON ERROR DO S61Err WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
TRY
*-- stub_verificare PRIMUL: "Do Form verificare" (ofacturare.vc2:14404 / :20126) rezolva la stub
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 S61Log WITH 'EROARE: conectare Oracle esuata'
DO S61Final
ENDIF
SQLSETPROP(gnHandle, "QueryTimeOut", 45)
DO S61Log WITH 'ENV OK gnHandle=' + TRANSFORM(gnHandle) + ' gcS=' + gcS
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\lib_comparatie_documente.prg" ADDITIVE
SET PROCEDURE TO (gcMock) ADDITIVE
IF !actualizeaza_optiuni_program()
DO S61Log WITH 'EROARE: actualizeaza_optiuni_program()'
DO S61Final
ENDIF
gnScadereStoc = 0
gnFactSeturi = 0
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 S61Log WITH 'optiuni OK gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ' gnFactSeturi=' + TRANSFORM(gnFactSeturi) + ;
' gnIdSucursala=' + TRANSFORM(gnIdSucursala) + ' gnIdUtil=' + TRANSFORM(gnIdUtil) + ;
' gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna)
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
*-- cboTipFactura cere RowSource pe saft_tip_facturi la constructia formularului v2
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
PUBLIC gdZiCurs
gdZiCurs = DataCursValid()
DO S61Log WITH ' zi_curs folosita pentru toate documentele: ' + DTOC(gdZiCurs)
*-- driver + timer: FRM_ALTE_DATE (v1, .Show(1) neconditionat la inainte_de_do_termin) si
*-- formele modale MESSAGEBOX_FORM nu trec prin functia amessagebox - mock-ul nu le acopera.
*-- Tehnica validata la S5c/S6-3.
goDriverS61 = CREATEOBJECT('driverS61')
_SCREEN.AddObject('tmrS61', 'Timer')
_SCREEN.tmrS61.Interval = 200
BINDEVENT(_SCREEN.tmrS61, 'Timer', goDriverS61, 'Executa')
_SCREEN.tmrS61.Enabled = .T.
DO S61Log WITH 'DIAG SET_PATH stub inca in fata: ' + FULLPATH('verificare.scx')
DO HarnessStep WITH 0, 'env gata', 8
DO S61Log WITH CHR(13) + CHR(10) + '===== ALEGEREA A DOUA ARTICOLE (comune v1 si v2) ====='
IF !AlegeArticole()
DO Assert WITH .F., 'alegerea celor doua articole a esuat - vezi log'
DO S61Final
ENDIF
DO S61Log WITH CHR(13) + CHR(10) + '===== RUTARE (structural, inainte de orice emitere) ====='
DO AsertiuniRutare
LOCAL lnIdV1, lnIdV2, lcSer1, lnNr1, lcSer2, lnNr2
STORE 0 TO lnIdV1, lnIdV2, lnNr1, lnNr2
STORE '' TO lcSer1, lcSer2
DO S61Log WITH CHR(13) + CHR(10) + '===== EMITERE v1 (frm_facturare_articole) ====='
lnIdV1 = EmiteProtejat('v1')
lcSer1 = gcUltimaSerie
lnNr1 = gnUltimulNract
DO HarnessStep WITH 1, 'v1 emis', 8
DO S61Log WITH CHR(13) + CHR(10) + '===== EMITERE v2 (frm_facturare_articole2) ====='
lnIdV2 = EmiteProtejat('v2')
lcSer2 = gcUltimaSerie
lnNr2 = gnUltimulNract
DO HarnessStep WITH 2, 'v2 emis', 8
IF lnIdV1 > 0 AND lnIdV2 > 0
DO S61Log WITH CHR(13) + CHR(10) + '===== CompDoc lista-preturi v1(' + lcSer1 + ' ' + TRANSFORM(lnNr1) + ;
') vs v2(' + lcSer2 + ' ' + TRANSFORM(lnNr2) + ') ====='
DO Compara WITH lcSer1, lnNr1, lcSer2, lnNr2
ELSE
DO Assert WITH .F., 'ambele documente s-au scris (v1 id_vanzare=' + TRANSFORM(lnIdV1) + ;
' v2 id_vanzare=' + TRANSFORM(lnIdV2) + ')'
ENDIF
DO HarnessStep WITH 3, 'compdoc gata', 8
DO S61Final
CATCH TO loExc
DO S61Log WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ;
' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']'
DO S61Final
ENDTRY
QUIT
*==================================================================================
* Alegerea celor doua articole comune v1/v2: sonda cu incarca_cursor_articole (traseul real
* de pe v1), apoi TOP 2 negestionabile cu pret>0 si cota prezenta in jtva_coloane (evita orice
* dialog de confirmare cantitate pe v1). Rezultat: crsAleseS61 (2 randuri, READWRITE).
FUNCTION AlegeArticole
LOCAL loRez, lcStrategie
poDate = CREATEOBJECT("oDateFactura", 25000, 1)
poDate.id_client = 463
poDate.id_delegat = 256
poDate.zi_curs = gdZiCurs
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
loRez = incarca_cursor_articole(1, .F., poGeneratorNumere)
DO Assert WITH (loRez.nSucces >= 0) AND loRez.lArticole, 'sonda: incarca_cursor_articole(1) a adus articole'
DO S61Log WITH ' sonda: crsarticole=' + IIF(USED('crsarticole'), TRANSFORM(RECCOUNT('crsarticole')), '(nedeschis)')
IF !USED('crsarticole') OR RECCOUNT('crsarticole') = 0
DO Goleste
RETURN .F.
ENDIF
*-- jtva_coloane trebuie construit din jtva_coloane_temp INAINTE de orice JOIN pe el - altfel
*-- SELECT-ul de mai jos referentiaza un alias inexistent si VFP arata dialogul nativ "Look In"
*-- (fara eroare prinsa de ON ERROR, rulare atarnata - capcana gasita la S6-1)
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
*-- TOP 30 candidati, apoi se aleg in VFP primele doua cu id_articol DISTINCT (acelasi articol
*-- poate aparea de mai multe ori in crsarticole, o data per politica de pret)
DO Inchide WITH 'crsCandS61'
SELECT TOP 30 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 crsCandS61 READWRITE
lcStrategie = 'negestionabile cu cota in jtva_coloane'
IF RECCOUNT('crsCandS61') < 2
DO Inchide WITH 'crsCandS61'
SELECT TOP 30 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.pret,0) > 0 ;
ORDER BY a.id_articol INTO CURSOR crsCandS61 READWRITE
lcStrategie = 'orice cu cota in jtva_coloane (gestionabile incluse)'
ENDIF
IF RECCOUNT('crsCandS61') < 2
DO Inchide WITH 'crsCandS61'
SELECT TOP 30 * FROM crsarticole ORDER BY id_articol INTO CURSOR crsCandS61 READWRITE
lcStrategie = 'primele din lista (nicio potrivire de cota)'
ENDIF
DO Inchide WITH 'crsAleseS61'
SELECT * FROM crsCandS61 WHERE .F. INTO CURSOR crsAleseS61 READWRITE
LOCAL lnUltimulId, loRowS61
lnUltimulId = -1
SELECT crsCandS61
SCAN
IF id_articol <> lnUltimulId
SCATTER MEMO NAME loRowS61
INSERT INTO crsAleseS61 FROM NAME loRowS61
lnUltimulId = id_articol
ENDIF
IF RECCOUNT('crsAleseS61') >= 2
EXIT
ENDIF
ENDSCAN
DO Inchide WITH 'crsCandS61'
DO Assert WITH RECCOUNT('crsAleseS61') = 2, 'doua articole DISTINCTE alese pentru S6-1, e=' + TRANSFORM(RECCOUNT('crsAleseS61'))
DO S61Log WITH ' strategie: ' + lcStrategie
SELECT crsAleseS61
SCAN
DO S61Log WITH ' ales: id_articol=' + TRANSFORM(id_articol) + ' [' + ALLTRIM(TRANSFORM(denumire)) + ;
'] pret=' + TRANSFORM(pret) + ' proc_tvav=' + TRANSFORM(proc_tvav) + ' gestionabil=' + TRANSFORM(NVL(gestionabil,0))
ENDSCAN
DO Inchide WITH 'crsarticole'
DO Goleste
RETURN (RECCOUNT('crsAleseS61') = 2)
ENDFUNC
*==================================================================================
* Rutarea, structural: butonul viu de pe fiecare forma si confirmarea ca tipul 1 e in
* llCautareInLinie pe v2 (deci NU e cablat pe do_incarca_articole).
PROCEDURE AsertiuniRutare
LOCAL lcTxt
gcCaz = '[RUTARE] '
lcTxt = FILETOSTR("D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2")
IF EMPTY(lcTxt)
DO Assert WITH .F., 'FILETOSTR ofacturare.vc2 a esuat/gol'
RETURN
ENDIF
DO Assert WITH OCCURS("caction = do_urmator,", lcTxt) = 1, ;
'un singur caction = do_urmator (butonul Adauga, viu pe v1 pentru tip 1)'
DO Assert WITH "Thisform.do_adauga_articol()" $ lcTxt, ;
'do_urmator cheama Thisform.do_adauga_articol() - aceeasi functie apelata direct in test (tlImplicit=.T.)'
DO Assert WITH "Inlist(poDate.tip, 1, 22, 5, 29, 7, 10, 45)" $ lcTxt, ;
'llCautareInLinie contine tipul 1 (v2 sare incarcarea in masa pentru lista de preturi)'
DO Assert WITH OCCURS("PROCEDURE grd_factura.cDenumire.cCboDenumire.LostFocus", lcTxt) = 1, ;
'un singur handler cDenumire.cCboDenumire.LostFocus'
DO Assert WITH OCCURS("PROCEDURE grd_factura.cCodMat.cboCodmat.LostFocus", lcTxt) = 1, ;
'un singur handler cCodMat.cboCodmat.LostFocus'
DO Assert WITH OCCURS("Thisform.do_adauga_articol_cautat(loArticol, loArticol.cantitate)", lcTxt) = 2, ;
'ambele handlere de cautare in grid cheama do_adauga_articol_cautat(loArticol, loArticol.cantitate)'
ENDPROC
*==================================================================================
* EmiteV1: traseul real de pe v1 pentru tip 1 - incarca_cursor_articole() inainte de formular,
* candidatii restransi la cele doua articole alese, apoi do_adauga_articol(.T.) - vezi ocolirea
* declarata in antetul fisierului.
FUNCTION EmiteV1
LOCAL lnIdVz, lcSerie, lnNract, oform, loRez, lnI, lnFact
lnIdVz = 0
lcSerie = ''
lnNract = 0
gcUltimaSerie = ''
gnUltimulNract = 0
gcCaz = '[lista-preturi-v1] '
DO CuratieCrs
poDate = CREATEOBJECT("oDateFactura", 25000, 1)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poDateGestiuneDest = CREATEOBJECT("oDateGestiune")
poDate.nIdTipDoc = 5
poDate.id_client = 463
poDate.id_delegat = 256
poDate.zi_curs = gdZiCurs
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
DO Assert WITH poDate.rezultat_serii = 3, 'v1: rezultat_serii=3 (o singura plaja, fara dialog), e=' + TRANSFORM(poDate.rezultat_serii)
IF poDate.rezultat_serii <> 3
DO Goleste
RETURN 0
ENDIF
poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc)
poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL)
poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract)
DO S61Log WITH ' v1: nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ' serie_act=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ;
' nract=' + TRANSFORM(poDate.nract)
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
*-- traseul real: incarca_cursor_articole (ofacturare.prg:299, apelul din factureaza() pe v1);
*-- functia isi creeaza singura crsfactura (:544)
loRez = incarca_cursor_articole(1, .F., poGeneratorNumere)
DO Assert WITH (loRez.nSucces >= 0) AND loRez.lArticole, 'v1: incarca_cursor_articole a adus articole'
IF !((loRez.nSucces >= 0) AND loRez.lArticole)
gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (v1, fara articole);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO Goleste
RETURN 0
ENDIF
*-- inlocuiesc candidatii proaspat incarcati cu EXACT cele doua randuri alese in AlegeArticole
*-- (acelasi id_pol/pret/proc_tvav ca pe v2) - filtrarea pe DOAR id_articol nu ajunge, acelasi
*-- articol poate aparea de mai multe ori in crsarticole (o data per politica de pret): masurat,
*-- 9 randuri in loc de 2, capcana gasita la S6-1 (prima rulare a produs 9 linii pe v1)
USE IN crsarticole
SELECT * FROM crsAleseS61 INTO CURSOR crsarticole READWRITE
DO Assert WITH RECCOUNT('crsarticole') = 2, 'v1: cele doua articole alese gasite in crsarticole, e=' + TRANSFORM(RECCOUNT('crsarticole'))
oform = CREATEOBJECT('frm_facturare_articole')
IF VARTYPE(oform) <> 'O'
DO Assert WITH .F., 'v1: Createobject frm_facturare_articole'
DO Goleste
RETURN 0
ENDIF
oform.WindowType = 0
oform.Show()
DOEVENTS FORCE
SET PROCEDURE TO (gcMock) ADDITIVE
gcMockApeluri = ''
DO Assert WITH LOWER(ALLTRIM(oform.but_urmator1.cAction)) == 'do_urmator', 'v1: butonul Adauga duce la do_urmator'
DO Assert WITH oform.but_urmator1.Visible, 'v1: butonul Adauga e VIZIBIL pentru tip 1'
*-- ocolire declarata (vezi antetul fisierului): do_adauga_articol(.T.) direct, in loc de
*-- but_urmator1.Click() -> do_urmator() -> do_adauga_articol() cu modal frm_articol_factura
FOR lnI = 1 TO RECCOUNT('crsarticole')
SELECT crsarticole
GO lnI
oform.do_adauga_articol(.T.)
ENDFOR
DOEVENTS FORCE
lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0)
DO S61Log WITH ' v1: dupa adaugare crsfactura=' + TRANSFORM(lnFact)
DO Assert WITH lnFact = 2, 'v1: crsfactura are exact 2 linii dupa adaugare, e=' + TRANSFORM(lnFact)
IF lnFact = 0
gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (v1, fara linii);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO Elibereaza WITH oform
DO Goleste
RETURN 0
ENDIF
*-- do_initializeaza_articol zeroeste cantitatea pentru tip 1 (ofacturare.vc2:13890) - se
*-- seteaza explicit, la fel ca pe v2, ca documentele sa fie comparabile
DO SeteazaCantitati WITH 'crsfactura'
oform.do_calculeaza_totaluri()
DOEVENTS FORCE
lcSerie = ALLTRIM(TRANSFORM(poDate.serie_act))
lnNract = poDate.nract
SET PROCEDURE TO (gcMock) ADDITIVE
gcMockApeluri = ''
DO S61Log WITH ' v1: [pas] but_termin1.Click'
oform.but_termin1.Click()
DOEVENTS FORCE
DO S61Log WITH ' v1: but_termin1.Click() -> poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare, 0))
DO S61Log WITH ' v1: apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']'
lnIdVz = CdocGasesteIdVanzare(lcSerie, lnNract)
IF lnIdVz < 0
lnIdVz = 0
ENDIF
DO Assert WITH lnIdVz > 0, 'v1: documentul exista in VANZARI (serie_act+numar_act), e=' + TRANSFORM(lnIdVz)
IF lnIdVz > 0
gcNumere = gcNumere + 'SCRIS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' id_vanzare=' + TRANSFORM(lnIdVz) + ' (v1);'
ELSE
gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (v1, nescris);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
lcSerie = ''
lnNract = 0
ENDIF
DO Elibereaza WITH oform
DO Goleste
gcUltimaSerie = lcSerie
gnUltimulNract = lnNract
RETURN lnIdVz
ENDFUNC
*==================================================================================
* EmiteV2: traseul real de pe v2 pentru tip 1 - crsfactura gol inainte de formular, apoi
* APPEND BLANK + do_adauga_articol_cautat per articol (reproduce exact handler-ul grid-ului,
* vezi antetul fisierului si AsertiuniRutare).
FUNCTION EmiteV2
LOCAL lnIdVz, lcSerie, lnNract, oform, loArticol, lnAdaugate, llOk, lnFact
lnIdVz = 0
lcSerie = ''
lnNract = 0
gcUltimaSerie = ''
gnUltimulNract = 0
gcCaz = '[lista-preturi-v2] '
DO CuratieCrs
poDate = CREATEOBJECT("oDateFactura", 25000, 1)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poDateGestiuneDest = CREATEOBJECT("oDateGestiune")
poDate.nIdTipDoc = 5
poDate.id_client = 463
poDate.id_delegat = 256
poDate.zi_curs = gdZiCurs
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
DO Assert WITH poDate.rezultat_serii = 3, 'v2: rezultat_serii=3 (o singura plaja, fara dialog), e=' + TRANSFORM(poDate.rezultat_serii)
IF poDate.rezultat_serii <> 3
DO Goleste
RETURN 0
ENDIF
poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc)
poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL)
poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract)
DO S61Log WITH ' v2: nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ' serie_act=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ;
' nract=' + TRANSFORM(poDate.nract)
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
*-- v2: crsfactura gol INAINTE de formular (ca in factureaza(), ramura llFacturareNoua)
DO PregatesteFacturaCrs
oform = CREATEOBJECT('frm_facturare_articole2')
IF VARTYPE(oform) <> 'O'
DO Assert WITH .F., 'v2: Createobject frm_facturare_articole2'
DO Goleste
RETURN 0
ENDIF
oform.WindowType = 0
oform.Show()
DOEVENTS FORCE
lnAdaugate = 0
llOk = .F.
SELECT crsAleseS61
GO TOP
SCAN
SCATTER NAME loArticol MEMO
SELECT crsfactura
APPEND BLANK
llOk = .F.
TRY
llOk = oform.do_adauga_articol_cautat(loArticol, NVL(loArticol.cantitate, 1))
CATCH TO loExcAd
DO S61Log WITH ' v2: do_adauga_articol_cautat CATCH ' + TRANSFORM(loExcAd.ErrorNo) + ' ' + loExcAd.Message
ENDTRY
IF llOk
lnAdaugate = lnAdaugate + 1
ELSE
SELECT crsfactura
IF !EOF() AND !BOF()
DELETE
ENDIF
ENDIF
SELECT crsAleseS61
ENDSCAN
DOEVENTS FORCE
DO S61Log WITH ' v2: linii adaugate prin do_adauga_articol_cautat=' + TRANSFORM(lnAdaugate)
DO Assert WITH lnAdaugate = 2, 'v2: cele doua articole adaugate prin do_adauga_articol_cautat, e=' + TRANSFORM(lnAdaugate)
lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0)
DO Assert WITH lnFact = 2, 'v2: crsfactura are exact 2 linii, e=' + TRANSFORM(lnFact)
IF lnFact = 0
gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (v2, fara linii);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO Elibereaza WITH oform
DO Goleste
RETURN 0
ENDIF
DO SeteazaCantitati WITH 'crsfactura'
oform.do_calculeaza_totaluri()
DOEVENTS FORCE
lcSerie = ALLTRIM(TRANSFORM(poDate.serie_act))
lnNract = poDate.nract
SET PROCEDURE TO (gcMock) ADDITIVE
gcMockApeluri = ''
DO S61Log WITH ' v2: [pas] but_termin1.Click'
oform.but_termin1.Click()
DOEVENTS FORCE
DO S61Log WITH ' v2: but_termin1.Click() -> poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare, 0))
DO S61Log WITH ' v2: apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']'
lnIdVz = CdocGasesteIdVanzare(lcSerie, lnNract)
IF lnIdVz < 0
lnIdVz = 0
ENDIF
DO Assert WITH lnIdVz > 0, 'v2: documentul exista in VANZARI (serie_act+numar_act), e=' + TRANSFORM(lnIdVz)
IF lnIdVz > 0
gcNumere = gcNumere + 'SCRIS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' id_vanzare=' + TRANSFORM(lnIdVz) + ' (v2);'
ELSE
gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (v2, nescris);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
lcSerie = ''
lnNract = 0
ENDIF
DO Elibereaza WITH oform
DO Goleste
gcUltimaSerie = lcSerie
gnUltimulNract = lnNract
RETURN lnIdVz
ENDFUNC
*==================================================================================
* Seteaza cantitatea (zeroita de do_initializeaza_articol pentru tip 1) pe toate liniile din
* crsfactura si recalculeaza linia, ca la S5c (AdaugaLiniiCautate).
PROCEDURE SeteazaCantitati
LPARAMETERS tcAlias
LOCAL loArt
SELECT (tcAlias)
SCAN
REPLACE cantitate WITH gnCantitateAleasa
SCATTER NAME loArt MEMO
loArt = calculeaza_totaluri(loArt)
GATHER NAME loArt MEMO
ENDSCAN
ENDPROC
*==================================================================================
* Izolarea unei emiteri: o exceptie intr-un caz nu trebuie sa opreasca restul suitei.
FUNCTION EmiteProtejat
LPARAMETERS tcForma
LOCAL lnRez, lnI
lnRez = 0
TRY
IF tcForma == 'v1'
lnRez = EmiteV1()
ELSE
lnRez = EmiteV2()
ENDIF
CATCH TO loExcEm
DO S61Log WITH ' EXCEPTIE in ' + tcForma + ': ErrorNo=' + TRANSFORM(loExcEm.ErrorNo) + ;
' Message=' + loExcEm.Message + ' Proc=' + loExcEm.Procedure + ':' + TRANSFORM(loExcEm.LineNo) + ;
' [' + TRANSFORM(loExcEm.LineContents) + ']'
DO Assert WITH .F., tcForma + ': emiterea a mers pana la capat fara exceptie (ErrorNo=' + ;
TRANSFORM(loExcEm.ErrorNo) + ')'
lnRez = 0
gcUltimaSerie = ''
gnUltimulNract = 0
TRY
goExecutor.oExecute("ROLLBACK")
CATCH
ENDTRY
TRY
gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + ;
TRANSFORM(poDate.nract) + ' (' + tcForma + ', dupa exceptie);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
CATCH
ENDTRY
FOR lnI = _SCREEN.FormCount TO 1 STEP -1
TRY
_SCREEN.Forms(lnI).Release()
CATCH
ENDTRY
ENDFOR
DO CuratieCrs
DO Goleste
ENDTRY
RETURN lnRez
ENDFUNC
*==================================================================================
PROCEDURE Compara
LPARAMETERS tcSerie1, tnNr1, tcSerie2, tnNr2
LOCAL nFail
gcCaz = '[CompDoc lista-preturi] '
nFail = CompDoc(tcSerie1, tnNr1, tcSerie2, tnNr2, 'S6-1 lista-preturi v1(' + TRANSFORM(tnNr1) + ') vs v2(' + TRANSFORM(tnNr2) + ')')
DO Assert WITH nFail >= 0, 'CompDoc a rulat fara eroare Oracle, esecuri raportate=' + TRANSFORM(nFail)
DO S61Log WITH ' CompDoc esecuri totale=' + TRANSFORM(nFail)
ENDPROC
*==================================================================================
* crsfactura + coloana "gestiune" ceruta de coloana combo a grilei pe v2
PROCEDURE PregatesteFacturaCrs
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
ENDPROC
PROCEDURE Elibereaza
LPARAMETERS toForm
IF TYPE('toForm') = 'O' AND !ISNULL(toForm)
TRY
toForm.Release()
CATCH
ENDTRY
ENDIF
DO CuratieCrs
ENDPROC
PROCEDURE Goleste
poDate = NULL
poGeneratorNumere = NULL
poDateGestiuneDest = NULL
ENDPROC
PROCEDURE CuratieCrs
DO Inchide WITH 'crsarticole'
DO Inchide WITH 'crsarticoleSel'
DO Inchide WITH 'crsfactura'
DO Inchide WITH 'crscursuri'
DO Inchide WITH 'crspolitici'
DO Inchide WITH 'crsCtrTemp'
DO Inchide WITH 'jtva_coloane'
ENDPROC
PROCEDURE Inchide
LPARAMETERS tcAlias
IF USED(tcAlias)
USE IN (tcAlias)
ENDIF
ENDPROC
* "SSS 645" - forma in care poDate.descriere se compune in productie
FUNCTION NumarDoc
LPARAMETERS tcSerie, tnNumar
LOCAL lcS
lcS = ALLTRIM(NVL(tcSerie, ''))
RETURN ALLTRIM(IIF(EMPTY(lcS), '', lcS + ' ') + ALLTRIM(STR(NVL(tnNumar, 0), 20, 0)))
ENDFUNC
* 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 S61Log WITH ' DataCursValid ESEC: ' + goExecutor.oPrelucrareEroare()
ENDIF
IF USED('crscurszi')
USE IN crscurszi
ENDIF
RETURN ldRez
ENDFUNC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO S61Log WITH 'PASS: ' + gcCaz + tcMsg
ELSE
gnFail = gnFail + 1
DO S61Log WITH 'FAIL: ' + gcCaz + tcMsg
ENDIF
ENDPROC
PROCEDURE S61Log
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE S61Err
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gnErr = gnErr + 1
DO S61Log WITH 'ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
ENDPROC
PROCEDURE S61Final
LOCAL lnI
IF TYPE('_SCREEN.tmrS61') = 'O'
_SCREEN.tmrS61.Enabled = .F.
TRY
_SCREEN.RemoveObject('tmrS61')
CATCH
ENDTRY
ENDIF
*-- formele ramase deschise arunca "Unhandled Structured Exception" la QUIT (rulare atarnata),
*-- deci se inchid explicit inainte
FOR lnI = _SCREEN.FormCount TO 1 STEP -1
TRY
_SCREEN.Forms(lnI).Release()
CATCH
ENDTRY
ENDFOR
*-- registrul numerelor SSS direct din baza: singura sursa care spune care numar e SCRIS si
*-- care e ARS (alocat si nescris)
TRY
IF TYPE('goExecutor') = 'O' AND goExecutor.oExecute([select numar_act, id_vanzare, tip from vanzari ] + ;
[where sters = 0 and serie_act = 'SSS' and numar_act between 640 and 750 order by numar_act], 'crsNrSSS') >= 0
DO S61Log WITH CHR(13) + CHR(10) + 'REGISTRU SSS in VANZARI (640-750):'
SELECT crsNrSSS
SCAN
DO S61Log WITH ' SSS ' + TRANSFORM(numar_act) + ' -> id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip)
ENDSCAN
USE IN crsNrSSS
ENDIF
CATCH
ENDTRY
DO S61Log WITH CHR(13) + CHR(10) + 'NUMERE: ' + gcNumere
DO S61Log WITH 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + ' err=' + TRANSFORM(gnErr)
DO S61Log WITH 'END ' + TTOC(DATETIME())
DO HarnessDone WITH 'done'
QUIT
ENDPROC
*==================================================================================
* driverS61: apasa automat pe formele modale care nu trec prin functia amessagebox -
* MESSAGEBOX_FORM (cmdYes/cmdOk) si FRM_ALTE_DATE de pe v1 (do_termin, NU Release).
* Garda de reintrare lBusy: do_termin cedeaza controlul buclei de mesaje.
DEFINE CLASS driverS61 AS Custom
nUltimAlteDate = 0
lBusy = .F.
PROCEDURE Executa
IF This.lBusy
RETURN
ENDIF
This.lBusy = .T.
IF TYPE('_SCREEN.tmrS61') = 'O'
_SCREEN.tmrS61.Enabled = .F.
ENDIF
TRY
LOCAL lnI, loMsgForm, loAlteDate, lcClasa
loMsgForm = NULL
loAlteDate = NULL
FOR lnI = 1 TO _SCREEN.FormCount
lcClasa = UPPER(_SCREEN.Forms(lnI).Class)
IF 'MESSAGEBOX_FORM' $ lcClasa
loMsgForm = _SCREEN.Forms(lnI)
ENDIF
IF lcClasa == 'FRM_ALTE_DATE'
loAlteDate = _SCREEN.Forms(lnI)
ENDIF
IF !(lcClasa $ gcClaseVazute)
gcClaseVazute = gcClaseVazute + lcClasa + ';'
DO S61Log WITH ' [diag timer] forma noua: ' + lcClasa + ' Caption=[' + TRANSFORM(_SCREEN.Forms(lnI).Caption) + ']'
ENDIF
ENDFOR
IF !ISNULL(loMsgForm)
TRY
LOCAL lcTextMsg
lcTextMsg = ''
TRY
lcTextMsg = ALLTRIM(TRANSFORM(loMsgForm.edtMensaje.Value))
CATCH
ENDTRY
DO S61Log WITH ' [driver msg] mesaj=[' + STRTRAN(lcTextMsg, CHR(13) + CHR(10), ' ') + ']'
DO CASE
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5)
DO S61Log WITH ' [driver msg] apas cmgBotones.cmdYes'
loMsgForm.cmgBotones.cmdYes.Click()
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5)
DO S61Log WITH ' [driver msg] apas cmgBotones.cmdOk'
loMsgForm.cmgBotones.cmdOk.Click()
ENDCASE
CATCH TO loExcMsg
DO S61Log WITH ' [driver msg] CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message
ENDTRY
ELSE
IF !ISNULL(loAlteDate) AND (SECONDS() - This.nUltimAlteDate > 1)
This.nUltimAlteDate = SECONDS()
TRY
DO S61Log WITH ' [driver alte_date] apas do_termin() pe FRM_ALTE_DATE (id_delegat=' + ;
TRANSFORM(NVL(poDate.id_delegat, 0)) + ')'
loAlteDate.do_termin()
CATCH TO loExcAD
DO S61Log WITH ' [driver alte_date] CATCH ' + TRANSFORM(loExcAD.ErrorNo) + ' ' + loExcAD.Message
ENDTRY
ENDIF
ENDIF
CATCH TO loExcTop
DO S61Log WITH ' [driver] CATCH TOP-LEVEL ' + TRANSFORM(loExcTop.ErrorNo) + ' ' + loExcTop.Message
FINALLY
IF TYPE('_SCREEN.tmrS61') = 'O'
_SCREEN.tmrS61.Enabled = .T.
ENDIF
This.lBusy = .F.
ENDTRY
ENDPROC
ENDDEFINE

View File

@@ -0,0 +1,16 @@
# test_s6_1_lista_preturi.ps1 - wrapper peste harness-ul generic (vfp_ui_harness.ps1) pentru
# test_s6_1_lista_preturi.prg (S6-1, paritate v1 vs v2 pe lista de preturi, tip 1).
# Rulare VIZIBILA (vfp9 -A, fereastra impinsa off-screen de harness), NU -A -T: sub -A -T
# coloanele de grid nu se materializeaza.
# Rulare: powershell -ExecutionPolicy Bypass -File test_s6_1_lista_preturi.ps1 (timeout >= 600s)
$ErrorActionPreference = 'Stop'
$Teste = $PSScriptRoot
Get-ChildItem -Path $Teste -Filter '*.FXP' -ErrorAction SilentlyContinue | Remove-Item -Force -ErrorAction SilentlyContinue
Get-ChildItem -Path $Teste -Filter '*.fxp' -ErrorAction SilentlyContinue | Remove-Item -Force -ErrorAction SilentlyContinue
& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') `
-TestPrg (Join-Path $Teste 'test_s6_1_lista_preturi.prg') `
-Steps @('env_gata','v1_emis','v2_emis','compdoc_gata') `
-StepTimeoutSec 120 `
-ReadyTimeoutSec 180 `
-SyncDir (Join-Path $Teste 'uisync_s61') `
-ShotsDir (Join-Path $Teste 'screenshots_s61')

View File

@@ -0,0 +1,669 @@
* test_s6_2_comanda_contract.prg
* Headless: proba de paritate v1 vs v2 pe doua surse care trec prin incarcare in masa
* (do_incarca_articole / incarca_cursor_articole): COMANDA (tip 3) si CONTRACT (tip 2).
* Emite 4 documente REALE in Oracle (MARIUSM_AUTO@ROA_CENTRAL, tipdoc 5, seria SSS):
* comanda v1 (frm_facturare_articole) <- listaid 2479 (client FETCU RELU, 3 linii)
* comanda v2 (frm_facturare_articole2) <- listaid 2478 (client BALOI IRINA, 9 linii)
* contract v1 (frm_facturare_articole) <- listaid 20 (client ABC PLOIESTI, 4 articole)
* contract v2 (frm_facturare_articole2) <- listaid 222 (client ABSOLUT SRL, 3 articole)
* Surse diferite intre v1 si v2 (nu aceeasi comanda/contract de doua ori) - o comanda/un contract
* se marcheaza facturat la prima emitere, deci reemiterea pe v2 din aceeasi sursa ar da 0 articole.
* Comparatia foloseste schela lib_comparatie_documente.prg (CompDoc), plus o comparatie separata
* pe campurile de CONFIGURATIE (nu depind de sursa: TIP, IN_VALUTA, ID_VALUTA, MULTIPLICATOR,
* DISCOUNT_EVIDENTIAT, TVA_INCASARE, TIP_FACTURA, TIP_SAFT, COEFICIENT_K) - acestea trebuie sa fie
* identice v1/v2 chiar daca sursele difera; diferentele de VANZARI_DETALII/ACT legate de sursa
* (cantitati, client, id_gestiune) sunt asteptate si se argumenteaza in raport, nu se raporteaza
* ca esecuri.
*
* Transferul crsarticole -> crsfactura foloseste do_adauga_tot() pe ambele formulare:
* - pe v1 e calea reala (butonul "Adauga tot" e cablat, caction = do_adauga_tot);
* - pe v2 metoda EXISTA in cod dar NU are niciun caction/buton care s-o declanseze (cod mort,
* confirmat deja pentru lista de preturi in S6-0/3.1 - aici se confirma ca acelasi lucru e
* valabil si pentru comanda/contract). Vezi AsertiuniRutare si raportul.
* mock_amessagebox.prg neutralizeaza aMessageBox-ul din bucla do_adauga_tot ("ati selectat toata
* cantitatea?") - pe contract (tip 2), crsarticole.cantitate nu se decrementeaza cu gnScadereStoc=0
* (do_initializeaza_articol zeroeste doar copia scatter-uita, nu cursorul sursa), deci acel dialog
* ar aparea o data per linie fara mock.
*
* FRM_ALTE_DATE (numai pe v1, deschis neconditionat de frm_facturare_articole.inainte_de_do_termin,
* ofacturare.vc2:15076) refuza sa se inchida cat timp poDate.id_delegat e gol
* (ferestre_cere_date.vc2:3073) - se precompleteaza poDate.id_delegat=39 (delegat real din
* vnom_delegati, MARIUSM_AUTO) identic pe v1 si v2, iar driverul apasa Termin
* (loForm.do_termin()), nu Release() - Release() ar sari peste scrierea lui poDate.ntip_incasare.
* gnFactSeturi=0 elimina FRM_ARTICOLE_COMPUSE (ofacturare.vc2:15028).
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s6_2_comanda_contract.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_2_comanda_contract.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnIdSucursala = 167; gnScadereStoc = 0; gnFactSeturi = 0.
SET SAFETY OFF
SET TALK OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET DECIMALS TO 4
SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcLog, gnPass, gnFail, gcCaz, gcUltimaSerie, gnUltimulNract
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_2_comanda_contract.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)
gnPass = 0
gnFail = 0
gcCaz = ""
ON ERROR DO S62Err WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
TRY
*-- stub_verificare PRIMUL (SET PATH plain) - "Do Form verificare" (ofacturare.vc2:14404/:20126)
*-- rezolva la stub, nu la formularul real (tehnica validata in test_s3b_emitere_reala.prg)
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 S62Log WITH 'EROARE: conectare Oracle esuata'
DO S62Final
ENDIF
DO S62Log WITH 'ENV OK gnHandle=' + TRANSFORM(gnHandle)
SQLSETPROP(gnHandle, "QueryTimeOut", 45)
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\lib_comparatie_documente.prg" ADDITIVE
*-- mock amessagebox: la nume duplicat castiga fisierul deschis cel mai recent - se incarca ULTIM
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE
PUBLIC gcMockUltimMesaj, gnMockUltimTip
gcMockUltimMesaj = ''
gnMockUltimTip = 0
IF !actualizeaza_optiuni_program()
DO S62Log WITH 'EROARE: actualizeaza_optiuni_program()'
DO S62Final
ENDIF
gnScadereStoc = 0
gnFactSeturi = 0
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 S62Log WITH 'actualizeaza_optiuni_program OK, gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ;
' gnFactSeturi=' + TRANSFORM(gnFactSeturi) + ' gnIdSucursala=' + TRANSFORM(gnIdSucursala) + ' gnIdUtil=' + TRANSFORM(gnIdUtil)
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
*-- cboTipFactura (frm_facturare_articole2) cere RowSource pe saft_tip_facturi la constructie
*-- (tehnica validata in test_s4_3_neregresie_masa.prg)
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
*-- driver+timer: unele confirmari (ex. "Doriti sa se inchida comanda?" pe tip=3) folosesc o
*-- forma modala MESSAGEBOX_FORM, nu functia amessagebox() - mock_amessagebox nu le acopera.
*-- Tehnica validata in test_s3b_emitere_reala.prg: un Timer pe _SCREEN scaneaza _SCREEN.Forms
*-- si apasa automat cmdYes/cmdOk, ca raspunsul implicit "Da" al utilizatorului.
PUBLIC goDriverMsg, gcClaseVazuteS62
gcClaseVazuteS62 = ';'
goDriverMsg = CREATEOBJECT('driverMessageboxForm')
_SCREEN.AddObject('tmrS62Msg', 'Timer')
_SCREEN.tmrS62Msg.Interval = 200
BINDEVENT(_SCREEN.tmrS62Msg, 'Timer', goDriverMsg, 'Executa')
_SCREEN.tmrS62Msg.Enabled = .T.
DO S62Log WITH 'driver MESSAGEBOX_FORM + timer pregatiti'
*-- dovada ca stubul verificare ramane in fata dupa tot setup-ul, la momentul emiterii
DO S62Log WITH 'DIAG SET_PATH=' + SET('PATH')
DO S62Log WITH 'DIAG FULLPATH_VERIFICARE=' + FULLPATH('verificare.scx')
LOCAL lnIdVzC1, lcSerieC1, lnNractC1, lnIdVzC2, lcSerieC2, lnNractC2
LOCAL lnIdVzT1, lcSerieT1, lnNractT1, lnIdVzT2, lcSerieT2, lnNractT2
lnIdVzC1 = 0
lnIdVzC2 = 0
lnIdVzT1 = 0
lnIdVzT2 = 0
lcSerieC1 = ''
lcSerieC2 = ''
lcSerieT1 = ''
lcSerieT2 = ''
lnNractC1 = 0
lnNractC2 = 0
lnNractT1 = 0
lnNractT2 = 0
DO S62Log WITH CHR(13) + CHR(10) + '===== EMITERE COMANDA (tip 3) - v1 listaid=2479, v2 listaid=2478 ====='
lnIdVzC1 = EmiteMasa(3, 2479, .F., 'comanda-v1')
lcSerieC1 = gcUltimaSerie
lnNractC1 = gnUltimulNract
lnIdVzC2 = EmiteMasa(3, 2478, .T., 'comanda-v2')
lcSerieC2 = gcUltimaSerie
lnNractC2 = gnUltimulNract
DO S62Log WITH CHR(13) + CHR(10) + '===== EMITERE CONTRACT (tip 2) - v1 listaid=20, v2 listaid=222 ====='
lnIdVzT1 = EmiteMasa(2, 20, .F., 'contract-v1')
lcSerieT1 = gcUltimaSerie
lnNractT1 = gnUltimulNract
lnIdVzT2 = EmiteMasa(2, 222, .T., 'contract-v2')
lcSerieT2 = gcUltimaSerie
lnNractT2 = gnUltimulNract
DO S62Log WITH CHR(13) + CHR(10) + '===== ASERTIUNI STATICE DE RUTARE (ce probeaza / ce nu probeaza acest test) ====='
DO AsertiuniRutare
IF lnIdVzC1 > 0 AND lnIdVzC2 > 0
DO S62Log WITH CHR(13) + CHR(10) + '===== CompDoc COMANDA v1(' + TRANSFORM(lcSerieC1) + ' ' + TRANSFORM(lnNractC1) + ;
') vs v2(' + TRANSFORM(lcSerieC2) + ' ' + TRANSFORM(lnNractC2) + ') ====='
DO CompareazaSurse WITH lcSerieC1, lnNractC1, lcSerieC2, lnNractC2, 'comanda'
ELSE
DO Assert WITH .F., 'comanda: ambele documente s-au scris (v1 id_vanzare=' + TRANSFORM(lnIdVzC1) + ' v2 id_vanzare=' + TRANSFORM(lnIdVzC2) + ')'
ENDIF
IF lnIdVzT1 > 0 AND lnIdVzT2 > 0
DO S62Log WITH CHR(13) + CHR(10) + '===== CompDoc CONTRACT v1(' + TRANSFORM(lcSerieT1) + ' ' + TRANSFORM(lnNractT1) + ;
') vs v2(' + TRANSFORM(lcSerieT2) + ' ' + TRANSFORM(lnNractT2) + ') ====='
DO CompareazaSurse WITH lcSerieT1, lnNractT1, lcSerieT2, lnNractT2, 'contract'
ELSE
DO Assert WITH .F., 'contract: ambele documente s-au scris (v1 id_vanzare=' + TRANSFORM(lnIdVzT1) + ' v2 id_vanzare=' + TRANSFORM(lnIdVzT2) + ')'
ENDIF
DO S62Final
CATCH TO loExc
DO S62Log WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ;
' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']'
DO S62Final
ENDTRY
QUIT
*==================================================================================
* EmiteMasa: emite un document REAL prin incarcare in masa (comanda/contract), pe forma indicata.
* Intoarce id_vanzare (0 daca emiterea a esuat); serie_act/nract se intorc prin gcUltimaSerie/
* gnUltimulNract (variabile PUBLIC, citite de apelant imediat dupa apel).
FUNCTION EmiteMasa
LPARAMETERS tnTip, tnListaId, tlFormNou, tcEticheta
LOCAL tnIdVz, tcSerieAct, tnNract
tnIdVz = 0
tcSerieAct = ''
tnNract = 0
gcUltimaSerie = ''
gnUltimulNract = 0
PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest
LOCAL loSursa, lnIdSet, oform, llOk, loRez, lnScris
DO S62Log WITH '--- ' + tcEticheta + ' (tip=' + TRANSFORM(tnTip) + ' listaid=' + TRANSFORM(tnListaId) + ;
', forma=' + IIF(tlFormNou, 'NOUA (v2)', 'VECHE (v1)') + ') ---'
IF tnTip = 3
loSursa = CreeazaSursaComanda(tnListaId)
ELSE
loSursa = CreeazaSursaContract(tnListaId)
ENDIF
IF ISNULL(loSursa)
DO Assert WITH .F., tcEticheta + ': sursa reala citita din Oracle pentru listaid=' + TRANSFORM(tnListaId)
RETURN 0
ENDIF
DO Assert WITH .T., tcEticheta + ': sursa reala citita, id_part=' + TRANSFORM(loSursa.id_part)
lnIdSet = 25000 + tnTip - 1
poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip, loSursa)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poDateGestiuneDest = CREATEOBJECT("oDateGestiune")
*-- delegat real (vnom_delegati, MARIUSM_AUTO), identic pe v1 si v2: fara el
*-- frm_alte_date.inainte_de_do_termin (ferestre_cere_date.vc2:3073) respinge la infinit
poDate.id_delegat = 39
DO Assert WITH poDate.id_delegat = 39, tcEticheta + ': poDate.id_delegat precompletat'
DO Assert WITH TRANSFORM(poDate.listaid) == TRANSFORM(tnListaId), ;
tcEticheta + ': poDate.listaid provine din toSursa (Init cu parametru), e=' + TRANSFORM(poDate.listaid)
DO Assert WITH poDate.id_client = loSursa.id_part, tcEticheta + ': poDate.id_client din toSursa'
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
DO S62Log WITH ' poDate.nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ' rezultat_serii=' + TRANSFORM(poDate.rezultat_serii)
IF poDate.rezultat_serii <> 3
DO Assert WITH .F., tcEticheta + ': rezultat_serii=3 (o singura plaja, fara dialog), e=' + TRANSFORM(poDate.rezultat_serii)
RELEASE poDate, poGeneratorNumere, poDateGestiuneDest
RETURN 0
ENDIF
poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc)
poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL)
poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract)
DO S62Log WITH ' serie_act=' + TRANSFORM(poDate.serie_act) + ' nract=' + TRANSFORM(poDate.nract)
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
IF tlFormNou
*-- v2 reala: crsfactura gol se creeaza INAINTE de formular (ca in factureaza(), ramura
*-- llFacturareNoua) - articolele se incarca DUPA, prin metoda do_incarca_articole
DO PregatesteFacturaCrs
oform = CREATEOBJECT('frm_facturare_articole2')
oform.WindowType = 0
oform.Show()
DOEVENTS FORCE
DO S62Log WITH ' formular creat (v2 frm_facturare_articole2)'
llOk = oform.do_incarca_articole()
ELSE
*-- v1 reala: incarca_cursor_articole() se cheama INAINTE de formular (ca in factureaza(),
*-- ramura veche) - functia isi creeaza singura crsfactura
loRez = incarca_cursor_articole(poDate.tip, .F., poGeneratorNumere)
llOk = (loRez.nSucces >= 0) AND loRez.lArticole
oform = CREATEOBJECT('frm_facturare_articole')
oform.WindowType = 0
oform.Show()
DOEVENTS FORCE
DO S62Log WITH ' formular creat (v1 frm_facturare_articole)'
ENDIF
DO Assert WITH llOk, tcEticheta + ': incarcarea sursei (incarca_cursor_articole) a reusit'
DO S62Log WITH ' incarcare -> Reccount(crsarticole)=' + IIF(USED('crsarticole'), TRANSFORM(RECCOUNT('crsarticole')), '(nedeschis)')
IF !llOk OR !USED('crsarticole') OR RECCOUNT('crsarticole') = 0
DO S62Log WITH ' ABANDON: fara articole de incarcat pentru ' + tcEticheta
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
IF TYPE('oform') = 'O' AND !ISNULL(oform)
oform.Release()
ENDIF
DO CuratieCrs
RELEASE poDate, poGeneratorNumere, poDateGestiuneDest
RETURN 0
ENDIF
*-- transfer crsarticole -> crsfactura: do_adauga_tot() pe ambele forme (vezi antetul
*-- fisierului si AsertiuniRutare pt statutul cablarii pe v1 vs v2)
oform.do_adauga_tot()
DOEVENTS FORCE
DO S62Log WITH ' do_adauga_tot() -> Reccount(crsfactura)=' + TRANSFORM(RECCOUNT('crsfactura')) + ;
' ultimul mesaj mock=[' + ALLTRIM(gcMockUltimMesaj) + ']'
DO Assert WITH RECCOUNT('crsfactura') > 0, tcEticheta + ': crsfactura populat dupa do_adauga_tot'
*-- diagnostic id_jtva_coloana: cine ramane pe 0 si cu ce proc_tvav
LOCAL lnSelDiag, lnRauDiag, lnAratDiag
lnSelDiag = SELECT()
lnRauDiag = 0
lnAratDiag = 0
SELECT crsfactura
SCAN
IF NVL(crsfactura.id_jtva_coloana, 0) <= 0
lnRauDiag = lnRauDiag + 1
IF lnAratDiag < 5
lnAratDiag = lnAratDiag + 1
DO S62Log WITH ' [diag jtva] rand=' + TRANSFORM(RECNO()) + ' id_articol=' + TRANSFORM(crsfactura.id_articol) + ;
' id_jtva=' + TRANSFORM(NVL(crsfactura.id_jtva_coloana,0)) + ' proc_tvav=' + TRANSFORM(NVL(crsfactura.proc_tvav,-1)) + ;
' cant=' + TRANSFORM(crsfactura.cantitate)
ENDIF
ENDIF
ENDSCAN
DO S62Log WITH ' [diag jtva] crsfactura randuri cu id_jtva_coloana<=0: ' + TRANSFORM(lnRauDiag) + ' din ' + TRANSFORM(RECCOUNT('crsfactura'))
IF USED('jtva_coloane')
SELECT jtva_coloane
DO S62Log WITH ' [diag jtva] cursor jtva_coloane: reccount=' + TRANSFORM(RECCOUNT()) + ' filtru=[' + FILTER() + ']'
SET FILTER TO
LOCATE FOR cota_tva = 24
DO S62Log WITH ' [diag jtva] locate cota_tva=24 -> found=' + TRANSFORM(FOUND()) + ' id=' + TRANSFORM(IIF(FOUND(), jtva_coloane.id_jtva_coloana, -1))
ELSE
DO S62Log WITH ' [diag jtva] cursorul jtva_coloane NU e deschis in aceasta sesiune'
ENDIF
SELECT (lnSelDiag)
oform.do_calculeaza_totaluri()
DOEVENTS FORCE
tcSerieAct = ALLTRIM(NVL(poDate.serie_act, ''))
tnNract = poDate.nract
lnScris = oform.do_termin()
DO S62Log WITH ' do_termin() -> ' + TRANSFORM(lnScris) + ' poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare, 0)) + ;
' ultimul mesaj mock=[' + ALLTRIM(gcMockUltimMesaj) + ']'
*-- do_termin() intoarce mereu .T. (_frm_base.vc2:363, DoDefault fara RETURN) si nid_vanzare
*-- ramane santinela la esec: singura dovada e randul din VANZARI, pe serie_act + nract.
tnIdVz = CdocGasesteIdVanzare(tcSerieAct, tnNract)
IF tnIdVz < 0
tnIdVz = 0
ENDIF
DO S62Log WITH ' verificare in VANZARI pe ' + tcSerieAct + ' ' + TRANSFORM(tnNract) + ' -> id_vanzare=' + TRANSFORM(tnIdVz)
DO Assert WITH tnIdVz > 0, tcEticheta + ': documentul exista in VANZARI (jonctiune serie_act+nract), e=' + TRANSFORM(tnIdVz)
IF tnIdVz > 0
DO S62Log WITH ' SCRIS: id_vanzare=' + TRANSFORM(tnIdVz) + ' serie_act=' + tcSerieAct + ' nract=' + TRANSFORM(tnNract)
ELSE
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
tcSerieAct = ''
tnNract = 0
ENDIF
IF TYPE('oform') = 'O' AND !ISNULL(oform)
oform.Release()
ENDIF
oform = NULL
DO CuratieCrs
RELEASE poDate, poGeneratorNumere, poDateGestiuneDest
gcUltimaSerie = tcSerieAct
gnUltimulNract = tnNract
RETURN tnIdVz
ENDFUNC
*==================================================================================
* crsfactura + coloana "gestiune" ceruta de coloana combo a grilei pe v2 (tehnica validata
* in test_s4_3_neregresie_masa.prg) - aplicata identic si pe v1, inofensiv acolo.
PROCEDURE PregatesteFacturaCrs
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
ENDPROC
PROCEDURE CuratieCrs
DO InchideCrs WITH 'crsarticole'
DO InchideCrs WITH 'crsarticole1'
DO InchideCrs WITH 'crsfactura'
DO InchideCrs WITH 'crscursuri'
DO InchideCrs WITH 'crspolitici'
DO InchideCrs WITH 'crscontracte'
DO InchideCrs WITH 'crsgestiunidest'
DO InchideCrs WITH 'crsCtrTemp'
DO InchideCrs WITH 'crsComTemp'
DO InchideCrs WITH 'jtva_coloane'
ENDPROC
PROCEDURE InchideCrs
LPARAMETERS tcAlias
IF USED(tcAlias)
USE IN (tcAlias)
ENDIF
ENDPROC
*==================================================================================
* Sursa reala pentru comanda (tnTip=3): campurile citite de oDateFactura.Init pe ramura
* tnTip=3 (ofacturare_comun.prg): id_part, nume, cod_fiscal, id_comanda, nr_comanda, id_sectie.
FUNCTION CreeazaSursaComanda
LPARAMETERS tnIdComanda
LOCAL lnQ, loSursa
loSursa = NULL
lnQ = goExecutor.oExecute([select c.id_part, p.nume, p.cod_fiscal, c.id_comanda, c.nr_comanda, c.id_sectie ] + ;
[from comenzi c, nom_parteneri p where c.id_part = p.id_part and c.id_comanda = ] + TRANSFORM(tnIdComanda), 'crsSursaCom')
IF lnQ < 0 OR !USED('crsSursaCom') OR RECCOUNT('crsSursaCom') <> 1
DO S62Log WITH ' EROARE sursa comanda ' + TRANSFORM(tnIdComanda) + ': ' + TRANSFORM(goExecutor.oPrelucrareEroare())
IF USED('crsSursaCom')
USE IN crsSursaCom
ENDIF
RETURN loSursa
ENDIF
SELECT crsSursaCom
SCATTER NAME loSursa MEMO
USE IN crsSursaCom
*-- poDate.listaid = loSursa.id_comanda (ofacturare_comun.prg:322), fara conversie - v2
*-- (do_scrie_factura, ofacturare.vc2:20167) cere Val(poDate.listaid), deci listaid trebuie
*-- caracter; SCATTER dintr-o coloana Oracle numerica da tip N, nu C - convertim aici, ca sursa
*-- reala (goComanda) sa ajunga la fel ca in productie, nu doar ca TRANSFORM() sa coincida.
loSursa.id_comanda = ALLTRIM(TRANSFORM(loSursa.id_comanda))
loSursa.nr_comanda = ALLTRIM(TRANSFORM(loSursa.nr_comanda))
RETURN loSursa
ENDFUNC
* Sursa reala pentru contract (tnTip=2): campurile citite de oDateFactura.Init pe ramura tip 2/6/52
* sunt id_part, denumire, cod_fiscal, id_ctr, contract, id_sectie, sectie, id_responsabil,
* responsabil, id_valuta, nume_val. FACT_VCONTRACTE nu are ultimele sase - se completeaza cu
* valori neutre (0/'' /RON), la fel pe v1 si v2, deci comparatia de configuratie ramane valida.
FUNCTION CreeazaSursaContract
LPARAMETERS tnIdCtr
LOCAL lnQ, loSursa
loSursa = NULL
lnQ = goExecutor.oExecute([select ct.id_part, p.denumire, p.cod_fiscal, ct.id_ctr, ct.contract ] + ;
[from fact_vcontracte ct, nom_parteneri p where ct.id_part = p.id_part and ct.id_ctr = ] + TRANSFORM(tnIdCtr), 'crsSursaCtr')
IF lnQ < 0 OR !USED('crsSursaCtr') OR RECCOUNT('crsSursaCtr') <> 1
DO S62Log WITH ' EROARE sursa contract ' + TRANSFORM(tnIdCtr) + ': ' + TRANSFORM(goExecutor.oPrelucrareEroare())
IF USED('crsSursaCtr')
USE IN crsSursaCtr
ENDIF
RETURN loSursa
ENDIF
SELECT crsSursaCtr
SCATTER NAME loSursa MEMO
USE IN crsSursaCtr
ADDPROPERTY(loSursa, 'id_sectie', 0)
ADDPROPERTY(loSursa, 'sectie', '')
ADDPROPERTY(loSursa, 'id_responsabil', 0)
ADDPROPERTY(loSursa, 'responsabil', '')
ADDPROPERTY(loSursa, 'id_valuta', 1)
ADDPROPERTY(loSursa, 'nume_val', 'RON')
RETURN loSursa
ENDFUNC
*==================================================================================
* Asertiuni statice (text, fara rulare) - documenteaza exact ce traseu de productie ramane
* neprobat de acest test: v1 nu are metoda de forma pentru incarcare (calea reala trece prin
* functia procedurala incarca_cursor_articole, apelata din factureaza() INAINTE de formular);
* do_adauga_tot() e cablat pe un buton viu doar pe v1 - pe v2 metoda exista dar nu e apelata
* de niciun caption/buton in productie (acest test o cheama direct, ca S6-0/S3.1 a stabilit
* deja pentru lista de preturi).
PROCEDURE AsertiuniRutare
LOCAL lcTxt
lcTxt = FILETOSTR("D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2")
IF EMPTY(lcTxt)
DO Assert WITH .F., "FILETOSTR ofacturare.vc2 a esuat/gol"
RETURN
ENDIF
DO Assert WITH OCCURS("PROCEDURE do_incarca_articole", lcTxt) = 1, ;
"do_incarca_articole exista o singura data in fisier (doar pe v2) - v1 nu are metoda de " + ;
"forma pentru incarcare, calea reala e prin incarca_cursor_articole() apelata din factureaza()"
DO Assert WITH "caction = do_adauga_tot" $ lcTxt, ;
"exista un caction = do_adauga_tot in fisier (butonul viu e pe v1)"
DO Assert WITH OCCURS("caction = do_adauga_tot", lcTxt) = 1, ;
"un singur caction = do_adauga_tot in tot fisierul - v2 NU are niciun buton cablat pt " + ;
"aceasta metoda (cod mort pe v2; acest test o cheama direct, deci nu probeaza ruta UI reala pe v2)"
DO Assert WITH OCCURS("PROCEDURE do_adauga_tot", lcTxt) = 2, ;
"do_adauga_tot exista de doua ori (o data pe fiecare clasa) - metoda exista pe v2, doar cablarea lipseste"
ENDPROC
*==================================================================================
* CompareazaSurse: ruleaza schela CompDoc (structura VANZARI/VANZARI_DETALII/ACT/RUL) si, separat,
* o comparatie pe campurile de CONFIGURATIE care nu depind de sursa (trebuie sa fie identice v1/v2
* chiar daca sursele - comenzi/contracte diferite - nu sunt).
PROCEDURE CompareazaSurse
LPARAMETERS tcSerie1, tnNr1, tcSerie2, tnNr2, tcTip
LOCAL nFail
nFail = CompDoc(tcSerie1, tnNr1, tcSerie2, tnNr2, 'S6-2 ' + tcTip + ' v1(' + TRANSFORM(tnNr1) + ') vs v2(' + TRANSFORM(tnNr2) + ')')
DO Assert WITH nFail >= 0, tcTip + ': CompDoc a rulat fara eroare Oracle, esecuri raportate=' + TRANSFORM(nFail)
DO S62Log WITH ' CompDoc ' + tcTip + ' esecuri totale=' + TRANSFORM(nFail) + ;
' (surse diferite - vezi raportul pentru argumentarea camp cu camp)'
DO ComparaCampuriConfig WITH tcSerie1, tnNr1, tcSerie2, tnNr2, tcTip
ENDPROC
PROCEDURE ComparaCampuriConfig
LPARAMETERS tcSerie1, tnNr1, tcSerie2, tnNr2, tcTip
LOCAL nId1, nId2, lnQ
nId1 = CdocGasesteIdVanzare(tcSerie1, tnNr1)
nId2 = CdocGasesteIdVanzare(tcSerie2, tnNr2)
IF nId1 <= 0 OR nId2 <= 0
DO Assert WITH .F., tcTip + ': jonctiune serie_act+nract gaseste ambele id_vanzare (v1=' + ;
TRANSFORM(nId1) + ' v2=' + TRANSFORM(nId2) + ')'
RETURN
ENDIF
lnQ = goExecutor.oExecute([select id_vanzare, tip, in_valuta, id_valuta, multiplicator, ] + ;
[discount_evidentiat, tva_incasare, nvl(tip_factura,0) as tip_factura, nvl(tip_saft,0) as tip_saft, ] + ;
[nvl(coeficient_k,0) as coeficient_k from vanzari where id_vanzare in (] + TRANSFORM(nId1) + [,] + TRANSFORM(nId2) + [)], 'crsCfg')
IF lnQ < 0 OR RECCOUNT('crsCfg') <> 2
DO Assert WITH .F., tcTip + ': citire campuri de configuratie din VANZARI (Reccount asteptat 2)'
IF USED('crsCfg')
USE IN crsCfg
ENDIF
RETURN
ENDIF
LOCAL lnTip1, lnTip2, lnInVal1, lnInVal2, lnIdVal1, lnIdVal2, lnMul1, lnMul2, lnDisc1, lnDisc2
LOCAL lnTvaInc1, lnTvaInc2, lnTipFact1, lnTipFact2, lnTipSaft1, lnTipSaft2, lnCoef1, lnCoef2
SELECT crsCfg
LOCATE FOR id_vanzare = nId1
lnTip1 = tip
lnInVal1 = in_valuta
lnIdVal1 = id_valuta
lnMul1 = multiplicator
lnDisc1 = discount_evidentiat
lnTvaInc1 = tva_incasare
lnTipFact1 = tip_factura
lnTipSaft1 = tip_saft
lnCoef1 = coeficient_k
LOCATE FOR id_vanzare = nId2
lnTip2 = tip
lnInVal2 = in_valuta
lnIdVal2 = id_valuta
lnMul2 = multiplicator
lnDisc2 = discount_evidentiat
lnTvaInc2 = tva_incasare
lnTipFact2 = tip_factura
lnTipSaft2 = tip_saft
lnCoef2 = coeficient_k
USE IN crsCfg
DO Assert WITH lnTip1 = lnTip2, tcTip + ': VANZARI.TIP identic (config, nu sursa) v1=' + TRANSFORM(lnTip1) + ' v2=' + TRANSFORM(lnTip2)
DO Assert WITH lnInVal1 = lnInVal2, tcTip + ': IN_VALUTA identic v1=' + TRANSFORM(lnInVal1) + ' v2=' + TRANSFORM(lnInVal2)
DO Assert WITH lnIdVal1 = lnIdVal2, tcTip + ': ID_VALUTA identic v1=' + TRANSFORM(lnIdVal1) + ' v2=' + TRANSFORM(lnIdVal2)
DO Assert WITH lnMul1 = lnMul2, tcTip + ': MULTIPLICATOR identic v1=' + TRANSFORM(lnMul1) + ' v2=' + TRANSFORM(lnMul2)
DO Assert WITH lnDisc1 = lnDisc2, tcTip + ': DISCOUNT_EVIDENTIAT identic v1=' + TRANSFORM(lnDisc1) + ' v2=' + TRANSFORM(lnDisc2)
DO Assert WITH lnTvaInc1 = lnTvaInc2, tcTip + ': TVA_INCASARE identic v1=' + TRANSFORM(lnTvaInc1) + ' v2=' + TRANSFORM(lnTvaInc2)
DO Assert WITH lnTipFact1 = lnTipFact2, tcTip + ': TIP_FACTURA identic v1=' + TRANSFORM(lnTipFact1) + ' v2=' + TRANSFORM(lnTipFact2)
DO Assert WITH lnTipSaft1 = lnTipSaft2, tcTip + ': TIP_SAFT identic v1=' + TRANSFORM(lnTipSaft1) + ' v2=' + TRANSFORM(lnTipSaft2)
DO Assert WITH lnCoef1 = lnCoef2, tcTip + ': COEFICIENT_K identic v1=' + TRANSFORM(lnCoef1) + ' v2=' + TRANSFORM(lnCoef2)
ENDPROC
*==================================================================================
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO S62Log WITH 'PASS: ' + tcMsg
ELSE
gnFail = gnFail + 1
DO S62Log WITH 'FAIL: ' + tcMsg
ENDIF
ENDPROC
PROCEDURE S62Log
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE S62Err
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
DO S62Log WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
ENDPROC
PROCEDURE S62Final
IF TYPE('_SCREEN.tmrS62Msg') = 'O'
_SCREEN.tmrS62Msg.Enabled = .F.
ENDIF
DO S62Log WITH CHR(13) + CHR(10) + 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail)
DO S62Log WITH 'END ' + TTOC(DATETIME())
QUIT
ENDPROC
*==================================================================================
* driverMessageboxForm: cauta o forma MESSAGEBOX_FORM printre _SCREEN.Forms si-i apasa automat
* cmdYes/cmdOk (raspunsul implicit "Da"/"OK"), ca sa nu blocheze rularea headless. Tehnica identica
* cu driverAlteDateAD din test_s3b_emitere_reala.prg (partea de MESSAGEBOX_FORM).
* Trateaza in plus FRM_ALTE_DATE (numai pe v1, deschis neconditionat de
* frm_facturare_articole.inainte_de_do_termin - ofacturare.vc2:15076): apasa Termin
* (loForm.do_termin(), nu Release()) ca sa se execute inainte_de_do_termin si sa se scrie
* poDate.ntip_incasare exact ca pe traseul real - un Release() ar sari peste acea scriere si ar
* fabrica o diferenta falsa fata de v2, unde codul echivalent ruleaza inline
* (ofacturare.vc2:20785-20808). Valideaza doar daca poDate.id_delegat e completat dinainte
* (vezi EmiteMasa) - altfel inainte_de_do_termin respinge din nou si formularul ramane deschis.
* Niciun tratament generic "strain -> Release()": clasele principale FRM_FACTURARE_ARTICOLE si
* FRM_FACTURARE_ARTICOLE2 nu sunt atinse de acest driver in niciun fel.
DEFINE CLASS driverMessageboxForm AS Custom
nUltimAlteDate = 0
lBusy = .F.
PROCEDURE Executa
*-- garda de reintrare: do_termin() declanseaza intern Release()/SetFocus, care cedeaza
*-- controlul buclei de mesaje Windows - fara ea, Timer-ul se reintra in timp ce
*-- formularul e pe cale sa se elibereze (obiect pe jumatate distrus -> eroare 1924 "nu e
*-- obiect"), observat empiric la prima rulare. lBusy e verificat/setat sincron, inainte
*-- de orice cod care ar putea ceda controlul - opreste reintrarea chiar daca Timer.Enabled
*-- nu apuca sa opreasca un WM_TIMER deja pus in coada.
IF This.lBusy
RETURN
ENDIF
This.lBusy = .T.
IF TYPE('_SCREEN.tmrS62Msg') = 'O'
_SCREEN.tmrS62Msg.Enabled = .F.
ENDIF
TRY
LOCAL lnI, loMsgForm, loAlteDate, lcClasa
loMsgForm = NULL
loAlteDate = NULL
FOR lnI = 1 TO _SCREEN.FormCount
lcClasa = UPPER(_SCREEN.Forms(lnI).Class)
IF 'MESSAGEBOX_FORM' $ lcClasa
loMsgForm = _SCREEN.Forms(lnI)
ENDIF
IF lcClasa == 'FRM_ALTE_DATE'
loAlteDate = _SCREEN.Forms(lnI)
DO S62Log WITH ' [diag alte_date] gasit la index=' + TRANSFORM(lnI) + ;
' FormCount=' + TRANSFORM(_SCREEN.FormCount) + ' VARTYPE(loAlteDate)=' + VARTYPE(loAlteDate)
ENDIF
IF !(lcClasa $ gcClaseVazuteS62)
gcClaseVazuteS62 = gcClaseVazuteS62 + lcClasa + ';'
DO S62Log WITH ' [diag timer] forma noua vazuta: ' + lcClasa + ' Caption=[' + TRANSFORM(_SCREEN.Forms(lnI).Caption) + ']'
ENDIF
ENDFOR
IF !ISNULL(loMsgForm)
TRY
LOCAL lcTextMsg
lcTextMsg = ''
TRY
lcTextMsg = ALLTRIM(TRANSFORM(loMsgForm.edtMensaje.Value))
CATCH
ENDTRY
DO S62Log WITH ' [driver msg] mesaj=[' + STRTRAN(lcTextMsg, CHR(13) + CHR(10), ' ') + ']'
DO CASE
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5)
DO S62Log WITH ' [driver msg] messagebox_form: apas cmgBotones.cmdYes'
loMsgForm.cmgBotones.cmdYes.Click()
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5)
DO S62Log WITH ' [driver msg] messagebox_form: apas cmgBotones.cmdOk'
loMsgForm.cmgBotones.cmdOk.Click()
ENDCASE
CATCH TO loExcMsg
DO S62Log WITH ' [driver msg] CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message
ENDTRY
ELSE IF !ISNULL(loAlteDate) AND (SECONDS() - This.nUltimAlteDate > 1)
This.nUltimAlteDate = SECONDS()
TRY
DO S62Log WITH ' [driver alte_date] apas do_termin() pe FRM_ALTE_DATE (id_delegat=' + ;
TRANSFORM(NVL(poDate.id_delegat, 0)) + ') VARTYPE=' + VARTYPE(loAlteDate) + ;
' TYPE=' + TYPE('loAlteDate')
loAlteDate.do_termin()
CATCH TO loExcAD
DO S62Log WITH ' [driver alte_date] CATCH ' + TRANSFORM(loExcAD.ErrorNo) + ' ' + loExcAD.Message + ;
' VARTYPE=' + VARTYPE(loAlteDate) + ' TYPE=' + TYPE('loAlteDate')
ENDTRY
ENDIF
CATCH TO loExcTop
DO S62Log WITH ' [driver] CATCH TOP-LEVEL ' + TRANSFORM(loExcTop.ErrorNo) + ' ' + loExcTop.Message
FINALLY
IF TYPE('_SCREEN.tmrS62Msg') = 'O'
_SCREEN.tmrS62Msg.Enabled = .T.
ENDIF
This.lBusy = .F.
ENDTRY
ENDPROC
ENDDEFINE

View File

@@ -0,0 +1,28 @@
$ErrorActionPreference = 'Stop'
$dir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat'
$prg = Join-Path $dir 'test_s6_2_comanda_contract.prg'
$log = Join-Path $dir 'out\test_s6_2_comanda_contract.log'
$vfp = 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe'
$viu = Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*test_s6_2_comanda_contract*' }
if ($viu) {
"Ruleaza deja o instanta a suitei (PID " + ($viu.ProcessId -join ',') + "). Nu lansez a doua."
exit 1
}
Set-Location $dir
Remove-Item *.FXP, *.fxp -ErrorAction SilentlyContinue
Remove-Item $log -ErrorAction SilentlyContinue
$p = Start-Process -FilePath $vfp -ArgumentList '-A', '-T', $prg -PassThru
"lansat PID " + $p.Id
$null = $p.WaitForExit(280000)
if (-not $p.HasExited) {
"INCA RULEAZA dupa 280s - omor instanta (filtrat pe CommandLine)"
Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*test_s6_2_comanda_contract*' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force }
}
if (Test-Path $log) {
Get-Content $log | Select-String -Pattern '^(PASS|FAIL|REZUMAT|TOTAL|START|END|=====|ENV OK|ERROR|CompDoc|DIAG|---| )'
} else {
"Log inexistent: $log"
}

View File

@@ -0,0 +1,116 @@
* test_s6_2_compdoc_comanda.prg
* Headless, fara formulare: compara documentele deja emise de S6-2 pentru COMANDA -
* v1 SSS 654 (id_vanzare 1113) vs v2 SSS 656 (id_vanzare 1114) - CompDoc (schela) + campuri de
* configuratie (TIP, IN_VALUTA, ID_VALUTA, MULTIPLICATOR, DISCOUNT_EVIDENTIAT, TVA_INCASARE,
* TIP_FACTURA, TIP_SAFT, COEFICIENT_K).
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s6_2_compdoc_comanda.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_2_compdoc_comanda.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO.
SET SAFETY OFF
SET TALK OFF
CLOSE DATABASES
PUBLIC gcLog, gnPass, gnFail
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_2_compdoc_comanda.log"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog)
gnPass = 0
gnFail = 0
TRY
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 CLog WITH 'EROARE: conectare Oracle esuata'
DO CFinal
ENDIF
DO CLog WITH 'ENV OK gnHandle=' + TRANSFORM(gnHandle)
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\lib_comparatie_documente.prg" ADDITIVE
LOCAL nFail
nFail = CompDoc('SSS', 654, 'SSS', 656, 'S6-2 comanda v1(654) vs v2(656)')
DO Assert WITH nFail >= 0, 'CompDoc a rulat fara eroare Oracle, esecuri raportate=' + TRANSFORM(nFail)
DO CLog WITH 'CompDoc esecuri totale=' + TRANSFORM(nFail)
LOCAL nId1, nId2, lnQ
nId1 = CdocGasesteIdVanzare('SSS', 654)
nId2 = CdocGasesteIdVanzare('SSS', 656)
DO Assert WITH nId1 = 1113, 'jonctiune serie_act+nract gaseste id_vanzare pt SSS 654, e=' + TRANSFORM(nId1)
DO Assert WITH nId2 = 1114, 'jonctiune serie_act+nract gaseste id_vanzare pt SSS 656, e=' + TRANSFORM(nId2)
IF nId1 > 0 AND nId2 > 0
lnQ = goExecutor.oExecute([select id_vanzare, tip, in_valuta, id_valuta, multiplicator, ] + ;
[discount_evidentiat, tva_incasare, nvl(tip_factura,0) as tip_factura, nvl(tip_saft,0) as tip_saft, ] + ;
[nvl(coeficient_k,0) as coeficient_k from vanzari where id_vanzare in (] + TRANSFORM(nId1) + [,] + TRANSFORM(nId2) + [)], 'crsCfg')
IF lnQ < 0 OR RECCOUNT('crsCfg') <> 2
DO Assert WITH .F., 'citire campuri de configuratie din VANZARI (Reccount asteptat 2)'
ELSE
LOCAL lnTip1, lnTip2, lnInVal1, lnInVal2, lnIdVal1, lnIdVal2, lnMul1, lnMul2, lnDisc1, lnDisc2
LOCAL lnTvaInc1, lnTvaInc2, lnTipFact1, lnTipFact2, lnTipSaft1, lnTipSaft2, lnCoef1, lnCoef2
SELECT crsCfg
LOCATE FOR id_vanzare = nId1
lnTip1 = tip
lnInVal1 = in_valuta
lnIdVal1 = id_valuta
lnMul1 = multiplicator
lnDisc1 = discount_evidentiat
lnTvaInc1 = tva_incasare
lnTipFact1 = tip_factura
lnTipSaft1 = tip_saft
lnCoef1 = coeficient_k
LOCATE FOR id_vanzare = nId2
lnTip2 = tip
lnInVal2 = in_valuta
lnIdVal2 = id_valuta
lnMul2 = multiplicator
lnDisc2 = discount_evidentiat
lnTvaInc2 = tva_incasare
lnTipFact2 = tip_factura
lnTipSaft2 = tip_saft
lnCoef2 = coeficient_k
USE IN crsCfg
DO Assert WITH lnTip1 = lnTip2, 'VANZARI.TIP identic v1=' + TRANSFORM(lnTip1) + ' v2=' + TRANSFORM(lnTip2)
DO Assert WITH lnInVal1 = lnInVal2, 'IN_VALUTA identic v1=' + TRANSFORM(lnInVal1) + ' v2=' + TRANSFORM(lnInVal2)
DO Assert WITH lnIdVal1 = lnIdVal2, 'ID_VALUTA identic v1=' + TRANSFORM(lnIdVal1) + ' v2=' + TRANSFORM(lnIdVal2)
DO Assert WITH lnMul1 = lnMul2, 'MULTIPLICATOR identic v1=' + TRANSFORM(lnMul1) + ' v2=' + TRANSFORM(lnMul2)
DO Assert WITH lnDisc1 = lnDisc2, 'DISCOUNT_EVIDENTIAT identic v1=' + TRANSFORM(lnDisc1) + ' v2=' + TRANSFORM(lnDisc2)
DO Assert WITH lnTvaInc1 = lnTvaInc2, 'TVA_INCASARE identic v1=' + TRANSFORM(lnTvaInc1) + ' v2=' + TRANSFORM(lnTvaInc2)
DO Assert WITH lnTipFact1 = lnTipFact2, 'TIP_FACTURA identic v1=' + TRANSFORM(lnTipFact1) + ' v2=' + TRANSFORM(lnTipFact2)
DO Assert WITH lnTipSaft1 = lnTipSaft2, 'TIP_SAFT identic v1=' + TRANSFORM(lnTipSaft1) + ' v2=' + TRANSFORM(lnTipSaft2)
DO Assert WITH lnCoef1 = lnCoef2, 'COEFICIENT_K identic v1=' + TRANSFORM(lnCoef1) + ' v2=' + TRANSFORM(lnCoef2)
ENDIF
ENDIF
DO CFinal
CATCH TO loExc
DO CLog WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ;
' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo)
DO CFinal
ENDTRY
QUIT
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO CLog WITH 'PASS: ' + tcMsg
ELSE
gnFail = gnFail + 1
DO CLog WITH 'FAIL: ' + tcMsg
ENDIF
ENDPROC
PROCEDURE CLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE CFinal
DO CLog WITH 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail)
DO CLog WITH 'END ' + TTOC(DATETIME())
QUIT
ENDPROC

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,28 @@
$ErrorActionPreference = 'Stop'
$dir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat'
$prg = Join-Path $dir 'test_s6_3_aviz_retur.prg'
$log = Join-Path $dir 'out\test_s6_3_aviz_retur.log'
$vfp = 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe'
$viu = Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*test_s6_3_aviz_retur*' }
if ($viu) {
"Ruleaza deja o instanta a suitei (PID " + ($viu.ProcessId -join ',') + "). Nu lansez a doua."
exit 1
}
Set-Location $dir
Remove-Item (Join-Path $dir 'test_s6_3_aviz_retur.FXP') -ErrorAction SilentlyContinue
Remove-Item $log -ErrorAction SilentlyContinue
$p = Start-Process -FilePath $vfp -ArgumentList '-A', '-T', $prg -PassThru
"lansat PID " + $p.Id
$null = $p.WaitForExit(300000)
if (-not $p.HasExited) {
"ATARNAT dupa 300s - omor instanta (filtrat pe CommandLine)"
Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*test_s6_3_aviz_retur*' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force }
}
if (Test-Path $log) {
Get-Content $log
} else {
"Log inexistent: $log"
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,28 @@
$ErrorActionPreference = 'Stop'
$dir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat'
$prg = Join-Path $dir 'test_s6_3b_v2_primul.prg'
$log = Join-Path $dir 'out\test_s6_3b_v2_primul.log'
$vfp = 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe'
$viu = Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*test_s6_3b_v2_primul*' }
if ($viu) {
"Ruleaza deja o instanta a suitei (PID " + ($viu.ProcessId -join ',') + "). Nu lansez a doua."
exit 1
}
Set-Location $dir
Remove-Item (Join-Path $dir 'test_s6_3b_v2_primul.FXP') -ErrorAction SilentlyContinue
Remove-Item $log -ErrorAction SilentlyContinue
$p = Start-Process -FilePath $vfp -ArgumentList '-A', '-T', $prg -PassThru
"lansat PID " + $p.Id
$null = $p.WaitForExit(300000)
if (-not $p.HasExited) {
"ATARNAT dupa 300s - omor instanta (filtrat pe CommandLine)"
Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*test_s6_3b_v2_primul*' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force }
}
if (Test-Path $log) {
Get-Content $log
} else {
"Log inexistent: $log"
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,852 @@
* test_s6_4_transfer.prg
* Headless: S6-4, transfer (tip 23) si retur transfer (tip 41).
* Bloc A (structural, mereu ruleaza, 0 numere): dovedeste ca v2 nu are traseu catre crsfactura
* nevid pentru 23/41 - cablare, zeroire, absenta grid/buton pe rand.
* Bloc B (structural, mereu ruleaza, 0 numere): dovedeste traseul real pe v1 - But_urmator1,
* ramura modala din do_adauga_articol cu gnScadereStoc=0, clasa frm_articol_factura.
* Bloc D (structural, mereu ruleaza, 0 numere): asertiuni pe cele doua divergente v1/v2 cunoscute
* si inca vii azi in Do Case-ul din do_initializeaza_articol - nu sunt defecte azi (tip 24 nu
* apare in intervalul clasei v2, iar copierea ruteaza azi pe v1), dar sunt capcane latente
* pentru ziua in care v2 ramane singurul formular. Pica daca cineva "unifica" gresit garda.
* Bloc C (emitere REALA, doar pe v1, 1-2 numere tipdoc 6): condtionat de sursa de stoc gasita
* in date (articolul 315554536 / gestiunea 6) sau de scriptul wip13_..._STOC_TRANSFER aplicat.
* Fara sursa: se dezaloca numarul, blocul se marcheaza NEEXERCITAT, nu FAIL.
* NU exista Bloc de comparatie CompDoc: nu exista niciodata document v2 pentru tip 23/41 (§5.d
* din propunere) - a incerca sa emiti pe v2 ar testa cod mort, nu traseul (lectia platita de 3
* ori in acest plan).
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s6_4_transfer.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_4_transfer.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8 (inainte de creeaza_cursor_serii); gnIdSucursala = 167;
* gnScadereStoc = 0; gnFactSeturi = 0; SET PATH catre gridextras si stub_verificare.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
SET TABLEPROMPT OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET DECIMALS TO 4
SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcLog, gnPass, gnFail, gnErr, gcCaz, gcMock, gcNumere
PUBLIC gcMockApeluri, gnMockRaspuns, gcMockDuplicat
PUBLIC gcClaseVazute, goDriverS64, gnModaleArticolInchise
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_4_transfer.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)
gnPass = 0
gnFail = 0
gnErr = 0
gcCaz = ""
gcMockApeluri = ""
gnMockRaspuns = 6
gcMockDuplicat = ""
gcClaseVazute = ";"
gnModaleArticolInchise = 0
gcNumere = ""
gcMock = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg"
*-- poDate & co. declarate SI initializate la nivel de program (capcana platita: PRIVATE declarat
*-- intr-o procedura si asignat in alta ramane invizibil formei)
PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest, pnTotalDiscountAvize, plVizibil
poDate = NULL
poGeneratorNumere = NULL
poDateGestiuneDest = NULL
pnTotalDiscountAvize = 0
plVizibil = .F.
ON ERROR DO S64Err WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
TRY
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 S64Log WITH 'EROARE: conectare Oracle esuata'
DO S64Final
ENDIF
SQLSETPROP(gnHandle, "QueryTimeOut", 45)
DO S64Log WITH 'ENV OK gnHandle=' + TRANSFORM(gnHandle) + ' gcS=' + gcS + ' gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna)
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\lib_comparatie_documente.prg" ADDITIVE
SET PROCEDURE TO (gcMock) ADDITIVE
IF !actualizeaza_optiuni_program()
DO S64Log WITH 'EROARE: actualizeaza_optiuni_program()'
DO S64Final
ENDIF
gnScadereStoc = 0
gnFactSeturi = 0
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 S64Log WITH 'optiuni OK gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ' gnIdSucursala=' + TRANSFORM(gnIdSucursala) + ' gnIdUtil=' + TRANSFORM(gnIdUtil)
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
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
*-- driver + timer: frm_articol_factura (modalul din §3.2) nu trece prin amessagebox, deci
*-- mock-ul nu il acopera. Acelasi tipar de timer/driver validat la S6-2/S6-3/S8.
goDriverS64 = CREATEOBJECT('driverS64')
_SCREEN.AddObject('tmrS64', 'Timer')
_SCREEN.tmrS64.Interval = 200
BINDEVENT(_SCREEN.tmrS64, 'Timer', goDriverS64, 'Executa')
_SCREEN.tmrS64.Enabled = .T.
DO S64Log WITH CHR(13) + CHR(10) + '===== BLOC A: v2 nu are traseu (structural, 0 numere) ====='
DO BlocA_V2FaraTraseu
DO S64Log WITH CHR(13) + CHR(10) + '===== BLOC B: v1 are traseu per-articol cu modal (structural, 0 numere) ====='
DO BlocB_V1Traseu
DO S64Log WITH CHR(13) + CHR(10) + '===== BLOC D: divergentele v1/v2 cunoscute, latente azi (structural, 0 numere) ====='
DO BlocD_DivergenteV1V2
DO S64Log WITH CHR(13) + CHR(10) + '===== ALEGEREA SURSEI REALE (STOC) ====='
DO AlegeSursaStoc
DO S64Log WITH CHR(13) + CHR(10) + '===== BLOC C: emitere REALA pe v1 (conditionata de sursa) ====='
DO BlocC_EmitereV1
DO S64Final
CATCH TO loExc
DO S64Log WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ;
' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']'
DO S64Final
ENDTRY
QUIT
*==================================================================================
* BLOC A: cele trei goluri de pe v2, verificate pe cod, fara sa incarce nimic.
PROCEDURE BlocA_V2FaraTraseu
LOCAL lcTxt, lcV2
gcCaz = '[A] '
lcTxt = FILETOSTR("D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2")
IF EMPTY(lcTxt)
DO Assert WITH .F., 'FILETOSTR ofacturare.vc2 a esuat/gol'
RETURN
ENDIF
*-- A1: cablarea do_incarca_articole (v2) nu include 23/41 in Inlist-ul catre do_adauga_tot
DO Assert WITH "If Inlist(poDate.tip, 3, 4, 21, 25, 28, 42, 47, 8, 9)" $ lcTxt AND ;
!("Inlist(poDate.tip, 3, 4, 21, 23, 25, 28, 41, 42, 47, 8, 9)" $ lcTxt), ;
'A1: cablarea do_adauga_tot (v2) NU contine 23 sau 41 - crsfactura ramane gol dupa Incarca articole'
*-- A2: do_initializeaza_articol zeroeste cantitatea pt 23/41 pe AMBELE clase
DO Assert WITH OCCURS("If Inlist(poDate.tip,1,2,5,6,22,23,29,41,7,10) AND !INLIST(toArticol.opt_facturare,1,2)", lcTxt) >= 1, ;
'A2: do_initializeaza_articol (v2) zeroeste cantitatea pt grupul care include 23 si 41'
*-- A3: v2 nu are But_urmator1 (buton per-rand). NU e unic in tot fisierul (frm_articole_compuse,
*-- clasa nelegata, il are si el la ofacturare.vc2:4489) - scopat pe intervalul claselor v1/v2.
LOCAL lnA3v1, lnA3v2, lnA3Next, lcA3v1, lcA3v2
lnA3v1 = AT('DEFINE CLASS frm_facturare_articole AS _frmbase OF "_frm_base.vcx"', lcTxt)
lnA3v2 = AT('DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx"', lcTxt)
lnA3Next = AT('DEFINE CLASS frm_nomrute AS frm_termin OF "_frm_child.vcx"', lcTxt)
IF lnA3v1 = 0 OR lnA3v2 = 0 OR lnA3Next = 0 OR lnA3v2 <= lnA3v1 OR lnA3Next <= lnA3v2
DO Assert WITH .F., 'A3: pre-conditie - ancorele DEFINE CLASS frm_facturare_articole/2/frm_nomrute gasite si in ordine'
ELSE
lcA3v1 = SUBSTR(lcTxt, lnA3v1, lnA3v2 - lnA3v1)
lcA3v2 = SUBSTR(lcTxt, lnA3v2, lnA3Next - lnA3v2)
DO Assert WITH OCCURS("ADD OBJECT 'But_urmator1'", lcA3v1) = 1, ;
'A3a: v1 (frm_facturare_articole) are But_urmator1 (buton per-rand)'
DO Assert WITH OCCURS("ADD OBJECT 'But_urmator1'", lcA3v2) = 0, ;
'A3b: v2 (frm_facturare_articole2) NU are But_urmator1 - fara echivalent per-rand'
ENDIF
*-- A4: linia libera (do_adauga_articol_cautat) nu verifica 23/41 (Inlist-ul de gardare)
DO Assert WITH "If Inlist(poDate.tip, 3, 4, 21, 25, 28, 42, 47) And !Thisform.do_verifica_articol" $ lcTxt, ;
'A4: garda de stoc a liniei libere (v2) nu acopera 23/41 - nici pe acolo nu exista traseu utilizabil'
*-- A5: instantiere directa a v2 + Incarca articole pe un antet de transfer -> crsfactura ramane gol
*-- (proba comportamentala, nu doar text - dar NU e "traseul real", e control ca A1-A4 nu mint)
DO ControlComportamentalV2
ENDPROC
*-- Control comportamental: cheama Incarca articole pe v2 cu poDate.tip=23, verifica ca
*-- crsfactura ramane gol chiar daca crsarticole s-a umplut. Nu emite, nu consuma numar.
PROCEDURE ControlComportamentalV2
LOCAL loForm, lnArt, lnFact
gcCaz = '[A5] '
DO CuratieCrs
poDate = CREATEOBJECT("oDateFactura", 25022, 23)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poDateGestiuneDest = CREATEOBJECT("oDateGestiune")
poDate.id_client = 6
poDate.nume_client = 'DEPOZIT'
IF TYPE('poDate.id_gestiune_init') = 'N' OR ISNULL(poDate.id_gestiune_init)
poDate.id_gestiune_init = 6
ENDIF
poDate.id_delegat = 39
IF EMPTY(NVL(poDate.id_fdoc, 0))
poDate.id_fdoc = 1
ENDIF
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
IF poDate.rezultat_serii <> 3
DO Assert WITH .F., 'A5: rezultat_serii = 3 pe antet de control (transfer), e=' + TRANSFORM(poDate.rezultat_serii)
DO Goleste
RETURN
ENDIF
poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc)
poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL)
DO S64Log WITH ' A5 control: nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ' serie_act=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract)
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 PregatesteFacturaCrsV2
loForm = CREATEOBJECT('frm_facturare_articole2')
IF VARTYPE(loForm) <> 'O'
DO Assert WITH .F., 'A5: Createobject frm_facturare_articole2 (control)'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO Goleste
RETURN
ENDIF
loForm.WindowType = 0
loForm.Show()
DOEVENTS FORCE
SET PROCEDURE TO (gcMock) ADDITIVE
gcMockApeluri = ''
loForm.but_incarca_articole.Click()
DOEVENTS FORCE
lnArt = IIF(USED('crsarticole'), RECCOUNT('crsarticole'), 0)
lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0)
DO S64Log WITH ' A5 control: dupa Click crsarticole=' + TRANSFORM(lnArt) + ' crsfactura=' + TRANSFORM(lnFact)
DO Assert WITH lnFact = 0, ;
'A5: pe v2, transfer (tip 23), crsfactura ramane GOL dupa Incarca articole - confirma A1-A2 pe comportament'
TRY
loForm.Release()
CATCH
ENDTRY
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (A5, control, niciodata scris);'
DO CuratieCrs
DO Goleste
ENDPROC
PROCEDURE PregatesteFacturaCrsV2
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
ENDPROC
*==================================================================================
* BLOC B: traseul real pe v1 - buton, ramura modala, clasa frm_articol_factura. Doar text/PEMSTATUS,
* nu instantiaza formularul (evita orice dialog inutil).
PROCEDURE BlocB_V1Traseu
LOCAL lcTxt
gcCaz = '[B] '
lcTxt = FILETOSTR("D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2")
DO Assert WITH "caction = do_urmator," $ lcTxt, ;
'B1: But_urmator1 (v1) are cAction = do_urmator - butonul viu pentru adaugare per-articol'
DO Assert WITH "Case (poArticol.gestionabil = 0 Or gnScadereStoc = 0 Or poDate.tip = 45)" $ lcTxt, ;
'B2: do_adauga_articol (v1) ia ramura modala necoditionat cand gnScadereStoc = 0'
DO Assert WITH 'Createobject("frm_articol_factura", lnCantitate, tlImplicit)' $ lcTxt, ;
'B3: ramura modala instantiaza frm_articol_factura (nu do_alege_stoc)'
DO Assert WITH "If !tlImplicit" $ lcTxt AND "ofrmadarticol.Show(1)" $ lcTxt, ;
'B4: modalul se arata (Show(1)) cand tlImplicit = .F. - cazul But_urmator1, nu Adauga tot'
*-- B5: pe v1, but_urmator_tot1 NU e vizibil pentru 23/41 (spre deosebire de 3,4,8,9,21,24,25,28,42,47)
DO VerificaButUrmatorTotAscunsPentruTransfer WITH lcTxt
ENDPROC
* Cauta blocul "Case poDate.tip = 23 ... Endcase/Case urmator" si verifica ca nu contine
* "but_urmator_tot1.Visible = .T." intre el si urmatorul Case. Cautare pe text, robusta la
* reformatari minore (nu presupune numar de linie).
PROCEDURE VerificaButUrmatorTotAscunsPentruTransfer
LPARAMETERS tcTxt
LOCAL lnStart23, lnStart41, lnNextAfter23, lnNextAfter41, lcBloc23, lcBloc41
lnStart23 = AT("Case poDate.tip = 23" + CHR(13) + CHR(10), tcTxt)
IF lnStart23 = 0
lnStart23 = AT("Case poDate.tip = 23", tcTxt)
ENDIF
lnStart41 = AT("Case poDate.tip = 41", tcTxt, 2) && a doua aparitie (dupa cea din alt context, daca exista)
IF lnStart41 = 0 OR lnStart41 < lnStart23
lnStart41 = AT("Case poDate.tip = 41", tcTxt)
ENDIF
IF lnStart23 = 0 OR lnStart41 = 0
DO Assert WITH .F., 'B5: blocurile Case poDate.tip = 23 / 41 gasite in text (pre-conditie cautare)'
RETURN
ENDIF
lnNextAfter23 = AT("Case poDate.tip = 41", tcTxt, 1)
lcBloc23 = SUBSTR(tcTxt, lnStart23, MAX(lnNextAfter23 - lnStart23, 1))
lnNextAfter41 = AT("Case poDate.tip = 25", tcTxt, 1)
lcBloc41 = SUBSTR(tcTxt, lnStart41, MAX(lnNextAfter41 - lnStart41, 1))
DO Assert WITH !("but_urmator_tot1.Visible = .T." $ LOWER(lcBloc23)), ;
'B5a: blocul Case poDate.tip=23 (v1, Init) NU seteaza but_urmator_tot1.Visible - butonul de masa ramane ascuns'
DO Assert WITH !("but_urmator_tot1.Visible = .T." $ LOWER(lcBloc41)), ;
'B5b: blocul Case poDate.tip=41 (v1, Init) NU seteaza but_urmator_tot1.Visible - butonul de masa ramane ascuns'
ENDPROC
*==================================================================================
* BLOC D: cele doua divergente v1/v2 in do_initializeaza_articol, gasite dincolo de propunere.
* Verificat pe cod (ofacturare.vc2): v1 :13878/13890, v2 :19700/19712. NU sunt defecte azi -
* tipul 24 (aviz retur) nu apare deloc in intervalul clasei v2 (15894-21780), iar copierea
* (poDate.lCopiere) ruteaza azi pe v1 (S5c) - dar sunt capcane latente pentru ziua in care v2
* ramane singurul formular (tinta planului #13). Asertiunile pica daca cineva "unifica" garda
* gresit (adica sterge divergenta fara sa decida explicit ce se intampla cu lCopiere/tip 24 pe v2).
* D3 (a treia asertiune ceruta): masinaria modalului per-rand (do_adauga_articol cu tip hint
* frm_articol_factura) exista SI pe v2 - lipseste doar punctul de intrare din UI (A3/B1), nu
* motorul. Distinctia schimba forma reparatiei din propunere §7.
PROCEDURE BlocD_DivergenteV1V2
LOCAL lcTxt
gcCaz = '[D] '
lcTxt = FILETOSTR("D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2")
*-- D1: v1 (:13890) zeroeste cu exceptia suplimentara "OR poDate.lCopiere" - v2 nu o are
DO Assert WITH "Inlist(poDate.tip,1,2,5,6,22,23,29,41,7,10) AND !(INLIST(toArticol.opt_facturare,1,2) OR poDate.lCopiere)" $ lcTxt, ;
'D1: v1 (ofacturare.vc2:13890) are exceptia OR poDate.lCopiere in garda de zeroire - v2 (:19712) nu o are'
*-- D2: varianta cu lCopiere apare o singura data (doar v1) - daca ar aparea si pe v2, divergenta ar fi disparuta silentios
DO Assert WITH OCCURS("Inlist(poDate.tip,1,2,5,6,22,23,29,41,7,10) AND !(INLIST(toArticol.opt_facturare,1,2) OR poDate.lCopiere)", lcTxt) = 1, ;
'D2: garda cu OR poDate.lCopiere exista o singura data in fisier (doar pe v1, :13890) - divergenta e inca vie azi'
*-- D3: v1 (:13878) negeaza cantitatea si pentru tip 24 (aviz retur) - v2 (:19700) doar 8,9.
*-- Substringul scurt "Inlist(poDate.tip,8,9,24)" apare de 8 ori in fisier (Iif/Case aiurea,
*-- alte metode) - asertiunea foloseste sirul complet cu comentariul, unic garantat.
*-- capcana platita aici: VFP trateaza "&&" ca inceput de comentariu chiar si in interiorul unui
*-- string literal (verificat - eroarea 36 aparea si fara linie continuata) - construit din
*-- CHR(38) ca sa nu apara deloc literalul "&&" in sursa .prg
LOCAL lcD3Cauta
lcD3Cauta = "If Inlist(poDate.tip,8,9,24) " + CHR(38) + CHR(38) + " retur lei, retur valuta, aviz retur"
DO Assert WITH OCCURS(lcD3Cauta, lcTxt) = 1, 'D3: garda cu Inlist(poDate.tip,8,9,24) si comentariul aferent exista o singura data (doar pe v1, :13878) - v2 (:19700) are doar 8,9, fara 24'
*-- D4: masinaria modalului per-rand (do_adauga_articol) exista pe AMBELE clase - motorul nu lipseste, doar intrarea din UI
DO Assert WITH OCCURS('Local ofrmadarticol As "frm_articol_factura"', lcTxt) = 2, ;
'D4: type hint ofrmadarticol As frm_articol_factura apare de doua ori (v1 SI v2) - masinaria modalului exista si pe v2, lipseste doar But_urmator1/grd_articole (A3/B1)'
ENDPROC
*==================================================================================
* Alege sursa reala de stoc: intai articolul/gestiunea gasite in propunere (315554536 / gestiunea 6),
* verificat inca valabil; altfel scaneaza gestiunile 1,4,6,19 dupa orice articol cu stoc > 0.
PROCEDURE AlegeSursaStoc
PUBLIC gnArtSursa, gnGestSursa, gnGestDest, gnCantSursa
gnArtSursa = 0
gnGestSursa = 0
gnGestDest = 0
gnCantSursa = 0
LOCAL lnQ
lnQ = goExecutor.oExecute([select cant from stoc where id_articol=315554536 and id_gestiune=6 ] + ;
[and an=] + TRANSFORM(gnAn) + [ and luna=] + TRANSFORM(gnLuna) + [ and cant>0], 'crsSondaStoc')
IF lnQ >= 0 AND USED('crsSondaStoc') AND RECCOUNT('crsSondaStoc') > 0
gnArtSursa = 315554536
gnGestSursa = 6
gnGestDest = 4
gnCantSursa = crsSondaStoc.cant
DO S64Log WITH ' sursa cunoscuta inca valabila: articol=' + TRANSFORM(gnArtSursa) + ' gestiune=' + TRANSFORM(gnGestSursa) + ' cant=' + TRANSFORM(gnCantSursa)
ENDIF
DO Inchide WITH 'crsSondaStoc'
IF gnArtSursa = 0
lnQ = goExecutor.oExecute([select id_gestiune, id_articol, cant from stoc ] + ;
[where id_gestiune in (1,4,6,19) and an=] + TRANSFORM(gnAn) + [ and luna=] + TRANSFORM(gnLuna) + ;
[ and cant>0 order by cant desc], 'crsStocCand')
IF lnQ >= 0 AND USED('crsStocCand') AND RECCOUNT('crsStocCand') > 0
SELECT crsStocCand
GO TOP
gnArtSursa = id_articol
gnGestSursa = id_gestiune
gnCantSursa = cant
gnGestDest = IIF(gnGestSursa = 4, 1, 4)
DO S64Log WITH ' sursa gasita prin scanare: articol=' + TRANSFORM(gnArtSursa) + ' gestiune=' + TRANSFORM(gnGestSursa) + ' cant=' + TRANSFORM(gnCantSursa)
ENDIF
DO Inchide WITH 'crsStocCand'
ENDIF
IF gnArtSursa = 0
DO S64Log WITH ' NICIO sursa de stoc gasita in gestiunile 1,4,6,19, perioada ' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + ;
' - Blocul C ramane NEEXERCITAT. Vezi propunerea sectiunea 4.1 (script wip13 neaplicat).'
ENDIF
ENDPROC
*==================================================================================
* BLOC C: emitere REALA pe v1, doar daca AlegeSursaStoc a gasit o sursa. NU exista echivalent v2,
* deci NU exista Compara/CompDoc aici - vezi verdictul din propunere, punctul d.
PROCEDURE BlocC_EmitereV1
LOCAL oform, lcSerie, lnNract, lnIdVz
gcCaz = '[C] '
IF gnArtSursa = 0
DO S64Log WITH ' C NEEXERCITAT: nicio sursa de stoc (vezi ALEGEREA SURSEI REALE de mai sus)'
RETURN
ENDIF
DO CuratieCrs
poDate = CREATEOBJECT("oDateFactura", 25022, 23)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poDateGestiuneDest = CREATEOBJECT("oDateGestiune")
poDate.id_client = gnGestSursa
poDate.nume_client = 'GESTIUNE SURSA ' + TRANSFORM(gnGestSursa)
IF TYPE('poDate.id_gestiune_init') = 'N' OR ISNULL(poDate.id_gestiune_init)
poDate.id_gestiune_init = gnGestSursa
ENDIF
poDate.id_delegat = 39
IF EMPTY(NVL(poDate.id_fdoc, 0))
poDate.id_fdoc = 1
ENDIF
*-- necunoscuta #1 (propunere §6.2): mapare id_client/id_gestiune_init = ambele sursa e confirmata
*-- EMPIRIC mai jos (incarca_cursor_articole a adus stocul din gestiunea 6 cu id_gestiune_init=6).
*-- Blocajul real gasit la prima rulare a fost altul: poDateGestiuneDest si poDate.listaid raman
*-- goale in acest test (nu trecem prin frm_date_aviz.do_cauta_gestiune_dest, calea UI normala) -
*-- do_scrie_articole (ofacturare.vc2:14152/19863) foloseste poDateGestiuneDest.id_gestiune=0 in
*-- pack_facturare.initializeaza_date_gestiune(), care Oracle a respins cu "Eroare la selectarea
*-- gestiunii! (FACT-019)". Reparat aici cu acelasi SELECT folosit de caut_gestiune_dest()
*-- (ocautare.prg:3298-3305), filtrat direct pe gnGestDest - fara picker modal, deci fara risc de
*-- atarnare.
LOCAL lcSqlGD, lnQGD
lcSqlGD = [select distinct c.nume_gestiune,c.cgest,b.id_gestiune,d.id_tipgest,] + ;
[NVL(c.cont, d.cont) as cont,NVL(c.acont, p.acont) as acont ] + ;
[from gest_coresp_util_grupe a ] + ;
[left join gest_coresp_grupe_gestiuni b on a.id_grupe=b.id_grupe ] + ;
[left join nom_gestiuni c on b.id_gestiune=c.id_gestiune ] + ;
[left join coresp_cont_tipgest d on c.nr_pag=d.id_tipgest ] + ;
[left join vplcont_analitic p on NVL(c.cont, d.cont) = p.cont and p.an = ] + TRANSFORM(gnAn) + [ and p.inactiv = 0 ] + ;
[where a.id_util=] + TRANSFORM(gnIdUtil) + [ and a.sters=0 and b.sters=0 and c.sters=0 and c.nr_pag in (2,4,5,6,7) and b.id_gestiune = ] + TRANSFORM(gnGestDest)
lnQGD = goExecutor.oExecute(lcSqlGD, 'crsGestDest')
IF lnQGD >= 0 AND USED('crsGestDest') AND RECCOUNT('crsGestDest') > 0
poDateGestiuneDest.id_gestiune = crsGestDest.id_gestiune
poDateGestiuneDest.id_tipgest = NVL(crsGestDest.id_tipgest, 0)
poDateGestiuneDest.Cont = NVL(crsGestDest.cont, 'XXXX')
poDateGestiuneDest.acont = NVL(crsGestDest.acont, 'XXXX')
poDate.listaid = TRANSFORM(crsGestDest.id_gestiune)
poDate.descriere = ALLTRIM(NVL(crsGestDest.nume_gestiune, ''))
DO S64Log WITH ' C: gestiune destinatie rezolvata din gest_coresp_util_grupe - id_gestiune=' + TRANSFORM(poDateGestiuneDest.id_gestiune) + ;
' id_tipgest=' + TRANSFORM(poDateGestiuneDest.id_tipgest) + ' Cont=' + poDateGestiuneDest.Cont + ' listaid=' + poDate.listaid
ELSE
DO S64Log WITH ' C: NICIO corespondenta gest_coresp_util_grupe pentru gnIdUtil=' + TRANSFORM(gnIdUtil) + ' si gestiunea destinatie=' + TRANSFORM(gnGestDest) + ;
' - poDateGestiuneDest ramane 0, emiterea va pica probabil la but_termin1 (FACT-019)'
ENDIF
DO Inchide WITH 'crsGestDest'
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
IF poDate.rezultat_serii <> 3
DO Assert WITH .F., 'C: rezultat_serii = 3 (transfer), e=' + TRANSFORM(poDate.rezultat_serii)
DO Goleste
RETURN
ENDIF
poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc)
poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL)
DO S64Log WITH ' C: nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ' serie_act=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ;
' gestiune sursa=' + TRANSFORM(gnGestSursa) + ' articol=' + TRANSFORM(gnArtSursa)
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
*-- v1: incarca_cursor_articole INAINTE de formular (ca in factureaza(), ramura veche)
LOCAL loRez
loRez = incarca_cursor_articole(poDate.tip, .F., poGeneratorNumere)
DO S64Log WITH ' C: incarca_cursor_articole -> nSucces=' + TRANSFORM(loRez.nSucces) + ' lArticole=' + TRANSFORM(loRez.lArticole) + ;
' crsarticole=' + IIF(USED('crsarticole'), TRANSFORM(RECCOUNT('crsarticole')), '(nedeschis)')
DO Assert WITH (loRez.nSucces >= 0) AND loRez.lArticole, 'C: incarca_cursor_articole a adus articole (sursa reala)'
IF !((loRez.nSucces >= 0) AND loRez.lArticole)
gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (C, fara articole);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO Goleste
RETURN
ENDIF
*-- pastreaza doar articolul-sursa ales, ca sa nu deschida un modal per fiecare rand din gestiune
IF USED('crsarticole')
SELECT * FROM crsarticole WHERE id_articol = gnArtSursa INTO CURSOR crsarticole_filtrat READWRITE
IF USED('crsarticole_filtrat') AND RECCOUNT('crsarticole_filtrat') > 0
USE IN crsarticole
SELECT * FROM crsarticole_filtrat INTO CURSOR crsarticole READWRITE
USE IN crsarticole_filtrat
ENDIF
ENDIF
DO S64Log WITH ' C: crsarticole filtrat la articolul sursa, randuri=' + TRANSFORM(IIF(USED('crsarticole'), RECCOUNT('crsarticole'), 0))
*-- SIMULARE (optiunea 2 din sarcina): traseul real (grd_gestiuni/AfterRowColChange, ofacturare.vc2:4219-4232)
*-- ruleaza doar pe ramura gnScadereStoc=1 (do_alege_stoc -> frm_articol_gest_factura), interzisa explicit
*-- (interdictia #5). Cu gnScadereStoc=0, do_adauga_articol instantiaza frm_articol_factura de baza
*-- (fara grd_gestiuni), care nu atinge deloc poArticol.id_gestiune - ramane pe sentinela -1000 din
*-- do_initializeaza_articol (ofacturare.vc2:13771-13773), pe care Oracle o trateaza explicit ca "nesetat"
*-- (ADAUGA_ARTICOL_FACTURA: IF V_ID_GESTIUNE <> -1000 ...), deci V_ID_GESTIUNE2 ramane NULL -> FACT-019.
*-- Reparat aici imbogatind crsarticole cu exact campurile pe care AfterRowColChange le-ar seta pe poArticol,
*-- citite din acelasi cursor real (pack_facturare.cursor_gestiuni_articol, apelat de do_alege_stoc:13389 -
*-- verificat pe USER_SOURCE:3174-3268, doar SELECT/OPEN CURSOR, nicio scriere), nu valori inventate.
LOCAL lcSqlGA, lnQGA, lnGA_idgest, lnGA_pretach, lcGA_lot, lcGA_serie, lcGA_cont, lnGA_idlucrez, lnGA_idpartrez, lnGA_pretv, lnGA_idval, lnGA_pretd
lnGA_idgest = 0
lcSqlGA = [{call pack_facturare.cursor_gestiuni_articol(] + TRANSFORM(gnArtSursa) + [,] + TRANSFORM(poDate.tip) + [,] + ;
TRANSFORM(gnGestSursa) + [,] + TRANSFORM(gnLuna) + [,] + TRANSFORM(gnAn) + [,] + TRANSFORM(gnIdUtil) + [,] + ;
IIF(ISNULL(gnIdSucursala), [NULL], TRANSFORM(gnIdSucursala)) + [)}]
lnQGA = goExecutor.oExecute(lcSqlGA, 'crsgestarticol')
DO S64Log WITH ' C: crsgestarticol (cursor real de loturi, cursor_gestiuni_articol) -> nSucces=' + TRANSFORM(lnQGA) + ;
' randuri=' + IIF(USED('crsgestarticol'), TRANSFORM(RECCOUNT('crsgestarticol')), '(nedeschis)')
IF lnQGA >= 0 AND USED('crsgestarticol') AND RECCOUNT('crsgestarticol') > 0
SELECT crsgestarticol
LOCATE FOR id_gestiune = gnGestSursa
IF !FOUND()
GO TOP
ENDIF
lnGA_idgest = id_gestiune
lnGA_pretach = Pret
lcGA_lot = NVL(lot, '')
lcGA_serie = NVL(serie, '')
lcGA_cont = ALLTRIM(NVL(Cont, 'XXXX'))
lnGA_idlucrez = NVL(id_lucrare_rez, 0)
lnGA_idpartrez = NVL(id_part_rez, 0)
lnGA_pretv = NVL(pretv, 0)
lnGA_idval = NVL(id_valuta, 0)
lnGA_pretd = NVL(pretd, 0)
DO S64Log WITH ' C: crsgestarticol rand ales - id_gestiune=' + TRANSFORM(lnGA_idgest) + ' Pret=' + TRANSFORM(lnGA_pretach) + ;
' lot=[' + lcGA_lot + '] serie=[' + lcGA_serie + '] Cont=' + lcGA_cont
ELSE
DO S64Log WITH ' C: crsgestarticol GOL pentru articol=' + TRANSFORM(gnArtSursa) + ' gestiune=' + TRANSFORM(gnGestSursa) + ;
' - sursa de stoc nu suporta transferul pe acest traseu (alt verdict, nu artefact de test)'
ENDIF
DO Inchide WITH 'crsgestarticol'
IF lnGA_idgest > 0 AND USED('crsarticole')
*-- ALTER TABLE ADD COLUMN a picat cu eroare 1712 "duplicate or invalid" pe nume de camp > 10
*-- caractere (id_gestiune, pret_achizitie, ...) desi TYPE() confirma ca lipsesc - capcana VFP:
*-- ALTER TABLE nu accepta nume lungi pe cursor, desi SELECT...INTO CURSOR le accepta (vezi
*-- tiparul deja folosit in acest fisier, PregatesteFacturaCrsV2). Reconstruit cu SELECT+CAST.
SELECT *, ;
CAST(m.lnGA_idgest AS N(20)) AS id_gestiune, ;
CAST(m.lnGA_pretach AS N(18,6)) AS pret_achizitie, ;
CAST(m.lcGA_cont AS C(20)) AS Cont, ;
CAST(m.lnGA_idlucrez AS N(20)) AS id_lucrare_rez, ;
CAST(m.lnGA_idpartrez AS N(20)) AS id_part_rez, ;
CAST(m.lnGA_pretv AS N(18,6)) AS pretv_orig, ;
CAST(m.lnGA_idval AS N(10)) AS id_valuta_d, ;
CAST(m.lnGA_pretd AS N(18,6)) AS pretd ;
FROM crsarticole INTO CURSOR crsarticole_ge READWRITE
IF USED('crsarticole_ge') AND RECCOUNT('crsarticole_ge') > 0
REPLACE ALL lot WITH lcGA_lot, serie WITH lcGA_serie IN crsarticole_ge
USE IN crsarticole
SELECT * FROM crsarticole_ge INTO CURSOR crsarticole READWRITE
USE IN crsarticole_ge
DO S64Log WITH ' C: crsarticole imbogatit (SELECT+CAST) cu id_gestiune/pret_achizitie/lot/serie/Cont din crsgestarticol (simulare AfterRowColChange)'
ELSE
DO Assert WITH .F., 'C: reconstructia crsarticole cu campurile din crsgestarticol a esuat'
ENDIF
ENDIF
oform = CREATEOBJECT('frm_facturare_articole')
IF VARTYPE(oform) <> 'O'
DO Assert WITH .F., 'C: Createobject frm_facturare_articole'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO Goleste
RETURN
ENDIF
oform.WindowType = 0
oform.Show()
DOEVENTS FORCE
DO Assert WITH LOWER(ALLTRIM(oform.but_urmator1.cAction)) == 'do_urmator', ;
'C: butonul But_urmator1 duce la do_urmator (traseul real pentru transfer)'
DO Assert WITH !oform.but_urmator_tot1.Visible, ;
'C: but_urmator_tot1 NU e vizibil pe transfer (confirma B5a pe instanta reala)'
SET PROCEDURE TO (gcMock) ADDITIVE
gcMockApeluri = ''
gnModaleArticolInchise = 0
oform.but_urmator1.Click()
DOEVENTS FORCE
DO S64Log WITH ' C: dupa but_urmator1.Click, modale frm_articol_factura inchise de driver=' + TRANSFORM(gnModaleArticolInchise) + ;
' crsfactura=' + IIF(USED('crsfactura'), TRANSFORM(RECCOUNT('crsfactura')), '(nedeschis)')
DO Assert WITH USED('crsfactura') AND RECCOUNT('crsfactura') > 0, ;
'C: crsfactura are cel putin o linie dupa parcurgerea modalului per-articol'
*-- inchide neverificatul #1 din diagnostic (§5): valoarea reala pe care a scris-o poArticol, citita direct
*-- din crsfactura (poArticol e PRIVATE, iesit din scop dupa ce do_adauga_articol s-a intors)
IF USED('crsfactura') AND RECCOUNT('crsfactura') > 0
SELECT crsfactura
GO TOP
DO S64Log WITH ' C: crsfactura.id_gestiune dupa modal=' + TRANSFORM(NVL(id_gestiune, -99999)) + ;
' (sursa aleasa gnGestSursa=' + TRANSFORM(gnGestSursa) + ')'
ENDIF
IF !(USED('crsfactura') AND RECCOUNT('crsfactura') > 0)
TRY
oform.Release()
CATCH
ENDTRY
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (C, crsfactura gol);'
DO CuratieCrs
DO Goleste
RETURN
ENDIF
oform.do_calculeaza_totaluri()
DOEVENTS FORCE
lcSerie = ALLTRIM(TRANSFORM(poDate.serie_act))
lnNract = poDate.nract
SET PROCEDURE TO (gcMock) ADDITIVE
gcMockApeluri = ''
oform.but_termin1.Click()
DOEVENTS FORCE
DO S64Log WITH ' C: but_termin1.Click() -> poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare, 0)) + ;
' apeluri amessagebox=[' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']'
lnIdVz = CdocGasesteIdVanzare(lcSerie, lnNract)
IF lnIdVz < 0
lnIdVz = 0
ENDIF
DO Assert WITH lnIdVz > 0, 'C: documentul de transfer exista in VANZARI (jonctiune serie_act+numar_act), id=' + TRANSFORM(lnIdVz)
IF lnIdVz > 0
gcNumere = gcNumere + 'SCRIS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' id_vanzare=' + TRANSFORM(lnIdVz) + ' (C, transfer real);'
DO Assert WITH goExecutor.oExecute([select tip from vanzari where id_vanzare=] + TRANSFORM(lnIdVz), 'crsVzC') >= 0 ;
AND USED('crsVzC') AND RECCOUNT('crsVzC') = 1 AND crsVzC.tip = 23, ;
'C: VANZARI.TIP = 23 pe documentul emis'
DO Inchide WITH 'crsVzC'
DO Assert WITH goExecutor.oExecute([select id_gestiune from vanzari_detalii where id_vanzare=] + TRANSFORM(lnIdVz), 'crsVdC') >= 0 ;
AND USED('crsVdC') AND RECCOUNT('crsVdC') = 1 AND NVL(crsVdC.id_gestiune, -99999) = gnGestSursa, ;
'C: VANZARI_DETALII.ID_GESTIUNE = gestiunea sursa aleasa (' + TRANSFORM(gnGestSursa) + '), nu NULL si nu alta'
DO Inchide WITH 'crsVdC'
ELSE
gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (C, nescris);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
ENDIF
TRY
oform.Release()
CATCH
ENDTRY
DO CuratieCrs
DO Goleste
ENDPROC
*==================================================================================
PROCEDURE Elibereaza
LPARAMETERS toForm
IF TYPE('toForm') = 'O' AND !ISNULL(toForm)
TRY
toForm.Release()
CATCH
ENDTRY
ENDIF
DO CuratieCrs
ENDPROC
PROCEDURE Goleste
poDate = NULL
poGeneratorNumere = NULL
poDateGestiuneDest = NULL
ENDPROC
PROCEDURE CuratieCrs
DO Inchide WITH 'crsarticole'
DO Inchide WITH 'crsarticole1'
DO Inchide WITH 'crsarticole_filtrat'
DO Inchide WITH 'crsarticole_ge'
DO Inchide WITH 'crsfactura'
DO Inchide WITH 'crscursuri'
DO Inchide WITH 'crspolitici'
DO Inchide WITH 'crscontracte'
DO Inchide WITH 'crsgestiunidest'
DO Inchide WITH 'crsgestarticol'
DO Inchide WITH 'crsCtrTemp'
DO Inchide WITH 'crsComTemp'
DO Inchide WITH 'crsartselectate'
DO Inchide WITH 'jtva_coloane'
ENDPROC
PROCEDURE Inchide
LPARAMETERS tcAlias
IF USED(tcAlias)
USE IN (tcAlias)
ENDIF
ENDPROC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO S64Log WITH 'PASS: ' + gcCaz + tcMsg
ELSE
gnFail = gnFail + 1
DO S64Log WITH 'FAIL: ' + gcCaz + tcMsg
ENDIF
ENDPROC
PROCEDURE S64Log
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE S64Err
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gnErr = gnErr + 1
DO S64Log WITH 'ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
ENDPROC
PROCEDURE S64Final
LOCAL lnI
IF TYPE('_SCREEN.tmrS64') = 'O'
_SCREEN.tmrS64.Enabled = .F.
TRY
_SCREEN.RemoveObject('tmrS64')
CATCH
ENDTRY
ENDIF
FOR lnI = _SCREEN.FormCount TO 1 STEP -1
TRY
_SCREEN.Forms(lnI).Release()
CATCH
ENDTRY
ENDFOR
TRY
IF TYPE('goExecutor') = 'O' AND goExecutor.oExecute([select numar_act, id_vanzare, tip from vanzari ] + ;
[where sters = 0 and serie_act = 'SSS' and numar_act between 640 and 720 order by numar_act], 'crsNrSSS') >= 0
DO S64Log WITH CHR(13) + CHR(10) + 'REGISTRU SSS in VANZARI (640-720):'
SELECT crsNrSSS
SCAN
DO S64Log WITH ' SSS ' + TRANSFORM(numar_act) + ' -> id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip)
ENDSCAN
USE IN crsNrSSS
ENDIF
CATCH
ENDTRY
DO S64Log WITH CHR(13) + CHR(10) + 'NUMERE: ' + gcNumere
DO S64Log WITH 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + ' err=' + TRANSFORM(gnErr)
DO S64Log WITH 'END ' + TTOC(DATETIME())
QUIT
ENDPROC
*==================================================================================
* driverS64: inchide automat modalul frm_articol_factura (§3.2), setand cantitatea pe controlul
* clb_cantitate.Text_simplu1 si apeland do_termin() direct (acelasi tipar validat la S6-3 pentru
* FRM_ALTE_DATE - apel direct pe metoda de baza, nu Release, ca sa nu sara peste procesarea din
* do_termin). Trateaza si MESSAGEBOX_FORM (cmdYes/cmdOk) - nu trece prin amessagebox, deci mock-ul
* nu il acopera; tipar identic cu driverMsgS8/driverS63 (capcana platita, gasita la prima rulare
* aici: A5/Incarca articole pe v2 a deschis un MESSAGEBOX_FORM neprevazut in propunere si a atarnat
* fara acest bloc). Nu atinge FRM_FACTURARE_ARTICOLE / FRM_FACTURARE_ARTICOLE2 in niciun fel.
DEFINE CLASS driverS64 AS Custom
lBusy = .F.
nUltimAlteDate = 0
PROCEDURE Executa
IF This.lBusy
RETURN
ENDIF
This.lBusy = .T.
IF TYPE('_SCREEN.tmrS64') = 'O'
_SCREEN.tmrS64.Enabled = .F.
ENDIF
TRY
LOCAL lnI, loArtForm, loMsgForm, loAlteDate, lcClasa
loArtForm = NULL
loMsgForm = NULL
loAlteDate = NULL
FOR lnI = 1 TO _SCREEN.FormCount
lcClasa = UPPER(_SCREEN.Forms(lnI).Class)
IF lcClasa == 'FRM_ARTICOL_FACTURA'
loArtForm = _SCREEN.Forms(lnI)
ENDIF
IF 'MESSAGEBOX_FORM' $ lcClasa
loMsgForm = _SCREEN.Forms(lnI)
ENDIF
IF lcClasa == 'FRM_ALTE_DATE'
loAlteDate = _SCREEN.Forms(lnI)
ENDIF
IF !(lcClasa $ gcClaseVazute)
gcClaseVazute = gcClaseVazute + lcClasa + ';'
DO S64Log WITH ' [diag timer] forma noua: ' + lcClasa + ' Caption=[' + TRANSFORM(_SCREEN.Forms(lnI).Caption) + ']'
ENDIF
ENDFOR
IF !ISNULL(loArtForm)
TRY
LOCAL lnCantSetata
lnCantSetata = MAX(gnCantSursa, 1)
loArtForm.clb_cantitate.Text_simplu1.Value = lnCantSetata
DO S64Log WITH ' [driver articol] cantitate setata=' + TRANSFORM(lnCantSetata)
loArtForm.do_termin()
gnModaleArticolInchise = gnModaleArticolInchise + 1
CATCH TO loExcArt
DO S64Log WITH ' [driver articol] CATCH ' + TRANSFORM(loExcArt.ErrorNo) + ' ' + loExcArt.Message
TRY
loArtForm.Release()
CATCH
ENDTRY
ENDTRY
ELSE
IF !ISNULL(loMsgForm)
TRY
LOCAL lcTextMsg
lcTextMsg = ''
TRY
lcTextMsg = ALLTRIM(TRANSFORM(loMsgForm.edtMensaje.Value))
CATCH
ENDTRY
DO S64Log WITH ' [driver msg] mesaj=[' + STRTRAN(lcTextMsg, CHR(13) + CHR(10), ' ') + ']'
DO CASE
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5)
DO S64Log WITH ' [driver msg] apas cmgBotones.cmdYes'
loMsgForm.cmgBotones.cmdYes.Click()
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5)
DO S64Log WITH ' [driver msg] apas cmgBotones.cmdOk'
loMsgForm.cmgBotones.cmdOk.Click()
ENDCASE
CATCH TO loExcMsg
DO S64Log WITH ' [driver msg] CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message
ENDTRY
ELSE
*-- FRM_ALTE_DATE nu apare pe traseul transferului conform propunerii §8, dar
*-- confirmarea "totalul 0" de la BLOC C l-a deschis totusi (id_delegat cerut la
*-- antet) - tratat identic cu driverS63 (do_termin() direct, garda 1s reintrare).
IF !ISNULL(loAlteDate) AND (SECONDS() - This.nUltimAlteDate > 1)
This.nUltimAlteDate = SECONDS()
TRY
DO S64Log WITH ' [driver alte_date] apas do_termin() pe FRM_ALTE_DATE (id_delegat=' + ;
TRANSFORM(NVL(poDate.id_delegat, 0)) + ')'
loAlteDate.do_termin()
CATCH TO loExcAD
DO S64Log WITH ' [driver alte_date] CATCH ' + TRANSFORM(loExcAD.ErrorNo) + ' ' + loExcAD.Message
ENDTRY
ENDIF
ENDIF
ENDIF
CATCH TO loExcTop
DO S64Log WITH ' [driver] CATCH TOP-LEVEL ' + TRANSFORM(loExcTop.ErrorNo) + ' ' + loExcTop.Message
FINALLY
IF TYPE('_SCREEN.tmrS64') = 'O'
_SCREEN.tmrS64.Enabled = .T.
ENDIF
This.lBusy = .F.
ENDTRY
ENDPROC
ENDDEFINE

View File

@@ -0,0 +1,991 @@
* test_s6_5_valuta.prg
* VIZIBIL (grid): proba de paritate v1 vs v2 pe VALUTA (tip 5 = Invoice lista de preturi,
* in_valuta = 1, id_valuta = 2 EURO, tipdoc 5, seria SSS). Emite 2 documente REALE in
* MARIUSM_AUTO@ROA_CENTRAL, cu ACELEASI doua articole EURO (id_articol, pret, proc_tvav) si
* aceeasi cantitate pe ambele forme. In plus fata de S6-1 (sablonul acestui test): CURS,
* MULTIPLICATOR, VALVAL, TVAVAL, TOTVAL (pe VANZARI) si VANZARI_CURSURI.
*
* Verificat pe MARIUSM_AUTO, azi (SELECT, fara scriere) - decizia zi_curs:
* VCURS EURO: curs=5.2554 multiplicator=1 valabil doar la 10/08/2026 (spec).
* Calendarul deschis (tabela CALENDAR, max an*12+luna) e 2026/8 - ACELASI cu zi_curs, deci
* gnAn/gnLuna (folosite de cursor_preturi ptr. valabilitatea politicii de pret) nu intra in
* conflict cu zi_curs (folosit ptr. cursul valutar). Nu s-a schimbat zi_curs fata de spec.
*
* Traseul probat - IDENTIC cu S6-1 (tip 5 e in ACELASI Case din incarca_cursor_articole ca tip 1,
* ofacturare.prg:479-482, si in ACELASI llCautareInLinie ca tip 1, ofacturare.vc2:19563/:21198) -
* singura diferenta reala e ca poDate.in_valuta = 1 (setat automat la Init pentru tnTip=5,
* ofacturare_comun.prg:255-257) si poDate.id_valuta trebuie dat manual (vezi OCOLIRE mai jos):
* v1: incarca_cursor_articole(5, .F., poGeneratorNumere) INAINTE de formular -> crsarticole
* (candidati EURO, cu tip_valuta=1, Curs/multiplicator populate de SQL). Butonul viu ramane
* But_urmator1 (caction = do_urmator) - Init nu aprinde But_urmator_tot1 pentru
* Inlist(poDate.tip,1,5,7,10) (ofacturare.vc2:15275) - tip 5 e in ACEEASI lista ca tip 1.
* OCOLIRE DECLARATA (identica cu S6-1): do_adauga_articol(.T.) direct.
* v2: tipul 5 e in llCautareInLinie (Inlist(poDate.tip,1,22,5,29,7,10,45), :19563) - liniile
* intra prin cautarea in grid: APPEND BLANK + do_adauga_articol_cautat(loArticol,cantitate),
* tehnica validata la S5c/S6-1.
*
* OCOLIRE DECLARATA suplimentara fata de S6-1: alegerea valutei (do_cauta_valuta, dialog modal pe
* antet, ofacturare.vc2:9494-9503) nu trece prin formular - poDate.id_valuta = 2 / nume_valuta =
* 'EURO' se seteaza direct in test, imediat dupa CREATEOBJECT("oDateFactura",...), inainte de orice
* incarca_cursor_articole (cursor_preturi primeste ?poDate.id_valuta ca parametru, ofacturare.prg:
* 481). Selectorul insusi ramane neexercitat - aceeasi datorie generala ca §3.4/§6 din propunere.
*
* Defect CUNOSCUT, nu al acestui test (gasit la S6-1, acelasi cod, netastins aici): v2
* (do_adauga_articol_cautat, ofacturare.vc2:18857-18862) nu trimite lot/taxcode in Gather, spre
* deosebire de v1 (:13095-13100) - se asteapta FAIL pe TAXCODE in CompDoc, marcat separat in raport.
*
* Mod VIZIBIL, prin vfp_ui_harness.ps1 (ca la S5c/S6-1): fereastra reala, off-screen, fara input
* real injectat. FRM_ALTE_DATE se inchide cu do_termin(), NU Release().
*
* Rulare: powershell -ExecutionPolicy Bypass -File test_s6_5_valuta.ps1 (timeout >= 600s)
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_5_valuta.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8 (inainte de creeaza_cursor_serii); gnIdSucursala = 167;
* gnScadereStoc = 0; gnFactSeturi = 0; SET PATH catre gridextras si stub_verificare.
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 ''
CLOSE DATABASES
PUBLIC gcLog, gnPass, gnFail, gnErr, gcCaz, gcMock, gcNumere
PUBLIC gcMockApeluri, gnMockRaspuns, gcMockDuplicat
PUBLIC gcUltimaSerie, gnUltimulNract, goDriverS65, gcClaseVazute
PUBLIC gcSyncDir, gcUILog, gnCantitateAleasa
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_5_valuta.log"
IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out")
MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out"
ENDIF
gcUILog = gcLog
gcSyncDir = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\uisync_s65\"
IF !DIRECTORY(gcSyncDir)
MD (gcSyncDir)
ENDIF
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog)
gnPass = 0
gnFail = 0
gnErr = 0
gcCaz = ""
gcMockApeluri = ""
gnMockRaspuns = 6
gcMockDuplicat = ""
gcUltimaSerie = ""
gnUltimulNract = 0
gcClaseVazute = ";"
gcNumere = ""
gnCantitateAleasa = 2
gcMock = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg"
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg" ADDITIVE
DO HarnessInit
*-- poDate & co. se declara SI se initializeaza la nivelul programului principal - vezi capcana
*-- platita la S8 (metodele din .vcx nu vad variabila daca nu exista deja pe stiva de sub ele).
PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest
poDate = NULL
poGeneratorNumere = NULL
poDateGestiuneDest = NULL
ON ERROR DO S65Err WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
TRY
*-- stub_verificare PRIMUL: "Do Form verificare" (ofacturare.vc2:14404 / :20126) rezolva la stub
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 S65Log WITH 'EROARE: conectare Oracle esuata'
DO S65Final
ENDIF
SQLSETPROP(gnHandle, "QueryTimeOut", 45)
DO S65Log WITH 'ENV OK gnHandle=' + TRANSFORM(gnHandle) + ' gcS=' + gcS + ' gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna)
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\lib_comparatie_documente.prg" ADDITIVE
SET PROCEDURE TO (gcMock) ADDITIVE
IF !actualizeaza_optiuni_program()
DO S65Log WITH 'EROARE: actualizeaza_optiuni_program()'
DO S65Final
ENDIF
gnScadereStoc = 0
gnFactSeturi = 0
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 S65Log WITH 'optiuni OK gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ' gnFactSeturi=' + TRANSFORM(gnFactSeturi) + ;
' gnIdSucursala=' + TRANSFORM(gnIdSucursala) + ' gnIdUtil=' + TRANSFORM(gnIdUtil) + ;
' gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna)
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
*-- cboTipFactura cere RowSource pe saft_tip_facturi la constructia formularului v2
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
PUBLIC gdZiCurs
*-- zi_curs FIX, cerut de spec (§7 S6-5) - verificat pe MARIUSM_AUTO azi (VCURS EURO curs=5.2554
*-- multiplicator=1 doar la aceasta data) si compatibil cu calendarul deschis (2026/8) - vezi
*-- antetul fisierului. NU se foloseste DataCursValid() dinamic (spre deosebire de S6-1).
gdZiCurs = CTOD('10/08/2026')
DO S65Log WITH ' zi_curs folosita pentru toate documentele (FIX, din spec): ' + DTOC(gdZiCurs)
IF !VerificaCursEuro()
DO Assert WITH .F., 'curs EURO valabil la zi_curs=' + DTOC(gdZiCurs) + ' - vezi log'
DO S65Final
ENDIF
*-- driver + timer: FRM_ALTE_DATE (v1, .Show(1) neconditionat la inainte_de_do_termin) si
*-- formele modale MESSAGEBOX_FORM nu trec prin functia amessagebox - mock-ul nu le acopera.
*-- Tehnica validata la S5c/S6-1.
goDriverS65 = CREATEOBJECT('driverS65')
_SCREEN.AddObject('tmrS65', 'Timer')
_SCREEN.tmrS65.Interval = 200
BINDEVENT(_SCREEN.tmrS65, 'Timer', goDriverS65, 'Executa')
_SCREEN.tmrS65.Enabled = .T.
DO S65Log WITH 'DIAG SET_PATH stub inca in fata: ' + FULLPATH('verificare.scx')
DO HarnessStep WITH 0, 'env gata', 8
DO S65Log WITH CHR(13) + CHR(10) + '===== RUTARE (structural, inainte de orice emitere) ====='
DO AsertiuniRutare
DO S65Log WITH CHR(13) + CHR(10) + '===== ALEGEREA A DOUA ARTICOLE EURO (comune v1 si v2) ====='
IF !AlegeArticole()
DO Assert WITH .F., 'alegerea celor doua articole EURO a esuat - vezi log'
DO S65Final
ENDIF
LOCAL lnIdV1, lnIdV2, lcSer1, lnNr1, lcSer2, lnNr2
STORE 0 TO lnIdV1, lnIdV2, lnNr1, lnNr2
STORE '' TO lcSer1, lcSer2
DO S65Log WITH CHR(13) + CHR(10) + '===== EMITERE v1 (frm_facturare_articole) ====='
lnIdV1 = EmiteProtejat('v1')
lcSer1 = gcUltimaSerie
lnNr1 = gnUltimulNract
DO HarnessStep WITH 1, 'v1 emis', 8
DO S65Log WITH CHR(13) + CHR(10) + '===== EMITERE v2 (frm_facturare_articole2) ====='
lnIdV2 = EmiteProtejat('v2')
lcSer2 = gcUltimaSerie
lnNr2 = gnUltimulNract
DO HarnessStep WITH 2, 'v2 emis', 8
IF lnIdV1 > 0 AND lnIdV2 > 0
DO S65Log WITH CHR(13) + CHR(10) + '===== CompDoc valuta v1(' + lcSer1 + ' ' + TRANSFORM(lnNr1) + ;
') vs v2(' + lcSer2 + ' ' + TRANSFORM(lnNr2) + ') ====='
DO Compara WITH lcSer1, lnNr1, lcSer2, lnNr2
ELSE
DO Assert WITH .F., 'ambele documente s-au scris (v1 id_vanzare=' + TRANSFORM(lnIdV1) + ;
' v2 id_vanzare=' + TRANSFORM(lnIdV2) + ')'
ENDIF
DO HarnessStep WITH 3, 'compdoc gata', 8
DO S65Log WITH CHR(13) + CHR(10) + '===== 8b: but_cursuri.Enabled pe tip in lei, fara emitere ====='
DO VerificaButCursuriLei
DO HarnessStep WITH 4, '8b gata', 8
DO S65Final
CATCH TO loExc
DO S65Log WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ;
' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']'
DO S65Final
ENDTRY
QUIT
*==================================================================================
* Confirma pe MARIUSM_AUTO (SELECT, fara scriere) ca exista curs EURO la gdZiCurs - inainte de
* orice emitere, ca sa nu se produca dialogul modal frm_curs (eroarea Oracle 20005).
FUNCTION VerificaCursEuro
LOCAL lcSql, llOk
llOk = .F.
lcSql = [select curs, multiplicator from vcurs where upper(nume_val) = 'EURO' and ] + ;
[to_date('] + DTOC(gdZiCurs) + [','DD/MM/YYYY') between data and data2]
IF goExecutor.oExecute(lcSql, 'crsCursChk') >= 0 AND USED('crsCursChk') AND RECCOUNT('crsCursChk') > 0
GO TOP IN crsCursChk
DO S65Log WITH ' VerificaCursEuro: curs=' + TRANSFORM(crsCursChk.curs) + ' multiplicator=' + TRANSFORM(crsCursChk.multiplicator)
llOk = .T.
ELSE
DO S65Log WITH ' VerificaCursEuro ESEC: ' + goExecutor.oPrelucrareEroare()
ENDIF
IF USED('crsCursChk')
USE IN crsCursChk
ENDIF
RETURN llOk
ENDFUNC
*==================================================================================
* Alegerea celor doua articole EURO comune v1/v2: sonda cu incarca_cursor_articole(5,...) (traseul
* real de pe v1 pentru tip 5 - ACELASI Case din ofacturare.prg:479-482 ca tip 1), apoi TOP 2
* negestionabile cu pret>0 si cota prezenta in jtva_coloane. Rezultat: crsAleseS65 (2 randuri, RW).
FUNCTION AlegeArticole
LOCAL loRez, lcStrategie
poDate = CREATEOBJECT("oDateFactura", 25000, 5)
poDate.id_client = 463
poDate.id_delegat = 256
poDate.zi_curs = gdZiCurs
*-- OCOLIRE DECLARATA: alegerea valutei prin do_cauta_valuta (dialog modal) e ocolita, vezi
*-- antetul fisierului. cursor_preturi primeste ?poDate.id_valuta ca parametru direct.
poDate.id_valuta = 2
poDate.nume_valuta = 'EURO'
DO Assert WITH poDate.in_valuta = 1, 'sonda: poDate.in_valuta=1 dupa Init(25000,5) - automat din tnTip, e=' + TRANSFORM(poDate.in_valuta)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
loRez = incarca_cursor_articole(5, .F., poGeneratorNumere)
DO Assert WITH (loRez.nSucces >= 0) AND loRez.lArticole, 'sonda: incarca_cursor_articole(5) a adus articole'
DO S65Log WITH ' sonda: crsarticole=' + IIF(USED('crsarticole'), TRANSFORM(RECCOUNT('crsarticole')), '(nedeschis)')
IF !USED('crsarticole') OR RECCOUNT('crsarticole') = 0
DO Goleste
RETURN .F.
ENDIF
DO Assert WITH poDate.Curs > 0, 'sonda: poDate.Curs populat de incarca_cursor_articole din crsarticole (tip_valuta=1), e=' + TRANSFORM(poDate.Curs)
DO S65Log WITH ' sonda: poDate.Curs=' + TRANSFORM(poDate.Curs) + ' poDate.multiplicator=' + TRANSFORM(poDate.multiplicator)
*-- jtva_coloane trebuie construit din jtva_coloane_temp INAINTE de orice JOIN pe el - altfel
*-- SELECT-ul de mai jos referentiaza un alias inexistent si VFP arata dialogul nativ "Look In"
*-- (fara eroare prinsa de ON ERROR, rulare atarnata - capcana gasita la S6-1)
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
*-- TOP 30 candidati, apoi se aleg in VFP primele doua cu id_articol DISTINCT (acelasi articol
*-- poate aparea de mai multe ori in crsarticole, o data per politica de pret)
DO Inchide WITH 'crsCandS65'
SELECT TOP 30 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 crsCandS65 READWRITE
lcStrategie = 'negestionabile EURO cu cota in jtva_coloane'
IF RECCOUNT('crsCandS65') < 2
DO Inchide WITH 'crsCandS65'
SELECT TOP 30 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.pret,0) > 0 ;
ORDER BY a.id_articol INTO CURSOR crsCandS65 READWRITE
lcStrategie = 'orice EURO cu cota in jtva_coloane (gestionabile incluse)'
ENDIF
IF RECCOUNT('crsCandS65') < 2
DO Inchide WITH 'crsCandS65'
SELECT TOP 30 * FROM crsarticole ORDER BY id_articol INTO CURSOR crsCandS65 READWRITE
lcStrategie = 'primele EURO din lista (nicio potrivire de cota)'
ENDIF
DO Inchide WITH 'crsAleseS65'
SELECT * FROM crsCandS65 WHERE .F. INTO CURSOR crsAleseS65 READWRITE
LOCAL lnUltimulId, loRowS65
lnUltimulId = -1
SELECT crsCandS65
SCAN
IF id_articol <> lnUltimulId
SCATTER MEMO NAME loRowS65
INSERT INTO crsAleseS65 FROM NAME loRowS65
lnUltimulId = id_articol
ENDIF
IF RECCOUNT('crsAleseS65') >= 2
EXIT
ENDIF
ENDSCAN
DO Inchide WITH 'crsCandS65'
DO Assert WITH RECCOUNT('crsAleseS65') = 2, 'doua articole EURO DISTINCTE alese pentru S6-5, e=' + TRANSFORM(RECCOUNT('crsAleseS65'))
DO S65Log WITH ' strategie: ' + lcStrategie
SELECT crsAleseS65
SCAN
DO S65Log WITH ' ales: id_articol=' + TRANSFORM(id_articol) + ' [' + ALLTRIM(TRANSFORM(denumire)) + ;
'] pret=' + TRANSFORM(pret) + ' proc_tvav=' + TRANSFORM(proc_tvav) + ' gestionabil=' + TRANSFORM(NVL(gestionabil,0)) + ;
' tip_valuta=' + TRANSFORM(NVL(tip_valuta,0)) + ' id_valuta=' + TRANSFORM(NVL(id_valuta,0)) + ' Curs=' + TRANSFORM(NVL(Curs,0))
ENDSCAN
DO Inchide WITH 'crsarticole'
DO Goleste
RETURN (RECCOUNT('crsAleseS65') = 2)
ENDFUNC
*==================================================================================
* Rutarea, structural: acelasi Case de incarcare candidati si acelasi llCautareInLinie ca la S6-1
* (tip 5 face parte din amandoua listele), plus butonul de vizibilitate a cursului valutar.
PROCEDURE AsertiuniRutare
LOCAL lcTxt
gcCaz = '[RUTARE] '
lcTxt = FILETOSTR("D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2")
IF EMPTY(lcTxt)
DO Assert WITH .F., 'FILETOSTR ofacturare.vc2 a esuat/gol'
RETURN
ENDIF
DO Assert WITH OCCURS("caction = do_urmator,", lcTxt) = 1, ;
'un singur caction = do_urmator (butonul Adauga, viu pe v1 pentru tip 5 - acelasi buton ca tip 1)'
DO Assert WITH "Inlist(poDate.tip,1,5,7,10)" $ lcTxt, ;
'tip 5 e in lista care ascunde But_urmator_tot1 pe v1 (acelasi tratament ca tip 1)'
DO Assert WITH "Inlist(poDate.tip, 1, 22, 5, 29, 7, 10, 45)" $ lcTxt, ;
'llCautareInLinie contine tipul 5 (v2 sare incarcarea in masa pentru valuta lista-de-preturi)'
DO Assert WITH OCCURS("PROCEDURE grd_factura.cDenumire.cCboDenumire.LostFocus", lcTxt) = 1, ;
'un singur handler cDenumire.cCboDenumire.LostFocus'
DO Assert WITH OCCURS("PROCEDURE grd_factura.cCodMat.cboCodmat.LostFocus", lcTxt) = 1, ;
'un singur handler cCodMat.cboCodmat.LostFocus'
DO Assert WITH OCCURS("Thisform.do_adauga_articol_cautat(loArticol, loArticol.cantitate)", lcTxt) = 2, ;
'ambele handlere de cautare in grid cheama do_adauga_articol_cautat(loArticol, loArticol.cantitate)'
DO Assert WITH OCCURS("PROCEDURE do_actualizeaza_vizibilitate_curs", lcTxt) = 1, ;
'un singur do_actualizeaza_vizibilitate_curs (v2)'
DO Assert WITH "Thisform.do_actualizeaza_vizibilitate_curs()" $ lcTxt AND "Thisform.do_actualizeaza_vizibilitate_curs(.T.)" $ lcTxt, ;
'do_actualizeaza_vizibilitate_curs e chemat atat fara parametru cat si cu .T. (Init/do_calculeaza_totaluri si do_incarca_articole)'
DO Assert WITH "poDate.in_valuta = 1" $ lcTxt, ;
'do_actualizeaza_vizibilitate_curs testeaza poDate.in_valuta=1 (relevant pentru tip 5)'
DO Assert WITH "Inlist(m.tnTip, 5,6,7,9,10,52)" $ lcTxt OR "INLIST(m.tnTip, 5,6,7,9,10,52)" $ lcTxt, ;
'tip 5 seteaza automat in_valuta=1 la Init (ofacturare_comun.prg)'
ENDPROC
*==================================================================================
* EmiteV1: traseul real de pe v1 pentru tip 5 - incarca_cursor_articole(5,...) inainte de formular,
* candidatii restransi la cele doua articole alese, apoi do_adauga_articol(.T.) - vezi ocolirea
* declarata in antetul fisierului (identica cu S6-1, plus id_valuta setat manual).
FUNCTION EmiteV1
LOCAL lnIdVz, lcSerie, lnNract, oform, loRez, lnI, lnFact
lnIdVz = 0
lcSerie = ''
lnNract = 0
gcUltimaSerie = ''
gnUltimulNract = 0
gcCaz = '[valuta-v1] '
DO CuratieCrs
poDate = CREATEOBJECT("oDateFactura", 25000, 5)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poDateGestiuneDest = CREATEOBJECT("oDateGestiune")
poDate.nIdTipDoc = 5
poDate.id_client = 463
poDate.id_delegat = 256
poDate.zi_curs = gdZiCurs
poDate.id_valuta = 2
poDate.nume_valuta = 'EURO'
DO Assert WITH poDate.in_valuta = 1, 'v1: poDate.in_valuta=1, e=' + TRANSFORM(poDate.in_valuta)
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
DO Assert WITH poDate.rezultat_serii = 3, 'v1: rezultat_serii=3 (o singura plaja, fara dialog), e=' + TRANSFORM(poDate.rezultat_serii)
IF poDate.rezultat_serii <> 3
DO Goleste
RETURN 0
ENDIF
poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc)
poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL)
poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract)
DO S65Log WITH ' v1: nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ' serie_act=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ;
' nract=' + TRANSFORM(poDate.nract)
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
*-- traseul real: incarca_cursor_articole(5,...) - ACELASI Case ca tip 1 (ofacturare.prg:479-482)
loRez = incarca_cursor_articole(5, .F., poGeneratorNumere)
DO Assert WITH (loRez.nSucces >= 0) AND loRez.lArticole, 'v1: incarca_cursor_articole(5) a adus articole'
IF !((loRez.nSucces >= 0) AND loRez.lArticole)
gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (v1, fara articole);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO Goleste
RETURN 0
ENDIF
DO Assert WITH poDate.Curs > 0, 'v1: poDate.Curs populat dupa incarca_cursor_articole, e=' + TRANSFORM(poDate.Curs)
*-- inlocuiesc candidatii proaspat incarcati cu EXACT cele doua randuri alese in AlegeArticole
*-- (acelasi id_pol/pret/proc_tvav ca pe v2) - filtrarea pe DOAR id_articol nu ajunge (capcana
*-- gasita la S6-1: acelasi articol poate aparea de mai multe ori, o data per politica de pret)
USE IN crsarticole
SELECT * FROM crsAleseS65 INTO CURSOR crsarticole READWRITE
DO Assert WITH RECCOUNT('crsarticole') = 2, 'v1: cele doua articole alese gasite in crsarticole, e=' + TRANSFORM(RECCOUNT('crsarticole'))
oform = CREATEOBJECT('frm_facturare_articole')
IF VARTYPE(oform) <> 'O'
DO Assert WITH .F., 'v1: Createobject frm_facturare_articole'
DO Goleste
RETURN 0
ENDIF
oform.WindowType = 0
oform.Show()
DOEVENTS FORCE
SET PROCEDURE TO (gcMock) ADDITIVE
gcMockApeluri = ''
DO Assert WITH LOWER(ALLTRIM(oform.but_urmator1.cAction)) == 'do_urmator', 'v1: butonul Adauga duce la do_urmator'
DO Assert WITH oform.but_urmator1.Visible, 'v1: butonul Adauga e VIZIBIL pentru tip 5'
*-- ocolire declarata (vezi antetul fisierului): do_adauga_articol(.T.) direct
FOR lnI = 1 TO RECCOUNT('crsarticole')
SELECT crsarticole
GO lnI
oform.do_adauga_articol(.T.)
ENDFOR
DOEVENTS FORCE
lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0)
DO S65Log WITH ' v1: dupa adaugare crsfactura=' + TRANSFORM(lnFact)
DO Assert WITH lnFact = 2, 'v1: crsfactura are exact 2 linii dupa adaugare, e=' + TRANSFORM(lnFact)
IF lnFact = 0
gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (v1, fara linii);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO Elibereaza WITH oform
DO Goleste
RETURN 0
ENDIF
DO SeteazaCantitati WITH 'crsfactura'
oform.do_calculeaza_totaluri()
DOEVENTS FORCE
DO S65Log WITH ' v1: dupa do_calculeaza_totaluri poDate.Curs=' + TRANSFORM(poDate.Curs) + ;
' poDate.multiplicator=' + TRANSFORM(poDate.multiplicator) + ' poDate.nvalval=' + TRANSFORM(NVL(poDate.nvalval,0)) + ;
' poDate.ntvaval=' + TRANSFORM(NVL(poDate.ntvaval,0)) + ' poDate.ntotval=' + TRANSFORM(NVL(poDate.ntotval,0))
lcSerie = ALLTRIM(TRANSFORM(poDate.serie_act))
lnNract = poDate.nract
SET PROCEDURE TO (gcMock) ADDITIVE
gcMockApeluri = ''
DO S65Log WITH ' v1: [pas] but_termin1.Click'
oform.but_termin1.Click()
DOEVENTS FORCE
DO S65Log WITH ' v1: but_termin1.Click() -> poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare, 0))
DO S65Log WITH ' v1: apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']'
lnIdVz = CdocGasesteIdVanzare(lcSerie, lnNract)
IF lnIdVz < 0
lnIdVz = 0
ENDIF
DO Assert WITH lnIdVz > 0, 'v1: documentul exista in VANZARI (serie_act+numar_act), e=' + TRANSFORM(lnIdVz)
IF lnIdVz > 0
gcNumere = gcNumere + 'SCRIS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' id_vanzare=' + TRANSFORM(lnIdVz) + ' (v1);'
ELSE
gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (v1, nescris);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
lcSerie = ''
lnNract = 0
ENDIF
DO Elibereaza WITH oform
DO Goleste
gcUltimaSerie = lcSerie
gnUltimulNract = lnNract
RETURN lnIdVz
ENDFUNC
*==================================================================================
* EmiteV2: traseul real de pe v2 pentru tip 5 - crsfactura gol inainte de formular, apoi
* APPEND BLANK + do_adauga_articol_cautat per articol (reproduce exact handler-ul grid-ului,
* vezi antetul fisierului si AsertiuniRutare).
FUNCTION EmiteV2
LOCAL lnIdVz, lcSerie, lnNract, oform, loArticol, lnAdaugate, llOk, lnFact
lnIdVz = 0
lcSerie = ''
lnNract = 0
gcUltimaSerie = ''
gnUltimulNract = 0
gcCaz = '[valuta-v2] '
DO CuratieCrs
poDate = CREATEOBJECT("oDateFactura", 25000, 5)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poDateGestiuneDest = CREATEOBJECT("oDateGestiune")
poDate.nIdTipDoc = 5
poDate.id_client = 463
poDate.id_delegat = 256
poDate.zi_curs = gdZiCurs
poDate.id_valuta = 2
poDate.nume_valuta = 'EURO'
DO Assert WITH poDate.in_valuta = 1, 'v2: poDate.in_valuta=1, e=' + TRANSFORM(poDate.in_valuta)
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
DO Assert WITH poDate.rezultat_serii = 3, 'v2: rezultat_serii=3 (o singura plaja, fara dialog), e=' + TRANSFORM(poDate.rezultat_serii)
IF poDate.rezultat_serii <> 3
DO Goleste
RETURN 0
ENDIF
poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc)
poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL)
poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract)
DO S65Log WITH ' v2: nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ' serie_act=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ;
' nract=' + TRANSFORM(poDate.nract)
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
*-- v2: crsfactura gol INAINTE de formular (ca in factureaza(), ramura llFacturareNoua)
DO PregatesteFacturaCrs
oform = CREATEOBJECT('frm_facturare_articole2')
IF VARTYPE(oform) <> 'O'
DO Assert WITH .F., 'v2: Createobject frm_facturare_articole2'
DO Goleste
RETURN 0
ENDIF
oform.WindowType = 0
oform.Show()
DOEVENTS FORCE
DO Assert WITH oform.do_exista_obiect('clb_zi_curs'), 'v2: clb_zi_curs (Curs valutar) exista pe frm_facturare_articole2'
lnAdaugate = 0
llOk = .F.
SELECT crsAleseS65
GO TOP
SCAN
SCATTER NAME loArticol MEMO
SELECT crsfactura
APPEND BLANK
llOk = .F.
TRY
llOk = oform.do_adauga_articol_cautat(loArticol, NVL(loArticol.cantitate, 1))
CATCH TO loExcAd
DO S65Log WITH ' v2: do_adauga_articol_cautat CATCH ' + TRANSFORM(loExcAd.ErrorNo) + ' ' + loExcAd.Message
ENDTRY
IF llOk
lnAdaugate = lnAdaugate + 1
ELSE
SELECT crsfactura
IF !EOF() AND !BOF()
DELETE
ENDIF
ENDIF
SELECT crsAleseS65
ENDSCAN
DOEVENTS FORCE
DO S65Log WITH ' v2: linii adaugate prin do_adauga_articol_cautat=' + TRANSFORM(lnAdaugate)
DO Assert WITH lnAdaugate = 2, 'v2: cele doua articole adaugate prin do_adauga_articol_cautat, e=' + TRANSFORM(lnAdaugate)
lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0)
DO Assert WITH lnFact = 2, 'v2: crsfactura are exact 2 linii, e=' + TRANSFORM(lnFact)
IF lnFact = 0
gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (v2, fara linii);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO Elibereaza WITH oform
DO Goleste
RETURN 0
ENDIF
DO SeteazaCantitati WITH 'crsfactura'
oform.do_calculeaza_totaluri()
DOEVENTS FORCE
DO S65Log WITH ' v2: dupa do_calculeaza_totaluri poDate.Curs=' + TRANSFORM(poDate.Curs) + ;
' poDate.multiplicator=' + TRANSFORM(poDate.multiplicator) + ' poDate.nvalval=' + TRANSFORM(NVL(poDate.nvalval,0)) + ;
' poDate.ntvaval=' + TRANSFORM(NVL(poDate.ntvaval,0)) + ' poDate.ntotval=' + TRANSFORM(NVL(poDate.ntotval,0))
lcSerie = ALLTRIM(TRANSFORM(poDate.serie_act))
lnNract = poDate.nract
SET PROCEDURE TO (gcMock) ADDITIVE
gcMockApeluri = ''
DO S65Log WITH ' v2: [pas] but_termin1.Click'
oform.but_termin1.Click()
DOEVENTS FORCE
DO S65Log WITH ' v2: but_termin1.Click() -> poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare, 0))
DO S65Log WITH ' v2: apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']'
lnIdVz = CdocGasesteIdVanzare(lcSerie, lnNract)
IF lnIdVz < 0
lnIdVz = 0
ENDIF
DO Assert WITH lnIdVz > 0, 'v2: documentul exista in VANZARI (serie_act+numar_act), e=' + TRANSFORM(lnIdVz)
IF lnIdVz > 0
gcNumere = gcNumere + 'SCRIS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' id_vanzare=' + TRANSFORM(lnIdVz) + ' (v2);'
ELSE
gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (v2, nescris);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
lcSerie = ''
lnNract = 0
ENDIF
DO Elibereaza WITH oform
DO Goleste
gcUltimaSerie = lcSerie
gnUltimulNract = lnNract
RETURN lnIdVz
ENDFUNC
*==================================================================================
* Seteaza cantitatea pe toate liniile din crsfactura si recalculeaza linia, ca la S5c/S6-1.
PROCEDURE SeteazaCantitati
LPARAMETERS tcAlias
LOCAL loArt
SELECT (tcAlias)
SCAN
REPLACE cantitate WITH gnCantitateAleasa
SCATTER NAME loArt MEMO
loArt = calculeaza_totaluri(loArt)
GATHER NAME loArt MEMO
ENDSCAN
ENDPROC
*==================================================================================
* Izolarea unei emiteri: o exceptie intr-un caz nu trebuie sa opreasca restul suitei.
FUNCTION EmiteProtejat
LPARAMETERS tcForma
LOCAL lnRez, lnI
lnRez = 0
TRY
IF tcForma == 'v1'
lnRez = EmiteV1()
ELSE
lnRez = EmiteV2()
ENDIF
CATCH TO loExcEm
DO S65Log WITH ' EXCEPTIE in ' + tcForma + ': ErrorNo=' + TRANSFORM(loExcEm.ErrorNo) + ;
' Message=' + loExcEm.Message + ' Proc=' + loExcEm.Procedure + ':' + TRANSFORM(loExcEm.LineNo) + ;
' [' + TRANSFORM(loExcEm.LineContents) + ']'
DO Assert WITH .F., tcForma + ': emiterea a mers pana la capat fara exceptie (ErrorNo=' + ;
TRANSFORM(loExcEm.ErrorNo) + ')'
lnRez = 0
gcUltimaSerie = ''
gnUltimulNract = 0
TRY
gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + ;
TRANSFORM(poDate.nract) + ' (' + tcForma + ', dupa exceptie);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
CATCH
ENDTRY
TRY
goExecutor.oExecute("ROLLBACK")
CATCH
ENDTRY
FOR lnI = _SCREEN.FormCount TO 1 STEP -1
TRY
_SCREEN.Forms(lnI).Release()
CATCH
ENDTRY
ENDFOR
DO CuratieCrs
DO Goleste
ENDTRY
RETURN lnRez
ENDFUNC
*==================================================================================
* verifica 8b: but_cursuri.Enabled = .T. dupa Init, pe un tip in lei (fara in_valuta), fara
* sa emita niciun document - zero numere consumate.
FUNCTION VerificaButCursuriLei
LOCAL oform, llOk
DO CuratieCrs
poDate = CREATEOBJECT("oDateFactura", 25000, 1)
poDate.id_client = 463
poDate.zi_curs = gdZiCurs
DO Assert WITH poDate.in_valuta = 0, 'lei: poDate.in_valuta=0 pentru tip 1, e=' + TRANSFORM(poDate.in_valuta)
DO PregatesteFacturaCrs
oform = CREATEOBJECT('frm_facturare_articole2')
llOk = (VARTYPE(oform) = 'O')
DO Assert WITH llOk, 'lei: Createobject frm_facturare_articole2 (tip 1)'
IF llOk
DO Assert WITH oform.but_cursuri.Enabled, 'lei: but_cursuri.Enabled=.T. dupa Init (tip 1), e=' + TRANSFORM(oform.but_cursuri.Enabled)
DO Elibereaza WITH oform
ENDIF
DO Goleste
ENDFUNC
*==================================================================================
PROCEDURE Compara
LPARAMETERS tcSerie1, tnNr1, tcSerie2, tnNr2
LOCAL nFail, nId1, nId2
gcCaz = '[CompDoc valuta] '
nFail = CompDoc(tcSerie1, tnNr1, tcSerie2, tnNr2, 'S6-5 valuta v1(' + TRANSFORM(tnNr1) + ') vs v2(' + TRANSFORM(tnNr2) + ')')
DO Assert WITH nFail >= 0, 'CompDoc a rulat fara eroare Oracle, esecuri raportate=' + TRANSFORM(nFail)
DO S65Log WITH ' CompDoc esecuri totale=' + TRANSFORM(nFail)
nId1 = CdocGasesteIdVanzare(tcSerie1, tnNr1)
nId2 = CdocGasesteIdVanzare(tcSerie2, tnNr2)
DO LogCampuriValutare WITH nId1, nId2
DO ComparaVanzariCursuri WITH nId1, nId2
ENDPROC
*==================================================================================
* Logheaza EXPLICIT valorile masurate pe CURS/MULTIPLICATOR/VALVAL/TVAVAL/TOTVAL pentru ambele
* documente (indiferent daca CompVanzari le-a raportat FAIL sau PASS) - cerut de raportul S6-5.
PROCEDURE LogCampuriValutare
LPARAMETERS tnId1, tnId2
LOCAL lcSql
IF tnId1 <= 0 OR tnId2 <= 0
DO S65Log WITH ' CAMPURI VALUTARE: id_vanzare invalid (id1=' + TRANSFORM(tnId1) + ' id2=' + TRANSFORM(tnId2) + ')'
RETURN
ENDIF
lcSql = [select id_vanzare, in_valuta, id_valuta, curs, multiplicator, valval, tvaval, totval, ] + ;
[total_fara_tva, total_tva, total_cu_tva from vanzari where id_vanzare in (] + ;
TRANSFORM(tnId1) + [,] + TRANSFORM(tnId2) + [) order by decode(id_vanzare,] + TRANSFORM(tnId1) + [,1,2)]
IF goExecutor.oExecute(lcSql, 'crsValS65') >= 0 AND USED('crsValS65')
SELECT crsValS65
SCAN
DO S65Log WITH ' CAMPURI VALUTARE id_vanzare=' + TRANSFORM(id_vanzare) + ;
' in_valuta=' + TRANSFORM(NVL(in_valuta,0)) + ' id_valuta=' + TRANSFORM(NVL(id_valuta,0)) + ;
' CURS=' + TRANSFORM(NVL(curs,0)) + ' MULTIPLICATOR=' + TRANSFORM(NVL(multiplicator,0)) + ;
' VALVAL=' + TRANSFORM(NVL(valval,0)) + ' TVAVAL=' + TRANSFORM(NVL(tvaval,0)) + ' TOTVAL=' + TRANSFORM(NVL(totval,0)) + ;
' TOTAL_FARA_TVA=' + TRANSFORM(NVL(total_fara_tva,0)) + ' TOTAL_TVA=' + TRANSFORM(NVL(total_tva,0)) + ;
' TOTAL_CU_TVA=' + TRANSFORM(NVL(total_cu_tva,0))
ENDSCAN
USE IN crsValS65
ELSE
DO S65Log WITH ' CAMPURI VALUTARE SELECT ESUAT: ' + goExecutor.oPrelucrareEroare()
ENDIF
ENDPROC
*==================================================================================
* VANZARI_CURSURI - suplimentar fata de schela S6-0 (nu e in lib_comparatie_documente.prg, cerut
* explicit de sarcina S6-5). Multime de randuri (id_valuta, curs, multiplicator), sortata.
PROCEDURE ComparaVanzariCursuri
LPARAMETERS tnId1, tnId2
LOCAL lcSql, nCnt1, nCnt2, nFail, i
gcCaz = '[VANZARI_CURSURI] '
nFail = 0
IF tnId1 <= 0 OR tnId2 <= 0
DO Assert WITH .F., 'VANZARI_CURSURI: id_vanzare invalid, id1=' + TRANSFORM(tnId1) + ' id2=' + TRANSFORM(tnId2)
RETURN
ENDIF
lcSql = [select id_valuta, curs, multiplicator from vanzari_cursuri where id_vanzare = ] + ;
TRANSFORM(tnId1) + [ order by id_valuta]
goExecutor.oExecute(lcSql, 'crsCur1')
lcSql = [select id_valuta, curs, multiplicator from vanzari_cursuri where id_vanzare = ] + ;
TRANSFORM(tnId2) + [ order by id_valuta]
goExecutor.oExecute(lcSql, 'crsCur2')
nCnt1 = IIF(USED('crsCur1'), RECCOUNT('crsCur1'), 0)
nCnt2 = IIF(USED('crsCur2'), RECCOUNT('crsCur2'), 0)
DO S65Log WITH ' VANZARI_CURSURI id1=' + TRANSFORM(tnId1) + ' randuri=' + TRANSFORM(nCnt1) + ;
' | id2=' + TRANSFORM(tnId2) + ' randuri=' + TRANSFORM(nCnt2)
IF USED('crsCur1')
SELECT crsCur1
SCAN
DO S65Log WITH ' v1: id_valuta=' + TRANSFORM(id_valuta) + ' curs=' + TRANSFORM(curs) + ' multiplicator=' + TRANSFORM(multiplicator)
ENDSCAN
ENDIF
IF USED('crsCur2')
SELECT crsCur2
SCAN
DO S65Log WITH ' v2: id_valuta=' + TRANSFORM(id_valuta) + ' curs=' + TRANSFORM(curs) + ' multiplicator=' + TRANSFORM(multiplicator)
ENDSCAN
ENDIF
IF nCnt1 <> nCnt2
nFail = nFail + 1
DO S65Log WITH ' FAIL VANZARI_CURSURI numar de randuri diferit: v1=' + TRANSFORM(nCnt1) + ' v2=' + TRANSFORM(nCnt2)
ELSE
FOR i = 1 TO nCnt1
GO i IN crsCur1
GO i IN crsCur2
IF NVL(crsCur1.id_valuta,0) <> NVL(crsCur2.id_valuta,0) OR ;
NVL(crsCur1.curs,0) <> NVL(crsCur2.curs,0) OR ;
NVL(crsCur1.multiplicator,0) <> NVL(crsCur2.multiplicator,0)
nFail = nFail + 1
DO S65Log WITH ' FAIL VANZARI_CURSURI rand ' + TRANSFORM(i) + ' diferit: v1(id_valuta=' + ;
TRANSFORM(NVL(crsCur1.id_valuta,0)) + ' curs=' + TRANSFORM(NVL(crsCur1.curs,0)) + ' mult=' + TRANSFORM(NVL(crsCur1.multiplicator,0)) + ;
') v2(id_valuta=' + TRANSFORM(NVL(crsCur2.id_valuta,0)) + ' curs=' + TRANSFORM(NVL(crsCur2.curs,0)) + ' mult=' + TRANSFORM(NVL(crsCur2.multiplicator,0)) + ')'
ENDIF
ENDFOR
ENDIF
IF USED('crsCur1')
USE IN crsCur1
ENDIF
IF USED('crsCur2')
USE IN crsCur2
ENDIF
DO Assert WITH nFail = 0, 'VANZARI_CURSURI: paritate v1/v2 (randuri+valori), esecuri=' + TRANSFORM(nFail)
ENDPROC
*==================================================================================
* crsfactura + coloana "gestiune" ceruta de coloana combo a grilei pe v2
PROCEDURE PregatesteFacturaCrs
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
ENDPROC
PROCEDURE Elibereaza
LPARAMETERS toForm
IF TYPE('toForm') = 'O' AND !ISNULL(toForm)
TRY
toForm.Release()
CATCH
ENDTRY
ENDIF
DO CuratieCrs
ENDPROC
PROCEDURE Goleste
poDate = NULL
poGeneratorNumere = NULL
poDateGestiuneDest = NULL
ENDPROC
PROCEDURE CuratieCrs
DO Inchide WITH 'crsarticole'
DO Inchide WITH 'crsarticoleSel'
DO Inchide WITH 'crsfactura'
DO Inchide WITH 'crscursuri'
DO Inchide WITH 'crspolitici'
DO Inchide WITH 'crsCtrTemp'
DO Inchide WITH 'jtva_coloane'
ENDPROC
PROCEDURE Inchide
LPARAMETERS tcAlias
IF USED(tcAlias)
USE IN (tcAlias)
ENDIF
ENDPROC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO S65Log WITH 'PASS: ' + gcCaz + tcMsg
ELSE
gnFail = gnFail + 1
DO S65Log WITH 'FAIL: ' + gcCaz + tcMsg
ENDIF
ENDPROC
PROCEDURE S65Log
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE S65Err
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gnErr = gnErr + 1
DO S65Log WITH 'ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
ENDPROC
PROCEDURE S65Final
LOCAL lnI
IF TYPE('_SCREEN.tmrS65') = 'O'
_SCREEN.tmrS65.Enabled = .F.
TRY
_SCREEN.RemoveObject('tmrS65')
CATCH
ENDTRY
ENDIF
*-- formele ramase deschise arunca "Unhandled Structured Exception" la QUIT (rulare atarnata),
*-- deci se inchid explicit inainte
FOR lnI = _SCREEN.FormCount TO 1 STEP -1
TRY
_SCREEN.Forms(lnI).Release()
CATCH
ENDTRY
ENDFOR
*-- registrul numerelor SSS direct din baza: singura sursa care spune care numar e SCRIS si
*-- care e ARS (alocat si nescris). Plaja larga - alte teste S6 consuma din aceeasi secventa.
TRY
IF TYPE('goExecutor') = 'O' AND goExecutor.oExecute([select numar_act, id_vanzare, tip from vanzari ] + ;
[where sters = 0 and serie_act = 'SSS' and numar_act between 640 and 900 order by numar_act], 'crsNrSSS') >= 0
DO S65Log WITH CHR(13) + CHR(10) + 'REGISTRU SSS in VANZARI (640-900):'
SELECT crsNrSSS
SCAN
DO S65Log WITH ' SSS ' + TRANSFORM(numar_act) + ' -> id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip)
ENDSCAN
USE IN crsNrSSS
ENDIF
CATCH
ENDTRY
DO S65Log WITH CHR(13) + CHR(10) + 'NUMERE: ' + gcNumere
DO S65Log WITH 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + ' err=' + TRANSFORM(gnErr)
DO S65Log WITH 'END ' + TTOC(DATETIME())
DO HarnessDone WITH 'done'
QUIT
ENDPROC
*==================================================================================
* driverS65: apasa automat pe formele modale care nu trec prin functia amessagebox -
* MESSAGEBOX_FORM (cmdYes/cmdOk), FRM_ALTE_DATE de pe v1 (do_termin, NU Release) si FRM_CURS
* (recuperare eroare 20005) - vezi VerificaCursEuro, care ar trebui sa previna acest caz.
DEFINE CLASS driverS65 AS Custom
nUltimAlteDate = 0
lBusy = .F.
PROCEDURE Executa
IF This.lBusy
RETURN
ENDIF
This.lBusy = .T.
IF TYPE('_SCREEN.tmrS65') = 'O'
_SCREEN.tmrS65.Enabled = .F.
ENDIF
TRY
LOCAL lnI, loMsgForm, loAlteDate, lcClasa
loMsgForm = NULL
loAlteDate = NULL
FOR lnI = 1 TO _SCREEN.FormCount
lcClasa = UPPER(_SCREEN.Forms(lnI).Class)
IF 'MESSAGEBOX_FORM' $ lcClasa
loMsgForm = _SCREEN.Forms(lnI)
ENDIF
IF lcClasa == 'FRM_ALTE_DATE'
loAlteDate = _SCREEN.Forms(lnI)
ENDIF
IF !(lcClasa $ gcClaseVazute)
gcClaseVazute = gcClaseVazute + lcClasa + ';'
DO S65Log WITH ' [diag timer] forma noua: ' + lcClasa + ' Caption=[' + TRANSFORM(_SCREEN.Forms(lnI).Caption) + ']'
ENDIF
ENDFOR
IF !ISNULL(loMsgForm)
TRY
LOCAL lcTextMsg
lcTextMsg = ''
TRY
lcTextMsg = ALLTRIM(TRANSFORM(loMsgForm.edtMensaje.Value))
CATCH
ENDTRY
DO S65Log WITH ' [driver msg] mesaj=[' + STRTRAN(lcTextMsg, CHR(13) + CHR(10), ' ') + ']'
DO CASE
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5)
DO S65Log WITH ' [driver msg] apas cmgBotones.cmdYes'
loMsgForm.cmgBotones.cmdYes.Click()
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5)
DO S65Log WITH ' [driver msg] apas cmgBotones.cmdOk'
loMsgForm.cmgBotones.cmdOk.Click()
ENDCASE
CATCH TO loExcMsg
DO S65Log WITH ' [driver msg] CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message
ENDTRY
ELSE
IF !ISNULL(loAlteDate) AND (SECONDS() - This.nUltimAlteDate > 1)
This.nUltimAlteDate = SECONDS()
TRY
DO S65Log WITH ' [driver alte_date] apas do_termin() pe FRM_ALTE_DATE (id_delegat=' + ;
TRANSFORM(NVL(poDate.id_delegat, 0)) + ')'
loAlteDate.do_termin()
CATCH TO loExcAD
DO S65Log WITH ' [driver alte_date] CATCH ' + TRANSFORM(loExcAD.ErrorNo) + ' ' + loExcAD.Message
ENDTRY
ENDIF
ENDIF
CATCH TO loExcTop
DO S65Log WITH ' [driver] CATCH TOP-LEVEL ' + TRANSFORM(loExcTop.ErrorNo) + ' ' + loExcTop.Message
FINALLY
IF TYPE('_SCREEN.tmrS65') = 'O'
_SCREEN.tmrS65.Enabled = .T.
ENDIF
This.lBusy = .F.
ENDTRY
ENDPROC
ENDDEFINE

View File

@@ -0,0 +1,16 @@
# test_s6_5_valuta.ps1 - wrapper peste harness-ul generic (vfp_ui_harness.ps1) pentru
# test_s6_5_valuta.prg (S6-5, paritate v1 vs v2 pe valuta, tip 5 EURO).
# Rulare VIZIBILA (vfp9 -A, fereastra impinsa off-screen de harness), NU -A -T: sub -A -T
# coloanele de grid nu se materializeaza.
# Rulare: powershell -ExecutionPolicy Bypass -File test_s6_5_valuta.ps1 (timeout >= 600s)
$ErrorActionPreference = 'Stop'
$Teste = $PSScriptRoot
Get-ChildItem -Path $Teste -Filter '*.FXP' -ErrorAction SilentlyContinue | Remove-Item -Force -ErrorAction SilentlyContinue
Get-ChildItem -Path $Teste -Filter '*.fxp' -ErrorAction SilentlyContinue | Remove-Item -Force -ErrorAction SilentlyContinue
& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') `
-TestPrg (Join-Path $Teste 'test_s6_5_valuta.prg') `
-Steps @('env_gata','v1_emis','v2_emis','compdoc_gata') `
-StepTimeoutSec 120 `
-ReadyTimeoutSec 180 `
-SyncDir (Join-Path $Teste 'uisync_s65') `
-ShotsDir (Join-Path $Teste 'screenshots_s65')

View File

@@ -0,0 +1,457 @@
*!* 02.09.2026
*!* agent s6-6-listare-intrare
*!* Headless: paritatea intrarii listarii (S6-6, propunere_s6_test_flux_real.md §5.6). Reutilizeaza
*!* patru documente deja emise de S6-1 si de proba_abd_pretd (S6-3d) - NU emite nimic, NU consuma
*!* numere.
*!*
*!* CUM S-A OBTINUT poDate/crsfactura/crsDetalii, spus raspicat: PROCEDURE ConstruiesteIntrarePOF
*!* de mai jos e o REPLICA a portiunii NEINTERACTIVE a functiei de productie REALA
*!* listeaza_formular (oproceduri_facturare.prg:1076-1394 - aceeasi functie chemata din
*!* anaf_efactura.prg:3248 pentru relistarea unui document existent, deci traseul e real, nu
*!* inventat). Replica se opreste EXACT inainte de linia 1396 (`listeaza_ofacturare()`), pentru ca
*!* acea functie cheama necontrolat, la ofacturare.prg:1211, `alege_optiuni_listare_facturare()` ->
*!* `frm_alege_optlistfact.Show(1)` - dialog MODAL, fara nicio garda pe `nListareSilentioasa`, care
*!* ar bloca vfp9.exe pe masina partajata (confirmat: prima incercare a acestui test a AGATAT
*!* exact acolo, pe documentul tip 4 - proces omorat inainte sa ceara input). Restul campurilor din
*!* §5.6 sunt fie deja scrise de listeaza_formular INAINTE de acel punct (nract, serie_act, dataact,
*!* datascad, nume_client, text_aditional, listare_detaliata, cTextTVA, sold_lei, sold_valuta), fie
*!* triviale si calculate aici cu ACEEASI formula ca in productie (proc_tva, formula la
*!* ofacturare.prg:1217-1218). SINGURUL camp din lista propunerii care NU se poate obtine fara sa
*!* treci prin punctul periculos e `cod_fiscal` (vine din `poDate.oClient.cod_fiscal`, construit de
*!* interogarea de antet DIN INTERIORUL lui listeaza_ofacturare) - NEVERIFICAT aici, motivat.
*!* creeaza_facturacrs / prelucreaza_facturacrs / creeaza_cursor_seturi SUNT chemate neschimbate
*!* (ofacturare_comun.prg:1792/1823, oproceduri_facturare.prg:1569) - sunt transformari pure de
*!* cursor, fara UI.
*!*
*!* Perechea 1 (tip 1, lista de preturi): v1 SSS 682 (id_vanzare 1128), v2 SSS 683 (id_vanzare 1129) -
*!* ACELASI client (id_part 463), ACELEASI doua articole - comparatie de VALOARE.
*!* Perechea 2 (tip 4, aviz): v1 SSS 675 (id_vanzare 1126), v2 SSS 674 (id_vanzare 1125) - ACELASI
*!* client (id_part 614), dar surse (avize) diferite -> linii diferite; comparatie STRUCTURALA.
*!*
*!* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s6_6_listare_intrare.prg"
*!* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_6_listare_intrare.log
*!* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gnSarit, gcCaz
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_6_listare_intrare.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
gnSarit = 0
gcCaz = ""
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
SQLSETPROP(gnHandle, "QueryTimeOut", 45)
IF TYPE('goExecutor.nHandle') = 'N' AND goExecutor.nHandle > 0 AND goExecutor.nHandle <> gnHandle
SQLSETPROP(goExecutor.nHandle, "QueryTimeOut", 45)
ENDIF
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
DO AfLog WITH "ENV OK gnHandle=" + TRANSFORM(gnHandle)
DO VerificaDocumenteSursa
DO TestPereche1
DO TestPereche2
DO Final
*----------------------------------------------------------------------------------------
PROCEDURE VerificaDocumenteSursa
* Confirma pe Oracle (nu din raport) cele patru documente reutilizate, inainte de a le folosi.
* Filtrul sters=0 se pune in SQL (Oracle face comparatia), nu in VFP dupa - evita orice
* nepotrivire de tip pe coloana intoarsa de goExecutor.
LOCAL llSucces
gcCaz = "[verificare documente sursa] "
llSucces = goExecutor.oExecuta( ;
[select id_vanzare, tip, serie_act, numar_act, id_part from vanzari ] + ;
[where id_vanzare in (1125,1126,1128,1129) and sters = 0 order by id_vanzare], [crsverifsurse])
DO Assert WITH llSucces, "SELECT de verificare a rulat fara eroare Oracle"
DO Assert WITH USED('crsverifsurse') AND RECCOUNT('crsverifsurse') = 4, ;
"patru documente nesterse gasite, e=" + TRANSFORM(IIF(USED('crsverifsurse'), RECCOUNT('crsverifsurse'), -1))
IF USED('crsverifsurse')
USE IN crsverifsurse
ENDIF
ENDPROC
*----------------------------------------------------------------------------------------
* Replica portiunii NEINTERACTIVE a lui listeaza_formular (oproceduri_facturare.prg:1076-1394),
* redusa la ramurile atinse de tip 1 si tip 4 (comentariile de mai jos citeaza linia originala).
* Se opreste inainte de listeaza_ofacturare() - vezi antetul fisierului.
*----------------------------------------------------------------------------------------
FUNCTION ConstruiesteIntrarePOF
LPARAMETERS tnIdVanzare, tcSlot
LOCAL loDate, lcSqlFactura, lcSqlDetalii, llSucces, lnDiscount, lnDiscountVal, lnProcTvav
LOCAL lnIdPart, lnPnCod, lcSql, lnIdComandaAviz, lcCursorTemp
IF USED(tcSlot + '_fact')
USE IN (tcSlot + '_fact')
ENDIF
IF USED(tcSlot + '_det')
USE IN (tcSlot + '_det')
ENDIF
* oproceduri_facturare.prg:1098-1117 - aceeasi structura de cursor ca in productie
CREATE CURSOR (tcSlot + '_fact') (id_vanzare N(20) NULL, tip N(5) NULL, serie_act C(10) NULL, numar_act N(14) NULL, ;
id_part N(10) NULL, data_act D(8) NULL, dataora T(8) NULL, discount N(17,4) NULL, disc_fara_tva N(17,4) NULL, discount_evidentiat N(1) NULL, text_aditional M(4) NULL, ;
nrinmat C(10) NULL, delegat C(70) NULL, bidelegat C(30) NULL, cnpdelegat C(15) NULL, dataora_exp T(8) NULL, ;
id_comanda N(20) NULL, tip_incasare N(10) NULL, nr_incasare N(10) NULL, serie_chit C(20) NULL, incasat N(17,4) NULL, ;
in_valuta N(1) NULL, afisare_scadenta N(1) NULL, altele C(200) NULL, id_ordl N(10) NULL, tva_incasare N(1) NULL, ;
id_facturare N(10) NULL, listare_detaliata N(1) NULL, id_beneficiar N(20) NULL, tip_factura N(5) NULL, id_util I(4) NULL, ;
eproforma N(1) NULL, id_ctr N(10) NULL, contract C(100) NULL, curs N(20,4) NULL, multiplicator N(10) NULL, nume_val C(50) NULL, ;
valval N(20,4) NULL, tvaval N(20,4) NULL, totval N(20,4) NULL, tip_saft N(3) NULL, institutie_publica N(1) NULL, cod N(20) NULL, ;
client C(100) NULL)
CREATE CURSOR (tcSlot + '_det') (id_vanzare N(20) NULL, id_vanzare_det N(10) NULL, id_articol N(10) NULL, ;
lot C(100) NULL, serie C(100) NULL, taxcode N(6) NULL, proc_tvav N(10,4) NULL, cantitate N(10,4) NULL, id_jtva_coloana N(10) NULL, ;
id_jtva_coloana_ex N(10) NULL, pret N(20,6) NULL, pret_val N(20,6) NULL, pret_cu_tva N(1) NULL, discount_unitar N(20,6) NULL, ;
discount_unitar_val N(20,6) NULL, cont C(4) NULL, id_valuta N(10) NULL, tip_valuta N(1) NULL, id_gestiune N(20) NULL, ;
pret_achizitie N(20,6) NULL, denumire C(250) NULL, explicatie M(4) NULL, ;
um C(10) NULL, cod_um_iso C(5) NULL, codmatf C(50) NULL, codmat C(50) NULL, codmatc C(50) NULL, codbare C(50) NULL, ;
curs N(20,4) NULL, multiplicator N(10) NULL, nume_val C(10) NULL, id_vanzare_set N(10) NULL, id_ctr N(10) NULL, numar_contract C(50) NULL)
TEXT TO lcSqlFactura TEXTMERGE NOSHOW
select id_vanzare,tip,serie_act,numar_act,id_part,data_act,dataora,discount,disc_fara_tva,discount_evidentiat,text_aditional,
nrinmat,delegat,bidelegat,cnpdelegat,dataora_exp,id_comanda,tip_incasare,nr_incasare,serie_chit,incasat,
in_valuta,afisare_scadenta,altele,id_ordl,tva_incasare,id_facturare,listare_detaliata,id_beneficiar,
tip_factura,id_util,eproforma,id_ctr,contract,curs,multiplicator,nume_val,valval,tvaval,totval,tip_saft,
institutie_publica,cod,client
from fact_vfacturi2
where id_vanzare = <<tnIdVanzare>>
ENDTEXT
TEXT TO lcSqlDetalii TEXTMERGE NOSHOW
select id_vanzare, id_vanzare_det, id_articol, lot, serie, taxcode, proc_tvav, cantitate, id_jtva_coloana,
id_jtva_coloana_ex, pret, pret_val, pret_cu_tva, discount_unitar, discount_unitar_val, cont, id_valuta,
tip_valuta, id_gestiune, pret_achizitie, denumire, explicatie, um, cod_um_iso, codmatf, codmat, codmatc,
codbare, curs, multiplicator, nume_val, id_vanzare_set, id_ctr, numar_contract
from fact_vfacturi_detalii
where id_vanzare = <<tnIdVanzare>>
order by id_vanzare_det
ENDTEXT
llSucces = goExecutor.oExecuta(lcSqlFactura, 'cS66FactTemp')
IF !llSucces
DO AfLog WITH "FAIL: " + gcCaz + "SQL fact_vfacturi2 esuat pt id_vanzare=" + TRANSFORM(tnIdVanzare) + ": " + goExecutor.oPrelucrareEroare()
RETURN NULL
ENDIF
SELECT (tcSlot + '_fact')
APPEND FROM DBF('cS66FactTemp')
USE IN (SELECT('cS66FactTemp'))
llSucces = goExecutor.oExecuta(lcSqlDetalii, 'cS66DetTemp')
IF !llSucces
DO AfLog WITH "FAIL: " + gcCaz + "SQL fact_vfacturi_detalii esuat pt id_vanzare=" + TRANSFORM(tnIdVanzare) + ": " + goExecutor.oPrelucrareEroare()
RETURN NULL
ENDIF
SELECT (tcSlot + '_det')
APPEND FROM DBF('cS66DetTemp')
USE IN (SELECT('cS66DetTemp'))
IF RECCOUNT(tcSlot + '_fact') = 0
DO AfLog WITH "FAIL: " + gcCaz + "id_vanzare=" + TRANSFORM(tnIdVanzare) + " nu are rand in fact_vfacturi2"
RETURN NULL
ENDIF
* oproceduri_facturare.prg:1163-1229 - poDate, campurile scrise INAINTE de listeaza_ofacturare()
SELECT (tcSlot + '_fact')
loDate = CREATEOBJECT("oDateFactura", 0, 0)
lnIdPart = id_part
lnPnCod = cod
loDate.nid_vanzare = id_vanzare
loDate.nRelistare = 1
loDate.tip = tip
loDate.nract = numar_act
loDate.serie_act = ALLTRIM(serie_act)
loDate.dataact = IIF(TYPE('data_act') = 'T', TTOD(data_act), data_act)
loDate.discount_evidentiat = discount_evidentiat
loDate.text_aditional = NVL(text_aditional, [])
loDate.nrinmat = nrinmat
loDate.nume_delegat = delegat
loDate.bidelegat = bidelegat
loDate.cnpdelegat = cnpdelegat
loDate.dataora_exp = dataora_exp
loDate.listaid = IIF(INLIST(loDate.tip, 3, 21, 28, 42, 47), ALLTRIM(STR(id_comanda)), [])
loDate.ntip_incasare = tip_incasare
loDate.nr_incasare = nr_incasare
loDate.serie_chit = NVL(serie_chit, [])
loDate.incasat = incasat
loDate.in_valuta = in_valuta
loDate.afisare_scadenta = afisare_scadenta
loDate.descriere = altele
loDate.id_ordl = id_ordl
loDate.tva_incasare = tva_incasare
loDate.id_facturare = id_facturare
loDate.nListareDetaliata = listare_detaliata
loDate.nListareSilentioasa = 1
loDate.nListareJustPDF = 1
loDate.nIdBeneficiar = id_beneficiar
loDate.nTipFactura = tip_factura
loDate.id_util = id_util
loDate.eProforma = eproforma
loDate.id_ctr = id_ctr
loDate.contract = ALLTRIM(NVL(contract, ''))
IF loDate.in_valuta = 1
loDate.nume_valuta = nume_val
loDate.multiplicator = multiplicator
lnDiscountVal = NVL(discount, 0)
lnDiscount = ROUND(NVL(discount, 0) * NVL(curs, 1) / NVL(multiplicator, 1), 2)
ELSE
lnDiscount = NVL(discount, 0)
lnDiscountVal = 0
ENDIF
loDate.nValVal = valval
loDate.nTvaVal = tvaval
loDate.nTotVal = totval
loDate.cValuta = ALLTRIM(NVL(nume_val, ''))
loDate.Curs = curs
loDate.multiplicator = multiplicator
loDate.tip_saft = NVL(tip_saft, 380)
loDate.institutie_publica = NVL(institutie_publica, 0)
* oproceduri_facturare.prg:1233-1235 - id_comanda_aviz nu e proprietate nativa, se adauga o data
IF !PEMSTATUS(loDate, "id_comanda_aviz", 5)
ADDPROPERTY(loDate, "id_comanda_aviz", 0)
ENDIF
* oproceduri_facturare.prg:1236-1268 - id_comanda_aviz + descriere, doar ramurile care se ating
* pe tip 1 si tip 4 (celelalte tipuri raman fara aceasta imbogatire, in afara perimetrului S6-6)
SELECT (tcSlot + '_fact')
IF INLIST(loDate.tip, 3, 21, 28, 42, 47)
loDate.id_comanda_aviz = id_comanda
ELSE
IF loDate.tip = 4
lcSql = [select max(v.id_comanda) as id_comanda from vanzari_coresp vc ] + ;
[join vanzari v on vc.id_vanzare_aviz = v.id_vanzare where vc.sters = 0 and v.sters = 0 and vc.id_vanzare_fact = ] + ALLTRIM(STR(loDate.nid_vanzare))
lnIdComandaAviz = 0
llSucces = goExecutor.oSelect2Value(lcSql, @lnIdComandaAviz)
IF llSucces >= 0
loDate.id_comanda_aviz = NVL(lnIdComandaAviz, 0)
ENDIF
SELECT (tcSlot + '_fact')
loDate.descriere = ALLTRIM(altele)
ENDIF
ENDIF
* oproceduri_facturare.prg:1271-1329 - id_client/nume_client; tip 1 si tip 4 (fara comanda_aviz)
* cad pe ramura ELSE simpla (nu sunt in Inlist 23,25,27,30,41,-6 - avize subunitati)
SELECT (tcSlot + '_fact')
loDate.id_client = id_part
loDate.nume_client = client
* oproceduri_facturare.prg:1354-1365 - datascad, ramura generica (fara id_ordl -12)
IF !ISNULL(lnPnCod)
lcSql = [select MAX(a.datascad) as datascad from act a where cod = ] + ALLTRIM(STR(lnPnCod))
IF USED('cS66Datascad')
USE IN cS66Datascad
ENDIF
llSucces = goExecutor.oExecuta(lcSql, 'cS66Datascad')
IF llSucces AND USED('cS66Datascad') AND RECCOUNT('cS66Datascad') > 0
SELECT cS66Datascad
loDate.datascad = datascad
ENDIF
IF USED('cS66Datascad')
USE IN cS66Datascad
ENDIF
ENDIF
* oproceduri_facturare.prg:1371-1379 - cTextTVA (calculat AICI, in listeaza_formular, inainte de
* listeaza_ofacturare - NU e nevoie sa se treaca de punctul periculos pentru acest camp)
ADDPROPERTY(loDate, 'cTextTVA', '')
SELECT DISTINCT id_jtva_coloana_ex, id_jtva_coloana FROM (tcSlot + '_det') INTO CURSOR cS66TextTVA
IF RECCOUNT('cS66TextTVA') = 1
SELECT cS66TextTVA
GO TOP
loDate.cTextTVA = TRANSFORM(NVL(id_jtva_coloana_ex, id_jtva_coloana))
ENDIF
USE IN cS66TextTVA
* oproceduri_facturare.prg:1382-1385 - soldul clientului (functie pura de interogare)
loDate.sold_lei = 0
loDate.sold_valuta = 0
TRY
LOCAL loSold
loSold = GetSoldClient(lnIdPart, IdVanzare2IdFact(loDate.nid_vanzare))
IF VARTYPE(loSold) = 'O'
loDate.sold_lei = loSold.sold_lei
loDate.sold_valuta = loSold.sold_valuta
ENDIF
CATCH
DO AfLog WITH "INFO: GetSoldClient a esuat pt slot " + tcSlot + " (nefatal, sold ramane 0)"
ENDTRY
* oproceduri_facturare.prg:1387-1394 - crsfactura + set (transformari pure de cursor, fara UI)
SELECT (tcSlot + '_det')
CALCULATE MAX(proc_tvav) TO lnProcTvav
IF USED(tcSlot + '_crsfact')
USE IN (tcSlot + '_crsfact')
ENDIF
creeaza_facturacrs(tcSlot + '_crsfact')
prelucreaza_facturacrs(tcSlot + '_det', tcSlot + '_crsfact', lnProcTvav, lnDiscount, lnDiscountVal)
* ofacturare.prg:1217-1218 - proc_tva, ACEEASI formula, aplicata local (fara listeaza_ofacturare)
SELECT (tcSlot + '_crsfact')
CALCULATE MAX(ROUND(NVL(proc_Tvav, 1), 2)) TO loDate.proc_tva
loDate.proc_tva = loDate.proc_tva * 100 - 100
RETURN loDate
ENDFUNC
*----------------------------------------------------------------------------------------
* Perechea 1 - tip 1, lista de preturi, ACELASI client, ACELEASI articole -> comparatie de valoare
*----------------------------------------------------------------------------------------
PROCEDURE TestPereche1
LOCAL loV1, loV2
gcCaz = "[S6-6 pereche 1: tip1, SSS682/1128 vs SSS683/1129] "
loV1 = ConstruiesteIntrarePOF(1128, "p1v1")
loV2 = ConstruiesteIntrarePOF(1129, "p1v2")
IF VARTYPE(loV1) <> 'O' OR VARTYPE(loV2) <> 'O'
DO AfLog WITH "FAIL: " + gcCaz + "ConstruiesteIntrarePOF nu a intors poDate pe una din forme, sar comparatia"
gnFail = gnFail + 1
RETURN
ENDIF
DO Assert WITH loV1.nid_vanzare = 1128, "poDate.nid_vanzare v1 = 1128, e=" + TRANSFORM(loV1.nid_vanzare)
DO Assert WITH loV2.nid_vanzare = 1129, "poDate.nid_vanzare v2 = 1129, e=" + TRANSFORM(loV2.nid_vanzare)
DO Assert WITH loV1.tip = 1 AND loV2.tip = 1, "poDate.tip = 1 pe ambele"
* campuri care TREBUIE sa fie egale (acelasi client, aceleasi articole, acelasi tva)
DO Assert WITH loV1.id_client = loV2.id_client, "id_client egal (463), v1=" + TRANSFORM(loV1.id_client) + " v2=" + TRANSFORM(loV2.id_client)
DO Assert WITH loV1.nume_client = loV2.nume_client, "nume_client egal, v1=[" + TRANSFORM(loV1.nume_client) + "] v2=[" + TRANSFORM(loV2.nume_client) + "]"
DO Assert WITH NVL(loV1.text_aditional, '') = NVL(loV2.text_aditional, ''), "text_aditional egal"
DO Assert WITH loV1.nListareDetaliata = loV2.nListareDetaliata, "nListareDetaliata egal, v1=" + TRANSFORM(loV1.nListareDetaliata) + " v2=" + TRANSFORM(loV2.nListareDetaliata)
DO Assert WITH loV1.proc_tva = loV2.proc_tva, "proc_tva egal, v1=" + TRANSFORM(loV1.proc_tva) + " v2=" + TRANSFORM(loV2.proc_tva)
DO Assert WITH NVL(loV1.cTextTVA, '') = NVL(loV2.cTextTVA, ''), "cTextTVA egal, v1=[" + TRANSFORM(loV1.cTextTVA) + "] v2=[" + TRANSFORM(loV2.cTextTVA) + "]"
* campuri care difera LEGITIM - doar populate, NU se compara pentru egalitate
DO Assert WITH !EMPTY(NVL(loV1.nract, 0)) AND !EMPTY(NVL(loV2.nract, 0)), "nract populat (diferit legitim: v1=" + TRANSFORM(loV1.nract) + " v2=" + TRANSFORM(loV2.nract) + ")"
DO Assert WITH !EMPTY(loV1.serie_act) AND !EMPTY(loV2.serie_act), "serie_act populat, v1=" + loV1.serie_act + " v2=" + loV2.serie_act
DO Assert WITH !EMPTY(loV1.dataact) AND !EMPTY(loV2.dataact), "dataact populat pe ambele"
DO Assert WITH !ISNULL(loV1.sold_lei) AND !ISNULL(loV2.sold_lei), "sold_lei populat (cumulativ, difera legitim: v1=" + TRANSFORM(loV1.sold_lei) + " v2=" + TRANSFORM(loV2.sold_lei) + ")"
DO AfLog WITH "INFO pereche 1: cod_fiscal NEVERIFICAT (necesita listeaza_ofacturare, evitat - vezi antetul fisierului)"
* crsDetalii - aceleasi doua articole, aceeasi cantitate totala
LOCAL n1, n2, s1, s2, nTax1, nTax2
n1 = 0
n2 = 0
s1 = 0
s2 = 0
nTax1 = 0
nTax2 = 0
IF USED('p1v1_det')
SELECT COUNT(*) AS n, SUM(cantitate) AS s, SUM(IIF(!EMPTY(NVL(taxcode, 0)), 1, 0)) AS ntax FROM p1v1_det INTO CURSOR crsp1v1agg
n1 = crsp1v1agg.n
s1 = crsp1v1agg.s
nTax1 = crsp1v1agg.ntax
USE IN crsp1v1agg
ENDIF
IF USED('p1v2_det')
SELECT COUNT(*) AS n, SUM(cantitate) AS s, SUM(IIF(!EMPTY(NVL(taxcode, 0)), 1, 0)) AS ntax FROM p1v2_det INTO CURSOR crsp1v2agg
n2 = crsp1v2agg.n
s2 = crsp1v2agg.s
nTax2 = crsp1v2agg.ntax
USE IN crsp1v2agg
ENDIF
DO Assert WITH n1 = 2 AND n2 = 2, "crsDetalii: 2 linii pe fiecare, v1=" + TRANSFORM(n1) + " v2=" + TRANSFORM(n2)
DO Assert WITH s1 = 4 AND s2 = 4, "crsDetalii: suma cantitate = 4 pe fiecare, v1=" + TRANSFORM(s1) + " v2=" + TRANSFORM(s2)
* TAXCODE - defect D-S61, deja INCHIS in cod (COMUN fdd3241); documentele reutilizate au fost
* scrise INAINTE de reparatie, deci v2 inca poarta golul istoric - se masoara, nu se re-raporteaza
DO Assert WITH nTax1 = 2, "crsDetalii.taxcode populat pe v1, ambele linii, e=" + TRANSFORM(nTax1)
DO Assert WITH nTax2 = 0, "crsDetalii.taxcode gol pe v2 (D-S61 istoric, INCHIS in cod, document scris inainte de fix), e=" + TRANSFORM(nTax2)
ENDPROC
*----------------------------------------------------------------------------------------
* Perechea 2 - tip 4, aviz, ACELASI client, surse (avize) DIFERITE -> comparatie STRUCTURALA
*----------------------------------------------------------------------------------------
PROCEDURE TestPereche2
LOCAL loV1, loV2
gcCaz = "[S6-6 pereche 2: tip4, SSS675/1126 vs SSS674/1125] "
loV1 = ConstruiesteIntrarePOF(1126, "p2v1")
loV2 = ConstruiesteIntrarePOF(1125, "p2v2")
IF VARTYPE(loV1) <> 'O' OR VARTYPE(loV2) <> 'O'
DO AfLog WITH "FAIL: " + gcCaz + "ConstruiesteIntrarePOF nu a intors poDate pe una din forme, sar comparatia"
gnFail = gnFail + 1
RETURN
ENDIF
DO Assert WITH loV1.nid_vanzare = 1126, "poDate.nid_vanzare v1 = 1126, e=" + TRANSFORM(loV1.nid_vanzare)
DO Assert WITH loV2.nid_vanzare = 1125, "poDate.nid_vanzare v2 = 1125, e=" + TRANSFORM(loV2.nid_vanzare)
DO Assert WITH loV1.tip = 4 AND loV2.tip = 4, "poDate.tip = 4 pe ambele"
* acelasi client (id_part 614 pe ambele) - TREBUIE sa fie egale
DO Assert WITH loV1.id_client = loV2.id_client, "id_client egal (614), v1=" + TRANSFORM(loV1.id_client) + " v2=" + TRANSFORM(loV2.id_client)
DO Assert WITH loV1.nume_client = loV2.nume_client, "nume_client egal, v1=[" + TRANSFORM(loV1.nume_client) + "] v2=[" + TRANSFORM(loV2.nume_client) + "]"
DO Assert WITH loV1.nListareDetaliata = loV2.nListareDetaliata, "nListareDetaliata egal, v1=" + TRANSFORM(loV1.nListareDetaliata) + " v2=" + TRANSFORM(loV2.nListareDetaliata)
* surse (avize) diferite -> linii/sume diferite legitim; doar se verifica populate
DO Assert WITH !EMPTY(NVL(loV1.nract, 0)) AND !EMPTY(NVL(loV2.nract, 0)), "nract populat (documente diferite: v1=" + TRANSFORM(loV1.nract) + " v2=" + TRANSFORM(loV2.nract) + ")"
DO Assert WITH !ISNULL(loV1.proc_tva) AND !ISNULL(loV2.proc_tva), "proc_tva populat pe ambele (surse diferite, nu se compara pentru egalitate)"
* crsDetalii - surse diferite -> NU se compara numarul de linii intre v1/v2; cifrele au fost
* verificate independent pe Oracle inainte de scriere test (vezi raport)
LOCAL n1, n2, nTax1, nTax2
n1 = 0
n2 = 0
nTax1 = 0
nTax2 = 0
IF USED('p2v1_det')
SELECT COUNT(*) AS n, SUM(IIF(!EMPTY(NVL(taxcode, 0)), 1, 0)) AS ntax FROM p2v1_det INTO CURSOR crsp2v1agg
n1 = crsp2v1agg.n
nTax1 = crsp2v1agg.ntax
USE IN crsp2v1agg
ENDIF
IF USED('p2v2_det')
SELECT COUNT(*) AS n, SUM(IIF(!EMPTY(NVL(taxcode, 0)), 1, 0)) AS ntax FROM p2v2_det INTO CURSOR crsp2v2agg
n2 = crsp2v2agg.n
nTax2 = crsp2v2agg.ntax
USE IN crsp2v2agg
ENDIF
DO Assert WITH n1 = 1, "crsDetalii v1 (SSS675, sursa proprie): 1 linie, e=" + TRANSFORM(n1)
DO Assert WITH n2 = 4, "crsDetalii v2 (SSS674, sursa proprie): 4 linii, e=" + TRANSFORM(n2)
DO Assert WITH nTax1 = 1, "crsDetalii v1: taxcode populat pe linia sa, e=" + TRANSFORM(nTax1) + "/1"
DO Assert WITH nTax2 = 2, "crsDetalii v2: taxcode populat pe 2 din 4 linii (celelalte au id_jtva_coloana=0, gol legitim - gol de jurnal TVA deja inregistrat, nu al S6-6), e=" + TRANSFORM(nTax2) + "/4"
DO AfLog WITH "INFO pereche 2: taxcode PREZENT pe traseul de incarcare in masa (aviz) pe AMBELE forme - fix A/W4 acopera acest traseu, spre deosebire de pereche 1 (cautare in linie)"
ENDPROC
*----------------------------------------------------------------------------------------
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL: " + gcCaz + 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
DO AfLog WITH "ERROR " + gcCaz + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " sarit=" + TRANSFORM(gnSarit)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC

View File

@@ -0,0 +1,782 @@
* test_s8_cablare_incarcare.prg
* Headless: proba cablarii incarcarii in masa pe frm_facturare_articole2 (S8, propunerea
* docs\propunere_s8_cablare_incarcare_v2.md sectiunea 7). Testul apasa BUTONUL
* (but_incarca_articole.Click(), care trece prin _cmd_base.Click si macro-expandeaza cAction),
* niciodata metoda do_incarca_articole direct - veriga de rutare era exact ce lipsea in probele
* anterioare.
*
* Asertiuni (A1-A10 din sectiunea 7.2, plus cele doua structurale de rutare din 7.1):
* A1 but_incarca_articole.cAction = 'do_incarca_articole' (+ PEMSTATUS do_adauga_tot pe instanta)
* A2 dupa Click: Reccount('crsarticole') > 0
* A3 dupa Click: Reccount('crsfactura') > 0 <- trece datorita cablarii (W1)
* A4 Reccount('crsfactura') = Reccount('crsarticole') (comanda fara linii sarite)
* A5 zero linii cu id_jtva_coloana = 0 in crsfactura <- trece datorita W3
* A6 SUM(valctva) din crsfactura > 0
* A7 comanda cu linie de discount (cantitate negativa): zero apeluri amessagebox <- W2
* A8 neregresie tip 1 (lista de preturi, llCautareInLinie): crsfactura ramane gol
* A9 garda de tipuri, contract (tip 2): crsfactura ramane gol SI zero amessagebox
* A11 taxcode din crsfactura = valoarea derivata de cod <- trece datorita W4
* A10 emitere reala prin but_termin1.Click(): rand in VANZARI cu TIP = 3 si
* VANZARI_DETALII.ID_JTVA_COLOANA > 0 pe toate liniile (numai daca A1-A9 sunt verzi)
*
* Sursele se aleg din date la rulare (SELECT peste COMENZI + apel pack_facturare.cursor_comanda,
* exact interogarea folosita de incarca_cursor_articole) - id-urile fixe nu tin: o comanda emisa
* de o rulare anterioara intoarce 0 linii la urmatoarea (2478/2479, consumate la S6-2).
* sursa A (A2-A6, A10): comanda fara linii cu cantitate negativa si cu id_c distincte
* sursa B (A7): comanda cu cel putin o linie negativa, toate negativele negestionabile
* Clientii cu 'CLIENT' in nume sunt exclusi: valideaza_antet (ofacturare_antet.prg:881) deschide
* pentru ei dialogul "in loc de BON FISCAL", care ar polua asertiunile de zero-amessagebox.
*
* Mock: mock_validare_antet.prg (amessagebox + facturi_duplicate -> gcMockApeluri). amessagebox e
* apelat din interiorul unei metode .vcx, deci se reincarca cu SET PROCEDURE ... ADDITIVE imediat
* inainte de fiecare Click; nu se probeaza precedenta mock-ului chemand amessagebox direct.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s8_cablare_incarcare.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s8_cablare_incarcare.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8 (inainte de creeaza_cursor_serii);
* gnIdSucursala = 167; gnScadereStoc = 0; gnFactSeturi = 0.
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 ''
CLOSE DATABASES
PUBLIC gcLog, gnPass, gnFail, gnErr, gcCaz, gcMock, gcNumere
PUBLIC gcMockApeluri, gnMockRaspuns, gcMockDuplicat
PUBLIC gnComandaA, gnComandaB, goDriverMsg, gcClaseVazute
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s8_cablare_incarcare.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)
gnPass = 0
gnFail = 0
gnErr = 0
gcCaz = ""
gcMockApeluri = ""
gnMockRaspuns = 6
gcMockDuplicat = ""
gnComandaA = 0
gnComandaB = 0
gcClaseVazute = ";"
gcNumere = ""
gcMock = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg"
*-- poDate & co. se declara SI se initializeaza la nivelul programului principal: metodele din
*-- .vcx le vad numai daca variabila exista deja pe stiva de sub ele. Un PRIVATE declarat intr-o
*-- procedura si asignat in alta ramane invizibil in forma (eroarea "Alias 'PODATE' is not found").
PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest, pnTotalDiscountAvize, plVizibil
poDate = NULL
poGeneratorNumere = NULL
poDateGestiuneDest = NULL
pnTotalDiscountAvize = 0
plVizibil = .F.
ON ERROR DO S8Err WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
TRY
*-- stub_verificare PRIMUL: "Do Form verificare" (ofacturare.vc2:20126) rezolva la stub, nu la
*-- formularul real. test_init_env_auto_roafacturare.prg:78 adauga ADDITIV, deci nu-l pierde.
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 S8Log WITH 'EROARE: conectare Oracle esuata'
DO S8Final
ENDIF
SQLSETPROP(gnHandle, "QueryTimeOut", 45)
DO S8Log WITH 'ENV OK gnHandle=' + TRANSFORM(gnHandle) + ' gcS=' + gcS
DO S8Log WITH 'DIAG SET_PATH stub inca in fata: ' + FULLPATH('verificare.scx')
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE
SET PROCEDURE TO (gcMock) ADDITIVE
IF !actualizeaza_optiuni_program()
DO S8Log WITH 'EROARE: actualizeaza_optiuni_program()'
DO S8Final
ENDIF
gnScadereStoc = 0
gnFactSeturi = 0
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 S8Log WITH 'optiuni OK gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ' gnFactSeturi=' + TRANSFORM(gnFactSeturi) + ;
' gnIdSucursala=' + TRANSFORM(gnIdSucursala) + ' gnIdUtil=' + TRANSFORM(gnIdUtil) + ;
' gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna)
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
*-- cboTipFactura cere RowSource pe saft_tip_facturi la constructia formularului
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
*-- confirmarile pe forma modala MESSAGEBOX_FORM (ex. "Doriti sa se inchida comanda?" la tip 3)
*-- nu trec prin functia amessagebox, deci mock-ul nu le acopera - timer + driver, ca la S6-2
goDriverMsg = CREATEOBJECT('driverMsgS8')
_SCREEN.AddObject('tmrS8', 'Timer')
_SCREEN.tmrS8.Interval = 200
BINDEVENT(_SCREEN.tmrS8, 'Timer', goDriverMsg, 'Executa')
_SCREEN.tmrS8.Enabled = .T.
DO S8Log WITH CHR(13) + CHR(10) + '===== ALEGEREA SURSELOR DIN DATE ====='
DO AlegeSurse
DO S8Log WITH CHR(13) + CHR(10) + '===== A1 + rutare (structural, fara rulare de sursa) ====='
DO CazRutare
DO S8Log WITH CHR(13) + CHR(10) + '===== A7 - comanda cu linie de discount (cantitate negativa) ====='
DO CazDiscount
DO S8Log WITH CHR(13) + CHR(10) + '===== A8 - neregresie tip 1 (lista de preturi) ====='
DO CazListaPreturi
DO S8Log WITH CHR(13) + CHR(10) + '===== A9 - garda de tipuri, contract (tip 2) ====='
DO CazContract
DO S8Log WITH CHR(13) + CHR(10) + '===== A2-A6 (+ A10) - comanda curata ====='
DO CazComanda
DO S8Final
CATCH TO loExc
DO S8Log WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ;
' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']'
DO S8Final
ENDTRY
QUIT
*==================================================================================
* AlegeSurse: scaneaza comenzile descrescator si cheama pack_facturare.cursor_comanda (aceeasi
* interogare pe care o face incarca_cursor_articole) pana gaseste ambele surse.
PROCEDURE AlegeSurse
LOCAL lnQ, lnCnt, lnNeg, lnNegGest, lnDistinctIdC, lnIncercari
poDate = CREATEOBJECT('empty')
ADDPROPERTY(poDate, 'zi_curs', DATE(gnAn, gnLuna, 1))
ADDPROPERTY(poDate, 'tip', 3)
ADDPROPERTY(poDate, 'listaid', '')
lnQ = goExecutor.oExecute([select c.id_comanda, p.nume from comenzi c, nom_parteneri p ] + ;
[where c.id_part = p.id_part and upper(p.nume) not like '%CLIENT%' order by c.id_comanda desc], 'crsComLista')
IF lnQ < 0 OR !USED('crsComLista')
DO Assert WITH .F., 'lista de comenzi citita din Oracle: ' + TRANSFORM(goExecutor.oPrelucrareEroare())
RETURN
ENDIF
lnIncercari = 0
SELECT crsComLista
SCAN WHILE lnIncercari < 80 AND (gnComandaA = 0 OR gnComandaB = 0)
lnIncercari = lnIncercari + 1
poDate.listaid = ALLTRIM(TRANSFORM(crsComLista.id_comanda))
DO Inchide WITH 'crsAlegere'
lnQ = goExecutor.oExecute([{call ] + gcS + [.pack_facturare.cursor_comanda(?poDate.zi_curs,?poDate.tip,?poDate.listaid,?gnIdUtil)}], 'crsAlegere')
IF lnQ >= 0 AND USED('crsAlegere') AND RECCOUNT('crsAlegere') > 0
SELECT crsAlegere
lnCnt = RECCOUNT('crsAlegere')
COUNT FOR cantitate < 0 TO lnNeg
COUNT FOR cantitate < 0 AND NVL(gestionabil, 0) = 1 TO lnNegGest
SELECT DISTINCT id_c FROM crsAlegere INTO CURSOR crsIdC
lnDistinctIdC = RECCOUNT('crsIdC')
USE IN crsIdC
DO CASE
CASE gnComandaA = 0 AND lnNeg = 0 AND lnDistinctIdC = lnCnt
gnComandaA = crsComLista.id_comanda
DO S8Log WITH ' sursa A = comanda ' + TRANSFORM(gnComandaA) + ' (linii=' + TRANSFORM(lnCnt) + ', fara negative, id_c distincte)'
CASE gnComandaB = 0 AND lnNeg > 0 AND lnNegGest = 0
gnComandaB = crsComLista.id_comanda
DO S8Log WITH ' sursa B = comanda ' + TRANSFORM(gnComandaB) + ' (linii=' + TRANSFORM(lnCnt) + ', negative=' + ;
TRANSFORM(lnNeg) + ', toate negestionabile)'
ENDCASE
ENDIF
SELECT crsComLista
ENDSCAN
DO Inchide WITH 'crsAlegere'
DO Inchide WITH 'crsComLista'
DO S8Log WITH ' comenzi inspectate=' + TRANSFORM(lnIncercari)
DO Assert WITH gnComandaA > 0, 'sursa A (comanda tip 3 fara linii negative) gasita in date'
IF gnComandaB = 0
DO S8Log WITH ' ATENTIE: nicio comanda cu linie de discount negestionabila in primele ' + ;
TRANSFORM(lnIncercari) + ' comenzi - A7 ramane NEEXERCITATA pe date'
ENDIF
ENDPROC
*==================================================================================
* A1 + asertiunile structurale de rutare (sectiunea 7.1): butonul duce la metoda, iar metoda
* care muta liniile exista pe instanta v2.
PROCEDURE CazRutare
LOCAL loForm
gcCaz = '[A1] '
DO CuratieCrs
DO creeaza_facturacrs WITH 'crsfactura'
poDate = CREATEOBJECT("oDateFactura", 25002, 3)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
loForm = CREATEOBJECT('frm_facturare_articole2')
IF VARTYPE(loForm) <> 'O'
DO Assert WITH .F., 'Createobject frm_facturare_articole2'
RETURN
ENDIF
DO Assert WITH LOWER(ALLTRIM(loForm.but_incarca_articole.cAction)) == 'do_incarca_articole', ;
'[RUTARE] butonul Incarca articole duce la do_incarca_articole (cAction=[' + ;
ALLTRIM(TRANSFORM(loForm.but_incarca_articole.cAction)) + '])'
DO Assert WITH PEMSTATUS(loForm, 'do_adauga_tot', 5), ;
'[RUTARE] metoda do_adauga_tot exista pe instanta v2'
loForm.Release()
RELEASE loForm
DO CuratieCrs
ENDPROC
*==================================================================================
* A2-A6 pe sursa A, apoi A10 (emitere reala) daca tot ce s-a rulat pana aici e verde.
PROCEDURE CazComanda
LOCAL loSursa, loForm, lnArt, lnFact, lnZero, lnSuma, lnFailInainte, lnIdVz, lcSerie, lnNract
LOCAL lnRau, lnNenul, lnAstept, llSaft
gcCaz = '[A2-A6] '
IF gnComandaA = 0
DO Assert WITH .F., 'A2-A6: nu exista sursa A aleasa - cazul nu s-a rulat'
RETURN
ENDIF
lnFailInainte = gnFail
loSursa = CreeazaSursaComanda(gnComandaA)
IF ISNULL(loSursa)
DO Assert WITH .F., 'sursa A citita din Oracle (id_comanda=' + TRANSFORM(gnComandaA) + ')'
RETURN
ENDIF
loForm = PregatesteFormular(3, loSursa)
IF ISNULL(loForm)
RETURN
ENDIF
DO ApasaIncarca WITH loForm
lnArt = IIF(USED('crsarticole'), RECCOUNT('crsarticole'), 0)
lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0)
DO S8Log WITH ' dupa Click: crsarticole=' + TRANSFORM(lnArt) + ' crsfactura=' + TRANSFORM(lnFact)
DO Assert WITH lnArt > 0, 'A2: Reccount(crsarticole) > 0 dupa Click, e=' + TRANSFORM(lnArt)
DO Assert WITH lnFact > 0, 'A3: Reccount(crsfactura) > 0 dupa Click (cablarea W1), e=' + TRANSFORM(lnFact)
DO Assert WITH lnFact = lnArt, 'A4: Reccount(crsfactura) = Reccount(crsarticole), ' + ;
TRANSFORM(lnFact) + ' vs ' + TRANSFORM(lnArt)
lnZero = -1
lnSuma = 0
IF lnFact > 0
SELECT crsfactura
COUNT FOR NVL(id_jtva_coloana, 0) = 0 TO lnZero
SUM valctva TO lnSuma
ENDIF
DO Assert WITH lnZero = 0, 'A5: zero linii cu id_jtva_coloana = 0 in crsfactura (W3), e=' + TRANSFORM(lnZero)
DO Assert WITH lnSuma > 0, 'A6: SUM(valctva) din crsfactura > 0, e=' + TRANSFORM(lnSuma)
*-- A11 (W4): taxcode ajunge in crsfactura cu exact valoarea pe care o deriva codul, nu "nenul".
*-- frm_articol_factura.Init cheama UpdateExplicatieSAFT doar sub If m.gl406 (ofacturare.vc2:2523),
*-- iar GetTaxCode intoarce NULL daca gl406 e stins - deci fara SAFT valoarea legitima e 0 (din
*-- AddProperty), nu un cod. Asteptarea se calculeaza cu aceeasi functie, ramura cu ramura.
*-- Fara W4 taxcode nu e in listele Gather, deci ramane NULL pe fiecare rand: -999 <> asteptat.
llSaft = (TYPE('gl406') = 'L' AND gl406)
lnRau = 0
lnNenul = 0
IF lnFact > 0
SELECT crsfactura
SCAN
lnAstept = IIF(m.llSaft, NVL(GetTaxCode(gnAn, gnLuna, poDate.dataact, NVL(crsfactura.id_jtva_coloana, 0), .F.), -999), 0)
IF NVL(crsfactura.taxcode, -999) <> m.lnAstept
lnRau = lnRau + 1
DO S8Log WITH ' A11 nepotrivire: id_jtva_coloana=' + TRANSFORM(NVL(crsfactura.id_jtva_coloana, 0)) + ;
' taxcode=' + TRANSFORM(crsfactura.taxcode) + ' asteptat=' + TRANSFORM(m.lnAstept)
ENDIF
IF NVL(crsfactura.taxcode, 0) <> 0
lnNenul = lnNenul + 1
ENDIF
ENDSCAN
ENDIF
DO S8Log WITH ' A11: gl406=' + TRANSFORM(m.llSaft) + ' linii cu taxcode nenul=' + TRANSFORM(lnNenul) + '/' + TRANSFORM(lnFact)
DO Assert WITH lnFact > 0 AND lnRau = 0, ;
'A11: taxcode din crsfactura = valoarea derivata de cod (W4), linii nepotrivite=' + TRANSFORM(lnRau)
IF lnNenul = 0
DO S8Log WITH ' A11 ATENTIE: toate liniile au taxcode 0 - asertiunea e conforma cu codul, dar ' + ;
'NU exercita culegerea unei valori reale (gl406 stins sau explicatii SAFT neconfigurate)'
ENDIF
*-- A10: numai daca tot lantul A1-A9 e verde (sectiunea 7.2)
IF gnFail = 0 AND lnFailInainte = 0
gcCaz = '[A10] '
lcSerie = ALLTRIM(NVL(poDate.serie_act, ''))
lnNract = poDate.nract
DO S8Log WITH ' A10: emit cu serie_act=' + lcSerie + ' nract=' + TRANSFORM(lnNract)
loForm.do_calculeaza_totaluri()
DOEVENTS FORCE
SET PROCEDURE TO (gcMock) ADDITIVE
gcMockApeluri = ''
loForm.but_termin1.Click()
DOEVENTS FORCE
lnIdVz = NVL(poDate.nid_vanzare, 0)
DO S8Log WITH ' A10: but_termin1.Click() -> poDate.nid_vanzare=' + TRANSFORM(lnIdVz)
DO S8Log WITH ' A10: apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']'
IF lnIdVz > 0
gcNumere = gcNumere + 'SCRIS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' id_vanzare=' + TRANSFORM(lnIdVz) + ';'
DO VerificaVanzare WITH lnIdVz
ELSE
gcNumere = gcNumere + 'ARS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (alocat, nescris);'
DO Assert WITH .F., 'A10: documentul s-a scris (poDate.nid_vanzare > 0), e=' + TRANSFORM(lnIdVz)
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
ENDIF
ELSE
DO S8Log WITH ' A10 NERULAT: exista esecuri anterioare (fail=' + TRANSFORM(gnFail) + ')'
gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(NVL(poDate.serie_act, '')) + ' nract=' + TRANSFORM(poDate.nract) + ';'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
ENDIF
DO Elibereaza WITH loForm
DO Goleste
ENDPROC
*==================================================================================
* A7: comanda cu linie de discount. Fara garda de gestionabilitate (W2), bucla din do_adauga_tot
* ajunge la dialogul "Nu ati selectat toata cantitatea"; cu garda, nu se cheama deloc amessagebox.
PROCEDURE CazDiscount
LOCAL loSursa, loForm, lnNeg
gcCaz = '[A7] '
IF gnComandaB = 0
DO S8Log WITH ' A7 NEEXERCITATA: nicio comanda cu linie de discount negestionabila in date'
RETURN
ENDIF
loSursa = CreeazaSursaComanda(gnComandaB)
IF ISNULL(loSursa)
DO Assert WITH .F., 'sursa B citita din Oracle (id_comanda=' + TRANSFORM(gnComandaB) + ')'
RETURN
ENDIF
loForm = PregatesteFormular(3, loSursa)
IF ISNULL(loForm)
RETURN
ENDIF
DO ApasaIncarca WITH loForm
lnNeg = 0
IF USED('crsfactura') AND RECCOUNT('crsfactura') > 0
SELECT crsfactura
COUNT FOR cantitate < 0 TO lnNeg
ENDIF
DO S8Log WITH ' dupa Click: crsarticole=' + TRANSFORM(IIF(USED('crsarticole'), RECCOUNT('crsarticole'), 0)) + ;
' crsfactura=' + TRANSFORM(IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0)) + ' din care negative=' + TRANSFORM(lnNeg)
DO S8Log WITH ' apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']'
DO Assert WITH !('amessagebox' $ LOWER(gcMockApeluri)), ;
'A7: zero apeluri amessagebox pe comanda cu linie de discount (W2), jurnal=[' + ;
STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']'
DO Assert WITH lnNeg > 0, 'A7 (diagnostic): linia de discount a ajuns in crsfactura, negative=' + TRANSFORM(lnNeg)
gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(NVL(poDate.serie_act, '')) + ' nract=' + TRANSFORM(poDate.nract) + ' (A7);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO Elibereaza WITH loForm
DO Goleste
ENDPROC
*==================================================================================
* A8: tip 1 (lista de preturi) - llCautareInLinie sare peste incarcarea in masa, deci nici
* do_adauga_tot nu se cheama; crsfactura ramane gol.
PROCEDURE CazListaPreturi
LOCAL loForm, lnFact
gcCaz = '[A8] '
loForm = PregatesteFormular(1, NULL)
IF ISNULL(loForm)
RETURN
ENDIF
DO ApasaIncarca WITH loForm
lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0)
DO S8Log WITH ' dupa Click: crsarticole=' + TRANSFORM(IIF(USED('crsarticole'), RECCOUNT('crsarticole'), 0)) + ;
' crsfactura=' + TRANSFORM(lnFact)
DO S8Log WITH ' apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']'
DO Assert WITH lnFact = 0, 'A8: pe tip 1 (cautare in linie) crsfactura ramane gol dupa Click, e=' + TRANSFORM(lnFact)
DO Assert WITH !('nu ati ales' $ LOWER(gcMockApeluri)), ;
'A8: antetul a trecut validarea (Click-ul a ajuns la ramura llCautareInLinie, nu s-a oprit in valideaza_antet)'
gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(NVL(poDate.serie_act, '')) + ' nract=' + TRANSFORM(poDate.nract) + ' (A8);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO Elibereaza WITH loForm
DO Goleste
ENDPROC
*==================================================================================
* A9: contract (tip 2) - incarcarea in masa RULEAZA (crsarticole se umple), dar garda de tipuri
* din do_incarca_articole nu cheama do_adauga_tot; crsfactura ramane gol si nu apare niciun dialog.
* Contractul se alege incercand candidatii pe rand: unul fara linii ar declansa "Nu exista
* articole pentru optiunile alese!" din incarca_cursor_articole si ar strica asertiunea.
PROCEDURE CazContract
LOCAL lnI, llGasit
gcCaz = '[A9] '
IF goExecutor.oExecute([select ct.id_ctr from fact_vcontracte ct, nom_parteneri p ] + ;
[where ct.id_part = p.id_part and upper(p.denumire) not like '%CLIENT%' order by ct.id_ctr desc], 'crsCtrLista') < 0
DO Assert WITH .F., 'A9: lista de contracte citita din Oracle'
RETURN
ENDIF
llGasit = .F.
lnI = 0
SELECT crsCtrLista
SCAN WHILE lnI < 6 AND !llGasit
lnI = lnI + 1
llGasit = IncearcaContract(crsCtrLista.id_ctr)
SELECT crsCtrLista
ENDSCAN
DO Inchide WITH 'crsCtrLista'
IF !llGasit
DO Assert WITH .F., 'A9: niciun contract cu articole in primii ' + TRANSFORM(lnI) + ' candidati - cazul nu s-a exercitat'
ENDIF
ENDPROC
FUNCTION IncearcaContract
LPARAMETERS tnIdCtr
LOCAL loSursa, loForm, lnArt, lnFact
loSursa = CreeazaSursaContract(tnIdCtr)
IF ISNULL(loSursa)
RETURN .F.
ENDIF
loForm = PregatesteFormular(2, loSursa)
IF ISNULL(loForm)
RETURN .F.
ENDIF
DO ApasaIncarca WITH loForm
lnArt = IIF(USED('crsarticole'), RECCOUNT('crsarticole'), 0)
lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0)
DO S8Log WITH ' contract ' + TRANSFORM(tnIdCtr) + ': crsarticole=' + TRANSFORM(lnArt) + ' crsfactura=' + TRANSFORM(lnFact)
IF lnArt > 0
DO S8Log WITH ' apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']'
DO Assert WITH lnFact = 0, 'A9: pe tip 2 (contract) crsfactura ramane gol dupa Click - garda de tipuri, e=' + TRANSFORM(lnFact)
DO Assert WITH !('amessagebox' $ LOWER(gcMockApeluri)), ;
'A9: zero apeluri amessagebox pe contract, jurnal=[' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']'
ENDIF
gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(NVL(poDate.serie_act, '')) + ' nract=' + TRANSFORM(poDate.nract) + ' (A9 ctr ' + TRANSFORM(tnIdCtr) + ');'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO Elibereaza WITH loForm
DO Goleste
RETURN (lnArt > 0)
ENDFUNC
*==================================================================================
* PregatesteFormular: poDate + generator + crsfactura gol + formular v2, gata de Click.
* Scrie direct in poDate / poGeneratorNumere / poDateGestiuneDest - PRIVATE-urile declarate de
* apelant sunt vizibile aici (nu se transmit prin referinta: @ pe PRIVATE e capcana platita deja).
* Intoarce NULL daca ceva din pregatire a esuat (a asertat deja).
FUNCTION PregatesteFormular
LPARAMETERS tnTip, toSursa
LOCAL loForm, lnIdSet
DO CuratieCrs
SELECT 0
lnIdSet = 25000 + tnTip - 1
IF ISNULL(toSursa)
poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip)
ELSE
poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip, toSursa)
ENDIF
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poDateGestiuneDest = CREATEOBJECT("oDateGestiune")
*-- tip 1 nu are sursa: antetul se completeaza cu un client real, altfel valideaza_antet
*-- respinge inainte sa se ajunga la ramura llCautareInLinie (si A8 ar trece degeaba)
IF ISNULL(toSursa)
IF goExecutor.oExecute([select id_part, nume from nom_parteneri where upper(nume) not like '%CLIENT%' and rownum = 1], 'crsPart') >= 0 ;
AND USED('crsPart') AND RECCOUNT('crsPart') > 0
SELECT crsPart
poDate.id_client = id_part
poDate.nume_client = ALLTRIM(NVL(nume, ''))
USE IN crsPart
ENDIF
ENDIF
IF EMPTY(NVL(poDate.id_fdoc, 0))
poDate.id_fdoc = 1
ENDIF
poDate.id_delegat = 39
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
IF poDate.rezultat_serii <> 3
DO Assert WITH .F., 'rezultat_serii = 3 (o singura plaja, fara dialog) pe tip ' + TRANSFORM(tnTip) + ', e=' + TRANSFORM(poDate.rezultat_serii)
RETURN NULL
ENDIF
poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc)
poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL)
DO S8Log WITH ' tip=' + TRANSFORM(tnTip) + ' nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ;
' serie_act=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ;
' listaid=[' + TRANSFORM(poDate.listaid) + '] id_client=' + TRANSFORM(poDate.id_client)
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
*-- crsfactura gol INAINTE de formular, ca in factureaza() pe ramura llFacturareNoua; coloana
*-- gestiune e ceruta de coloana combo a grilei (tehnica din test_s4_3_neregresie_masa.prg)
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
loForm = CREATEOBJECT('frm_facturare_articole2')
IF VARTYPE(loForm) <> 'O'
DO Assert WITH .F., 'Createobject frm_facturare_articole2 pe tip ' + TRANSFORM(tnTip)
RETURN NULL
ENDIF
loForm.WindowType = 0
loForm.Show()
DOEVENTS FORCE
RETURN loForm
ENDFUNC
*==================================================================================
* ApasaIncarca: singura cale prin care testul declanseaza incarcarea. Mock-ul se reincarca imediat
* inainte, ca sa castige rezolutia de nume pentru amessagebox-ul apelat din interiorul .vcx.
PROCEDURE ApasaIncarca
LPARAMETERS toForm
SET PROCEDURE TO (gcMock) ADDITIVE
gcMockApeluri = ''
toForm.but_incarca_articole.Click()
DOEVENTS FORCE
ENDPROC
*==================================================================================
* A10: documentul scris in Oracle - tip si id_jtva_coloana pe toate liniile.
PROCEDURE VerificaVanzare
LPARAMETERS tnIdVz
LOCAL lnTip, lnLinii, lnZero
IF goExecutor.oExecute([select tip from vanzari where id_vanzare = ] + TRANSFORM(tnIdVz), 'crsVz') < 0 OR RECCOUNT('crsVz') <> 1
DO Assert WITH .F., 'A10: VANZARI contine documentul id_vanzare=' + TRANSFORM(tnIdVz)
DO Inchide WITH 'crsVz'
RETURN
ENDIF
SELECT crsVz
lnTip = tip
USE IN crsVz
DO Assert WITH lnTip = 3, 'A10: VANZARI.TIP = 3 pe documentul emis, e=' + TRANSFORM(lnTip)
IF goExecutor.oExecute([select nvl(id_jtva_coloana,0) as id_jtva_coloana from vanzari_detalii where id_vanzare = ] + TRANSFORM(tnIdVz), 'crsVzD') < 0
DO Assert WITH .F., 'A10: VANZARI_DETALII citit pentru id_vanzare=' + TRANSFORM(tnIdVz)
RETURN
ENDIF
SELECT crsVzD
lnLinii = RECCOUNT('crsVzD')
COUNT FOR id_jtva_coloana <= 0 TO lnZero
USE IN crsVzD
DO Assert WITH lnLinii > 0, 'A10: VANZARI_DETALII are linii, e=' + TRANSFORM(lnLinii)
DO Assert WITH lnZero = 0, 'A10: ID_JTVA_COLOANA > 0 pe toate liniile, linii cu 0/null=' + TRANSFORM(lnZero)
ENDPROC
*==================================================================================
* Sursa reala pentru comanda (tip 3) - campurile citite de oDateFactura.Init pe ramura tnTip=3
* (ofacturare_comun.prg:315). listaid trebuie caracter (do_scrie_factura face Val(poDate.listaid)).
FUNCTION CreeazaSursaComanda
LPARAMETERS tnIdComanda
LOCAL lnQ, loSursa
loSursa = NULL
lnQ = goExecutor.oExecute([select c.id_part, p.nume, p.cod_fiscal, c.id_comanda, c.nr_comanda, c.id_sectie ] + ;
[from comenzi c, nom_parteneri p where c.id_part = p.id_part and c.id_comanda = ] + TRANSFORM(tnIdComanda), 'crsSursaCom')
IF lnQ < 0 OR !USED('crsSursaCom') OR RECCOUNT('crsSursaCom') <> 1
DO S8Log WITH ' EROARE sursa comanda ' + TRANSFORM(tnIdComanda) + ': ' + TRANSFORM(goExecutor.oPrelucrareEroare())
DO Inchide WITH 'crsSursaCom'
RETURN loSursa
ENDIF
SELECT crsSursaCom
SCATTER NAME loSursa MEMO
USE IN crsSursaCom
loSursa.id_comanda = ALLTRIM(TRANSFORM(loSursa.id_comanda))
loSursa.nr_comanda = ALLTRIM(TRANSFORM(loSursa.nr_comanda))
RETURN loSursa
ENDFUNC
* Sursa reala pentru contract (tip 2). FACT_VCONTRACTE nu are id_sectie/sectie/responsabil/valuta -
* se completeaza cu valori neutre, ca la S6-2.
FUNCTION CreeazaSursaContract
LPARAMETERS tnIdCtr
LOCAL lnQ, loSursa
loSursa = NULL
lnQ = goExecutor.oExecute([select ct.id_part, p.denumire, p.cod_fiscal, ct.id_ctr, ct.contract ] + ;
[from fact_vcontracte ct, nom_parteneri p where ct.id_part = p.id_part and ct.id_ctr = ] + TRANSFORM(tnIdCtr), 'crsSursaCtr')
IF lnQ < 0 OR !USED('crsSursaCtr') OR RECCOUNT('crsSursaCtr') <> 1
DO S8Log WITH ' EROARE sursa contract ' + TRANSFORM(tnIdCtr) + ': ' + TRANSFORM(goExecutor.oPrelucrareEroare())
DO Inchide WITH 'crsSursaCtr'
RETURN loSursa
ENDIF
SELECT crsSursaCtr
SCATTER NAME loSursa MEMO
USE IN crsSursaCtr
ADDPROPERTY(loSursa, 'id_sectie', 0)
ADDPROPERTY(loSursa, 'sectie', '')
ADDPROPERTY(loSursa, 'id_responsabil', 0)
ADDPROPERTY(loSursa, 'responsabil', '')
ADDPROPERTY(loSursa, 'id_valuta', 1)
ADDPROPERTY(loSursa, 'nume_val', 'RON')
RETURN loSursa
ENDFUNC
*==================================================================================
PROCEDURE Elibereaza
LPARAMETERS toForm
IF TYPE('toForm') = 'O' AND !ISNULL(toForm)
TRY
toForm.Release()
CATCH
ENDTRY
ENDIF
DO CuratieCrs
ENDPROC
PROCEDURE CuratieCrs
DO Inchide WITH 'crsarticole'
DO Inchide WITH 'crsarticole1'
DO Inchide WITH 'crsfactura'
DO Inchide WITH 'crscursuri'
DO Inchide WITH 'crspolitici'
DO Inchide WITH 'crscontracte'
DO Inchide WITH 'crsgestiunidest'
DO Inchide WITH 'crsCtrTemp'
DO Inchide WITH 'crsComTemp'
DO Inchide WITH 'crsartselectate'
DO Inchide WITH 'jtva_coloane'
ENDPROC
PROCEDURE Inchide
LPARAMETERS tcAlias
IF USED(tcAlias)
USE IN (tcAlias)
ENDIF
ENDPROC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO S8Log WITH 'PASS: ' + gcCaz + tcMsg
ELSE
gnFail = gnFail + 1
DO S8Log WITH 'FAIL: ' + gcCaz + tcMsg
ENDIF
ENDPROC
PROCEDURE S8Log
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE S8Err
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gnErr = gnErr + 1
DO S8Log WITH 'ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
ENDPROC
PROCEDURE S8Final
LOCAL lnI
IF TYPE('_SCREEN.tmrS8') = 'O'
_SCREEN.tmrS8.Enabled = .F.
TRY
_SCREEN.RemoveObject('tmrS8')
CATCH
ENDTRY
ENDIF
*-- formele ramase deschise arunca "Unhandled Structured Exception" la QUIT (caseta modala =
*-- rulare atarnata), asa ca se inchid explicit inainte
FOR lnI = _SCREEN.FormCount TO 1 STEP -1
TRY
_SCREEN.Forms(lnI).Release()
CATCH
ENDTRY
ENDFOR
DO S8Log WITH CHR(13) + CHR(10) + 'NUMERE: ' + gcNumere
DO S8Log WITH 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + ' err=' + TRANSFORM(gnErr)
DO S8Log WITH 'END ' + TTOC(DATETIME())
QUIT
ENDPROC
PROCEDURE Goleste
poDate = NULL
poGeneratorNumere = NULL
poDateGestiuneDest = NULL
ENDPROC
*==================================================================================
* driverMsgS8: apasa automat cmdYes/cmdOk pe forma modala MESSAGEBOX_FORM (ex. "Doriti sa se
* inchida comanda?" la emiterea pe tip 3) - acele dialoguri nu trec prin functia amessagebox, deci
* mock-ul nu le acopera. Garda de reintrare lBusy: do_termin cedeaza controlul buclei de mesaje.
* Nu atinge in niciun fel FRM_FACTURARE_ARTICOLE2.
DEFINE CLASS driverMsgS8 AS Custom
lBusy = .F.
PROCEDURE Executa
IF This.lBusy
RETURN
ENDIF
This.lBusy = .T.
IF TYPE('_SCREEN.tmrS8') = 'O'
_SCREEN.tmrS8.Enabled = .F.
ENDIF
TRY
LOCAL lnI, loMsgForm, lcClasa
loMsgForm = NULL
FOR lnI = 1 TO _SCREEN.FormCount
lcClasa = UPPER(_SCREEN.Forms(lnI).Class)
IF 'MESSAGEBOX_FORM' $ lcClasa
loMsgForm = _SCREEN.Forms(lnI)
ENDIF
IF !(lcClasa $ gcClaseVazute)
gcClaseVazute = gcClaseVazute + lcClasa + ';'
DO S8Log WITH ' [diag timer] forma noua: ' + lcClasa + ' Caption=[' + TRANSFORM(_SCREEN.Forms(lnI).Caption) + ']'
ENDIF
ENDFOR
IF !ISNULL(loMsgForm)
TRY
DO CASE
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5)
DO S8Log WITH ' [driver msg] apas cmgBotones.cmdYes'
loMsgForm.cmgBotones.cmdYes.Click()
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5)
DO S8Log WITH ' [driver msg] apas cmgBotones.cmdOk'
loMsgForm.cmgBotones.cmdOk.Click()
ENDCASE
CATCH TO loExcMsg
DO S8Log WITH ' [driver msg] CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message
ENDTRY
ENDIF
CATCH TO loExcTop
DO S8Log WITH ' [driver] CATCH ' + TRANSFORM(loExcTop.ErrorNo) + ' ' + loExcTop.Message
FINALLY
IF TYPE('_SCREEN.tmrS8') = 'O'
_SCREEN.tmrS8.Enabled = .T.
ENDIF
This.lBusy = .F.
ENDTRY
ENDPROC
ENDDEFINE

View File

@@ -0,0 +1,28 @@
$ErrorActionPreference = 'Stop'
$dir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat'
$prg = Join-Path $dir 'test_s8_cablare_incarcare.prg'
$log = Join-Path $dir 'out\test_s8_cablare_incarcare.log'
$vfp = 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe'
$viu = Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*test_s8_cablare_incarcare*' }
if ($viu) {
"Ruleaza deja o instanta a suitei (PID " + ($viu.ProcessId -join ',') + "). Nu lansez a doua."
exit 1
}
Set-Location $dir
Remove-Item (Join-Path $dir 'test_s8_cablare_incarcare.FXP') -ErrorAction SilentlyContinue
Remove-Item $log -ErrorAction SilentlyContinue
$p = Start-Process -FilePath $vfp -ArgumentList '-A', '-T', $prg -PassThru
"lansat PID " + $p.Id
$null = $p.WaitForExit(300000)
if (-not $p.HasExited) {
"ATARNAT dupa 300s - omor instanta (filtrat pe CommandLine)"
Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*test_s8_cablare_incarcare*' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force }
}
if (Test-Path $log) {
Get-Content $log
} else {
"Log inexistent: $log"
}

View File

@@ -0,0 +1,315 @@
* test_s8_geometrie_ui.prg - verifica geometria formularului frm_facturare_articole2
* (COMUN\clase\ofacturare.vc2) dupa reparatia S8h-S8m: banda de sub grila (chk_alte_date,
* chk_incasare, lb_antet_alte_date, lb_antet_incasare, ct_document, ct_contabilitate,
* ct_livrare, ct_incasare, but_cursuri) si banda de totaluri.
* Opt pasi: (0) ambele acordeoane inchise; (1-2) redimensionare cu acordeoanele inchise
* (micsorare, apoi marire peste maximizat initial); (3) doar Alte date deschis; (4) doar
* Incasare deschis; (5) ambele deschise; (6-7) redimensionare cu acordeoanele deschise
* (micsorare, apoi marire).
* Doua serii de asertiuni pe fiecare pas, pentru cele 10 controale de mai sus (mai putin
* lb_total_baza): control.Top >= grd_factura.Top+grd_factura.Height (banda de sub grila) si,
* pentru containerele vizibile, control.Top+control.Height <= lb_total_baza.Top (banda de
* totaluri). Log-ul mai contine si o verificare a latimii calculate din cod pentru
* lb_antet_alte_date.
* Rulare: powershell -ExecutionPolicy Bypass -File test_s8_geometrie_ui.ps1 (timeout >= 400s)
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcUILog, gcSyncDir, gnFail, gnPass, gnAssertFail, gnAssertPass, gnAssertPass2, gnAssertFail2, ;
gnAssertPassR, gnAssertFailR, gnAssertPass2R, gnAssertFail2R
gcUILog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s8_geometrie_ui_log.txt"
gcSyncDir = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\uisync_s8_geometrie\"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
gnFail = 0
gnPass = 0
gnAssertFail = 0
gnAssertPass = 0
gnAssertPass2 = 0
gnAssertFail2 = 0
gnAssertPassR = 0
gnAssertFailR = 0
gnAssertPass2R = 0
gnAssertFail2R = 0
ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
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", "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.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
* seriile de facturi (tipdoc 5) sunt pe utilizator in MARIUSM_AUTO
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
* gridextras.vcx e referit din ofacturare.vcx cu cale relativa
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
IF !USED('saft_tip_facturi')
update_saft_tip_facturi()
ENDIF
PRIVATE poDate, poGeneratorNumere, loForm
poDate = CREATEOBJECT("oDateFactura", 25000, 1)
poDate.nIdTipDoc = 5
poDate.totalctva = 1000
DO AfLog WITH "poDate.tip=" + TRANSFORM(poDate.tip) + " poDate.eProforma=" + TRANSFORM(poDate.eProforma)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
DO Final
ENDIF
loForm.WindowType = 0
loForm.Show()
loForm.WindowState = 2
DOEVENTS FORCE
DO AfLog WITH "formular afisat si maximizat"
* --- pas 0: (a) ambele acordeoane inchise ---
DO AfLog WITH "=== PAS 0: ambele inchise ==="
DO VerificaGeometrie WITH loForm, "pas0_ambele_inchise"
DO HarnessStep WITH 0, 'ambele_inchise', 25
* --- pasii 1-2: redimensionare CU ACORDEOANELE INCHISE ---
DO AfLog WITH "=== PAS 1-2: redimensionare CU ACORDEOANELE INCHISE ==="
loForm.WindowState = 0
DOEVENTS FORCE
loForm.Height = loForm.Height - 80
DOEVENTS FORCE
DO AfLog WITH "dupa WindowState=0 + Height-=80 (MICSORARE, acordeoane inchise): This.Height=" + TRANSFORM(loForm.Height) + " This.Width=" + TRANSFORM(loForm.Width)
DO VerificaGeometrie WITH loForm, "pas1_resize_inchis_micsorare", .T.
DO HarnessStep WITH 1, 'resize_inchis_micsorare', 25
loForm.Height = loForm.Height + 380
DOEVENTS FORCE
DO AfLog WITH "dupa Height+=380 (MARIRE peste maximizat initial, acordeoane inchise): This.Height=" + TRANSFORM(loForm.Height) + " This.Width=" + TRANSFORM(loForm.Width)
DO VerificaGeometrie WITH loForm, "pas2_resize_inchis_marire", .T.
DO HarnessStep WITH 2, 'resize_inchis_marire', 25
* revin la maximizat pentru restul secventei (starea "normala" de lucru)
loForm.WindowState = 2
DOEVENTS FORCE
DOEVENTS FORCE
* --- pas 3: (b) doar Alte date deschis ---
loForm.chk_alte_date.Value = 1
loForm.do_comuta_alte_date()
DOEVENTS FORCE
DO AfLog WITH "=== PAS 3: doar Alte date deschis ==="
DO VerificaGeometrie WITH loForm, "pas3_alte_date_deschis"
DO HarnessStep WITH 3, 'alte_date_deschis', 25
* inchid Alte date la loc, ca pasul 4 sa fie curat "doar incasare"
loForm.chk_alte_date.Value = 0
loForm.do_comuta_alte_date()
DOEVENTS FORCE
* --- pas 4: (c) doar Incasare deschis (aloca o chitanta reala - dezalocata la final) ---
loForm.chk_incasare.Value = 1
loForm.do_comuta_incasare()
DOEVENTS FORCE
DO AfLog WITH "=== PAS 4: doar Incasare deschis ==="
DO VerificaGeometrie WITH loForm, "pas4_incasare_deschis"
DO HarnessStep WITH 4, 'incasare_deschis', 25
* --- pas 5: (d) AMBELE deschise simultan (incasare ramane deschisa, deschid si alte date) ---
loForm.chk_alte_date.Value = 1
loForm.do_comuta_alte_date()
DOEVENTS FORCE
DO AfLog WITH "=== PAS 5: AMBELE deschise ==="
DO VerificaGeometrie WITH loForm, "pas5_ambele_deschise"
DO HarnessStep WITH 5, 'ambele_deschise', 25
* --- pasii 6-7: redimensionare CU ACORDEOANELE DESCHISE ---
DO AfLog WITH "=== PAS 6-7: redimensionare CU ACORDEOANELE DESCHISE ==="
loForm.WindowState = 0
DOEVENTS FORCE
loForm.Height = loForm.Height - 80
DOEVENTS FORCE
DO AfLog WITH "dupa WindowState=0 + Height-=80 (MICSORARE, acordeoane deschise): This.Height=" + TRANSFORM(loForm.Height) + " This.Width=" + TRANSFORM(loForm.Width)
DO VerificaGeometrie WITH loForm, "pas6_resize_deschis_micsorare", .T.
DO HarnessStep WITH 6, 'dupa_micsorare', 25
loForm.Height = loForm.Height + 380
DOEVENTS FORCE
DO AfLog WITH "dupa Height+=380 (MARIRE peste maximizat initial, acordeoane deschise): This.Height=" + TRANSFORM(loForm.Height) + " This.Width=" + TRANSFORM(loForm.Width)
DO VerificaGeometrie WITH loForm, "pas7_resize_deschis_marire", .T.
DO HarnessStep WITH 7, 'dupa_marire', 25
* revin la maximizat pentru consistenta la Release()
loForm.WindowState = 2
DOEVENTS FORCE
* curatenie obligatorie: inchid ambele, dezaloc chitanta alocata la pasul 4, inainte de Release()
loForm.chk_alte_date.Value = 0
loForm.do_comuta_alte_date()
loForm.chk_incasare.Value = 0
loForm.do_comuta_incasare()
loForm.Release()
RELEASE loForm
DO AfLog WITH "TOTAL asertiuni grid (pas0+3-5): pass=" + TRANSFORM(gnAssertPass) + " fail=" + TRANSFORM(gnAssertFail)
DO AfLog WITH "TOTAL asertiuni totaluri (pas0+3-5): pass=" + TRANSFORM(gnAssertPass2) + " fail=" + TRANSFORM(gnAssertFail2)
DO AfLog WITH "TOTAL asertiuni grid (resize, toate): pass=" + TRANSFORM(gnAssertPassR) + " fail=" + TRANSFORM(gnAssertFailR)
DO AfLog WITH "TOTAL asertiuni totaluri (resize, toate): pass=" + TRANSFORM(gnAssertPass2R) + " fail=" + TRANSFORM(gnAssertFail2R)
DO Final
*----------------------------------------------------------------------------------------
PROCEDURE VerificaGeometrie
* Logheaza Top/Height/Bottom pentru grid + cele 10 controale cerute si verifica
* control.Top >= grd_factura.Top + grd_factura.Height pentru fiecare (control.Height logat,
* dar asertiunea NU cere Bottom-ul controlului, doar Top-ul lui, ca in cerinta primita).
LPARAMETERS toForm, tcEticheta, tlResize
LOCAL lnGTop, lnGHeight, lnGBottom
IF PCOUNT() < 3
tlResize = .F.
ENDIF
lnGTop = toForm.grd_factura.Top
lnGHeight = toForm.grd_factura.Height
lnGBottom = lnGTop + lnGHeight
DO AfLog WITH "GRID [" + tcEticheta + "] Top=" + TRANSFORM(lnGTop) + " Height=" + TRANSFORM(lnGHeight) + " Bottom=" + TRANSFORM(lnGBottom) + " Width=" + TRANSFORM(toForm.grd_factura.Width) + " This.Width=" + TRANSFORM(toForm.Width)
DO VerificaControl WITH toForm.chk_incasare, "chk_incasare", tcEticheta, lnGBottom, tlResize
DO VerificaControl WITH toForm.chk_alte_date, "chk_alte_date", tcEticheta, lnGBottom, tlResize
DO VerificaControl WITH toForm.lb_antet_incasare, "lb_antet_incasare", tcEticheta, lnGBottom, tlResize
DO VerificaControl WITH toForm.lb_antet_alte_date, "lb_antet_alte_date", tcEticheta, lnGBottom, tlResize
DO VerificaControl WITH toForm.ct_document, "ct_document", tcEticheta, lnGBottom, tlResize
DO VerificaControl WITH toForm.ct_contabilitate, "ct_contabilitate", tcEticheta, lnGBottom, tlResize
DO VerificaControl WITH toForm.ct_livrare, "ct_livrare", tcEticheta, lnGBottom, tlResize
DO VerificaControl WITH toForm.ct_incasare, "ct_incasare", tcEticheta, lnGBottom, tlResize
DO VerificaControl WITH toForm.but_cursuri, "but_cursuri", tcEticheta, lnGBottom, tlResize
DO AfLog WITH "RISC3 [" + tcEticheta + "] ct_document.Objects.Count=" + TRANSFORM(toForm.ct_document.Objects.Count) + " ct_document.Visible=" + TRANSFORM(toForm.ct_document.Visible) + " ct_contabilitate.Top=" + TRANSFORM(toForm.ct_contabilitate.Top) + " ct_livrare.Top=" + TRANSFORM(toForm.ct_livrare.Top)
* lb_antet_alte_date.Width e calculat in cod din This.Width (aseaza_alte_date:
* This.lb_antet_alte_date.Width = This.Width - 24 - This.lb_antet_alte_date.Left) - verific ca
* latirea orizontala nu s-a pierdut.
LOCAL lnLatAsteptata, lnLatReala
lnLatReala = toForm.lb_antet_alte_date.Width
lnLatAsteptata = toForm.Width - 24 - toForm.lb_antet_alte_date.Left
DO AfLog WITH "LATIME [" + tcEticheta + "] lb_antet_alte_date.Left=" + TRANSFORM(toForm.lb_antet_alte_date.Left) + " Width=" + TRANSFORM(lnLatReala) + " asteptata(This.Width-24-Left)=" + TRANSFORM(lnLatAsteptata) + " " + IIF(lnLatReala = lnLatAsteptata, "OK", "MISMATCH")
LOCAL lnFormHeight, lnBanda, lnTotalTop
lnFormHeight = toForm.Height
lnBanda = lnFormHeight - 103
lnTotalTop = toForm.lb_total_baza.Top
DO AfLog WITH "S8I [" + tcEticheta + "] This.Height=" + TRANSFORM(lnFormHeight) + " lnBanda(Height-103)=" + TRANSFORM(lnBanda) + " lb_total_baza.Top=" + TRANSFORM(lnTotalTop)
DO VerificaTotaluri WITH toForm.ct_document, "ct_document", tcEticheta, lnTotalTop, tlResize
DO VerificaTotaluri WITH toForm.ct_contabilitate, "ct_contabilitate", tcEticheta, lnTotalTop, tlResize
DO VerificaTotaluri WITH toForm.ct_livrare, "ct_livrare", tcEticheta, lnTotalTop, tlResize
DO VerificaTotaluri WITH toForm.ct_incasare, "ct_incasare", tcEticheta, lnTotalTop, tlResize
ENDPROC
PROCEDURE VerificaTotaluri
* Asertiune control.Top+control.Height <= lb_total_baza.Top, DOAR pentru controale vizibile
* (un container inchis/invizibil nu conteaza pentru suprapunerea cu banda de totaluri).
* tlResize=.T. -> contorizeaza separat (pasii de resize), ca sa nu se amestece cu totalul.
LPARAMETERS toCtrl, tcNume, tcEticheta, tnTotalTop, tlResize
LOCAL lnTop, lnHeight, lnBottom, llVis, llOk
lnTop = toCtrl.Top
lnHeight = toCtrl.Height
lnBottom = lnTop + lnHeight
llVis = IIF(TYPE('toCtrl.Visible') = 'L', toCtrl.Visible, .T.)
IF !llVis
DO AfLog WITH "TOTALURI-SKIP [" + tcEticheta + "] " + tcNume + " invizibil, Bottom=" + TRANSFORM(lnBottom) + " (neasertat)"
RETURN
ENDIF
llOk = (lnBottom <= tnTotalTop)
IF tlResize
IF llOk
gnAssertPass2R = gnAssertPass2R + 1
ELSE
gnAssertFail2R = gnAssertFail2R + 1
ENDIF
ELSE
IF llOk
gnAssertPass2 = gnAssertPass2 + 1
ELSE
gnAssertFail2 = gnAssertFail2 + 1
ENDIF
ENDIF
DO AfLog WITH IIF(llOk, "TOTALURI-PASS", "TOTALURI-FAIL") + " [" + tcEticheta + "] " + tcNume + ".Bottom=" + TRANSFORM(lnBottom) + " (Top=" + TRANSFORM(lnTop) + " Height=" + TRANSFORM(lnHeight) + ") lb_total_baza.Top=" + TRANSFORM(tnTotalTop) + " marja=" + TRANSFORM(tnTotalTop - lnBottom)
ENDPROC
PROCEDURE VerificaControl
* tlResize=.T. -> contorizeaza separat (pasii de resize), ca sa nu se amestece cu totalul.
LPARAMETERS toCtrl, tcNume, tcEticheta, tnGBottom, tlResize
LOCAL lnTop, lnHeight, llVis, llOk
lnTop = toCtrl.Top
lnHeight = toCtrl.Height
llVis = IIF(TYPE('toCtrl.Visible') = 'L', toCtrl.Visible, .T.)
llOk = (lnTop >= tnGBottom)
IF tlResize
IF llOk
gnAssertPassR = gnAssertPassR + 1
ELSE
gnAssertFailR = gnAssertFailR + 1
ENDIF
ELSE
IF llOk
gnAssertPass = gnAssertPass + 1
ELSE
gnAssertFail = gnAssertFail + 1
ENDIF
ENDIF
DO AfLog WITH IIF(llOk, "ASSERT-PASS", "ASSERT-FAIL") + " [" + tcEticheta + "] " + tcNume + ".Top=" + TRANSFORM(lnTop) + " Height=" + TRANSFORM(lnHeight) + " Visible=" + TRANSFORM(llVis) + " (grid.Bottom=" + TRANSFORM(tnGBottom) + ", delta=" + TRANSFORM(lnTop - tnGBottom) + ")"
ENDPROC
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), gcUILog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gnFail = gnFail + 1
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail)
DO AfLog WITH "END " + TTOC(DATETIME())
DO HarnessDone WITH 'done'
QUIT
ENDPROC

View File

@@ -0,0 +1,11 @@
# test_s8_geometrie_ui.ps1 - wrapper peste harness-ul generic (vfp_ui_harness.ps1) pentru
# test_s8_geometrie_ui.prg. Opt pasi: ambele acordeoane inchise, resize cu acordeoanele
# inchise (micsorare+marire), cele 3 stari ramase de acordeon, resize cu acordeoanele
# deschise (micsorare+marire).
$ErrorActionPreference = 'Stop'
$Teste = $PSScriptRoot
& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') `
-TestPrg (Join-Path $Teste 'test_s8_geometrie_ui.prg') `
-Steps @('ambele_inchise','resize_inchis_micsorare','resize_inchis_marire','alte_date_deschis','incasare_deschis','ambele_deschise','dupa_micsorare','dupa_marire') `
-SyncDir (Join-Path $Teste 'uisync_s8_geometrie') `
-ShotsDir (Join-Path $Teste 'screenshots_s8_geometrie')

Some files were not shown because too many files have changed in this diff Show More