sync SVN r18103

This commit is contained in:
2026-09-14 23:27:25 +03:00
parent e2e046bd6c
commit 8dcffef439
4 changed files with 1231 additions and 158 deletions

View File

@@ -57,6 +57,12 @@ DEFINE CLASS form1 AS form
*< OBJECTDATA: ObjPath="grdConturi.cDenumire.Text1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="grdConturi.cDataOra.Header1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="grdConturi.cDataOra.Text1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="grdConturi.cSoldI.Header1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="grdConturi.cSoldI.Text1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="grdConturi.cSoldF.Header1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="grdConturi.cSoldF.Text1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="grdConturi.cSoldDif.Header1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="grdConturi.cSoldDif.Text1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="But_sterge1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="grdConfigurareConturi" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="grdConfigurareConturi.cCodFiscal.Header1" UniqueID="" Timestamp="" />
@@ -133,6 +139,7 @@ DEFINE CLASS form1 AS form
*<DefinedPropArrayMethod>
*m: cauta_fdoc
*m: completeazaclientiroa
*m: completeazasolduri
*m: connectroa
*m: creeazanote
*m: disconnectroa
@@ -507,7 +514,7 @@ DEFINE CLASS form1 AS form
ADD OBJECT 'grdConturi' AS grid WITH ;
Anchor = 11, ;
ColumnCount = 12, ;
ColumnCount = 15, ;
DeleteMark = .F., ;
HeaderHeight = 30, ;
Height = 226, ;
@@ -586,7 +593,19 @@ DEFINE CLASS form1 AS form
Column12.ControlSource = "dataora", ;
Column12.Name = "cDataOra", ;
Column12.ReadOnly = .T., ;
Column12.Width = 108
Column12.Width = 108, ;
Column13.ControlSource = "sold_i", ;
Column13.Name = "cSoldI", ;
Column13.ReadOnly = .T., ;
Column13.Width = 75, ;
Column14.ControlSource = "sold_f", ;
Column14.Name = "cSoldF", ;
Column14.ReadOnly = .T., ;
Column14.Width = 75, ;
Column15.ControlSource = "sold_dif", ;
Column15.Name = "cSoldDif", ;
Column15.ReadOnly = .T., ;
Column15.Width = 75
*< END OBJECT: BaseClass="grid" />
ADD OBJECT 'grdConturi.cAcont.Header1' AS header WITH ;
@@ -785,6 +804,51 @@ DEFINE CLASS form1 AS form
Name = "Text1"
*< END OBJECT: BaseClass="textbox" />
ADD OBJECT 'grdConturi.cSoldDif.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "Diferenta", ;
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT 'grdConturi.cSoldDif.Text1' AS textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1", ;
ReadOnly = .T.
*< END OBJECT: BaseClass="textbox" />
ADD OBJECT 'grdConturi.cSoldF.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "Sold final", ;
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT 'grdConturi.cSoldF.Text1' AS textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1", ;
ReadOnly = .T.
*< END OBJECT: BaseClass="textbox" />
ADD OBJECT 'grdConturi.cSoldI.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "Sold initial", ;
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT 'grdConturi.cSoldI.Text1' AS textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1", ;
ReadOnly = .T.
*< END OBJECT: BaseClass="textbox" />
ADD OBJECT 'grdConturi.cTip.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "Tip", ;
@@ -1359,6 +1423,17 @@ DEFINE CLASS form1 AS form
PROCEDURE completeazaclientiroa
ENDPROC
PROCEDURE completeazasolduri
LPARAMETERS toImport
LOCAL lnIncasari, lnPlati
lnIncasari = 0
lnPlati = 0
CALCULATE SUM(suma) FOR tip = 'C' TO lnIncasari IN C_IMPORT_TEMP
CALCULATE SUM(suma) FOR tip = 'D' TO lnPlati IN C_IMPORT_TEMP
REPLACE valuta WITH m.toImport.cValuta, sold_i WITH m.toImport.nSoldInitial, sold_f WITH m.toImport.nSoldFinal IN cConturi
REPLACE sold_dif WITH cConturi.sold_i + m.lnIncasari - m.lnPlati - cConturi.sold_f IN cConturi
ENDPROC
PROCEDURE connectroa
ENDPROC
@@ -1427,6 +1502,7 @@ DEFINE CLASS form1 AS form
* Colorez cu albastru inregistrarile pentru import
this.grdConturi.SetAll("DynamicForeColor", "IIF(cConturi.note = 1, RGB(0,128,0), IIF(cConturi.import = 1, RGB(0,0,128), RGB(0,0,0)))","Column")
this.grdConturi.cSoldDif.DynamicForeColor = "IIF(NVL(sold_dif,0)<>0, RGB(255,0,0), RGB(0,0,0))"
this.gridextra1.setup()
this.gridextra2.setup()
@@ -1438,7 +1514,7 @@ DEFINE CLASS form1 AS form
PROCEDURE Load
CREATE CURSOR cConturi (ales N(1), note N(1), import N(1), banca C(100), iban C(100), clasa C(100), fisier C(250), ;
tip C(20), extensie C(4), tipclasa C(100), cont C(4), acont C(4), part_nou L, factura L, comanda L, denumire C(100), id_part N(10), dataora T)
tip C(20), extensie C(4), tipclasa C(100), cont C(4), acont C(4), part_nou L, factura L, comanda L, denumire C(100), id_part N(10), dataora T, valuta C(3), sold_i N(15,2) NULL, sold_f N(15,2) NULL, sold_dif N(15,2) NULL, sold_dubl N(15,2))
* Trebuie sa citesc configurarile pentru fiecare IBAN
CREATE CURSOR cConfigConturi(iban C(100), id_part N(10), denumire C(200), cod_fiscal C(50), cont C(4), acont C(4))
@@ -1477,7 +1553,7 @@ DEFINE CLASS form1 AS form
Select cConturi
Append From Dbf('cConturiTemp')
Use In (Select('cConturiTemp'))
UPDATE cConturi SET import = 0, ales = 0, note = 0
UPDATE cConturi SET import = 0, ales = 0, note = 0, sold_i = .NULL., sold_f = .NULL., sold_dif = .NULL., sold_dubl = 0
* Completez numele partenerilor tip BANCA
* Caut si pentru conturile care au denumirea partenerului completata, in cazul in care s-a modificat intre timp
@@ -1598,13 +1674,78 @@ DEFINE CLASS form1 AS form
If m.llSucces AND !m.tlIncarcaBackup
Select actactan_temp
IF USED('actactan')
* actactan_temp are structura vact (SELECT * FROM vact WHERE 1=2), un camp nou pe actactan nu supravietuieste acestui Append From Dbf - salvez randurile marcate intr-un cursor paralel, cheie pe pozitia in randurile nesterse (Recno() nu coincide cu pozitia din tact dupa un DELETE fara PACK)
IF Type('actactan.listoric') = 'L' OR Type('actactan.dublura') = 'L' OR Type('actactan.ngrupa') = 'N'
lnSeqMarcaj = 0
IF Type('actactan.listoric') = 'L'
Create Cursor cIstoricMarcaj (nrseq N(6))
Index On nrseq Tag nrseq
ENDIF
IF Type('actactan.dublura') = 'L'
Create Cursor cDubluraMarcaj (nrseq N(6))
Index On nrseq Tag nrseq
ENDIF
IF Type('actactan.ngrupa') = 'N'
Create Cursor cGrupaMarcaj (nrseq N(6), ngrupa I, npoz I, csursa C(1))
Index On nrseq Tag nrseq
ENDIF
Select actactan
Scan
lnSeqMarcaj = lnSeqMarcaj + 1
IF Type('actactan.listoric') = 'L' AND listoric
Insert Into cIstoricMarcaj (nrseq) Values (lnSeqMarcaj)
ENDIF
IF Type('actactan.dublura') = 'L' AND dublura
Insert Into cDubluraMarcaj (nrseq) Values (lnSeqMarcaj)
ENDIF
IF Type('actactan.ngrupa') = 'N' AND ngrupa > 0
Insert Into cGrupaMarcaj (nrseq, ngrupa, npoz, csursa) Values (lnSeqMarcaj, actactan.ngrupa, actactan.npoz, actactan.csursa_f)
ENDIF
Endscan
ENDIF
Select actactan_temp
Append From Dbf('actactan')
ENDIF
ENDIF
Select .F. As ales, a.explicatia4 As iban, Iif(!Empty(Nvl(a.id_jtva_coloana, 0)), 1, 0) As Cu_tva, Cast(0 As N(2)) As tipnota, a.*, b.denumire As explicatie_tva_2 ;
Select .F. As ales, a.explicatia4 As iban, Iif(!Empty(Nvl(a.id_jtva_coloana, 0)), 1, 0) As Cu_tva, Cast(0 As N(2)) As tipnota, .F. As listoric, .F. As dublura, Cast(0 As I) As ngrupa, Cast(0 As I) As npoz, Space(1) As csursa_f, a.*, b.denumire As explicatie_tva_2 ;
From actactan_temp a Left Join crsExplicatiiTVATemp b On a.id_jtva_coloana = b.id_jtva_coloana ;
Into Cursor tact Readwrite
IF Used('cIstoricMarcaj')
Select tact
Scan
If Seek(Recno(), 'cIstoricMarcaj', 'nrseq')
Replace listoric With .T.
Endif
Endscan
Use In cIstoricMarcaj
ENDIF
IF Used('cDubluraMarcaj')
Select tact
Scan
If Seek(Recno(), 'cDubluraMarcaj', 'nrseq')
Replace dublura With .T.
Endif
Endscan
Use In cDubluraMarcaj
ENDIF
IF Used('cGrupaMarcaj')
* renumerotare in ordinea din tact: grupele consecutive devin 1,2,3...
lnGrupaNoua = 0
lnGrupaVeche = 0
Select tact
Scan
If Seek(Recno(), 'cGrupaMarcaj', 'nrseq')
If cGrupaMarcaj.ngrupa <> lnGrupaVeche
lnGrupaVeche = cGrupaMarcaj.ngrupa
lnGrupaNoua = lnGrupaNoua + 1
Endif
Replace ngrupa With lnGrupaNoua, npoz With cGrupaMarcaj.npoz, csursa_f With cGrupaMarcaj.csursa
Endif
Endscan
Use In cGrupaMarcaj
ENDIF
Update tact Set explicatie_tva = explicatie_tva_2, explicatia4 = '', id_Set = m.lnIdSet, explicatia5 = 'IMPORT ' + STRTRAN(TTOC(DATETIME(),3), 'T', ' ')
UPDATE tAct SET nract = INT(VAL(DTOS(dataact) + ALLTRIM(STR(RECNO())))) WHERE EMPTY(NVL(nract,0))
@@ -1649,8 +1790,10 @@ DEFINE CLASS form1 AS form
Go Top
llNotaNoua = .T.
llMaximize = .T.
loForm = Createobject([frm_modific2024], m.lnIdSet, m.llNotaNoua)
loForm = Createobject([frm_modific2024], m.lnIdSet, m.llNotaNoua, m.loBackupXML)
loForm.lb_titlu_alb_b121.Caption = 'Import extrase bancare, deconturi curieri, procesatori plati'
*!* activeaza totalurile si autosalvarea automate, specifice acestui apelant
loForm.lActivExtrase = .T.
Select tact
loForm.Show(1, m.llMaximize)
@@ -2096,7 +2239,6 @@ DEFINE CLASS form1 AS form
amessagebox("Nu au fost gasite importuri in luna curenta")
RETURN
Endif
SET STEP ON
lcMenu = ''
SELECT crsStergeri
SCAN
@@ -2137,33 +2279,127 @@ DEFINE CLASS form1 AS form
ENDPROC
PROCEDURE verificaimport
* Verifica daca mai exista inregistrari 90023 in luna curenta
Local llExista, lcSelect, lcSql, llSucces
Private pnReturnValue, pnSuma, pdDataAct, pcScd, pcScc
pnReturnValue = 0
* Numara cate randuri din import (actactan) sunt deja contate dintr-un import anterior 90023, in luna curenta
Local lcSelect, lcSql, lcRaw, llSucces, lnDuplicate
Local ldDataAct, lnSuma, lcScd, lcScc, lcExplicatie, llGasit
Local lnGrupa, lnGrupaDublura, lnNouDublura
Local llBancaPeD, lnIdPartCurent
lcSelect = SELECT()
lnDuplicate = 0
lcSql = [select COUNT(*) as nr from act where an=?gnAn and luna = ?gnLuna and id_set=90023 and sters=0 and suma = ?pnSuma and dataact = ?pdDataAct and scd = ?pcScd and scc = ?pcScc]
lcRaw = 'cActVerifRaw'
IF USED(m.lcRaw)
USE IN (m.lcRaw)
ENDIF
lcSql = [select dataact, suma, scd, scc, explicatia, id_partd, id_partc from act where an=?gnAn and luna=?gnLuna and id_set=90023 and sters=0]
llSucces = goExecutor.oExecuta(m.lcSql, m.lcRaw)
IF !m.llSucces
SELECT (m.lcSelect)
RETURN 0
ENDIF
* .F. AS folosit: marcheaza randurile ACT deja perechate, ca un rand ACT sa nu acopere doua randuri de import
SELECT *, .F. AS folosit FROM (m.lcRaw) INTO CURSOR cActVerif READWRITE
USE IN (m.lcRaw)
IF TYPE('actactan.dublura') = 'U'
* ALTER TABLE da eroarea 1115 pe cursor cu nume de camp peste 10 caractere (explicatia4, id_sucursala)
SELECT *, .F. AS dublura FROM actactan INTO CURSOR cActDublura READWRITE
USE IN actactan
SELECT * FROM cActDublura INTO CURSOR actactan READWRITE
USE IN cActDublura
ENDIF
SELECT actactan
REPLACE ALL dublura WITH .F.
SCAN
pnSuma = suma
pdDataAct = dataact
pcScd = ALLTRIM(scd)
pcScc = ALLTRIM(scc)
llSucces = goExecutor.oSelecteaza2Value(m.lcSql, @pnReturnValue)
If !m.llSucces
IF m.pnReturnValue > 0
EXIT
ENDIF
ELSE
EXIT
Endif
ldDataAct = dataact
lnSuma = suma
lcScd = ALLTRIM(scd)
lcScc = ALLTRIM(scc)
lcExplicatie = ALLTRIM(explicatia)
llBancaPeD = (LEFT(m.lcScd,3)='512')
lnIdPartCurent = NVL(IIF(m.llBancaPeD, id_partc, id_partd),0)
SELECT cActVerif
* doar contul de banca: contul corespondent poate fi corectat la contare
LOCATE FOR !folosit AND dataact = m.ldDataAct AND suma = m.lnSuma AND IIF(m.llBancaPeD, ALLTRIM(scd) == m.lcScd, ALLTRIM(scc) == m.lcScc) AND ALLTRIM(explicatia) == m.lcExplicatie
IF !FOUND()
* fara potrivire pe explicatie: regula veche, pentru note vechi sau explicatie modificata dupa import
LOCATE FOR !folosit AND dataact = m.ldDataAct AND suma = m.lnSuma AND IIF(m.llBancaPeD, ALLTRIM(scd) == m.lcScd, ALLTRIM(scc) == m.lcScc)
ENDIF
llGasit = FOUND()
IF m.llGasit
REPLACE folosit WITH .T.
ENDIF
IF !m.llGasit AND m.lnIdPartCurent > 0
* ponytail: submultimea = toate randurile nefolosite din zi+cont+partener, fara cautare de combinatii - extinde cu subseturi daca apar cazuri ratate
IF m.llBancaPeD
SELECT SUM(suma) AS sumagrup, COUNT(*) AS nr FROM cActVerif WHERE !folosit AND dataact = m.ldDataAct AND ALLTRIM(scd) == m.lcScd AND NVL(id_partc,0) = m.lnIdPartCurent INTO CURSOR cSumaGrupVerif
ELSE
SELECT SUM(suma) AS sumagrup, COUNT(*) AS nr FROM cActVerif WHERE !folosit AND dataact = m.ldDataAct AND ALLTRIM(scc) == m.lcScc AND NVL(id_partd,0) = m.lnIdPartCurent INTO CURSOR cSumaGrupVerif
ENDIF
IF cSumaGrupVerif.nr >= 2 AND ROUND(NVL(cSumaGrupVerif.sumagrup,0),2) == ROUND(m.lnSuma,2)
llGasit = .T.
SELECT cActVerif
IF m.llBancaPeD
REPLACE ALL folosit WITH .T. FOR !folosit AND dataact = m.ldDataAct AND ALLTRIM(scd) == m.lcScd AND NVL(id_partc,0) = m.lnIdPartCurent
ELSE
REPLACE ALL folosit WITH .T. FOR !folosit AND dataact = m.ldDataAct AND ALLTRIM(scc) == m.lcScc AND NVL(id_partd,0) = m.lnIdPartCurent
ENDIF
ENDIF
USE IN cSumaGrupVerif
ENDIF
SELECT actactan
REPLACE dublura WITH m.llGasit
IF m.llGasit
lnDuplicate = m.lnDuplicate + 1
ENDIF
ENDSCAN && actactan
llExista = (m.pnReturnValue > 0)
IF Type('actactan.ngrupa') = 'N'
* randul impartit pe facturi (ngrupa>0) se marcheaza/sterge intreg, niciodata jumatate
SELECT DISTINCT ngrupa FROM actactan WHERE ngrupa > 0 INTO CURSOR cGrupeVerif
SELECT cGrupeVerif
SCAN
lnGrupa = ngrupa
SELECT actactan
COUNT FOR ngrupa = m.lnGrupa AND dublura TO lnGrupaDublura
llGasit = (m.lnGrupaDublura > 0)
IF !m.llGasit
* fara potrivire pe rand in grupa: caut suma intreaga a grupei ca un singur rand ACT vechi, neimpartit
SUM suma FOR ngrupa = m.lnGrupa TO lnSuma
LOCATE FOR ngrupa = m.lnGrupa
ldDataAct = dataact
lcScd = ALLTRIM(scd)
lcScc = ALLTRIM(scc)
llBancaPeD = (LEFT(m.lcScd,3)='512')
lcExplicatie = ALLTRIM(explicatia)
Select (m.lcSelect)
Return m.llExista
SELECT cActVerif
LOCATE FOR !folosit AND dataact = m.ldDataAct AND suma = m.lnSuma AND IIF(m.llBancaPeD, ALLTRIM(scd) == m.lcScd, ALLTRIM(scc) == m.lcScc) AND ALLTRIM(explicatia) == m.lcExplicatie
IF !FOUND()
LOCATE FOR !folosit AND dataact = m.ldDataAct AND suma = m.lnSuma AND IIF(m.llBancaPeD, ALLTRIM(scd) == m.lcScd, ALLTRIM(scc) == m.lcScc)
ENDIF
llGasit = FOUND()
IF m.llGasit
REPLACE folosit WITH .T.
ENDIF
ENDIF
IF m.llGasit
SELECT actactan
COUNT FOR ngrupa = m.lnGrupa AND !dublura TO lnNouDublura
lnDuplicate = m.lnDuplicate + m.lnNouDublura
REPLACE ALL dublura WITH .T. FOR ngrupa = m.lnGrupa
ENDIF
SELECT cGrupeVerif
ENDSCAN && cGrupeVerif
USE IN (SELECT('cGrupeVerif'))
ENDIF
USE IN (SELECT('cActVerif'))
SELECT (m.lcSelect)
Return m.lnDuplicate
ENDPROC
@@ -2289,10 +2525,11 @@ DEFINE CLASS form1 AS form
PROCEDURE cmdGenereazaNote.Click
Local llSucces, lnSucces, lnButon, llContafin, lnIdSet
Local lcCodAMEF, llExistaNote
Local lcCodAMEF, lnDuplicate, lnTotalImport
Local lcAcont, lcCont, lcIBAN, lnIdPart
Local llPartNou
Local lcExplicatie, lcPart, ldData, llComanda, llFactura
Local lcExplicatie, lcPart, ldData, llComanda, llFactura, lcGardaSursa
Local lcAvertizari, llValutaCont
Local loImport As "ImportNote"
@@ -2302,6 +2539,7 @@ DEFINE CLASS form1 AS form
lcSelect = SELECT()
llSucces = .T.
lnIdSet = 90023
lcAvertizari = ''
ldData1 = Thisform.txtData1.Value
ldData2 = Thisform.txtData2.Value
ldData = thisform.txtData.Value
@@ -2321,7 +2559,7 @@ DEFINE CLASS form1 AS form
LOCATE FOR ales = 1 AND Import = 1 AND note = 0
llSucces = FOUND()
IF !m.llSucces
AMESSAGEBOX('Alegeti un cont/decont incarcat pentru care nu s-au generat note!',0+48,_scren.caption)
AMESSAGEBOX('Alegeti un cont/decont incarcat pentru care nu s-au generat note!',0+48,_Screen.Caption)
ENDIF
ENDIF
@@ -2359,6 +2597,12 @@ DEFINE CLASS form1 AS form
If !m.llSucces
Exit
Endif
If !Empty(loImport.oImport.cAvertizareCurs)
lcAvertizari = lcAvertizari + Iif(!Empty(m.lcAvertizari), Chr(13), '') + loImport.oImport.cAvertizareCurs
Endif
* contul facturii (impartit pe cAlocTemp) nu e suprascris de configurarea pe explicatie/partener
lcGardaSursa = IIF(Type('cActTemp.csursa_f') = 'C', ' AND Empty(csursa_f)', '')
* Completez cont, acont, parteneri pe explicatiile din din cConfigExplicatii
Select explicatie, id_part, denumire, Cont, acont From cConfigExplicatii Where iban = m.lcIBAN And !Empty(Nvl(explicatie, '')) Into Cursor cContTemp
@@ -2375,9 +2619,9 @@ DEFINE CLASS form1 AS form
Update cActTemp Set id_partc = m.lnIdPart, partc = m.lcPart Where m.lcExplicatie$UPPER(ALLTRIM(explicatia)) AND scd = m.lcContBanca AND EMPTY(NVL(id_partc, 0))
ENDIF
IF !EMPTY(m.lcCont)
Update cActTemp Set scd = m.lcCont, ascd = m.lcAcont Where m.lcExplicatie$UPPER(ALLTRIM(explicatia)) AND scc = m.lcContBanca
Update cActTemp Set scc = m.lcCont, ascc = m.lcAcont Where m.lcExplicatie$UPPER(ALLTRIM(explicatia)) AND scd = m.lcContBanca
ENDIF
Update cActTemp Set scd = m.lcCont, ascd = m.lcAcont Where m.lcExplicatie$UPPER(ALLTRIM(explicatia)) AND scc = m.lcContBanca &lcGardaSursa
Update cActTemp Set scc = m.lcCont, ascc = m.lcAcont Where m.lcExplicatie$UPPER(ALLTRIM(explicatia)) AND scd = m.lcContBanca &lcGardaSursa
ENDIF
Endscan
Use In (Select('cContTemp'))
@@ -2388,37 +2632,63 @@ DEFINE CLASS form1 AS form
lcCont = Cont
lcAcont = acont
lnIdPart = id_part
Update cActTemp Set scd = m.lcCont, ascd = m.lcAcont Where id_partd = m.lnIdPart
Update cActTemp Set scc = m.lcCont, ascc = m.lcAcont Where id_partc = m.lnIdPart
Update cActTemp Set scd = m.lcCont, ascd = m.lcAcont Where id_partd = m.lnIdPart &lcGardaSursa
Update cActTemp Set scc = m.lcCont, ascc = m.lcAcont Where id_partc = m.lnIdPart &lcGardaSursa
Endscan
Use In (Select('cContTemp'))
If !Used('actactan')
Select * From cActTemp Into Cursor actactan Readwrite
Else
IF Type('cActTemp.ngrupa') = 'N'
* ngrupa unic intre conturi/fisiere acumulate in acelasi actactan
Update cActTemp Set ngrupa = ngrupa + Reccount('actactan') Where ngrupa > 0
ENDIF
Select actactan
Append From Dbf('cActTemp')
Endif
Use In (Select('cActTemp'))
Release loImport
Endscan
If !Empty(m.lcAvertizari)
AMESSAGEBOX(m.lcAvertizari, 0+48, _Screen.Caption)
Endif
Endif && llSucces
llSucces = llSucces and USED('actactan')
* verific daca mai exista import 90023
IF m.llSucces
llExistaNote = Thisform.VerificaImport()
If m.llExistaNote
If AMESSAGEBOX('Atentie! Exista deja note contabile generate dintr-un import anterior [tip operatie 90023]!' + Chr(13) + ;
'Doriti sa continuati?', 4 + 32, _Screen.Caption) <> 6
llSucces = .F.
UPDATE cConturi SET sold_dubl = 0 WHERE ales = 1 AND import = 1 AND note = 0
lnTotalImport = RECCOUNT('actactan')
lnDuplicate = Thisform.VerificaImport()
If m.lnDuplicate > 0
If AMESSAGEBOX('Din ' + TRANSFORM(m.lnTotalImport) + ' randuri, ' + TRANSFORM(m.lnDuplicate) + ' sunt deja contate dintr-un import anterior (tip operatie 90023). Le scoateti din import?', 4 + 32, _Screen.Caption) = 6
SELECT actactan
* PACK esueaza pe cursor (nu suporta 'Invalid operation') - DELETE ramane suficient cat timp SET DELETED ON
SET DELETED ON
SELECT cConturi
SCAN FOR ales = 1 AND import = 1 AND note = 0
lcIBAN = Alltrim(Nvl(iban,''))
llValutaCont = (Alltrim(Nvl(valuta,'RON')) <> 'RON')
SELECT Sum(Iif(Left(Nvl(scd,''),3)='512', Iif(m.llValutaCont, suma_val, suma), 0.00)) - Sum(Iif(Left(Nvl(scc,''),3)='512', Iif(m.llValutaCont, suma_val, suma), 0.00)) As dif From actactan Where dublura And Alltrim(Nvl(explicatia4,'')) == m.lcIBAN Into Cursor cDublTemp
REPLACE sold_dubl WITH Nvl(cDublTemp.dif,0) IN cConturi
USE IN cDublTemp
ENDSCAN
SELECT actactan
DELETE FOR dublura
IF m.lnTotalImport - m.lnDuplicate = 0
AMESSAGEBOX('Nu a ramas nicio inregistrare de importat!', 0 + 48, _Screen.Caption)
llSucces = .F.
ENDIF
Endif
ENDIF
ENDIF
If m.llSucces
SELECT iban, valuta, sold_i, sold_f, sold_dubl From cConturi Where ales = 1 And import = 1 And note = 0 Into Cursor cSolduriExtrase
llSucces = Thisform.ModificaNote()
USE IN cSolduriExtrase
Endif
If m.llSucces
@@ -2443,7 +2713,7 @@ DEFINE CLASS form1 AS form
Local llSucces, lnOptiune, ldData1, ldData2, ldData
Local lcAcontBanca, lcIBAN, lcValuta
lcIBAN = ''
lnOptiune = xmenu('\<Import general (se determina automat tipul de fisier);\-;Extras bancar - MT940;Extras bancar CreditEurope - XML;Extras bancar Unicredit - CSV;\-;Note contabile salvate anterior')
lnOptiune = xmenu('\<Import fisier;Reluare import anterior')
If Empty(m.lnOptiune)
Return
@@ -2462,21 +2732,7 @@ DEFINE CLASS form1 AS form
lcClassType = ''
lcFileType = ''
Case m.lnOptiune = 3
lcFileExt = 'TXT'
lcClassType = 'RAIFFEISEN'
lcFileType = 'MT940'
Case m.lnOptiune = 4
lcFileExt = 'XML'
lcClassType = 'CREDITEUROPE'
Case m.lnOptiune = 5
lcFileExt = 'CSV'
lcClassType = 'UNICREDIT'
Case m.lnOptiune = 7
SET STEP ON
Case m.lnOptiune = 2
llSucces = Thisform.ModificaNote(.T.)
RETURN
Endcase
@@ -2510,13 +2766,14 @@ DEFINE CLASS form1 AS form
If !Found()
Append Blank
Replace iban With m.lcIBAN, banca With m.lcClassType, clasa With 'ExtrasBanca', fisier With m.lcFile, extensie With m.lcFileExt, tip With m.lcFileType, tipclasa With m.lcClassType, ;
Cont With m.lcContBanca, Import With 1, ales WITH 1, note WITH 0, factura WITH .T.
Cont With loImport.oImport.cContBanca, Import With 1, ales WITH 1, note WITH 0, factura WITH .T.
Else
Replace banca With m.lcClassType, clasa With 'ExtrasBanca', fisier With m.lcFile, extensie With m.lcFileExt, tipclasa With m.lcClassType, Import With 1, ales WITH 1, note WITH 0
If Empty(Cont)
Replace Cont With m.lcContBanca
Endif
Endif
Thisform.CompleteazaSolduri(loImport.oImport)
DELETE FROM cExtrase WHERE eiban = m.lcIBAN

