sync SVN r18188

This commit is contained in:
2026-09-19 23:45:23 +03:00
parent d0c1174829
commit 43d5a93572
13 changed files with 23 additions and 1446 deletions

View File

@@ -15835,7 +15835,8 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
*!* 19.09.2026 *!* 19.09.2026
*!* marius.mutu *!* marius.mutu
*!* verificare silentioasa (fara mesaje, fara efecte pe date) a campurilor lipsa; la primul apel incarca local cache-ul conturi/analitic (crsLipsuriCfg/crsLipsuriPlcont), fara Oracle la fiecare schimbare de rand; repozitioneaza pe randul curent si reactualizeaza eticheta/grid-ul *!* verificare silentioasa (fara mesaje, fara efecte pe date) a campurilor lipsa; la primul apel incarca local cache-ul conturi/analitic (crsLipsuriCfg/crsLipsuriPlcont), fara Oracle la fiecare schimbare de rand; repozitioneaza pe randul curent si reactualizeaza eticheta/grid-ul
LOCAL lnRecTact, lcSql, lnSucces LPARAMETERS tlRandCurent
LOCAL lnRecTact, lcSql, lnSucces, lcClipsaVechi
IF !Used('tact') OR Type('tact.clipsa') <> 'C' OR Inlist(This.nid_set, 99998, 90024) IF !Used('tact') OR Type('tact.clipsa') <> 'C' OR Inlist(This.nid_set, 99998, 90024)
RETURN RETURN
ENDIF ENDIF
@@ -15857,12 +15858,15 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
ENDIF ENDIF
ENDIF ENDIF
lnRecTact = Recno('tact') lnRecTact = Recno('tact')
verificare_note_contabile('tact', .T., .F., .F., .T.) lcClipsaVechi = tact.clipsa
verificare_note_contabile('tact', .T., .F., .F., .T., IIF(m.tlRandCurent, m.lnRecTact, 0))
IF Between(m.lnRecTact, 1, Reccount('tact')) IF Between(m.lnRecTact, 1, Reccount('tact'))
GO (m.lnRecTact) IN tact GO (m.lnRecTact) IN tact
ENDIF ENDIF
This.ActualizeazaLabelLipsuri() IF !m.tlRandCurent OR !(tact.clipsa == m.lcClipsaVechi) && pe un rand, refresh doar daca s-a schimbat marcajul
This.Grid1.Refresh() This.ActualizeazaLabelLipsuri()
This.Grid1.Refresh()
ENDIF
ENDPROC ENDPROC
PROCEDURE But_modificaR.Click PROCEDURE But_modificaR.Click
@@ -16066,19 +16070,22 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
*!* 19.09.2026 *!* 19.09.2026
*!* marius.mutu *!* marius.mutu
*!* reverificare silentioasa a lipsurilor la schimbarea randului, doar daca randul parasit e nou sau a fost modificat *!* reverificare silentioasa a lipsurilor la schimbarea randului, doar daca randul parasit e nou sau a fost modificat
LOCAL lnRecNouLipsuri, lcSemnVeche LOCAL lnRecNouLipsuri, lcSemnVeche, llLockLipsuri
lnRecNouLipsuri = Recno('tact') lnRecNouLipsuri = Recno('tact')
IF m.lnRecNouLipsuri <> Thisform.nRecLipsuri IF m.lnRecNouLipsuri <> Thisform.nRecLipsuri
llLockLipsuri = Thisform.LockScreen
Thisform.LockScreen = .T.
IF Between(Thisform.nRecLipsuri, 1, Reccount('tact')) IF Between(Thisform.nRecLipsuri, 1, Reccount('tact'))
GO (Thisform.nRecLipsuri) IN tact GO (Thisform.nRecLipsuri) IN tact
lcSemnVeche = Transform(tact.scd) + '|' + Transform(tact.scc) + '|' + Transform(tact.ascd) + '|' + Transform(tact.ascc) + '|' + Transform(tact.id_partd) + '|' + Transform(tact.id_partc) + '|' + Transform(tact.pereched) + '|' + Transform(tact.perechec) + '|' + Transform(tact.nract) + '|' + Transform(tact.suma) + '|' + Transform(tact.id_valuta) + '|' + Transform(tact.id_jtva_coloana) lcSemnVeche = Transform(tact.scd) + '|' + Transform(tact.scc) + '|' + Transform(tact.ascd) + '|' + Transform(tact.ascc) + '|' + Transform(tact.id_partd) + '|' + Transform(tact.id_partc) + '|' + Transform(tact.pereched) + '|' + Transform(tact.perechec) + '|' + Transform(tact.nract) + '|' + Transform(tact.suma) + '|' + Transform(tact.id_valuta) + '|' + Transform(tact.id_jtva_coloana)
IF m.lcSemnVeche <> Thisform.cSemnLipsuri IF m.lcSemnVeche <> Thisform.cSemnLipsuri
Thisform.VerificaLipsuriSilentios() Thisform.VerificaLipsuriSilentios(.T.)
ENDIF ENDIF
GO (m.lnRecNouLipsuri) IN tact GO (m.lnRecNouLipsuri) IN tact
ENDIF ENDIF
Thisform.nRecLipsuri = m.lnRecNouLipsuri Thisform.nRecLipsuri = m.lnRecNouLipsuri
Thisform.cSemnLipsuri = Transform(tact.scd) + '|' + Transform(tact.scc) + '|' + Transform(tact.ascd) + '|' + Transform(tact.ascc) + '|' + Transform(tact.id_partd) + '|' + Transform(tact.id_partc) + '|' + Transform(tact.pereched) + '|' + Transform(tact.perechec) + '|' + Transform(tact.nract) + '|' + Transform(tact.suma) + '|' + Transform(tact.id_valuta) + '|' + Transform(tact.id_jtva_coloana) Thisform.cSemnLipsuri = Transform(tact.scd) + '|' + Transform(tact.scc) + '|' + Transform(tact.ascd) + '|' + Transform(tact.ascc) + '|' + Transform(tact.id_partd) + '|' + Transform(tact.id_partc) + '|' + Transform(tact.pereched) + '|' + Transform(tact.perechec) + '|' + Transform(tact.nract) + '|' + Transform(tact.suma) + '|' + Transform(tact.id_valuta) + '|' + Transform(tact.id_jtva_coloana)
Thisform.LockScreen = m.llLockLipsuri
ENDIF ENDIF
ENDIF ENDIF

View File

@@ -1,35 +0,0 @@
-- 08.08.2026 Marius Mutu
-- VVANZARI_ARTICOLE: liniile unei vanzari (VANZARI_DETALII) cu denumirea articolului, a gestiunii
-- si a valutei, pentru gridul de articole din formularul de modificare a notei. Valori brute, fara
-- conversie valutara si fara calcule - editarea scrie inapoi exact ce a citit. Filtrul STERS ramane
-- pe seama apelantului, ca la VACT_TOT / VRUL_TOT / VRUL_OBINV_TOT.
CREATE OR REPLACE VIEW VVANZARI_ARTICOLE AS
select vd.id_vanzare,
vd.id_vanzare_det,
vd.id_articol,
vd.cantitate,
vd.pret,
vd.pret_cu_tva,
vd.proc_tvav,
vd.discount_unitar,
vd.id_gestiune,
vd.cont,
vd.id_valuta,
vd.id_jtva_coloana,
vd.serie,
vd.explicatie,
vd.taxcode,
vd.lot,
vd.sters,
na.denumire,
na.codmat,
ng.nume_gestiune,
nv.nume_val
from vanzari_detalii vd
left join nom_articole na on na.id_articol = vd.id_articol
left join nom_gestiuni ng on ng.id_gestiune = vd.id_gestiune
left join nom_valute nv on nv.id_valuta = vd.id_valuta;
exec pack_migrare.UpdateVersiune('ff_2026_08_08_01_COMUN_VVANZARI_ARTICOLE');
commit;

View File

