Compare commits

...

28 Commits

Author SHA1 Message Date
3af008992c sync SVN r18006: inregistreaza ofacturare_editare.prg
SET PROCEDURE TO ofacturare_editare.prg ADDITIVE, langa ofacturare_comun.prg.
Fara el, pagina de articole ale facturii nu apare in registrul jurnal >
modificare; clasa comuna are garda si degradeaza fara eroare, dar pagina
lipseste.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SN8snvkk94KuhWwoXUUey3
2026-08-08 16:48:31 +03:00
b3cbeef691 changelog 2.11.71
Intrarea versiunii curente, rescrisa pentru forma finala a numarului de pe bifele eFactura
(borderou si import, de la deschidere).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01D8Ham1HJ8BB2v9nbtWgdZq
2026-08-07 00:00:26 +03:00
db22b1acf9 CLAUDE.md: cautare pe simboluri VFP (vfp_symbols.ps1)
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A5okKjUKMM5Xk1egq2w81P
2026-08-03 08:55:58 +03:00
82ab6209f6 2.11.70 2026-08-02 11:51:20 +03:00
5756a5a8ec versiune_db 2026_08_02_05 (SVN r17944)
Cere co_2026_08_02_05_COMUN_PACK_ISTORIC_CF.sql (SVN r17942): PLATITORTVAMFIN nu mai produce
un rand nou in ISTORIC_CODURI_FISCALE la fiecare verificare ANAF.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018LkXBVHUNkb7Quq36TfQcs
2026-08-02 11:48:59 +03:00
140ba162de sync SVN r17932
roacont.pj2: revizia produsului 2.11.68 -> 2.11.69 (bump facut la build-ul anterior).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JCzVWfqscv1xyo5uvJiWiW
2026-08-02 07:42:20 +03:00
6afaad03bf changelog 2.11.69 2026-08-02 01:39:32 +03:00
ea977c7bfc Cache ANAF: ordine explicita pe rapoartele de incasari, changelog 2.11.68-2.11.69
- Programe/orapoarte.prg:1994 - verificarea split TVA pe o data din trecut
  cere explicit ordinea MASA (cache intai); :2312 - varianta pe data curenta
  cere UNIC (ANAF intai, cache-ul ramane plasa de siguranta).
- changelog_roacont.txt - intrarile 2.11.68 si 2.11.69.
- versiune_db.txt - 2026_08_01_02.
- CLAUDE.md - regula de continut pentru changelog si stilul de raspuns cerut.
- TODOS.md - amanarile din review-ul transei cache ANAF, P4 marcat preluat.
- roacont.pj2 - resincronizat cu git_sync.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JCzVWfqscv1xyo5uvJiWiW
2026-08-02 01:32:00 +03:00
265ba78b0a saft astept 2 secunde pentru deschiderea fisierului de erori 2026-07-30 13:52:19 +03:00
17eea3b64a Borderou eFactura: potrivire numar fara separatori, versiune_db 2026_07_29_01
Changelog 2.11.67: numarul documentului se potriveste si cand a fost introdus in
contabilitate fara separatori (eFactura "40-33-129052" introdusa ca 4033129052),
iar doua facturi cu aceeasi valoare, acelasi partener si aceeasi zi nu mai apar
cu valoare dubla fata de Registrul de TVA.

Modificarea efectiva e in view-urile anaf_vefactura_primit/trimis, script
DATABASE/SCRIPTURI_CLAR/2026/07/ff_2026_07_29_01_COMUN_EFACTURA.sql (doar SVN,
nu e in acest repo): concatenarea cifrelor din xnumar_act adaugata in lista IN,
limita de lungime 12 -> 14 (act.nract e N(14) in programe), avg in loc de sum pe
rezerva de potrivire dupa valoare.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FW7zDopcHo2fHq5L53MjMM
2026-07-29 12:30:33 +03:00
26c33e03a2 changelog 2.11.67: import eFactura mai rapid si explicatia culorilor
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FW7zDopcHo2fHq5L53MjMM
2026-07-29 00:31:47 +03:00
8999a5339f 2.11.67 2026-07-28 23:35:35 +03:00
bc5ff8211f Borderou eFactura: changelog 2.11.67 si versiune_db
Insotesc modificarile din COMUN (potrivire sargabila cu registrul de TVA, rezerva pe
suma prin COALESCE, prag galben 0.15, jcnt eliminat). versiune_db trece la
2026_07_28_03, scriptul corespunzator fiind ff_2026_07_28_03_COMUN_EFACTURA.sql.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FW7zDopcHo2fHq5L53MjMM
2026-07-28 23:31:23 +03:00
53ef674f70 ROACONT - 2.11.66 2026-07-28 16:08:30 +03:00
f2e539629e Merge claude/anaf-tva-efactura: registre 2025, exigibilizare TVA, verificare ANAF 2026-07-28 15:12:58 +03:00
869403cd3e Registre 2025: cotele 24/20 la soldul neexigibil; exigibilizare TVA reparata
frm_regcump2025 / frm_regvanz2025 au fost derivate din clasele 2010 INLOCUIND
cotele 24/20 cu 11/21, in loc sa le adauge. Consecinta: filtrul "Diferenta sold"
si lista TVA-ului exigibilizat din plati pierdeau facturile cu TVA neexigibil la
24% sau 20% - adica exact facturile vechi cu TVA la incasare, cele carate din
perioade anterioare, care sunt rostul filtrului. Corectate 6 filtre, formula de
sold din frm_regvanz2025 (care omitea complet RO20/RO24, spre deosebire de
geamana ei de la cumparari) si lista de coloane selectate.

Clasele frm_regcump2010 / frm_regvanz2010 raman neatinse: enumera 24/20/19/9/5 si
e corect asa - se folosesc doar pe perioade dinainte de cotele 21/11, iar cursorul
lor actcv nici nu are coloanele ro11*/ro21*.

inchidere_tva_sold:
- soldn21/soldn11 si ro21nt/ro11nt se citesc doar daca exista in cursor.
  Registrele de dinainte de 2025 nu le emit, de unde eroarea VFP la apasarea
  butonului de exigibilizare pe orice perioada anterioara.
- cota 21 nu era luata in calcul: `Iif(m.lnCota = 21, ...)` intr-o bucla
  For 1 To 7, deci lnSuma21 era cod mort, iar la cota 6 se lua soldul de 11% cu
  1.21. Linia imediat urmatoare folosea deja corect `= 6`.
- 8 variabile adaugate in Local; deveneau PRIVATE si se scurgeau in stiva de apel.

Scoase 37 `SET STEP ON` ramase in cod (35 in ovanzcump.vc2, 2 in
oproceduri_inchidere.prg); deschideau depanatorul la fiecare rulare din IDE.

Changelog 2.11.66. Sterse handoff-urile, planurile si patch-urile de review ale
lucrarii ANAF/TVA/eFactura; .gitignore acopera acum docs/diff_*.patch, nu doar
docs/diff_runda*.patch.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DhJwsrFFe1ZNAAtS8Twuti
2026-07-28 15:12:51 +03:00
8b5a670ff1 Transa 2: changelog 2.11.68, versiune_db, plan cu semnatura oExecute si decizia pe N
Plan completat: tlReconnect e al 8-lea parametru din oExecute si e implicit .T., deci transa 3
trebuie sa-l paseze .F. explicit. N din dialogul transei 3 numara facturi distincte (decizie
marius.mutu, 28.07.2026).

