Files
Backend-Api/CompanyManagment.EFCore/Repository/ClassificationGroupSalariesRepository.cs
2026-01-06 17:33:40 +03:30

187 lines
7.3 KiB
C#

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<long, ClassificationGroupSalary>, IClassificationGroupSalariesRepository
{
private readonly CompanyContext _context;
public ClassificationGroupSalariesRepository(CompanyContext context) : base(context)
{
_context = context;
}
public async Task CreateSalaries(List<ClassificationGroupSalary> createClassificationGroupSalary)
{
if (createClassificationGroupSalary.Count > 0)
{
await _context.ClassificationGroupSalaries.AddRangeAsync(createClassificationGroupSalary);
await _context.SaveChangesAsync();
}
}
/// <summary>
/// دریافت دستمزدها و ضریب ریالی برای مودال ویرایش
/// </summary>
/// <param name="schemeId"></param>
/// <param name="startDate"></param>
/// <param name="endDate"></param>
/// <returns></returns>
public async Task<SalaryAndRialCoefficientModel> 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<SalaryAndRialCoefficientTab> 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<SalaryAndRialCoefficientTabDataList>()
};
}
// گروه‌بندی بر اساس 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<List<SalaryAndRialCoefficientTabDataList>> 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<SalaryAndRialCoefficientTabDataList>();
}
// گروه‌بندی بر اساس 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
}