From f48087387e8bec1caf183ebdfa22e490c4030837 Mon Sep 17 00:00:00 2001 From: Sigrid Elnan Date: Tue, 20 Aug 2024 08:42:16 +0200 Subject: [PATCH 1/5] start checking of person is quit or started --- .../StaffingController/ReadModelFactory.cs | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/backend/Api/StaffingController/ReadModelFactory.cs b/backend/Api/StaffingController/ReadModelFactory.cs index da504ae9..dc355721 100644 --- a/backend/Api/StaffingController/ReadModelFactory.cs +++ b/backend/Api/StaffingController/ReadModelFactory.cs @@ -166,6 +166,57 @@ private static List DetailedBookings(Consultant consultant, vacationsPrWeek)); } + var startDate = consultant.StartDate; + var endDate = consultant.EndDate; + + var firstDayInScope = weekSet.First().FirstDayOfWorkWeek(); + var firstWorkDayOutOfScope = weekSet.Last().LastWorkDayOfWeek(); + + if (startDate.HasValue && startDate > firstDayInScope) + { + var startWeeks = weekSet.Select(week => + { + var isStartWeek = week.ContainsDate((DateOnly)startDate); + var hasStarted = startDate < week.FirstDayOfWorkWeek(); + + var dayDifference = Math.Max((startDate.Value.ToDateTime(new TimeOnly()) - week.FirstDayOfWorkWeek().ToDateTime(new TimeOnly())).Days, 0); + + var hours = isStartWeek ? dayDifference * consultant.Department.Organization.HoursPerWorkday : + hasStarted ? 0 : consultant.Department.Organization.HoursPerWorkday * 5; + + return new WeeklyHours( + week.ToSortableInt(), 0 + ); + + }).ToList(); + detailedBookings = detailedBookings.Append(new DetailedBooking( + new BookingDetails("Ikke Startet eller Sluttet", BookingType.PlannedAbsence, + "Variant", + 0, true), //Empty projectName as vacation does not have a project, 0 as projectId as vacation is weird + startWeeks)); + } + + if (endDate.HasValue && endDate < firstWorkDayOutOfScope) + { + var endWeeks = weekSet.Select(week => + { + var isEndWeek = week.ContainsDate((DateOnly)endDate); + var hasEnded = endDate < week.FirstDayOfWorkWeek(); + + var dayDifference = Math.Max((week.LastWorkDayOfWeek().ToDateTime(new TimeOnly()) - endDate.Value.ToDateTime(new TimeOnly())).Days, 0); + + var hours = hasEnded ? consultant.Department.Organization.HoursPerWorkday * 5 : isEndWeek ? dayDifference * consultant.Department.Organization.HoursPerWorkday : + 0; + + return new WeeklyHours( + week.ToSortableInt(), hours + ); + + }); + } + + + var detailedBookingList = detailedBookings.ToList(); return detailedBookingList; From 2e0d27d5c2d15bf5cd3142787a02e3fc39129e98 Mon Sep 17 00:00:00 2001 From: Sigrid Elnan Date: Mon, 26 Aug 2024 08:49:43 +0200 Subject: [PATCH 2/5] Make code hopefully more readable, and disable ability to change hours on frontend --- .../StaffingController/ReadModelFactory.cs | 80 ++++++++++--------- .../Staffing/DetailedBookingRows.tsx | 14 +++- 2 files changed, 53 insertions(+), 41 deletions(-) diff --git a/backend/Api/StaffingController/ReadModelFactory.cs b/backend/Api/StaffingController/ReadModelFactory.cs index dc355721..748b8605 100644 --- a/backend/Api/StaffingController/ReadModelFactory.cs +++ b/backend/Api/StaffingController/ReadModelFactory.cs @@ -168,53 +168,21 @@ private static List DetailedBookings(Consultant consultant, var startDate = consultant.StartDate; var endDate = consultant.EndDate; - + var firstDayInScope = weekSet.First().FirstDayOfWorkWeek(); var firstWorkDayOutOfScope = weekSet.Last().LastWorkDayOfWeek(); if (startDate.HasValue && startDate > firstDayInScope) { - var startWeeks = weekSet.Select(week => - { - var isStartWeek = week.ContainsDate((DateOnly)startDate); - var hasStarted = startDate < week.FirstDayOfWorkWeek(); - - var dayDifference = Math.Max((startDate.Value.ToDateTime(new TimeOnly()) - week.FirstDayOfWorkWeek().ToDateTime(new TimeOnly())).Days, 0); - - var hours = isStartWeek ? dayDifference * consultant.Department.Organization.HoursPerWorkday : - hasStarted ? 0 : consultant.Department.Organization.HoursPerWorkday * 5; - - return new WeeklyHours( - week.ToSortableInt(), 0 - ); - - }).ToList(); - detailedBookings = detailedBookings.Append(new DetailedBooking( - new BookingDetails("Ikke Startet eller Sluttet", BookingType.PlannedAbsence, - "Variant", - 0, true), //Empty projectName as vacation does not have a project, 0 as projectId as vacation is weird - startWeeks)); + var startWeeks = GetHoursNotStartedOrQuit(startDate, weekSet, consultant, false); + detailedBookings = detailedBookings.Append(CreateDetailedBooking(startWeeks)); } - + if (endDate.HasValue && endDate < firstWorkDayOutOfScope) { - var endWeeks = weekSet.Select(week => - { - var isEndWeek = week.ContainsDate((DateOnly)endDate); - var hasEnded = endDate < week.FirstDayOfWorkWeek(); - - var dayDifference = Math.Max((week.LastWorkDayOfWeek().ToDateTime(new TimeOnly()) - endDate.Value.ToDateTime(new TimeOnly())).Days, 0); - - var hours = hasEnded ? consultant.Department.Organization.HoursPerWorkday * 5 : isEndWeek ? dayDifference * consultant.Department.Organization.HoursPerWorkday : - 0; - - return new WeeklyHours( - week.ToSortableInt(), hours - ); - - }); + var endWeeks = GetHoursNotStartedOrQuit(endDate, weekSet, consultant, true); + detailedBookings = detailedBookings.Append(CreateDetailedBooking(endWeeks)); } - var detailedBookingList = detailedBookings.ToList(); @@ -222,6 +190,42 @@ private static List DetailedBookings(Consultant consultant, return detailedBookingList; } + private static List GetHoursNotStartedOrQuit(DateOnly? date, List weekSet, Consultant consultant, bool quit) + { + return weekSet + .Select(week => + { + var isTargetWeek = week.ContainsDate((DateOnly)date); + var hasReached = date < week.FirstDayOfWorkWeek(); + + var maxWorkHoursForWeek = consultant.Department.Organization.HoursPerWorkday * 5 - + consultant.Department.Organization.GetTotalHolidayHoursOfWeek(week); + + var dayDifference = quit ? + Math.Max((date.Value.ToDateTime(new TimeOnly()) - week.FirstDayOfWorkWeek().ToDateTime(new TimeOnly())).Days, 0) : + Math.Max((week.LastWorkDayOfWeek().ToDateTime(new TimeOnly()) - date.Value.ToDateTime(new TimeOnly())).Days, 0); + + var hours = isTargetWeek ? dayDifference * consultant.Department.Organization.HoursPerWorkday : quit ? ( + hasReached ? consultant.Department.Organization.HoursPerWorkday * 5 : 0) : ( + hasReached ? 0 : consultant.Department.Organization.HoursPerWorkday * 5) ; + + return new WeeklyHours( + week.ToSortableInt(), Math.Min(hours, maxWorkHoursForWeek) + ); + }) + .ToList(); + } + + private static DetailedBooking CreateDetailedBooking(List weeks) + { + return new DetailedBooking( + new BookingDetails("Ikke startet eller sluttet", BookingType.PlannedAbsence, + "Ikke startet eller sluttet", + 0, true), //Empty projectName as vacation does not have a project, 0 as projectId as vacation is weird + weeks + ); + } + private static BookedHoursPerWeek GetBookedHours(Week week, IEnumerable detailedBookings, Consultant consultant) { diff --git a/frontend/src/components/Staffing/DetailedBookingRows.tsx b/frontend/src/components/Staffing/DetailedBookingRows.tsx index 16cb3da3..2ee214e2 100644 --- a/frontend/src/components/Staffing/DetailedBookingRows.tsx +++ b/frontend/src/components/Staffing/DetailedBookingRows.tsx @@ -340,7 +340,9 @@ function DetailedBookingCell({ > {isChangingHours && numWeeks <= 12 && - detailedBooking.bookingDetails.type != BookingType.Vacation && ( + detailedBooking.bookingDetails.type != BookingType.Vacation && + detailedBooking.bookingDetails.projectName != + "Ikke startet eller sluttet" && (