SVN r17914; script DB in DATABASE r17912.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DhJwsrFFe1ZNAAtS8Twuti
2026-07-28 08:23:40 +03:00
57c5fcb5d6 gitignore: docs/local (exporturi Oracle de referinta, ca la ROAGEST)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DhJwsrFFe1ZNAAtS8Twuti
2026-07-28 00:51:03 +03:00
7cd7d57708 Transa 1 ANAF TVA: changelog 2.11.67, plan corectat pe date, handoff-uri de verificare
Plan corectat in patru puncte confirmate pe Oracle:
- lista de coloane de taxare inversa are 13 termeni, nu 10 (TI19T/TI09T nu exista pe jc2007;
  expresia din oproceduri_decont.prg:8670 e scrisa peste view-ul VJC2025, cu aliasuri calculate)
- tva_incasare nu exista pe jc2007/jv2007; interogarea transei 3 merge pe VJC2025/VJV2025
- kill-switch-ul nu se face in Optiuni_FIRMA/PROGRAM.dbf, ci pe modelul RC_ANAF_VERIF_SELECTIE
  (INI + optiuni Oracle + intrare de meniu)
- oExecute deschide dialog de reconectare cu QUIT pe conexiune cazuta; apelul din transa 3 trebuie
  sa dezactiveze explicit reconectarea

SVN r17910/r17911.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DhJwsrFFe1ZNAAtS8Twuti
2026-07-28 00:50:26 +03:00
58655dac6e changelog 2.11.66 mai compact
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ExTWMJbKantwNvL6AtEwzH
2026-07-27 20:19:56 +03:00
0c9255842d D406 SAF-T: raport erori validator pe intelesul utilizatorului
La validarea cu erori se genereaza <xml>_explicat.txt: un rand pe eroare
(pagina, pozitie, partener/cont identificat, explicatie) + sectiunea
"Cum rezolvati". Erorile fictive TaxCode "nu se afla in lista" (bug
DUKIntegrator) sunt separate si ignorabile. Se deschid ambele fisiere,
raportul explicat deasupra; chatbot-ul primeste doar erorile reale.
Mesajul separat de parteneri respinsi + exportul Excel eliminate din flux.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ExTWMJbKantwNvL6AtEwzH
2026-07-27 20:18:49 +03:00
1ae9d3f14a versiune 2026-07-27 16:45:54 +03:00
5bc2cb82f1 Verificare ANAF la alegerea partenerului: 404, disponibilitate serviciu (docs)
Design doc REVIZIA 5: contractul 404 (verdict "inexistent" doar cand raspunsul
contine chiar codul cerut), starile serviciului pe sesiune si banda cand ANAF nu
raspunde, cache doar pe verdicte pozitive, codul nenumeric.

Changelog: intrarea 2.11.65 descrie comportamentul asa cum ajunge la utilizator -
functionalitatea nu a fost inca livrata, deci corectiile din interiorul ei nu se
pomenesc separat.

TODOS: contractul 404 pe drumul batch (P4) si verificarea dupa tara partenerului
(P5), amanate explicit.

Codul: COMUN 95cf54e.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DhJwsrFFe1ZNAAtS8Twuti
2026-07-27 16:25:18 +03:00
96577f0005 roa_sync.bat: cheama COMUN\scripts\roa_sync.ps1
Scriptul de sync s-a mutat din UTIL\foxbin2prg in COMUN\scripts (SVN r17902,
se distribuie prin svn update); vechea cale ramane doar stub.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AvccPZXr4A9ihcTtExNoJT
2026-07-27 12:09:58 +03:00
3b9ca92b96 versiune 2026-07-27 01:29:50 +03:00
5b0a3321db Verificare ANAF la alegerea partenerului: opt-in pe introducerea de documente
Cablarea din ROACONT pentru verificarea ANAF implementata in COMUN (ocautare.prg):

- ointroduceri_cont.vc2: 6 apeluri de cautare partener trec lVerificaANAF=1
  (frm_introd_compact, frm_introd_compact2007, frm_note, frm_note2007), plus
  frm_plati_impozite prin caut_parteneri. Raman fara verificare cautarile de
  responsabili, achizitor, casa si creditor.
- cont2000.mn2: punct de meniu Initializari > Optiuni utilizator >
  "Verificare ANAF la alegerea partenerului" (DO ANAF_ComutaVerificare IN ocautare.prg).
- roacont.prg: incarcarea procedurilor necesare verificarii.
- oproceduri_import.prg: la importul cu cod fiscal discordant se cere confirmare
  in loc sa se aleaga tacit.
- changelog 2.11.65 si documentul de design al functionalitatii.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019H3r66sVojGhgaKq5niu1u
2026-07-27 01:29:20 +03:00
a284dd3530 D406 SAF-T: verificare coduri fiscale pe toata declaratia + erori validator ANAF
Stergere CNP-uri invalide:
- bucla de update nu rula niciodata (export2xlsx lasa pointerul pe EOF, iar SCAN WHILE
  are scope implicit REST) - GO TOP + SCAN, cu Exit la eroare
- candidatii se iau din cursoarele declaratiei, cu criteriile verificarii, nu dintr-un
  query separat pe balanta_parteneri

Verificare coduri fiscale (do_verifica_cui):
- acopera toti partenerii exportati in XML, nu doar cei cu is_activ = 1
- CodFiscalValidSaft: regulile de format ale validatorului ANAF (numai cifre, fara zero
  la inceput, 13 cifre la CNP, 2-10 la CUI) peste cifra de control; VALIDARE_CIF accepta
  litere la inceput si VALIDARE_CNP accepta prima cifra 0
- lista codurilor invalide in cursor + export xlsx (rand, partener, cod, CNP/CUI),
  mesaj cu defalcare CNP/CUI
- corectat "Variable 'LCTEXT' is not found" (m.lcText inexistent in procedura)

do_erori_partener_saft: extrage din fisierul de raspuns al validatorului codurile de
partener respinse (pagina Customers/Suppliers, randul, codul, partenerul) si le afiseaza
la finalul validarii, cu export xlsx optional.

changelog 2.11.65

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013dL9LNnmeY8nELjTLYiGJH
2026-07-26 18:22:38 +03:00
22ea278001 D406 SAF-T: stergere CNP-uri invalide + verificare coduri fiscale
- optiune noua in meniul "Initializari cod taxa/plata": "Stergere CNP-uri
  invalide la persoanele fizice din declaratie" -> StergereCnpInvalid()
- StergereCnpInvalid(): selecteaza partenerii cu rulaje in perioada
  declaratiei si cod fiscal numeric (persoana fizica sau peste 10 cifre),
  filtreaza cu ValidCNP(), exporta lista in xlsx, cere confirmare si sterge
  codul fiscal eronat (tip_persoana = 2), in transe de 1000 de id_part
- do_verifica_cui(): la butonul "2. Verifica" se valideaza si codurile
  fiscale ale partenerilor activi in perioada (CNP prin VALIDARE_CNP, CUI
  prin VALIDARE_CIF) si se completeaza mesajul cu numarul de randuri
  invalide si modul de corectare

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016PUq4G8Yzfij6Dz5AuZGT2
2026-07-24 22:20:10 +03:00
15 changed files with 1248 additions and 101 deletions

4
.gitignore vendored
View File

@@ -103,3 +103,7 @@ roacont_ref.FPT
# --- COMUN este gestionat separat, prin propriul sau git (romfast/comun.git) --- # --- COMUN este gestionat separat, prin propriul sau git (romfast/comun.git) ---
COMUN/ COMUN/
docs/diff_*.patch
.gstack/
docs/local/

View File

