Skip to content

Commit

Permalink
fix: incorrect night shift assignment timings in shift calendar
Browse files Browse the repository at this point in the history
(cherry picked from commit 70f6c48)
  • Loading branch information
ruchamahabal authored and mergify[bot] committed Jan 9, 2024
1 parent beb3d82 commit a12df94
Showing 1 changed file with 26 additions and 18 deletions.
44 changes: 26 additions & 18 deletions hrms/hr/doctype/shift_assignment/shift_assignment.py
Original file line number Diff line number Diff line change
Expand Up @@ -159,19 +159,18 @@ def get_events(start, end, filters=None):
employee = ""
company = frappe.db.get_value("Global Defaults", None, "default_company")

events = add_assignments(start, end, filters)
return events
assignments = get_shift_assignments(start, end, filters)
return get_shift_events(assignments)


def add_assignments(start, end, filters):
def get_shift_assignments(start: str, end: str, filters: list) -> list[dict]:
import json

events = []
if isinstance(filters, str):
filters = json.loads(filters)
filters.extend([["start_date", ">=", start], ["end_date", "<=", end], ["docstatus", "=", 1]])

records = frappe.get_list(
return frappe.get_list(
"Shift Assignment",
filters=filters,
fields=[
Expand All @@ -185,21 +184,28 @@ def add_assignments(start, end, filters):
],
)

shift_timing_map = get_shift_type_timing([d.shift_type for d in records])

for d in records:
def get_shift_events(assignments: list[dict]) -> list[dict]:
events = []
shift_timing_map = get_shift_type_timing([d.shift_type for d in assignments])

for d in assignments:
daily_event_start = d.start_date
daily_event_end = d.end_date if d.end_date else getdate()
daily_event_end = d.end_date or getdate()
shift_start = shift_timing_map[d.shift_type]["start_time"]
shift_end = shift_timing_map[d.shift_type]["end_time"]

delta = timedelta(days=1)
while daily_event_start <= daily_event_end:
start_timing = (
frappe.utils.get_datetime(daily_event_start) + shift_timing_map[d.shift_type]["start_time"]
)
end_timing = (
frappe.utils.get_datetime(daily_event_start) + shift_timing_map[d.shift_type]["end_time"]
)
daily_event_start += delta
e = {
start_timing = frappe.utils.get_datetime(daily_event_start) + shift_start

if shift_start > shift_end:
# shift spans across 2 days
end_timing = frappe.utils.get_datetime(daily_event_start) + shift_end + delta
else:
end_timing = frappe.utils.get_datetime(daily_event_start) + shift_end

event = {
"name": d.name,
"doctype": "Shift Assignment",
"start_date": start_timing,
Expand All @@ -209,8 +215,10 @@ def add_assignments(start, end, filters):
"allDay": 0,
"convertToUserTz": 0,
}
if e not in events:
events.append(e)
if event not in events:
events.append(event)

daily_event_start += delta

return events

Expand Down

0 comments on commit a12df94

Please sign in to comment.