#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:
84
utile/Teste/facturare_unificat/check_ordine_cursor_combo.py
Normal file
84
utile/Teste/facturare_unificat/check_ordine_cursor_combo.py
Normal 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()
|
||||
20
utile/Teste/facturare_unificat/date_test_aviz_667.sql.txt
Normal file
20
utile/Teste/facturare_unificat/date_test_aviz_667.sql.txt
Normal 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;
|
||||
24
utile/Teste/facturare_unificat/date_test_aviz_683.sql.txt
Normal file
24
utile/Teste/facturare_unificat/date_test_aviz_683.sql.txt
Normal 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;
|
||||
459
utile/Teste/facturare_unificat/lib_comparatie_documente.prg
Normal file
459
utile/Teste/facturare_unificat/lib_comparatie_documente.prg
Normal 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
|
||||
229
utile/Teste/facturare_unificat/mock_caut_antet.prg
Normal file
229
utile/Teste/facturare_unificat/mock_caut_antet.prg
Normal 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
|
||||
69
utile/Teste/facturare_unificat/mock_cursor_articole.prg
Normal file
69
utile/Teste/facturare_unificat/mock_cursor_articole.prg
Normal 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
|
||||
49
utile/Teste/facturare_unificat/mock_cursor_preturi.prg
Normal file
49
utile/Teste/facturare_unificat/mock_cursor_preturi.prg
Normal 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
|
||||
72
utile/Teste/facturare_unificat/mock_generator_numere.prg
Normal file
72
utile/Teste/facturare_unificat/mock_generator_numere.prg
Normal 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
|
||||
29
utile/Teste/facturare_unificat/mock_validare_antet.prg
Normal file
29
utile/Teste/facturare_unificat/mock_validare_antet.prg
Normal 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
|
||||
58
utile/Teste/facturare_unificat/probe_campuri_crsarticole.prg
Normal file
58
utile/Teste/facturare_unificat/probe_campuri_crsarticole.prg
Normal 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
|
||||
72
utile/Teste/facturare_unificat/probe_emitere_reala.prg
Normal file
72
utile/Teste/facturare_unificat/probe_emitere_reala.prg
Normal 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
|
||||
108
utile/Teste/facturare_unificat/probe_named_notation_odbc.prg
Normal file
108
utile/Teste/facturare_unificat/probe_named_notation_odbc.prg
Normal 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
|
||||
78
utile/Teste/facturare_unificat/probe_run.ps1
Normal file
78
utile/Teste/facturare_unificat/probe_run.ps1
Normal 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."
|
||||
208
utile/Teste/facturare_unificat/probe_s4g_e2e_positional.prg
Normal file
208
utile/Teste/facturare_unificat/probe_s4g_e2e_positional.prg
Normal 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
|
||||
198
utile/Teste/facturare_unificat/probe_s6_3_surse.prg
Normal file
198
utile/Teste/facturare_unificat/probe_s6_3_surse.prg
Normal 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
|
||||
21
utile/Teste/facturare_unificat/probe_s6_3_surse.ps1
Normal file
21
utile/Teste/facturare_unificat/probe_s6_3_surse.ps1
Normal 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" }
|
||||
112
utile/Teste/facturare_unificat/probe_s8_surse.prg
Normal file
112
utile/Teste/facturare_unificat/probe_s8_surse.prg
Normal 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
|
||||
21
utile/Teste/facturare_unificat/probe_s8_surse.ps1
Normal file
21
utile/Teste/facturare_unificat/probe_s8_surse.ps1
Normal 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" }
|
||||
32
utile/Teste/facturare_unificat/probe_stare_finala.prg
Normal file
32
utile/Teste/facturare_unificat/probe_stare_finala.prg
Normal 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
|
||||
378
utile/Teste/facturare_unificat/probe_totaluri.prg
Normal file
378
utile/Teste/facturare_unificat/probe_totaluri.prg
Normal 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
|
||||
19
utile/Teste/facturare_unificat/proceduri_test_args.prg
Normal file
19
utile/Teste/facturare_unificat/proceduri_test_args.prg
Normal 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())
|
||||
32
utile/Teste/facturare_unificat/ruleaza_suita.ps1
Normal file
32
utile/Teste/facturare_unificat/ruleaza_suita.ps1
Normal 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"
|
||||
}
|
||||
445
utile/Teste/facturare_unificat/test_decizia7_plafon_grid.prg
Normal file
445
utile/Teste/facturare_unificat/test_decizia7_plafon_grid.prg
Normal 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
|
||||
145
utile/Teste/facturare_unificat/test_jtva_v2_constatare.prg
Normal file
145
utile/Teste/facturare_unificat/test_jtva_v2_constatare.prg
Normal 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
|
||||
346
utile/Teste/facturare_unificat/test_q8_numar_ars.prg
Normal file
346
utile/Teste/facturare_unificat/test_q8_numar_ars.prg
Normal 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
|
||||
291
utile/Teste/facturare_unificat/test_s13_mesaj_cota_lipsa.prg
Normal file
291
utile/Teste/facturare_unificat/test_s13_mesaj_cota_lipsa.prg
Normal 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
|
||||
534
utile/Teste/facturare_unificat/test_s3_4_cursor_articole.prg
Normal file
534
utile/Teste/facturare_unificat/test_s3_4_cursor_articole.prg
Normal 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
|
||||
503
utile/Teste/facturare_unificat/test_s3_4b_incarca_articole.prg
Normal file
503
utile/Teste/facturare_unificat/test_s3_4b_incarca_articole.prg
Normal 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
|
||||
199
utile/Teste/facturare_unificat/test_s3_controale.prg
Normal file
199
utile/Teste/facturare_unificat/test_s3_controale.prg
Normal 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
|
||||
401
utile/Teste/facturare_unificat/test_s3_do_cauta.prg
Normal file
401
utile/Teste/facturare_unificat/test_s3_do_cauta.prg
Normal 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
|
||||
351
utile/Teste/facturare_unificat/test_s3_init_antet.prg
Normal file
351
utile/Teste/facturare_unificat/test_s3_init_antet.prg
Normal 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
|
||||
162
utile/Teste/facturare_unificat/test_s3_neregresie_vechi.prg
Normal file
162
utile/Teste/facturare_unificat/test_s3_neregresie_vechi.prg
Normal 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
|
||||
362
utile/Teste/facturare_unificat/test_s3_tipdoc.prg
Normal file
362
utile/Teste/facturare_unificat/test_s3_tipdoc.prg
Normal 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
|
||||
|
||||
237
utile/Teste/facturare_unificat/test_s3_tipdoc_ui.prg
Normal file
237
utile/Teste/facturare_unificat/test_s3_tipdoc_ui.prg
Normal 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
|
||||
12
utile/Teste/facturare_unificat/test_s3_tipdoc_ui.ps1
Normal file
12
utile/Teste/facturare_unificat/test_s3_tipdoc_ui.ps1
Normal 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')
|
||||
343
utile/Teste/facturare_unificat/test_s3_validare_antet.prg
Normal file
343
utile/Teste/facturare_unificat/test_s3_validare_antet.prg
Normal 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
|
||||
342
utile/Teste/facturare_unificat/test_s3b_dupa_ui.prg
Normal file
342
utile/Teste/facturare_unificat/test_s3b_dupa_ui.prg
Normal 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
|
||||
12
utile/Teste/facturare_unificat/test_s3b_dupa_ui.ps1
Normal file
12
utile/Teste/facturare_unificat/test_s3b_dupa_ui.ps1
Normal 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')
|
||||
807
utile/Teste/facturare_unificat/test_s3b_emitere_paritate_2.prg
Normal file
807
utile/Teste/facturare_unificat/test_s3b_emitere_paritate_2.prg
Normal 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
|
||||
@@ -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"
|
||||
}
|
||||
698
utile/Teste/facturare_unificat/test_s3b_emitere_reala.prg
Normal file
698
utile/Teste/facturare_unificat/test_s3b_emitere_reala.prg
Normal 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
|
||||
28
utile/Teste/facturare_unificat/test_s3b_emitere_reala.ps1
Normal file
28
utile/Teste/facturare_unificat/test_s3b_emitere_reala.ps1
Normal 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"
|
||||
}
|
||||
323
utile/Teste/facturare_unificat/test_s3b_incasare_nealocare.prg
Normal file
323
utile/Teste/facturare_unificat/test_s3b_incasare_nealocare.prg
Normal 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
|
||||
@@ -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
|
||||
590
utile/Teste/facturare_unificat/test_s3b_paritate_emitere.prg
Normal file
590
utile/Teste/facturare_unificat/test_s3b_paritate_emitere.prg
Normal file
@@ -0,0 +1,590 @@
|
||||
* test_s3b_paritate_emitere.prg
|
||||
* Headless: criteriul 1 de "gata" din docs\cercetare\s3b_alte_date_analitice.md sectiunea 10 -
|
||||
* paritate de EMITERE intre calea veche (frm_alte_date, dialogul modal creat de
|
||||
* frm_facturare_articole.inainte_de_do_termin, ofacturare.vc2:14923) si formularul unificat
|
||||
* (frm_facturare_articole2, care are grupul de incasare inline), pe toate patru tipurile de
|
||||
* incasare: 1=Fara incasare, 2=Chitanta, 3=Bon fiscal, 4=POS Card.
|
||||
*
|
||||
* Se compara doua marimi, cerute explicit de criteriu:
|
||||
* (a) numarul alocat -> poDate.nr_incasare, scris de actualizeaza_tipincasare (ramurile 1/2:
|
||||
* nr_incasare=0; ramura 3: do_aloca_nr_bon; ramura 4: do_aloca_nr_pos) si de ControlSource-ul
|
||||
* clb_nrchit.text_simplu1 ("poDate.nr_incasare", ofacturare.vc2:16558 /
|
||||
* ferestre_cere_date.vc2:2490);
|
||||
* (b) lcListaIncasare - stringul asamblat in do_scrie_factura inainte de scrie_factura2
|
||||
* (ofacturare.vc2:14227-14253 pentru calea veche, 19967-19993 pentru cea noua).
|
||||
*
|
||||
* De ce lcListaIncasare se calculeaza cu o REPLICA, nu prin apelul codului real:
|
||||
* lcListaIncasare e o variabila LOCAL in do_scrie_factura, iar do_scrie_factura EMITE documentul
|
||||
* (scrie in Oracle). Testul nu are voie sa emita. In loc de asta:
|
||||
* - blocul de asamblare din cele doua do_scrie_factura e comparat CA TEXT, in test, si trebuie sa
|
||||
* fie identic (assert dedicat);
|
||||
* - replica din acest fisier (intre marcajele REPLICA-LISTA) e comparata CA TEXT cu blocul din
|
||||
* sursa, dupa normalizare (fara comentarii && , fara spatii de indentare, fara linii goale) -
|
||||
* assert dedicat. Daca sursa se schimba si replica nu, testul cade.
|
||||
* La fel pentru pasul de emitere dinaintea lui do_scrie_factura: poDate.ntip_incasare se calculeaza
|
||||
* din opt_incasat.Value cu aceeasi expresie pe ambele cai (ferestre_cere_date.vc2:3067 in
|
||||
* frm_alte_date.inainte_de_do_termin, ofacturare.vc2:20673 in
|
||||
* frm_facturare_articole2.inainte_de_do_termin) - cele doua linii sunt comparate ca text.
|
||||
* Comutarea POS (incasatCARD = incasat; incasat = 0) e ferestre_cere_date.vc2:3100-3104 respectiv
|
||||
* ofacturare.vc2:20680-20683 - aceleasi doua atribuiri, sub garzi echivalente (plReturn / gnButon).
|
||||
*
|
||||
* SECVENTIAL, nu simultan: frm_alte_date e creata, parcursa pe toate patru tipurile si eliberata
|
||||
* COMPLET inainte sa existe frm_facturare_articole2. Ambele forme au propriul cboTipFactura cu
|
||||
* RowSource identic ("... into cursor cTipFacturaX", ofacturare.vc2:16157 si
|
||||
* ferestre_cere_date.vc2:2388), reevaluat la fiecare actualizeaza_tipincasare - doua forme vii
|
||||
* simultan se bat pe acelasi nume de cursor. Acelasi poDate pentru ambele faze, cu starea
|
||||
* restaurata explicit intre faze.
|
||||
*
|
||||
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3b_paritate_emitere.prg"
|
||||
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3b_paritate_emitere.log
|
||||
|
||||
SET SAFETY OFF
|
||||
SET TALK OFF
|
||||
SET NOTIFY OFF
|
||||
PUBLIC gcLog, gnFail, gnPass, gcSursaNou, gcSursaVechi, gcAcestFisier, glPOSDisponibil
|
||||
glPOSDisponibil = .F.
|
||||
gcAcestFisier = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3b_paritate_emitere.prg"
|
||||
gcSursaNou = "D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2"
|
||||
gcSursaVechi = "D:\ROA\ROAFACTURARE\COMUN\clase\ferestre_cere_date.vc2"
|
||||
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3b_paritate_emitere.log"
|
||||
IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out")
|
||||
MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out"
|
||||
ENDIF
|
||||
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog)
|
||||
gnFail = 0
|
||||
gnPass = 0
|
||||
ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
|
||||
|
||||
DO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
|
||||
IF TYPE('gnHandle') <> 'N' OR gnHandle <= 0
|
||||
DO AfLog WITH "FAIL: conexiune Oracle esuata"
|
||||
DO Final
|
||||
ENDIF
|
||||
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE
|
||||
PUBLIC gcMockUltimMesaj, gnMockUltimTip
|
||||
gcMockUltimMesaj = ""
|
||||
gnMockUltimTip = 0
|
||||
DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna)
|
||||
IF !actualizeaza_optiuni_program()
|
||||
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
|
||||
DO Final
|
||||
ENDIF
|
||||
gnScadereStoc = 0
|
||||
gnIdUtil = 8
|
||||
* singura plaja pentru tipul 26 e legata de sucursala 167; mediul lasa gnIdSucursala pe 110 (sau
|
||||
* null), iar filtrul NVL(id_sucursala,-99) IN (v_id_sucursala,-99) din pack_serii_numere nu o prinde
|
||||
gnIdSucursala = 167
|
||||
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
|
||||
DO AfLog WITH "gnScadereStoc=" + TRANSFORM(gnScadereStoc) + " gnPc=" + TRANSFORM(gnPc) + ;
|
||||
" gnIdUtil=" + TRANSFORM(gnIdUtil) + " gnIdSucursala=" + TRANSFORM(gnIdSucursala)
|
||||
|
||||
* fara asta, un lacat pe plajele de serii blocheaza rularea la infinit, invizibil in log
|
||||
SQLSETPROP(gnHandle, "QueryTimeOut", 45)
|
||||
IF TYPE('goExecutor.nHandle') = 'N' AND goExecutor.nHandle > 0 AND goExecutor.nHandle <> gnHandle
|
||||
SQLSETPROP(goExecutor.nHandle, "QueryTimeOut", 45)
|
||||
ENDIF
|
||||
DO AfLog WITH "QueryTimeOut gnHandle=" + TRANSFORM(SQLGETPROP(gnHandle, "QueryTimeOut")) + ;
|
||||
" goExecutor.nHandle=" + TRANSFORM(goExecutor.nHandle)
|
||||
|
||||
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
|
||||
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
|
||||
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE
|
||||
|
||||
IF USED('crscursuri')
|
||||
USE IN crscursuri
|
||||
ENDIF
|
||||
CREATE CURSOR crscursuri (curs N(12,4), nume_val C(10), multiplicator N(6))
|
||||
DO creeaza_facturacrs WITH 'crsfactura'
|
||||
SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE
|
||||
USE IN crsfactura
|
||||
SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE
|
||||
USE IN crsfact_tmp
|
||||
|
||||
DO ProbaTextSursa
|
||||
DO ProbaParitateEmitere
|
||||
|
||||
DO Final
|
||||
|
||||
*=====================================================================================
|
||||
* Partea 1 - aserturile pe TEXTUL sursei: cele doua cai asambleaza identic, si replica
|
||||
* din acest fisier e identica cu sursa.
|
||||
*=====================================================================================
|
||||
PROCEDURE ProbaTextSursa
|
||||
LOCAL lcAncora, lnCate, i
|
||||
LOCAL ARRAY laSursa[1], laPoz[1]
|
||||
|
||||
IF !FILE(gcSursaNou)
|
||||
DO Assert WITH .F., "sursa " + gcSursaNou + " exista"
|
||||
RETURN
|
||||
ENDIF
|
||||
lnCate = ALINES(laSursa, FILETOSTR(gcSursaNou), 0)
|
||||
DO AfLog WITH "ofacturare.vc2: " + TRANSFORM(lnCate) + " linii"
|
||||
|
||||
* blocul de asamblare incepe cu acest If si tine pana la Endif-ul de dupa lcListaIncasare = [NULL]
|
||||
lcAncora = "IF INLIST(PODATE.NTIP_INCASARE, 11, 2, 3)"
|
||||
DIMENSION laPoz[2]
|
||||
laPoz[1] = 0
|
||||
laPoz[2] = 0
|
||||
LOCAL lnGasit
|
||||
lnGasit = 0
|
||||
FOR i = 1 TO lnCate
|
||||
IF UPPER(NormalizeazaLinie(laSursa[i])) == lcAncora
|
||||
lnGasit = lnGasit + 1
|
||||
IF lnGasit <= 2
|
||||
laPoz[lnGasit] = i
|
||||
ENDIF
|
||||
ENDIF
|
||||
ENDFOR
|
||||
DO AfLog WITH "ancora blocului de asamblare gasita de " + TRANSFORM(lnGasit) + " ori, la liniile " + ;
|
||||
TRANSFORM(laPoz[1]) + " si " + TRANSFORM(laPoz[2])
|
||||
DO Assert WITH lnGasit = 2, "blocul lcListaIncasare apare exact de doua ori in ofacturare.vc2 (calea veche + calea noua)"
|
||||
IF lnGasit <> 2
|
||||
RETURN
|
||||
ENDIF
|
||||
|
||||
LOCAL lcA, lcB, lcRep
|
||||
lcA = ExtrageBloc(gcSursaNou, laPoz[1], 30)
|
||||
lcB = ExtrageBloc(gcSursaNou, laPoz[2], 30)
|
||||
DO AfLog WITH "bloc vechi (ofacturare.vc2:" + TRANSFORM(laPoz[1]) + ") normalizat, " + TRANSFORM(LEN(lcA)) + " octeti"
|
||||
DO AfLog WITH "bloc nou (ofacturare.vc2:" + TRANSFORM(laPoz[2]) + ") normalizat, " + TRANSFORM(LEN(lcB)) + " octeti"
|
||||
DO Assert WITH lcA == lcB, "asamblarea lcListaIncasare e identica in do_scrie_factura al celor doua cai"
|
||||
IF !(lcA == lcB)
|
||||
DO AfLog WITH "vechi=[" + lcA + "]"
|
||||
DO AfLog WITH "nou =[" + lcB + "]"
|
||||
ENDIF
|
||||
|
||||
* replica din acest fisier, intre marcaje, trebuie sa fie aceeasi bucata de cod
|
||||
lcRep = ExtrageIntreMarcaje(gcAcestFisier, "*--REPLICA-LISTA-START--*", "*--REPLICA-LISTA-END--*")
|
||||
DO AfLog WITH "replica din test normalizata, " + TRANSFORM(LEN(lcRep)) + " octeti"
|
||||
DO Assert WITH lcRep == lcB, "replica ListaIncasare() din test e identica cu blocul din sursa"
|
||||
IF !(lcRep == lcB)
|
||||
DO AfLog WITH "replica=[" + lcRep + "]"
|
||||
DO AfLog WITH "sursa =[" + lcB + "]"
|
||||
ENDIF
|
||||
|
||||
* linia care calculeaza ntip_incasare din opt_incasat.Value, pe ambele cai
|
||||
LOCAL lcNtipNou, lcNtipVechi, lcNtipVechiNorm
|
||||
lcNtipNou = CautaLinie(gcSursaNou, "PODATE.NTIP_INCASARE = IIF(")
|
||||
lcNtipVechi = CautaLinie(gcSursaVechi, "PODATE.NTIP_INCASARE = IIF(")
|
||||
* calea noua citeste modul de incasare prin nmod_incasare(), nu direct opt_incasat.Value (container ct_incasare)
|
||||
lcNtipVechiNorm = STRTRAN(lcNtipVechi, "THISFORM.OPT_INCASAT.VALUE", "THISFORM.NMOD_INCASARE()")
|
||||
DO AfLog WITH "ntip nou =[" + lcNtipNou + "]"
|
||||
DO AfLog WITH "ntip vechi =[" + lcNtipVechi + "] normalizat=[" + lcNtipVechiNorm + "]"
|
||||
DO Assert WITH !EMPTY(lcNtipNou) AND lcNtipNou == lcNtipVechiNorm, ;
|
||||
"expresia poDate.ntip_incasare = Iif(opt_incasat.Value...) e identica pe ambele cai"
|
||||
ENDPROC
|
||||
|
||||
*=====================================================================================
|
||||
* Partea 2 - proba de runtime, pe cele doua forme, secvential
|
||||
*=====================================================================================
|
||||
PROCEDURE ProbaParitateEmitere
|
||||
PRIVATE poDate, poGeneratorNumere, loVechi, loNou, i
|
||||
LOCAL laTip[4], laNume[4], laVechi[4,4], laNou[4,4]
|
||||
laTip[1] = 1
|
||||
laTip[2] = 2
|
||||
laTip[3] = 3
|
||||
laTip[4] = 4
|
||||
laNume[1] = "Fara incasare"
|
||||
laNume[2] = "Chitanta"
|
||||
laNume[3] = "Bon fiscal"
|
||||
laNume[4] = "POS Card"
|
||||
|
||||
poDate = CREATEOBJECT("oDateFactura", 25000, 1)
|
||||
poDate.nIdTipDoc = 5
|
||||
poDate.totalctva = 1000
|
||||
DO AfLog WITH "poDate.tip=" + TRANSFORM(poDate.tip) + " poDate.eProforma=" + TRANSFORM(poDate.eProforma) + ;
|
||||
" poDate.incasat=" + TRANSFORM(poDate.incasat) + " poDate.nract=" + TRANSFORM(poDate.nract)
|
||||
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
|
||||
poGeneratorNumere.ResetNumere()
|
||||
DO ProbaSerii WITH poDate.nIdTipDoc
|
||||
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
|
||||
|
||||
* tipul 26 (POS/card) nu are plaje in acest mediu la fiecare rulare; fara pre-proba,
|
||||
* do_aloca_nr_pos blocheaza rularea in interiorul apelului Oracle, fara nimic in log
|
||||
LOCAL lnRandPOS
|
||||
lnRandPOS = RanduriSerii(26)
|
||||
glPOSDisponibil = (lnRandPOS > 0)
|
||||
DO AfLog WITH "pre-proba plaje: tip 3 randuri=" + TRANSFORM(RanduriSerii(3)) + ;
|
||||
" tip 16 randuri=" + TRANSFORM(RanduriSerii(16)) + " tip 26 randuri=" + TRANSFORM(lnRandPOS) + ;
|
||||
" -> POS " + IIF(glPOSDisponibil, "probabil", "NEPROBABIL in acest mediu")
|
||||
|
||||
LOCAL lnStartIncasat, lnStartCard, lnStartTichete, lnStartCasa, lnStartTipInc, lnStartNrInc, lnStartPos
|
||||
lnStartIncasat = poDate.incasat
|
||||
lnStartCard = poDate.incasatCARD
|
||||
lnStartTichete = poDate.incasatTichete
|
||||
lnStartCasa = poDate.id_casa
|
||||
lnStartTipInc = poDate.ntip_incasare
|
||||
lnStartNrInc = poDate.nr_incasare
|
||||
lnStartPos = poDate.nIncasatPos
|
||||
DO AfLog WITH "stare start poDate: incasat=" + TRANSFORM(lnStartIncasat) + " incasatCARD=" + TRANSFORM(lnStartCard) + ;
|
||||
" incasatTichete=" + TRANSFORM(lnStartTichete) + " id_casa=" + TRANSFORM(lnStartCasa) + ;
|
||||
" ntip_incasare=" + TRANSFORM(lnStartTipInc) + " nr_incasare=" + TRANSFORM(lnStartNrInc) + ;
|
||||
" nIncasatPos=" + TRANSFORM(lnStartPos)
|
||||
|
||||
LOCAL lnTip, lcNumeTip
|
||||
|
||||
* ---------- FAZA 1: calea veche - frm_alte_date ----------
|
||||
DO AsiguraSaftTipFacturi
|
||||
loVechi = CREATEOBJECT('frm_alte_date')
|
||||
DO Assert WITH VARTYPE(loVechi) = 'O', "Createobject frm_alte_date (calea veche)"
|
||||
IF VARTYPE(loVechi) <> 'O'
|
||||
RETURN
|
||||
ENDIF
|
||||
loVechi.Visible = .F.
|
||||
loVechi.nnrbon = poDate.nract
|
||||
|
||||
FOR i = 1 TO 4
|
||||
lnTip = laTip[i]
|
||||
lcNumeTip = laNume[i]
|
||||
IF lnTip = 4 AND !glPOSDisponibil
|
||||
DO AfLog WITH "vechi [" + lcNumeTip + "]: SARIT - nu exista plaje de serii pentru tipul 26 in acest mediu"
|
||||
LOOP
|
||||
ENDIF
|
||||
loVechi.opt_incasat.Value = lnTip
|
||||
DO AfLog WITH "vechi [" + lcNumeTip + "]: dupa opt_incasat.Value=" + TRANSFORM(lnTip) + ;
|
||||
" nr_incasare=" + TRANSFORM(poDate.nr_incasare) + " incasat=" + TRANSFORM(poDate.incasat) + ;
|
||||
" incasatCARD=" + TRANSFORM(poDate.incasatCARD) + " id_casa=" + TRANSFORM(poDate.id_casa) + ;
|
||||
" nIncasatPos=" + TRANSFORM(poDate.nIncasatPos) + " nnrbon=" + TRANSFORM(loVechi.nnrbon) + ;
|
||||
" numere=" + StareToate()
|
||||
laVechi[i,1] = poDate.nr_incasare
|
||||
DO AplicaTermin WITH loVechi.opt_incasat.Value
|
||||
laVechi[i,2] = poDate.ntip_incasare
|
||||
laVechi[i,3] = ListaIncasare()
|
||||
laVechi[i,4] = "incasat=" + TRANSFORM(poDate.incasat) + "|card=" + TRANSFORM(poDate.incasatCARD) + ;
|
||||
"|tichete=" + TRANSFORM(poDate.incasatTichete) + "|casa=" + TRANSFORM(poDate.id_casa)
|
||||
DO AfLog WITH "vechi [" + lcNumeTip + "]: dupa emitere ntip_incasare=" + TRANSFORM(laVechi[i,2]) + ;
|
||||
" nr_incasare=" + TRANSFORM(laVechi[i,1]) + " campuri=" + laVechi[i,4]
|
||||
DO AfLog WITH "vechi [" + lcNumeTip + "]: lcListaIncasare=[" + laVechi[i,3] + "]"
|
||||
|
||||
* dezaloca si readu campurile la starea de start, ca tipul urmator sa porneasca identic
|
||||
loVechi.opt_incasat.Value = 1
|
||||
poDate.incasatCARD = lnStartCard
|
||||
poDate.incasatTichete = lnStartTichete
|
||||
DO AfLog WITH "vechi [" + lcNumeTip + "]: dezalocat, numere=" + StareToate()
|
||||
DO Assert WITH !EsteAlocat(3) AND !EsteAlocat(16) AND !EsteAlocat(26), ;
|
||||
"vechi [" + lcNumeTip + "] nimic alocat dupa comutarea inapoi pe Fara incasare (" + StareToate() + ")"
|
||||
ENDFOR
|
||||
|
||||
loVechi.Release()
|
||||
RELEASE loVechi
|
||||
DO AfLog WITH "dupa Release loVechi: USED('saft_tip_facturi')=" + TRANSFORM(USED('saft_tip_facturi')) + ;
|
||||
" USED('cTipFacturaX')=" + TRANSFORM(USED('cTipFacturaX'))
|
||||
|
||||
poDate.incasat = lnStartIncasat
|
||||
poDate.incasatCARD = lnStartCard
|
||||
poDate.incasatTichete = lnStartTichete
|
||||
poDate.id_casa = lnStartCasa
|
||||
poDate.ntip_incasare = lnStartTipInc
|
||||
poDate.nr_incasare = lnStartNrInc
|
||||
poDate.nIncasatPos = lnStartPos
|
||||
DO AfLog WITH "poDate resetat inainte de faza 2: incasat=" + TRANSFORM(poDate.incasat) + ;
|
||||
" nr_incasare=" + TRANSFORM(poDate.nr_incasare) + " numere=" + StareToate()
|
||||
|
||||
* ---------- FAZA 2: calea noua - frm_facturare_articole2 ----------
|
||||
DO AsiguraSaftTipFacturi
|
||||
loNou = CREATEOBJECT('frm_facturare_articole2')
|
||||
DO Assert WITH VARTYPE(loNou) = 'O', "Createobject frm_facturare_articole2 (calea noua)"
|
||||
IF VARTYPE(loNou) <> 'O'
|
||||
RETURN
|
||||
ENDIF
|
||||
loNou.Visible = .F.
|
||||
loNou.nnrbon = poDate.nract
|
||||
|
||||
FOR i = 1 TO 4
|
||||
lnTip = laTip[i]
|
||||
lcNumeTip = laNume[i]
|
||||
IF lnTip = 4 AND !glPOSDisponibil
|
||||
DO AfLog WITH "nou [" + lcNumeTip + "]: SARIT - nu exista plaje de serii pentru tipul 26 in acest mediu"
|
||||
LOOP
|
||||
ENDIF
|
||||
loNou.seteaza_mod_incasare(lnTip)
|
||||
DO Assert WITH loNou.nmod_incasare() = lnTip, "[" + lcNumeTip + "] nmod_incasare() reflecta seteaza_mod_incasare(" + TRANSFORM(lnTip) + ")"
|
||||
DO AfLog WITH "nou [" + lcNumeTip + "]: dupa opt_incasat.Value=" + TRANSFORM(lnTip) + ;
|
||||
" nr_incasare=" + TRANSFORM(poDate.nr_incasare) + " incasat=" + TRANSFORM(poDate.incasat) + ;
|
||||
" incasatCARD=" + TRANSFORM(poDate.incasatCARD) + " id_casa=" + TRANSFORM(poDate.id_casa) + ;
|
||||
" nIncasatPos=" + TRANSFORM(poDate.nIncasatPos) + " nnrbon=" + TRANSFORM(loNou.nnrbon) + ;
|
||||
" numere=" + StareToate()
|
||||
laNou[i,1] = poDate.nr_incasare
|
||||
DO AplicaTermin WITH loNou.nmod_incasare()
|
||||
laNou[i,2] = poDate.ntip_incasare
|
||||
laNou[i,3] = ListaIncasare()
|
||||
laNou[i,4] = "incasat=" + TRANSFORM(poDate.incasat) + "|card=" + TRANSFORM(poDate.incasatCARD) + ;
|
||||
"|tichete=" + TRANSFORM(poDate.incasatTichete) + "|casa=" + TRANSFORM(poDate.id_casa)
|
||||
DO AfLog WITH "nou [" + lcNumeTip + "]: dupa emitere ntip_incasare=" + TRANSFORM(laNou[i,2]) + ;
|
||||
" nr_incasare=" + TRANSFORM(laNou[i,1]) + " campuri=" + laNou[i,4]
|
||||
DO AfLog WITH "nou [" + lcNumeTip + "]: lcListaIncasare=[" + laNou[i,3] + "]"
|
||||
|
||||
DO Assert WITH laNou[i,1] = laVechi[i,1], "[" + lcNumeTip + "] poDate.nr_incasare identic (vechi=" + ;
|
||||
TRANSFORM(laVechi[i,1]) + " nou=" + TRANSFORM(laNou[i,1]) + ")"
|
||||
DO Assert WITH laNou[i,3] == laVechi[i,3], "[" + lcNumeTip + "] lcListaIncasare identic (vechi=[" + ;
|
||||
laVechi[i,3] + "] nou=[" + laNou[i,3] + "])"
|
||||
DO Assert WITH laNou[i,2] = laVechi[i,2], "[" + lcNumeTip + "] poDate.ntip_incasare identic (vechi=" + ;
|
||||
TRANSFORM(laVechi[i,2]) + " nou=" + TRANSFORM(laNou[i,2]) + ")"
|
||||
DO Assert WITH laNou[i,4] == laVechi[i,4], "[" + lcNumeTip + "] campurile care intra in lcListaIncasare identice (vechi=" + ;
|
||||
laVechi[i,4] + " nou=" + laNou[i,4] + ")"
|
||||
|
||||
loNou.seteaza_mod_incasare(1)
|
||||
DO Assert WITH loNou.nmod_incasare() = 1, "[" + lcNumeTip + "] nmod_incasare() reflecta seteaza_mod_incasare(1) (dezalocare)"
|
||||
loNou.actualizeaza_tipincasare()
|
||||
poDate.incasatCARD = lnStartCard
|
||||
poDate.incasatTichete = lnStartTichete
|
||||
DO AfLog WITH "nou [" + lcNumeTip + "]: dezalocat, numere=" + StareToate()
|
||||
DO Assert WITH !EsteAlocat(3) AND !EsteAlocat(16) AND !EsteAlocat(26), ;
|
||||
"nou [" + lcNumeTip + "] nimic alocat dupa comutarea inapoi pe Fara incasare (" + StareToate() + ")"
|
||||
ENDFOR
|
||||
|
||||
DO AfLog WITH "stare finala numere (asteptat nimic alocat): " + StareToate()
|
||||
DO Assert WITH !EsteAlocat(3) AND !EsteAlocat(16) AND !EsteAlocat(26), "nimic ramas alocat la finalul rularii"
|
||||
|
||||
loNou.Release()
|
||||
RELEASE loNou
|
||||
ENDPROC
|
||||
|
||||
* Pasul de emitere dinaintea lui do_scrie_factura, comun celor doua cai:
|
||||
* ferestre_cere_date.vc2:3067 + 3100-3104 (frm_alte_date.inainte_de_do_termin)
|
||||
* ofacturare.vc2:20673 + 20680-20683 (frm_facturare_articole2.inainte_de_do_termin)
|
||||
PROCEDURE AplicaTermin
|
||||
LPARAMETERS tnValoareOpt
|
||||
poDate.ntip_incasare = Iif(tnValoareOpt=2, 11, IIF(tnValoareOpt = 3, 2, IIF(tnValoareOpt = 4, 3, 0)))
|
||||
IF poDate.nIncasatPos = 1
|
||||
poDate.incasatCARD = poDate.incasat
|
||||
poDate.incasat = 0
|
||||
ENDIF
|
||||
ENDPROC
|
||||
|
||||
* Replica blocului din do_scrie_factura. Corpul dintre marcaje e comparat ca text cu sursa
|
||||
* (ProbaTextSursa) - nu edita aici fara sa verifici sursa.
|
||||
FUNCTION ListaIncasare
|
||||
LOCAL lcListaIncasare
|
||||
lcListaIncasare = ''
|
||||
*--REPLICA-LISTA-START--*
|
||||
If Inlist(poDate.ntip_incasare, 11, 2, 3)
|
||||
Do Case
|
||||
Case poDate.ntip_incasare = 11
|
||||
If poDate.incasat <> 0
|
||||
lcListaIncasare = lcListaIncasare + ['11|] + Alltrim(Str(poDate.incasat,18,gnPc)) + [|] + Alltrim(Str(poDate.id_casa)) + [;']
|
||||
Endif
|
||||
Case poDate.ntip_incasare = 3
|
||||
If poDate.incasatCARD <> 0
|
||||
lcListaIncasare = lcListaIncasare + ['3|] + Alltrim(Str(poDate.incasatCARD,18,gnPc)) + [|] + Alltrim(Str(poDate.id_casa)) + [;']
|
||||
Endif
|
||||
Otherwise
|
||||
If poDate.incasat <> 0
|
||||
lcListaIncasare = lcListaIncasare + ['2|] + Alltrim(Str(poDate.incasat,18,gnPc)) + [|] + Alltrim(Str(poDate.id_casa)) + [;']
|
||||
Endif
|
||||
|
||||
If poDate.incasatCARD <> 0
|
||||
lcListaIncasare = lcListaIncasare + ['3|] + Alltrim(Str(poDate.incasatCARD,18,gnPc)) + [|] + Alltrim(Str(poDate.id_casa)) + [;']
|
||||
Endif
|
||||
|
||||
If poDate.incasatTichete <> 0
|
||||
lcListaIncasare = lcListaIncasare + ['5|] + Alltrim(Str(poDate.incasatTichete,18,gnPc)) + [|] + Alltrim(Str(poDate.id_casa)) + [;']
|
||||
Endif
|
||||
Endcase
|
||||
If Empty(m.lcListaIncasare)
|
||||
lcListaIncasare = [NULL]
|
||||
Endif
|
||||
|
||||
Else
|
||||
lcListaIncasare = [NULL]
|
||||
Endif
|
||||
*--REPLICA-LISTA-END--*
|
||||
RETURN lcListaIncasare
|
||||
ENDFUNC
|
||||
|
||||
*=====================================================================================
|
||||
* Ajutoare de text
|
||||
*=====================================================================================
|
||||
* taie comentariul && , spatiile de la capete si tab-urile de indentare
|
||||
FUNCTION NormalizeazaLinie
|
||||
LPARAMETERS tcLinie
|
||||
LOCAL lcL, lnP
|
||||
* marcajul de comentariu se construieste din CHR(38): scris literal, compilatorul VFP il ia
|
||||
* drept inceput de comentariu si taie restul liniei, chiar si intre ghilimele
|
||||
lcL = CHRTRAN(tcLinie, CHR(9), " ")
|
||||
lnP = AT(CHR(38) + CHR(38), lcL)
|
||||
IF lnP > 0
|
||||
lcL = LEFT(lcL, lnP - 1)
|
||||
ENDIF
|
||||
RETURN ALLTRIM(lcL)
|
||||
ENDFUNC
|
||||
|
||||
* concateneaza tnCate linii din fisier incepand de la tnStart, normalizate si fara linii goale
|
||||
FUNCTION ExtrageBloc
|
||||
LPARAMETERS tcFisier, tnStart, tnCate
|
||||
LOCAL lcRez, i, lcL, lnCate
|
||||
LOCAL ARRAY laF[1]
|
||||
lcRez = ""
|
||||
lnCate = ALINES(laF, FILETOSTR(tcFisier), 0)
|
||||
FOR i = tnStart TO MIN(tnStart + tnCate - 1, lnCate)
|
||||
lcL = UPPER(NormalizeazaLinie(laF[i]))
|
||||
IF !EMPTY(lcL)
|
||||
lcRez = lcRez + lcL + CHR(10)
|
||||
ENDIF
|
||||
ENDFOR
|
||||
RETURN lcRez
|
||||
ENDFUNC
|
||||
|
||||
* extrage din fisier liniile dintre cele doua marcaje, normalizate, fara linii goale
|
||||
FUNCTION ExtrageIntreMarcaje
|
||||
LPARAMETERS tcFisier, tcStart, tcStop
|
||||
LOCAL lcRez, i, lnCate, llIn, lcL
|
||||
LOCAL ARRAY laF[1]
|
||||
lcRez = ""
|
||||
llIn = .F.
|
||||
lnCate = ALINES(laF, FILETOSTR(tcFisier), 0)
|
||||
FOR i = 1 TO lnCate
|
||||
lcL = ALLTRIM(CHRTRAN(laF[i], CHR(9), " "))
|
||||
IF lcL == tcStop
|
||||
EXIT
|
||||
ENDIF
|
||||
IF llIn
|
||||
lcL = UPPER(NormalizeazaLinie(laF[i]))
|
||||
IF !EMPTY(lcL)
|
||||
lcRez = lcRez + lcL + CHR(10)
|
||||
ENDIF
|
||||
ENDIF
|
||||
IF lcL == tcStart
|
||||
llIn = .T.
|
||||
ENDIF
|
||||
ENDFOR
|
||||
RETURN lcRez
|
||||
ENDFUNC
|
||||
|
||||
* prima linie normalizata (majuscule) care contine tcFragment
|
||||
FUNCTION CautaLinie
|
||||
LPARAMETERS tcFisier, tcFragment
|
||||
LOCAL i, lnCate, lcL
|
||||
LOCAL ARRAY laF[1]
|
||||
lnCate = ALINES(laF, FILETOSTR(tcFisier), 0)
|
||||
FOR i = 1 TO lnCate
|
||||
lcL = UPPER(NormalizeazaLinie(laF[i]))
|
||||
IF tcFragment $ lcL
|
||||
RETURN lcL
|
||||
ENDIF
|
||||
ENDFOR
|
||||
RETURN ""
|
||||
ENDFUNC
|
||||
|
||||
*=====================================================================================
|
||||
* Ajutoare de mediu, preluate din test_s3b_incasare_paritate_campuri.prg
|
||||
*=====================================================================================
|
||||
PROCEDURE AsiguraSaftTipFacturi
|
||||
* cboTipFactura (RowSourceType=3) citeste cursorul local saft_tip_facturi ca pe un tabel la
|
||||
* instantiere (ofacturare.vc2:16157, ferestre_cere_date.vc2:2388). Structura copiata din
|
||||
* update_saft_tip_facturi (updateserver.prg:669-691), fara apel la server.
|
||||
IF !USED('saft_tip_facturi')
|
||||
CREATE CURSOR saft_tip_facturi (cod N(3) NULL, tip_saftname C(200) NULL)
|
||||
INSERT INTO saft_tip_facturi (cod, tip_saftname) VALUES (NULL, '')
|
||||
INDEX ON cod TAG cod
|
||||
ENDIF
|
||||
ENDPROC
|
||||
|
||||
FUNCTION EsteAlocat
|
||||
LPARAMETERS tnTip
|
||||
LOCAL lcCursor
|
||||
IF poGeneratorNumere.paPlaje(tnTip, 6)
|
||||
lcCursor = poGeneratorNumere.paPlaje(tnTip, 8)
|
||||
IF EMPTY(NVL(lcCursor, [])) OR !USED(lcCursor)
|
||||
RETURN .F.
|
||||
ENDIF
|
||||
RETURN RECCOUNT(lcCursor) > 0
|
||||
ELSE
|
||||
RETURN poGeneratorNumere.paPlaje(tnTip, 1) <> 0
|
||||
ENDIF
|
||||
ENDFUNC
|
||||
|
||||
FUNCTION StareNumar
|
||||
LPARAMETERS tnTip
|
||||
LOCAL lcCursor, lnCount
|
||||
IF poGeneratorNumere.paPlaje(tnTip, 6)
|
||||
lcCursor = poGeneratorNumere.paPlaje(tnTip, 8)
|
||||
IF EMPTY(NVL(lcCursor, [])) OR !USED(lcCursor)
|
||||
lnCount = 0
|
||||
ELSE
|
||||
lnCount = RECCOUNT(lcCursor)
|
||||
ENDIF
|
||||
RETURN "buffer:" + TRANSFORM(lnCount)
|
||||
ELSE
|
||||
RETURN "array:" + TRANSFORM(poGeneratorNumere.paPlaje(tnTip, 1))
|
||||
ENDIF
|
||||
ENDFUNC
|
||||
|
||||
FUNCTION StareToate
|
||||
RETURN "3=" + StareNumar(3) + "|16=" + StareNumar(16) + "|26=" + StareNumar(26)
|
||||
ENDFUNC
|
||||
|
||||
PROCEDURE ProbaSerii
|
||||
LPARAMETERS tnIdTipDoc
|
||||
LOCAL lnOk, laErr[1], i, lcSql
|
||||
PRIVATE pnIdTipDoc, pnRezultat
|
||||
pnIdTipDoc = tnIdTipDoc
|
||||
pnRezultat = 0
|
||||
lcSql = "{call " + gcS + ".pack_serii_numere.verifica_cursor_serii(?pnIdTipDoc,?gnIdUtil,?gnIdSucursala,?@pnRezultat)}"
|
||||
FOR i = 1 TO 3
|
||||
lnOk = SQLEXEC(gnHandle, lcSql, "crsprobaserii")
|
||||
IF lnOk > 0
|
||||
DO AfLog WITH "proba serii OK la incercarea " + TRANSFORM(i) + ", pnRezultat=" + TRANSFORM(pnRezultat) + " randuri=" + TRANSFORM(RECCOUNT("crsprobaserii"))
|
||||
USE IN (SELECT("crsprobaserii"))
|
||||
EXIT
|
||||
ELSE
|
||||
AERROR(laErr)
|
||||
DO AfLog WITH "proba serii ESEC la incercarea " + TRANSFORM(i) + ": " + TRANSFORM(laErr[1]) + " / " + TRANSFORM(laErr[2]) + " / " + TRANSFORM(laErr[5])
|
||||
ENDIF
|
||||
ENDFOR
|
||||
ENDPROC
|
||||
|
||||
* cate randuri de plaja intoarce verifica_cursor_serii pentru un tip de document, fara sa aloce
|
||||
FUNCTION RanduriSerii
|
||||
LPARAMETERS tnIdTipDoc
|
||||
LOCAL lnOk, lnRanduri, lcSql
|
||||
LOCAL ARRAY laErr[1]
|
||||
PRIVATE pnIdTipDoc, pnRezultat
|
||||
pnIdTipDoc = tnIdTipDoc
|
||||
pnRezultat = 0
|
||||
lnRanduri = -1
|
||||
lcSql = "{call " + gcS + ".pack_serii_numere.verifica_cursor_serii(?pnIdTipDoc,?gnIdUtil,?gnIdSucursala,?@pnRezultat)}"
|
||||
lnOk = SQLEXEC(gnHandle, lcSql, "crsprobapl")
|
||||
IF lnOk > 0
|
||||
lnRanduri = RECCOUNT("crsprobapl")
|
||||
USE IN (SELECT("crsprobapl"))
|
||||
ELSE
|
||||
AERROR(laErr)
|
||||
DO AfLog WITH "pre-proba plaje tip " + TRANSFORM(tnIdTipDoc) + " ESEC: " + TRANSFORM(laErr[2])
|
||||
ENDIF
|
||||
RETURN lnRanduri
|
||||
ENDFUNC
|
||||
|
||||
PROCEDURE Assert
|
||||
LPARAMETERS tlCond, tcMsg
|
||||
IF tlCond
|
||||
gnPass = gnPass + 1
|
||||
DO AfLog WITH "PASS: " + tcMsg
|
||||
ELSE
|
||||
gnFail = gnFail + 1
|
||||
DO AfLog WITH "FAIL: " + tcMsg
|
||||
ENDIF
|
||||
ENDPROC
|
||||
|
||||
PROCEDURE AfLog
|
||||
LPARAMETERS tcMsg
|
||||
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
|
||||
ENDPROC
|
||||
|
||||
PROCEDURE AfErr
|
||||
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
|
||||
gnFail = gnFail + 1
|
||||
* plafon de scriere: o eroare intr-o bucla peste liniile unui .vc2 a produs un log de 3 MB
|
||||
IF gnFail <= 200
|
||||
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
|
||||
ENDIF
|
||||
IF gnFail = 201
|
||||
DO AfLog WITH "ERROR: peste 200 de erori, restul nu se mai scriu in log"
|
||||
ENDIF
|
||||
ENDPROC
|
||||
|
||||
PROCEDURE Final
|
||||
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail)
|
||||
DO AfLog WITH "END " + TTOC(DATETIME())
|
||||
QUIT
|
||||
ENDPROC
|
||||
28
utile/Teste/facturare_unificat/test_s3b_paritate_emitere.ps1
Normal file
28
utile/Teste/facturare_unificat/test_s3b_paritate_emitere.ps1
Normal 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"
|
||||
}
|
||||
293
utile/Teste/facturare_unificat/test_s3b_referinta_ui.prg
Normal file
293
utile/Teste/facturare_unificat/test_s3b_referinta_ui.prg
Normal 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
|
||||
11
utile/Teste/facturare_unificat/test_s3b_referinta_ui.ps1
Normal file
11
utile/Teste/facturare_unificat/test_s3b_referinta_ui.ps1
Normal 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')
|
||||
302
utile/Teste/facturare_unificat/test_s3c_1_paritate_sursa.prg
Normal file
302
utile/Teste/facturare_unificat/test_s3c_1_paritate_sursa.prg
Normal 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
|
||||
@@ -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
|
||||
251
utile/Teste/facturare_unificat/test_s4_3_incarca_filtrat.prg
Normal file
251
utile/Teste/facturare_unificat/test_s4_3_incarca_filtrat.prg
Normal 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
|
||||
233
utile/Teste/facturare_unificat/test_s4_3_neregresie_masa.prg
Normal file
233
utile/Teste/facturare_unificat/test_s4_3_neregresie_masa.prg
Normal 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
|
||||
353
utile/Teste/facturare_unificat/test_s4_3b_combosql_filtrat.prg
Normal file
353
utile/Teste/facturare_unificat/test_s4_3b_combosql_filtrat.prg
Normal 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
|
||||
290
utile/Teste/facturare_unificat/test_s4_3c_combosql_tip41.prg
Normal file
290
utile/Teste/facturare_unificat/test_s4_3c_combosql_tip41.prg
Normal 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
|
||||
254
utile/Teste/facturare_unificat/test_s4_4_rol_a_paritate.prg
Normal file
254
utile/Teste/facturare_unificat/test_s4_4_rol_a_paritate.prg
Normal 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
|
||||
303
utile/Teste/facturare_unificat/test_s4_5_do_sterge_garda.prg
Normal file
303
utile/Teste/facturare_unificat/test_s4_5_do_sterge_garda.prg
Normal 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
|
||||
405
utile/Teste/facturare_unificat/test_s4c_discount_grid.prg
Normal file
405
utile/Teste/facturare_unificat/test_s4c_discount_grid.prg
Normal 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
|
||||
365
utile/Teste/facturare_unificat/test_s4d_zi_curs.prg
Normal file
365
utile/Teste/facturare_unificat/test_s4d_zi_curs.prg
Normal 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
|
||||
294
utile/Teste/facturare_unificat/test_s4e_0_adauga_articol.prg
Normal file
294
utile/Teste/facturare_unificat/test_s4e_0_adauga_articol.prg
Normal 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
|
||||
238
utile/Teste/facturare_unificat/test_s4e_2_verifica_articol.prg
Normal file
238
utile/Teste/facturare_unificat/test_s4e_2_verifica_articol.prg
Normal 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
|
||||
306
utile/Teste/facturare_unificat/test_s4e_3_linie_libera.prg
Normal file
306
utile/Teste/facturare_unificat/test_s4e_3_linie_libera.prg
Normal 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
|
||||
502
utile/Teste/facturare_unificat/test_s4e_avize.prg
Normal file
502
utile/Teste/facturare_unificat/test_s4e_avize.prg
Normal 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
|
||||
347
utile/Teste/facturare_unificat/test_s4e_registru.prg
Normal file
347
utile/Teste/facturare_unificat/test_s4e_registru.prg
Normal 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
|
||||
390
utile/Teste/facturare_unificat/test_s4f_cautare_retur.prg
Normal file
390
utile/Teste/facturare_unificat/test_s4f_cautare_retur.prg
Normal 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
|
||||
180
utile/Teste/facturare_unificat/test_s4g_cont_venit.prg
Normal file
180
utile/Teste/facturare_unificat/test_s4g_cont_venit.prg
Normal 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
|
||||
@@ -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
|
||||
228
utile/Teste/facturare_unificat/test_s5_3a_config_a_b_c.prg
Normal file
228
utile/Teste/facturare_unificat/test_s5_3a_config_a_b_c.prg
Normal 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
|
||||
297
utile/Teste/facturare_unificat/test_s5_3b_discount_serie.prg
Normal file
297
utile/Teste/facturare_unificat/test_s5_3b_discount_serie.prg
Normal 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
|
||||
413
utile/Teste/facturare_unificat/test_s5_benzi2_ui.prg
Normal file
413
utile/Teste/facturare_unificat/test_s5_benzi2_ui.prg
Normal 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
|
||||
13
utile/Teste/facturare_unificat/test_s5_benzi2_ui.ps1
Normal file
13
utile/Teste/facturare_unificat/test_s5_benzi2_ui.ps1
Normal 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')
|
||||
342
utile/Teste/facturare_unificat/test_s5_benzi_ui.prg
Normal file
342
utile/Teste/facturare_unificat/test_s5_benzi_ui.prg
Normal 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
|
||||
12
utile/Teste/facturare_unificat/test_s5_benzi_ui.ps1
Normal file
12
utile/Teste/facturare_unificat/test_s5_benzi_ui.ps1
Normal 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')
|
||||
342
utile/Teste/facturare_unificat/test_s5_stare_ui.prg
Normal file
342
utile/Teste/facturare_unificat/test_s5_stare_ui.prg
Normal 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
|
||||
12
utile/Teste/facturare_unificat/test_s5_stare_ui.ps1
Normal file
12
utile/Teste/facturare_unificat/test_s5_stare_ui.ps1
Normal 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')
|
||||
580
utile/Teste/facturare_unificat/test_s5b_proforma.prg
Normal file
580
utile/Teste/facturare_unificat/test_s5b_proforma.prg
Normal 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
|
||||
1151
utile/Teste/facturare_unificat/test_s5c_emitere_reala_ui.prg
Normal file
1151
utile/Teste/facturare_unificat/test_s5c_emitere_reala_ui.prg
Normal file
File diff suppressed because it is too large
Load Diff
17
utile/Teste/facturare_unificat/test_s5c_emitere_reala_ui.ps1
Normal file
17
utile/Teste/facturare_unificat/test_s5c_emitere_reala_ui.ps1
Normal 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')
|
||||
199
utile/Teste/facturare_unificat/test_s5c_legatura_sql.prg
Normal file
199
utile/Teste/facturare_unificat/test_s5c_legatura_sql.prg
Normal 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
|
||||
233
utile/Teste/facturare_unificat/test_s5c_rutare_copiere.prg
Normal file
233
utile/Teste/facturare_unificat/test_s5c_rutare_copiere.prg
Normal 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
|
||||
305
utile/Teste/facturare_unificat/test_s5c_semnal_proforma.prg
Normal file
305
utile/Teste/facturare_unificat/test_s5c_semnal_proforma.prg
Normal 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
|
||||
139
utile/Teste/facturare_unificat/test_s6_0_schela.prg
Normal file
139
utile/Teste/facturare_unificat/test_s6_0_schela.prg
Normal 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
|
||||
28
utile/Teste/facturare_unificat/test_s6_0_schela.ps1
Normal file
28
utile/Teste/facturare_unificat/test_s6_0_schela.ps1
Normal 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"
|
||||
}
|
||||
844
utile/Teste/facturare_unificat/test_s6_1_lista_preturi.prg
Normal file
844
utile/Teste/facturare_unificat/test_s6_1_lista_preturi.prg
Normal 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
|
||||
16
utile/Teste/facturare_unificat/test_s6_1_lista_preturi.ps1
Normal file
16
utile/Teste/facturare_unificat/test_s6_1_lista_preturi.ps1
Normal 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')
|
||||
669
utile/Teste/facturare_unificat/test_s6_2_comanda_contract.prg
Normal file
669
utile/Teste/facturare_unificat/test_s6_2_comanda_contract.prg
Normal 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
|
||||
@@ -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"
|
||||
}
|
||||
116
utile/Teste/facturare_unificat/test_s6_2_compdoc_comanda.prg
Normal file
116
utile/Teste/facturare_unificat/test_s6_2_compdoc_comanda.prg
Normal 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
|
||||
1008
utile/Teste/facturare_unificat/test_s6_3_aviz_retur.prg
Normal file
1008
utile/Teste/facturare_unificat/test_s6_3_aviz_retur.prg
Normal file
File diff suppressed because it is too large
Load Diff
28
utile/Teste/facturare_unificat/test_s6_3_aviz_retur.ps1
Normal file
28
utile/Teste/facturare_unificat/test_s6_3_aviz_retur.ps1
Normal 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"
|
||||
}
|
||||
1019
utile/Teste/facturare_unificat/test_s6_3b_v2_primul.prg
Normal file
1019
utile/Teste/facturare_unificat/test_s6_3b_v2_primul.prg
Normal file
File diff suppressed because it is too large
Load Diff
28
utile/Teste/facturare_unificat/test_s6_3b_v2_primul.ps1
Normal file
28
utile/Teste/facturare_unificat/test_s6_3b_v2_primul.ps1
Normal 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"
|
||||
}
|
||||
1008
utile/Teste/facturare_unificat/test_s6_3d_abd_pretd.prg
Normal file
1008
utile/Teste/facturare_unificat/test_s6_3d_abd_pretd.prg
Normal file
File diff suppressed because it is too large
Load Diff
852
utile/Teste/facturare_unificat/test_s6_4_transfer.prg
Normal file
852
utile/Teste/facturare_unificat/test_s6_4_transfer.prg
Normal 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
|
||||
991
utile/Teste/facturare_unificat/test_s6_5_valuta.prg
Normal file
991
utile/Teste/facturare_unificat/test_s6_5_valuta.prg
Normal 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
|
||||
16
utile/Teste/facturare_unificat/test_s6_5_valuta.ps1
Normal file
16
utile/Teste/facturare_unificat/test_s6_5_valuta.ps1
Normal 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')
|
||||
457
utile/Teste/facturare_unificat/test_s6_6_listare_intrare.prg
Normal file
457
utile/Teste/facturare_unificat/test_s6_6_listare_intrare.prg
Normal 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
|
||||
782
utile/Teste/facturare_unificat/test_s8_cablare_incarcare.prg
Normal file
782
utile/Teste/facturare_unificat/test_s8_cablare_incarcare.prg
Normal 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
|
||||
28
utile/Teste/facturare_unificat/test_s8_cablare_incarcare.ps1
Normal file
28
utile/Teste/facturare_unificat/test_s8_cablare_incarcare.ps1
Normal 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"
|
||||
}
|
||||
315
utile/Teste/facturare_unificat/test_s8_geometrie_ui.prg
Normal file
315
utile/Teste/facturare_unificat/test_s8_geometrie_ui.prg
Normal 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
|
||||
11
utile/Teste/facturare_unificat/test_s8_geometrie_ui.ps1
Normal file
11
utile/Teste/facturare_unificat/test_s8_geometrie_ui.ps1
Normal 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
Reference in New Issue
Block a user