diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index ba4786cddaa..f73eb3b20db 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -253,6 +253,8 @@ class AccountsController(TransactionBase): if self.get("_action") and self._action != "update_after_submit": self.set_missing_values(for_validate=True) + self.validate_price_list() + if self.get("_action") == "submit": self.remove_bundle_for_non_stock_invoices() @@ -384,6 +386,28 @@ class AccountsController(TransactionBase): def is_drop_ship(items): return any(item.delivered_by_supplier for item in items) + def validate_price_list(self): + price_list_field = "selling_price_list" if self.get("selling_price_list") else "buying_price_list" + price_list = self.get(price_list_field) + if not price_list or frappe.db.get_value("Price List", price_list, "enabled"): + return + + # Returns retain a submitted voucher's pricing even if its price list is now disabled. + if ( + self.get("is_return") + and self.get("return_against") + and price_list + == frappe.db.get_value( + self.doctype, {"name": self.return_against, "docstatus": 1}, price_list_field + ) + ): + return + + frappe.throw( + _("Price List {0} is disabled").format(get_link_to_form("Price List", price_list)), + title=_("Disabled Price List"), + ) + def set_default_letter_head(self): if hasattr(self, "letter_head") and not self.letter_head: self.letter_head = frappe.db.get_value("Company", self.company, "default_letter_head") diff --git a/erpnext/crm/doctype/appointment/test_appointment.py b/erpnext/crm/doctype/appointment/test_appointment.py index 10813811664..d4236f2a566 100644 --- a/erpnext/crm/doctype/appointment/test_appointment.py +++ b/erpnext/crm/doctype/appointment/test_appointment.py @@ -53,7 +53,7 @@ def set_booking_setting(field, value): def slot_on(days_from_now, hour, minute=0): - day = datetime.date.today() + datetime.timedelta(days=days_from_now) + day = getdate() + datetime.timedelta(days=days_from_now) return datetime.datetime.combine(day, datetime.time(hour, minute)) @@ -136,7 +136,7 @@ class TestAppointment(FrappeTestCase): with self.set_user("Guest"), patch.object(Appointment, "send_confirmation_email") as mock_send: appointment = create_appointment( - date=str(datetime.date.today() + datetime.timedelta(days=days_from_now)), + date=str(getdate() + datetime.timedelta(days=days_from_now)), time=time, tz=get_system_timezone(), contact={"name": "Portal Visitor", "email": email, "number": "123", "skype": "", "notes": ""}, @@ -280,7 +280,7 @@ class TestAppointment(FrappeTestCase): with self.set_user("Guest"), self.assertRaises(frappe.Redirect): create_appointment( - date=str(datetime.date.today() + datetime.timedelta(days=3)), + date=str(getdate() + datetime.timedelta(days=3)), time="10:00:00", tz="UTC", contact={ @@ -295,7 +295,7 @@ class TestAppointment(FrappeTestCase): def test_booked_slot_unavailable_on_portal(self): self._configure_booking_settings() tz = get_system_timezone() - day = datetime.date.today() + datetime.timedelta(days=2) + day = getdate() + datetime.timedelta(days=2) def get_availability(): with self.set_user("Guest"):