using System.Collections.Generic; using System.Globalization; using System.Linq; using _0_Framework.Application; using _0_Framework.InfraStructure; using Company.Domain.FineAgg; using CompanyManagment.App.Contracts.Fine; using CompanyManagment.App.Contracts.Reward; using CompanyManagment.App.Contracts.SalaryAid; using Microsoft.EntityFrameworkCore; namespace CompanyManagment.EFCore.Repository; public class FineRepository : RepositoryBase, IFineRepository { private readonly CompanyContext _companyContext; public FineRepository(CompanyContext companyContext) : base(companyContext) { _companyContext = companyContext; } public List GetSearchList(FineSearchViewModel searchModel) { var query = _companyContext.Fines.Where(x => x.WorkshopId == searchModel.WorkshopId); if (searchModel.EmployeeId != 0) query = query.Where(x => x.EmployeeId == searchModel.EmployeeId); if (!string.IsNullOrWhiteSpace(searchModel.StartDate) && !string.IsNullOrWhiteSpace(searchModel.EndDate)) { var startDate = searchModel.StartDate.ToGeorgianDateTime(); var endDate = searchModel.EndDate.ToGeorgianDateTime(); query = query.Where(x => x.FineDate >= startDate && x.FineDate <= endDate); } var result = query.OrderByDescending(x => x.CreationDate).Skip(searchModel.PageIndex).Take(30).Select(x => new FineViewModel() { Id = x.id, WorkshopId = x.WorkshopId, EmployeeId = x.EmployeeId, Title = x.Title, Amount = x.Amount.ToMoney(), FineDate = x.FineDate.ToFarsi(), IsActive = x.IsActive, CreationDate = x.CreationDate.ToFarsi() }).AsEnumerable(); var employees = _companyContext.Employees.Where(x => result.Any(a => a.EmployeeId == x.id)).ToList(); var personnelCodes = _companyContext.PersonnelCodeSet .Where(x => result.Any(a => a.EmployeeId == x.EmployeeId && x.WorkshopId == a.WorkshopId)).ToList(); return result.Select(x => new FineViewModel() { Id = x.Id, WorkshopId = x.WorkshopId, EmployeeId = x.EmployeeId, EmployeeFullName = employees.FirstOrDefault(a => a.id == x.EmployeeId)?.FullName, PersonnelCode = personnelCodes .FirstOrDefault(a => x.WorkshopId == a.WorkshopId && a.EmployeeId == x.EmployeeId)?.PersonnelCode .ToString(), Title = x.Title, Amount = x.Amount, FineDate = x.FineDate, IsActive = x.IsActive, CreationDate = x.CreationDate }).ToList(); } public List GetBy(IEnumerable ids) { return _companyContext.Fines.Where(x => ids.Contains(x.id)).ToList(); } public EditFineViewModel GetDetails(long id) { var entity = _companyContext.Fines.FirstOrDefault(x => x.id == id); if (entity == null) return new(); return new EditFineViewModel() { Id = entity.id, WorkshopId = entity.WorkshopId, EmployeeId = entity.EmployeeId, EmployeeFullname = _companyContext.Employees.FirstOrDefault(x => x.id == entity.EmployeeId)?.FullName ?? "", Title = entity.Title, Amount = entity.Amount.ToMoney(), IsActive = entity.IsActive, FineDate = entity.FineDate.ToFarsi(), }; } #region Pooya /// /// گروهبندی بر اساس ماه هنگام جستجو با انتخاب کارمند /// public FinesGroupedViewModel GetSearchListAsGrouped(FineSearchViewModel searchModel) { var result = new FinesGroupedViewModel(); var query = _companyContext.Fines.Where(x => x.WorkshopId == searchModel.WorkshopId); var personnelCodes = _companyContext.PersonnelCodeSet .Where(x => x.WorkshopId == searchModel.WorkshopId).ToList(); var employees = _companyContext.LeftWorkList.Where(x => x.WorkshopId == searchModel.WorkshopId) .Include(x => x.Employee).Select(x => x.Employee).ToList(); var pc = new PersianCalendar(); if (searchModel.ShowAsGrouped) { if (searchModel.EmployeeId > 0) { if (!string.IsNullOrWhiteSpace(searchModel.StartDate) && !string.IsNullOrWhiteSpace(searchModel.EndDate)) { var startDate = searchModel.StartDate.ToGeorgianDateTime(); var endDate = searchModel.EndDate.ToGeorgianDateTime(); query = query.Where(x => x.FineDate >= startDate && x.FineDate <= endDate); } query = query.Where(x => x.EmployeeId == searchModel.EmployeeId); var list = query.OrderByDescending(x=>x.FineDate).ToList().Select(x => new FineViewModel() { Amount = x.Amount.ToMoney(), AmountDouble = x.Amount, EmployeeFullName = employees.FirstOrDefault(e => e.id == x.EmployeeId).FullName, EmployeeId = x.EmployeeId, CreationDate = x.CreationDate.ToFarsi(), Id = x.id, MonthFa = pc.GetMonth(x.FineDate).ToFarsiMonthByIntNumber(), YearFa = pc.GetYear(x.FineDate).ToString(), PersonnelCode = personnelCodes.FirstOrDefault(p => p.EmployeeId == x.EmployeeId).PersonnelCode.ToString(), FineDate = x.FineDate.ToFarsi(), WorkshopId = x.WorkshopId }).ToList(); result.GroupedByDate = list.GroupBy(x => new { x.YearFa, x.MonthFa }).Select(x => new FinesGroupedByDateViewModel() { YearFa = x.Key.YearFa, MonthFa = x.Key.MonthFa, Fines = x.Select(s => new FinesGroupedByDateViewModelItems() { Amount = s.Amount, EmployeeName = s.EmployeeFullName, Id = s.Id, PersonnelCode = s.PersonnelCode, FineDateTimeFa = s.FineDate, Title = s.Title }).ToList(), TotalAmount = x.Sum(s => s.AmountDouble).ToMoney(), }).ToList(); return result; } else if (!string.IsNullOrWhiteSpace(searchModel.StartDate) && !string.IsNullOrWhiteSpace(searchModel.EndDate)) { var startDate = searchModel.StartDate.ToGeorgianDateTime(); var endDate = searchModel.EndDate.ToGeorgianDateTime(); query = query.Where(x => x.FineDate >= startDate && x.FineDate <= endDate); result.GroupedByEmployee = query.GroupBy(x => x.EmployeeId).ToList() .Select(x => new FinesGroupedByEmployeeViewModel() { EmployeeId = x.Key, TotalAmount = x.Sum(s => s.Amount).ToMoney(), EmployeeName = employees.FirstOrDefault(e => e.id == x.Key).FullName, Fines = x.Select(s => new FinesGroupedByEmployeeViewModelItems() { Amount = s.Amount.ToMoney(), Id = s.id, FineDateTimeFa = s.FineDate.ToFarsi(), PersonnelCode = personnelCodes.FirstOrDefault(p => p.EmployeeId == s.EmployeeId).PersonnelCode.ToString(), Title = s.Title }).ToList() }).ToList(); return result; } } if (searchModel.EmployeeId > 0) query = query.Where(x => x.EmployeeId == searchModel.EmployeeId); if (!string.IsNullOrWhiteSpace(searchModel.StartDate) && !string.IsNullOrWhiteSpace(searchModel.EndDate)) { var startDate = searchModel.StartDate.ToGeorgianDateTime(); var endDate = searchModel.EndDate.ToGeorgianDateTime(); query = query.Where(x => x.FineDate >= startDate && x.FineDate <= endDate); } result.FineListViewModels = query.Skip(searchModel.PageIndex).Take(30).ToList().Select(x => new FineViewModel() { Id = x.id, WorkshopId = x.WorkshopId, EmployeeId = x.EmployeeId, Title = x.Title, Amount = x.Amount.ToMoney(), FineDate = x.FineDate.ToFarsi(), IsActive = x.IsActive, CreationDate = x.CreationDate.ToFarsi(), PersonnelCode = personnelCodes.FirstOrDefault(p => p.EmployeeId == x.EmployeeId).PersonnelCode.ToString(), AmountDouble = x.Amount, EmployeeFullName = employees.FirstOrDefault(e => e.id == x.EmployeeId).FullName, YearFa = x.FineDate.ToFarsi().Substring(0, 4), MonthFa = x.FineDate.ToFarsi().Substring(5, 2), }).ToList(); return result; #endregion } }