diff --git a/erpnext/controllers/budget_controller.py b/erpnext/controllers/budget_controller.py index 547edeb1f02..eee9eca7f11 100644 --- a/erpnext/controllers/budget_controller.py +++ b/erpnext/controllers/budget_controller.py @@ -3,7 +3,7 @@ from collections import OrderedDict import frappe from frappe import _, qb from frappe.query_builder import Criterion -from frappe.query_builder.functions import IfNull, Sum +from frappe.query_builder.functions import IfNull, Max, Sum from frappe.utils import fmt_money from erpnext.accounts.doctype.budget.budget import BudgetError, get_accumulated_monthly_budget @@ -260,7 +260,11 @@ class BudgetValidation: qb.from_(mr) .inner_join(mri) .on(mr.name == mri.parent) - .select((Sum(IfNull(mri.stock_qty, 0) - IfNull(mri.ordered_qty, 0)) * mri.rate).as_("amount")) + # rate is outside the Sum (no GROUP BY -> implicit aggregate); Max() keeps it valid on + # postgres and matches MySQL's arbitrary single-rate choice for this aggregate. + .select( + (Sum(IfNull(mri.stock_qty, 0) - IfNull(mri.ordered_qty, 0)) * Max(mri.rate)).as_("amount") + ) .where(Criterion.all(conditions)) .run(as_dict=True) ): diff --git a/erpnext/controllers/subcontracting_inward_controller.py b/erpnext/controllers/subcontracting_inward_controller.py index fbacdc95a81..4907f2d8484 100644 --- a/erpnext/controllers/subcontracting_inward_controller.py +++ b/erpnext/controllers/subcontracting_inward_controller.py @@ -509,8 +509,9 @@ class SubcontractingInwardController: ( Case() .when( + # bool() so the literal renders as true/false; postgres rejects `OR ` (table.produced_qty < table.qty) - | ValueWrapper(allow_delivery_of_overproduced_qty), + | ValueWrapper(bool(allow_delivery_of_overproduced_qty)), table.produced_qty, ) .else_(table.qty)