Verificarea de duplicate se face document cu document, nu pe primul document din lot
Verificarea folosea o singura data VerificaFactura, pe primul rand din actactan. Daca acel document exista deja in ROA nu se scria nimic din tot intervalul; daca nu exista, se scria tot lotul, inclusiv documentele deja importate, care apareau duplicate. EliminaFacturiDuplicate ia intr-o singura interogare pe (an, luna) documentele existente in ACT, le pune intr-un cursor indexat pe an+luna+nract+dataact+explicatia5 si scoate din actactan doar randurile care se potrivesc. VerificaFactura, ramasa fara apelanti, e stearsa. In modul "Nu scrie note contabile" xls-ul de verificare se genereaza chiar daca actualizarea partenerilor sau verificarea de duplicate nu a reusit: notele nu ajung oricum in ROA. Verificat pe ROA_CONPRESS, read-only, pe intrarile din 07/2026: din 152 de randuri raman 15, toate cele 11 facturi reclamate ca lipsa raman in lot, iar factura 1178734 e scoasa doar pe 30.07 (exista in ROA) si pastrata pe 13.07 (nu exista). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PmUPGiStqNKSu4wWq2y77Q
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -93,6 +93,7 @@ Teste/screenshots/
|
||||
Teste/_erori_test.txt
|
||||
Teste/*_log.txt
|
||||
Teste/raport_*.csv
|
||||
Teste/dry_*.csv
|
||||
|
||||
# --- Cache text extern (inlocuit de fluxul in-arbore .??2) ---
|
||||
_textcache/
|
||||
|
||||
159
Teste/test_dry_duplicate.prg
Normal file
159
Teste/test_dry_duplicate.prg
Normal file
@@ -0,0 +1,159 @@
|
||||
* Dry run pe ROA (READ-ONLY): construieste actactan pentru INTRARI 07/2026 exact ca in
|
||||
* CreeazaNote, apoi apeleaza metoda reala EliminaFacturiDuplicate si raporteaza ce ar fi
|
||||
* scos din lot si ce ar fi ramas. NU scrie nimic in ROA (metoda face doar SELECT pe act).
|
||||
* Rezultat: Teste\dry_duplicate_log.txt
|
||||
SET SAFETY OFF
|
||||
SET TALK OFF
|
||||
PUBLIC gcUILog, gcSyncDir, gcDryLog, gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip
|
||||
|
||||
LOCAL lcDir, lnSucces, lnInainte, lnDupa
|
||||
LOCAL lnCodSectieBarFlora, lnCodSectieBucatarieFlora, lnCodSectieBarRestaurant, lnCodSectieBucatarieRestaurant
|
||||
LOCAL lcAcontMarfaBar, lcAcontMarfaBucatarie
|
||||
|
||||
gnMockRaspuns = 6
|
||||
gcMockUltimMesaj = ''
|
||||
gnMockUltimTip = 0
|
||||
|
||||
lcDir = ADDBS(JUSTPATH(SYS(16,0)))
|
||||
|
||||
DO (m.lcDir + 'test_init_env_auto.prg') WITH .T.
|
||||
SET PROCEDURE TO (m.lcDir + 'ui_harness.prg') ADDITIVE
|
||||
SET PROCEDURE TO (m.lcDir + 'mock_amessagebox.prg') ADDITIVE
|
||||
|
||||
gcDryLog = m.lcDir + "dry_duplicate_log.txt"
|
||||
STRTOFILE('DRY RUN DUPLICATE ' + TTOC(DATETIME()) + CHR(13)+CHR(10), m.gcDryLog)
|
||||
|
||||
DO FORM (gcAppPath + 'frm_import') NAME goImportFrm NOSHOW
|
||||
goImportFrm.WindowType = 0
|
||||
goImportFrm.Show()
|
||||
goImportFrm.txtData1.Value = DATE(2026,7,1)
|
||||
goImportFrm.txtData2.Value = DATE(2026,7,31)
|
||||
goImportFrm.chkTest.Value = 1
|
||||
|
||||
lnSucces = goImportFrm.ExportDate()
|
||||
DO Raport WITH 'ExportDate = ' + TRANSFORM(m.lnSucces)
|
||||
DO Raport WITH 'cIntrariRestaurant = ' + TRANSFORM(RECCOUNT('cIntrariRestaurant')) + ' randuri'
|
||||
|
||||
* --- cClientiFurnizori fara scriere in ROA (id_part = 0)
|
||||
Select Distinct Cast(0 As I) As id_part, cod, denumire, cod_fiscal, reg_com, adresa, ;
|
||||
judet As indicativ_judet, tara As cod_tara, banca, cont_banca ;
|
||||
From npart Into Cursor cClientiFurnizori Readwrite
|
||||
|
||||
* --- cIntrari, copie exacta a SELECT-ului din frm_import.sc2
|
||||
lnCodSectieBarFlora = 3
|
||||
lnCodSectieBucatarieFlora = 4
|
||||
lnCodSectieBarRestaurant = 1
|
||||
lnCodSectieBucatarieRestaurant = 2
|
||||
lcAcontMarfaBar = goApp.oSettings.cAcontMarfaBar
|
||||
lcAcontMarfaBucatarie = goApp.oSettings.cAcontMarfaBucatarie
|
||||
|
||||
Select '371' Cont, IIF(INLIST(codsectiedeintrare, m.lnCodSectieBarFlora, m.lnCodSectieBarRestaurant), m.lcAcontMarfaBar, IIF(INLIST(codsectiedeintrare, m.lnCodSectieBucatarieFlora, m.lnCodSectieBucatarieRestaurant), m.lcAcontMarfaBucatarie, '')) AS acont, ;
|
||||
CAST(IIF(EMPTY(i.cotatva), 0, i.cotatva) as N(2)) As proctva, CAST(Nvl(p.id_part, 0) as I) As id_part, ;
|
||||
STRTRAN(idinregistrare,'-','0') as nir, ;
|
||||
TTOD(CTOT(i.DataDocument)) As dataact, CAST(LEFT(ALLTRIM(i.nrdocument),14) as N(14)) As nract, UPPER(ALLTRIM(STR(codsectiedeintrare))) as codsectie, UPPER(denumiresectiedeintrare) as sectie, ;
|
||||
Sum(i.valoareajustatafaratva) As VALACH, Sum(i.tvavaloareajustata) As VALTVAA ;
|
||||
FROM cIntrariRestaurant i ;
|
||||
LEFT Join cClientiFurnizori p On p.cod_fiscal = i.codfiscal ;
|
||||
Group By 1,2,3,4,5,6,7,8,9 ;
|
||||
INTO Cursor cIntrari
|
||||
|
||||
* --- actactan, copie exacta a INSERT-ului de baza din frm_import.sc2
|
||||
lnIdSet = 50100
|
||||
lnIdFdocFactura = 42
|
||||
lnAn = 2026
|
||||
lnLuna = 7
|
||||
lcAcont401 = '01'
|
||||
lnIdBazaAch21 = 208
|
||||
lnIdBazaAch11 = 212
|
||||
lnIdBazaAch19 = 103
|
||||
lnIdBazaAch9 = 109
|
||||
lnIdBazaAch5 = 154
|
||||
lnIdBazaAch0 = 113
|
||||
lnIdBazaAchS = m.lnIdBazaAch21
|
||||
lcExplicatia5 = 'FACTURA ACHIZITIE'
|
||||
|
||||
Create Cursor actactan (cod I, id_set N(5), id_fdoc N(5), an N(4), luna N(2), explicatia C(100) Null, dataact D, dataireg D, nract N(14), serie_act C(10), nnir N(14), scd C(4), ascd V(4), scc C(4), ascc V(4), id_partd N(10), partd C(200), id_partc N(10), partc C(200), proc_tva N(5,2), id_jtva_coloana N(4) Null, explicatia4 C(100), explicatia5 C(100), suma N(16,2), taxcode N(6) null, paymentcode C(9) null, id_factc I, perechec I, id_factD I, pereched I, id_fact I)
|
||||
|
||||
Insert Into actactan (id_set, id_fdoc, an, luna, dataact, dataireg, nract, nnir, scd, ascd, scc, ascc, id_partd, id_partc, proc_tva, id_jtva_coloana, explicatia, explicatia5, suma) ;
|
||||
SELECT lnIdSet As id_set, lnIdFdocFactura As id_fdoc, m.lnAn As an, m.lnLuna As luna, dataact, dataact As dataireg, INT(nract), INT(VAL(nir)), ;
|
||||
cont As scd, acont As ascd, '401' As scc, m.lcAcont401 As ascc, 0 As id_partd, id_part As id_partc, ;
|
||||
1 + Round(proctva / 100, 2) As proc_tva, ;
|
||||
CAST(Iif(proctva = 21, m.lnIdBazaAch21, ;
|
||||
Iif(proctva = 11, m.lnIdBazaAch11, ;
|
||||
Iif(proctva = 19, m.lnIdBazaAch19, ;
|
||||
Iif(proctva = 9, m.lnIdBazaAch9, ;
|
||||
Iif(proctva = 5, m.lnIdBazaAch5, ;
|
||||
Iif(proctva = 0, m.lnIdBazaAch0, ;
|
||||
m.lnIdBazaAchS)))))) AS N(4)) As id_jtva_coloana, ;
|
||||
sectie As explicatia, lcExplicatia5 As explicatia5, ;
|
||||
SUM(ROUND(VALACH,2)) As suma ;
|
||||
FROM cIntrari ;
|
||||
Group by 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18
|
||||
|
||||
lnInainte = RECCOUNT('actactan')
|
||||
DO Raport WITH 'actactan inainte de filtrare = ' + TRANSFORM(m.lnInainte) + ' randuri'
|
||||
|
||||
* pastrez lista completa, ca sa pot spune exact ce s-a scos
|
||||
SELECT nract, dataact, explicatia5, suma FROM actactan ORDER BY dataact, nract INTO CURSOR cInainte
|
||||
|
||||
DO Raport WITH ''
|
||||
DO Raport WITH '--- apel EliminaFacturiDuplicate(50100) pe ROA_CONPRESS ---'
|
||||
lnSucces = goImportFrm.EliminaFacturiDuplicate(50100)
|
||||
DO Raport WITH 'EliminaFacturiDuplicate = ' + TRANSFORM(m.lnSucces) + ' (1 = CT_SUCCES)'
|
||||
IF !EMPTY(gcMockUltimMesaj)
|
||||
DO Raport WITH 'AMESSAGEBOX: ' + gcMockUltimMesaj
|
||||
ENDIF
|
||||
|
||||
IF !USED('actactan')
|
||||
DO Raport WITH 'EROARE: cursorul actactan nu mai exista dupa apel!'
|
||||
QUIT
|
||||
ENDIF
|
||||
|
||||
lnDupa = RECCOUNT('actactan')
|
||||
DO Raport WITH 'actactan dupa filtrare = ' + TRANSFORM(m.lnDupa) + ' randuri'
|
||||
DO Raport WITH 'randuri scoase = ' + TRANSFORM(m.lnInainte - m.lnDupa)
|
||||
DO Raport WITH 'tip ascd dupa filtrare = ' + TYPE('actactan.ascd')
|
||||
|
||||
* ce s-a scos (adica exista deja in ROA)
|
||||
SELECT a.nract, a.dataact, a.suma FROM cInainte a ;
|
||||
WHERE NOT EXISTS (SELECT 1 FROM actactan b WHERE b.nract = a.nract AND b.dataact = a.dataact) ;
|
||||
INTO CURSOR cScoase
|
||||
DO Raport WITH ''
|
||||
DO Raport WITH '--- documente scoase din lot (deja in ROA): ' + TRANSFORM(RECCOUNT('cScoase'))
|
||||
SELECT cScoase
|
||||
SCAN
|
||||
DO Raport WITH ' scos: nract=' + TRANSFORM(nract) + ' ' + DTOC(dataact) + ' suma=' + TRANSFORM(suma)
|
||||
ENDSCAN
|
||||
|
||||
DO Raport WITH ''
|
||||
DO Raport WITH '--- documente ramase de scris: ' + TRANSFORM(m.lnDupa)
|
||||
SELECT actactan
|
||||
SCAN
|
||||
DO Raport WITH ' ramas: nract=' + TRANSFORM(nract) + ' ' + DTOC(dataact) + ' suma=' + TRANSFORM(suma)
|
||||
ENDSCAN
|
||||
|
||||
* verificarea cheie: cele 11 facturi raportate ca lipsa NU trebuie sa fie scoase
|
||||
DO Raport WITH ''
|
||||
DO Raport WITH '--- control: facturile raportate ca lipsa din ROA trebuie sa RAMANA ---'
|
||||
SELECT nract, dataact FROM actactan ;
|
||||
WHERE INLIST(nract, 30285003, 1178734, 30285604, 154, 30286234, 30286444, 30286604, 6019064715, 30286873, 6019082505, 30287485) ;
|
||||
ORDER BY dataact, nract INTO CURSOR cControl
|
||||
DO Raport WITH 'regasite in lotul ramas: ' + TRANSFORM(RECCOUNT('cControl')) + ' din 12 randuri asteptate'
|
||||
SELECT cControl
|
||||
SCAN
|
||||
DO Raport WITH ' OK ramas: nract=' + TRANSFORM(nract) + ' ' + DTOC(dataact)
|
||||
ENDSCAN
|
||||
|
||||
SELECT actactan
|
||||
COPY TO (m.lcDir + 'dry_duplicate_ramase.csv') TYPE CSV
|
||||
SELECT cScoase
|
||||
COPY TO (m.lcDir + 'dry_duplicate_scoase.csv') TYPE CSV
|
||||
|
||||
DO Raport WITH ''
|
||||
DO Raport WITH 'GATA - nu s-a scris nimic in ROA'
|
||||
QUIT
|
||||
|
||||
PROCEDURE Raport
|
||||
LPARAMETERS tcText
|
||||
STRTOFILE(m.tcText + CHR(13) + CHR(10), m.gcDryLog, 1)
|
||||
ENDPROC
|
||||
150
Teste/test_dry_intrari.prg
Normal file
150
Teste/test_dry_intrari.prg
Normal file
@@ -0,0 +1,150 @@
|
||||
* Dry run: reproduce local pasii din CreeazaNote pentru INTRARI si numara randurile la fiecare pas.
|
||||
* Fara Oracle, fara scriere. Rezultat: Teste\dry_intrari_log.txt
|
||||
SET SAFETY OFF
|
||||
SET TALK OFF
|
||||
PUBLIC gcUILog, gcSyncDir, gcDryLog
|
||||
|
||||
LOCAL lcDir, lnSucces
|
||||
LOCAL lnCodSectieBarFlora, lnCodSectieBucatarieFlora, lnCodSectieBarRestaurant, lnCodSectieBucatarieRestaurant
|
||||
LOCAL lcAcontMarfaBar, lcAcontMarfaBucatarie
|
||||
|
||||
DO test_init_env_auto WITH .F.
|
||||
SET PROCEDURE TO ui_harness ADDITIVE
|
||||
SET PROCEDURE TO mock_amessagebox ADDITIVE
|
||||
|
||||
lcDir = ADDBS(JUSTPATH(SYS(16,0)))
|
||||
gcDryLog = m.lcDir + "dry_intrari_log.txt"
|
||||
STRTOFILE('DRY RUN INTRARI ' + TTOC(DATETIME()) + CHR(13)+CHR(10), m.gcDryLog)
|
||||
|
||||
DO FORM (gcAppPath + 'frm_import') NAME goImportFrm NOSHOW
|
||||
goImportFrm.WindowType = 0
|
||||
goImportFrm.Show()
|
||||
goImportFrm.txtData1.Value = DATE(2026,7,1)
|
||||
goImportFrm.txtData2.Value = DATE(2026,7,31)
|
||||
goImportFrm.chkTest.Value = 1
|
||||
|
||||
lnSucces = goImportFrm.ExportDate()
|
||||
DO Raport WITH 'ExportDate = ' + TRANSFORM(m.lnSucces)
|
||||
DO Raport WITH 'cIntrariRestaurant = ' + TRANSFORM(RECCOUNT('cIntrariRestaurant')) + ' randuri'
|
||||
DO Raport WITH 'nPart = ' + TRANSFORM(RECCOUNT('nPart')) + ' randuri'
|
||||
|
||||
* --- cClientiFurnizori, ca in CompleteazaParteneriROA, dar fara scriere in ROA (id_part = 0)
|
||||
Select Distinct Cast(0 As I) As id_part, cod, denumire, cod_fiscal, reg_com, adresa, ;
|
||||
judet As indicativ_judet, tara As cod_tara, banca, cont_banca ;
|
||||
From npart Into Cursor cClientiFurnizori Readwrite
|
||||
DO Raport WITH 'cClientiFurnizori = ' + TRANSFORM(RECCOUNT('cClientiFurnizori')) + ' randuri'
|
||||
|
||||
* --- pasul 1: cIntrari (copie exacta a SELECT-ului din frm_import.sc2:832)
|
||||
lnCodSectieBarFlora = 3
|
||||
lnCodSectieBucatarieFlora = 4
|
||||
lnCodSectieBarRestaurant = 1
|
||||
lnCodSectieBucatarieRestaurant = 2
|
||||
lcAcontMarfaBar = goApp.oSettings.cAcontMarfaBar
|
||||
lcAcontMarfaBucatarie = goApp.oSettings.cAcontMarfaBucatarie
|
||||
|
||||
Select '371' Cont, IIF(INLIST(codsectiedeintrare, m.lnCodSectieBarFlora, m.lnCodSectieBarRestaurant), m.lcAcontMarfaBar, IIF(INLIST(codsectiedeintrare, m.lnCodSectieBucatarieFlora, m.lnCodSectieBucatarieRestaurant), m.lcAcontMarfaBucatarie, '')) AS acont, ;
|
||||
CAST(IIF(EMPTY(i.cotatva), 0, i.cotatva) as N(2)) As proctva, CAST(Nvl(p.id_part, 0) as I) As id_part, ;
|
||||
STRTRAN(idinregistrare,'-','0') as nir, ;
|
||||
TTOD(CTOT(i.DataDocument)) As dataact, CAST(LEFT(ALLTRIM(i.nrdocument),14) as N(14)) As nract, UPPER(ALLTRIM(STR(codsectiedeintrare))) as codsectie, UPPER(denumiresectiedeintrare) as sectie, ;
|
||||
Sum(i.valoareajustatafaratva) As VALACH, Sum(i.tvavaloareajustata) As VALTVAA ;
|
||||
FROM cIntrariRestaurant i ;
|
||||
LEFT Join cClientiFurnizori p On p.cod_fiscal = i.codfiscal ;
|
||||
Group By 1,2,3,4,5,6,7,8,9 ;
|
||||
INTO Cursor cIntrari
|
||||
|
||||
DO Raport WITH 'cIntrari = ' + TRANSFORM(RECCOUNT('cIntrari')) + ' randuri (asteptat 152)'
|
||||
|
||||
* ce s-a pierdut intre XML si cIntrari
|
||||
SELECT x.idinregistrare, x.nrdocument, x.datadocument, x.codfiscal, x.denumirefurnizor, x.cotatva, x.valoareajustatafaratva ;
|
||||
FROM cIntrariRestaurant x ;
|
||||
WHERE STRTRAN(x.idinregistrare,'-','0') NOT IN (SELECT nir FROM cIntrari) ;
|
||||
INTO CURSOR cPierduteIntrari
|
||||
DO Raport WITH 'LIPSA in cIntrari = ' + TRANSFORM(RECCOUNT('cPierduteIntrari'))
|
||||
DO ListaPierdute WITH 'cPierduteIntrari'
|
||||
|
||||
* --- pasul 2: actactan (copie exacta a celor doua INSERT-uri din frm_import.sc2:917)
|
||||
lnIdSet = 50100
|
||||
lnIdFdocFactura = 42
|
||||
lnAn = 2026
|
||||
lnLuna = 7
|
||||
lcAcont401 = '01'
|
||||
lcContTVAAchizitie = '4426'
|
||||
lnIdBazaAch21 = 208
|
||||
lnIdTVAAch21 = 209
|
||||
lnIdBazaAch11 = 212
|
||||
lnIdTVAAch11 = 213
|
||||
lnIdBazaAch19 = 103
|
||||
lnIdTVAAch19 = 104
|
||||
lnIdBazaAch9 = 109
|
||||
lnIdTVAAch9 = 110
|
||||
lnIdBazaAch5 = 154
|
||||
lnIdTVAAch5 = 155
|
||||
lnIdBazaAch0 = 113
|
||||
lnIdBazaAchS = m.lnIdBazaAch21
|
||||
lnIdTVAAchS = m.lnIdTVAAch21
|
||||
lcExplicatia5 = 'FACTURA ACHIZITIE'
|
||||
|
||||
Create Cursor actactan (cod I, id_set N(5), id_fdoc N(5), an N(4), luna N(2), explicatia C(100) Null, dataact D, dataireg D, nract N(14), serie_act C(10), nnir N(14), scd C(4), ascd V(4), scc C(4), ascc V(4), id_partd N(10), partd C(200), id_partc N(10), partc C(200), proc_tva N(5,2), id_jtva_coloana N(4) Null, explicatia4 C(100), explicatia5 C(100), suma N(16,2), taxcode N(6) null, paymentcode C(9) null, id_factc I, perechec I, id_factD I, pereched I, id_fact I)
|
||||
|
||||
Insert Into actactan (id_set, id_fdoc, an, luna, dataact, dataireg, nract, nnir, scd, ascd, scc, ascc, id_partd, id_partc, proc_tva, id_jtva_coloana, explicatia, explicatia5, suma) ;
|
||||
SELECT lnIdSet As id_set, lnIdFdocFactura As id_fdoc, m.lnAn As an, m.lnLuna As luna, dataact, dataact As dataireg, INT(nract), INT(VAL(nir)), ;
|
||||
cont As scd, acont As ascd, '401' As scc, m.lcAcont401 As ascc, 0 As id_partd, id_part As id_partc, ;
|
||||
1 + Round(proctva / 100, 2) As proc_tva, ;
|
||||
CAST(Iif(proctva = 21, m.lnIdBazaAch21, ;
|
||||
Iif(proctva = 11, m.lnIdBazaAch11, ;
|
||||
Iif(proctva = 19, m.lnIdBazaAch19, ;
|
||||
Iif(proctva = 9, m.lnIdBazaAch9, ;
|
||||
Iif(proctva = 5, m.lnIdBazaAch5, ;
|
||||
Iif(proctva = 0, m.lnIdBazaAch0, ;
|
||||
m.lnIdBazaAchS)))))) AS N(4)) As id_jtva_coloana, ;
|
||||
sectie As explicatia, lcExplicatia5 As explicatia5, ;
|
||||
SUM(ROUND(VALACH,2)) As suma ;
|
||||
FROM cIntrari ;
|
||||
Group by 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18
|
||||
|
||||
DO Raport WITH 'actactan baza = ' + TRANSFORM(RECCOUNT('actactan')) + ' randuri'
|
||||
|
||||
SELECT c.nir, c.nract, c.dataact, c.sectie, c.proctva, c.valach ;
|
||||
FROM cIntrari c ;
|
||||
WHERE INT(VAL(c.nir)) NOT IN (SELECT nnir FROM actactan) ;
|
||||
INTO CURSOR cPierduteAct
|
||||
DO Raport WITH 'LIPSA in actactan = ' + TRANSFORM(RECCOUNT('cPierduteAct'))
|
||||
|
||||
* nnir care se suprapun (doua nir diferite -> acelasi nnir)
|
||||
SELECT nnir, COUNT(*) as nr FROM actactan GROUP BY nnir HAVING COUNT(*) > 1 INTO CURSOR cColiziuni
|
||||
DO Raport WITH 'nnir cu > 1 rand = ' + TRANSFORM(RECCOUNT('cColiziuni'))
|
||||
|
||||
* verificare directa: facturile despre care stim ca lipsesc din ROA
|
||||
DO Raport WITH ''
|
||||
DO Raport WITH '--- facturile raportate ca lipsa, asa cum arata in actactan ---'
|
||||
SELECT nract, nnir, DTOC(dataact) as zi, scd, ascd, id_partc, suma, explicatia ;
|
||||
FROM actactan ;
|
||||
WHERE INLIST(nract, 30285003, 1178734, 30285604, 154, 30286234, 30286444, 30286604, 6019064715, 30286873, 6019082505, 30287485) ;
|
||||
ORDER BY dataact, nract INTO CURSOR cVerif
|
||||
SELECT cVerif
|
||||
SCAN
|
||||
DO Raport WITH ' nract=' + TRANSFORM(nract) + ' nnir=' + TRANSFORM(nnir) + ' ' + zi + ' ' + scd + '/' + NVL(ascd,'') + ' idp=' + TRANSFORM(id_partc) + ' suma=' + TRANSFORM(suma)
|
||||
ENDSCAN
|
||||
|
||||
SELECT actactan
|
||||
COPY TO (m.lcDir + 'dry_actactan.csv') TYPE CSV
|
||||
SELECT cIntrari
|
||||
COPY TO (m.lcDir + 'dry_cintrari.csv') TYPE CSV
|
||||
|
||||
QUIT
|
||||
|
||||
PROCEDURE Raport
|
||||
LPARAMETERS tcText
|
||||
STRTOFILE(m.tcText + CHR(13) + CHR(10), m.gcDryLog, 1)
|
||||
ENDPROC
|
||||
|
||||
PROCEDURE ListaPierdute
|
||||
LPARAMETERS tcAlias
|
||||
LOCAL lnArie
|
||||
lnArie = SELECT()
|
||||
SELECT (m.tcAlias)
|
||||
SCAN
|
||||
DO Raport WITH ' ' + ALLTRIM(idinregistrare) + ' nr=' + ALLTRIM(nrdocument) + ' ' + ALLTRIM(denumirefurnizor) + ' ' + TRANSFORM(valoareajustatafaratva)
|
||||
ENDSCAN
|
||||
SELECT (m.lnArie)
|
||||
ENDPROC
|
||||
@@ -1,3 +1,16 @@
|
||||
<!--
|
||||
21/08/2026
|
||||
FLORA2ROA - 2.0.8
|
||||
|
||||
:eroare:
|
||||
Verificarea facturilor deja importate se face acum document cu document, nu doar pe primul
|
||||
document din interval. Inainte, daca primul document exista deja in ROA nu se mai importa
|
||||
nimic din tot intervalul, iar daca nu exista se rescriau si documentele deja importate,
|
||||
care apareau duplicate.
|
||||
Bifa "Nu scrie note contabile" genereaza din nou fisierul xls cu notele, chiar daca
|
||||
actualizarea partenerilor in ROA nu a reusit.
|
||||
-->
|
||||
|
||||
<!--
|
||||
18/08/2026
|
||||
FLORA2ROA - 2.0.7
|
||||
|
||||
@@ -1 +1 @@
|
||||
2.0.7
|
||||
2.0.8
|
||||
173
frm_import.sc2
173
frm_import.sc2
@@ -46,6 +46,7 @@ DEFINE CLASS form1 AS form
|
||||
*m: creeazanote
|
||||
*m: disconnectmentor
|
||||
*m: disconnectroa
|
||||
*m: eliminafacturiduplicate
|
||||
*m: exportdate
|
||||
*m: getidpartener
|
||||
*m: getidpartenerroa
|
||||
@@ -53,7 +54,6 @@ DEFINE CLASS form1 AS form
|
||||
*m: sql_temp_insert
|
||||
*m: sterge_import
|
||||
*m: trace
|
||||
*m: verificafactura
|
||||
*p: nhandlementor
|
||||
*p: _memberdata && XML Metadata for customizable properties
|
||||
*</DefinedPropArrayMethod>
|
||||
@@ -77,6 +77,7 @@ DEFINE CLASS form1 AS form
|
||||
<memberdata name="completeazaparteneriroa" display="CompleteazaParteneriROA"/>
|
||||
<memberdata name="getidpartener" display="GetIdPartener"/>
|
||||
<memberdata name="getidpartenerroa" display="GetIdPartenerROA"/>
|
||||
<memberdata name="eliminafacturiduplicate" display="EliminaFacturiDuplicate"/>
|
||||
</VFPData>
|
||||
*</PropValue>
|
||||
|
||||
@@ -646,12 +647,12 @@ DEFINE CLASS form1 AS form
|
||||
* VANZARI - nu iau in considerare TipPlata = "MD BUFET"
|
||||
|
||||
* Creeaza actactan cu note contabile vanzari
|
||||
Local lnIdPartCasa, lnIdPartCard, lnSucces, lnIdSet, lnVerificaFacturi
|
||||
Local lnIdPartCasa, lnIdPartCard, lnSucces, lnIdSet, lnVerificaFacturi, lnSuccesDuplicat
|
||||
Local lcAcontTVAAchizitie, lcAcontTVAVanzare, lcContTVAAchizitie, lcContTVAVanzare, lcDirImport
|
||||
Local lcDirOutput, lcExplicatia5, lcFileOutput, ldDataImport, llFacturaDuplicat, llImport, lnAn
|
||||
Local lcDirOutput, lcExplicatia5, lcFileOutput, ldDataImport, llImport, lnAn
|
||||
Local lnIdBazaAch0, lnIdBazaAch19, lnIdBazaAch20, lnIdBazaAch24, lnIdBazaAch5, lnIdBazaAch9
|
||||
Local lnIdFdoc, lnIdFdocBonConsum, lnIdFdocBonFiscal, lnIdFdocFactura, lnIdFdocMonetar, lnIdTVAAch19
|
||||
Local lnIdTVAAch20, lnIdTVAAch24, lnIdTVAAch5, lnIdTVAAch9, lnLuna, lnTVAIncasare, loRec, lcAcontMf4428
|
||||
Local lnIdTVAAch20, lnIdTVAAch24, lnIdTVAAch5, lnIdTVAAch9, lnLuna, lnTVAIncasare, lcAcontMf4428
|
||||
Local lcAContCardRestaurant, lcAContCasaRestaurant, lcAContFacturaCardHotel, lcAContFacturaCasaHotel
|
||||
Local lcAContFacturaTicheteHotel, lcAContFacturaViramentIntHotel, lcAContTicheteRestaurant
|
||||
Local lcAcont401, lcAcontCardHotel, lcAcontCasaHotel, lcAcontClientiHotel, lcAcontClientiRestaurant
|
||||
@@ -1383,24 +1384,28 @@ DEFINE CLASS form1 AS form
|
||||
UPDATE actactan SET ascd = ALLTRIM(STRTRAN(ascd, CHR(9), '')), ascc = ALLTRIM(STRTRAN(ascc, CHR(9), ''))
|
||||
USE IN (SELECT('tAct'))
|
||||
|
||||
SET STEP ON
|
||||
llFacturaDuplicat = .F.
|
||||
* Scot din lot documentele care exista deja in ROA, comparate unul cate unul
|
||||
lnSuccesDuplicat = CT_SUCCES
|
||||
If m.lnVerificaFacturi = 1
|
||||
Select actactan
|
||||
Go Top
|
||||
Scatter Name loRec Memo
|
||||
llFacturaDuplicat = This.VerificaFactura(loRec)
|
||||
lnSuccesDuplicat = This.EliminaFacturiDuplicate(m.lnIdSet)
|
||||
Endif
|
||||
|
||||
If m.llTest OR !m.llFacturaDuplicat
|
||||
This.Scrienote()
|
||||
* In modul de test notele nu ajung in ROA, deci xls-ul de verificare se face si
|
||||
* atunci cand verificarea de duplicate nu a reusit
|
||||
If m.llTest Or m.lnSuccesDuplicat = CT_SUCCES
|
||||
If Reccount('actactan') > 0
|
||||
This.Scrienote()
|
||||
Else
|
||||
This.trace('Toate documentele din interval exista deja in ROA, nu se scrie nimic.')
|
||||
Endif
|
||||
Else
|
||||
lnSucces = CT_INSUCCES
|
||||
Endif
|
||||
|
||||
|
||||
Endif && m.llImport
|
||||
|
||||
Use In (Select('actactan'))
|
||||
SET STEP ON
|
||||
If Used('act_test')
|
||||
lcDirOutput = Addbs(m.lcDirImport)
|
||||
lcFileOutput = m.lcDirOutput + 'act_test' + Sys(2) + '.xls'
|
||||
@@ -1437,6 +1442,88 @@ DEFINE CLASS form1 AS form
|
||||
RETURN m.lnSucces
|
||||
ENDPROC
|
||||
|
||||
PROCEDURE eliminafacturiduplicate
|
||||
Lparameters tnIdSet
|
||||
* Scoate din actactan documentele care exista deja in ROA, comparate document cu document
|
||||
* dupa (an, luna, id_set, nract, dataact, explicatia5).
|
||||
* Intoarce CT_INSUCCES daca verificarea nu s-a putut face, ca lotul sa nu fie scris nefiltrat.
|
||||
Private gnAn, gnIdSet, gnLuna
|
||||
|
||||
Local lcCheie, lcMesaj, lcSql, lnEliminate, lnRamase, lnSucces, lnTotal
|
||||
|
||||
If !Used('actactan') Or Reccount('actactan') = 0
|
||||
Return CT_SUCCES
|
||||
Endif
|
||||
|
||||
gnIdSet = Evl(m.tnIdSet, 50100)
|
||||
This.trace('Verificare documente deja existente in ROA')
|
||||
|
||||
lnSucces = This.Connectroa()
|
||||
If m.lnSucces <> CT_SUCCES
|
||||
Return m.lnSucces
|
||||
Endif
|
||||
|
||||
* Cheia unui document: an + luna + nract + dataact + explicatia5
|
||||
Create Cursor cFacturiRoa (cheie C(58))
|
||||
Index On cheie Tag cheie
|
||||
|
||||
Select Distinct an, luna From actactan Into Cursor cAnLunaRoa
|
||||
Select cAnLunaRoa
|
||||
Scan
|
||||
gnAn = an
|
||||
gnLuna = luna
|
||||
lcSql = [select distinct nract, dataact, explicatia5 from act ] + ;
|
||||
[where sters = 0 and an = ?gnAn and luna = ?gnLuna and id_set = ?gnIdSet]
|
||||
lnSucces = goExecutor.oExecute(GetHash('cCursor=>cActRoa??cSql=>' + m.lcSql))
|
||||
If m.lnSucces <> CT_SUCCES
|
||||
lcMesaj = goExecutor.cEroare
|
||||
This.trace(m.lcMesaj)
|
||||
AMESSAGEBOX(m.lcMesaj, 0 + 48, 'Atentie!')
|
||||
Exit
|
||||
Endif
|
||||
|
||||
Select cActRoa
|
||||
Scan
|
||||
lcCheie = Padl(m.gnAn, 4, '0') + Padl(m.gnLuna, 2, '0') + ;
|
||||
Padl(Alltrim(Str(Int(Nvl(cActRoa.nract, 0)), 14, 0)), 14, '0') + ;
|
||||
Dtos(Nvl(cActRoa.dataact, {})) + Padr(Alltrim(Nvl(cActRoa.explicatia5, '')), 30)
|
||||
Insert Into cFacturiRoa (cheie) Values (m.lcCheie)
|
||||
Endscan
|
||||
If Used('cActRoa')
|
||||
Use In cActRoa
|
||||
Endif
|
||||
Select cAnLunaRoa
|
||||
Endscan
|
||||
Use In cAnLunaRoa
|
||||
|
||||
This.Disconnectroa()
|
||||
|
||||
If m.lnSucces <> CT_SUCCES
|
||||
Use In cFacturiRoa
|
||||
Return m.lnSucces
|
||||
Endif
|
||||
|
||||
lnTotal = Reccount('actactan')
|
||||
Select actactan
|
||||
Delete For Indexseek(Padl(an, 4, '0') + Padl(luna, 2, '0') + ;
|
||||
Padl(Alltrim(Str(Int(nract), 14, 0)), 14, '0') + ;
|
||||
Dtos(dataact) + Padr(Alltrim(Nvl(explicatia5, '')), 30), .F., 'cFacturiRoa', 'cheie')
|
||||
Use In cFacturiRoa
|
||||
|
||||
* Rescriu cursorul ca randurile sterse sa dispara fizic, nu doar marcate
|
||||
Select * From actactan Into Cursor cActRamase
|
||||
lnRamase = Reccount('cActRamase')
|
||||
Use In actactan
|
||||
Select * From cActRamase Into Cursor actactan Readwrite
|
||||
Use In cActRamase
|
||||
|
||||
lnEliminate = m.lnTotal - m.lnRamase
|
||||
This.trace('Randuri deja existente in ROA, scoase din lot: ' + Transform(m.lnEliminate) + ;
|
||||
' din ' + Transform(m.lnTotal))
|
||||
|
||||
Return CT_SUCCES
|
||||
ENDPROC
|
||||
|
||||
PROCEDURE exportdate
|
||||
Local laFiles[1], lcDirImport, ldDataImport, lnAn, lnFiles, lnLuna, lnSucces
|
||||
Local lcFile, lcPrefix, lnFile
|
||||
@@ -1865,7 +1952,6 @@ DEFINE CLASS form1 AS form
|
||||
lnAn = Year(m.ldDataImport)
|
||||
lcDirImport = Addbs(Alltrim(goApp.oSettings.cale_import)) + Alltrim(Str(m.lnAn)) + '\' + Padl(m.lnLuna, 2, '0') + '\'
|
||||
lnSucces = CT_INSUCCES
|
||||
SET STEP ON
|
||||
llTest = (This.chkTest.Value = 1)
|
||||
If m.llTest
|
||||
thisform.trace('Salvare note in xls, fara scriere in Registrul Jurnal')
|
||||
@@ -2241,54 +2327,6 @@ DEFINE CLASS form1 AS form
|
||||
This.edtInfo.Refresh()
|
||||
ENDPROC
|
||||
|
||||
PROCEDURE verificafactura
|
||||
Lparameters toRec
|
||||
Private gnAn, gnIdSucursala, gnIdUtil, gnLuna, gcExplicatia5, gdDataAct, gnIdSet, gnNrAct
|
||||
|
||||
Local lcMesaj, lcSql, lnHandle, lnInregistrari, lnSucces
|
||||
lnInregistrari = 0
|
||||
lnSucces = This.Connectroa()
|
||||
If lnSucces = CT_SUCCES
|
||||
lnHandle = goConn.nHandle
|
||||
Endif
|
||||
|
||||
If lnSucces = CT_SUCCES
|
||||
gnAn = toRec.an
|
||||
gnLuna = toRec.luna
|
||||
gnIdUtil = - 3
|
||||
gnIdSucursala = Null
|
||||
gnNrAct = toRec.nract
|
||||
gdDataAct = toRec.dataact
|
||||
gnIdSet = toRec.id_set
|
||||
gcExplicatia5 = Alltrim(toRec.explicatia5)
|
||||
|
||||
lcSql = [select COUNT(*) as nr from act where sters = 0 and an = ?gnAn and luna = ?gnLuna and nract = ?gnNrAct and dataact = ?gdDataAct and id_set = ?gnIdSet and explicatia5 = ?gcExplicatia5]
|
||||
lnSucces = goExecutor.oExecute(GetHash("cCursor=>cInregistrari??cSql=>" + lcSql))
|
||||
|
||||
If lnSucces = CT_SUCCES
|
||||
If !Used('cInregistrari')
|
||||
lnInregistrari = 1 && daca da eroare, consider duplicat ca sa nu se insereze din greseala
|
||||
lnSucces = CT_INSUCCES
|
||||
lcMesaj = 'Nu exista cursorul cInregistrari cu numarul de inregistrari ale facturii!'
|
||||
This.trace(m.lcMesaj)
|
||||
Messagebox(m.lcMesaj, 0 + 48, 'Atentie!')
|
||||
Else
|
||||
lnInregistrari = cInregistrari.nr
|
||||
ENDIF
|
||||
ELSE
|
||||
lnInregistrari = 1 && daca da eroare, consider duplicat ca sa nu se insereze din greseala
|
||||
This.trace(goExecutor.cEroare)
|
||||
Messagebox(goExecutor.cEroare, 0 + 48, 'Atentie!')
|
||||
ENDIF
|
||||
|
||||
USE IN (SELECT('cInregistrari'))
|
||||
Endif && lnSucces
|
||||
|
||||
This.Disconnectroa()
|
||||
|
||||
Return (m.lnInregistrari > 0)
|
||||
ENDPROC
|
||||
|
||||
PROCEDURE chkTVAIncasare.Valid
|
||||
goApp.oSettings.SetVariable([general], [tva_incasare], thisform.chkTVAIncasare.Value)
|
||||
|
||||
@@ -2297,15 +2335,22 @@ DEFINE CLASS form1 AS form
|
||||
PROCEDURE cmdExport.Click
|
||||
Close Databases All
|
||||
|
||||
Local llSucces, ldData1, loEx as Exception
|
||||
Local lnSucces, ldData1, llTest, loEx as Exception
|
||||
ldData1 = Thisform.txtData1.Value
|
||||
llTest = (Thisform.chkTest.Value = 1)
|
||||
|
||||
lnSucces = Thisform.ExportDate()
|
||||
|
||||
If m.lnSucces = CT_SUCCES
|
||||
lnSucces = Thisform.CompleteazaParteneriROA()
|
||||
|
||||
If m.lnSucces = CT_SUCCES
|
||||
* In modul de test notele nu ajung in ROA, deci xls-ul de verificare se genereaza si
|
||||
* atunci cand completarea partenerilor nu a reusit
|
||||
If m.lnSucces <> CT_SUCCES And m.llTest
|
||||
Thisform.Trace('Completarea partenerilor nu a reusit; se continua doar pentru xls-ul de verificare.')
|
||||
Endif
|
||||
|
||||
If m.lnSucces = CT_SUCCES Or m.llTest
|
||||
lnSucces = Thisform.Creeazanote()
|
||||
|
||||
goapp.osettings.SetVariable("general", "last_data1", DTOC(thisform.txtData1.Value))
|
||||
|
||||
Reference in New Issue
Block a user