diff --git a/0_Framework/Domain/CustomizeCheckoutShared/Enums/EarlyExitType.cs b/0_Framework/Domain/CustomizeCheckoutShared/Enums/EarlyExitType.cs index a9cc3db0..3393e4db 100644 --- a/0_Framework/Domain/CustomizeCheckoutShared/Enums/EarlyExitType.cs +++ b/0_Framework/Domain/CustomizeCheckoutShared/Enums/EarlyExitType.cs @@ -2,18 +2,18 @@ public enum EarlyExitType { - /// - /// محاسبه نمیشود - /// - None, + /// + /// محاسبه نمیشود + /// + None, - /// - /// هر دقیقه تاخیر به تناسب حقوق مزد روزانه کسر گردد - /// - DeductEveryMinuteAccordingToDailyWage, + /// + /// به ازای هر دقیقه تعجیل به نسبت حقوق دریافتی از حقوق پرسنل کسر میگردد + /// + Default, - /// - /// هر دقیقه تاخیر مبلغی کسر میگردد - /// - MoneyPerMinute + /// + /// در صورت تعجیل به ازای هر دقیقه مبلغی از مزد روزانه کسر میشود + /// + MoneyPerMinute } \ No newline at end of file diff --git a/0_Framework/Domain/CustomizeCheckoutShared/Enums/LateToWorkType.cs b/0_Framework/Domain/CustomizeCheckoutShared/Enums/LateToWorkType.cs index 6d9d7411..15073df7 100644 --- a/0_Framework/Domain/CustomizeCheckoutShared/Enums/LateToWorkType.cs +++ b/0_Framework/Domain/CustomizeCheckoutShared/Enums/LateToWorkType.cs @@ -2,18 +2,18 @@ public enum LateToWorkType { - /// - /// محاسبه نمیشود - /// - None, + /// + /// محاسبه نمیشود + /// + None, - /// - /// هر دقیقه تاخیر به تناسب حقوق مزد روزانه کسر گردد - /// - DeductEveryMinuteAccordingToDailyWage, + /// + /// به ازای هر دقیقه تاخیر به نسبت حقوق دریافتی از حقوق پرسنل کسر میگردد + /// + Default, - /// - /// هر دقیقه تاخیر چند برابر از حقوق کسر میگردد - /// - MultiTimesPerMinute + /// + /// در صورت تاخیر به ازای هر دقیقه مبلغی از مزد روزانه کسر میشود + /// + MoneyPerMinute } \ No newline at end of file diff --git a/Company.Domain/LeftWorkAgg/ILeftWorkRepository.cs b/Company.Domain/LeftWorkAgg/ILeftWorkRepository.cs index f3df1ea0..b157d8c5 100644 --- a/Company.Domain/LeftWorkAgg/ILeftWorkRepository.cs +++ b/Company.Domain/LeftWorkAgg/ILeftWorkRepository.cs @@ -36,5 +36,6 @@ public interface ILeftWorkRepository : IRepository OperationResult CheckEditLeftWork(long workshopId, long employeeId, DateTime date, int type); #region Pooya List GetByWorkshopIdInDates(long workshopId, DateTime startDateGr, DateTime endDateGr); - #endregion + LeftWorkViewModel GetByWorkshopIdEmployeeIdInDates(long workshopId, long employeeId, DateTime start, DateTime end); + #endregion } \ No newline at end of file diff --git a/Company.Domain/RollCallAgg/IRollCallMandatoryRepository.cs b/Company.Domain/RollCallAgg/IRollCallMandatoryRepository.cs index 22629691..046482ef 100644 --- a/Company.Domain/RollCallAgg/IRollCallMandatoryRepository.cs +++ b/Company.Domain/RollCallAgg/IRollCallMandatoryRepository.cs @@ -20,6 +20,6 @@ public interface IRollCallMandatoryRepository : IRepository CustomizeCheckoutMandatoryViewModel CustomizeCheckoutMandatoryCompute(long employeeId, long workshopId, DateTime contractStart, DateTime contractEnd); - (double lateToWorkSapn, double earlyExit) LateToWorkEarlyExit(List groupedRollCall, + List LateToWorkEarlyExit(List groupedRollCall, ICollection shiftSettings, List leavList); } \ No newline at end of file diff --git a/CompanyManagment.App.Contracts/CustomizeCheckout/LateToWorkEarlyExistSpannig.cs b/CompanyManagment.App.Contracts/CustomizeCheckout/LateToWorkEarlyExistSpannig.cs new file mode 100644 index 00000000..2fbcea91 --- /dev/null +++ b/CompanyManagment.App.Contracts/CustomizeCheckout/LateToWorkEarlyExistSpannig.cs @@ -0,0 +1,12 @@ +using System; + +namespace CompanyManagment.App.Contracts.CustomizeCheckout; + +public class LateToWorkEarlyExistSpannig +{ + public DateTime StartSpan { get; set; } + public DateTime EndSpan { get; set; } + public TimeSpan Spanning { get; set; } + + public string TypeOfSapn { get; set; } +} \ No newline at end of file diff --git a/CompanyManagment.EFCore/Repository/LeftWorkRepository.cs b/CompanyManagment.EFCore/Repository/LeftWorkRepository.cs index e00e714e..a23c34e4 100644 --- a/CompanyManagment.EFCore/Repository/LeftWorkRepository.cs +++ b/CompanyManagment.EFCore/Repository/LeftWorkRepository.cs @@ -568,4 +568,17 @@ public class LeftWorkRepository : RepositoryBase, ILeftWorkRepos EmployeeId = x.EmployeeId }).ToList(); } + + public LeftWorkViewModel GetByWorkshopIdEmployeeIdInDates(long workshopId, long employeeId, DateTime start, DateTime end) + { + var entity = _context.LeftWorkList.FirstOrDefault(x => x.WorkshopId == workshopId && x.EmployeeId == employeeId && x.LeftWorkDate.AddDays(-1) >= start.Date && + x.StartWorkDate <= end.Date); + return new LeftWorkViewModel() + { + StartWorkDateGr = entity.StartWorkDate.Date, + LeftWorkDateGr = entity.LeftWorkDate.Date, + EmployeeId = entity.EmployeeId, + HasLeft = entity.HasLeft + }; + } } \ No newline at end of file diff --git a/CompanyManagment.EFCore/Repository/RollCallMandatoryRepository.cs b/CompanyManagment.EFCore/Repository/RollCallMandatoryRepository.cs index b1d1db9f..4a53098a 100644 --- a/CompanyManagment.EFCore/Repository/RollCallMandatoryRepository.cs +++ b/CompanyManagment.EFCore/Repository/RollCallMandatoryRepository.cs @@ -25,838 +25,863 @@ using Microsoft.EntityFrameworkCore; using Company.Domain.EmployeeAgg; -// 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; - - public RollCallMandatoryRepository(CompanyContext context, IYearlySalaryRepository yearlySalaryRepository, - ILeftWorkRepository leftWorkRepository, ILeaveRepository leaveRepository) : base(context) - { - _context = context; - _yearlySalaryRepository = yearlySalaryRepository; - _leftWorkRepository = leftWorkRepository; - _leaveRepository = leaveRepository; - } - - public ComputingViewModel MandatoryCompute(long employeeId, long workshopId, DateTime contractStart, - DateTime contractEnd, - CreateWorkingHoursTemp command, long leavId) - { - #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 - - - 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), - SumOneDaySpan = new TimeSpan(x.Sum(shift => shift.ShiftSpan.Ticks)), - }).ToList(); - - 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(rollCallSubtractSpan.Sum(x => x.AfterSubtractRestSpan.Ticks)); - - - //****افزودن مرخصی پرسنل به مجموع ساعات کار*** - #region AddEmployeeLeavs - - - 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), - - }).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 += afterCheckout.Sum(x => x.DayCounter); - Console.WriteLine(leavingDayCout); - TimeSpan workingPerDayAve = sumSpans / rollCallSubtractSpan.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); - //***********************************// - - - //********** محاسبه مدت اضافه کاری ***********// - #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); - //***********************************// - //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 = sumSpans.Subtract(mandatoryHoursTimeSpan); - - #endregion - - //******* دستمزد روزانه *******// - #region DailyFeeCompute - - 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) - { - - 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; - } - - #endregion - - #region ConsumableItemsAndHousingAndFamily - - var ConsumableItems = _yearlySalaryRepository.ConsumableItems(contractEnd); - var HousingAllowance = _yearlySalaryRepository.HousingAllowance(contractEnd); - - var familyAllowance = _yearlySalaryRepository.FamilyAllowance(command.EmployeeId, contractEnd); - var MarriedAllowance = _yearlySalaryRepository.MarriedAllowance(contractEnd, command.EmployeeId); - // حق تاهل - string MarriedAllowanceStr = MarriedAllowance > 0 ? MarriedAllowance.ToMoney() : "0"; - #endregion - - var totalWeek = (int)(TotalContractDays / 6); - - #region Fix44Compute - int TotalContractdaysUnder30 = TotalContractDays > 30 ? 30 : TotalContractDays; - if (totalHourses < mandatoryHours) - { - if (command.ShiftWork == "1" || command.ShiftWork == "2" || command.ShiftWork == "4") - { - var workedHoursePerDay = totalHourses / mandatorDays; - var result = (dayliFeeDouble / 7.33) * workedHoursePerDay; - - - 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 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 (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(); - } - - if (totalWeek > 1) - { - - 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}"; - - } - 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}"; - } - - weeklyTime = sumSpans; - } - - } - else // اگر بیشتر از 44 بود - { - - var HousingAllowonceNumberType = HousingAllowance.MoneyToDouble(); - var ConsumableItemsNumberType = ConsumableItems.MoneyToDouble(); - var familyAllowanceNumberType = familyAllowance.MoneyToDouble(); - - var HousingStep1 = HousingAllowonceNumberType / 30; - var HousingStep4 = HousingStep1 * TotalContractdaysUnder30; - HousingAllowance = HousingStep4.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 (familyAllowance != "0") - { - var familyAllowanceStep1 = familyAllowanceNumberType / 30; - var familyAllowanceStep4 = familyAllowanceStep1 * TotalContractdaysUnder30; - familyAllowance = familyAllowanceStep4.ToMoney(); - } - - SumWorkeTime = $"{44}"; - - //اضافه کار - if (totalHourses > mandatoryHours) - { - Console.WriteLine(Mandatory); - Console.WriteLine(Mandatory.Minutes); - int mandatoryH = (int)Mandatory.TotalHours; - int mandatoryM = (int)(Mandatory.TotalMinutes % 60); - overMandatoryHours = mandatoryH.ToString(); - overMandatoryMinuts = mandatoryM.ToString(); - } - - } - #endregion - - //****** نوبت کاری و شب کاری **** - #region RotatingShiftCheckAndNightWorkOver22 - - 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("شب"); - - } - - 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(); - - } - #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; - } - else if (rotatingFaResult == "صبح و عصر و شب") - { - var shiftPyaPercent = DailyFeeNumberType * 15 / 100; - ShiftPayResult = shiftPyaPercent * TotalDays; - } - else if (rotatingFaResult == "صبح و شب" || rotatingFaResult == "عصر و شب") - { - var shiftPyaPercent = DailyFeeNumberType * 22.5 / 100; - ShiftPayResult = shiftPyaPercent * TotalDays; - } - } - - #endregion - - #region Result - - 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, - }; - - #endregion - return res; - } - - 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; - - 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 - - - #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; - } - - 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 - - var midNight24 = new DateTime(item.CreationDate.Year, item.CreationDate.Month, item.CreationDate.Day, 0, 0, 0).AddDays(1); - var morningWorkingTime = new TimeSpan(); - var eveningWorkingTime = new TimeSpan(); - var nightWorkingTime = new TimeSpan(); - - DateTime morningStart = new DateTime(item.CreationDate.Year, item.CreationDate.Month, item.CreationDate.Day, 6, 0, 0); - DateTime morningEnd = new DateTime(item.CreationDate.Year, item.CreationDate.Month, item.CreationDate.Day, 14, 0, 0); - DateTime eveningStart = morningEnd; - DateTime eveningEnd = new DateTime(item.CreationDate.Year, item.CreationDate.Month, item.CreationDate.Day, 22, 0, 0); - DateTime nightStart = eveningEnd; - DateTime nightEnd = morningStart; - DateTime nightEndNextday = nightEnd.AddDays(1); - DateTime morningEndNextday = morningEnd.AddDays(1); - DateTime eveningEndNextday = eveningEnd.AddDays(1); - - - #endregion - - foreach (var shift in item.ShiftList) - { - - #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); - - } - 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 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; - - } - - /// - /// متد محاسبه فیش حقوقی دلخواه - /// - /// - /// - /// - /// - /// - public CustomizeCheckoutMandatoryViewModel CustomizeCheckoutMandatoryCompute(long employeeId, long workshopId, DateTime contractStart, - DateTime contractEnd) - { + 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; + } + + #region OfficialChckout + public ComputingViewModel MandatoryCompute(long employeeId, long workshopId, DateTime contractStart, +DateTime contractEnd, +CreateWorkingHoursTemp command, long leavId) + { + #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 + + + 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), + SumOneDaySpan = new TimeSpan(x.Sum(shift => shift.ShiftSpan.Ticks)), + }).ToList(); + + 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(rollCallSubtractSpan.Sum(x => x.AfterSubtractRestSpan.Ticks)); + + + //****افزودن مرخصی پرسنل به مجموع ساعات کار*** + #region AddEmployeeLeavs + + + 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), + + }).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 += afterCheckout.Sum(x => x.DayCounter); + Console.WriteLine(leavingDayCout); + TimeSpan workingPerDayAve = sumSpans / rollCallSubtractSpan.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); + //***********************************// + + + //********** محاسبه مدت اضافه کاری ***********// + #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); + //***********************************// + //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 = sumSpans.Subtract(mandatoryHoursTimeSpan); + + #endregion + + //******* دستمزد روزانه *******// + #region DailyFeeCompute + + 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) + { + + 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; + } + + #endregion + + #region ConsumableItemsAndHousingAndFamily + + var ConsumableItems = _yearlySalaryRepository.ConsumableItems(contractEnd); + var HousingAllowance = _yearlySalaryRepository.HousingAllowance(contractEnd); + + var familyAllowance = _yearlySalaryRepository.FamilyAllowance(command.EmployeeId, contractEnd); + var MarriedAllowance = _yearlySalaryRepository.MarriedAllowance(contractEnd, command.EmployeeId); + // حق تاهل + string MarriedAllowanceStr = MarriedAllowance > 0 ? MarriedAllowance.ToMoney() : "0"; + #endregion + + var totalWeek = (int)(TotalContractDays / 6); + + #region Fix44Compute + int TotalContractdaysUnder30 = TotalContractDays > 30 ? 30 : TotalContractDays; + if (totalHourses < mandatoryHours) + { + if (command.ShiftWork == "1" || command.ShiftWork == "2" || command.ShiftWork == "4") + { + var workedHoursePerDay = totalHourses / mandatorDays; + var result = (dayliFeeDouble / 7.33) * workedHoursePerDay; + + + 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 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 (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(); + } + + if (totalWeek > 1) + { + + 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}"; + + } + 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}"; + } + + weeklyTime = sumSpans; + } + + } + else // اگر بیشتر از 44 بود + { + + var HousingAllowonceNumberType = HousingAllowance.MoneyToDouble(); + var ConsumableItemsNumberType = ConsumableItems.MoneyToDouble(); + var familyAllowanceNumberType = familyAllowance.MoneyToDouble(); + + var HousingStep1 = HousingAllowonceNumberType / 30; + var HousingStep4 = HousingStep1 * TotalContractdaysUnder30; + HousingAllowance = HousingStep4.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 (familyAllowance != "0") + { + var familyAllowanceStep1 = familyAllowanceNumberType / 30; + var familyAllowanceStep4 = familyAllowanceStep1 * TotalContractdaysUnder30; + familyAllowance = familyAllowanceStep4.ToMoney(); + } + + SumWorkeTime = $"{44}"; + + //اضافه کار + if (totalHourses > mandatoryHours) + { + Console.WriteLine(Mandatory); + Console.WriteLine(Mandatory.Minutes); + int mandatoryH = (int)Mandatory.TotalHours; + int mandatoryM = (int)(Mandatory.TotalMinutes % 60); + overMandatoryHours = mandatoryH.ToString(); + overMandatoryMinuts = mandatoryM.ToString(); + } + + } + #endregion + + //****** نوبت کاری و شب کاری **** + #region RotatingShiftCheckAndNightWorkOver22 + + 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("شب"); + + } + + 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(); + + } + #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; + } + else if (rotatingFaResult == "صبح و عصر و شب") + { + var shiftPyaPercent = DailyFeeNumberType * 15 / 100; + ShiftPayResult = shiftPyaPercent * TotalDays; + } + else if (rotatingFaResult == "صبح و شب" || rotatingFaResult == "عصر و شب") + { + var shiftPyaPercent = DailyFeeNumberType * 22.5 / 100; + ShiftPayResult = shiftPyaPercent * TotalDays; + } + } + + #endregion + + #region Result + + 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, + }; + + #endregion + return res; + } + + 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; + + 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 + + + #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; + } + + 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 + + var midNight24 = new DateTime(item.CreationDate.Year, item.CreationDate.Month, item.CreationDate.Day, 0, 0, 0).AddDays(1); + var morningWorkingTime = new TimeSpan(); + var eveningWorkingTime = new TimeSpan(); + var nightWorkingTime = new TimeSpan(); + + DateTime morningStart = new DateTime(item.CreationDate.Year, item.CreationDate.Month, item.CreationDate.Day, 6, 0, 0); + DateTime morningEnd = new DateTime(item.CreationDate.Year, item.CreationDate.Month, item.CreationDate.Day, 14, 0, 0); + DateTime eveningStart = morningEnd; + DateTime eveningEnd = new DateTime(item.CreationDate.Year, item.CreationDate.Month, item.CreationDate.Day, 22, 0, 0); + DateTime nightStart = eveningEnd; + DateTime nightEnd = morningStart; + DateTime nightEndNextday = nightEnd.AddDays(1); + DateTime morningEndNextday = morningEnd.AddDays(1); + DateTime eveningEndNextday = eveningEnd.AddDays(1); + + + #endregion + + foreach (var shift in item.ShiftList) + { + + #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); + + } + 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 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) + { + 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 @@ -873,18 +898,11 @@ public class RollCallMandatoryRepository : RepositoryBase, IRoll #endregion - #region LeftWork - - var leftWork = _leftWorkRepository.GetByDateAndWorkshopIdAndEmployeeId(workshopId, employeeId, contractEnd); - TimeSpan leftWorkDurationTimeSpan = leftWork.HasLeft ? leftWork.LeftWorkDateGr - leftWork.StartWorkDateGr : contractEnd - leftWork.StartWorkDateGr; - - - #endregion #region CustomizeSettings - CustomizeWorkshopEmployeeSettings customizeWorkshopEmployeeSettings = _context.CustomizeWorkshopEmployeeSettings.FirstOrDefault(x => + CustomizeWorkshopEmployeeSettings customizeWorkshopEmployeeSettings = _context.CustomizeWorkshopEmployeeSettings.AsSplitQuery().FirstOrDefault(x => x.WorkshopId == workshopId && x.EmployeeId == employeeId); CustomizeWorkshopSettings customizeWorkshopSettings = _context.CustomizeWorkshopSettings.FirstOrDefault(x => x.WorkshopId == workshopId); @@ -892,7 +910,7 @@ public class RollCallMandatoryRepository : RepositoryBase, IRoll monthySalary = customizeWorkshopEmployeeSettings?.Salary ?? 0; monthDays = customizeWorkshopSettings.MaxMonthDays == MaxMonthDays.ThirtyDaysForAllMonth ? 30 - : contractStart.CountMonthDays(); + : firstDayOfMonth.CountMonthDays(); dailyWage = monthySalary / monthDays; var shiftSettings = customizeWorkshopEmployeeSettings.CustomizeWorkshopEmployeeSettingsShifts; @@ -911,6 +929,8 @@ public class RollCallMandatoryRepository : RepositoryBase, IRoll }); + + var sumOfEmployeeShiftSpan = new TimeSpan(employeeShiftsSpans.Sum(x => x.ShiftSpan.Ticks)); #endregion @@ -973,7 +993,7 @@ public class RollCallMandatoryRepository : RepositoryBase, IRoll EmployeeId = employeeId, WorkshopId = workshopId, LeaveType = "استحقاقی", - PaidLeaveType = "ساعتی", + StartLeaveGr = contractStart, EndLeaveGr = contractEnd, IsAccepted = true, @@ -1000,84 +1020,14 @@ public class RollCallMandatoryRepository : RepositoryBase, IRoll - + double leavePayAmount = 0; + double absentsDeductionAmount = 0; if (customizeWorkshopEmployeeSettings.LeavePay.LeavePayType != LeavePayType.None) { - - - - // مقدار ساعت های غیبت - TimeSpan absentsTimeSpan = sumOfEmployeeShiftSpan * absentsDays; - - //روزهای مجاز مرخصی - int permittedLeaveDay = customizeWorkshopSettings.LeavePermittedDays; - - // زمان مجاز مرخصی - TimeSpan permittedLeaveTimeSpan = sumOfEmployeeShiftSpan * permittedLeaveDay; - - // زمان مرخصی مجاز برای یک روز - TimeSpan leaveTimePerDay = (permittedLeaveTimeSpan / monthDays); - - - //اگر ترک کار کرده بود - if (contractDays < monthDays) - { - permittedLeaveTimeSpan = leaveTimePerDay * contractDays; - } - - //اگر قراردادش کامل بود - else - { - - } - - //اختلاف غیبت و مرخصی - (TimeSpan Diffrence, AbsentOrLeave absentOrLeave) absentAndLeaveDifference; - - //مقدار مبلغ مرخصی - double leavePayAmount = 0; - - //مقدار مبلغ غیبت - double absentsDeduction = 0; - - //اگر مقدار مرخصی بیشتر از غیبت یا مساوی باشد - if (permittedLeaveTimeSpan >= absentsTimeSpan) - { - //محاسبه مقدار باقی مانده مزد مرخصی - absentAndLeaveDifference.Diffrence = absentsTimeSpan - permittedLeaveTimeSpan; - absentAndLeaveDifference.absentOrLeave = AbsentOrLeave.LeavePay; - - //صفر کردن مقدار غیبت - absentsTimeSpan = new TimeSpan(0); - absentsDays = 0; - - //برگرداندن ساعت کاری باقی مونده از مزد مرخصی به ساعت کاری - sumSpans += absentAndLeaveDifference.Diffrence; - - //مقدار مزد مرخصی برای هرروز استفاده نشده - double leavePayPerDayWage = (customizeWorkshopEmployeeSettings.LeavePay.Value * dailyWage); - - leavePayAmount = (leavePayPerDayWage / permittedLeaveTimeSpan.TotalHours) * absentAndLeaveDifference.Diffrence.TotalHours; - - } - //اگر مقدار غیبت بیشتر از مرخصی باشد - else - { - //محاسبه مقدار باقی مانده از غیبت - absentAndLeaveDifference.Diffrence = permittedLeaveTimeSpan - absentsTimeSpan; - absentAndLeaveDifference.absentOrLeave = AbsentOrLeave.AbsentDeduction; - - //صفر کردن مقدار مزد مرخصی - permittedLeaveTimeSpan = new TimeSpan(0); - permittedLeaveDay = 0; - - //برگرداندن ساعت کاری باقی مونده از مزد مرخصی به ساعت کاری - sumSpans += permittedLeaveTimeSpan; - - absentsDeduction = absentsDays * dailyWage; - - } - + int permittedDays = customizeWorkshopSettings.LeavePermittedDays; + double leaveValue = customizeWorkshopEmployeeSettings.LeavePay.Value; + sumSpans = CalculateLeavePay(sumOfEmployeeShiftSpan, absentsDays, permittedDays, monthDays, contractDays, sumSpans + , leaveValue, dailyWage, leaveList, contractStart, contractEnd, out leavePayAmount, out absentsDeductionAmount); } @@ -1105,27 +1055,9 @@ public class RollCallMandatoryRepository : RepositoryBase, IRoll //حق بیمه #region InsurancePay - double insurancePayAmount = 0; - switch (customizeWorkshopEmployeeSettings.InsuranceDeduction.InsuranceDeductionType) - { - case InsuranceDeductionType.BasedOnLaborLaw: - double familyAllowance = _yearlySalaryRepository.FamilyAllowance(employeeId, 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 = customizeWorkshopEmployeeSettings.InsuranceDeduction.Value / 100; - insurancePayAmount = monthySalary * multiplier; - break; - case InsuranceDeductionType.Money: - double baseAmount = customizeWorkshopEmployeeSettings.InsuranceDeduction.Value; - insurancePayAmount = baseAmount; - break; - } + + InsuranceDeduction insuranceDeduction = customizeWorkshopEmployeeSettings.InsuranceDeduction; + double insuranceDeductionAmount = InsurancePayCalculation(employeeId, contractEnd, insuranceDeduction, monthySalary); #endregion #region SalaryAidDeduction @@ -1169,57 +1101,36 @@ public class RollCallMandatoryRepository : RepositoryBase, IRoll #region OvertimePay double overtimePayAmount = 0; overtimePayAmount = CalculateOvertimePay(sumSpans, customizeWorkshopEmployeeSettings.OverTimePay, dailyWage); + if (overtimePayAmount >= absentsDeductionAmount) + { + overtimePayAmount = overtimePayAmount - absentsDeductionAmount; + absentsDeductionAmount = 0; + } + else + { + absentsDeductionAmount = absentsDeductionAmount - overtimePayAmount; + overtimePayAmount = 0; + } #endregion #region FridayPay 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 workedFridaysHours = (int)CalculateFridayWorkingTimeSpan(rollCallResult).TotalHours; - double baseAmount = customizeWorkshopEmployeeSettings.FridayPay.Value; - fridayPayAmount = baseAmount * workedFridaysHours; - break; - } - case (FridayPayType.PercentageFromSalaryPerHour): - { - int workedFridaysHours = (int)CalculateFridayWorkingTimeSpan(rollCallResult).TotalHours; - double percentageAmount = (customizeWorkshopEmployeeSettings.FridayPay.Value / 100 * dailyWage); - fridayPayAmount = percentageAmount * workedFridaysHours; - break; - } - case (FridayPayType.ExtraWorking): - { - var fridayOvertimeTimeSpan = CalculateFridayWorkingTimeSpanWithoutOvertime(rollCallResult, shiftSettings); - overtimePayAmount += CalculateOvertimePay(fridayOvertimeTimeSpan, customizeWorkshopEmployeeSettings.OverTimePay, dailyWage); - break; - } - default: - break; - } + fridayPayAmount = FridayPayCalculation(customizeWorkshopEmployeeSettings, rollCallResult, dailyWage, shiftSettings, overtimePayAmount); #endregion //حق تاهل #region MaritalAllownace - double maritalAllowance = 0; + double maritalAllowancePay = 0; if (employee.MaritalStatus == "متاهل") { switch (customizeWorkshopEmployeeSettings.MarriedAllowance.MarriedAllowanceType) { case MarriedAllowanceType.Money: { - maritalAllowance = customizeWorkshopEmployeeSettings.MarriedAllowance.Value; + maritalAllowancePay = customizeWorkshopEmployeeSettings.MarriedAllowance.Value; break; } //case MarriedAllowanceType.PercentageFromSalary: @@ -1261,27 +1172,14 @@ public class RollCallMandatoryRepository : RepositoryBase, IRoll } #endregion - //سنوات #region BaseYearsPay - double baseYearsPayAmount = 0; - switch (customizeWorkshopEmployeeSettings.BaseYearsPay.BaseYearsPayType) - { - case BaseYearsPayType.PercentageOfSalary: - { - double multiplier = customizeWorkshopEmployeeSettings.BaseYearsPay.Value / 100; - baseYearsPayAmount = CalculateYearsPayAmount(multiplier * monthySalary, contractStart, contractEnd, customizeWorkshopSettings.MaxMonthDays); - break; - } - case BaseYearsPayType.Money: - { - double baseAmount = customizeWorkshopEmployeeSettings.BaseYearsPay.Value; - baseYearsPayAmount = CalculateYearsPayAmount(baseAmount, contractStart, contractEnd, customizeWorkshopSettings.MaxMonthDays); - break; - } - } + double baseYearsPayAmount = CalculateYearsPayAmount(employeeId, workshopId, monthySalary, contractStart, contractEnd + , customizeWorkshopEmployeeSettings.BaseYearsPay, customizeWorkshopSettings.BaseYearsPayInEndOfYear, customizeWorkshopSettings.MaxMonthDays); + #endregion //حق اولاد + #region FamilyAllowancePay double familyAllowancePay = 0; switch (customizeWorkshopEmployeeSettings.FamilyAllowance.FamilyAllowanceType) @@ -1317,7 +1215,7 @@ public class RollCallMandatoryRepository : RepositoryBase, IRoll #region BonusesPay - double bonusesPay = 0; + double bonusesPayAmount = 0; if (customizeWorkshopEmployeeSettings.BonusesPay.BonusesPayType != BonusesType.None) @@ -1325,19 +1223,19 @@ public class RollCallMandatoryRepository : RepositoryBase, IRoll switch (customizeWorkshopEmployeeSettings.BonusesPay.BonusesPayType) { case BonusesType.OneTimeOfSalary: - bonusesPay = monthySalary; + bonusesPayAmount = monthySalary; break; case BonusesType.TwoTimeOfSalary: - bonusesPay = monthySalary * 2; + bonusesPayAmount = monthySalary * 2; break; case BonusesType.Money: - bonusesPay = customizeWorkshopEmployeeSettings.BonusesPay.Value; + bonusesPayAmount = customizeWorkshopEmployeeSettings.BonusesPay.Value; break; case BonusesType.PercentageOfSalary: - bonusesPay = (monthySalary * customizeWorkshopEmployeeSettings.BonusesPay.Value) / 100; + bonusesPayAmount = (monthySalary * customizeWorkshopEmployeeSettings.BonusesPay.Value) / 100; break; } - double bonusesPerMonth = bonusesPay / 12; + double bonusesPerMonth = bonusesPayAmount / 12; if (customizeWorkshopEmployeeSettings.BonusesPay.PaymentType == BonusesPaymentType.YearlyPay) { @@ -1354,11 +1252,11 @@ public class RollCallMandatoryRepository : RepositoryBase, IRoll else bonusDuration = leftWork.LeftWorkDateGr - startOfYear; //ToDo: Check if should be absolute 365! - bonusesPay = (bonusesPay / 365) * bonusDuration.TotalDays; + bonusesPayAmount = (bonusesPayAmount / 365) * bonusDuration.TotalDays; } else { - bonusesPay = 0; + bonusesPayAmount = 0; } } else if (customizeWorkshopEmployeeSettings.BonusesPay.PaymentType == BonusesPaymentType.MonthlyPay) @@ -1367,10 +1265,10 @@ public class RollCallMandatoryRepository : RepositoryBase, IRoll if (customizeWorkshopSettings.BonusesPaysInEndOfMonth == BonusesPaysInEndOfYear.WhenEverEmployeeLeftWork && leftWork.HasLeft && contractDays < monthDays) - bonusesPay = (bonusesPerMonth / contractEnd.CountPersianMonthDays()) * contractDuration.TotalDays + 1; - + bonusesPayAmount = (bonusesPerMonth / contractEnd.CountPersianMonthDays()) * contractDuration.TotalDays + 1; - bonusesPay = bonusesPerMonth; + + bonusesPayAmount = bonusesPerMonth; } else { @@ -1383,8 +1281,309 @@ public class RollCallMandatoryRepository : RepositoryBase, IRoll #endregion - return new(); - } + #region Test + + + + 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 * dailyWagePerMinute, + + 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 * dailyWagePerMinute, + + 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, + }; + } + + + #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 workedFridaysHours = (int)CalculateFridayWorkingTimeSpan(rollCallResult).TotalHours; + double baseAmount = customizeWorkshopEmployeeSettings.FridayPay.Value; + fridayPayAmount = baseAmount * workedFridaysHours; + break; + } + case (FridayPayType.PercentageFromSalaryPerHour): + { + int workedFridaysHours = (int)CalculateFridayWorkingTimeSpan(rollCallResult).TotalHours; + double percentageAmount = (customizeWorkshopEmployeeSettings.FridayPay.Value / 100 * dailyWage); + fridayPayAmount = percentageAmount * workedFridaysHours; + 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 contractEnd, + InsuranceDeduction insuranceDeduction, double monthySalary) + { + double insurancePayAmount = 0; + switch (insuranceDeduction.InsuranceDeductionType) + { + case InsuranceDeductionType.BasedOnLaborLaw: + + double familyAllowance = _yearlySalaryRepository.FamilyAllowance(employeeId, 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, int absentsDays, + int permittedLeaveDay, int monthDays, int contractDays, TimeSpan sumSpans, + double leaveValue, double dailyWage, List leaveList, DateTime startDate, DateTime endDate, out double leavePayAmount, out double absentsDeduction) + { + + #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); + + usedLeavesCheckout = usedLeavesCheckout.Add(leaveSpan); + } + else + { + var leavingHourses = TimeSpan.Parse(item.LeaveHourses); + usedLeavesCheckout = usedLeavesCheckout.Add(leavingHourses); + } + + } + + #endregion + + // مقدار ساعت های غیبت + TimeSpan absentsTimeSpan = sumOfEmployeeShiftSpan * absentsDays; + + + // زمان مجاز مرخصی + TimeSpan permittedLeaveTimeSpan = sumOfEmployeeShiftSpan * permittedLeaveDay; + + // زمان مرخصی مجاز برای یک روز + TimeSpan leaveTimePerDay = (permittedLeaveTimeSpan / monthDays); + + + //اگر ترک کار کرده بود + if (contractDays < monthDays) + { + permittedLeaveTimeSpan = leaveTimePerDay * contractDays; + } + + //اگر قراردادش کامل بود + else + { + + } + + //اختلاف غیبت و مرخصی + (TimeSpan Diffrence, AbsentOrLeave absentOrLeave) absentAndLeaveDifference; + + //مقدار مبلغ مرخصی + leavePayAmount = 0; + + //مقدار مبلغ غیبت + absentsDeduction = 0; + + if (permittedLeaveTimeSpan >= usedLeavesCheckout) + permittedLeaveTimeSpan = permittedLeaveTimeSpan - usedLeavesCheckout; + else + { + absentsTimeSpan = usedLeavesCheckout - permittedLeaveTimeSpan; + permittedLeaveTimeSpan = new TimeSpan(); + } + + + + //اگر مقدار مرخصی بیشتر از غیبت یا مساوی باشد + if (permittedLeaveTimeSpan >= absentsTimeSpan) + { + //محاسبه مقدار باقی مانده مزد مرخصی + absentAndLeaveDifference.Diffrence = absentsTimeSpan - permittedLeaveTimeSpan; + absentAndLeaveDifference.absentOrLeave = AbsentOrLeave.LeavePay; + + //صفر کردن مقدار غیبت + absentsTimeSpan = new TimeSpan(0); + absentsDays = 0; + + //برگرداندن ساعت کاری باقی مونده از مزد مرخصی به ساعت کاری + sumSpans += absentAndLeaveDifference.Diffrence; + + //مقدار مزد مرخصی برای هرروز استفاده نشده + double leavePayPerDayWage = (leaveValue * dailyWage); + + leavePayAmount = (leavePayPerDayWage / permittedLeaveTimeSpan.TotalHours) * absentAndLeaveDifference.Diffrence.TotalHours; + + } + //اگر مقدار غیبت بیشتر از مرخصی باشد + else + { + //محاسبه مقدار باقی مانده از غیبت + absentAndLeaveDifference.Diffrence = permittedLeaveTimeSpan - absentsTimeSpan; + absentAndLeaveDifference.absentOrLeave = AbsentOrLeave.AbsentDeduction; + + //صفر کردن مقدار مزد مرخصی + permittedLeaveTimeSpan = new TimeSpan(0); + permittedLeaveDay = 0; + + //برگرداندن ساعت کاری باقی مونده از مزد مرخصی به ساعت کاری + sumSpans += permittedLeaveTimeSpan; + + absentsDeduction = absentsDays * dailyWage; + + } + + return sumSpans; + } /// /// محاسبه تاخیر در ورورد و تعجیل در خروج @@ -1392,167 +1591,285 @@ public class RollCallMandatoryRepository : RepositoryBase, IRoll /// /// /// - public (double lateToWorkSapn, double earlyExit) LateToWorkEarlyExit(List groupedRollCall, ICollection shiftSettings, List leavList) - { - List lateToWorkEarlyExistSpannig = new List(); + public List LateToWorkEarlyExit(List groupedRollCall, ICollection shiftSettings, List leavList) + { + List lateToWorkEarlyExistSpannig = new List(); - foreach (var day in groupedRollCall) - { + 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); + 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" - }); + 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(); - 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 (!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" + }); - if (firstRollcall.Start > startShift && - firstRollcall.End >= endShift) - { - lateToWorkEarlyExistSpannig.Add(new LateToWorkEarlyExistSpannig() - { - StartSpan = startShift, - EndSpan = firstRollcall.Start, - Spanning = (firstRollcall.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 (lastRollCall.Start <= startShift && - lastRollCall.End < endShift) - { - lateToWorkEarlyExistSpannig.Add(new LateToWorkEarlyExistSpannig() - { - StartSpan = lastRollCall.End, - EndSpan = endShift, - Spanning = (endShift - lastRollCall.End), - TypeOfSapn = "EarlyExist" - }); - } - } - } - } - // اگر تاخیر یا تعجیل به دلیل مرخصی ساعتی بود حساب نشود - 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); - } + 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 (0, 0); - } + return lateToWorkEarlyExistSpannig; + } + #region Pooya - private double CalculateFamilyAllowancePayAmount(long employeeId, double basePay, DateTime contractEnd) + 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; } - private double CalculateYearsPayAmount(double basePay, DateTime contractStart, DateTime contractEnd, MaxMonthDays maxMonthDays) + #region سنوات + + /// + /// فرمول اصلی محاسبه سنوات برای پرسنل در بازه زمانی با تنظیمات پیشرفته + /// + /// حقوق ماهیانه پرسنل + /// تنظیمات سنوات + /// تنظیم مربوط به پرداخت هنگام ترک کار + private double CalculateYearsPayAmount(long employeeId, long workshopId, double monthlySalary, DateTime contractStart, DateTime contractEnd, + BaseYearsPay baseYearsSettings, BaseYearsPayInEndOfYear payOnLeave, MaxMonthDays maxMonthDays) { - int days = (int)((contractEnd - contractStart).TotalDays); - int totalMonthDays = contractEnd.CountPersianMonthDays(); - if (maxMonthDays == MaxMonthDays.ThirtyDaysForAllMonth) + 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); + + int daysWorked = (int)new TimeSpan(leftWorks.Select(x => new { - if (days >= 30 || days == totalMonthDays) - return basePay; - else - return (basePay * days / 30); - } - else + 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) { - return (basePay * days / totalMonthDays); + 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 /// /// محاسبه مدت اضافه کاری /// - private TimeSpan CalculateOvertimeTimeSpan(List rollCalls, ICollection shiftSettings) + public static TimeSpan CalculateOvertimeTimeSpan(List rollCalls, ICollection shiftSettings) { - //for (DateTime offset = start; offset <= end; offset.AddDays(1)) //{ // DayOfWeek dayOfWeek = offset.DayOfWeek; @@ -1568,16 +1885,22 @@ public class RollCallMandatoryRepository : RepositoryBase, IRoll // break; // } //} + var groupedRollCalls = rollCalls.GroupBy(x => x.StartDate!.Value.Date); + var mandatoryPerDayTimeSpan = new TimeSpan(shiftSettings.Sum(x => (x.EndTime - x.StartTime).Ticks)); - var rollCallsTimeSpans = rollCalls.Select(x => x.EndDate.Value - x.StartDate.Value).ToList(); + 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 mandatoryTotalTimeSpan = new TimeSpan(shiftSettings.Sum(x => (x.EndTime - x.StartTime).Ticks)); - var rollCallTotalTimeSpan = new TimeSpan(rollCallsTimeSpans.Sum(x => x.Ticks)); - if (rollCallTotalTimeSpan < mandatoryTotalTimeSpan) + var daysCount = rollCallsTimeSpans.Count(); + + var totalMandatoryTotalTimeSpan = mandatoryPerDayTimeSpan * daysCount; + var rollCallTotalTimeSpan = new TimeSpan(rollCallsTimeSpans.Sum(x => x)); + if (rollCallTotalTimeSpan < totalMandatoryTotalTimeSpan) return TimeSpan.Zero; - return rollCallTotalTimeSpan - mandatoryTotalTimeSpan; + return rollCallTotalTimeSpan - totalMandatoryTotalTimeSpan; } + /// /// محاسبه مبلغ اضافه کاری با استفاده از تنظیمات /// @@ -1585,7 +1908,7 @@ public class RollCallMandatoryRepository : RepositoryBase, IRoll /// تنظیمات اضافه کاری /// مزد روزانه /// - private double CalculateOvertimePay(TimeSpan overtimeTimeSpan, OverTimePay overTimePaySettings, double dailyWage) + public static double CalculateOvertimePay(TimeSpan overtimeTimeSpan, OverTimePay overTimePaySettings, double dailyWage) { double baseAmount = overTimePaySettings.Value; double result = 0; @@ -1619,7 +1942,7 @@ public class RollCallMandatoryRepository : RepositoryBase, IRoll /// /// محاسبه مدت جمعه کاری بدون در نظر گرفتن اضافه کاری /// - private TimeSpan CalculateFridayWorkingTimeSpanWithoutOvertime(List rollCallsList, ICollection shiftSettings) + public static TimeSpan CalculateFridayWorkingTimeSpanWithoutOvertime(List rollCallsList, ICollection shiftSettings) { var _rollCallsList = rollCallsList; _rollCallsList = _rollCallsList.Where(x => x.StartDate.Value.DayOfWeek == DayOfWeek.Friday || @@ -1631,14 +1954,16 @@ public class RollCallMandatoryRepository : RepositoryBase, IRoll { StartDate = x.StartDate.Value.DayOfWeek == DayOfWeek.Thursday ? x.StartDate.Value.AddDays(1).Date : x.StartDate.Value , - EndDate = x.EndDate.Value.DayOfWeek == DayOfWeek.Saturday ? x.StartDate.Value.Date : x.EndDate.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 timeSpan = new TimeSpan(preprocessedRollCalls.Sum(x => (x.EndDate.Value - x.StartDate.Value).Ticks)); var extraWorkingTimeSpan = CalculateOvertimeTimeSpan(preprocessedRollCalls, shiftSettings); var rollCallTimeSpan = CalculateFridayWorkingTimeSpan(preprocessedRollCalls); + if (rollCallTimeSpan <= extraWorkingTimeSpan) + return TimeSpan.Zero; return rollCallTimeSpan - extraWorkingTimeSpan; @@ -1647,7 +1972,7 @@ public class RollCallMandatoryRepository : RepositoryBase, IRoll /// /// محاسبه مدت جمعه کاری /// - private static TimeSpan CalculateFridayWorkingTimeSpan(List rollCallsList) + public static TimeSpan CalculateFridayWorkingTimeSpan(List rollCallsList) { var _rollCallsList = rollCallsList; _rollCallsList = _rollCallsList.Where(x => x.StartDate.Value.DayOfWeek == DayOfWeek.Friday || @@ -1659,7 +1984,7 @@ public class RollCallMandatoryRepository : RepositoryBase, IRoll { 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 + 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)); @@ -1669,7 +1994,7 @@ public class RollCallMandatoryRepository : RepositoryBase, IRoll /// /// محاسبه روز های جمعه کاری /// - private static int CalculateFridayWorkingTotalDays(List rollCallsList) + public static int CalculateFridayWorkingTotalDays(List rollCallsList) { var _rollCallsList = rollCallsList; _rollCallsList = _rollCallsList.Where(x => x.StartDate.Value.DayOfWeek == DayOfWeek.Friday || @@ -1689,16 +2014,13 @@ public class RollCallMandatoryRepository : RepositoryBase, IRoll } #endregion + + #endregion + + #endregion } -public class LateToWorkEarlyExistSpannig() -{ - public DateTime StartSpan { get; set; } - public DateTime EndSpan { get; set; } - public TimeSpan Spanning { get; set; } - public string TypeOfSapn { get; set; } -} enum AbsentOrLeave { LeavePay, diff --git a/ServiceHost/Areas/Client/Pages/Company/Contracts/ContractPrintAll.cshtml b/ServiceHost/Areas/Client/Pages/Company/Contracts/ContractPrintAll.cshtml index c3e59b65..36ad0799 100644 --- a/ServiceHost/Areas/Client/Pages/Company/Contracts/ContractPrintAll.cshtml +++ b/ServiceHost/Areas/Client/Pages/Company/Contracts/ContractPrintAll.cshtml @@ -5,196 +5,10 @@ } *@ @{ - + int i = 0; + } -
@@ -277,7 +91,7 @@ @foreach (var item in @Model.GroupPrintList) { -
+
@if (@item.ContractType == "دائم") { - - + + } else { - - + + } @@ -429,12 +243,12 @@ @if (@item.ContractType == "موقت") { - + } else { - + } @@ -442,18 +256,18 @@ @if (@item.ContractType == "معین") { - - + + } else { - - + + } - + @{ i++; }
نوع کار یا حرفه یا حجم کار یا وظیفه ای که کارگر به آن اشتغال می یابد : diff --git a/ServiceHost/Areas/Client/Pages/Company/Contracts/PrintAll.cshtml b/ServiceHost/Areas/Client/Pages/Company/Contracts/PrintAll.cshtml index 43e1a2cf..946187e8 100644 --- a/ServiceHost/Areas/Client/Pages/Company/Contracts/PrintAll.cshtml +++ b/ServiceHost/Areas/Client/Pages/Company/Contracts/PrintAll.cshtml @@ -1,5 +1,6 @@ @model CompanyManagment.App.Contracts.Contract.GroupPrintViewModel @{ + int i = 0; +}
@@ -26,17 +41,17 @@ -
+
+ value="Saturday" + id="AbsentFineSat" + class="checkBox form-check-input" + data-day="Saturday" + data-index="6" /> + data-index="0"/> - - + data-index="1"/> - - + data-index="2"/> - - + data-index="3"/> + data-index="4"/> - + data-index="5"/> @@ -178,6 +187,7 @@ appendInput(indexDay, day); } else { $(`#input-FineAbsenceDayOfWeekViewModels-${indexDay}`).remove(); + updateInputIndices(); } }); @@ -193,7 +203,6 @@ .attr("value", `${day}`); container.append(newInput); - updateInputIndices(); } @@ -202,6 +211,5 @@ $(this).attr("name", `Command.FineAbsenceDeduction.FineAbsenceDayOfWeekViewModels[${index}].DayOfWeek`); }); } - }); \ No newline at end of file diff --git a/ServiceHost/Areas/Client/Pages/Company/CustomizeCheckout/_ModalEmployeeSettingPartials/LateToWorkAndEarlyExit.cshtml b/ServiceHost/Areas/Client/Pages/Company/CustomizeCheckout/_ModalEmployeeSettingPartials/LateToWorkAndEarlyExit.cshtml index 6f47c9d2..ac39e245 100644 --- a/ServiceHost/Areas/Client/Pages/Company/CustomizeCheckout/_ModalEmployeeSettingPartials/LateToWorkAndEarlyExit.cshtml +++ b/ServiceHost/Areas/Client/Pages/Company/CustomizeCheckout/_ModalEmployeeSettingPartials/LateToWorkAndEarlyExit.cshtml @@ -21,20 +21,19 @@
- +
- - - + + + +
- - - - + +
@@ -118,21 +117,19 @@
- +
- - - - + + + +
- - - - + +
diff --git a/ServiceHost/Areas/Client/Pages/Company/CustomizeCheckout/_ModalGroupSettingPartials/BonusesPayAndBaseYearPay.cshtml b/ServiceHost/Areas/Client/Pages/Company/CustomizeCheckout/_ModalGroupSettingPartials/BonusesPayAndBaseYearPay.cshtml index ae4df038..719b92fa 100644 --- a/ServiceHost/Areas/Client/Pages/Company/CustomizeCheckout/_ModalGroupSettingPartials/BonusesPayAndBaseYearPay.cshtml +++ b/ServiceHost/Areas/Client/Pages/Company/CustomizeCheckout/_ModalGroupSettingPartials/BonusesPayAndBaseYearPay.cshtml @@ -1,5 +1,5 @@ @using _0_Framework.Domain.CustomizeCheckoutShared.Enums -@model CompanyManagment.App.Contracts.CustomizeWorkshopSettings.EditCustomizeWorkshopGroupSettings +@model CompanyManagment.App.Contracts.CustomizeWorkshopSettings.EditCustomizeWorkshopSettings
@@ -28,21 +28,21 @@
- +
- +
- +
- + diff --git a/ServiceHost/Areas/Client/Pages/Company/CustomizeCheckout/_ModalGroupSettingPartials/FineAbsenceDeduction.cshtml b/ServiceHost/Areas/Client/Pages/Company/CustomizeCheckout/_ModalGroupSettingPartials/FineAbsenceDeduction.cshtml index 19b9e423..2e5e7e59 100644 --- a/ServiceHost/Areas/Client/Pages/Company/CustomizeCheckout/_ModalGroupSettingPartials/FineAbsenceDeduction.cshtml +++ b/ServiceHost/Areas/Client/Pages/Company/CustomizeCheckout/_ModalGroupSettingPartials/FineAbsenceDeduction.cshtml @@ -1,5 +1,21 @@ @using _0_Framework.Domain.CustomizeCheckoutShared.Enums -@model CompanyManagment.App.Contracts.CustomizeWorkshopSettings.EditCustomizeWorkshopGroupSettings + +@model CompanyManagment.App.Contracts.CustomizeWorkshopSettings.EditCustomizeWorkshopSettings +@{ + var dayViewModels = Model.FineAbsenceDeduction.FineAbsenceDayOfWeekViewModels; + +}
@@ -25,17 +41,17 @@ -
+
+ value="Saturday" + id="AbsentFineSat" + class="checkBox form-check-input" + data-day="Saturday" + data-index="6" /> + data-index="0"/> - - + data-index="1"/> - - + data-index="2"/> - - + data-index="3"/> + data-index="4"/> - + data-index="5"/> @@ -177,6 +187,7 @@ appendInput(indexDay, day); } else { $(`#input-FineAbsenceDayOfWeekViewModels-${indexDay}`).remove(); + updateInputIndices(); } }); @@ -192,7 +203,6 @@ .attr("value", `${day}`); container.append(newInput); - updateInputIndices(); } @@ -201,6 +211,5 @@ $(this).attr("name", `Command.FineAbsenceDeduction.FineAbsenceDayOfWeekViewModels[${index}].DayOfWeek`); }); } - }); \ No newline at end of file diff --git a/ServiceHost/Areas/Client/Pages/Company/CustomizeCheckout/_ModalGroupSettingPartials/LateToWorkAndEarlyExit.cshtml b/ServiceHost/Areas/Client/Pages/Company/CustomizeCheckout/_ModalGroupSettingPartials/LateToWorkAndEarlyExit.cshtml index 1b561ef8..38b1be77 100644 --- a/ServiceHost/Areas/Client/Pages/Company/CustomizeCheckout/_ModalGroupSettingPartials/LateToWorkAndEarlyExit.cshtml +++ b/ServiceHost/Areas/Client/Pages/Company/CustomizeCheckout/_ModalGroupSettingPartials/LateToWorkAndEarlyExit.cshtml @@ -22,20 +22,19 @@
- +
- - - + + + +
- - - - + +
@@ -119,21 +118,19 @@
- +
- - - - + + + +
- - - - + +
diff --git a/ServiceHost/Areas/Client/Pages/Company/CustomizeCheckout/_ModalPartials/BonusesPayAndBaseYearPay.cshtml b/ServiceHost/Areas/Client/Pages/Company/CustomizeCheckout/_ModalPartials/BonusesPayAndBaseYearPay.cshtml index f081e1c1..719b92fa 100644 --- a/ServiceHost/Areas/Client/Pages/Company/CustomizeCheckout/_ModalPartials/BonusesPayAndBaseYearPay.cshtml +++ b/ServiceHost/Areas/Client/Pages/Company/CustomizeCheckout/_ModalPartials/BonusesPayAndBaseYearPay.cshtml @@ -28,21 +28,21 @@
- +
- +
- +
- + diff --git a/ServiceHost/Areas/Client/Pages/Company/CustomizeCheckout/_ModalPartials/FineAbsenceDeduction.cshtml b/ServiceHost/Areas/Client/Pages/Company/CustomizeCheckout/_ModalPartials/FineAbsenceDeduction.cshtml index 2c7cb69e..2e5e7e59 100644 --- a/ServiceHost/Areas/Client/Pages/Company/CustomizeCheckout/_ModalPartials/FineAbsenceDeduction.cshtml +++ b/ServiceHost/Areas/Client/Pages/Company/CustomizeCheckout/_ModalPartials/FineAbsenceDeduction.cshtml @@ -3,6 +3,18 @@ @model CompanyManagment.App.Contracts.CustomizeWorkshopSettings.EditCustomizeWorkshopSettings @{ var dayViewModels = Model.FineAbsenceDeduction.FineAbsenceDayOfWeekViewModels; + }
@@ -29,17 +41,17 @@ -
+
+ value="Saturday" + id="AbsentFineSat" + class="checkBox form-check-input" + data-day="Saturday" + data-index="6" /> + data-index="0"/> - - + data-index="1"/> - - + data-index="2"/> - - + data-index="3"/> + data-index="4"/> - + data-index="5"/> @@ -181,6 +187,7 @@ appendInput(indexDay, day); } else { $(`#input-FineAbsenceDayOfWeekViewModels-${indexDay}`).remove(); + updateInputIndices(); } }); @@ -196,7 +203,6 @@ .attr("value", `${day}`); container.append(newInput); - updateInputIndices(); } @@ -205,6 +211,5 @@ $(this).attr("name", `Command.FineAbsenceDeduction.FineAbsenceDayOfWeekViewModels[${index}].DayOfWeek`); }); } - }); \ No newline at end of file diff --git a/ServiceHost/Areas/Client/Pages/Company/CustomizeCheckout/_ModalPartials/LateToWorkAndEarlyExit.cshtml b/ServiceHost/Areas/Client/Pages/Company/CustomizeCheckout/_ModalPartials/LateToWorkAndEarlyExit.cshtml index 1392d310..3fb45093 100644 --- a/ServiceHost/Areas/Client/Pages/Company/CustomizeCheckout/_ModalPartials/LateToWorkAndEarlyExit.cshtml +++ b/ServiceHost/Areas/Client/Pages/Company/CustomizeCheckout/_ModalPartials/LateToWorkAndEarlyExit.cshtml @@ -21,20 +21,19 @@
- +
- - - + + + +
- - - - + +
@@ -137,21 +136,19 @@
- +
- - - - + + + +
- - - - + +
diff --git a/ServiceHost/Areas/Client/Pages/Company/RollCall/EmployeeUploadPicture.cshtml b/ServiceHost/Areas/Client/Pages/Company/RollCall/EmployeeUploadPicture.cshtml index 79a8f558..0e43f3ab 100644 --- a/ServiceHost/Areas/Client/Pages/Company/RollCall/EmployeeUploadPicture.cshtml +++ b/ServiceHost/Areas/Client/Pages/Company/RollCall/EmployeeUploadPicture.cshtml @@ -47,7 +47,7 @@ -

