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:
2026-08-21 21:09:26 +03:00
parent 60eae1e490
commit 4c9b6cbddb
6 changed files with 433 additions and 65 deletions

1
.gitignore vendored
View File

@@ -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/

View 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
View 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

View File

@@ -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

View File

@@ -1 +1 @@
2.0.7
2.0.8

View File

@@ -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))