diff --git a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/SalaryPaymentSettings/Queries/GetAverageWeeklyDuration/GetAverageWeeklyDurationQueryHandler.cs b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/SalaryPaymentSettings/Queries/GetAverageWeeklyDuration/GetAverageWeeklyDurationQueryHandler.cs new file mode 100644 index 00000000..d4d548dc --- /dev/null +++ b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/SalaryPaymentSettings/Queries/GetAverageWeeklyDuration/GetAverageWeeklyDurationQueryHandler.cs @@ -0,0 +1,86 @@ +using GozareshgirProgramManager.Application._Common.Interfaces; +using GozareshgirProgramManager.Application._Common.Models; +using GozareshgirProgramManager.Application.Modules.SalaryPaymentSettings.Commands.CreateSalarySettings; +using GozareshgirProgramManager.Domain.SalaryPaymentSettingAgg.Entities; + +namespace GozareshgirProgramManager.Application.Modules.SalaryPaymentSettings.Queries.GetAverageWeeklyDuration; + +public class GetAverageWeeklyDurationQueryHandler : IBaseQueryHandler +{ + + + public async Task> Handle(GetAverageWeeklyDurationQuery request, CancellationToken cancellationToken) + { + TimeSpan shiftDurationResult = new TimeSpan(); + int shiftDurationInMinutesResult = 0; + if (request.WorkingHoursList.Any()) + { + var workingHoursList = request.WorkingHoursList.Where(x=> x.IsActiveDay).ToList(); + + + foreach (var item in workingHoursList) + { + var startShiftOne = new TimeSpan(); + var endShiftOne = new TimeSpan(); + var startShiftTwo = new TimeSpan(); + var endShiftTwo = new TimeSpan(); + var restTime = new TimeSpan(); + item.HasShiftOne = false; + item.HasRestTime = false; + item.HasShiftTow = false; + + if (!string.IsNullOrWhiteSpace(item.StartShiftOne) && !string.IsNullOrWhiteSpace(item.EndShiftOne)) + { + startShiftOne = TimeSpan.ParseExact(item.StartShiftOne, @"hh\:mm", null); + endShiftOne = TimeSpan.ParseExact(item.EndShiftOne, @"hh\:mm", null); + + item.HasShiftOne = true; + + + if (!string.IsNullOrWhiteSpace(item.RestTime)) + { + try + { + restTime = TimeSpan.ParseExact(item.RestTime, @"hh\:mm", null); + item.HasRestTime = true; + } + catch (Exception e) + { + var zeroResponse = new GetAverageWeeklyDurationResponse(new TimeSpan(), 0); + return OperationResult.Success(zeroResponse); + } + } + + } + + if (!string.IsNullOrWhiteSpace(item.StartShiftTwo) && + !string.IsNullOrWhiteSpace(item.EndShiftTwo)) + { + item.HasRestTime = false; + item.HasShiftTow = true; + + startShiftTwo = TimeSpan.ParseExact(item.StartShiftTwo, @"hh\:mm", null); + endShiftTwo = TimeSpan.ParseExact(item.EndShiftTwo, @"hh\:mm", null); + } + + var res = WorkingHours.ComputeShiftDuration(startShiftOne, endShiftOne, startShiftTwo, + endShiftTwo, restTime, item.HasShiftOne, item.HasShiftTow, item.HasRestTime); + + shiftDurationResult = shiftDurationResult.Add(res.shiftDuration); + shiftDurationInMinutesResult += res.shiftDurationInMinutes; + + } + + + + + } + + var response = new GetAverageWeeklyDurationResponse(shiftDurationResult, shiftDurationInMinutesResult); + return OperationResult.Success(response); + } +} + +public record GetAverageWeeklyDurationQuery(List WorkingHoursList) : IBaseQuery; + +public record GetAverageWeeklyDurationResponse(TimeSpan AverageSpan, int AverageInt); \ No newline at end of file diff --git a/ProgramManager/src/Domain/GozareshgirProgramManager.Domain/SalaryPaymentSettingAgg/Entities/WorkingHours.cs b/ProgramManager/src/Domain/GozareshgirProgramManager.Domain/SalaryPaymentSettingAgg/Entities/WorkingHours.cs index 0522364f..f3d06472 100644 --- a/ProgramManager/src/Domain/GozareshgirProgramManager.Domain/SalaryPaymentSettingAgg/Entities/WorkingHours.cs +++ b/ProgramManager/src/Domain/GozareshgirProgramManager.Domain/SalaryPaymentSettingAgg/Entities/WorkingHours.cs @@ -22,7 +22,9 @@ public class WorkingHours PersianDayOfWeek = persianDayOfWeek; IsActiveDay = isActiveDay; - ComputeShiftDuration(startShiftOne, endShiftOne, startShiftTwo, endShiftTwo, restTime, hasShiftOne, hasShiftTwo,hasRestTime); + var computeResult = ComputeShiftDuration(startShiftOne, endShiftOne, startShiftTwo, endShiftTwo, restTime, hasShiftOne, hasShiftTwo,hasRestTime); + ShiftDuration = computeResult.shiftDuration; + } @@ -109,10 +111,11 @@ public class WorkingHours /// /// /// - private void ComputeShiftDuration(TimeSpan startShift, TimeSpan endShift, TimeSpan startShiftTwo, TimeSpan endShiftTwo, TimeSpan restTime, bool hasShiftOne, bool hasShiftTwo, bool hasRestTime) + public static (TimeSpan shiftDuration, int shiftDurationInMinutes) ComputeShiftDuration(TimeSpan startShift, TimeSpan endShift, TimeSpan startShiftTwo, TimeSpan endShiftTwo, TimeSpan restTime, bool hasShiftOne, bool hasShiftTwo, bool hasRestTime) { var now = DateTime.Now.Date; - + TimeSpan shiftDurationResult = new TimeSpan(); + int shiftDurationInMinutesResult = 0; if (hasShiftOne && !hasShiftTwo) { DateTime startOne = new DateTime(now.Year, now.Month, now.Day, startShift.Hours, startShift.Minutes,0); @@ -123,7 +126,8 @@ public class WorkingHours endOne = endOne.AddDays(1); var shiftDuration = (endOne - startOne); - ShiftDuration = hasRestTime ? (shiftDuration - restTime) : shiftDuration; + shiftDurationResult = hasRestTime ? (shiftDuration - restTime) : shiftDuration; + shiftDurationInMinutesResult = (int)shiftDurationResult.TotalMinutes; } else if (!hasShiftOne && hasShiftTwo) { @@ -134,7 +138,8 @@ public class WorkingHours endTow = endTow.AddDays(1); - ShiftDuration = (endTow - startTow); + shiftDurationResult = (endTow - startTow); + shiftDurationInMinutesResult = (int)shiftDurationResult.TotalMinutes; } else if (hasShiftOne && hasShiftTwo) { @@ -152,13 +157,12 @@ public class WorkingHours endTow = endTow.AddDays(1); var shiftDurationTow = (endTow - startTow); - ShiftDuration = shiftOneDuration.Add(shiftDurationTow); - } - else - { - ShiftDurationInMinutes = 0; + shiftDurationResult = shiftOneDuration.Add(shiftDurationTow); + shiftDurationInMinutesResult = (int)shiftDurationResult.TotalMinutes; } + + return (shiftDurationResult, shiftDurationInMinutesResult); } } \ No newline at end of file diff --git a/ServiceHost/Areas/Admin/Controllers/ProgramManager/SalaryPaymentSettingsController.cs b/ServiceHost/Areas/Admin/Controllers/ProgramManager/SalaryPaymentSettingsController.cs index bc4784e2..f4ed03b8 100644 --- a/ServiceHost/Areas/Admin/Controllers/ProgramManager/SalaryPaymentSettingsController.cs +++ b/ServiceHost/Areas/Admin/Controllers/ProgramManager/SalaryPaymentSettingsController.cs @@ -1,6 +1,7 @@ using GozareshgirProgramManager.Application._Common.Models; using GozareshgirProgramManager.Application.Modules.SalaryPaymentSettings.Commands.CreateSalarySettings; using GozareshgirProgramManager.Application.Modules.SalaryPaymentSettings.Commands.EditSalarySettings; +using GozareshgirProgramManager.Application.Modules.SalaryPaymentSettings.Queries.GetAverageWeeklyDuration; using GozareshgirProgramManager.Application.Modules.SalaryPaymentSettings.Queries.GetSalarySettingToEdit; using GozareshgirProgramManager.Application.Modules.SalaryPaymentSettings.Queries.GetUserListWhoHaveSettings; using GozareshgirProgramManager.Domain.SalaryPaymentSettingAgg.Enums; @@ -45,6 +46,15 @@ public class SalaryPaymentSettingsController : ProgramManagerBaseController return res; } + [HttpPost("GetAverageWeeklyDuration")] + public async Task>> GetAverageWeeklyDuration(GetAverageWeeklyDurationQuery command) + { + + var res = await _mediator.Send(command); + + return res; + } + [HttpPost("edit")] public async Task> Edit([FromBody] EditSalarySettingsCommand command) {