teste ANAF nomenclator: proba e2e pe formularul real + init mediu ROADEF

Proba end-to-end ruleaza formularul frm_firme_nou_desktopf peste nomenclatorul
Oracle real; 997/1000 coduri fiscale reale potrivite corect. Testul sintetic
acopera 42 de verificari, fara Oracle si fara ANAF.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015husoVS24ewJZr21ZoVR3v
This commit is contained in:
2026-08-23 20:28:32 +03:00
parent 0027a28961
commit a580dfd6e1
6 changed files with 1787 additions and 2 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,13 @@
* mock_amessagebox.prg - inlocuieste FUNCTION amessagebox (din oproceduri_comune.prg) in teste,
* ca dialogurile modale de confirmare sa NU blocheze testul headless. Returneaza 6 (Da/OK) implicit.
* Se incarca ULTIMA cu SET PROCEDURE ... ADDITIVE - in VFP, la nume duplicat de procedura,
* castiga fisierul de proceduri deschis cel mai recent. Logheaza apelul (dovada rezolutiei).
* Se incarca cu SET PROCEDURE ... ADDITIVE **PRIMA**, INAINTEA fisierelor aplicatiei: la nume
* duplicat de procedura VFP foloseste fisierul cautat PRIMUL (verificat empiric - vezi
* COMUN\docs\testare-ui-vfp.md capcana g si antetul lui partener_anaf\mock_anaf_verificare.prg).
* 23.08.2026: antetul spunea pana acum "ULTIMA", ceea ce e invers si a costat o rulare blocata
* pe un dialog modal (test_e2e_anaf_firma). Logheaza apelul (dovada rezolutiei).
* LIMITA: nu acopera sigur apelurile INTRA-FISIER. `verifica_partener_show_info` si `amessagebox`
* sunt amandoua in oproceduri_comune.prg, deci dialogul acelei functii ramane modal chiar cu
* mock-ul incarcat; pentru el exista partener_anaf\mock_verifica_partener_show_info.prg.
* Configurabil per apel: daca testul declara PUBLIC gnMockRaspuns (implicit 6 daca nedeclarata),
* mock-ul returneaza acea valoare - necesar pt. meniuri cu raspunsuri diferite (6/7/2) pe acelasi
* dialog (ex. do_sterge/do_copiaza_nota, flag 3+32 Yes/No/Cancel).

View File

@@ -0,0 +1,50 @@
* mock_verifica_partener_show_info.prg - inlocuieste FUNCTION verifica_partener_show_info
* (COMUN\programe\oproceduri_comune.prg:4767) in teste headless.
*
* DE CE UN MOCK SEPARAT, cand exista deja mock_amessagebox.prg: functia reala se termina cu
* `amessagebox(lcText, ...)`, iar acel apel pleaca DIN oproceduri_comune.prg, adica din acelasi
* fisier in care e definita si FUNCTION amessagebox. Mock-ul de messagebox nu acopera sigur
* apelurile intra-fisier, deci dialogul de confirmare "Doriti sa se completeze datele in
* formular?" ramanea modal si bloca rularea headless (masurat: proba se opreste pe primul CIF).
* Aici se inlocuieste direct wrapper-ul de dialog - tot infrastructura, nu un pas al fluxului
* testat: functia reala doar formateaza un text si intoarce raspunsul utilizatorului.
*
* Se incarca cu SET PROCEDURE ... ADDITIVE **INAINTEA** fisierelor aplicatiei: la nume duplicat
* de FUNCTION, VFP foloseste fisierul cautat PRIMUL (vezi COMUN\docs\testare-ui-vfp.md capcana g).
*
* Raspunsul intors: gnMockRaspunsShowInfo daca e declarata PUBLIC, altfel 6 (Da).
* Efect secundar util testelor: datele BRUTE primite de la ANAF (inainte de potrivirea peste
* nomenclator) se depun in variabilele publice de mai jos, daca testul le-a declarat ca string:
* gcMockAnafJudet, gcMockAnafLocalitate, gcMockAnafAdresa, gcMockAnafFirma
* plus contorul gnMockShowInfoApeluri (numeric), daca e declarat.
FUNCTION verifica_partener_show_info
LPARAMETERS toPartenerVerificare, tcCodFiscal, tcDenumire, tcMesajIntrebare
LOCAL lnRaspuns
IF TYPE('gnMockShowInfoApeluri') = 'N'
gnMockShowInfoApeluri = gnMockShowInfoApeluri + 1
ENDIF
IF VARTYPE(m.toPartenerVerificare) = 'O'
IF TYPE('gcMockAnafJudet') = 'C'
gcMockAnafJudet = IIF(PEMSTATUS(m.toPartenerVerificare, 'judet', 5), ;
ALLTRIM(NVL(toPartenerVerificare.judet, '')), '')
ENDIF
IF TYPE('gcMockAnafLocalitate') = 'C'
gcMockAnafLocalitate = IIF(PEMSTATUS(m.toPartenerVerificare, 'localitate', 5), ;
ALLTRIM(NVL(toPartenerVerificare.localitate, '')), '')
ENDIF
IF TYPE('gcMockAnafAdresa') = 'C'
gcMockAnafAdresa = IIF(PEMSTATUS(m.toPartenerVerificare, 'adresa', 5), ;
ALLTRIM(NVL(toPartenerVerificare.adresa, '')), '')
ENDIF
IF TYPE('gcMockAnafFirma') = 'C'
gcMockAnafFirma = IIF(PEMSTATUS(m.toPartenerVerificare, 'firma', 5), ;
ALLTRIM(NVL(toPartenerVerificare.firma, '')), '')
ENDIF
ENDIF
lnRaspuns = IIF(TYPE('gnMockRaspunsShowInfo') = 'N', gnMockRaspunsShowInfo, 6)
RETURN m.lnRaspuns
ENDFUNC

View File

