Merge branch 'main' of gitea.romfast.ro:romfast/comun

This commit is contained in:
2026-08-06 12:44:23 +03:00
5 changed files with 1312 additions and 4 deletions

View File

@@ -245,11 +245,11 @@ TRY
DO CreeazaIntrodc WITH 'introdc' DO CreeazaIntrodc WITH 'introdc'
DO CreeazaIntrodc WITH 'introdc_sablon' DO CreeazaIntrodc WITH 'introdc_sablon'
INSERT INTO introdc_sablon (scd, scc, cu_tva, ordine, id_set, participa_valuta, tip_rand, ; INSERT INTO introdc_sablon (scd, scc, cu_tva, ordine, id_set, participa_valuta, tip_rand, ;
id_jtva_coloana, ptva, explicatie_tva) ; id_jtva_coloana, ptva, explicatie_tva, taxcode) ;
VALUES ('371', '401', 1, 1, 1, .T., 'B', 208, 21, 'ACH. INT. 21%') VALUES ('371', '401', 1, 1, 1, .T., 'B', 208, 21, 'ACH. INT. 21%', 301204)
INSERT INTO introdc_sablon (scd, scc, cu_tva, ordine, id_set, participa_valuta, tip_rand, ; INSERT INTO introdc_sablon (scd, scc, cu_tva, ordine, id_set, participa_valuta, tip_rand, ;
id_jtva_coloana, ptva, explicatie_tva) ; id_jtva_coloana, ptva, explicatie_tva, taxcode) ;
VALUES ('4426', '401', 1, 2, 1, .T., 'T', 209, 21, 'TVA ACH. INT. 21%') VALUES ('4426', '401', 1, 2, 1, .T., 'T', 209, 21, 'TVA ACH. INT. 21%', 301204)
GO TOP IN introdc_sablon GO TOP IN introdc_sablon
DO CreeazaRulTemp DO CreeazaRulTemp
@@ -735,6 +735,34 @@ PROCEDURE VerificaRandD
lcMsg = 'FAIL ' + tcLabel + '-randD: nu exista rand tip_rand=D in introdc dupa sincronizeaza() (diferenta asteptata=' + TRANSFORM(lnSumaAsteptata) + ')' lcMsg = 'FAIL ' + tcLabel + '-randD: nu exista rand tip_rand=D in introdc dupa sincronizeaza() (diferenta asteptata=' + TRANSFORM(lnSumaAsteptata) + ')'
ENDIF ENDIF
DO R7Log WITH lcMsg DO R7Log WITH lcMsg
DO VerificaTaxCodeRandD WITH tcLabel
SELECT (lnSel)
ENDPROC
PROCEDURE VerificaTaxCodeRandD
*-- randul D (diferenta 6xx) nu are cod de taxa SAFT; randurile de baza si TVA il pastreaza.
LPARAMETERS tcLabel
LOCAL lnSel, lcMsg, lnTaxD, lnFaraTax
lnSel = SELECT()
SELECT introdc
LOCATE FOR tip_rand == 'D'
IF !FOUND()
DO R7Log WITH 'FAIL ' + tcLabel + '-randD-taxcode: nu exista rand tip_rand=D'
SELECT (lnSel)
RETURN
ENDIF
lnTaxD = NVL(taxcode, 0)
lnFaraTax = 0
SCAN FOR INLIST(tip_rand, 'B', 'S', 'T', 'G') AND EMPTY(NVL(taxcode, 0))
lnFaraTax = lnFaraTax + 1
ENDSCAN
IF EMPTY(lnTaxD) AND lnFaraTax = 0
lcMsg = 'PASS ' + tcLabel + '-randD-taxcode: randul D are taxcode gol, iar randurile B/S/T/G il pastreaza'
ELSE
lcMsg = 'FAIL ' + tcLabel + '-randD-taxcode: taxcode pe randul D=' + TRANSFORM(lnTaxD) + ;
' (astept 0), randuri B/S/T/G fara taxcode=' + TRANSFORM(lnFaraTax) + ' (astept 0)'
ENDIF
DO R7Log WITH lcMsg
SELECT (lnSel) SELECT (lnSel)
ENDPROC ENDPROC

View File

