From 2938f74ffcdef6716380fd545eaec2380805f397 Mon Sep 17 00:00:00 2001 From: Charles-Henri Decultot Date: Fri, 27 Jun 2025 18:05:01 +0200 Subject: [PATCH] fix: Ask for user confirmation before moving sub bookings --- .../doctype/item_booking/item_booking.py | 40 ++++++++++++++++--- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/erpnext/venue/doctype/item_booking/item_booking.py b/erpnext/venue/doctype/item_booking/item_booking.py index 15d17f61015..42ba68c87e1 100644 --- a/erpnext/venue/doctype/item_booking/item_booking.py +++ b/erpnext/venue/doctype/item_booking/item_booking.py @@ -1984,16 +1984,44 @@ def move_booking_with_event(doc, method): doc_before_save = doc.get_doc_before_save() if doc_before_save and getdate(doc_before_save.starts_on) != getdate(doc.starts_on): days = date_diff(doc.starts_on, doc_before_save.starts_on) - bookings = frappe.get_all( - "Item Booking", filters={"event": doc.name}, fields=["name", "starts_on", "ends_on"] + frappe.msgprint( + msg=_("Would you like to move the associated item bookings from {0} days ?").format(days), + title=_("Associated bookings"), + primary_action={ + "server_action": "erpnext.venue.doctype.item_booking.item_booking.offset_linked_bookings", + "args": {"event": doc.name, "offset": days}, + "hide_on_success": True, + "label": _("Offset bookings") + } ) - for booking in bookings: - doc = frappe.get_doc("Item Booking", booking.name) - doc.starts_on = add_days(booking.starts_on, days) - doc.ends_on = add_days(booking.ends_on, days) +@frappe.whitelist() +def offset_linked_bookings(args): + parsed_args: dict = frappe.parse_json(args) # type: ignore + event = parsed_args.get("event") + offset = parsed_args.get("offset") or 0 + + if not event: + return + + bookings = frappe.get_all( + "Item Booking", filters={"event": event}, fields=["name", "starts_on", "ends_on"] + ) + + for booking in bookings: + try: + doc: ItemBooking = frappe.get_doc("Item Booking", booking.name) # type: ignore + doc.starts_on = add_to_date(booking.starts_on, days=offset, as_datetime=True) + doc.ends_on = add_to_date(booking.ends_on, days=offset, as_datetime=True) doc.flags.ignore_permissions = True doc.save() + except ExceptionTooManyBookings: + frappe.msgprint( + msg=_("Booking for {0} ({1}) could not be offset because it overlaps with existing bookings on the same slot").format(doc.booking_resource, doc.name), + alert=True, + indicator="red", + realtime=True + ) @frappe.whitelist() -- GitLab