@@ -0,0 +1,299 @@
* test_e2e_anaf_firma.prg
* Proba END-TO-END pentru todo #22 (preluare date ANAF la datele firmei), pe traseul REAL:
* formularul frm_firme_nou_desktopf + Click pe But_verifica1 -> anaf_completeaza_firma ->
* verifica_partener (apel ANAF live) -> ParseAdresaAnaf/FaraPrefixLoc -> AnafNomenclator ->
* Ct_localitate1.modifica_judet / modifica_localitate, peste nomenclatorul Oracle REAL.
*
* Ce acopera in plus fata de test_anaf_nomenclator.prg: acela ruleaza potrivirea pe cursoare
* SINTETICE, in afara formularului. Aici cursoarele sunt cele construite de ct_localitate din
* syn_vnom_judete / syn_vnom_localitati (inclusiv randul-santinela "<ALEGETI ...>"), iar
* apasarea e pe butonul real - conform regulii: testele pe frontend exerseaza fluxul real,
* nu populeaza direct cursoarele.
*
* ATENTIE (1): foloseste test_init_env_auto_ROADEF, nu test_init_env_auto.prg. Acela porneste pe
* D:\ROA\ROACONT\, alt working copy de COMUN, fara modificarile necomise de aici - ar testa
* codul vechi si ar da rezultate false.
* ATENTIE (2): tot codul care construieste obiecte sta INLINE in programul principal, nu in
* proceduri (capcana l din COMUN\docs\testare-ui-vfp.md), iar TRY/CATCH nu contine RETURN
* (VFP9: eroare 2060 "RETURN/RETRY statement not allowed in TRY/CATCH").
*
* Rulare headless (nu tine VFP IDE sau roadef.exe deschis):
* Remove-Item <acest .prg cu extensia .fxp> -Force
* & "C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe" -A -T ;
* "D:\ROA\ROADEF\COMUN\utile\Teste\partener_anaf\test_e2e_anaf_firma.prg"
* Log: test_e2e_anaf_firma_log.txt, langa acest fisier.
*
* Numarul de coduri fiscale rulate: gnE2ELimita (implicit 8). Codurile vin din
* ..\cache_anaf\codes_200_reale.txt (coduri reale). Fiecare cod = un apel ANAF live.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcLogE2E, gnOk, gnEsec, gnSarite, gnE2ELimita, goNomE2E, ;
gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip, ;
gnMockRaspunsShowInfo, gnMockShowInfoApeluri, ;
gcMockAnafJudet, gcMockAnafLocalitate, gcMockAnafAdresa, gcMockAnafFirma
gcLogE2E = ADDBS(JUSTPATH(SYS(16, 0))) + 'test_e2e_anaf_firma_log.txt'
IF EMPTY(JUSTPATH(SYS(16, 0)))
gcLogE2E = 'D:\ROA\ROADEF\COMUN\utile\Teste\partener_anaf\test_e2e_anaf_firma_log.txt'
ENDIF
gnOk = 0
gnEsec = 0
gnSarite = 0
* cate coduri se ruleaza: implicit 8, sau variabila de mediu E2E_LIMITA (ex. 200 pentru
* o masuratoare completa) - vfp9.exe nu poate primi parametri pentru scriptul din -T
gnE2ELimita = IIF(VAL(GETENV('E2E_LIMITA')) > 0, INT(VAL(GETENV('E2E_LIMITA'))), 8)
goNomE2E = .NULL.
gnMockRaspuns = 6 && "Da" la dialogurile amessagebox
gcMockUltimMesaj = '' && mock_amessagebox memoreaza aici textul ultimului dialog
gnMockUltimTip = 0
gnMockRaspunsShowInfo = 6 && "Da" la "Doriti sa se completeze datele in formular?"
gnMockShowInfoApeluri = 0
* datele BRUTE de la ANAF, depuse de mock_verifica_partener_show_info INAINTE de potrivire
gcMockAnafJudet = ''
gcMockAnafLocalitate = ''
gcMockAnafAdresa = ''
gcMockAnafFirma = ''
STRTOFILE('START test_e2e_anaf_firma ' + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLogE2E)
ON ERROR DO E2EErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
* ===== mock-urile de dialoguri, INAINTEA fisierelor aplicatiei =====
* La nume duplicat de FUNCTION, VFP foloseste fisierul cautat PRIMUL
* (COMUN\docs\testare-ui-vfp.md capcana g). Incarcate DUPA mediu, dialogurile raman modale
* si rularea headless se blocheaza pe primul CIF (masurat: proba s-a oprit pe 10117033).
SET PROCEDURE TO D:\ROA\ROADEF\COMUN\utile\Teste\partener_anaf\mock_verifica_partener_show_info.prg ADDITIVE
SET PROCEDURE TO D:\ROA\ROADEF\COMUN\utile\Teste\mock_amessagebox.prg ADDITIVE
* ===== mediu =====
DO D:\ROA\ROADEF\COMUN\utile\Teste\test_init_env_auto_roadef.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF TYPE('gnHandle') <> 'N' OR gnHandle <= 0
DO E2ELog WITH 'EROARE: conectare Oracle esuata, gnHandle=' + TRANSFORM(IIF(TYPE('gnHandle') = 'N', gnHandle, -1))
DO E2ELog WITH 'REZULTAT: NEDETERMINAT'
QUIT
ENDIF
DO E2ELog WITH 'mediu OK: gcS=' + gcS + ' gnIdFirma=' + TRANSFORM(gnIdFirma) + ;
' gnScrieRegistru=' + TRANSFORM(gnScrieRegistru) + ' gcNumeProgram=' + gcNumeProgram
* ===== dovada 1: rulam pe COMUN-ul din ROADEF, cu fixul din todo #22 =====
LOCAL llAreFix, loEx AS Exception
llAreFix = .F.
TRY
goNomE2E = CREATEOBJECT('AnafNomenclator')
llAreFix = (VARTYPE(goNomE2E) = 'O')
CATCH TO loEx
llAreFix = .F.
ENDTRY
DO E2ELog WITH 'AnafNomenclator disponibil: ' + IIF(m.llAreFix, 'DA', 'NU')
IF !m.llAreFix
DO E2ELog WITH 'REZULTAT: NEDETERMINAT - s-a incarcat un COMUN fara fixul din todo #22'
QUIT
ENDIF
* ===== dovada 2: mock-ul de dialog a castigat =====
* Cu obiect gol, functia REALA moare la loPartener.platitortvamfin inainte de amessagebox;
* mock-ul intoarce 6 fara sa deschida nimic. Daca nu castiga, rularea s-ar bloca pe primul modal.
LOCAL loDummyE2E, lnProbaMock
loDummyE2E = CREATEOBJECT('empty')
lnProbaMock = -1
TRY
lnProbaMock = verifica_partener_show_info(m.loDummyE2E, '0', '', 'proba mock')
CATCH TO loEx
lnProbaMock = -2
ENDTRY
gnMockShowInfoApeluri = 0
DO E2ELog WITH 'mock verifica_partener_show_info activ: ' + ;
IIF(m.lnProbaMock = 6, 'DA', 'NU (raspuns ' + TRANSFORM(m.lnProbaMock) + ')')
IF m.lnProbaMock <> 6
DO E2ELog WITH 'REZULTAT: NEDETERMINAT - fara mock, primul dialog modal blocheaza rularea headless'
QUIT
ENDIF
* ===== firma curenta, ca in oproceduri_roadef.viz_firme =====
LOCAL lcSqlFirma
lcSqlFirma = [select * from syn_v_nom_firme where sters = 0 and id_firma = ] + ALLTRIM(STR(goFirma.id_firma))
IF !goExecutor.oExecuta(m.lcSqlFirma, 'crsFirmaE2E') OR RECCOUNT('crsFirmaE2E') = 0
DO E2ELog WITH 'EROARE: nu am putut citi firma curenta (' + m.lcSqlFirma + ')'
DO E2ELog WITH 'REZULTAT: NEDETERMINAT'
QUIT
ENDIF
SELECT crsFirmaE2E
GO TOP
DO E2ELog WITH 'firma de lucru: id_firma=' + TRANSFORM(id_firma) + ' [' + ALLTRIM(NVL(firma, '')) + ']'
* ===== lista de coduri fiscale reale =====
LOCAL lcFisCoduri, lnTotalCoduri, lnI, lcCod
LOCAL ARRAY laCoduri[1]
* lotul de coduri: implicit cel de 200, sau variabila de mediu E2E_CODURI (cale completa)
lcFisCoduri = ALLTRIM(GETENV('E2E_CODURI'))
IF EMPTY(m.lcFisCoduri)
lcFisCoduri = 'D:\ROA\ROADEF\COMUN\utile\Teste\cache_anaf\codes_200_reale.txt'
ENDIF
IF !FILE(m.lcFisCoduri)
DO E2ELog WITH 'EROARE: lipseste ' + m.lcFisCoduri
DO E2ELog WITH 'REZULTAT: NEDETERMINAT'
QUIT
ENDIF
lnTotalCoduri = ALINES(laCoduri, FILETOSTR(m.lcFisCoduri))
DO E2ELog WITH 'lot: ' + m.lcFisCoduri
DO E2ELog WITH 'coduri disponibile: ' + TRANSFORM(m.lnTotalCoduri) + ', rulez primele ' + TRANSFORM(gnE2ELimita)
DO E2ELog WITH REPLICATE('-', 110)
* ===== rulare: un cod fiscal = un formular nou + un Click pe butonul real =====
* Totul inline (capcana l): CREATEOBJECT pe formular dintr-o procedura e nesigur headless.
PRIVATE poRec
LOCAL lnRulate, loFrm, llFrmOk, llClickOk, lcErr
LOCAL lcAdrAnaf, lcJudAnaf, lcLocAnaf, lcJudet, lcLoc, lnIdJudet, lnIdLoc
LOCAL llOkJud, llOkLoc, lcDetaliu
lnRulate = 0
FOR lnI = 1 TO m.lnTotalCoduri
lcCod = ALLTRIM(laCoduri[m.lnI])
IF !EMPTY(m.lcCod) AND ISDIGIT(m.lcCod) AND m.lnRulate < gnE2ELimita
lnRulate = m.lnRulate + 1
* record proaspat pentru fiecare cod, direct din cursorul firmei (ca in viz_firme:
* Select v_firme / Scatter Name loRec), ca sa nu ramana stare de la codul anterior.
* Plasa: _frm_base.Destroy face USE IN (SELECT(thisform.ccursor)) si, cu ccursor gol,
* poate inchide zona de lucru curenta - refacem cursorul daca s-a pierdut.
IF !USED('crsFirmaE2E')
IF !goExecutor.oExecuta(m.lcSqlFirma, 'crsFirmaE2E')
DO E2ELog WITH 'CIF ' + m.lcCod + ' -> ESEC: nu am putut reface crsFirmaE2E'
gnEsec = gnEsec + 1
LOOP
ENDIF
ENDIF
SELECT crsFirmaE2E
GO TOP
SCATTER NAME poRec MEMO
* golim campurile pe care le completeaza traseul ANAF, ca sa nu confundam o valoare
* ramasa din firma curenta cu una preluata acum
poRec.cod_fiscal = m.lcCod
poRec.judet = ''
poRec.id_judet = .NULL.
poRec.localitate = ''
poRec.id_loc = .NULL.
poRec.adresa = ''
IF TYPE('poRec.modificare_schema') = 'U'
ADDPROPERTY(poRec, 'modificare_schema', 0)
ENDIF
gcMockUltimMesaj = ''
gcMockAnafJudet = ''
gcMockAnafLocalitate = ''
gcMockAnafAdresa = ''
gcMockAnafFirma = ''
gnMockShowInfoApeluri = 0
llFrmOk = .F.
lcErr = ''
TRY
loFrm = CREATEOBJECT('frm_firme_nou_desktopf', poRec, poRec.id_firma, 'UPDATE')
llFrmOk = (VARTYPE(loFrm) = 'O')
CATCH TO loEx
lcErr = loEx.Message + ' [' + loEx.Procedure + ':' + TRANSFORM(loEx.LineNo) + ']'
ENDTRY
IF !m.llFrmOk
gnEsec = gnEsec + 1
DO E2ELog WITH 'CIF ' + m.lcCod + ' -> ESEC: nu s-a putut crea formularul: ' + m.lcErr
ELSE
llClickOk = .F.
lcErr = ''
TRY
loFrm.But_verifica1.Click()
llClickOk = .T.
CATCH TO loEx
lcErr = loEx.Message + ' [' + loEx.Procedure + ':' + TRANSFORM(loEx.LineNo) + ']'
ENDTRY
IF !m.llClickOk
gnEsec = gnEsec + 1
DO E2ELog WITH 'CIF ' + m.lcCod + ' -> ESEC: exceptie in But_verifica1.Click: ' + m.lcErr
ELSE
lcAdrAnaf = UPPER(ALLTRIM(gcMockAnafAdresa))
lcJudAnaf = UPPER(ALLTRIM(gcMockAnafJudet))
lcLocAnaf = UPPER(ALLTRIM(gcMockAnafLocalitate))
lcJudet = ALLTRIM(NVL(poRec.judet, ''))
lcLoc = ALLTRIM(NVL(poRec.localitate, ''))
lnIdJudet = NVL(poRec.id_judet, -1)
lnIdLoc = NVL(poRec.id_loc, -1)
IF gnMockShowInfoApeluri = 0 OR EMPTY(m.lcJudAnaf)
* ANAF n-a intors un partener valid, sau l-a intors fara adresa (cod inactiv /
* fara raspuns / notFound): nu se poate judeca potrivirea peste nomenclator
gnSarite = gnSarite + 1
DO E2ELog WITH 'CIF ' + m.lcCod + ' -> SARIT: ANAF nu a intors adresa. Ultim dialog: [' + ;
LEFT(STRTRAN(STRTRAN(gcMockUltimMesaj, CHR(13), ' '), CHR(10), ' '), 150) + ']'
ELSE
* judetul e OK daca s-a completat, are id din nomenclator si denumirea potrivita
* corespunde textului brut primit de la ANAF
llOkJud = !EMPTY(m.lcJudet) AND m.lnIdJudet > 0 AND E2EPotrivit(m.lcJudet, m.lcJudAnaf)
* localitatea: la fel; santinela "<ALEGETI LOCALITATEA>" NU e rezultat valid
llOkLoc = !EMPTY(m.lcLoc) AND !('<ALEGETI' $ UPPER(m.lcLoc)) AND m.lnIdLoc > 0 ;
AND E2EPotrivit(m.lcLoc, m.lcLocAnaf)
lcDetaliu = 'ANAF[jud=' + m.lcJudAnaf + ' loc=' + m.lcLocAnaf + ']' + ;
' -> NOM[judet=' + m.lcJudet + ' id_judet=' + TRANSFORM(m.lnIdJudet) + ;
' localitate=' + m.lcLoc + ' id_loc=' + TRANSFORM(m.lnIdLoc) + ']'
IF m.llOkJud AND m.llOkLoc
gnOk = gnOk + 1
DO E2ELog WITH 'CIF ' + m.lcCod + ' -> OK ' + m.lcDetaliu
ELSE
gnEsec = gnEsec + 1
DO E2ELog WITH 'CIF ' + m.lcCod + ' -> ESEC ' + ;
IIF(!m.llOkJud, '[judet] ', '') + IIF(!m.llOkLoc, '[localitate] ', '') + m.lcDetaliu
DO E2ELog WITH ' adresa ANAF: ' + LEFT(m.lcAdrAnaf, 150)
DO E2ELog WITH ' ultim dialog: [' + ;
LEFT(STRTRAN(STRTRAN(gcMockUltimMesaj, CHR(13), ' '), CHR(10), ' '), 200) + ']'
ENDIF
ENDIF
ENDIF
loFrm.Release()
loFrm = .NULL.
ENDIF
ENDIF
ENDFOR
DO E2ELog WITH REPLICATE('-', 110)
DO E2ELog WITH 'TOTAL: ' + TRANSFORM(gnOk) + ' ok, ' + TRANSFORM(gnEsec) + ' esec, ' + ;
TRANSFORM(gnSarite) + ' sarite (fara raspuns ANAF), din ' + TRANSFORM(m.lnRulate) + ' coduri rulate'
DO E2ELog WITH 'REZULTAT: ' + IIF(gnEsec = 0, 'TOATE OK', 'AU FOST ESECURI') + ' ' + TTOC(DATETIME())
QUIT
*********************************************************************
* Denumirea aleasa din nomenclator corespunde textului brut de la ANAF?
* Comparatia foloseste cheia toleranta a clasei (fara sufixul dintre paranteze, fara
* separatoare, cu A si I unificate) - altfel "TIRGU MURES" din nomenclator nu ar corespunde
* cu "TARGU MURES" de la ANAF si am raporta un esec fals.
* goNomE2E e construit INLINE in main (capcana l); aici doar se foloseste.
FUNCTION E2EPotrivit
LPARAMETERS tcDinNomenclator, tcDeLaAnaf
LOCAL lcA, lcB
IF VARTYPE(goNomE2E) <> 'O' OR EMPTY(ALLTRIM(NVL(m.tcDeLaAnaf, '')))
RETURN .F.
ENDIF
lcA = goNomE2E.cheie_fuzzy(m.tcDinNomenclator)
lcB = goNomE2E.cheie_fuzzy(m.tcDeLaAnaf)
RETURN !EMPTY(m.lcA) AND (m.lcA == m.lcB)
ENDFUNC
*********************************************************************
PROCEDURE E2EErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
DO E2ELog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
ENDPROC
*********************************************************************
PROCEDURE E2ELog
LPARAMETERS tcMsg
LOCAL lcL
lcL = IIF(FILE(gcLogE2E), FILETOSTR(gcLogE2E), '')
STRTOFILE(m.lcL + TRANSFORM(m.tcMsg) + CHR(13) + CHR(10), gcLogE2E)
ENDPROC