@@ -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). (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`. 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 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 SVN (and `.db2` whose table left the per-project list) and reports it, so git records the
deletion. deletion.
@@ -58,15 +77,12 @@ carry data, not just structure) are committed to git but sit in SVN global-ignor
### Branching (git) ### Branching (git)
Two lanes in the git mirror: Two lanes in the git mirror: **`main`** receives ONLY `sync SVN rN` commits, made from a clean
- **`main` = SVN mirror**: receives ONLY `sync SVN rN` commits, made from a clean tree (right tree (right after `svn update`, before local work); **Claude works on a branch** `claude/<subiect>`
after `svn update`, before local work). `git diff main..claude/<subiect>` then shows exactly and commits only there, so `git diff main..claude/<subiect>` shows exactly and only Claude's work.
and only Claude's work. The branch closes once the changes land in SVN (user runs `svn commit`).
- **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 Full model and hygiene rules: `COMUN\docs\fluxul_svn_git.md`.
`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).
## Building / running ## 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), Tags in use: `:nou:` (new feature), `:modificare:` (change/fix to existing behavior),
`:eroare:` (bug fix), `:adaugare:` (addition). Version numbers increment per entry (current `: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 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 (`.vcx`/`.scx`), diff-ul lizibil se face pe forma text `.vc2`/`.sc2` regenerata cu
`git_sync.ps1`, inainte de write-back cu `txt2vcx.ps1`. `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 ## Skill routing
When the user's request matches an available skill, invoke it via the Skill tool. When in doubt, invoke the skill. When the user's request matches an available skill, invoke it via the Skill tool. When in doubt, invoke the skill.

View File

@@ -922,7 +922,9 @@ DEFINE CLASS frm_introd_compact AS formtermin OF "..\comun\clase\baza.vcx"
PARAMETERS tcCont, lcCampId, lcCampNume PARAMETERS tcCont, lcCampId, lcCampNume
lcCont = ALLTRIM(tcCont) 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) If !Empty(locauta.nume)
lnid_part=locauta.id_part 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 PARAMETERS tcCont, lcCampId, lcCampNume
lcCont = ALLTRIM(tcCont) 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) If !Empty(locauta.nume)
lnid_part=locauta.id_part lnid_part=locauta.id_part
@@ -7087,7 +7091,9 @@ DEFINE CLASS frm_note AS formtermin OF "..\comun\clase\baza.vcx"
ENDIF 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 SELECT actactan
REPLACE id_partd WITH loCauta.id_part, partd WITH locauta.nume 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 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 SELECT actactan
REPLACE id_partc WITH loCauta.id_part, partc WITH locauta.nume 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 lnsucces=1
If lnrezultat>0 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 Select actactan
Replace id_partd With loCauta.id_part, partd With loCauta.nume Replace id_partd With loCauta.id_part, partd With loCauta.nume
IF lnIdPartd <> loCauta.id_part IF lnIdPartd <> loCauta.id_part
@@ -8969,7 +8979,9 @@ DEFINE CLASS frm_note2007 AS formtermin OF "..\comun\clase\baza.vcx"
If lnsucces=1 If lnsucces=1
If lnrezultat>0 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 Select actactan
Replace id_partc With loCauta.id_part, partc With loCauta.nume Replace id_partc With loCauta.id_part, partc With loCauta.nume
IF lnIdPartc <> loCauta.id_part 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 SELECT c_part
IF valoare > 0 IF valoare > 0
lcTitlu = 'Nume partener ' + lcCont 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) If !Empty(locauta.denumire) AND !EMPTY(locauta.id_part)
lnid_part=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 SELECT c_part
IF valoare > 0 IF valoare > 0
lcTitlu = 'Nume partener ' + lcCont 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) If !Empty(locauta.denumire) AND !EMPTY(locauta.id_part)
lnid_part=locauta.id_part lnid_part=locauta.id_part

View File