@@ -1,127 +0,0 @@
# Handoff — watchdog VFP + bisectie blocaj "View Parameter" gnAn
Predare la peste 310k context (Regula zero). **Doar stare, fara analize noi.** Raport analitic
complet (dovezi, log-uri, discutie): `docs\cercetare\rec_watchdog_vfp.md`.
## 1. Inventar livrabile, cu fisier:linie
**Utilitar**: `D:\ROA\ROAFACTURARE\COMUN\utile\Teste\watchdog_vfp.ps1`. Linia de comanda completa:
```
powershell -ExecutionPolicy Bypass -File "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\watchdog_vfp.ps1" -Script "<cale.prg>" -TimeoutSec 90 -AutoDismiss -MaxDialogs 10
```
Lanseaza `vfp9.exe -A -T "<script>"`, detecteaza orice fereastra noua diferita de
`Process.MainWindowHandle`, o captureaza (PNG + `WM_GETTEXT` pe titlu si controale copil) in
`<folderul scriptului>\watchdog_out\`, si cu `-AutoDismiss` incearca s-o inchida STRICT prin mesaje
Windows tintite pe handle (`BM_CLICK` pe buton Cancel/Anulare -> `WM_COMMAND IDCANCEL` ->
`WM_KEYDOWN`/`WM_KEYUP` ca mesaj -> `WM_CLOSE`) - **FARA input real** (vezi sectiunea 3). Omoara
procesul mereu la iesire (`finally`).
**Fisiere de test noi**:
- `COMUN\utile\Teste\watchdog_selftest.prg` - caz banal de validare (MESSAGEBOX), folosit doar ca
sa confirme ca watchdog-ul detecteaza/captureaza/dismite corect, inainte de cazul real.
- `COMUN\utile\Teste\editare_factura\test_repro_izolat_gnan.prg` - experimentul B (izolat): DOAR
`test_init_env_auto` + `update_jtva_coloane("", "crsJtvaTemp", 6)`, fara nimic din S4. NU
reproduce blocajul - dovada ca `update_jtva_coloane`/`updateserver.prg` sunt nevinovate.
**Fisier de test modificat**: `COMUN\utile\Teste\editare_factura\test_page3_articole.prg`:
- linia 176: `update_jtva_coloane("", "crsJtvaTemp", 6)` (parametrul schimbat din `0` in `6` -
necesar pentru indexul `id_jtva` cerut de `Column63.ControlSource` din `omodificari.vc2:9199`;
independent de defectul principal, fix cunoscut deja din `date_test_nnir.md`);
- `PROCEDURE bisect_log_gnan` (noua, la coada fisierului, ~linia 236) + apeluri `DO bisect_log_gnan
WITH <tag>, lcLog` inserate: in programul principal intre fiecare apel de nivel superior, si ca
PRIMA linie in interiorul fiecarei proceduri (`verifica_vanzare_nota`, `verifica_coliziune_cod`,
`verifica_pagecount_form`) - infrastructura de bisectie, ramasa in cod ca dovada;
- **liniile 37, 39, 50 - remediul APLICAT DE TEAM-LEAD** (nu de mine, sub pragul lui de editare
directa): `gnAn`/`gnLuna` parantezate - `(gnAn)`, `(gnLuna)` - in apelurile `DO verifica_vanzare_nota
WITH ...` (x2) si `DO verifica_pagecount_form WITH ...` (primul), cu comentariu explicativ deasupra
primei aparitii (liniile 34-36).
**Log-uri si capturi**: `test_page3_articole_log.txt` (log-ul aplicatiei, contine liniile `[BISECT]`),
`watchdog_out\*.png` + `watchdog_out\*_watchdog.log` (capturi + jurnal watchdog, per fisier de test),
toate in `COMUN\utile\Teste\editare_factura\`.
## 2. Ce e terminat, ce nu
**Terminat**:
- Watchdog-ul: scris, testat pe caz banal, testat pe cazul real, corectat (heuristica de fereastra
principala, bug de indexare PowerShell pe array cu 1 element, input real scos complet).
- Bisectia: COMPLETA, cauza CONFIRMATA cu date brute (nu deductie) - vezi sectiunea 4.
- Remediul: APLICAT de team-lead (liniile 37/39/50).
**Neterminat**: remediul NU a fost re-testat dupa aplicare. Ultima rulare a suitei (a mea) a fost
INAINTE de remediul team-lead-ului. Team-lead ruleaza el insusi suita, separat - **eu nu mai rulez
nimic** (interdictie explicita primita).
## 3. Stare fisiere - write-back
**Toate fisierele atinse in aceasta sesiune sunt `.prg`/`.ps1` (text simplu)** - NU exista
`.vc2`/`.sc2`/`.vcx`/`.vct` atinse, deci **NU exista niciun write-back nefacut**.
Confirmare explicita: `COMUN\clase\omodificari.vc2/.vcx/.vct` si `COMUN\programe\updateserver.prg`
sunt **NEATINSE** in aceasta sesiune (nici de mine, nici - din cate stiu - de altcineva). Fara
commit git/svn facut sau initiat.
## 4. Ce s-a stabilit deja - NU relua
- **Cauza CONFIRMATA, nu ipoteza**: `test_page3_articole.prg` (inainte de remediu) trecea
`gnAn`/`gnLuna` NEPARANTEZAT in `DO...WITH` (liniile 34, 36, 47 - numerotare dinainte de remediu).
`DO proc WITH var` paseaza variabile de memorie BY REFERENCE implicit in VFP; `LPARAMETERS`
primitor devine alias direct pe storage-ul original, iar numele original (`gnAn`) devine
inaccesibil (`TYPE()='U'`) STRICT pe durata acelui apel, revenind valid imediat dupa `RETURN`.
Confirmat simetric pe 3 apeluri afectate vs 2 neafectate (vezi tabelul din `rec_watchdog_vfp.md`
sectiunea 5).
- **`updateserver.prg`/`update_jtva_coloane` sunt nevinovate** - experimentul B (izolat, fara nimic
din S4) NU reproduce; functia merge perfect cand `gnAn` e vizibil normal.
- **`gnAn` NU e eliberata niciodata** - ramane valida (`TYPE()='N'`, 2026) la FIECARE checkpoint din
scope-ul PRINCIPAL, fara exceptie. Nu exista `CLEAR ALL`/`CLEAR MEMORY`/`RELEASE ALL EXTENDED` pe
lantul executat.
- **Nu e coliziune de nume in corpul procedurii**: `verifica_pagecount_form` NU are `gnAn` in
`LOCAL` (linia ei 148/159), si NU exista `PRIVATE gnAn`/`LOCAL gnAn` nicaieri in `COMUN\programe`.
Umbrirea vine din SINTAXA APELULUI (`DO...WITH` neparantezat), nu din declaratiile callee-ului.
- **Handler-ul de eroare** (`test_error_handler`/`ON ERROR`) doar logheaza (`STRTOFILE`) si continua
- nu ascunde nimic, util pentru diagnostic.
- **Incidentul de focus**: ESC-ul trimis de o versiune veche a watchdog-ului (cu `SetForegroundWindow`
+ `keybd_event`, SCOASA complet acum) a aterizat de fapt in PROPRIUL nostru proces de test, NU in
sesiunea utilizatorului - dar mecanismul tot nu are tinta si regula "fara input real" ramane
obligatorie indiferent (documentat in `rec_watchdog_vfp.md` sectiunea 1, corectat acolo dupa o
formulare initiala gresita).
## 5. Ce e interzis
- Input real de tastatura/mouse in watchdog (`keybd_event`, `SetForegroundWindow`, `SendInput`,
`mouse_event`) - masina e PARTAJATA. Deja scos din cod, verificat cu grep (zero hit-uri de cod,
doar comentarii care explica interdictia).
- Atingerea `COMUN\clase\omodificari.vc2/.vcx/.vct` si `COMUN\programe\updateserver.prg`.
- Commit git/svn.
- **Eu nu mai rulez suita** - team-lead o ruleaza separat dupa remediul lui.
## 6. Capcane de mediu platite in aceasta sesiune
- **Heuristica "prima fereastra vazuta = principala" e o cursa pierduta**: un dialog poate aparea in
aceeasi fractiune de secunda cu fereastra principala. Solutia corecta: `Process.MainWindowHandle`
(.NET), NU ordinea de aparitie si NU numele clasei (VFP foloseste clase `vfp9...` si pentru shell,
si pentru dialogurile proprii - `vfp99400000` vs `vfp994000002`).
- **Dialogurile proprii VFP (ex. "View Parameter") sunt owner-drawn** - `EnumChildWindows` intoarce
ZERO controale copil (butoanele sunt desenate, nu HWND-uri reale). `BM_CLICK` e imposibil pentru
ele; chiar si `WM_CLOSE` poate "reusi" aparent (`IsWindow` -> fals) FARA sa deblocheze de fapt
motorul VFP din spate (SQLEXEC ramas agatat, fara linie noua in log, pana la timeout) - un fals
"succes" de retinut daca cineva reia mecanismul de dismiss.
- **Bug PowerShell subtil**: un `List[string]` cu UN SINGUR element e "descompus" de PowerShell la
scalar string simplu la `return` din functie (fara `,` unar) - indexarea ulterioara `$x[0]` citeste
atunci primul CARACTER, nu primul element. Prins la dump-ul de text al dialogului "View Parameter"
(fara controale copil = un singur element in listă). Fix: `return , $lista.ToArray()`.
- **`.fxp` vechi blocat**: sterge intotdeauna `.fxp`-ul inainte de fiecare rulare (watchdog-ul o face
singur) - altfel VFP ruleaza tacut codul vechi compilat.
- **Bisectia**: `TRANSFORM(gnAn)` pe o variabila `TYPE()='U'` ARUNCA eroare catchabila ("Variable
'GNAN' is not found") - helper-ul `bisect_log_gnan` verifica `TYPE()<>'U'` INAINTE de a apela
`TRANSFORM()`, ca sa nu produca o eroare noua care ar fi intrerupt bisectia la primul checkpoint
"gol".
## Confirmare finala
**PID 16548 nu mai exista** (verificat cu `Get-Process -Id 16548` - inexistent la momentul acestui
handoff) si **niciun `vfp9.exe` nu ruleaza** (verificat cu `Get-Process vfp9` - lista goala). Nimic
in stare periculoasa: fara editare pe jumatate, fara cursor/tranzactie Oracle deschisa (doar
citiri), fara fisier binar atins. Sesiunea se opreste aici.

View File

@@ -1,55 +0,0 @@
-- S10 - curatare istoric TABELA VERSIUNE, MARIUSM_AUTO/ROA_CENTRAL
-- Scop: cele 5 scripturi ff_2026_08_06_* au fiecare mai multe inregistrari in VERSIUNE,
-- din aplicari succesive pe masura ce au fost extinse in cursul zilei de 06.08.2026.
-- Fara impact functional (versiune_db.txt si aplicarea DDL nu depind de numarul de randuri),
-- doar istoric zgomotos. Pastreaza UN singur rand per script (cel cu ID_VERSIUNE maxim, adica
-- ultima aplicare - starea finala reala a scriptului), sterge restul.
--
-- NU S-A RULAT. Propunere pentru aprobare - stergerea de istoric e decizie de om, iar
-- MARIUSM_AUTO e schema de dezvoltare partajata.
-- 1) Verificare inainte de stergere: cate randuri per script, azi
select script_final, count(*) as nr_inregistrari
from versiune
where script_final in (
'ff_2026_08_06_02_COMUN_PACK_FACTURARE.sql',
'ff_2026_08_06_03_COMUN_PACK_FACTURARE.sql',
'ff_2026_08_06_04_COMUN_VANZARI_COMANDA_CONTRACT.sql',
'ff_2026_08_06_05_COMUN_FACT_VFACTURI.sql',
'ff_2026_08_06_06_COMUN_VANZARI_BACKFILL.sql'
)
group by script_final
order by script_final;
-- Stare masurata 06.08.2026: _02=2, _03=1 (nimic de sters), _04=2, _05=4, _06=5 (14 randuri total,
-- 9 de sters, ramanand 5 - unul per script).
-- 2) Stergere: pastreaza doar randul cu ID_VERSIUNE maxim per script (ultima aplicare)
delete from versiune v
where v.script_final in (
'ff_2026_08_06_02_COMUN_PACK_FACTURARE.sql',
'ff_2026_08_06_03_COMUN_PACK_FACTURARE.sql',
'ff_2026_08_06_04_COMUN_VANZARI_COMANDA_CONTRACT.sql',
'ff_2026_08_06_05_COMUN_FACT_VFACTURI.sql',
'ff_2026_08_06_06_COMUN_VANZARI_BACKFILL.sql'
)
and v.id_versiune < (
select max(v2.id_versiune)
from versiune v2
where v2.script_final = v.script_final
);
-- 3) Verificare dupa stergere: fiecare script din lista trebuie sa aiba exact 1 rand
select script_final, count(*) as nr_inregistrari
from versiune
where script_final in (
'ff_2026_08_06_02_COMUN_PACK_FACTURARE.sql',
'ff_2026_08_06_03_COMUN_PACK_FACTURARE.sql',
'ff_2026_08_06_04_COMUN_VANZARI_COMANDA_CONTRACT.sql',
'ff_2026_08_06_05_COMUN_FACT_VFACTURI.sql',
'ff_2026_08_06_06_COMUN_VANZARI_BACKFILL.sql'
)
group by script_final
order by script_final;
-- commit; -- de dat manual, dupa verificarea pasului 3

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

View File

@@ -1,117 +0,0 @@
DONE 1. ROACONT. verificarea codurilor fiscale pe ANAF sa foloseasta istoricul de verificari drept cache 1 luna, in loc sa verifice mereu pe anaf. DE FAPT VREAU VERIFICARE ANAF CARE ACTUALIZEAZA SI CACHE, SI DACA NU MERGE ANAF, SA FOLOSEASCA CACHE
Vreau acelasi sistem de cache si pentru Registrul TVA la incasare care acum se descarca in schema comuna de baza de date CONTAFIN_ORACLE, pe serverul de baza de date, arhive zip de la anaf si se actualizeaza tabelele de rtvai_*
Poate folosesti exact datele de la anaf descarcate pentru verificarea codurilor fiscale, in cazul in care exista informatia.
Vreau ca verificarile de coduri fiscale din D406, D394, Registrele de TVA sa foloseasca direct ANAF, si sa actualizeze cache-ul istoricul din baza de date (ISTORIC_CODURI_FISCALE)
DONE 2. ROACONT - Borderou eFactura, checkbox-urile diferente fata de Registrele de TVA sa aiba in caption si numarul de inregistrari cu diferente, astfel incat utilizatorul sa stie daca este cazul sa filtreze pentru afisarea facturilor cu diferente
DONE 3. ROACONT - modificare nota, explicatia tva sa filtreze dupa procent tva din tabel, ca sa arate o selectie mai mica de explicatii tva. vezi cum ai facut la explicatia tva din ointroduceri.vcx > import_nota.
DONE 4. ROACONT - overificari.vcx > formularul istoric coduri fiscale are coloane care nu mai au relavanta sau nu mai sunt completate din tabel. in tabelul contafin_oracle.istoric_coduri_fiscale, campul regcom are spatii si nu se afiseaza in formularul istoric. verifica
DONE 5. ROACONT - VERIFICARE cod fiscal, label-ul de sub grid-ul cu rezultate si detalii F4 sa contina si status "TVA Incasare"
DONE 6. ROAFACTURARE - EDITARE FACTURA EMISA ANTERIOR, CARE NU A FOST TRIMISA INCA IN EFACTURA (anaf_efactura.id_fact). punctul critic este ca notele contabile si eventual rulajele generate se genereaza complicat la emiterea facturii prin pack_facturare, iar editarea este o simpla editare, si nu sincronizeaza si notele contabile si rulajele. si sunt diverse tipuri de facturi sau de avize (pe baza de lista de preturi, pe baza de comanda, pe baza de contract, pe baza de aviz) si fiecare genereaza note contabile sau rulaje si articole de vanzare (vanzari si vanzari_detalii)
DONE 7. ROAFACTURARE - TVA unitar si valoarea TVA pe o linie de articol este calculata si nu salvata in vanzari si vanzari_detalii. din aceasta cauza, daca o factura are valoare totala 99.99 lei, dar utilizatorul doreste 100.00 lei total cu tva (pentru ca politica de preturi are bifat preturi fara TVA si se porneste calculul incepand de la pretul fara TVA al articolului) tva-ul se calculeaza rotunjit si nu se poate edita, ca sa dea factura fix 100.00 lei. implicatiile calculului TVA in loc de salvare sunt foarte mari si adanci in program, la introducerea facturii, listarea facturii initiale, relistarea facturii
Sau de fapt este posibil sa poata utilizatorul sa modifice "preturi_cu_tva" la nivel de fiecare articol, la introducerea facturii si ulterior la editare factura, tocmai pentru ca utilizatorul doreste sa ajusteze tva-ul total pentru ca are restrictie sa dea facturii o valoare totala rotunjita, si se poate ajusta exact din pretul cu tva individual. pret_cu_tva se salveaza in vanzari_detalii pe fiecare articol.
DONE 8. ROAFACTURARE - in pack_facturare am salvat in vanzari valori totale denormalizat (fara tva, tva, cu tva, numarul avizului/comanda/contract etc.) ca sa nu le calculez in view din vanzari_detalii pentru ca view-ul de facturi este foarte complex, cu functii si expresii si nu era optimizabil si acceseaza total tabelele vanzari si vanzari_detalii. folosesc un view pe modelul original, si un view cu valorile totale din vanzari. doar ca am observat un bug, la facturile din avize, nu se salveaza corect in vanzari avizul sau numarul/data/suma chitantei daca factura este achitata numerar. trebuie depanat. schema de verificare productie este VENDING@ROA_VENDING
DONE 9. ROAGEST - MODIFICARE REGISTRU JURNAL - SA SE POATA MODIFICA SI "NNIR" in notele contabile si sincronizat in rulajele asociate. nu exista coloana NNIR in formularul de editare.
10. ROAFACTURARE - Integrare pagina contracte si rapoarte contracte in ROAFACTURARE, similar COMENZI in ROAFACTURARE - facturare pe baza de comenzi/contracte. trebuie comasate si drepturile pe obiectele din roacontracte cu obiectele noi din ROAFACTURARE.
11. ROAFACTURARE - Integrare politici de preturi in ROAFACTURARE - sunt numai editari de liste de preturi, note contabile, nomenclator articole, drepturi pe liste de preturi, care toate se folosesc numai in programul ROAFACTURARE.
12. ROAFACTURARE - sa pot sa folosesc direct nomenclatorul de articole pe post de lista de preturi, sa nu mai definesc liste de preturi, note contabile asociate. Acum am un echivalent (lista de articole din stoc ca o lista de preturi virtuala)
Ca sa vand un articol, trebuie sa il introduc in nomenclatorul de articole obligatoriu. Acum trebuie sa il introduc si intr-o lista de preturi, ca sa am valuta, nota contabila de vanzare si daca are pret_cu_tva sau nu, procentul de tva vanzare, si bineinteles, pretul.
Am vazut la SAGA (alt ERP popular) ca in nomenclatorul de articole au cateva coloane de multe preturi, probabil pentru mai multe liste de preturi (todos-articole-preturi-saga.png)
Ideea este sa se poata face configurarea mult mai repede, eficient, dintr-un singur loc, ca sa se poata face factura mai rapid. Acum este nevoie de mult suport tehnic/instructaj si configurari pana se ajunge la facturare, si daca apare un articol diferit (ex: vanzare auto, in loc de marfa in mod normal), trebuie creata o politica noua de preturi, ca sa ii spun ce nota contabila de vanzare (4111 = 7xx) sa aiba aiba articolul respectiv.
DONE 13. ROAFACTURARE - FORMULARUL DE FACTURARE SA INCLUDA SI FORMULARUL DATE_FACTURA/DATE_AVIZ ETC. SI SA NU MAI INCARCE DE PE SERVER TOATE ARTICOLELE DIN TOATE POLITICELE DE PRETURI - INTRUCAT ESTE POSIBIL SA FIE SI MII DE ARTICOLE SI DUREAZA MULT SA LE ADUCA DE PE SERVER. AM INCEPUT DEJA MAI DEMULT UN FORMULAR UNIFICAT frm_facturare_articole2, DAR ERA MULT DE INTEGRAT DIN FORMULARUL VECHI.
FRONTEND SIMILAR PE CARE IL DORESC ESTE IN ROAACPRO > FACTURA, SAU IN IMPORTUL DE EFACTURA, IN CARE AM INTEGRAT DATELE FACTURI, DOAR CA FACTURAREA DIN ROAFACTURARE ESTE MAI COMPLEXA - ESTE FOLOSITA SI PENTRU POLITICI DE PRETURI SI PENTRU CONTRACT/COMANDA/AVIZ/RETUR ETC.
INTERESUL MEU ESTE SA SIMPLIFIC INTERFATA, SA FIE MAI EFICIENTA, SA NU FIE 2 FORMULARE PENTRU FACTURA, SA FAC MAI RAPID. in plus vreau si editare factura/aviz in toate variantele (politici preturi, comanda, contract, aviz etc) prin regenerare, adica sa arate formularul completat ca si cum ar fi inainte de salvarea initiala, ca sa pot sa fac editari ca si cum as fi la introducerea initiala - bineinteles cu stergerea facturii initiale (sters = 1) si salvarea celei noi, pentru a se vedea ce s-a modificat
14. ROACONT - efactura se salveaza xml detaliat si xml zip efactura si ocupa mult spatiu. vreau sa stiu cand nu mai este nevoie de xml detaliat si daca se poate curata tabelul ca sa nu mai ocupe spatiu, cel putin pentru facturi mai vechi. este important zip pentru ca este factura originala anaf.
15. ROACONT - ce locuri din program mai folosesc frm_modific2007 in loc de frm_modific2024. trebuie migrat la formularul mai nou.
16. ROAFACTURARE - in date_factura/date_aviz etc, la finalizare se verifica cursul valutar necesar pentru politicile de preturi care se factureaza. la revenire din formularul de curs valutar, focusul revine inainte de numar document, cred ca pe TIP DOCUMENT, si la iesire din serie se regenereaza numar act, ceea ce este periculos daca utilizatorul l-a schimbat si se modifica automat.
17. ROAFACTURARE - daca o nota contabile de vanzare nu are configurat tip de venit/cheltuiala, si nici articolele din lista de preturi, si nici nu se completeaza tip venit/cheltuiala la facturare, la finalizarea facturii apare o eroare oracle ORA ca id_venchelt nu are voie sa fie null. eroarea nu este user friendly si nu se poate recupera usor, pentru ca trebuie sa se dea renunt la toata factura si sa se reia tot porcesul, cu completarea tip venit cheltuiala. si nici nu stiu de ce este obligatoriu tip venit/cheltuiala.
18. ROAFACTURARE - EMITERE FACTURA DIN PROFORMA
19. ROAFACTURARE - EDITARE PROFORMA
20. ROAFACTURARE - FACTURA DIN COMANDA, COMANDA SE CONSIDERA FACTURATA DACA EXISTA FACTURI CU ACELEASI CANTITATI. AS VREA SA PUN MARKER DE FACTURAT PE COMANDA, CA SA NU MAI CAUT FACTURI - ESTE COSTISITOR. DOAR CA TREBUIE SA FII ATENT CA O COMANDA SE POATE FACTURA TOTAL/PARTIAL, SAU DIN MAI MULTE FACTURI, SAU SE POATE INCHIDE FORTAT. ACUM INCHIDEREA FORTATA ADAUGA CANTITATI NEGATIVE PE COMANDA, CA SA FACA CANTITATILE NEFACTURATE ZERO.
DONE 21. ROACONT - in formularul de verificare coduri fiscale, ar trebui sa fie si perioadele de tva, tva incasare, inactivitate, la fel ca in istoric, pentru ca utilizatorul sa nu mai caute altundeva. de asemenea, in messagebox pentru verificarea automata pe ANAF individuala ar trebui sa fie toate aceste informatii. sa se poata edita partenerul din formularul de verificare coduri fiscale prin dublu-click pe numele/codul fiscal al partenerului, similar cu formularul saft.
22. ROADEF - la datele firmei, dupa completarea codului fiscal sa existe buton de preluare date de pe ANAF, similar cu cel din ROACONT partener nou. vezi ca trebuie completate localitatea si judetul cu id-uri. am inceput sa lucrez ceva - poate trebuie doar continuat si corectat - am ramas la judet si localitate.
23. ROACONT - importul de eFactura recunoaste articolul doar pe text identic; cheie normalizata (fara cifre) + prefix configurabil per firma duce recunoasterea de la 52% la 72,3%. (rec_directie_roacont_2026_09.md, 1.1)
24. ROACONT - contabilizare in lot a eFacturilor primite, cu semafor verde/galben/rosu pe furnizor si anulare in bloc: 41,3% din facturi intra pe verde cu 93,8% precizie. (rec_directie_roacont_2026_09.md, 1.2)
25. ROACONT - LLM doar pe liniile fara precedent in istoric (~28%) si pe furnizorii noi, cu eticheta vizibila ca sugestia vine de la AI. (rec_directie_roacont_2026_09.md, 1.3)
26. ROACONT - la importul de extrase, partenerul sa se invete din istoric (IBAN + text de descriere normalizat, propus doar cand cheia a dus mereu la acelasi partener): 4,6% -> 28,5% acoperire la 97,9% precizie. (rec_directie_roacont_2026_09.md, 2.1)
27. ROACONT - importul de extrase sa salveze IBAN-ul pe partener cand operatorul confirma potrivirea; azi nomenclatorul are IBAN la 4,5% dintre parteneri si cheia cea mai sigura nu are pe ce lucra. (rec_directie_roacont_2026_09.md, 2.2)
28. ROACONT - la extrase, dupa ce partenerul e cunoscut sa se arate lista scurta a documentelor lui deschise, ordonate dupa potrivirea sumei; automatizarea completa a facturii e limitata structural - numarul facturii apare in textul bancii doar in 25% din cazuri. (rec_directie_roacont_2026_09.md, 2.3)
29. ROACONT - importul de extrase Banca Transilvania citeste denumirea si IBAN-ul de pe pozitii fixe in descriere, dar la platile prin OP catre alta banca apare un camp in plus si denumirea se citeste ca numar de OP. (rec_directie_roacont_2026_09.md, 2.4)
30. ROACONT - la asocierea platii cu factura, bucla iese neconditionat dupa primul numar incercat (oproceduri_import.prg:736), deci o plata care acopera mai multe facturi ramane nepereche. (rec_directie_roacont_2026_09.md, 2.4)
31. ROACONT - cand acelasi numar de document se potriveste pe mai multe randuri, GetDocumentByContPartenerAct doar scrie in log fara sa arate operatorului candidatii. (rec_directie_roacont_2026_09.md, 2.4)
32. COMUN - VerifIBAN (oproceduri_comune.prg:7885) intoarce raspuns gresit cand apelantul are selectat un cursor cu camp iban: variabilele nu sunt declarate si citirile neprefixate se rezolva la camp, nu la parametru. Afecteaza si validarea IBAN-ului la introducerea partenerului. (rec_directie_roacont_2026_09.md, 2.4)
33. ROACONT - de aflat de ce doar 7 din 21 de firme ale cabinetului folosesc importul de extrase; la restul extrasele se bat integral de mana. (rec_directie_roacont_2026_09.md, 2.5)
34. ROA2WEB - drepturile de utilizator nu sunt implementate; pana nu se rezolva, nimic nu poate fi aratat unui client. (rec_directie_roacont_2026_09.md, 3.1)
35. ROA - punte MCP peste Oracle: intrebi in Claude Code si el ruleaza interogari pregatite, modelul primeste rezultatul, nu baza. (rec_directie_roacont_2026_09.md, 3.2)
36. ROA - tablou de bord pe toate firmele cabinetului, cu alerte de noapte (luna neinchisa, token SPV expirat, facturi necontabilizate); singurul candidat de abonament nou. (rec_directie_roacont_2026_09.md, 3.3)
37. ROACONT - inchiderea de luna ca flux unic: azi sunt 13 comenzi in doua meniuri, fara ordine si fara bifare. (rec_directie_roacont_2026_09.md, 3.4)
38. ROACONT - sablon reutilizabil de mapare la preluarea unui client din alt program; azi maparea de conturi se reface manual la fiecare preluare. (rec_directie_roacont_2026_09.md, 3.5)
39. ROA - asistent de suport pe documentatia proprie; butonul de chat exista deja in mesajele de eroare, ii lipseste continutul (manual, versiuni, dictionar de erori). (rec_directie_roacont_2026_09.md, 3.6)
40. ROACONT - e-Transport: azi nu exista nimic, concurenta are modul dedicat. (rec_directie_roacont_2026_09.md, 3.7)
41. ROACONT - sa se poata genera xml efactura stornare si sa se trimita in SPV. Acum se poate face manual prin Borderou eFactura > Listare > Editare in browser > Stornare > Salvare xml stornat > meniul eFactura > Trimite xml efactura > trimitere in SPV xml storno salvat anterior.
Vreau sa fie operatia mai simplificata pentru utilizatori, pentru cazul in care s-a trimis in SPV o factura eronat (exemplu - client gresit). Sa se poata genera si trimite xml stornat. Utilizatorul poate apoi sa stearga factura originala din contabilitate si sa o reemita corectata (ex cu clientul corect) si sa o trimita din nou in eFactura.
In felul acesta se rezolva, chiar daca nu oficial, imposibilitatea de anulare a unei facturi trimise in SPV. O stornez doar cu xml, si o sterg din contabilitate.
42. ROACONT - daca se permite modificarea manuala a sumelor de la TVA, nu se poate si o atentionare daca TVA este altul decat procentul din explicatia de TVA selectata?
43. ROAFACTURARE - configurarea initiala pentru a putea factura un articol - este foarte complexa si vreau mai fluid, poate si cu un wizzard
- definire grup TOTAL in ROADEF si asociere utilizatori in grupul TOTAL
- creare articol in ROAPRETURI
- creare nota contabila vanzare
- creare politica preturi si introducere articol
- definire serii numere facturi
- completare optiuni document factura, aviz, documente incasare, bon fiscal, bon pos
Poate un wizzard
44. ROACONT - sa se poata genera xml efactura stornare si sa se trimita in SPV. Acum se poate face manual prin Borderou eFactura > Listare > Editare in browser > Stornare > Salvare xml stornat > meniul eFactura > Trimite xml efactura > trimitere in SPV xml storno salvat anterior.
Vreau sa fie operatia mai simplificata pentru utilizatori, pentru cazul in care s-a trimis in SPV o factura eronat (exemplu - client gresit). Sa se poata genera si trimite xml stornat. Utilizatorul poate apoi sa stearga factura originala din contabilitate si sa o reemita corectata (ex cu clientul corect) si sa o trimita din nou in eFactura.
In felul acesta se rezolva, chiar daca nu oficial, imposibilitatea de anulare a unei facturi trimise in SPV. O stornez doar cu xml, si o sterg din contabilitate.
45. ROACONT - la verificarea D406 SAFT, verificare facturi achizitie, daca sunt facturi de achizitie din import, unde tva-ul se declara pe Declaratia Vamala de Import (adica alt document), in Registrul TVA Cumparari, suma cu TVA de pe factura de achizitie nu include si TVA, si apare diferenta fata de totalul facturii din SAFT, care calculeaza automat TVA bazat pe procentul TVA al articolelor.
Vreau sa apara in xlsx de verificare si o coloana cu verificarea daca acesta este cazul, pentru ca sa stie utilizatorul ca nu este o greseala, ci este normal.
46. COMUN - roa_sync.ps1 (COMUN\scripts): la pasul 4, cand repo-ul COMUN e pe un branch claude/* cu tree curat, face checkout main INAINTE de a prelua revizia SVN in git. Checkout-ul suprascrie in working copy SVN sursele urmarite si de git (.prg, .txt, .vc2) cu versiunea veche din main, iar apoi raporteaza "nimic de comis". Vazut 14.09.2026 dupa svn commit r18103 (oproceduri_comune.prg, todos.txt, omodificari.vc2 revenite la vechi; reparat cu svn revert + git checkout de pe branch + roa_sync din nou).
Vreau ca roa_sync sa nu mai strice working copy-ul: inainte de checkout main sa verifice ca fisierele urmarite de SVN nu difera fata de SVN (svn status / svn diff) si, daca difera, sa se opreasca cu avertisment; sau sa comita sync-ul fara checkout (ex. git stash / worktree pe main).

View File

@@ -1,309 +0,0 @@
<#
Genereaza fisierul .sql de deschidere firma (sablon PACK_DREPTURI.FIRMEMODINSPROC pe ConPress)
pornind de la interogarea publica ANAF (sursa de adevar pentru denumire/adresa/CAEN/data
inregistrare -- NU certificatul ONRC, care poate avea erori de OCR/transcriere).
Nu scrie nimic in Oracle. Genereaza doar un fisier .sql (cu Pasii 1/2/4 tot comentati, ca in
sablon) plecand de la schita existenta. Pasul 0 (SELECT) poate fi rulat optional daca se dau
parametrii de conexiune -- tunelul si credentialele raman responsabilitatea lui Marius.
Exemplu minimal:
.\deschide_firma_conpress.ps1 -Cui 54602536
Exemplu cu parametri suplimentari (banca, drepturi):
.\deschide_firma_conpress.ps1 -Cui 54602536 -Banca1 'BANCA X' -Contb1 'RO00XXXX...' `
-IdUtil 5 -IdGrupUseri 3 -IdUtilOp 5 -NumeUser1 Iliescu -PrenumeUser1 Vali `
-NumeUser2 Ion -PrenumeUser2 Raluca
#>
[CmdletBinding()]
param(
[Parameter(Mandatory)] [string]$Cui,
[datetime]$DataVerificare = (Get-Date),
[int]$LunaStart = 5,
[int]$AnStart = 2026,
[string]$TemplateSql = '',
[string]$OutSql = '',
# --- date pe care ANAF nu le are: parametri optionali, implicit goale ("DE COMPLETAT") ---
[string]$Antet = '',
[string]$Banca1 = '', [string]$Contb1 = '',
[string]$Codang = '', [string]$Nume = '', [string]$Prenume = '',
[string]$Telefon2 = '', [string]$Telefon3 = '', [string]$Fax = '', [string]$Email = '',
[string]$Oasp = '', [string]$CapitalSocVar = '', [string]$CapitalSocSub = '', [string]$PunctLuc = '',
[string]$Schema = '',
[string]$IdMama = '0', [string]$EMama = '',
[string]$IdLoc = '', [string]$IdUtil = '',
[string]$IdFormaJuridica = '', [string]$IdFormaOrganizare = '', [string]$IdFormaProp = '', [string]$IdTipSoc = '',
[string]$Indicativ = '', [string]$Declarant = '', [string]$Functie = '', [string]$IndiceItm = '',
[string]$TipModificare = '', [string]$CodFirma = '',
[string]$NumeUser1 = '', [string]$PrenumeUser1 = '', [string]$NumeUser2 = '', [string]$PrenumeUser2 = '',
[string]$IdGrupUseri = '', [string]$IdUtilOp = '',
# --- Pasul 0 (SELECT) optional -- doar daca se dau explicit parametrii de conexiune ---
[string]$TnsAlias = 'ROA_CONPRESS',
[string]$DbUser = '',
[securestring]$DbPassword,
[switch]$RunPas0,
[string]$SqlplusPath = 'D:\ROA\instantclient_19_18\sqlplus.exe',
[string]$TnsAdmin = 'D:\ROA\instantclient_19_18'
)
$ErrorActionPreference = 'Stop'
function Write-Utf8NoBom {
# sqlplus se poticneste pe BOM (SP2-0734) chiar rulat cu @fisier - scrie fara BOM explicit
param([string]$Path, [string[]]$Lines)
[System.IO.File]::WriteAllText($Path, ($Lines -join "`r`n") + "`r`n", (New-Object Text.UTF8Encoding($false)))
}
$ScriptDir = if ($PSScriptRoot) { $PSScriptRoot } else { Split-Path -Parent $MyInvocation.MyCommand.Path }
if (-not $TemplateSql) { $TemplateSql = Join-Path $ScriptDir 'schita_deschidere_firma_conpress.sql' }
function ConvertTo-DataRo {
param([string]$s)
if ([string]::IsNullOrWhiteSpace($s)) { return '' }
foreach ($fmt in @('dd.MM.yyyy', 'dd-MM-yyyy', 'yyyy-MM-dd')) {
$d = [datetime]::MinValue
if ([datetime]::TryParseExact($s, $fmt, [Globalization.CultureInfo]::InvariantCulture, [Globalization.DateTimeStyles]::None, [ref]$d)) {
return $d.ToString('dd.MM.yyyy')
}
}
return $s
}
function Get-DateAnaf {
param([string]$Cui, [datetime]$Data)
$cuiNum = ($Cui -replace '[^0-9]', '')
if ([string]::IsNullOrEmpty($cuiNum)) { throw "CUI invalid: '$Cui'" }
$dataStr = $Data.ToString('yyyy-MM-dd')
# JSON construit manual (payload trivial) - evita capcana ConvertTo-Json care despacheteaza
# array-uri de un singur element cand trece prin pipeline.
$body = '[{"cui":' + $cuiNum + ',"data":"' + $dataStr + '"}]'
$url = 'https://webservicesp.anaf.ro/api/PlatitorTvaRest/v9/tva'
# acelasi URL folosit de ANAF_CreeazaCerereANAF, COMUN\programe\validare.prg:1845
# decodare explicita UTF-8 din raspuns (nu Invoke-RestMethod): serverul ANAF nu trimite
# charset in Content-Type, PowerShell 5.1 ghiceste ISO-8859-1 si strica diacriticele -
# acelasi motiv notat in validare.prg:1744 pentru clientul VFP.
$req = [System.Net.WebRequest]::Create($url)
$req.Method = 'POST'
$req.ContentType = 'application/json; charset=utf-8'
$bytesOut = [Text.Encoding]::UTF8.GetBytes($body)
$req.ContentLength = $bytesOut.Length
$reqStream = $req.GetRequestStream()
$reqStream.Write($bytesOut, 0, $bytesOut.Length)
$reqStream.Close()
$webResp = $req.GetResponse()
$reader = New-Object IO.StreamReader($webResp.GetResponseStream(), [Text.Encoding]::UTF8)
$json = $reader.ReadToEnd()
$reader.Close()
$webResp.Close()
return $json | ConvertFrom-Json
}
function Get-DetaliiAdresa {
param([string]$Text)
$r = [ordered]@{ Bloc = ''; Scara = ''; Apart = '' }
if ([string]::IsNullOrWhiteSpace($Text)) { return $r }
if ($Text -match '(?i)BL\.?\s*([A-Z0-9\-]+)') { $r.Bloc = $Matches[1] }
if ($Text -match '(?i)SC\.?\s*([A-Z0-9\-]+)') { $r.Scara = $Matches[1] }
if ($Text -match '(?i)AP\.?\s*([A-Z0-9\-]+)') { $r.Apart = $Matches[1] }
return $r
# ponytail: heuristica regex pe text liber ANAF (bl./sc./ap.), nu un parser de adrese complet;
# de verificat manual daca formatul sediului difera (ex. "et." lipsa, abrevieri neuzuale).
}
# ---------------------------------------------------------------------------
# 1. Interogare ANAF
# ---------------------------------------------------------------------------
Write-Host "Interogare ANAF pentru CUI $Cui (data verificare $($DataVerificare.ToString('yyyy-MM-dd')))..."
$resp = Get-DateAnaf -Cui $Cui -Data $DataVerificare
if (-not $resp.found -or $resp.found.Count -eq 0) {
Write-Warning "ANAF nu a gasit CUI $Cui (cod=$($resp.cod), message=$($resp.message)). Nu se genereaza fisierul .sql."
if ($resp.notFound) { Write-Warning "notFound: $($resp.notFound -join ', ')" }
return
}
$item = $resp.found[0]
$dg = $item.date_generale
$adr = $item.adresa_sediu_social
$tva = $item.inregistrare_scop_Tva
# data_inregistrare (yyyy-MM-dd) e campul structurat; stare_inregistrare (text liber cu
# data in dd.mm.yyyy) e fallback daca lipseste.
$dataInregRaw = if ($dg.data_inregistrare) { [string]$dg.data_inregistrare }
elseif ($dg.stare_inregistrare -match '(\d{2}\.\d{2}\.\d{4})') { $Matches[1] }
else { '' }
# bl./sc./et./ap. NU sunt in adresa_sediu_social.sdetalii_Adresa (acolo apare doar
# "CAMERA n") - sunt in date_generale.adresa, campul text liber complet.
$detalii = Get-DetaliiAdresa -Text $dg.adresa
$anaf = [ordered]@{
p_firma = $dg.denumire
p_reg_comert = $dg.nrRegCom
p_caen = if ($dg.cod_CAEN) { [string]$dg.cod_CAEN } else { '' }
p_data_inreg = ConvertTo-DataRo $dataInregRaw
p_telefon = $dg.telefon
p_judet = $adr.sdenumire_Judet
p_localitate = $adr.sdenumire_Localitate
p_strada = $adr.sdenumire_Strada
p_numar = $adr.snumar_Strada
p_cod_postal = $adr.scod_Postal
p_bloc = $detalii.Bloc
p_scara = $detalii.Scara
p_apart = $detalii.Apart
}
$persoanaJuridica = if ($dg.forma_organizare -match '(?i)persoana\s*juridica') { 'D' } else { '' }
# ---------------------------------------------------------------------------
# 2. Restul parametrilor - din argumentele scriptului (ANAF nu le are)
# ---------------------------------------------------------------------------
$params = [ordered]@{
p_firma = @{ v = $anaf.p_firma; src = 'ANAF' }
p_antet = @{ v = if ($Antet) { $Antet } else { $anaf.p_firma }; src = if ($Antet) { 'PARAM' } else { 'ANAF (= denumire)' } }
p_cod_fiscal = @{ v = ($Cui -replace '[^0-9]', ''); src = 'PARAM (-Cui)' }
p_reg_comert = @{ v = $anaf.p_reg_comert; src = 'ANAF' }
p_caen = @{ v = $anaf.p_caen; src = 'ANAF' }
p_data_inreg = @{ v = $anaf.p_data_inreg; src = 'ANAF (date_generale.data_inregistrare)' }
p_judet = @{ v = $anaf.p_judet; src = 'ANAF' }
p_localitate = @{ v = $anaf.p_localitate; src = 'ANAF' }
p_strada = @{ v = $anaf.p_strada; src = 'ANAF' }
p_numar = @{ v = $anaf.p_numar; src = 'ANAF' }
p_bloc = @{ v = $anaf.p_bloc; src = 'ANAF (heuristica text liber, DE VERIFICAT)' }
p_scara = @{ v = $anaf.p_scara; src = 'ANAF (heuristica text liber, DE VERIFICAT)' }
p_apart = @{ v = $anaf.p_apart; src = 'ANAF (heuristica text liber, DE VERIFICAT)' }
p_cod_postal = @{ v = $anaf.p_cod_postal; src = 'ANAF' }
p_banca1 = @{ v = $Banca1; src = if ($Banca1) { 'PARAM' } else { 'DE COMPLETAT (ANAF nu da IBAN)' } }
p_contb1 = @{ v = $Contb1; src = if ($Contb1) { 'PARAM' } else { 'DE COMPLETAT (ANAF nu da IBAN)' } }
p_persoana_juridica = @{ v = $persoanaJuridica; src = 'ANAF (forma_organizare)' }
p_codang = @{ v = $Codang; src = if ($Codang) { 'PARAM' } else { 'DE COMPLETAT' } }
p_nume = @{ v = $Nume; src = if ($Nume) { 'PARAM' } else { 'DE COMPLETAT (reprezentant legal)' } }
p_prenume = @{ v = $Prenume; src = if ($Prenume) { 'PARAM' } else { 'DE COMPLETAT' } }
p_telefon = @{ v = $anaf.p_telefon; src = 'ANAF' }
p_telefon2 = @{ v = $Telefon2; src = if ($Telefon2) { 'PARAM' } else { 'DE COMPLETAT' } }
p_telefon3 = @{ v = $Telefon3; src = if ($Telefon3) { 'PARAM' } else { 'DE COMPLETAT' } }
p_fax = @{ v = $Fax; src = if ($Fax) { 'PARAM' } else { 'DE COMPLETAT' } }
p_email = @{ v = $Email; src = if ($Email) { 'PARAM' } else { 'DE COMPLETAT' } }
p_oasp = @{ v = $Oasp; src = if ($Oasp) { 'PARAM' } else { 'DE COMPLETAT' } }
p_capital_soc_var = @{ v = $CapitalSocVar; src = if ($CapitalSocVar) { 'PARAM' } else { 'DE COMPLETAT' } }
p_capital_soc_sub = @{ v = $CapitalSocSub; src = if ($CapitalSocSub) { 'PARAM' } else { 'DE COMPLETAT' } }
p_punct_luc = @{ v = $PunctLuc; src = if ($PunctLuc) { 'PARAM' } else { 'gol (fara punct de lucru declarat)' } }
p_schema = @{ v = if ($Schema) { $Schema } else { $Cui }; src = if ($Schema) { 'PARAM' } else { 'DE CONFIRMAT (implicit = CUI, corecteaza cu -Schema)' } }
p_id_mama = @{ v = $IdMama; src = 'PARAM (implicit 0 = firma simpla)' }
p_e_mama = @{ v = $EMama; src = if ($EMama) { 'PARAM' } else { 'gol (relevant doar daca p_id_mama <> 0)' } }
p_id_loc = @{ v = $IdLoc; src = if ($IdLoc) { 'PARAM' } else { 'DE COMPLETAT' } }
p_id_util = @{ v = $IdUtil; src = if ($IdUtil) { 'PARAM' } else { 'DE COMPLETAT' } }
p_id_forma_juridica = @{ v = $IdFormaJuridica; src = if ($IdFormaJuridica) { 'PARAM' } else { 'DE COMPLETAT' } }
p_id_forma_organizare = @{ v = $IdFormaOrganizare; src = if ($IdFormaOrganizare) { 'PARAM' } else { 'DE COMPLETAT' } }
p_id_forma_prop = @{ v = $IdFormaProp; src = if ($IdFormaProp) { 'PARAM' } else { 'DE COMPLETAT' } }
p_id_tip_soc = @{ v = $IdTipSoc; src = if ($IdTipSoc) { 'PARAM' } else { 'DE COMPLETAT' } }
p_indicativ = @{ v = $Indicativ; src = if ($Indicativ) { 'PARAM' } else { 'DE COMPLETAT' } }
p_declarant = @{ v = $Declarant; src = if ($Declarant) { 'PARAM' } else { 'DE COMPLETAT' } }
p_functie = @{ v = $Functie; src = if ($Functie) { 'PARAM' } else { 'DE COMPLETAT' } }
p_indice_itm = @{ v = $IndiceItm; src = if ($IndiceItm) { 'PARAM' } else { 'DE COMPLETAT' } }
p_tip_modificare = @{ v = $TipModificare; src = if ($TipModificare) { 'PARAM' } else { 'DE COMPLETAT' } }
p_cod_firma = @{ v = $CodFirma; src = if ($CodFirma) { 'PARAM' } else { 'DE COMPLETAT' } }
p_luna_start = @{ v = [string]$LunaStart; src = 'PARAM (implicit 5)' }
p_an_start = @{ v = [string]$AnStart; src = 'PARAM (implicit 2026)' }
p_nume_user1 = @{ v = $NumeUser1; src = if ($NumeUser1) { 'PARAM' } else { 'DE COMPLETAT' } }
p_prenume_user1 = @{ v = $PrenumeUser1; src = if ($PrenumeUser1) { 'PARAM' } else { 'DE COMPLETAT' } }
p_nume_user2 = @{ v = $NumeUser2; src = if ($NumeUser2) { 'PARAM' } else { 'DE COMPLETAT' } }
p_prenume_user2 = @{ v = $PrenumeUser2; src = if ($PrenumeUser2) { 'PARAM' } else { 'DE COMPLETAT' } }
p_id_grup_useri = @{ v = $IdGrupUseri; src = if ($IdGrupUseri) { 'PARAM' } else { 'DE COMPLETAT' } }
p_id_utilop = @{ v = $IdUtilOp; src = if ($IdUtilOp) { 'PARAM' } else { 'DE COMPLETAT' } }
}
# adresa compusa, ca in sablon
$params['p_adresa'] = @{
v = '&p_strada. nr. &p_numar., bl. &p_bloc., sc. &p_scara., et. Parter, ap. &p_apart.'
src = 'derivat (sablon sqlplus, substituit din campurile de mai sus)'
}
# ---------------------------------------------------------------------------
# 3. Genereaza blocul DEFINE si scrie fisierul .sql (Pas 0-4 din sablon, neschimbate)
# ---------------------------------------------------------------------------
if (-not (Test-Path -LiteralPath $TemplateSql)) { throw "Sablon lipsa: $TemplateSql" }
$templateLines = Get-Content -LiteralPath $TemplateSql -Encoding UTF8
$startIdx = ($templateLines | Select-String -Pattern '^DEFINE p_firma\s*=').LineNumber
$endIdx = ($templateLines | Select-String -Pattern '^DEFINE p_id_utilop\s*=').LineNumber
if (-not $startIdx -or -not $endIdx) { throw "Sablonul '$TemplateSql' nu are markerii asteptati (DEFINE p_firma / DEFINE p_id_utilop) - format schimbat?" }
$startIdx = $startIdx[0] - 1
$endIdx = $endIdx[0] - 1
$before = $templateLines[0..($startIdx - 1)]
$after = $templateLines[($endIdx + 1)..($templateLines.Count - 1)]
$newBlock = New-Object System.Collections.Generic.List[string]
$newBlock.Add('-- ============================================================================')
$newBlock.Add("-- PARAMETRI GENERATI AUTOMAT de deschide_firma_conpress.ps1")
$newBlock.Add("-- Rulat: $(Get-Date -Format 'dd.MM.yyyy HH:mm') -- CUI interogat: $Cui -- data verificare ANAF: $($DataVerificare.ToString('dd.MM.yyyy'))")
$newBlock.Add("-- Sursa adresa/denumire/CAEN/data inregistrare: ANAF (webservicesp.anaf.ro/api/PlatitorTvaRest/v9/tva),")
$newBlock.Add("-- NU certificatul ONRC -- ANAF e sursa de adevar (posibil OCR gresit pe certificat).")
$newBlock.Add("-- Fiecare linie e adnotata cu sursa valorii: ANAF / PARAM (dat la rulare) / DE COMPLETAT.")
$newBlock.Add('-- ============================================================================')
$newBlock.Add('')
foreach ($key in $params.Keys) {
$entry = $params[$key]
$val = [string]$entry.v
$line = "DEFINE $key".PadRight(30) + "= '$val' -- $($entry.src)"
$newBlock.Add($line)
}
$newBlock.Add('')
if (-not $OutSql) {
$OutSql = Join-Path (Split-Path -Path $TemplateSql -Parent) "deschidere_firma_$($Cui)_$(Get-Date -Format 'yyyyMMdd_HHmmss').sql"
}
$outLines = $before + $newBlock + $after
Write-Utf8NoBom -Path $OutSql -Lines $outLines
Write-Host "Fisier generat: $OutSql"
# ---------------------------------------------------------------------------
# 4. Rezumat consola: ce a venit din ANAF vs ce a ramas gol
# ---------------------------------------------------------------------------
Write-Host ''
Write-Host '=== Rezumat campuri ==='
foreach ($key in $params.Keys) {
$entry = $params[$key]
$shown = if ([string]::IsNullOrWhiteSpace([string]$entry.v)) { '(gol)' } else { $entry.v }
Write-Host ("{0,-24} {1,-45} [{2}]" -f $key, $shown, $entry.src)
}
# ---------------------------------------------------------------------------
# 5. Pasul 0 (SELECT) optional -- doar daca s-au dat explicit parametrii de conexiune
# ---------------------------------------------------------------------------
if ($RunPas0) {
if (-not $DbUser -or -not $DbPassword) {
Write-Warning "RunPas0 cerut dar lipsesc -DbUser/-DbPassword. Tunelul/conexiunea raman responsabilitatea lui Marius -- se sare peste Pasul 0."
}
elseif (-not (Test-Path -LiteralPath $SqlplusPath)) {
Write-Warning "sqlplus nu a fost gasit la '$SqlplusPath'. Se sare peste Pasul 0."
}
else {
$pas0Start = ($after | Select-String -Pattern '^-- PAS 0 ').LineNumber
$pas0End = ($after | Select-String -Pattern '^-- PAS 1 ').LineNumber
if (-not $pas0Start -or -not $pas0End) {
Write-Warning "Nu s-a gasit sectiunea PAS 0 in sablon. Se sare peste."
}
else {
$pas0Lines = $after[($pas0Start[0] - 1)..($pas0End[0] - 2)]
$tmpSql = [System.IO.Path]::GetTempFileName() -replace '\.tmp$', '.sql'
Write-Utf8NoBom -Path $tmpSql -Lines ($newBlock + $pas0Lines)
$bstr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($DbPassword)
try {
$plainPwd = [Runtime.InteropServices.Marshal]::PtrToStringBSTR($bstr)
$env:TNS_ADMIN = $TnsAdmin
& $SqlplusPath -S -L "$DbUser/$plainPwd@$TnsAlias" "@$tmpSql"
} finally {
[Runtime.InteropServices.Marshal]::ZeroFreeBSTR($bstr)
$plainPwd = $null
Remove-Item -LiteralPath $tmpSql -ErrorAction SilentlyContinue
}
}
}
}

View File

@@ -1,265 +0,0 @@
# Investigare: deschidere firma noua (LUDIPEDIA S.R.L.) pe instalatia "ROA ConPress"
Investigatie read-only, 16.09.2026. Text FoxBin2Prg (`.??2`) resincronizat cu
`git_sync.ps1 -ProjectRoot D:\ROA\ROASTART` inainte de cautari (0 esecuri, 410 fisiere la zi).
Nimic din codul aplicatiei, din baza de date sau din configurari a fost modificat.
---
## 1. Localizare ROASTART
`D:\ROA\ROASTART` exista si e proiect VFP9, structurat identic cu ROAFACTURARE:
`roastart.PJX/.PJT` (proiect), `roastart.pj2` (text FoxBin2Prg), foldere
`Programe/ Clase/ Ferestre/ Rapoarte/ Locale/ COMUN/`, `changelog_roastart.txt`,
`versiune_db.txt`. Compilat in `roastart.exe`, impachetat cu Armadillo (`ROASTART.ARM`).
Din `D:\ROA\ROASTART\CLAUDE.md:7`: "**ROASTART** ('ROA Romfast Applications') is a Visual
FoxPro 9 launcher/shell for the ROA business application suite."
Entry point: `Programe\roastart.prg`. Formularul de fundal (mereu deschis, gazda
proceselor de creare firma si a butoanelor de administrare) e
`D:\ROA\ROASTART\Ferestre\frm_fundal.sc2`.
---
## 2. Fluxul "deschidere firma noua"
### 2.1 Declansare din UI
Buton/tile "Firma noua" pe fundal, imagine dedicata:
- `D:\ROA\ROASTART\roastart.pj2:401` - `.ADD('grafice\admin\firma noua.png')`
- `D:\ROA\ROASTART\Ferestre\frm_fundal.sc2:682,684,686` - `lb_imagine.Picture = ..\grafice\admin\firma noua.png`,
`lb_program.Caption = "Firma noua"`, `lb_explicatie.Caption = "Initializare firma noua"`.
### 2.2 Introducerea datelor firmei noi
`D:\ROA\ROASTART\COMUN\clase\ofirma.vc2`, clasa `frm_firme` / metoda `do_adauga` (linia 875):
```
886: Do Adauga_Modifica_Inregistrare With "firme_mini",loRec,,"INSERT"
```
Editorul generic deschide un formular legat de clasa de date `cus_odata_firme_mini`
(`ofirma.vc2:158`, mosteneste `cus_odata_firme` de la linia 7). `make_sql` din
`cus_odata_firme` (linia 14-154) construieste apelul catre pachetul PL/SQL, pentru
INSERT:
```
130-146: lcSql = [begin pack_drepturi.firmemodinsproc(] + lcId + [,'] + lcfirma + [','] + lcantet + [','] +
lcCodF + [','] + lcregc + [','] + && CUI, Nr. Reg. Com.
lcbanca1..lcbanca10 / lccontb1..lccontb10 + [','] + && banci si conturi (10 seturi)
lcadresa + [','] + lcCodFirma +
[',] + lnpersj + [,] + lncodang + [,'] + lcnume + [','] + lcprenume +
[','] + lctel + [','] + lctel2 + [','] + lctel3 + [','] + lcfax +
[','] + lcemail + [','] + lcoasp + [',] + lncapsv + [,] + lncapss +
[,'] + lcpctl + [','] + lccaen + [','] + lcschema +
[','] + lcjudet + [','] + lclocalitate + [','] + lcstrada + [','] + lcnumar +
[','] + lcbloc + [','] + lcscara + [',] + lnapart + [,'] + lccod_postal +
[',] + lnidm + [,] + lne_mama + [,] + lnidl + [,] + Alltrim(Str(gnIdUtil)) +
[,] + lnid_formaj + [,] + lnid_formao + [,] + lnid_formap + [,] + lnid_tip_soc +
[,'] + lcindicativ + [','] + lcDeclarant + [','] + lcFunctie + [','] + lcIndiceitm +
[',] + lcTipModificare + [,'] + lcCaenRevizie + ['); end;]
```
**Procedura PL/SQL exacta: `PACK_DREPTURI.FIRMEMODINSPROC`** (pachet `PACK_DREPTURI`).
Campurile relevante pentru certificatul RC (cu numele lor din `toRec`, linia 42-106):
- `firma` = denumire firma, `cod_fiscal` = **CUI**, `reg_comert` = **Nr. ord. Reg. Com.**
- `adresa`, plus componente separate: `judet`, `localitate`, `strada`, `numar`, `bloc`,
`scara`, `apart` (apartament), `cod_postal`
- `antet`, `cod_firma`, `persoana_juridica`, `codang`, `nume`/`prenume` (reprezentant),
`telefon`/`telefon2`/`telefon3`, `fax`, `email`, `oasp`, `capital_soc_var`,
`capital_soc_sub`, `punct_luc`, `caen`, `caen_revizie`, `schema` (numele schemei
Oracle noi), `id_mama`/`e_mama` (grup de firme), `id_loc`, `id_forma_juridica`,
`id_forma_organizare`, `id_forma_prop`, `id_tip_soc`, `indicativ`, `declarant`,
`functie`, `indice_itm`, `tip_modificare`.
- Etichetele din grid confirma maparea: `ofirma.vc2:567` "Cod fiscal", `ofirma.vc2:433-434`
`reg_comert`/"cReg_Comert", `ofirma.vc2:446` "Adresa", `ofirma.vc2:672` "Firma".
Stergere firma (pentru referinta): `pack_drepturi.firmedelproc` - `ofirma.vc2:150`.
### 2.3 Crearea schemei Oracle noi (jobul propriu-zis)
Dupa INSERT-ul cu succes, tot in `do_adauga` (`ofirma.vc2:888-907`):
```
890: If Nvl(loRec.id_mama, 0) = 0 && doar firme simple/mama, nu membri de grup
891-893: pcSchema = Alltrim(loRec.schema) ; pnAn = loRec.an ; pnLuna = loRec.luna
895: lcSql = [begin SYN_NEWSCHEMAJOB(?pcSchema, ?pnLuna, ?pnAn); end;]
896: llSucces = goExecutor.oExecuta(m.lcSql)
897-905: seteaza _Screen.cNewSchema/nNewSchemaAn/nNewSchemaLuna/cTime,
porneste _Screen.oFundal.tmrProgressBar.Enabled = .T.,
AMESSAGEBOX('Se creeaza firma "..." in baza de date! Urmariti progresul...')
```
**Procedura/job PL/SQL exacta: `SYN_NEWSCHEMAJOB(pcSchema, pnLuna, pnAn)`** - 3 parametri:
numele schemei Oracle noi, luna si anul de start (perioada contabila initiala). Ruleaza
asincron (job Oracle), de aceea urmatorul pas e polling.
### 2.4 Urmarirea progresului
`D:\ROA\ROASTART\Ferestre\frm_fundal.sc2`, timer `tmrProgressBar.Timer` (linia 1777-1833):
```
1783-1786: Private pcSchema, pnLuna, pnAn ; pcSchema = Alltrim(_Screen.cNewSchema) ...
1792: lcSql = [SYN_NEWSCHEMAPROGRESS(?pcSchema)]
1793: lnSucces = goExecutor.oFunction2Value(m.lcSql, @lcProgress)
1796: IF m.lcProgress = 'FINALIZAT'
1818-1819: AMESSAGEBOX('S-a creat firma ' + m.pcSchema + ... +
'Puteti da drepturi utilizatorilor pe noua firma!', 0+64, 'Firma noua')
```
**Functie de progres: `SYN_NEWSCHEMAPROGRESS(pcSchema)`** - intoarce un status text; cand
devine `'FINALIZAT'` apare mesajul catre operator sa dea drepturi userilor pe firma noua
(exact fraza pe care ati mentionat-o).
Comentariu din cod (`frm_fundal.sc2:1778-1780`, istoric, 21.10.2014, marius.mutu): pasul
separat `SYN_NEWSCHEMAPOST` a fost **mutat in interiorul lui `SYN_NEWSCHEMA`** (jobul
asincron), deci azi tot ce tine de scripturi post-import (calendar, cote TVA, plan de
conturi) ruleaza automat in job, nu mai e apelat separat din VFP - linia veche e comentata
(`*!*` la 1813-1816).
**Rezumat lant apeluri**: `do_adauga (ofirma.vc2:886)` -> editor generic "firme_mini" ->
`PACK_DREPTURI.FIRMEMODINSPROC(...)` (INSERT firma) -> `SYN_NEWSCHEMAJOB(schema, luna, an)`
(pornire job async creare schema) -> poll `SYN_NEWSCHEMAPROGRESS(schema)` din
`frm_fundal.sc2` pana la `'FINALIZAT'`.
Nota: parametrii CUI/Reg.Com./adresa se scriu o singura data, la INSERT-ul in
`FIRMEMODINSPROC`, in tabela master de firme (nu sunt parametri ai jobului de schema -
jobul de schema primeste doar numele schemei si perioada contabila initiala).
---
## 3. "ROA ConPress" / "Contpress"
Gasit, cu ortografia **"conpress"** (litere mici, fara "Contpress"):
`D:\ROA\ROAFACTURARE\COMUN\docs\conexiuni-tunel-ssh-odbc.md:137`
```
134: | Tunel / profil | Alias TNS + DSN | Schema Oracle |
135: |---|---|---|
136: | `vending.tlp` | `VENDING` | **`VENDING`** (parola standard ROA) |
137: | conpress | `ROA_CONPRESS` | `xenoti` |
139-141: Profilele Bitvise sunt in D:\roa\BITVISE\ pe statia curenta (..., `conpress.tlp`, ...)
```
Interpretare (document-cadru, sectiunea 1-4 din acelasi fisier, linii 13-131): "conpress"
e un **client/instalatie de productie separata**, nu o schema pe serverul central ROA:
- profil tunel SSH Bitvise: `conpress.tlp` (in `D:\roa\BITVISE\`)
- alias TNS pentru conectare prin tunel: **`ROA_CONPRESS`** (in `tnsnames.ora` din
`instantclient_19_18` / `instantclient_11_2_0_2`)
- DSN ODBC (32-bit, folosit de VFP): de regula acelasi nume ca aliasul TNS (nu e listat
explicit un DSN separat pentru conpress in acest doc - vezi `ODBC.INI` la nevoie)
- **schema Oracle**: `xenoti` (nu "conpress" - numele schemei difera de numele clientului)
Nu am gasit alta mentiune "ConPress"/"Contpress" in cod (`.??2`) sau in alte fisiere
`.ini`/`.md` cautate in ROASTART sau in COMUN. **NU GASIT**: host/IP explicit al
serverului conpress, parola, sau vreo mentiune a numelui "ConPress" in codul VFP
propriu-zis (numele apare doar in acest document operational, nu in sursa aplicatiei).
Implicatie pentru sarcina cerută: pentru a deschide firma LUDIPEDIA pe instalatia
ConPress, trebuie intai ridicat tunelul `conpress.tlp`, apoi ROASTART/aplicatia trebuie
sa se conecteze prin DSN-ul care foloseste aliasul `ROA_CONPRESS` (deci pe schema
`xenoti`), nu pe conexiunea centrala ROA. Procedura tunel+TNS+DSN completa e in
`D:\ROA\ROAFACTURARE\COMUN\docs\conexiuni-tunel-ssh-odbc.md:1-131` (skill asociat:
`roa-oracle-production-access`).
---
## 4. Drepturi utilizatori/grupuri pe firma
### 4.1 Tabele de baza (drepturi pe programe, nu neaparat per-firma)
`D:\ROA\ROASTART\COMUN\Drepturi utilizatori\drepturi_utilizatori.sql`:
- `DEF_GRUP` (linia 12-21): `ID_GRUP, GRUP, STERS, ID_UTILOP, DATAORA, NR_GRUP, ID_TATA`
- `DEF_GRUP_DREPT` (linia 66-74): `ID_GRUP, ID_PROGRAM, ID_DGD, ID_UTILOP, DATAORA, STERS`
(drepturi grup pe program, nu pe firma)
- `DEF_OBIECTE` (linia 112-121): drepturi pe obiecte UI per program
### 4.2 Ecranul de alocare drepturi PE FIRMA (raspunsul direct la cerinta)
Meniu ROASTART: `D:\ROA\ROASTART\Programe\oproceduri_start.prg:189`
`Procedure viz_utilgrupfirma`:
```
202: pcselect1=['select id_dug,id_grup,grup,id_firma,firma from vdef_util_grup where 1=2']
219: ofrmutilgf=Createobject("frm_utilgrupf")
```
View sursa: **`vdef_util_grup`** (coloane: `id_dug`, `id_grup`, `id_firma`, `firma`).
Grid-ul deschide un formular de adaugare dedicat:
`D:\ROA\ROASTART\Clase\ostart_util.vc2:1102` - `DEFINE CLASS frm_utilgrupf_nou`,
titlu `"DEFINIRE ROL PE FIRMA"` (linia 1138), cu 3 campuri combo:
`Cb_utilizator` / `Cb_grup` (linia 1170, eticheta "Grup") / `Cb_firma` (linia 1159,
eticheta "Firma").
Salvarea foloseste clasa de date `cus_odata_utilgrupf` (`ostart_util.vc2:7-51):
```
32-34: lcIdUtil = Alltrim(Str(toRec.id_util)) ; lcIdGrup = Alltrim(Str(toRec.id_grup)) ;
lcIdFirma = Alltrim(Str(toRec.id_firma))
38-40: Case lcActiune = "INSERT"
lcSql = [begin PACK_DREPTURI.utildreptinsproc(]+lcIdUtil+[,]+lcIdGrup+[,] +
lcIdFirma +[,]+Alltrim(Str(gnIdUtil))+[); end;]
```
**Procedura exacta: `PACK_DREPTURI.UTILDREPTINSPROC(id_util, id_grup, id_firma, id_utilop)`**
- adauga un utilizator, intr-un grup/rol, scopat pe o firma anume. Exista si
`UTILDREPTMODPROC` (linia 41-43, UPDATE) si `UTILDREPTDELPROC` (linia 44-46, DELETE).
### 4.3 Crearea/gestionarea utilizatorilor (pasul dinaintea alocarii pe firma)
Meniu: `oproceduri_start.prg:240` `Procedure viz_utilizatori` -> `frm_utilizatori`,
cursor sursa `vutilizatori` (linia 245).
Salvare utilizator: `ostart_util.vc2:53-98`, clasa `cus_odata_utilizatori`:
```
85: Case "INSERT": lcSql = [begin pack_drepturi.utilizatoriinsproc('] + lcutilizator +
[','] + lcparola + [',] + lcInactiv + [,]+ Alltrim(Str(gnIdUtil))+[); end;]
88: Case "UPDATE": pack_drepturi.utilizatorimodproc(...)
92: Case "DELETE": pack_drepturi.utilizatoridelproc(id, id_utilop)
```
**Procedura exacta: `PACK_DREPTURI.UTILIZATORIINSPROC(utilizator, parola, inactiv,
id_utilop)`** - creeaza un cont nou. Daca "Vali Iliescu"/"Valentina Iliescu" si
"Raluca Ion" nu exista deja ca useri, acesta e pasul care ii creeaza, inainte de a le
aloca `UTILDREPTINSPROC` pe firma LUDIPEDIA.
### 4.4 Cautare nume "Vali Iliescu" / "Valentina Iliescu" / "Raluca Ion"
Cautat in tot codul VFP text (`.??2`) din `D:\ROA\ROASTART` (inclusiv COMUN local),
variante `Iliescu`, `ILIESCU`, `Raluca Ion`, `ION R` - **NU GASIT**. Aceste nume nu
apar in sursa aplicatiei (asteptat: userii sunt date, nu cod, stocate in tabela Oracle
`UTILIZATORI` / vederea `vutilizatori`). Nu am interogat nicio baza Oracle (nici centrala,
nici ConPress) in aceasta investigatie - e in afara scopului "read-only pe cod" cerut, si
oricum ar necesita tunelul SSH + credentiale pe care nu le am. **Pentru confirmarea
existentei conturilor "Vali Iliescu"/"Valentina Iliescu"/"Raluca Ion" e nevoie de o
interogare SELECT (read-only) pe `UTILIZATORI`/`vutilizatori` pe instanta corecta
(centrala ROA sau ConPress/xenoti, dupa unde vreti sa dati drepturile) - pas separat,
de aprobat explicit inainte de rulare.**
---
## 5. Documentatie existenta pentru "deschidere firma noua"
Cautat cu Grep (path explicit) in:
- `D:\ROA\ROASTART\COMUN\` - **acest folder nu are subfolder `docs\`** (verificat cu
`Get-ChildItem`: contine doar `clase, datemenu, Drepturi utilizatori, ferestre, grafice,
include, meniuri, Plugin, PluginTemplate, programe, Rapoarte, utile` - fara `docs`).
- `D:\ROA\ROAFACTURARE\COMUN\docs\` - singurul hit relevant e
`conexiuni-tunel-ssh-odbc.md` (documenteaza tunelul/TNS/DSN, inclusiv randul "conpress",
dar **nu** documenteaza fluxul de creare firma / SYN_NEWSCHEMAJOB / PACK_DREPTURI).
**NU GASIT**: niciun document `docs/*.md` cu procedura pas-cu-pas de "deschidere firma
noua" sau de "acordare drepturi pe firma noua". Fluxul de mai sus (punctele 2 si 4) a
fost reconstruit direct din cod, nu dintr-o documentatie existenta.
---
## Concluzie operationala (fara nicio actiune executata)
1. Pentru a deschide firma LUDIPEDIA S.R.L. pe instalatia ConPress trebuie lucrat pe
conexiunea `ROA_CONPRESS`/schema `xenoti` (tunel `conpress.tlp`), nu pe conexiunea
centrala ROA - altfel firma s-ar crea in schema gresita.
2. Fluxul standard ROASTART (buton "Firma noua" -> editor "firme_mini" -> INSERT prin
`PACK_DREPTURI.FIRMEMODINSPROC` -> `SYN_NEWSCHEMAJOB(schema, luna, an)` -> polling
`SYN_NEWSCHEMAPROGRESS`) e generic si ruleaza pe orice conexiune activa, inclusiv
ConPress - nu exista cod separat "doar pentru ConPress".
3. Drepturile catre Vali Iliescu / Valentina Iliescu / Raluca Ion se dau prin ecranul
"DEFINIRE ROL PE FIRMA" (`frm_utilgrupf_nou`), care cheama
`PACK_DREPTURI.UTILDREPTINSPROC(id_util, id_grup, id_firma, id_utilop)` - dar
existenta conturilor lor ca utilizatori pe instanta ConPress nu a putut fi confirmata
din cod; e nevoie de o interogare separata pe date (aprobata explicit).
4. Niciun script sau modificare nu a fost scris/rulat - investigatie 100% read-only pe
cod si pe un singur document `.md`.

File diff suppressed because one or more lines are too long

View File

@@ -1,94 +0,0 @@
# Sarcina lane firma-ludipedia-contafin
Continuam un draft (neexecutat) de deschidere firma LUDIPEDIA S.R.L. (CUI 54602536) pe
instalatia Oracle ROA ConPress, schema noua **LUDIPEDIA**. Fisiere deja existente, CITESTE-LE
INTAI (nu suprascrie structura, doar completeaza):
- `C:\Users\mmari\AppData\Local\Temp\claude\D--ROA-ROAFACTURARE\8e9e8ac8-a9eb-48de-a26c-85e5cb7a35d8\scratchpad\schita_deschidere_firma_conpress.sql`
- `C:\Users\mmari\AppData\Local\Temp\claude\D--ROA-ROAFACTURARE\8e9e8ac8-a9eb-48de-a26c-85e5cb7a35d8\scratchpad\deschide_firma_conpress.ps1`
Documente de referinta (citeste-le, nu presupune):
- `D:\ROA\ROAFACTURARE\COMUN\docs\conexiuni-tunel-ssh-odbc.md` (tunel/TNS/DSN, reguli productie:
DOAR SELECT, fara INSERT/UPDATE/DELETE/DDL)
- `D:\ROA\ROAFACTURARE\COMUN\docs\conventie_mediu_oracle.md` (rolul schemei `CONTAFIN_ORACLE`)
- `D:\ROA\ROAFACTURARE\COMUN\docs\local\oracle.md` (parole reale, neversionat in git — foloseste-l
pentru user/parola de conectare)
## Contract de parametri al scriptului PS1 (cerinta noua a lui Marius, prioritara)
`deschide_firma_conpress.ps1` trebuie sa aiba ca parametri **OBLIGATORII doar 3**: codul fiscal
(CUI), anul si luna de deschidere (start contabil). Restul (adresa, denumire, reg.com., CAEN,
telefon, cod postal) se obtin automat din interogarea ANAF folosind CUI-ul. Codurile interne
comune (`id_forma_juridica/organizare/prop/tip_soc`, `id_grup` uzual) gasite la pasul de
verificare DB de mai jos devin **valori implicite hardcodate in script** (nu parametri
obligatorii) — daca Marius vrea sa le schimbe pentru un caz special, ramane parametru optional
cu acea valoare implicita. Datele care chiar nu au nicio sursa automata (banca/IBAN, email,
reprezentant legal, capital social) raman parametri optionali, impliciti goale.
Rescrie semnatura `param(...)` a scriptului sa reflecte asta: `-Cui` (obligatoriu), `-An`
(obligatoriu), `-Luna` (obligatoriu), apoi restul optionale cu valori implicite (codurile comune
gasite la pasul DB, sau gol/"DE COMPLETAT" pentru ce nu are sursa). Nu schimba `-Cui/-An/-Luna`
sa fie optionale sau sa aiba alte nume.
## Ce a stabilit deja Marius (nu re-investiga, doar aplica)
- Nu e nevoie de parola schemei `xenoti`/`LUDIPEDIA` (firma inca nu exista). Nomenclatorul de
firme si drepturile de utilizatori sunt in schema **`CONTAFIN_ORACLE`** (comuna, o instanta pe
fiecare server — deci exista un `CONTAFIN_ORACLE` propriu pe serverul ConPress, la care trebuie
sa te conectezi, nu pe schema centrala ROA_CENTRAL).
- Tabela cu nomenclatorul de firme se numeste **`nom_firme`** (nu "firme" — corecteaza daca
gasesti alt nume real dupa ce te conectezi si verifici).
- Parola standard pe care sistemul o pune automat la deschiderea unei firme noi este
**`ROMFASTSOFT`** (confirmat de Marius; consistent cu `COMUN\docs\depanare-spatiu-oracle.md:59-63`
care spune ca `PACK_UPDATE.GetSchemaParola` intoarce `'ROMFASTSOFT'` hardcodat pentru schemele
de firma). Foloseste-o ca prima incercare daca ai nevoie sa te loghezi ca `contafin_oracle` si
nu gasesti alta parola explicita in `oracle.md`; daca `oracle.md` are o parola specifica pentru
`contafin_oracle` pe serverul conpress, aceea are prioritate.
- Profilul Bitvise pentru tunelul conpress a fost gasit anterior la
`D:\vm303-profile\conpress.tlp` (NU la calea din `conexiuni-tunel-ssh-odbc.md`,
`D:\roa\BITVISE\`) — verifica ambele cai, foloseste-o pe cea care exista.
## Ce trebuie sa faci (READ-ONLY pe Oracle — doar SELECT, respecta strict regula din
`conexiuni-tunel-ssh-odbc.md`; NU rula niciun INSERT/UPDATE/DELETE/DDL pe ConPress)
1. Ridica tunelul Bitvise spre conpress (`stnlc.exe -profile=<cale gasita>`), verifica portul
1521 deschis, conecteaza-te cu `sqlplus` (sau alt client disponibil) ca user `contafin_oracle`
pe alias TNS `ROA_CONPRESS`.
2. `DESC nom_firme` (sau interogare pe `USER_TAB_COLUMNS`/`ALL_TAB_COLUMNS`) ca sa confirmi
coloanele reale (asteptate: ceva similar cu `id_forma_juridica`, `id_forma_organizare`,
`id_forma_prop`, `id_tip_soc`, `cod_fiscal`, `reg_comert`, `schema`, etc. — numele exacte pot
diferi usor fata de ce a fost dedus anterior din codul VFP).
3. Gaseste combinatia cea mai FRECVENTA de `id_forma_juridica/id_forma_organizare/id_forma_prop/
id_tip_soc` in `nom_firme` (GROUP BY + COUNT, ORDER BY COUNT DESC) — Marius spune ca aceste
coduri sunt comune intre firme, deci cea mai frecventa combinatie e raspunsul corect pentru o
firma noua obisnuita (SRL).
4. Verifica daca CUI `54602536` exista deja in `nom_firme` (evitare duplicat).
5. Cauta userii "Vali"/"Valentina Iliescu" si "Raluca Ion" in tabelele/vederile de utilizatori
din `CONTAFIN_ORACLE` (numele exact poate fi `UTILIZATORI`/`vutilizatori` sau altul — verifica
ce exista real in schema). Daca exista, noteaza `id_util`.
6. Gaseste `id_grup` cel mai frecvent alocat pe firme recente (tabela de drepturi grup-firma,
posibil `DEF_GRUP`/`vdef_util_grup` sau echivalent real din schema).
7. Inchide tunelul la final, indiferent de rezultat.
## Actualizeaza cele 2 fisiere existente
- In `schita_deschidere_firma_conpress.sql`: completeaza `p_id_forma_juridica`,
`p_id_forma_organizare`, `p_id_forma_prop`, `p_id_tip_soc` cu combinatia gasita (noteaza sursa:
"cea mai frecventa combinatie, X din Y firme in CONTAFIN_ORACLE.nom_firme"). Completeaza
`p_id_util_1`/`p_id_util_2` daca userii exista, sau lasa gol cu nota clara daca nu exista inca
(caz in care trebuie creati intai cu `PACK_DREPTURI.UTILIZATORIINSPROC`, parola implicita
`ROMFASTSOFT`). Completeaza `p_id_grup_useri`. Actualizeaza notele de la inceputul fisierului
(inlocuieste "NOTA IMPORTANTA 6" care spunea ca verificarea a fost blocata, cu rezultatul real).
- In `deschide_firma_conpress.ps1`: daca ai gasit tabele/coloane cu nume diferite fata de ce
presupunea scriptul, corecteaza. Adauga parola implicita `ROMFASTSOFT` ca valoare implicita
pentru parametrul de parola la crearea userilor noi, daca scriptul are asa ceva.
## Raport obligatoriu (conform promptului de sistem)
Scrie `docs\raport_firma-ludipedia-contafin.md` (in radacina `D:\ROA\ROAFACTURARE`, sau daca nu
ai drept de scriere acolo, in acelasi folder scratchpad de mai sus) cu: ce ai reusit sa
conectezi/interoghezi, valorile exacte gasite, ce ai schimbat in cele 2 fisiere, si orice blocaj
(parola gresita, tabela cu alt nume, tunel care nu porneste). NU inventa date daca ceva nu merge —
raporteaza exact eroarea.
Ultimul tau mesaj: `GATA firma-ludipedia-contafin` sau
`BLOCAT firma-ludipedia-contafin: <motiv intr-un rand>`.

View File

@@ -1,407 +0,0 @@
-- ============================================================================
-- SCHITA (DRAFT) - Deschidere firma noua pe instalatia Oracle ROA ConPress
-- Fisier NEEXECUTAT, de aprobat de Marius inainte de orice rulare.
-- Schema tinta: LUDIPEDIA (confirmat de Marius; server conpress, tunel
-- Bitvise conpress.tlp, alias TNS + DSN ODBC ROA_CONPRESS).
-- ============================================================================
--
-- NOTA IMPORTANTA 1 - conflict de regula:
-- D:\ROA\ROAFACTURARE\COMUN\docs\conexiuni-tunel-ssh-odbc.md, sectiunea
-- "Reguli pe productie" (linia ~152), interzice explicit pe canalul manual
-- sqlplus-pe-tunel orice altceva in afara de SELECT:
-- "Doar SELECT. Fara INSERT/UPDATE/DELETE/DDL, fara ALTER SESSION care
-- schimba comportament persistent."
-- PASUL 0 din acest fisier (verificari) respecta regula (doar SELECT).
-- PASII 1-4 (INSERT firma, job schema, drepturi utilizatori) SCRIU date si
-- NU respecta acea regula daca ar fi rulati pe canalul manual descris in
-- document. Nu e o decizie luata aici: Marius decide canalul de executie
-- (cont/canal cu drept de scriere pe ConPress, sau rularea propriu-zisa
-- prin aplicatia ROASTART, care e calea normala de productie pentru
-- deschidere de firma).
--
-- NOTA IMPORTANTA 2 - stare fisier:
-- Acesta e o SCHITA, nu un script gata de rulare. Nimeni nu s-a conectat
-- la ConPress pentru a pregati acest fisier si nimeni nu l-a rulat.
--
-- NOTA IMPORTANTA 3 - parametri lipsa din certificatul ONRC (LUDIPEDIA):
-- certificatul de inregistrare acopera doar firma, CUI, nr. registru
-- comert, sediu social, CAEN principal si data inregistrarii. Urmatorii
-- parametri NU sunt in certificat si trebuie completati de Marius inainte
-- de orice executie (marcati mai jos si in sectiunea de parametri cu
-- "-- DE COMPLETAT"):
-- 1. Date bancare: nume banca + cont (IBAN) - pot fi 1 pana la 10 perechi
-- (banca1..banca10 / contb1..contb10 in FIRMEMODINSPROC). Interogarea
-- ANAF publica nu intoarce IBAN (camp gol in raspuns) - ramane de
-- completat de Marius.
-- 2. Telefon2, telefon3, fax, email (telefonul principal a fost completat
-- din ANAF, vezi NOTA IMPORTANTA 5).
-- 3. Reprezentant legal / declarant: nume, prenume, functie, cod
-- angajat (codang), indicativ, indice_itm.
-- 4. Incadrare firma: id_forma_juridica, id_forma_organizare,
-- id_forma_prop, id_tip_soc (coduri interne din nomenclatoarele
-- ROASTART - ANAF intoarce doar text descriptiv, nu codul ROASTART,
-- vezi NOTA IMPORTANTA 5).
-- 5. Capital social varsat (capital_soc_var) si subscris
-- (capital_soc_sub).
-- 6. Punct de lucru (punct_luc) - daca exista, separat de sediul social.
-- 7. id_mama / e_mama - firma simpla sau membra a unui grup deja
-- existent in ROASTART; daca simpla, id_mama = 0.
-- 8. id_loc (identificator localitate in nomenclatorul ROASTART),
-- cod_firma (cod intern firma), id_util (operatorul care introduce
-- firma - userul care ruleaza scriptul in ROASTART), oasp
-- (obligatie de asigurare - da/nu), tip_modificare.
-- Lista completa de parametri "DE COMPLETAT" e reluata langa fiecare
-- variabila din sectiunea PARAMETRI de mai jos.
--
-- NOTA IMPORTANTA 5 - date confirmate/completate din interogarea publica
-- ANAF (16.09.2026, CUI 54602536, serviciu
-- https://webservicesp.anaf.ro/api/PlatitorTvaRest/v9/tva - acelasi URL
-- folosit de procedura existenta ANAF_CreeazaCerereANAF in
-- D:\ROA\ROAFACTURARE\COMUN\programe\validare.prg:1845):
-- - Denumire, nr. registru comert (J2026028926001) si CAEN (9329)
-- CONFIRMATE, identice cu certificatul ONRC.
-- - Telefon completat: 0724968582 (p_telefon).
-- - Cod postal completat: 900217 (p_cod_postal).
-- - Adresa CONFIRMATA in mare parte, cu O DISCREPANTA fata de certificat:
-- certificatul avea p_numar = 'ZA', ANAF intoarce "2A" pentru acelasi
-- sediu (judet, localitate, strada, bloc L119A, scara A, apartament 2 -
-- identice, extrase din date_generale.adresa). Marius a confirmat ca
-- ANAF e sursa de adevar (OCR-ul certificatului e suspect) - p_numar a
-- fost SCHIMBAT mai jos la '2A' (fostul 'ZA' era probabil o citire
-- gresita a lui '2A').
-- - Data inregistrarii: certificatul avea 06.05.2026, ANAF intoarce
-- date_generale.data_inregistrare = 2026-05-04 (04.05.2026) si
-- stare_inregistrare = "INREGISTRAT din data 04.05.2026" - confirma
-- aceeasi data. Marius a confirmat ANAF ca sursa de adevar - p_data_inreg
-- a fost SCHIMBAT mai jos la '04.05.2026'.
-- - scpTVA = false -> firma NU e inregistrata ca platitoare de TVA la
-- data interogarii (util pentru p_persoana_juridica / incadrare, nu
-- schimba niciun parametru din FIRMEMODINSPROC direct).
-- - forma_organizare ANAF = "PERSOANA JURIDICA" -> confirma
-- p_persoana_juridica = 'D'.
-- - IBAN, email, capital social, reprezentant legal, forma juridica
-- interna ROASTART: NU sunt in raspunsul ANAF (serviciul public nu le
-- are) - raman "DE COMPLETAT" de Marius, nu s-au inventat valori.
--
-- NOTA IMPORTANTA 4 - useri drepturi:
-- Marius a CONFIRMAT: sunt DOAR 2 useri carora li se dau drepturi pe firma
-- noua. "Vali Iliescu" / "Valentina Iliescu" e UN SINGUR user (user 1,
-- prescurtare a aceluiasi nume), al doilea e "Raluca Ion" (user 2).
-- Fisierul schiteaza exact 2 blocuri la Pasul 4, dupa acelasi sablon.
-- Niciun id_util/id_grup nu e cunoscut inca -- se completeaza DUPA ce
-- Pasul 0 confirma daca userii exista deja in UTILIZATORI/vutilizatori.
--
-- NOTA IMPORTANTA 6 - verificare DB (Pasul A) INCERCATA si BLOCATA (16.09.2026):
-- Tunelul Bitvise s-a ridicat cu succes (`stnlc.exe -profile=D:\vm303-profile\
-- conpress.tlp`, profil gasit acolo, nu la calea din documentul de conexiuni;
-- port 127.0.0.1:1521 confirmat deschis, alias TNS ROA_CONPRESS rezolvat
-- spre SID=ROA). NU s-a putut merge mai departe: schema Oracle de pe
-- ConPress e "xenoti" (conform tabelului din conexiuni-tunel-ssh-odbc.md),
-- iar parola pentru acel user NU exista nicaieri accesibil (DSN ODBC
-- ROA_CONPRESS are UserID/Password goale in registry, nu e in Windows
-- Credential Manager, nu e in vreun fisier din D:\ROA cautat). Conform
-- regulii explicite din document ("Fara ghicit parole"), verificarea NU s-a
-- facut - nu s-a incercat nicio parola. Tunelul a fost inchis la loc dupa
-- incercare (port 1521 reconfirmat inchis).
-- RAMASE NEVERIFICATE, deci NEschimbate mai jos (raman "DE COMPLETAT"):
-- - combinatia comuna id_forma_juridica/id_forma_organizare/id_forma_prop/
-- id_tip_soc (GROUP BY pe firme) - nerulat.
-- - existenta userilor Vali/Valentina Iliescu si Raluca Ion in
-- UTILIZATORI/vutilizatori si id_util al lor - nerulat.
-- - id_grup uzual din vdef_util_grup - nerulat.
-- - unicitate CUI 54602536 in firme (nu exista deja) - nerulat.
-- Marius (sau cine are parola schemei xenoti pe ConPress) trebuie sa ruleze
-- Pasul 0 manual, sau sa dea parola unei sesiuni viitoare.
--
-- ============================================================================
-- PARAMETRI DE SUBSTITUIRE (sqlplus DEFINE) - reutilizabile pentru orice
-- firma noua. Valorile de mai jos vin din interogarea ANAF (sursa de adevar
-- pentru identificare/adresa/CAEN/data inregistrare) plus certificatul ONRC
-- pentru ce ANAF nu acopera; codurile interne ROASTART si userii raman
-- DE COMPLETAT -- verificarea DB (NOTA IMPORTANTA 6) a fost blocata.
-- ============================================================================
-- --- identificare firma (din certificatul ONRC) ---
DEFINE p_firma = 'LUDIPEDIA S.R.L.'
DEFINE p_antet = 'LUDIPEDIA S.R.L.'
DEFINE p_cod_fiscal = '54602536'
DEFINE p_reg_comert = 'J2026028926001'
DEFINE p_caen = '9329' -- CONFIRMAT: identic in raspunsul ANAF (cod_CAEN) din 16.09.2026
DEFINE p_data_inreg = '04.05.2026' -- SCHIMBAT din certificat (06.05.2026) -- sursa ANAF (date_generale.data_inregistrare), vezi NOTA IMPORTANTA 5
-- --- adresa sediu social (din certificatul ONRC) ---
DEFINE p_judet = 'Constanta'
DEFINE p_localitate = 'Constanta'
DEFINE p_strada = 'Strada Baba Novac'
DEFINE p_numar = '2A' -- SCHIMBAT din certificat ('ZA') -- sursa ANAF (date_generale.adresa / snumar_Strada), vezi NOTA IMPORTANTA 5
DEFINE p_bloc = 'L119A'
DEFINE p_scara = 'A'
DEFINE p_apart = '2'
DEFINE p_cod_postal = '900217' -- completat din ANAF (16.09.2026), nu era in certificat
DEFINE p_adresa = '&p_strada. nr. &p_numar., bl. &p_bloc., sc. &p_scara., et. Parter, ap. &p_apart.'
-- --- date lipsa din certificat, obligatorii pentru FIRMEMODINSPROC ---
DEFINE p_banca1 = '' -- DE COMPLETAT (serviciul public ANAF nu intoarce IBAN)
DEFINE p_contb1 = '' -- DE COMPLETAT (IBAN)
-- banca2..banca10 / contb2..contb10: DE COMPLETAT doar daca exista mai multe conturi
DEFINE p_persoana_juridica = 'D' -- confirmat de forma_organizare ANAF = "PERSOANA JURIDICA" (D/F dupa conventia ROASTART)
DEFINE p_codang = '' -- DE COMPLETAT (cod angajat / reprezentant)
DEFINE p_nume = '' -- DE COMPLETAT (nume reprezentant legal / declarant)
DEFINE p_prenume = '' -- DE COMPLETAT
DEFINE p_telefon = '0724968582' -- completat din ANAF (16.09.2026), nu era in certificat
DEFINE p_telefon2 = '' -- DE COMPLETAT
DEFINE p_telefon3 = '' -- DE COMPLETAT
DEFINE p_fax = '' -- DE COMPLETAT
DEFINE p_email = '' -- DE COMPLETAT
DEFINE p_oasp = '' -- DE COMPLETAT (da/nu, dupa conventia ROASTART)
DEFINE p_capital_soc_var = '' -- DE COMPLETAT
DEFINE p_capital_soc_sub = '' -- DE COMPLETAT
DEFINE p_punct_luc = '' -- DE COMPLETAT (daca exista, altfel gol)
DEFINE p_schema = 'LUDIPEDIA' -- CONFIRMAT de Marius
DEFINE p_id_mama = '0' -- DE CONFIRMAT: 0 daca firma simpla, altfel id firma-mama existenta
DEFINE p_e_mama = '' -- DE COMPLETAT doar daca p_id_mama <> 0
DEFINE p_id_loc = '' -- DE COMPLETAT (id localitate in nomenclator ROASTART)
DEFINE p_id_util = '' -- DE COMPLETAT (operatorul care introduce firma in ROASTART)
DEFINE p_id_forma_juridica = '' -- DE COMPLETAT -- verificare DB blocata (fara parola schema xenoti), vezi NOTA IMPORTANTA 6
DEFINE p_id_forma_organizare = '' -- DE COMPLETAT -- verificare DB blocata, vezi NOTA IMPORTANTA 6
DEFINE p_id_forma_prop = '' -- DE COMPLETAT -- verificare DB blocata, vezi NOTA IMPORTANTA 6
DEFINE p_id_tip_soc = '' -- DE COMPLETAT -- verificare DB blocata, vezi NOTA IMPORTANTA 6
DEFINE p_indicativ = '' -- DE COMPLETAT
DEFINE p_declarant = '' -- DE COMPLETAT (nume declarant, poate fi = p_nume/p_prenume)
DEFINE p_functie = '' -- DE COMPLETAT (functia declarantului)
DEFINE p_indice_itm = '' -- DE COMPLETAT
DEFINE p_tip_modificare = '' -- DE COMPLETAT
DEFINE p_cod_firma = '' -- DE COMPLETAT (cod intern firma in ROASTART)
-- --- job schema Oracle noua (start contabil) ---
DEFINE p_luna_start = '5' -- CONFIRMAT de Marius pentru LUDIPEDIA
DEFINE p_an_start = '2026' -- CONFIRMAT de Marius pentru LUDIPEDIA
-- --- useri carora li se dau drepturi pe firma noua (DOAR 2, confirmat de Marius) ---
DEFINE p_nume_user1 = 'Iliescu'
DEFINE p_prenume_user1= 'Vali' -- "Vali" / "Valentina" -- confirmat: aceeasi persoana (user 1)
DEFINE p_nume_user2 = 'Ion'
DEFINE p_prenume_user2= 'Raluca'
DEFINE p_id_grup_useri = '' -- DE COMPLETAT -- verificare DB blocata (fara parola schema xenoti), vezi NOTA IMPORTANTA 6
DEFINE p_id_utilop = '' -- DE COMPLETAT (operator care insereaza drepturile, poate fi = p_id_util)
-- ============================================================================
-- PAS 0 -- VERIFICARE (doar SELECT, sigur pe canalul sqlplus-tunel)
-- Scop: (a) userii Vali/Valentina Iliescu si Raluca Ion exista deja in
-- UTILIZATORI/vutilizatori? (b) firma cu acest CUI exista deja pe
-- schema LUDIPEDIA (evitare duplicat)?
-- ============================================================================
-- 0a. Cautare useri dupa nume (LIKE, pentru ca nu stim daca "Vali" e nume complet)
SELECT id_util, utilizator, nume, prenume, inactiv
FROM vutilizatori
WHERE UPPER(nume) LIKE UPPER('%' || '&p_nume_user1.' || '%')
OR UPPER(prenume) LIKE UPPER('%Vali%')
OR UPPER(prenume) LIKE UPPER('%Valentina%')
FETCH FIRST 20 ROWS ONLY;
SELECT id_util, utilizator, nume, prenume, inactiv
FROM vutilizatori
WHERE UPPER(nume) LIKE UPPER('%' || '&p_nume_user2.' || '%')
OR UPPER(prenume) LIKE UPPER('%' || '&p_prenume_user2.' || '%')
FETCH FIRST 20 ROWS ONLY;
-- 0b. Drepturi deja existente pe firme, ca sa vedem grupul folosit uzual
-- (util pentru completarea p_id_grup_useri de mai sus)
SELECT id_dug, id_grup, id_firma, firma
FROM vdef_util_grup
WHERE id_grup IN (
SELECT DISTINCT id_grup FROM vdef_util_grup
)
FETCH FIRST 50 ROWS ONLY;
-- 0c. Firma cu acest CUI exista deja? (evitare duplicat la Pasul 1)
SELECT id, firma, cod_fiscal, reg_comert
FROM firme
WHERE REGEXP_REPLACE(UPPER(TRIM(cod_fiscal)), '[^0-9]', '') =
REGEXP_REPLACE(UPPER(TRIM('&p_cod_fiscal.')), '[^0-9]', '')
FETCH FIRST 10 ROWS ONLY;
-- ============================================================================
-- PAS 1 -- INSERT FIRMA
-- PACK_DREPTURI.FIRMEMODINSPROC(...)
-- Sursa semnaturii: D:\ROA\ROASTART\COMUN\clase\ofirma.vc2:130-146
-- ATENTIE: scrie date -- NU e SELECT, vezi NOTA IMPORTANTA 1 de la inceput.
-- Ordinea parametrilor de mai jos respecta exact ordinea din semnatura.
-- ============================================================================
-- BEGIN
-- PACK_DREPTURI.FIRMEMODINSPROC(
-- p_id => NULL, -- id nou, generat de procedura/secventa
-- p_firma => '&p_firma.',
-- p_antet => '&p_antet.',
-- p_cod_fiscal => '&p_cod_fiscal.',
-- p_reg_comert => '&p_reg_comert.',
-- p_banca1 => '&p_banca1.',
-- p_contb1 => '&p_contb1.',
-- p_banca2 => NULL, p_contb2 => NULL,
-- p_banca3 => NULL, p_contb3 => NULL,
-- p_banca4 => NULL, p_contb4 => NULL,
-- p_banca5 => NULL, p_contb5 => NULL,
-- p_banca6 => NULL, p_contb6 => NULL,
-- p_banca7 => NULL, p_contb7 => NULL,
-- p_banca8 => NULL, p_contb8 => NULL,
-- p_banca9 => NULL, p_contb9 => NULL,
-- p_banca10 => NULL, p_contb10 => NULL,
-- p_adresa => '&p_adresa.',
-- p_cod_firma => '&p_cod_firma.',
-- p_persoana_juridica=> '&p_persoana_juridica.',
-- p_codang => '&p_codang.',
-- p_nume => '&p_nume.',
-- p_prenume => '&p_prenume.',
-- p_telefon => '&p_telefon.',
-- p_telefon2 => '&p_telefon2.',
-- p_telefon3 => '&p_telefon3.',
-- p_fax => '&p_fax.',
-- p_email => '&p_email.',
-- p_oasp => '&p_oasp.',
-- p_capital_soc_var => '&p_capital_soc_var.',
-- p_capital_soc_sub => '&p_capital_soc_sub.',
-- p_punct_luc => '&p_punct_luc.',
-- p_caen => '&p_caen.',
-- p_schema => '&p_schema.',
-- p_judet => '&p_judet.',
-- p_localitate => '&p_localitate.',
-- p_strada => '&p_strada.',
-- p_numar => '&p_numar.',
-- p_bloc => '&p_bloc.',
-- p_scara => '&p_scara.',
-- p_apart => '&p_apart.',
-- p_cod_postal => '&p_cod_postal.',
-- p_id_mama => &p_id_mama.,
-- p_e_mama => '&p_e_mama.',
-- p_id_loc => '&p_id_loc.',
-- p_id_util => '&p_id_util.',
-- p_id_forma_juridica=> '&p_id_forma_juridica.',
-- p_id_forma_organizare => '&p_id_forma_organizare.',
-- p_id_forma_prop => '&p_id_forma_prop.',
-- p_id_tip_soc => '&p_id_tip_soc.',
-- p_indicativ => '&p_indicativ.',
-- p_declarant => '&p_declarant.',
-- p_functie => '&p_functie.',
-- p_indice_itm => '&p_indice_itm.',
-- p_tip_modificare => '&p_tip_modificare.',
-- p_caen_revizie => NULL
-- );
-- END;
-- /
-- ============================================================================
-- PAS 2 -- JOB CREARE SCHEMA ORACLE (async)
-- SYN_NEWSCHEMAJOB(pcSchema, pnLuna, pnAn)
-- Se apeleaza doar daca firma e simpla (p_id_mama = 0), nu membra de grup.
-- ATENTIE: porneste un job -- scrie/creeaza obiecte, nu e SELECT.
-- ============================================================================
-- BEGIN
-- IF &p_id_mama. = 0 THEN
-- SYN_NEWSCHEMAJOB('&p_schema.', &p_luna_start., &p_an_start.);
-- END IF;
-- END;
-- /
-- ============================================================================
-- PAS 3 -- POLL STATUS JOB SCHEMA
-- SYN_NEWSCHEMAPROGRESS(pcSchema) -- functie, intoarce status text.
-- Se astepta 'FINALIZAT'. Job async: poate dura; NU se face poll fara
-- timeout/numar maxim de incercari (exemplu mai jos, de adaptat manual
-- sau intr-un script client, nu ca bucla PL/SQL blocanta pe productie).
-- ============================================================================
-- Interogare punctuala (de rulat manual, la interval, cu numarare manuala
-- a incercarilor -- max. N incercari, ex. 30, la 10 secunde):
SELECT SYN_NEWSCHEMAPROGRESS('&p_schema.') AS status_job FROM dual;
-- Varianta PL/SQL cu timeout explicit (DOAR ca exemplu -- de adaptat/testat
-- de Marius inainte de folosire, nu se stie limita reala de reincercari):
-- DECLARE
-- v_status VARCHAR2(100);
-- v_incercari PLS_INTEGER := 0;
-- c_max_incercari CONSTANT PLS_INTEGER := 30; -- DE CONFIRMAT
-- c_pauza_sec CONSTANT PLS_INTEGER := 10; -- DE CONFIRMAT
-- BEGIN
-- LOOP
-- v_status := SYN_NEWSCHEMAPROGRESS('&p_schema.');
-- EXIT WHEN v_status = 'FINALIZAT' OR v_incercari >= c_max_incercari;
-- v_incercari := v_incercari + 1;
-- DBMS_LOCK.SLEEP(c_pauza_sec);
-- END LOOP;
-- IF v_status != 'FINALIZAT' THEN
-- RAISE_APPLICATION_ERROR(-20000, 'Job schema neterminat dupa timeout, status=' || v_status);
-- END IF;
-- END;
-- /
-- ============================================================================
-- PAS 4 -- DREPTURI UTILIZATORI PE FIRMA NOUA
-- PACK_DREPTURI.UTILDREPTINSPROC(id_util, id_grup, id_firma, id_utilop)
-- Sursa: D:\ROA\ROASTART\Clase\ostart_util.vc2:32-40
-- id_util / id_grup se completeaza DUPA ce Pasul 0a confirma daca userii
-- exista deja. id_firma se completeaza cu id-ul intors de Pasul 1.
-- ATENTIE: scrie date, nu e SELECT.
-- ============================================================================
DEFINE p_id_firma_noua = '' -- DE COMPLETAT dupa Pasul 1 (id firma inserata)
-- --- user 1: Vali / Valentina Iliescu (o singura persoana, confirmat) ---
DEFINE p_id_util_1 = '' -- DE COMPLETAT -- Pasul 0a nerulat (verificare DB blocata, NOTA IMPORTANTA 6); gol daca userul nu exista inca
-- optional, doar daca userul NU exista inca in UTILIZATORI:
-- BEGIN
-- PACK_DREPTURI.UTILIZATORIINSPROC(
-- p_utilizator => '', -- DE COMPLETAT (login)
-- p_parola => '', -- DE COMPLETAT (parola initiala)
-- p_inactiv => 'N',
-- p_id_utilop => &p_id_utilop.
-- );
-- END;
-- /
-- BEGIN
-- PACK_DREPTURI.UTILDREPTINSPROC(
-- p_id_util => &p_id_util_1.,
-- p_id_grup => &p_id_grup_useri.,
-- p_id_firma => &p_id_firma_noua.,
-- p_id_utilop=> &p_id_utilop.
-- );
-- END;
-- /
-- --- user 2: Raluca Ion ---
DEFINE p_id_util_2 = '' -- DE COMPLETAT -- Pasul 0a nerulat (verificare DB blocata, NOTA IMPORTANTA 6)
-- optional, doar daca userul NU exista inca:
-- BEGIN
-- PACK_DREPTURI.UTILIZATORIINSPROC(
-- p_utilizator => '', -- DE COMPLETAT (login)
-- p_parola => '', -- DE COMPLETAT (parola initiala)
-- p_inactiv => 'N',
-- p_id_utilop => &p_id_utilop.
-- );
-- END;
-- /
-- BEGIN
-- PACK_DREPTURI.UTILDREPTINSPROC(
-- p_id_util => &p_id_util_2.,
-- p_id_grup => &p_id_grup_useri.,
-- p_id_firma => &p_id_firma_noua.,
-- p_id_utilop=> &p_id_utilop.
-- );
-- END;
-- /
-- ============================================================================
-- SFARSIT SCHITA. De aprobat de Marius -- vezi NOTA IMPORTANTA 1-4 de la
-- inceputul fisierului inainte de orice rulare.
-- ============================================================================

View File

@@ -38,8 +38,9 @@ DEFINE CLASS _frmbase1 AS _frmbase OF "..\clase\_frm_base.vcx"
Gridsort1.Name = "Gridsort1" Gridsort1.Name = "Gridsort1"
*</PropValue> *</PropValue>
ADD OBJECT 'Edit1' AS editbox WITH ; ADD OBJECT 'Edit1' AS _editbox WITH ;
Anchor = 15, ; Anchor = 15, ;
BackColor = 255,255,255, ;
ControlSource = "thisform.cChangeLog", ; ControlSource = "thisform.cChangeLog", ;
FontSize = 12, ; FontSize = 12, ;
Height = 204, ; Height = 204, ;
@@ -48,7 +49,7 @@ DEFINE CLASS _frmbase1 AS _frmbase OF "..\clase\_frm_base.vcx"
ReadOnly = .T., ; ReadOnly = .T., ;
Top = 36, ; Top = 36, ;
Width = 348 Width = 348
*< END OBJECT: BaseClass="editbox" /> *< END OBJECT: ClassLib="..\clase\_baza.vcx" BaseClass="editbox" />
PROCEDURE Init PROCEDURE Init
this.WindowState = 2 this.WindowState = 2

View File

@@ -573,7 +573,7 @@ select p.acont || nvl2(p.cont_alt, ' - ' || p.cont_alt, '') || nvl2(p.cod, ' - '
************************** SFARSIT: verific_analitic ***************************** ************************** SFARSIT: verific_analitic *****************************
************************** INCEPUT: verificare_note_contabile ***************************** ************************** INCEPUT: verificare_note_contabile *****************************
Procedure verificare_note_contabile Procedure verificare_note_contabile
Parameters tcAct,tlVerificAnalitic,tlAlegPartener, tlNuVerificCont, tlFaraMesaj Parameters tcAct,tlVerificAnalitic,tlAlegPartener, tlNuVerificCont, tlFaraMesaj, tnRecno
*!* 03.05.2013 : am adaugat lcIdFact, lcMesajIdFact *!* 03.05.2013 : am adaugat lcIdFact, lcMesajIdFact
Local lcInMesaj, lcInMesajAcont, lcInMesajP, lcInMesajIreg, lcMesaj, lcInMesajPSters, lcAct, lnId_set, ll_return, lcIdFact, lcMesajIdFact Local lcInMesaj, lcInMesajAcont, lcInMesajP, lcInMesajIreg, lcMesaj, lcInMesajPSters, lcAct, lnId_set, ll_return, lcIdFact, lcMesajIdFact
@@ -589,16 +589,17 @@ Procedure verificare_note_contabile
*!* 18.09.2026 *!* 18.09.2026
*!* marius.mutu *!* marius.mutu
*!* marcaj opt-in al randurilor cu campuri lipsa, doar daca apelantul are campul clipsa pe cursor *!* marcaj opt-in al randurilor cu campuri lipsa, doar daca apelantul are campul clipsa pe cursor
Local llMarcajLipsuri, llMesajConstruit, lcClipsaRand Local llMarcajLipsuri, llMesajConstruit, lcClipsaRand, lcScopVerif
lcScopVerif = Iif(Vartype(tnRecno) = 'N' And tnRecno > 0, 'RECORD ' + Transform(tnRecno), 'ALL') && tnRecno: verific doar randul dat
llMarcajLipsuri = (Type(lcAct + '.clipsa') = 'C') llMarcajLipsuri = (Type(lcAct + '.clipsa') = 'C')
llMesajConstruit = .F. llMesajConstruit = .F.
If llMarcajLipsuri If llMarcajLipsuri
Replace All clipsa With '' In (lcAct) Replace &lcScopVerif clipsa With '' In (lcAct)
Endif Endif
Select (lcAct) Select (lcAct)
lnNrNota=1 lnNrNota=1
Scan For Suma <> 0 Scan &lcScopVerif For Suma <> 0
lcScd = Alltrim(Nvl(scd,'')) lcScd = Alltrim(Nvl(scd,''))
lcScc = Alltrim(Nvl(scc,'')) lcScc = Alltrim(Nvl(scc,''))
*!* 07.05.2013 : verific id_fact de pe notele de TVA devenit exigibil ( 4426 - 4428 si 4428 - 4427 ), id_factc *!* 07.05.2013 : verific id_fact de pe notele de TVA devenit exigibil ( 4426 - 4428 si 4428 - 4427 ), id_factc
@@ -735,7 +736,7 @@ Procedure verificare_note_contabile
If lnSucces > 0 If lnSucces > 0
If Reccount('verif_part') > 0 If Reccount('verif_part') > 0
Select (lcAct) Select (lcAct)
Scan For !Empty(Suma) Scan &lcScopVerif For !Empty(Suma)
Scatter Name loCont Scatter Name loCont
*!* contul poate fi gol (clasa 8/9 sau tlNuVerificCont) - Locate cu criteriu gol ar gasi primul rand din verif_part (SET EXACT OFF) *!* contul poate fi gol (clasa 8/9 sau tlNuVerificCont) - Locate cu criteriu gol ar gasi primul rand din verif_part (SET EXACT OFF)
@@ -866,7 +867,7 @@ Procedure verificare_note_contabile
If lnSucces > 0 If lnSucces > 0
Select (lcAct) Select (lcAct)
Scan For !Empty(Suma) Scan &lcScopVerif For !Empty(Suma)
Scatter Name loCont Scatter Name loCont
*!* contul poate fi gol (clasa 8/9 sau tlNuVerificCont) - Locate cu criteriu gol ar gasi primul rand din plcontana (SET EXACT OFF) *!* contul poate fi gol (clasa 8/9 sau tlNuVerificCont) - Locate cu criteriu gol ar gasi primul rand din plcontana (SET EXACT OFF)
If !Empty(loCont.scd) If !Empty(loCont.scd)