File diff suppressed because it is too large Load Diff

View File

@@ -225,3 +225,17 @@ Sursa: `docs/diff-TRANSA-cache-anaf.md`, `docs/handoff_cache_anaf.md`.
- **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.
## Amanari review /autoplan — import extrase (13.09.2026)
## P2 — Acceptare in bloc a randurilor sigure la importul de extrase
- **Ce:** in `frm_modific2024`, "accepta toate verzile": randurile cu partener din CUI/IBAN exact si factura cu nr. in text + sold exact se confirma dintr-un clic, cu urma de audit; operatorul lucreaza doar exceptiile.
- **De ce:** 300 de randuri/luna verificate unul cate unul; minutele pe extras sunt metrica reala, nu procentul de potrivire.
- **Contra:** contrazice premisa confirmata "verificare rand cu rand"; cere intai precizie masurata out-of-sample.
- **Context:** `docs/plan_import_extrase_review.md` C6. **Efort:** M → S. **Depinde de:** Nivel 1 + Nivel 2 livrate, backtest.
## P3 — Flux bancar PSD2 in locul fisierului lunar
- **Ce:** test cu un agregator licentiat (AISP) pentru BT/BCR care alimenteaza acelasi motor de identificare.
- **De ce:** SmartBill/Oblio aduc deja tranzactiile automat; "import fisier lunar" imbatraneste in 12-24 luni.
- **Contra:** contract cu agregator, consimtamant per client, cost recurent.
- **Context:** review C7; motorul din Nivel 1 se scrie independent de sursa. **Efort:** L → M. **Depinde de:** decizie comerciala.

View File

@@ -1,3 +1,19 @@
<!--
14/09/2026
ROACONT - 2.11.77
:nou:
Import extrase bancare. Partenerul se identifica si se propune si dupa platile lui din ultimele 12 luni, nu doar dupa CUI, denumire sau IBAN.
Plata se defalca automat pe facturile neachitate ale partenerului, iar ce depaseste soldul trece ca avans; pana acum se lega doar o singura factura.
Meniul de import s-a simplificat: Import din fisier si Reluare import anterior.
Import extrase bancare. Sunt semnalate liniile din extrase importate anterior.
Se afiseaza totalul incasarilor si platilor, cu soldul initial si final.
-->
<!--
11/09/2026
ROACONT - 2.11.76