@@ -20865,7 +20865,6 @@ DEFINE CLASS frm_deconttva AS _frmbase OF "..\comun\clase\_frm_base.vcx"
Set Date To Ymd Set Date To Ymd
Set Mark To '-' Set Mark To '-'
SET STEP ON
lcNumePrenumeDeclarant = Alltrim(NVL(gofirma.declarant,'')) lcNumePrenumeDeclarant = Alltrim(NVL(gofirma.declarant,''))
lcNumeDeclarant = lcNumePrenumeDeclarant lcNumeDeclarant = lcNumePrenumeDeclarant
lcPrenumeDeclarant = "" lcPrenumeDeclarant = ""
@@ -21063,7 +21062,6 @@ DEFINE CLASS frm_deconttva AS _frmbase OF "..\comun\clase\_frm_base.vcx"
Set Date To Ymd Set Date To Ymd
Set Mark To '-' Set Mark To '-'
Set Step On
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,'')) lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
lcNumeDeclarant = lcNumePrenumeDeclarant lcNumeDeclarant = lcNumePrenumeDeclarant
lcPrenumeDeclarant = "" lcPrenumeDeclarant = ""
@@ -21274,7 +21272,6 @@ DEFINE CLASS frm_deconttva AS _frmbase OF "..\comun\clase\_frm_base.vcx"
Set Date To Ymd Set Date To Ymd
Set Mark To '-' Set Mark To '-'
Set Step On
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,'')) lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
lcNumeDeclarant = lcNumePrenumeDeclarant lcNumeDeclarant = lcNumePrenumeDeclarant
lcPrenumeDeclarant = "" lcPrenumeDeclarant = ""
@@ -21485,7 +21482,6 @@ DEFINE CLASS frm_deconttva AS _frmbase OF "..\comun\clase\_frm_base.vcx"
Set Date To Ymd Set Date To Ymd
Set Mark To '-' Set Mark To '-'
Set Step On
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,'')) lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
lcNumeDeclarant = lcNumePrenumeDeclarant lcNumeDeclarant = lcNumePrenumeDeclarant
lcPrenumeDeclarant = "" lcPrenumeDeclarant = ""
@@ -22921,7 +22917,6 @@ DEFINE CLASS frm_deconttva_201601 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
Set Date To Ymd Set Date To Ymd
Set Mark To '-' Set Mark To '-'
SET STEP ON
lcNumePrenumeDeclarant = Alltrim(NVL(gofirma.declarant,'')) lcNumePrenumeDeclarant = Alltrim(NVL(gofirma.declarant,''))
lcNumeDeclarant = lcNumePrenumeDeclarant lcNumeDeclarant = lcNumePrenumeDeclarant
lcPrenumeDeclarant = "" lcPrenumeDeclarant = ""
@@ -23119,7 +23114,6 @@ DEFINE CLASS frm_deconttva_201601 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
Set Date To Ymd Set Date To Ymd
Set Mark To '-' Set Mark To '-'
Set Step On
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,'')) lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
lcNumeDeclarant = lcNumePrenumeDeclarant lcNumeDeclarant = lcNumePrenumeDeclarant
lcPrenumeDeclarant = "" lcPrenumeDeclarant = ""
@@ -23330,7 +23324,6 @@ DEFINE CLASS frm_deconttva_201601 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
Set Date To Ymd Set Date To Ymd
Set Mark To '-' Set Mark To '-'
Set Step On
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,'')) lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
lcNumeDeclarant = lcNumePrenumeDeclarant lcNumeDeclarant = lcNumePrenumeDeclarant
lcPrenumeDeclarant = "" lcPrenumeDeclarant = ""
@@ -23541,7 +23534,6 @@ DEFINE CLASS frm_deconttva_201601 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
Set Date To Ymd Set Date To Ymd
Set Mark To '-' Set Mark To '-'
Set Step On
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,'')) lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
lcNumeDeclarant = lcNumePrenumeDeclarant lcNumeDeclarant = lcNumePrenumeDeclarant
lcPrenumeDeclarant = "" lcPrenumeDeclarant = ""
@@ -25155,7 +25147,6 @@ DEFINE CLASS frm_deconttva_201701 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
Set Date To Ymd Set Date To Ymd
Set Mark To '-' Set Mark To '-'
SET STEP ON
lcNumePrenumeDeclarant = Alltrim(NVL(gofirma.declarant,'')) lcNumePrenumeDeclarant = Alltrim(NVL(gofirma.declarant,''))
lcNumeDeclarant = lcNumePrenumeDeclarant lcNumeDeclarant = lcNumePrenumeDeclarant
lcPrenumeDeclarant = "" lcPrenumeDeclarant = ""
@@ -25353,7 +25344,6 @@ DEFINE CLASS frm_deconttva_201701 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
Set Date To Ymd Set Date To Ymd
Set Mark To '-' Set Mark To '-'
Set Step On
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,'')) lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
lcNumeDeclarant = lcNumePrenumeDeclarant lcNumeDeclarant = lcNumePrenumeDeclarant
lcPrenumeDeclarant = "" lcPrenumeDeclarant = ""
@@ -25564,7 +25554,6 @@ DEFINE CLASS frm_deconttva_201701 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
Set Date To Ymd Set Date To Ymd
Set Mark To '-' Set Mark To '-'
Set Step On
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,'')) lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
lcNumeDeclarant = lcNumePrenumeDeclarant lcNumeDeclarant = lcNumePrenumeDeclarant
lcPrenumeDeclarant = "" lcPrenumeDeclarant = ""
@@ -25775,7 +25764,6 @@ DEFINE CLASS frm_deconttva_201701 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
Set Date To Ymd Set Date To Ymd
Set Mark To '-' Set Mark To '-'
Set Step On
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,'')) lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
lcNumeDeclarant = lcNumePrenumeDeclarant lcNumeDeclarant = lcNumePrenumeDeclarant
lcPrenumeDeclarant = "" lcPrenumeDeclarant = ""
@@ -25997,7 +25985,6 @@ DEFINE CLASS frm_deconttva_201701 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
Set Date To Ymd Set Date To Ymd
Set Mark To '-' Set Mark To '-'
Set Step On
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,'')) lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
lcNumeDeclarant = lcNumePrenumeDeclarant lcNumeDeclarant = lcNumePrenumeDeclarant
lcPrenumeDeclarant = "" lcPrenumeDeclarant = ""
@@ -26221,7 +26208,6 @@ DEFINE CLASS frm_deconttva_201701 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
Set Date To Ymd Set Date To Ymd
Set Mark To '-' Set Mark To '-'
Set Step On
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,'')) lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
lcNumeDeclarant = lcNumePrenumeDeclarant lcNumeDeclarant = lcNumePrenumeDeclarant
lcPrenumeDeclarant = "" lcPrenumeDeclarant = ""
@@ -26425,7 +26411,6 @@ DEFINE CLASS frm_deconttva_201701 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
Set Date To Ymd Set Date To Ymd
Set Mark To '-' Set Mark To '-'
Set Step On
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,'')) lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
lcNumeDeclarant = lcNumePrenumeDeclarant lcNumeDeclarant = lcNumePrenumeDeclarant
lcPrenumeDeclarant = "" lcPrenumeDeclarant = ""
@@ -26631,7 +26616,6 @@ DEFINE CLASS frm_deconttva_201701 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
Set Date To Ymd Set Date To Ymd
Set Mark To '-' Set Mark To '-'
Set Step On
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,'')) lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
lcNumeDeclarant = lcNumePrenumeDeclarant lcNumeDeclarant = lcNumePrenumeDeclarant
lcPrenumeDeclarant = "" lcPrenumeDeclarant = ""
@@ -26835,7 +26819,6 @@ DEFINE CLASS frm_deconttva_201701 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
Set Date To Ymd Set Date To Ymd
Set Mark To '-' Set Mark To '-'
Set Step On
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,'')) lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
lcNumeDeclarant = lcNumePrenumeDeclarant lcNumeDeclarant = lcNumePrenumeDeclarant
lcPrenumeDeclarant = "" lcPrenumeDeclarant = ""
@@ -28466,7 +28449,6 @@ DEFINE CLASS frm_deconttva_202601 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
Set Date To Ymd Set Date To Ymd
Set Mark To '-' Set Mark To '-'
SET STEP ON
lcNumePrenumeDeclarant = Alltrim(NVL(gofirma.declarant,'')) lcNumePrenumeDeclarant = Alltrim(NVL(gofirma.declarant,''))
lcNumeDeclarant = lcNumePrenumeDeclarant lcNumeDeclarant = lcNumePrenumeDeclarant
lcPrenumeDeclarant = "" lcPrenumeDeclarant = ""
@@ -28664,7 +28646,6 @@ DEFINE CLASS frm_deconttva_202601 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
Set Date To Ymd Set Date To Ymd
Set Mark To '-' Set Mark To '-'
Set Step On
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,'')) lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
lcNumeDeclarant = lcNumePrenumeDeclarant lcNumeDeclarant = lcNumePrenumeDeclarant
lcPrenumeDeclarant = "" lcPrenumeDeclarant = ""
@@ -28875,7 +28856,6 @@ DEFINE CLASS frm_deconttva_202601 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
Set Date To Ymd Set Date To Ymd
Set Mark To '-' Set Mark To '-'
Set Step On
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,'')) lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
lcNumeDeclarant = lcNumePrenumeDeclarant lcNumeDeclarant = lcNumePrenumeDeclarant
lcPrenumeDeclarant = "" lcPrenumeDeclarant = ""
@@ -29086,7 +29066,6 @@ DEFINE CLASS frm_deconttva_202601 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
Set Date To Ymd Set Date To Ymd
Set Mark To '-' Set Mark To '-'
Set Step On
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,'')) lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
lcNumeDeclarant = lcNumePrenumeDeclarant lcNumeDeclarant = lcNumePrenumeDeclarant
lcPrenumeDeclarant = "" lcPrenumeDeclarant = ""
@@ -29308,7 +29287,6 @@ DEFINE CLASS frm_deconttva_202601 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
Set Date To Ymd Set Date To Ymd
Set Mark To '-' Set Mark To '-'
Set Step On
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,'')) lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
lcNumeDeclarant = lcNumePrenumeDeclarant lcNumeDeclarant = lcNumePrenumeDeclarant
lcPrenumeDeclarant = "" lcPrenumeDeclarant = ""
@@ -29532,7 +29510,6 @@ DEFINE CLASS frm_deconttva_202601 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
Set Date To Ymd Set Date To Ymd
Set Mark To '-' Set Mark To '-'
Set Step On
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,'')) lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
lcNumeDeclarant = lcNumePrenumeDeclarant lcNumeDeclarant = lcNumePrenumeDeclarant
lcPrenumeDeclarant = "" lcPrenumeDeclarant = ""
@@ -29736,7 +29713,6 @@ DEFINE CLASS frm_deconttva_202601 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
Set Date To Ymd Set Date To Ymd
Set Mark To '-' Set Mark To '-'
Set Step On
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,'')) lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
lcNumeDeclarant = lcNumePrenumeDeclarant lcNumeDeclarant = lcNumePrenumeDeclarant
lcPrenumeDeclarant = "" lcPrenumeDeclarant = ""
@@ -29942,7 +29918,6 @@ DEFINE CLASS frm_deconttva_202601 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
Set Date To Ymd Set Date To Ymd
Set Mark To '-' Set Mark To '-'
Set Step On
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,'')) lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
lcNumeDeclarant = lcNumePrenumeDeclarant lcNumeDeclarant = lcNumePrenumeDeclarant
lcPrenumeDeclarant = "" lcPrenumeDeclarant = ""
@@ -30146,7 +30121,6 @@ DEFINE CLASS frm_deconttva_202601 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
Set Date To Ymd Set Date To Ymd
Set Mark To '-' Set Mark To '-'
Set Step On
lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,'')) lcNumePrenumeDeclarant = Alltrim(Nvl(gofirma.declarant,''))
lcNumeDeclarant = lcNumePrenumeDeclarant lcNumeDeclarant = lcNumePrenumeDeclarant
lcPrenumeDeclarant = "" 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 ; *!* 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,'')) ) *!* (Select Padl(nract,14,'0') + '|' + Dtos(dataact) + '|' + Padr(denumire,100,' ') From cListRC WHERE !EMPTY(NVL(denumire,'')) )
*!* Endif *!* Endif
SET STEP ON
WAIT WINDOW 'TVA exigibilizat din plati facturi cu TVA Incasare' NOWAIT WAIT WINDOW 'TVA exigibilizat din plati facturi cu TVA Incasare' NOWAIT
*** ADAUG TVA INCASARE (DIN INCASARI/PLATI, TVA 4427 LA 90 ZILE) *** ADAUG TVA INCASARE (DIN INCASARI/PLATI, TVA 4427 LA 90 ZILE)
TEXT to m.lcSql textmerge noshow TEXT to m.lcSql textmerge noshow
@@ -42642,14 +42615,14 @@ DEFINE CLASS frm_regcump2025 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
from vjc2010 from vjc2010
where an = <<m.gnAn>> where an = <<m.gnAn>>
and luna = <<m.gnLuna>> 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) and tva_incasare = 1)
group by id_fact, cont) ip group by id_fact, cont) ip
on jc.id_fact = ip.id_fact on jc.id_fact = ip.id_fact
where jc.an = <<m.gnAn>> where jc.an = <<m.gnAn>>
and jc.luna = <<m.gnLuna>> and jc.luna = <<m.gnLuna>>
and jc.tva_incasare = 1 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 and nvl(ip.sold, 0) - (RO11nb + RO11nt + RO21nb + RO21nt + RO20nb + RO20nt + RO24nb + RO24nt + ro19nb + ro19nt + ro9nb + ro9nt + ro5nb + ro5nt) <> 0
ENDTEXT 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)) lcWhere = Alltrim(Substr(m.lcWhere, m.lnPos + 11))
Endif Endif
Endif Endif
SET STEP ON
Do Case Do Case
Case m.lnTipJurnal = 1 Case m.lnTipJurnal = 1
pcSubtitlu = "Achizitii de bunuri si prestari de sevicii taxabile din tara" 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 ; *!* 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,'')) ) *!* (Select Padl(nract,14,'0') + '|' + Dtos(dataact) + '|' + Padr(denumire,100,' ') From cListRC WHERE !EMPTY(NVL(denumire,'')) )
*!* Endif *!* Endif
SET STEP ON
WAIT WINDOW 'TVA exigibilizat din plati facturi cu TVA Incasare' NOWAIT WAIT WINDOW 'TVA exigibilizat din plati facturi cu TVA Incasare' NOWAIT
*** ADAUG TVA INCASARE (DIN INCASARI/PLATI, TVA 4427 LA 90 ZILE) *** ADAUG TVA INCASARE (DIN INCASARI/PLATI, TVA 4427 LA 90 ZILE)
TEXT to m.lcSql textmerge noshow 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 JTVA_COLOANE J2 On J.id_jtva_coloana = J2.id_tva
left join nom_fdoc fdoc on a.id_fdoc = fdoc.id_fdoc 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 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 ORDER BY a.cod, J2.COLOANA_JC
ENDTEXT ENDTEXT
@@ -44214,7 +44185,6 @@ DEFINE CLASS frm_regcump2025 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
*!* 25.08.2014 *!* 25.08.2014
*!* marius.mutu *!* marius.mutu
*!* se transmit si soldurile pe cote de TVA 24,9,5 pentru cazul in care soldul total este 0 *!* se transmit si soldurile pe cote de TVA 24,9,5 pentru cazul in care soldul total este 0
SET STEP ON
Local lcXMLFacturi Local lcXMLFacturi
If !(luna_inchisa Or m.glEMama) If !(luna_inchisa Or m.glEMama)
Select *, (RO11NB+RO21NB+RO24NB+RO20NB+RO19NB+RO09NB+RO05NB + RO11NT+RO21NT+RO24NT+RO20NT+RO19NT+RO09NT+RO05NT) as soldn, ; 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 ENDPROC
PROCEDURE do_excel 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 do export_excel_grid WITH thisform._grdbase1,"dataact, nract", "", this.lb_titlu_alb_b121.caption IN proceduri_excel.prg
return return
@@ -50521,7 +50490,6 @@ DEFINE CLASS frm_regvanz2010 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
update_jtva_coloane('JV') update_jtva_coloane('JV')
*** SELECTEZ FACTURILE CU TVA_INCASARE CU TOTAL BAZA, TVA, BAZAN, TVAN *** 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, ; 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, ; (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, ; (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 *!* 25.08.2014
*!* marius.mutu *!* marius.mutu
*!* se transmit si soldurile pe cote de TVA 24,9,5 pentru cazul in care soldul total este 0 *!* se transmit si soldurile pe cote de TVA 24,9,5 pentru cazul in care soldul total este 0
SET STEP ON
Local lcXMLFacturi Local lcXMLFacturi
If !(luna_inchisa Or m.glEMama) If !(luna_inchisa Or m.glEMama)
Select *, (RO24NB+RO20NB+RO19NB+RO9NB+RO5NB + RO24NT+RO20NT+RO19NT+RO9NT+RO5NT) as soldn, ; 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, select jv.id_fact,
ip.cont, ip.cont,
nvl(ip.sold, 0) as soldf, nvl(ip.sold, 0) as soldf,
(RO11nb + RO11nt + RO21nb + RO21nt + ro19nb + ro19nt + ro9nb + ro9nt + ro5nb + ro5nt) as soldn, (RO11nb + RO11nt + RO21nb + RO21nt + RO20nb + RO20nt + RO24nb + RO24nt + ro19nb + ro19nt + ro9nb + ro9nt + ro5nb + ro5nt) as soldn,
nvl(ip.sold, 0) - (RO11nb + RO11nt + RO21nb + RO21nt + ro19nb + ro19nt + ro9nb + ro9nt + ro5nb + ro5nt) as solddif, nvl(ip.sold, 0) - (RO11nb + RO11nt + RO21nb + RO21nt + RO20nb + RO20nt + RO24nb + RO24nt + ro19nb + ro19nt + ro9nb + ro9nt + ro5nb + ro5nt) as solddif,
jv.denumire, jv.denumire,
jv.nract, jv.nract,
jv.serie_act, jv.serie_act,
@@ -53830,6 +53797,10 @@ DEFINE CLASS frm_regvanz2025 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
jv.RO11nt, jv.RO11nt,
jv.RO21nb, jv.RO21nb,
jv.RO21nt, jv.RO21nt,
jv.RO20nb,
jv.RO20nt,
jv.RO24nb,
jv.RO24nt,
jv.ro19nb, jv.ro19nb,
jv.ro19nt, jv.ro19nt,
jv.ro9nb, jv.ro9nb,
@@ -53849,15 +53820,15 @@ DEFINE CLASS frm_regvanz2025 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
from vjv2010 from vjv2010
where an = <<m.gnAn>> where an = <<m.gnAn>>
and luna = <<m.gnLuna>> 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) and tva_incasare = 1)
group by id_fact, cont) ip group by id_fact, cont) ip
on jv.id_fact = ip.id_fact on jv.id_fact = ip.id_fact
where jv.an = <<m.gnAn>> where jv.an = <<m.gnAn>>
and jv.luna = <<m.gnLuna>> and jv.luna = <<m.gnLuna>>
and jv.tva_incasare = 1 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 (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 + ro19nb + ro19nt + ro9nb + ro9nt + ro5nb + ro5nt) <> 0 and nvl(ip.sold, 0) - (RO11nb + RO11nt + RO21nb + RO21nt + RO20nb + RO20nt + RO24nb + RO24nt + ro19nb + ro19nt + ro9nb + ro9nt + ro5nb + ro5nt) <> 0
ENDTEXT ENDTEXT
llSucces = goExecutor.oExecuta(m.lcSql, "crsSoldDif") llSucces = goExecutor.oExecuta(m.lcSql, "crsSoldDif")
@@ -53888,7 +53859,6 @@ DEFINE CLASS frm_regvanz2025 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
ENDPROC ENDPROC
PROCEDURE do_excel 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 do export_excel_grid WITH thisform._grdbase1,"dataact, nract", "", this.lb_titlu_alb_b121.caption IN proceduri_excel.prg
return 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 JTVA_COLOANE J2 On J.id_jtva_coloana = J2.id_tva
left join nom_fdoc fdoc on a.id_fdoc = fdoc.id_fdoc 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 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 order by a.cod, J2.COLOANA_JC
ENDTEXT ENDTEXT
@@ -55063,7 +55033,6 @@ DEFINE CLASS frm_regvanz2025 AS _frmbase OF "..\comun\clase\_frm_base.vcx"
*!* 25.08.2014 *!* 25.08.2014
*!* marius.mutu *!* marius.mutu
*!* se transmit si soldurile pe cote de TVA 24,9,5 pentru cazul in care soldul total este 0 *!* se transmit si soldurile pe cote de TVA 24,9,5 pentru cazul in care soldul total este 0
SET STEP ON
Local lcXMLFacturi Local lcXMLFacturi
If !(luna_inchisa Or m.glEMama) If !(luna_inchisa Or m.glEMama)
Select *, (RO11NB+RO21NB+RO24NB+RO20NB+RO19NB+RO9NB+RO5NB + RO11NT+RO21NT+RO24NT+RO20NT+RO19NT+RO9NT+RO5NT) as soldn, ; Select *, (RO11NB+RO21NB+RO24NB+RO20NB+RO19NB+RO9NB+RO5NB + RO11NT+RO21NT+RO24NT+RO20NT+RO19NT+RO9NT+RO5NT) as soldn, ;

