Import parteneri: coduri fiscale/CNP invalide se salveaza gol, partenerii straini nu se valideaza romaneste

This commit is contained in:
2026-08-02 10:02:31 +03:00
parent da0fb555d7
commit 349130c369
6 changed files with 291 additions and 25 deletions

View File

@@ -1664,6 +1664,25 @@ FUNCTION GetDataCNP
RETURN CTOD(SUBSTR(plcnp, 6, 2) + "." + SUBSTR(plcnp, 4, 2) + "." + mlan)
ENDFUNC
*
*
* Copiata din D:\ROA\ROACONT\COMUN\programe\oproceduri_comune.prg (GetNrFromString),
* ca sa nu duplic logica: taie de la inceputul sirului literele si separatorii,
* pana la prima cifra. Ex. 'RO 15613488' -> '15613488', 'CUI 14770212' -> '14770212'.
FUNCTION GetNrFromString
LPARAMETERS plstr
LOCAL mlenstr
mlenstr = LEN(ALLTRIM(plstr))
DO WHILE ISALPHA(plstr) .OR. LEFT(plstr, 1) == " ";
.OR. LEFT(plstr, 1) == "&" .OR. LEFT(plstr, 1) == "/";
.OR. LEFT(plstr, 1) == "-" .OR. LEFT(plstr, 1) == "_";
.OR. LEFT(plstr, 1) == "." .OR. LEFT(plstr, 1) == ":"
plstr = RTRIM(SUBSTR(plstr, 2, mlenstr))
ENDDO
RETURN plstr
ENDFUNC
*
FUNCTION VerifCF
LPARAMETERS plcfisc
LOCAL mlsuma, mlrest
@@ -1704,4 +1723,89 @@ FUNCTION GetCodFiscalFRO
RETURN m.lcCodFiscalFRO
ENDFUNC
*
*
* Normalizeaza codul fiscal / CNP primit din import (Fidelio hotel, BIZ restaurant).
* Intoarce codul curatat daca este valid, altfel SIR GOL, ca sa nu dea erori la D394/D406.
*
* ATENTIE: algoritmul de validare (CNP si CUI) este DOAR pentru Romania. Partenerii straini
* au coduri care nu respecta regulile romanesti (BE0325777171, DICA9712015/99KS, NN9J17714),
* deci NU se valideaza si NU se sterg: se pastreaza asa cum vin, ca persoana juridica.
*
* Cod considerat ROMANESC:
* - numai cifre (eventual cu spatii, puncte, liniute), SAU
* - prefix 'RO' / 'CUI' / 'CF' urmat de cifre
* Pentru codurile romanesti:
* - 13 cifre => CNP, validat cu cifra de control (cValidCNP); invalid => ''
* - 2-10 cifre => CUI persoana juridica, validat cu VerifCF; invalid => ''
* - alta lungime (12, 14, 15 cifre etc.) => invalid => ''
* Pentru orice alt cod cu litere (partener strain, pasaport) => se intoarce codul curatat de
* spatii duble, fara validare.
*
* Parametri:
* tcCod - codul brut din import
* tnTipPersoana - optional, prin referinta: 1 = juridica, 2 = fizica, 0 = necunoscut
* tcCodTara - optional, codul de tara al partenerului ('RO', 'BE', ...). Daca este
* completat si nu este 'RO', codul NU se valideaza cu regulile romanesti.
FUNCTION GetCodFiscalValid
LPARAMETERS tcCod, tnTipPersoana, tcCodTara
LOCAL lcCod, lcCifre, lcPrefix, lcTara, llRO, llRomanesc, lnParam
lnParam = PCOUNT()
IF m.lnParam > 1
tnTipPersoana = 0
ENDIF
lcCod = ALLTRIM(UPPER(TRANSFORM(NVL(m.tcCod, ''))))
lcCod = ALLTRIM(CHRTRAN(m.lcCod, CHR(9) + CHR(13) + CHR(10), ' '))
IF EMPTY(m.lcCod)
RETURN ''
ENDIF
lcTara = IIF(m.lnParam > 2 AND VARTYPE(m.tcCodTara) = 'C', ALLTRIM(UPPER(m.tcCodTara)), '')
* partea numerica: GetNrFromString taie prefixul de litere/separatori ('RO 15613488' -> '15613488')
lcCifre = ALLTRIM(GetNrFromString(m.lcCod))
lcCifre = CHRTRAN(m.lcCifre, CHRTRAN(m.lcCifre, '0123456789', ''), '')
* prefixul de litere ramas in fata cifrelor (RO, CUI, CF, BE, DICA...)
lcPrefix = ALLTRIM(CHRTRAN(m.lcCod, CHRTRAN(m.lcCod, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', ''), ''))
llRO = INLIST(m.lcPrefix, 'RO', 'CUI', 'CF', 'CIF')
* romanesc = fara litere deloc, sau cu prefix romanesc, si fara tara straina declarata
llRomanesc = (EMPTY(m.lcPrefix) OR m.llRO) AND ;
(EMPTY(m.lcTara) OR m.lcTara == 'RO' OR m.lcTara == 'ROMANIA')
IF !m.llRomanesc
* partener strain: nu pot valida cu algoritmul romanesc, pastrez codul asa cum vine
IF m.lnParam > 1
tnTipPersoana = 1
ENDIF
RETURN ALLTRIM(STRTRAN(m.lcCod, ' ', ' '))
ENDIF
IF EMPTY(m.lcCifre)
RETURN ''
ENDIF
DO CASE
CASE LEN(m.lcCifre) = 13 AND !m.llRO
IF cValidCNP(m.lcCifre)
IF m.lnParam > 1
tnTipPersoana = 2
ENDIF
RETURN m.lcCifre
ENDIF
RETURN ''
CASE BETWEEN(LEN(m.lcCifre), 2, 10)
IF VerifCF(m.lcCifre)
IF m.lnParam > 1
tnTipPersoana = 1
ENDIF
RETURN IIF(m.llRO, 'RO' + m.lcCifre, m.lcCifre)
ENDIF
RETURN ''
OTHERWISE
RETURN ''
ENDCASE
ENDFUNC
*