Import parteneri: coduri fiscale/CNP invalide se salveaza gol, partenerii straini nu se valideaza romaneste
This commit is contained in:
106
myutils.prg
106
myutils.prg
@@ -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
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user