View File

@@ -207,6 +207,14 @@ ON PAD _000000003 OF _msysmenu ACTIVATE POPUP Initializa
DEFINE BAR 1 OF Optiuniuti PROMPT "\<Tratare bug blocare listare Registru Cumparari" DEFINE BAR 1 OF Optiuniuti PROMPT "\<Tratare bug blocare listare Registru Cumparari"
ON SELECTION BAR 1 OF Optiuniuti DO BAR_1_OF_Optiuniuti_FB2P 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 ; DEFINE PAD _000000004 OF _msysmenu PROMPT "Ac\<tualizari" COLOR SCHEME 3 ;
KEY ALT+T, "ALT+T" ; KEY ALT+T, "ALT+T" ;
SKIP FOR Type('glLunaInchisa') = 'L' and m.glLunaInchisa SKIP FOR Type('glLunaInchisa') = 'L' and m.glLunaInchisa

View File

@@ -47,6 +47,10 @@
*!* 09.06.2026 *!* 09.06.2026
*!* Import csvBT - elimin CRLF din interiorul descrierii care rupe linia de tranzactie pe 2 linii *!* 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 * Clasa ImportNote este fabrica de clase tip Export
************************************* *************************************
@@ -316,6 +320,7 @@ Define Class ExtrasBanca As Custom
Local lcRecc, lcRecno, lnRecno Local lcRecc, lcRecno, lnRecno
Local lcComanda, lcDenumire2, lcPartenerCasa, lcTip2, lnVariante, llExcludeOriginal Local lcComanda, lcDenumire2, lcPartenerCasa, lcTip2, lnVariante, llExcludeOriginal
Local lnDenumire, lnDocument, lnIdPartenerCasa, lnVariante, loPartener Local lnDenumire, lnDocument, lnIdPartenerCasa, lnVariante, loPartener
Local lcGrupIdLista, lcSqlGrup, lnIdPartAlternativ, lcPartAlternativ
PRIVATE pcContBanca, pnIdPartBanca PRIVATE pcContBanca, pnIdPartBanca
@@ -426,6 +431,7 @@ Define Class ExtrasBanca As Custom
Append From Dbf('C_IMPORT_TEMP') Append From Dbf('C_IMPORT_TEMP')
* Caut/creez parteneri * 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 distinct cod_fiscal, denumire, iban FROM cActTemp INTO CURSOR cParteneriTemp READWRITE
SELECT cParteneriTemp SELECT cParteneriTemp
lcRecc = Transform(Reccount()) lcRecc = Transform(Reccount())
@@ -450,6 +456,34 @@ Define Class ExtrasBanca As Custom
If !Isnull(loPartener) If !Isnull(loPartener)
lnIdPartener = Nvl(loPartener.id_part, 0) lnIdPartener = Nvl(loPartener.id_part, 0)
lcPartener = Alltrim(Nvl(loPartener.denumire, "")) 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
Endif Endif
* Caut partener dupa denumire * Caut partener dupa denumire
@@ -700,6 +734,30 @@ Define Class ExtrasBanca As Custom
ENDIF ENDIF
* Daca am gasit un document, ies din bucla * 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) ENDIF && !Empty(m.loAct.id_fact)
ENDFOR && lnDocument ENDFOR && lnDocument
ENDIF && !Empty(m.lnIdPartener) And m.lnDocumente > 0 ENDIF && !Empty(m.lnIdPartener) And m.lnDocumente > 0
@@ -729,6 +787,30 @@ Define Class ExtrasBanca As Custom
ENDIF ENDIF
* Daca am gasit un document, ies din bucla * 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) ENDIF && !Empty(m.loAct.id_fact)
ENDFOR && lnDocument ENDFOR && lnDocument
ENDIF && !Empty(m.lnIdPartener) And m.lnDocumente > 0 ENDIF && !Empty(m.lnIdPartener) And m.lnDocumente > 0
@@ -836,6 +918,10 @@ Define Class ExtrasBanca As Custom
Select (m.lcSelect) Select (m.lcSelect)
ENDIF && llSucces ENDIF && llSucces
If Used("cGrupParteneriCui")
Use In (Select("cGrupParteneriCui"))
Endif
Return m.llSucces Return m.llSucces
Endproc && CreeazaNote Endproc && CreeazaNote
@@ -4423,6 +4509,22 @@ Function GetRegExpAllNumbers
Return lnResults Return lnResults
Endfunc 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 * Creeaza/Actualizeaza Parteneri in ROA pentru fiecare cod_fiscal din tcCursorParteneri
* Verific dupa cod_fiscal, apoi dupa denumire * Verific dupa cod_fiscal, apoi dupa denumire
@@ -4444,6 +4546,7 @@ Procedure CompleteazaParteneriROA
Local lcSqlInsert, lcSqlPart, lcStrada, lcSufix, lcTara, lcTelefon1, lcTelefon2, lcTip_persoana Local lcSqlInsert, lcSqlPart, lcStrada, lcSufix, lcTara, lcTelefon1, lcTelefon2, lcTip_persoana
Local lcWeb, lcinactiv, llCallBack, llSucces, lnIdJudet, lnIdJudetBucuresti, lnIdLocalitateBucuresti Local lcWeb, lcinactiv, llCallBack, llSucces, lnIdJudet, lnIdJudetBucuresti, lnIdLocalitateBucuresti
Local lnIdTaraRO, lnItem, lnItems, lnSucces Local lnIdTaraRO, lnItem, lnItems, lnSucces
Local lcCuiNorm
Private pnIdAdresa, pcCodFiscal, pcDenumire, pnIdPart, pnNrAdrese, pnIdJudet Private pnIdAdresa, pcCodFiscal, pcDenumire, pnIdPart, pnNrAdrese, pnIdJudet
llCallBack = Type('toCallBackForm') = 'O' And Pemstatus(m.toCallBackForm, 'trace', 5) llCallBack = Type('toCallBackForm') = 'O' And Pemstatus(m.toCallBackForm, 'trace', 5)
@@ -4463,6 +4566,9 @@ Procedure CompleteazaParteneriROA
Return m.llSucces Return m.llSucces
Endif 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] lcAdreseParteneri = [select id_adresa, id_part, localitate, id_loc, judet, id_judet, tara, id_tara from vadrese_parteneri]
llSucces = goExecutor.oExecuta(m.lcAdreseParteneri, 'cAdreseROA') llSucces = goExecutor.oExecuta(m.lcAdreseParteneri, 'cAdreseROA')
@@ -4494,6 +4600,12 @@ Procedure CompleteazaParteneriROA
If !Empty(m.pcCodFiscal) If !Empty(m.pcCodFiscal)
Locate For Alltrim(Strtran(cod_fiscal, ' ', '')) = m.pcCodFiscal Locate For Alltrim(Strtran(cod_fiscal, ' ', '')) = m.pcCodFiscal
*!* lnSucces = goExecutor.oSelect2Value(m.lcSqlCod, @pnIdPart) *!* lnSucces = goExecutor.oSelect2Value(m.lcSqlCod, @pnIdPart)
If !Found()
lcCuiNorm = NormalizeazaCUI(m.pcCodFiscal)
If !Empty(m.lcCuiNorm)
Seek m.lcCuiNorm Order cuinorm
Endif
Endif
Else Else
Locate For Alltrim(Upper(denumire)) = m.pcDenumire Locate For Alltrim(Upper(denumire)) = m.pcDenumire
*!* lnSucces = goExecutor.oSelect2Value(m.lcSqlDenumire, @pnIdPart) *!* lnSucces = goExecutor.oSelect2Value(m.lcSqlDenumire, @pnIdPart)

