Import parteneri: cautare pe codul salvat si preluarea partenerului cel mai vechi

Importul cauta partenerul dupa codul brut din XML, dar il salva pe cel intors de
GetCodFiscalValid, care la persoana fizica poate lua CNP-ul din campul de serie CI /
pasaport. Cand cele doua difera, partenerul nu era gasit niciodata si pack_def.adauga_partener
respingea inserarea ("Mai exista un partener cu acest CNP"), oprind tot importul.

- cautarea se face acum pe codul cu care partenerul chiar se salveaza, cu revenire pe codul
  brut si pe cheia externa a importului;
- GetIdPartener() intoarce partenerul cel mai vechi cand mai multi au acelasi cod fiscal;
- GetIdPartenerROA() preia partenerul existent din ROA dupa refuzul procedurii, ca importul
  sa continue; se opreste doar daca nici acolo nu exista;
- lcCod nu mai e suprascris cu codul fiscal, deci in coresp_parteneri se scrie iar cheia
  externa, nu codul fiscal.

Verificat pe baza reala cu Teste\test_parteneri_roa.prg (doar SELECT, in afara suitei
implicite); suita implicita ramane PASS.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PTZNiJg2pZk1rky1rpw94u
This commit is contained in:
2026-08-18 13:34:53 +03:00
parent 36b116c00d
commit de23611b4d
5 changed files with 230 additions and 63 deletions

View File