تعداد پرسنل سرویس خریداری شده:

+

تعداد پرسنل سرویس خریداری شده: @Model.MaxPersonValid

diff --git a/ServiceHost/Areas/Client/Pages/Company/RollCall/EmployeeUploadPicture.cshtml.cs b/ServiceHost/Areas/Client/Pages/Company/RollCall/EmployeeUploadPicture.cshtml.cs index 8212146c..9884e82c 100644 --- a/ServiceHost/Areas/Client/Pages/Company/RollCall/EmployeeUploadPicture.cshtml.cs +++ b/ServiceHost/Areas/Client/Pages/Company/RollCall/EmployeeUploadPicture.cshtml.cs @@ -13,204 +13,216 @@ using System.Security.Claims; namespace ServiceHost.Areas.Client.Pages.Company.RollCall { - [Authorize] - public class EmployeeUploadPictureModel : PageModel - { - public string WorkshopFullName; - public RollCallEmployeeViewModel Employees; - public RollCallServiceViewModel RollCallService; - public bool HasEmployees; - public int MaxPersonValid; - public long WorkshopId; - public int PageIndex; + [Authorize] + public class EmployeeUploadPictureModel : PageModel + { + public string WorkshopFullName; + public RollCallEmployeeViewModel Employees; + public RollCallServiceViewModel RollCallService; + public bool HasEmployees; - private readonly IWorkshopApplication _workshopApplication; - private readonly IEmployeeApplication _employeeApplication; - private readonly IRollCallEmployeeApplication _rollCallEmployeeApplication; - private readonly IRollCallServiceApplication _rollCallServiceApplication; - private readonly IWebHostEnvironment _webHostEnvironment; - private readonly IPasswordHasher _passwordHasher; - private readonly IRollCallEmployeeStatusApplication _rollCallEmployeeStatusApplication; - public EmployeeUploadPictureModel(IWorkshopApplication workshopApplication, IPasswordHasher passwordHasher, IRollCallEmployeeApplication rollCallEmployeeApplication, IRollCallServiceApplication rollCallServiceApplication, IWebHostEnvironment webHostEnvironment, IEmployeeApplication employeeApplication, IRollCallEmployeeStatusApplication rollCallEmployeeStatusApplication) - { - _workshopApplication = workshopApplication; - _passwordHasher = passwordHasher; - _rollCallEmployeeApplication = rollCallEmployeeApplication; - _rollCallServiceApplication = rollCallServiceApplication; - _webHostEnvironment = webHostEnvironment; - _employeeApplication = employeeApplication; - _rollCallEmployeeStatusApplication = rollCallEmployeeStatusApplication; - } + //[BindProperty] + public int MaxPersonValid { get; set; } + public long WorkshopId; + public int PageIndex; - public IActionResult OnGet() - { - var workshopHash = User.FindFirstValue("WorkshopSlug"); - var workshopId = _passwordHasher.SlugDecrypt(workshopHash); - if (workshopId > 0) - { - RollCallService = _rollCallServiceApplication.GetActiveServiceByWorkshopId(workshopId); - - if (RollCallService == null) - return Redirect("/Client/Company/RollCall"); - - var workshop = _workshopApplication.GetWorkshopInfo(workshopId); - - WorkshopFullName = workshop.WorkshopFullName; - - MaxPersonValid = RollCallService.MaxPersonValid; - - //var distinctEmployees = _rollCallEmployeeApplication.GetPersonnelRollCallListPaginate(new RollCallEmployeeSearchModel() - //{ - - //}); - WorkshopId = workshopId; - PageIndex = 0; - - HasEmployees = _rollCallEmployeeApplication.HasEmployees(workshopId); - - return Page(); - } - else - { - return NotFound(); - } + private readonly IWorkshopApplication _workshopApplication; + private readonly IEmployeeApplication _employeeApplication; + private readonly IRollCallEmployeeApplication _rollCallEmployeeApplication; + private readonly IRollCallServiceApplication _rollCallServiceApplication; + private readonly IWebHostEnvironment _webHostEnvironment; + private readonly IPasswordHasher _passwordHasher; + private readonly IRollCallEmployeeStatusApplication _rollCallEmployeeStatusApplication; + public EmployeeUploadPictureModel(IWorkshopApplication workshopApplication, IPasswordHasher passwordHasher, IRollCallEmployeeApplication rollCallEmployeeApplication, IRollCallServiceApplication rollCallServiceApplication, IWebHostEnvironment webHostEnvironment, IEmployeeApplication employeeApplication, IRollCallEmployeeStatusApplication rollCallEmployeeStatusApplication) + { + _workshopApplication = workshopApplication; + _passwordHasher = passwordHasher; + _rollCallEmployeeApplication = rollCallEmployeeApplication; + _rollCallServiceApplication = rollCallServiceApplication; + _webHostEnvironment = webHostEnvironment; + _employeeApplication = employeeApplication; + _rollCallEmployeeStatusApplication = rollCallEmployeeStatusApplication; } - public IActionResult OnGetEmployeeUploadDataAjax(int pageIndex, string searchName) - { - var workshopHash = User.FindFirstValue("WorkshopSlug"); - var workshopId = _passwordHasher.SlugDecrypt(workshopHash); - if (workshopId > 0) - { - //MaxPersonValid = _rollCallServiceApplication.GetActiveServiceByWorkshopId(workshopId).MaxPersonValid; - var distinctEmployees = _rollCallEmployeeApplication.GetPersonnelRollCallListPaginate(new RollCallEmployeeSearchModel() - { - WorkshopId = workshopId, - PageIndex = pageIndex, + public IActionResult OnGet() + { + var workshopHash = User.FindFirstValue("WorkshopSlug"); + var workshopId = _passwordHasher.SlugDecrypt(workshopHash); + if (workshopId > 0) + { + RollCallService = _rollCallServiceApplication.GetActiveServiceByWorkshopId(workshopId); + if (RollCallService == null) + return Redirect("/Client/Company/RollCall"); + + var workshop = _workshopApplication.GetWorkshopInfo(workshopId); + + WorkshopFullName = workshop.WorkshopFullName; + + // if (string.IsNullOrEmpty(HttpContext.Session.GetString("MaxPersonValid"))) + // { + // MaxPersonValid = RollCallService.MaxPersonValid; + //HttpContext.Session.SetString("MaxPersonValid", MaxPersonValid.ToString()); + // } + // else + // { + // MaxPersonValid = Convert.ToInt32(HttpContext.Session.GetString("MaxPersonValid")); + // } + + MaxPersonValid = RollCallService.MaxPersonValid; + //var distinctEmployees = _rollCallEmployeeApplication.GetPersonnelRollCallListPaginate(new RollCallEmployeeSearchModel() + //{ + + //}); + WorkshopId = workshopId; + PageIndex = 0; + + HasEmployees = _rollCallEmployeeApplication.HasEmployees(workshopId); + + return Page(); + } + else + { + return NotFound(); + } + } + + public IActionResult OnGetEmployeeUploadDataAjax(int pageIndex, string searchName) + { + var workshopHash = User.FindFirstValue("WorkshopSlug"); + var workshopId = _passwordHasher.SlugDecrypt(workshopHash); + if (workshopId > 0) + { + //MaxPersonValid = _rollCallServiceApplication.GetActiveServiceByWorkshopId(workshopId).MaxPersonValid; + var distinctEmployees = _rollCallEmployeeApplication.GetPersonnelRollCallListPaginate(new RollCallEmployeeSearchModel() + { + WorkshopId = workshopId, + PageIndex = pageIndex, Name = searchName }); - Employees = new RollCallEmployeeViewModel - { - PersonnelInfoViewModels = distinctEmployees - }; - return new JsonResult(new - { - isSuccedded = true, - data = Employees, - pageIndex = Employees.PersonnelInfoViewModels.Count() - }); - } - else - { - return new JsonResult(new - { - isSuccedded = false, - message = "کارگاهی یافت نشد" - }); - } - } + Employees = new RollCallEmployeeViewModel + { + PersonnelInfoViewModels = distinctEmployees + }; + return new JsonResult(new + { + isSuccedded = true, + data = Employees, + pageIndex = Employees.PersonnelInfoViewModels.Count() + }); + } + else + { + return new JsonResult(new + { + isSuccedded = false, + message = "کارگاهی یافت نشد" + }); + } + } - public IActionResult OnGetLoadInfoCount() - { - var workshopHash = User.FindFirstValue("WorkshopSlug"); - var workshopId = _passwordHasher.SlugDecrypt(workshopHash); - if (workshopId <= 0) - { - return new JsonResult(new - { - isSuccedded = false, - message = "کارگاهی یافت نشد" - }); - } - - //var activeService = _rollCallServiceApplication.GetActiveServiceByWorkshopId(workshopId); - //var maxPersonValid = activeService.MaxPersonValid; + public IActionResult OnGetLoadInfoCount() + { + var workshopHash = User.FindFirstValue("WorkshopSlug"); + var workshopId = _passwordHasher.SlugDecrypt(workshopHash); + if (workshopId <= 0) + { + return new JsonResult(new + { + isSuccedded = false, + message = "کارگاهی یافت نشد" + }); + } + //MaxPersonValid = Convert.ToInt32(HttpContext.Session.GetString("MaxPersonValid")); + var activeService = _rollCallServiceApplication.GetActiveServiceByWorkshopId(workshopId); + MaxPersonValid = activeService.MaxPersonValid; - var employeesCount = _rollCallEmployeeApplication.GetActiveAndDeActiveRollCallEmployees(workshopId); + var employeesCount = _rollCallEmployeeApplication.GetActiveAndDeActiveRollCallEmployees(workshopId); - return new JsonResult(new - { - isSuccedded = true, - maxPersonValid = MaxPersonValid == -1 ? "نامحدود" : MaxPersonValid.ToString(), - isTrueActiveCount = employeesCount.activeEmployees, - isFalseActiveCount = employeesCount.deActiveEmployees, - message = "موفق" - }); - } + return new JsonResult(new + { + isSuccedded = true, + maxPersonValid = MaxPersonValid == -1 ? "نامحدود" : MaxPersonValid.ToString(), + isTrueActiveCount = employeesCount.activeEmployees, + isFalseActiveCount = employeesCount.deActiveEmployees, + message = "موفق" + }); + } - public IActionResult OnGetCheckModalTakeImage() - { - var workshopHash = User.FindFirstValue("WorkshopSlug"); - var workshopId = _passwordHasher.SlugDecrypt(workshopHash); + public IActionResult OnGetCheckModalTakeImage() + { + var workshopHash = User.FindFirstValue("WorkshopSlug"); + var workshopId = _passwordHasher.SlugDecrypt(workshopHash); - if (workshopId <= 0) - { - return new JsonResult(new - { - isSuccedded = false, - message = "کارگاه شما یافت نشده است" - }); - } + //MaxPersonValid = Convert.ToInt32(HttpContext.Session.GetString("MaxPersonValid")); - var plan = _rollCallServiceApplication.GetActiveServiceByWorkshopId(workshopId); + if (workshopId <= 0) + { + return new JsonResult(new + { + isSuccedded = false, + message = "کارگاه شما یافت نشده است" + }); + } - if (plan == null) - { - return new JsonResult(new - { - isSuccedded = false, - message = "شما سرویس خریداری شده ندارید" - }); - } + var plan = _rollCallServiceApplication.GetActiveServiceByWorkshopId(workshopId); - if (plan.IsActiveString != "true") - { - return new JsonResult(new - { - isSuccedded = false, - message = "سرویس شما فعال نیست" - }); - } + if (plan == null) + { + return new JsonResult(new + { + isSuccedded = false, + message = "شما سرویس خریداری شده ندارید" + }); + } - //var maxValid = RollCallService.MaxPersonValid; + if (plan.IsActiveString != "true") + { + return new JsonResult(new + { + isSuccedded = false, + message = "سرویس شما فعال نیست" + }); + } - if (MaxPersonValid == -1 || _rollCallEmployeeApplication.activedPerson(workshopId) < MaxPersonValid) - { - return new JsonResult(new - { - isSuccedded = true, - message = "موفق" - }); - } + //var maxValid = RollCallService.MaxPersonValid; - return new JsonResult(new - { - isSuccedded = false, - message = "محدودیت افزودن پرسنل" - }); - } + if (plan.MaxPersonValid == -1 || _rollCallEmployeeApplication.activedPerson(workshopId) < plan.MaxPersonValid) + { + return new JsonResult(new + { + isSuccedded = true, + message = "موفق" + }); + } - public IActionResult OnGetModalTakeImages(long employeeId) - { - var workshopHash = User.FindFirstValue("WorkshopSlug"); - var workshopId = _passwordHasher.SlugDecrypt(workshopHash); - if (workshopId > 0) - { + return new JsonResult(new + { + isSuccedded = false, + message = "محدودیت افزودن پرسنل" + }); + } - var employeeWorkshopInfo = _rollCallEmployeeApplication.GetByEmployeeIdAndWorkshopId(employeeId, workshopId); + public IActionResult OnGetModalTakeImages(long employeeId) + { + var workshopHash = User.FindFirstValue("WorkshopSlug"); + var workshopId = _passwordHasher.SlugDecrypt(workshopHash); + if (workshopId > 0) + { - bool hasPicture = false; - if (employeeWorkshopInfo != null && !string.IsNullOrEmpty(employeeWorkshopInfo.HasUploadedImage)) - hasPicture = bool.Parse(employeeWorkshopInfo.HasUploadedImage); + var employeeWorkshopInfo = _rollCallEmployeeApplication.GetByEmployeeIdAndWorkshopId(employeeId, workshopId); - var employeeDetails = _employeeApplication.GetDetails(employeeId); + bool hasPicture = false; + if (employeeWorkshopInfo != null && !string.IsNullOrEmpty(employeeWorkshopInfo.HasUploadedImage)) + hasPicture = bool.Parse(employeeWorkshopInfo.HasUploadedImage); - string employeeName = string.Empty; - if (employeeDetails != null) - employeeName = employeeDetails.EmployeeFullName; + var employeeDetails = _employeeApplication.GetDetails(employeeId); + + string employeeName = string.Empty; + if (employeeDetails != null) + employeeName = employeeDetails.EmployeeFullName; string pic1 = ""; string pic2 = ""; @@ -246,23 +258,23 @@ namespace ServiceHost.Areas.Client.Pages.Company.RollCall Pic1 = pic1, Pic2 = pic2, }; - - return Partial("ModalTakeImages", res); - } - else - { - var resultError = new ErrorViewModel() - { - IsSuccedded = false, - Message = "هیج کارگاهی یافت نشد" - }; - return Partial("../Error/_ErrorModal", resultError); - } - } - public IActionResult OnPostTakePicture(string base64pic1, string base64pic2, long workshopId, long employeeId) - { + return Partial("ModalTakeImages", res); + } + else + { + var resultError = new ErrorViewModel() + { + IsSuccedded = false, + Message = "هیج کارگاهی یافت نشد" + }; + return Partial("../Error/_ErrorModal", resultError); + } + } + + public IActionResult OnPostTakePicture(string base64pic1, string base64pic2, long workshopId, long employeeId) + { try { var directoryPath = $"{_webHostEnvironment.ContentRootPath}\\Faces\\{workshopId}\\{employeeId}"; @@ -293,7 +305,7 @@ namespace ServiceHost.Areas.Client.Pages.Company.RollCall }; result = _rollCallEmployeeApplication.Create(createCommand); _rollCallEmployeeStatusApplication.Create(new CreateRollCallEmployeeStatus() - { RollCallEmployeeId = result.SendId }); + { RollCallEmployeeId = result.SendId }); } else { @@ -330,116 +342,116 @@ namespace ServiceHost.Areas.Client.Pages.Company.RollCall } - public void CreateImageFromBase64(string base64, string imagePathWithExtension) - { - var subBase64 = base64.Substring(base64.LastIndexOf(',') + 1); - byte[] bytes = Convert.FromBase64String(subBase64); - System.IO.File.WriteAllBytes(imagePathWithExtension, bytes); - } + public void CreateImageFromBase64(string base64, string imagePathWithExtension) + { + var subBase64 = base64.Substring(base64.LastIndexOf(',') + 1); + byte[] bytes = Convert.FromBase64String(subBase64); + System.IO.File.WriteAllBytes(imagePathWithExtension, bytes); + } public IActionResult OnPostActivePersonnel(long id) - { - var workshopHash = User.FindFirstValue("WorkshopSlug"); - var workshopId = _passwordHasher.SlugDecrypt(workshopHash); - if (workshopId > 0) - { - var hasRollCallEmployee = _rollCallEmployeeApplication.GetDetails(id); + { + var workshopHash = User.FindFirstValue("WorkshopSlug"); + var workshopId = _passwordHasher.SlugDecrypt(workshopHash); + if (workshopId > 0) + { + var hasRollCallEmployee = _rollCallEmployeeApplication.GetDetails(id); - if (hasRollCallEmployee == null) - { - return new JsonResult(new - { - isSuccedded = false, - message = "برای این پرسنل، هنوز هیچ عکسی آپلود نشده است. بعد از آپلود عکس بطور خودکار فعال خواهد شد", - }); - } - else - { - if (hasRollCallEmployee.HasUploadedImage == "false") - return new JsonResult(new - { - isSuccedded = false, - message = "برای این پرسنل، هنوز هیچ عکسی آپلود نشده است. بعد از آپلود عکس بطور خودکار فعال خواهد شد", - }); + if (hasRollCallEmployee == null) + { + return new JsonResult(new + { + isSuccedded = false, + message = "برای این پرسنل، هنوز هیچ عکسی آپلود نشده است. بعد از آپلود عکس بطور خودکار فعال خواهد شد", + }); + } + else + { + if (hasRollCallEmployee.HasUploadedImage == "false") + return new JsonResult(new + { + isSuccedded = false, + message = "برای این پرسنل، هنوز هیچ عکسی آپلود نشده است. بعد از آپلود عکس بطور خودکار فعال خواهد شد", + }); - var result = _rollCallEmployeeApplication.Active(hasRollCallEmployee.Id); - if (result.IsSuccedded) - { - return new JsonResult(new - { - isSuccedded = result.IsSuccedded, - message = result.Message, - }); - } - else - { - return new JsonResult(new - { - isSuccedded = result.IsSuccedded, - message = result.Message, - }); - } - } - return new JsonResult(new - { - isSuccedded = false, - message = "خطایی رخ آمده است", - }); - } - else - { - return new JsonResult(new - { - isSuccedded = false, - message = "کارگاه شما یافت نشد", - }); - } - } + var result = _rollCallEmployeeApplication.Active(hasRollCallEmployee.Id); + if (result.IsSuccedded) + { + return new JsonResult(new + { + isSuccedded = result.IsSuccedded, + message = result.Message, + }); + } + else + { + return new JsonResult(new + { + isSuccedded = result.IsSuccedded, + message = result.Message, + }); + } + } + return new JsonResult(new + { + isSuccedded = false, + message = "خطایی رخ آمده است", + }); + } + else + { + return new JsonResult(new + { + isSuccedded = false, + message = "کارگاه شما یافت نشد", + }); + } + } - public IActionResult OnPostDeActivePersonnel(long id) - { - var workshopHash = User.FindFirstValue("WorkshopSlug"); - var workshopId = _passwordHasher.SlugDecrypt(workshopHash); - if (workshopId > 0) - { - var result = _rollCallEmployeeApplication.DeActive(id); - if (result.IsSuccedded) - { - return new JsonResult(new - { - isSuccedded = result.IsSuccedded, - message = result.Message, - }); - } + public IActionResult OnPostDeActivePersonnel(long id) + { + var workshopHash = User.FindFirstValue("WorkshopSlug"); + var workshopId = _passwordHasher.SlugDecrypt(workshopHash); + if (workshopId > 0) + { + var result = _rollCallEmployeeApplication.DeActive(id); + if (result.IsSuccedded) + { + return new JsonResult(new + { + isSuccedded = result.IsSuccedded, + message = result.Message, + }); + } - return new JsonResult(new - { - isSuccedded = result.IsSuccedded, - message = result.Message, - }); - } - else - { - return new JsonResult(new - { - isSuccedded = false, - message = "کارگاه شما یافت نشد", - }); - } - } + return new JsonResult(new + { + isSuccedded = result.IsSuccedded, + message = result.Message, + }); + } + else + { + return new JsonResult(new + { + isSuccedded = false, + message = "کارگاه شما یافت نشد", + }); + } + } - public IActionResult OnGetLoadFirstImage(long employeeId, long workshopId) - { - var directoryPath = $"{_webHostEnvironment.ContentRootPath}\\Faces\\{workshopId}\\{employeeId}"; - var imageDir = Path.Combine(directoryPath, "1.jpg"); - return PhysicalFile(imageDir, "image/jpeg"); - } + public IActionResult OnGetLoadFirstImage(long employeeId, long workshopId) + { + var directoryPath = $"{_webHostEnvironment.ContentRootPath}\\Faces\\{workshopId}\\{employeeId}"; + var imageDir = Path.Combine(directoryPath, "1.jpg"); + return PhysicalFile(imageDir, "image/jpeg"); + } - public IActionResult OnGetLoadSecondImage(long employeeId, long workshopId) - { - var directoryPath = $"{_webHostEnvironment.ContentRootPath}\\Faces\\{workshopId}\\{employeeId}"; - var imageDir = Path.Combine(directoryPath, "2.jpg"); - return PhysicalFile(imageDir, "image/jpeg"); - } + public IActionResult OnGetLoadSecondImage(long employeeId, long workshopId) + { + var directoryPath = $"{_webHostEnvironment.ContentRootPath}\\Faces\\{workshopId}\\{employeeId}"; + var imageDir = Path.Combine(directoryPath, "2.jpg"); + return PhysicalFile(imageDir, "image/jpeg"); + } public IActionResult OnGetModalChangeName(long employeeId) { diff --git a/ServiceHost/Areas/Client/Pages/Company/RollCall/Grouping.cshtml b/ServiceHost/Areas/Client/Pages/Company/RollCall/Grouping.cshtml index b50f912e..ba002761 100644 --- a/ServiceHost/Areas/Client/Pages/Company/RollCall/Grouping.cshtml +++ b/ServiceHost/Areas/Client/Pages/Company/RollCall/Grouping.cshtml @@ -99,6 +99,7 @@ var removeEmployeeFromGroupAjax = `@Url.Page("./Grouping", "RemoveEmployee")`; var workshopSettingId = Number((@Model.RollCallWorkshopSettings.Id)); var isShiftChangedGlobal = false; + var titleOfGroup = ""; } \ No newline at end of file diff --git a/ServiceHost/Areas/Client/Pages/Company/RollCall/ModalAddEmployeeToGroup.cshtml b/ServiceHost/Areas/Client/Pages/Company/RollCall/ModalAddEmployeeToGroup.cshtml index a224caa0..1f0a26c4 100644 --- a/ServiceHost/Areas/Client/Pages/Company/RollCall/ModalAddEmployeeToGroup.cshtml +++ b/ServiceHost/Areas/Client/Pages/Company/RollCall/ModalAddEmployeeToGroup.cshtml @@ -6,7 +6,7 @@