View File

@@ -771,7 +771,7 @@ Procedure inchidere_tva_sold
Local lnIdSet, lnNrAct, lnProcTVA, lnRecords, lnSucces, lnSuma, loAct Local lnIdSet, lnNrAct, lnProcTVA, lnRecords, lnSucces, lnSuma, loAct
Local lnCota, lnCotaTVA, lnSuma24, lnSuma5, lnSuma9, lnSumaT Local lnCota, lnCotaTVA, lnSuma24, lnSuma5, lnSuma9, lnSumaT
Local lnSuma24T, lnSuma5T, lnSuma9T, lnSumaNT, lcMesaj 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 lcJurnal = Upper(Alltrim(m.tcJurnal)) && JC/JV
If m.lcJurnal = 'JC' && Jurnal Cumparari If m.lcJurnal = 'JC' && Jurnal Cumparari
lcSCD = '4426' lcSCD = '4426'
@@ -788,7 +788,6 @@ SET STEP ON
lcMesaj = '' lcMesaj = ''
lnIdSet = 99999 && nota fara predefinire lnIdSet = 99999 && nota fara predefinire
lnBut = lans(m.lnIdSet) lnBut = lans(m.lnIdSet)
Set Step On
If m.lnBut = 1 If m.lnBut = 1
Select actactan Select actactan
Scatter Name loAct Scatter Name loAct
@@ -799,8 +798,18 @@ SET STEP ON
lnNrAct = crsTVAIncasareTemp.nract lnNrAct = crsTVAIncasareTemp.nract
lnIdFact = crsTVAIncasareTemp.id_fact lnIdFact = crsTVAIncasareTemp.id_fact
lnSumaT = soldn lnSumaT = soldn
lnSuma21 = soldn21 lnSuma21 = 0
lnSuma11 = soldn11 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 lnSuma24 = soldn24
lnSuma20 = soldn20 lnSuma20 = soldn20
@@ -809,16 +818,12 @@ SET STEP ON
lnSuma5 = soldn5 lnSuma5 = soldn5
If m.lcJurnal = 'JC' && Jurnal Cumparari If m.lcJurnal = 'JC' && Jurnal Cumparari
lnSuma21T = ro21nt
lnSuma11T = ro11nt
lnSuma24T = ro24nt lnSuma24T = ro24nt
lnSuma20T = ro20nt lnSuma20T = ro20nt
lnSuma19T = ro19nt lnSuma19T = ro19nt
lnSuma9T = ro09nt lnSuma9T = ro09nt
lnSuma5T = ro05nt lnSuma5T = ro05nt
ELSE ELSE
lnSuma21T = ro21nt
lnSuma11T = ro11nt
lnSuma24T = ro24nt lnSuma24T = ro24nt
lnSuma20T = ro20nt lnSuma20T = ro20nt
lnSuma19T = ro19nt lnSuma19T = ro19nt
@@ -830,7 +835,7 @@ SET STEP ON
lnSuma = m.lnSumaT lnSuma = m.lnSumaT
lnCotaTVA = 0.00 lnCotaTVA = 0.00
If m.lnSumaT = 0 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)))))) 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 Endif

