diff --git a/0_Framework/Excel/Checkout/CustomizeCheckoutExcelGenerator.cs b/0_Framework/Excel/Checkout/CustomizeCheckoutExcelGenerator.cs index 1c591f5a..04fb2112 100644 --- a/0_Framework/Excel/Checkout/CustomizeCheckoutExcelGenerator.cs +++ b/0_Framework/Excel/Checkout/CustomizeCheckoutExcelGenerator.cs @@ -81,7 +81,8 @@ public class CustomizeCheckoutExcelGenerator } var dataRow = 2; - foreach (var item in data) + int totalPaymentColumnIndex = -1; + foreach (var item in data) { var column = 2; foreach (var header in filteredHeaders) @@ -101,7 +102,11 @@ public class CustomizeCheckoutExcelGenerator ApplyGeneralDataStyle(worksheet.Cells[dataRow, column]); ApplySpecificStyle(worksheet.Cells[dataRow, column], column); // Apply specific styles - column++; + if (header.Key == "TotalPayment") + { + totalPaymentColumnIndex = column; + } + column++; } var rowCounter = worksheet.Cells[dataRow, 1]; rowCounter.Value = dataRow - 1; @@ -120,7 +125,12 @@ public class CustomizeCheckoutExcelGenerator worksheet.PrinterSettings.Scale = 85; worksheet.View.RightToLeft = true; - return package.GetAsByteArray(); + if (totalPaymentColumnIndex != -1) + { + ApplyConditionalFormatting(worksheet, dataRow, totalPaymentColumnIndex); + } + + return package.GetAsByteArray(); } // Method to check if a property requires MoneyToDouble() @@ -197,5 +207,25 @@ public class CustomizeCheckoutExcelGenerator break; } } + + private static void ApplyConditionalFormatting(ExcelWorksheet worksheet, int dataRow, int totalPaymentColumnIndex) + { + for (int rowIndex = 2; rowIndex < dataRow; rowIndex++) + { + var totalPaymentValue = worksheet.Cells[rowIndex, totalPaymentColumnIndex].Value; + if (totalPaymentValue != null && double.TryParse(totalPaymentValue.ToString(), out double payment)) + { + if (payment < 0) + { + var rowRange = worksheet.Cells[rowIndex, 1, rowIndex, worksheet.Dimension.End.Column]; + rowRange.Style.Fill.PatternType = ExcelFillStyle.Solid; rowRange.Style.Fill.BackgroundColor.SetColor(Color.Red); + foreach (var cell in rowRange) + { + cell.Style.Font.Color.SetColor(Color.White); + } + } + } + } + } } diff --git a/Company.Domain/RollCallAgg/DomainService/IRollCallDomainService.cs b/Company.Domain/RollCallAgg/DomainService/IRollCallDomainService.cs index 0f598d7b..834c99fb 100644 --- a/Company.Domain/RollCallAgg/DomainService/IRollCallDomainService.cs +++ b/Company.Domain/RollCallAgg/DomainService/IRollCallDomainService.cs @@ -78,13 +78,56 @@ public class RollCallDomainService : IRollCallDomainService return Tools.CalculateOffset(workshopSettings.CustomizeWorkshopSettingsShifts .Select(x => (CustomizeSifts)x).ToList()); - if (employeeSettings == null ) + if (employeeSettings == null) return Tools.CalculateOffset(workshopSettings.CustomizeWorkshopSettingsShifts.Select(x => (CustomizeSifts)x).ToList()); if (workshopSettings.WorkshopShiftStatus == WorkshopShiftStatus.Regular && employeeSettings.WorkshopShiftStatus == WorkshopShiftStatus.Regular) { - return Tools.CalculateOffset(workshopSettings.CustomizeWorkshopSettingsShifts.Select(x => (CustomizeSifts)x).ToList()); + // تعریف بازه‌های زمانی + var workshopStartTime = workshopSettings.CustomizeWorkshopSettingsShifts.MinBy(x => x.Placement).StartTime; // شروع کارگاه + var workshopEndTime = workshopSettings.CustomizeWorkshopSettingsShifts.MaxBy(x => x.Placement).EndTime; // پایان کارگاه + + var employeeStartTime = employeeSettings.CustomizeWorkshopEmployeeSettingsShifts.MinBy(x => x.Placement).StartTime; // شروع بازه پرسنل + var employeeEndTime = employeeSettings.CustomizeWorkshopEmployeeSettingsShifts.MaxBy(x => x.Placement).EndTime; // پایان پرسنل + + // تبدیل زمان‌ها به TimeSpan برای مقایسه + var workshopStartTimeSpan = workshopStartTime.ToTimeSpan(); + var workshopEndTimeSpan = workshopEndTime.ToTimeSpan(); + var employeeStartTimeSpan = employeeStartTime.ToTimeSpan(); + var employeeEndTimeSpan = employeeEndTime.ToTimeSpan(); + + // مدیریت زمان‌های بعد از نیمه شب + if (workshopEndTimeSpan < workshopStartTimeSpan) + workshopEndTimeSpan = workshopEndTimeSpan.Add(TimeSpan.FromDays(1)); // افزودن یک روز به پایان بازه اول + + if (employeeEndTimeSpan < employeeStartTimeSpan) + employeeEndTimeSpan = employeeEndTimeSpan.Add(TimeSpan.FromDays(1)); // افزودن یک روز به پایان بازه دوم + + + // محاسبه بزرگ‌ترین زمان شروع و کوچک‌ترین زمان پایان + var overlapStart = workshopStartTimeSpan > employeeStartTimeSpan ? workshopStartTimeSpan : employeeStartTimeSpan; + var overlapEnd = workshopEndTimeSpan < employeeEndTimeSpan ? workshopEndTimeSpan : employeeEndTimeSpan; + + if (overlapStart >= overlapEnd) // اگر بازه هم‌پوشانی وجود ندارد + return Tools.CalculateOffset(workshopSettings.CustomizeWorkshopSettingsShifts + .Select(x => (CustomizeSifts)x).ToList()); + + + + var overlapDuration = (overlapEnd - overlapStart).TotalMinutes; // مدت زمان هم‌پوشانی بر حسب دقیقه + var duration2 = (employeeEndTime - employeeStartTime).TotalMinutes; // مدت زمان بازه دوم + + var overlapPercentage = (overlapDuration / duration2) * 100; // درصد هم‌پوشانی + + if (overlapPercentage < 40) + { + return Tools.CalculateOffset(employeeSettings.CustomizeWorkshopEmployeeSettingsShifts + .Select(x => (CustomizeSifts)x).ToList()); + } + + return Tools.CalculateOffset(workshopSettings.CustomizeWorkshopSettingsShifts + .Select(x => (CustomizeSifts)x).ToList()); } else if (employeeSettings.WorkshopShiftStatus == WorkshopShiftStatus.Regular) diff --git a/CompanyManagment.Application/RollCallEmployeeStatusApplication.cs b/CompanyManagment.Application/RollCallEmployeeStatusApplication.cs index 495015aa..d6b78974 100644 --- a/CompanyManagment.Application/RollCallEmployeeStatusApplication.cs +++ b/CompanyManagment.Application/RollCallEmployeeStatusApplication.cs @@ -62,8 +62,9 @@ namespace CompanyManagment.Application public bool HasRollCallRecord(long employeeId, long workshopId, DateTime contractStart, DateTime contractEnd) { //موقت - //یکتا تجارت گیل 108 - کهن سرویس وارنا 215 - دادمهرگستر 11 - if(workshopId == 108 || workshopId == 215 || workshopId == 11) + // دادمهرگستر 11 + //585 کاشی گالری سرامیس (بابک ابراهیمی ) + if(workshopId == 11 || workshopId == 585) return false; var service = _rollCallServiceRepository.GetAllServiceByWorkshopId(workshopId); diff --git a/CompanyManagment.EFCore/Repository/RollCallRepository.cs b/CompanyManagment.EFCore/Repository/RollCallRepository.cs index f05dbb92..f8eb9e36 100644 --- a/CompanyManagment.EFCore/Repository/RollCallRepository.cs +++ b/CompanyManagment.EFCore/Repository/RollCallRepository.cs @@ -581,7 +581,7 @@ public class RollCallRepository : RepositoryBase, IRollCallRepos //initialize DateTime searchDurationEnd = DateTime.Now.AddDays(-1).Date; - DateTime searchDurationStart = searchDurationEnd.AddDays(-16); + DateTime searchDurationStart = DateTime.MinValue;