** / ********************************************* ************************
FUNCTION GenBic (pcEntity, plMsg)
** --------------------------------------------- **
* Routine to calculate the BIC code from the CCC code - VALID only for SPAIN-
* Parameters:
* pcEntity = Code of the entity. Corresponds to positions 1 to 4 of the CCC
* plMsg = Option to activate warning messages
* ------------------------------------------------- ----
plMsg = IIF (vartype (plMsg) = 'L', plMsg, .F.)
IF empty (pcEntity)
if plMsg
Messagebox ('The entity code is unknown', 32, 'BIC Code')
endif
return ('')
endif
IF vartype (pcEntity) = 'N'
pcEntity = PADL (alltrim (str (pcEntity)), 4, '0')
endif
IF len (PCEntity)! = 4
if plMsg
Messagebox ('Bad entity code', 32, 'BIC code')
endif
return (space (11))
endif
local lcBIC, llError, lcDevuelve
lcBIC = 'BIC' + pcEntity
BIC0003 = 'BDEPESM1XXX'
BIC0011 = 'ALLFESMMXXX'
BIC0019 = 'DEUTESBBXXX'
BIC0021 = 'BCNDESM1XXX'
BIC0030 = 'ESPCESMMXXX'
BIC0031 = 'ETCHES2GXXX'
BIC0036 = 'SABNESMMXXX'
BIC0046 = 'GALEES2GXXX'
BIC0049 = 'BSCHESMMXXX'
BIC0057 = 'BVADESMMXXX'
BIC0058 = 'BNPAESMMXXX'
BIC0059 = 'MADRESMMXXX'
BIC0061 = 'BMARES2MXXX'
BIC0065 = 'BARCESMMXXX'
BIC0072 = 'PSTRESMMXXX'
BIC0073 = 'OPENESMMXXX'
BIC0075 = 'POPUESMMXXX'
BIC0078 = 'BAPUES22XXX'
BIC0081 = 'BSABESBBXXX'
BIC0083 = 'RENBESMMXXX'
BIC0086 = 'NORTESMMXXX'
BIC0093 = 'VALEESVVXXX'
BIC0094 = 'BVALESMMXXX'
BIC0099 = 'AHCRESVVXXX'
BIC0106 = 'LOYDESMMXXX'
BIC0107 = 'BNLIESM1XXX'
BIC0108 = 'SOGEESMMXXX'
BIC0113 = 'INBBESM1XXX'
BIC0121 = 'OCBAESM1XXX'
BIC0122 = 'CITIES2XXXX'
BIC0125 = 'BAOFESM1XXX'
BIC0128 = 'BKBKESMMXXX'
BIC0129 = 'INALESM1XXX'
BIC0130 = 'CGDIESMMXXX'
BIC0131 = 'BESMESMMXXX'
BIC0132 = 'PRNEESM1XXX'
BIC0133 = 'MIKBESB1XXX'
BIC0136 = 'AREBESMMXXX'
BIC0138 = 'BKOAES22XXX'
BIC0144 = 'PARBESMXXXX'
BIC0145 = 'DEUTESM1XXX'
BIC0149 = 'BNPAESMSXXX'
BIC0151 = 'CHASESM3XXX'
BIC0152 = 'BPLCESMMXXX'
BIC0154 = 'BSUIESMMXXX'
BIC0155 = 'BRASESMMXXX'
BIC0156 = 'ABNAESMMXXX'
BIC0159 = 'COBAESMXXXX'
BIC0160 = 'BOTKESMXXXX'
BIC0161 = 'BKTRESM1XXX'
BIC0162 = 'MIDLESMMXXX'
BIC0167 = 'GEBAESMMXXX'
BIC0168 = 'BBRUESMXXXX'
BIC0169 = 'NACNESMMXXX'
BIC0182 = 'BBVAESMMXXX'
BIC0184 = 'BEDFESM1XXX'
BIC0186 = 'BFIVESBBXXX'
BIC0188 = 'ALCLESMMXXX'
BIC0190 = 'BBPIESMMXXX'
BIC0196 = 'WELAESMMXXX'
BIC0198 = 'BCOEESMMXXX'
BIC0200 = 'PRVBESB1XXX'
BIC0205 = 'DECRESM1XXX'
BIC0211 = 'PROAESMMXXX'
BIC0216 = 'POHIESMMXXX'
BIC0217 = 'HLFXESMMXXX'
BIC0218 = 'FCEFESM1XXX'
BIC0219 = 'BMCEESMMXXX'
BIC0220 = 'FIOFESM1XXX'
BIC0223 = 'GEECESB1XXX'
BIC0224 = 'SCFBESMMXXX'
BIC0225 = 'FIEIESM1XXX'
BIC0226 = 'UBSWESMMXXX'
BIC0227 = 'UNOEESM1XXX'
BIC0228 = 'IXIUESM1XXX'
BIC0229 = 'POPLESMMXXX'
BIC0231 = 'DSBLESMMXXX'
BIC0232 = 'INVLESMMXXX'
BIC0233 = 'POPIESMMXXX'
BIC0234 = 'CCOCESMMXXX'
BIC0235 = 'PIESESM1XXX'
BIC0236 = 'LOYIESMMXXX'
BIC0237 = 'CSURES2CXXX'
BIC0486 = 'THREE2BXXX'
BIC0487 = 'GBMNESMMXXX'
BIC0488 = 'BFASESMMXXX'
BIC1000 = 'ICROESMMXXX'
BIC1113 = 'BSUDESM1XXX'
BIC1116 = 'SCSIESM1XXX'
BIC1127 = 'SCBLESM1XXX'
BIC1156 = 'IRVTESM1XXX'
BIC1164 = 'ESBFESM1XXX'
BIC1168 = 'BNACESM1XXX'
BIC1173 = 'COURESB1XXX'
BIC1182 = 'HYVEESM1XXX'
BIC1191 = 'HANDES21XXX'
BIC1193 = 'PKBSES21XXX'
BIC1196 = 'AEEVESM1XXX'
BIC1197 = 'BILLESB1XXX'
BIC1199 = 'CRGEESM1XXX'
BIC1209 = 'ABCMESM1XXX'
BIC1210 = 'REDEESM1XXX'
BIC1221 = 'PNBMESM1XXX'
BIC1224 = 'RHRHESM1XXX'
BIC1227 = 'BSSAESB1XXX'
BIC1231 = 'BOCAES21XXX'
BIC1233 = 'BCMAESM1XXX'
BIC1234 = 'PRBAESM1XXX'
BIC1236 = 'HELAESM1XXX'
BIC1238 = 'BIMEESM1XXX'
BIC1240 = 'LOFPESB1XXX'
BIC1241 = 'STOLESM1XXX'
BIC1242 = 'SOLAESB1XXX'
BIC1245 = 'BEIVESM1XXX'
BIC1248 = 'WAFAESM1XXX'
BIC1249 = 'NPBSES21XXX'
BIC1251 = 'IHZUES21XXX'
BIC1255 = 'AARBESM1XXX'
BIC1451 = 'CRCGESB1XXX'
BIC1454 = 'NEWGESM1XXX'
BIC1457 = 'LLISESM1XXX'
BIC1459 = 'PRABESMMXXX'
BIC1460 = 'CRESESMMXXX'
BIC1462 = 'ASSCESM1XXX'
BIC1463 = 'PSABESM1XXX'
BIC1464 = 'NFFSESM1XXX'
BIC1465 = 'INGDESMMXXX'
BIC1466 = 'FRANESM1XXX'
BIC1467 = 'EHYPESMXXXX'
BIC1469 = 'SHSAESM1XXX'
BIC1470 = 'BPIPESM1XXX'
BIC1472 = 'UCSSESM1XXX'
BIC1473 = 'PRIBESMXXXX'
BIC1474 = 'CITIESMXXXX'
BIC1475 = 'CCSEESM1XXX'
BIC1478 = 'MLIBESM1XXX'
BIC1479 = 'NATXESMMXXX'
BIC1480 = 'VOWAES21XXX'
BIC1485 = 'BOFAES2XXXX'
BIC1488 = 'PICTESMMXXX'
BIC1490 = 'SELFESMMXXX'
BIC1491 = 'TRIOESMMXXX'
BIC1494 = 'BCITESMMXXX'
BIC1497 = 'ESSIESMMXXX'
BIC1501 = 'DPBBESM1XXX'
BIC1502 = 'IKBDESM1XXX'
BIC1505 = 'ARABESMMXXX'
BIC1506 = 'MLCBESM1XXX'
BIC1522 = 'EFGBESMMXXX'
BIC1524 = 'UBIBESMMXXX'
BIC1525 = 'BCDMESMMXXX'
BIC1534 = 'KBLXESMMXXX'
BIC1538 = 'ICBKESMMXXX'
BIC1544 = 'BACAESMMXXX'
BIC1545 = 'AGRIESMMXXX'
BIC2000 = 'CECAESMMXXX'
BIC2010 = 'CECAESMM010'
BIC2013 = 'CESCESBBXXX'
BIC2017 = 'CECAESMM017'
BIC2018 = 'CECAESMM018'
BIC2031 = 'CECAESMM031'
BIC2038 = 'CAHMESMMXXX'
BIC2043 = 'CECAESMM043'
BIC2045 = 'CECAESMM045'
BIC2048 = 'CECAESMM048'
BIC2051 = 'CECAESMM051'
BIC2052 = 'CECAESMM052'
BIC2056 = 'CECAESMM056'
BIC2066 = 'CECAESMM066'
BIC2080 = 'CAGLESMMVIG'
BIC2081 = 'CECAESMM081'
BIC2085 = 'CAZRES2ZXXX'
BIC2086 = 'CECAESMM086'
BIC2095 = 'BASKES2BXXX'
BIC2096 = 'CSPAES2LXXX'
BIC2099 = 'CECAESMM099'
BIC2100 = 'CAIXESBBXXX'
BIC2101 = 'CGGKES22XXX'
BIC2103 = 'UCJAES2MXXX'
BIC2104 = 'CSSOES2SXXX'
BIC2105 = 'CECAESMM105'
BIC2107 = 'BBVAESMM107'
BIC2108 = 'CSPAES2L108'
BIC3001 = 'BCOEESMM001'
BIC3007 = 'BCOEESMM007'
BIC3008 = 'BCOEESMM008'
BIC3009 = 'BCOEESMM009'
BIC3016 = 'BCOEESMM016'
BIC3017 = 'BCOEESMM017'
BIC3018 = 'BCOEESMM018'
BIC3020 = 'BCOEESMM020'
BIC3023 = 'BCOEESMM023'
BIC3025 = 'CDENESBBXXX'
BIC3029 = 'CCRIES2A029'
BIC3035 = 'CLPEES2MXXX'
BIC3045 = 'CCRIES2A045'
BIC3058 = 'CCRIES2AXXX'
BIC3059 = 'BCOEESMM059'
BIC3063 = 'BCOEESMM063'
BIC3067 = 'BCOEESMM067'
BIC3070 = 'BCOEESMM070'
BIC3076 = 'BCOEESMM076'
BIC3080 = 'BCOEESMM080'
BIC3081 = 'BCOEESMM081'
BIC3084 = 'CVRVES2BXXX'
BIC3085 = 'BCOEESMM085'
BIC3089 = 'BCOEESMM089'
BIC3095 = 'CCRIES2A095'
BIC3096 = 'BCOEESMM096'
BIC3098 = 'BCOEESMM098'
BIC3102 = 'BCOEESMM102'
BIC3104 = 'BCOEESMM104'
BIC3105 = 'CCRIES2A105'
BIC3110 = 'BCOEESMM110'
BIC3111 = 'BCOEESMM111'
BIC3112 = 'CCRIES2A112'
BIC3113 = 'BCOEESMM113'
BIC3115 = 'BCOEESMM115'
BIC3116 = 'BCOEESMM116'
BIC3117 = 'BCOEESMM117'
BIC3118 = 'CCRIES2A118'
BIC3119 = 'CCRIES2A119'
BIC3121 = 'CCRIES2A121'
BIC3123 = 'CCRIES2A123'
BIC3127 = 'BCOEESMM127'
BIC3130 = 'BCOEESMM130'
BIC3134 = 'BCOEESMM134'
BIC3135 = 'CCRIES2A135'
BIC3137 = 'CCRIES2A137'
BIC3138 = 'BCOEESMM138'
BIC3140 = 'BCOEESMM140'
BIC3144 = 'BCOEESMM144'
BIC3146 = 'CCCVESM1XXX'
BIC3150 = 'BCOEESMM150'
BIC3152 = 'CCRIES2A152'
BIC3157 = 'CCRIES2A157'
BIC3159 = 'BCOEESMM159'
BIC3160 = 'CCRIES2A160'
BIC3162 = 'BCOEESMM162'
BIC3165 = 'CCRIES2A165'
BIC3166 = 'BCOEESMM166'
BIC3171 = 'CXAVESB1XXX'
BIC3172 = 'CCOCESMMXXX'
BIC3174 = 'BCOEESMM174'
BIC3177 = 'BCOEESMM177'
BIC3179 = 'CCRIES2A179'
BIC3183 = 'CASDESBBXXX'
BIC3186 = 'CCRIES2A186'
BIC3187 = 'BCOEESMM187'
BIC3188 = 'CCRIES2A188'
BIC3190 = 'BCOEESMM190'
BIC3191 = 'BCOEESMM191'
BIC6814 = 'MNTYESMMXXX'
BIC6852 = 'BMEUESM1XXX'
BIC8233 = 'CSFAESM1XXX'
BIC8512 = 'UCINESMMXXX'
BIC8835 = 'SBFCESMMXXX'
BIC9000 = 'ESPBESMMXXX'
** / Error handling for VFP version 6
public llErrorBIC
llErrorBIC = .F.
ON ERROR DO error_BIC WITH ERROR (), MESSAGE (), MESSAGE (1), PROGRAM (), LINEN ()
lcDevuelve = & lcBIC
ON ERROR
if llErrorBIC
lcDevuelve = space (11)
if plMsg
MESSAGEBOX ('BIC code not found or unknown', 16, 'ERROR')
endif
endif
*! * ** / Error handling for VFP version 9
*! * TRY
*! * lcDevuelve = & lcBIC
*! * CATCH
*! * lcDevuelve = space (11)
*! * if plMsg
*! * MESSAGEBOX ('BIC code not found or unknown', 16, 'ERROR')
*! * endif
*! * END
release llErrorBIC
return lcDevuelve
ENDFUNC
PROCEDURE error_BIC
PARAMETER merror, mess, mess1, mprog, mlineno
** / BIC code does not exist and generates error
llErrorBIC = .T.
*! *? 'Error number:' + LTRIM (STR (merror))
*! *? 'Error message:' + mess
*! *? 'Line of code with error:' + mess1
*! *? 'Line number of error:' + LTRIM (STR (mlinene))
*! *? 'Program with error:' + mprog
ENDPROC
FUNCTION CALCULA_IBAN (lcCCC, llIban)
** --------------------------------------------- **
* Routine to calculate the IBAN code from the CCC code - VALID only for SPAIN-
* Parameters:
* lcCCC = CCC Code
* llIban = Option to obtain only the IBAN part (ES + 2 control digits). By default .F.
* ------------------------------------------------- ----
LOCAL nParte1 AS Integer, nResul1 AS Integer, cResul1 AS String,;
nPart2 AS Integer, nResul2 AS Integer, cResul2 AS String ,;
nPart3 AS Integer, nResul3 AS Integer, cResul3 AS String ,;
nPart4 AS Integer, nResul4 AS Integer, cResul4 AS String ,;
CCC AS String, nDigitosControl AS Integer, cDigitosControl AS String
Local llSoloIBAN
llSoloIBAN = IIF (vartype (llIban) = 'L', llIban, .F.)
** Value of each letter to convert the country code to numeric
Local A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y , Z
A = 10
B = 11
C = 12
D = 13
E = 14
F = 15
G = 16
H = 17
I = 18
J = 19
K = 20
L = 21
M = 22
N = 23
O = 24
P = 25
Q = 26
R = 27
S = 28
T = 29
U = 30
V = 31
W = 32
X = 33
Y = 34
Z = 35
if parameters ()> 0
** / Delete scripts in the CCC and blank spaces
CCC = alltrim (STRTRAN (STRTRAN (m.lcCCC, '-', ''), '', ''))
endif
IF LEN (CCC) # 20
** / = MESSAGEBOX ('You must enter a valid CCC (20 digits).', 0 + 32 + 0, 'User information.')
RETURN (m.CCC)
ENDIF
** Convert the letters of the country (ES) into numbers by applying E = 14; S = 28
** In this example I add to the CCC the numbers corresponding to the "ES" and two zeros at the end
cAux = CCC + '14 '+' 28 '+' 00 '
** As the resulting number is very large (26 digits) and VFP can not handle such large numeric or integer fields
** what is done is to go calculating by smaller chains (up to 9 digits) and concatenating the partial results
nPart1 = VAL (SUBSTR (cAux, 1.7))
nResul1 = MOD (nParte1,97)
cResul1 = ALLTRIM (STR (nResul1))
nParte2 = VAL (cResul1 + SUBSTR (cAux, 8.7))
nResul2 = MOD (nParte2,97)
cResul2 = ALLTRIM (STR (nResul2))
nPart3 = VAL (cResul2 + SUBSTR (cAux, 15.7))
nResul3 = MOD (nPart3,97)
cResul3 = ALLTRIM (STR (nResul3))
nParte4 = VAL (cResul3 + SUBSTR (cAux, 22.5))
nResul4 = MOD (nParte4,97)
cResul4 = ALLTRIM (STR (nResul4))
nDigitosControl = 98 - VAL (cResul4)
cDigitosControl = ALLTRIM (STR (nDigitosControl))
** The calculated control digits must be 2 so if the result is less than 10, add a 0 ahead
cDigitosControl = PADL (cDigitosControl, 2, "0")
** / WAIT WINDOW 'CALCULATED IBAN CODE:' + 'ES' + cDigitosControl + CCC
return ('ES' + cDigitosControl + IIF (llSoloIBAN, '', CCC))
endfunc
** --------------------------------------------- **
FUNCTION CALCULA_ACREEDOR (lcCIF, lcSufix, llDControl)
** --------------------------------------------- **
* Routine to calculate the CREDITOR code from the CIF of the entity
* Parameters:
* lcCIF = CIF of the entity
* lcSuffix = Code suffix of the entity. By default '000'
* llDControl = Get only part ES + the two control digits. By default .F.
* ------------------------------------------------- ----
LOCAL nParte1 AS Integer, nResul1 AS Integer, cResul1 AS String,;
nPart2 AS Integer, nResul2 AS Integer, cResul2 AS String ,;
CIF AS String, nDigitosControl AS Integer, cDigitosControl AS String
Local llSoloDControl, letraCIF, Sufix
Suffix = IIF (vartype (lcSufix) = 'C', lcSuffix, '000')
llDControl = IIF (vartype (llDControl) = 'L', llDControl, .F.)
** Value of each letter to convert the country code to numeric
Local A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y , Z
A = 10
B = 11
C = 12
D = 13
E = 14
F = 15
G = 16
H = 17
I = 18
J = 19
K = 20
L = 21
M = 22
N = 23
O = 24
P = 25
Q = 26
R = 27
S = 28
T = 29
U = 30
V = 31
W = 32
X = 33
Y = 34
Z = 35
if parameters ()> 0
** / Remove scripts and blanks in the CIF
CIF = alltrim (STRTRAN (STRTRAN (m.lcCIF, '-', ''), '', ''))
endif
IF LEN (m.CIF) # 9 OR ISDIGIT (m.CIF)
MESSAGEBOX ('CIF not valid (Letter + 8 digits).', 0 + 32 + 0, 'CIF:' + m.lcCIF)
RETURN (m.CIF)
ENDIF
** Convert the letters of the country (ES) into numbers by applying E = 14; S = 28 and the letter of the CIF for its value
** In this example I add to the CIF the numbers corresponding to the "ES" and two zeros at the end
letraCIF = SUBSTR (CIF, 1,1)
cAux = alltrim (str (& letterCIF)) + substr (CIF, 2,8) + '14' + '28' + '00'
nPart1 = VAL (SUBSTR (cAux, 1.8))
nResul1 = MOD (nParte1,97)
cResul1 = ALLTRIM (STR (nResul1))
nParte2 = VAL (cResul1 + SUBSTR (cAux, 9.8))
nResul2 = MOD (nParte2,97)
cResul2 = ALLTRIM (STR (nResul2))
nDigitosControl = 98 - VAL (cResul2)
cDigitosControl = ALLTRIM (STR (nDigitosControl))
** The calculated control digits must be 2 so if the result is less than 10, add a 0 ahead
cDigitosControl = PADL (cDigitosControl, 2, "0")
return ('ES' + cDigitosControl + IIF (llDControl, '', m.Sufix + CIF))
endfunc
** --------------------------------------------- **
FUNCTION TEXT_IBAN (lcCCC, llOculta, plMsg)
** --------------------------------------------- **
* Routine to display the IBAN code on paper from the CCC code with the possibility of partially hiding the CCC
* Parameters:
* lcCCC = CCC Code
* llOculta = Option to hide part of the CCC
* plMsg = Option to activate warning messages
* ------------------------------------------------- ----
plMsg = IIF (vartype (plMsg) = 'L', plMsg, .F.)
llOculta = IIF (vartype (llOculta) = 'L', llOculta, .F.)
IF EMPTY (lcCCC)
if plMsg
MESSAGEBOX ('You must enter a valid CCC (20 digits) or a valid IBAN account (24 characters)', 0 + 32 + 0, 'CCC / IBAN Account not valid')
endif
RETURN ('IBAN?')
ENDIF
** / Delete scripts in the CCC
lcCCC = alltrim (STRTRAN (STRTRAN (m.lcCCC, '-', ''), '', ''))
** / Check if it is a CCC account
IF LEN (lcCCC) = 20 && CCC
lcIBAN = Calcula_IBAN (lcCCC, .F.)
else
lcIBAN = 'ES **' + lcCCC
if plMsg
MESSAGEBOX ('You must enter a valid CCC (20 digits).', 0 + 32 + 0, 'Error in CCC')
endif
Endif
return ('IBAN' + space (1) +;
substr (lcIBAN, 1,4) + space (1) +;
substr (lcIBAN, 5.4) + space (1) +;
IIF (llOculta, '****', substr (lcIBAN, 9.4)) + space (1) +;
IIF (llOculta, '****', substr (lcIBAN, 13.4)) + space (1) +;
IIF (llOculta, '****', substr (lcIBAN, 17,4)) + space (1) +;
substr (lcIBAN, 21.4))
endfunc
Comments
0 B
|👍
/👎