View File

@@ -1991,9 +1991,10 @@ select *
Use In (Select('cIncasariBanca2')) Use In (Select('cIncasariBanca2'))
*** Verific pe ANAF starea split tva la data curenta *** 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 SELECT distinct cod_fiscal FROM cFacturiTVA INTO CURSOR cCodFiscalTemp
loVerificareANAF = CREATEOBJECT("VerificareANAF") loVerificareANAF = CREATEOBJECT("VerificareANAF")
loVerificareANAF.VerificaListaCIF("cCodFiscalTemp", m.pdDataI, "crsANAF") loVerificareANAF.VerificaListaCIF("cCodFiscalTemp", m.pdDataI, "crsANAF", "MASA")
USE IN (SELECT('cCodFiscalTemp')) USE IN (SELECT('cCodFiscalTemp'))
IF USED("crsAnaf") 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), ; *!* 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')) Use In (Select('cIncasariBanca2'))
*** Verific pe ANAF starea split tva la data curenta *** 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 SELECT distinct cod_fiscal FROM cFacturiTVA INTO CURSOR cCodFiscalTemp
loVerificareANAF = CREATEOBJECT("VerificareANAF") loVerificareANAF = CREATEOBJECT("VerificareANAF")
loVerificareANAF.VerificaListaCIF("cCodFiscalTemp", Date(), "crsANAF") loVerificareANAF.VerificaListaCIF("cCodFiscalTemp", Date(), "crsANAF", "UNIC")
USE IN (SELECT('cCodFiscalTemp')) USE IN (SELECT('cCodFiscalTemp'))
IF USED("crsAnaf") 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), ; *!* 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), ;

View File