View File

@@ -0,0 +1,167 @@
*!* 23.08.2026
*!* marius.mutu
*!* Test headless pentru potrivirea denumirilor ANAF peste nomenclator: taierea prefixului in
*!* ParseAdresaAnaf si treptele din AnafNomenclator (exact / fara sufix / fuzzy A-I).
Local lcLog, lcComun, loV, loN, lnOk, lnNok
lcComun = Addbs(Justpath(Justpath(Justpath(Sys(16)))))
lcLog = Addbs(Justpath(Sys(16))) + "test_anaf_nomenclator_log.txt"
If File(m.lcLog)
Erase (m.lcLog)
Endif
Public gnOk, gnNok, gcLog
gnOk = 0
gnNok = 0
gcLog = m.lcLog
*** fara On Error o eroare de runtime ar deschide un dialog modal si testul ar atarna
On Error Strtofile("EROARE " + Transform(Error()) + " linia " + Transform(Lineno()) + ": " + Message() + Chr(13) + Chr(10), m.gcLog, .T.)
Set Procedure To (m.lcComun + "programe\validare.prg") Additive
Set Procedure To (m.lcComun + "programe\onomenclatoare.prg") Additive
loV = Createobject("VerificareANAF")
loN = Createobject("AnafNomenclator")
*** --- FaraPrefixLoc: prefixul se taie, restul denumirii ramane intreg ---
Verif("prefix JUD. un cuvant", loV.FaraPrefixLoc("JUD. CONSTANTA"), "CONSTANTA")
Verif("prefix JUD. doua cuvinte", loV.FaraPrefixLoc("JUD. SATU MARE"), "SATU MARE")
Verif("prefix ORS.", loV.FaraPrefixLoc("ORS. TIRGU NEAMT"), "TIRGU NEAMT")
Verif("prefix MUN. cu cratima", loV.FaraPrefixLoc("MUN. CLUJ-NAPOCA"), "CLUJ-NAPOCA")
Verif("prefix COM.", loV.FaraPrefixLoc("COM. AGHIRESU"), "AGHIRESU")
Verif("prefix SAT fara punct", loV.FaraPrefixLoc("SAT AGHIRESU-FABRICI"), "AGHIRESU-FABRICI")
Verif("fara prefix", loV.FaraPrefixLoc("CONSTANTA"), "CONSTANTA")
*** forma NEprescurtata: pe Bucuresti ANAF trimite "MUNICIPIUL BUCURESTI", nu "JUD. BUCURESTI"
Verif("prefix MUNICIPIUL", loV.FaraPrefixLoc("MUNICIPIUL BUCURESTI"), "BUCURESTI")
Verif("prefix JUDETUL", loV.FaraPrefixLoc("JUDETUL CLUJ"), "CLUJ")
*** ORASUL/COMUNA/SATUL NU se taie: exista localitati care chiar incep asa
Verif("ORASUL NU e prefix", loV.FaraPrefixLoc("ORASUL NOU"), "ORASUL NOU")
*** --- ParseAdresaAnaf: adresa completa, inclusiv cazul Bucuresti ---
Local loA
loA = loV.ParseAdresaAnaf("JUD. SATU MARE, MUN. SATU MARE, STR. LALELELOR, NR.12")
Verif("adresa judet doua cuvinte", loA.judet, "SATU MARE")
Verif("adresa loc doua cuvinte", loA.localitate, "SATU MARE")
loA = loV.ParseAdresaAnaf("MUN. BUCURESTI, SECTOR 1, STR. AVIATORILOR, NR.2")
Verif("bucuresti judet", loA.judet, "BUCURESTI")
Verif("bucuresti sectorul", loA.localitate, "BUCURESTI SECTORUL 1")
*** forma pe care o trimite ANAF in realitate (masurat pe 200 de coduri reale): nu "MUN.", ci
*** "MUNICIPIUL", si fara "JUD." pe primul element
loA = loV.ParseAdresaAnaf("MUNICIPIUL BUCURESTI, SECTOR 1, STR EMANOIL PORUMBARU, NR.90-92")
Verif("bucuresti real judet", loA.judet, "BUCURESTI")
Verif("bucuresti real sectorul", loA.localitate, "BUCURESTI SECTORUL 1")
loA = loV.ParseAdresaAnaf("JUD. CONSTANTA, MUN. CONSTANTA, ALEEA CRIZANTEMELOR, NR.6, BL.H1, SC.F, ET.2, AP.109")
Verif("nemodificat judet", loA.judet, "CONSTANTA")
Verif("nemodificat loc", loA.localitate, "CONSTANTA")
Verif("nemodificat strada", loA.strada, "CRIZANTEMELOR")
Verif("nemodificat nr", loA.nr, "6")
Verif("nemodificat bloc", loA.Bloc, "H1")
Verif("nemodificat apart", loA.apart, "109")
*** --- AnafNomenclator pe cursoare modelate dupa syn_vnom_* ---
Create Cursor crsJudeteT (id_judet I Null, judet C(30))
Insert Into crsJudeteT Values (Null, "<ALEGETI JUDETUL>")
Insert Into crsJudeteT Values (10, "BUCURESTI")
Insert Into crsJudeteT Values (14, "CLUJ")
Insert Into crsJudeteT Values (34, "SATU MARE")
VerifId("judet exact", loN.pozitioneaza_judet("crsJudeteT", "CLUJ"), "crsJudeteT.id_judet", 14)
VerifId("judet doua cuvinte", loN.pozitioneaza_judet("crsJudeteT", "SATU MARE"), "crsJudeteT.id_judet", 34)
Verif("judet inexistent", Transform(loN.pozitioneaza_judet("crsJudeteT", "ATLANTIDA")), ".F.")
Create Cursor crsLocT (id_loc I Null, localitate C(45))
Insert Into crsLocT Values (Null, "<ALEGETI LOCALITATEA>")
Insert Into crsLocT Values (57, "AGHIRESU")
Insert Into crsLocT Values (58, "AGHIRESU-FABRICI (COM. AGHIRESU)")
Insert Into crsLocT Values (1759, "BUCURESTI SECTORUL 1")
Insert Into crsLocT Values (9001, "TIRGU MURES")
Insert Into crsLocT Values (9002, "TIRGU NEAMT")
Insert Into crsLocT Values (9101, "SATU NOU (COM. ALFA)")
Insert Into crsLocT Values (9102, "SATU NOU (COM. BETA)")
Insert Into crsLocT Values (9201, "MAMAIA (MUN. CONSTANTA)")
Insert Into crsLocT Values (9202, "POIANA (ORS. OVIDIU)")
*** omonime departajabile dupa comuna (cazul real GRECI din Olt)
Insert Into crsLocT Values (9301, "GRECI (COM. SCHITU)")
Insert Into crsLocT Values (9302, "GRECI (COM. OSICA DE SUS)")
*** omonime unde marcajul e scris diferit in cele doua surse: nomenclatorul "(ORAS X)",
*** ANAF "ORS. X" - departajarea compara doar denumirea comunei/orasului
Insert Into crsLocT Values (9401, "STEFANESTI (COM. SUSENI)")
Insert Into crsLocT Values (9402, "STEFANESTI (ORAS STEFANESTI)")
*** omonime care difera de ANAF SI prin A/I: treapta exacta nu gaseste nimic, cea fuzzy gaseste
*** doi - departajarea dupa comuna trebuie sa se aplice si acolo (cazul real SIRBI, Maramures)
Insert Into crsLocT Values (9501, "SIRBI (COM. BUDESTI)")
Insert Into crsLocT Values (9502, "SIRBI (COM. FARCASA)")
*** exactul are prioritate: AGHIRESU nu trebuie sa cada pe AGHIRESU-FABRICI
VerifId("loc exact", loN.pozitioneaza_localitate("crsLocT", "AGHIRESU"), "crsLocT.id_loc", 57)
VerifId("loc fara sufix", loN.pozitioneaza_localitate("crsLocT", "AGHIRESU-FABRICI"), "crsLocT.id_loc", 58)
VerifId("loc sector", loN.pozitioneaza_localitate("crsLocT", "BUCURESTI SECTORUL 1"), "crsLocT.id_loc", 1759)
*** fuzzy: ANAF trimite forma cu A, nomenclatorul o tine cu I
VerifId("loc fuzzy A-I", loN.pozitioneaza_localitate("crsLocT", "TARGU MURES"), "crsLocT.id_loc", 9001)
VerifId("loc fuzzy A-I 2", loN.pozitioneaza_localitate("crsLocT", "TARGU NEAMT"), "crsLocT.id_loc", 9002)
*** sufix administrativ FARA paranteze - asa il trimite ANAF, intr-un singur element de virgula:
*** "JUD. CONSTANTA, SAT AGIGEA COM. AGIGEA, STR. ECLUZEI, NR.1". Nomenclatorul il tine cu
*** paranteze, deci ambele forme trebuie sa se reduca la aceeasi denumire.
VerifId("loc sufix COM. fara paranteze", ;
loN.pozitioneaza_localitate("crsLocT", "AGHIRESU-FABRICI COM. AGHIRESU"), "crsLocT.id_loc", 58)
VerifId("loc sufix MUN. fara paranteze", ;
loN.pozitioneaza_localitate("crsLocT", "MAMAIA MUN. CONSTANTA"), "crsLocT.id_loc", 9201)
VerifId("loc sufix ORS. fara paranteze", ;
loN.pozitioneaza_localitate("crsLocT", "POIANA ORS. OVIDIU"), "crsLocT.id_loc", 9202)
*** ambiguu: doua sate omonime in comune diferite - se refuza, nu se ghiceste
Verif("loc ambiguu refuzat", Transform(loN.pozitioneaza_localitate("crsLocT", "SATU NOU")), ".F.")
*** ...dar daca ANAF trimite comuna, omonimele SE departajeaza dupa ea
VerifId("omonime departajate dupa comuna", ;
loN.pozitioneaza_localitate("crsLocT", "SATU NOU COM. BETA"), "crsLocT.id_loc", 9102)
VerifId("omonime departajate, caz real GRECI", ;
loN.pozitioneaza_localitate("crsLocT", "GRECI COM. SCHITU"), "crsLocT.id_loc", 9301)
*** marcaj scris diferit in cele doua surse: ANAF "ORS. STEFANESTI" vs nomenclator "(ORAS STEFANESTI)"
VerifId("omonime, marcaj scris diferit", ;
loN.pozitioneaza_localitate("crsLocT", "STEFANESTI ORS. STEFANESTI"), "crsLocT.id_loc", 9402)
*** comuna care nu exista printre omonime: NU se ghiceste, ramane refuzat
Verif("omonime, comuna necunoscuta refuzata", ;
Transform(loN.pozitioneaza_localitate("crsLocT", "GRECI COM. ATLANTIDA")), ".F.")
*** fara comuna de la ANAF nu se poate departaja - refuz corect (cazul real STEFANESTI, Arges)
Verif("omonime fara comuna refuzate", ;
Transform(loN.pozitioneaza_localitate("crsLocT", "STEFANESTI")), ".F.")
*** departajarea se aplica SI dupa treapta fuzzy: ANAF "SARBI", nomenclatorul "SIRBI"
VerifId("omonime fuzzy departajate dupa comuna", ;
loN.pozitioneaza_localitate("crsLocT", "SARBI COM. FARCASA"), "crsLocT.id_loc", 9502)
Verif("omonime fuzzy fara comuna refuzate", ;
Transform(loN.pozitioneaza_localitate("crsLocT", "SARBI")), ".F.")
Verif("loc inexistent", Transform(loN.pozitioneaza_localitate("crsLocT", "ATLANTIDA")), ".F.")
*** On Error continua executia, deci o verificare sarita (obiect neinstantiat) nu s-ar vedea
*** in numarul de esecuri; se verifica explicit ca au rulat toate.
If m.gnOk + m.gnNok # 42
gnNok = m.gnNok + 1
Strtofile("ESEC au rulat doar " + Transform(m.gnOk + m.gnNok) + " verificari din 42" + Chr(13) + Chr(10), m.gcLog, .T.)
Endif
Strtofile("TOTAL: " + Transform(m.gnOk) + " ok, " + Transform(m.gnNok) + " esec" + Chr(13) + Chr(10), m.gcLog, .T.)
Quit
Procedure Verif
Lparameters tcNume, tcObtinut, tcAsteptat
Local lcStare
If Alltrim(Nvl(m.tcObtinut, "")) == Alltrim(m.tcAsteptat)
gnOk = m.gnOk + 1
lcStare = "ok "
Else
gnNok = m.gnNok + 1
lcStare = "ESEC "
Endif
Strtofile(m.lcStare + Padr(m.tcNume, 26) + " obtinut=[" + Alltrim(Nvl(m.tcObtinut, "")) + ;
"] asteptat=[" + Alltrim(m.tcAsteptat) + "]" + Chr(13) + Chr(10), m.gcLog, .T.)
Endproc
Procedure VerifId
Lparameters tcNume, tlGasit, tcExpresieId, tnAsteptat
Local lnId
lnId = Iif(m.tlGasit, Nvl(Evaluate(m.tcExpresieId), -1), -1)
Verif(m.tcNume, Transform(m.lnId), Transform(m.tnAsteptat))
Endproc

