using System; using System.Collections.Generic; using System.Linq; using _0_Framework.Application; using _0_Framework.InfraStructure; using Company.Domain.DateSalaryAgg; using Company.Domain.DateSalaryItemAgg; using Company.Domain.InsuranceJobAndJobsAgg; using Company.Domain.InsuranceJobItemAgg; using Company.Domain.InsurancJobAgg; using Company.Domain.PercentageAgg; using CompanyManagment.App.Contracts.InsuranceJob; using CompanyManagment.App.Contracts.InsuranceJobItem; using CompanyManagment.App.Contracts.Percentage; using Microsoft.EntityFrameworkCore; using static Microsoft.EntityFrameworkCore.DbLoggerCategory.Database; namespace CompanyManagment.EFCore.Repository; public class InsuranceJobRepository : RepositoryBase, IInsuranceJobRepositpry { private readonly CompanyContext _context; private readonly TestDbContext _testDbContext; private readonly IInsuranceJobItemRepositpry _insuranceJobItemRepositpry; private readonly IPercentageRepository _percentageRepository; private readonly IDateSalaryItemRepository _dateSalaryItemRepository; public InsuranceJobRepository(CompanyContext context, IInsuranceJobItemRepositpry insuranceJobItemRepositpry, IPercentageRepository percentageRepository, TestDbContext testDbContext, IDateSalaryItemRepository dateSalaryItemRepository) : base(context) { _context = context; _insuranceJobItemRepositpry = insuranceJobItemRepositpry; _percentageRepository = percentageRepository; _testDbContext = testDbContext; _dateSalaryItemRepository = dateSalaryItemRepository; } public EditInsuranceJob GetDetails(long id, string year, string month) { var insuranceJob = new EditInsuranceJob(); var details = Get(id); insuranceJob.Id = id; insuranceJob.Year = details.Year; insuranceJob.EconomicCode = details.EconomicCode; insuranceJob.InsuranceJobTitle = details.InsuranceJobTitle; insuranceJob.InsuranceJobItems = _insuranceJobItemRepositpry.GetInsuranceJobItemByInsuranceJobId(id, year, month); var workshopsUsedThis = _insuranceJobItemRepositpry.GetWorkshopUsedThisInsuranceJob(id); var item = insuranceJob.InsuranceJobItems.FirstOrDefault(); insuranceJob.StartDateFa = item != null ? $"{item.StartDate.ToFarsi()}" : "-"; insuranceJob.EndDateFa = item != null ? $"{item.EndDate.ToFarsi()}" : "-"; insuranceJob.WorkshopList = workshopsUsedThis.workshopList; insuranceJob.HasAnyWorkshop = workshopsUsedThis.hasAnyWorkshop; return insuranceJob; } public List GetInsurancJob() { var list = _context.InsuranceJobs.Select(x => new InsuranceJobViewModel { Id = x.id, InsuranceJobTitle = x.InsuranceJobTitle, EconomicCode = x.EconomicCode }).ToList(); return list; } public List Search(InsuranceJobSearchModel searchModel) { string now = Tools.ToFarsi(DateTime.Now); string year = now.Substring(0, 4); string month = now.Substring(5, 2); if (!string.IsNullOrWhiteSpace(searchModel.Year)) year = searchModel.Year; if (!string.IsNullOrWhiteSpace(searchModel.Month)) month = searchModel.Month; var searcheDate = ($"{year}/{month}/01").ToGeorgianDateTime(); var query = _context.InsuranceJobs .Include(x => x.InsuranceJobItemList).Where(x => x.InsuranceJobItemList.Any(i => i.StartDate <= searcheDate && i.EndDate >= searcheDate)) .Select(x => new InsuranceJobViewModel { Id = x.id, InsuranceJobTitle = x.InsuranceJobTitle, EconomicCode = x.EconomicCode, Year = year, Month = month, }); if (!string.IsNullOrWhiteSpace(searchModel.EconomicCode)) query = query.Where(x => x.EconomicCode.Contains(searchModel.EconomicCode)); if (!string.IsNullOrWhiteSpace(searchModel.InsuranceJobTitle)) query = query.Where(x => x.InsuranceJobTitle.Contains(searchModel.InsuranceJobTitle)); return query.OrderByDescending(x => x.Id).ToList(); } public OperationResult CreateInsuranceJob(CreateInsuranceJob command) { OperationResult result = new OperationResult(); var insuranceJobItemObj = _insuranceJobItemRepositpry.Get(command.InsuranceJobItemId); if (insuranceJobItemObj == null) return result.Failed("آیتم شغلی انتخاب شده وجود ندارد"); List percentaegJoin = new List(); var percentageLessThan = command.InsuranceJobItems.Select(x => x.PercentageLessThan).ToList(); var percentageMoreThan = command.InsuranceJobItems.Select(x => x.PercentageMoreThan).ToList(); if (percentageMoreThan != null) { percentaegJoin = percentageLessThan .Concat(percentageMoreThan) .Distinct() .ToList(); } using (var transaction = _context.Database.BeginTransaction()) { try { var insuranceJobObj = new InsuranceJob(command.InsuranceJobTitle, command.YearlySalaryId, command.EconomicCode, command.Year); Create(insuranceJobObj); SaveChanges(); foreach (var item in command.InsuranceJobItems) { item.PercentageLessThan = item.PercentageLessThan; item.PercentageMoreThan = item.PercentageMoreThan; item.InsuranceJobId = insuranceJobObj.id; item.StartDate = insuranceJobItemObj.StartDate; item.EndDate = insuranceJobItemObj.EndDate; _insuranceJobItemRepositpry.CreateInsuranceJobItem(item); if (!_percentageRepository.Exists(x => x.Percent == item.PercentageLessThan)) { var percentage = new Percentage(item.PercentageLessThan); _percentageRepository.Create(percentage); } if (!_percentageRepository.Exists(x => x.Percent == item.PercentageMoreThan)) { var percentage2 = new Percentage(item.PercentageMoreThan); _percentageRepository.Create(percentage2); } _percentageRepository.SaveChanges(); } var dateSalary = _context.DateSalaries.FirstOrDefault(x => x.StartDateGr == insuranceJobItemObj.StartDate && x.EndDateGr == insuranceJobItemObj.EndDate); var percentages = _context.Percentages.Select(x => new { x.id, x.Percent }).ToList(); var dateSalaryItemList = new List(); foreach (var percent in percentaegJoin) { var percentageId = percentages.FirstOrDefault(x => x.Percent == percent); if (percentageId != null) { var dateSalaryItem = new DateSalaryItem(percent, percentageId.id, 0, dateSalary.id); dateSalaryItemList.Add(dateSalaryItem); } } if (dateSalaryItemList.Count > 0) { _context.DateSalaryItems.AddRange(dateSalaryItemList); _context.SaveChanges(); } // SaveChanges(); transaction.Commit(); result.IsSuccedded = true; result.Message = "ثبت اطلاعات با موفقیت انجام شد"; } catch (Exception ex) { transaction.Rollback(); result.Failed("ثبت اطلاعات با خطا مواجه شد"); } } return result; } public List<(long id, string date)> GetOldYersInsuranceItemIds() { var res = _context.InsuranceJobItems.Where(x=>x.StartDate != null && x.EndDate != null) .GroupBy(x => x.StartDate) .Select(g => g.First()) .ToList().Select(x => new InsuranceJobItemViewModel() { Id = x.id, StartDate = x.StartDate, EndDate = x.EndDate, }).OrderByDescending(x=>x.StartDate); return res.Select(x => (x.Id, $"{(x.StartDate.HasValue ? x.StartDate.Value.ToFarsi() : "نامشخص")} - {(x.EndDate.HasValue ? x.EndDate.Value.ToFarsi() : "نامشخص")}")).ToList(); } public OperationResult CopyFromLastYear(CopyFromLastYearViewModel command) { var op = new OperationResult(); if (command.InsuranceJobItemId == 0) return op.Failed("بازه را انتخاب کنید"); DateTime startDateGr = new DateTime(); DateTime endDateGr = new DateTime(); try { startDateGr = command.StartDate.ToGeorgianDateTime(); endDateGr = command.EndDate.ToGeorgianDateTime(); } catch (Exception e) { return op.Failed("تاریخ به درستی وارد نشده است"); } var chekExist = _insuranceJobItemRepositpry.Exists(x => x.StartDate < endDateGr && x.EndDate > startDateGr); if (chekExist) return op.Failed("بازه تاریخ وارد شده با بازه های قبلی تداخل دارد"); var insuranceJobItemObj = _insuranceJobItemRepositpry.Get(command.InsuranceJobItemId); if (insuranceJobItemObj == null) return op.Failed("آیتم شغلی انتخاب شده وجود ندارد"); var insuranceJobItemList = _context.InsuranceJobItems .Include(jobs => jobs.InsuranceJobAndJobs) .Where(x => x.StartDate == insuranceJobItemObj.StartDate).Select(x => new InsuranceJobItemViewModel() { PercentageLessThan = x.PercentageLessThan, PercentageMoreThan = x.PercentageMoreThan, InsuranceJobId = x.InsuranceJobId, StartDate = startDateGr, EndDate = endDateGr, JobIds = x.InsuranceJobAndJobs.Select(j => j.JobId).ToList() }).ToList(); if (!insuranceJobItemList.Any()) return op.Failed("خطا"); List percentaegJoin = new List(); var percentageLessThan = insuranceJobItemList.Select(x => x.PercentageLessThan).ToList(); var percentageMoreThan = insuranceJobItemList.Select(x => x.PercentageMoreThan).ToList(); if (percentageMoreThan != null) { percentaegJoin = percentageLessThan .Concat(percentageMoreThan) .Distinct() .ToList(); } using (var transaction = _context.Database.BeginTransaction()) { try { foreach (var item in insuranceJobItemList) { _insuranceJobItemRepositpry.CreateInsuranceJobItem(item); if (!_percentageRepository.Exists(x => x.Percent == item.PercentageLessThan)) { var percentage = new Percentage(item.PercentageLessThan); _percentageRepository.Create(percentage); } if (!_percentageRepository.Exists(x => x.Percent == item.PercentageMoreThan)) { var percentage2 = new Percentage(item.PercentageMoreThan); _percentageRepository.Create(percentage2); } _percentageRepository.SaveChanges(); } var dateSalary = new DateSalary(command.StartDate, command.EndDate); _context.DateSalaries.Add(dateSalary); _context.SaveChanges(); var percentages = _context.Percentages.Select(x=> new{x.id, x.Percent}).ToList(); var dateSalaryItemList = new List(); foreach (var percent in percentaegJoin) { var percentageId = percentages.FirstOrDefault(x => x.Percent == percent); if (percentageId != null) { var dateSalaryItem = new DateSalaryItem(percent, percentageId.id, 0, dateSalary.id); dateSalaryItemList.Add(dateSalaryItem); } } if (dateSalaryItemList.Count > 0) { _context.DateSalaryItems.AddRange(dateSalaryItemList); _context.SaveChanges(); } // SaveChanges(); transaction.Commit(); op.IsSuccedded = true; op.Message = "ثبت اطلاعات با موفقیت انجام شد"; return op; } catch (Exception ex) { transaction.Rollback(); return op.Failed("ثبت اطلاعات با خطا مواجه شد"); } } } public OperationResult RecoveryOldData1403() { OperationResult result = new OperationResult(); using (var transaction = _context.Database.BeginTransaction()) { try { var res = _testDbContext.InsuranceJobItems.Include(x => x.InsuranceJobAndJobs).ToList(); foreach (var item in res) { var createItem = new InsuranceJobItem(item.PercentageLessThan, 0, item.PercentageMoreThan, 0, item.InsuranceJobId, item.StartDate, item.EndDate); _context.InsuranceJobItems.Add(createItem); _context.SaveChanges(); Console.WriteLine(createItem.InsuranceJobId + " " + createItem.PercentageLessThan); List insuranceJobAndJobsList = new List(); foreach (var jobItem in item.InsuranceJobAndJobs) { var insuranceJobAndJobsObj = new InsuranceJobAndJobs(); insuranceJobAndJobsObj.JobId = jobItem.JobId; insuranceJobAndJobsObj.InsuranceJobItemId = createItem.id; insuranceJobAndJobsList.Add(insuranceJobAndJobsObj); } _context.InsuranceJobAndJobsSet.AddRange(insuranceJobAndJobsList); _context.SaveChanges(); if (!_percentageRepository.Exists(x => x.Percent == item.PercentageLessThan)) { var percentage = new Percentage(item.PercentageLessThan); _percentageRepository.Create(percentage); } if (!_percentageRepository.Exists(x => x.Percent == item.PercentageMoreThan)) { var percentage2 = new Percentage(item.PercentageMoreThan); _percentageRepository.Create(percentage2); } _percentageRepository.SaveChanges(); } transaction.Commit(); result.IsSuccedded = true; result.Message = "حذف اطلاعات با موفقیت انجام شد"; } catch (Exception ex) { transaction.Rollback(); result.Failed("ثبت اطلاعات با خطا مواجه شد"); } } return result; } public OperationResult Remove(long id) { OperationResult result = new OperationResult(); var insuranceJobItems = _context.InsuranceJobItems.Where(x => x.InsuranceJobId == id).ToList(); var start = insuranceJobItems.FirstOrDefault()!.StartDate; var end = insuranceJobItems.FirstOrDefault()!.StartDate; var usedParcentsInDateSalaryItems = _context.DateSalaries .Where(x => x.StartDateGr == start && x.EndDateGr >= end) .Include(x => x.DateSalaryItemList) .SelectMany(x => x.DateSalaryItemList) .ToList(); var itemsLessThan = insuranceJobItems.Select(x => x.PercentageLessThan).ToList(); var itemsMoreThan = insuranceJobItems.Select(x => x.PercentageMoreThan).ToList(); bool lessThan = usedParcentsInDateSalaryItems.Any(x => itemsLessThan.Contains(x.Percent) && x.Salary > 0); bool moreThan = usedParcentsInDateSalaryItems.Any(x => itemsMoreThan.Contains(x.Percent) && x.Salary > 0); if (lessThan || moreThan) return result.Failed("درصد های این صنف دارای مبلغ می باشند"); var percentaegJoin = itemsLessThan .Concat(itemsMoreThan) .Distinct() .ToList(); using (var transaction = _context.Database.BeginTransaction()) { try { _context.InsuranceJobItems.RemoveRange(insuranceJobItems); var insuranceJobObj = Get(id); _context.InsuranceJobs.Remove(insuranceJobObj); var toBeRemove = usedParcentsInDateSalaryItems.Where(x => percentaegJoin.Contains(x.Percent)).Select(x=>x.id); var dateSalaryItemToBeRemovde = _context.DateSalaryItems.Where(x => toBeRemove.Contains(x.id)); _context.DateSalaryItems.RemoveRange(dateSalaryItemToBeRemovde); _context.SaveChanges(); transaction.Commit(); result.IsSuccedded = true; result.Message = "حذف اطلاعات با موفقیت انجام شد"; } catch (Exception ex) { transaction.Rollback(); result.Failed("ثبت اطلاعات با خطا مواجه شد"); } } return result; } public OperationResult EditInsuranceJob(EditInsuranceJob command) { OperationResult result = new OperationResult(); using (var transaction = _context.Database.BeginTransaction()) { try { var insuranceJob = Get(command.Id); insuranceJob.Edit(command.InsuranceJobTitle, command.YearlySalaryId, command.EconomicCode, command.Year); var searcheDate = ($"{command.Year}/{command.Month}/01").ToGeorgianDateTime(); var insuranceJobItems = _context.InsuranceJobItems .Include(x=>x.InsuranceJobAndJobs) .Where(i => i.InsuranceJobId == command.Id && i.StartDate <= searcheDate && i.EndDate >= searcheDate); DateTime? startDate = insuranceJobItems.Select(x => x.StartDate).FirstOrDefault(); DateTime? endDate = insuranceJobItems.Select(x => x.EndDate).FirstOrDefault(); var insuranceJobItemsIds = insuranceJobItems.Select(x => x.id).ToList(); var usedParcentsInDateSalaryItems = _context.DateSalaries .Where(x => x.StartDateGr <= searcheDate && x.EndDateGr >= searcheDate) .Include(x => x.DateSalaryItemList) .SelectMany(x => x.DateSalaryItemList) .ToList(); //var editedJobItems = command.InsuranceJobItems.Where(x => x.Id != 0).ToList(); //var newAdedJobItems = command.InsuranceJobItems.Where(x => x.Id == 0).ToList(); //foreach (var item in insuranceJobItems) //{ //} foreach (var item in command.InsuranceJobItems) { long deleteId = insuranceJobItemsIds.Where(x => x == item.Id).FirstOrDefault(); if (deleteId != 0) { insuranceJobItemsIds.Remove(deleteId); } if (item.Id == 0) { item.PercentageLessThan = item.PercentageLessThan; item.PercentageMoreThan = item.PercentageMoreThan; item.InsuranceJobId = command.Id; item.StartDate = startDate; item.EndDate = endDate; _insuranceJobItemRepositpry.CreateInsuranceJobItem(item); } else { var insuranceJobItem = _insuranceJobItemRepositpry.Get(item.Id); insuranceJobItem.Edit(item.PercentageLessThan, item.SalaeyLessThan, item.PercentageMoreThan, item.SalaryMoreThan, command.Id, startDate, endDate); #region JobAndJob var jobAndJobList = _context.InsuranceJobAndJobsSet.Where(x => x.InsuranceJobItemId == item.Id).ToList(); _context.InsuranceJobAndJobsSet.RemoveRange(jobAndJobList); List insuranceJobAndJobsList = new List(); foreach (var item2 in item.JobIds) { var insuranceJobAndJobsObj = new InsuranceJobAndJobs(); insuranceJobAndJobsObj.JobId = item2; insuranceJobAndJobsObj.InsuranceJobItemId = item.Id; insuranceJobAndJobsList.Add(insuranceJobAndJobsObj); } _context.InsuranceJobAndJobsSet.AddRange(insuranceJobAndJobsList); #endregion } #region Percentage var percentage = new Percentage(item.PercentageLessThan); if (!_percentageRepository.Exists(x => x.Percent == item.PercentageLessThan)) { _percentageRepository.Create(percentage); } var percentage2 = new Percentage(item.PercentageMoreThan); if (!_percentageRepository.Exists(x => x.Percent == item.PercentageMoreThan)) { _percentageRepository.Create(percentage2); } _percentageRepository.SaveChanges(); #endregion #region DateSalaryItems var checkExitLeesThan = usedParcentsInDateSalaryItems.Any(x => x.Percent == item.PercentageLessThan); if (!checkExitLeesThan && usedParcentsInDateSalaryItems.Any()) { if(percentage.id == 0) percentage.id = _percentageRepository.Search(new PercentageSearchModel(){Percent = item.PercentageLessThan }).FirstOrDefault()!.Id; var dateSalaryId =usedParcentsInDateSalaryItems.FirstOrDefault()!.DateSalaryId; var dateSalaryItem = new DateSalaryItem(item.PercentageLessThan, percentage.id, 0, dateSalaryId); _dateSalaryItemRepository.Create(dateSalaryItem); } var checkExitMoreThan = usedParcentsInDateSalaryItems.Any(x => x.Percent == item.PercentageMoreThan); if (!checkExitMoreThan && usedParcentsInDateSalaryItems.Any()) { if (percentage2.id == 0) percentage2.id = _percentageRepository.Search(new PercentageSearchModel() { Percent = item.PercentageMoreThan }).FirstOrDefault()!.Id; var dateSalaryId = usedParcentsInDateSalaryItems.FirstOrDefault()!.DateSalaryId; var dateSalaryItem = new DateSalaryItem(item.PercentageMoreThan, percentage2.id, 0, dateSalaryId); _dateSalaryItemRepository.Create(dateSalaryItem); } _dateSalaryItemRepository.SaveChanges(); #endregion } #region removeJobItems var deleteList = _context.InsuranceJobItems.Where(x => insuranceJobItemsIds.Contains(x.id)).ToList(); _context.InsuranceJobItems.RemoveRange(deleteList); #endregion _context.SaveChanges(); transaction.Commit(); result.IsSuccedded = true; result.Message = "ثبت اطلاعات با موفقیت انجام شد"; } catch (Exception ex) { transaction.Rollback(); result.Failed("ثبت اطلاعات با خطا مواجه شد"); } } return result; } }