fix(postgres): avoid UNSIGNED cast in customer autoname

(cherry picked from commit 323636b396)
This commit is contained in:
Matt Howard
2026-01-05 14:55:19 -05:00
committed by Mergify
parent 16e29d8571
commit d922213dd7

View File

@@ -118,12 +118,37 @@ class Customer(TransactionBase):
def get_customer_name(self):
self.customer_name = self.customer_name.strip()
if frappe.db.get_value("Customer", self.customer_name) and not frappe.flags.in_import:
count = frappe.db.sql(
"""select ifnull(MAX(CAST(SUBSTRING_INDEX(name, ' ', -1) AS UNSIGNED)), 0) from tabCustomer
where name like %s""",
f"%{self.customer_name} - %",
as_list=1,
)[0][0]
name_prefix = f"{self.customer_name} - %"
if frappe.db.db_type == "postgres":
# Postgres: extract trailing digits (e.g. "Customer - 3") and cast to int.
# NOTE: PostgreSQL is strict about types; MySQL's UNSIGNED cast does not exist.
count = frappe.db.sql(
"""
SELECT COALESCE(
MAX(CAST(SUBSTRING(name FROM '\\d+$') AS INTEGER)),
0
)
FROM tabCustomer
WHERE name LIKE %(name_prefix)s
""",
{"name_prefix": name_prefix},
as_list=1,
)[0][0]
else:
# MariaDB/MySQL: keep existing behavior.
count = frappe.db.sql(
"""
SELECT COALESCE(
MAX(CAST(SUBSTRING_INDEX(name, ' ', -1) AS UNSIGNED)),
0
)
FROM tabCustomer
WHERE name LIKE %(name_prefix)s
""",
{"name_prefix": name_prefix},
as_list=1,
)[0][0]
count = cint(count) + 1
new_customer_name = f"{self.customer_name} - {cstr(count)}"