diff --git a/erpnext/selling/doctype/selling_settings/selling_settings.json b/erpnext/selling/doctype/selling_settings/selling_settings.json index 889062c52df..7b931f358c7 100644 --- a/erpnext/selling/doctype/selling_settings/selling_settings.json +++ b/erpnext/selling/doctype/selling_settings/selling_settings.json @@ -17,6 +17,7 @@ "role_to_override_stop_action", "column_break_15", "maintain_same_sales_rate", + "fallback_to_default_price_list", "editable_price_list_rate", "validate_selling_price", "editable_bundle_item_rates", @@ -236,6 +237,12 @@ "fieldname": "allow_zero_qty_in_quotation", "fieldtype": "Check", "label": "Allow Quotation with Zero Quantity" + }, + { + "default": "0", + "fieldname": "fallback_to_default_price_list", + "fieldtype": "Check", + "label": "Use Prices from Default Price List as Fallback" } ], "grid_page_length": 50, @@ -244,7 +251,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2025-05-06 15:23:14.332971", + "modified": "2025-09-23 21:10:14.826653", "modified_by": "Administrator", "module": "Selling", "name": "Selling Settings", diff --git a/erpnext/selling/doctype/selling_settings/selling_settings.py b/erpnext/selling/doctype/selling_settings/selling_settings.py index f25101953a1..ebf18eb49d3 100644 --- a/erpnext/selling/doctype/selling_settings/selling_settings.py +++ b/erpnext/selling/doctype/selling_settings/selling_settings.py @@ -5,6 +5,7 @@ import frappe +from frappe import _ from frappe.custom.doctype.property_setter.property_setter import make_property_setter from frappe.model.document import Document from frappe.utils import cint @@ -34,6 +35,7 @@ class SellingSettings(Document): editable_price_list_rate: DF.Check enable_cutoff_date_on_bulk_delivery_note_creation: DF.Check enable_discount_accounting: DF.Check + fallback_to_default_price_list: DF.Check hide_tax_id: DF.Check maintain_same_rate_action: DF.Literal["Stop", "Warn"] maintain_same_sales_rate: DF.Check @@ -71,6 +73,25 @@ class SellingSettings(Document): hide_name_field=False, ) + self.validate_fallback_to_default_price_list() + + def validate_fallback_to_default_price_list(self): + if ( + self.fallback_to_default_price_list + and self.has_value_changed("fallback_to_default_price_list") + and frappe.get_single_value("Stock Settings", "auto_insert_price_list_rate_if_missing") + ): + stock_meta = frappe.get_meta("Stock Settings") + frappe.msgprint( + _( + "You have enabled {0} and {1} in {2}. This can lead to prices from the default price list being inserted into the transaction price list." + ).format( + "{}".format(_(self.meta.get_label("fallback_to_default_price_list"))), + "{}".format(_(stock_meta.get_label("auto_insert_price_list_rate_if_missing"))), + frappe.bold(_("Stock Settings")), + ) + ) + def toggle_hide_tax_id(self): _hide_tax_id = cint(self.hide_tax_id) diff --git a/erpnext/stock/doctype/stock_settings/stock_settings.py b/erpnext/stock/doctype/stock_settings/stock_settings.py index bb5aaebf5f2..bb29280ce48 100644 --- a/erpnext/stock/doctype/stock_settings/stock_settings.py +++ b/erpnext/stock/doctype/stock_settings/stock_settings.py @@ -106,6 +106,7 @@ class StockSettings(Document): self.validate_clean_description_html() self.validate_pending_reposts() self.validate_stock_reservation() + self.validate_auto_insert_price_list_rate_if_missing() self.change_precision_for_for_sales() self.change_precision_for_purchase() @@ -223,6 +224,23 @@ class StockSettings(Document): ) ) + def validate_auto_insert_price_list_rate_if_missing(self): + if ( + self.auto_insert_price_list_rate_if_missing + and self.has_value_changed("auto_insert_price_list_rate_if_missing") + and frappe.get_single_value("Selling Settings", "fallback_to_default_price_list") + ): + selling_meta = frappe.get_meta("Selling Settings") + frappe.msgprint( + _( + "You have enabled {0} and {1} in {2}. This can lead to prices from the default price list being inserted in the transaction price list." + ).format( + "{}".format(_(self.meta.get_label("auto_insert_price_list_rate_if_missing"))), + "{}".format(_(selling_meta.get_label("fallback_to_default_price_list"))), + frappe.bold(_("Selling Settings")), + ) + ) + def on_update(self): self.toggle_warehouse_field_for_inter_warehouse_transfer() diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py index b84a655eb3d..fcb5bbc4ffb 100644 --- a/erpnext/stock/get_item_details.py +++ b/erpnext/stock/get_item_details.py @@ -118,6 +118,13 @@ def get_item_details( out.update(get_price_list_rate(ctx, item)) + if not out.price_list_rate and frappe.get_single_value( + "Selling Settings", "fallback_to_default_price_list" + ): + fallback_args = ctx.copy() + fallback_args.price_list = frappe.get_single_value("Selling Settings", "selling_price_list") + out.update(get_price_list_rate(fallback_args, item)) + ctx.customer = current_customer if ctx.customer and cint(ctx.is_pos):