From 30b4f52896a98540ad1b39800e97e641d09d7eb4 Mon Sep 17 00:00:00 2001 From: mahan Date: Tue, 23 Dec 2025 20:16:33 +0330 Subject: [PATCH] add: refactor RollCall application to support asynchronous operations and enhance transaction handling --- .../RollCall/IRollCallApplication.cs | 2 +- .../CustomizeWorkshopSettingsApplication.cs | 22 ++++++--- .../RollCallApplication.cs | 47 +++++++++++++------ .../Pages/Company/RollCall/Grouping.cshtml.cs | 4 +- 4 files changed, 52 insertions(+), 23 deletions(-) diff --git a/CompanyManagment.App.Contracts/RollCall/IRollCallApplication.cs b/CompanyManagment.App.Contracts/RollCall/IRollCallApplication.cs index 6ada660b..6ce7bbfd 100644 --- a/CompanyManagment.App.Contracts/RollCall/IRollCallApplication.cs +++ b/CompanyManagment.App.Contracts/RollCall/IRollCallApplication.cs @@ -124,7 +124,7 @@ namespace CompanyManagment.App.Contracts.RollCall /// /// /// - OperationResult RecalculateValues(long workshopId, List command); + Task RecalculateValues(long workshopId, List command); } public class ReCalculateRollCallValues { diff --git a/CompanyManagment.Application/CustomizeWorkshopSettingsApplication.cs b/CompanyManagment.Application/CustomizeWorkshopSettingsApplication.cs index b4f19256..5c3f7e2f 100644 --- a/CompanyManagment.Application/CustomizeWorkshopSettingsApplication.cs +++ b/CompanyManagment.Application/CustomizeWorkshopSettingsApplication.cs @@ -25,6 +25,7 @@ using Microsoft.EntityFrameworkCore.Query; using Company.Domain.CheckoutAgg; using Company.Domain.CustomizeCheckoutAgg; using Company.Domain.CustomizeCheckoutTempAgg; +using Company.Domain.RollCallAgg; using CompanyManagment.EFCore.Repository; @@ -38,7 +39,8 @@ public class CustomizeWorkshopSettingsApplication(ICustomizeWorkshopSettingsRepo IRollCallApplication rollCallAppllication, ICheckoutRepository checkoutRepository, ICustomizeCheckoutRepository customizeCheckoutRepository, - ICustomizeCheckoutTempRepository customizeCheckoutTempRepository) + ICustomizeCheckoutTempRepository customizeCheckoutTempRepository, + IRollCallRepository rollCallRepository) : ICustomizeWorkshopSettingsApplication { private readonly ICustomizeWorkshopSettingsRepository _customizeWorkshopSettingsRepository = customizeWorkshopSettingsRepository; @@ -53,6 +55,7 @@ public class CustomizeWorkshopSettingsApplication(ICustomizeWorkshopSettingsRepo private readonly ICheckoutRepository _checkoutRepository = checkoutRepository; private readonly ICustomizeCheckoutRepository _customizeCheckoutRepository = customizeCheckoutRepository; private readonly ICustomizeCheckoutTempRepository _customizeCheckoutTempRepository = customizeCheckoutTempRepository; + private readonly IRollCallRepository _rollCallRepository = rollCallRepository; #region RollCallShifts @@ -822,14 +825,19 @@ public class CustomizeWorkshopSettingsApplication(ICustomizeWorkshopSettingsRepo var notSelectedEmployeeSettings = employeeSettings.Where(x => !selectedEmployeesIds.Contains(x.EmployeeId)); - var weeklyOffDays = command.OffDayOfWeeks?.Select(x => new WeeklyOffDay(x)).ToList() ?? []; - using var transaction = new TransactionScope(); + var weeklyOffDays = command.OffDayOfWeeks? + .Select(x => new WeeklyOffDay(x)).ToList() ?? []; + + using var rollCallTransaction = _rollCallRepository.BeginTransactionAsync() + .GetAwaiter().GetResult(); entity.EditSimpleAndOverwriteOnEmployee(command.Name, selectedEmployeesIds, groupSettingsShifts, command.WorkshopShiftStatus, command.IrregularShift, breakTime, isChanged, command.HolidayWork, rotatingShift, weeklyOffDays); if (reCalculateCommand.Count > 0) { - var result = _rollCallApplication.RecalculateValues(workshopSettings.WorkshopId, reCalculateCommand); + var result = _rollCallApplication + .RecalculateValues(workshopSettings.WorkshopId, reCalculateCommand) + .GetAwaiter().GetResult(); if (result.IsSuccedded == false) { @@ -844,7 +852,7 @@ public class CustomizeWorkshopSettingsApplication(ICustomizeWorkshopSettingsRepo _customizeWorkshopGroupSettingsRepository.SaveChanges(); - transaction.Complete(); + rollCallTransaction.Commit(); return op.Succcedded(); } public OperationResult EditSimpleRollCallEmployeeSetting(EditCustomizeEmployeeSettings command, @@ -1043,7 +1051,9 @@ public class CustomizeWorkshopSettingsApplication(ICustomizeWorkshopSettingsRepo _customizeWorkshopGroupSettingsRepository.SaveChanges(); if (reCalculateCommand.Count > 0) { - var result = _rollCallApplication.RecalculateValues(command.WorkshopId, reCalculateCommand); + var result = _rollCallApplication + .RecalculateValues(command.WorkshopId, reCalculateCommand) + .GetAwaiter().GetResult(); if (result.IsSuccedded == false) { diff --git a/CompanyManagment.Application/RollCallApplication.cs b/CompanyManagment.Application/RollCallApplication.cs index 1730c70d..e73e4c3e 100644 --- a/CompanyManagment.Application/RollCallApplication.cs +++ b/CompanyManagment.Application/RollCallApplication.cs @@ -788,7 +788,7 @@ public class RollCallApplication : IRollCallApplication return _rollCallRepository.CheckRepeat(employeeId, workshopId); } - public OperationResult RecalculateValues(long workshopId, List commands) + public async Task RecalculateValues(long workshopId, List commands) { var operationResult = new OperationResult(); try @@ -812,24 +812,43 @@ public class RollCallApplication : IRollCallApplication var oldestDate = commands.MinBy(x => x.FromDate).FromDate.ToGeorgianDateTime(); - var allRollCalls = _rollCallRepository + var allRollCalls = await _rollCallRepository .GetRollCallsUntilNowWithWorkshopIdEmployeeIds(workshopId, commands.Select(x => x.EmployeeId).ToList(), - oldestDate).GetAwaiter().GetResult(); + oldestDate); + + var rollCalls = + commands.SelectMany(command => + allRollCalls.Where(x => + x.EmployeeId == command.EmployeeId && + x.ShiftDate >= command.FromDate.ToGeorgianDateTime() + ) + ); - - foreach (var command in commands) + foreach (var rollCall in rollCalls) { - var rollCalls = allRollCalls - .Where(x => x.EmployeeId == command.EmployeeId && x.ShiftDate >= command.FromDate.ToGeorgianDateTime()).ToList(); + rollCall.ClearTimeDiff(); - foreach (var rollCall in rollCalls) - { - rollCall.ClearTimeDiff(); - _rollCallRepository.SaveChanges(); - rollCall.SetEndDateTime(rollCall.EndDate!.Value, _rollCallDomainService); - } + await _rollCallRepository.SaveChangesAsync(); + + rollCall.SetEndDateTime( + rollCall.EndDate!.Value, + _rollCallDomainService + ); } - _rollCallRepository.SaveChanges(); + + // foreach (var command in commands) + // { + // var rollCalls = allRollCalls + // .Where(x => x.EmployeeId == command.EmployeeId && x.ShiftDate >= command.FromDate.ToGeorgianDateTime()).ToList(); + // + // foreach (var rollCall in rollCalls) + // { + // rollCall.ClearTimeDiff(); + // await _rollCallRepository.SaveChangesAsync(); + // rollCall.SetEndDateTime(rollCall.EndDate!.Value, _rollCallDomainService); + // } + // } + await _rollCallRepository.SaveChangesAsync(); return operationResult.Succcedded(); } diff --git a/ServiceHost/Areas/Client/Pages/Company/RollCall/Grouping.cshtml.cs b/ServiceHost/Areas/Client/Pages/Company/RollCall/Grouping.cshtml.cs index 781d76b8..7d41262c 100644 --- a/ServiceHost/Areas/Client/Pages/Company/RollCall/Grouping.cshtml.cs +++ b/ServiceHost/Areas/Client/Pages/Company/RollCall/Grouping.cshtml.cs @@ -293,9 +293,9 @@ namespace ServiceHost.Areas.Client.Pages.Company.RollCall }); } - public IActionResult OnPostReCalculateValues(List command) + public async Task OnPostReCalculateValues(List command) { - var result = _rollCallApplication.RecalculateValues(_workshopId, command); + var result =await _rollCallApplication.RecalculateValues(_workshopId, command); return new JsonResult(new {