diff --git a/CompanyManagment.App.Contracts/Checkout/Dto/ContractsListToCreateCheckoutDto.cs b/CompanyManagment.App.Contracts/Checkout/Dto/ContractsListToCreateCheckoutDto.cs new file mode 100644 index 00000000..e3d5c6c9 --- /dev/null +++ b/CompanyManagment.App.Contracts/Checkout/Dto/ContractsListToCreateCheckoutDto.cs @@ -0,0 +1,53 @@ +namespace CompanyManagment.App.Contracts.Checkout.Dto; + +public class ContractsListToCreateCheckoutDto +{ + /// + /// آی دی قراداد + /// + public long Id { get; set; } + + /// + /// کد پرسنلی + /// + public long PersonnelCode { get; set; } + + /// + /// شماره قرارداد + /// + public string ContractNo { get; set; } + + //نام کارگاه + public string WorkshopName { get; set; } + + /// + /// نام پرسنل + /// + public string EmployeeName { get; set; } + + /// + /// تاریخ شوع فیش + /// + public string ContractStart { get; set; } + /// + /// تاریخ پایان فیش + /// + public string ContractEnd { get; set; } + + /// + /// تاریخ ترک کار + /// + public string LeftWorkDate { get; set; } + + /// + /// وضعیت ایجاد فیش + /// + public CreateCheckoutStatus CreateCheckoutStatus { get; set; } + + + /// + /// توضیحات + /// + public string Description { get; set; } + +} \ No newline at end of file diff --git a/CompanyManagment.App.Contracts/Checkout/Dto/CreateCheckoutStatus.cs b/CompanyManagment.App.Contracts/Checkout/Dto/CreateCheckoutStatus.cs new file mode 100644 index 00000000..f63a750c --- /dev/null +++ b/CompanyManagment.App.Contracts/Checkout/Dto/CreateCheckoutStatus.cs @@ -0,0 +1,22 @@ +namespace CompanyManagment.App.Contracts.Checkout.Dto; + +/// +/// وضعیت ایجاد فیش +/// +public enum CreateCheckoutStatus +{ + /// + /// آماده ایجاد + /// + ReadyToCreate, + + /// + /// غیر مجاز + /// + NotValid, + + /// + /// دارای فیش حقوقی + /// + HasCheckout, +} \ No newline at end of file diff --git a/CompanyManagment.App.Contracts/Checkout/ICheckoutApplication.cs b/CompanyManagment.App.Contracts/Checkout/ICheckoutApplication.cs index 93208f9d..5b938ead 100644 --- a/CompanyManagment.App.Contracts/Checkout/ICheckoutApplication.cs +++ b/CompanyManagment.App.Contracts/Checkout/ICheckoutApplication.cs @@ -95,6 +95,18 @@ public interface ICheckoutApplication /// /// Task> CheckoutPrint(List ids); + + /// + /// دریافت لیست قراردادها برای ایجاد فیش حقوقی + /// + /// + /// + /// + /// + /// + Task>> GetContractToCreateCheckout(long workshopId, + string year, string month, long employeeId); + #endregion } diff --git a/CompanyManagment.Application/CheckoutApplication.cs b/CompanyManagment.Application/CheckoutApplication.cs index 37ac1a18..705ee241 100644 --- a/CompanyManagment.Application/CheckoutApplication.cs +++ b/CompanyManagment.Application/CheckoutApplication.cs @@ -34,135 +34,136 @@ namespace CompanyManagment.Application; public class CheckoutApplication : ICheckoutApplication { - private readonly ICheckoutRepository _checkoutRepository; - private readonly IYearlySalaryRepository _yearlySalaryRepository; - private readonly ILeftWorkRepository _leftWorkRepository; - private readonly IEmployerRepository _employerRepository; - private readonly IPersonalContractingPartyApp _contractingPartyApp; - private readonly ILeaveApplication _leaveApplication; - private readonly IMandatoryHoursApplication _mandatoryHoursApplication; - private readonly IRollCallMandatoryRepository _rollCallMandatoryRepository; - private readonly IRollCallRepository _rollCallRepository; - private readonly IHolidayItemApplication _holidayItemApplication; - private readonly IWorkingHoursTempRepository _workingHoursTempRepository; - private readonly IWorkshopRepository _workshopRepository; + private readonly ICheckoutRepository _checkoutRepository; + private readonly IYearlySalaryRepository _yearlySalaryRepository; + private readonly ILeftWorkRepository _leftWorkRepository; + private readonly IEmployerRepository _employerRepository; + private readonly IPersonalContractingPartyApp _contractingPartyApp; + private readonly ILeaveApplication _leaveApplication; + private readonly IMandatoryHoursApplication _mandatoryHoursApplication; + private readonly IRollCallMandatoryRepository _rollCallMandatoryRepository; + private readonly IRollCallRepository _rollCallRepository; + private readonly IHolidayItemApplication _holidayItemApplication; + private readonly IWorkingHoursTempRepository _workingHoursTempRepository; + private readonly IWorkshopRepository _workshopRepository; + public CheckoutApplication(ICheckoutRepository checkoutRepository, IYearlySalaryRepository yearlySalaryRepository, - ILeftWorkRepository leftWorkRepository, - IEmployerRepository employerRepository, IPersonalContractingPartyApp contractingPartyApp, ILeaveApplication leaveApplication, IMandatoryHoursApplication mandatoryHoursApplication, IRollCallMandatoryRepository rollCallMandatoryRepository, IRollCallRepository rollCallRepository, IHolidayItemApplication holidayItemApplication, IWorkingHoursTempRepository workingHoursTempRepository, IWorkshopRepository workshopRepository) - { - _checkoutRepository = checkoutRepository; - _yearlySalaryRepository = yearlySalaryRepository; - _leftWorkRepository = leftWorkRepository; - _employerRepository = employerRepository; - _contractingPartyApp = contractingPartyApp; - _leaveApplication = leaveApplication; - _mandatoryHoursApplication = mandatoryHoursApplication; - _rollCallMandatoryRepository = rollCallMandatoryRepository; - _rollCallRepository = rollCallRepository; - _holidayItemApplication = holidayItemApplication; + ILeftWorkRepository leftWorkRepository, + IEmployerRepository employerRepository, IPersonalContractingPartyApp contractingPartyApp, ILeaveApplication leaveApplication, IMandatoryHoursApplication mandatoryHoursApplication, IRollCallMandatoryRepository rollCallMandatoryRepository, IRollCallRepository rollCallRepository, IHolidayItemApplication holidayItemApplication, IWorkingHoursTempRepository workingHoursTempRepository, IWorkshopRepository workshopRepository) + { + _checkoutRepository = checkoutRepository; + _yearlySalaryRepository = yearlySalaryRepository; + _leftWorkRepository = leftWorkRepository; + _employerRepository = employerRepository; + _contractingPartyApp = contractingPartyApp; + _leaveApplication = leaveApplication; + _mandatoryHoursApplication = mandatoryHoursApplication; + _rollCallMandatoryRepository = rollCallMandatoryRepository; + _rollCallRepository = rollCallRepository; + _holidayItemApplication = holidayItemApplication; _workingHoursTempRepository = workingHoursTempRepository; _workshopRepository = workshopRepository; } - [SuppressMessage("ReSharper.DPA", "DPA0007: Large number of DB records", MessageId = "count: 241")] - public void Create(CreateCheckout command) - { - var operation = new OperationResult(); - var syear = Convert.ToInt32(command.ContractStart.Substring(0, 4)); - var smonth = Convert.ToInt32(command.ContractStart.Substring(5, 2)); - string month = string.Empty; - switch (smonth) - { - case 1: - month = "فروردین"; - break; - case 2: - month = "اردیبهشت"; - break; - case 3: - month = "خرداد"; - break; - case 4: - month = "تیر"; - break; - case 5: - month = "مرداد"; - break; - case 6: - month = "شهریور"; - break; - case 7: - month = "مهر"; - break; - case 8: - month = "آبان"; - break; - case 9: - month = "آذر"; - break; - case 10: - month = "دی"; - break; - case 11: - month = "بهمن"; - break; - case 12: - month = "اسفند"; - break; - } - var year = syear.ToString(); + [SuppressMessage("ReSharper.DPA", "DPA0007: Large number of DB records", MessageId = "count: 241")] + public void Create(CreateCheckout command) + { + var operation = new OperationResult(); + var syear = Convert.ToInt32(command.ContractStart.Substring(0, 4)); + var smonth = Convert.ToInt32(command.ContractStart.Substring(5, 2)); + string month = string.Empty; + switch (smonth) + { + case 1: + month = "فروردین"; + break; + case 2: + month = "اردیبهشت"; + break; + case 3: + month = "خرداد"; + break; + case 4: + month = "تیر"; + break; + case 5: + month = "مرداد"; + break; + case 6: + month = "شهریور"; + break; + case 7: + month = "مهر"; + break; + case 8: + month = "آبان"; + break; + case 9: + month = "آذر"; + break; + case 10: + month = "دی"; + break; + case 11: + month = "بهمن"; + break; + case 12: + month = "اسفند"; + break; + } + var year = syear.ToString(); - #region SickLeav + #region SickLeav - //var serachModel = new LeaveSearchModel() - //{ - // EmployeeId = command.EmployeeId, - // WorkshopId = command.WorkshopId, - // LeaveType = "استعلاجی", - // StartLeave = command.ContractStart, - // EndLeave = command.ContractEnd, - // IsAccepted = true, - //}; - //var leavList = _leaveApplication.search(serachModel); - // int sickLeaveCount = 0; - //if (leavList.Count > 0) - //{ + //var serachModel = new LeaveSearchModel() + //{ + // EmployeeId = command.EmployeeId, + // WorkshopId = command.WorkshopId, + // LeaveType = "استعلاجی", + // StartLeave = command.ContractStart, + // EndLeave = command.ContractEnd, + // IsAccepted = true, + //}; + //var leavList = _leaveApplication.search(serachModel); + // int sickLeaveCount = 0; + //if (leavList.Count > 0) + //{ - // foreach (var leave in leavList) - // { - // if (leave.StartLeaveGr < command.ContractStartGr && leave.EndLeaveGr <= command.ContractEndGr) - // { - // int res = (int)((leave.EndLeaveGr - command.ContractStartGr).TotalDays +1); - // sickLeaveCount += res; - // } - // else if (leave.StartLeaveGr >= command.ContractStartGr && leave.EndLeaveGr > command.ContractEndGr) - // { - // int res = (int)((command.ContractEndGr - leave.StartLeaveGr).TotalDays + 1); - // sickLeaveCount += res; - // } - // else - // { - // int res = (int)((leave.EndLeaveGr - leave.StartLeaveGr).TotalDays + 1); - // sickLeaveCount += res; - // } + // foreach (var leave in leavList) + // { + // if (leave.StartLeaveGr < command.ContractStartGr && leave.EndLeaveGr <= command.ContractEndGr) + // { + // int res = (int)((leave.EndLeaveGr - command.ContractStartGr).TotalDays +1); + // sickLeaveCount += res; + // } + // else if (leave.StartLeaveGr >= command.ContractStartGr && leave.EndLeaveGr > command.ContractEndGr) + // { + // int res = (int)((command.ContractEndGr - leave.StartLeaveGr).TotalDays + 1); + // sickLeaveCount += res; + // } + // else + // { + // int res = (int)((leave.EndLeaveGr - leave.StartLeaveGr).TotalDays + 1); + // sickLeaveCount += res; + // } - // } - //} + // } + //} - #endregion + #endregion - var dayliWage = command.DayliWage.MoneyToDouble(); - // کمک هزینه اقلام - var consumableItem = command.ConsumableItems.MoneyToDouble(); - //حق اولاد - var familyAllowance = command.FamilyAllowance.MoneyToDouble(); - //کمک هزینه مسکن - var housingAllowance = command.HousingAllowance.MoneyToDouble(); - //حق تاهل - var marriedAllowance = command.MarriedAllowance.MoneyToDouble(); + var dayliWage = command.DayliWage.MoneyToDouble(); + // کمک هزینه اقلام + var consumableItem = command.ConsumableItems.MoneyToDouble(); + //حق اولاد + var familyAllowance = command.FamilyAllowance.MoneyToDouble(); + //کمک هزینه مسکن + var housingAllowance = command.HousingAllowance.MoneyToDouble(); + //حق تاهل + var marriedAllowance = command.MarriedAllowance.MoneyToDouble(); //var MontlyYearsBunos = //_yearlySalaryRepository.GetMontlyBunosYears(command.WeeklyTime, command.ContractStartGr, command.ContractEndGr, dayliWage, command.WorkingWeeklyTime, command.officialholiday, command.friday, command.TotalHolidaysAndNotH, command.TotalHolidaysAndNotM, command.Basic, command.FridayStarttoEnd, command.DailFeeComplete, command.HasRollCall, command.HolidayWorking, command.ShiftWork); //دستمزد ماهانه @@ -183,8 +184,8 @@ public class CheckoutApplication : ICheckoutApplication //سنوات var years = command.YearsPay; - //عیدی و پاداش - var bunos = command.BonusesPay; + //عیدی و پاداش + var bunos = command.BonusesPay; //فاطمه احمدژاد === موقت عیدی و پاداش و سنوات حساب نشه if (command.EmployeeId == 45104 && command.WorkshopId == 315) @@ -195,12 +196,12 @@ public class CheckoutApplication : ICheckoutApplication } var sumOfWorkingDays = $"{totalDays}"; - if (command.friday > 0) - { - var fridayPercent = dayliWage * 40 / 100; - //فوق العاده جمعه کاری - command.FridayPay = fridayPercent * command.friday; - } + if (command.friday > 0) + { + var fridayPercent = dayliWage * 40 / 100; + //فوق العاده جمعه کاری + command.FridayPay = fridayPercent * command.friday; + } //حق بیمه سهم کارگر #region InsuranceDeduction @@ -208,7 +209,7 @@ public class CheckoutApplication : ICheckoutApplication bool hasInsuranceShareTheSameAsList = false; if (command.InsuranceDeduction == 0) { - var insuranceOverTime = command.HasInsuranceChekoutOverTime ? command.OvertimePay : 0; + var insuranceOverTime = command.HasInsuranceChekoutOverTime ? command.OvertimePay : 0; insuranceDeduction = (monthlyWage + bacicYears + consumableItem + housingAllowance + marriedAllowance + insuranceOverTime) * 7 / 100; } else @@ -222,213 +223,213 @@ public class CheckoutApplication : ICheckoutApplication if (command.OvertimePay > 0 && command.AbsenceDeduction > 0) - { - if (command.AbsenceDeduction >= command.OvertimePay) - { - command.AbsenceDeduction = command.AbsenceDeduction - command.OvertimePay; - command.OvertimePay = 0; + { + if (command.AbsenceDeduction >= command.OvertimePay) + { + command.AbsenceDeduction = command.AbsenceDeduction - command.OvertimePay; + command.OvertimePay = 0; command.OverTimeWorkValue = "00:00"; } - else - { - command.OvertimePay = command.OvertimePay - command.AbsenceDeduction; - command.AbsenceDeduction = 0; - } + else + { + command.OvertimePay = command.OvertimePay - command.AbsenceDeduction; + command.AbsenceDeduction = 0; + } - } - var checkoutStart = $"{command.Year}/{command.Month}/01"; - var checkoutEnd = checkoutStart.FindeEndOfMonth(); - var salaryAids = - _rollCallMandatoryRepository.SalaryAidsForCheckout(command.EmployeeId, command.WorkshopId, checkoutStart.ToGeorgianDateTime(), checkoutEnd.ToGeorgianDateTime()) - .Select(x => new CheckoutSalaryAid(x.Amount, x.SalaryAidDateTimeGe, x.SalaryAidDateTimeFa, x.CalculationDateTimeGe, x.CalculationDateTimeFa, x.Id)).ToList(); + } + var checkoutStart = $"{command.Year}/{command.Month}/01"; + var checkoutEnd = checkoutStart.FindeEndOfMonth(); + var salaryAids = + _rollCallMandatoryRepository.SalaryAidsForCheckout(command.EmployeeId, command.WorkshopId, checkoutStart.ToGeorgianDateTime(), checkoutEnd.ToGeorgianDateTime()) + .Select(x => new CheckoutSalaryAid(x.Amount, x.SalaryAidDateTimeGe, x.SalaryAidDateTimeFa, x.CalculationDateTimeGe, x.CalculationDateTimeFa, x.Id)).ToList(); - command.SalaryAidDeduction = salaryAids.Sum(x => x.Amount.MoneyToDouble()); - - var loanInstallments = _rollCallMandatoryRepository.LoanInstallmentForCheckout(command.EmployeeId, - command.WorkshopId, command.ContractStartGr, command.HasLeft ? DateTime.MaxValue : command.ContractEndGr) - .Select(x => - new CheckoutLoanInstallment(x.Amount, x.Month, x.Year, x.IsActive, x.RemainingAmount, x.LoanAmount, x.Id)).ToList(); + command.SalaryAidDeduction = salaryAids.Sum(x => x.Amount.MoneyToDouble()); - command.InstallmentDeduction = loanInstallments.Sum(x => x.AmountForMonth.MoneyToDouble()); + var loanInstallments = _rollCallMandatoryRepository.LoanInstallmentForCheckout(command.EmployeeId, + command.WorkshopId, command.ContractStartGr, command.HasLeft ? DateTime.MaxValue : command.ContractEndGr) + .Select(x => + new CheckoutLoanInstallment(x.Amount, x.Month, x.Year, x.IsActive, x.RemainingAmount, x.LoanAmount, x.Id)).ToList(); - - - - var firstDayOfMonth = $"{command.ContractStart.Substring(0, 8)}01".ToGeorgianDateTime(); - var firstDayOfCurrentMonth = new DateTime(syear, smonth, 1, new PersianCalendar()); - - LeaveSearchModel sickLeaveSearch = new LeaveSearchModel() - { - EmployeeId = command.EmployeeId, - WorkshopId = command.WorkshopId, - StartLeaveGr = command.ContractStartGr, - EndLeaveGr = command.ContractEndGr, - IsAccepted = true, - }; - var leaves = _leaveApplication.search(sickLeaveSearch); - - firstDayOfMonth.AddMonthsFa(1, out var lastDayOfCurrentMonth); - - lastDayOfCurrentMonth = lastDayOfCurrentMonth.AddDays(-1); - - int dateRange = (int)(lastDayOfCurrentMonth - firstDayOfCurrentMonth).TotalDays + 1; - - var holidays = _holidayItemApplication.Search(new HolidayItemSearchModel() - { - HolidayYear = command.ContractStartGr.ToFarsiYear() - }); - //all the dates from start to end, to be compared with present days to get absent dates - var completeDaysList = Enumerable.Range(0, dateRange).Select(offset => firstDayOfCurrentMonth.AddDays(offset).Date).ToList(); - - var absentRecords = completeDaysList - .ExceptBy(command.GroupedRollCalls.Select(x => x.CreationDate.Date), y => y.Date) - .Select(x => - { - var leave = leaves.FirstOrDefault(y => - y.EmployeeId == command.EmployeeId && y.EndLeaveGr.Date >= x.Date && y.StartLeaveGr.Date <= x.Date); - var isHoliday = holidays.Any(y => y.HolidaydateGr == x.Date); - var isFriday = x.Date.DayOfWeek == DayOfWeek.Friday; - var isNormalWorkingDay = isHoliday == false && isFriday == false; - return new CheckoutDailyRollCallViewModel() - { - StartDate1 = null, - EndDate1 = null, - DateTimeGr = x.Date, - DayOfWeek = x.Date.DayOfWeek.ToString(), - RollCallDateFa = x.Date.ToFarsi(), - LeaveType = leave != null ? leave.LeaveType : "", - IsAbsent = leave == null && isNormalWorkingDay - }; - }); - - var presentDays = command.GroupedRollCalls.Select(x => - { - - var orderedRollcalls = x.ShiftList.OrderBy(y => y.Start); - - var rollCallTimeSpanPerDay = x.SumOneDaySpan; - TimeSpan breakTimePerDay = x.BreakTime; - - return new CheckoutDailyRollCallViewModel() - { - StartDate1 = orderedRollcalls.FirstOrDefault().Start.ToString("HH:mm"), - EndDate1 = orderedRollcalls.FirstOrDefault().EndWithOutResTime.ToString("HH:mm"), - - StartDate2 = orderedRollcalls.Skip(1).FirstOrDefault()?.Start.ToString("HH:mm") ?? "", - EndDate2 = orderedRollcalls.Skip(1).FirstOrDefault()?.EndWithOutResTime.ToString("HH:mm") ?? "", - - TotalhourseSpan = rollCallTimeSpanPerDay, - - BreakTimeTimeSpan = breakTimePerDay, - - DayOfWeek = x.CreationDate.DayOfWeek.DayOfWeeKToPersian(), - RollCallDateFa = x.CreationDate.Date.ToFarsi(), - DateTimeGr = x.CreationDate.Date, - IsSliced = x.ShiftList.Count() > 2, - IsAbsent = false - }; - }); - - - presentDays = presentDays.Select(x => new CheckoutDailyRollCallViewModel - { - StartDate1 = x.StartDate1, - EndDate1 = x.EndDate1, - EndDate2 = x.EndDate2, - StartDate2 = x.StartDate2, - TotalWorkingHours = $"{(int)(x.TotalhourseSpan.TotalHours)}:{x.TotalhourseSpan.Minutes:00}", - BreakTimeString = $"{(int)(x.BreakTimeTimeSpan.TotalHours)}:{x.BreakTimeTimeSpan.Minutes:00}", - TotalhourseSpan = x.TotalhourseSpan, - BreakTimeTimeSpan = x.BreakTimeTimeSpan, - DayOfWeek = x.DayOfWeek, - RollCallDateFa = x.RollCallDateFa, - DateTimeGr = x.DateTimeGr, - IsSliced = x.IsSliced, - IsAbsent = false - }); - - var result = presentDays.Concat(absentRecords).OrderBy(x => x.DateTimeGr).ToList(); - result.ForEach(x => - { - x.IsHoliday = holidays.Any(y => x.DateTimeGr.Date == y.HolidaydateGr.Date); - x.IsFriday = x.DateTimeGr.DayOfWeek == DayOfWeek.Friday; - }); - - var checkoutRollCallDays = result.Select(x => new CheckoutRollCallDay(x.DateTimeGr, - x.StartDate1, x.EndDate1, x.StartDate2, x.EndDate2, - x.BreakTimeTimeSpan, x.IsSliced, x.TotalhourseSpan, x.IsAbsent, x.IsFriday, x.IsHoliday, x.LeaveType)) - .ToList(); - - - double mandatoryHours = _mandatoryHoursApplication.GetMandatoryHoursByYearAndMonth(syear, smonth); - int mandatoryWholeHours = (int)mandatoryHours; - int mandatoryMinutes = (int)((mandatoryHours - mandatoryWholeHours) * 60); - - var totalMandatoryHours = TimeSpan.FromHours(mandatoryWholeHours).Add(TimeSpan.FromMinutes(mandatoryMinutes)); - var checkoutRollCall = new CheckoutRollCall(totalMandatoryHours, command.TotalPresentTimeSpan, command.TotalBreakTimeSpan, - command.TotalWorkingTimeSpan, command.TotalPaidLeave, command.TotalSickLeave, checkoutRollCallDays); + command.InstallmentDeduction = loanInstallments.Sum(x => x.AmountForMonth.MoneyToDouble()); - var totalClaimsDouble = monthlyWage + bacicYears + consumableItem + housingAllowance + marriedAllowance + command.OvertimePay + - command.NightworkPay + familyAllowance + bunos + years + command.LeavePay + command.FridayPay + command.ShiftPay; - var totalClaims = totalClaimsDouble.ToMoney(); - var totalDeductionDouble = insuranceDeduction + command.AbsenceDeduction + command.InstallmentDeduction + command.SalaryAidDeduction; - var totalDeductions = totalDeductionDouble.ToMoney(); - var totalPayment = totalClaimsDouble - totalDeductionDouble; + var firstDayOfMonth = $"{command.ContractStart.Substring(0, 8)}01".ToGeorgianDateTime(); + var firstDayOfCurrentMonth = new DateTime(syear, smonth, 1, new PersianCalendar()); - if (_checkoutRepository.Exists(x => - x.Month == command.Month && x.Year == command.Year && x.ContractNo == command.ContractNo)) - { - operation.Failed("امکان ثبت رکورد تکراری وجود ندارد"); - } - else - { - if (string.IsNullOrWhiteSpace(command.Signature)) - { - command.Signature = "0"; - } - + LeaveSearchModel sickLeaveSearch = new LeaveSearchModel() + { + EmployeeId = command.EmployeeId, + WorkshopId = command.WorkshopId, + StartLeaveGr = command.ContractStartGr, + EndLeaveGr = command.ContractEndGr, + IsAccepted = true, + }; + var leaves = _leaveApplication.search(sickLeaveSearch); - var checkout = new Checkout(command.EmployeeFullName, command.FathersName, command.NationalCode - , command.DateOfBirth, command.EmployeeId, command.WorkshopName, command.WorkshopId, command.ContractNo, command.ContractStartGr, command.ContractEndGr, month, year, - command.ContractId, command.WorkingHoursId, monthlyWage, bacicYears, consumableItem, housingAllowance - , command.OvertimePay, command.NightworkPay, command.FridayPay, 0, command.ShiftPay, familyAllowance, bunos, years, command.LeavePay, insuranceDeduction, 0, command.InstallmentDeduction, command.SalaryAidDeduction, command.AbsenceDeduction, sumOfWorkingDays, - command.ArchiveCode, command.PersonnelCode, totalClaims, totalDeductions, totalPayment, command.Signature, marriedAllowance, command.LeaveCheckout, command.CreditLeaves, command.AbsencePeriod, command.AverageHoursPerDay, command.HasRollCall, command.OverTimeWorkValue, command.OverNightWorkValue - , command.FridayWorkValue, command.RotatingShiftValue, command.AbsenceValue, command.TotalDayOfLeaveCompute, command.TotalDayOfYearsCompute, command.TotalDayOfBunosesCompute, - loanInstallments, salaryAids,checkoutRollCall,command.EmployeeMandatoryHours, hasInsuranceShareTheSameAsList); + firstDayOfMonth.AddMonthsFa(1, out var lastDayOfCurrentMonth); - _checkoutRepository.CreateCkeckout(checkout).GetAwaiter().GetResult(); - //_checkoutRepository.SaveChanges(); + lastDayOfCurrentMonth = lastDayOfCurrentMonth.AddDays(-1); - //var employeeFullName = new SqlParameter("@EmployeeFullName", SqlDbType.NVarChar, 50); - //employeeFullName.Value = command.EmployeeFullName; - //var fathersName = new SqlParameter("@FathersName", SqlDbType.NVarChar, 20); - //fathersName.Value = command.EmployeeFullName; + int dateRange = (int)(lastDayOfCurrentMonth - firstDayOfCurrentMonth).TotalDays + 1; - } + var holidays = _holidayItemApplication.Search(new HolidayItemSearchModel() + { + HolidayYear = command.ContractStartGr.ToFarsiYear() + }); + //all the dates from start to end, to be compared with present days to get absent dates + var completeDaysList = Enumerable.Range(0, dateRange).Select(offset => firstDayOfCurrentMonth.AddDays(offset).Date).ToList(); + + var absentRecords = completeDaysList + .ExceptBy(command.GroupedRollCalls.Select(x => x.CreationDate.Date), y => y.Date) + .Select(x => + { + var leave = leaves.FirstOrDefault(y => + y.EmployeeId == command.EmployeeId && y.EndLeaveGr.Date >= x.Date && y.StartLeaveGr.Date <= x.Date); + var isHoliday = holidays.Any(y => y.HolidaydateGr == x.Date); + var isFriday = x.Date.DayOfWeek == DayOfWeek.Friday; + var isNormalWorkingDay = isHoliday == false && isFriday == false; + return new CheckoutDailyRollCallViewModel() + { + StartDate1 = null, + EndDate1 = null, + DateTimeGr = x.Date, + DayOfWeek = x.Date.DayOfWeek.ToString(), + RollCallDateFa = x.Date.ToFarsi(), + LeaveType = leave != null ? leave.LeaveType : "", + IsAbsent = leave == null && isNormalWorkingDay + }; + }); + + var presentDays = command.GroupedRollCalls.Select(x => + { + + var orderedRollcalls = x.ShiftList.OrderBy(y => y.Start); + + var rollCallTimeSpanPerDay = x.SumOneDaySpan; + TimeSpan breakTimePerDay = x.BreakTime; + + return new CheckoutDailyRollCallViewModel() + { + StartDate1 = orderedRollcalls.FirstOrDefault().Start.ToString("HH:mm"), + EndDate1 = orderedRollcalls.FirstOrDefault().EndWithOutResTime.ToString("HH:mm"), + + StartDate2 = orderedRollcalls.Skip(1).FirstOrDefault()?.Start.ToString("HH:mm") ?? "", + EndDate2 = orderedRollcalls.Skip(1).FirstOrDefault()?.EndWithOutResTime.ToString("HH:mm") ?? "", + + TotalhourseSpan = rollCallTimeSpanPerDay, + + BreakTimeTimeSpan = breakTimePerDay, + + DayOfWeek = x.CreationDate.DayOfWeek.DayOfWeeKToPersian(), + RollCallDateFa = x.CreationDate.Date.ToFarsi(), + DateTimeGr = x.CreationDate.Date, + IsSliced = x.ShiftList.Count() > 2, + IsAbsent = false + }; + }); - } + presentDays = presentDays.Select(x => new CheckoutDailyRollCallViewModel + { + StartDate1 = x.StartDate1, + EndDate1 = x.EndDate1, + EndDate2 = x.EndDate2, + StartDate2 = x.StartDate2, + TotalWorkingHours = $"{(int)(x.TotalhourseSpan.TotalHours)}:{x.TotalhourseSpan.Minutes:00}", + BreakTimeString = $"{(int)(x.BreakTimeTimeSpan.TotalHours)}:{x.BreakTimeTimeSpan.Minutes:00}", + TotalhourseSpan = x.TotalhourseSpan, + BreakTimeTimeSpan = x.BreakTimeTimeSpan, + DayOfWeek = x.DayOfWeek, + RollCallDateFa = x.RollCallDateFa, + DateTimeGr = x.DateTimeGr, + IsSliced = x.IsSliced, + IsAbsent = false + }); - public OperationResult Edit(EditCheckout command) - { - throw new NotImplementedException(); - } + var result = presentDays.Concat(absentRecords).OrderBy(x => x.DateTimeGr).ToList(); + result.ForEach(x => + { + x.IsHoliday = holidays.Any(y => x.DateTimeGr.Date == y.HolidaydateGr.Date); + x.IsFriday = x.DateTimeGr.DayOfWeek == DayOfWeek.Friday; + }); - public EditCheckout GetDetails(long id) - { - return _checkoutRepository.GetDetails(id); - } + var checkoutRollCallDays = result.Select(x => new CheckoutRollCallDay(x.DateTimeGr, + x.StartDate1, x.EndDate1, x.StartDate2, x.EndDate2, + x.BreakTimeTimeSpan, x.IsSliced, x.TotalhourseSpan, x.IsAbsent, x.IsFriday, x.IsHoliday, x.LeaveType)) + .ToList(); - public async Task GetContractResultToCreateCheckout(long workshopId, long employeeId, string year, string month, - string contractStart, string contractEnd) - { - return await _checkoutRepository.GetContractResultToCreateCheckout(workshopId, employeeId, year, month, contractStart, - contractEnd); - } + double mandatoryHours = _mandatoryHoursApplication.GetMandatoryHoursByYearAndMonth(syear, smonth); + int mandatoryWholeHours = (int)mandatoryHours; + int mandatoryMinutes = (int)((mandatoryHours - mandatoryWholeHours) * 60); + + var totalMandatoryHours = TimeSpan.FromHours(mandatoryWholeHours).Add(TimeSpan.FromMinutes(mandatoryMinutes)); + var checkoutRollCall = new CheckoutRollCall(totalMandatoryHours, command.TotalPresentTimeSpan, command.TotalBreakTimeSpan, + command.TotalWorkingTimeSpan, command.TotalPaidLeave, command.TotalSickLeave, checkoutRollCallDays); + + + + + var totalClaimsDouble = monthlyWage + bacicYears + consumableItem + housingAllowance + marriedAllowance + command.OvertimePay + + command.NightworkPay + familyAllowance + bunos + years + command.LeavePay + command.FridayPay + command.ShiftPay; + var totalClaims = totalClaimsDouble.ToMoney(); + var totalDeductionDouble = insuranceDeduction + command.AbsenceDeduction + command.InstallmentDeduction + command.SalaryAidDeduction; + var totalDeductions = totalDeductionDouble.ToMoney(); + var totalPayment = totalClaimsDouble - totalDeductionDouble; + + if (_checkoutRepository.Exists(x => + x.Month == command.Month && x.Year == command.Year && x.ContractNo == command.ContractNo)) + { + operation.Failed("امکان ثبت رکورد تکراری وجود ندارد"); + } + else + { + if (string.IsNullOrWhiteSpace(command.Signature)) + { + command.Signature = "0"; + } + + + var checkout = new Checkout(command.EmployeeFullName, command.FathersName, command.NationalCode + , command.DateOfBirth, command.EmployeeId, command.WorkshopName, command.WorkshopId, command.ContractNo, command.ContractStartGr, command.ContractEndGr, month, year, + command.ContractId, command.WorkingHoursId, monthlyWage, bacicYears, consumableItem, housingAllowance + , command.OvertimePay, command.NightworkPay, command.FridayPay, 0, command.ShiftPay, familyAllowance, bunos, years, command.LeavePay, insuranceDeduction, 0, command.InstallmentDeduction, command.SalaryAidDeduction, command.AbsenceDeduction, sumOfWorkingDays, + command.ArchiveCode, command.PersonnelCode, totalClaims, totalDeductions, totalPayment, command.Signature, marriedAllowance, command.LeaveCheckout, command.CreditLeaves, command.AbsencePeriod, command.AverageHoursPerDay, command.HasRollCall, command.OverTimeWorkValue, command.OverNightWorkValue + , command.FridayWorkValue, command.RotatingShiftValue, command.AbsenceValue, command.TotalDayOfLeaveCompute, command.TotalDayOfYearsCompute, command.TotalDayOfBunosesCompute, + loanInstallments, salaryAids, checkoutRollCall, command.EmployeeMandatoryHours, hasInsuranceShareTheSameAsList); + + _checkoutRepository.CreateCkeckout(checkout).GetAwaiter().GetResult(); + //_checkoutRepository.SaveChanges(); + + //var employeeFullName = new SqlParameter("@EmployeeFullName", SqlDbType.NVarChar, 50); + //employeeFullName.Value = command.EmployeeFullName; + //var fathersName = new SqlParameter("@FathersName", SqlDbType.NVarChar, 20); + //fathersName.Value = command.EmployeeFullName; + + } + + + } + + public OperationResult Edit(EditCheckout command) + { + throw new NotImplementedException(); + } + + public EditCheckout GetDetails(long id) + { + return _checkoutRepository.GetDetails(id); + } + + public async Task GetContractResultToCreateCheckout(long workshopId, long employeeId, string year, string month, + string contractStart, string contractEnd) + { + return await _checkoutRepository.GetContractResultToCreateCheckout(workshopId, employeeId, year, month, contractStart, + contractEnd); + + } public Task> SearchCheckoutOptimized(CheckoutSearchModel searchModel) { @@ -440,32 +441,32 @@ public class CheckoutApplication : ICheckoutApplication var watch = System.Diagnostics.Stopwatch.StartNew(); watch.Start(); var result = new List(); - var query = await _checkoutRepository.SearchForMainCheckout(searchModel); - query = query.Select(x => new CheckoutViewModel() - { - Id = x.Id, - EmployeeFullName = x.EmployeeFullName, - ContractStart = x.ContractStart, - ContractEnd = x.ContractEnd, - ContractStartGr = x.ContractStartGr, - ContractEndGr = x.ContractEndGr, - PersonnelCode = x.PersonnelCode, - PersonnelCodeInt = x.PersonnelCodeInt, - ArchiveCode = x.ArchiveCode, - SumOfWorkingDays = x.SumOfWorkingDays, - WorkshopName = x.WorkshopName, - Month = x.Month, - Year = x.Year, - ContractNo = x.ContractNo, - ContractId = x.ContractId, - WorkshopId = x.WorkshopId, - EmployeeId = x.EmployeeId, - IsActiveString = x.IsActiveString, - Signature = x.Signature, - CreationDate = x.CreationDate, - EmployerName = _employerRepository.GetEmployerByWorkshopId(x.WorkshopId).FirstOrDefault()?.EmployerFullName, - IsBlockCantracingParty = _employerRepository.GetEmployerByWorkshopId(x.WorkshopId).FirstOrDefault()?.IsBlockContractingParty, - }).ToList(); + var query = await _checkoutRepository.SearchForMainCheckout(searchModel); + query = query.Select(x => new CheckoutViewModel() + { + Id = x.Id, + EmployeeFullName = x.EmployeeFullName, + ContractStart = x.ContractStart, + ContractEnd = x.ContractEnd, + ContractStartGr = x.ContractStartGr, + ContractEndGr = x.ContractEndGr, + PersonnelCode = x.PersonnelCode, + PersonnelCodeInt = x.PersonnelCodeInt, + ArchiveCode = x.ArchiveCode, + SumOfWorkingDays = x.SumOfWorkingDays, + WorkshopName = x.WorkshopName, + Month = x.Month, + Year = x.Year, + ContractNo = x.ContractNo, + ContractId = x.ContractId, + WorkshopId = x.WorkshopId, + EmployeeId = x.EmployeeId, + IsActiveString = x.IsActiveString, + Signature = x.Signature, + CreationDate = x.CreationDate, + EmployerName = _employerRepository.GetEmployerByWorkshopId(x.WorkshopId).FirstOrDefault()?.EmployerFullName, + IsBlockCantracingParty = _employerRepository.GetEmployerByWorkshopId(x.WorkshopId).FirstOrDefault()?.IsBlockContractingParty, + }).ToList(); //foreach (var items in query) //{ // var s = _employerRepository.GetEmployerByWorkshopId(items.WorkshopId); @@ -483,251 +484,300 @@ public class CheckoutApplication : ICheckoutApplication Console.WriteLine("old : " + watch.Elapsed); return query; - } - - public List SimpleSearch(CheckoutSearchModel searchModel) - { - return _checkoutRepository.SimpleSearch(searchModel); - } - - public List PrintAll(List id) - { - var result = _checkoutRepository.PrintAll(id); - var oneRecord = result.FirstOrDefault(); - if (oneRecord == null) - return new(); - result.ForEach(x => - { - - - int yearFa; - int monthFa; - try - { - yearFa = int.Parse(oneRecord.Year); - monthFa = oneRecord.Month.ToMonthByStringValue(); - } - catch (Exception e) - { - return; - } - double mandatoryHours = _mandatoryHoursApplication.GetMandatoryHoursByYearAndMonth(yearFa, monthFa); - int mandatoryWholeHours = (int)mandatoryHours; - int mandatoryMinutes = (int)((mandatoryHours - mandatoryWholeHours) * 60); - var totalWorking = new TimeSpan(x.MonthlyRollCall.Sum(y => y.TotalhourseSpan.Ticks)); - var totalBreakTime = new TimeSpan(x.MonthlyRollCall.Sum(y => y.BreakTimeTimeSpan.Ticks)); - TimeSpan totalPresent = totalWorking + totalBreakTime; - if (x.CheckoutRollCall == null) - { - if (x.HasRollCall) - { - totalWorking = new TimeSpan(x.MonthlyRollCall.Sum(x => x.TotalhourseSpan.Ticks)) - - x.TotalHourlyLeave; - totalBreakTime = new TimeSpan(x.MonthlyRollCall.Sum(x => x.BreakTimeTimeSpan.Ticks)); - totalPresent = totalWorking + totalBreakTime; - } - else - { - totalBreakTime = new TimeSpan(x.MonthlyRollCall.Sum(x => x.BreakTimeTimeSpan.Ticks)); - totalPresent = new TimeSpan(x.MonthlyRollCall.Sum(x => x.TotalhourseSpan.Ticks)); - totalWorking = totalPresent - totalBreakTime; - } - - x.TotalWorkingTimeStr = - Tools.ToFarsiHoursAndMinutes((int)totalWorking.TotalHours, totalWorking.Minutes, "-"); - x.TotalBreakTimeStr = - Tools.ToFarsiHoursAndMinutes((int)totalBreakTime.TotalHours, totalBreakTime.Minutes, "-"); - x.TotalPresentTimeStr = - Tools.ToFarsiHoursAndMinutes((int)totalPresent.TotalHours, totalPresent.Minutes, "-"); - x.TotalMandatoryTimeStr = Tools.ToFarsiHoursAndMinutes(mandatoryWholeHours, mandatoryMinutes, "-"); - - } - }); - - return result; - } - - public CheckoutViewModel PrintOne(long id) - { - var result = _checkoutRepository.PrintOne(id); - - int yearFa; - int monthFa; - try - { - yearFa = int.Parse(result.Year); - monthFa = result.Month.ToMonthByStringValue(); - } - catch (Exception e) - { - return new(); - } - double mandatoryHours = _mandatoryHoursApplication.GetMandatoryHoursByYearAndMonth(yearFa, monthFa); - int mandatoryWholeHours = (int)mandatoryHours; - int mandatoryMinutes = (int)((mandatoryHours - mandatoryWholeHours) * 60); - TimeSpan totalWorking; - TimeSpan totalBreakTime; - TimeSpan totalPresent; - TimeSpan totalHoursLeave; - if (result.HasRollCall) - { - totalWorking = new TimeSpan(result.MonthlyRollCall.Sum(x => x.TotalhourseSpan.Ticks)) - result.TotalHourlyLeave; - totalBreakTime = new TimeSpan(result.MonthlyRollCall.Sum(x => x.BreakTimeTimeSpan.Ticks)); - totalPresent = totalWorking + totalBreakTime; - } - else - { - totalBreakTime = new TimeSpan(result.MonthlyRollCall.Sum(x => x.BreakTimeTimeSpan.Ticks)); - totalPresent = new TimeSpan(result.MonthlyRollCall.Sum(x => x.TotalhourseSpan.Ticks)); - totalWorking = totalPresent - totalBreakTime; - } - - result.TotalWorkingTimeStr = Tools.ToFarsiHoursAndMinutes((int)totalWorking.TotalHours, totalWorking.Minutes, "-"); - result.TotalBreakTimeStr = Tools.ToFarsiHoursAndMinutes((int)totalBreakTime.TotalHours, totalBreakTime.Minutes, "-"); - result.TotalPresentTimeStr = Tools.ToFarsiHoursAndMinutes((int)totalPresent.TotalHours, totalPresent.Minutes, "-"); - result.TotalMandatoryTimeStr = Tools.ToFarsiHoursAndMinutes(mandatoryWholeHours, mandatoryMinutes, "-"); - - return result; - } - - public CheckoutLeavePrintViewModel LeavePrint(long id) - { - return _checkoutRepository.PrintLeave(id); - } - - public OperationResult Sign(long id) - { - var opration = new OperationResult(); - var contract = _checkoutRepository.Get(id); - if (contract == null) - return opration.Failed("رکورد مورد نظر یافت نشد"); - - contract.Sign(); - - - _checkoutRepository.SaveChanges(); - opration.IsSuccedded = true; - return opration.Succcedded(); - } - - public OperationResult UnSign(long id) - { - var opration = new OperationResult(); - var contract = _checkoutRepository.Get(id); - if (contract == null) - return opration.Failed("رکورد مورد نظر یافت نشد"); - - contract.UnSign(); - - - _checkoutRepository.SaveChanges(); - opration.IsSuccedded = true; - return opration.Succcedded(); - } - - public OperationResult Active(long id) - { - var opration = new OperationResult(); - var contract = _checkoutRepository.Get(id); - if (contract == null) - return opration.Failed("رکورد مورد نظر یافت نشد"); - - contract.Active(); - - _checkoutRepository.SaveChanges(); - return opration.Succcedded(); - } - - public OperationResult DeActive(long id) - { - var opration = new OperationResult(); - var contract = _checkoutRepository.Get(id); - if (contract == null) - return opration.Failed("رکورد مورد نظر یافت نشد"); - - contract.DeActive(); - - - _checkoutRepository.SaveChanges(); - - return opration.Succcedded(); - } - - public OperationResult RemoveCheckout(long id) - { - return _checkoutRepository.RemoveCheckout(id); - } - - public OperationResult CustomSet(long id, double rewardPay, double salaryAidDeduction) - { - var opration = new OperationResult(); - var checkout = _checkoutRepository.Get(id); - var totalClaimsDouble = checkout.TotalClaims.MoneyToDouble(); - var totalDeductionsDouble = checkout.TotalDeductions.MoneyToDouble(); - totalClaimsDouble = (double)(totalClaimsDouble - checkout.RewardPay); - totalDeductionsDouble = totalDeductionsDouble - checkout.SalaryAidDeduction; - - var totalClaims = totalClaimsDouble + rewardPay; - var totalDeductions = totalDeductionsDouble + salaryAidDeduction; - - - - var totalClaimsString = totalClaims.ToMoney(); - var totalDeductionsString = totalDeductions.ToMoney(); - var totalPayment = totalClaims - totalDeductions; - - checkout.CustomSet(rewardPay, salaryAidDeduction, totalClaimsString, totalDeductionsString, totalPayment); - - _checkoutRepository.SaveChanges(); - opration.IsSuccedded = true; - return opration.Succcedded(); - } - - #region Client - - public List SearchForClient(CheckoutSearchModel searchModel) - { - return _checkoutRepository.SearchForClient(searchModel); - } - - #endregion - #region NewChangeByHeydari - public List CheckHasSignature(List ids) - { - return _checkoutRepository.CheckHasSignature(ids); - } - public OperationResult DeleteAllCheckouts(List ids) - { - return _checkoutRepository.DeleteAllCheckouts(ids); - } - public OperationResult DeleteCheckout(long id) - { - return _checkoutRepository.DeleteCheckout(id); - } - public async Task> SearchForMainCheckout(CheckoutSearchModel searchModel) - { - return await _checkoutRepository.SearchForMainCheckout(searchModel); - } - #endregion - #region Pooya - - - public List<(long EmployeeId, DateTime CheckoutStart, DateTime CheckoutEnd)> GetLastCheckoutsByWorkshopIdForWorkFlow(long workshopId, DateTime start, DateTime end) - { - return _checkoutRepository.GetLastCheckoutsByWorkshopIdForWorkFlow(workshopId, start, end); - } - - public async Task> GetEmployeeSelectListByWorkshopId(long id) - { - return await _checkoutRepository.GetEmployeeSelectListByWorkshopId(id); } + public List SimpleSearch(CheckoutSearchModel searchModel) + { + return _checkoutRepository.SimpleSearch(searchModel); + } + + public List PrintAll(List id) + { + var result = _checkoutRepository.PrintAll(id); + var oneRecord = result.FirstOrDefault(); + if (oneRecord == null) + return new(); + result.ForEach(x => + { + + + int yearFa; + int monthFa; + try + { + yearFa = int.Parse(oneRecord.Year); + monthFa = oneRecord.Month.ToMonthByStringValue(); + } + catch (Exception e) + { + return; + } + double mandatoryHours = _mandatoryHoursApplication.GetMandatoryHoursByYearAndMonth(yearFa, monthFa); + int mandatoryWholeHours = (int)mandatoryHours; + int mandatoryMinutes = (int)((mandatoryHours - mandatoryWholeHours) * 60); + var totalWorking = new TimeSpan(x.MonthlyRollCall.Sum(y => y.TotalhourseSpan.Ticks)); + var totalBreakTime = new TimeSpan(x.MonthlyRollCall.Sum(y => y.BreakTimeTimeSpan.Ticks)); + TimeSpan totalPresent = totalWorking + totalBreakTime; + if (x.CheckoutRollCall == null) + { + if (x.HasRollCall) + { + totalWorking = new TimeSpan(x.MonthlyRollCall.Sum(x => x.TotalhourseSpan.Ticks)) - + x.TotalHourlyLeave; + totalBreakTime = new TimeSpan(x.MonthlyRollCall.Sum(x => x.BreakTimeTimeSpan.Ticks)); + totalPresent = totalWorking + totalBreakTime; + } + else + { + totalBreakTime = new TimeSpan(x.MonthlyRollCall.Sum(x => x.BreakTimeTimeSpan.Ticks)); + totalPresent = new TimeSpan(x.MonthlyRollCall.Sum(x => x.TotalhourseSpan.Ticks)); + totalWorking = totalPresent - totalBreakTime; + } + + x.TotalWorkingTimeStr = + Tools.ToFarsiHoursAndMinutes((int)totalWorking.TotalHours, totalWorking.Minutes, "-"); + x.TotalBreakTimeStr = + Tools.ToFarsiHoursAndMinutes((int)totalBreakTime.TotalHours, totalBreakTime.Minutes, "-"); + x.TotalPresentTimeStr = + Tools.ToFarsiHoursAndMinutes((int)totalPresent.TotalHours, totalPresent.Minutes, "-"); + x.TotalMandatoryTimeStr = Tools.ToFarsiHoursAndMinutes(mandatoryWholeHours, mandatoryMinutes, "-"); + + } + }); + + return result; + } + + public CheckoutViewModel PrintOne(long id) + { + var result = _checkoutRepository.PrintOne(id); + + int yearFa; + int monthFa; + try + { + yearFa = int.Parse(result.Year); + monthFa = result.Month.ToMonthByStringValue(); + } + catch (Exception e) + { + return new(); + } + double mandatoryHours = _mandatoryHoursApplication.GetMandatoryHoursByYearAndMonth(yearFa, monthFa); + int mandatoryWholeHours = (int)mandatoryHours; + int mandatoryMinutes = (int)((mandatoryHours - mandatoryWholeHours) * 60); + TimeSpan totalWorking; + TimeSpan totalBreakTime; + TimeSpan totalPresent; + TimeSpan totalHoursLeave; + if (result.HasRollCall) + { + totalWorking = new TimeSpan(result.MonthlyRollCall.Sum(x => x.TotalhourseSpan.Ticks)) - result.TotalHourlyLeave; + totalBreakTime = new TimeSpan(result.MonthlyRollCall.Sum(x => x.BreakTimeTimeSpan.Ticks)); + totalPresent = totalWorking + totalBreakTime; + } + else + { + totalBreakTime = new TimeSpan(result.MonthlyRollCall.Sum(x => x.BreakTimeTimeSpan.Ticks)); + totalPresent = new TimeSpan(result.MonthlyRollCall.Sum(x => x.TotalhourseSpan.Ticks)); + totalWorking = totalPresent - totalBreakTime; + } + + result.TotalWorkingTimeStr = Tools.ToFarsiHoursAndMinutes((int)totalWorking.TotalHours, totalWorking.Minutes, "-"); + result.TotalBreakTimeStr = Tools.ToFarsiHoursAndMinutes((int)totalBreakTime.TotalHours, totalBreakTime.Minutes, "-"); + result.TotalPresentTimeStr = Tools.ToFarsiHoursAndMinutes((int)totalPresent.TotalHours, totalPresent.Minutes, "-"); + result.TotalMandatoryTimeStr = Tools.ToFarsiHoursAndMinutes(mandatoryWholeHours, mandatoryMinutes, "-"); + + return result; + } + + public CheckoutLeavePrintViewModel LeavePrint(long id) + { + return _checkoutRepository.PrintLeave(id); + } + + public OperationResult Sign(long id) + { + var opration = new OperationResult(); + var contract = _checkoutRepository.Get(id); + if (contract == null) + return opration.Failed("رکورد مورد نظر یافت نشد"); + + contract.Sign(); + + + _checkoutRepository.SaveChanges(); + opration.IsSuccedded = true; + return opration.Succcedded(); + } + + public OperationResult UnSign(long id) + { + var opration = new OperationResult(); + var contract = _checkoutRepository.Get(id); + if (contract == null) + return opration.Failed("رکورد مورد نظر یافت نشد"); + + contract.UnSign(); + + + _checkoutRepository.SaveChanges(); + opration.IsSuccedded = true; + return opration.Succcedded(); + } + + public OperationResult Active(long id) + { + var opration = new OperationResult(); + var contract = _checkoutRepository.Get(id); + if (contract == null) + return opration.Failed("رکورد مورد نظر یافت نشد"); + + contract.Active(); + + _checkoutRepository.SaveChanges(); + return opration.Succcedded(); + } + + public OperationResult DeActive(long id) + { + var opration = new OperationResult(); + var contract = _checkoutRepository.Get(id); + if (contract == null) + return opration.Failed("رکورد مورد نظر یافت نشد"); + + contract.DeActive(); + + + _checkoutRepository.SaveChanges(); + + return opration.Succcedded(); + } + + public OperationResult RemoveCheckout(long id) + { + return _checkoutRepository.RemoveCheckout(id); + } + + public OperationResult CustomSet(long id, double rewardPay, double salaryAidDeduction) + { + var opration = new OperationResult(); + var checkout = _checkoutRepository.Get(id); + var totalClaimsDouble = checkout.TotalClaims.MoneyToDouble(); + var totalDeductionsDouble = checkout.TotalDeductions.MoneyToDouble(); + totalClaimsDouble = (double)(totalClaimsDouble - checkout.RewardPay); + totalDeductionsDouble = totalDeductionsDouble - checkout.SalaryAidDeduction; + + var totalClaims = totalClaimsDouble + rewardPay; + var totalDeductions = totalDeductionsDouble + salaryAidDeduction; + + + + var totalClaimsString = totalClaims.ToMoney(); + var totalDeductionsString = totalDeductions.ToMoney(); + var totalPayment = totalClaims - totalDeductions; + + checkout.CustomSet(rewardPay, salaryAidDeduction, totalClaimsString, totalDeductionsString, totalPayment); + + _checkoutRepository.SaveChanges(); + opration.IsSuccedded = true; + return opration.Succcedded(); + } + + #region Client + + public List SearchForClient(CheckoutSearchModel searchModel) + { + return _checkoutRepository.SearchForClient(searchModel); + } + + #endregion + #region NewChangeByHeydari + public List CheckHasSignature(List ids) + { + return _checkoutRepository.CheckHasSignature(ids); + } + public OperationResult DeleteAllCheckouts(List ids) + { + return _checkoutRepository.DeleteAllCheckouts(ids); + } + public OperationResult DeleteCheckout(long id) + { + return _checkoutRepository.DeleteCheckout(id); + } + public async Task> SearchForMainCheckout(CheckoutSearchModel searchModel) + { + return await _checkoutRepository.SearchForMainCheckout(searchModel); + } + #endregion + #region Pooya + + + public List<(long EmployeeId, DateTime CheckoutStart, DateTime CheckoutEnd)> GetLastCheckoutsByWorkshopIdForWorkFlow(long workshopId, DateTime start, DateTime end) + { + return _checkoutRepository.GetLastCheckoutsByWorkshopIdForWorkFlow(workshopId, start, end); + } + + + #endregion #region ForApi + #region CreateWorkshop + + /// + /// دریافت سلکت لیست پرسنل کارگاه + /// + /// + /// + public async Task> GetEmployeeSelectListByWorkshopId(long id) + { + return await _checkoutRepository.GetEmployeeSelectListByWorkshopId(id); + } + + /// + /// دریافت لیست قراردادها برای ایجاد فیش حقوقی + /// + /// + /// + /// + /// + /// + public async Task>> GetContractToCreateCheckout(long workshopId, string year, string month, long employeeId) + { + var op = new OperationResult>(); + if (workshopId < 1) + return op.Failed("کارگاه را انتخاب کنید"); + if (string.IsNullOrWhiteSpace(year) || string.IsNullOrWhiteSpace(month)) + return op.Failed("سال و ماه را انتخاب کنید"); + var result = await GetContractResultToCreateCheckout(workshopId, employeeId, year, month, null, + null); + if(result.CreateCheckoutList.Count == 0) + return op.Failed("موردی یافت نشد"); + var finalResult = result.CreateCheckoutList.Select(x => new ContractsListToCreateCheckoutDto + { + Id = x.Id, + ContractNo = x.ContractNo, + WorkshopName = x.WorkshopName, + EmployeeName = x.EmployeeName, + ContractStart = x.ContractStart, + ContractEnd = x.ContractEnd, + PersonnelCode = x.PersonnelCode, + Description = x.Description, + LeftWorkDate = x.LeftWorkDate, + CreateCheckoutStatus = x.HasCheckout ? CreateCheckoutStatus.HasCheckout : x.Extension == false ? CreateCheckoutStatus.NotValid : CreateCheckoutStatus.ReadyToCreate + + }).ToList(); + + return op.Succcedded(finalResult); + } + + #endregion + + public async Task> GetList(CheckoutSearchModelDto searchModel) { return await _checkoutRepository.GetList(searchModel); @@ -742,8 +792,8 @@ public class CheckoutApplication : ICheckoutApplication var typeOfWorkingHours = ""; if (checkout.HasRollCall) { - result = await _rollCallMandatoryRepository.RotatingShiftReport(checkout.WorkshopId, checkout.EmployeeId, checkout.ContractStartGr, checkout.ContractEndGr, workingHours.ShiftWork, true, workingHours, false); - typeOfWorkingHours = "دارای حضورغیاب"; + result = await _rollCallMandatoryRepository.RotatingShiftReport(checkout.WorkshopId, checkout.EmployeeId, checkout.ContractStartGr, checkout.ContractEndGr, workingHours.ShiftWork, true, workingHours, false); + typeOfWorkingHours = "دارای حضورغیاب"; } else diff --git a/CompanyManagment.EFCore/Repository/CheckoutRepository.cs b/CompanyManagment.EFCore/Repository/CheckoutRepository.cs index 916e09bc..95cd3c8e 100644 --- a/CompanyManagment.EFCore/Repository/CheckoutRepository.cs +++ b/CompanyManagment.EFCore/Repository/CheckoutRepository.cs @@ -2734,22 +2734,42 @@ public class CheckoutRepository : RepositoryBase, ICheckoutRepos #region ForApi + ///ایجاد فیش + #region CreateCheckout + + + /// + /// دریافت سلکت لیست پرسنل کارگاه + /// + /// + /// public async Task> GetEmployeeSelectListByWorkshopId(long id) { - var employeesHasLeftworkData =_context.LeftWorkList.Where(x => x.WorkshopId == id).Select(x => x.EmployeeId); - var employees =await _context.Employees + var employeesHasLeftworkData = _context.LeftWorkList.Where(x => x.WorkshopId == id).Select(x => x.EmployeeId); + var employees = await _context.Employees .Where(x => employeesHasLeftworkData.Contains(x.id)) .Select(x => - new EmployeeSelectListDto() - { - Id = x.id, - EmployeeFullName = x.FullName - }) + new EmployeeSelectListDto() + { + Id = x.id, + EmployeeFullName = x.FullName + }) .AsNoTracking() .ToListAsync(); return employees; } + + + #endregion + + + + /// + /// دریافت لیست فیش حقوقی + /// + /// + /// public async Task> GetList(CheckoutSearchModelDto searchModel) { var acountID = _authHelper.CurrentAccountId(); @@ -3039,7 +3059,12 @@ public class CheckoutRepository : RepositoryBase, ICheckoutRepos }; } - + /// + /// پرینت فیش حقوقی + /// Api + /// + /// + /// public async Task> CheckoutPrint(List ids) { if (ids.Count == 0) diff --git a/ServiceHost/Areas/Admin/Controllers/CheckoutController.cs b/ServiceHost/Areas/Admin/Controllers/CheckoutController.cs index 0cf5f2a1..295d50b7 100644 --- a/ServiceHost/Areas/Admin/Controllers/CheckoutController.cs +++ b/ServiceHost/Areas/Admin/Controllers/CheckoutController.cs @@ -7,6 +7,7 @@ using CompanyManagment.App.Contracts.Workshop.DTOs; using Microsoft.AspNetCore.Mvc; using NuGet.Packaging.Signing; using ServiceHost.BaseControllers; +using WorkFlow.Application.Contracts.WorkFlow; namespace ServiceHost.Areas.Admin.Controllers; @@ -14,11 +15,13 @@ public class CheckoutController : AdminBaseController { private readonly ICheckoutApplication _checkoutApplication; private readonly IWorkshopApplication _workshopApplication; + private readonly IWorkFlowApplication _workFlowApplication; - public CheckoutController(ICheckoutApplication checkoutApplication, IWorkshopApplication workshopApplication) + public CheckoutController(ICheckoutApplication checkoutApplication, IWorkshopApplication workshopApplication, IWorkFlowApplication workFlowApplication) { _checkoutApplication = checkoutApplication; _workshopApplication = workshopApplication; + _workFlowApplication = workFlowApplication; } /// @@ -92,6 +95,32 @@ public class CheckoutController : AdminBaseController var result = await _checkoutApplication.GetEmployeeSelectListByWorkshopId(workshopId); return result; } + + + /// + /// دریافت لیست قراردادها برای ایجاد فیش حقوقی + /// + /// + /// + /// + /// + /// + [HttpGet("GetContractsToCreateCheckout")] + public async Task>> GetContractsToCreateCheckout(long workshopId, string year, string month, long employeeId) + { + + var result =await _checkoutApplication.GetContractToCreateCheckout(workshopId, year, month, employeeId); + if (!result.IsSuccedded) + return result; + + var hasWorkFlow =await _workFlowApplication.HasWorkFlow(workshopId, year, month); + + if (hasWorkFlow) + return new OperationResult>().Failed( + "این کارگاه به دلیل داشتن کارپوشه مجاز به ایجاد تصفیه حساب نمی باشد"); + return result; + + } #endregion } diff --git a/ServiceHost/Program.cs b/ServiceHost/Program.cs index 218871e3..98953155 100644 --- a/ServiceHost/Program.cs +++ b/ServiceHost/Program.cs @@ -386,17 +386,17 @@ if (builder.Environment.IsDevelopment()) { var logConfig = configuration .ReadFrom.Configuration(context.Configuration) - .ReadFrom.Services(services) - .Enrich.FromLogContext(); + .ReadFrom.Services(services); + - logConfig.WriteTo.File( - path: Path.Combine(logDirectory, "gozareshgir_log.txt"), - rollingInterval: RollingInterval.Day, - retainedFileCountLimit: 30, - shared: true, - outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level}] {Message}{NewLine}{Exception}" - ); + //logConfig.WriteTo.File( + // path: Path.Combine(logDirectory, "gozareshgir_log.txt"), + // rollingInterval: RollingInterval.Day, + // retainedFileCountLimit: 30, + // shared: true, + // outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level}] {Message}{NewLine}{Exception}" + //); }, writeToProviders: true); // این باعث میشه کنسول پیش‌فرض هم کار کنه } diff --git a/WorkFlow/Application/WorkFlow.Application.Contracts/WorkFlow/IWorkFlowApplication.cs b/WorkFlow/Application/WorkFlow.Application.Contracts/WorkFlow/IWorkFlowApplication.cs index e000f514..6ac9791c 100644 --- a/WorkFlow/Application/WorkFlow.Application.Contracts/WorkFlow/IWorkFlowApplication.cs +++ b/WorkFlow/Application/WorkFlow.Application.Contracts/WorkFlow/IWorkFlowApplication.cs @@ -73,4 +73,15 @@ public interface IWorkFlowApplication Task> GetEmployeesWithoutLunchBreak(long workshopId); Task> GetEmployeesWithoutGroup(long workshopId); + + #region ForApi + /// + /// در زمان ایجاد فیش کارپوشه کارگاه را چک میکند + /// + /// + /// + /// + /// + Task HasWorkFlow(long workshopId, string year, string month); + #endregion } \ No newline at end of file diff --git a/WorkFlow/Application/WorkFlow.Application/WorkFlowApplication.cs b/WorkFlow/Application/WorkFlow.Application/WorkFlowApplication.cs index d644bb5f..ac28f42f 100644 --- a/WorkFlow/Application/WorkFlow.Application/WorkFlowApplication.cs +++ b/WorkFlow/Application/WorkFlow.Application/WorkFlowApplication.cs @@ -781,5 +781,66 @@ public class WorkFlowApplication : IWorkFlowApplication return _customizedWorkshopSettingsACL.GetEmployeesWithoutGroup(workshopId); } + #region ForApi + + + public async Task HasWorkFlow(long workshopId, string year, string month) + { + var workshop = _workshopRepository.GetDetails(workshopId); + bool hasWorkFlow = false; + + var skipRollCallByWorkshopId = workshopId is 368 or 610; + if (workshop.HasRollCallFreeVip == "true" && !skipRollCallByWorkshopId) + { + DateTime startSreach; + DateTime endSearch; + + if (month == "0" && year == "0") + { + DateTime now = DateTime.Now; + string startStr = $"{now.ToFarsi().Substring(0, 8)}01"; + startSreach = startStr.ToGeorgianDateTime(); + endSearch = (startStr.FindeEndOfMonth()).ToGeorgianDateTime(); + } + else if (month == "0" && year != "0") + { + DateTime now = DateTime.Now; + + string startStr = $"{year}/{now.ToFarsi().Substring(5, 2)}/01"; + startSreach = startStr.ToGeorgianDateTime(); + endSearch = (startStr.FindeEndOfMonth()).ToGeorgianDateTime(); + } + else if (month != "0" && year == "0") + { + DateTime now = DateTime.Now; + + string startStr = $"{now.ToFarsi().Substring(0, 4)}/{month}/01"; + startSreach = startStr.ToGeorgianDateTime(); + endSearch = (startStr.FindeEndOfMonth()).ToGeorgianDateTime(); + } + else + { + string startStr = $"{year}/{month}/01"; + startSreach = startStr.ToGeorgianDateTime(); + endSearch = (startStr.FindeEndOfMonth()).ToGeorgianDateTime(); + } + + + DateTime lastMonthEnd = ($"{DateTime.Now.ToFarsi().Substring(0, 8)}01").ToGeorgianDateTime().AddDays(-1); + if (lastMonthEnd == endSearch) + { + var countWorkFlowCut = await CountCutByBgServiceLastMonth(workshopId); + var countWorkFlowAbsent = await CountAbsentRollCallLastMonth(workshopId); + var countWorkFlowLunchBreak = await CountEmployeesWithoutLunchBreakLastMonth(workshopId); + var countUndefinedRollCalls = await CountUndefinedLastMonth(workshopId); + + hasWorkFlow = countWorkFlowCut > 0 || countWorkFlowAbsent > 0 || countWorkFlowLunchBreak > 0 || + countUndefinedRollCalls > 0; + } + } + + return hasWorkFlow; + } + #endregion } \ No newline at end of file