Ejemplo n.º 1
0
def validate_and_normalize(account: Dict, country_code: str) -> Dict:
    if not country_code or country_code not in ['SE', 'NO']:
        raise _exception('Missing country_code')
    try:
        account_no = account['account_number']
        clearing_no: Optional[str] = account.get('clearing_number')
        bank_id: int = account['bank_id']
        bank_name: str = account['bank_name']
        if not bank_id or type(bank_id) is not int:
            raise _exception('bank_id is not int')
        if not bank_name or type(bank_name) is not str:
            raise _exception('bank_name is not str')
        if not account_no:
            raise _exception('Missing account_number')

        if country_code == 'SE':
            if not clearing_no:
                return _exception('Missing clearing_number')
            clearing_no, account_no = format_bank_account_se(
                clearing_no, account_no)
            try:
                bankkonto.validate(clearing_no, account_no)
            except bankkonto.exceptions.SwedbankBankkontoValidationError:
                if len(account_no) == 10:
                    raise _exception(
                        'invalid control digit for Swedbank account - please double check.'
                    )
                raise _exception('invalid account length for Swedbank account')
            except (bankkonto.exceptions.BankkontoValidationError,
                    BankkontoValidationError) as e:
                raise _exception(str(e))
            except Exception:
                raise _exception('Account validation error')

        elif country_code == 'NO':
            if clearing_no:
                raise _exception(f'Clearing number is not supported in NO')
            clearing_no = None
            account_no = format_bank_account_no(account_no)
            if len(account_no) != 11:
                raise _exception(
                    f'Required length of account number in NO is 11 digits not {len(account_no)}'
                )
        else:
            raise _exception('Not a supported country for account validation.')
    except ValueError as e:
        raise e
    except Exception as e:
        raise _exception(str(e))

    return {
        'bank_id': bank_id,
        'bank_name': bank_name,
        'clearing_number': clearing_no,
        'account_number': account_no,
    }
Ejemplo n.º 2
0
def test_validation_fails(clearing_number, bank_account_number):
    with pytest.raises(BankkontoValidationError):
        assert validate(clearing_number, bank_account_number)
Ejemplo n.º 3
0
def test_validation_ok(clearing_number, bank_account_number):
    assert validate(clearing_number, bank_account_number)
Ejemplo n.º 4
0
 def __call__(self, form, field):
     cn, bn = bankkonto.clean_and_split(field.data)
     try:
         out = bankkonto.validate(cn, bn)
     except bankkonto.BankkontoValidationError as e:
         raise ValidationError(str(e))