using System.Collections.Generic; using System.Linq; using Company.Domain.SalaryAidAgg; using CompanyManagment.App.Contracts.SalaryAid; using _0_Framework.Application; using Company.Domain.CheckoutAgg; using CompanyManagment.App.Contracts.Checkout; using System; using System.Threading.Tasks; using System.Transactions; using Company.Domain.CustomizeCheckoutAgg; using Company.Domain.CustomizeCheckoutTempAgg; using Company.Domain.EmployeeAgg; using CompanyManagment.App.Contracts.CustomizeCheckout; using CompanyManagment.App.Contracts.Reward; using OfficeOpenXml.Drawing.Chart; using CompanyManagment.EFCore.Migrations; namespace CompanyManagment.Application; public class SalaryAidApplication : ISalaryAidApplication { private readonly ISalaryAidRepository _salaryAidRepository; private readonly ICustomizeCheckoutRepository _customizeCheckoutRepository; private readonly IEmployeeRepository _employeeRepository; private readonly ICustomizeCheckoutTempRepository _customizeCheckoutTempRepository; private readonly IAuthHelper _authHelper; private readonly ICustomizeCheckoutApplication _customizeCheckoutApplication; private readonly ICustomizeCheckoutTempApplication _customizeCheckoutTempApplication; private readonly ICheckoutRepository _checkoutRepository; public SalaryAidApplication(ISalaryAidRepository salaryAidRepository, ICustomizeCheckoutRepository customizeCheckoutRepository, IEmployeeRepository employeeRepository, ICustomizeCheckoutTempRepository customizeCheckoutTempRepository, IAuthHelper authHelper, ICustomizeCheckoutApplication customizeCheckoutApplication, ICustomizeCheckoutTempApplication customizeCheckoutTempApplication, ICheckoutRepository checkoutRepository) { _salaryAidRepository = salaryAidRepository; _customizeCheckoutRepository = customizeCheckoutRepository; _authHelper = authHelper; _customizeCheckoutApplication = customizeCheckoutApplication; _customizeCheckoutTempApplication = customizeCheckoutTempApplication; _checkoutRepository = checkoutRepository; _employeeRepository = employeeRepository; _customizeCheckoutTempRepository = customizeCheckoutTempRepository; } public List GetSearchList(SalaryAidSearchViewModel searchViewModel) { return _salaryAidRepository.GetSearchList(searchViewModel); } public EditSalaryAidViewModel GetDetails(long id) { return _salaryAidRepository.GetDetails(id); } public OperationResult Create(CreateSalaryAidViewModel command) { var op = new OperationResult(); if (!command.SalaryDateTime.TryToGeorgianDateTime(out var startDate)) { return op.Failed("تاریخ وارد شده نامعتبر است"); } var calculationDate = $"{command.CalculationYear:0000}/{command.CalculationMonth:00}/01"; if (!calculationDate.TryToGeorgianDateTime(out var calculationDateGr)) { return op.Failed("تاریخ محاسبه وارد شده نامعتبر است"); } if (startDate > DateTime.Now) { return op.Failed("تاریخ پرداخت مساعده می بایست تاریخ امروز یا قبل تر باشد"); } if (command.Amount.Length > 15) { return op.Failed("مبلغ وارد شده معتبر نیست"); } var month = Convert.ToInt32(command.CalculationMonth); var year = Convert.ToInt32(command.CalculationYear); _ = DateTime.Now.Date.AddMonthsFa(-1, out var oneMonthAgoGr); // if (oneMonthAgoGr > calculationDateGr) // { // var prevCheckouts = _customizeCheckoutRepository.ValidateExistsCheckouts(calculationDateGr, // oneMonthAgoGr, command.WorkshopId, command.EmployeeIds); // // if (prevCheckouts.CustomizeCheckout || prevCheckouts.CustomizeCheckoutTemp) // { // return op.Failed("شما نمیتوانید در تاریخ قبل از یک ماه گذشته که فیش صادر شده باشد مساعده دهید"); // } // } var existsCheckouts = _customizeCheckoutRepository.ValidateExistsCheckouts(calculationDateGr, calculationDateGr, command.WorkshopId, command.EmployeeIds); //if (existsCheckouts.Checkout) // return op.Failed("شما نمیتوانید برای پرسنلی در تاریخی که برای فیش حقوقی رسمی صادر شده است مساعده ای دهید"); var (userId, userType, _) = _authHelper.GetUserTypeWithId(); using var transaction = new TransactionScope(); foreach (var employeeId in command.EmployeeIds) { var entity = new SalaryAid(employeeId, command.WorkshopId, command.Amount.MoneyToDouble(), startDate, userId, userType, command.CalculationMonth, command.CalculationYear); _salaryAidRepository.Create(entity); _salaryAidRepository.SaveChanges(); if (existsCheckouts.CustomizeCheckout) { var customizeCheckouts = _customizeCheckoutRepository.GetByWorkshopIdEmployeeIdMonthYear( command.WorkshopId, employeeId, year, month).GetAwaiter().GetResult(); if (customizeCheckouts != null) { // customizeCheckouts.SetHasAmountConflict(true); var salaryAids = customizeCheckouts.CustomizeCheckoutSalaryAids.ToList(); salaryAids.Add(new(entity.Amount.ToMoney(), entity.SalaryAidDateTime, entity.SalaryAidDateTime.ToFarsi(), entity.CalculationDate, entity.CalculationDate.ToFarsi(), entity.id)); customizeCheckouts.SetSalaryAids(salaryAids); } } if (existsCheckouts.CustomizeCheckoutTemp) { var customizeCheckoutTemp = _customizeCheckoutTempRepository.GetByWorkshopIdEmployeeIdInDate( command.WorkshopId, employeeId, calculationDateGr).GetAwaiter().GetResult(); if (customizeCheckoutTemp != null) { // customizeCheckoutTemp.SetHasAmountConflict(true); var salaryAids = customizeCheckoutTemp.CustomizeCheckoutSalaryAids.ToList(); salaryAids.Add(new(entity.Amount.ToMoney(), entity.SalaryAidDateTime, entity.SalaryAidDateTime.ToFarsi(), entity.CalculationDate, entity.CalculationDate.ToFarsi(), entity.id)); customizeCheckoutTemp.SetSalaryAids(salaryAids); } } if (existsCheckouts.Checkout) { var checkouts = _checkoutRepository.GetByWorkshopIdEmployeeIdInDate( command.WorkshopId, employeeId, calculationDateGr).GetAwaiter().GetResult(); checkouts?.SetAmountConflict(true); } } _customizeCheckoutRepository.SaveChanges(); transaction.Complete(); return op.Succcedded(); } public OperationResult Edit(EditSalaryAidViewModel command) { var op = new OperationResult(); if (!command.SalaryDateTime.TryToGeorgianDateTime(out var startDate)) { return op.Failed("تاریخ وارد شده نامعتبر است"); } var calculationDate = $"{command.CalculationYear:0000}/{command.CalculationMonth:00}/01"; if (!calculationDate.TryToGeorgianDateTime(out var calculationDateGr)) { return op.Failed("تاریخ محاسبه وارد شده نامعتبر است"); } if (startDate > DateTime.Now) { return op.Failed("تاریخ پرداخت مساعده می بایست تاریخ امروز یا قبل تر باشد"); } if (command.Amount.Length > 15) { return op.Failed("مبلغ وارد شده معتبر نیست"); } var entity = _salaryAidRepository.Get(command.Id); if (entity == null) return op.Failed("چنین مساعده ای وجود ندارد"); var month = Convert.ToInt32(command.CalculationMonth); var year = Convert.ToInt32(command.CalculationYear); _ = DateTime.Now.Date.AddMonthsFa(-1, out var oneMonthAgoGr); // if (oneMonthAgoGr > calculationDateGr) // { // var prevCheckouts = _customizeCheckoutRepository.ValidateExistsCheckouts(calculationDateGr, // oneMonthAgoGr, entity.WorkshopId, [entity.EmployeeId]); // // if (prevCheckouts.CustomizeCheckout || prevCheckouts.CustomizeCheckoutTemp) // { // return op.Failed("شما نمیتوانید در تاریخ قبل از یک ماه گذشته که فیش صادر شده باشد مساعده ای دهید"); // } // } var existsCheckouts = _customizeCheckoutRepository.ValidateExistsCheckouts(calculationDateGr, calculationDateGr, entity.WorkshopId, [entity.EmployeeId]); // if (existsCheckouts.Checkout) // return op.Failed("شما نمیتوانید برای پرسنلی در تاریخی که برای فیش حقوقی رسمی صادر شده است مساعده ای دهید"); using var transaction = new TransactionScope(); var (userId, userType, _) = _authHelper.GetUserTypeWithId(); entity.Edit(Tools.MoneyToDouble(command.Amount), startDate, userId, userType, command.CalculationMonth, command.CalculationYear); _salaryAidRepository.SaveChanges(); if (existsCheckouts.CustomizeCheckout) { var customizeCheckouts = _customizeCheckoutRepository.GetByWorkshopIdEmployeeIdMonthYear( entity.WorkshopId, entity.EmployeeId, year, month).GetAwaiter().GetResult(); // customizeCheckouts?.SetHasAmountConflict(true); var salaryAids = customizeCheckouts.CustomizeCheckoutSalaryAids.ToList(); var existsSalaryAid = salaryAids.FirstOrDefault(x => x.EntityId == entity.id); if (existsSalaryAid != null) { salaryAids.Remove(existsSalaryAid); } salaryAids.Add(new(entity.Amount.ToMoney(), entity.SalaryAidDateTime, entity.SalaryAidDateTime.ToFarsi(), entity.CalculationDate, entity.CalculationDate.ToFarsi(), entity.id)); customizeCheckouts.SetSalaryAids(salaryAids); } if (existsCheckouts.CustomizeCheckoutTemp) { var customizeCheckoutTemp = _customizeCheckoutTempRepository.GetByWorkshopIdEmployeeIdInDate( entity.WorkshopId, entity.EmployeeId, calculationDateGr).GetAwaiter().GetResult(); // customizeCheckoutTemp?.SetHasAmountConflict(true); var salaryAids = customizeCheckoutTemp.CustomizeCheckoutSalaryAids.ToList(); var existsSalaryAid = salaryAids.FirstOrDefault(x => x.EntityId == entity.id); if (existsSalaryAid != null) { salaryAids.Remove(existsSalaryAid); } salaryAids.Add(new(entity.Amount.ToMoney(), entity.SalaryAidDateTime, entity.SalaryAidDateTime.ToFarsi(), entity.CalculationDate, entity.CalculationDate.ToFarsi(), entity.id)); customizeCheckoutTemp.SetSalaryAids(salaryAids); } if (existsCheckouts.Checkout) { var checkouts = _checkoutRepository.GetByWorkshopIdEmployeeIdInDate( command.WorkshopId, entity.EmployeeId, calculationDateGr).GetAwaiter().GetResult(); checkouts?.SetAmountConflict(true); } _customizeCheckoutRepository.SaveChanges(); transaction.Complete(); return op.Succcedded(); } public OperationResult Remove(long id) { OperationResult op = new OperationResult(); var entity = _salaryAidRepository.Get(id); if (entity == null) return op.Failed("این آیتم وجود ندارد"); var month = Convert.ToInt32(entity.CalculationDate.ToFarsi().Substring(5, 2)); var year = Convert.ToInt32(entity.CalculationDate.ToFarsi().Substring(0, 4)); if (_customizeCheckoutRepository.Exists(x => x.WorkshopId == entity.WorkshopId && entity.EmployeeId == x.EmployeeId && x.YearInt == year && x.MonthInt == month)) return op.Failed("این پرسنل در این تاریخ دارای فیش حقوقی است"); if (_customizeCheckoutTempRepository.Exists(x => x.WorkshopId == entity.WorkshopId && entity.EmployeeId == x.EmployeeId && x.YearInt == year && x.MonthInt == month && x.ContractStart <= entity.CalculationDate && x.ContractEnd >= entity.CalculationDate)) { return op.Failed("این پرسنل در این تاریخ دارای فیش حقوقی موقت است"); } if (_checkoutRepository.Exists(x => x.WorkshopId == entity.WorkshopId && entity.EmployeeId == x.EmployeeId && x.ContractStart <= entity.CalculationDate && x.ContractEnd >= entity.CalculationDate)) { return op.Failed("این پرسنل در این تاریخ دارای فیش حقوقی رسمی است"); } _salaryAidRepository.Remove(entity); _salaryAidRepository.SaveChanges(); return op.Succcedded(); } public OperationResult RemoveRange(IEnumerable ids) { OperationResult op = new OperationResult(); var salaries = _salaryAidRepository.GetBy(ids); _salaryAidRepository.RemoveRange(salaries); _salaryAidRepository.SaveChanges(); return op.Succcedded(); } public async Task CreateRangeAsync(List commands) { var op = new OperationResult(); await using var transaction = await _salaryAidRepository.BeginTransactionAsync(); foreach (var command in commands) { if (!command.SalaryDateTime.TryToGeorgianDateTime(out var startDate)) { return op.Failed("تاریخ وارد شده نامعتبر است"); } var calculationDate = $"{command.CalculationYear:0000}/{command.CalculationMonth:00}/01"; if (!calculationDate.TryToGeorgianDateTime(out var calculationDateGr)) { return op.Failed("تاریخ محاسبه وارد شده نامعتبر است"); } if (startDate > DateTime.Now) { return op.Failed("تاریخ پرداخت مساعده می بایست تاریخ امروز یا قبل تر باشد"); } if (command.Amount.Length > 15) { return op.Failed("مبلغ وارد شده معتبر نیست"); } _ = DateTime.Now.Date.AddMonthsFa(-1, out var oneMonthAgoGr); // // if (oneMonthAgoGr > calculationDateGr) // { // var prevCheckouts = _customizeCheckoutRepository.ValidateExistsCheckouts(calculationDateGr, // oneMonthAgoGr, command.WorkshopId, command.EmployeeIds); // // if (prevCheckouts.CustomizeCheckout || prevCheckouts.Checkout || prevCheckouts.CustomizeCheckoutTemp) // { // return op.Failed("شما نمیتوانید در تاریخ قبل از یک ماه گذشته که فیش صادر شده باشد مساعده دهید"); // } // } var existsCheckouts = _customizeCheckoutRepository.ValidateExistsCheckouts(calculationDateGr, calculationDateGr, command.WorkshopId, command.EmployeeIds); // if (existsCheckouts.Checkout) // return op.Failed("شما نمیتوانید برای پرسنلی در تاریخی که برای فیش حقوقی رسمی صادر شده است مساعده ای دهید"); var month = Convert.ToInt32(command.CalculationMonth); var year = Convert.ToInt32(command.CalculationYear); var (userId, userType, _) = _authHelper.GetUserTypeWithId(); foreach (var employeeId in command.EmployeeIds) { var id = employeeId; if (employeeId == 0) { var employee = _employeeRepository.GetByNationalCode(command.NationalCode); id = employee.id; } var entity = new SalaryAid(id, command.WorkshopId, command.Amount.MoneyToDouble(), startDate, userId, userType, command.CalculationMonth, command.CalculationYear); await _salaryAidRepository.CreateAsync(entity); await _salaryAidRepository.SaveChangesAsync(); if (existsCheckouts.CustomizeCheckout) { var customizeCheckouts = _customizeCheckoutRepository.GetByWorkshopIdEmployeeIdMonthYear( command.WorkshopId, employeeId, year, month).GetAwaiter().GetResult(); // customizeCheckouts?.SetHasAmountConflict(true); if (customizeCheckouts != null) { var salaryAids = customizeCheckouts.CustomizeCheckoutSalaryAids.ToList(); salaryAids.Add(new(entity.Amount.ToMoney(), entity.SalaryAidDateTime, entity.SalaryAidDateTime.ToFarsi(), entity.CalculationDate, entity.CalculationDate.ToFarsi(), entity.id)); customizeCheckouts.SetSalaryAids(salaryAids); } } if (existsCheckouts.CustomizeCheckoutTemp) { var customizeCheckoutTemp = _customizeCheckoutTempRepository.GetByWorkshopIdEmployeeIdInDate( command.WorkshopId, employeeId, calculationDateGr).GetAwaiter().GetResult(); // customizeCheckoutTemp?.SetHasAmountConflict(true); if (customizeCheckoutTemp != null) { var salaryAids = customizeCheckoutTemp.CustomizeCheckoutSalaryAids.ToList(); salaryAids.Add(new(entity.Amount.ToMoney(), entity.SalaryAidDateTime, entity.SalaryAidDateTime.ToFarsi(), entity.CalculationDate, entity.CalculationDate.ToFarsi(), entity.id)); customizeCheckoutTemp.SetSalaryAids(salaryAids); } } if (existsCheckouts.Checkout) { var checkouts = _checkoutRepository.GetByWorkshopIdEmployeeIdInDate( command.WorkshopId, employeeId, calculationDateGr).GetAwaiter().GetResult(); checkouts?.SetAmountConflict(true); } } await _customizeCheckoutRepository.SaveChangesAsync(); } await transaction.CommitAsync(); return op.Succcedded(); } #region Pooya /// /// گروهبندی بر اساس ماه هنگام جستجو با انتخاب کارمند /// public SalaryAidsGroupedViewModel GetSearchListAsGrouped(SalaryAidSearchViewModel searchModel) { return _salaryAidRepository.GetSearchListAsGrouped(searchModel); } #endregion }