diff --git a/erpnext/venue/doctype/item_booking/item_booking.py b/erpnext/venue/doctype/item_booking/item_booking.py index 15d17f61015c9551eaaac4ceadf491cdf540fe8e..42ba68c87e1fac53b6065871a08a9855ec953066 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()