mirror of
https://github.com/frappe/erpnext.git
synced 2026-06-08 15:42:52 +00:00
chore(Bank Account): remove IBAN validation
This is now handled by the Frappe Framework.
This commit is contained in:
@@ -52,7 +52,6 @@ class BankAccount(Document):
|
|||||||
|
|
||||||
def validate(self):
|
def validate(self):
|
||||||
self.validate_company()
|
self.validate_company()
|
||||||
self.validate_iban()
|
|
||||||
self.validate_account()
|
self.validate_account()
|
||||||
self.update_default_bank_account()
|
self.update_default_bank_account()
|
||||||
|
|
||||||
@@ -72,35 +71,6 @@ class BankAccount(Document):
|
|||||||
if self.is_company_account and not self.company:
|
if self.is_company_account and not self.company:
|
||||||
frappe.throw(_("Company is mandatory for company account"))
|
frappe.throw(_("Company is mandatory for company account"))
|
||||||
|
|
||||||
def validate_iban(self):
|
|
||||||
"""
|
|
||||||
Algorithm: https://en.wikipedia.org/wiki/International_Bank_Account_Number#Validating_the_IBAN
|
|
||||||
"""
|
|
||||||
# IBAN field is optional
|
|
||||||
if not self.iban:
|
|
||||||
return
|
|
||||||
|
|
||||||
def encode_char(c):
|
|
||||||
# Position in the alphabet (A=1, B=2, ...) plus nine
|
|
||||||
return str(9 + ord(c) - 64)
|
|
||||||
|
|
||||||
# remove whitespaces, upper case to get the right number from ord()
|
|
||||||
iban = "".join(self.iban.split(" ")).upper()
|
|
||||||
|
|
||||||
# Move country code and checksum from the start to the end
|
|
||||||
flipped = iban[4:] + iban[:4]
|
|
||||||
|
|
||||||
# Encode characters as numbers
|
|
||||||
encoded = [encode_char(c) if ord(c) >= 65 and ord(c) <= 90 else c for c in flipped]
|
|
||||||
|
|
||||||
try:
|
|
||||||
to_check = int("".join(encoded))
|
|
||||||
except ValueError:
|
|
||||||
frappe.throw(_("IBAN is not valid"))
|
|
||||||
|
|
||||||
if to_check % 97 != 1:
|
|
||||||
frappe.throw(_("IBAN is not valid"))
|
|
||||||
|
|
||||||
def update_default_bank_account(self):
|
def update_default_bank_account(self):
|
||||||
if self.is_default and not self.disabled:
|
if self.is_default and not self.disabled:
|
||||||
frappe.db.set_value(
|
frappe.db.set_value(
|
||||||
|
|||||||
@@ -8,38 +8,4 @@ from frappe.tests import IntegrationTestCase
|
|||||||
|
|
||||||
|
|
||||||
class TestBankAccount(IntegrationTestCase):
|
class TestBankAccount(IntegrationTestCase):
|
||||||
def test_validate_iban(self):
|
pass
|
||||||
valid_ibans = [
|
|
||||||
"GB82 WEST 1234 5698 7654 32",
|
|
||||||
"DE91 1000 0000 0123 4567 89",
|
|
||||||
"FR76 3000 6000 0112 3456 7890 189",
|
|
||||||
]
|
|
||||||
|
|
||||||
invalid_ibans = [
|
|
||||||
# wrong checksum (3rd place)
|
|
||||||
"GB72 WEST 1234 5698 7654 32",
|
|
||||||
"DE81 1000 0000 0123 4567 89",
|
|
||||||
"FR66 3000 6000 0112 3456 7890 189",
|
|
||||||
]
|
|
||||||
|
|
||||||
bank_account = frappe.get_doc({"doctype": "Bank Account"})
|
|
||||||
|
|
||||||
try:
|
|
||||||
bank_account.validate_iban()
|
|
||||||
except AttributeError:
|
|
||||||
msg = "BankAccount.validate_iban() failed for empty IBAN"
|
|
||||||
self.fail(msg=msg)
|
|
||||||
|
|
||||||
for iban in valid_ibans:
|
|
||||||
bank_account.iban = iban
|
|
||||||
try:
|
|
||||||
bank_account.validate_iban()
|
|
||||||
except ValidationError:
|
|
||||||
msg = f"BankAccount.validate_iban() failed for valid IBAN {iban}"
|
|
||||||
self.fail(msg=msg)
|
|
||||||
|
|
||||||
for not_iban in invalid_ibans:
|
|
||||||
bank_account.iban = not_iban
|
|
||||||
msg = f"BankAccount.validate_iban() accepted invalid IBAN {not_iban}"
|
|
||||||
with self.assertRaises(ValidationError, msg=msg):
|
|
||||||
bank_account.validate_iban()
|
|
||||||
|
|||||||
Reference in New Issue
Block a user