From 6f7242477ed45f79dc2fba532f3809902d013c1d Mon Sep 17 00:00:00 2001 From: Dan Cojocaru Date: Mon, 3 Jan 2022 03:54:03 +0200 Subject: [PATCH] Added checking for common Romanian banks in IBAN --- server/foxbank_server/apis/accounts.py | 9 ++++++++- server/foxbank_server/utils/iban.py | 24 ++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/server/foxbank_server/apis/accounts.py b/server/foxbank_server/apis/accounts.py index 267b33c..5c20394 100644 --- a/server/foxbank_server/apis/accounts.py +++ b/server/foxbank_server/apis/accounts.py @@ -7,7 +7,7 @@ import re from ..decorators import ensure_logged_in from ..models import Account -from ..utils.iban import check_iban +from ..utils.iban import IBAN_BANKS, check_iban from .. import decorators from .. import db_utils from .. import returns @@ -29,6 +29,7 @@ class MetaValidateIbanParams(Schema): class MetaValidateIbanSchema(returns.SuccessSchema): valid = fields.Bool() formatted_iban = fields.Str(data_key='formattedIban', optional=True) + bank_name = fields.Str(data_key='bankName', optional=True, description='Known bank for IBAN') @bp.get('/meta/currencies') @bp.response(200, MetaCurrenciesSchema) @@ -51,9 +52,15 @@ def get_validate_iban(iban: str): """Validate IBAN""" iban = re.sub(r'\s', '', iban) valid = len(iban) > 8 and re.match(r'^[A-Z]{2}[0-9]{2}', iban) is not None and check_iban(iban) + bank_name = None + if iban[0:2] in IBAN_BANKS: + if iban[4:8] in IBAN_BANKS[iban[0:2]]: + bank_name = IBAN_BANKS[iban[0:2]][iban[4:8]] + return returns.success( valid=valid, formatted_iban=re.sub(r'(.{4})', r'\1 ', iban) if valid else None, + bank_name=bank_name if valid else None, ) diff --git a/server/foxbank_server/utils/iban.py b/server/foxbank_server/utils/iban.py index f0dec40..4af4c7a 100644 --- a/server/foxbank_server/utils/iban.py +++ b/server/foxbank_server/utils/iban.py @@ -1,6 +1,30 @@ from .string import str_range_replace +IBAN_BANKS = { + 'RO': { + 'NBOR': 'BANCA NATIONALA A ROMANIEI', + 'BUCU': 'ALPHA BANK ROMANIA SA', + 'CARP': 'BANCA COMERCIALA CARPATICA SA', + 'RNCB': 'BANCA COMERCIALA ROMANA SA', + 'BRDE': 'BANCA ROMANA PENTRU DEZVOLTARE', + 'BRMA': 'BANCA ROMANEASCA SA', + 'BTRL': 'BANCA TRANSILVANIA SA', + 'DAFB': 'BANK LEUMI ROMANIA SA', + 'CECE': 'CASA DE ECONOMII SI CONSEMNATIUNI CEC SA', + 'CITI': 'CITIBANK ROMANIA SA', + 'UGBI': 'GARANTIBANK INTERNATIONAL NV - SUCURSALA ROMANIA', + 'INGB': 'ING BANK NV', + 'BREL': 'LIBRA BANK SA', + 'BNRB': 'OTP BANK ROMANIA SA', + 'RZBR': 'RAIFFEISEN BANK SA', + 'TREZ': 'TREZORERIA STATULUI', + 'BACX': 'UNICREDIT BANK SA', + 'FOXB': 'FOXBANK', + }, +} + + def c_to_iban_i(c: str) -> int: a = ord(c) if a in range(48, 58):