using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Threading.Tasks; using _0_Framework.Application; using Company.Domain.CheckoutAgg; using Company.Domain.LeftWorkAgg; using Company.Domain.YearlySalaryAgg; using Company.Domain.empolyerAgg; using CompanyManagment.App.Contracts.Checkout; using CompanyManagment.App.Contracts.PersonalContractingParty; using CompanyManagment.App.Contracts.Leave; using CompanyManagment.App.Contracts.MandantoryHours; 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; public CheckoutApplication(ICheckoutRepository checkoutRepository, IYearlySalaryRepository yearlySalaryRepository, ILeftWorkRepository leftWorkRepository, IEmployerRepository employerRepository, IPersonalContractingPartyApp contractingPartyApp, ILeaveApplication leaveApplication, IMandatoryHoursApplication mandatoryHoursApplication) { _checkoutRepository = checkoutRepository; _yearlySalaryRepository = yearlySalaryRepository; _leftWorkRepository = leftWorkRepository; _employerRepository = employerRepository; _contractingPartyApp = contractingPartyApp; _leaveApplication = leaveApplication; _mandatoryHoursApplication = mandatoryHoursApplication; } [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 //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; // } // } //} #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 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); //دستمزد ماهانه var monthlyWage = MontlyYearsBunos.MontlyWage; //سنوات var years = command.YearsPay; //عیدی و پاداش var bunos = command.BonusesPay; //پایه سنوات var bacicYears = MontlyYearsBunos.BasicYears; var sumOfWorkingDays = MontlyYearsBunos.SumOfWorkingDay; if (command.friday > 0) { var fridayPercent = dayliWage * 40 / 100; //فوق العاده جمعه کاری command.FridayPay = fridayPercent * command.friday; } //حق بیمه سهم کارگر var insuranceDeduction = (monthlyWage + bacicYears + consumableItem + housingAllowance + marriedAllowance) * 7 / 100; if (command.OvertimePay > 0 && command.AbsenceDeduction>0) { if (command.AbsenceDeduction >= command.OvertimePay) { command.AbsenceDeduction = command.AbsenceDeduction - command.OvertimePay; command.OvertimePay = 0; } else { command.OvertimePay = command.OvertimePay - command.AbsenceDeduction; command.AbsenceDeduction = 0; } } 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; 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, 0, 0, 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); _checkoutRepository.CreateCkeckout(checkout); //_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> Search(CheckoutSearchModel searchModel) { 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(); //foreach (var items in query) //{ // var s = _employerRepository.GetEmployerByWorkshopId(items.WorkshopId); // if (s != null) // { // items.EmployerName = s.FirstOrDefault().EmployerFullName; // } // result.Add(items); // //var employeId = _context.WorkshopEmployers?.Where(x => x.WorkshopId == items.WorkshopId) // // .Select(x => x.EmployerId).FirstOrDefault(); // //var employerName = _context.Employers?.FirstOrDefault(x => x.id == employeId).FullName; // // = employerName; //} 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 => { if (x.HasRollCall) { 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)); var totalPresent = totalWorking + 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); if (result.HasRollCall) { 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); var totalWorking = new TimeSpan(result.MonthlyRollCall.Sum(x => x.TotalhourseSpan.Ticks)); var totalBreakTime = new TimeSpan(result.MonthlyRollCall.Sum(x => x.BreakTimeTimeSpan.Ticks)); var totalPresent = totalWorking + 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 }