Compare commits
28 Commits
32d09552a8
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 3af008992c | |||
| b3cbeef691 | |||
| db22b1acf9 | |||
| 82ab6209f6 | |||
| 5756a5a8ec | |||
| 140ba162de | |||
| 6afaad03bf | |||
| ea977c7bfc | |||
| 265ba78b0a | |||
| 17eea3b64a | |||
| 26c33e03a2 | |||
| 8999a5339f | |||
| bc5ff8211f | |||
| 53ef674f70 | |||
| f2e539629e | |||
| 869403cd3e | |||
| 8b5a670ff1 | |||
| 57c5fcb5d6 | |||
| 7cd7d57708 | |||
| 58655dac6e | |||
| 0c9255842d | |||
| 1ae9d3f14a | |||
| 5bc2cb82f1 | |||
| 96577f0005 | |||
| 3b9ca92b96 | |||
| 5b0a3321db | |||
| a284dd3530 | |||
| 22ea278001 |
4
.gitignore
vendored
4
.gitignore
vendored
@@ -103,3 +103,7 @@ roacont_ref.FPT
|
||||
|
||||
# --- COMUN este gestionat separat, prin propriul sau git (romfast/comun.git) ---
|
||||
COMUN/
|
||||
|
||||
docs/diff_*.patch
|
||||
.gstack/
|
||||
docs/local/
|
||||
|
||||
61
CLAUDE.md
61
CLAUDE.md
@@ -46,6 +46,25 @@ Editing: write-back text→binary via `txt2vcx.ps1` is supported **only for `.vc
|
||||
(vcx/scx); `.frx/.mnx/.lbx/.pjx/.dbc/.dbf` are editable **only in the VFP IDE** (no write-back).
|
||||
See `D:\ROA\UTIL\foxbin2prg\CLAUDE.md` and `COMUN\docs\flux-editare-vfp-text.md`.
|
||||
|
||||
Grep can't tell **which class/method** a hit inside a `.vc2` belongs to (the class header may be
|
||||
thousands of lines above it, and ~2/3 of the file is properties/metadata). `vfp_symbols.ps1`
|
||||
indexes the line range of every class/method/procedure and labels hits with their owner — use it
|
||||
before any `txt2vcx.ps1` edit to get the exact line range of the method you are changing. Its
|
||||
built-in defaults target ROAACNPRO, so always pass this project's paths:
|
||||
|
||||
```powershell
|
||||
$s = 'D:\ROA\UTIL\foxbin2prg\vfp_symbols.ps1'
|
||||
$c = @('-CacheRoot', 'D:\ROA\ROACONT', '-ProjectRoot', 'D:\ROA\ROACONT', '-IndexFile', 'D:\ROA\_vfp_textcache\roacont\_symbols.tsv')
|
||||
|
||||
powershell -ExecutionPolicy Bypass -File $s @c -Grep '<expression>' -CodeOnly # hits labeled class.method, code only
|
||||
powershell -ExecutionPolicy Bypass -File $s @c -Where '<file>.vc2:<line>' # who owns this line
|
||||
powershell -ExecutionPolicy Bypass -File $s @c -Find '<name>' # where it is DEFINED
|
||||
powershell -ExecutionPolicy Bypass -File $s @c -Class '<class name>' # inheritance chain + methods
|
||||
```
|
||||
|
||||
The index (`_symbols.tsv`) rebuilds itself when the text is newer, so refresh the text first — it
|
||||
can't see IDE edits that were never converted. Full search guide: `COMUN\docs\cautare_vcx_vct.md`.
|
||||
|
||||
Orphan cleanup: on each full run `git_sync` deletes `.??2` text whose binary was removed from
|
||||
SVN (and `.db2` whose table left the per-project list) and reports it, so git records the
|
||||
deletion.
|
||||
@@ -58,15 +77,12 @@ carry data, not just structure) are committed to git but sit in SVN global-ignor
|
||||
|
||||
### Branching (git)
|
||||
|
||||
Two lanes in the git mirror:
|
||||
- **`main` = SVN mirror**: receives ONLY `sync SVN rN` commits, made from a clean tree (right
|
||||
after `svn update`, before local work). `git diff main..claude/<subiect>` then shows exactly
|
||||
and only Claude's work.
|
||||
- **Claude works on a branch** (`claude/<subiect>`) and commits only there.
|
||||
- Once the changes land in SVN (user runs `svn commit`), the branch is closed (merged into
|
||||
`main` at the next sync, or deleted).
|
||||
- Hygiene: sync `main` only from a clean tree — an `svn update` mid-work mixes binaries on disk
|
||||
(nature of SVN).
|
||||
Two lanes in the git mirror: **`main`** receives ONLY `sync SVN rN` commits, made from a clean
|
||||
tree (right after `svn update`, before local work); **Claude works on a branch** `claude/<subiect>`
|
||||
and commits only there, so `git diff main..claude/<subiect>` shows exactly and only Claude's work.
|
||||
The branch closes once the changes land in SVN (user runs `svn commit`).
|
||||
|
||||
Full model and hygiene rules: `COMUN\docs\fluxul_svn_git.md`.
|
||||
|
||||
## Building / running
|
||||
|
||||
@@ -173,6 +189,10 @@ ROACONT - X.Y.Z
|
||||
-->
|
||||
```
|
||||
|
||||
Regula de continut: changelog-ul e pentru utilizatori — se scrie **doar ce vede utilizatorul**,
|
||||
scurt si compact. Erorile introduse si reparate in aceeasi versiune nelivrata **nu se trec**
|
||||
(clientul nu le-a vazut niciodata); intrarea versiunii curente se rescrie, nu se acumuleaza.
|
||||
|
||||
Tags in use: `:nou:` (new feature), `:modificare:` (change/fix to existing behavior),
|
||||
`:eroare:` (bug fix), `:adaugare:` (addition). Version numbers increment per entry (current
|
||||
series is `2.11.x`). When asked to log a change, follow this exact format/tag set rather than
|
||||
@@ -218,6 +238,29 @@ Preferintele lui Marius pentru sesiunile pe acest proiect:
|
||||
(`.vcx`/`.scx`), diff-ul lizibil se face pe forma text `.vc2`/`.sc2` regenerata cu
|
||||
`git_sync.ps1`, inainte de write-back cu `txt2vcx.ps1`.
|
||||
|
||||
## Stil de raspuns: scurt si concret
|
||||
|
||||
Marius vrea raspunsuri **clare, concise, fara vorbarie**. Regula, nu preferinta.
|
||||
|
||||
- **Starea si ce urmeaza, nu povestea.** Ce e gata, ce e stricat, ce trebuie decis, ce urmeaza —
|
||||
in liste scurte, cu fisier si linie. Fara reconstituirea drumului pana la rezultat.
|
||||
- **Fara naratiune de proces**: ce a raportat fiecare agent, cine ce a corectat, cum au fost
|
||||
coordonate benzile. Intra in `docs/`, nu in raspuns.
|
||||
- **Fara laude si fara reluari.** Nu repeta ce s-a spus deja in conversatie.
|
||||
- Detaliile tehnice lungi (dovezi, iesiri de test, metodologie) se scriu in fisier si se
|
||||
**trimite la el**, nu se copiaza in raspuns.
|
||||
- Cand e ceva de decis: enunta decizia si optiunile in cateva randuri, cu recomandarea ta.
|
||||
|
||||
**Formatul obligatoriu al raspunsului**, in aceasta ordine, maxim cateva randuri fiecare:
|
||||
|
||||
1. **Am facut:** ce e gata (fisier:linie).
|
||||
2. **Urmeaza:** ce fac mai departe.
|
||||
3. **De la tine:** intrebarea, clar si simpla, cu recomandarea mea.
|
||||
|
||||
Explicatiile, dovezile si descoperirile colaterale merg in `docs/`, cu un link. Nu se reia in
|
||||
raspuns rationamentul, nu se explica de ce a fost greu, nu se justifica alegerile decat daca
|
||||
sunt cerute.
|
||||
|
||||
## Skill routing
|
||||
|
||||
When the user's request matches an available skill, invoke it via the Skill tool. When in doubt, invoke the skill.
|
||||
|
||||
@@ -922,7 +922,9 @@ DEFINE CLASS frm_introd_compact AS formtermin OF "..\comun\clase\baza.vcx"
|
||||
PARAMETERS tcCont, lcCampId, lcCampNume
|
||||
|
||||
lcCont = ALLTRIM(tcCont)
|
||||
loCauta = CautPartenerContabilitate(GetHash([cTitlu=>Nume partener ] + lcCont + [??lAdaugCorespondente=>1??cCont=>] + lcCont))
|
||||
loHash = GetHash([cTitlu=>Nume partener ] + lcCont + [??lAdaugCorespondente=>1??cCont=>] + lcCont + [??lVerificaANAF=>1])
|
||||
loHash.SetValue('dDataDoc', Iif(Type('poAct.dataact') = 'D', poAct.dataact, {}))
|
||||
loCauta = CautPartenerContabilitate(loHash)
|
||||
|
||||
If !Empty(locauta.nume)
|
||||
lnid_part=locauta.id_part
|
||||
@@ -3849,7 +3851,9 @@ DEFINE CLASS frm_introd_compact2007 AS formtermin OF "..\comun\clase\baza.vcx"
|
||||
PARAMETERS tcCont, lcCampId, lcCampNume
|
||||
|
||||
lcCont = ALLTRIM(tcCont)
|
||||
loCauta = CautPartenerContabilitate(GetHash([cTitlu=>Nume partener ] + lcCont + [??lAdaugCorespondente=>1??cCont=>] + lcCont))
|
||||
loHash = GetHash([cTitlu=>Nume partener ] + lcCont + [??lAdaugCorespondente=>1??cCont=>] + lcCont + [??lVerificaANAF=>1])
|
||||
loHash.SetValue('dDataDoc', Iif(Type('poAct.dataact') = 'D', poAct.dataact, {}))
|
||||
loCauta = CautPartenerContabilitate(loHash)
|
||||
|
||||
If !Empty(locauta.nume)
|
||||
lnid_part=locauta.id_part
|
||||
@@ -7087,7 +7091,9 @@ DEFINE CLASS frm_note AS formtermin OF "..\comun\clase\baza.vcx"
|
||||
ENDIF
|
||||
|
||||
|
||||
loCauta = CautPartenerContabilitate(GetHash([cTitlu=>Alegeti partenerul ] + lcCont + [??lAdaugCorespondente=>1??cCont=>] + lcCont))
|
||||
loHash = GetHash([cTitlu=>Alegeti partenerul ] + lcCont + [??lAdaugCorespondente=>1??cCont=>] + lcCont + [??lVerificaANAF=>1])
|
||||
loHash.SetValue('dDataDoc', Iif(Type('poAct.dataact') = 'D', poAct.dataact, {}))
|
||||
loCauta = CautPartenerContabilitate(loHash)
|
||||
|
||||
SELECT actactan
|
||||
REPLACE id_partd WITH loCauta.id_part, partd WITH locauta.nume
|
||||
@@ -7109,7 +7115,9 @@ DEFINE CLASS frm_note AS formtermin OF "..\comun\clase\baza.vcx"
|
||||
ENDIF
|
||||
|
||||
|
||||
loCauta = CautPartenerContabilitate(GetHash([cTitlu=>Alegeti partenerul ] + lcCont + [??lAdaugCorespondente=>1??cCont=>] + lcCont))
|
||||
loHash = GetHash([cTitlu=>Alegeti partenerul ] + lcCont + [??lAdaugCorespondente=>1??cCont=>] + lcCont + [??lVerificaANAF=>1])
|
||||
loHash.SetValue('dDataDoc', Iif(Type('poAct.dataact') = 'D', poAct.dataact, {}))
|
||||
loCauta = CautPartenerContabilitate(loHash)
|
||||
|
||||
SELECT actactan
|
||||
REPLACE id_partc WITH loCauta.id_part, partc WITH locauta.nume
|
||||
@@ -8930,7 +8938,9 @@ DEFINE CLASS frm_note2007 AS formtermin OF "..\comun\clase\baza.vcx"
|
||||
|
||||
If lnsucces=1
|
||||
If lnrezultat>0
|
||||
loCauta = CautPartenerContabilitate(GetHash([cTitlu=>Alegeti partenerul ] + pcCont + [??lAdaugCorespondente=>1??cCont=>] + pcCont))
|
||||
loHash = GetHash([cTitlu=>Alegeti partenerul ] + pcCont + [??lAdaugCorespondente=>1??cCont=>] + pcCont + [??lVerificaANAF=>1])
|
||||
loHash.SetValue('dDataDoc', Iif(Type('poAct.dataact') = 'D', poAct.dataact, {}))
|
||||
loCauta = CautPartenerContabilitate(loHash)
|
||||
Select actactan
|
||||
Replace id_partd With loCauta.id_part, partd With loCauta.nume
|
||||
IF lnIdPartd <> loCauta.id_part
|
||||
@@ -8969,7 +8979,9 @@ DEFINE CLASS frm_note2007 AS formtermin OF "..\comun\clase\baza.vcx"
|
||||
|
||||
If lnsucces=1
|
||||
If lnrezultat>0
|
||||
loCauta = CautPartenerContabilitate(GetHash([cTitlu=>Alegeti partenerul ] + pcCont + [??lAdaugCorespondente=>1??cCont=>] + pcCont))
|
||||
loHash = GetHash([cTitlu=>Alegeti partenerul ] + pcCont + [??lAdaugCorespondente=>1??cCont=>] + pcCont + [??lVerificaANAF=>1])
|
||||
loHash.SetValue('dDataDoc', Iif(Type('poAct.dataact') = 'D', poAct.dataact, {}))
|
||||
loCauta = CautPartenerContabilitate(loHash)
|
||||
Select actactan
|
||||
Replace id_partc With loCauta.id_part, partc With loCauta.nume
|
||||
IF lnIdPartc <> loCauta.id_part
|
||||
@@ -9662,7 +9674,7 @@ DEFINE CLASS frm_plati_impozite AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
SELECT c_part
|
||||
IF valoare > 0
|
||||
lcTitlu = 'Nume partener ' + lcCont
|
||||
locauta = caut_parteneri(lcCont, lcTitlu)
|
||||
locauta = caut_parteneri(lcCont, lcTitlu, .F., .F., .F., .T., Iif(Type('poAct.dataact') = 'D', poAct.dataact, {}))
|
||||
|
||||
If !Empty(locauta.denumire) AND !EMPTY(locauta.id_part)
|
||||
lnid_part=locauta.id_part
|
||||
@@ -9701,7 +9713,7 @@ DEFINE CLASS frm_plati_impozite AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
SELECT c_part
|
||||
IF valoare > 0
|
||||
lcTitlu = 'Nume partener ' + lcCont
|
||||
locauta = caut_parteneri(lcCont, lcTitlu)
|
||||
locauta = caut_parteneri(lcCont, lcTitlu, .F., .F., .F., .T., Iif(Type('poAct.dataact') = 'D', poAct.dataact, {}))
|
||||
|
||||
If !Empty(locauta.denumire) AND !EMPTY(locauta.id_part)
|
||||
lnid_part=locauta.id_part
|
||||
|
||||
@@ -20865,7 +20865,6 @@ DEFINE CLASS frm_deconttva AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
|
||||
Set Date To Ymd
|
||||
Set Mark To '-'
|
||||
SET STEP ON
|
||||
lcNumePrenumeDeclarant = Alltrim(NVL(gofirma.declarant,''))
|
||||
lcNumeDeclarant = lcNumePrenumeDeclarant
|
||||
lcPrenumeDeclarant = ""
|
||||
@@ -21063,7 +21062,6 @@ DEFINE CLASS frm_deconttva AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
|
||||
Set Date To Ymd
|
||||
Set Mark To '-'
|
||||
Set Step On
|
||||
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
|
||||
lcNumeDeclarant = lcNumePrenumeDeclarant
|
||||
lcPrenumeDeclarant = ""
|
||||
@@ -21274,7 +21272,6 @@ DEFINE CLASS frm_deconttva AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
|
||||
Set Date To Ymd
|
||||
Set Mark To '-'
|
||||
Set Step On
|
||||
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
|
||||
lcNumeDeclarant = lcNumePrenumeDeclarant
|
||||
lcPrenumeDeclarant = ""
|
||||
@@ -21485,7 +21482,6 @@ DEFINE CLASS frm_deconttva AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
|
||||
Set Date To Ymd
|
||||
Set Mark To '-'
|
||||
Set Step On
|
||||
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
|
||||
lcNumeDeclarant = lcNumePrenumeDeclarant
|
||||
lcPrenumeDeclarant = ""
|
||||
@@ -22921,7 +22917,6 @@ DEFINE CLASS frm_deconttva_201601 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
|
||||
Set Date To Ymd
|
||||
Set Mark To '-'
|
||||
SET STEP ON
|
||||
lcNumePrenumeDeclarant = Alltrim(NVL(gofirma.declarant,''))
|
||||
lcNumeDeclarant = lcNumePrenumeDeclarant
|
||||
lcPrenumeDeclarant = ""
|
||||
@@ -23119,7 +23114,6 @@ DEFINE CLASS frm_deconttva_201601 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
|
||||
Set Date To Ymd
|
||||
Set Mark To '-'
|
||||
Set Step On
|
||||
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
|
||||
lcNumeDeclarant = lcNumePrenumeDeclarant
|
||||
lcPrenumeDeclarant = ""
|
||||
@@ -23330,7 +23324,6 @@ DEFINE CLASS frm_deconttva_201601 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
|
||||
Set Date To Ymd
|
||||
Set Mark To '-'
|
||||
Set Step On
|
||||
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
|
||||
lcNumeDeclarant = lcNumePrenumeDeclarant
|
||||
lcPrenumeDeclarant = ""
|
||||
@@ -23541,7 +23534,6 @@ DEFINE CLASS frm_deconttva_201601 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
|
||||
Set Date To Ymd
|
||||
Set Mark To '-'
|
||||
Set Step On
|
||||
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
|
||||
lcNumeDeclarant = lcNumePrenumeDeclarant
|
||||
lcPrenumeDeclarant = ""
|
||||
@@ -25155,7 +25147,6 @@ DEFINE CLASS frm_deconttva_201701 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
|
||||
Set Date To Ymd
|
||||
Set Mark To '-'
|
||||
SET STEP ON
|
||||
lcNumePrenumeDeclarant = Alltrim(NVL(gofirma.declarant,''))
|
||||
lcNumeDeclarant = lcNumePrenumeDeclarant
|
||||
lcPrenumeDeclarant = ""
|
||||
@@ -25353,7 +25344,6 @@ DEFINE CLASS frm_deconttva_201701 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
|
||||
Set Date To Ymd
|
||||
Set Mark To '-'
|
||||
Set Step On
|
||||
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
|
||||
lcNumeDeclarant = lcNumePrenumeDeclarant
|
||||
lcPrenumeDeclarant = ""
|
||||
@@ -25564,7 +25554,6 @@ DEFINE CLASS frm_deconttva_201701 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
|
||||
Set Date To Ymd
|
||||
Set Mark To '-'
|
||||
Set Step On
|
||||
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
|
||||
lcNumeDeclarant = lcNumePrenumeDeclarant
|
||||
lcPrenumeDeclarant = ""
|
||||
@@ -25775,7 +25764,6 @@ DEFINE CLASS frm_deconttva_201701 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
|
||||
Set Date To Ymd
|
||||
Set Mark To '-'
|
||||
Set Step On
|
||||
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
|
||||
lcNumeDeclarant = lcNumePrenumeDeclarant
|
||||
lcPrenumeDeclarant = ""
|
||||
@@ -25997,7 +25985,6 @@ DEFINE CLASS frm_deconttva_201701 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
|
||||
Set Date To Ymd
|
||||
Set Mark To '-'
|
||||
Set Step On
|
||||
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
|
||||
lcNumeDeclarant = lcNumePrenumeDeclarant
|
||||
lcPrenumeDeclarant = ""
|
||||
@@ -26221,7 +26208,6 @@ DEFINE CLASS frm_deconttva_201701 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
|
||||
Set Date To Ymd
|
||||
Set Mark To '-'
|
||||
Set Step On
|
||||
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
|
||||
lcNumeDeclarant = lcNumePrenumeDeclarant
|
||||
lcPrenumeDeclarant = ""
|
||||
@@ -26425,7 +26411,6 @@ DEFINE CLASS frm_deconttva_201701 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
|
||||
Set Date To Ymd
|
||||
Set Mark To '-'
|
||||
Set Step On
|
||||
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
|
||||
lcNumeDeclarant = lcNumePrenumeDeclarant
|
||||
lcPrenumeDeclarant = ""
|
||||
@@ -26631,7 +26616,6 @@ DEFINE CLASS frm_deconttva_201701 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
|
||||
Set Date To Ymd
|
||||
Set Mark To '-'
|
||||
Set Step On
|
||||
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
|
||||
lcNumeDeclarant = lcNumePrenumeDeclarant
|
||||
lcPrenumeDeclarant = ""
|
||||
@@ -26835,7 +26819,6 @@ DEFINE CLASS frm_deconttva_201701 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
|
||||
Set Date To Ymd
|
||||
Set Mark To '-'
|
||||
Set Step On
|
||||
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
|
||||
lcNumeDeclarant = lcNumePrenumeDeclarant
|
||||
lcPrenumeDeclarant = ""
|
||||
@@ -28466,7 +28449,6 @@ DEFINE CLASS frm_deconttva_202601 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
|
||||
Set Date To Ymd
|
||||
Set Mark To '-'
|
||||
SET STEP ON
|
||||
lcNumePrenumeDeclarant = Alltrim(NVL(gofirma.declarant,''))
|
||||
lcNumeDeclarant = lcNumePrenumeDeclarant
|
||||
lcPrenumeDeclarant = ""
|
||||
@@ -28664,7 +28646,6 @@ DEFINE CLASS frm_deconttva_202601 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
|
||||
Set Date To Ymd
|
||||
Set Mark To '-'
|
||||
Set Step On
|
||||
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
|
||||
lcNumeDeclarant = lcNumePrenumeDeclarant
|
||||
lcPrenumeDeclarant = ""
|
||||
@@ -28875,7 +28856,6 @@ DEFINE CLASS frm_deconttva_202601 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
|
||||
Set Date To Ymd
|
||||
Set Mark To '-'
|
||||
Set Step On
|
||||
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
|
||||
lcNumeDeclarant = lcNumePrenumeDeclarant
|
||||
lcPrenumeDeclarant = ""
|
||||
@@ -29086,7 +29066,6 @@ DEFINE CLASS frm_deconttva_202601 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
|
||||
Set Date To Ymd
|
||||
Set Mark To '-'
|
||||
Set Step On
|
||||
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
|
||||
lcNumeDeclarant = lcNumePrenumeDeclarant
|
||||
lcPrenumeDeclarant = ""
|
||||
@@ -29308,7 +29287,6 @@ DEFINE CLASS frm_deconttva_202601 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
|
||||
Set Date To Ymd
|
||||
Set Mark To '-'
|
||||
Set Step On
|
||||
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
|
||||
lcNumeDeclarant = lcNumePrenumeDeclarant
|
||||
lcPrenumeDeclarant = ""
|
||||
@@ -29532,7 +29510,6 @@ DEFINE CLASS frm_deconttva_202601 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
|
||||
Set Date To Ymd
|
||||
Set Mark To '-'
|
||||
Set Step On
|
||||
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
|
||||
lcNumeDeclarant = lcNumePrenumeDeclarant
|
||||
lcPrenumeDeclarant = ""
|
||||
@@ -29736,7 +29713,6 @@ DEFINE CLASS frm_deconttva_202601 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
|
||||
Set Date To Ymd
|
||||
Set Mark To '-'
|
||||
Set Step On
|
||||
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
|
||||
lcNumeDeclarant = lcNumePrenumeDeclarant
|
||||
lcPrenumeDeclarant = ""
|
||||
@@ -29942,7 +29918,6 @@ DEFINE CLASS frm_deconttva_202601 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
|
||||
Set Date To Ymd
|
||||
Set Mark To '-'
|
||||
Set Step On
|
||||
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
|
||||
lcNumeDeclarant = lcNumePrenumeDeclarant
|
||||
lcPrenumeDeclarant = ""
|
||||
@@ -30146,7 +30121,6 @@ DEFINE CLASS frm_deconttva_202601 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
|
||||
Set Date To Ymd
|
||||
Set Mark To '-'
|
||||
Set Step On
|
||||
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
|
||||
lcNumeDeclarant = lcNumePrenumeDeclarant
|
||||
lcPrenumeDeclarant = ""
|
||||
@@ -38862,7 +38836,6 @@ DEFINE CLASS frm_regcump2010 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
*!* Delete From cListRCTemp Where Padl(nract,14,'0') + '|' + Dtos(dataact) + '|' + Padr(denumire,100,' ') Not In ;
|
||||
*!* (Select Padl(nract,14,'0') + '|' + Dtos(dataact) + '|' + Padr(denumire,100,' ') From cListRC WHERE !EMPTY(NVL(denumire,'')) )
|
||||
*!* Endif
|
||||
SET STEP ON
|
||||
WAIT WINDOW 'TVA exigibilizat din plati facturi cu TVA Incasare' NOWAIT
|
||||
*** ADAUG TVA INCASARE (DIN INCASARI/PLATI, TVA 4427 LA 90 ZILE)
|
||||
TEXT to m.lcSql textmerge noshow
|
||||
@@ -42642,14 +42615,14 @@ DEFINE CLASS frm_regcump2025 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
from vjc2010
|
||||
where an = <<m.gnAn>>
|
||||
and luna = <<m.gnLuna>>
|
||||
and (RO11nt <> 0 or RO21nt <> 0 or ro19nt <> 0 or ro9nt <> 0 or ro5nt <> 0)
|
||||
and (RO11nt <> 0 or RO21nt <> 0 or ro20nt <> 0 or ro24nt <> 0 or ro19nt <> 0 or ro9nt <> 0 or ro5nt <> 0)
|
||||
and tva_incasare = 1)
|
||||
group by id_fact, cont) ip
|
||||
on jc.id_fact = ip.id_fact
|
||||
where jc.an = <<m.gnAn>>
|
||||
and jc.luna = <<m.gnLuna>>
|
||||
and jc.tva_incasare = 1
|
||||
and (jc.RO11nt <> 0 or jc.RO21nt <> 0 or jc.ro19nt <> 0 or jc.ro9nt <> 0 or jc.ro5nt <> 0)
|
||||
and (jc.RO11nt <> 0 or jc.RO21nt <> 0 or jc.ro20nt <> 0 or jc.ro24nt <> 0 or jc.ro19nt <> 0 or jc.ro9nt <> 0 or jc.ro5nt <> 0)
|
||||
and nvl(ip.sold, 0) - (RO11nb + RO11nt + RO21nb + RO21nt + RO20nb + RO20nt + RO24nb + RO24nt + ro19nb + ro19nt + ro9nb + ro9nt + ro5nb + ro5nt) <> 0
|
||||
ENDTEXT
|
||||
|
||||
@@ -43155,7 +43128,6 @@ DEFINE CLASS frm_regcump2025 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
lcWhere = Alltrim(Substr(m.lcWhere, m.lnPos + 11))
|
||||
Endif
|
||||
Endif
|
||||
SET STEP ON
|
||||
Do Case
|
||||
Case m.lnTipJurnal = 1
|
||||
pcSubtitlu = "Achizitii de bunuri si prestari de sevicii taxabile din tara"
|
||||
@@ -43452,7 +43424,6 @@ DEFINE CLASS frm_regcump2025 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
*!* Delete From cListRCTemp Where Padl(nract,14,'0') + '|' + Dtos(dataact) + '|' + Padr(denumire,100,' ') Not In ;
|
||||
*!* (Select Padl(nract,14,'0') + '|' + Dtos(dataact) + '|' + Padr(denumire,100,' ') From cListRC WHERE !EMPTY(NVL(denumire,'')) )
|
||||
*!* Endif
|
||||
SET STEP ON
|
||||
WAIT WINDOW 'TVA exigibilizat din plati facturi cu TVA Incasare' NOWAIT
|
||||
*** ADAUG TVA INCASARE (DIN INCASARI/PLATI, TVA 4427 LA 90 ZILE)
|
||||
TEXT to m.lcSql textmerge noshow
|
||||
@@ -43467,7 +43438,7 @@ DEFINE CLASS frm_regcump2025 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
LEFT Join JTVA_COLOANE J2 On J.id_jtva_coloana = J2.id_tva
|
||||
left join nom_fdoc fdoc on a.id_fdoc = fdoc.id_fdoc
|
||||
where a.an = ?m.gnAn and a.luna = ?m.gnLuna and a.sters = 0 and a.scd = '4426' And a.scc = '4428' And Nvl(a.id_jtva_coloana, 0) <> 0
|
||||
and jc.an = ?m.gnAn and jc.luna = ?m.gnLuna and (jc.RO11nt <> 0 or jc.RO21nt <> 0 or jc.ro19nt <> 0 or jc.ro9nt <> 0 or jc.ro5nt <> 0)
|
||||
and jc.an = ?m.gnAn and jc.luna = ?m.gnLuna and (jc.RO11nt <> 0 or jc.RO21nt <> 0 or jc.ro20nt <> 0 or jc.ro24nt <> 0 or jc.ro19nt <> 0 or jc.ro9nt <> 0 or jc.ro5nt <> 0)
|
||||
ORDER BY a.cod, J2.COLOANA_JC
|
||||
ENDTEXT
|
||||
|
||||
@@ -44214,7 +44185,6 @@ DEFINE CLASS frm_regcump2025 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
*!* 25.08.2014
|
||||
*!* marius.mutu
|
||||
*!* se transmit si soldurile pe cote de TVA 24,9,5 pentru cazul in care soldul total este 0
|
||||
SET STEP ON
|
||||
Local lcXMLFacturi
|
||||
If !(luna_inchisa Or m.glEMama)
|
||||
Select *, (RO11NB+RO21NB+RO24NB+RO20NB+RO19NB+RO09NB+RO05NB + RO11NT+RO21NT+RO24NT+RO20NT+RO19NT+RO09NT+RO05NT) as soldn, ;
|
||||
@@ -50170,7 +50140,6 @@ DEFINE CLASS frm_regvanz2010 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
ENDPROC
|
||||
|
||||
PROCEDURE do_excel
|
||||
SET STEP ON
|
||||
do export_excel_grid WITH thisform._grdbase1,"dataact, nract", "", this.lb_titlu_alb_b121.caption IN proceduri_excel.prg
|
||||
|
||||
return
|
||||
@@ -50521,7 +50490,6 @@ DEFINE CLASS frm_regvanz2010 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
|
||||
update_jtva_coloane('JV')
|
||||
*** SELECTEZ FACTURILE CU TVA_INCASARE CU TOTAL BAZA, TVA, BAZAN, TVAN
|
||||
SET STEP ON
|
||||
Select r.cod, r.id_fact, r.tip, r.denumire, r.nract, r.SERIE_ACT, r.dataact, r.COD_FISCAL, Space(10) As COD_TVA, Space(100) As EXPLICATIE_TVA, r.TOTCTVA, r.TOTFTVATAX, r.TOTTVATAX, TVA_INCASARE, ;
|
||||
(RO24B + RO20B + RO19B + RO9B + RO5B + CESCDD1 + CESCDD2 + CEOPTR + FODD + FOFDD + CESVDD + CESVFDD + CESVFS + ROTI + WRN + WRSCDD + WRSCFDD) As BAZA, ;
|
||||
(RO24T + RO20T + RO19T + RO9T + RO5T) As TVA, ;
|
||||
@@ -51396,7 +51364,6 @@ DEFINE CLASS frm_regvanz2010 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
*!* 25.08.2014
|
||||
*!* marius.mutu
|
||||
*!* se transmit si soldurile pe cote de TVA 24,9,5 pentru cazul in care soldul total este 0
|
||||
SET STEP ON
|
||||
Local lcXMLFacturi
|
||||
If !(luna_inchisa Or m.glEMama)
|
||||
Select *, (RO24NB+RO20NB+RO19NB+RO9NB+RO5NB + RO24NT+RO20NT+RO19NT+RO9NT+RO5NT) as soldn, ;
|
||||
@@ -53816,8 +53783,8 @@ DEFINE CLASS frm_regvanz2025 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
select jv.id_fact,
|
||||
ip.cont,
|
||||
nvl(ip.sold, 0) as soldf,
|
||||
(RO11nb + RO11nt + RO21nb + RO21nt + ro19nb + ro19nt + ro9nb + ro9nt + ro5nb + ro5nt) as soldn,
|
||||
nvl(ip.sold, 0) - (RO11nb + RO11nt + RO21nb + RO21nt + ro19nb + ro19nt + ro9nb + ro9nt + ro5nb + ro5nt) as solddif,
|
||||
(RO11nb + RO11nt + RO21nb + RO21nt + RO20nb + RO20nt + RO24nb + RO24nt + ro19nb + ro19nt + ro9nb + ro9nt + ro5nb + ro5nt) as soldn,
|
||||
nvl(ip.sold, 0) - (RO11nb + RO11nt + RO21nb + RO21nt + RO20nb + RO20nt + RO24nb + RO24nt + ro19nb + ro19nt + ro9nb + ro9nt + ro5nb + ro5nt) as solddif,
|
||||
jv.denumire,
|
||||
jv.nract,
|
||||
jv.serie_act,
|
||||
@@ -53830,6 +53797,10 @@ DEFINE CLASS frm_regvanz2025 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
jv.RO11nt,
|
||||
jv.RO21nb,
|
||||
jv.RO21nt,
|
||||
jv.RO20nb,
|
||||
jv.RO20nt,
|
||||
jv.RO24nb,
|
||||
jv.RO24nt,
|
||||
jv.ro19nb,
|
||||
jv.ro19nt,
|
||||
jv.ro9nb,
|
||||
@@ -53849,15 +53820,15 @@ DEFINE CLASS frm_regvanz2025 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
from vjv2010
|
||||
where an = <<m.gnAn>>
|
||||
and luna = <<m.gnLuna>>
|
||||
and (RO11nt <> 0 or RO21nt <> 0 or ro19nt <> 0 or ro9nt <> 0 or ro5nt <> 0)
|
||||
and (RO11nt <> 0 or RO21nt <> 0 or ro20nt <> 0 or ro24nt <> 0 or ro19nt <> 0 or ro9nt <> 0 or ro5nt <> 0)
|
||||
and tva_incasare = 1)
|
||||
group by id_fact, cont) ip
|
||||
on jv.id_fact = ip.id_fact
|
||||
where jv.an = <<m.gnAn>>
|
||||
and jv.luna = <<m.gnLuna>>
|
||||
and jv.tva_incasare = 1
|
||||
and (jv.RO11nt <> 0 or jv.RO21nt <> 0 or jv.ro19nt <> 0 or jv.ro9nt <> 0 or jv.ro5nt <> 0)
|
||||
and nvl(ip.sold, 0) - (RO11nb + RO11nt + RO21nb + RO21nt + ro19nb + ro19nt + ro9nb + ro9nt + ro5nb + ro5nt) <> 0
|
||||
and (jv.RO11nt <> 0 or jv.RO21nt <> 0 or jv.ro20nt <> 0 or jv.ro24nt <> 0 or jv.ro19nt <> 0 or jv.ro9nt <> 0 or jv.ro5nt <> 0)
|
||||
and nvl(ip.sold, 0) - (RO11nb + RO11nt + RO21nb + RO21nt + RO20nb + RO20nt + RO24nb + RO24nt + ro19nb + ro19nt + ro9nb + ro9nt + ro5nb + ro5nt) <> 0
|
||||
ENDTEXT
|
||||
|
||||
llSucces = goExecutor.oExecuta(m.lcSql, "crsSoldDif")
|
||||
@@ -53888,7 +53859,6 @@ DEFINE CLASS frm_regvanz2025 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
ENDPROC
|
||||
|
||||
PROCEDURE do_excel
|
||||
SET STEP ON
|
||||
do export_excel_grid WITH thisform._grdbase1,"dataact, nract", "", this.lb_titlu_alb_b121.caption IN proceduri_excel.prg
|
||||
|
||||
return
|
||||
@@ -54377,7 +54347,7 @@ DEFINE CLASS frm_regvanz2025 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
LEFT Join JTVA_COLOANE J2 On J.id_jtva_coloana = J2.id_tva
|
||||
left join nom_fdoc fdoc on a.id_fdoc = fdoc.id_fdoc
|
||||
where a.an = ?m.gnAn and a.luna = ?m.gnLuna and a.sters = 0 and a.scd = '4428' And a.scc = '4427' And Nvl(a.id_jtva_coloana, 0) <> 0
|
||||
and jv.an = ?m.gnAn and jv.luna = ?m.gnLuna and (jv.RO11nt <> 0 or jv.RO21nt <> 0 or jv.ro19nt <> 0 or jv.ro9nt <> 0 or jv.ro5nt <> 0)
|
||||
and jv.an = ?m.gnAn and jv.luna = ?m.gnLuna and (jv.RO11nt <> 0 or jv.RO21nt <> 0 or jv.ro20nt <> 0 or jv.ro24nt <> 0 or jv.ro19nt <> 0 or jv.ro9nt <> 0 or jv.ro5nt <> 0)
|
||||
order by a.cod, J2.COLOANA_JC
|
||||
ENDTEXT
|
||||
|
||||
@@ -55063,7 +55033,6 @@ DEFINE CLASS frm_regvanz2025 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
|
||||
*!* 25.08.2014
|
||||
*!* marius.mutu
|
||||
*!* se transmit si soldurile pe cote de TVA 24,9,5 pentru cazul in care soldul total este 0
|
||||
SET STEP ON
|
||||
Local lcXMLFacturi
|
||||
If !(luna_inchisa Or m.glEMama)
|
||||
Select *, (RO11NB+RO21NB+RO24NB+RO20NB+RO19NB+RO9NB+RO5NB + RO11NT+RO21NT+RO24NT+RO20NT+RO19NT+RO9NT+RO5NT) as soldn, ;
|
||||
|
||||
@@ -207,6 +207,14 @@ ON PAD _000000003 OF _msysmenu ACTIVATE POPUP Initializa
|
||||
DEFINE BAR 1 OF Optiuniuti PROMPT "\<Tratare bug blocare listare Registru Cumparari"
|
||||
ON SELECTION BAR 1 OF Optiuniuti DO BAR_1_OF_Optiuniuti_FB2P
|
||||
|
||||
DEFINE BAR 2 OF Optiuniuti PROMPT "\-"
|
||||
ON BAR 2 OF Optiuniuti ACTIVATE POPUP _7it1dbypw
|
||||
|
||||
*----------------------------------
|
||||
DEFINE POPUP _7it1dbypw MARGIN RELATIVE SHADOW COLOR SCHEME 4
|
||||
DEFINE BAR 3 OF Optiuniuti PROMPT "\<Verificare ANAF la alegerea partenerului"
|
||||
ON SELECTION BAR 3 OF Optiuniuti DO ANAF_ComutaVerificare IN ocautare.prg
|
||||
|
||||
DEFINE PAD _000000004 OF _msysmenu PROMPT "Ac\<tualizari" COLOR SCHEME 3 ;
|
||||
KEY ALT+T, "ALT+T" ;
|
||||
SKIP FOR Type('glLunaInchisa') = 'L' and m.glLunaInchisa
|
||||
|
||||
@@ -47,6 +47,10 @@
|
||||
*!* 09.06.2026
|
||||
*!* Import csvBT - elimin CRLF din interiorul descrierii care rupe linia de tranzactie pe 2 linii
|
||||
|
||||
*!* 25.07.2026
|
||||
*!* marius.mutu
|
||||
*!* CreeazaNote/CompleteazaParteneriROA - la CUI-uri duplicate aleg partenerul cu facturi in perioada curenta, nu ultimul creat
|
||||
|
||||
*************************************
|
||||
* Clasa ImportNote este fabrica de clase tip Export
|
||||
*************************************
|
||||
@@ -316,6 +320,7 @@ Define Class ExtrasBanca As Custom
|
||||
Local lcRecc, lcRecno, lnRecno
|
||||
Local lcComanda, lcDenumire2, lcPartenerCasa, lcTip2, lnVariante, llExcludeOriginal
|
||||
Local lnDenumire, lnDocument, lnIdPartenerCasa, lnVariante, loPartener
|
||||
Local lcGrupIdLista, lcSqlGrup, lnIdPartAlternativ, lcPartAlternativ
|
||||
|
||||
PRIVATE pcContBanca, pnIdPartBanca
|
||||
|
||||
@@ -426,6 +431,7 @@ Define Class ExtrasBanca As Custom
|
||||
Append From Dbf('C_IMPORT_TEMP')
|
||||
|
||||
* Caut/creez parteneri
|
||||
Create Cursor cGrupParteneriCui (id_part_ales N(9), id_part N(9), denumire C(100))
|
||||
SELECT distinct cod_fiscal, denumire, iban FROM cActTemp INTO CURSOR cParteneriTemp READWRITE
|
||||
SELECT cParteneriTemp
|
||||
lcRecc = Transform(Reccount())
|
||||
@@ -450,6 +456,34 @@ Define Class ExtrasBanca As Custom
|
||||
If !Isnull(loPartener)
|
||||
lnIdPartener = Nvl(loPartener.id_part, 0)
|
||||
lcPartener = Alltrim(Nvl(loPartener.denumire, ""))
|
||||
If GetParteneriByCuiNormalizat(m.lcCodFiscal, "cGrupCuiTemp") And Reccount("cGrupCuiTemp") > 1
|
||||
lcGrupIdLista = ""
|
||||
Select cGrupCuiTemp
|
||||
Scan
|
||||
lcGrupIdLista = m.lcGrupIdLista + Iif(Empty(m.lcGrupIdLista), "", ",") + Transform(id_part)
|
||||
Endscan
|
||||
lcSqlGrup = [select id_part, count(*) as nr, sum(precdeb + debit - preccred - credit) as sold from ireg_parteneri ] + ;
|
||||
[where an = ?gnAn and luna = ?gnLuna and id_part in (] + m.lcGrupIdLista + [) group by id_part ] + ;
|
||||
[order by count(*) desc, abs(sum(precdeb + debit - preccred - credit)) desc]
|
||||
If goExecutor.oExecuta(m.lcSqlGrup, "cGrupCuiDoc") And Reccount("cGrupCuiDoc") > 0
|
||||
Select cGrupCuiTemp
|
||||
Locate For id_part = cGrupCuiDoc.id_part
|
||||
If Found()
|
||||
lnIdPartener = cGrupCuiTemp.id_part
|
||||
lcPartener = Alltrim(Nvl(cGrupCuiTemp.denumire, ""))
|
||||
Endif
|
||||
Endif
|
||||
If Used("cGrupCuiDoc")
|
||||
Use In (Select("cGrupCuiDoc"))
|
||||
Endif
|
||||
Select cGrupCuiTemp
|
||||
Scan
|
||||
Insert Into cGrupParteneriCui (id_part_ales, id_part, denumire) Values (m.lnIdPartener, cGrupCuiTemp.id_part, Alltrim(Nvl(cGrupCuiTemp.denumire, "")))
|
||||
Endscan
|
||||
Endif
|
||||
If Used("cGrupCuiTemp")
|
||||
Use In (Select("cGrupCuiTemp"))
|
||||
Endif
|
||||
Endif
|
||||
Endif
|
||||
* Caut partener dupa denumire
|
||||
@@ -699,7 +733,31 @@ Define Class ExtrasBanca As Custom
|
||||
Endif
|
||||
ENDIF
|
||||
* Daca am gasit un document, ies din bucla
|
||||
EXIT
|
||||
EXIT
|
||||
Else
|
||||
lnIdPartAlternativ = 0
|
||||
If Used("cGrupParteneriCui")
|
||||
Select cGrupParteneriCui
|
||||
Scan For id_part_ales = m.lnIdPartener And id_part <> m.lnIdPartener
|
||||
lcPartAlternativ = Alltrim(denumire)
|
||||
loAct = GetDocumentByContPartenerAct(m.lcContPartener, id_part, m.lnNrAct, .F.)
|
||||
If !Empty(m.loAct.id_fact) And ((m.lcTip = "D" And m.lnSuma <= - m.loAct.solddeb) Or (m.lcTip = "C" And m.lnSuma <= m.loAct.solddeb))
|
||||
lnIdPartAlternativ = id_part
|
||||
Exit
|
||||
Endif
|
||||
Select cGrupParteneriCui
|
||||
Endscan
|
||||
Endif
|
||||
Select cActTemp
|
||||
If !Empty(m.lnIdPartAlternativ)
|
||||
Select cActTemp
|
||||
If m.lcTip = "D"
|
||||
Replace id_factd With m.loAct.id_fact, pereched With m.loAct.nract, scd With m.loAct.Cont, ascd With m.loAct.acont, id_partd With m.lnIdPartAlternativ, partd With m.lcPartAlternativ
|
||||
Else
|
||||
Replace id_factc With m.loAct.id_fact, perechec With m.loAct.nract, scc With m.loAct.Cont, ascc With m.loAct.acont, id_partc With m.lnIdPartAlternativ, partc With m.lcPartAlternativ
|
||||
Endif
|
||||
EXIT
|
||||
Endif
|
||||
ENDIF && !Empty(m.loAct.id_fact)
|
||||
ENDFOR && lnDocument
|
||||
ENDIF && !Empty(m.lnIdPartener) And m.lnDocumente > 0
|
||||
@@ -728,7 +786,31 @@ Define Class ExtrasBanca As Custom
|
||||
Endif
|
||||
ENDIF
|
||||
* Daca am gasit un document, ies din bucla
|
||||
EXIT
|
||||
EXIT
|
||||
Else
|
||||
lnIdPartAlternativ = 0
|
||||
If Used("cGrupParteneriCui")
|
||||
Select cGrupParteneriCui
|
||||
Scan For id_part_ales = m.lnIdPartener And id_part <> m.lnIdPartener
|
||||
lcPartAlternativ = Alltrim(denumire)
|
||||
loAct = GetDocumentByContPartenerAct(m.lcContPartener, id_part, m.lcComanda, .T.)
|
||||
If !Empty(m.loAct.id_fact) And ((m.lcTip = "D" And m.lnSuma <= - m.loAct.solddeb) Or (m.lcTip = "C" And m.lnSuma <= m.loAct.solddeb))
|
||||
lnIdPartAlternativ = id_part
|
||||
Exit
|
||||
Endif
|
||||
Select cGrupParteneriCui
|
||||
Endscan
|
||||
Endif
|
||||
Select cActTemp
|
||||
If !Empty(m.lnIdPartAlternativ)
|
||||
Select cActTemp
|
||||
If m.lcTip = "D"
|
||||
Replace id_factd With m.loAct.id_fact, pereched With m.loAct.nract, scd With m.loAct.Cont, ascd With m.loAct.acont, id_partd With m.lnIdPartAlternativ, partd With m.lcPartAlternativ
|
||||
Else
|
||||
Replace id_factc With m.loAct.id_fact, perechec With m.loAct.nract, scc With m.loAct.Cont, ascc With m.loAct.acont, id_partc With m.lnIdPartAlternativ, partc With m.lcPartAlternativ
|
||||
Endif
|
||||
EXIT
|
||||
Endif
|
||||
ENDIF && !Empty(m.loAct.id_fact)
|
||||
ENDFOR && lnDocument
|
||||
ENDIF && !Empty(m.lnIdPartener) And m.lnDocumente > 0
|
||||
@@ -836,6 +918,10 @@ Define Class ExtrasBanca As Custom
|
||||
Select (m.lcSelect)
|
||||
ENDIF && llSucces
|
||||
|
||||
If Used("cGrupParteneriCui")
|
||||
Use In (Select("cGrupParteneriCui"))
|
||||
Endif
|
||||
|
||||
Return m.llSucces
|
||||
Endproc && CreeazaNote
|
||||
|
||||
@@ -4423,6 +4509,22 @@ Function GetRegExpAllNumbers
|
||||
Return lnResults
|
||||
Endfunc
|
||||
|
||||
* --------------------------------------------------------------------
|
||||
* Deschide tcCursor cu id_part, denumire, cod_fiscal pentru toti parteneri cu acelasi CUI normalizat
|
||||
* --------------------------------------------------------------------
|
||||
Function GetParteneriByCuiNormalizat
|
||||
Lparameters tcCodFiscal, tcCursor
|
||||
Private pcCui
|
||||
Local lcSql, llSucces
|
||||
|
||||
pcCui = Alltrim(Strtran(Strtran(Upper(Alltrim(m.tcCodFiscal)), ' ', ''), 'RO', ''))
|
||||
|
||||
lcSql = [select id_part, denumire, cod_fiscal from nom_parteneri where sters = 0 and inactiv = 0 ] + ;
|
||||
[and replace(replace(upper(cod_fiscal),' ',''),'RO','') = ?pcCui order by id_part]
|
||||
llSucces = goExecutor.oExecuta(m.lcSql, m.tcCursor)
|
||||
Return m.llSucces
|
||||
Endfunc
|
||||
|
||||
* --------------------------------------------------------------------
|
||||
* Creeaza/Actualizeaza Parteneri in ROA pentru fiecare cod_fiscal din tcCursorParteneri
|
||||
* Verific dupa cod_fiscal, apoi dupa denumire
|
||||
@@ -4444,6 +4546,7 @@ Procedure CompleteazaParteneriROA
|
||||
Local lcSqlInsert, lcSqlPart, lcStrada, lcSufix, lcTara, lcTelefon1, lcTelefon2, lcTip_persoana
|
||||
Local lcWeb, lcinactiv, llCallBack, llSucces, lnIdJudet, lnIdJudetBucuresti, lnIdLocalitateBucuresti
|
||||
Local lnIdTaraRO, lnItem, lnItems, lnSucces
|
||||
Local lcCuiNorm
|
||||
Private pnIdAdresa, pcCodFiscal, pcDenumire, pnIdPart, pnNrAdrese, pnIdJudet
|
||||
|
||||
llCallBack = Type('toCallBackForm') = 'O' And Pemstatus(m.toCallBackForm, 'trace', 5)
|
||||
@@ -4463,6 +4566,9 @@ Procedure CompleteazaParteneriROA
|
||||
Return m.llSucces
|
||||
Endif
|
||||
|
||||
Select id_part, cod_fiscal, denumire, NormalizeazaCUI(cod_fiscal) As cui_norm From cParteneriROA Into Cursor cParteneriROA Readwrite
|
||||
Index On cui_norm Tag cuinorm
|
||||
|
||||
lcAdreseParteneri = [select id_adresa, id_part, localitate, id_loc, judet, id_judet, tara, id_tara from vadrese_parteneri]
|
||||
llSucces = goExecutor.oExecuta(m.lcAdreseParteneri, 'cAdreseROA')
|
||||
|
||||
@@ -4494,6 +4600,12 @@ Procedure CompleteazaParteneriROA
|
||||
If !Empty(m.pcCodFiscal)
|
||||
Locate For Alltrim(Strtran(cod_fiscal, ' ', '')) = m.pcCodFiscal
|
||||
*!* lnSucces = goExecutor.oSelect2Value(m.lcSqlCod, @pnIdPart)
|
||||
If !Found()
|
||||
lcCuiNorm = NormalizeazaCUI(m.pcCodFiscal)
|
||||
If !Empty(m.lcCuiNorm)
|
||||
Seek m.lcCuiNorm Order cuinorm
|
||||
Endif
|
||||
Endif
|
||||
Else
|
||||
Locate For Alltrim(Upper(denumire)) = m.pcDenumire
|
||||
*!* lnSucces = goExecutor.oSelect2Value(m.lcSqlDenumire, @pnIdPart)
|
||||
|
||||
@@ -771,7 +771,7 @@ Procedure inchidere_tva_sold
|
||||
Local lnIdSet, lnNrAct, lnProcTVA, lnRecords, lnSucces, lnSuma, loAct
|
||||
Local lnCota, lnCotaTVA, lnSuma24, lnSuma5, lnSuma9, lnSumaT
|
||||
Local lnSuma24T, lnSuma5T, lnSuma9T, lnSumaNT, lcMesaj
|
||||
SET STEP ON
|
||||
Local lnSuma11, lnSuma19, lnSuma20, lnSuma21, lnSuma11T, lnSuma19T, lnSuma20T, lnSuma21T
|
||||
lcJurnal = Upper(Alltrim(m.tcJurnal)) && JC/JV
|
||||
If m.lcJurnal = 'JC' && Jurnal Cumparari
|
||||
lcSCD = '4426'
|
||||
@@ -788,7 +788,6 @@ SET STEP ON
|
||||
lcMesaj = ''
|
||||
lnIdSet = 99999 && nota fara predefinire
|
||||
lnBut = lans(m.lnIdSet)
|
||||
Set Step On
|
||||
If m.lnBut = 1
|
||||
Select actactan
|
||||
Scatter Name loAct
|
||||
@@ -799,8 +798,18 @@ SET STEP ON
|
||||
lnNrAct = crsTVAIncasareTemp.nract
|
||||
lnIdFact = crsTVAIncasareTemp.id_fact
|
||||
lnSumaT = soldn
|
||||
lnSuma21 = soldn21
|
||||
lnSuma11 = soldn11
|
||||
lnSuma21 = 0
|
||||
lnSuma11 = 0
|
||||
lnSuma21T = 0
|
||||
lnSuma11T = 0
|
||||
If Type('crsTVAIncasareTemp.soldn21') = 'N'
|
||||
lnSuma21 = crsTVAIncasareTemp.soldn21
|
||||
lnSuma11 = crsTVAIncasareTemp.soldn11
|
||||
Endif
|
||||
If Type('crsTVAIncasareTemp.ro21nt') = 'N'
|
||||
lnSuma21T = crsTVAIncasareTemp.ro21nt
|
||||
lnSuma11T = crsTVAIncasareTemp.ro11nt
|
||||
Endif
|
||||
|
||||
lnSuma24 = soldn24
|
||||
lnSuma20 = soldn20
|
||||
@@ -809,16 +818,12 @@ SET STEP ON
|
||||
lnSuma5 = soldn5
|
||||
|
||||
If m.lcJurnal = 'JC' && Jurnal Cumparari
|
||||
lnSuma21T = ro21nt
|
||||
lnSuma11T = ro11nt
|
||||
lnSuma24T = ro24nt
|
||||
lnSuma20T = ro20nt
|
||||
lnSuma19T = ro19nt
|
||||
lnSuma9T = ro09nt
|
||||
lnSuma5T = ro05nt
|
||||
ELSE
|
||||
lnSuma21T = ro21nt
|
||||
lnSuma11T = ro11nt
|
||||
lnSuma24T = ro24nt
|
||||
lnSuma20T = ro20nt
|
||||
lnSuma19T = ro19nt
|
||||
@@ -830,7 +835,7 @@ SET STEP ON
|
||||
lnSuma = m.lnSumaT
|
||||
lnCotaTVA = 0.00
|
||||
If m.lnSumaT = 0
|
||||
lnSuma = Iif(m.lnCota = 1, m.lnSuma24, Iif(m.lnCota = 2, m.lnSuma20, Iif(m.lnCota = 3, m.lnSuma19, Iif(m.lnCota = 4, m.lnSuma9, Iif(m.lnCota = 5, m.lnSuma5, Iif(m.lnCota = 21, m.lnSuma21, m.lnSuma11))))))
|
||||
lnSuma = Iif(m.lnCota = 1, m.lnSuma24, Iif(m.lnCota = 2, m.lnSuma20, Iif(m.lnCota = 3, m.lnSuma19, Iif(m.lnCota = 4, m.lnSuma9, Iif(m.lnCota = 5, m.lnSuma5, Iif(m.lnCota = 6, m.lnSuma21, m.lnSuma11))))))
|
||||
lnCotaTVA = Iif(m.lnCota = 1, 1.24, Iif(m.lnCota = 2, 1.20, Iif(m.lnCota = 3, 1.19, Iif(m.lnCota = 4, 1.09, Iif(m.lnCota = 5, 1.05, Iif(m.lnCota = 6, 1.21, 1.11))))))
|
||||
Endif
|
||||
|
||||
|
||||
@@ -1991,9 +1991,10 @@ select *
|
||||
Use In (Select('cIncasariBanca2'))
|
||||
|
||||
*** Verific pe ANAF starea split tva la data curenta
|
||||
*!* 31.07.2026 marius.mutu: ordine explicita MASA (CACHE,ANAF) - corect pentru data trecuta pdDataI
|
||||
SELECT distinct cod_fiscal FROM cFacturiTVA INTO CURSOR cCodFiscalTemp
|
||||
loVerificareANAF = CREATEOBJECT("VerificareANAF")
|
||||
loVerificareANAF.VerificaListaCIF("cCodFiscalTemp", m.pdDataI, "crsANAF")
|
||||
loVerificareANAF.VerificaListaCIF("cCodFiscalTemp", m.pdDataI, "crsANAF", "MASA")
|
||||
USE IN (SELECT('cCodFiscalTemp'))
|
||||
IF USED("crsAnaf")
|
||||
*!* crsANAF (cui N(13), data D, denumire V(100), firma V(100), adresa C(244), scpTVA L, data_inceput_ScpTVA D, data_sfarsit_ScpTVA D, data_anul_imp_ScpTVA D, mesaj_ScpTVA C(244), ;
|
||||
@@ -2308,9 +2309,10 @@ select *
|
||||
Use In (Select('cIncasariBanca2'))
|
||||
|
||||
*** Verific pe ANAF starea split tva la data curenta
|
||||
*!* 31.07.2026 marius.mutu: ordine explicita UNIC (ANAF intai) - starea de azi, cache-ul ramane plasa de siguranta
|
||||
SELECT distinct cod_fiscal FROM cFacturiTVA INTO CURSOR cCodFiscalTemp
|
||||
loVerificareANAF = CREATEOBJECT("VerificareANAF")
|
||||
loVerificareANAF.VerificaListaCIF("cCodFiscalTemp", Date(), "crsANAF")
|
||||
loVerificareANAF.VerificaListaCIF("cCodFiscalTemp", Date(), "crsANAF", "UNIC")
|
||||
USE IN (SELECT('cCodFiscalTemp'))
|
||||
IF USED("crsAnaf")
|
||||
*!* crsANAF (cui N(13), data D, denumire V(100), firma V(100), adresa C(244), scpTVA L, data_inceput_ScpTVA D, data_sfarsit_ScpTVA D, data_anul_imp_ScpTVA D, mesaj_ScpTVA C(244), ;
|
||||
|
||||
@@ -209,6 +209,7 @@ SET PROCEDURE TO onomenclatoare.prg ADDITIVE
|
||||
SET PROCEDURE TO saft_d406.prg ADDITIVE
|
||||
SET PROCEDURE TO ofacturare.prg ADDITIVE
|
||||
SET PROCEDURE TO ofacturare_comun.prg ADDITIVE
|
||||
SET PROCEDURE TO ofacturare_editare.prg ADDITIVE
|
||||
SET PROCEDURE TO oproceduri_facturare.prg ADDITIVE
|
||||
SET PROCEDURE TO anaf_efactura.prg ADDITIVE
|
||||
SET PROCEDURE TO import_efactura.prg ADDITIVE
|
||||
@@ -576,6 +577,10 @@ If Type('laparametri',1)="A"
|
||||
Endif
|
||||
Endif
|
||||
|
||||
If Type('goCacheANAF_Sesiune') = 'O'
|
||||
Release goCacheANAF_Sesiune
|
||||
Endif
|
||||
|
||||
Private gcCopyRight
|
||||
gcCopyRight = '<27> ROA Romfast SRL'
|
||||
|
||||
|
||||
@@ -81,6 +81,10 @@
|
||||
*!* 01.072026
|
||||
*!* oSalesInvoices - se facea join dublu vanzari - jv2007 in cazul facturilor cu tva la incasare
|
||||
|
||||
*!* 27.07.2026
|
||||
*!* do_erori_saft, do_ident_saft - raport erori validator pe intelesul utilizatorului (fisierul <xml>_explicat.txt): pagina, pozitie, partener/cont identificat, explicatie scurta si sectiunea "Cum rezolvati"
|
||||
*!* erorile fictive TaxCode "nu se afla in lista" (bug DUKIntegrator) sunt separate si ignorabile; chatbot-ul primeste doar erorile reale; mesajul separat de parteneri respinsi (do_erori_partener_saft) eliminat din flux
|
||||
|
||||
* saft_D406
|
||||
Procedure viz_saft_d406
|
||||
loD406 = Createobject("D406")
|
||||
@@ -254,10 +258,10 @@ Define Class d406 As Custom
|
||||
Local lcTaxTable, lcTipDeclaratie
|
||||
LOCAL lnBytes, llSucces
|
||||
Local lcAssetTransactions, lcAssets, lcCaleFisier, lcComunPath, lcConfigDir, lcFileName
|
||||
Local lcFisierRaspuns, lcMovementofGoods, lcNumeFisier, lcOwners, lcParams, lcPhysicalStock
|
||||
Local lcFisierExplicat, lcFisierRaspuns, lcMovementofGoods, lcNumeFisier, lcOwners, lcParams, lcPhysicalStock
|
||||
Local lcProducts, lcUOMTable, lcValidator, lcXMLTemp, lnFileHandle, lnSec, lcSufixCale, lcSufixFisier
|
||||
LOCAL lcMessage, loChatBot
|
||||
LOCAL lnAn1, lnAn2, lnLuna1, lnLuna2
|
||||
LOCAL lcMessage, loChatBot, lcMesajErori
|
||||
LOCAL lnAn1, lnAn2, lnLuna1, lnLuna2, lnEroriFictive, lnEroriReale
|
||||
|
||||
lnAn1 = This.oUnitate.an1
|
||||
lnLuna1 = This.oUnitate.luna1
|
||||
@@ -552,16 +556,30 @@ Define Class d406 As Custom
|
||||
DELETE FILE(m.lcFisierRaspuns)
|
||||
|
||||
* Lansare validator pentru creare PDF
|
||||
lcParams = ' "' + m.lcFileName + '"'
|
||||
lcParams = ' "' + m.lcFileName + '"'
|
||||
OPEN_DEFAULT_APP(m.lcValidator, m.lcParams)
|
||||
|
||||
ELSE
|
||||
IF AMESSAGEBOX('Validare cu erori fisier: ' + m.lcFileName + CHR(13) + CHR(10) + 'Doriti sa interogati chatbot-ul de suport tehnic?',0+4+48,_screen.Caption) = 6
|
||||
lcMessage = FILETOSTR(m.lcFisierRaspuns)
|
||||
ELSE
|
||||
*!* 27.07.2026 un singur raport compact cu erorile explicate si identificate, erorile fictive de TaxCode (bug DUKIntegrator) separate
|
||||
lnEroriReale = 0
|
||||
lnEroriFictive = 0
|
||||
lcMesajErori = ''
|
||||
* Mai astept 2 secunde pentru ca se deschide fisierul cu erori si DUKIntegrator inca scrie in fisier si fisierul deschis sau parsat este partial
|
||||
Wait Window Timeout 2 "S-a generat fisierul raspuns. Se clasifica erorile..."
|
||||
|
||||
lcFisierExplicat = This.do_erori_saft(m.lcFisierRaspuns, @lnEroriReale, @lnEroriFictive, @lcMesajErori)
|
||||
OPEN_DEFAULT_APP(m.lcFisierRaspuns)
|
||||
IF !EMPTY(m.lcFisierExplicat)
|
||||
OPEN_DEFAULT_APP(m.lcFisierExplicat)
|
||||
ENDIF
|
||||
IF AMESSAGEBOX('Validare cu erori fisier: ' + m.lcFileName + CHR(13) + CHR(10) + ;
|
||||
'Erori de rezolvat: ' + ALLTRIM(STR(m.lnEroriReale)) + ;
|
||||
IIF(m.lnEroriFictive > 0, ' (+' + ALLTRIM(STR(m.lnEroriFictive)) + ' fictive - bug validator, se pot ignora)', '') + CHR(13) + CHR(10) + CHR(13) + CHR(10) + ;
|
||||
'Doriti sa interogati chatbot-ul de suport tehnic?',0+4+48,_screen.Caption) = 6
|
||||
lcMessage = EVL(m.lcMesajErori, FILETOSTR(m.lcFisierRaspuns))
|
||||
loChatBot = CREATEOBJECT("oChatBotLaunch", m.lcMessage)
|
||||
loChatBot.Launch()
|
||||
ENDIF
|
||||
OPEN_DEFAULT_APP(m.lcFisierRaspuns)
|
||||
ENDIF
|
||||
ENDIF
|
||||
ELSE
|
||||
AMESSAGEBOX('Nu s-a creat fisierul raspuns ' + m.lcFisierRaspuns + ' dupa validare!', 0+48,_screen.Caption)
|
||||
@@ -918,8 +936,11 @@ select 1 as tip,
|
||||
#Define CRLF Chr(13) + Chr(10)
|
||||
|
||||
LOCAL llSilent, lcMesaj, lcListaGol
|
||||
|
||||
LOCAL lcCod, lcListaInvalid, lcTextInvalid, llCnp, lnInvalid, lnInvalidCnp, loVerif
|
||||
LOCAL lcContInv, lcDenumireInv, lnIdPartInv, lnRandInv, lnTipPersInv
|
||||
|
||||
lcMesaj = ''
|
||||
lcTextInvalid = ''
|
||||
|
||||
llSilent = m.tlSilent
|
||||
|
||||
@@ -1026,15 +1047,55 @@ and b1.cont = b2.cont
|
||||
SCATTER NAME loRec
|
||||
lnRand = RECNO()
|
||||
lcListaGol = lcListaGol + IIF(!EMPTY(m.lcListaGol ), ', ', '') + ALLTRIM(STR(m.lnRand))
|
||||
ENDSCAN
|
||||
GO TOP
|
||||
|
||||
ENDSCAN
|
||||
GO TOP
|
||||
|
||||
*!* 24.07.2026 verific validitatea codurilor fiscale (CNP/CUI) la toti partenerii exportati in declaratie (nu doar cei activi in perioada)
|
||||
lcListaInvalid = ''
|
||||
lnInvalid = 0
|
||||
lnInvalidCnp = 0
|
||||
loVerif = CREATEOBJECT('VerificareCod')
|
||||
*!* 26.07.2026 retin codurile invalide intr-un cursor, ca sa poata fi exportate si corectate in nomenclator
|
||||
CREATE CURSOR cCodInvalid (rand N(7), id_part N(10), denumire C(150), cod_fiscal C(30), tip_cod C(3), tip_persoana N(1), cont C(10))
|
||||
SELECT (m.lcCursor)
|
||||
SCAN FOR !EMPTY(NVL(id_part,0)) AND !EMPTY(NVL(cod_fiscal, '')) ;
|
||||
AND INLIST(ALLTRIM(NVL(cod_tara, 'RO')), 'RO', '')
|
||||
lcCod = ALLTRIM(cod_fiscal)
|
||||
llCnp = (NVL(tip_persoana, 1) = 2) OR (LEN(CHRTRAN(m.lcCod, '0123456789', '')) = 0 AND LEN(m.lcCod) > 10)
|
||||
IF !This.CodFiscalValidSaft(m.lcCod, m.llCnp, m.loVerif)
|
||||
lnInvalid = m.lnInvalid + 1
|
||||
lnInvalidCnp = m.lnInvalidCnp + IIF(m.llCnp, 1, 0)
|
||||
lcListaInvalid = m.lcListaInvalid + IIF(EMPTY(m.lcListaInvalid), '', ', ') + ALLTRIM(STR(RECNO()))
|
||||
lnRandInv = RECNO()
|
||||
lnIdPartInv = id_part
|
||||
lcDenumireInv = NVL(denumire, '')
|
||||
lnTipPersInv = NVL(tip_persoana, 1)
|
||||
lcContInv = NVL(cont, '')
|
||||
INSERT INTO cCodInvalid (rand, id_part, denumire, cod_fiscal, tip_cod, tip_persoana, cont) ;
|
||||
VALUES (m.lnRandInv, m.lnIdPartInv, m.lcDenumireInv, m.lcCod, IIF(m.llCnp, 'CNP', 'CUI'), m.lnTipPersInv, m.lcContInv)
|
||||
SELECT (m.lcCursor)
|
||||
ENDIF
|
||||
ENDSCAN
|
||||
GO TOP
|
||||
loVerif = .NULL.
|
||||
|
||||
IF m.lnInvalid > 0
|
||||
lcTextInvalid = CRLF + SPACE(10) + 'ATENTIE! Randuri cu cod fiscal invalid (' + ALLTRIM(STR(m.lnInvalid)) + ;
|
||||
': CNP ' + ALLTRIM(STR(m.lnInvalidCnp)) + ', CUI ' + ALLTRIM(STR(m.lnInvalid - m.lnInvalidCnp)) + '): ' + ALLTRIM(LEFT(m.lcListaInvalid, 50)) + ;
|
||||
CRLF + SPACE(10) + IIF(m.llSilent, 'Lista completa: apasati butonul "Verificare coduri fiscale" de pe clienti/furnizori', 'Lista completa in fisierul Excel exportat') + ;
|
||||
CRLF + SPACE(10) + 'Stergeti CNP-urile din "Initializari cod taxa/plata" > "Stergere CNP-uri invalide", restul se corecteaza in nomenclatorul de parteneri'
|
||||
IF !m.llSilent
|
||||
goExport.export2xlsx('cCodInvalid', 'coduri_fiscale_invalide' + IIF(m.llClient, '_clienti_', '_furnizori_') + ALLTRIM(STR(m.gnAn)) + PADL(m.gnLuna,2,'0'))
|
||||
SELECT (m.lcCursor)
|
||||
ENDIF
|
||||
ENDIF
|
||||
|
||||
IF RECCOUNT('cPartDif') > 0
|
||||
*llOk = ExportExcelXml("cverifica_solduri", "solduri" + IIF(m.llClient, '_clienti', '_furnizori'),'solduri',.T.)
|
||||
goExport.export2xlsx("cverifica_solduri", "verificare_solduri" + IIF(m.llClient, '_clienti_', '_furnizori_') + ALLTRIM(STR(m.gnAn)) + PADL(m.gnLuna,2,'0') )
|
||||
|
||||
lcMesaj = 'SOLDURI DIFERITE FATA DE BALANTA PARTENERI!' + ;
|
||||
IIF(EMPTY(m.lcListaGol), '', CHR(13) + CHR(10) + SPACE(10) + 'Randuri cu ' + IIF(m.llClient, 'clienti', 'furnizori') + ' fara cod fiscal: ' + ALLTRIM(LEFT(m.lcListaGol, 50)))
|
||||
IIF(EMPTY(m.lcListaGol), '', CHR(13) + CHR(10) + SPACE(10) + 'Randuri cu ' + IIF(m.llClient, 'clienti', 'furnizori') + ' fara cod fiscal: ' + ALLTRIM(LEFT(m.lcListaGol, 50))) + m.lcTextInvalid
|
||||
IF !m.llSilent
|
||||
AMESSAGEBOX(lcMesaj,0+64, _screen.Caption)
|
||||
ENDIF
|
||||
@@ -1042,15 +1103,16 @@ and b1.cont = b2.cont
|
||||
ELSE
|
||||
*!* lcMesaj ='Nu exista parteneri cu solduri in declaratie diferite fata de soldurile din balanta de parteneri'
|
||||
lcMesaj ='Nu sunt diferente fata de balanta parteneri' + ;
|
||||
IIF(EMPTY(m.lcListaGol), '', CHR(13) + CHR(10) + SPACE(10) + 'Randuri cu ' + IIF(m.llClient, 'clienti', 'furnizori') + ' fara cod fiscal: ' + ALLTRIM(LEFT(m.lcListaGol, 50)))
|
||||
IIF(EMPTY(m.lcListaGol), '', CHR(13) + CHR(10) + SPACE(10) + 'Randuri cu ' + IIF(m.llClient, 'clienti', 'furnizori') + ' fara cod fiscal: ' + ALLTRIM(LEFT(m.lcListaGol, 50))) + m.lcTextInvalid
|
||||
IF !m.llSilent
|
||||
AMESSAGEBOX(lcMesaj + CHR(13) + CHR(10) + m.lcText,0+64,_screen.Caption)
|
||||
AMESSAGEBOX(m.lcMesaj,0+64,_screen.Caption)
|
||||
ENDIF
|
||||
|
||||
ENDIF
|
||||
ENDIF
|
||||
USE IN (SELECT('cBalPartTemp'))
|
||||
USE IN (SELECT('cPartDif'))
|
||||
USE IN (SELECT('cPartDif'))
|
||||
USE IN (SELECT('cCodInvalid'))
|
||||
Else
|
||||
llDontCloseCursor = .F.
|
||||
llExperimental = .F.
|
||||
@@ -1083,6 +1145,514 @@ and b1.cont = b2.cont
|
||||
RETURN lcMesaj
|
||||
ENDPROC && do_verifica_cui
|
||||
|
||||
*************************************************
|
||||
* Validare cod fiscal dupa regulile validatorului ANAF pentru RegistrationNumber/CustomerID
|
||||
* tlCnp: .T. = cod de persoana fizica (CNP), .F. = cod de persoana juridica (CUI)
|
||||
* toVerif: obiect VerificareCod, optional (ca sa nu se instantieze la fiecare cod)
|
||||
*************************************************
|
||||
PROCEDURE CodFiscalValidSaft
|
||||
LPARAMETERS tcCod, tlCnp, toVerif
|
||||
LOCAL lcCod
|
||||
|
||||
lcCod = ALLTRIM(UPPER(NVL(m.tcCod, '')))
|
||||
*!* la persoana juridica GenCustSupCode scoate atributul fiscal din codul SAF-T, la persoana fizica nu
|
||||
IF !m.tlCnp AND LEFT(m.lcCod, 2) = 'RO'
|
||||
lcCod = ALLTRIM(SUBSTR(m.lcCod, 3))
|
||||
ENDIF
|
||||
|
||||
*!* 26.07.2026 ANAF cere numai cifre, fara zero la inceput, exact 13 la CNP si maxim 10 la CUI - validarea cifrei de control nu prinde asta
|
||||
IF !EMPTY(CHRTRAN(m.lcCod, '0123456789', '')) OR LEFT(m.lcCod, 1) = '0' OR ;
|
||||
IIF(m.tlCnp, LEN(m.lcCod) <> 13, !BETWEEN(LEN(m.lcCod), 2, 10))
|
||||
RETURN .F.
|
||||
ENDIF
|
||||
|
||||
RETURN IIF(m.tlCnp, VALIDARE_CNP(m.lcCod, m.toVerif), VALIDARE_CIF(m.lcCod, m.toVerif))
|
||||
ENDPROC && CodFiscalValidSaft
|
||||
|
||||
*************************************************
|
||||
* Extrage din fisierul de raspuns al validatorului ANAF erorile de cod partener
|
||||
* (RegistrationNumber/CustomerID/SupplierID) si le pune in cursorul cEroriPartSaft
|
||||
* Intoarce textul de afisat, gol daca nu sunt astfel de erori
|
||||
*************************************************
|
||||
PROCEDURE do_erori_partener_saft
|
||||
LPARAMETERS tcFisierRaspuns
|
||||
|
||||
LOCAL lcCod, lcCursor, lcDenumire, lcId, lcLinie, lcLocatie, lcMesaj, lcPagina, lcRest, lcSelect, lcTag, lcTipCod, lcTipPart
|
||||
LOCAL lnFile, lnI, lnIdPart, lnJ, lnNrErori, lnParteneri, lnPoz, lnRand
|
||||
|
||||
lcMesaj = ''
|
||||
lcSelect = Select()
|
||||
|
||||
IF !FILE(m.tcFisierRaspuns)
|
||||
RETURN m.lcMesaj
|
||||
ENDIF
|
||||
|
||||
*!* fiecare eroare are 2 linii: localizarea "E: MasterFiles (1) sectiune Customers (1) sectiune Customer (162) ..."
|
||||
*!* si regula " eroare regula: CustomerID: Pentru CustomerID 00I14770212 formatul este invalid"
|
||||
CREATE CURSOR cErrTemp (saftpartid C(30), pagina C(10), rand N(7))
|
||||
lnFile = FOPEN(m.tcFisierRaspuns, 0)
|
||||
IF m.lnFile < 0
|
||||
USE IN (SELECT('cErrTemp'))
|
||||
SELECT (m.lcSelect)
|
||||
RETURN m.lcMesaj
|
||||
ENDIF
|
||||
lcLocatie = ''
|
||||
DO WHILE !FEOF(m.lnFile)
|
||||
lcLinie = FGETS(m.lnFile, 8192)
|
||||
IF LEFT(LTRIM(m.lcLinie), 2) == 'E:'
|
||||
lcLocatie = m.lcLinie
|
||||
LOOP
|
||||
ENDIF
|
||||
lnPoz = ATC('Pentru ', m.lcLinie)
|
||||
IF m.lnPoz = 0
|
||||
LOOP
|
||||
ENDIF
|
||||
lcRest = ALLTRIM(SUBSTR(m.lcLinie, m.lnPoz + 7))
|
||||
lcTag = GETWORDNUM(m.lcRest, 1)
|
||||
IF !INLIST(m.lcTag, 'RegistrationNumber', 'CustomerID', 'SupplierID')
|
||||
LOOP
|
||||
ENDIF
|
||||
lcId = GETWORDNUM(m.lcRest, 2)
|
||||
IF EMPTY(m.lcId)
|
||||
LOOP
|
||||
ENDIF
|
||||
|
||||
*!* pagina si randul din grid = sectiunea si indexul partenerului din MasterFiles ("sectiune Customer (162)")
|
||||
lcPagina = ''
|
||||
lnRand = 0
|
||||
lnPoz = ATC('sectiune Customer (', m.lcLocatie)
|
||||
IF m.lnPoz > 0
|
||||
lcPagina = 'Customers'
|
||||
ELSE
|
||||
lnPoz = ATC('sectiune Supplier (', m.lcLocatie)
|
||||
IF m.lnPoz > 0
|
||||
lcPagina = 'Suppliers'
|
||||
ENDIF
|
||||
ENDIF
|
||||
IF m.lnPoz > 0
|
||||
lnRand = INT(VAL(SUBSTR(m.lcLocatie, m.lnPoz + 19)))
|
||||
ENDIF
|
||||
|
||||
INSERT INTO cErrTemp (saftpartid, pagina, rand) VALUES (m.lcId, m.lcPagina, m.lnRand)
|
||||
ENDDO
|
||||
= FCLOSE(m.lnFile)
|
||||
|
||||
* Un cod poate aparea pe mai multe randuri (parteneri diferiti cu acelasi cod) si in sectiunile de documente
|
||||
SELECT saftpartid, COUNT(*) AS nr_erori, MAX(rand) AS max_rand FROM cErrTemp GROUP BY 1 INTO CURSOR cErrCod
|
||||
SELECT DISTINCT saftpartid, pagina, rand FROM cErrTemp WHERE rand > 0 ORDER BY 2, 3 INTO CURSOR cErrGrup
|
||||
USE IN (SELECT('cErrTemp'))
|
||||
|
||||
* Identific partenerul dupa codul SAF-T, in cursoarele declaratiei
|
||||
CREATE CURSOR cEroriPartSaft (pagina C(10), rand N(7), saftpartid C(30), tip_cod C(3), id_part N(10), denumire C(150), cod_fiscal C(30), tip_part C(9), nr_erori N(6))
|
||||
SELECT cErrGrup
|
||||
SCAN
|
||||
lcId = ALLTRIM(cErrGrup.saftpartid)
|
||||
lcPagina = cErrGrup.pagina
|
||||
lnRand = cErrGrup.rand
|
||||
lnNrErori = 0
|
||||
SELECT cErrCod
|
||||
LOCATE FOR ALLTRIM(cErrCod.saftpartid) == m.lcId
|
||||
IF FOUND()
|
||||
lnNrErori = cErrCod.nr_erori
|
||||
ENDIF
|
||||
lcTipPart = ''
|
||||
lnIdPart = 0
|
||||
lcDenumire = ''
|
||||
lcCod = ''
|
||||
FOR lnJ = 1 TO 2
|
||||
lcCursor = IIF(m.lnJ = 1, 'cCustomers', 'cSuppliers')
|
||||
IF !USED(m.lcCursor)
|
||||
LOOP
|
||||
ENDIF
|
||||
SELECT (m.lcCursor)
|
||||
LOCATE FOR ALLTRIM(NVL(saftpartid, '')) == m.lcId
|
||||
IF FOUND()
|
||||
lcTipPart = IIF(m.lnJ = 1, 'Client', 'Furnizor')
|
||||
lnIdPart = NVL(id_part, 0)
|
||||
lcDenumire = NVL(denumire, '')
|
||||
lcCod = ALLTRIM(NVL(cod_fiscal, ''))
|
||||
ENDIF
|
||||
GO TOP
|
||||
IF !EMPTY(m.lcTipPart)
|
||||
EXIT
|
||||
ENDIF
|
||||
ENDFOR
|
||||
lcTipCod = IIF(LEFT(m.lcId, 2) = '03', 'CNP', IIF(INLIST(LEFT(m.lcId, 2), '00', '01', '02'), 'CUI', ''))
|
||||
INSERT INTO cEroriPartSaft (pagina, rand, saftpartid, tip_cod, id_part, denumire, cod_fiscal, tip_part, nr_erori) ;
|
||||
VALUES (m.lcPagina, m.lnRand, m.lcId, m.lcTipCod, m.lnIdPart, m.lcDenumire, m.lcCod, m.lcTipPart, m.lnNrErori)
|
||||
SELECT cErrGrup
|
||||
ENDSCAN
|
||||
USE IN (SELECT('cErrGrup'))
|
||||
|
||||
* Codurile semnalate numai in sectiunile de documente, fara rand in Customers/Suppliers
|
||||
SELECT cErrCod
|
||||
SCAN FOR cErrCod.max_rand = 0
|
||||
lcId = ALLTRIM(cErrCod.saftpartid)
|
||||
lcTipCod = IIF(LEFT(m.lcId, 2) = '03', 'CNP', IIF(INLIST(LEFT(m.lcId, 2), '00', '01', '02'), 'CUI', ''))
|
||||
INSERT INTO cEroriPartSaft (pagina, rand, saftpartid, tip_cod, nr_erori) ;
|
||||
VALUES ('', 0, m.lcId, m.lcTipCod, cErrCod.nr_erori)
|
||||
SELECT cErrCod
|
||||
ENDSCAN
|
||||
USE IN (SELECT('cErrCod'))
|
||||
|
||||
lnParteneri = RECCOUNT('cEroriPartSaft')
|
||||
IF m.lnParteneri = 0
|
||||
USE IN (SELECT('cEroriPartSaft'))
|
||||
SELECT (m.lcSelect)
|
||||
RETURN m.lcMesaj
|
||||
ENDIF
|
||||
|
||||
lcMesaj = 'Coduri de partener respinse de validatorul ANAF: ' + ALLTRIM(STR(m.lnParteneri))
|
||||
lnI = 0
|
||||
SELECT cEroriPartSaft
|
||||
SCAN
|
||||
lnI = m.lnI + 1
|
||||
IF m.lnI > 10
|
||||
lcMesaj = m.lcMesaj + CHR(13) + CHR(10) + SPACE(3) + '...'
|
||||
EXIT
|
||||
ENDIF
|
||||
lcMesaj = m.lcMesaj + CHR(13) + CHR(10) + SPACE(3) + PADR(ALLTRIM(cEroriPartSaft.pagina), 11) + ;
|
||||
PADL(IIF(cEroriPartSaft.rand > 0, ALLTRIM(STR(cEroriPartSaft.rand)), '-'), 5) + SPACE(2) + ;
|
||||
PADR(ALLTRIM(cEroriPartSaft.saftpartid), 18) + PADR(ALLTRIM(cEroriPartSaft.tip_cod), 4) + ALLTRIM(cEroriPartSaft.denumire)
|
||||
ENDSCAN
|
||||
GO TOP
|
||||
SELECT (m.lcSelect)
|
||||
|
||||
RETURN m.lcMesaj
|
||||
ENDPROC && do_erori_partener_saft
|
||||
|
||||
*************************************************
|
||||
* Parseaza fisierul de raspuns al validatorului ANAF, grupeaza erorile cu
|
||||
* explicatii pe intelesul utilizatorului si separa erorile fictive de TaxCode
|
||||
* (bug DUKIntegrator: apar cand exista alta eroare reala, pentru coduri valide)
|
||||
* Scrie raportul in <fisier>_explicat.txt si intoarce calea lui, gol la esec
|
||||
*************************************************
|
||||
PROCEDURE do_erori_saft
|
||||
LPARAMETERS tcFisierRaspuns, tnReale, tnFictive, tcMesajChat
|
||||
|
||||
LOCAL lcActiune, lcCRLF, lcCod, lcFisierExplicat, lcIdent, lcLegenda, lcLinie, lcLocatie, lcMarker
|
||||
LOCAL lcMesaj, lcMesajChat, lcPagina, lcProblema, lcRaport, lcSelect, lcValoare, llFictiv, lnCateg
|
||||
LOCAL lnFictive, lnFile, lnI, lnPoz, lnRand, lnReale
|
||||
|
||||
lcFisierExplicat = ''
|
||||
lcCRLF = CHR(13) + CHR(10)
|
||||
lcSelect = SELECT()
|
||||
|
||||
IF !FILE(m.tcFisierRaspuns)
|
||||
RETURN m.lcFisierExplicat
|
||||
ENDIF
|
||||
|
||||
*!* o eroare = linia de localizare "E:/F: sectiune ... (N)" + linia de mesaj; erorile fatale de parsare sunt pe o singura linie
|
||||
CREATE CURSOR cErrSaft (categ N(3), pagina C(30), rand N(7), valoare C(30), mesaj C(240), brut M)
|
||||
lnFile = FOPEN(m.tcFisierRaspuns, 0)
|
||||
IF m.lnFile < 0
|
||||
USE IN (SELECT('cErrSaft'))
|
||||
SELECT (m.lcSelect)
|
||||
RETURN m.lcFisierExplicat
|
||||
ENDIF
|
||||
lcLocatie = ''
|
||||
DO WHILE !FEOF(m.lnFile)
|
||||
lcLinie = FGETS(m.lnFile, 8192)
|
||||
IF INLIST(LEFT(LTRIM(m.lcLinie), 2), 'E:', 'F:')
|
||||
lcLocatie = m.lcLinie
|
||||
LOOP
|
||||
ENDIF
|
||||
IF ATC('Eroare fatala de parsare', m.lcLinie) > 0
|
||||
INSERT INTO cErrSaft (categ, pagina, rand, valoare, mesaj, brut) VALUES (11, '', 0, '', LEFT(ALLTRIM(m.lcLinie), 240), m.lcLinie)
|
||||
lcLocatie = ''
|
||||
LOOP
|
||||
ENDIF
|
||||
lcMesaj = ALLTRIM(m.lcLinie)
|
||||
IF EMPTY(m.lcMesaj) OR EMPTY(m.lcLocatie)
|
||||
LOOP
|
||||
ENDIF
|
||||
|
||||
* pagina din aplicatie, dupa sectiunea din linia de localizare
|
||||
DO CASE
|
||||
CASE ATC('PurchaseInvoices', m.lcLocatie) > 0
|
||||
lcPagina = 'Facturi achizitie'
|
||||
CASE ATC('SalesInvoices', m.lcLocatie) > 0
|
||||
lcPagina = 'Facturi vanzare'
|
||||
CASE ATC('Payments', m.lcLocatie) > 0
|
||||
lcPagina = 'Plati'
|
||||
CASE ATC('MovementOfGoods', m.lcLocatie) > 0
|
||||
lcPagina = 'Miscari bunuri'
|
||||
CASE ATC('AssetTransactions', m.lcLocatie) > 0
|
||||
lcPagina = 'Tranzactii active'
|
||||
CASE ATC('GeneralLedgerEntries', m.lcLocatie) > 0
|
||||
lcPagina = 'Inregistrari contabile'
|
||||
CASE ATC('GeneralLedgerAccounts', m.lcLocatie) > 0
|
||||
lcPagina = 'Conturi contabile'
|
||||
CASE ATC('Customers', m.lcLocatie) > 0
|
||||
lcPagina = 'Clienti'
|
||||
CASE ATC('Suppliers', m.lcLocatie) > 0
|
||||
lcPagina = 'Furnizori'
|
||||
CASE ATC('TaxTable', m.lcLocatie) > 0
|
||||
lcPagina = 'Nomenclator coduri taxa'
|
||||
CASE ATC('Products', m.lcLocatie) > 0
|
||||
lcPagina = 'Articole'
|
||||
CASE ATC('PhysicalStock', m.lcLocatie) > 0
|
||||
lcPagina = 'Stocuri'
|
||||
CASE ATC('Assets', m.lcLocatie) > 0
|
||||
lcPagina = 'Active'
|
||||
CASE ATC('Header', m.lcLocatie) > 0
|
||||
lcPagina = 'Definirea Companiei'
|
||||
OTHERWISE
|
||||
lcPagina = ''
|
||||
ENDCASE
|
||||
|
||||
* pozitia din grid = indexul elementului de nivel document din localizare
|
||||
lnRand = 0
|
||||
FOR lnI = 1 TO 8
|
||||
lcMarker = 'sectiune ' + GETWORDNUM('Transaction,Invoice,Payment,Customer,Supplier,Account,Asset,Product', m.lnI, ',') + ' ('
|
||||
lnPoz = ATC(m.lcMarker, m.lcLocatie)
|
||||
IF m.lnPoz > 0
|
||||
lnRand = INT(VAL(SUBSTR(m.lcLocatie, m.lnPoz + LEN(m.lcMarker))))
|
||||
EXIT
|
||||
ENDIF
|
||||
ENDFOR
|
||||
|
||||
lcValoare = ''
|
||||
DO CASE
|
||||
CASE ATC('formatul este invalid', m.lcMesaj) > 0 AND (ATC('CustomerID', m.lcMesaj) > 0 OR ATC('SupplierID', m.lcMesaj) > 0 OR ATC('RegistrationNumber', m.lcMesaj) > 0)
|
||||
lnCateg = 1
|
||||
CASE ATC('nu se afla in lista', m.lcMesaj) > 0 AND ATC('TaxCode (', m.lcLocatie) > 0
|
||||
lnCateg = 12
|
||||
lcValoare = STREXTRACT(m.lcMesaj, [valoarea '], ['])
|
||||
CASE ATC('vid nepermis', m.lcMesaj) > 0 AND (ATC('CustomerID (', m.lcLocatie) > 0 OR ATC('SupplierID (', m.lcLocatie) > 0)
|
||||
lnCateg = 2
|
||||
CASE ATC([elementul 'AccountID'], m.lcMesaj) > 0 AND ATC('Payments', m.lcLocatie) > 0
|
||||
lnCateg = 3
|
||||
CASE ATC([elementul 'InvoiceLine'], m.lcMesaj) > 0
|
||||
lnCateg = 4
|
||||
CASE ATC([elementul 'RegistrationNumber'], m.lcMesaj) > 0 OR (ATC('vid nepermis', m.lcMesaj) > 0 AND ATC('RegistrationNumber (', m.lcLocatie) > 0)
|
||||
lnCateg = 5
|
||||
CASE ATC('planul de conturi', m.lcMesaj) > 0
|
||||
lnCateg = 6
|
||||
lcValoare = STREXTRACT(m.lcMesaj, '[', ']')
|
||||
CASE ATC('vid nepermis', m.lcMesaj) > 0 AND ATC('AccountDescription', m.lcLocatie) > 0
|
||||
lnCateg = 7
|
||||
CASE ATC('BankAccount_choice', m.lcMesaj) > 0
|
||||
lnCateg = 8
|
||||
CASE ATC('SupplierInfo_choice', m.lcMesaj) > 0
|
||||
lnCateg = 9
|
||||
CASE ATC([elementul 'Transaction'], m.lcMesaj) > 0
|
||||
lnCateg = 10
|
||||
OTHERWISE
|
||||
lnCateg = 13
|
||||
ENDCASE
|
||||
INSERT INTO cErrSaft (categ, pagina, rand, valoare, mesaj, brut) ;
|
||||
VALUES (m.lnCateg, m.lcPagina, m.lnRand, LEFT(m.lcValoare, 30), IIF(m.lnCateg = 13, LEFT(m.lcMesaj, 240), ''), m.lcLocatie + m.lcCRLF + m.lcLinie)
|
||||
lcLocatie = ''
|
||||
ENDDO
|
||||
= FCLOSE(m.lnFile)
|
||||
|
||||
IF RECCOUNT('cErrSaft') = 0
|
||||
USE IN (SELECT('cErrSaft'))
|
||||
SELECT (m.lcSelect)
|
||||
RETURN m.lcFisierExplicat
|
||||
ENDIF
|
||||
|
||||
*!* erorile fictive TaxCode (bug DUKIntegrator): codul semnalat exista de fapt in nomenclator
|
||||
SELECT DISTINCT valoare FROM cErrSaft WHERE categ = 12 INTO CURSOR cCodTaxaVerif
|
||||
SELECT cCodTaxaVerif
|
||||
SCAN
|
||||
lcCod = ALLTRIM(cCodTaxaVerif.valoare)
|
||||
IF EMPTY(m.lcCod) OR LEN(CHRTRAN(m.lcCod, '0123456789', '')) > 0
|
||||
LOOP
|
||||
ENDIF
|
||||
llFictiv = .F.
|
||||
IF USED('cTaxTable')
|
||||
SELECT cTaxTable
|
||||
LOCATE FOR ALLTRIM(STR(taxcode)) == m.lcCod
|
||||
llFictiv = FOUND()
|
||||
ELSE
|
||||
IF goExecutor.oExecuta('SELECT taxcode FROM vsaft_taxtable WHERE taxcode = ' + m.lcCod, 'cTaxVerifTmp')
|
||||
llFictiv = (RECCOUNT('cTaxVerifTmp') > 0)
|
||||
USE IN (SELECT('cTaxVerifTmp'))
|
||||
ENDIF
|
||||
ENDIF
|
||||
IF m.llFictiv
|
||||
UPDATE cErrSaft SET categ = 90 WHERE categ = 12 AND ALLTRIM(valoare) == m.lcCod
|
||||
ENDIF
|
||||
SELECT cCodTaxaVerif
|
||||
ENDSCAN
|
||||
USE IN (SELECT('cCodTaxaVerif'))
|
||||
|
||||
SELECT cErrSaft
|
||||
COUNT FOR categ = 90 TO lnFictive
|
||||
|
||||
*!* textul pentru chatbot: erorile brute, fara cele fictive (bug validator)
|
||||
lcMesajChat = ''
|
||||
SELECT cErrSaft
|
||||
SCAN FOR categ < 90
|
||||
lcMesajChat = m.lcMesajChat + brut + m.lcCRLF
|
||||
ENDSCAN
|
||||
|
||||
*!* dedup: aceeasi problema pe aceeasi pozitie o singura data (ex: CustomerID + RegistrationNumber pe acelasi client)
|
||||
SELECT DISTINCT categ, pagina, valoare, mesaj, rand FROM cErrSaft WHERE categ < 90 ORDER BY 1, 2, 5 INTO CURSOR cErrPoz
|
||||
lnReale = RECCOUNT('cErrPoz')
|
||||
|
||||
lcRaport = 'ERORI VALIDARE D406 SAF-T - ' + JUSTFNAME(m.tcFisierRaspuns) + m.lcCRLF + ;
|
||||
'Erori de rezolvat: ' + ALLTRIM(STR(m.lnReale)) + ' | Fictive (bug validator, se pot ignora): ' + ALLTRIM(STR(m.lnFictive)) + m.lcCRLF + ;
|
||||
REPLICATE('=', 110) + m.lcCRLF
|
||||
lcLegenda = ''
|
||||
SELECT cErrPoz
|
||||
SCAN
|
||||
lcIdent = This.do_ident_saft(ALLTRIM(cErrPoz.pagina), cErrPoz.rand)
|
||||
lcActiune = ''
|
||||
DO CASE
|
||||
CASE cErrPoz.categ = 1
|
||||
lcProblema = 'cod partener SAF-T invalid (CUI/CNP gresit sau tip PJ/PF gresit)'
|
||||
lcActiune = 'Parteneri: corectati tip persoana / cod fiscal in Initializare > Entitati; CNP-uri invalide in masa: Initializari cod taxa/plata > Stergere CNP-uri invalide'
|
||||
CASE cErrPoz.categ = 2
|
||||
lcProblema = 'partener fara cod fiscal pe plata (sau nota nu e plata catre terti)'
|
||||
lcActiune = 'Plati: completati codul fiscal al partenerului (partener virtual: CUI-ul firmei) sau stergeti codul de plata de pe notele care nu sunt plati catre terti, in Registrul Jurnal'
|
||||
CASE cErrPoz.categ = 3
|
||||
lcProblema = 'plata fara cont contabil (nota nu e plata catre terti)'
|
||||
lcActiune = 'Plati: completati codul fiscal al partenerului (partener virtual: CUI-ul firmei) sau stergeti codul de plata de pe notele care nu sunt plati catre terti, in Registrul Jurnal'
|
||||
CASE cErrPoz.categ = 4
|
||||
lcProblema = 'factura fara articole (probabil document sters)'
|
||||
lcActiune = 'Facturi fara articole: Refacere Registru TVA Cumparari/Vanzari, apoi regenerati D406'
|
||||
CASE cErrPoz.categ = 5
|
||||
lcProblema = 'PJ fara cod fiscal sau PF marcata ca PJ'
|
||||
lcActiune = 'Parteneri: corectati tip persoana / cod fiscal in Initializare > Entitati; CNP-uri invalide in masa: Initializari cod taxa/plata > Stergere CNP-uri invalide'
|
||||
CASE cErrPoz.categ = 6
|
||||
lcProblema = 'contul ' + ALLTRIM(cErrPoz.valoare) + ' nu exista in planul de conturi'
|
||||
lcActiune = 'Conturi: corectati contul in notele din Registrul Jurnal sau completati planul de conturi al firmei'
|
||||
CASE cErrPoz.categ = 7
|
||||
lcProblema = 'cont fara denumire (nu exista in planul de conturi al firmei)'
|
||||
lcActiune = 'Conturi: corectati contul in notele din Registrul Jurnal sau completati planul de conturi al firmei'
|
||||
CASE cErrPoz.categ = 8
|
||||
lcProblema = 'lipseste contul bancar (IBAN) al firmei'
|
||||
lcActiune = 'Cont bancar: completati IBAN-ul in Definirea Companiei'
|
||||
CASE cErrPoz.categ = 9
|
||||
lcProblema = 'adresa furnizorului incompleta (judet/localitate) sau document sters'
|
||||
lcActiune = 'Adresa furnizor: dublu click pe furnizor in Facturi achizitie; daca e document sters cu valoare 0: Refacere Registru TVA Cumparari'
|
||||
CASE cErrPoz.categ = 10
|
||||
lcProblema = 'nu exista note contabile in perioada'
|
||||
lcActiune = 'Registru gol: introduceti o nota cu valoare 0 (ex: 371 = 371)'
|
||||
CASE cErrPoz.categ = 11
|
||||
lcProblema = ALLTRIM(cErrPoz.mesaj)
|
||||
lcActiune = 'Caracter nepermis: inlocuiti & cu "si" in campul sursa (denumire/adresa) si regenerati D406'
|
||||
CASE cErrPoz.categ = 12
|
||||
lcProblema = 'cod taxa ' + ALLTRIM(cErrPoz.valoare) + ' inexistent in nomenclatorul SAF-T'
|
||||
lcActiune = 'Cod taxa: corectati codul de taxa pe notele din Registrul Jurnal'
|
||||
OTHERWISE
|
||||
lcProblema = ALLTRIM(cErrPoz.mesaj)
|
||||
ENDCASE
|
||||
IF !EMPTY(m.lcActiune) AND ATC(m.lcActiune, m.lcLegenda) = 0
|
||||
lcLegenda = m.lcLegenda + '- ' + m.lcActiune + m.lcCRLF
|
||||
ENDIF
|
||||
lcRaport = m.lcRaport + PADR(ALLTRIM(cErrPoz.pagina), 20) + ' ' + ;
|
||||
PADR(IIF(cErrPoz.rand > 0, 'poz.' + ALLTRIM(STR(cErrPoz.rand)), ''), 8) + ' ' + ;
|
||||
IIF(EMPTY(m.lcIdent), '', PADR(m.lcIdent, 45) + ' ') + '- ' + m.lcProblema + m.lcCRLF
|
||||
ENDSCAN
|
||||
USE IN (SELECT('cErrPoz'))
|
||||
IF m.lnReale = 0
|
||||
lcRaport = m.lcRaport + 'Niciuna.' + m.lcCRLF
|
||||
ENDIF
|
||||
IF !EMPTY(m.lcLegenda)
|
||||
lcRaport = m.lcRaport + m.lcCRLF + 'CUM REZOLVATI:' + m.lcCRLF + m.lcLegenda
|
||||
ENDIF
|
||||
|
||||
IF m.lnFictive > 0
|
||||
lcIdent = ''
|
||||
SELECT valoare, COUNT(*) AS nr FROM cErrSaft WHERE categ = 90 GROUP BY 1 ORDER BY 1 INTO CURSOR cErrFictivSaft
|
||||
SELECT cErrFictivSaft
|
||||
SCAN
|
||||
lcIdent = m.lcIdent + IIF(EMPTY(m.lcIdent), '', ', ') + ALLTRIM(cErrFictivSaft.valoare) + ' (' + ALLTRIM(STR(cErrFictivSaft.nr)) + 'x)'
|
||||
ENDSCAN
|
||||
USE IN (SELECT('cErrFictivSaft'))
|
||||
lcRaport = m.lcRaport + m.lcCRLF + 'FICTIVE - BUG VALIDATOR ANAF (se pot ignora): cod taxa ' + m.lcIdent + m.lcCRLF + ;
|
||||
'Codurile sunt valide (exista in nomenclator); erorile apar doar cand exista alta eroare reala si dispar dupa rezolvarea ei.' + m.lcCRLF
|
||||
ENDIF
|
||||
|
||||
lcRaport = m.lcRaport + m.lcCRLF + 'Erorile brute: ' + m.tcFisierRaspuns + m.lcCRLF
|
||||
|
||||
lcFisierExplicat = ADDBS(JUSTPATH(m.tcFisierRaspuns)) + JUSTSTEM(m.tcFisierRaspuns) + '_explicat.txt'
|
||||
IF FILE(m.lcFisierExplicat)
|
||||
DELETE FILE (m.lcFisierExplicat)
|
||||
ENDIF
|
||||
= STRTOFILE(m.lcRaport, m.lcFisierExplicat)
|
||||
IF !FILE(m.lcFisierExplicat)
|
||||
lcFisierExplicat = ''
|
||||
ENDIF
|
||||
|
||||
USE IN (SELECT('cErrSaft'))
|
||||
SELECT (m.lcSelect)
|
||||
tnReale = m.lnReale
|
||||
tnFictive = m.lnFictive
|
||||
tcMesajChat = m.lcMesajChat
|
||||
|
||||
RETURN m.lcFisierExplicat
|
||||
ENDPROC && do_erori_saft
|
||||
|
||||
*************************************************
|
||||
* Identificatorul de afisat pentru pozitia tnRand din cursorul paginii tcPagina
|
||||
* (sectiunile XML se scriu prin SCAN secvential, deci pozitia din eroare este
|
||||
* a tnRand-a inregistrare vizibila; la Conturi ramane activ filtrul writer-ului)
|
||||
*************************************************
|
||||
PROCEDURE do_ident_saft
|
||||
LPARAMETERS tcPagina, tnRand
|
||||
|
||||
LOCAL lcAlias, lcIdent, lcSelect, lnRecno
|
||||
|
||||
lcIdent = ''
|
||||
IF m.tnRand <= 0
|
||||
RETURN m.lcIdent
|
||||
ENDIF
|
||||
DO CASE
|
||||
CASE m.tcPagina == 'Clienti'
|
||||
lcAlias = 'cCustomers'
|
||||
CASE m.tcPagina == 'Furnizori'
|
||||
lcAlias = 'cSuppliers'
|
||||
CASE m.tcPagina == 'Conturi contabile'
|
||||
lcAlias = 'cGeneralLedgerAccounts'
|
||||
CASE m.tcPagina == 'Inregistrari contabile'
|
||||
lcAlias = 'cGeneralLedgerEntries'
|
||||
CASE m.tcPagina == 'Plati'
|
||||
lcAlias = 'cPayments'
|
||||
CASE m.tcPagina == 'Facturi vanzare'
|
||||
lcAlias = 'cSalesInvoices'
|
||||
CASE m.tcPagina == 'Facturi achizitie'
|
||||
lcAlias = 'cPurchaseInvoices'
|
||||
OTHERWISE
|
||||
lcAlias = ''
|
||||
ENDCASE
|
||||
IF EMPTY(m.lcAlias) OR !USED(m.lcAlias)
|
||||
RETURN m.lcIdent
|
||||
ENDIF
|
||||
|
||||
lcSelect = SELECT()
|
||||
SELECT (m.lcAlias)
|
||||
lnRecno = RECNO()
|
||||
GO TOP
|
||||
IF m.tnRand > 1 AND !EOF()
|
||||
SKIP m.tnRand - 1
|
||||
ENDIF
|
||||
IF !EOF()
|
||||
DO CASE
|
||||
CASE INLIST(m.lcAlias, 'cCustomers', 'cSuppliers')
|
||||
lcIdent = ALLTRIM(NVL(saftpartid, '')) + ' ' + ALLTRIM(NVL(denumire, ''))
|
||||
CASE m.lcAlias == 'cGeneralLedgerAccounts'
|
||||
lcIdent = 'cont ' + ALLTRIM(NVL(cont, '')) + ' ' + ALLTRIM(NVL(denumire, ''))
|
||||
CASE m.lcAlias == 'cGeneralLedgerEntries'
|
||||
lcIdent = 'nota ' + ALLTRIM(TRANSFORM(cod)) + IIF(EMPTY(dataact), '', ' / ' + DTOC(dataact)) + ' cont ' + ALLTRIM(NVL(cont, '')) + ' ' + ALLTRIM(NVL(saftpartid, ''))
|
||||
CASE m.lcAlias == 'cPayments'
|
||||
lcIdent = IIF(TYPE('denumire') = 'C', ALLTRIM(NVL(denumire, '')) + ' ', '') + LEFT(ALLTRIM(NVL(explicatia, '')), 40)
|
||||
OTHERWISE
|
||||
lcIdent = 'fact. ' + ALLTRIM(TRANSFORM(nract)) + IIF(EMPTY(dataact), '', ' / ' + DTOC(dataact)) + ' ' + ALLTRIM(NVL(saftpartid, ''))
|
||||
ENDCASE
|
||||
ENDIF
|
||||
IF BETWEEN(m.lnRecno, 1, RECCOUNT(m.lcAlias))
|
||||
GO m.lnRecno
|
||||
ENDIF
|
||||
SELECT (m.lcSelect)
|
||||
|
||||
RETURN LEFT(ALLTRIM(m.lcIdent), 45)
|
||||
ENDPROC && do_ident_saft
|
||||
|
||||
&& IAU SOLDURILE DIN BALANTA DE VERIFICARE PENTRU CONTURILE DE IMOBLIZARI SI AMORTIZARI
|
||||
&& SI LE COMPAR CU VALOAREA DE INVENTAR SI AMORTIZAREA TOTALA DIN IMOBILIZARI CORPORALE/NECORPORALE CONTABIL
|
||||
Procedure do_verifica_imobilizari
|
||||
@@ -2013,7 +2583,7 @@ select a.id_articol, a.denumire, SUM(r.cant) as cant, SUM(r.cante) as cante, SUM
|
||||
*!* RETURN
|
||||
*!* ENDIF
|
||||
|
||||
lnOptiune = xmenu('Completare cod taxa SAF-T;Completare cod plata SAF-T;\-;Completare coduri plata implicite pe documente;Corectare tip persoana fizica in nomenclatorul de parteneri')
|
||||
lnOptiune = xmenu('Completare cod taxa SAF-T;Completare cod plata SAF-T;\-;Completare coduri plata implicite pe documente;Corectare tip persoana fizica in nomenclatorul de parteneri;Stergere CNP-uri invalide la persoanele fizice din declaratie')
|
||||
IF EMPTY(m.lnOptiune)
|
||||
RETURN
|
||||
ENDIF
|
||||
@@ -2035,9 +2605,14 @@ select a.id_articol, a.denumire, SUM(r.cant) as cant, SUM(r.cante) as cante, SUM
|
||||
lcSql = [begin PACK_SAFT.UpdatePaymentCodeFdoc(?gnAn); end;]
|
||||
CASE m.lnOptiune = 5
|
||||
lcMesaj = 'Doriti sa corectati tipul de persoana = "Fizica" pentru persoanele cu tip persoana = "Juridica" si cod fiscal 13 cifre?'
|
||||
lcSql = [begin PACK_SAFT.UpdateTipPersoanaFizica(); end;]
|
||||
|
||||
ENDCASE
|
||||
lcSql = [begin PACK_SAFT.UpdateTipPersoanaFizica(); end;]
|
||||
|
||||
*!* 24.07.2026 stergere CNP-uri invalide (persoane fizice) la partenerii cu rulaje in perioada declaratiei
|
||||
CASE m.lnOptiune = 6
|
||||
This.StergereCnpInvalid()
|
||||
RETURN
|
||||
|
||||
ENDCASE
|
||||
|
||||
IF AMESSAGEBOX(m.lcMesaj,4+32,_screen.Caption) = 6
|
||||
llSucces = goExecutor.oExecuta(m.lcSql)
|
||||
@@ -2046,8 +2621,110 @@ select a.id_articol, a.denumire, SUM(r.cant) as cant, SUM(r.cante) as cante, SUM
|
||||
'Apasati pe 1. Citeste date pentru a actualiza datele din declaratie',0+64,_screen.Caption)
|
||||
ENDIF
|
||||
ENDIF
|
||||
ENDPROC && CompletareCodTaxaPlata
|
||||
|
||||
ENDPROC && CompletareCodTaxaPlata
|
||||
|
||||
*************************************
|
||||
* Stergere cod fiscal la persoanele cu CNP invalid, din clientii/furnizorii declaratiei
|
||||
* Aceleasi randuri pe care le semnaleaza verificarea codurilor fiscale (do_verifica_cui)
|
||||
PROCEDURE StergereCnpInvalid
|
||||
Local lcCod, lcCursor, lcLista, lcMesaj, lcSelect, lcSql, llCnp, llSucces, lnAn2, lnI, lnLuna2, lnNr, lnRand, loVerif
|
||||
Local lcCodInv, lcDenumireInv, lnIdPartInv, lnTipPersInv
|
||||
|
||||
lcSelect = Select()
|
||||
lnAn2 = This.oUnitate.an2
|
||||
lnLuna2 = This.oUnitate.luna2
|
||||
|
||||
If !Used('cCustomers') And !Used('cSuppliers')
|
||||
Amessagebox('Apasati intai pe 1. Citeste date!', 0+64, _Screen.Caption)
|
||||
Select (m.lcSelect)
|
||||
Return .F.
|
||||
Endif
|
||||
|
||||
*!* 26.07.2026 candidatii se iau din cursoarele declaratiei, cu aceleasi criterii ca verificarea codurilor fiscale
|
||||
Create Cursor cCnpTemp (id_part N(10), denumire C(150), cod_fiscal C(30), tip_persoana N(1))
|
||||
loVerif = Createobject('VerificareCod')
|
||||
For lnI = 1 To 2
|
||||
lcCursor = Iif(m.lnI = 1, 'cCustomers', 'cSuppliers')
|
||||
If !Used(m.lcCursor)
|
||||
Loop
|
||||
Endif
|
||||
Select (m.lcCursor)
|
||||
Scan For !Empty(Nvl(id_part, 0)) And !Empty(Nvl(cod_fiscal, '')) ;
|
||||
And Inlist(Alltrim(Nvl(cod_tara, 'RO')), 'RO', '')
|
||||
lcCod = Alltrim(cod_fiscal)
|
||||
llCnp = (Nvl(tip_persoana, 1) = 2) Or (Len(Chrtran(m.lcCod, '0123456789', '')) = 0 And Len(m.lcCod) > 10)
|
||||
If m.llCnp And !This.CodFiscalValidSaft(m.lcCod, .T., m.loVerif)
|
||||
lnIdPartInv = id_part
|
||||
lcDenumireInv = Nvl(denumire, '')
|
||||
lcCodInv = m.lcCod
|
||||
lnTipPersInv = Nvl(tip_persoana, 1)
|
||||
Insert Into cCnpTemp (id_part, denumire, cod_fiscal, tip_persoana) ;
|
||||
Values (m.lnIdPartInv, m.lcDenumireInv, m.lcCodInv, m.lnTipPersInv)
|
||||
Select (m.lcCursor)
|
||||
Endif
|
||||
Endscan
|
||||
Go Top
|
||||
Endfor
|
||||
loVerif = .NULL.
|
||||
|
||||
* Un partener apare pe cate un rand pentru fiecare cont, deci elimin dublurile
|
||||
Select Distinct id_part, denumire, cod_fiscal, tip_persoana ;
|
||||
From cCnpTemp ;
|
||||
Order By denumire ;
|
||||
Into Cursor cCnpInvalid
|
||||
Use In (Select('cCnpTemp'))
|
||||
|
||||
lnNr = Reccount('cCnpInvalid')
|
||||
If m.lnNr = 0
|
||||
Amessagebox('Nu sunt parteneri cu CNP invalid in declaratie!', 0+64, _Screen.Caption)
|
||||
Use In (Select('cCnpInvalid'))
|
||||
Select (m.lcSelect)
|
||||
Return .T.
|
||||
Endif
|
||||
|
||||
goExport.export2xlsx('cCnpInvalid', 'cnp_invalide_saft_' + Alltrim(Str(m.lnAn2)) + Padl(m.lnLuna2, 2, '0'))
|
||||
|
||||
lcMesaj = 'S-au gasit ' + Alltrim(Str(m.lnNr)) + ' parteneri cu CNP invalid in declaratie.' + Chr(13) + Chr(10) + ;
|
||||
'Doriti stergerea codului fiscal eronat si trecerea lor pe persoana fizica?' + Chr(13) + Chr(10) + ;
|
||||
'(la SAF-T persoanele fizice nu sunt obligate sa aiba CNP)'
|
||||
If Amessagebox(m.lcMesaj, 4+32, _Screen.Caption) <> 6
|
||||
Use In (Select('cCnpInvalid'))
|
||||
Select (m.lcSelect)
|
||||
Return .F.
|
||||
Endif
|
||||
|
||||
* Actualizez in transe de 1000 de coduri (limita listei IN din Oracle)
|
||||
lcLista = ''
|
||||
lnRand = 0
|
||||
llSucces = .T.
|
||||
Select cCnpInvalid
|
||||
*!* 26.07.2026 exportul lasa pointerul pe EOF, deci pozitionez pe primul rand inainte de parcurgere
|
||||
Go Top
|
||||
Scan
|
||||
lcLista = m.lcLista + Iif(Empty(m.lcLista), '', ',') + Alltrim(Str(cCnpInvalid.id_part))
|
||||
lnRand = m.lnRand + 1
|
||||
If m.lnRand = 1000 Or Recno() = m.lnNr
|
||||
lcSql = [update nom_parteneri set cod_fiscal = null, tip_persoana = 2 where id_part in (] + m.lcLista + [)]
|
||||
llSucces = goExecutor.oExecuta(m.lcSql)
|
||||
lcLista = ''
|
||||
lnRand = 0
|
||||
Endif
|
||||
If !m.llSucces
|
||||
Exit
|
||||
Endif
|
||||
Endscan
|
||||
|
||||
If m.llSucces
|
||||
Amessagebox('Stergere efectuata cu succes (' + Alltrim(Str(m.lnNr)) + ' parteneri)!' + Chr(13) + Chr(10) + ;
|
||||
'Apasati pe 1. Citeste date pentru a actualiza datele din declaratie' + Chr(13) + Chr(10) + ;
|
||||
'(pana la re-citire, verificarile arata tot codurile vechi)', 0+64, _Screen.Caption)
|
||||
Endif
|
||||
|
||||
Use In (Select('cCnpInvalid'))
|
||||
Select (m.lcSelect)
|
||||
Return m.llSucces
|
||||
ENDPROC && StergereCnpInvalid
|
||||
|
||||
***********************************
|
||||
* Creare cusoare din baza de date
|
||||
Function CitesteDate
|
||||
|
||||
189
TODOS.md
189
TODOS.md
@@ -36,3 +36,192 @@ Generat de /autoplan (review PRD eFactura OAuth2) pe 2026-07-07.
|
||||
## ~~Lansare automată a fluxului de token nou la eșec definitiv de refresh~~ — PRELUAT
|
||||
Decis la poarta /autoplan (D3, 2026-07-07): utilizatorul o implementează direct în VFP
|
||||
(legarea mesajului de expirare refresh de apelul newToken). Nu mai e item deschis aici.
|
||||
|
||||
## Amanari review /autoplan — verificare ANAF la alegerea partenerului (26.07.2026)
|
||||
|
||||
Sursa: `docs/design-alegere-partener-anaf.md`, REVIZIA 4 (implementata doar nivelul 1).
|
||||
|
||||
## P2 — Guard de duplicat pe CUI normalizat la crearea partenerului
|
||||
- **Ce:** La crearea unui partener nou, verificare ca nu mai exista alt partener activ
|
||||
cu acelasi CUI normalizat (`NormalizeazaCUI`); avertizare/blocare inainte de salvare.
|
||||
- **De ce:** stratul cel mai ieftin de prevenire a duplicatelor — netratat in 4 revizii
|
||||
ale verificarii ANAF la alegere, care acopera doar alegerea unui partener deja
|
||||
existent, nu crearea unuia nou. Cel mai bun raport cost/beneficiu dintre amanarile
|
||||
de mai jos.
|
||||
- **Pro:** cost mic, taie problema la sursa. **Contra:** cazuri legitime de acoperit
|
||||
(sedii/puncte de lucru cu acelasi CUI).
|
||||
- **Efort:** S. **Depinde de:** decizie UX blocare vs. avertizare.
|
||||
|
||||
## P3 — Raport pasiv de discordante CUI + curatare duplicate de parteneri
|
||||
- **Ce:** Raport cu partenerii care au discordante fata de ANAF (nume/stare TVA) si
|
||||
perechile de CUI duplicat, pentru curatare manuala periodica.
|
||||
- **De ce:** REVIZIA 4 logheaza discordantele in `goLog` la alegere, dar fara raport
|
||||
datele brute nu arata tiparul.
|
||||
- **Efort:** M. **Depinde de:** volum de date acumulat din logarea introdusa la REVIZIA 4.
|
||||
|
||||
## P3 — Coloana "Ultim document" in cautarea de partener
|
||||
- **Ce:** Coloana in gridul de cautare partener cu data ultimului document inregistrat
|
||||
pe acel partener.
|
||||
- **De ce:** discriminatorul "are documente in perioada" din Detalii (REVIZIA 4) ajuta
|
||||
doar la alegere; o coloana in grid ar ajuta si la navigare fara deschiderea Detalii
|
||||
pe fiecare candidat.
|
||||
- **Efort:** S-M. **Depinde de:** sursa `ireg_parteneri`, deja identificata in REVIZIA 4.
|
||||
|
||||
## P3 — Prevenirea duplicatelor la import
|
||||
- **Ce:** La import (facturi, extrase, eFactura), verificare CUI normalizat inainte de
|
||||
crearea automata a unui partener nou.
|
||||
- **De ce:** importurile creeaza parteneri fara sa treaca prin formularul de creare
|
||||
manuala, deci guard-ul de mai sus (P2) nu acopera acest flux.
|
||||
- **Efort:** M. **Depinde de:** guard-ul de duplicat pe CUI normalizat (P2 de mai sus).
|
||||
|
||||
## P3 — Tooltip per rand in gridul de cautare
|
||||
- **Ce:** Tooltip la hover pe randul din gridul de cautare partener, cu detaliile
|
||||
ANAF/discordanta randului respectiv.
|
||||
- **De ce:** alternativa la click/F4 pe Detalii (REVIZIA 4), utila pe fluxurile cu mouse.
|
||||
- **Efort:** S.
|
||||
|
||||
## P3 — Marcaj colorat pe toate randurile din grid (nivelul 2 al `RC_ANAF_VERIF_SELECTIE`)
|
||||
- **Ce:** Extinderea verificarii ANAF de la randul curent (nivelul 1, implementat) la
|
||||
marcaj colorat pe toate randurile din grid.
|
||||
- **De ce:** amanat explicit la poarta /autoplan din 26.07.2026 (decizia D1/UC1) — risc
|
||||
de nedeterminism (timer unic, cursor de grid) si de rate-limit ANAF pe volum mare.
|
||||
- **Conditii de intrare** (in aceasta ordine, nicio implementare inainte):
|
||||
1. Masuratori: latenta reala a unui apel ANAF la ore diferite; comportamentul la
|
||||
rafale (30 loturi x 20 CUI la interval scurt — de la al catelea vine 429).
|
||||
2. Date din loguri: cate discordante apar efectiv la pilot si in ce flux.
|
||||
- **Cerinte tehnice deja verificate** (de nepierdut la implementare) — sectiunea 8 din
|
||||
`docs/design-alegere-partener-anaf.md`: UC1, D-F2, C4, H1, H4, H5, H8, H9, M1, M7.
|
||||
- **Efort:** L. **Depinde de:** masuratorile de mai sus.
|
||||
- **Masurat partial (27.07.2026)**, vezi `docs/plan-reparatie-anaf-404-breaker.md`: latenta
|
||||
unui apel la ANAF sanatos 0,08 s; gazda care inghite pachetele 21,05 s fara timeout-uri,
|
||||
4,00 s cu SetTimeouts(2000,2000,3000,3000); WinHTTP asincron `Send()` 0,009 s,
|
||||
`WaitForResponse(0)` 0 s. Ramane nemasurat comportamentul la rafale (de la al catelea 429).
|
||||
|
||||
## P4 — Contract 404 pe drumul batch ANAF (D406 si sincronizari) — PRELUAT
|
||||
Preluat 31.07.2026, povestea S5 din transa `docs/contract-cache-anaf.md` (`docs/diff-S5-contract-404-batch.md`).
|
||||
- **Ce:** `validare.prg:1827` citeste corpul raspunsului doar pe `Status = 200`, la fel cum
|
||||
facea si wrapper-ul single-CUI. Pe loturi, un CUI inexistent si o cadere de serviciu ajung
|
||||
la utilizator ca acelasi lucru ("nu s-a putut verifica").
|
||||
- **De ce:** masurat 27.07.2026 — ANAF intoarce HTTP 404 cu corp complet
|
||||
`{"found":[],"notFound":[<cui>]}`, deci informatia exista, doar e aruncata. Regula corecta,
|
||||
stabilita si implementata pe calea single-CUI: verdict "inexistent" doar cand `notFound`
|
||||
contine chiar codul cerut (`notFound` apare si in raspunsurile de succes, ca tablou gol).
|
||||
- **Ce s-a facut deja in transa din 27.07:** doar timeout-urile pe calea batch (~105 s de
|
||||
fereastra inghetata devin ~20 s pe 500 de coduri). Logica de verdict nu s-a atins.
|
||||
- **De ce nu acum:** atinge interpretarea raspunsului in D406 si in sincronizari, deci cere
|
||||
runda proprie de teste pe declaratie, nu doar pe formularul de cautare.
|
||||
- **Efort:** M. **Depinde de:** transa `plan-reparatie-anaf-404-breaker.md` (regula notFound).
|
||||
|
||||
## P5 — Verificare ANAF dupa tara partenerului (punctul D)
|
||||
- **Ce:** tara partenerului adusa in cursorul de cautare, ca `cod_tara` caracter (gol sau `RO`
|
||||
= se verifica), in locul euristicii pe primele doua litere din codul fiscal.
|
||||
- **De ce:** dupa reparatia din 27.07, un partener extern cu cod pur numeric ajunge la ANAF si
|
||||
poate primi verdict rosu "Cod fiscal inexistent la ANAF". In MARIUSM_AUTO: 2825 parteneri,
|
||||
dintre care 21 cu alta tara — suprafata mica, dar reala si acum vizibila.
|
||||
- **Decizii deja luate (nu se redeschid):** se verifica dupa tara, nu dupa literele codului;
|
||||
tara necompletata = Romania; respinse explicit de Marius — functie noua cu query per partener
|
||||
si selectia din `VNOM_PARTENERI` ("prea multe join-uri in adresa"). `VALIDARE_CIF` nu se
|
||||
atinge in nicio varianta (folosita in toata suita).
|
||||
- **Ramas de facut:** lantul scurt `NOM_PARTENERI → ADRESE_PARTENERI (principala=1) →
|
||||
SYN_NOM_LOCALITATI → SYN_NOM_JUDETE → SYN_NOM_TARI.PRESCURTARE`, masurat fata de cautarea de
|
||||
azi (28 ms pe filtrul `cont='401' and denumire like 'FA%'`); al doilea drum,
|
||||
`CautPartenerContabilitate` (`ocautare.prg` ~890-960), selecteaza direct din tabela si cere
|
||||
join separat.
|
||||
- **Conditie de intrare:** reclamatii pe parteneri externi marcati rosu, vizibile in logul de
|
||||
discordante (`anaf_verif_cautare`).
|
||||
- **Efort:** M. **Depinde de:** masuratoarea lantului scurt.
|
||||
|
||||
## Amanari review /autoplan — cache ANAF pe ISTORIC_CODURI_FISCALE (29.07.2026)
|
||||
|
||||
Sursa: `docs/design-cache-anaf-istoric-coduri-fiscale.md`, sectiunea GSTACK REVIEW REPORT.
|
||||
|
||||
## P2 — Cascada de ferestre modale la verificarea in masa cu ANAF cazut
|
||||
- **Ce:** `AMESSAGEBOX` este apelat in interiorul buclei pe grupuri din
|
||||
`ANAF_SincronWebService_PlatitorTva` (`COMUN\programe\validare.prg:1968`, `:1970`, `:1976`,
|
||||
`:1993`, `:1996`). La 3000 de parteneri = 30 de grupuri, deci pana la 30 de ferestre modale
|
||||
de inchis manual la o singura rulare de D406.
|
||||
- **De ce:** cu ANAF cazut, plasa de siguranta introdusa de proiectarea din 29.07 lucreaza in
|
||||
spatele acestui zid de modale — castigul e invizibil pentru utilizator. Probabil mai valoros
|
||||
decat cache-ul insusi.
|
||||
- **Fix:** un singur mesaj la sfarsitul rularii (numar de grupuri esuate), nu unul per grup.
|
||||
- **De ce nu acum:** atinge interpretarea raspunsului pe traseul in masa (acelasi cod ca P4 de
|
||||
mai sus), deci cere runda proprie de teste pe declaratie.
|
||||
- **Efort:** S-M. **Depinde de:** mock-ul pe calea batch (T1 din review).
|
||||
|
||||
## P3 — Bucla O(n^2) la imperecherea rezultatului ANAF cu lista de parteneri
|
||||
- **Ce:** `COMUN\clase\overificari.vc2:2722` face `LOCATE FOR ...` liniar in interiorul unui
|
||||
`SCAN` peste cursorul de raspuns ANAF. Costul creste cu patratul numarului de parteneri.
|
||||
- **De ce:** tranșa de cache adauga peste bucla un apel de procedura Oracle per cod, deci
|
||||
ambele cresc pe acelasi traseu.
|
||||
- **Conditie de intrare:** masuratoarea ceruta oricum la E4, pe un lot de ~500 de coduri.
|
||||
Daca timpul e acceptabil, nu se atinge.
|
||||
- **Efort:** M. **Depinde de:** masuratoarea de la E4.
|
||||
|
||||
## P3 — Parsarea sarita cand primul rezultat nu are `dcod_judet`
|
||||
- **Ce:** `COMUN\programe\validare.prg:1986-1994` — daca
|
||||
`found_vfpsafe_[1].adresa_domiciliu_fiscal.dcod_judet` lipseste (cazul unui lot in care toate
|
||||
codurile sunt `notFound`, deci `found` e gol), se afiseaza fereastra de eroare "Serviciul web
|
||||
ANAF intors mesaj de eroare" si nu se parseaza nimic, desi raspunsul e valid.
|
||||
- **De ce:** face ca un lot legitim de coduri inexistente sa arate ca o defectiune de serviciu.
|
||||
- **Efort:** S. **Depinde de:** acelasi contract 404 pe calea batch (P4 de mai sus).
|
||||
|
||||
## P3 — `DATATVAMFIN` ramane text
|
||||
- **Ce:** `VARCHAR2(30)` din 2012, afisat direct la `COMUN\programe\oproceduri_comune.prg:4783`.
|
||||
Noile coloane de interval il fac redundant.
|
||||
- **De ce nu acum:** decizia explicita a proiectarii din 29.07 (Intrebarea deschisa 2).
|
||||
- **Efort:** S. **Depinde de:** livrarea coloanelor de interval.
|
||||
|
||||
## Amanari transa cache ANAF — completare (01.08.2026)
|
||||
|
||||
Sursa: `docs/diff-TRANSA-cache-anaf.md`, `docs/handoff_cache_anaf.md`.
|
||||
|
||||
## P1 — Rulare reala prin `PACK_UPDATE` pe TEST, inainte de prima livrare (decizie de EXECUTIE)
|
||||
- **Ce s-a facut deja:** cele trei scripturi ale transei (`co_2026_07_30_02_RTVAI_PACK_ROARTVAI.sql`,
|
||||
`co_2026_07_31_01_COMUN_ISTORIC_CF.sql`, `ff_2026_07_31_01_COMUN_ISTORIC_CF.sql`) figurau
|
||||
"aplicate" in tabela `versiune` din rulari manuale sqlplus, desi coada reala `UPD_DATABASE` nu
|
||||
avea niciun rand pentru ele. **Randurile s-au curatat** (`CONTAFIN_ORACLE` -9, `MARIUSM_AUTO` -7,
|
||||
`ACN` -1, zero randuri ramase pentru cele trei scripturi) si **toate trei s-au dovedit
|
||||
re-rulabile** (DDL gardat, inserturi `where not exists`, pachete `CREATE OR REPLACE`) — nu mai
|
||||
e nicio decizie tehnica de luat.
|
||||
- **Ce ramane:** doar **executia** propriu-zisa prin `PACK_UPDATE`, netrasa inca.
|
||||
`SCRIPTURI_CLAR` mai contine scripturi straine de transa, neaplicate — daca motorul ia tot ce
|
||||
gaseste pe disc, ar rula si munca in lucru a altcuiva pe un server de test partajat. Banda Oracle
|
||||
stabileste pe sursa daca fluxul se poate limita la cele trei fisiere ale transei.
|
||||
- **Efort:** S. **Depinde de:** decizia lui Marius de a executa `PACK_UPDATE` pe TEST (nimeni n-a
|
||||
apasat butonul inca); detaliu complet `docs\audit-oracle-final.md`.
|
||||
|
||||
## P3 — Export Excel din verificarea in masa (D406/D394) nu duce mai departe provenienta cache
|
||||
- **Ce:** `Programe\orapoarte.prg` (`Copy To ... Type Xl5`) nu adauga `sursa`/`data_sursa` in
|
||||
fisierul exportat — un fisier trimis mai departe nu arata ca o parte din verdicte vin din cache,
|
||||
nu dintr-un raspuns proaspat ANAF.
|
||||
- **De ce nu acum:** cursoarele exportate (`cFacturiTVA` si perechea de la a doua raportare) ar
|
||||
cere o coloana noua, iar `ALTER TABLE ADD COLUMN` pica pe cursor liber cu nume de camp peste 10
|
||||
caractere (`platitortva` are 11) — ar cere rematerializarea cursorului in doua situri de
|
||||
raportare, cu schimbarea formatului unui fisier care ajunge la client. Amanat explicit de
|
||||
Marius, 01.08.2026.
|
||||
- **Efort:** M. **Depinde de:** decizie separata daca merita rematerializarea cursoarelor.
|
||||
|
||||
## P2 — Clarificare cu ANAF: marginea perioadelor scpTVA/splittva/inactiv
|
||||
- **Ce:** cache-ul ANAF (`ISTORIC_CODURI_FISCALE`) foloseste conventie inclusiva la sfarsitul
|
||||
intervalelor `SCPTVA`/`SPLITTVA`/`INACTIV` (spre deosebire de `TVAINCASARE`, aliniat 01.08.2026
|
||||
la conventia exclusiva a RTVAI). Nu exista ground truth local (registru echivalent
|
||||
`rtvai_istoric`) pentru aceste trei campuri.
|
||||
- **De ce:** risc de verdicte gresite cu o zi pe declaratii D394/D406 la marginea perioadelor,
|
||||
acelasi tipar de defect confirmat pe `tvaincasare` (vezi `docs\handoff_cache_anaf.md`,
|
||||
sectiunea A-ter).
|
||||
- **Efort:** S (o intrebare catre ANAF) -> M (aplicarea raspunsului in cod, daca schimba
|
||||
conventia). **Depinde de:** raspunsul ANAF.
|
||||
|
||||
## P3 — Test UI pe gridul de verificare parteneri (coloana de provenienta cache)
|
||||
- **Ce:** confirmare vizuala (paint real, nu doar `EVALUATE` pe `ControlSource`) ca noua coloana
|
||||
de provenienta (`sursa`/`data_sursa`, S8) se afiseaza corect in gridul de verificare.
|
||||
- **De ce nu acum:** cere write-back `.vc2` pe `overificari.vc2`, deci dupa aprobarea lui Marius
|
||||
pe diff.
|
||||
- **Efort:** S. **Depinde de:** aprobarea write-back-ului `.vc2` al transei cache ANAF.
|
||||
|
||||
## Curatenie mediu — randuri orfane in tabela `versiune` (MARIUSM_AUTO)
|
||||
- **Ce:** doua randuri `co_2026_07_30_01_COMUN_ISTORIC_CF.sql` in `MARIUSM_AUTO.versiune`, din
|
||||
testarea manuala a lui S1 dinainte de redenumirea in `ff_`.
|
||||
- **De ce nu acum:** fara efect (motorul `PACK_UPDATE` dispecerizeaza dupa numele fisierului de pe
|
||||
disc, nu dupa stringul din `versiune`) — curatenie de mediu de test, nu de productie.
|
||||
- **Efort:** S. **Depinde de:** nimic, se poate face oricand.
|
||||
|
||||
@@ -1,3 +1,124 @@
|
||||
<!--
|
||||
04/08/2026
|
||||
ROACONT - 2.11.71
|
||||
|
||||
:modificare:
|
||||
Verificare cod fiscal. Starea partenerului arata acum si "TVA la incasare", cu perioada in detalii (F4).
|
||||
|
||||
:modificare:
|
||||
Modificare nota. Lista de explicatii TVA se filtreaza dupa cota TVA a liniei curente.
|
||||
|
||||
:modificare:
|
||||
Borderou eFactura si import eFactura. Bifele de cautare arata in eticheta numarul de documente, inca de la deschiderea ferestrei.
|
||||
|
||||
:modificare:
|
||||
Istoric coduri fiscale. S-au ascuns coloanele nefolosite si s-au adaugat datele venite de la ANAF (TVA la incasare, split TVA, inactiv si perioadele aferente).
|
||||
|
||||
:eroare:
|
||||
Istoric coduri fiscale. Verificarea repetata a aceluiasi cod fiscal nu mai adauga inregistrari inutile in istoric.
|
||||
-->
|
||||
<!--
|
||||
02/08/2026
|
||||
ROACONT - 2.11.70
|
||||
|
||||
:modificare:
|
||||
Verificarea in masa a codurilor fiscale este mai rapida. Cache-ul se citeste pe transe, deci nu mai apare eroare la un numar mare de coduri.
|
||||
|
||||
:eroare:
|
||||
La ANAF se trimit doar codurile fiscale valide. Codurile care nu sunt CUI valid nu mai sunt trimise la fiecare rulare.
|
||||
|
||||
:eroare:
|
||||
Verificarea putea lua din cache un verdict mai vechi. Acum se ia intotdeauna ultima verificare, dupa data ei.
|
||||
|
||||
:nou:
|
||||
Note contabile. La completarea partenerului pentru conturile de parteneri se face si verificarea ANAF, ca la introducerea documentelor.
|
||||
-->
|
||||
<!--
|
||||
01/08/2026
|
||||
ROACONT - 2.11.69
|
||||
|
||||
:nou:
|
||||
S-a introdus un cache pentru verificarea partenerilor la ANAF. Verificarea se face pe serverul ANAF, iar daca acesta nu raspunde se ia din cache-ul din baza de date. Cache-ul are valabilitate de 30 de zile. Verificarea in masa (D406, D394, registre) e mult mai rapida.
|
||||
|
||||
:modificare:
|
||||
Se vede provenienta fiecarui verdict: "ANAF" sau "CACHE <data>". La verificarea in masa, in coloana "Provenienta"; la alegerea partenerului, in fereastra cu datele partenerului.
|
||||
|
||||
:eroare:
|
||||
Verificare TVA la incasare la o data din trecut. Ultima zi a unei perioade deja incheiate era raportata gresit ca activa.
|
||||
-->
|
||||
|
||||
<!--
|
||||
30/07/2026
|
||||
ROACONT - 2.11.68
|
||||
|
||||
:modificare:
|
||||
D406. Se asteapta 2 secunde suplimentare fisierul de erori generat de DUKIntegrator pentru ca fisierul sa fie complet.
|
||||
|
||||
:eroare:
|
||||
S-a corectat o eroare la verificare coduri fiscale daca nu exista internet.
|
||||
-->
|
||||
|
||||
<!--
|
||||
28/07/2026
|
||||
ROACONT - 2.11.67
|
||||
|
||||
:modificare:
|
||||
Borderou eFactura, Import eFactura. Deschiderea listelor de facturi este mult mai rapida.
|
||||
|
||||
Borderou eFactura. Imbunatatiri la potrivirea documentelor cu Registrul de TVA dupa numar document sau suma.
|
||||
Numarul documentului se potriveste si cand a fost introdus in contabilitate fara separatori (eFactura "40-33-129052" introdusa ca 4033129052). Doua facturi cu aceeasi valoare, acelasi partener si aceeasi zi nu mai apar cu valoare dubla fata de Registrul de TVA.
|
||||
|
||||
Facturile colorate "turcoaz" = eFactura exista in Registrul de TVA, dar valoarea difera cu peste 0,15 lei (sau diferenta nu se poate calcula - ex: eFactura in valuta)
|
||||
Facturile colorate "gri" = eFactura nu se regaseste in Registrul de TVA (nu s-a introdus in contabilitate sau nu s-a potrivit numarul si nici suma)
|
||||
-->
|
||||
|
||||
<!--
|
||||
28/07/2026
|
||||
ROACONT - 2.11.66
|
||||
|
||||
:modificare:
|
||||
Borderou eFactura, facturi primite. Facturile cu taxare inversa nu mai apar colorate ca avand diferenta fata de Registrul Cumparari. In eFactura taxarea inversa are TVA zero, dar in contabilitate se inregistreaza 4426 = 4427, iar diferenta afisata tine cont acum de acest TVA.
|
||||
|
||||
:nou:
|
||||
Note contabile Exigibilizare TVA. La salvarea notei se avertizeaza daca nu s-a adaugat nota de TVA exigibilizat pentru incasarile/platile aferente facturilor cu TVA la incasare.
|
||||
|
||||
:modificare:
|
||||
Registre TVA. Corectare filtru "Diferenta sold" si lista TVA-ului exigibilizat din plati iau in calcul si facturile cu TVA neexigibil 24% sau 20%.
|
||||
|
||||
:nou:
|
||||
D406 SAF-T. La validarea cu erori se deschide si un fisier de erori pe intelesul utilizatorului: pentru fiecare eroare - pagina, pozitia, partenerul sau contul in cauza si cum se rezolva. Erorile fictive "Cod taxa nu se afla in lista" (bug al validatorului ANAF) sunt separate la sfarsit si se pot ignora.
|
||||
|
||||
:modificare:
|
||||
Alegere partener. Starea de TVA de la ANAF arata si perioada de cand este valabila.
|
||||
Alegere partener. La CNP/CUI invalid se afiseaza "Persoana fizica - CNP corect", respectiv "Cod fiscal invalid - nu s-a interogat ANAF".
|
||||
Corectare salvare optiune verificare ANAF la alegere partener "Initializari > Optiuni utilizator > "Verificare ANAF la alegerea partenerului".
|
||||
-->
|
||||
|
||||
<!--
|
||||
27/07/2026
|
||||
ROACONT - 2.11.65
|
||||
|
||||
:nou:
|
||||
Alegere partener. Pe randul curent din lista se afiseaza starea partenerului la ANAF, la data documentului: platitor sau neplatitor de TVA, inactiv la ANAF, cod fiscal invalid sau inexistent la ANAF. Discordantele fata de nomenclator apar cu rosu.
|
||||
|
||||
Tasta F4 (sau click pe mesajul de stare) deschide detaliile verificarii ANAF si se poate inlocui partenerul ales cu varianta corecta.
|
||||
|
||||
Daca serviciul ANAF nu raspunde, mesajul arata ca verificarea a fost sarita si se reia dupa cateva minute, fara sa blocheze lucrul.
|
||||
|
||||
:nou:
|
||||
Optiune per utilizator pentru afisarea starii ANAF in cautarea de partener si pentru confirmarea la alegerea unui partener cu discordanta (implicit se afiseaza doar starea, fara confirmare). Se schimba din Initializari > Optiuni utilizator > "Verificare ANAF la alegerea partenerului".
|
||||
|
||||
:nou:
|
||||
D406 SAF-T > Initializari cod taxa/plata > "Stergere CNP-uri invalide". Se sterg CNP-urile invalide de pe partenerii din Romania din declaratie, tip persoana fizica sau cu coduri fiscale mai lungi de 10 cifre.
|
||||
|
||||
D406 SAF-T. Daca validarea XML se termina cu erori, codurile de partener respinse de validatorul ANAF se afiseaza intr-un mesaj si se pot exporta in Excel.
|
||||
|
||||
:modificare:
|
||||
D406 SAF-T. Verificare Solduri clienti/furnizori. Se verifica codurile fiscale pentru toti partenerii din declaratie si aplica regulile de format ale validatorului ANAF (numai cifre, fara zero la inceput, exact 13 cifre la CNP, maxim 10 la CUI), pe langa cifra de control.
|
||||
|
||||
Mesajul arata separat cate coduri sunt CNP si cate CUI, iar butonul "Verificare coduri fiscale" exporta lista completa in Excel, pentru corectarea lor in nomenclatorul de parteneri.
|
||||
-->
|
||||
|
||||
<!--
|
||||
24/07/2026
|
||||
ROACONT - 2.11.64
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
@echo off
|
||||
powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\roa_sync.ps1 -ProjectRoot "%~dp0."
|
||||
@echo off
|
||||
powershell -ExecutionPolicy Bypass -File "%~dp0COMUN\scripts\roa_sync.ps1" -ProjectRoot "%~dp0."
|
||||
|
||||
@@ -25,7 +25,7 @@ _LegalTrademark = ""
|
||||
_ProductName = "ROA - Financiar Contabilitate"
|
||||
_MajorVer = "2"
|
||||
_MinorVer = "11"
|
||||
_Revision = "64"
|
||||
_Revision = "70"
|
||||
_LanguageID = "Romana"
|
||||
_AutoIncrement = "0"
|
||||
*</DevInfo>
|
||||
|
||||
@@ -1 +1 @@
|
||||
2026_05_18_01
|
||||
2026_08_02_01
|
||||
Reference in New Issue
Block a user