using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using _0_Framework.Application; using _0_Framework.Application.Enums; using _0_Framework.InfraStructure; using Company.Domain.ClassificationSchemeAgg; using CompanyManagment.App.Contracts.ClassificationScheme; using Microsoft.EntityFrameworkCore; namespace CompanyManagment.EFCore.Repository; public class ClassificationGroupSalariesRepository : RepositoryBase, IClassificationGroupSalariesRepository { private readonly CompanyContext _context; public ClassificationGroupSalariesRepository(CompanyContext context) : base(context) { _context = context; } public async Task CreateSalaries(List createClassificationGroupSalary) { if (createClassificationGroupSalary.Count > 0) { await _context.ClassificationGroupSalaries.AddRangeAsync(createClassificationGroupSalary); await _context.SaveChangesAsync(); } } /// /// دریافت دستمزدها و ضریب ریالی برای مودال ویرایش /// /// /// /// /// public async Task GetEditSalariesData(long schemeId, string startDate, string endDate) { var salaryAndRialCoefficientModel = new SalaryAndRialCoefficientModel(); try { var scheme = _context.ClassificationSchemes.FirstOrDefaultAsync(x => x.id == schemeId).GetAwaiter().GetResult(); var startDatGr = startDate.ToGeorgian(); var rialCoEfficient = await _context.ClassificationRialCoefficients .FirstOrDefaultAsync(x => x.ClassificationSchemeId == schemeId && x.StartDate == startDatGr); salaryAndRialCoefficientModel.SchemeId = schemeId; salaryAndRialCoefficientModel.StartDateFa = startDate; salaryAndRialCoefficientModel.EndDateFa = endDate; salaryAndRialCoefficientModel.TypeOfCoefficient = scheme.TypeOfCoefficient; if (rialCoEfficient == null) { salaryAndRialCoefficientModel.RialCoefficient = 0; salaryAndRialCoefficientModel.CoefficientId = 0; } else { salaryAndRialCoefficientModel.RialCoefficient = scheme.TypeOfCoefficient == TypeOfCoefficient.RialCoefficient ? rialCoEfficient.RialCoefficient : 0; salaryAndRialCoefficientModel.CoefficientId = scheme.TypeOfCoefficient == TypeOfCoefficient.RialCoefficient ? rialCoEfficient.id : 0; } salaryAndRialCoefficientModel.SalariesAndCoefficientList = _context.ClassificationGroupSalaries.Where(x => x.SchemeId == schemeId && x.StartDate == startDatGr).Select(x => new EditClassificationGroupSalaryAndRialCoefficient { Id = x.id, ClassificationGroupId = x.ClassificationGroupId, GroupNo = x.GroupNo, GroupSalaryStr = x.GroupSalary.ToMoney(), GroupSalary = x.GroupSalary }) .ToList(); } catch (System.Exception) { return new SalaryAndRialCoefficientModel(); } return salaryAndRialCoefficientModel; } public async Task GetSalariesTabData(long schemeId) { var scheme = await _context.ClassificationSchemes.AsSplitQuery().Include(xc=>xc.ClassificationRialCoefficients) .Include(xg => xg.ClassificationGroups) .ThenInclude(xs => xs.ClassificationGroupSalaries) .FirstOrDefaultAsync(x => x.id == schemeId); if (scheme == null) return null; // جمع‌آوری همه‌ی حقوق‌ها از تمام گروه‌ها var allSalaries = scheme.ClassificationGroups .SelectMany(g => g.ClassificationGroupSalaries) .ToList(); // اگر هیچ حقوقی وجود ندارد if (!allSalaries.Any()) { return new SalaryAndRialCoefficientTab { SchemeId = scheme.id, HasAnySalaries = false, SalaryAndRialCoefficientTabDataList = new List() }; } // گروه‌بندی بر اساس StartDate و EndDate برای حذف موارد تکراری var distinctPeriods = allSalaries .GroupBy(s => new { s.StartDate, s.EndDate }) .Select(g => g.First()) // فقط یکی از هر بازه تاریخ .OrderByDescending(x => x.StartDate) .ToList(); //تبدیل به مدل خروجی var dataList = distinctPeriods .Select(s => new SalaryAndRialCoefficientTabDataList { RialCoefficientStr = $"{scheme.ClassificationRialCoefficients.FirstOrDefault(x=>x.StartDate.Date == s.StartDate.Date && x.EndDate.Date == s.EndDate.Date)?.RialCoefficient}", StartDateFa = s.StartDate.ToFarsi(), EndDateFa = s.EndDate.ToFarsi(), Year = s.Year }) .ToList(); var result = new SalaryAndRialCoefficientTab { SchemeId = scheme.id, HasAnySalaries = allSalaries.Any(), SalaryAndRialCoefficientTabDataList = dataList }; return result; } #region ForApi public async Task> GetSalaryList(long schemeId) { var scheme = await _context.ClassificationSchemes.AsSplitQuery().Include(xc => xc.ClassificationRialCoefficients) .Include(xg => xg.ClassificationGroups) .ThenInclude(xs => xs.ClassificationGroupSalaries) .FirstOrDefaultAsync(x => x.id == schemeId); if (scheme == null) return null; // جمع‌آوری همه‌ی حقوق‌ها از تمام گروه‌ها var allSalaries = scheme.ClassificationGroups .SelectMany(g => g.ClassificationGroupSalaries) .ToList(); // اگر هیچ حقوقی وجود ندارد if (!allSalaries.Any()) { return new List(); } // گروه‌بندی بر اساس StartDate و EndDate برای حذف موارد تکراری var distinctPeriods = allSalaries .GroupBy(s => new { s.StartDate, s.EndDate }) .Select(g => g.First()) // فقط یکی از هر بازه تاریخ .OrderByDescending(x => x.StartDate) .ToList(); //تبدیل به مدل خروجی var dataList = distinctPeriods .Select(s => new SalaryAndRialCoefficientTabDataList { RialCoefficientStr = $"{scheme.ClassificationRialCoefficients.FirstOrDefault(x => x.StartDate.Date == s.StartDate.Date && x.EndDate.Date == s.EndDate.Date)?.RialCoefficient}", StartDateFa = s.StartDate.ToFarsi(), EndDateFa = s.EndDate.ToFarsi(), Year = s.Year }) .ToList(); return dataList; } #endregion }