@@ -47,6 +47,8 @@ DEFINE CLASS form1 AS form
*m: disconnectmentor
*m: disconnectroa
*m: exportdate
*m: getidpartener
*m: getidpartenerroa
*m: scrienote
*m: sql_temp_insert
*m: sterge_import
@@ -73,6 +75,8 @@ DEFINE CLASS form1 AS form
<memberdata name="nhandlementor" display="nHandleMentor"/>
<memberdata name="disconnectmentor" display="DisconnectMentor"/>
<memberdata name="completeazaparteneriroa" display="CompleteazaParteneriROA"/>
<memberdata name="getidpartener" display="GetIdPartener"/>
<memberdata name="getidpartenerroa" display="GetIdPartenerROA"/>
</VFPData>
*</PropValue>
@@ -278,7 +282,7 @@ DEFINE CLASS form1 AS form
Local lcItem1, lcItem2, lcItem3, lcItem4, lcJudet, lcJudetBucuresti, lcLocalitate, lcNumar
Local lcPrincipala, lcScara, lcSqlJudete, lcSqlLocalitati, lcSqlPart, lcStrada, lcTelefon1
Local lcTelefon2, lcWeb, lnIdJudet, lnIdJudetBucuresti, lnIdLocalitateBucuresti, lnIdTaraRO, lnPos
Local lnRecc
Local lnRecc, lcCodBrut
*:Global pcDenumire, pnIdAdresa, pnNrAdrese
*:Global pcCodFiscal, pnIdPart
@@ -353,12 +357,8 @@ DEFINE CLASS form1 AS form
lnRecc = RECCOUNT()
Scan
pnIdPart = 0
pcCodFiscal = PADR(STRTRAN(cod_fiscal, ' ', ''),30, ' ')
pcDenumire = PADR(Alltrim(Upper(denumire)), 100, ' ')
lcAdresa = Strtran(Alltrim(Upper(Nvl(adresa, ''))), Chr(13), ' ')
IF LEN(ALLTRIM(m.pcCodFiscal)) <= 3
pcCodFiscal = PADL(ALLTRIM(cod), 10, '0')
ENDIF
lcCod = cod
IF MOD(RECNO(), 250) = 0
@@ -375,61 +375,62 @@ DEFINE CLASS form1 AS form
SELECT cParteneri
DO CASE
CASE !Empty(m.pcCodFiscal)
IF SEEK(m.pcCodFiscal, 'cParteneri', 'cod_fiscal')
pnIdPart = cParteneri.id_part
ENDIF
OTHERWISE
IF SEEK(m.pcDenumire, 'cParteneri', 'denumire')
pnIdPart = cParteneri.id_part
ENDIF
ENDCASE
Select cClientiFurnizori
lcDenumire = Nvl(Strtran(Alltrim(Upper(denumire)), ['], ['']), "")
lcNume = Nvl(Strtran(Alltrim(Upper(denumire)), ['], ['']), "")
lcPrenume = ''
lcCod_fiscal = Upper(Alltrim(cod_fiscal))
lcReg_comert = Nvl(Alltrim(Upper(reg_com)), "")
***************************
lcCodBrut = Alltrim(Upper(Nvl(m.lcCod_fiscal,"")))
lcTip_persoana = "2" && 1 = juridica, 2 = fizica
* GetCodFiscalValid decide tipul de persoana din denumire, nr. registrul comertului si
* forma codului, apoi curata DOAR CNP-urile invalide ale persoanelor fizice.
* Codul unei persoane juridice nu se sterge niciodata: daca e gresit, vrem sa fim
* atentionati la validarea declaratiei si sa il corectam in Fidelio, nu sa il ascundem.
If !Empty(m.lcCodBrut)
lnTip_persoana = 0
lcCodTara = Alltrim(Upper(Nvl(cod_tara, "")))
lcCod_fiscal = GetCodFiscalValid(m.lcCodBrut, @lnTip_persoana, m.lcDenumire, m.lcReg_comert, m.lcCodTara)
lcTip_persoana = Iif(m.lnTip_persoana = 1, "1", "2")
Do Case
Case m.lcTip_persoana = "2" And Empty(m.lcCod_fiscal)
* persoana fizica cu CNP invalid: se salveaza fara CNP (permis la D394/D406)
Thisform.trace('CNP invalid, partenerul se salveaza fara CNP: [' + m.lcCodBrut + '] ' + Alltrim(m.lcDenumire))
Case m.lcTip_persoana = "1" And !VerifCF(m.lcCod_fiscal)
* persoana juridica cu cod fiscal care nu trece validarea romaneasca: poate fi
* partener strain (cod valid la el in tara) sau o eroare de operare. Codul ramane,
* dar il semnalam in log ca sa poata fi verificat.
Thisform.trace('ATENTIE: persoana juridica cu cod fiscal nevalidat: [' + m.lcCod_fiscal + '] ' + Alltrim(m.lcDenumire))
Endcase
ENDIF
IF m.lcTip_Persoana = "2"
lnPos = At(' ', m.lcNume)
IF m.lnPos > 0
lcPrenume = Alltrim(Substr(m.lcNume, m.lnPos))
lcNume = Alltrim(Left(m.lcNume, m.lnPos))
ENDIF
ENDIF
***************************
* Cautarea se face pe codul cu care partenerul se salveaza in ROA, nu pe cel din import:
* GetCodFiscalValid poate lua CNP-ul din campul de serie CI / pasaport.
pcCodFiscal = PADR(STRTRAN(m.lcCod_fiscal, ' ', ''), 30, ' ')
IF LEN(ALLTRIM(m.pcCodFiscal)) <= 3
pcCodFiscal = PADR(STRTRAN(m.lcCodBrut, ' ', ''), 30, ' ')
ENDIF
IF LEN(ALLTRIM(m.pcCodFiscal)) <= 3
pcCodFiscal = PADL(ALLTRIM(cod), 10, '0')
ENDIF
pnIdPart = Thisform.GetIdPartener(m.pcCodFiscal, m.pcDenumire)
If !Empty(Nvl(m.pnIdPart, 0))
Replace id_part With m.pnIdPart In cClientiFurnizori
*!* lcMesaj = 'Client existent ' + Alltrim(cParteneri.denumire) + ' CUI: ' + Alltrim(cParteneri.cod_fiscal) + ' ID: ' + Alltrim(Transform(cParteneri.id_part))
*!* Thisform.trace(m.lcMesaj)
Else
* Adaugare clienti
Select cClientiFurnizori
lcDenumire = Nvl(Strtran(Alltrim(Upper(denumire)), ['], ['']), "")
lcNume = Nvl(Strtran(Alltrim(Upper(denumire)), ['], ['']), "")
lcPrenume = ''
lcCod_fiscal = Upper(Alltrim(cod_fiscal))
lcReg_comert = Nvl(Alltrim(Upper(reg_com)), "")
***************************
lcCod=Alltrim(Upper(Nvl(m.lcCod_fiscal,"")))
lcTip_persoana = "2" && 1 = juridica, 2 = fizica
* GetCodFiscalValid decide tipul de persoana din denumire, nr. registrul comertului si
* forma codului, apoi curata DOAR CNP-urile invalide ale persoanelor fizice.
* Codul unei persoane juridice nu se sterge niciodata: daca e gresit, vrem sa fim
* atentionati la validarea declaratiei si sa il corectam in Fidelio, nu sa il ascundem.
If !Empty(m.lcCod)
lnTip_persoana = 0
lcCodTara = Alltrim(Upper(Nvl(cod_tara, "")))
lcCod_fiscal = GetCodFiscalValid(m.lcCod, @lnTip_persoana, m.lcDenumire, m.lcReg_comert, m.lcCodTara)
lcTip_persoana = Iif(m.lnTip_persoana = 1, "1", "2")
Do Case
Case m.lcTip_persoana = "2" And Empty(m.lcCod_fiscal)
* persoana fizica cu CNP invalid: se salveaza fara CNP (permis la D394/D406)
Thisform.trace('CNP invalid, partenerul se salveaza fara CNP: [' + m.lcCod + '] ' + Alltrim(m.lcDenumire))
Case m.lcTip_persoana = "1" And !VerifCF(m.lcCod_fiscal)
* persoana juridica cu cod fiscal care nu trece validarea romaneasca: poate fi
* partener strain (cod valid la el in tara) sau o eroare de operare. Codul ramane,
* dar il semnalam in log ca sa poata fi verificat.
Thisform.trace('ATENTIE: persoana juridica cu cod fiscal nevalidat: [' + m.lcCod_fiscal + '] ' + Alltrim(m.lcDenumire))
Endcase
ENDIF
IF m.lcTip_Persoana = "2"
lnPos = At(' ', m.lcNume)
IF m.lnPos > 0
lcPrenume = Alltrim(Substr(m.lcNume, m.lnPos))
lcNume = Alltrim(Left(m.lcNume, m.lnPos))
ENDIF
ENDIF
***************************
lcId_loc_inreg = 'NULL'
lcId_categ_ent = 'NULL'
@@ -451,15 +452,25 @@ DEFINE CLASS form1 AS form
lnSucces = goExecutor.oExecute(GetHash("cSql=>" + m.lcSqlInsert))
If !Empty(Nvl(m.pnIdPart, 0))
Replace id_part With m.pnIdPart In cClientiFurnizori
Thisform.trace('Client nou ' + Alltrim(cClientiFurnizori.denumire) + ' CUI: ' + Alltrim(cClientiFurnizori.cod_fiscal) + ' ID: ' + Alltrim(Transform(cClientiFurnizori.id_part)))
INSERT INTO cParteneri (id_part, denumire, cod_fiscal) VALUES (m.pnIdPart, cClientiFurnizori.denumire, cClientiFurnizori.cod_fiscal)
Thisform.trace('Client nou ' + Alltrim(m.lcDenumire) + ' CUI: ' + Alltrim(m.lcCod_fiscal) + ' ID: ' + Alltrim(Transform(m.pnIdPart)))
INSERT INTO cParteneri (id_part, denumire, cod_fiscal) VALUES (m.pnIdPart, m.pcDenumire, m.pcCodFiscal)
Else
lcMesaj = 'Eroare la adaugarea in clienti ROA ' + Alltrim(cParteneri.denumire) + ' CUI: ' + Alltrim(cParteneri.cod_fiscal) + Chr(13) + Chr(10) + goExecutor.oPrelucrareEroare()
Thisform.trace(m.lcMesaj)
aMessagebox(m.lcMesaj)
SET STEP ON
Exit
* Codul fiscal exista deja in ROA, uneori pe mai multi parteneri: se preia cel mai vechi si
* importul continua. Doar daca nici asa nu se gaseste partenerul, importul se opreste.
lcMesaj = goExecutor.oPrelucrareEroare()
pnIdPart = Thisform.GetIdPartenerROA(m.lcCod_fiscal)
If !Empty(Nvl(m.pnIdPart, 0))
Replace id_part With m.pnIdPart In cClientiFurnizori
INSERT INTO cParteneri (id_part, denumire, cod_fiscal) VALUES (m.pnIdPart, m.pcDenumire, m.pcCodFiscal)
Thisform.trace('Partener existent in ROA ' + Alltrim(m.lcDenumire) + ' CUI: ' + Alltrim(m.lcCod_fiscal) + ;
' ID: ' + Alltrim(Transform(m.pnIdPart)) + ' (' + Alltrim(m.lcMesaj) + ')')
Else
lcMesaj = 'Eroare la adaugarea in clienti ROA ' + Alltrim(m.lcDenumire) + ' CUI: ' + ;
Alltrim(m.lcCod_fiscal) + Chr(13) + Chr(10) + m.lcMesaj
Thisform.trace(m.lcMesaj)
aMessagebox(m.lcMesaj)
Exit
Endif
Endif && !Empty(Nvl(m.pnIdPart,0))
Endif && !Empty(Nvl(m.pnIdPart,0))
@@ -1745,6 +1756,62 @@ DEFINE CLASS form1 AS form
ENDPROC
PROCEDURE getidpartener
* Cauta partenerul in cursorul cParteneri, intai dupa cod fiscal, apoi dupa denumire.
* Cand mai multi parteneri au acelasi cod fiscal, il intoarce pe cel mai vechi (id_part minim).
Lparameters tcCodFiscal, tcDenumire
Local lcCheie, lnArie, lnIdPart
lnIdPart = 0
lnArie = Select()
If !Empty(m.tcCodFiscal)
lcCheie = Padr(Strtran(Upper(Alltrim(m.tcCodFiscal)), ' ', ''), 30, ' ')
Select cParteneri
Set Order To Tag cod_fiscal
If Seek(m.lcCheie, 'cParteneri', 'cod_fiscal')
Scan Rest While Padr(Strtran(cod_fiscal, ' ', ''), 30, ' ') == m.lcCheie
If m.lnIdPart = 0 Or cParteneri.id_part < m.lnIdPart
lnIdPart = cParteneri.id_part
Endif
Endscan
Endif
Endif
If Empty(m.tcCodFiscal) And !Empty(m.tcDenumire)
Select cParteneri
Set Order To Tag denumire
If Seek(Padr(Alltrim(Upper(m.tcDenumire)), 100, ' '), 'cParteneri', 'denumire')
lnIdPart = cParteneri.id_part
Endif
Endif
Select (m.lnArie)
Return m.lnIdPart
ENDPROC
PROCEDURE getidpartenerroa
* Intoarce cel mai vechi partener nesters din ROA cu acest cod fiscal (id_part minim), 0 daca nu exista.
Lparameters tcCodFiscal
Local lcCod, lcSql, lnArie, lnIdPart, lnSucces
lnIdPart = 0
lcCod = Strtran(Upper(Alltrim(Nvl(m.tcCodFiscal, ''))), ' ', '')
If Empty(m.lcCod)
Return 0
Endif
lnArie = Select()
lcSql = [select min(id_part) as id_part from nom_parteneri where replace(upper(cod_fiscal), ' ', '') = '] + ;
m.lcCod + [' and sters = 0]
lnSucces = goExecutor.oExecute(GetHash("cSql=>" + m.lcSql + '??cCursor=>cPartExistent'))
If m.lnSucces >= 0 And Used('cPartExistent')
lnIdPart = Nvl(cPartExistent.id_part, 0)
Use In (Select('cPartExistent'))
Endif
Select (m.lnArie)
Return m.lnIdPart
ENDPROC
PROCEDURE Init
Local ldData1, ldData2, ldLastDay, lnHeight, lnWidth