View File

@@ -0,0 +1,263 @@
* test_init_env_auto_roadef.prg
* Varianta ROADEF a test_init_env_auto.prg (acel fisier e specializat pe ROACONT -
* gcAppPath/clase/proceduri hardcodate D:\ROA\ROACONT\ - nu poate initializa mediul ROADEF).
* Initializare completa de mediu FARA interactiune, pentru vfp9.exe -A -T.
*
* MOTIVUL EXISTENTEI: D:\ROA\ROACONT\COMUN si D:\ROA\ROADEF\COMUN sunt doua working copy-uri
* SEPARATE ale aceluiasi COMUN din SVN, nu junctions. Un test pornit cu test_init_env_auto.prg
* incarca D:\ROA\ROACONT\COMUN\programe\*.prg, deci NU vede modificarile necomise din
* D:\ROA\ROADEF\COMUN si da rezultate false (verificat: AnafNomenclator lipseste acolo).
* Testele pe cod ROADEF necomis folosesc acest fisier.
*
* Utilizare:
* DO test_init_env_auto_roadef WITH 'CENTRAL', 'MARIUSM_AUTO', 'parola'
* IF gnHandle <= 0 ... eroare conectare
* Mediu de test standard: server CENTRAL, schema MARIUSM_AUTO.
*
* Dupa apel sunt disponibile: goConn/goExecutor/goApp/goLog/goApi, goFirma/goCalendar,
* gnAn/gnLuna/gcS/gnIdFirma/gnScrieRegistru etc., SET PATH/CLASSLIB/PROCEDURE ca in roadef.prg.
* ATENTIE: mentine lista de SET CLASSLIB/PROCEDURE sincronizata cu Programe\roadef.prg.
LPARAMETERS tcHost, tcSchema, tcPassword, tnAn, tnLuna
tcHost = IIF(EMPTY(tcHost), 'CENTRAL', tcHost)
tcSchema = IIF(EMPTY(tcSchema), 'MARIUSM_AUTO', tcSchema)
tcPassword = IIF(EMPTY(tcPassword), 'ROMFASTSOFT', tcPassword)
SET DELETED ON
SET ANSI ON
SET EXACT ON
SET SAFETY OFF
CLOSE DATABASES
SET CENTURY ON
SET DATE DMY
SET NULLDISPLAY TO ''
PUBLIC CT_SUCCES, CT_INSUCCES, crlf, gnAn, gnLuna, gnIdUtil, glEMama, gnIdFirma, gcCondSucursala, ;
gnIdSucursala, gcS, gcFirma, gcUserName, gcUserNameApp, gcNumeProgram, gcAppName, glLunaInchisa, ;
buton, gnButon, pnButon, gl406, gcAcces, gnid_prg_owner, gnScrieRegistru, ;
pcTitlu, pl_verificat, a4, gcUtilizatoriPath, gcPasswordApp, gcCaleServerDate, ;
gnNivelUtilizator, gnGrupUtilizator
CT_SUCCES = 1
CT_INSUCCES = -1
crlf = CHR(13) + CHR(10)
gnAn = IIF(EMPTY(tnAn), YEAR(DATE()), tnAn)
gnLuna = IIF(EMPTY(tnLuna), MONTH(DATE()), tnLuna)
gnIdUtil = -3
gnIdFirma = 110
gcCondSucursala = []
gnIdSucursala = m.gnIdFirma
gcS = UPPER(ALLTRIM(tcSchema))
gcFirma = m.gcS
gcUserName = m.gcS
gcUserNameApp = [MARIUS M]
gcPasswordApp = []
gcNumeProgram = [ROADEF]
gcAppName = [ROADEF]
glLunaInchisa = .F.
glEMama = .F.
gl406 = .F.
gnid_prg_owner = 0
pcTitlu = []
pl_verificat = .F.
a4 = .T.
gnNivelUtilizator = 0
gnGrupUtilizator = 0
gcCaleServerDate = []
* gnScrieRegistru: optiune de firma (registrul electronic al salariatilor). frm_firme_nou.Init
* o citeste NEPROTEJAT (ofirma.vc2, "IF gnScrieRegistru = 0"), deci trebuie sa existe INAINTE de
* optiuni_firma; daca optiunile o redefinesc mai jos, valoarea lor castiga.
gnScrieRegistru = 0
* PUBLIC, nu Declare: nrcrt() (oproceduri_comune.prg) citeste NROR din ControlSource-uri
* de grid mult dupa ce acest program s-a terminat (Declare ar muri la RETURN)
PUBLIC nror(65000)
buton = 1
gnButon = 1
pnButon = 1
LOCAL lcPath
PUBLIC gcAppPath, DIRGEN, gcDirMare, gcBasePath, gcTempPath, gcGeneralIniFile, gcSettingsFile, ;
gcSecurityPath, gcSecurityFile
gcAppPath = [D:\ROA\ROADEF\]
Set Default To (gcAppPath)
lcPath = gcAppPath + 'Date;' + ;
gcAppPath + 'Include;' + ;
gcAppPath + 'FERESTRE;' + ;
gcAppPath + 'GRAFICE;' + ;
gcAppPath + 'CLASE;' + ;
gcAppPath + 'MENIURI;' + ;
gcAppPath + 'PROGRAME;' + ;
gcAppPath + 'RAPOARTE;' + ;
gcAppPath + 'COMUN\CLASE;' + ;
gcAppPath + 'COMUN\FERESTRE;' + ;
gcAppPath + 'COMUN\PROGRAME;' + ;
gcAppPath + 'COMUN\GRAFICE;' + ;
gcAppPath + 'COMUN\RAPOARTE;' + ;
gcAppPath + 'COMUN\UTILE\CTL32;' + ;
gcAppPath + 'COMUN\UTILE\HPDF;' + ;
gcAppPath + 'COMUN\UTILE\HPDF\REPORTOUTPUT;' + ;
gcAppPath + 'COMUN\UTILE\WEB;' + ;
gcAppPath + 'COMUN\UTILE\NFJSON;' + ;
Addbs(Substr(gcAppPath,1,Rat([\],gcAppPath,2)))+[COMUNROA\]
SET PATH TO &lcPath ADDITIVE
Local lcMainClassLib
lcMainClassLib = gcAppPath + "clase\ofundal_sal"
SET CLASSLIB TO (lcMainClassLib) ADDITIVE
SET CLASSLIB TO CAUT ADDITIVE
SET CLASSLIB TO ooptiuni ADDITIVE
SET CLASSLIB TO ferestre_cere_date ADDITIVE
SET CLASSLIB TO oblocare ADDITIVE
SET CLASSLIB TO registry ADDITIVE
SET CLASSLIB TO decabaza ADDITIVE
SET CLASSLIB TO onomenclatoare ADDITIVE
SET CLASSLIB TO onom_sal ADDITIVE
SET CLASSLIB TO cauta_alfa_forms ADDITIVE
SET CLASSLIB TO ferestre_oracle ADDITIVE
SET CLASSLIB TO caut_ora ADDITIVE
SET CLASSLIB TO otoolbar ADDITIVE
SET CLASSLIB TO Messagebox ADDITIVE
SET CLASSLIB TO opersonal ADDITIVE
SET CLASSLIB TO oasociere ADDITIVE
SET CLASSLIB TO ofirma ADDITIVE
SET CLASSLIB TO ferestre_roadef ADDITIVE
SET CLASSLIB TO oconfigurare_seturi.vcx ADDITIVE
SET CLASSLIB TO wwdialogs.vcx ADDITIVE
SET CLASSLIB TO overificari.vcx ADDITIVE
SET CLASSLIB TO appwiz.vcx ADDITIVE
SET CLASSLIB TO accessibility.vcx ADDITIVE
SET PROCEDURE TO acces_meniu ADDITIVE
SET PROCEDURE TO ooperatii_comune ADDITIVE
SET PROCEDURE TO quitapp ADDITIVE
SET PROCEDURE TO init_program ADDITIVE
SET PROCEDURE TO proceduri_comune ADDITIVE
SET PROCEDURE TO oproceduri_comune ADDITIVE
SET PROCEDURE TO gencursor.prg ADDITIVE
SET PROCEDURE TO updateserver.prg ADDITIVE
SET PROCEDURE TO oproceduri_maintenance.prg ADDITIVE
SET PROCEDURE TO onomenclatoare ADDITIVE
SET PROCEDURE TO oproceduri_ams ADDITIVE
SET PROCEDURE TO ocautare ADDITIVE
SET PROCEDURE TO oproceduri_roadef_sal ADDITIVE
SET PROCEDURE TO oinit_optiuni ADDITIVE
SET PROCEDURE TO osecurity ADDITIVE
SET PROCEDURE TO oproceduri_roadef ADDITIVE
SET PROCEDURE TO wwcodeupdate.prg ADDITIVE
SET PROCEDURE TO wwxmlhttp.prg ADDITIVE
SET PROCEDURE TO ini.prg ADDITIVE
SET PROCEDURE TO osalarii_comun.prg ADDITIVE
SET PROCEDURE TO wwutils.prg ADDITIVE
SET PROCEDURE TO proceduri_Excel.prg ADDITIVE
SET PROCEDURE TO cauta_alfa.prg ADDITIVE
SET PROCEDURE TO oproceduri_app.prg ADDITIVE
SET PROCEDURE TO iniacces.prg ADDITIVE
SET PROCEDURE TO oupdate.prg ADDITIVE
SET PROCEDURE TO procese.prg ADDITIVE
SET PROCEDURE TO version.prg ADDITIVE
SET PROCEDURE TO xmlaccess.prg ADDITIVE
SET PROCEDURE TO xmlparser.prg ADDITIVE
SET PROCEDURE TO filebringer.prg ADDITIVE
SET PROCEDURE TO wwhttp.prg ADDITIVE
SET PROCEDURE TO wwApi.prg ADDITIVE
SET PROCEDURE TO validare.prg ADDITIVE
SET PROCEDURE TO nfjsonread.prg ADDITIVE
SET PROCEDURE TO nfjsoncreate.prg ADDITIVE
Declare Integer GetPrivateProfileString In Kernel32 ;
string, String, String, String @, Integer, String
Declare Integer WritePrivateProfileString In Kernel32 ;
string, String, String, String
Declare Integer CopyFile In kernel32 ;
STRING lpExistingFileName, STRING lpNewFileName, INTEGER bFailIfExists
Declare Integer URLDownloadToFile In urlmon.Dll ;
INTEGER pCaller, String szURL, String szFileName, INTEGER dwReserved, Integer lpfnCB
Declare Integer PathFileExists In shlwapi STRING pszPath
If Type('goApi') = 'U'
Public goApi
goApi = Newobject("wwAPI", "wwAPI.prg")
ENDIF
PUBLIC gnHandle, goExecutor, goConn, goFirma, goCalendar, poLog, goLog, goApp
DIRGEN = [D:\ROA\]
gcDirMare = DIRGEN
gcBasePath = DIRGEN
gcSecurityPath = DIRGEN + 'Security\'
gcSecurityFile = gcSecurityPath + 'ROA_SECURITY.TXT'
gcGeneralIniFile = DIRGEN + "settings.ini"
gcSettingsFile = m.gcGeneralIniFile
gcUtilizatoriPath = gcAppPath + "UTILIZATORI\"
gcTempPath = Addbs(Shortpath(goApi.GetTempPath())) + gcS + [\]
If !Directory(gcTempPath)
Md (gcTempPath)
Endif
gcAcces = [1;2;3;4;5;6;7;8;]
poLog = Newobject("Log_Mesaje", "Log_Mesaje.prg")
goLog = poLog
goApp = Createobject("wzApplication")
gnHandle = 0
goExecutor = Createobject("oExecutor")
goConn = Createobject("oConn")
goConn.Connect(m.tcHost, m.tcSchema, m.tcPassword)
IF m.gnHandle <= 0
RETURN .F.
ENDIF
LOCAL llSucces, lcSql
goFirma = null
llSucces = goExecutor.oExecuta("select * from syn_v_nom_firme where schema = ?gcS", "cFirma")
IF m.llSucces
SELECT cFirma
gnIdFirma = id_firma
gnIdSucursala = null
gcFirma = ALLTRIM(firma)
SCATTER NAME goFirma
IF TYPE('goFirma.codfiscalfro') = 'U'
ADDPROPERTY(goFirma, 'codfiscalfro', ALLTRIM(STRTRAN(ALLTRIM(NVL(goFirma.cod_fiscal, '')), 'RO', '')))
ENDIF
ELSE
goFirma = CREATEOBJECT('custom')
goFirma.addproperty('cod_fiscal', '')
goFirma.addproperty('schema', m.gcS)
goFirma.addproperty('firma', m.gcS)
goFirma.addproperty('codfiscalfro', '')
ENDIF
USE IN (SELECT('cFirma'))
goCalendar = null
llSucces = goExecutor.oExecuta('SELECT anul, luna, tva_incasare FROM calendar WHERE an*12+luna = (select MAX(an*12+luna) FROM calendar)', 'cCalendar')
IF m.llSucces
SELECT cCalendar
GO TOP
IF EMPTY(m.tnAn)
gnAn = anul
gnLuna = luna
ENDIF
SCATTER NAME goCalendar
ENDIF
USE IN (SELECT('cCalendar'))
CREATE CURSOR dual (dummy c(10))
INSERT INTO dual (dummy) VALUES ("")
actualizeaza_optiuni()
Do optiuni_firma IN oinit_optiuni.prg
lcSql = [begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]
llSucces = goExecutor.oExecuta(lcSql)
lcSql = [begin pack_sesiune.setluna(?gnLuna); pack_sesiune.setan(?gnAn); end;]
llSucces = goExecutor.oExecuta(lcSql)
lcSql = [begin pack_sesiune.setlunabal(?gnLuna); pack_sesiune.setanbal(?gnAn); end;]
llSucces = goExecutor.oExecuta(lcSql)
lcSql = [begin pack_contafin.SET_DATA_RON(?gcS); end;]
llSucces = goExecutor.oExecuta(lcSql)
lcSql = [begin pack_sesiune.set_data_ron(?gcS); end;]
llSucces = goExecutor.oExecuta(lcSql)
lcSql = [begin pack_contafin.set_id_sucursala(?gnIdSucursala); end;]
llSucces = goExecutor.oExecuta(lcSql)
lcSql = [begin pack_contafin.set_id_firma(?gnIdFirma); end;]
llSucces = goExecutor.oExecuta(lcSql)
RETURN .T.