@@ -0,0 +1,128 @@
# Date de test - NNIR editabil in Registru Jurnal
Baza: `MARIUSM_AUTO@ROA_CENTRAL` (test, nu productie). Verificare: `verif_nnir_cod.sql` in acest
folder (`sqlplus ... @verif_nnir_cod.sql <cod>`).
| Caz | COD | AN | LUNA | ID_SET | NNIR curent | ACT randuri | RUL randuri | RUL_OBINV randuri |
|---|---|---|---|---|---|---|---|---|
| NIR/achizitie (principal) | 1140841 | 2026 | 7 | 209 | 3 | 7 (doar 1 cu nnir=3, restul 0) | 1 (nnir=3) | 0 |
| Obiecte de inventar | 1140835 | 2026 | 6 | 211 | 2026060001 | 1 | 0 | 2 (nnir=2026060001) |
| Fara rulaje | 1140848 | 2026 | 7 | 209 | 124 | 2 (ambele nnir=124) | 0 | 0 |
| Nota de inventar (blocare) | 1140716 | 2026 | 3 | 90101 | 2026030004 | 1 | 1 (nnir=2026030004) | 0 |
Note:
- ACT e pe linii (nu pe antet) - la COD 1140841 doar linia efectiv legata de rulaj are NNIR-ul
real, restul liniilor documentului au NNIR=0. Sincronizarea (`WHERE Nvl(nnir,0) = vechi`) trebuie
sa lase liniile cu 0 neatinse.
- Nu exista nicio nota cu `id_set=90101` sau cu rulaje in `RUL_OBINV` in luna curenta de lucru
(AN=2026, LUNA=7) - alese din perioade anterioare. Editarea reala prin `afisjurcom.do_modifica`
e limitata la luna curenta (`comun.vc2:2265-2268`); testul instantiaza `frm_modific2024` direct
(ca `test_repro_cnrcrt_footer.prg`), cu cursoare construite pe AN/LUNA propriu notei, ocolind
acel filtru - la fel ca precedentul deja acceptat in `achizitie_import`.
## Stare implementare (livrata, 03.08.2026)
`COMUN\clase\omodificari.vc2` (frm_modific2024):
- `Grid1.ColumnCount = 44`, `Column44.ControlSource = "nnir"` (la runtime apare calificat automat
de VFP cu aliasul cursorului: `tact.nnir`), `ReadOnly = .F.` - confirmat prin instantiere reala
(nu doar citire de sursa).
- `PROCEDURE sincronizeaza_nnir(tnNnirVechi, tnNnirNou)` (`omodificari.vc2:13762`) - update pe
`tact`/`trul`/`trul_obinv` unde `Nvl(nnir,0) = vechi`, cu revenire pe recno. Propaga si valoarea
0 (stergerea NNIR) - nu exista garda `EMPTY` pe valoarea noua.
- Legare pe coloana: `Grid1.Column44.Text1.When` retine valoarea veche in `thisform.nnnirvechi`;
**`Grid1.Column44.Text1.LostFocus`** apeleaza `sincronizeaza_nnir` si `Thisform.Grid1.Refresh()`
- `Valid` a fost eliminat (la textbox valoarea nu ajunge in ControlSource decat DUPA ce Valid
returneaza .T., deci nu propaga). Testul declanseaza `LostFocus`.
- Blocarea pentru `id_set = 90101` (nota de inventar): in `Init` (`omodificari.vc2:13654`) SI
reimpusa in `Grid1.AfterRowColChange` (14289-14292), dupa `SetAll("ReadOnly", ...)` - fara a doua,
`SetAll` anuleaza blocarea la prima navigare in grid.
- `ColumnOrder = 7` in clasa, plus repozitionare la runtime in `Show()`, dupa `gridextra1.setup()`
(13729-13738) - preferintele de grid salvate per utilizator impingeau coloana noua la coada
(vezi `COMUN\docs\capcana_grid_preferinte_utilizator.md`). Pozitia NU e o asertiune stabila intre
masini; asertat tare in test: `ControlSource = "nnir"`, `ReadOnly` (.F. normal / .T. pe
id_set 90101), propagarea valorii.
## Cerinte de mediu descoperite la construirea harness-ului (deja tratate in scripturile livrate)
- `COMUN\utile\Teste\test_init_env_auto.prg` (generic) e de fapt specific ROACONT (`gcAppPath`,
classlib-uri si proceduri hardcodate `D:\ROA\ROACONT\`) - inutilizabil pentru ROAGEST. S-a scris
`COMUN\utile\Teste\test_init_env_auto_roagest.prg`, cu SET PATH/CLASSLIB/PROCEDURE reconstruite
din `Programe\roagest.prg`.
- `gcUserName` trebuie setat explicit inainte de `optiuni_firma` (`oinit_optiuni.prg`) - altfel
`SCRIE_OPTIUNI(gcUserName)` da "Operator/operand type mismatch" (PUBLIC nedeclarat ramane
logic .F.). **`gcUserName` e schema/userul de conectare Oracle** (`Programe\roagest.prg:560,575`)
- `SCRIE_OPTIUNI` il foloseste direct in `from <gcUserName>.optiuni`, deci trebuie
`gcUserName = m.gcS`, NU un nume de persoana (ex. 'MARIUS M' da ORA-00907, identificator invalid
- incercare gresita initiala). Numele de persoana e `gcUserNameApp` (variabila separata).
- `frm_modific2024` face `Seek(..,'crsJtvaTemp','id_jtva')` in ControlSource-ul coloanei de
explicatie TVA a rulajelor (Column63) - evaluat la CONSTRUCTIA formularului. Fara cursorul
deschis, `CREATEOBJECT('frm_modific2024',...)` pica cu "File 'crsjtvatemp.dbf' does not exist".
Fix: `update_jtva_coloane('', 'crsJtvaTemp', 6)` (in `COMUN\programe\updateserver.prg:553`)
inainte de instantiere - construieste direct cursorul cu indexul cerut, fara pasii intermediari
folositi de exemplul ROACONT (`update_jtva_coloana`/`crsExplicatiiTVATemp`, care oricum nu
exista in ROAGEST).
- Mock-ul `amessagebox` trebuie incarcat **INAINTE** de `test_init_env_auto_roagest.prg` (nu doar
dupa, cum sugereaza exemplele din `achizitie_import`) - `optiuni_firma` poate afisa un dialog
real daca `SCRIE_OPTIUNI` raporteaza eroare, inainte sa apuce sa se incarce mock-ul "la coada".
- La citirea unei coloane de grid prin ControlSource dintr-un cursor legat ca RecordSource, VFP
calificat automat campul simplu cu aliasul (`nnir` -> `tact.nnir`) - comparatiile exacte
`== 'NNIR'` trebuie sa accepte si forma calificata.
- Coloanele de grid nu sunt garantat numite `Column<N>` - unele au `Name` custom (ex. `cAles` pe
pozitia 41 in acest grid); accesul dinamic la coloana trebuie facut prin colectia
`Grid1.Columns(i)`, nu prin constructia textuala a numelui `"column" + TRANSFORM(i)`.
- `frm_modific2024.Grid1.AfterRowColChange` are propria logica de blocare pe sucursala (SetAll
ReadOnly pe toate coloanele daca `Nvl(gnIdSucursala,0) <> Nvl(tAct.id_sucursala,0)`) - independenta
de blocarea 90101, se declanseaza automat la pozitionare in grid. COD 1140835 (cazul obiecte de
inventar) are `id_sucursala` diferit de sesiunea de test (`gnIdSucursala = NULL`), deci Column44
iese `ReadOnly=.T.` in acest scenariu - nu e o eroare, e comportament existent, neplanificat de
NNIR; sincronizarea tot functioneaza (apelul e direct, nu prin UI).
- **Termin reatribuie COD nou**: `afisjurcom.do_modifica` (comun.vc2:2444-2487) cheama
`oscrie_in_fisiere` de DOUA ori - intai `(2,.T.,llRul)` (STERGE, marcheaza `sters=1` pe COD-ul
ORIGINAL, din `actactan` neatins de editare), apoi `(0,.T.,llRul)` (SCRIE varianta editata sub
COD nou, generat de `pack_contafin`, sub AN/LUNA de sesiune curenta - nu pastreaza COD-ul/AN/LUNA
notei editate). Verificarea si curatenia testului se fac dupa NNIR (marcaj distinct), nu dupa
COD, si readuc nota originala la `sters=0` dupa test (pasul STERGE o dezactiveaza altfel permanent).
- Salvarea reala cere tranzactie manuala explicita: `SQLSetProp(gnHandle,'Transactions',2)` inainte
de blocul STERGE+SCRIE+finalizeaza, apoi `SQLCOMMIT(gnHandle)`/`SQLROLLBACK` +
`SQLSetProp(...,1)` dupa - echivalentul direct al `thisform.do_deschide_tranzactie()`/
`do_inchide_tranzactie()` din `afisjurcom` (`_frm_base.vc2:252-305`, mostenite, apelate pe
formularul de jurnal - nu pe `frm_modific2024`, deci invizibile la o privire doar pe clasa notei).
Fara acest wrapping, `oscrie_in_fisiere`/`finalizeaza_modificare_nota` raporteaza succes dar nu
se vede nimic persistat, nici in aceeasi sesiune.
## Capcana: .FXP stale ascunde scenariile noi
VFP nu recompileaza .prg-ul daca exista un .FXP mai vechi - ruleaza tacut versiunea veche a
scriptului. Simptom: suita raporteaza PASS-uri corecte, dar scenariile adaugate dupa ultima
compilare nu apar deloc in log (verifica numarul de assert-uri, nu doar `0 FAIL`). Sterge
.FXP-ul inainte de fiecare rulare.
## Capcana: dialog modal "Enter the value for <var>" in loc de eroare catchabila
O variabila memorie lipsa/umbrita folosita ca `?param` intr-un SQL pass-through (SQLEXEC/
`goExecutor.oExecuta`) NU da o eroare VFP catchabila (ON ERROR) - deschide dialogul nativ
"View Parameter" ("Enter the value for <var>"), MODAL, care blocheaza tot procesul headless la
nesfarsit si nu lasa nimic in log (spre deosebire de un `REPLACE`/expresie cu aceeasi variabila
lipsa, care DA eroare catchabila - vezi cazul `gnIdUtil` scapat o data ca `PRIVATE` neasignat).
Simptom: proces `vfp9.exe` care nu mai raspunde, fara `.ERR`, fara linie noua in log.
Remediu: **garda explicita inainte de orice rulare care ajunge la cod ce foloseste `?param`** -
verifica `TYPE(<nume>) == 'U'` pe toate variabilele relevante (nu doar cele proprii testului, ci
si cele din codul apelat: `oscrie_in_fisiere`, `pack_contafin`/`pack_sesiune`, `oinit_optiuni.prg`)
si opreste testul cu FAIL clar in log daca lipseste ceva, inainte sa ajunga la SQLEXEC. Implementat
in `test_nnir_sincronizare.prg` (`NnirGardaVariabile`, apelata imediat dupa init mediu). `TYPE()`
returneaza `'X'` (nu `'U'`) pentru NULL - o valoare NULL e un bind valid, doar variabila absenta
e problema.
## Rezultat test complet (03.08.2026, pe binarul livrat)
**33 PASS, 0 FAIL** pe cele 6 scenarii: NIR, obiecte de inventar si nota fara rulaje (toate cu
salvare reala prin Termin + verificare in Oracle), blocare `id_set=90101`, `NNIR -> 0`, si blocare
`id_set=90101` pe sucursala curenta. Baza de test verificata dupa rulare: cele 4 note originale
(1140841, 1140835, 1140848, 1140716) raman intacte (NNIR si `sters` la valorile initiale); notele
noi create de Termin (COD reatribuit) au fost marcate `sters=1` de curatenia din test.
Scenariul 6 (`INVENTAR2`) exista pentru ca scenariul 4 ruleaza pe o nota din ALTA sucursala, unde
`AfterRowColChange` blocheaza oricum tot gridul - trecea din motivul gresit. Scenariul 6 aliniaza
`gnIdSucursala` la nota (`llReadOnly` iese `.F.`) si asertesteaza si ca restul coloanelor raman
editabile, altfel blocarea NNIR nu dovedeste nimic.

View File

@@ -0,0 +1,839 @@
* test_nnir_sincronizare.prg
* Test e2e (fluxul real): NNIR editabil in Registru Jurnal, cu sincronizare in tact/trul/trul_obinv
* si in ACT/RUL/RUL_OBINV (Oracle). Vezi cerinta initiala (todos.txt pct. 9) si
* date_test_nnir.md (datele de test alese, an/luna/cod, stare implementare la data scrierii).
*
* Instantiaza frm_modific2024 direct (ca test_repro_cnrcrt_footer.prg din achizitie_import),
* cu cursoarele tact/trul/trul_obinv construite exact ca afisjurcom.do_modifica (comun.vc2:2352-
* 2434), dar pe AN/LUNA proprii notei - do_modifica limiteaza editarea la luna curenta de lucru
* (comun.vc2:2265-2268), iar notele de test nu sunt toate in luna curenta.
*
* Editarea NNIR se simuleaza ca un utilizator: pozitionare pe rand, declansarea evenimentelor
* reale ale coloanei (When la intrare, LostFocus la iesire - textboxul nu comite valoarea in
* ControlSource inainte de Valid, de-aia implementarea sincronizeaza pe LostFocus), NU apel
* direct al metodei de sincronizare. Salvarea (Termin) replica blocul din
* afisjurcom.do_modifica (comun.vc2:2456-2487): oscrie_in_fisiere + pack_contafin.
* finalizeaza_modificare_nota. Termin reatribuie COD nou (pack_contafin), sub AN/LUNA de sesiune
* curenta - nu pastreaza COD-ul original; verificarea si curatenia de dupa salvare se fac dupa
* valoarea NNIR marcaj (nu poate coincide cu date reale), marcand sters=1 (conventia aplicatiei)
* orice a ajuns sub acea valoare - nota originala (COD/NNIR vechi) ramane intacta.
*
* Rulare headless (nu tine VFP IDE deschis; nu rula cu roagest.exe pornit):
* & "C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe" -A -T ;
* "D:\ROA\ROAGEST\COMUN\utile\Teste\nnir_registru_jurnal\test_nnir_sincronizare.prg"
* Timeout recomandat: minim 220s. Log: %TEMP%\test_nnir_sincronizare_log.txt (PASS/FAIL pe linie).
* STERGE .FXP-ul inainte de rulare: VFP nu recompileaza automat si ruleaza tacut versiunea
* veche a scriptului - scenariile adaugate intre timp lipsesc cu totul din log.
LPARAMETERS tcMode
tcMode = IIF(EMPTY(tcMode), 'ALL', UPPER(ALLTRIM(tcMode)))
SET SAFETY OFF
SET TALK OFF
PUBLIC gcLogFile, gnFail, gnPass
gcLogFile = ADDBS(SYS(2023)) + 'test_nnir_sincronizare_log.txt'
gnFail = 0
gnPass = 0
STRTOFILE('START ' + tcMode + ' ' + TTOC(DATETIME()) + CHR(13)+CHR(10), gcLogFile)
ON ERROR DO NnirErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
* mock amessagebox incarcat INAINTE de mediul aplicatiei: optiuni_firma (in mediul de test)
* poate afisa un dialog real daca SCRIE_OPTIUNI raporteaza eroare
SET PROCEDURE TO D:\ROA\ROAGEST\COMUN\utile\Teste\mock_amessagebox.prg ADDITIVE
DO D:\ROA\ROAGEST\COMUN\utile\Teste\test_init_env_auto_roagest.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
DO NnirLog WITH 'EROARE: conectare Oracle esuata'
DO NnirLog WITH 'REZULTAT SUITA: NEDETERMINAT'
QUIT
ENDIF
DO NnirLog WITH 'mediu OK, gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna)
* garda anti-blocaj: o variabila lipsa folosita ca ?param intr-un SQL pass-through NU da eroare
* catchabila - VFP deschide dialogul modal nativ "Enter the value for <var>", care blocheaza
* headless-ul la nesfarsit si nu lasa nimic in log (vezi date_test_nnir.md). Verificare
* explicita INAINTE de orice apel care le foloseste, opreste testul cu FAIL clar daca lipseste ceva.
IF !NnirGardaVariabile()
DO NnirLog WITH 'REZULTAT SUITA: NEDETERMINAT (garda variabile a picat)'
QUIT
ENDIF
* mock amessagebox - se incarca ULTIMUL (dupa fisierele aplicatiei), vezi antetul mock-ului
SET PROCEDURE TO D:\ROA\ROAGEST\COMUN\utile\Teste\mock_amessagebox.prg ADDITIVE
* Grid1.Column63 (explicatie TVA pe rulaje) face Seek pe alias 'crsJtvaTemp' la CONSTRUCTIA
* formularului (inainte de Init) - fara cursorul deschis, CREATEOBJECT('frm_modific2024',...)
* pica cu "File 'crsjtvatemp.dbf' does not exist"
update_jtva_coloane('', 'crsJtvaTemp', 6)
LOCAL Omodif, lcCallWhen, lcCallLostFocus, lcCall
*=====================================================================================
* Scenariul 1: NIR/achizitie, cu rulaje in RUL, cu salvare (Termin) + verificare Oracle
*=====================================================================================
IF INLIST(tcMode, 'ALL', 'NIR')
LOCAL lnCod, lnAn, lnLuna, lnIdSet, lnNnirVechi, lnNnirNou
LOCAL lnCntTactVechi, lnCntTrulVechi, lnCntTactNou, lnCntTrulNou
LOCAL i, llGasit, lnColOrder, llReadOnly, lnColCheck, lcColName
lnCod = 1140841
lnAn = 2026
lnLuna = 7
lnIdSet = 209
lnNnirVechi = 3
lnNnirNou = lnNnirVechi + 90000000
DO NnirConstruiesteCursoare WITH lnCod, lnAn, lnLuna
SELECT tact
lnCntTactVechi = 0
COUNT FOR NVL(nnir,0) = lnNnirVechi TO lnCntTactVechi
SELECT trul
lnCntTrulVechi = 0
COUNT FOR NVL(nnir,0) = lnNnirVechi TO lnCntTrulVechi
Omodif = CREATEOBJECT('frm_modific2024', lnIdSet)
IF VARTYPE(Omodif) <> 'O'
DO NnirAssert WITH 'instantiere', 'NIR', .F., 'frm_modific2024 nu s-a instantiat'
ELSE
SELECT tact
Omodif.grid1.SetFocus
Omodif.gridextra1.setup()
Omodif.CalculeazaTotal()
llGasit = .F.
lnColOrder = 0
llReadOnly = .T.
lnColCheck = 0
FOR i = 1 TO Omodif.grid1.ColumnCount
lcColName = 'Omodif.grid1.Columns(' + TRANSFORM(i) + ')'
IF NnirEsteColoanaNnir(EVALUATE(lcColName + '.ControlSource'))
llGasit = .T.
lnColOrder = EVALUATE(lcColName + '.ColumnOrder')
llReadOnly = EVALUATE(lcColName + '.ReadOnly')
lnColCheck = i
ENDIF
ENDFOR
DO NnirAssert WITH 'coloana_grid', 'NIR', llGasit, 'ControlSource=nnir gasit=' + ;
TRANSFORM(llGasit) + ' ColumnOrder=' + TRANSFORM(lnColOrder) + ' ReadOnly=' + TRANSFORM(llReadOnly)
IF llGasit
DO NnirAssert WITH 'coloana_editabila', 'NIR', !llReadOnly, 'nota normala: ReadOnly asteptat .F.'
SELECT tact
LOCATE FOR NVL(nnir,0) = lnNnirVechi
IF FOUND()
lcCallWhen = 'Omodif.grid1.Columns(' + TRANSFORM(lnColCheck) + ').Text1.When'
&lcCallWhen
REPLACE nnir WITH lnNnirNou
lcCallLostFocus = 'Omodif.grid1.Columns(' + TRANSFORM(lnColCheck) + ').Text1.LostFocus'
&lcCallLostFocus
SELECT tact
lnCntTactNou = 0
COUNT FOR NVL(nnir,0) = lnNnirNou TO lnCntTactNou
DO NnirAssert WITH 'sync_tact', 'NIR', lnCntTactNou = lnCntTactVechi, ;
TRANSFORM(lnCntTactNou) + ' randuri tact cu nnir nou (asteptat ' + TRANSFORM(lnCntTactVechi) + ')'
* trul = cursorul legat de pgfArticole.page1.grdRulaje (RecordSource) - verificare
* explicita ca propagarea se vede in cursorul de rulaje, nu doar in tact
SELECT trul
lnCntTrulNou = 0
COUNT FOR NVL(nnir,0) = lnNnirNou TO lnCntTrulNou
DO NnirAssert WITH 'sync_trul', 'NIR', lnCntTrulNou = lnCntTrulVechi, ;
TRANSFORM(lnCntTrulNou) + ' randuri trul (grid rulaje) cu nnir nou (asteptat ' + TRANSFORM(lnCntTrulVechi) + ')'
ELSE
DO NnirAssert WITH 'locate_rand_vechi', 'NIR', .F., 'nu s-a gasit randul cu nnir vechi in tact'
ENDIF
ENDIF
DO NnirVerificaOracleNeschimbat WITH lnCod, lnNnirVechi, 'NIR'
Omodif.Release()
Omodif = NULL
DO NnirSalveazaSiVerifica WITH lnCod, lnAn, lnLuna, lnIdSet, lnNnirVechi, lnNnirNou, 'NIR'
ENDIF
DO NnirCurataCursoare
ENDIF
*=====================================================================================
* Scenariul 2: obiecte de inventar, cu rulaje in RUL_OBINV, cu salvare + verificare Oracle
*=====================================================================================
IF INLIST(tcMode, 'ALL', 'OBINV')
LOCAL lnCod2, lnAn2, lnLuna2, lnIdSet2, lnNnirVechi2, lnNnirNou2
LOCAL lnCntTactVechi2, lnCntRobinvVechi2, lnCntTactNou2, lnCntRobinvNou2
LOCAL i2, llGasit2, lnColOrder2, llReadOnly2, lnColCheck2, lcColName2
lnCod2 = 1140835
lnAn2 = 2026
lnLuna2 = 6
lnIdSet2 = 211
lnNnirVechi2 = 2026060001
lnNnirNou2 = lnNnirVechi2 + 90000000
DO NnirConstruiesteCursoare WITH lnCod2, lnAn2, lnLuna2
SELECT tact
lnCntTactVechi2 = 0
COUNT FOR NVL(nnir,0) = lnNnirVechi2 TO lnCntTactVechi2
SELECT trul_obinv
lnCntRobinvVechi2 = 0
COUNT FOR NVL(nnir,0) = lnNnirVechi2 TO lnCntRobinvVechi2
Omodif = CREATEOBJECT('frm_modific2024', lnIdSet2)
IF VARTYPE(Omodif) <> 'O'
DO NnirAssert WITH 'instantiere', 'OBINV', .F., 'frm_modific2024 nu s-a instantiat'
ELSE
SELECT tact
Omodif.grid1.SetFocus
Omodif.gridextra1.setup()
Omodif.CalculeazaTotal()
llGasit2 = .F.
lnColOrder2 = 0
llReadOnly2 = .T.
lnColCheck2 = 0
FOR i2 = 1 TO Omodif.grid1.ColumnCount
lcColName2 = 'Omodif.grid1.Columns(' + TRANSFORM(i2) + ')'
IF NnirEsteColoanaNnir(EVALUATE(lcColName2 + '.ControlSource'))
llGasit2 = .T.
lnColOrder2 = EVALUATE(lcColName2 + '.ColumnOrder')
llReadOnly2 = EVALUATE(lcColName2 + '.ReadOnly')
lnColCheck2 = i2
ENDIF
ENDFOR
DO NnirAssert WITH 'coloana_grid', 'OBINV', llGasit2, 'ControlSource=nnir gasit=' + ;
TRANSFORM(llGasit2) + ' ColumnOrder=' + TRANSFORM(lnColOrder2) + ' ReadOnly=' + TRANSFORM(llReadOnly2)
IF llGasit2
SELECT tact
LOCATE FOR NVL(nnir,0) = lnNnirVechi2
IF FOUND()
lcCallWhen = 'Omodif.grid1.Columns(' + TRANSFORM(lnColCheck2) + ').Text1.When'
&lcCallWhen
REPLACE nnir WITH lnNnirNou2
lcCallLostFocus = 'Omodif.grid1.Columns(' + TRANSFORM(lnColCheck2) + ').Text1.LostFocus'
&lcCallLostFocus
SELECT tact
lnCntTactNou2 = 0
COUNT FOR NVL(nnir,0) = lnNnirNou2 TO lnCntTactNou2
DO NnirAssert WITH 'sync_tact', 'OBINV', lnCntTactNou2 = lnCntTactVechi2, ;
TRANSFORM(lnCntTactNou2) + ' randuri tact cu nnir nou (asteptat ' + TRANSFORM(lnCntTactVechi2) + ')'
SELECT trul_obinv
lnCntRobinvNou2 = 0
COUNT FOR NVL(nnir,0) = lnNnirNou2 TO lnCntRobinvNou2
DO NnirAssert WITH 'sync_trul_obinv', 'OBINV', lnCntRobinvNou2 = lnCntRobinvVechi2, ;
TRANSFORM(lnCntRobinvNou2) + ' randuri trul_obinv cu nnir nou (asteptat ' + TRANSFORM(lnCntRobinvVechi2) + ')'
ELSE
DO NnirAssert WITH 'locate_rand_vechi', 'OBINV', .F., 'nu s-a gasit randul cu nnir vechi in tact'
ENDIF
ENDIF
Omodif.Release()
Omodif = NULL
DO NnirSalveazaSiVerificaObinv WITH lnCod2, lnAn2, lnLuna2, lnIdSet2, lnNnirVechi2, lnNnirNou2
ENDIF
DO NnirCurataCursoare
ENDIF
*=====================================================================================
* Scenariul 3: nota fara rulaje - regresie (nu crapa), cu salvare + verificare Oracle
*=====================================================================================
IF INLIST(tcMode, 'ALL', 'FARARUL')
LOCAL lnCod3, lnAn3, lnLuna3, lnIdSet3, lnNnirVechi3, lnNnirNou3
LOCAL lnCntTactVechi3, lnCntTactNou3
LOCAL i3, llGasit3, lnColCheck3, lcColName3
lnCod3 = 1140848
lnAn3 = 2026
lnLuna3 = 7
lnIdSet3 = 209
lnNnirVechi3 = 124
lnNnirNou3 = lnNnirVechi3 + 90000000
DO NnirConstruiesteCursoare WITH lnCod3, lnAn3, lnLuna3
SELECT tact
lnCntTactVechi3 = 0
COUNT FOR NVL(nnir,0) = lnNnirVechi3 TO lnCntTactVechi3
Omodif = CREATEOBJECT('frm_modific2024', lnIdSet3)
IF VARTYPE(Omodif) <> 'O'
DO NnirAssert WITH 'instantiere', 'FARARUL', .F., 'frm_modific2024 nu s-a instantiat'
ELSE
SELECT tact
Omodif.grid1.SetFocus
Omodif.gridextra1.setup()
Omodif.CalculeazaTotal()
llGasit3 = .F.
lnColCheck3 = 0
FOR i3 = 1 TO Omodif.grid1.ColumnCount
lcColName3 = 'Omodif.grid1.Columns(' + TRANSFORM(i3) + ')'
IF NnirEsteColoanaNnir(EVALUATE(lcColName3 + '.ControlSource'))
llGasit3 = .T.
lnColCheck3 = i3
ENDIF
ENDFOR
DO NnirAssert WITH 'coloana_grid', 'FARARUL', llGasit3, 'ControlSource=nnir gasit=' + TRANSFORM(llGasit3)
IF llGasit3
SELECT tact
LOCATE FOR NVL(nnir,0) = lnNnirVechi3
IF FOUND()
lcCallWhen = 'Omodif.grid1.Columns(' + TRANSFORM(lnColCheck3) + ').Text1.When'
&lcCallWhen
REPLACE nnir WITH lnNnirNou3
lcCallLostFocus = 'Omodif.grid1.Columns(' + TRANSFORM(lnColCheck3) + ').Text1.LostFocus'
&lcCallLostFocus
SELECT tact
lnCntTactNou3 = 0
COUNT FOR NVL(nnir,0) = lnNnirNou3 TO lnCntTactNou3
DO NnirAssert WITH 'sync_tact', 'FARARUL', lnCntTactNou3 = lnCntTactVechi3, ;
TRANSFORM(lnCntTactNou3) + ' randuri tact cu nnir nou (asteptat ' + TRANSFORM(lnCntTactVechi3) + ')'
DO NnirAssert WITH 'nu_crapa', 'FARARUL', .T., 'editarea pe nota fara rulaje nu a generat eroare'
ELSE
DO NnirAssert WITH 'locate_rand_vechi', 'FARARUL', .F., 'nu s-a gasit randul cu nnir vechi in tact'
ENDIF
ENDIF
Omodif.Release()
Omodif = NULL
DO NnirSalveazaSiVerifica WITH lnCod3, lnAn3, lnLuna3, lnIdSet3, lnNnirVechi3, lnNnirNou3, 'FARARUL'
ENDIF
DO NnirCurataCursoare
ENDIF
*=====================================================================================
* Scenariul 4: nota de inventar (id_set=90101) - regresie blocare editare NNIR
*=====================================================================================
IF INLIST(tcMode, 'ALL', 'INVENTAR')
LOCAL lnCod4, lnAn4, lnLuna4, lnIdSet4
LOCAL i4, llGasit4, llReadOnly4, lcColName4
lnCod4 = 1140716
lnAn4 = 2026
lnLuna4 = 3
lnIdSet4 = 90101
DO NnirConstruiesteCursoare WITH lnCod4, lnAn4, lnLuna4
Omodif = CREATEOBJECT('frm_modific2024', lnIdSet4)
IF VARTYPE(Omodif) <> 'O'
DO NnirAssert WITH 'instantiere', 'INVENTAR', .F., 'frm_modific2024 nu s-a instantiat'
ELSE
SELECT tact
Omodif.grid1.SetFocus
Omodif.gridextra1.setup()
Omodif.CalculeazaTotal()
llGasit4 = .F.
llReadOnly4 = .F.
FOR i4 = 1 TO Omodif.grid1.ColumnCount
lcColName4 = 'Omodif.grid1.Columns(' + TRANSFORM(i4) + ')'
IF NnirEsteColoanaNnir(EVALUATE(lcColName4 + '.ControlSource'))
llGasit4 = .T.
llReadOnly4 = EVALUATE(lcColName4 + '.ReadOnly')
ENDIF
ENDFOR
DO NnirAssert WITH 'coloana_grid', 'INVENTAR', llGasit4, 'ControlSource=nnir gasit=' + TRANSFORM(llGasit4)
IF llGasit4
* nu se incearca editarea - doar se verifica blocarea, ca sa nu se altereze o nota
* reala de inventar cat timp blocarea nu e implementata
DO NnirAssert WITH 'coloana_blocata', 'INVENTAR', llReadOnly4, ;
'id_set=90101: ReadOnly asteptat .T., gasit ' + TRANSFORM(llReadOnly4)
ENDIF
Omodif.Release()
Omodif = NULL
ENDIF
DO NnirCurataCursoare
ENDIF
*=====================================================================================
* Scenariul 5: stergere NNIR (-> 0) pe randul unei note cu rulaje - propagare la 0.
* Comportament nou (runda 4): garda EMPTY(NVL(tnNnirNou,0)) eliminata din sincronizeaza_nnir,
* ramane doar egalitatea - stergerea celulei (0 scris pe rand inainte de LostFocus) trebuie sa
* se propage la toate liniile cu valoarea veche, nu doar schimbarile intre doua valori nenule.
* Doar la nivel de cursoare (tact/trul) - nu se salveaza in Oracle.
*=====================================================================================
IF INLIST(tcMode, 'ALL', 'ZERO')
LOCAL lnCodZ, lnAnZ, lnLunaZ, lnIdSetZ, lnNnirVechiZ
LOCAL lnCntTactVechiZ, lnCntTrulVechiZ, lnCntTactRamasVechiZ, lnCntTrulRamasVechiZ
LOCAL lnCntTactZeroZ, lnCntTrulZeroZ
LOCAL iz, llGasitZ, lnColCheckZ, lcColNameZ
lnCodZ = 1140841
lnAnZ = 2026
lnLunaZ = 7
lnIdSetZ = 209
lnNnirVechiZ = 3
DO NnirConstruiesteCursoare WITH lnCodZ, lnAnZ, lnLunaZ
SELECT tact
lnCntTactVechiZ = 0
COUNT FOR NVL(nnir,0) = lnNnirVechiZ TO lnCntTactVechiZ
SELECT trul
lnCntTrulVechiZ = 0
COUNT FOR NVL(nnir,0) = lnNnirVechiZ TO lnCntTrulVechiZ
Omodif = CREATEOBJECT('frm_modific2024', lnIdSetZ)
IF VARTYPE(Omodif) <> 'O'
DO NnirAssert WITH 'instantiere', 'ZERO', .F., 'frm_modific2024 nu s-a instantiat'
ELSE
SELECT tact
Omodif.grid1.SetFocus
Omodif.gridextra1.setup()
Omodif.CalculeazaTotal()
llGasitZ = .F.
lnColCheckZ = 0
FOR iz = 1 TO Omodif.grid1.ColumnCount
lcColNameZ = 'Omodif.grid1.Columns(' + TRANSFORM(iz) + ')'
IF NnirEsteColoanaNnir(EVALUATE(lcColNameZ + '.ControlSource'))
llGasitZ = .T.
lnColCheckZ = iz
ENDIF
ENDFOR
DO NnirAssert WITH 'coloana_grid', 'ZERO', llGasitZ, 'ControlSource=nnir gasit=' + TRANSFORM(llGasitZ)
IF llGasitZ
SELECT tact
LOCATE FOR NVL(nnir,0) = lnNnirVechiZ
IF FOUND()
lcCallWhen = 'Omodif.grid1.Columns(' + TRANSFORM(lnColCheckZ) + ').Text1.When'
&lcCallWhen
* simuleaza stergerea celulei: utilizatorul goleste campul, valoarea ajunge 0
REPLACE nnir WITH 0
lcCallLostFocus = 'Omodif.grid1.Columns(' + TRANSFORM(lnColCheckZ) + ').Text1.LostFocus'
&lcCallLostFocus
SELECT tact
lnCntTactRamasVechiZ = 0
COUNT FOR NVL(nnir,0) = lnNnirVechiZ TO lnCntTactRamasVechiZ
lnCntTactZeroZ = 0
COUNT FOR NVL(nnir,0) = 0 TO lnCntTactZeroZ
DO NnirAssert WITH 'sync_tact_zero', 'ZERO', lnCntTactRamasVechiZ = 0 AND lnCntTactZeroZ >= lnCntTactVechiZ, ;
TRANSFORM(lnCntTactRamasVechiZ) + ' randuri tact au ramas pe valoarea veche (asteptat 0), ' + ;
TRANSFORM(lnCntTactZeroZ) + ' au ajuns la 0 (asteptat cel putin ' + TRANSFORM(lnCntTactVechiZ) + ')'
* verificare explicita in cursorul legat de grid-ul de rulaje (pgfArticole.page1.grdRulaje)
SELECT trul
lnCntTrulRamasVechiZ = 0
COUNT FOR NVL(nnir,0) = lnNnirVechiZ TO lnCntTrulRamasVechiZ
lnCntTrulZeroZ = 0
COUNT FOR NVL(nnir,0) = 0 TO lnCntTrulZeroZ
DO NnirAssert WITH 'sync_trul_zero', 'ZERO', lnCntTrulRamasVechiZ = 0 AND lnCntTrulZeroZ >= lnCntTrulVechiZ, ;
TRANSFORM(lnCntTrulRamasVechiZ) + ' randuri trul au ramas pe valoarea veche (asteptat 0), ' + ;
TRANSFORM(lnCntTrulZeroZ) + ' au ajuns la 0 (asteptat cel putin ' + TRANSFORM(lnCntTrulVechiZ) + ')'
ELSE
DO NnirAssert WITH 'locate_rand_vechi', 'ZERO', .F., 'nu s-a gasit randul cu nnir vechi in tact'
ENDIF
ENDIF
Omodif.Release()
Omodif = NULL
ENDIF
DO NnirCurataCursoare
ENDIF
*=====================================================================================
* Scenariul 6: nota de inventar (id_set=90101) pe sucursala CURENTA - blocarea NNIR trebuie sa
* vina din regula 90101, nu din blocarea pe sucursala din AfterRowColChange. Scenariul 4 ruleaza
* pe o nota din alta sucursala, unde SetAll("ReadOnly",.T.) blocheaza oricum tot gridul, deci ar
* trece si fara implementare. Aici gnIdSucursala se aliniaza la id_sucursala notei (llReadOnly
* iese .F.), se declanseaza AfterRowColChange (care face SetAll dupa Init) si se verifica ca
* Column44 ramane blocata cat timp restul coloanelor sunt editabile.
*=====================================================================================
IF INLIST(tcMode, 'ALL', 'INVENTAR2')
LOCAL lnCod6, lnAn6, lnLuna6, lnIdSet6
LOCAL i6, llGasit6, llReadOnly6, lnEditabile6, lnSucVechi6, llMamaVechi6
LOCAL lnIdSucNota6, lcColName6
lnCod6 = 1140716
lnAn6 = 2026
lnLuna6 = 3
lnIdSet6 = 90101
DO NnirConstruiesteCursoare WITH lnCod6, lnAn6, lnLuna6
SELECT tact
GO TOP
lnIdSucNota6 = NVL(tact.id_sucursala, 0)
lnSucVechi6 = gnIdSucursala
llMamaVechi6 = glEMama
gnIdSucursala = lnIdSucNota6
glEMama = .F.
Omodif = CREATEOBJECT('frm_modific2024', lnIdSet6)
IF VARTYPE(Omodif) <> 'O'
DO NnirAssert WITH 'instantiere', 'INVENTAR2', .F., 'frm_modific2024 nu s-a instantiat'
ELSE
SELECT tact
GO TOP
Omodif.grid1.SetFocus
Omodif.gridextra1.setup()
Omodif.CalculeazaTotal()
* AfterRowColChange face SetAll("ReadOnly", llReadOnly) peste blocarea pusa in Init
Omodif.grid1.AfterRowColChange(1)
llGasit6 = .F.
llReadOnly6 = .F.
lnEditabile6 = 0
FOR i6 = 1 TO Omodif.grid1.ColumnCount
lcColName6 = 'Omodif.grid1.Columns(' + TRANSFORM(i6) + ')'
IF NnirEsteColoanaNnir(EVALUATE(lcColName6 + '.ControlSource'))
llGasit6 = .T.
llReadOnly6 = EVALUATE(lcColName6 + '.ReadOnly')
ELSE
IF !EVALUATE(lcColName6 + '.ReadOnly')
lnEditabile6 = lnEditabile6 + 1
ENDIF
ENDIF
ENDFOR
DO NnirAssert WITH 'coloana_grid', 'INVENTAR2', llGasit6, 'ControlSource=nnir gasit=' + TRANSFORM(llGasit6)
* control: daca gridul e blocat integral, testul de blocare NNIR nu dovedeste nimic
DO NnirAssert WITH 'grid_editabil', 'INVENTAR2', lnEditabile6 > 0, ;
'coloane editabile (fara nnir): ' + TRANSFORM(lnEditabile6) + ' (asteptat > 0, ' + ;
'gnIdSucursala=' + TRANSFORM(lnIdSucNota6) + ')'
IF llGasit6
DO NnirAssert WITH 'coloana_blocata', 'INVENTAR2', llReadOnly6, ;
'id_set=90101 pe sucursala curenta: ReadOnly asteptat .T., gasit ' + TRANSFORM(llReadOnly6)
ENDIF
Omodif.Release()
Omodif = NULL
ENDIF
gnIdSucursala = lnSucVechi6
glEMama = llMamaVechi6
DO NnirCurataCursoare
ENDIF
DO NnirLog WITH 'REZULTAT SUITA: ' + TRANSFORM(gnPass) + ' PASS, ' + TRANSFORM(gnFail) + ' FAIL'
QUIT
*=====================================================================================
* proceduri ajutatoare (fara CREATEOBJECT - vezi depanare_testare_vfp.md / capcana l:
* CREATEOBJECT apelat dintr-o procedura se comporta gresit in acest runtime headless)
*=====================================================================================
PROCEDURE NnirLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13)+CHR(10), gcLogFile, 1)
ENDPROC
PROCEDURE NnirAssert
LPARAMETERS tcPas, tcCaz, llOk, tcDetaliu
LOCAL lcRez
lcRez = IIF(llOk, 'PASS', 'FAIL')
IF llOk
gnPass = gnPass + 1
ELSE
gnFail = gnFail + 1
ENDIF
DO NnirLog WITH lcRez + ' [' + tcCaz + '/' + tcPas + '] ' + tcDetaliu
ENDPROC
PROCEDURE NnirErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
DO NnirLog WITH 'ERR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
ENDPROC
* verifica ca toate variabilele folosite ca ?param in SQL pass-through pe calea de test (env-init,
* optiuni_firma, oscrie_in_fisiere, pack_contafin/pack_sesiune) sunt definite - o variabila
* PUBLIC lipsa/umbrita da direct dialogul modal "Enter the value for <var>", nu o eroare catchabila
FUNCTION NnirGardaVariabile
LOCAL laVar(9), i, llOk
laVar(1) = 'gnIdUtil'
laVar(2) = 'gnAn'
laVar(3) = 'gnLuna'
laVar(4) = 'gnIdFirma'
laVar(5) = 'gnIdSucursala'
laVar(6) = 'gcS'
laVar(7) = 'gnIdProgram'
laVar(8) = 'gnId_Prg_Owner'
laVar(9) = 'gnHandle'
llOk = .T.
FOR i = 1 TO ALEN(laVar)
IF TYPE(laVar(i)) == 'U'
DO NnirLog WITH 'FAIL [garda_variabile] ' + laVar(i) + ' nu exista (TYPE U) - ar fi dat dialog modal "Enter the value"'
llOk = .F.
ENDIF
ENDFOR
RETURN llOk
ENDFUNC
* VFP calificat automat ControlSource-ul unui camp simplu cu aliasul cursorului (RecordSource) -
* "nnir" definit in sursa apare la runtime ca "tact.nnir" - se accepta ambele forme
FUNCTION NnirEsteColoanaNnir
LPARAMETERS tcControlSource
LOCAL lcCs
lcCs = UPPER(ALLTRIM(TRANSFORM(tcControlSource)))
RETURN lcCs == 'NNIR' OR RIGHT(lcCs, 5) == '.NNIR'
ENDFUNC
* construieste tact/trul/trul_obinv exact ca afisjurcom.do_modifica (comun.vc2:2352-2434),
* dar pe AN/LUNA proprii notei (nu gnAn/gnLuna) - vezi antetul fisierului
PROCEDURE NnirConstruiesteCursoare
LPARAMETERS tnCod, tnAn, tnLuna
LOCAL lcSql, lnSucces
DO NnirCurataCursoare
lcSql = [select * from vact_tot where sters = 0 and an = ] + TRANSFORM(tnAn) + ;
[ and luna = ] + TRANSFORM(tnLuna) + [ and cod = ] + TRANSFORM(tnCod) + [ order by id_act]
lnSucces = goExecutor.oExecute(lcSql, 'v_act')
goExecutor.oReset()
IF lnSucces < 0
DO NnirLog WITH 'EROARE construire tact: ' + goExecutor.cEroare
RETURN .F.
ENDIF
SELECT * FROM v_act INTO CURSOR actactan
SELECT .F. AS ales, T.*, CAST(0 AS N(2)) AS tipnota FROM actactan T INTO CURSOR tact READWRITE
USE IN v_act
lcSql = [select * from vrul_tot where sters = 0 and an = ] + TRANSFORM(tnAn) + ;
[ and luna = ] + TRANSFORM(tnLuna) + [ and cod = ] + TRANSFORM(tnCod) + [ order by id_rul]
goExecutor.oExecute(lcSql, 'v_rul')
goExecutor.oReset()
SELECT *, valoare + valtva AS valoarectva, valoarev + valtvav AS valoarevctva ;
FROM v_rul INTO CURSOR RUL_TEMP READWRITE
SELECT * FROM RUL_TEMP INTO CURSOR trul READWRITE
USE IN v_rul
lcSql = [select * from vrul_obinv_tot where sters = 0 and an = ] + TRANSFORM(tnAn) + ;
[ and luna = ] + TRANSFORM(tnLuna) + [ and cod = ] + TRANSFORM(tnCod) + [ order by id_rul_obinv]
goExecutor.oExecute(lcSql, 'v_rul_obinv')
goExecutor.oReset()
SELECT *, valoare + valtva AS valoarectva, valoarev + valtvav AS valoarevctva ;
FROM v_rul_obinv INTO CURSOR RUL_TEMP_OBINV READWRITE
SELECT * FROM RUL_TEMP_OBINV INTO CURSOR trul_obinv READWRITE
USE IN v_rul_obinv
SELECT a.*, IIF(NVL(a.id_jtva_coloana,0)=0,0,1) AS cu_tva FROM tact a INTO CURSOR tact READWRITE
SELECT tact
GO TOP
RETURN .T.
ENDPROC
PROCEDURE NnirCurataCursoare
IF USED('tact')
USE IN tact
ENDIF
IF USED('trul')
USE IN trul
ENDIF
IF USED('trul_obinv')
USE IN trul_obinv
ENDIF
IF USED('actactan')
USE IN actactan
ENDIF
IF USED('rul_temp')
USE IN rul_temp
ENDIF
IF USED('rul_temp_obinv')
USE IN rul_temp_obinv
ENDIF
ENDPROC
FUNCTION NnirOraCount
LPARAMETERS tcSql
LOCAL lnVal, llOk
lnVal = -1
llOk = goExecutor.oExecuta(tcSql, 'cNnirOraCnt')
IF llOk AND USED('cNnirOraCnt') AND RECCOUNT('cNnirOraCnt') > 0
lnVal = cNnirOraCnt.cnt
ENDIF
IF USED('cNnirOraCnt')
USE IN cNnirOraCnt
ENDIF
RETURN lnVal
ENDFUNC
* verifica ca in Oracle nu s-a scris nimic dupa editarea DOAR in cursoare (echivalent Renunt)
PROCEDURE NnirVerificaOracleNeschimbat
LPARAMETERS tnCod, tnNnirVechi, tcCaz
LOCAL lnCnt, lcSql
lcSql = [select count(*) cnt from act where cod = ] + TRANSFORM(tnCod) + ;
[ and nnir = ] + TRANSFORM(tnNnirVechi)
lnCnt = NnirOraCount(lcSql)
DO NnirAssert WITH 'renunt_neschimbat', tcCaz, lnCnt > 0, ;
'ACT.NNIR in Oracle inainte de Termin ramane ' + TRANSFORM(tnNnirVechi) + ' (' + TRANSFORM(lnCnt) + ' randuri)'
ENDPROC
* replica blocul de salvare din afisjurcom.do_modifica (comun.vc2:2456-2487): scrie tact/trul/
* trul_obinv in ACT/RUL/RUL_OBINV prin oscrie_in_fisiere + pack_contafin.finalizeaza_modificare_
* nota, verifica in Oracle, apoi reface valoarea originala (revert - baza de test ramane
* neschimbata pentru rulari repetate)
PROCEDURE NnirSalveazaSiVerifica
LPARAMETERS tnCod, tnAn, tnLuna, tnIdSet, tnNnirVechi, tnNnirNou, tcCaz
PRIVATE pnAn, pnLuna, pdDataOra
LOCAL lnIdFact, lnIdfactd, llRul, lnSuccesSalvare, lcSqlFin, lnCnt, lcSql
pnAn = tnAn
pnLuna = tnLuna
pdDataOra = NULL
SELECT tact
LOCATE FOR NVL(nnir,0) = tnNnirNou
lnIdFact = NVL(id_fact, 0)
lnIdfactd = NVL(id_factd, 0)
llRul = (RECCOUNT('trul') > 0) OR (RECCOUNT('trul_obinv') > 0)
* thisform.do_deschide_tranzactie()/do_inchide_tranzactie() din afisjurcom (_frm_base.vc2:252-
* 305, mostenite, apelate pe formularul de jurnal, nu pe frm_modific2024) - echivalent direct,
* fara instanta de forma: manual pe durata scrierii, apoi commit/rollback + revenire pe auto
SQLSetProp(gnHandle, 'Transactions', 2)
* replica exact secventa din afisjurcom.do_modifica: intai STERGE nota veche (COD-ul
* original, din actactan neatins de editare), abia apoi SCRIE varianta editata
SELECT actactan
lnSuccesSalvare = oscrie_in_fisiere(2, .T., llRul)
DO NnirAssert WITH 'oscrie_in_fisiere_sterge', tcCaz, lnSuccesSalvare > 0, 'a returnat ' + TRANSFORM(lnSuccesSalvare)
IF lnSuccesSalvare > 0
SELECT * FROM tact INTO CURSOR actactan READWRITE
REPLACE ALL id_util WITH gnIdUtil, sters WITH 0 IN actactan
IF llRul
SELECT * FROM trul INTO CURSOR rul_temp READWRITE
REPLACE ALL id_util WITH gnIdUtil, sters WITH 0 IN rul_temp
SELECT * FROM trul_obinv INTO CURSOR rul_temp_obinv READWRITE
REPLACE ALL id_util WITH gnIdUtil, sters WITH 0 IN rul_temp_obinv
ENDIF
lnSuccesSalvare = oscrie_in_fisiere(0, .T., llRul)
DO NnirAssert WITH 'oscrie_in_fisiere', tcCaz, lnSuccesSalvare > 0, 'a returnat ' + TRANSFORM(lnSuccesSalvare)
ENDIF
IF lnSuccesSalvare > 0
lcSqlFin = [begin pack_contafin.finalizeaza_modificare_nota(?pnLuna,?pnAn,?pdDataOra,] + ;
TRANSFORM(tnIdSet) + [,] + TRANSFORM(tnCod) + [,] + TRANSFORM(lnIdFact) + [,] + ;
TRANSFORM(lnIdfactd) + [,?gnIdUtil); end;]
lnSuccesSalvare = IIF(goExecutor.oExecuta(lcSqlFin), 1, -1)
DO NnirAssert WITH 'finalizeaza_modificare_nota', tcCaz, lnSuccesSalvare > 0, 'a returnat ' + TRANSFORM(lnSuccesSalvare)
ENDIF
IF lnSuccesSalvare > 0
SQLCOMMIT(gnHandle)
ELSE
SQLROLLBACK(gnHandle)
ENDIF
SQLSetProp(gnHandle, 'Transactions', 1)
* Termin reatribuie COD nou (pack_contafin), sub AN/LUNA de sesiune curente - nu pastreaza
* COD-ul original notei editate. Verificarea si curatenia se fac dupa valoarea NNIR marcaj
* (distincta, nu poate coincide cu date reale), nu dupa COD-ul original.
lcSql = [select count(*) cnt from act where sters = 0 and nnir = ] + TRANSFORM(tnNnirNou)
lnCnt = NnirOraCount(lcSql)
DO NnirAssert WITH 'oracle_act_final', tcCaz, lnCnt > 0, TRANSFORM(lnCnt) + ' randuri ACT cu nnir nou in Oracle'
IF RECCOUNT('trul') > 0
lcSql = [select count(*) cnt from rul where sters = 0 and nnir = ] + TRANSFORM(tnNnirNou)
lnCnt = NnirOraCount(lcSql)
DO NnirAssert WITH 'oracle_rul_final', tcCaz, lnCnt > 0, TRANSFORM(lnCnt) + ' randuri RUL cu nnir nou in Oracle'
ENDIF
* curatenie: pasul STERGE (oscrie_in_fisiere param 2) marcheaza sters=1 pe COD-ul ORIGINAL -
* readuc nota originala activa, apoi marchez sters=1 (conventia aplicatiei) pe orice a ajuns
* sub NNIR-ul marcaj (COD nou, atribuit de pack_contafin la scriere)
goExecutor.oExecuta([update act set sters = 0 where cod = ] + TRANSFORM(tnCod))
goExecutor.oExecuta([update rul set sters = 0 where cod = ] + TRANSFORM(tnCod))
goExecutor.oExecuta([update rul_obinv set sters = 0 where cod = ] + TRANSFORM(tnCod))
goExecutor.oExecuta([update act set sters = 1 where nnir = ] + TRANSFORM(tnNnirNou) + [ and cod <> ] + TRANSFORM(tnCod))
goExecutor.oExecuta([update rul set sters = 1 where nnir = ] + TRANSFORM(tnNnirNou) + [ and cod <> ] + TRANSFORM(tnCod))
goExecutor.oExecuta([update rul_obinv set sters = 1 where nnir = ] + TRANSFORM(tnNnirNou) + [ and cod <> ] + TRANSFORM(tnCod))
goExecutor.oExecuta('commit')
ENDPROC
* varianta pt. scenariul RUL_OBINV (verifica RUL_OBINV in loc de RUL)
PROCEDURE NnirSalveazaSiVerificaObinv
LPARAMETERS tnCod, tnAn, tnLuna, tnIdSet, tnNnirVechi, tnNnirNou
PRIVATE pnAn, pnLuna, pdDataOra
LOCAL lnIdFact, lnIdfactd, llRul, lnSuccesSalvare, lcSqlFin, lnCnt, lcSql
pnAn = tnAn
pnLuna = tnLuna
pdDataOra = NULL
SELECT tact
LOCATE FOR NVL(nnir,0) = tnNnirNou
lnIdFact = NVL(id_fact, 0)
lnIdfactd = NVL(id_factd, 0)
llRul = (RECCOUNT('trul') > 0) OR (RECCOUNT('trul_obinv') > 0)
* thisform.do_deschide_tranzactie()/do_inchide_tranzactie() din afisjurcom (_frm_base.vc2:252-
* 305, mostenite, apelate pe formularul de jurnal, nu pe frm_modific2024) - echivalent direct,
* fara instanta de forma: manual pe durata scrierii, apoi commit/rollback + revenire pe auto
SQLSetProp(gnHandle, 'Transactions', 2)
* replica exact secventa din afisjurcom.do_modifica: intai STERGE nota veche (COD-ul
* original, din actactan neatins de editare), abia apoi SCRIE varianta editata
SELECT actactan
lnSuccesSalvare = oscrie_in_fisiere(2, .T., llRul)
DO NnirAssert WITH 'oscrie_in_fisiere_sterge', 'OBINV', lnSuccesSalvare > 0, 'a returnat ' + TRANSFORM(lnSuccesSalvare)
IF lnSuccesSalvare > 0
SELECT * FROM tact INTO CURSOR actactan READWRITE
REPLACE ALL id_util WITH gnIdUtil, sters WITH 0 IN actactan
IF llRul
SELECT * FROM trul INTO CURSOR rul_temp READWRITE
REPLACE ALL id_util WITH gnIdUtil, sters WITH 0 IN rul_temp
SELECT * FROM trul_obinv INTO CURSOR rul_temp_obinv READWRITE
REPLACE ALL id_util WITH gnIdUtil, sters WITH 0 IN rul_temp_obinv
ENDIF
lnSuccesSalvare = oscrie_in_fisiere(0, .T., llRul)
DO NnirAssert WITH 'oscrie_in_fisiere', 'OBINV', lnSuccesSalvare > 0, 'a returnat ' + TRANSFORM(lnSuccesSalvare)
ENDIF
IF lnSuccesSalvare > 0
lcSqlFin = [begin pack_contafin.finalizeaza_modificare_nota(?pnLuna,?pnAn,?pdDataOra,] + ;
TRANSFORM(tnIdSet) + [,] + TRANSFORM(tnCod) + [,] + TRANSFORM(lnIdFact) + [,] + ;
TRANSFORM(lnIdfactd) + [,?gnIdUtil); end;]
lnSuccesSalvare = IIF(goExecutor.oExecuta(lcSqlFin), 1, -1)
DO NnirAssert WITH 'finalizeaza_modificare_nota', 'OBINV', lnSuccesSalvare > 0, 'a returnat ' + TRANSFORM(lnSuccesSalvare)
ENDIF
IF lnSuccesSalvare > 0
SQLCOMMIT(gnHandle)
ELSE
SQLROLLBACK(gnHandle)
ENDIF
SQLSetProp(gnHandle, 'Transactions', 1)
* Termin reatribuie COD nou (pack_contafin), sub AN/LUNA de sesiune curente - nu pastreaza
* COD-ul original notei editate. Verificarea si curatenia se fac dupa valoarea NNIR marcaj
* (distincta, nu poate coincide cu date reale), nu dupa COD-ul original.
lcSql = [select count(*) cnt from act where sters = 0 and nnir = ] + TRANSFORM(tnNnirNou)
lnCnt = NnirOraCount(lcSql)
DO NnirAssert WITH 'oracle_act_final', 'OBINV', lnCnt > 0, TRANSFORM(lnCnt) + ' randuri ACT cu nnir nou in Oracle'
lcSql = [select count(*) cnt from rul_obinv where sters = 0 and nnir = ] + TRANSFORM(tnNnirNou)
lnCnt = NnirOraCount(lcSql)
DO NnirAssert WITH 'oracle_rul_obinv_final', 'OBINV', lnCnt > 0, TRANSFORM(lnCnt) + ' randuri RUL_OBINV cu nnir nou in Oracle'
* curatenie: pasul STERGE (oscrie_in_fisiere param 2) marcheaza sters=1 pe COD-ul ORIGINAL -
* readuc nota originala activa, apoi marchez sters=1 (conventia aplicatiei) pe orice a ajuns
* sub NNIR-ul marcaj (COD nou, atribuit de pack_contafin la scriere)
goExecutor.oExecuta([update act set sters = 0 where cod = ] + TRANSFORM(tnCod))
goExecutor.oExecuta([update rul set sters = 0 where cod = ] + TRANSFORM(tnCod))
goExecutor.oExecuta([update rul_obinv set sters = 0 where cod = ] + TRANSFORM(tnCod))
goExecutor.oExecuta([update act set sters = 1 where nnir = ] + TRANSFORM(tnNnirNou) + [ and cod <> ] + TRANSFORM(tnCod))
goExecutor.oExecuta([update rul set sters = 1 where nnir = ] + TRANSFORM(tnNnirNou) + [ and cod <> ] + TRANSFORM(tnCod))
goExecutor.oExecuta([update rul_obinv set sters = 1 where nnir = ] + TRANSFORM(tnNnirNou) + [ and cod <> ] + TRANSFORM(tnCod))
goExecutor.oExecuta('commit')
ENDPROC

View File

@@ -0,0 +1,11 @@
-- verif_nnir_cod.sql - NNIR distinct pe ACT/RUL/RUL_OBINV pentru un COD dat
-- Rulare: sqlplus -L -S MARIUSM_AUTO/<parola>@ROA_CENTRAL @verif_nnir_cod.sql <cod>
set pagesize 200 linesize 200 trimspool on feedback off
define v_cod = &1
prompt ==ACT==
select cod, an, luna, id_set, nnir from act where cod = &v_cod;
prompt ==RUL_NNIR_DISTINCT==
select an, luna, nnir, count(*) cnt from rul where cod = &v_cod group by an, luna, nnir;
prompt ==RUL_OBINV_NNIR_DISTINCT==
select an, luna, nnir, count(*) cnt from rul_obinv where cod = &v_cod group by an, luna, nnir;
exit;

View File

@@ -0,0 +1,302 @@
* test_init_env_auto_roagest.prg
* Varianta ROAGEST a test_init_env_auto.prg (acel fisier e specializat pe ROACONT -
* gcAppPath/clase/proceduri hardcodate D:\ROA\ROACONT\ - nu poate initializa mediul ROAGEST).
* Initializare completa de mediu FARA interactiune, pentru vfp9.exe -A -T.
*
* Utilizare:
* DO test_init_env_auto_roagest WITH 'CENTRAL', 'MARIUSM_AUTO', 'parola'
* IF gnHandle <= 0 ... eroare conectare
*
* Dupa apel sunt disponibile: goConn/goExecutor/goApp/goLog/goApi, goFirma/goCalendar,
* gnAn/gnLuna/gcS/gnIdFirma etc., SET PATH/CLASSLIB/PROCEDURE ca in roagest.prg,
* pachetele Oracle de sesiune setate (pack_sesiune/pack_contafin).
* ATENTIE: mentine lista de SET CLASSLIB/PROCEDURE sincronizata cu Programe\roagest.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 ''
SET DECIMALS TO 4
SET POINT 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, gnIdProgram, gnId_Prg_Owner
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
gnIdProgram = 0
gnId_Prg_Owner = 0
gnIdFirma = 110
gcCondSucursala = []
gnIdSucursala = m.gnIdFirma
gcS = UPPER(ALLTRIM(tcSchema))
gcFirma = m.gcS
gcUserName = m.gcS
gcUserNameApp = [MARIUS M]
gcNumeProgram = [ROAGEST]
gcAppName = [ROAGEST]
glLunaInchisa = .F.
glEMama = .F.
gl406 = .F.
* 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\ROAGEST\]
Set Default To (gcAppPath)
lcPath = gcAppPath + 'Date;' + ;
gcAppPath + 'Include;' + ;
gcAppPath + 'FERESTRE;' + ;
gcAppPath + 'GRAFICE;' + ;
gcAppPath + 'CLASE;' + ;
gcAppPath + 'MENIURI;' + ;
gcAppPath + 'PROGRAME;' + ;
gcAppPath + 'RAPOARTE;' + ;
gcAppPath + 'COMUN;' + ;
gcAppPath + 'COMUN\CLASE;' + ;
gcAppPath + 'COMUN\FERESTRE;' + ;
gcAppPath + 'COMUN\PROGRAME;' + ;
gcAppPath + 'COMUN\GRAFICE;' + ;
gcAppPath + 'COMUN\RAPOARTE;' + ;
gcAppPath + 'COMUN\MENIURI;' + ;
gcAppPath + 'COMUN\UTILE\GRIDEXTRAS;' + ;
gcAppPath + 'COMUN\UTILE\CTL32;' + ;
gcAppPath + 'COMUN\UTILE\HPDF;' + ;
gcAppPath + 'COMUN\UTILE\HPDF\REPORTOUTPUT;' + ;
gcAppPath + 'COMUN\UTILE\WEB;' + ;
gcAppPath + 'COMUN\UTILE\EXCEL;' + ;
gcAppPath + 'COMUN\UTILE\NFJSON;' + ;
Addbs(Substr(gcAppPath,1,Rat([\],gcAppPath,2)))+[COMUNROA\]
SET PATH TO &lcPath ADDITIVE
Local lcMainClassLib
lcMainClassLib = gcAppPath + "comun\clase\appwiz"
SET CLASSLIB TO (lcMainClassLib) ADDITIVE
SET CLASSLIB TO GESTIUNI ADDITIVE
SET CLASSLIB TO CAUT ADDITIVE
SET CLASSLIB TO BAZA ADDITIVE
SET CLASSLIB TO comun ADDITIVE
SET CLASSLIB TO accessibility.vcx ADDITIVE
SET CLASSLIB TO messagebox ADDITIVE
SET CLASSLIB TO registry ADDITIVE
SET CLASSLIB TO cauta_alfa_forms.vcx ADDITIVE
SET CLASSLIB TO DECABAZA ADDITIVE
SET CLASSLIB TO onomenclatoare ADDITIVE
SET CLASSLIB TO stocuri.vcx ADDITIVE
SET CLASSLIB TO rulaje.vcx ADDITIVE
SET CLASSLIB TO ointroduceri ADDITIVE
SET CLASSLIB TO ointroduceri_web ADDITIVE
SET CLASSLIB TO ointroduceri_depozit ADDITIVE
SET CLASSLIB TO overificari ADDITIVE
SET CLASSLIB TO ferestre_oracle ADDITIVE
SET CLASSLIB TO ferestre_cere_date.vcx ADDITIVE
SET CLASSLIB TO configurare.vcx ADDITIVE
SET CLASSLIB TO serii_numere.vcx ADDITIVE
SET CLASSLIB TO omodificari.vcx ADDITIVE
SET CLASSLIB TO ocompensari.vcx ADDITIVE
SET CLASSLIB TO caut_ora ADDITIVE
SET CLASSLIB TO onote_contabile ADDITIVE
SET CLASSLIB TO otoolbar ADDITIVE
SET CLASSLIB TO bon_fisc ADDITIVE
SET CLASSLIB TO onom_articole ADDITIVE
SET CLASSLIB TO onom_retete ADDITIVE
Set Classlib To oinventar ADDITIVE
SET CLASSLIB TO orapoarte ADDITIVE
SET CLASSLIB TO orapoarte_gestiuni ADDITIVE
SET CLASSLIB TO orapoarte_parametri ADDITIVE
SET CLASSLIB TO ONOM_CURS ADDITIVE
SET CLASSLIB TO ctl32_statusbar_fals.vcx additive
SET CLASSLIB TO ctl32_common.vcx additive
SET CLASSLIB TO ctl32_structs.vcx additive
SET CLASSLIB TO ctl32_progressbar.vcx additive
SET CLASSLIB TO ctl32_balloontip.vcx additive
SET CLASSLIB TO ocriterii.vcx ADDITIVE
SET CLASSLIB TO oavize.vcx ADDITIVE
SET CLASSLIB TO onomenclatoare2 ADDITIVE
Set Classlib To oschimbare_pret.vcx additive
SET CLASSLIB TO wwdialogs.vcx additive
SET CLASSLIB TO oimportxml.vcx additive
SET CLASSLIB TO excelxml.vcx ADDITIVE
SET CLASSLIB TO orapoarte_obinv.vcx ADDITIVE
SET CLASSLIB TO locale ADDITIVE
SET PROCEDURE TO PROCEDURI ADDITIVE
SET PROCEDURE TO acces_meniu ADDITIVE
SET PROCEDURE TO cauta_alfa ADDITIVE
SET PROCEDURE TO pmenu ADDITIVE
SET PROCEDURE TO proceduri_comune ADDITIVE
SET PROCEDURE TO quitapp ADDITIVE
SET PROCEDURE TO init_program ADDITIVE
SET PROCEDURE TO oproceduri_listari.prg ADDITIVE
SET PROCEDURE TO oproceduri_configurare.prg ADDITIVE
SET PROCEDURE TO oproceduri_articole.prg ADDITIVE
SET PROCEDURE TO oproceduri_retete.prg ADDITIVE
SET PROCEDURE TO orapoarte.prg ADDITIVE
SET PROCEDURE TO mesaje ADDITIVE
SET PROCEDURE TO oserii_numere.prg ADDITIVE
SET PROCEDURE TO oexport.prg ADDITIVE
SET PROCEDURE TO wwConfig.prg ADDITIVE
SET PROCEDURE TO proceduri_rapoarte.prg additive
SET PROCEDURE TO OPROCEDURI_CURS.PRG ADDITIVE
Set procedure to orapoarte_dinamice.prg additive
SET PROCEDURE TO validare.prg additive
SET PROCEDURE TO GENCURSOR.PRG ADDITIVE
SET PROCEDURE TO OPROCEDURI_COMUNE.PRG ADDITIVE
SET PROCEDURE TO OINIT_OPTIUNI.PRG ADDITIVE
SET PROCEDURE TO updateserver.prg ADDITIVE
SET PROCEDURE TO oinainte_de.prg ADDITIVE
SET PROCEDURE TO ooperatii_comune.prg ADDITIVE
SET PROCEDURE TO Ocompensari.PRG ADDITIVE
SET PROCEDURE TO OPROCEDURI_aMS.PRG ADDITIVE
SET PROCEDURE TO oproceduri_rulaje additive
SET PROCEDURE TO oproceduri_stocuri additive
SET PROCEDURE TO OINTRODUCERI ADDITIVE
SET PROCEDURE TO oHeader.prg ADDITIVE
SET PROCEDURE TO proceduri_excel.PRG ADDITIVE
SET PROCEDURE TO onomenclatoare.PRG ADDITIVE
SET PROCEDURE TO osecurity ADDITIVE
SET PROCEDURE TO ocautare ADDITIVE
SET PROCEDURE TO orefaceri ADDITIVE
SET PROCEDURE TO ofacturare_comun.PRG ADDITIVE
SET PROCEDURE TO ofacturare_stoc.PRG ADDITIVE
SET PROCEDURE TO oproceduri_casademarcat ADDITIVE
SET PROCEDURE TO oproceduri_casa_marcat_e500 ADDITIVE
SET PROCEDURE TO oproceduri_casa_marcat_mp500 ADDITIVE
SET PROCEDURE TO oproceduri_util.prg ADDITIVE
SET PROCEDURE TO wwxmlhttp.prg ADDITIVE
SET PROCEDURE TO ini.prg ADDITIVE
SET PROCEDURE TO odocumente.prg ADDITIVE
SET PROCEDURE TO regex.prg ADDITIVE
SET PROCEDURE TO wwutils.prg ADDITIVE
SET PROCEDURE TO inchidere_k ADDITIVE
Set procedure to oschimbare_pret.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 wwcodeupdate.prg additive
SET PROCEDURE TO wwhttp.prg ADDITIVE
Set Procedure To wwApi.prg Additive
SET PROCEDURE TO xdate.prg Additive
SET PROCEDURE TO ofacturare.prg ADDITIVE
SET PROCEDURE TO oproceduri_obinv.prg ADDITIVE
SET PROCEDURE TO oproceduri_facturare.prg ADDITIVE
SET PROCEDURE TO email.prg ADDITIVE
Declare Integer GetPrivateProfileString In WIN32API ;
string, String, String, String @, Integer, String
Declare Integer WritePrivateProfileString In Win32Api ;
string, String, String, String
Declare Integer CopyFile In WIN32API ;
STRING lpExistingFileName, STRING lpNewFileName, INTEGER bFailIfExists
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
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.