@@ -209,6 +209,7 @@ SET PROCEDURE TO onomenclatoare.prg ADDITIVE
SET PROCEDURE TO saft_d406.prg ADDITIVE SET PROCEDURE TO saft_d406.prg ADDITIVE
SET PROCEDURE TO ofacturare.prg ADDITIVE SET PROCEDURE TO ofacturare.prg ADDITIVE
SET PROCEDURE TO ofacturare_comun.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 oproceduri_facturare.prg ADDITIVE
SET PROCEDURE TO anaf_efactura.prg ADDITIVE SET PROCEDURE TO anaf_efactura.prg ADDITIVE
SET PROCEDURE TO import_efactura.prg ADDITIVE SET PROCEDURE TO import_efactura.prg ADDITIVE
@@ -576,6 +577,10 @@ If Type('laparametri',1)="A"
Endif Endif
Endif Endif
If Type('goCacheANAF_Sesiune') = 'O'
Release goCacheANAF_Sesiune
Endif
Private gcCopyRight Private gcCopyRight
gcCopyRight = '<27> ROA Romfast SRL' gcCopyRight = '<27> ROA Romfast SRL'

View File

@@ -81,6 +81,10 @@
*!* 01.072026 *!* 01.072026
*!* oSalesInvoices - se facea join dublu vanzari - jv2007 in cazul facturilor cu tva la incasare *!* 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 * saft_D406
Procedure viz_saft_d406 Procedure viz_saft_d406
loD406 = Createobject("D406") loD406 = Createobject("D406")
@@ -254,10 +258,10 @@ Define Class d406 As Custom
Local lcTaxTable, lcTipDeclaratie Local lcTaxTable, lcTipDeclaratie
LOCAL lnBytes, llSucces LOCAL lnBytes, llSucces
Local lcAssetTransactions, lcAssets, lcCaleFisier, lcComunPath, lcConfigDir, lcFileName 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 lcProducts, lcUOMTable, lcValidator, lcXMLTemp, lnFileHandle, lnSec, lcSufixCale, lcSufixFisier
LOCAL lcMessage, loChatBot LOCAL lcMessage, loChatBot, lcMesajErori
LOCAL lnAn1, lnAn2, lnLuna1, lnLuna2 LOCAL lnAn1, lnAn2, lnLuna1, lnLuna2, lnEroriFictive, lnEroriReale
lnAn1 = This.oUnitate.an1 lnAn1 = This.oUnitate.an1
lnLuna1 = This.oUnitate.luna1 lnLuna1 = This.oUnitate.luna1
@@ -556,12 +560,26 @@ Define Class d406 As Custom
OPEN_DEFAULT_APP(m.lcValidator, m.lcParams) OPEN_DEFAULT_APP(m.lcValidator, m.lcParams)
ELSE 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 *!* 27.07.2026 un singur raport compact cu erorile explicate si identificate, erorile fictive de TaxCode (bug DUKIntegrator) separate
lcMessage = FILETOSTR(m.lcFisierRaspuns) 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 = CREATEOBJECT("oChatBotLaunch", m.lcMessage)
loChatBot.Launch() loChatBot.Launch()
ENDIF ENDIF
OPEN_DEFAULT_APP(m.lcFisierRaspuns)
ENDIF ENDIF
ELSE ELSE
AMESSAGEBOX('Nu s-a creat fisierul raspuns ' + m.lcFisierRaspuns + ' dupa validare!', 0+48,_screen.Caption) 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) #Define CRLF Chr(13) + Chr(10)
LOCAL llSilent, lcMesaj, lcListaGol LOCAL llSilent, lcMesaj, lcListaGol
LOCAL lcCod, lcListaInvalid, lcTextInvalid, llCnp, lnInvalid, lnInvalidCnp, loVerif
LOCAL lcContInv, lcDenumireInv, lnIdPartInv, lnRandInv, lnTipPersInv
lcMesaj = '' lcMesaj = ''
lcTextInvalid = ''
llSilent = m.tlSilent llSilent = m.tlSilent
@@ -1029,12 +1050,52 @@ and b1.cont = b2.cont
ENDSCAN ENDSCAN
GO TOP 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 IF RECCOUNT('cPartDif') > 0
*llOk = ExportExcelXml("cverifica_solduri", "solduri" + IIF(m.llClient, '_clienti', '_furnizori'),'solduri',.T.) *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') ) 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!' + ; 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 IF !m.llSilent
AMESSAGEBOX(lcMesaj,0+64, _screen.Caption) AMESSAGEBOX(lcMesaj,0+64, _screen.Caption)
ENDIF ENDIF
@@ -1042,15 +1103,16 @@ and b1.cont = b2.cont
ELSE ELSE
*!* lcMesaj ='Nu exista parteneri cu solduri in declaratie diferite fata de soldurile din balanta de parteneri' *!* lcMesaj ='Nu exista parteneri cu solduri in declaratie diferite fata de soldurile din balanta de parteneri'
lcMesaj ='Nu sunt diferente fata de balanta 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 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 ENDIF
ENDIF ENDIF
USE IN (SELECT('cBalPartTemp')) USE IN (SELECT('cBalPartTemp'))
USE IN (SELECT('cPartDif')) USE IN (SELECT('cPartDif'))
USE IN (SELECT('cCodInvalid'))
Else Else
llDontCloseCursor = .F. llDontCloseCursor = .F.
llExperimental = .F. llExperimental = .F.
@@ -1083,6 +1145,514 @@ and b1.cont = b2.cont
RETURN lcMesaj RETURN lcMesaj
ENDPROC && do_verifica_cui 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 && 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 && SI LE COMPAR CU VALOAREA DE INVENTAR SI AMORTIZAREA TOTALA DIN IMOBILIZARI CORPORALE/NECORPORALE CONTABIL
Procedure do_verifica_imobilizari 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 *!* RETURN
*!* ENDIF *!* 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) IF EMPTY(m.lnOptiune)
RETURN RETURN
ENDIF ENDIF
@@ -2037,6 +2607,11 @@ select a.id_articol, a.denumire, SUM(r.cant) as cant, SUM(r.cante) as cante, SUM
lcMesaj = 'Doriti sa corectati tipul de persoana = "Fizica" pentru persoanele cu tip persoana = "Juridica" si cod fiscal 13 cifre?' 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;] 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 ENDCASE
IF AMESSAGEBOX(m.lcMesaj,4+32,_screen.Caption) = 6 IF AMESSAGEBOX(m.lcMesaj,4+32,_screen.Caption) = 6
@@ -2048,6 +2623,108 @@ select a.id_articol, a.denumire, SUM(r.cant) as cant, SUM(r.cante) as cante, SUM
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 * Creare cusoare din baza de date
Function CitesteDate Function CitesteDate

189
TODOS.md
View File

@@ -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 ## ~~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 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. (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.

View File

@@ -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 24/07/2026
ROACONT - 2.11.64 ROACONT - 2.11.64

View File

@@ -1,2 +1,2 @@
@echo off @echo off
powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\roa_sync.ps1 -ProjectRoot "%~dp0." powershell -ExecutionPolicy Bypass -File "%~dp0COMUN\scripts\roa_sync.ps1" -ProjectRoot "%~dp0."

View File

@@ -25,7 +25,7 @@ _LegalTrademark = ""
_ProductName = "ROA - Financiar Contabilitate" _ProductName = "ROA - Financiar Contabilitate"
_MajorVer = "2" _MajorVer = "2"
_MinorVer = "11" _MinorVer = "11"
_Revision = "64" _Revision = "70"
_LanguageID = "Romana" _LanguageID = "Romana"
_AutoIncrement = "0" _AutoIncrement = "0"
*</DevInfo> *</DevInfo>

View File

@@ -1 +1 @@
2026_05_18_01 2026_08_02_01