diff --git a/CompanyManagment.App.Contracts/CustomizeCheckout/CustomizeCheckoutMandatoryViewModel.cs b/CompanyManagment.App.Contracts/CustomizeCheckout/CustomizeCheckoutMandatoryViewModel.cs
index f8ec402b..e2d77440 100644
--- a/CompanyManagment.App.Contracts/CustomizeCheckout/CustomizeCheckoutMandatoryViewModel.cs
+++ b/CompanyManagment.App.Contracts/CustomizeCheckout/CustomizeCheckoutMandatoryViewModel.cs
@@ -141,14 +141,14 @@ public class CustomizeCheckoutMandatoryViewModel
/// مجموع مطالبات
///
public double TotalClaimsDouble => MonthlySalary + FridayPay + OverTimePay + BaseYearsPay + BonusesPay + NightWorkPay +
- MarriedAllowance + ShiftPay + FamilyAllowance + LeavePay + RewardPay;
+ MarriedAllowance + ShiftPay + FamilyAllowance + LeavePay + RewardPay;
///
/// مجموع کسورات
///
public double TotalDeductionsDouble => FineAbsenceDeduction + InsuranceDeduction + LateToWorkDeduction +
- EarlyExitDeduction + SalaryAidDeduction + InstallmentDeduction +
- FineDeduction + TaxDeduction;
+ EarlyExitDeduction + SalaryAidDeduction + InstallmentDeduction +
+ FineDeduction + TaxDeduction;
///
/// مجموع مطالبات
@@ -163,7 +163,7 @@ public class CustomizeCheckoutMandatoryViewModel
///
/// مجموع پرداختی
///
- public double TotalPayment => TotalClaimsDouble - TotalDeductionsDouble;
+ public double TotalPayment => Math.Truncate(TotalClaimsDouble - TotalDeductionsDouble);
#region Employee Information
diff --git a/CompanyManagment.App.Contracts/Reward/Enums/RewardType.cs b/CompanyManagment.App.Contracts/Reward/Enums/RewardType.cs
index 7dbb1d9a..4db69eac 100644
--- a/CompanyManagment.App.Contracts/Reward/Enums/RewardType.cs
+++ b/CompanyManagment.App.Contracts/Reward/Enums/RewardType.cs
@@ -4,4 +4,7 @@ public enum RewardType
{
None,
CreatedByCheckoutForBirthDay,
+ Eid,
+ SinzdahBedar,
+ ChahardahFarvardin
}
\ No newline at end of file
diff --git a/CompanyManagment.EFCore/Repository/RollCallMandatoryRepository.cs b/CompanyManagment.EFCore/Repository/RollCallMandatoryRepository.cs
index 6f7a5ab8..7f109b31 100644
--- a/CompanyManagment.EFCore/Repository/RollCallMandatoryRepository.cs
+++ b/CompanyManagment.EFCore/Repository/RollCallMandatoryRepository.cs
@@ -35,80 +35,80 @@ namespace CompanyManagment.EFCore.Repository;
public class RollCallMandatoryRepository : RepositoryBase, IRollCallMandatoryRepository
{
- private readonly CompanyContext _context;
- private readonly IYearlySalaryRepository _yearlySalaryRepository;
- private readonly ILeftWorkRepository _leftWorkRepository;
- private readonly ILeaveRepository _leaveRepository;
+ private readonly CompanyContext _context;
+ private readonly IYearlySalaryRepository _yearlySalaryRepository;
+ private readonly ILeftWorkRepository _leftWorkRepository;
+ private readonly ILeaveRepository _leaveRepository;
- public RollCallMandatoryRepository(CompanyContext context, IYearlySalaryRepository yearlySalaryRepository,
- ILeftWorkRepository leftWorkRepository, ILeaveRepository leaveRepository) : base(context)
- {
- _context = context;
- _yearlySalaryRepository = yearlySalaryRepository;
- _leftWorkRepository = leftWorkRepository;
- _leaveRepository = leaveRepository;
- }
+ public RollCallMandatoryRepository(CompanyContext context, IYearlySalaryRepository yearlySalaryRepository,
+ ILeftWorkRepository leftWorkRepository, ILeaveRepository leaveRepository) : base(context)
+ {
+ _context = context;
+ _yearlySalaryRepository = yearlySalaryRepository;
+ _leftWorkRepository = leftWorkRepository;
+ _leaveRepository = leaveRepository;
+ }
- #region OfficialChckout
- public ComputingViewModel MandatoryCompute(long employeeId, long workshopId, DateTime contractStart,
+ #region OfficialChckout
+ public ComputingViewModel MandatoryCompute(long employeeId, long workshopId, DateTime contractStart,
DateTime contractEnd,
CreateWorkingHoursTemp command, bool holidayWorking)
- {
- #region Entities
+ {
+ #region Entities
- string SumWorkeTime = string.Empty;
- var weeklyTime = new TimeSpan();
- string shift1Hourse = "0";
- string overMandatoryHours = "0";
- string overMandatoryMinuts = "0";
- string shiftOver22Hours = "0";
- string shiftOver22Minuts = "0";
- double ShiftPayResult = 0;
- int numberOfFridays = 0;
- #endregion
+ string SumWorkeTime = string.Empty;
+ var weeklyTime = new TimeSpan();
+ string shift1Hourse = "0";
+ string overMandatoryHours = "0";
+ string overMandatoryMinuts = "0";
+ string shiftOver22Hours = "0";
+ string shiftOver22Minuts = "0";
+ double ShiftPayResult = 0;
+ int numberOfFridays = 0;
+ #endregion
-
- //گرفتن ساعت استراحت پرسنل از تنظیمات
- #region breakTime
- BaseCustomizeEntity settings = _context.CustomizeWorkshopEmployeeSettings.AsSplitQuery()
- .Include(x=>x.CustomizeWorkshopGroupSettings).FirstOrDefault(x =>
- x.WorkshopId == workshopId && x.EmployeeId == employeeId);
- //اگر ساعت استراحت پرسنل وجود نداشت صفر است
- var breakTime = settings == null ? new BreakTime(false, new TimeOnly()) : settings.BreakTime;
+
+ //گرفتن ساعت استراحت پرسنل از تنظیمات
+ #region breakTime
+ BaseCustomizeEntity settings = _context.CustomizeWorkshopEmployeeSettings.AsSplitQuery()
+ .Include(x => x.CustomizeWorkshopGroupSettings).FirstOrDefault(x =>
+ x.WorkshopId == workshopId && x.EmployeeId == employeeId);
+ //اگر ساعت استراحت پرسنل وجود نداشت صفر است
+ var breakTime = settings == null ? new BreakTime(false, new TimeOnly()) : settings.BreakTime;
#endregion
List rollCallResult = _context.RollCalls.Where(x =>
- x.EmployeeId == employeeId && x.WorkshopId == workshopId && x.StartDate.Value.Date >= contractStart.Date &&
- x.StartDate.Value.Date <= contractEnd.Date && x.EndDate != null).Select(x => new RollCallViewModel()
- {
- StartDate = x.StartDate,
- EndDate = x.EndDate,
- ShiftSpan = (x.EndDate.Value - x.StartDate.Value),
- CreationDate = x.ShiftDate,
- }).ToList();
- List groupedRollCall = rollCallResult.GroupBy(x => x.CreationDate.Date).Select(x => new GroupedRollCalls()
- {
- CreationDate = x.Key,
- ShiftList = x.Select(s => new ShiftList() { Start = s.StartDate!.Value, End = s.EndDate!.Value }).ToList(),
- HasFriday = x.Any(s => s.StartDate != null && s.EndDate != null && (s.StartDate.Value.DayOfWeek == DayOfWeek.Friday || s.EndDate.Value!.DayOfWeek == DayOfWeek.Friday)),
+ x.EmployeeId == employeeId && x.WorkshopId == workshopId && x.StartDate.Value.Date >= contractStart.Date &&
+ x.StartDate.Value.Date <= contractEnd.Date && x.EndDate != null).Select(x => new RollCallViewModel()
+ {
+ StartDate = x.StartDate,
+ EndDate = x.EndDate,
+ ShiftSpan = (x.EndDate.Value - x.StartDate.Value),
+ CreationDate = x.ShiftDate,
+ }).ToList();
+ List groupedRollCall = rollCallResult.GroupBy(x => x.CreationDate.Date).Select(x => new GroupedRollCalls()
+ {
+ CreationDate = x.Key,
+ ShiftList = x.Select(s => new ShiftList() { Start = s.StartDate!.Value, End = s.EndDate!.Value }).ToList(),
+ HasFriday = x.Any(s => s.StartDate != null && s.EndDate != null && (s.StartDate.Value.DayOfWeek == DayOfWeek.Friday || s.EndDate.Value!.DayOfWeek == DayOfWeek.Friday)),
- SumOneDaySpan = new TimeSpan(x.Sum(shift => shift.ShiftSpan.Ticks)) - CalculateBreakTime(breakTime,
- new TimeSpan(x.Sum(shift => shift.ShiftSpan.Ticks))),
+ SumOneDaySpan = new TimeSpan(x.Sum(shift => shift.ShiftSpan.Ticks)) - CalculateBreakTime(breakTime,
+ new TimeSpan(x.Sum(shift => shift.ShiftSpan.Ticks))),
- }).OrderBy(x=>x.CreationDate).ToList();
+ }).OrderBy(x => x.CreationDate).ToList();
- numberOfFridays = groupedRollCall.Count(x => x.HasFriday);
+ numberOfFridays = groupedRollCall.Count(x => x.HasFriday);
- ////*****کسر ساعاعت استراحت پرسنل از ساعت کار
- //List rollCallSubtractSpan = groupedRollCall.Select(x => new GroupedRollCalls()
- //{
- // CreationDate = x.CreationDate,
- // AfterSubtractRestSpan = AfterSubtract(command, x.SumOneDaySpan, x.CreationDate),
- //}).ToList();
- TimeSpan sumSpans = new TimeSpan(groupedRollCall.Sum(x => x.SumOneDaySpan.Ticks));
+ ////*****کسر ساعاعت استراحت پرسنل از ساعت کار
+ //List rollCallSubtractSpan = groupedRollCall.Select(x => new GroupedRollCalls()
+ //{
+ // CreationDate = x.CreationDate,
+ // AfterSubtractRestSpan = AfterSubtract(command, x.SumOneDaySpan, x.CreationDate),
+ //}).ToList();
+ TimeSpan sumSpans = new TimeSpan(groupedRollCall.Sum(x => x.SumOneDaySpan.Ticks));
TimeSpan sumSpansWhitOutleaves = new TimeSpan(groupedRollCall.Sum(x => x.SumOneDaySpan.Ticks));
//****افزودن مرخصی پرسنل به مجموع ساعات کار***
@@ -116,570 +116,570 @@ CreateWorkingHoursTemp command, bool holidayWorking)
LeaveSearchModel leaveSearch = new LeaveSearchModel()
- {
- EmployeeId = employeeId,
- WorkshopId = workshopId,
- LeaveType = "استحقاقی",
- PaidLeaveType = "روزانه",
- StartLeaveGr = contractStart,
- EndLeaveGr = contractEnd,
- IsAccepted = true,
- };
- var leaveSearchResult = _leaveRepository.search(leaveSearch);
- if (leaveSearchResult.Count > 0)
- {
- int leavingDayCout = 0;
- //مرخصی های مابین
- List beatweenCheckout = leaveSearchResult.Where(x => x.StartLeaveGr >= contractStart && x.EndLeaveGr <= contractEnd).Select(x => new LeaveViewModel()
- {
- DayCounter = Convert.ToInt32(x.LeaveHourses),
+ {
+ EmployeeId = employeeId,
+ WorkshopId = workshopId,
+ LeaveType = "استحقاقی",
+ PaidLeaveType = "روزانه",
+ StartLeaveGr = contractStart,
+ EndLeaveGr = contractEnd,
+ IsAccepted = true,
+ };
+ var leaveSearchResult = _leaveRepository.search(leaveSearch);
+ if (leaveSearchResult.Count > 0)
+ {
+ int leavingDayCout = 0;
+ //مرخصی های مابین
+ List beatweenCheckout = leaveSearchResult.Where(x => x.StartLeaveGr >= contractStart && x.EndLeaveGr <= contractEnd).Select(x => new LeaveViewModel()
+ {
+ DayCounter = Convert.ToInt32(x.LeaveHourses),
- }).ToList();
- leavingDayCout += beatweenCheckout.Sum(x => x.DayCounter);
- // مرخصی که شروعش قبل از شروع تصفیه حساب است
- List beforeCheckout = leaveSearchResult.Where(x => x.StartLeaveGr < contractStart).Select(x => new LeaveViewModel()
- {
- DayCounter = (int)(contractStart - x.EndLeaveGr).TotalDays + 1,
+ }).ToList();
+ leavingDayCout += beatweenCheckout.Sum(x => x.DayCounter);
+ // مرخصی که شروعش قبل از شروع تصفیه حساب است
+ List beforeCheckout = leaveSearchResult.Where(x => x.StartLeaveGr < contractStart).Select(x => new LeaveViewModel()
+ {
+ DayCounter = (int)(contractStart - x.EndLeaveGr).TotalDays + 1,
- }).ToList();
- leavingDayCout += beforeCheckout.Sum(x => x.DayCounter);
- // مرخصی که پایانش بعد از پایان تصفیه حساب است
- List afterCheckout = leaveSearchResult.Where(x => x.EndLeaveGr > contractEnd).Select(x => new LeaveViewModel()
- {
- DayCounter = (int)(x.StartLeaveGr - contractEnd).TotalDays + 1,
+ }).ToList();
+ leavingDayCout += beforeCheckout.Sum(x => x.DayCounter);
+ // مرخصی که پایانش بعد از پایان تصفیه حساب است
+ List afterCheckout = leaveSearchResult.Where(x => x.EndLeaveGr > contractEnd).Select(x => new LeaveViewModel()
+ {
+ DayCounter = (int)(x.StartLeaveGr - contractEnd).TotalDays + 1,
- }).ToList();
- leavingDayCout += afterCheckout.Sum(x => x.DayCounter);
- Console.WriteLine(leavingDayCout);
-
-
- TimeSpan workingPerDayAve = sumSpans / groupedRollCall.Count;//میانگین ساعت کار در روز
- TimeSpan sumLeave = new TimeSpan();
- if (workingPerDayAve <= new TimeSpan(7, 20, 0))
- {
- sumLeave = leavingDayCout * workingPerDayAve;
- }
- else
- {
- sumLeave = leavingDayCout * new TimeSpan(7, 20, 0);
- }
-
- sumSpans = sumSpans.Add(sumLeave);
- }
-
- Console.WriteLine(sumSpans);
- #endregion
- //***********************************//
- //ToTalHourse Employe eWorked
- double totalHourses = (sumSpans.TotalMinutes) / 60;
- int totalHolidaysAndNotH = (int)sumSpans.TotalHours;
- int totalHolidaysAndNotM = (int)(sumSpans.TotalMinutes % 60);
- //***********************************//
+ }).ToList();
+ leavingDayCout += afterCheckout.Sum(x => x.DayCounter);
+ Console.WriteLine(leavingDayCout);
- //********** محاسبه مدت اضافه کاری ***********//
- #region ComputeMandatoryAtThisTime
+ TimeSpan workingPerDayAve = sumSpans / groupedRollCall.Count;//میانگین ساعت کار در روز
+ TimeSpan sumLeave = new TimeSpan();
+ if (workingPerDayAve <= new TimeSpan(7, 20, 0))
+ {
+ sumLeave = leavingDayCout * workingPerDayAve;
+ }
+ else
+ {
+ sumLeave = leavingDayCout * new TimeSpan(7, 20, 0);
+ }
- int TotalContractDays = (int)(contractEnd - contractStart).TotalDays + 1;
- int fridays = 0;
- int holiday = _context.HolidayItems.Count(x => x.Holidaydate >= contractStart && x.Holidaydate <= contractEnd);
- ;
- for (var gDate = contractStart; gDate <= contractEnd; gDate = gDate.AddDays(1))
- {
- if (gDate.DayOfWeek == DayOfWeek.Friday)
- {
- fridays += 1;
- }
- }
- int TotalDaysNoFriday = TotalContractDays - fridays;
- int mandatorDays = TotalContractDays - (fridays + holiday);
+ sumSpans = sumSpans.Add(sumLeave);
+ }
+
+ Console.WriteLine(sumSpans);
+ #endregion
+ //***********************************//
+ //ToTalHourse Employe eWorked
+ double totalHourses = (sumSpans.TotalMinutes) / 60;
+ int totalHolidaysAndNotH = (int)sumSpans.TotalHours;
+ int totalHolidaysAndNotM = (int)(sumSpans.TotalMinutes % 60);
+ //***********************************//
+
+
+ //********** محاسبه مدت اضافه کاری ***********//
+ #region ComputeMandatoryAtThisTime
+
+ int TotalContractDays = (int)(contractEnd - contractStart).TotalDays + 1;
+ int fridays = 0;
+ int holiday = _context.HolidayItems.Count(x => x.Holidaydate >= contractStart && x.Holidaydate <= contractEnd);
+ ;
+ for (var gDate = contractStart; gDate <= contractEnd; gDate = gDate.AddDays(1))
+ {
+ if (gDate.DayOfWeek == DayOfWeek.Friday)
+ {
+ fridays += 1;
+ }
+ }
+ int TotalDaysNoFriday = TotalContractDays - fridays;
+ int mandatorDays = TotalContractDays - (fridays + holiday);
//if (holidayWorking)
// mandatorDays = TotalContractDays - fridays;
//***********************************//
//This Time Mandatory Hourse
double mandatoryHours = Math.Round((mandatorDays * 7.33), 2);
- //***********************************//
- var dailyFix = TimeSpan.Parse("07:20");
- TimeSpan mandatoryHoursTimeSpan = new TimeSpan(7, 20, 0).Multiply(mandatorDays);
- TimeSpan Mandatory = sumSpansWhitOutleaves.Subtract(mandatoryHoursTimeSpan);
+ //***********************************//
+ var dailyFix = TimeSpan.Parse("07:20");
+ TimeSpan mandatoryHoursTimeSpan = new TimeSpan(7, 20, 0).Multiply(mandatorDays);
+ TimeSpan Mandatory = sumSpansWhitOutleaves.Subtract(mandatoryHoursTimeSpan);
double mandatoryWorkWithOutleaves = (sumSpansWhitOutleaves.TotalMinutes) / 60;
- double owerTimeWork = 0;
+ double owerTimeWork = 0;
if (mandatoryWorkWithOutleaves > mandatoryHours)
- {
- owerTimeWork = mandatoryWorkWithOutleaves - mandatoryHours;
+ {
+ owerTimeWork = mandatoryWorkWithOutleaves - mandatoryHours;
}
- #endregion
+ #endregion
- //******* دستمزد روزانه *******//
- #region DailyFeeCompute
+ //******* دستمزد روزانه *******//
+ #region DailyFeeCompute
- var searchModel = new LeftWorkSearchModel()
- {
- EmployeeId = command.EmployeeId,
- WorkshopId = command.WorkshopId,
+ var searchModel = new LeftWorkSearchModel()
+ {
+ EmployeeId = command.EmployeeId,
+ WorkshopId = command.WorkshopId,
- };
+ };
- var leftworkList = _leftWorkRepository.search(searchModel);
- var basic = "0";
- double dayliFeeComplete = 0;
- var GetWorkStartDate = command.GetWorkDateHide.ToEnglishNumber();
- var styear = Convert.ToInt32(GetWorkStartDate.Substring(0, 4));
- var startDate = command.GetWorkDateHide.ToGeorgianDateTime();
- var dayliFee = "خطای تاریخ";
- double dayliFeeDouble = 0;
- if (styear >= 1370)
- {
+ var leftworkList = _leftWorkRepository.search(searchModel);
+ var basic = "0";
+ double dayliFeeComplete = 0;
+ var GetWorkStartDate = command.GetWorkDateHide.ToEnglishNumber();
+ var styear = Convert.ToInt32(GetWorkStartDate.Substring(0, 4));
+ var startDate = command.GetWorkDateHide.ToGeorgianDateTime();
+ var dayliFee = "خطای تاریخ";
+ double dayliFeeDouble = 0;
+ if (styear >= 1370)
+ {
- if (leftworkList == null)
- leftworkList = new List();
+ if (leftworkList == null)
+ leftworkList = new List();
- var dayliFeeResult = _yearlySalaryRepository.DayliFeeComputing(startDate, contractStart, contractEnd,
- command.EmployeeId, command.WorkshopId, leftworkList);
- dayliFee = dayliFeeResult.DayliFee;
- dayliFeeDouble = dayliFeeResult.DayliFeeDouble;
- dayliFeeComplete = dayliFeeResult.DayliFee.MoneyToDouble();
- basic = dayliFeeResult.Basic;
- }
+ var dayliFeeResult = _yearlySalaryRepository.DayliFeeComputing(startDate, contractStart, contractEnd,
+ command.EmployeeId, command.WorkshopId, leftworkList);
+ dayliFee = dayliFeeResult.DayliFee;
+ dayliFeeDouble = dayliFeeResult.DayliFeeDouble;
+ dayliFeeComplete = dayliFeeResult.DayliFee.MoneyToDouble();
+ basic = dayliFeeResult.Basic;
+ }
- #endregion
+ #endregion
- #region ConsumableItemsAndHousingAndFamily
+ #region ConsumableItemsAndHousingAndFamily
- var ConsumableItems = _yearlySalaryRepository.ConsumableItems(contractEnd);
- var HousingAllowance = _yearlySalaryRepository.HousingAllowance(contractEnd);
+ var ConsumableItems = _yearlySalaryRepository.ConsumableItems(contractEnd);
+ var HousingAllowance = _yearlySalaryRepository.HousingAllowance(contractEnd);
- var familyAllowance = _yearlySalaryRepository.FamilyAllowance(command.EmployeeId, contractStart, contractEnd);
- var MarriedAllowance = _yearlySalaryRepository.MarriedAllowance(contractEnd, command.EmployeeId);
- // حق تاهل
- string MarriedAllowanceStr = MarriedAllowance > 0 ? MarriedAllowance.ToMoney() : "0";
- #endregion
+ var familyAllowance = _yearlySalaryRepository.FamilyAllowance(command.EmployeeId, contractStart, contractEnd);
+ var MarriedAllowance = _yearlySalaryRepository.MarriedAllowance(contractEnd, command.EmployeeId);
+ // حق تاهل
+ string MarriedAllowanceStr = MarriedAllowance > 0 ? MarriedAllowance.ToMoney() : "0";
+ #endregion
- var totalWeek = (int)(TotalContractDays / 6);
+ var totalWeek = (int)(TotalContractDays / 6);
- #region Fix44Compute
- int TotalContractdaysUnder30 = TotalContractDays > 30 ? 30 : TotalContractDays;
- if (totalHourses < mandatoryHours)
- {
- if (!string.IsNullOrWhiteSpace(command.ShiftWork))
- {
- var workedHoursePerDay = totalHourses / mandatorDays;
- var result = (dayliFeeDouble / 7.33) * workedHoursePerDay;
+ #region Fix44Compute
+ int TotalContractdaysUnder30 = TotalContractDays > 30 ? 30 : TotalContractDays;
+ if (totalHourses < mandatoryHours)
+ {
+ if (!string.IsNullOrWhiteSpace(command.ShiftWork))
+ {
+ var workedHoursePerDay = totalHourses / mandatorDays;
+ var result = (dayliFeeDouble / 7.33) * workedHoursePerDay;
- dayliFee = result.ToMoney();
+ dayliFee = result.ToMoney();
- var HousingAllowonceNumberType = HousingAllowance.MoneyToDouble();
- var HousingStep1 = HousingAllowonceNumberType / 30;
- var HousingStep2 = HousingStep1 / 7.33;
- var HousingStep3 = HousingStep2 * workedHoursePerDay;
- var HousingStep4 = HousingStep3 * TotalContractdaysUnder30;
- HousingAllowance = HousingStep4.ToMoney();
+ var HousingAllowonceNumberType = HousingAllowance.MoneyToDouble();
+ var HousingStep1 = HousingAllowonceNumberType / 30;
+ var HousingStep2 = HousingStep1 / 7.33;
+ var HousingStep3 = HousingStep2 * workedHoursePerDay;
+ var HousingStep4 = HousingStep3 * TotalContractdaysUnder30;
+ HousingAllowance = HousingStep4.ToMoney();
- var ConsumableItemsNumberType = ConsumableItems.MoneyToDouble();
- var consumableItemsStep1 = ConsumableItemsNumberType / 30;
- var consumableItemsStep2 = consumableItemsStep1 / 7.33;
- var consumableItemsStep3 = consumableItemsStep2 * workedHoursePerDay;
- var consumableItemsStep4 = consumableItemsStep3 * TotalContractdaysUnder30;
- ConsumableItems = consumableItemsStep4.ToMoney();
+ var ConsumableItemsNumberType = ConsumableItems.MoneyToDouble();
+ var consumableItemsStep1 = ConsumableItemsNumberType / 30;
+ var consumableItemsStep2 = consumableItemsStep1 / 7.33;
+ var consumableItemsStep3 = consumableItemsStep2 * workedHoursePerDay;
+ var consumableItemsStep4 = consumableItemsStep3 * TotalContractdaysUnder30;
+ ConsumableItems = consumableItemsStep4.ToMoney();
- //حق تاهل
- if (MarriedAllowance > 0)
- {
- var MarriedStep1 = MarriedAllowance / 30;
- var MarriedStep2 = MarriedStep1 / 7.33;
- var MarriedStep3 = MarriedStep2 * workedHoursePerDay;
- var MarriedStep4 = MarriedStep3 * TotalContractdaysUnder30;
- MarriedAllowanceStr = MarriedStep4.ToMoney();
- }
+ //حق تاهل
+ if (MarriedAllowance > 0)
+ {
+ var MarriedStep1 = MarriedAllowance / 30;
+ var MarriedStep2 = MarriedStep1 / 7.33;
+ var MarriedStep3 = MarriedStep2 * workedHoursePerDay;
+ var MarriedStep4 = MarriedStep3 * TotalContractdaysUnder30;
+ MarriedAllowanceStr = MarriedStep4.ToMoney();
+ }
- if (familyAllowance != "0")
- {
+ if (familyAllowance != "0")
+ {
- var familyAllowanceNumberType = familyAllowance.MoneyToDouble();
- var familyAllowanceStep1 = familyAllowanceNumberType / 30;
- var familyAllowanceStep2 = familyAllowanceStep1 / 7.33;
- var familyAllowanceStep3 = familyAllowanceStep2 * workedHoursePerDay;
- var familyAllowanceStep4 = familyAllowanceStep3 * TotalContractdaysUnder30;
- familyAllowance = familyAllowanceStep4.ToMoney();
- }
+ var familyAllowanceNumberType = familyAllowance.MoneyToDouble();
+ var familyAllowanceStep1 = familyAllowanceNumberType / 30;
+ var familyAllowanceStep2 = familyAllowanceStep1 / 7.33;
+ var familyAllowanceStep3 = familyAllowanceStep2 * workedHoursePerDay;
+ var familyAllowanceStep4 = familyAllowanceStep3 * TotalContractdaysUnder30;
+ familyAllowance = familyAllowanceStep4.ToMoney();
+ }
- if (totalWeek > 1)
- {
+ if (totalWeek > 1)
+ {
- double weekAvrage = 0;
- if (totalHourses < 44.00)
- {
- weekAvrage = (totalHourses * 6) / TotalContractDays;
- }
- else
- {
- weekAvrage = (totalHourses * 6) / TotalDaysNoFriday;
- }
+ double weekAvrage = 0;
+ if (totalHourses < 44.00)
+ {
+ weekAvrage = (totalHourses * 6) / TotalContractDays;
+ }
+ else
+ {
+ weekAvrage = (totalHourses * 6) / TotalDaysNoFriday;
+ }
- //var oneday = weekAvrage * 6;
- var totalShiftRound = Math.Round(weekAvrage, 2);
- SumWorkeTime = $"{totalShiftRound}";
+ //var oneday = weekAvrage * 6;
+ var totalShiftRound = Math.Round(weekAvrage, 2);
+ SumWorkeTime = $"{totalShiftRound}";
- }
- else if (totalWeek <= 1 && TotalDaysNoFriday <= 6)
- {
- var totalShiftRound = Math.Round(totalHourses, 2);
- SumWorkeTime = $"{totalShiftRound}";
- }
- else if (totalWeek <= 1 && TotalDaysNoFriday > 6)
+ }
+ else if (totalWeek <= 1 && TotalDaysNoFriday <= 6)
+ {
+ var totalShiftRound = Math.Round(totalHourses, 2);
+ SumWorkeTime = $"{totalShiftRound}";
+ }
+ else if (totalWeek <= 1 && TotalDaysNoFriday > 6)
- {
- var perDyeWorked = totalHourses / TotalDaysNoFriday;
- var weekAvrage = perDyeWorked * 6;
- var totalShiftRound = Math.Round(weekAvrage, 2);
- SumWorkeTime = $"{totalShiftRound}";
- }
+ {
+ var perDyeWorked = totalHourses / TotalDaysNoFriday;
+ var weekAvrage = perDyeWorked * 6;
+ var totalShiftRound = Math.Round(weekAvrage, 2);
+ SumWorkeTime = $"{totalShiftRound}";
+ }
- weeklyTime = sumSpans;
- }
+ weeklyTime = sumSpans;
+ }
- }
- else // اگر بیشتر از 44 بود
- {
+ }
+ else // اگر بیشتر از 44 بود
+ {
- var HousingAllowonceNumberType = HousingAllowance.MoneyToDouble();
- var ConsumableItemsNumberType = ConsumableItems.MoneyToDouble();
- var familyAllowanceNumberType = familyAllowance.MoneyToDouble();
+ var HousingAllowonceNumberType = HousingAllowance.MoneyToDouble();
+ var ConsumableItemsNumberType = ConsumableItems.MoneyToDouble();
+ var familyAllowanceNumberType = familyAllowance.MoneyToDouble();
- var HousingStep1 = HousingAllowonceNumberType / 30;
- var HousingStep4 = HousingStep1 * TotalContractdaysUnder30;
- HousingAllowance = HousingStep4.ToMoney();
+ var HousingStep1 = HousingAllowonceNumberType / 30;
+ var HousingStep4 = HousingStep1 * TotalContractdaysUnder30;
+ HousingAllowance = HousingStep4.ToMoney();
- var consumableItemsStep1 = ConsumableItemsNumberType / 30;
- var consumableItemsStep4 = consumableItemsStep1 * TotalContractdaysUnder30;
- ConsumableItems = consumableItemsStep4.ToMoney();
+ var consumableItemsStep1 = ConsumableItemsNumberType / 30;
+ var consumableItemsStep4 = consumableItemsStep1 * TotalContractdaysUnder30;
+ ConsumableItems = consumableItemsStep4.ToMoney();
- //حق تاهل
- if (MarriedAllowance > 0)
- {
- var MarriedStep1 = MarriedAllowance / 30;
- var MarriedStep4 = MarriedStep1 * TotalContractdaysUnder30;
- MarriedAllowanceStr = MarriedStep4.ToMoney();
- }
+ //حق تاهل
+ if (MarriedAllowance > 0)
+ {
+ var MarriedStep1 = MarriedAllowance / 30;
+ var MarriedStep4 = MarriedStep1 * TotalContractdaysUnder30;
+ MarriedAllowanceStr = MarriedStep4.ToMoney();
+ }
- if (familyAllowance != "0")
- {
- var familyAllowanceStep1 = familyAllowanceNumberType / 30;
- var familyAllowanceStep4 = familyAllowanceStep1 * TotalContractdaysUnder30;
- familyAllowance = familyAllowanceStep4.ToMoney();
- }
+ if (familyAllowance != "0")
+ {
+ var familyAllowanceStep1 = familyAllowanceNumberType / 30;
+ var familyAllowanceStep4 = familyAllowanceStep1 * TotalContractdaysUnder30;
+ familyAllowance = familyAllowanceStep4.ToMoney();
+ }
- SumWorkeTime = $"{44}";
+ SumWorkeTime = $"{44}";
- //اضافه کار
- if (owerTimeWork > 0)
- {
+ //اضافه کار
+ if (owerTimeWork > 0)
+ {
//int mandatoryH = (int)Mandatory.TotalHours;
//int mandatoryM = (int)(Mandatory.TotalMinutes % 60);
int mandatoryH = (int)owerTimeWork;
int mandatoryM = (int)Math.Round((owerTimeWork - mandatoryH) * 60);
overMandatoryHours = mandatoryH.ToString();
- overMandatoryMinuts = mandatoryM.ToString();
- }
+ overMandatoryMinuts = mandatoryM.ToString();
+ }
- }
- #endregion
+ }
+ #endregion
- //****** نوبت کاری و شب کاری ****
- #region RotatingShiftCheckAndNightWorkOver22
+ //****** نوبت کاری و شب کاری ****
+ #region RotatingShiftCheckAndNightWorkOver22
- string shiftPayValue = "0";
- List rotatingResultList = RotatingShiftCheck(groupedRollCall);
- var moriningCount = rotatingResultList.Count(x => x.IsMorningShift);
- var eveningCount = rotatingResultList.Count(x => x.IsEveningShift);
- var nightCount = rotatingResultList.Count(x => x.IsNightShift);
- // شبکاری
- TimeSpan over22 = new TimeSpan(rotatingResultList.Sum(x => x.NightWorkSpan.Ticks));
- var RotatingfaName = new List();
- if (command.ShiftWork != "1" && command.ShiftWork != "2" && command.ShiftWork != "4")//اگر چرخشی بود و منظم نبود
- {
- if (moriningCount > 0)
- RotatingfaName.Add("صبح");
- if (eveningCount > 0)
- RotatingfaName.Add("عصر");
- if (nightCount > 0)
- RotatingfaName.Add("شب");
- }
- else// اگر منظم و شیفتی بود
- {
- var totalDays = (int)(command.ContractEndGr - command.ContractStartGr).TotalDays + 1;
- int validCount = 0;
- if (totalDays <= 7) // زیر 7 روز باید حد اقل 2 تغییر شیفت داشته باشد
- {
- validCount = 2;
- }
- else if (totalDays >= 28) // بالای 28 روز حد اقل 8 تغییر شیفت
- {
- validCount = 8;
- }
- else
- {
- // تناسب گیری - اگر برای 28 روز 8 تغییر پس برای ایکس روز چند تغییر لازم است
- validCount = (int)((totalDays * 8) / 28);
- }
+ string shiftPayValue = "0";
+ List rotatingResultList = RotatingShiftCheck(groupedRollCall);
+ var moriningCount = rotatingResultList.Count(x => x.IsMorningShift);
+ var eveningCount = rotatingResultList.Count(x => x.IsEveningShift);
+ var nightCount = rotatingResultList.Count(x => x.IsNightShift);
+ // شبکاری
+ TimeSpan over22 = new TimeSpan(rotatingResultList.Sum(x => x.NightWorkSpan.Ticks));
+ var RotatingfaName = new List();
+ if (command.ShiftWork != "1" && command.ShiftWork != "2" && command.ShiftWork != "4")//اگر چرخشی بود و منظم نبود
+ {
+ if (moriningCount > 0)
+ RotatingfaName.Add("صبح");
+ if (eveningCount > 0)
+ RotatingfaName.Add("عصر");
+ if (nightCount > 0)
+ RotatingfaName.Add("شب");
+ }
+ else// اگر منظم و شیفتی بود
+ {
+ var totalDays = (int)(command.ContractEndGr - command.ContractStartGr).TotalDays + 1;
+ int validCount = 0;
+ if (totalDays <= 7) // زیر 7 روز باید حد اقل 2 تغییر شیفت داشته باشد
+ {
+ validCount = 2;
+ }
+ else if (totalDays >= 28) // بالای 28 روز حد اقل 8 تغییر شیفت
+ {
+ validCount = 8;
+ }
+ else
+ {
+ // تناسب گیری - اگر برای 28 روز 8 تغییر پس برای ایکس روز چند تغییر لازم است
+ validCount = (int)((totalDays * 8) / 28);
+ }
- if (moriningCount >= validCount)
- RotatingfaName.Add("صبح");
- if (eveningCount >= validCount)
- RotatingfaName.Add("عصر");
- if (nightCount >= validCount)
- RotatingfaName.Add("شب");
+ if (moriningCount >= validCount)
+ RotatingfaName.Add("صبح");
+ if (eveningCount >= validCount)
+ RotatingfaName.Add("عصر");
+ if (nightCount >= validCount)
+ RotatingfaName.Add("شب");
- }
+ }
- var rotatingFaResult = "";
- if (RotatingfaName.Count > 1)// اگر تعداد شیفت های محاسبه شده بیش از یک بود
- {
- shiftOver22Hours = "0";
- shiftOver22Minuts = "0";
- for (var rotateNumber = 0; rotateNumber < RotatingfaName.Count; rotateNumber++)
- {
- if (rotateNumber == 0)
- rotatingFaResult = $"{RotatingfaName[rotateNumber]}";
- if (rotateNumber == 1)
- rotatingFaResult += $" و {RotatingfaName[rotateNumber]}";
- if (rotateNumber == 2)
- rotatingFaResult += $" و {RotatingfaName[rotateNumber]}";
- }
- }
- else if (RotatingfaName.Count <= 1)
- {
- rotatingFaResult = "نوبت کاری ندارد";
+ var rotatingFaResult = "";
+ if (RotatingfaName.Count > 1)// اگر تعداد شیفت های محاسبه شده بیش از یک بود
+ {
+ shiftOver22Hours = "0";
+ shiftOver22Minuts = "0";
+ for (var rotateNumber = 0; rotateNumber < RotatingfaName.Count; rotateNumber++)
+ {
+ if (rotateNumber == 0)
+ rotatingFaResult = $"{RotatingfaName[rotateNumber]}";
+ if (rotateNumber == 1)
+ rotatingFaResult += $" و {RotatingfaName[rotateNumber]}";
+ if (rotateNumber == 2)
+ rotatingFaResult += $" و {RotatingfaName[rotateNumber]}";
+ }
+ }
+ else if (RotatingfaName.Count <= 1)
+ {
+ rotatingFaResult = "نوبت کاری ندارد";
- var over22Hours = (int)over22.TotalHours;
- var over22Minuts = (int)(over22.TotalMinutes % 60);
- shiftOver22Hours = over22Hours.ToString();
- shiftOver22Minuts = over22Minuts.ToString();
+ var over22Hours = (int)over22.TotalHours;
+ var over22Minuts = (int)(over22.TotalMinutes % 60);
+ shiftOver22Hours = over22Hours.ToString();
+ shiftOver22Minuts = over22Minuts.ToString();
- }
- #endregion
- //******* محاسبه مبلغ نوبت کاری *************
- #region ShiftPayPercent
+ }
+ #endregion
+ //******* محاسبه مبلغ نوبت کاری *************
+ #region ShiftPayPercent
- if (rotatingFaResult != "نوبت کاری ندارد" || rotatingFaResult != "")
- {
- var TotalDays = (command.ContractEndGr - command.ContractStartGr).TotalDays + 1;
- var DailyFeeNumberType = dayliFee.MoneyToDouble();
- if (rotatingFaResult == "صبح و عصر")
- {
- var shiftPyaPercent = DailyFeeNumberType * 10 / 100;
- ShiftPayResult = shiftPyaPercent * TotalDays;
- shiftPayValue = "10";
- }
- else if (rotatingFaResult == "صبح و عصر و شب")
- {
- var shiftPyaPercent = DailyFeeNumberType * 15 / 100;
- ShiftPayResult = shiftPyaPercent * TotalDays;
- shiftPayValue = "15";
- }
- else if (rotatingFaResult == "صبح و شب" || rotatingFaResult == "عصر و شب")
- {
- var shiftPyaPercent = DailyFeeNumberType * 22.5 / 100;
- ShiftPayResult = shiftPyaPercent * TotalDays;
- shiftPayValue = "22.5";
- }
- }
+ if (rotatingFaResult != "نوبت کاری ندارد" || rotatingFaResult != "")
+ {
+ var TotalDays = (command.ContractEndGr - command.ContractStartGr).TotalDays + 1;
+ var DailyFeeNumberType = dayliFee.MoneyToDouble();
+ if (rotatingFaResult == "صبح و عصر")
+ {
+ var shiftPyaPercent = DailyFeeNumberType * 10 / 100;
+ ShiftPayResult = shiftPyaPercent * TotalDays;
+ shiftPayValue = "10";
+ }
+ else if (rotatingFaResult == "صبح و عصر و شب")
+ {
+ var shiftPyaPercent = DailyFeeNumberType * 15 / 100;
+ ShiftPayResult = shiftPyaPercent * TotalDays;
+ shiftPayValue = "15";
+ }
+ else if (rotatingFaResult == "صبح و شب" || rotatingFaResult == "عصر و شب")
+ {
+ var shiftPyaPercent = DailyFeeNumberType * 22.5 / 100;
+ ShiftPayResult = shiftPyaPercent * TotalDays;
+ shiftPayValue = "22.5";
+ }
+ }
- #endregion
+ #endregion
- #region Result
+ #region Result
- var res = new ComputingViewModel()
- {
+ var res = new ComputingViewModel()
+ {
- NumberOfWorkingDays = $"{groupedRollCall.Count}",
- NumberOfFriday = $"{numberOfFridays}",
- TotalHoursesH = totalHolidaysAndNotH.ToString(),
- TotalHoursesM = totalHolidaysAndNotM.ToString(),
- OverTimeWorkH = overMandatoryHours,
- OverTimeWorkM = overMandatoryMinuts,
- OverNightWorkH = shiftOver22Hours,
- OverNightWorkM = shiftOver22Minuts,
- ComplexNumberOfWorkingDays = $"{groupedRollCall.Count}",
- SalaryCompute = dayliFee,
- SumTime44 = SumWorkeTime,
- ConsumableItems = ConsumableItems,
- HousingAllowance = HousingAllowance,
- FamilyAllowance = familyAllowance,
- OfficialHoliday = holiday,
- weeklyTime = weeklyTime,
- RotatingResultList = rotatingResultList,
- RotatingStatus = rotatingFaResult,
- ShiftPay = ShiftPayResult,
- Basic = basic,
- FridayStartToEnd = fridays,
- TotalHolidayAndNotH = totalHolidaysAndNotH.ToString(),
- TotalHolidayAndNotM = totalHolidaysAndNotM.ToString(),
- DayliFeeComplete = dayliFeeComplete,
- MarriedAllowance = MarriedAllowanceStr,
- RotatingShiftValue = shiftPayValue
- };
+ NumberOfWorkingDays = $"{groupedRollCall.Count}",
+ NumberOfFriday = $"{numberOfFridays}",
+ TotalHoursesH = totalHolidaysAndNotH.ToString(),
+ TotalHoursesM = totalHolidaysAndNotM.ToString(),
+ OverTimeWorkH = overMandatoryHours,
+ OverTimeWorkM = overMandatoryMinuts,
+ OverNightWorkH = shiftOver22Hours,
+ OverNightWorkM = shiftOver22Minuts,
+ ComplexNumberOfWorkingDays = $"{groupedRollCall.Count}",
+ SalaryCompute = dayliFee,
+ SumTime44 = SumWorkeTime,
+ ConsumableItems = ConsumableItems,
+ HousingAllowance = HousingAllowance,
+ FamilyAllowance = familyAllowance,
+ OfficialHoliday = holiday,
+ weeklyTime = weeklyTime,
+ RotatingResultList = rotatingResultList,
+ RotatingStatus = rotatingFaResult,
+ ShiftPay = ShiftPayResult,
+ Basic = basic,
+ FridayStartToEnd = fridays,
+ TotalHolidayAndNotH = totalHolidaysAndNotH.ToString(),
+ TotalHolidayAndNotM = totalHolidaysAndNotM.ToString(),
+ DayliFeeComplete = dayliFeeComplete,
+ MarriedAllowance = MarriedAllowanceStr,
+ RotatingShiftValue = shiftPayValue
+ };
- #endregion
- return res;
- }
+ #endregion
+ return res;
+ }
- public static TimeSpan CalculateBreakTime(BreakTime breakTime, TimeSpan sumOneDaySpan)
- {
- if (breakTime.BreakTimeType != BreakTimeType.WithTime)
- return new TimeSpan();
+ public static TimeSpan CalculateBreakTime(BreakTime breakTime, TimeSpan sumOneDaySpan)
+ {
+ if (breakTime.BreakTimeType != BreakTimeType.WithTime)
+ return new TimeSpan();
- var breakTimeSpan = breakTime.BreakTimeValue.ToTimeSpan();
+ var breakTimeSpan = breakTime.BreakTimeValue.ToTimeSpan();
- if (breakTimeSpan * 2 >= sumOneDaySpan)
- return new TimeSpan();
+ if (breakTimeSpan * 2 >= sumOneDaySpan)
+ return new TimeSpan();
- return breakTimeSpan; ;
+ return breakTimeSpan; ;
- }
+ }
- public TimeSpan AfterSubtract(CreateWorkingHoursTemp command, TimeSpan sumOneDaySpan, DateTime creationDate)
- {
- #region RestTimes
+ public TimeSpan AfterSubtract(CreateWorkingHoursTemp command, TimeSpan sumOneDaySpan, DateTime creationDate)
+ {
+ #region RestTimes
- var rest0 = new TimeSpan();
- var rest1 = new TimeSpan();
- var rest2 = new TimeSpan();
- var rest3 = new TimeSpan();
- var rest4 = new TimeSpan();
- var rest5 = new TimeSpan();
- var rest6 = new TimeSpan();
- switch (command.ShiftWork)
- {
- case "1":
- case "2":
- command.RestTime = command.RestTime == "0" ? "00" : command.RestTime;
- command.RestTimeYekshanbeh = command.RestTimeYekshanbeh == "0" ? "00" : command.RestTimeYekshanbeh;
- command.RestTimeDoshanbeh = command.RestTimeDoshanbeh == "0" ? "00" : command.RestTimeDoshanbeh;
- command.RestTimeSeshanbeh = command.RestTimeSeshanbeh == "0" ? "00" : command.RestTimeSeshanbeh;
- command.RestTimeCheharshanbeh =
- command.RestTimeCheharshanbeh == "0" ? "00" : command.RestTimeCheharshanbeh;
- command.RestTimePanjshanbeh = command.RestTimePanjshanbeh == "0" ? "00" : command.RestTimePanjshanbeh;
- command.RestTimeJomeh = command.RestTimeJomeh == "0" ? "00" : command.RestTimeJomeh;
- command.RestTimeMin = command.RestTimeMin == "0" ? "00" : command.RestTimeMin;
- command.RestTimeYekshanbehMin =
- command.RestTimeYekshanbehMin == "0" ? "00" : command.RestTimeYekshanbehMin;
- command.RestTimeDoshanbehMin =
- command.RestTimeDoshanbehMin == "0" ? "00" : command.RestTimeDoshanbehMin;
- command.RestTimeSeshanbehMin =
- command.RestTimeSeshanbehMin == "0" ? "00" : command.RestTimeSeshanbehMin;
- command.RestTimeCheharshanbehMin =
- command.RestTimeCheharshanbehMin == "0" ? "00" : command.RestTimeCheharshanbehMin;
- command.RestTimePanjshanbehMin =
- command.RestTimePanjshanbehMin == "0" ? "00" : command.RestTimePanjshanbehMin;
- command.RestTimeJomehMin = command.RestTimeJomehMin == "0" ? "00" : command.RestTimeJomehMin;
+ var rest0 = new TimeSpan();
+ var rest1 = new TimeSpan();
+ var rest2 = new TimeSpan();
+ var rest3 = new TimeSpan();
+ var rest4 = new TimeSpan();
+ var rest5 = new TimeSpan();
+ var rest6 = new TimeSpan();
+ switch (command.ShiftWork)
+ {
+ case "1":
+ case "2":
+ command.RestTime = command.RestTime == "0" ? "00" : command.RestTime;
+ command.RestTimeYekshanbeh = command.RestTimeYekshanbeh == "0" ? "00" : command.RestTimeYekshanbeh;
+ command.RestTimeDoshanbeh = command.RestTimeDoshanbeh == "0" ? "00" : command.RestTimeDoshanbeh;
+ command.RestTimeSeshanbeh = command.RestTimeSeshanbeh == "0" ? "00" : command.RestTimeSeshanbeh;
+ command.RestTimeCheharshanbeh =
+ command.RestTimeCheharshanbeh == "0" ? "00" : command.RestTimeCheharshanbeh;
+ command.RestTimePanjshanbeh = command.RestTimePanjshanbeh == "0" ? "00" : command.RestTimePanjshanbeh;
+ command.RestTimeJomeh = command.RestTimeJomeh == "0" ? "00" : command.RestTimeJomeh;
+ command.RestTimeMin = command.RestTimeMin == "0" ? "00" : command.RestTimeMin;
+ command.RestTimeYekshanbehMin =
+ command.RestTimeYekshanbehMin == "0" ? "00" : command.RestTimeYekshanbehMin;
+ command.RestTimeDoshanbehMin =
+ command.RestTimeDoshanbehMin == "0" ? "00" : command.RestTimeDoshanbehMin;
+ command.RestTimeSeshanbehMin =
+ command.RestTimeSeshanbehMin == "0" ? "00" : command.RestTimeSeshanbehMin;
+ command.RestTimeCheharshanbehMin =
+ command.RestTimeCheharshanbehMin == "0" ? "00" : command.RestTimeCheharshanbehMin;
+ command.RestTimePanjshanbehMin =
+ command.RestTimePanjshanbehMin == "0" ? "00" : command.RestTimePanjshanbehMin;
+ command.RestTimeJomehMin = command.RestTimeJomehMin == "0" ? "00" : command.RestTimeJomehMin;
- rest0 = TimeSpan.Parse($"{command.RestTime}:{command.RestTimeMin}");
- rest1 = TimeSpan.Parse($"{command.RestTimeYekshanbeh}:{command.RestTimeYekshanbehMin}");
- rest2 = TimeSpan.Parse($"{command.RestTimeDoshanbeh}:{command.RestTimeDoshanbehMin}");
- rest3 = TimeSpan.Parse($"{command.RestTimeSeshanbeh}:{command.RestTimeSeshanbehMin}");
- rest4 = TimeSpan.Parse($"{command.RestTimeCheharshanbeh}:{command.RestTimeCheharshanbehMin}");
- rest5 = TimeSpan.Parse($"{command.RestTimePanjshanbeh}:{command.RestTimePanjshanbehMin}");
- rest6 = TimeSpan.Parse($"{command.RestTimeJomeh}:{command.RestTimeJomehMin}");
- break;
- case "4":
- command.RestTimeShanbe1 = command.RestTimeShanbe1 == "0" ? "00" : command.RestTimeShanbe1;
- command.RestTimeShanbe1Min = command.RestTimeShanbe1Min == "0" ? "00" : command.RestTimeShanbe1Min;
- command.RestTimeYekShanbe1 = command.RestTimeYekShanbe1 == "0" ? "00" : command.RestTimeYekShanbe1;
- command.RestTimeYekShanbe1Min =
- command.RestTimeYekShanbe1Min == "0" ? "00" : command.RestTimeYekShanbe1Min;
- command.RestTimeDoShanbe1 = command.RestTimeDoShanbe1 == "0" ? "00" : command.RestTimeDoShanbe1;
- command.RestTimeDoShanbe1Min =
- command.RestTimeDoShanbe1Min == "0" ? "00" : command.RestTimeDoShanbe1Min;
- command.RestTimeSeShanbe1 = command.RestTimeSeShanbe1 == "0" ? "00" : command.RestTimeSeShanbe1;
- command.RestTimeSeShanbe1Min =
- command.RestTimeSeShanbe1Min == "0" ? "00" : command.RestTimeSeShanbe1Min;
- command.RestTimeCheharShanbe1 =
- command.RestTimeCheharShanbe1 == "0" ? "00" : command.RestTimeCheharShanbe1;
- command.RestTimeCheharShanbe1Min =
- command.RestTimeCheharShanbe1Min == "0" ? "00" : command.RestTimeCheharShanbe1Min;
- command.RestTimePanjShanbe1 = command.RestTimePanjShanbe1 == "0" ? "00" : command.RestTimePanjShanbe1;
- command.RestTimePanjShanbe1Min =
- command.RestTimePanjShanbe1Min == "0" ? "00" : command.RestTimePanjShanbe1Min;
- command.RestTimeJome1 = command.RestTimeJome1 == "0" ? "00" : command.RestTimeJome1;
- command.RestTimeJome1Min = command.RestTimeJome1Min == "0" ? "00" : command.RestTimeJome1Min;
+ rest0 = TimeSpan.Parse($"{command.RestTime}:{command.RestTimeMin}");
+ rest1 = TimeSpan.Parse($"{command.RestTimeYekshanbeh}:{command.RestTimeYekshanbehMin}");
+ rest2 = TimeSpan.Parse($"{command.RestTimeDoshanbeh}:{command.RestTimeDoshanbehMin}");
+ rest3 = TimeSpan.Parse($"{command.RestTimeSeshanbeh}:{command.RestTimeSeshanbehMin}");
+ rest4 = TimeSpan.Parse($"{command.RestTimeCheharshanbeh}:{command.RestTimeCheharshanbehMin}");
+ rest5 = TimeSpan.Parse($"{command.RestTimePanjshanbeh}:{command.RestTimePanjshanbehMin}");
+ rest6 = TimeSpan.Parse($"{command.RestTimeJomeh}:{command.RestTimeJomehMin}");
+ break;
+ case "4":
+ command.RestTimeShanbe1 = command.RestTimeShanbe1 == "0" ? "00" : command.RestTimeShanbe1;
+ command.RestTimeShanbe1Min = command.RestTimeShanbe1Min == "0" ? "00" : command.RestTimeShanbe1Min;
+ command.RestTimeYekShanbe1 = command.RestTimeYekShanbe1 == "0" ? "00" : command.RestTimeYekShanbe1;
+ command.RestTimeYekShanbe1Min =
+ command.RestTimeYekShanbe1Min == "0" ? "00" : command.RestTimeYekShanbe1Min;
+ command.RestTimeDoShanbe1 = command.RestTimeDoShanbe1 == "0" ? "00" : command.RestTimeDoShanbe1;
+ command.RestTimeDoShanbe1Min =
+ command.RestTimeDoShanbe1Min == "0" ? "00" : command.RestTimeDoShanbe1Min;
+ command.RestTimeSeShanbe1 = command.RestTimeSeShanbe1 == "0" ? "00" : command.RestTimeSeShanbe1;
+ command.RestTimeSeShanbe1Min =
+ command.RestTimeSeShanbe1Min == "0" ? "00" : command.RestTimeSeShanbe1Min;
+ command.RestTimeCheharShanbe1 =
+ command.RestTimeCheharShanbe1 == "0" ? "00" : command.RestTimeCheharShanbe1;
+ command.RestTimeCheharShanbe1Min =
+ command.RestTimeCheharShanbe1Min == "0" ? "00" : command.RestTimeCheharShanbe1Min;
+ command.RestTimePanjShanbe1 = command.RestTimePanjShanbe1 == "0" ? "00" : command.RestTimePanjShanbe1;
+ command.RestTimePanjShanbe1Min =
+ command.RestTimePanjShanbe1Min == "0" ? "00" : command.RestTimePanjShanbe1Min;
+ command.RestTimeJome1 = command.RestTimeJome1 == "0" ? "00" : command.RestTimeJome1;
+ command.RestTimeJome1Min = command.RestTimeJome1Min == "0" ? "00" : command.RestTimeJome1Min;
- // sumrest week1
- rest0 = TimeSpan.Parse($"{command.RestTimeShanbe1}:{command.RestTimeShanbe1Min}");
- rest1 = TimeSpan.Parse($"{command.RestTimeYekShanbe1}:{command.RestTimeYekShanbe1Min}");
- rest2 = TimeSpan.Parse($"{command.RestTimeDoShanbe1}:{command.RestTimeDoShanbe1Min}");
- rest3 = TimeSpan.Parse($"{command.RestTimeSeShanbe1}:{command.RestTimeSeShanbe1Min}");
- rest4 = TimeSpan.Parse($"{command.RestTimeCheharShanbe1}:{command.RestTimeCheharShanbe1Min}");
- rest5 = TimeSpan.Parse($"{command.RestTimePanjShanbe1}:{command.RestTimePanjShanbe1Min}");
- rest6 = TimeSpan.Parse($"{command.RestTimeJome1}:{command.RestTimeJome1Min}");
- break;
- }
- //week1
+ // sumrest week1
+ rest0 = TimeSpan.Parse($"{command.RestTimeShanbe1}:{command.RestTimeShanbe1Min}");
+ rest1 = TimeSpan.Parse($"{command.RestTimeYekShanbe1}:{command.RestTimeYekShanbe1Min}");
+ rest2 = TimeSpan.Parse($"{command.RestTimeDoShanbe1}:{command.RestTimeDoShanbe1Min}");
+ rest3 = TimeSpan.Parse($"{command.RestTimeSeShanbe1}:{command.RestTimeSeShanbe1Min}");
+ rest4 = TimeSpan.Parse($"{command.RestTimeCheharShanbe1}:{command.RestTimeCheharShanbe1Min}");
+ rest5 = TimeSpan.Parse($"{command.RestTimePanjShanbe1}:{command.RestTimePanjShanbe1Min}");
+ rest6 = TimeSpan.Parse($"{command.RestTimeJome1}:{command.RestTimeJome1Min}");
+ break;
+ }
+ //week1
- #endregion
+ #endregion
- var result = new TimeSpan();
- switch (creationDate.DayOfWeek)
- {
- case DayOfWeek.Saturday:
- if (sumOneDaySpan >= rest0)
- result = sumOneDaySpan.Subtract(rest0);
- break;
- case DayOfWeek.Sunday:
- if (sumOneDaySpan >= rest1)
- result = sumOneDaySpan.Subtract(rest1);
- break;
- case DayOfWeek.Monday:
- if (sumOneDaySpan >= rest2)
- result = sumOneDaySpan.Subtract(rest2);
- break;
- case DayOfWeek.Tuesday:
- if (sumOneDaySpan >= rest3)
- result = sumOneDaySpan.Subtract(rest3);
- break;
- case DayOfWeek.Wednesday:
- if (sumOneDaySpan >= rest4)
- result = sumOneDaySpan.Subtract(rest4);
- break;
- case DayOfWeek.Thursday:
- if (sumOneDaySpan >= rest5)
- result = sumOneDaySpan.Subtract(rest5);
- break;
- case DayOfWeek.Friday:
- if (sumOneDaySpan >= rest6)
- result = sumOneDaySpan.Subtract(rest6);
- break;
- }
+ var result = new TimeSpan();
+ switch (creationDate.DayOfWeek)
+ {
+ case DayOfWeek.Saturday:
+ if (sumOneDaySpan >= rest0)
+ result = sumOneDaySpan.Subtract(rest0);
+ break;
+ case DayOfWeek.Sunday:
+ if (sumOneDaySpan >= rest1)
+ result = sumOneDaySpan.Subtract(rest1);
+ break;
+ case DayOfWeek.Monday:
+ if (sumOneDaySpan >= rest2)
+ result = sumOneDaySpan.Subtract(rest2);
+ break;
+ case DayOfWeek.Tuesday:
+ if (sumOneDaySpan >= rest3)
+ result = sumOneDaySpan.Subtract(rest3);
+ break;
+ case DayOfWeek.Wednesday:
+ if (sumOneDaySpan >= rest4)
+ result = sumOneDaySpan.Subtract(rest4);
+ break;
+ case DayOfWeek.Thursday:
+ if (sumOneDaySpan >= rest5)
+ result = sumOneDaySpan.Subtract(rest5);
+ break;
+ case DayOfWeek.Friday:
+ if (sumOneDaySpan >= rest6)
+ result = sumOneDaySpan.Subtract(rest6);
+ break;
+ }
- return result;
- }
+ return result;
+ }
- public List RotatingShiftCheck(List rollCallList)
- {
- List finalResult = new List();
- var nullDateTme = new DateTime(0001, 01, 01);
- foreach (var item in rollCallList)
- {
- #region Entityes
+ public List RotatingShiftCheck(List rollCallList)
+ {
+ List finalResult = new List();
+ var nullDateTme = new DateTime(0001, 01, 01);
+ foreach (var item in rollCallList)
+ {
+ #region Entityes
- var morningWorkingTime = new TimeSpan();
- var eveningWorkingTime = new TimeSpan();
- var nightWorkingTime = new TimeSpan();
+ var morningWorkingTime = new TimeSpan();
+ var eveningWorkingTime = new TimeSpan();
+ var nightWorkingTime = new TimeSpan();
- #endregion
+ #endregion
- foreach (var shift in item.ShiftList)
- {
+ foreach (var shift in item.ShiftList)
+ {
#region DatePeriod
var shiftDate = item.CreationDate;
@@ -718,7 +718,7 @@ CreateWorkingHoursTemp command, bool holidayWorking)
nightWorkingTime = nightWorkingTime.Add(morningStart - shift.Start);
morningWorkingTime = morningWorkingTime.Add(new TimeSpan(8, 0, 0));
eveningWorkingTime = eveningWorkingTime.Add(shift.End - eveningStart);
-
+
}
else if (shift.Start >= midNight24 // 00:00---6---14----22---->6
&& shift.Start < morningStart
@@ -728,896 +728,896 @@ CreateWorkingHoursTemp command, bool holidayWorking)
morningWorkingTime = morningWorkingTime.Add(new TimeSpan(8, 0, 0));
eveningWorkingTime = eveningWorkingTime.Add(new TimeSpan(8, 0, 0));
nightWorkingTime = nightWorkingTime.Add(shift.End - eveningEnd);
-
+
}
#endregion
-
+
#region morning enter 14 <- 6
if (shift.Start >= morningStart // 14<---<6
- && shift.End <= morningEnd)
- {
- morningWorkingTime = morningWorkingTime.Add(shift.End - shift.Start);
- }
- else if (shift.Start >= morningStart && shift.Start < morningEnd // 22<---14---6
- && shift.End > eveningStart && shift.End <= eveningEnd)
- {
- morningWorkingTime = morningWorkingTime.Add(morningEnd - shift.Start);
- eveningWorkingTime = eveningWorkingTime.Add(shift.End - eveningStart);
+ && shift.End <= morningEnd)
+ {
+ morningWorkingTime = morningWorkingTime.Add(shift.End - shift.Start);
+ }
+ else if (shift.Start >= morningStart && shift.Start < morningEnd // 22<---14---6
+ && shift.End > eveningStart && shift.End <= eveningEnd)
+ {
+ morningWorkingTime = morningWorkingTime.Add(morningEnd - shift.Start);
+ eveningWorkingTime = eveningWorkingTime.Add(shift.End - eveningStart);
- }
- else if (shift.Start >= morningStart && shift.Start < morningEnd// // 6<---22---14---6
- && shift.End > eveningEnd && shift.End <= nightEndNextday)
- {
- morningWorkingTime = morningWorkingTime.Add(morningEnd - shift.Start);
- eveningWorkingTime = eveningWorkingTime.Add(new TimeSpan(8, 0, 0));
- nightWorkingTime = nightWorkingTime.Add(shift.End - eveningEnd);
- }
- else if (shift.Start >= morningStart // 14<---6<---22---14---6
- && shift.Start < morningEnd
- && shift.End > nightEndNextday && shift.End <= morningEndNextday)
- {
- morningWorkingTime = morningWorkingTime.Add(morningEnd - shift.Start);
- eveningWorkingTime = eveningWorkingTime.Add(new TimeSpan(8, 0, 0));
- nightWorkingTime = nightWorkingTime.Add(new TimeSpan(8, 0, 0));
- TimeSpan nextDayMorningSpan = (shift.End - nightEndNextday);
- morningWorkingTime = morningWorkingTime.Add(nextDayMorningSpan);
- }
- else if (shift.Start >= morningStart // 22<---14<---6<---22---14---6
- && shift.Start < morningEnd
- && shift.End > morningEndNextday && shift.End <= eveningEndNextday)
- {
- morningWorkingTime = morningWorkingTime.Add(morningEnd - shift.Start);
- eveningWorkingTime = eveningWorkingTime.Add(new TimeSpan(8, 0, 0));
- nightWorkingTime = nightWorkingTime.Add(new TimeSpan(8, 0, 0));
- morningWorkingTime = morningWorkingTime.Add(new TimeSpan(8, 0, 0));
- TimeSpan nextDayEveningSpan = (shift.End - morningEndNextday);
- eveningWorkingTime = eveningWorkingTime.Add(nextDayEveningSpan);
+ }
+ else if (shift.Start >= morningStart && shift.Start < morningEnd// // 6<---22---14---6
+ && shift.End > eveningEnd && shift.End <= nightEndNextday)
+ {
+ morningWorkingTime = morningWorkingTime.Add(morningEnd - shift.Start);
+ eveningWorkingTime = eveningWorkingTime.Add(new TimeSpan(8, 0, 0));
+ nightWorkingTime = nightWorkingTime.Add(shift.End - eveningEnd);
+ }
+ else if (shift.Start >= morningStart // 14<---6<---22---14---6
+ && shift.Start < morningEnd
+ && shift.End > nightEndNextday && shift.End <= morningEndNextday)
+ {
+ morningWorkingTime = morningWorkingTime.Add(morningEnd - shift.Start);
+ eveningWorkingTime = eveningWorkingTime.Add(new TimeSpan(8, 0, 0));
+ nightWorkingTime = nightWorkingTime.Add(new TimeSpan(8, 0, 0));
+ TimeSpan nextDayMorningSpan = (shift.End - nightEndNextday);
+ morningWorkingTime = morningWorkingTime.Add(nextDayMorningSpan);
+ }
+ else if (shift.Start >= morningStart // 22<---14<---6<---22---14---6
+ && shift.Start < morningEnd
+ && shift.End > morningEndNextday && shift.End <= eveningEndNextday)
+ {
+ morningWorkingTime = morningWorkingTime.Add(morningEnd - shift.Start);
+ eveningWorkingTime = eveningWorkingTime.Add(new TimeSpan(8, 0, 0));
+ nightWorkingTime = nightWorkingTime.Add(new TimeSpan(8, 0, 0));
+ morningWorkingTime = morningWorkingTime.Add(new TimeSpan(8, 0, 0));
+ TimeSpan nextDayEveningSpan = (shift.End - morningEndNextday);
+ eveningWorkingTime = eveningWorkingTime.Add(nextDayEveningSpan);
- }
+ }
- #endregion
-
- #region evening enter 22 <- 14
-
- if (shift.Start >= eveningStart // 22<---<14
- && shift.End <= eveningEnd)
- {
- eveningWorkingTime = morningWorkingTime.Add(eveningEnd - eveningStart);
- }
- else if (shift.Start >= eveningStart && shift.Start < eveningEnd // 6<---22---14
- && shift.End > nightStart && shift.End <= nightEndNextday)
- {
- eveningWorkingTime = eveningWorkingTime.Add(eveningEnd - shift.Start);
- nightWorkingTime = nightWorkingTime.Add(shift.End - eveningEnd);
-
- }
- else if (shift.Start >= eveningStart && shift.Start < eveningEnd// // 14<---6---22---14
- && shift.End > nightEndNextday && shift.End <= morningEndNextday)
- {
- eveningWorkingTime = eveningWorkingTime.Add(eveningEnd - shift.Start);
- nightWorkingTime = nightWorkingTime.Add(new TimeSpan(8, 0, 0));
- morningWorkingTime = morningWorkingTime.Add(shift.End - nightEndNextday);
- }
- else if (shift.Start >= eveningStart // 22<---14<---6---22---14
- && shift.Start < eveningEnd
- && shift.End > morningEndNextday && shift.End <= eveningEndNextday)
- {
- eveningWorkingTime = eveningWorkingTime.Add(morningEnd - shift.Start);
- nightWorkingTime = nightWorkingTime.Add(new TimeSpan(8, 0, 0));
- morningWorkingTime = morningWorkingTime.Add(new TimeSpan(8, 0, 0));
- TimeSpan nextDayEveningSpan = (shift.End - morningEndNextday);
- eveningWorkingTime = eveningWorkingTime.Add(nextDayEveningSpan);
- }
-
- #endregion
-
- #region night enter 6 <- 22
- if (shift.Start >= nightStart // 6<---<22
- && shift.End <= nightEndNextday)
- {
- nightWorkingTime = nightWorkingTime.Add(shift.End - shift.Start);
- }
- else if (shift.Start >= nightStart && shift.Start < nightEndNextday // 14<---6---22
- && shift.End > nightEndNextday && shift.End <= morningEndNextday)
- {
- nightWorkingTime = nightWorkingTime.Add(nightEndNextday - shift.Start);
- morningWorkingTime = morningWorkingTime.Add(shift.End - nightEndNextday);
-
- }
- else if (shift.Start >= nightStart && shift.Start < nightEndNextday// // 22<---14---6---22
- && shift.End > morningEndNextday && shift.End <= eveningEndNextday)
- {
- nightWorkingTime = nightWorkingTime.Add(nightEndNextday - shift.Start); ;
- morningWorkingTime = morningWorkingTime.Add(new TimeSpan(8, 0, 0));
- eveningWorkingTime = eveningWorkingTime.Add(shift.End - morningEndNextday);
- }
- else if (shift.Start >= nightStart // 6<---22<---14---6---22
- && shift.Start < nightEndNextday
- && shift.End > eveningEndNextday)
- {
-
- nightWorkingTime = nightWorkingTime.Add(nightEndNextday - shift.Start);
- morningWorkingTime = morningWorkingTime.Add(new TimeSpan(8, 0, 0));
- eveningWorkingTime = eveningWorkingTime.Add(new TimeSpan(8, 0, 0));
- TimeSpan nextDayNightSpan = (shift.End - eveningEndNextday);
- nightWorkingTime = nightWorkingTime.Add(nextDayNightSpan);
- }
#endregion
-
+ #region evening enter 22 <- 14
+
+ if (shift.Start >= eveningStart // 22<---<14
+ && shift.End <= eveningEnd)
+ {
+ eveningWorkingTime = morningWorkingTime.Add(eveningEnd - eveningStart);
+ }
+ else if (shift.Start >= eveningStart && shift.Start < eveningEnd // 6<---22---14
+ && shift.End > nightStart && shift.End <= nightEndNextday)
+ {
+ eveningWorkingTime = eveningWorkingTime.Add(eveningEnd - shift.Start);
+ nightWorkingTime = nightWorkingTime.Add(shift.End - eveningEnd);
+
+ }
+ else if (shift.Start >= eveningStart && shift.Start < eveningEnd// // 14<---6---22---14
+ && shift.End > nightEndNextday && shift.End <= morningEndNextday)
+ {
+ eveningWorkingTime = eveningWorkingTime.Add(eveningEnd - shift.Start);
+ nightWorkingTime = nightWorkingTime.Add(new TimeSpan(8, 0, 0));
+ morningWorkingTime = morningWorkingTime.Add(shift.End - nightEndNextday);
+ }
+ else if (shift.Start >= eveningStart // 22<---14<---6---22---14
+ && shift.Start < eveningEnd
+ && shift.End > morningEndNextday && shift.End <= eveningEndNextday)
+ {
+ eveningWorkingTime = eveningWorkingTime.Add(morningEnd - shift.Start);
+ nightWorkingTime = nightWorkingTime.Add(new TimeSpan(8, 0, 0));
+ morningWorkingTime = morningWorkingTime.Add(new TimeSpan(8, 0, 0));
+ TimeSpan nextDayEveningSpan = (shift.End - morningEndNextday);
+ eveningWorkingTime = eveningWorkingTime.Add(nextDayEveningSpan);
+ }
+
+ #endregion
+
+ #region night enter 6 <- 22
+ if (shift.Start >= nightStart // 6<---<22
+ && shift.End <= nightEndNextday)
+ {
+ nightWorkingTime = nightWorkingTime.Add(shift.End - shift.Start);
+ }
+ else if (shift.Start >= nightStart && shift.Start < nightEndNextday // 14<---6---22
+ && shift.End > nightEndNextday && shift.End <= morningEndNextday)
+ {
+ nightWorkingTime = nightWorkingTime.Add(nightEndNextday - shift.Start);
+ morningWorkingTime = morningWorkingTime.Add(shift.End - nightEndNextday);
+
+ }
+ else if (shift.Start >= nightStart && shift.Start < nightEndNextday// // 22<---14---6---22
+ && shift.End > morningEndNextday && shift.End <= eveningEndNextday)
+ {
+ nightWorkingTime = nightWorkingTime.Add(nightEndNextday - shift.Start); ;
+ morningWorkingTime = morningWorkingTime.Add(new TimeSpan(8, 0, 0));
+ eveningWorkingTime = eveningWorkingTime.Add(shift.End - morningEndNextday);
+ }
+ else if (shift.Start >= nightStart // 6<---22<---14---6---22
+ && shift.Start < nightEndNextday
+ && shift.End > eveningEndNextday)
+ {
+
+ nightWorkingTime = nightWorkingTime.Add(nightEndNextday - shift.Start);
+ morningWorkingTime = morningWorkingTime.Add(new TimeSpan(8, 0, 0));
+ eveningWorkingTime = eveningWorkingTime.Add(new TimeSpan(8, 0, 0));
+ TimeSpan nextDayNightSpan = (shift.End - eveningEndNextday);
+ nightWorkingTime = nightWorkingTime.Add(nextDayNightSpan);
+ }
+ #endregion
+
+
}
- #region Result
-
- var result = new RotatingShiftViewModel();
- result.MorningWorkSpan = morningWorkingTime;
- result.EveningWorkSpan = eveningWorkingTime;
- result.NightWorkSpan = nightWorkingTime;
- var nullWorkspan = new TimeSpan(0, 0, 0);
-
- var totalTime = result.TotalWorkingTime.Add(result.MorningWorkSpan);
- totalTime = totalTime.Add(result.EveningWorkSpan);
- totalTime = totalTime.Add(result.NightWorkSpan);
-
- result.TotalWorkingTime = totalTime;
-
- var morningH = (int)result.MorningWorkSpan.TotalHours;
- var morningM = result.MorningWorkSpan.Minutes % 60;
- var morningMS = "00";
- if (morningM < 10 && morningM > 0)
- morningMS = $"0{morningM}";
- if (morningM > 10)
- morningMS = $"{morningM}";
- result.MorningString = $"0{morningH}:{morningMS}";
-
- var eveningH = (int)result.EveningWorkSpan.TotalHours;
- var eveningM = result.EveningWorkSpan.Minutes % 60;
- var eveningMS = "00";
- if (eveningM < 10 && eveningM > 0)
- eveningMS = $"0{eveningM}";
- if (eveningM > 10)
- eveningMS = $"{eveningM}";
- result.EveningString = $"0{eveningH}:{eveningMS}";
-
- var nightH = (int)result.NightWorkSpan.TotalHours;
- var nightM = result.NightWorkSpan.Minutes % 60;
- var nightMS = "00";
- if (nightM < 10 && nightM > 0)
- nightMS = $"0{nightM}";
- if (nightM > 10)
- nightMS = $"{nightM}";
- result.NightString = $"0{nightH}:{nightMS}";
-
- if (result.MorningWorkSpan > result.EveningWorkSpan
- || result.MorningWorkSpan == result.EveningWorkSpan) // if morning bigerThan evening or equal
- {
- if (result.MorningWorkSpan != nullWorkspan)
- {
- result.IsMorningShift = true;
- result.IsNightShift = false;
- result.IsEveningShift = false;
- result.RotatingShiftStatus = "صبح";
- }
-
- if (result.MorningWorkSpan < result.NightWorkSpan
- || result.MorningWorkSpan == result.NightWorkSpan) // if night bigerThan morning or equal
- if (result.NightWorkSpan != nullWorkspan)
- {
- result.IsMorningShift = false;
- result.IsNightShift = true;
- result.IsEveningShift = false;
- result.RotatingShiftStatus = "شب";
- }
- }
- else if (result.MorningWorkSpan < result.EveningWorkSpan) // if evening bigerThan morning
- {
- if (result.EveningWorkSpan != nullWorkspan)
- {
- result.IsEveningShift = true;
- result.IsMorningShift = false;
- result.IsNightShift = false;
- result.RotatingShiftStatus = "عصر";
- }
-
- if (result.EveningWorkSpan < result.NightWorkSpan
- || result.EveningWorkSpan == result.NightWorkSpan) // if night bigerThan evening or equal
- if (result.NightWorkSpan != nullWorkspan)
- {
- result.IsMorningShift = false;
- result.IsEveningShift = false;
- result.IsNightShift = true;
- result.RotatingShiftStatus = "شب";
- }
- }
-
- finalResult.Add(result);
- #endregion
- }
-
- return finalResult;
-
- }
-
- #endregion
-
- #region CustomizeCheckout
-
- ///
- /// متد محاسبه فیش حقوقی دلخواه
- ///
- ///
- ///
- ///
- ///
- ///
- public CustomizeCheckoutMandatoryViewModel CustomizeCheckoutMandatoryCompute(long employeeId, long workshopId, DateTime contractStart,
- DateTime contractEnd)
- {
-
- if (workshopId == 170)
- return CustomizeCheckoutMandatoryComputeForKebabMahdi(employeeId, workshopId, contractStart, contractEnd);
-
- var firstDayOfMonth = $"{(contractStart.ToFarsi())[..8]}/01".ToGeorgianDateTime();
-
- #region LeftWork
-
- var leftWork = _leftWorkRepository.GetByWorkshopIdEmployeeIdInDates(workshopId, employeeId, contractStart, contractEnd);
-
- if (leftWork.StartWorkDateGr > contractStart)
- {
- contractStart = leftWork.StartWorkDateGr;
- }
-
- if (leftWork.LeftWorkDateGr.AddDays(-1) < contractEnd)
- {
- contractEnd = leftWork.LeftWorkDateGr.AddDays(-1);
- }
-
- TimeSpan leftWorkDurationTimeSpan = leftWork.HasLeft ? leftWork.LeftWorkDateGr.AddDays(-1) - leftWork.StartWorkDateGr : contractEnd - leftWork.StartWorkDateGr;
-
-
- #endregion
-
-
- #region Entities
-
- int numberOfFridays = 0;
- double monthySalary = 0;
- int monthDays = 0;
- double dailyWage = 0;
- int numberOfWorkingDay = 0;
- string endPersianDate = contractEnd.ToFarsi();
- int monthOfCheckout = Convert.ToInt32(endPersianDate.Substring(5, 2));
- int yearOfCheckout = Convert.ToInt32(endPersianDate.Substring(0, 4));
- //روز هایی که پرسنل موظف بوده کار کند
- var mandatoryDays = 0;
+ #region Result
+
+ var result = new RotatingShiftViewModel();
+ result.MorningWorkSpan = morningWorkingTime;
+ result.EveningWorkSpan = eveningWorkingTime;
+ result.NightWorkSpan = nightWorkingTime;
+ var nullWorkspan = new TimeSpan(0, 0, 0);
+
+ var totalTime = result.TotalWorkingTime.Add(result.MorningWorkSpan);
+ totalTime = totalTime.Add(result.EveningWorkSpan);
+ totalTime = totalTime.Add(result.NightWorkSpan);
+
+ result.TotalWorkingTime = totalTime;
+
+ var morningH = (int)result.MorningWorkSpan.TotalHours;
+ var morningM = result.MorningWorkSpan.Minutes % 60;
+ var morningMS = "00";
+ if (morningM < 10 && morningM > 0)
+ morningMS = $"0{morningM}";
+ if (morningM > 10)
+ morningMS = $"{morningM}";
+ result.MorningString = $"0{morningH}:{morningMS}";
+
+ var eveningH = (int)result.EveningWorkSpan.TotalHours;
+ var eveningM = result.EveningWorkSpan.Minutes % 60;
+ var eveningMS = "00";
+ if (eveningM < 10 && eveningM > 0)
+ eveningMS = $"0{eveningM}";
+ if (eveningM > 10)
+ eveningMS = $"{eveningM}";
+ result.EveningString = $"0{eveningH}:{eveningMS}";
+
+ var nightH = (int)result.NightWorkSpan.TotalHours;
+ var nightM = result.NightWorkSpan.Minutes % 60;
+ var nightMS = "00";
+ if (nightM < 10 && nightM > 0)
+ nightMS = $"0{nightM}";
+ if (nightM > 10)
+ nightMS = $"{nightM}";
+ result.NightString = $"0{nightH}:{nightMS}";
+
+ if (result.MorningWorkSpan > result.EveningWorkSpan
+ || result.MorningWorkSpan == result.EveningWorkSpan) // if morning bigerThan evening or equal
+ {
+ if (result.MorningWorkSpan != nullWorkspan)
+ {
+ result.IsMorningShift = true;
+ result.IsNightShift = false;
+ result.IsEveningShift = false;
+ result.RotatingShiftStatus = "صبح";
+ }
+
+ if (result.MorningWorkSpan < result.NightWorkSpan
+ || result.MorningWorkSpan == result.NightWorkSpan) // if night bigerThan morning or equal
+ if (result.NightWorkSpan != nullWorkspan)
+ {
+ result.IsMorningShift = false;
+ result.IsNightShift = true;
+ result.IsEveningShift = false;
+ result.RotatingShiftStatus = "شب";
+ }
+ }
+ else if (result.MorningWorkSpan < result.EveningWorkSpan) // if evening bigerThan morning
+ {
+ if (result.EveningWorkSpan != nullWorkspan)
+ {
+ result.IsEveningShift = true;
+ result.IsMorningShift = false;
+ result.IsNightShift = false;
+ result.RotatingShiftStatus = "عصر";
+ }
+
+ if (result.EveningWorkSpan < result.NightWorkSpan
+ || result.EveningWorkSpan == result.NightWorkSpan) // if night bigerThan evening or equal
+ if (result.NightWorkSpan != nullWorkspan)
+ {
+ result.IsMorningShift = false;
+ result.IsEveningShift = false;
+ result.IsNightShift = true;
+ result.RotatingShiftStatus = "شب";
+ }
+ }
+
+ finalResult.Add(result);
+ #endregion
+ }
+
+ return finalResult;
+
+ }
+
+ #endregion
+
+ #region CustomizeCheckout
+
+ ///
+ /// متد محاسبه فیش حقوقی دلخواه
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public CustomizeCheckoutMandatoryViewModel CustomizeCheckoutMandatoryCompute(long employeeId, long workshopId, DateTime contractStart,
+ DateTime contractEnd)
+ {
+
+ if (workshopId == 170)
+ return CustomizeCheckoutMandatoryComputeForKebabMahdi(employeeId, workshopId, contractStart, contractEnd);
+
+ var firstDayOfMonth = $"{(contractStart.ToFarsi())[..8]}/01".ToGeorgianDateTime();
+
+ #region LeftWork
+
+ var leftWork = _leftWorkRepository.GetByWorkshopIdEmployeeIdInDates(workshopId, employeeId, contractStart, contractEnd);
+
+ if (leftWork.StartWorkDateGr > contractStart)
+ {
+ contractStart = leftWork.StartWorkDateGr;
+ }
+
+ if (leftWork.LeftWorkDateGr.AddDays(-1) < contractEnd)
+ {
+ contractEnd = leftWork.LeftWorkDateGr.AddDays(-1);
+ }
+
+ TimeSpan leftWorkDurationTimeSpan = leftWork.HasLeft ? leftWork.LeftWorkDateGr.AddDays(-1) - leftWork.StartWorkDateGr : contractEnd - leftWork.StartWorkDateGr;
+
+
+ #endregion
+
+
+ #region Entities
+
+ int numberOfFridays = 0;
+ double monthySalary = 0;
+ int monthDays = 0;
+ double dailyWage = 0;
+ int numberOfWorkingDay = 0;
+ string endPersianDate = contractEnd.ToFarsi();
+ int monthOfCheckout = Convert.ToInt32(endPersianDate.Substring(5, 2));
+ int yearOfCheckout = Convert.ToInt32(endPersianDate.Substring(0, 4));
+ //روز هایی که پرسنل موظف بوده کار کند
+ var mandatoryDays = 0;
- TimeSpan contractDuration = contractEnd - contractStart;
- var employee = _context.Employees.FirstOrDefault(x => x.id == employeeId);
- var personnelCode =
- _context.PersonnelCodeSet.FirstOrDefault(x => x.WorkshopId == workshopId && x.EmployeeId == employeeId)?.PersonnelCode ?? 0;
- var contract = _context.Contracts.Where(x => x.WorkshopIds == workshopId && x.EmployeeId == employeeId &&
- x.ContractEnd.Date >= contractStart.Date &&
- x.ContarctStart.Date <= contractEnd.Date).ToList()?.MaxBy(x => x.ContarctStart);
- var totalDays = (int)(contractEnd - contractStart).TotalDays + 1;
- mandatoryDays = totalDays;
- #endregion
+ TimeSpan contractDuration = contractEnd - contractStart;
+ var employee = _context.Employees.FirstOrDefault(x => x.id == employeeId);
+ var personnelCode =
+ _context.PersonnelCodeSet.FirstOrDefault(x => x.WorkshopId == workshopId && x.EmployeeId == employeeId)?.PersonnelCode ?? 0;
+ var contract = _context.Contracts.Where(x => x.WorkshopIds == workshopId && x.EmployeeId == employeeId &&
+ x.ContractEnd.Date >= contractStart.Date &&
+ x.ContarctStart.Date <= contractEnd.Date).ToList()?.MaxBy(x => x.ContarctStart);
+ var totalDays = (int)(contractEnd - contractStart).TotalDays + 1;
+ mandatoryDays = totalDays;
+ #endregion
- #region CustomizeSettings
+ #region CustomizeSettings
- CustomizeWorkshopEmployeeSettings customizeWorkshopEmployeeSettings = _context.CustomizeWorkshopEmployeeSettings.AsSplitQuery().FirstOrDefault(x =>
- x.WorkshopId == workshopId && x.EmployeeId == employeeId);
- CustomizeWorkshopSettings customizeWorkshopSettings =
- _context.CustomizeWorkshopSettings.FirstOrDefault(x => x.WorkshopId == workshopId);
- //ToDo handel exception if is null
- monthySalary = customizeWorkshopEmployeeSettings?.Salary ?? 0;
- monthDays = customizeWorkshopSettings.MaxMonthDays == MaxMonthDays.ThirtyDaysForAllMonth
- ? 30
- : firstDayOfMonth.CountMonthDays();
+ CustomizeWorkshopEmployeeSettings customizeWorkshopEmployeeSettings = _context.CustomizeWorkshopEmployeeSettings.AsSplitQuery().FirstOrDefault(x =>
+ x.WorkshopId == workshopId && x.EmployeeId == employeeId);
+ CustomizeWorkshopSettings customizeWorkshopSettings =
+ _context.CustomizeWorkshopSettings.FirstOrDefault(x => x.WorkshopId == workshopId);
+ //ToDo handel exception if is null
+ monthySalary = customizeWorkshopEmployeeSettings?.Salary ?? 0;
+ monthDays = customizeWorkshopSettings.MaxMonthDays == MaxMonthDays.ThirtyDaysForAllMonth
+ ? 30
+ : firstDayOfMonth.CountMonthDays();
- var shiftSettings = customizeWorkshopEmployeeSettings.CustomizeWorkshopEmployeeSettingsShifts;
+ var shiftSettings = customizeWorkshopEmployeeSettings.CustomizeWorkshopEmployeeSettingsShifts;
- var employeeShiftsSpans = shiftSettings.Select(x =>
- {
- var start = new DateTime(new DateOnly(), x.StartTime);
- var end = new DateTime(new DateOnly(), x.EndTime);
- if (x.EndTime < x.StartTime)
- end = end.AddDays(1);
- var span = end - start;
- return new EmployeeShiftResult
- {
- Placement = x.Placement,
- ShiftSpan = span
- };
+ var employeeShiftsSpans = shiftSettings.Select(x =>
+ {
+ var start = new DateTime(new DateOnly(), x.StartTime);
+ var end = new DateTime(new DateOnly(), x.EndTime);
+ if (x.EndTime < x.StartTime)
+ end = end.AddDays(1);
+ var span = end - start;
+ return new EmployeeShiftResult
+ {
+ Placement = x.Placement,
+ ShiftSpan = span
+ };
- });
+ });
- var sumOfEmployeeShiftSpan = new TimeSpan(employeeShiftsSpans.Sum(x => x.ShiftSpan.Ticks));
+ var sumOfEmployeeShiftSpan = new TimeSpan(employeeShiftsSpans.Sum(x => x.ShiftSpan.Ticks));
- if (customizeWorkshopEmployeeSettings.WorkshopShiftStatus == WorkshopShiftStatus.Irregular)
- {
- sumOfEmployeeShiftSpan = CalculateIrregularShift(customizeWorkshopEmployeeSettings.IrregularShift);
- }
+ if (customizeWorkshopEmployeeSettings.WorkshopShiftStatus == WorkshopShiftStatus.Irregular)
+ {
+ sumOfEmployeeShiftSpan = CalculateIrregularShift(customizeWorkshopEmployeeSettings.IrregularShift);
+ }
- if (customizeWorkshopEmployeeSettings.BreakTime.BreakTimeType == BreakTimeType.WithTime)
- {
- sumOfEmployeeShiftSpan -= customizeWorkshopEmployeeSettings.BreakTime.BreakTimeValue.ToTimeSpan();
- }
- #endregion
+ if (customizeWorkshopEmployeeSettings.BreakTime.BreakTimeType == BreakTimeType.WithTime)
+ {
+ sumOfEmployeeShiftSpan -= customizeWorkshopEmployeeSettings.BreakTime.BreakTimeValue.ToTimeSpan();
+ }
+ #endregion
- List rollCallResult = _context.RollCalls.Where(x =>
- x.EmployeeId == employeeId && x.WorkshopId == workshopId && x.StartDate.Value.Date >= contractStart.Date &&
- x.StartDate.Value.Date <= contractEnd.Date && x.EndDate != null)
- .Select(x => new RollCallViewModel()
- {
- StartDate = x.StartDate,
- EndDate = x.EndDate,
- ShiftSpan = (x.EndDate.Value - x.StartDate.Value),
- CreationDate = x.CreationDate,
- }).ToList();
+ List rollCallResult = _context.RollCalls.Where(x =>
+ x.EmployeeId == employeeId && x.WorkshopId == workshopId && x.StartDate.Value.Date >= contractStart.Date &&
+ x.StartDate.Value.Date <= contractEnd.Date && x.EndDate != null)
+ .Select(x => new RollCallViewModel()
+ {
+ StartDate = x.StartDate,
+ EndDate = x.EndDate,
+ ShiftSpan = (x.EndDate.Value - x.StartDate.Value),
+ CreationDate = x.CreationDate,
+ }).ToList();
- List groupedRollCall = rollCallResult.GroupBy(x => x.StartDate!.Value.Date).Select(x => new GroupedRollCalls()
- {
- CreationDate = x.Key,
- ShiftList = x.Select(s => new ShiftList() { Start = s.StartDate!.Value, End = s.EndDate!.Value }).ToList(),
- HasFriday = x.Any(s => s.StartDate.Value.DayOfWeek == DayOfWeek.Friday || s.EndDate.Value.DayOfWeek == DayOfWeek.Friday),
+ List groupedRollCall = rollCallResult.GroupBy(x => x.StartDate!.Value.Date).Select(x => new GroupedRollCalls()
+ {
+ CreationDate = x.Key,
+ ShiftList = x.Select(s => new ShiftList() { Start = s.StartDate!.Value, End = s.EndDate!.Value }).ToList(),
+ HasFriday = x.Any(s => s.StartDate.Value.DayOfWeek == DayOfWeek.Friday || s.EndDate.Value.DayOfWeek == DayOfWeek.Friday),
- SumOneDaySpan = new TimeSpan(x.Sum(shift => shift.ShiftSpan.Ticks)) - CalculateBreakTime(customizeWorkshopEmployeeSettings.BreakTime,
- new TimeSpan(x.Sum(shift => shift.ShiftSpan.Ticks))),
+ SumOneDaySpan = new TimeSpan(x.Sum(shift => shift.ShiftSpan.Ticks)) - CalculateBreakTime(customizeWorkshopEmployeeSettings.BreakTime,
+ new TimeSpan(x.Sum(shift => shift.ShiftSpan.Ticks))),
- BreakTime = CalculateBreakTime(customizeWorkshopEmployeeSettings.BreakTime, new TimeSpan(x.Sum(shift => shift.ShiftSpan.Ticks)))
- }).ToList();
+ BreakTime = CalculateBreakTime(customizeWorkshopEmployeeSettings.BreakTime, new TimeSpan(x.Sum(shift => shift.ShiftSpan.Ticks)))
+ }).ToList();
- TimeSpan sumSpans = new TimeSpan(groupedRollCall.Sum(x => x.SumOneDaySpan.Ticks));
+ TimeSpan sumSpans = new TimeSpan(groupedRollCall.Sum(x => x.SumOneDaySpan.Ticks));
- numberOfFridays = groupedRollCall.Count(x => x.HasFriday);
+ numberOfFridays = groupedRollCall.Count(x => x.HasFriday);
- numberOfWorkingDay = groupedRollCall.Count();
- //تعداد روز های قرارداد
- int contractDays = (int)contractDuration.TotalDays + 1;
+ numberOfWorkingDay = groupedRollCall.Count();
+ //تعداد روز های قرارداد
+ int contractDays = (int)contractDuration.TotalDays + 1;
- //روز های غیبت
+ //روز های غیبت
- int fridays = 0;
+ int fridays = 0;
- int holiday = _context.HolidayItems.Count(x => x.Holidaydate >= contractStart && x.Holidaydate <= contractEnd);
+ int holiday = _context.HolidayItems.Count(x => x.Holidaydate >= contractStart && x.Holidaydate <= contractEnd);
- for (var gDate = contractStart; gDate <= contractEnd; gDate = gDate.AddDays(1))
- {
- if (gDate.DayOfWeek == DayOfWeek.Friday)
- {
- fridays += 1;
- }
- }
+ for (var gDate = contractStart; gDate <= contractEnd; gDate = gDate.AddDays(1))
+ {
+ if (gDate.DayOfWeek == DayOfWeek.Friday)
+ {
+ fridays += 1;
+ }
+ }
- if (customizeWorkshopEmployeeSettings.FridayWork == FridayWork.Default)
- {
- var fridayWorkingTotalDays = CalculateFridayWorkingTotalDays(rollCallResult);
- fridays = fridays - fridayWorkingTotalDays;
+ if (customizeWorkshopEmployeeSettings.FridayWork == FridayWork.Default)
+ {
+ var fridayWorkingTotalDays = CalculateFridayWorkingTotalDays(rollCallResult);
+ fridays = fridays - fridayWorkingTotalDays;
- mandatoryDays -= fridays;
+ mandatoryDays -= fridays;
- }
+ }
- if (customizeWorkshopEmployeeSettings.HolidayWork == HolidayWork.Default)
- {
- var groupStartDaysDates = groupedRollCall.Select(x => x.CreationDate.Date).ToList();
- var holidayWorkingDays = _context.HolidayItems.Count(x =>
- groupStartDaysDates.Any(r => r == x.Holidaydate.Date));
- holiday = holiday - holidayWorkingDays;
+ if (customizeWorkshopEmployeeSettings.HolidayWork == HolidayWork.Default)
+ {
+ var groupStartDaysDates = groupedRollCall.Select(x => x.CreationDate.Date).ToList();
+ var holidayWorkingDays = _context.HolidayItems.Count(x =>
+ groupStartDaysDates.Any(r => r == x.Holidaydate.Date));
+ holiday = holiday - holidayWorkingDays;
- mandatoryDays -= holiday;
+ mandatoryDays -= holiday;
- }
- TimeSpan absentTimeSpans = new();
+ }
+ TimeSpan absentTimeSpans = new();
- if ((mandatoryDays * sumOfEmployeeShiftSpan) > sumSpans)
- {
- absentTimeSpans = (mandatoryDays * sumOfEmployeeShiftSpan) - sumSpans;
- }
+ if ((mandatoryDays * sumOfEmployeeShiftSpan) > sumSpans)
+ {
+ absentTimeSpans = (mandatoryDays * sumOfEmployeeShiftSpan) - sumSpans;
+ }
- dailyWage = monthySalary / monthDays;
+ dailyWage = monthySalary / monthDays;
- var minuteWage = sumOfEmployeeShiftSpan.TotalMinutes == 0 ? 0 : (dailyWage / sumOfEmployeeShiftSpan.TotalMinutes);
+ var minuteWage = sumOfEmployeeShiftSpan.TotalMinutes == 0 ? 0 : (dailyWage / sumOfEmployeeShiftSpan.TotalMinutes);
- // یافتن مرخصی ساعتی
- #region LeavHourse
+ // یافتن مرخصی ساعتی
+ #region LeavHourse
- LeaveSearchModel leaveHourseSearch = new LeaveSearchModel()
- {
- EmployeeId = employeeId,
- WorkshopId = workshopId,
- LeaveType = "استحقاقی",
+ LeaveSearchModel leaveHourseSearch = new LeaveSearchModel()
+ {
+ EmployeeId = employeeId,
+ WorkshopId = workshopId,
+ LeaveType = "استحقاقی",
- StartLeaveGr = contractStart,
- EndLeaveGr = contractEnd,
- IsAccepted = true,
- };
- List leaveList = _leaveRepository.search(leaveHourseSearch);
+ StartLeaveGr = contractStart,
+ EndLeaveGr = contractEnd,
+ IsAccepted = true,
+ };
+ List leaveList = _leaveRepository.search(leaveHourseSearch);
- #endregion
+ #endregion
- //****افزودن مرخصی پرسنل به مجموع ساعات کار***
- #region AddEmployeeLeaves
+ //****افزودن مرخصی پرسنل به مجموع ساعات کار***
+ #region AddEmployeeLeaves
- //TimeSpan workingPerDayAve = sumSpans / numberOfWorkingDay;//میانگین ساعت کار در روز
+ //TimeSpan workingPerDayAve = sumSpans / numberOfWorkingDay;//میانگین ساعت کار در روز
- //if (workingPerDayAve <= new TimeSpan(7, 20, 0))
- //{
- // sumLeave = leavingDayCout * workingPerDayAve;
- //}
- //else
- //{
- // sumLeave = leavingDayCout * new TimeSpan(7, 20, 0);
- //}
+ //if (workingPerDayAve <= new TimeSpan(7, 20, 0))
+ //{
+ // sumLeave = leavingDayCout * workingPerDayAve;
+ //}
+ //else
+ //{
+ // sumLeave = leavingDayCout * new TimeSpan(7, 20, 0);
+ //}
- double leavePayAmount = 0;
- double absentsDeductionAmount = 0;
- if (customizeWorkshopEmployeeSettings.LeavePay.LeavePayType != LeavePayType.None)
- {
- int permittedDays = customizeWorkshopEmployeeSettings.LeavePermittedDays;
- double leaveValue = customizeWorkshopEmployeeSettings.LeavePay.Value;
- sumSpans = CalculateLeavePay(sumOfEmployeeShiftSpan, absentTimeSpans, permittedDays, monthDays, contractDays, sumSpans
- , leaveValue, minuteWage, contractStart, contractEnd, out leavePayAmount, out absentsDeductionAmount);
- }
- else
- {
- absentsDeductionAmount = absentTimeSpans.TotalMinutes * minuteWage;
- }
+ double leavePayAmount = 0;
+ double absentsDeductionAmount = 0;
+ if (customizeWorkshopEmployeeSettings.LeavePay.LeavePayType != LeavePayType.None)
+ {
+ int permittedDays = customizeWorkshopEmployeeSettings.LeavePermittedDays;
+ double leaveValue = customizeWorkshopEmployeeSettings.LeavePay.Value;
+ sumSpans = CalculateLeavePay(sumOfEmployeeShiftSpan, absentTimeSpans, permittedDays, monthDays, contractDays, sumSpans
+ , leaveValue, minuteWage, contractStart, contractEnd, out leavePayAmount, out absentsDeductionAmount);
+ }
+ else
+ {
+ absentsDeductionAmount = absentTimeSpans.TotalMinutes * minuteWage;
+ }
- Console.WriteLine(sumSpans);
- #endregion
+ Console.WriteLine(sumSpans);
+ #endregion
- //***********************************//
- //ToTal Hours Employee Worked
- double totalHours = (sumSpans.TotalMinutes) / 60;
- int totalHolidaysAndNotH = (int)sumSpans.TotalHours;
- int totalHolidaysAndNotM = (int)(sumSpans.TotalMinutes % 60);
- //***********************************//
+ //***********************************//
+ //ToTal Hours Employee Worked
+ double totalHours = (sumSpans.TotalMinutes) / 60;
+ int totalHolidaysAndNotH = (int)sumSpans.TotalHours;
+ int totalHolidaysAndNotM = (int)(sumSpans.TotalMinutes % 60);
+ //***********************************//
- #region Deductions
+ #region Deductions
- //غیبت
+ //غیبت
- //تاخیر و تعجیل
+ //تاخیر و تعجیل
- //حق بیمه
- #region InsurancePay
+ //حق بیمه
+ #region InsurancePay
- InsuranceDeduction insuranceDeduction = customizeWorkshopEmployeeSettings.InsuranceDeduction;
- //farokhiChange
- double insuranceDeductionAmount = InsurancePayCalculation(employeeId, contractStart, contractEnd, insuranceDeduction, monthySalary);
- #endregion
- #region SalaryAidDeduction
+ InsuranceDeduction insuranceDeduction = customizeWorkshopEmployeeSettings.InsuranceDeduction;
+ //farokhiChange
+ double insuranceDeductionAmount = InsurancePayCalculation(employeeId, contractStart, contractEnd, insuranceDeduction, monthySalary);
+ #endregion
+ #region SalaryAidDeduction
- var salaryAidViewModel = _context.SalaryAids
- .Where(x => x.SalaryAidDateTime >= contractStart && x.SalaryAidDateTime <= contractEnd && x.EmployeeId == employeeId && x.WorkshopId == workshopId).Select(x => new SalaryAidViewModel()
- {
- Amount = x.Amount.ToMoney(),
- AmountDouble = x.Amount,
- SalaryAidDateTimeFa = x.SalaryAidDateTime.ToFarsi(),
- SalaryAidDateTimeGe = x.SalaryAidDateTime,
- }).ToList();
- double salaryAidDeduction = salaryAidViewModel.Sum(x => x.AmountDouble);
+ var salaryAidViewModel = _context.SalaryAids
+ .Where(x => x.SalaryAidDateTime >= contractStart && x.SalaryAidDateTime <= contractEnd && x.EmployeeId == employeeId && x.WorkshopId == workshopId).Select(x => new SalaryAidViewModel()
+ {
+ Amount = x.Amount.ToMoney(),
+ AmountDouble = x.Amount,
+ SalaryAidDateTimeFa = x.SalaryAidDateTime.ToFarsi(),
+ SalaryAidDateTimeGe = x.SalaryAidDateTime,
+ }).ToList();
+ double salaryAidDeduction = salaryAidViewModel.Sum(x => x.AmountDouble);
- #endregion
+ #endregion
- #region Loan
+ #region Loan
- var loanInstallments = _context.Loans
- .Where(x => x.EmployeeId == employeeId && x.WorkshopId == workshopId)
- .SelectMany(x => x.LoanInstallments)
- .Where(i => i.InstallmentDate > contractStart && i.InstallmentDate < contractEnd && i.IsActive == IsActive.True)
- .Select(x => new LoanInstallmentViewModel()
- {
- Month = x.Month,
- IsActive = x.IsActive,
- Amount = x.AmountForMonth.ToMoney(),
- Year = x.Year,
- AmountDouble = x.AmountForMonth,
- RemainingAmount = _context.Loans.SelectMany(l => l.LoanInstallments).Where(i => i.LoanId == x.LoanId && i.IsActive == IsActive.True && i.InstallmentDate > x.InstallmentDate)
- .Sum(i => i.AmountForMonth).ToMoney()
- }).ToList();
-
- double loanDeduction = loanInstallments.Sum(x => x.AmountDouble);
-
- #endregion
-
- #region Fine
-
- var fineViewModels = _context.Fines.Where(x =>
- x.EmployeeId == employeeId && x.WorkshopId == workshopId && x.FineDate >= contractStart &&
- x.FineDate <= contractEnd && x.IsActive == IsActive.True).Select(x => new FineViewModel()
- {
- IsActive = x.IsActive,
- Amount = x.Amount.ToMoney(),
- FineDate = x.FineDate.ToFarsi(),
- Id = x.id,
- Title = x.Title,
- EmployeeId = x.EmployeeId,
- CreationDate = x.CreationDate.ToFarsi()
- }).ToList();
- double fineDeduction = fineViewModels.Sum(x => x.Amount.MoneyToDouble());
-
- #endregion
-
-
- #endregion
-
-
- #region Payments
- //اضافه کاری
- #region OvertimePay
-
- double overtimePayAmount = 0;
-
-
-
- TimeSpan overtimeTimeSpan;
-
- if (customizeWorkshopSettings.WorkshopShiftStatus == WorkshopShiftStatus.Regular && customizeWorkshopEmployeeSettings.WorkshopShiftStatus == WorkshopShiftStatus.Regular)
- {
- TimeOnly employeeOffSet = customizeWorkshopSettings.EndTimeOffSet;
- overtimeTimeSpan = CalculateOvertimeTimeSpan(rollCallResult, shiftSettings, employeeOffSet);
- }
- else if (customizeWorkshopEmployeeSettings.WorkshopShiftStatus == WorkshopShiftStatus.Regular)
- {
- var date = new DateOnly();
- var firstStartShift = new DateTime(date, customizeWorkshopEmployeeSettings.CustomizeWorkshopEmployeeSettingsShifts.MinBy(x => x.Placement).StartTime);
- var lastEndShift = new DateTime(date, customizeWorkshopEmployeeSettings.CustomizeWorkshopEmployeeSettingsShifts.MaxBy(x => x.Placement).EndTime);
- if (lastEndShift > firstStartShift)
- firstStartShift = firstStartShift.AddDays(1);
- var offSet = (firstStartShift - lastEndShift).Divide(2);
- var employeeOffSet = TimeOnly.FromDateTime(lastEndShift.Add(offSet));
-
- overtimeTimeSpan = CalculateOvertimeTimeSpan(rollCallResult, shiftSettings, employeeOffSet);
- }
- else
- {
- var irregularShifts = customizeWorkshopEmployeeSettings.IrregularShift.WorkshopIrregularShifts;
- overtimeTimeSpan = CalculateIrregularOverTime(rollCallResult, sumOfEmployeeShiftSpan, irregularShifts, mandatoryDays);
- //Todo: fix for irregular and rotating shifts
- }
- overtimePayAmount = CalculateOvertimePay(overtimeTimeSpan, customizeWorkshopEmployeeSettings.OverTimePay, dailyWage);
- if (overtimePayAmount >= absentsDeductionAmount)
- {
- overtimePayAmount = overtimePayAmount - absentsDeductionAmount;
- absentsDeductionAmount = 0;
- }
- else
- {
- absentsDeductionAmount = absentsDeductionAmount - overtimePayAmount;
- overtimePayAmount = 0;
- }
- #endregion
-
- #region FridayPay
- double fridayPayAmount = 0;
-
- fridayPayAmount = FridayPayCalculation(customizeWorkshopEmployeeSettings, rollCallResult, dailyWage, shiftSettings, overtimePayAmount);
-
-
- #endregion
-
- //حق تاهل
- #region MaritalAllownace
- double maritalAllowancePay = 0;
- if (employee.MaritalStatus == "متاهل")
- {
- switch (customizeWorkshopEmployeeSettings.MarriedAllowance.MarriedAllowanceType)
- {
- case MarriedAllowanceType.Money:
- {
- maritalAllowancePay = customizeWorkshopEmployeeSettings.MarriedAllowance.Value;
- break;
- }
- //case MarriedAllowanceType.PercentageFromSalary:
-
- // {
- // double multiplier = customizeWorkshopEmployeeSettings.MarriedAllowance.Value / 100;
- // maritalAllowance = dailyWage * multiplier;
- // break;
- // }
- }
- }
- #endregion
-
- //شب کاری
- #region NightWorkPay
- double nightworkPayAmount = 0;
- List rotatingResultList = RotatingShiftCheck(groupedRollCall);
-
- // شبکاری
- TimeSpan nightWorks = new TimeSpan(rotatingResultList.Sum(x => x.NightWorkSpan.Ticks));
-
- if (nightWorks > new TimeSpan())
- {
- switch (customizeWorkshopEmployeeSettings.NightWorkPay.NightWorkingType)
- {
- case NightWorkType.MoneyPerHour:
- {
- var baseAmount = customizeWorkshopEmployeeSettings.NightWorkPay.Value;
- var nightWorkMinutes = (int)(nightWorks).TotalMinutes;
- nightworkPayAmount += nightWorkMinutes * (baseAmount / 60);
- break;
- }
- case NightWorkType.PercentageFromSalary:
- {
- double multiplier = customizeWorkshopEmployeeSettings.NightWorkPay.Value / 100;
- var nightWorkMinutes = (int)(nightWorks).TotalMinutes;
- nightworkPayAmount += ((dailyWage * multiplier) / 60) * nightWorkMinutes;
- break;
- }
-
-
- }
- }
- #endregion
-
- //سنوات
- #region BaseYearsPay
- double baseYearsPayAmount = CalculateYearsPayAmount(employeeId, workshopId, monthySalary, contractStart, contractEnd
- , customizeWorkshopEmployeeSettings.BaseYearsPay, customizeWorkshopSettings.BaseYearsPayInEndOfYear, customizeWorkshopSettings.MaxMonthDays);
-
- #endregion
- //حق اولاد
-
- #region FamilyAllowancePay
- double familyAllowancePay = 0;
- switch (customizeWorkshopEmployeeSettings.FamilyAllowance.FamilyAllowanceType)
- {
- case FamilyAllowanceType.Money:
- {
- double baseAmount = customizeWorkshopEmployeeSettings.FamilyAllowance.Value;
- familyAllowancePay = CalculateFamilyAllowancePayAmount(employeeId, baseAmount, contractEnd);
- break;
- }
-
- case FamilyAllowanceType.Percentage:
- {
- double multiplier = customizeWorkshopEmployeeSettings.FamilyAllowance.Value / 100;
- familyAllowancePay = CalculateFamilyAllowancePayAmount(employeeId, multiplier * monthySalary, contractEnd);
- break;
- }
- }
- #endregion
- #region Reward
-
- var rewardViewModels = _context.Rewards.Where(x =>
- x.WorkshopId == workshopId && x.EmployeeId == employeeId && x.GrantDate <= contractEnd &&
- x.GrantDate >= contractStart).Select(x => new RewardViewModel
- {
- Title = x.Title,
- Amount = x.Amount.ToMoney(),
- AmountDouble = x.Amount,
- Description = x.Description,
- GrantDateGr = x.GrantDate,
- GrantDateFa = x.GrantDate.ToFarsi(),
- IsActive = x.IsActive,
- }).ToList();
-
- double rewardPay = rewardViewModels.Sum(x => x.AmountDouble);
- #endregion
-
- #region LeavePay
-
-
-
- #endregion
-
- #region BonusesPay
-
- double bonusesPayAmount = 0;
-
-
- if (customizeWorkshopEmployeeSettings.BonusesPay.BonusesPayType != BonusesType.None)
- {
- switch (customizeWorkshopEmployeeSettings.BonusesPay.BonusesPayType)
- {
- case BonusesType.OneTimeOfSalary:
- bonusesPayAmount = monthySalary;
- break;
- case BonusesType.TwoTimeOfSalary:
- bonusesPayAmount = monthySalary * 2;
- break;
- case BonusesType.Money:
- bonusesPayAmount = customizeWorkshopEmployeeSettings.BonusesPay.Value;
- break;
- case BonusesType.PercentageOfSalary:
- bonusesPayAmount = (monthySalary * customizeWorkshopEmployeeSettings.BonusesPay.Value) / 100;
- break;
- }
- double bonusesPerMonth = bonusesPayAmount / 12;
-
- if (customizeWorkshopEmployeeSettings.BonusesPay.PaymentType == BonusesPaymentType.YearlyPay)
- {
- var contractEndFarsi = Tools.FindeEndOfMonth(contractEnd.ToFarsi());
- if (monthOfCheckout == 12 && (contractEndFarsi.EndsWith("29")) || contractEndFarsi.EndsWith("30"))
- {
- }
- else if (customizeWorkshopSettings.BonusesPaysInEndOfMonth == BonusesPaysInEndOfYear.WhenEverEmployeeLeftWork && leftWork.HasLeft)
- {
- TimeSpan bonusDuration;
- DateTime startOfYear = new PersianCalendar().ToDateTime(yearOfCheckout, 1, 1, 0, 0, 0, 0);
- if (startOfYear < leftWork.StartWorkDateGr)
- bonusDuration = leftWorkDurationTimeSpan;
- else
- bonusDuration = leftWork.LeftWorkDateGr - startOfYear;
- //ToDo: Check if should be absolute 365!
- bonusesPayAmount = (bonusesPayAmount / 365) * bonusDuration.TotalDays;
- }
- else
- {
- bonusesPayAmount = 0;
- }
- }
- else if (customizeWorkshopEmployeeSettings.BonusesPay.PaymentType == BonusesPaymentType.MonthlyPay)
- {
-
-
- if (customizeWorkshopSettings.BonusesPaysInEndOfMonth ==
- BonusesPaysInEndOfYear.WhenEverEmployeeLeftWork && leftWork.HasLeft && contractDays < monthDays)
- bonusesPayAmount = (bonusesPerMonth / contractEnd.CountPersianMonthDays()) * contractDuration.TotalDays + 1;
-
-
- bonusesPayAmount = bonusesPerMonth;
- }
- else
- {
- throw new InvalidDataException();
- }
- }
-
- #endregion
-
-
- #endregion
-
- #region LateToWork & EarlyExit
-
- var lateToWorkEarlyExit = LateToWorkEarlyExit(groupedRollCall, shiftSettings, leaveList);
- foreach (var i in lateToWorkEarlyExit)
- {
- Console.WriteLine(" start : " + i.StartSpan + " end : " + i.EndSpan + " spaning : " + i.Spanning + " Type : " + i.TypeOfSapn);
- }
-
- var lateToWoks = lateToWorkEarlyExit.Where(x => x.TypeOfSapn == "LateToWork");
- var earlyExits = lateToWorkEarlyExit.Where(x => x.TypeOfSapn == "EarlyExist");
-
- var lateToWork = new TimeSpan(lateToWoks.Sum(x => x.Spanning.Ticks));
- var earlyExist = new TimeSpan(earlyExits.Sum(x => x.Spanning.Ticks));
- var totalSpaning = new TimeSpan(lateToWorkEarlyExit.Sum(x => x.Spanning.Ticks));
- Console.ForegroundColor = ConsoleColor.Yellow;
- Console.WriteLine(" LateToWork H : " + (int)lateToWork.TotalHours + " M : " + (int)(lateToWork.TotalMinutes % 60));
- Console.WriteLine(" EarlyExist H : " + (int)earlyExist.TotalHours + " M : " + (int)(earlyExist.TotalMinutes % 60));
- Console.WriteLine(" TotalSpaning H : " + (int)totalSpaning.TotalHours + " M : " + (int)(totalSpaning.TotalMinutes % 60));
- Console.ResetColor();
-
- double earlyExitDeduction = 0;
- double lateToWorkDeduction = 0;
-
- ////محاسبه مزد روزانه به ازای هر دقیقه
- //double dailyWagePerMinute =
- // (customizeWorkshopEmployeeSettings.Salary / monthDays) / sumOfEmployeeShiftSpan.TotalMinutes;
-
- if (customizeWorkshopEmployeeSettings.EarlyExit.EarlyExitType != EarlyExitType.None && earlyExist > new TimeSpan())
- {
- earlyExitDeduction = customizeWorkshopEmployeeSettings.EarlyExit.EarlyExitType switch
- {
- EarlyExitType.Default => earlyExist.TotalMinutes * minuteWage,
-
- EarlyExitType.MoneyPerMinute => earlyExist.TotalMinutes * customizeWorkshopEmployeeSettings.EarlyExit.Value,
-
- _ => 0
- };
-
- }
-
-
- if (customizeWorkshopEmployeeSettings.LateToWork.LateToWorkType != LateToWorkType.None && lateToWork > new TimeSpan())
- {
- lateToWorkDeduction = customizeWorkshopEmployeeSettings.LateToWork.LateToWorkType switch
- {
- LateToWorkType.Default => lateToWork.TotalMinutes * minuteWage,
-
- LateToWorkType.MoneyPerMinute => lateToWork.TotalMinutes * customizeWorkshopEmployeeSettings.LateToWork.Value,
-
- _ => 0
- };
-
- }
-
- if (customizeWorkshopEmployeeSettings.LateToWork.LateToWorkTimeFines.Any())
- {
- lateToWorkDeduction +=
- (from lateToWorkTimeFine in customizeWorkshopEmployeeSettings.LateToWork.LateToWorkTimeFines
- let stepFine = lateToWoks.Count(x => x.Spanning.TotalMinutes >= Convert.ToInt32(lateToWorkTimeFine.Minute))
- select stepFine * lateToWorkTimeFine.FineMoney).Sum();
- }
- if (customizeWorkshopEmployeeSettings.EarlyExit.EarlyExitTimeFines.Any())
- {
- earlyExitDeduction +=
- (from earlyExitFine in customizeWorkshopEmployeeSettings.EarlyExit.EarlyExitTimeFines
- let stepFine = earlyExits.Count(x => x.Spanning.TotalMinutes >= Convert.ToInt32(earlyExitFine.Minute))
- select stepFine * earlyExitFine.FineMoney).Sum();
- }
-
-
-
- #endregion
-
- return new CustomizeCheckoutMandatoryViewModel
- {
- InsuranceDeduction = insuranceDeductionAmount,
- FridayPay = fridayPayAmount,
- OverTimePay = overtimePayAmount,
- BaseYearsPay = baseYearsPayAmount,
- NightWorkPay = nightworkPayAmount,
- MarriedAllowance = maritalAllowancePay,
- FamilyAllowance = familyAllowancePay,
- LeavePay = leavePayAmount,
- FineAbsenceDeduction = absentsDeductionAmount,
- BonusesPay = bonusesPayAmount,
- ContractEndFa = contractEnd.ToFarsi(),
- ContractStartFa = contractStart.ToFarsi(),
- EmployeeName = employee.FullName,
- InstallmentDeduction = loanDeduction,
- SalaryAidDeduction = salaryAidDeduction,
- FineDeduction = fineDeduction,
- RewardPay = rewardPay,
- Month = monthOfCheckout,
- Year = yearOfCheckout,
- LateToWorkDeduction = lateToWorkDeduction,
- EarlyExitDeduction = earlyExitDeduction,
- ShiftPay = 0,
- TaxDeduction = 0,
- EmployeeId = employeeId,
- SumOfWorkingDays = totalDays.ToString(),
- ContractNo = contract?.ContractNo ?? "-",
- MonthlySalary = dailyWage * mandatoryDays,
- PersonnelCode = personnelCode,
- FineViewModels = fineViewModels,
- InstallmentViewModels = loanInstallments,
- SalaryAidViewModels = salaryAidViewModel,
- RewardViewModels = rewardViewModels
- };
- }
+ var loanInstallments = _context.Loans
+ .Where(x => x.EmployeeId == employeeId && x.WorkshopId == workshopId)
+ .SelectMany(x => x.LoanInstallments)
+ .Where(i => i.InstallmentDate > contractStart && i.InstallmentDate < contractEnd && i.IsActive == IsActive.True)
+ .Select(x => new LoanInstallmentViewModel()
+ {
+ Month = x.Month,
+ IsActive = x.IsActive,
+ Amount = x.AmountForMonth.ToMoney(),
+ Year = x.Year,
+ AmountDouble = x.AmountForMonth,
+ RemainingAmount = _context.Loans.SelectMany(l => l.LoanInstallments).Where(i => i.LoanId == x.LoanId && i.IsActive == IsActive.True && i.InstallmentDate > x.InstallmentDate)
+ .Sum(i => i.AmountForMonth).ToMoney()
+ }).ToList();
+
+ double loanDeduction = loanInstallments.Sum(x => x.AmountDouble);
+
+ #endregion
+
+ #region Fine
+
+ var fineViewModels = _context.Fines.Where(x =>
+ x.EmployeeId == employeeId && x.WorkshopId == workshopId && x.FineDate >= contractStart &&
+ x.FineDate <= contractEnd && x.IsActive == IsActive.True).Select(x => new FineViewModel()
+ {
+ IsActive = x.IsActive,
+ Amount = x.Amount.ToMoney(),
+ FineDate = x.FineDate.ToFarsi(),
+ Id = x.id,
+ Title = x.Title,
+ EmployeeId = x.EmployeeId,
+ CreationDate = x.CreationDate.ToFarsi()
+ }).ToList();
+ double fineDeduction = fineViewModels.Sum(x => x.Amount.MoneyToDouble());
+
+ #endregion
+
+
+ #endregion
+
+
+ #region Payments
+ //اضافه کاری
+ #region OvertimePay
+
+ double overtimePayAmount = 0;
+
+
+
+ TimeSpan overtimeTimeSpan;
+
+ if (customizeWorkshopSettings.WorkshopShiftStatus == WorkshopShiftStatus.Regular && customizeWorkshopEmployeeSettings.WorkshopShiftStatus == WorkshopShiftStatus.Regular)
+ {
+ TimeOnly employeeOffSet = customizeWorkshopSettings.EndTimeOffSet;
+ overtimeTimeSpan = CalculateOvertimeTimeSpan(rollCallResult, shiftSettings, employeeOffSet);
+ }
+ else if (customizeWorkshopEmployeeSettings.WorkshopShiftStatus == WorkshopShiftStatus.Regular)
+ {
+ var date = new DateOnly();
+ var firstStartShift = new DateTime(date, customizeWorkshopEmployeeSettings.CustomizeWorkshopEmployeeSettingsShifts.MinBy(x => x.Placement).StartTime);
+ var lastEndShift = new DateTime(date, customizeWorkshopEmployeeSettings.CustomizeWorkshopEmployeeSettingsShifts.MaxBy(x => x.Placement).EndTime);
+ if (lastEndShift > firstStartShift)
+ firstStartShift = firstStartShift.AddDays(1);
+ var offSet = (firstStartShift - lastEndShift).Divide(2);
+ var employeeOffSet = TimeOnly.FromDateTime(lastEndShift.Add(offSet));
+
+ overtimeTimeSpan = CalculateOvertimeTimeSpan(rollCallResult, shiftSettings, employeeOffSet);
+ }
+ else
+ {
+ var irregularShifts = customizeWorkshopEmployeeSettings.IrregularShift.WorkshopIrregularShifts;
+ overtimeTimeSpan = CalculateIrregularOverTime(rollCallResult, sumOfEmployeeShiftSpan, irregularShifts, mandatoryDays);
+ //Todo: fix for irregular and rotating shifts
+ }
+ overtimePayAmount = CalculateOvertimePay(overtimeTimeSpan, customizeWorkshopEmployeeSettings.OverTimePay, dailyWage);
+ if (overtimePayAmount >= absentsDeductionAmount)
+ {
+ overtimePayAmount = overtimePayAmount - absentsDeductionAmount;
+ absentsDeductionAmount = 0;
+ }
+ else
+ {
+ absentsDeductionAmount = absentsDeductionAmount - overtimePayAmount;
+ overtimePayAmount = 0;
+ }
+ #endregion
+
+ #region FridayPay
+ double fridayPayAmount = 0;
+
+ fridayPayAmount = FridayPayCalculation(customizeWorkshopEmployeeSettings, rollCallResult, dailyWage, shiftSettings, overtimePayAmount);
+
+
+ #endregion
+
+ //حق تاهل
+ #region MaritalAllownace
+ double maritalAllowancePay = 0;
+ if (employee.MaritalStatus == "متاهل")
+ {
+ switch (customizeWorkshopEmployeeSettings.MarriedAllowance.MarriedAllowanceType)
+ {
+ case MarriedAllowanceType.Money:
+ {
+ maritalAllowancePay = customizeWorkshopEmployeeSettings.MarriedAllowance.Value;
+ break;
+ }
+ //case MarriedAllowanceType.PercentageFromSalary:
+
+ // {
+ // double multiplier = customizeWorkshopEmployeeSettings.MarriedAllowance.Value / 100;
+ // maritalAllowance = dailyWage * multiplier;
+ // break;
+ // }
+ }
+ }
+ #endregion
+
+ //شب کاری
+ #region NightWorkPay
+ double nightworkPayAmount = 0;
+ List rotatingResultList = RotatingShiftCheck(groupedRollCall);
+
+ // شبکاری
+ TimeSpan nightWorks = new TimeSpan(rotatingResultList.Sum(x => x.NightWorkSpan.Ticks));
+
+ if (nightWorks > new TimeSpan())
+ {
+ switch (customizeWorkshopEmployeeSettings.NightWorkPay.NightWorkingType)
+ {
+ case NightWorkType.MoneyPerHour:
+ {
+ var baseAmount = customizeWorkshopEmployeeSettings.NightWorkPay.Value;
+ var nightWorkMinutes = (int)(nightWorks).TotalMinutes;
+ nightworkPayAmount += nightWorkMinutes * (baseAmount / 60);
+ break;
+ }
+ case NightWorkType.PercentageFromSalary:
+ {
+ double multiplier = customizeWorkshopEmployeeSettings.NightWorkPay.Value / 100;
+ var nightWorkMinutes = (int)(nightWorks).TotalMinutes;
+ nightworkPayAmount += ((dailyWage * multiplier) / 60) * nightWorkMinutes;
+ break;
+ }
+
+
+ }
+ }
+ #endregion
+
+ //سنوات
+ #region BaseYearsPay
+ double baseYearsPayAmount = CalculateYearsPayAmount(employeeId, workshopId, monthySalary, contractStart, contractEnd
+ , customizeWorkshopEmployeeSettings.BaseYearsPay, customizeWorkshopSettings.BaseYearsPayInEndOfYear, customizeWorkshopSettings.MaxMonthDays);
+
+ #endregion
+ //حق اولاد
+
+ #region FamilyAllowancePay
+ double familyAllowancePay = 0;
+ switch (customizeWorkshopEmployeeSettings.FamilyAllowance.FamilyAllowanceType)
+ {
+ case FamilyAllowanceType.Money:
+ {
+ double baseAmount = customizeWorkshopEmployeeSettings.FamilyAllowance.Value;
+ familyAllowancePay = CalculateFamilyAllowancePayAmount(employeeId, baseAmount, contractEnd);
+ break;
+ }
+
+ case FamilyAllowanceType.Percentage:
+ {
+ double multiplier = customizeWorkshopEmployeeSettings.FamilyAllowance.Value / 100;
+ familyAllowancePay = CalculateFamilyAllowancePayAmount(employeeId, multiplier * monthySalary, contractEnd);
+ break;
+ }
+ }
+ #endregion
+ #region Reward
+
+ var rewardViewModels = _context.Rewards.Where(x =>
+ x.WorkshopId == workshopId && x.EmployeeId == employeeId && x.GrantDate <= contractEnd &&
+ x.GrantDate >= contractStart).Select(x => new RewardViewModel
+ {
+ Title = x.Title,
+ Amount = x.Amount.ToMoney(),
+ AmountDouble = x.Amount,
+ Description = x.Description,
+ GrantDateGr = x.GrantDate,
+ GrantDateFa = x.GrantDate.ToFarsi(),
+ IsActive = x.IsActive,
+ }).ToList();
+
+ double rewardPay = rewardViewModels.Sum(x => x.AmountDouble);
+ #endregion
+
+ #region LeavePay
+
+
+
+ #endregion
+
+ #region BonusesPay
+
+ double bonusesPayAmount = 0;
+
+
+ if (customizeWorkshopEmployeeSettings.BonusesPay.BonusesPayType != BonusesType.None)
+ {
+ switch (customizeWorkshopEmployeeSettings.BonusesPay.BonusesPayType)
+ {
+ case BonusesType.OneTimeOfSalary:
+ bonusesPayAmount = monthySalary;
+ break;
+ case BonusesType.TwoTimeOfSalary:
+ bonusesPayAmount = monthySalary * 2;
+ break;
+ case BonusesType.Money:
+ bonusesPayAmount = customizeWorkshopEmployeeSettings.BonusesPay.Value;
+ break;
+ case BonusesType.PercentageOfSalary:
+ bonusesPayAmount = (monthySalary * customizeWorkshopEmployeeSettings.BonusesPay.Value) / 100;
+ break;
+ }
+ double bonusesPerMonth = bonusesPayAmount / 12;
+
+ if (customizeWorkshopEmployeeSettings.BonusesPay.PaymentType == BonusesPaymentType.YearlyPay)
+ {
+ var contractEndFarsi = Tools.FindeEndOfMonth(contractEnd.ToFarsi());
+ if (monthOfCheckout == 12 && (contractEndFarsi.EndsWith("29")) || contractEndFarsi.EndsWith("30"))
+ {
+ }
+ else if (customizeWorkshopSettings.BonusesPaysInEndOfMonth == BonusesPaysInEndOfYear.WhenEverEmployeeLeftWork && leftWork.HasLeft)
+ {
+ TimeSpan bonusDuration;
+ DateTime startOfYear = new PersianCalendar().ToDateTime(yearOfCheckout, 1, 1, 0, 0, 0, 0);
+ if (startOfYear < leftWork.StartWorkDateGr)
+ bonusDuration = leftWorkDurationTimeSpan;
+ else
+ bonusDuration = leftWork.LeftWorkDateGr - startOfYear;
+ //ToDo: Check if should be absolute 365!
+ bonusesPayAmount = (bonusesPayAmount / 365) * bonusDuration.TotalDays;
+ }
+ else
+ {
+ bonusesPayAmount = 0;
+ }
+ }
+ else if (customizeWorkshopEmployeeSettings.BonusesPay.PaymentType == BonusesPaymentType.MonthlyPay)
+ {
+
+
+ if (customizeWorkshopSettings.BonusesPaysInEndOfMonth ==
+ BonusesPaysInEndOfYear.WhenEverEmployeeLeftWork && leftWork.HasLeft && contractDays < monthDays)
+ bonusesPayAmount = (bonusesPerMonth / contractEnd.CountPersianMonthDays()) * contractDuration.TotalDays + 1;
+
+
+ bonusesPayAmount = bonusesPerMonth;
+ }
+ else
+ {
+ throw new InvalidDataException();
+ }
+ }
+
+ #endregion
+
+
+ #endregion
+
+ #region LateToWork & EarlyExit
+
+ var lateToWorkEarlyExit = LateToWorkEarlyExit(groupedRollCall, shiftSettings, leaveList);
+ foreach (var i in lateToWorkEarlyExit)
+ {
+ Console.WriteLine(" start : " + i.StartSpan + " end : " + i.EndSpan + " spaning : " + i.Spanning + " Type : " + i.TypeOfSapn);
+ }
+
+ var lateToWoks = lateToWorkEarlyExit.Where(x => x.TypeOfSapn == "LateToWork");
+ var earlyExits = lateToWorkEarlyExit.Where(x => x.TypeOfSapn == "EarlyExist");
+
+ var lateToWork = new TimeSpan(lateToWoks.Sum(x => x.Spanning.Ticks));
+ var earlyExist = new TimeSpan(earlyExits.Sum(x => x.Spanning.Ticks));
+ var totalSpaning = new TimeSpan(lateToWorkEarlyExit.Sum(x => x.Spanning.Ticks));
+ Console.ForegroundColor = ConsoleColor.Yellow;
+ Console.WriteLine(" LateToWork H : " + (int)lateToWork.TotalHours + " M : " + (int)(lateToWork.TotalMinutes % 60));
+ Console.WriteLine(" EarlyExist H : " + (int)earlyExist.TotalHours + " M : " + (int)(earlyExist.TotalMinutes % 60));
+ Console.WriteLine(" TotalSpaning H : " + (int)totalSpaning.TotalHours + " M : " + (int)(totalSpaning.TotalMinutes % 60));
+ Console.ResetColor();
+
+ double earlyExitDeduction = 0;
+ double lateToWorkDeduction = 0;
+
+ ////محاسبه مزد روزانه به ازای هر دقیقه
+ //double dailyWagePerMinute =
+ // (customizeWorkshopEmployeeSettings.Salary / monthDays) / sumOfEmployeeShiftSpan.TotalMinutes;
+
+ if (customizeWorkshopEmployeeSettings.EarlyExit.EarlyExitType != EarlyExitType.None && earlyExist > new TimeSpan())
+ {
+ earlyExitDeduction = customizeWorkshopEmployeeSettings.EarlyExit.EarlyExitType switch
+ {
+ EarlyExitType.Default => earlyExist.TotalMinutes * minuteWage,
+
+ EarlyExitType.MoneyPerMinute => earlyExist.TotalMinutes * customizeWorkshopEmployeeSettings.EarlyExit.Value,
+
+ _ => 0
+ };
+
+ }
+
+
+ if (customizeWorkshopEmployeeSettings.LateToWork.LateToWorkType != LateToWorkType.None && lateToWork > new TimeSpan())
+ {
+ lateToWorkDeduction = customizeWorkshopEmployeeSettings.LateToWork.LateToWorkType switch
+ {
+ LateToWorkType.Default => lateToWork.TotalMinutes * minuteWage,
+
+ LateToWorkType.MoneyPerMinute => lateToWork.TotalMinutes * customizeWorkshopEmployeeSettings.LateToWork.Value,
+
+ _ => 0
+ };
+
+ }
+
+ if (customizeWorkshopEmployeeSettings.LateToWork.LateToWorkTimeFines.Any())
+ {
+ lateToWorkDeduction +=
+ (from lateToWorkTimeFine in customizeWorkshopEmployeeSettings.LateToWork.LateToWorkTimeFines
+ let stepFine = lateToWoks.Count(x => x.Spanning.TotalMinutes >= Convert.ToInt32(lateToWorkTimeFine.Minute))
+ select stepFine * lateToWorkTimeFine.FineMoney).Sum();
+ }
+ if (customizeWorkshopEmployeeSettings.EarlyExit.EarlyExitTimeFines.Any())
+ {
+ earlyExitDeduction +=
+ (from earlyExitFine in customizeWorkshopEmployeeSettings.EarlyExit.EarlyExitTimeFines
+ let stepFine = earlyExits.Count(x => x.Spanning.TotalMinutes >= Convert.ToInt32(earlyExitFine.Minute))
+ select stepFine * earlyExitFine.FineMoney).Sum();
+ }
+
+
+
+ #endregion
+
+ return new CustomizeCheckoutMandatoryViewModel
+ {
+ InsuranceDeduction = insuranceDeductionAmount,
+ FridayPay = fridayPayAmount,
+ OverTimePay = overtimePayAmount,
+ BaseYearsPay = baseYearsPayAmount,
+ NightWorkPay = nightworkPayAmount,
+ MarriedAllowance = maritalAllowancePay,
+ FamilyAllowance = familyAllowancePay,
+ LeavePay = leavePayAmount,
+ FineAbsenceDeduction = absentsDeductionAmount,
+ BonusesPay = bonusesPayAmount,
+ ContractEndFa = contractEnd.ToFarsi(),
+ ContractStartFa = contractStart.ToFarsi(),
+ EmployeeName = employee.FullName,
+ InstallmentDeduction = loanDeduction,
+ SalaryAidDeduction = salaryAidDeduction,
+ FineDeduction = fineDeduction,
+ RewardPay = rewardPay,
+ Month = monthOfCheckout,
+ Year = yearOfCheckout,
+ LateToWorkDeduction = lateToWorkDeduction,
+ EarlyExitDeduction = earlyExitDeduction,
+ ShiftPay = 0,
+ TaxDeduction = 0,
+ EmployeeId = employeeId,
+ SumOfWorkingDays = totalDays.ToString(),
+ ContractNo = contract?.ContractNo ?? "-",
+ MonthlySalary = dailyWage * mandatoryDays,
+ PersonnelCode = personnelCode,
+ FineViewModels = fineViewModels,
+ InstallmentViewModels = loanInstallments,
+ SalaryAidViewModels = salaryAidViewModel,
+ RewardViewModels = rewardViewModels
+ };
+ }
public CustomizeCheckoutMandatoryViewModel CustomizeCheckoutMandatoryComputeForKebabMahdi(long employeeId, long workshopId,
DateTime contractStart, DateTime contractEnd)
{
- var checkoutEnd = contractEnd;
- var checkoutStart = contractStart;
- if (employeeId is 45084 or 7980 or 5976 or 45214 or 45215)
+ var checkoutEnd = contractEnd;
+ var checkoutStart = contractStart;
+ if (employeeId is 45084 or 7980 or 5976 or 45214 or 45215)
{
- return CheckoutWithoutCalculationForKebabMahdi(workshopId,employeeId,contractStart,contractEnd);
+ return CheckoutWithoutCalculationForKebabMahdi(workshopId, employeeId, contractStart, contractEnd);
}
var firstDayOfMonth = $"{(contractStart.ToFarsi())[..8]}/01".ToGeorgianDateTime();
@@ -1663,6 +1663,7 @@ CreateWorkingHoursTemp command, bool holidayWorking)
x.ContarctStart.Date <= contractEnd.Date).ToList()?.MaxBy(x => x.ContarctStart);
var totalDays = (int)(contractEnd - contractStart).TotalDays + 1;
mandatoryDays = totalDays;
+
#endregion
@@ -1748,6 +1749,17 @@ CreateWorkingHoursTemp command, bool holidayWorking)
+ // ساخت لیست همه تاریخها در بازه
+ List allDates = Enumerable.Range(0, (contractEnd - contractStart).Days + 1)
+ .Select(offset => contractStart.AddDays(offset))
+ .ToList();
+
+ // فیلتر تاریخهایی که در لیست حضور نیستند
+ List absentDates = allDates
+ .Where(date => !groupedRollCall.Any(g => g.ShiftDate.Date == date.Date))
+ .ToList();
+
+
TimeSpan sumSpans = new TimeSpan(groupedRollCall.Sum(x => x.SumOneDaySpan.Ticks));
numberOfFridays = groupedRollCall.Count(x => x.HasFriday);
@@ -1941,6 +1953,7 @@ CreateWorkingHoursTemp command, bool holidayWorking)
+
Console.WriteLine(sumSpans);
#endregion
@@ -2091,6 +2104,32 @@ CreateWorkingHoursTemp command, bool holidayWorking)
#endregion
+ var createReward = absenceDays;
+ if (monthOfCheckout == 1 && yearOfCheckout == 1404)
+ {
+ bool hasAbsents = _context.CustomizeCheckouts.Any(x =>
+ x.EmployeeId == employeeId && x.WorkshopId == workshopId && x.MonthInt == 12 && x.YearInt == 1403 &&
+ x.FineAbsenceDeduction > 0);
+ bool absentInEid = !_context.RollCalls.Any(x =>
+ x.EmployeeId == employeeId && x.WorkshopId == workshopId && x.ShiftDate == new DateTime(2025, 3, 20));
+ if ( hasAbsents && absentInEid)
+ {
+ CreateReward(employeeId, workshopId, dailyWage, monthOfCheckout, yearOfCheckout, new DateTime(2025, 3, 21), RewardType.Eid, "بابت تعطیلی آخر سال");
+ }
+ if (absentDates.Any(x => x == new DateTime(2025, 4, 2) && createReward > 0))
+ {
+ CreateReward(employeeId, workshopId, dailyWage, monthOfCheckout, yearOfCheckout, new DateTime(2025, 4, 2), RewardType.SinzdahBedar, "بابت تعطیلی روز 13 فروردین");
+ createReward--;
+ }
+
+ if (absentDates.Any(x => x == new DateTime(2025, 4, 3) && createReward > 0))
+ {
+ CreateReward(employeeId, workshopId, dailyWage, monthOfCheckout, yearOfCheckout, new DateTime(2025, 4, 3), RewardType.ChahardahFarvardin, "بابت تعطیلی روز 14 فروردین");
+ createReward--;
+ }
+ }
+
+
#region FridayPay
double fridayPayAmount = 0;
@@ -2385,7 +2424,7 @@ CreateWorkingHoursTemp command, bool holidayWorking)
EmployeeId = employeeId,
SumOfWorkingDays = totalDays.ToString(),
ContractNo = contract?.ContractNo ?? "-",
- MonthlySalary = dailyWage * mandatoryDays,
+ MonthlySalary = dailyWage * mandatoryDays,
PersonnelCode = personnelCode,
FineViewModels = fineViewModels,
InstallmentViewModels = loanInstallments,
@@ -2405,10 +2444,10 @@ CreateWorkingHoursTemp command, bool holidayWorking)
CustomizeWorkshopSettings customizeWorkshopSettings =
_context.CustomizeWorkshopSettings.FirstOrDefault(x => x.WorkshopId == workshopId);
//ToDo handel exception if is null
- var monthySalary = customizeWorkshopEmployeeSettings?.Salary ?? 0;
- var monthDays = customizeWorkshopSettings.MaxMonthDays == MaxMonthDays.ThirtyDaysForAllMonth
- ? 30
- : firstDayOfMonth.CountMonthDays();
+ var monthySalary = customizeWorkshopEmployeeSettings?.Salary ?? 0;
+ var monthDays = customizeWorkshopSettings.MaxMonthDays == MaxMonthDays.ThirtyDaysForAllMonth
+ ? 30
+ : firstDayOfMonth.CountMonthDays();
double dailyWage = 0;
dailyWage = monthySalary / monthDays;
@@ -2416,89 +2455,89 @@ CreateWorkingHoursTemp command, bool holidayWorking)
var mandatoryDays = totalDays;
- #region SalaryAidDeduction
+ #region SalaryAidDeduction
- var salaryAidViewModel = _context.SalaryAids
- .Where(x => x.SalaryAidDateTime >= contractStart && x.SalaryAidDateTime <= contractEnd && x.EmployeeId == employeeId && x.WorkshopId == workshopId).Select(x => new SalaryAidViewModel()
- {
- Amount = x.Amount.ToMoney(),
- AmountDouble = x.Amount,
- SalaryAidDateTimeFa = x.SalaryAidDateTime.ToFarsi(),
- SalaryAidDateTimeGe = x.SalaryAidDateTime,
- }).ToList();
- double salaryAidDeduction = salaryAidViewModel.Sum(x => x.AmountDouble);
+ var salaryAidViewModel = _context.SalaryAids
+ .Where(x => x.SalaryAidDateTime >= contractStart && x.SalaryAidDateTime <= contractEnd && x.EmployeeId == employeeId && x.WorkshopId == workshopId).Select(x => new SalaryAidViewModel()
+ {
+ Amount = x.Amount.ToMoney(),
+ AmountDouble = x.Amount,
+ SalaryAidDateTimeFa = x.SalaryAidDateTime.ToFarsi(),
+ SalaryAidDateTimeGe = x.SalaryAidDateTime,
+ }).ToList();
+ double salaryAidDeduction = salaryAidViewModel.Sum(x => x.AmountDouble);
- #endregion
+ #endregion
- #region Loan
+ #region Loan
- var loanInstallments = _context.Loans
- .Where(x => x.EmployeeId == employeeId && x.WorkshopId == workshopId)
- .SelectMany(x => x.LoanInstallments)
- .Where(i => i.InstallmentDate > contractStart && i.InstallmentDate < contractEnd && i.IsActive == IsActive.True)
- .Select(x => new LoanInstallmentViewModel()
- {
- Month = x.Month,
- IsActive = x.IsActive,
- Amount = x.AmountForMonth.ToMoney(),
- Year = x.Year,
- AmountDouble = x.AmountForMonth,
- RemainingAmount = _context.Loans.SelectMany(l => l.LoanInstallments).Where(i => i.LoanId == x.LoanId && i.IsActive == IsActive.True && i.InstallmentDate > x.InstallmentDate)
- .Sum(i => i.AmountForMonth).ToMoney()
- }).ToList();
+ var loanInstallments = _context.Loans
+ .Where(x => x.EmployeeId == employeeId && x.WorkshopId == workshopId)
+ .SelectMany(x => x.LoanInstallments)
+ .Where(i => i.InstallmentDate > contractStart && i.InstallmentDate < contractEnd && i.IsActive == IsActive.True)
+ .Select(x => new LoanInstallmentViewModel()
+ {
+ Month = x.Month,
+ IsActive = x.IsActive,
+ Amount = x.AmountForMonth.ToMoney(),
+ Year = x.Year,
+ AmountDouble = x.AmountForMonth,
+ RemainingAmount = _context.Loans.SelectMany(l => l.LoanInstallments).Where(i => i.LoanId == x.LoanId && i.IsActive == IsActive.True && i.InstallmentDate > x.InstallmentDate)
+ .Sum(i => i.AmountForMonth).ToMoney()
+ }).ToList();
- double loanDeduction = loanInstallments.Sum(x => x.AmountDouble);
+ double loanDeduction = loanInstallments.Sum(x => x.AmountDouble);
- #endregion
+ #endregion
- #region Fine
+ #region Fine
- var fineViewModels = _context.Fines.Where(x =>
- x.EmployeeId == employeeId && x.WorkshopId == workshopId && x.FineDate >= contractStart &&
- x.FineDate <= contractEnd && x.IsActive == IsActive.True).Select(x => new FineViewModel()
- {
- IsActive = x.IsActive,
- Amount = x.Amount.ToMoney(),
- FineDate = x.FineDate.ToFarsi(),
- Id = x.id,
- Title = x.Title,
- EmployeeId = x.EmployeeId,
- CreationDate = x.CreationDate.ToFarsi()
- }).ToList();
- double fineDeduction = fineViewModels.Sum(x => x.Amount.MoneyToDouble());
+ var fineViewModels = _context.Fines.Where(x =>
+ x.EmployeeId == employeeId && x.WorkshopId == workshopId && x.FineDate >= contractStart &&
+ x.FineDate <= contractEnd && x.IsActive == IsActive.True).Select(x => new FineViewModel()
+ {
+ IsActive = x.IsActive,
+ Amount = x.Amount.ToMoney(),
+ FineDate = x.FineDate.ToFarsi(),
+ Id = x.id,
+ Title = x.Title,
+ EmployeeId = x.EmployeeId,
+ CreationDate = x.CreationDate.ToFarsi()
+ }).ToList();
+ double fineDeduction = fineViewModels.Sum(x => x.Amount.MoneyToDouble());
- #endregion
- #region Reward
+ #endregion
+ #region Reward
- var rewardViewModels = _context.Rewards.Where(x =>
- x.WorkshopId == workshopId && x.EmployeeId == employeeId && x.GrantDate <= contractEnd &&
- x.GrantDate >= contractStart).Select(x => new RewardViewModel
- {
- Title = x.Title,
- Amount = x.Amount.ToMoney(),
- AmountDouble = x.Amount,
- Description = x.Description,
- GrantDateGr = x.GrantDate,
- GrantDateFa = x.GrantDate.ToFarsi(),
- IsActive = x.IsActive,
- }).ToList();
+ var rewardViewModels = _context.Rewards.Where(x =>
+ x.WorkshopId == workshopId && x.EmployeeId == employeeId && x.GrantDate <= contractEnd &&
+ x.GrantDate >= contractStart).Select(x => new RewardViewModel
+ {
+ Title = x.Title,
+ Amount = x.Amount.ToMoney(),
+ AmountDouble = x.Amount,
+ Description = x.Description,
+ GrantDateGr = x.GrantDate,
+ GrantDateFa = x.GrantDate.ToFarsi(),
+ IsActive = x.IsActive,
+ }).ToList();
- double rewardPay = rewardViewModels.Sum(x => x.AmountDouble);
- #endregion
+ double rewardPay = rewardViewModels.Sum(x => x.AmountDouble);
+ #endregion
- return new CustomizeCheckoutMandatoryViewModel()
+ return new CustomizeCheckoutMandatoryViewModel()
{
MonthlySalary = dailyWage * mandatoryDays,
- RewardPay = rewardPay,
- RewardViewModels = rewardViewModels,
- SalaryAidDeduction = salaryAidDeduction,
- SalaryAidViewModels = salaryAidViewModel,
- InstallmentDeduction = loanDeduction,
- InstallmentViewModels = loanInstallments,
- FineDeduction = fineDeduction,
- FineViewModels = fineViewModels
+ RewardPay = rewardPay,
+ RewardViewModels = rewardViewModels,
+ SalaryAidDeduction = salaryAidDeduction,
+ SalaryAidViewModels = salaryAidViewModel,
+ InstallmentDeduction = loanDeduction,
+ InstallmentViewModels = loanInstallments,
+ FineDeduction = fineDeduction,
+ FineViewModels = fineViewModels
};
}
@@ -2518,932 +2557,964 @@ CreateWorkingHoursTemp command, bool holidayWorking)
}
}
+ private void CreateReward(long employeeId, long workshopId, double amount, int month, int year,
+ DateTime contractStart, RewardType type, string title)
+ {
+ var start = $"{year}/{month:00}/01".ToGeorgianDateTime();
+ var end = $"{year}/{month:00}/01".FindeEndOfMonth().ToGeorgianDateTime();
+ if (_context.Rewards.Any(x => x.WorkshopId == workshopId && x.EmployeeId == employeeId
+ && x.GrantDate >= start && x.GrantDate <= end
+ && x.RewardType == type) == false)
+ {
+ var reward = new Reward(employeeId, workshopId, amount, "", 0, contractStart, title, type);
+ _context.Rewards.Add(reward);
+ _context.SaveChanges();
+ }
+ }
+ //private void CreateRewardForChahardah(long employeeId, long workshopId, double amount, int month, int year,
+ // DateTime contractStart)
+ //{
+ // var start = $"{year}/{month:00}/01".ToGeorgianDateTime();
+ // var end = $"{year}/{month:00}/01".FindeEndOfMonth().ToGeorgianDateTime();
+ // if (_context.Rewards.Any(x => x.WorkshopId == workshopId && x.EmployeeId == employeeId
+ // && x.GrantDate >= start && x.GrantDate <= end
+ // && x.RewardType == RewardType.ChahardahFarvardin) == false)
+ // {
+ // var reward = new Reward(employeeId, workshopId, amount, "", 0, contractStart, "بابت تعطیلی روز 14 فروردین",
+ // RewardType.ChahardahFarvardin);
+ // _context.Rewards.Add(reward);
+ // _context.SaveChanges();
+ // }
+ //}
+
+
+
private TimeSpan CalculateIrregularOverTime(List rollCalls, TimeSpan employeeShiftSpan, WorkshopIrregularShifts irregularShifts, int mandatoryDays)
- {
- var sumOfRollCallTicks = rollCalls.Sum(x => (x.EndDate.Value - x.StartDate.Value).Ticks);
-
- var sumRollCall = new TimeSpan(sumOfRollCallTicks);
- var sumOfShift = employeeShiftSpan * mandatoryDays;
-
- if (sumOfShift > sumRollCall)
- return TimeSpan.Zero;
-
- return sumRollCall - sumOfShift;
- }
-
-
-
- public static TimeSpan CalculateIrregularShiftSpans(int totalDays, IrregularShift irregularShift)
- {
- //مبنای تقسیم که بر اساس جمع مقدار ساعت استراحت و ساعت کاری بدست میاد
- double baseDivideTime = 0;
-
- //مقدار ساعت کارکرد در هر شیفت
- double workTime = 0;
- switch (irregularShift.WorkshopIrregularShifts)
- {
- case WorkshopIrregularShifts.TwelveThirtySix:
- baseDivideTime = 48;
- workTime = 12;
- break;
- case WorkshopIrregularShifts.TwelveTwentyFour:
- baseDivideTime = 36;
- workTime = 12;
- break;
- case WorkshopIrregularShifts.TwentyFourFortyEight:
- baseDivideTime = 72;
- workTime = 24;
- break;
- case WorkshopIrregularShifts.TwentyFourTwentyFour:
- baseDivideTime = 48;
- workTime = 24;
- break;
- }
- //کل ساعاتی داخلش ممکنه کار کرده باشه
- var workingHour = totalDays * 24;
-
- //مقدار تعداد خالصی که سر شیفت بوده است
- int countOfWorking = (int)(workingHour / baseDivideTime);
-
- //باقی مونده تعدادی که سر شیفت بوده است
- double fractionalPart = (workingHour / baseDivideTime) - countOfWorking;
-
- //مقدار ساعت خالصی که سر کار بوده است
- TimeSpan sumOfEmployeeWorkingHours = TimeSpan.FromHours(countOfWorking * workTime);
-
- //مقدار احتمال سر کار بودن بر حسب باقی مونده تقسیم
- var workingTimesDiff = fractionalPart * workTime;
-
-
- workingTimesDiff = workingTimesDiff >= workTime ? workTime : workingTimesDiff;
-
- //جمع ساعات خالصی و احتمالی
- sumOfEmployeeWorkingHours = sumOfEmployeeWorkingHours.Add(TimeSpan.FromHours(workingTimesDiff));
-
- return sumOfEmployeeWorkingHours;
- }
-
- public static TimeSpan CalculateIrregularShift(IrregularShift irregularShift)
- {
- var workingTime = irregularShift.WorkshopIrregularShifts switch
- {
- WorkshopIrregularShifts.TwelveThirtySix => TimeSpan.FromHours(6),
- WorkshopIrregularShifts.TwelveTwentyFour => TimeSpan.FromHours(8),
- WorkshopIrregularShifts.TwentyFourFortyEight => TimeSpan.FromHours(8),
- WorkshopIrregularShifts.TwentyFourTwentyFour => TimeSpan.FromHours(12),
- _ => new TimeSpan()
- };
- return workingTime;
- }
-
-
- public static TimeSpan CalculateRotatingOvertime(ICollection rotatingShifts,
- List rollCalls, int mandatoryDays, TimeSpan sumSpan)
- {
- TimeSpan mandatorySpan = TimeSpan.Zero;
- foreach (var groupedRollCall in rollCalls)
- {
- var findRotatingShift = FindRotatingShift(groupedRollCall.ShiftList.Min(x => x.Start),
- groupedRollCall.ShiftList.Max(x => x.End), rotatingShifts);
- var span = findRotatingShift.end - findRotatingShift.start;
- mandatorySpan += span;
- }
-
- var leftDays = mandatoryDays - rollCalls.Count;
- if (leftDays > 0)
- {
-
- TimeSpan totalDuration = new TimeSpan(rotatingShifts.Sum(shift => Math.Abs(shift.EndTime.Ticks - shift.StartTime.Ticks)));
- var averageDuration = totalDuration / rotatingShifts.Count;
- mandatorySpan += averageDuration * leftDays;
- }
-
- if (mandatorySpan < sumSpan)
- {
- return sumSpan - mandatorySpan;
- }
- return TimeSpan.Zero;
-
- }
-
-
- #region CustomizeCheckoutCalculation
-
- public static double FridayPayCalculation(CustomizeWorkshopEmployeeSettings customizeWorkshopEmployeeSettings,
- List rollCallResult, double dailyWage, ICollection shiftSettings, double overtimePayAmount)
- {
- double fridayPayAmount = 0;
- switch (customizeWorkshopEmployeeSettings.FridayPay.FridayPayType)
- {
- case (FridayPayType.MoneyPerFridayForDay):
- {
- int workedFridaysCount = CalculateFridayWorkingTotalDays(rollCallResult);
- double baseAmount = customizeWorkshopEmployeeSettings.FridayPay.Value;
- fridayPayAmount = baseAmount * workedFridaysCount;
- break;
- }
- case (FridayPayType.MoneyPerFridayPerHour):
- {
- int workedFridaysMinutes = (int)CalculateFridayWorkingTimeSpan(rollCallResult).TotalMinutes;
- double baseAmount = customizeWorkshopEmployeeSettings.FridayPay.Value;
- fridayPayAmount = (baseAmount / 60) * workedFridaysMinutes;
- break;
- }
- case (FridayPayType.PercentageFromSalaryPerHour):
- {
- int workedFridaysMinutes = (int)CalculateFridayWorkingTimeSpan(rollCallResult).TotalMinutes;
- double percentageAmount = (customizeWorkshopEmployeeSettings.FridayPay.Value / 100 * dailyWage);
- fridayPayAmount = (percentageAmount / 60) * workedFridaysMinutes;
- break;
- }
- //case (FridayPayType.ExtraWorking):
- // {
- // var fridayOvertimeTimeSpan = CalculateFridayWorkingTimeSpanWithoutOvertime(rollCallResult, shiftSettings);
- // overtimePayAmount += CalculateOvertimePay(fridayOvertimeTimeSpan, customizeWorkshopEmployeeSettings.OverTimePay, dailyWage);
- // return overtimePayAmount;
- // break;
- // }
- default:
- break;
- }
-
- return fridayPayAmount;
- }
-
- public double InsurancePayCalculation(long employeeId, DateTime contractStart, DateTime contractEnd,
- InsuranceDeduction insuranceDeduction, double monthySalary)
- {
- double insurancePayAmount = 0;
- switch (insuranceDeduction.InsuranceDeductionType)
- {
- case InsuranceDeductionType.BasedOnLaborLaw:
-
- //farokhiChange
- double familyAllowance = _yearlySalaryRepository.FamilyAllowance(employeeId, contractStart, contractEnd).MoneyToDouble();
-
- double housingAllowance = _yearlySalaryRepository.HousingAllowance(contractEnd).MoneyToDouble();
-
- double consumableItemsAllowance = _yearlySalaryRepository.ConsumableItems(contractEnd).MoneyToDouble();
-
- double wage = _context.YearlySalaries.Include(x => x.YearlySalaryItemsList)
- .FirstOrDefault(x => x.StartDate <= contractEnd && x.EndDate <= contractEnd).YearlySalaryItemsList
- .FirstOrDefault(x => x.ItemName == "مزد روزانه").ItemValue;
-
- insurancePayAmount = (familyAllowance + housingAllowance + consumableItemsAllowance + wage) * 7 / 100;
- break;
-
- case InsuranceDeductionType.PercentageOfSalary:
-
- double multiplier = insuranceDeduction.Value / 100;
-
- insurancePayAmount = monthySalary * multiplier;
- break;
-
- case InsuranceDeductionType.Money:
-
- double baseAmount = insuranceDeduction.Value;
-
- insurancePayAmount = baseAmount;
- break;
-
- case InsuranceDeductionType.None:
- break;
-
- default:
- insurancePayAmount = 0;
- break;
- }
-
- return insurancePayAmount;
- }
-
- public static TimeSpan CalculateLeavePay(TimeSpan sumOfEmployeeShiftSpan, TimeSpan absentsTimeSpan,
- int permittedLeaveDay, int monthDays, int contractDays, TimeSpan sumSpans,
- double leaveValue, double minuteWage, DateTime startDate, DateTime endDate, out double leavePayAmount, out double absentsDeduction)
- {
-
-
-
-
- // زمان مجاز مرخصی
- TimeSpan permittedLeaveTimeSpan = sumOfEmployeeShiftSpan * permittedLeaveDay;
-
- // زمان مرخصی مجاز برای یک روز
- TimeSpan leaveTimePerDay = (permittedLeaveTimeSpan / monthDays);
-
-
- //اگر ترک کار کرده بود
- if (contractDays < monthDays)
- {
- permittedLeaveTimeSpan = leaveTimePerDay * contractDays;
- }
+ {
+ var sumOfRollCallTicks = rollCalls.Sum(x => (x.EndDate.Value - x.StartDate.Value).Ticks);
+
+ var sumRollCall = new TimeSpan(sumOfRollCallTicks);
+ var sumOfShift = employeeShiftSpan * mandatoryDays;
+
+ if (sumOfShift > sumRollCall)
+ return TimeSpan.Zero;
+
+ return sumRollCall - sumOfShift;
+ }
+
+
+
+ public static TimeSpan CalculateIrregularShiftSpans(int totalDays, IrregularShift irregularShift)
+ {
+ //مبنای تقسیم که بر اساس جمع مقدار ساعت استراحت و ساعت کاری بدست میاد
+ double baseDivideTime = 0;
+
+ //مقدار ساعت کارکرد در هر شیفت
+ double workTime = 0;
+ switch (irregularShift.WorkshopIrregularShifts)
+ {
+ case WorkshopIrregularShifts.TwelveThirtySix:
+ baseDivideTime = 48;
+ workTime = 12;
+ break;
+ case WorkshopIrregularShifts.TwelveTwentyFour:
+ baseDivideTime = 36;
+ workTime = 12;
+ break;
+ case WorkshopIrregularShifts.TwentyFourFortyEight:
+ baseDivideTime = 72;
+ workTime = 24;
+ break;
+ case WorkshopIrregularShifts.TwentyFourTwentyFour:
+ baseDivideTime = 48;
+ workTime = 24;
+ break;
+ }
+ //کل ساعاتی داخلش ممکنه کار کرده باشه
+ var workingHour = totalDays * 24;
+
+ //مقدار تعداد خالصی که سر شیفت بوده است
+ int countOfWorking = (int)(workingHour / baseDivideTime);
+
+ //باقی مونده تعدادی که سر شیفت بوده است
+ double fractionalPart = (workingHour / baseDivideTime) - countOfWorking;
+
+ //مقدار ساعت خالصی که سر کار بوده است
+ TimeSpan sumOfEmployeeWorkingHours = TimeSpan.FromHours(countOfWorking * workTime);
+
+ //مقدار احتمال سر کار بودن بر حسب باقی مونده تقسیم
+ var workingTimesDiff = fractionalPart * workTime;
+
+
+ workingTimesDiff = workingTimesDiff >= workTime ? workTime : workingTimesDiff;
+
+ //جمع ساعات خالصی و احتمالی
+ sumOfEmployeeWorkingHours = sumOfEmployeeWorkingHours.Add(TimeSpan.FromHours(workingTimesDiff));
+
+ return sumOfEmployeeWorkingHours;
+ }
+
+ public static TimeSpan CalculateIrregularShift(IrregularShift irregularShift)
+ {
+ var workingTime = irregularShift.WorkshopIrregularShifts switch
+ {
+ WorkshopIrregularShifts.TwelveThirtySix => TimeSpan.FromHours(6),
+ WorkshopIrregularShifts.TwelveTwentyFour => TimeSpan.FromHours(8),
+ WorkshopIrregularShifts.TwentyFourFortyEight => TimeSpan.FromHours(8),
+ WorkshopIrregularShifts.TwentyFourTwentyFour => TimeSpan.FromHours(12),
+ _ => new TimeSpan()
+ };
+ return workingTime;
+ }
+
+
+ public static TimeSpan CalculateRotatingOvertime(ICollection rotatingShifts,
+ List rollCalls, int mandatoryDays, TimeSpan sumSpan)
+ {
+ TimeSpan mandatorySpan = TimeSpan.Zero;
+ foreach (var groupedRollCall in rollCalls)
+ {
+ var findRotatingShift = FindRotatingShift(groupedRollCall.ShiftList.Min(x => x.Start),
+ groupedRollCall.ShiftList.Max(x => x.End), rotatingShifts);
+ var span = findRotatingShift.end - findRotatingShift.start;
+ mandatorySpan += span;
+ }
+
+ var leftDays = mandatoryDays - rollCalls.Count;
+ if (leftDays > 0)
+ {
+
+ TimeSpan totalDuration = new TimeSpan(rotatingShifts.Sum(shift => Math.Abs(shift.EndTime.Ticks - shift.StartTime.Ticks)));
+ var averageDuration = totalDuration / rotatingShifts.Count;
+ mandatorySpan += averageDuration * leftDays;
+ }
+
+ if (mandatorySpan < sumSpan)
+ {
+ return sumSpan - mandatorySpan;
+ }
+ return TimeSpan.Zero;
+
+ }
+
+
+ #region CustomizeCheckoutCalculation
+
+ public static double FridayPayCalculation(CustomizeWorkshopEmployeeSettings customizeWorkshopEmployeeSettings,
+ List rollCallResult, double dailyWage, ICollection shiftSettings, double overtimePayAmount)
+ {
+ double fridayPayAmount = 0;
+ switch (customizeWorkshopEmployeeSettings.FridayPay.FridayPayType)
+ {
+ case (FridayPayType.MoneyPerFridayForDay):
+ {
+ int workedFridaysCount = CalculateFridayWorkingTotalDays(rollCallResult);
+ double baseAmount = customizeWorkshopEmployeeSettings.FridayPay.Value;
+ fridayPayAmount = baseAmount * workedFridaysCount;
+ break;
+ }
+ case (FridayPayType.MoneyPerFridayPerHour):
+ {
+ int workedFridaysMinutes = (int)CalculateFridayWorkingTimeSpan(rollCallResult).TotalMinutes;
+ double baseAmount = customizeWorkshopEmployeeSettings.FridayPay.Value;
+ fridayPayAmount = (baseAmount / 60) * workedFridaysMinutes;
+ break;
+ }
+ case (FridayPayType.PercentageFromSalaryPerHour):
+ {
+ int workedFridaysMinutes = (int)CalculateFridayWorkingTimeSpan(rollCallResult).TotalMinutes;
+ double percentageAmount = (customizeWorkshopEmployeeSettings.FridayPay.Value / 100 * dailyWage);
+ fridayPayAmount = (percentageAmount / 60) * workedFridaysMinutes;
+ break;
+ }
+ //case (FridayPayType.ExtraWorking):
+ // {
+ // var fridayOvertimeTimeSpan = CalculateFridayWorkingTimeSpanWithoutOvertime(rollCallResult, shiftSettings);
+ // overtimePayAmount += CalculateOvertimePay(fridayOvertimeTimeSpan, customizeWorkshopEmployeeSettings.OverTimePay, dailyWage);
+ // return overtimePayAmount;
+ // break;
+ // }
+ default:
+ break;
+ }
+
+ return fridayPayAmount;
+ }
+
+ public double InsurancePayCalculation(long employeeId, DateTime contractStart, DateTime contractEnd,
+ InsuranceDeduction insuranceDeduction, double monthySalary)
+ {
+ double insurancePayAmount = 0;
+ switch (insuranceDeduction.InsuranceDeductionType)
+ {
+ case InsuranceDeductionType.BasedOnLaborLaw:
+
+ //farokhiChange
+ double familyAllowance = _yearlySalaryRepository.FamilyAllowance(employeeId, contractStart, contractEnd).MoneyToDouble();
+
+ double housingAllowance = _yearlySalaryRepository.HousingAllowance(contractEnd).MoneyToDouble();
+
+ double consumableItemsAllowance = _yearlySalaryRepository.ConsumableItems(contractEnd).MoneyToDouble();
+
+ double wage = _context.YearlySalaries.Include(x => x.YearlySalaryItemsList)
+ .FirstOrDefault(x => x.StartDate <= contractEnd && x.EndDate <= contractEnd).YearlySalaryItemsList
+ .FirstOrDefault(x => x.ItemName == "مزد روزانه").ItemValue;
+
+ insurancePayAmount = (familyAllowance + housingAllowance + consumableItemsAllowance + wage) * 7 / 100;
+ break;
+
+ case InsuranceDeductionType.PercentageOfSalary:
+
+ double multiplier = insuranceDeduction.Value / 100;
+
+ insurancePayAmount = monthySalary * multiplier;
+ break;
+
+ case InsuranceDeductionType.Money:
+
+ double baseAmount = insuranceDeduction.Value;
+
+ insurancePayAmount = baseAmount;
+ break;
+
+ case InsuranceDeductionType.None:
+ break;
+
+ default:
+ insurancePayAmount = 0;
+ break;
+ }
+
+ return insurancePayAmount;
+ }
+
+ public static TimeSpan CalculateLeavePay(TimeSpan sumOfEmployeeShiftSpan, TimeSpan absentsTimeSpan,
+ int permittedLeaveDay, int monthDays, int contractDays, TimeSpan sumSpans,
+ double leaveValue, double minuteWage, DateTime startDate, DateTime endDate, out double leavePayAmount, out double absentsDeduction)
+ {
+
+
+
+
+ // زمان مجاز مرخصی
+ TimeSpan permittedLeaveTimeSpan = sumOfEmployeeShiftSpan * permittedLeaveDay;
+
+ // زمان مرخصی مجاز برای یک روز
+ TimeSpan leaveTimePerDay = (permittedLeaveTimeSpan / monthDays);
+
+
+ //اگر ترک کار کرده بود
+ if (contractDays < monthDays)
+ {
+ permittedLeaveTimeSpan = leaveTimePerDay * contractDays;
+ }
- //اگر قراردادش کامل بود
- else
- {
+ //اگر قراردادش کامل بود
+ else
+ {
- }
+ }
- //اختلاف غیبت و مرخصی
- (TimeSpan Diffrence, AbsentOrLeave absentOrLeave) absentAndLeaveDifference;
+ //اختلاف غیبت و مرخصی
+ (TimeSpan Diffrence, AbsentOrLeave absentOrLeave) absentAndLeaveDifference;
- //مقدار مبلغ مرخصی
- leavePayAmount = 0;
+ //مقدار مبلغ مرخصی
+ leavePayAmount = 0;
- //مقدار مبلغ غیبت
- absentsDeduction = 0;
+ //مقدار مبلغ غیبت
+ absentsDeduction = 0;
- //#region SumLeaves
+ //#region SumLeaves
- //var usedLeavesCheckout = new TimeSpan();
- //foreach (var item in leaveList)
- //{
- // var start = new DateTime();
- // var end = new DateTime();
- // start = item.StartLeaveGr < startDate ? startDate : item.StartLeaveGr;
- // end = item.EndLeaveGr > endDate ? endDate : item.EndLeaveGr;
- // if (item.PaidLeaveType == "روزانه")
- // {
- // var leaveSpan = (end - start);
+ //var usedLeavesCheckout = new TimeSpan();
+ //foreach (var item in leaveList)
+ //{
+ // var start = new DateTime();
+ // var end = new DateTime();
+ // start = item.StartLeaveGr < startDate ? startDate : item.StartLeaveGr;
+ // end = item.EndLeaveGr > endDate ? endDate : item.EndLeaveGr;
+ // if (item.PaidLeaveType == "روزانه")
+ // {
+ // var leaveSpan = (end - start);
- // usedLeavesCheckout = usedLeavesCheckout.Add(leaveSpan);
- // }
- // else
- // {
- // var leavingHourses = TimeSpan.Parse(item.LeaveHourses);
- // usedLeavesCheckout = usedLeavesCheckout.Add(leavingHourses);
- // }
+ // usedLeavesCheckout = usedLeavesCheckout.Add(leaveSpan);
+ // }
+ // else
+ // {
+ // var leavingHourses = TimeSpan.Parse(item.LeaveHourses);
+ // usedLeavesCheckout = usedLeavesCheckout.Add(leavingHourses);
+ // }
- //}
+ //}
- //#endregion
-
- //if (permittedLeaveTimeSpan >= usedLeavesCheckout)
- //{
- // permittedLeaveTimeSpan = permittedLeaveTimeSpan - usedLeavesCheckout;
- // sumSpans += usedLeavesCheckout;
- // usedLeavesCheckout = new TimeSpan();
- //}
- //else
- //{
- // sumSpans += permittedLeaveTimeSpan;
- // absentsTimeSpan = (absentsTimeSpan - usedLeavesCheckout) - permittedLeaveTimeSpan;
- // permittedLeaveTimeSpan = new TimeSpan();
- //}
-
-
-
- //اگر مقدار مجاز مرخصی بیشتر از غیبت یا مساوی باشد
- if (permittedLeaveTimeSpan >= absentsTimeSpan)
- {
- //محاسبه مقدار باقی مانده مزد مرخصی
- absentAndLeaveDifference.Diffrence = permittedLeaveTimeSpan - absentsTimeSpan;
- absentAndLeaveDifference.absentOrLeave = AbsentOrLeave.LeavePay;
-
- //صفر کردن مقدار غیبت
- absentsTimeSpan = new TimeSpan(0);
-
- ////برگرداندن ساعت کاری باقی مونده از مزد مرخصی به ساعت کاری
- //sumSpans += absentAndLeaveDifference.Diffrence;
-
- //مقدار مزد مرخصی برای هرروز استفاده نشده
- double leavePayPerDayWage = (leaveValue * (minuteWage * sumOfEmployeeShiftSpan.TotalMinutes));
-
- if (permittedLeaveTimeSpan.TotalHours == 0)
- return sumSpans;
-
- leavePayAmount = (leavePayPerDayWage / permittedLeaveTimeSpan.TotalMinutes) * absentAndLeaveDifference.Diffrence.TotalMinutes;
-
- }
- //اگر مقدار غیبت بیشتر از مرخصی باشد
- else
- {
- //محاسبه مقدار باقی مانده از غیبت
- absentAndLeaveDifference.Diffrence = absentsTimeSpan - permittedLeaveTimeSpan;
- absentAndLeaveDifference.absentOrLeave = AbsentOrLeave.AbsentDeduction;
-
- //صفر کردن مقدار مزد مرخصی
- permittedLeaveTimeSpan = new TimeSpan(0);
- permittedLeaveDay = 0;
-
- ////برگرداندن ساعت کاری باقی مونده از مزد مرخصی به ساعت کاری
- //sumSpans += permittedLeaveTimeSpan;
-
- absentsDeduction = absentsTimeSpan.TotalMinutes * minuteWage;
-
- }
-
- return sumSpans;
- }
-
- ///
- /// محاسبه تاخیر در ورورد و تعجیل در خروج
- ///
- ///
- ///
- ///
- public List LateToWorkEarlyExit(List groupedRollCall, ICollection shiftSettings, List leavList)
- {
- List lateToWorkEarlyExistSpannig = new List();
-
- foreach (var day in groupedRollCall)
- {
-
- foreach (var shift in shiftSettings)
- {
- //DateTime start = DateTime.Parse(shift.StartTime);
- //DateTime end = DateTime.Parse(shift.EndTime);
- DateTime startShift = new DateTime(day.CreationDate.Year, day.CreationDate.Month, day.CreationDate.Day, shift.StartTime.Hour, shift.StartTime.Minute, 0);
- DateTime endShift = new DateTime(day.CreationDate.Year, day.CreationDate.Month, day.CreationDate.Day, shift.EndTime.Hour, shift.EndTime.Minute, 0);
- if (shift.StartTime > shift.EndTime)
- endShift = endShift.AddDays(1);
-
- //اگر در بازه شیف تعیین شده حضور غیاب داشت
-
- var hasRollCall = day.ShiftList.Where(x =>
- (x.Start <= startShift && x.End > startShift) ||
- (x.Start >= startShift && x.End <= endShift) ||
- (x.Start > startShift && x.End > endShift)).ToList();
-
- if (!hasRollCall.Any())// اگر در بازه شیفت هیچ حضور غیابی نداشت
- {
- lateToWorkEarlyExistSpannig.Add(new LateToWorkEarlyExistSpannig()
- {
- StartSpan = startShift,
- EndSpan = endShift,
- Spanning = (endShift - startShift),
- TypeOfSapn = shift.Placement == ShiftPlacement.First ? "LateToWork" : "EarlyExist"
- });
- }
- else if (hasRollCall.Count() == 1)
- {
- var singleHasRollCall = hasRollCall.FirstOrDefault();
- if (singleHasRollCall != null && singleHasRollCall.Start > startShift &&
- singleHasRollCall.End >= endShift)
- {
- lateToWorkEarlyExistSpannig.Add(new LateToWorkEarlyExistSpannig()
- {
- StartSpan = startShift,
- EndSpan = singleHasRollCall.Start,
- Spanning = (singleHasRollCall.Start - startShift),
- TypeOfSapn = "LateToWork"
- });
- }
- else if (singleHasRollCall != null && singleHasRollCall.Start <= startShift &&
- singleHasRollCall.End < endShift)
- {
- lateToWorkEarlyExistSpannig.Add(new LateToWorkEarlyExistSpannig()
- {
- StartSpan = singleHasRollCall.End,
- EndSpan = endShift,
- Spanning = (endShift - singleHasRollCall.End),
- TypeOfSapn = "EarlyExist"
- });
- }
- else if (singleHasRollCall != null && singleHasRollCall.Start > startShift &&
- singleHasRollCall.End < endShift)
- {
- lateToWorkEarlyExistSpannig.Add(new LateToWorkEarlyExistSpannig()
- {
- StartSpan = startShift,
- EndSpan = singleHasRollCall.Start,
- Spanning = (singleHasRollCall.Start - startShift),
- TypeOfSapn = "LateToWork"
- });
-
- lateToWorkEarlyExistSpannig.Add(new LateToWorkEarlyExistSpannig()
- {
- StartSpan = singleHasRollCall.End,
- EndSpan = endShift,
- Spanning = (endShift - singleHasRollCall.End),
- TypeOfSapn = "EarlyExist"
- });
- }
- }
- else if (hasRollCall.Count() > 1)
- {
- var multiHasRollCall = hasRollCall.OrderBy(x => x.Start);
- var firstRollcall = multiHasRollCall.First();
- var lastRollCall = multiHasRollCall.Last();
-
- if (firstRollcall.Start > startShift &&
- firstRollcall.End >= endShift)
- {
- lateToWorkEarlyExistSpannig.Add(new LateToWorkEarlyExistSpannig()
- {
- StartSpan = startShift,
- EndSpan = firstRollcall.Start,
- Spanning = (firstRollcall.Start - startShift),
- TypeOfSapn = "LateToWork"
- });
- }
-
- if (lastRollCall.Start <= startShift &&
- lastRollCall.End < endShift)
- {
- lateToWorkEarlyExistSpannig.Add(new LateToWorkEarlyExistSpannig()
- {
- StartSpan = lastRollCall.End,
- EndSpan = endShift,
- Spanning = (endShift - lastRollCall.End),
- TypeOfSapn = "EarlyExist"
- });
- }
- }
- }
- }
-
- leavList = leavList.Where(x => x.PaidLeaveType == "ساعتی").ToList();
- // اگر تاخیر یا تعجیل به دلیل مرخصی ساعتی بود حساب نشود
- if (leavList.Count > 0 && lateToWorkEarlyExistSpannig.Count > 0)
- {
- foreach (var el in lateToWorkEarlyExistSpannig.ToList())
- {
- var hasLeve = leavList.Any(x =>
- (x.StartLeaveGr <= el.StartSpan && x.EndLeaveGr > el.StartSpan) ||
- (x.StartLeaveGr >= el.StartSpan && x.EndLeaveGr <= el.EndSpan) ||
- (x.StartLeaveGr > el.StartSpan && x.EndLeaveGr > el.EndSpan));
- if (hasLeve)
- lateToWorkEarlyExistSpannig.Remove(el);
- }
-
- }
-
-
- return lateToWorkEarlyExistSpannig;
- }
-
- #region Pooya
-
- public double CalculateFamilyAllowancePayAmount(long employeeId, double basePay, DateTime contractEnd)
- {
- int underageChildrenCount = _context.EmployeeChildrenSet.Where(x => x.EmployeeId == employeeId &&
- x.DateOfBirth.AddYears(18) > contractEnd).Count();
- return basePay * underageChildrenCount;
- }
-
- //Deprecated
- private TimeSpan CalculateOvertimeTimeSpanWithThreshold(List rollCalls,
- ICollection shiftSettings, int overtimeThresholdMinutes)
- {
-
- var mandatoryTotalTimeSpan = new TimeSpan(shiftSettings.Sum(x => (x.EndTime - x.StartTime).Ticks));
- mandatoryTotalTimeSpan += new TimeSpan(0, overtimeThresholdMinutes, 0);
-
- var rollCallsTimeSpans = rollCalls.Select(x => x.EndDate.Value - x.StartDate.Value).Where(x => x > mandatoryTotalTimeSpan).ToList();
- var rollCallTotalTimeSpan = new TimeSpan(rollCallsTimeSpans.Sum(x => x.Ticks));
-
- if (rollCallTotalTimeSpan < mandatoryTotalTimeSpan)
- return TimeSpan.Zero;
- return rollCallTotalTimeSpan - mandatoryTotalTimeSpan;
- }
-
- #region سنوات
-
- ///
- /// فرمول اصلی محاسبه سنوات برای پرسنل در بازه زمانی با تنظیمات پیشرفته
- ///
- /// حقوق ماهیانه پرسنل
- /// تنظیمات سنوات
- /// تنظیم مربوط به پرداخت هنگام ترک کار
- public double CalculateYearsPayAmount(long employeeId, long workshopId, double monthlySalary, DateTime contractStart, DateTime contractEnd,
- BaseYearsPay baseYearsSettings, BaseYearsPayInEndOfYear payOnLeave, MaxMonthDays maxMonthDays)
- {
- double baseYearPayAmount = 0;
-
-
- var leftWorks = _context.LeftWorkList
- .Where(x => x.EmployeeId == employeeId && x.WorkshopId == workshopId &&
- x.LeftWorkDate.Date.AddDays(-1) >= contractStart && x.StartWorkDate.Date <= contractEnd).ToList();
-
- if (!leftWorks.Any())
- return 0;
-
- int daysWorked = (int)new TimeSpan(leftWorks.Select(x => new
- {
- Start = x.StartWorkDate < contractStart ? contractStart : x.StartWorkDate
- ,
- End = x.LeftWorkDate.AddDays(-1) > contractEnd ? contractEnd : x.LeftWorkDate.AddDays(-1)
- }).Sum(x => (x.End - x.Start).Ticks)).TotalDays + 1;
-
- bool hasLeftWork = leftWorks.MaxBy(x => x.LeftWorkDate).LeftWorkDate.AddDays(-1) < contractEnd;
-
- //محاسبه سنوات سالیانه
- switch (baseYearsSettings.BaseYearsPayType)
- {
- case BaseYearsPayType.PercentageOfSalary:
- {
- baseYearPayAmount = monthlySalary * baseYearsSettings.Value / 100;
- break;
- }
- case BaseYearsPayType.Money:
- {
- baseYearPayAmount = baseYearsSettings.Value;
- break;
- }
- case BaseYearsPayType.None:
- {
- return 0;
- }
- }
-
- //در صورت ترک کار
- if (hasLeftWork)
-
- {
- switch (payOnLeave)
- {
- //اگر سنوات در آخر سال تعلق می گیرد ترک کار قبل از پایان دوره موجب صفر شدن آن میشود
- case BaseYearsPayInEndOfYear.EndOfYear:
- return 0;
-
- //اگر هنگام ترک کار سنوات تعلق می گیرد
- case BaseYearsPayInEndOfYear.WhenEverEmployeeLeftWork:
- {
-
- //بر اساس نوع پرداخت سالیانه یا ماهیانه سنوات محاسبه می گردد
- switch (baseYearsSettings.PaymentType)
- {
- case BaseYearsPaymentType.MonthlyPay:
- {
- return CalculateYearsPayMonthlyByDays(baseYearPayAmount, daysWorked, contractStart.CountPersianMonthDays(), maxMonthDays);
- }
- case BaseYearsPaymentType.YearlyPay:
- {
-
- return CalculateYearsPayYearlyByDays(baseYearPayAmount, daysWorked);
- }
- default:
- return 0;
- }
- }
- }
- }
-
- //در صورت عدم ترک کار
- switch (baseYearsSettings.PaymentType)
- {
- case BaseYearsPaymentType.MonthlyPay:
- {
- return CalculateYearsPayMonthlyByDays(baseYearPayAmount, daysWorked, contractStart.CountPersianMonthDays(), maxMonthDays);
- }
- case BaseYearsPaymentType.YearlyPay:
- {
- string contractEndFa = contractEnd.ToFarsi();
- bool isCheckoutForEsfand = contractEndFa.Substring(5, 2) == "12";
- bool isContractEndOfMonth = contractEndFa.FindeEndOfMonth() == contractEndFa;
-
- //اگر آخر ماه نبود یا اسفند نبود سنوات سالیانه محاسبه نمی گردد
- if (isContractEndOfMonth == false || isCheckoutForEsfand == false)
- return 0;
-
- return CalculateYearsPayYearlyByDays(baseYearPayAmount, daysWorked);
- }
- default:
- return 0;
- }
-
- }
-
- ///
- /// محاسبه سنوات ماهیانه بر اساس روز های کارکرد
- ///
- /// سنوات در کل سال
- /// روز های کارکرد
- /// تعداد روز های ماه
- public static double CalculateYearsPayMonthlyByDays(double baseYears, int daysWorked, int totalDaysInMonth, MaxMonthDays maxMonthDays)
- {
- daysWorked = maxMonthDays == MaxMonthDays.ThirtyDaysForAllMonth && daysWorked > 30 ? 30 : daysWorked;
- totalDaysInMonth = maxMonthDays == MaxMonthDays.ThirtyDaysForAllMonth ? 30 : totalDaysInMonth;
- return baseYears / 12 / totalDaysInMonth * daysWorked;
- }
-
- ///
- /// محاسبه سنوات سالیانه بر اساس روز های کارکرد
- ///
- /// سنوات در کل سال
- /// روز های کارکرد
- ///
- ///
- public static double CalculateYearsPayYearlyByDays(double baseYears, int daysWorked)
- {
- return baseYears / 365 * daysWorked;
- }
- #endregion
-
-
-
- //TODO: this must be updated with Mahan's method for leaves
- ///
- /// محاسبه مدت اضافه کاری
- ///
- public static TimeSpan CalculateOvertimeTimeSpan(List rollCalls,
- ICollection shiftSettings, TimeOnly employeeOffSet)
- {
-
- //for (DateTime offset = start; offset <= end; offset.AddDays(1))
- //{
- // DayOfWeek dayOfWeek = offset.DayOfWeek;
- // switch (dayOfWeek)
- // {
- // case DayOfWeek.Thursday:
- // shifts.Add(new ShiftViewModel { Start = offset.AddHours(9), End = offset.AddHours(14) });
- // break;
- // case DayOfWeek.Friday:
- // break;
- // default:
- // shifts.Add(new ShiftViewModel { Start = offset.AddHours(8), End = offset.AddHours(16) });
- // break;
- // }
- //}
-
- //if (!rollCalls.Any())
- // return TimeSpan.Zero;
- //var startRollCall = rollCalls.MinBy(x => x.StartDate!.Value).StartDate!.Value;
- //var endRollCall = rollCalls.Max(x => x.EndDate)!.Value;
-
- //DateTime startDateTime = new DateTime(DateOnly.FromDateTime(startRollCall), employeeOffSet);
- //DateTime endDateTime = new DateTime(DateOnly.FromDateTime(endRollCall), employeeOffSet);
- //endDateTime = endDateTime == startDateTime ? endDateTime.AddDays(1) : endDateTime;
-
-
- var mandatoryPerDayTimeSpan = new TimeSpan(shiftSettings.Sum(x => (x.EndTime - x.StartTime).Ticks));
-
- //bool isFirst = true;
-
- //var sumOfOverTime = TimeSpan.Zero;
-
- //for (var startDateOffset = startDateTime; startDateOffset <= endDateTime; startDateOffset = startDateOffset.AddDays(1))
- //{
- // IEnumerable rollCallViewModels;
- // var startPeriod = startDateOffset;
- // var endPeriod = startDateOffset.AddDays(1);
-
- // if (isFirst)
- // {
- // rollCallViewModels = rollCalls
- // .Where(x => x.StartDate.Value > startPeriod.Date && x.EndDate.Value <= endPeriod);
- // isFirst = false;
- // }
- // else
- // {
- // rollCallViewModels = rollCalls
- // .Where(x => x.StartDate.Value > startPeriod && x.EndDate.Value <= endPeriod);
- // }
-
- // var sum = rollCallViewModels.Sum(x => (x.EndDate.Value - x.StartDate.Value).Ticks);
- // var rollCallTimeSpan = new TimeSpan(sum);
- // if (rollCallTimeSpan > mandatoryPerDayTimeSpan)
- // {
- // var overTime = rollCallTimeSpan - mandatoryPerDayTimeSpan;
- // sumOfOverTime = sumOfOverTime.Add(overTime);
- // }
- //}
-
-
- //return sumOfOverTime;
-
-
- var groupedRollCalls = rollCalls.GroupBy(x => x.StartDate!.Value.Date);
-
-
- var rollCallsTimeSpans = groupedRollCalls.Where(x =>
- x.Sum(y => (y.EndDate!.Value - y.StartDate!.Value).Ticks) > mandatoryPerDayTimeSpan.Ticks)
- .Select(x => x.Sum(y => (y.EndDate!.Value - y.StartDate!.Value).Ticks)).ToList();
-
- var daysCount = rollCallsTimeSpans.Count();
-
- var totalMandatoryTotalTimeSpan = mandatoryPerDayTimeSpan * daysCount;
- var rollCallTotalTimeSpan = new TimeSpan(rollCallsTimeSpans.Sum(x => x));
-
- if (rollCallTotalTimeSpan < totalMandatoryTotalTimeSpan)
- return TimeSpan.Zero;
- return rollCallTotalTimeSpan - totalMandatoryTotalTimeSpan;
- }
-
-
- public static TimeSpan CalculateOvertimeSpanWithSumSpan(TimeSpan sumSpan, int mandatoryDays,
- ICollection shiftSettings)
- {
- var mandatoryPerDayTimeSpan = new TimeSpan(shiftSettings.Sum(x => (x.EndTime - x.StartTime).Ticks));
- var mandatoryWorkingTimeSpan = mandatoryPerDayTimeSpan * mandatoryDays;
- if (mandatoryWorkingTimeSpan > sumSpan)
- return TimeSpan.Zero;
-
- return sumSpan - mandatoryWorkingTimeSpan;
-
- }
-
- ///
- /// محاسبه مبلغ اضافه کاری با استفاده از تنظیمات
- ///
- /// مدت اضافه کاری
- /// تنظیمات اضافه کاری
- /// مزد روزانه
- ///
- public static double CalculateOvertimePay(TimeSpan overtimeTimeSpan, OverTimePay overTimePaySettings, double dailyWage)
- {
- double baseAmount = overTimePaySettings.Value;
- double result = 0;
- switch (overTimePaySettings.OverTimePayType)
- {
-
- case OverTimePayType.None:
- break;
-
-
- case OverTimePayType.MoneyPerHour:
- {
- int totalMinutes = (int)overtimeTimeSpan.TotalMinutes;
- result = totalMinutes * (baseAmount / 60);
- break;
- }
-
-
- case OverTimePayType.PercentagePerHourOfSalary:
- {
- int totalMinutes = (int)overtimeTimeSpan.TotalMinutes;
- double multiplier = overTimePaySettings.Value / 100;
- result = ((dailyWage * multiplier) / 60) * totalMinutes;
- break;
- }
-
- }
- return result;
- }
-
- ///
- /// محاسبه مدت جمعه کاری بدون در نظر گرفتن اضافه کاری
- ///
- public static TimeSpan CalculateFridayWorkingTimeSpanWithoutOvertime(List rollCallsList, ICollection shiftSettings)
- {
- var _rollCallsList = rollCallsList;
- _rollCallsList = _rollCallsList.Where(x => x.StartDate.Value.DayOfWeek == DayOfWeek.Friday ||
- x.EndDate.Value.DayOfWeek == DayOfWeek.Friday ||
- (x.StartDate.Value.DayOfWeek == DayOfWeek.Thursday && x.EndDate.Value.DayOfWeek == DayOfWeek.Saturday)).ToList();
-
- var preprocessedRollCalls = _rollCallsList.Select(x =>
- new RollCallViewModel
- {
- StartDate = x.StartDate.Value.DayOfWeek == DayOfWeek.Thursday ? x.StartDate.Value.AddDays(1).Date : x.StartDate.Value
- ,
- EndDate = x.EndDate.Value.DayOfWeek == DayOfWeek.Saturday ? x.EndDate.Value.Date : x.EndDate.Value
- }).ToList();
-
- //var timeSpan = new TimeSpan(preprocessedRollCalls.Sum(x => (x.EndDate.Value - x.StartDate.Value).Ticks));
-
- var extraWorkingTimeSpan = CalculateOvertimeTimeSpan(preprocessedRollCalls, shiftSettings, new TimeOnly());
- var rollCallTimeSpan = CalculateFridayWorkingTimeSpan(preprocessedRollCalls);
-
- if (rollCallTimeSpan <= extraWorkingTimeSpan)
- return TimeSpan.Zero;
- return rollCallTimeSpan - extraWorkingTimeSpan;
+ //#endregion
+
+ //if (permittedLeaveTimeSpan >= usedLeavesCheckout)
+ //{
+ // permittedLeaveTimeSpan = permittedLeaveTimeSpan - usedLeavesCheckout;
+ // sumSpans += usedLeavesCheckout;
+ // usedLeavesCheckout = new TimeSpan();
+ //}
+ //else
+ //{
+ // sumSpans += permittedLeaveTimeSpan;
+ // absentsTimeSpan = (absentsTimeSpan - usedLeavesCheckout) - permittedLeaveTimeSpan;
+ // permittedLeaveTimeSpan = new TimeSpan();
+ //}
+
+
+
+ //اگر مقدار مجاز مرخصی بیشتر از غیبت یا مساوی باشد
+ if (permittedLeaveTimeSpan >= absentsTimeSpan)
+ {
+ //محاسبه مقدار باقی مانده مزد مرخصی
+ absentAndLeaveDifference.Diffrence = permittedLeaveTimeSpan - absentsTimeSpan;
+ absentAndLeaveDifference.absentOrLeave = AbsentOrLeave.LeavePay;
+
+ //صفر کردن مقدار غیبت
+ absentsTimeSpan = new TimeSpan(0);
+
+ ////برگرداندن ساعت کاری باقی مونده از مزد مرخصی به ساعت کاری
+ //sumSpans += absentAndLeaveDifference.Diffrence;
+
+ //مقدار مزد مرخصی برای هرروز استفاده نشده
+ double leavePayPerDayWage = (leaveValue * (minuteWage * sumOfEmployeeShiftSpan.TotalMinutes));
+
+ if (permittedLeaveTimeSpan.TotalHours == 0)
+ return sumSpans;
+
+ leavePayAmount = (leavePayPerDayWage / permittedLeaveTimeSpan.TotalMinutes) * absentAndLeaveDifference.Diffrence.TotalMinutes;
+
+ }
+ //اگر مقدار غیبت بیشتر از مرخصی باشد
+ else
+ {
+ //محاسبه مقدار باقی مانده از غیبت
+ absentAndLeaveDifference.Diffrence = absentsTimeSpan - permittedLeaveTimeSpan;
+ absentAndLeaveDifference.absentOrLeave = AbsentOrLeave.AbsentDeduction;
+
+ //صفر کردن مقدار مزد مرخصی
+ permittedLeaveTimeSpan = new TimeSpan(0);
+ permittedLeaveDay = 0;
+
+ ////برگرداندن ساعت کاری باقی مونده از مزد مرخصی به ساعت کاری
+ //sumSpans += permittedLeaveTimeSpan;
+
+ absentsDeduction = absentsTimeSpan.TotalMinutes * minuteWage;
+
+ }
+
+ return sumSpans;
+ }
+
+ ///
+ /// محاسبه تاخیر در ورورد و تعجیل در خروج
+ ///
+ ///
+ ///
+ ///
+ public List LateToWorkEarlyExit(List groupedRollCall, ICollection shiftSettings, List leavList)
+ {
+ List lateToWorkEarlyExistSpannig = new List();
+
+ foreach (var day in groupedRollCall)
+ {
+
+ foreach (var shift in shiftSettings)
+ {
+ //DateTime start = DateTime.Parse(shift.StartTime);
+ //DateTime end = DateTime.Parse(shift.EndTime);
+ DateTime startShift = new DateTime(day.CreationDate.Year, day.CreationDate.Month, day.CreationDate.Day, shift.StartTime.Hour, shift.StartTime.Minute, 0);
+ DateTime endShift = new DateTime(day.CreationDate.Year, day.CreationDate.Month, day.CreationDate.Day, shift.EndTime.Hour, shift.EndTime.Minute, 0);
+ if (shift.StartTime > shift.EndTime)
+ endShift = endShift.AddDays(1);
+
+ //اگر در بازه شیف تعیین شده حضور غیاب داشت
+
+ var hasRollCall = day.ShiftList.Where(x =>
+ (x.Start <= startShift && x.End > startShift) ||
+ (x.Start >= startShift && x.End <= endShift) ||
+ (x.Start > startShift && x.End > endShift)).ToList();
+
+ if (!hasRollCall.Any())// اگر در بازه شیفت هیچ حضور غیابی نداشت
+ {
+ lateToWorkEarlyExistSpannig.Add(new LateToWorkEarlyExistSpannig()
+ {
+ StartSpan = startShift,
+ EndSpan = endShift,
+ Spanning = (endShift - startShift),
+ TypeOfSapn = shift.Placement == ShiftPlacement.First ? "LateToWork" : "EarlyExist"
+ });
+ }
+ else if (hasRollCall.Count() == 1)
+ {
+ var singleHasRollCall = hasRollCall.FirstOrDefault();
+ if (singleHasRollCall != null && singleHasRollCall.Start > startShift &&
+ singleHasRollCall.End >= endShift)
+ {
+ lateToWorkEarlyExistSpannig.Add(new LateToWorkEarlyExistSpannig()
+ {
+ StartSpan = startShift,
+ EndSpan = singleHasRollCall.Start,
+ Spanning = (singleHasRollCall.Start - startShift),
+ TypeOfSapn = "LateToWork"
+ });
+ }
+ else if (singleHasRollCall != null && singleHasRollCall.Start <= startShift &&
+ singleHasRollCall.End < endShift)
+ {
+ lateToWorkEarlyExistSpannig.Add(new LateToWorkEarlyExistSpannig()
+ {
+ StartSpan = singleHasRollCall.End,
+ EndSpan = endShift,
+ Spanning = (endShift - singleHasRollCall.End),
+ TypeOfSapn = "EarlyExist"
+ });
+ }
+ else if (singleHasRollCall != null && singleHasRollCall.Start > startShift &&
+ singleHasRollCall.End < endShift)
+ {
+ lateToWorkEarlyExistSpannig.Add(new LateToWorkEarlyExistSpannig()
+ {
+ StartSpan = startShift,
+ EndSpan = singleHasRollCall.Start,
+ Spanning = (singleHasRollCall.Start - startShift),
+ TypeOfSapn = "LateToWork"
+ });
+
+ lateToWorkEarlyExistSpannig.Add(new LateToWorkEarlyExistSpannig()
+ {
+ StartSpan = singleHasRollCall.End,
+ EndSpan = endShift,
+ Spanning = (endShift - singleHasRollCall.End),
+ TypeOfSapn = "EarlyExist"
+ });
+ }
+ }
+ else if (hasRollCall.Count() > 1)
+ {
+ var multiHasRollCall = hasRollCall.OrderBy(x => x.Start);
+ var firstRollcall = multiHasRollCall.First();
+ var lastRollCall = multiHasRollCall.Last();
+
+ if (firstRollcall.Start > startShift &&
+ firstRollcall.End >= endShift)
+ {
+ lateToWorkEarlyExistSpannig.Add(new LateToWorkEarlyExistSpannig()
+ {
+ StartSpan = startShift,
+ EndSpan = firstRollcall.Start,
+ Spanning = (firstRollcall.Start - startShift),
+ TypeOfSapn = "LateToWork"
+ });
+ }
+
+ if (lastRollCall.Start <= startShift &&
+ lastRollCall.End < endShift)
+ {
+ lateToWorkEarlyExistSpannig.Add(new LateToWorkEarlyExistSpannig()
+ {
+ StartSpan = lastRollCall.End,
+ EndSpan = endShift,
+ Spanning = (endShift - lastRollCall.End),
+ TypeOfSapn = "EarlyExist"
+ });
+ }
+ }
+ }
+ }
+
+ leavList = leavList.Where(x => x.PaidLeaveType == "ساعتی").ToList();
+ // اگر تاخیر یا تعجیل به دلیل مرخصی ساعتی بود حساب نشود
+ if (leavList.Count > 0 && lateToWorkEarlyExistSpannig.Count > 0)
+ {
+ foreach (var el in lateToWorkEarlyExistSpannig.ToList())
+ {
+ var hasLeve = leavList.Any(x =>
+ (x.StartLeaveGr <= el.StartSpan && x.EndLeaveGr > el.StartSpan) ||
+ (x.StartLeaveGr >= el.StartSpan && x.EndLeaveGr <= el.EndSpan) ||
+ (x.StartLeaveGr > el.StartSpan && x.EndLeaveGr > el.EndSpan));
+ if (hasLeve)
+ lateToWorkEarlyExistSpannig.Remove(el);
+ }
+
+ }
+
+
+ return lateToWorkEarlyExistSpannig;
+ }
+
+ #region Pooya
+
+ public double CalculateFamilyAllowancePayAmount(long employeeId, double basePay, DateTime contractEnd)
+ {
+ int underageChildrenCount = _context.EmployeeChildrenSet.Where(x => x.EmployeeId == employeeId &&
+ x.DateOfBirth.AddYears(18) > contractEnd).Count();
+ return basePay * underageChildrenCount;
+ }
+
+ //Deprecated
+ private TimeSpan CalculateOvertimeTimeSpanWithThreshold(List rollCalls,
+ ICollection shiftSettings, int overtimeThresholdMinutes)
+ {
+
+ var mandatoryTotalTimeSpan = new TimeSpan(shiftSettings.Sum(x => (x.EndTime - x.StartTime).Ticks));
+ mandatoryTotalTimeSpan += new TimeSpan(0, overtimeThresholdMinutes, 0);
+
+ var rollCallsTimeSpans = rollCalls.Select(x => x.EndDate.Value - x.StartDate.Value).Where(x => x > mandatoryTotalTimeSpan).ToList();
+ var rollCallTotalTimeSpan = new TimeSpan(rollCallsTimeSpans.Sum(x => x.Ticks));
+
+ if (rollCallTotalTimeSpan < mandatoryTotalTimeSpan)
+ return TimeSpan.Zero;
+ return rollCallTotalTimeSpan - mandatoryTotalTimeSpan;
+ }
+
+ #region سنوات
+
+ ///
+ /// فرمول اصلی محاسبه سنوات برای پرسنل در بازه زمانی با تنظیمات پیشرفته
+ ///
+ /// حقوق ماهیانه پرسنل
+ /// تنظیمات سنوات
+ /// تنظیم مربوط به پرداخت هنگام ترک کار
+ public double CalculateYearsPayAmount(long employeeId, long workshopId, double monthlySalary, DateTime contractStart, DateTime contractEnd,
+ BaseYearsPay baseYearsSettings, BaseYearsPayInEndOfYear payOnLeave, MaxMonthDays maxMonthDays)
+ {
+ double baseYearPayAmount = 0;
+
+
+ var leftWorks = _context.LeftWorkList
+ .Where(x => x.EmployeeId == employeeId && x.WorkshopId == workshopId &&
+ x.LeftWorkDate.Date.AddDays(-1) >= contractStart && x.StartWorkDate.Date <= contractEnd).ToList();
+
+ if (!leftWorks.Any())
+ return 0;
+
+ int daysWorked = (int)new TimeSpan(leftWorks.Select(x => new
+ {
+ Start = x.StartWorkDate < contractStart ? contractStart : x.StartWorkDate
+ ,
+ End = x.LeftWorkDate.AddDays(-1) > contractEnd ? contractEnd : x.LeftWorkDate.AddDays(-1)
+ }).Sum(x => (x.End - x.Start).Ticks)).TotalDays + 1;
+
+ bool hasLeftWork = leftWorks.MaxBy(x => x.LeftWorkDate).LeftWorkDate.AddDays(-1) < contractEnd;
+
+ //محاسبه سنوات سالیانه
+ switch (baseYearsSettings.BaseYearsPayType)
+ {
+ case BaseYearsPayType.PercentageOfSalary:
+ {
+ baseYearPayAmount = monthlySalary * baseYearsSettings.Value / 100;
+ break;
+ }
+ case BaseYearsPayType.Money:
+ {
+ baseYearPayAmount = baseYearsSettings.Value;
+ break;
+ }
+ case BaseYearsPayType.None:
+ {
+ return 0;
+ }
+ }
+
+ //در صورت ترک کار
+ if (hasLeftWork)
+
+ {
+ switch (payOnLeave)
+ {
+ //اگر سنوات در آخر سال تعلق می گیرد ترک کار قبل از پایان دوره موجب صفر شدن آن میشود
+ case BaseYearsPayInEndOfYear.EndOfYear:
+ return 0;
+
+ //اگر هنگام ترک کار سنوات تعلق می گیرد
+ case BaseYearsPayInEndOfYear.WhenEverEmployeeLeftWork:
+ {
+
+ //بر اساس نوع پرداخت سالیانه یا ماهیانه سنوات محاسبه می گردد
+ switch (baseYearsSettings.PaymentType)
+ {
+ case BaseYearsPaymentType.MonthlyPay:
+ {
+ return CalculateYearsPayMonthlyByDays(baseYearPayAmount, daysWorked, contractStart.CountPersianMonthDays(), maxMonthDays);
+ }
+ case BaseYearsPaymentType.YearlyPay:
+ {
+
+ return CalculateYearsPayYearlyByDays(baseYearPayAmount, daysWorked);
+ }
+ default:
+ return 0;
+ }
+ }
+ }
+ }
+
+ //در صورت عدم ترک کار
+ switch (baseYearsSettings.PaymentType)
+ {
+ case BaseYearsPaymentType.MonthlyPay:
+ {
+ return CalculateYearsPayMonthlyByDays(baseYearPayAmount, daysWorked, contractStart.CountPersianMonthDays(), maxMonthDays);
+ }
+ case BaseYearsPaymentType.YearlyPay:
+ {
+ string contractEndFa = contractEnd.ToFarsi();
+ bool isCheckoutForEsfand = contractEndFa.Substring(5, 2) == "12";
+ bool isContractEndOfMonth = contractEndFa.FindeEndOfMonth() == contractEndFa;
+
+ //اگر آخر ماه نبود یا اسفند نبود سنوات سالیانه محاسبه نمی گردد
+ if (isContractEndOfMonth == false || isCheckoutForEsfand == false)
+ return 0;
+
+ return CalculateYearsPayYearlyByDays(baseYearPayAmount, daysWorked);
+ }
+ default:
+ return 0;
+ }
+
+ }
+
+ ///
+ /// محاسبه سنوات ماهیانه بر اساس روز های کارکرد
+ ///
+ /// سنوات در کل سال
+ /// روز های کارکرد
+ /// تعداد روز های ماه
+ public static double CalculateYearsPayMonthlyByDays(double baseYears, int daysWorked, int totalDaysInMonth, MaxMonthDays maxMonthDays)
+ {
+ daysWorked = maxMonthDays == MaxMonthDays.ThirtyDaysForAllMonth && daysWorked > 30 ? 30 : daysWorked;
+ totalDaysInMonth = maxMonthDays == MaxMonthDays.ThirtyDaysForAllMonth ? 30 : totalDaysInMonth;
+ return baseYears / 12 / totalDaysInMonth * daysWorked;
+ }
+
+ ///
+ /// محاسبه سنوات سالیانه بر اساس روز های کارکرد
+ ///
+ /// سنوات در کل سال
+ /// روز های کارکرد
+ ///
+ ///
+ public static double CalculateYearsPayYearlyByDays(double baseYears, int daysWorked)
+ {
+ return baseYears / 365 * daysWorked;
+ }
+ #endregion
+
+
+
+ //TODO: this must be updated with Mahan's method for leaves
+ ///
+ /// محاسبه مدت اضافه کاری
+ ///
+ public static TimeSpan CalculateOvertimeTimeSpan(List rollCalls,
+ ICollection shiftSettings, TimeOnly employeeOffSet)
+ {
+
+ //for (DateTime offset = start; offset <= end; offset.AddDays(1))
+ //{
+ // DayOfWeek dayOfWeek = offset.DayOfWeek;
+ // switch (dayOfWeek)
+ // {
+ // case DayOfWeek.Thursday:
+ // shifts.Add(new ShiftViewModel { Start = offset.AddHours(9), End = offset.AddHours(14) });
+ // break;
+ // case DayOfWeek.Friday:
+ // break;
+ // default:
+ // shifts.Add(new ShiftViewModel { Start = offset.AddHours(8), End = offset.AddHours(16) });
+ // break;
+ // }
+ //}
+
+ //if (!rollCalls.Any())
+ // return TimeSpan.Zero;
+ //var startRollCall = rollCalls.MinBy(x => x.StartDate!.Value).StartDate!.Value;
+ //var endRollCall = rollCalls.Max(x => x.EndDate)!.Value;
+
+ //DateTime startDateTime = new DateTime(DateOnly.FromDateTime(startRollCall), employeeOffSet);
+ //DateTime endDateTime = new DateTime(DateOnly.FromDateTime(endRollCall), employeeOffSet);
+ //endDateTime = endDateTime == startDateTime ? endDateTime.AddDays(1) : endDateTime;
+
+
+ var mandatoryPerDayTimeSpan = new TimeSpan(shiftSettings.Sum(x => (x.EndTime - x.StartTime).Ticks));
+
+ //bool isFirst = true;
+
+ //var sumOfOverTime = TimeSpan.Zero;
+
+ //for (var startDateOffset = startDateTime; startDateOffset <= endDateTime; startDateOffset = startDateOffset.AddDays(1))
+ //{
+ // IEnumerable rollCallViewModels;
+ // var startPeriod = startDateOffset;
+ // var endPeriod = startDateOffset.AddDays(1);
+
+ // if (isFirst)
+ // {
+ // rollCallViewModels = rollCalls
+ // .Where(x => x.StartDate.Value > startPeriod.Date && x.EndDate.Value <= endPeriod);
+ // isFirst = false;
+ // }
+ // else
+ // {
+ // rollCallViewModels = rollCalls
+ // .Where(x => x.StartDate.Value > startPeriod && x.EndDate.Value <= endPeriod);
+ // }
+
+ // var sum = rollCallViewModels.Sum(x => (x.EndDate.Value - x.StartDate.Value).Ticks);
+ // var rollCallTimeSpan = new TimeSpan(sum);
+ // if (rollCallTimeSpan > mandatoryPerDayTimeSpan)
+ // {
+ // var overTime = rollCallTimeSpan - mandatoryPerDayTimeSpan;
+ // sumOfOverTime = sumOfOverTime.Add(overTime);
+ // }
+ //}
+
+
+ //return sumOfOverTime;
+
+
+ var groupedRollCalls = rollCalls.GroupBy(x => x.StartDate!.Value.Date);
+
+
+ var rollCallsTimeSpans = groupedRollCalls.Where(x =>
+ x.Sum(y => (y.EndDate!.Value - y.StartDate!.Value).Ticks) > mandatoryPerDayTimeSpan.Ticks)
+ .Select(x => x.Sum(y => (y.EndDate!.Value - y.StartDate!.Value).Ticks)).ToList();
+
+ var daysCount = rollCallsTimeSpans.Count();
+
+ var totalMandatoryTotalTimeSpan = mandatoryPerDayTimeSpan * daysCount;
+ var rollCallTotalTimeSpan = new TimeSpan(rollCallsTimeSpans.Sum(x => x));
+
+ if (rollCallTotalTimeSpan < totalMandatoryTotalTimeSpan)
+ return TimeSpan.Zero;
+ return rollCallTotalTimeSpan - totalMandatoryTotalTimeSpan;
+ }
+
+
+ public static TimeSpan CalculateOvertimeSpanWithSumSpan(TimeSpan sumSpan, int mandatoryDays,
+ ICollection shiftSettings)
+ {
+ var mandatoryPerDayTimeSpan = new TimeSpan(shiftSettings.Sum(x => (x.EndTime - x.StartTime).Ticks));
+ var mandatoryWorkingTimeSpan = mandatoryPerDayTimeSpan * mandatoryDays;
+ if (mandatoryWorkingTimeSpan > sumSpan)
+ return TimeSpan.Zero;
+
+ return sumSpan - mandatoryWorkingTimeSpan;
+
+ }
+
+ ///
+ /// محاسبه مبلغ اضافه کاری با استفاده از تنظیمات
+ ///
+ /// مدت اضافه کاری
+ /// تنظیمات اضافه کاری
+ /// مزد روزانه
+ ///
+ public static double CalculateOvertimePay(TimeSpan overtimeTimeSpan, OverTimePay overTimePaySettings, double dailyWage)
+ {
+ double baseAmount = overTimePaySettings.Value;
+ double result = 0;
+ switch (overTimePaySettings.OverTimePayType)
+ {
+
+ case OverTimePayType.None:
+ break;
+
+
+ case OverTimePayType.MoneyPerHour:
+ {
+ int totalMinutes = (int)overtimeTimeSpan.TotalMinutes;
+ result = totalMinutes * (baseAmount / 60);
+ break;
+ }
+
+
+ case OverTimePayType.PercentagePerHourOfSalary:
+ {
+ int totalMinutes = (int)overtimeTimeSpan.TotalMinutes;
+ double multiplier = overTimePaySettings.Value / 100;
+ result = ((dailyWage * multiplier) / 60) * totalMinutes;
+ break;
+ }
+
+ }
+ return result;
+ }
+
+ ///
+ /// محاسبه مدت جمعه کاری بدون در نظر گرفتن اضافه کاری
+ ///
+ public static TimeSpan CalculateFridayWorkingTimeSpanWithoutOvertime(List rollCallsList, ICollection shiftSettings)
+ {
+ var _rollCallsList = rollCallsList;
+ _rollCallsList = _rollCallsList.Where(x => x.StartDate.Value.DayOfWeek == DayOfWeek.Friday ||
+ x.EndDate.Value.DayOfWeek == DayOfWeek.Friday ||
+ (x.StartDate.Value.DayOfWeek == DayOfWeek.Thursday && x.EndDate.Value.DayOfWeek == DayOfWeek.Saturday)).ToList();
+
+ var preprocessedRollCalls = _rollCallsList.Select(x =>
+ new RollCallViewModel
+ {
+ StartDate = x.StartDate.Value.DayOfWeek == DayOfWeek.Thursday ? x.StartDate.Value.AddDays(1).Date : x.StartDate.Value
+ ,
+ EndDate = x.EndDate.Value.DayOfWeek == DayOfWeek.Saturday ? x.EndDate.Value.Date : x.EndDate.Value
+ }).ToList();
+
+ //var timeSpan = new TimeSpan(preprocessedRollCalls.Sum(x => (x.EndDate.Value - x.StartDate.Value).Ticks));
+
+ var extraWorkingTimeSpan = CalculateOvertimeTimeSpan(preprocessedRollCalls, shiftSettings, new TimeOnly());
+ var rollCallTimeSpan = CalculateFridayWorkingTimeSpan(preprocessedRollCalls);
+
+ if (rollCallTimeSpan <= extraWorkingTimeSpan)
+ return TimeSpan.Zero;
+ return rollCallTimeSpan - extraWorkingTimeSpan;
- }
-
- ///
- /// محاسبه مدت جمعه کاری
- ///
- public static TimeSpan CalculateFridayWorkingTimeSpan(List rollCallsList)
- {
- var _rollCallsList = rollCallsList;
- _rollCallsList = _rollCallsList.Where(x => x.StartDate.Value.DayOfWeek == DayOfWeek.Friday ||
- x.EndDate.Value.DayOfWeek == DayOfWeek.Friday ||
- (x.StartDate.Value.DayOfWeek == DayOfWeek.Thursday && x.EndDate.Value.DayOfWeek == DayOfWeek.Saturday)).ToList();
-
- var preprocessedRollCalls = _rollCallsList.Select(x =>
- new
- {
- Start = x.StartDate.Value.DayOfWeek == DayOfWeek.Thursday ? x.StartDate.Value.AddDays(1).Date : x.StartDate.Value
- ,
- End = x.EndDate.Value.DayOfWeek == DayOfWeek.Saturday ? x.EndDate.Value.Date : x.EndDate.Value
- }).ToList();
-
- var timeSpan = new TimeSpan(preprocessedRollCalls.Sum(x => (x.End - x.Start).Ticks));
- return timeSpan;
- }
-
- ///
- /// محاسبه روز های جمعه کاری
- ///
- public static int CalculateFridayWorkingTotalDays(List rollCallsList)
- {
- var _rollCallsList = rollCallsList;
- _rollCallsList = _rollCallsList.Where(x => x.StartDate.Value.DayOfWeek == DayOfWeek.Friday ||
- x.EndDate.Value.DayOfWeek == DayOfWeek.Friday ||
- (x.StartDate.Value.DayOfWeek == DayOfWeek.Thursday && x.EndDate.Value.DayOfWeek == DayOfWeek.Saturday)).ToList();
-
- var preprocessedRollCalls = _rollCallsList.Select(x =>
- new
- {
- Start = x.StartDate.Value.DayOfWeek == DayOfWeek.Thursday ? x.StartDate.Value.AddDays(1).Date : x.StartDate.Value
- ,
- End = x.EndDate.Value.DayOfWeek == DayOfWeek.Saturday ? x.StartDate.Value.Date : x.EndDate.Value,
- ShiftDate = x.ShiftDate
- }).ToList();
-
- int fridaysCount = preprocessedRollCalls.GroupBy(x => x.ShiftDate).Count();
- return fridaysCount;
- }
-
- #endregion
-
- #endregion
-
-
- private static (DateTime start, DateTime end) FindRotatingShift(DateTime startRollCall, DateTime endRollCall, ICollection rotatingShifts)
- {
-
-
- DateTime startDate = startRollCall.Date;
- DateTime endDate = endRollCall.Date;
-
-
-
- DateTime startEntryWithDate = startDate.Add(startRollCall.TimeOfDay);
- DateTime endEntryWithDate = endDate.Add(endRollCall.TimeOfDay);
-
- DateTime oneHourBeforeStart = startEntryWithDate.AddHours(-1);
- DateTime oneHourAfterStart = startEntryWithDate.AddHours(1);
- DateTime oneHourBeforeEnd = endEntryWithDate.AddHours(-1);
- DateTime oneHourAfterEnd = endEntryWithDate.AddHours(1);
-
-
- var shiftDateTimes = rotatingShifts.SelectMany(shift =>
- {
- var shifts = new List<(DateTime Start, DateTime End)>();
- for (int i = -1; i <= 1; i++)
- {
- var shiftStart = startDate.AddDays(i).Date.Add(shift.StartTime.ToTimeSpan());
- var shiftEnd = shift.StartTime < shift.EndTime
- ? startDate.AddDays(i).Date.Add(shift.EndTime.ToTimeSpan())
- : startDate.AddDays(i + 1).Date.Add(shift.EndTime.ToTimeSpan());
- shifts.Add((shiftStart, shiftEnd));
- }
-
- return shifts;
- }).ToList();
-
- var startFilteredTimes = shiftDateTimes.Where(shift =>
- (oneHourBeforeStart <= shift.Start && oneHourAfterStart >= shift.Start) ||
- (oneHourBeforeStart <= shift.End && oneHourAfterStart >= shift.End)).ToList();
-
- if (startFilteredTimes.Count == 0)
- {
- startFilteredTimes = shiftDateTimes;
- }
- else if (startFilteredTimes.Count == 1)
- {
- var startChosenShift = startFilteredTimes.First();
-
- if (startChosenShift.End < startChosenShift.Start)
- startChosenShift.End = startChosenShift.End.AddDays(1);
-
- return startChosenShift;
- }
-
- var endFilteredTimes = shiftDateTimes.Where(shift => (oneHourBeforeEnd <= shift.Start && oneHourAfterEnd >= shift.Start) ||
- (oneHourBeforeEnd <= shift.End && oneHourAfterEnd >= shift.End)).ToList();
- if (endFilteredTimes.Count == 0)
- {
- endFilteredTimes = startFilteredTimes;
- }
- else if (endFilteredTimes.Count == 1)
- {
- var endChosenShift = endFilteredTimes.First();
- return endChosenShift;
- }
-
-
- var overlapChosenShift = endFilteredTimes.Select(shift => new
- {
- Shift = shift,
- Overlap = new TimeSpan(Math.Max(0,
- Math.Min(shift.End.Ticks, oneHourAfterEnd.Ticks) -
- Math.Max(shift.Start.Ticks, oneHourBeforeEnd.Ticks)))
- }).MaxBy(s => s.Overlap);
+ }
+
+ ///
+ /// محاسبه مدت جمعه کاری
+ ///
+ public static TimeSpan CalculateFridayWorkingTimeSpan(List rollCallsList)
+ {
+ var _rollCallsList = rollCallsList;
+ _rollCallsList = _rollCallsList.Where(x => x.StartDate.Value.DayOfWeek == DayOfWeek.Friday ||
+ x.EndDate.Value.DayOfWeek == DayOfWeek.Friday ||
+ (x.StartDate.Value.DayOfWeek == DayOfWeek.Thursday && x.EndDate.Value.DayOfWeek == DayOfWeek.Saturday)).ToList();
+
+ var preprocessedRollCalls = _rollCallsList.Select(x =>
+ new
+ {
+ Start = x.StartDate.Value.DayOfWeek == DayOfWeek.Thursday ? x.StartDate.Value.AddDays(1).Date : x.StartDate.Value
+ ,
+ End = x.EndDate.Value.DayOfWeek == DayOfWeek.Saturday ? x.EndDate.Value.Date : x.EndDate.Value
+ }).ToList();
+
+ var timeSpan = new TimeSpan(preprocessedRollCalls.Sum(x => (x.End - x.Start).Ticks));
+ return timeSpan;
+ }
+
+ ///
+ /// محاسبه روز های جمعه کاری
+ ///
+ public static int CalculateFridayWorkingTotalDays(List rollCallsList)
+ {
+ var _rollCallsList = rollCallsList;
+ _rollCallsList = _rollCallsList.Where(x => x.StartDate.Value.DayOfWeek == DayOfWeek.Friday ||
+ x.EndDate.Value.DayOfWeek == DayOfWeek.Friday ||
+ (x.StartDate.Value.DayOfWeek == DayOfWeek.Thursday && x.EndDate.Value.DayOfWeek == DayOfWeek.Saturday)).ToList();
+
+ var preprocessedRollCalls = _rollCallsList.Select(x =>
+ new
+ {
+ Start = x.StartDate.Value.DayOfWeek == DayOfWeek.Thursday ? x.StartDate.Value.AddDays(1).Date : x.StartDate.Value
+ ,
+ End = x.EndDate.Value.DayOfWeek == DayOfWeek.Saturday ? x.StartDate.Value.Date : x.EndDate.Value,
+ ShiftDate = x.ShiftDate
+ }).ToList();
+
+ int fridaysCount = preprocessedRollCalls.GroupBy(x => x.ShiftDate).Count();
+ return fridaysCount;
+ }
+
+ #endregion
+
+ #endregion
+
+
+ private static (DateTime start, DateTime end) FindRotatingShift(DateTime startRollCall, DateTime endRollCall, ICollection rotatingShifts)
+ {
+
+
+ DateTime startDate = startRollCall.Date;
+ DateTime endDate = endRollCall.Date;
+
+
+
+ DateTime startEntryWithDate = startDate.Add(startRollCall.TimeOfDay);
+ DateTime endEntryWithDate = endDate.Add(endRollCall.TimeOfDay);
+
+ DateTime oneHourBeforeStart = startEntryWithDate.AddHours(-1);
+ DateTime oneHourAfterStart = startEntryWithDate.AddHours(1);
+ DateTime oneHourBeforeEnd = endEntryWithDate.AddHours(-1);
+ DateTime oneHourAfterEnd = endEntryWithDate.AddHours(1);
+
+
+ var shiftDateTimes = rotatingShifts.SelectMany(shift =>
+ {
+ var shifts = new List<(DateTime Start, DateTime End)>();
+ for (int i = -1; i <= 1; i++)
+ {
+ var shiftStart = startDate.AddDays(i).Date.Add(shift.StartTime.ToTimeSpan());
+ var shiftEnd = shift.StartTime < shift.EndTime
+ ? startDate.AddDays(i).Date.Add(shift.EndTime.ToTimeSpan())
+ : startDate.AddDays(i + 1).Date.Add(shift.EndTime.ToTimeSpan());
+ shifts.Add((shiftStart, shiftEnd));
+ }
+
+ return shifts;
+ }).ToList();
+
+ var startFilteredTimes = shiftDateTimes.Where(shift =>
+ (oneHourBeforeStart <= shift.Start && oneHourAfterStart >= shift.Start) ||
+ (oneHourBeforeStart <= shift.End && oneHourAfterStart >= shift.End)).ToList();
+
+ if (startFilteredTimes.Count == 0)
+ {
+ startFilteredTimes = shiftDateTimes;
+ }
+ else if (startFilteredTimes.Count == 1)
+ {
+ var startChosenShift = startFilteredTimes.First();
+
+ if (startChosenShift.End < startChosenShift.Start)
+ startChosenShift.End = startChosenShift.End.AddDays(1);
+
+ return startChosenShift;
+ }
+
+ var endFilteredTimes = shiftDateTimes.Where(shift => (oneHourBeforeEnd <= shift.Start && oneHourAfterEnd >= shift.Start) ||
+ (oneHourBeforeEnd <= shift.End && oneHourAfterEnd >= shift.End)).ToList();
+ if (endFilteredTimes.Count == 0)
+ {
+ endFilteredTimes = startFilteredTimes;
+ }
+ else if (endFilteredTimes.Count == 1)
+ {
+ var endChosenShift = endFilteredTimes.First();
+ return endChosenShift;
+ }
+
+
+ var overlapChosenShift = endFilteredTimes.Select(shift => new
+ {
+ Shift = shift,
+ Overlap = new TimeSpan(Math.Max(0,
+ Math.Min(shift.End.Ticks, oneHourAfterEnd.Ticks) -
+ Math.Max(shift.Start.Ticks, oneHourBeforeEnd.Ticks)))
+ }).MaxBy(s => s.Overlap);
-
- var end = overlapChosenShift.Shift.End;
- if (overlapChosenShift.Shift.End < overlapChosenShift.Shift.Start)
- end = overlapChosenShift.Shift.End.AddDays(1);
+
+ var end = overlapChosenShift.Shift.End;
+ if (overlapChosenShift.Shift.End < overlapChosenShift.Shift.Start)
+ end = overlapChosenShift.Shift.End.AddDays(1);
- return (overlapChosenShift.Shift.Start, end);
- }
- #endregion
+ return (overlapChosenShift.Shift.Start, end);
+ }
+ #endregion
}
enum AbsentOrLeave
{
- LeavePay,
- AbsentDeduction
+ LeavePay,
+ AbsentDeduction
}
internal class EmployeeShiftResult
{
- public ShiftPlacement Placement { get; set; }
- public TimeSpan ShiftSpan { get; set; }
+ public ShiftPlacement Placement { get; set; }
+ public TimeSpan ShiftSpan { get; set; }
}
\ No newline at end of file