Files
Backend-Api/CompanyManagment.EFCore/Repository/EmployeeBankInformationRepository.cs

391 lines
16 KiB
C#

using _0_Framework.InfraStructure;
using AccountMangement.Infrastructure.EFCore;
using Company.Domain.EmployeeBankInformationAgg;
using CompanyManagment.App.Contracts.EmployeeBankInformation;
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using _0_Framework.Exceptions;
namespace CompanyManagment.EFCore.Repository;
public class EmployeeBankInformationRepository : RepositoryBase<long, EmployeeBankInformation>, IEmployeeBankInformationRepository
{
private readonly CompanyContext _companyContext;
private readonly AccountContext _accountContext;
public EmployeeBankInformationRepository(CompanyContext context, CompanyContext companyContext, AccountContext accountContext) : base(context)
{
_companyContext = companyContext;
_accountContext = accountContext;
}
public List<GroupedEmployeeBankInformationViewModel> Search(long workshopId, EmployeeBankInformationSearchModel searchParams)
{
var bankInfoQuery = _companyContext.EmployeeBankInformationSet.Where(x => x.WorkshopId == workshopId)
.Include(x => x.Employee).Include(x => x.Bank)
.Select(x => new
{
x.Bank,
x.BankId,
FullName = (x.Employee.FName + " " + x.Employee.LName),
x.EmployeeId,
x.WorkshopId,
})
.AsQueryable();
if (searchParams.BankId > 0)
bankInfoQuery = bankInfoQuery.Where(x => x.BankId == searchParams.BankId);
if (searchParams.EmployeeId > 0)
bankInfoQuery = bankInfoQuery.Where(x => x.EmployeeId == searchParams.EmployeeId);
var personnelCodes =
_companyContext.PersonnelCodeSet.Where(x => bankInfoQuery.Any(y => y.EmployeeId == x.EmployeeId)).ToList();
var bankInfoList = bankInfoQuery.ToList();
var groupedBanks = bankInfoList.GroupBy(x => x.EmployeeId)
.Select(x => new { EmployeeId=x.Key,Banks= x.Select(y=>y.Bank).ToList() }).ToList();
//Get bank logos from account context
var mediaIds = groupedBanks.SelectMany(x => x.Banks.Select(y=>y.BankLogoMediaId)).ToList();
var banksLogos = _accountContext.Medias.Where(y => mediaIds.Contains(y.id))
.Select(media => new { media.Path, MediaId = media.id }).ToList();
return bankInfoList.GroupBy(x => x.EmployeeId).Select(x =>
{
var banks = groupedBanks.First(y => y.EmployeeId == x.Key).Banks;
return new GroupedEmployeeBankInformationViewModel()
{
BankPicturesList = banksLogos.Where(y => banks.Any(z => y.MediaId == z.BankLogoMediaId))
.Select(y => y.Path).ToList(),
EmployeeId = x.Key,
WorkshopId = workshopId,
EmployeeName = x.FirstOrDefault()?.FullName ?? "",
TotalBankAccountsCount = x.Count(),
PersonnelCode =
personnelCodes.FirstOrDefault(y => y.EmployeeId == x.Key)?.PersonnelCode.ToString() ?? "",
BankNamesList = banks.Select(y => y.BankName).ToList()
};
}).ToList();
}
public async Task<List<GroupedEmployeeBankInformationViewModel>> SearchAsync(long workshopId, EmployeeBankInformationSearchModel searchParams)
{
var bankInfoQuery = _companyContext.EmployeeBankInformationSet
.Where(x => x.WorkshopId == workshopId)
.Select(x => new
{
x.BankId,
x.EmployeeId,
x.WorkshopId,
}).AsQueryable();
if (searchParams.BankId > 0)
bankInfoQuery = bankInfoQuery.Where(x => x.BankId == searchParams.BankId);
if (searchParams.EmployeeId > 0)
bankInfoQuery = bankInfoQuery.Where(x => x.EmployeeId == searchParams.EmployeeId);
var bankInfoList = await bankInfoQuery.ToListAsync();
var employeeIds = bankInfoList.Select(x => x.EmployeeId).Distinct().ToList();
var employees = await _companyContext.Employees
.Where(x => employeeIds.Contains(x.id)).ToListAsync();
var personnelCodes = await _companyContext.PersonnelCodeSet
.Where(x=>employeeIds.Contains(x.EmployeeId) && x.WorkshopId == workshopId)
.ToDictionaryAsync(x=>x.EmployeeId,x=>x.PersonnelCode);
var bankIds = bankInfoList.Select(x=>x.BankId).Distinct().ToList();
var banks =await _companyContext.Banks.Where(x => bankIds.Contains(x.id)).ToListAsync();
//Get bank logos from account context
var mediaIds = banks.Select(x=>x.BankLogoMediaId).ToList();
var banksLogos = _accountContext.Medias.Where(y => mediaIds.Contains(y.id))
.Select(media => new { media.Path, MediaId = media.id }).ToList();
var banksWithLogo = banks.Select(x => new
{
Logo = banksLogos.FirstOrDefault(l => l.MediaId == x.BankLogoMediaId),
Bank = x
}).ToList();
return bankInfoList.GroupBy(x => x.EmployeeId).Select(x =>
{
var employee = employees.FirstOrDefault(e=>e.id == x.Key);
var selectBankId = x.Select(b => b.BankId);
var selectBanks = banksWithLogo
.Where(b => selectBankId.Contains(b.Bank.id)).ToList();
return new GroupedEmployeeBankInformationViewModel()
{
BankPicturesList =
selectBanks.Select(y => y.Logo.Path).ToList(),
EmployeeId = x.Key,
WorkshopId = workshopId,
EmployeeName = employee?.FullName ?? "",
TotalBankAccountsCount = x.Count(),
PersonnelCode = personnelCodes.TryGetValue(x.Key,out var value)?
value.ToString() :
"",
BankNamesList = selectBanks.Select(y => y.Bank.BankName).ToList()
};
}).ToList();
}
public void RemoveByEmployeeId(IEnumerable<EmployeeBankInformation> entities)
{
_companyContext.EmployeeBankInformationSet.RemoveRange(entities);
}
public GroupedEmployeeBankInformationViewModel GetByEmployeeId(long workshopId, long employeeId)
{
//todo: optimize
var entities = _companyContext.EmployeeBankInformationSet
.Include(x => x.Bank).Include(x => x.Employee)
.Where(x => x.EmployeeId == employeeId && x.WorkshopId == workshopId);
var personnelCode =
_companyContext.PersonnelCodeSet.FirstOrDefault(x => x.EmployeeId == employeeId && x.WorkshopId == workshopId)?
.PersonnelCode.ToString() ?? "";
var bankInfoList = entities.ToList();
var groupedBanks = bankInfoList.GroupBy(x => x.Bank).Select(x => x.Key).ToList();
var mediaIds = groupedBanks.Select(x => x.BankLogoMediaId).ToList();
var banksLogos = _accountContext.Medias.Where(y => mediaIds.Contains(y.id))
.Select(media => new { media.Path, MediaId = media.id });
var banksLogosList = banksLogos.ToList();
var result = new GroupedEmployeeBankInformationViewModel()
{
BankPicturesList = banksLogosList.Select(y => y.Path).ToList(),
EmployeeId = employeeId,
WorkshopId = workshopId,
EmployeeName = entities.FirstOrDefault()?.Employee.FullName ?? "",
TotalBankAccountsCount = entities.Count(),
PersonnelCode = personnelCode,
BankInformation = entities.Select(y => new EmployeeBankInformationViewModel()
{
Id = y.id,
BankId = y.BankId,
BankLogoMediaId=y.Bank.BankLogoMediaId,
BankAccountNumber = y.BankAccountNumber,
BankName = y.Bank.BankName,
CardNumber = y.CardNumber,
ShebaNumber = y.ShebaNumber,
IsDefault = y.IsDefault
}).OrderByDescending(y=>y.IsDefault).ToList()
};
result.BankInformation.ForEach(x =>
{
x.BankLogoPath = banksLogos.FirstOrDefault(z => z.MediaId == x.BankLogoMediaId)?.Path ?? "";
});
return result;
}
public List<EmployeeBankInformation> GetRangeByEmployeeId(long workshopId, long employeeId)
{
return _companyContext.EmployeeBankInformationSet.Where(x =>
x.WorkshopId == workshopId && x.EmployeeId == employeeId).ToList();
}
public void RemoveRange(List<EmployeeBankInformation> entities)
{
_companyContext.EmployeeBankInformationSet.RemoveRange(entities);
}
public EmployeeBankInformationViewModel GetDetails(long id)
{
var entity = _companyContext.EmployeeBankInformationSet.Include(x => x.Bank)
.Include(x => x.Employee).FirstOrDefault(x => x.id == id);
if (entity == null)
return new();
var mediaId = entity.Bank.BankLogoMediaId;
var mediaPath = _accountContext.Medias.FirstOrDefault(x => x.id == mediaId)?.Path ?? "";
return new EmployeeBankInformationViewModel()
{
EmployeeId = entity.EmployeeId,
BankAccountNumber = entity.BankAccountNumber,
BankLogoPath = mediaPath,
BankName = entity.Bank.BankName,
CardNumber = entity.CardNumber,
EmployeeName = entity.Employee.FullName,
Id = entity.id,
ShebaNumber = entity.ShebaNumber,
IsDefault = entity.IsDefault
};
}
public List<GroupedEmployeeBankInformationViewModel> GetAllByWorkshopId(long workshopId)
{
//todo: optimize
var bankInfoQuery = _companyContext.EmployeeBankInformationSet.Where(x => x.WorkshopId == workshopId)
.Include(x => x.Employee).Include(x => x.Bank).AsQueryable();
var personnelCodes =
_companyContext.PersonnelCodeSet.Where(x => bankInfoQuery.Any(y => y.EmployeeId == x.EmployeeId));
var bankInfoList = bankInfoQuery.ToList();
var groupedBanks = bankInfoList.GroupBy(x => x.EmployeeId).Select(x =>new{EmployeeId=x.Key,Banks=x.Select(y=>y.Bank).ToList()}).ToList();
//Get bank logos from account context
var mediaIds = groupedBanks.SelectMany(x => x.Banks.Select(y=>y.BankLogoMediaId)).ToList();
var banksLogos = _accountContext.Medias.Where(y => mediaIds.Contains(y.id))
.Select(media => new { media.Path, MediaId = media.id }).ToList();
return bankInfoList.GroupBy(x => x.Employee).Select(x =>
{
var banks = groupedBanks.First(y => y.EmployeeId == x.Key.id).Banks;
return new GroupedEmployeeBankInformationViewModel()
{
BankPicturesList = banksLogos.Where(y => banks.Any(z => y.MediaId == z.BankLogoMediaId))
.Select(y => y.Path).ToList(),
BankNamesList = banks.Select(y => y.BankName).ToList(),
EmployeeId = x.Key.id,
WorkshopId = workshopId,
EmployeeName = x.Key.FullName,
TotalBankAccountsCount = x.Count(),
PersonnelCode = personnelCodes.FirstOrDefault(y => y.EmployeeId == x.Key.id).PersonnelCode
.ToString(),
BankInformation = x.OrderByDescending(y => y.IsDefault).Select(y =>
new EmployeeBankInformationViewModel()
{
Id = y.id,
BankAccountNumber = y.BankAccountNumber,
BankName = y.Bank.BankName,
CardNumber = y.CardNumber,
ShebaNumber = y.ShebaNumber,
IsDefault = y.IsDefault,
}).ToList()
};
}).ToList();
}
public List<EmployeeBankInformationViewModelForExcel> SearchForExcel(long workshopId, EmployeeBankInformationSearchModel searchParams)
{
var bankInfoQuery = _companyContext.EmployeeBankInformationSet.Where(x => x.WorkshopId == workshopId)
.Include(x => x.Employee).Include(x => x.Bank)
.Select(x => new
{
x.Bank.BankName,
x.BankId,
FullName = (x.Employee.FName + " " + x.Employee.LName),
x.EmployeeId,
x.WorkshopId,
Id = x.id,
x.CardNumber,
x.ShebaNumber,
x.BankAccountNumber,
x.IsDefault
});
if (searchParams.BankId > 0)
bankInfoQuery = bankInfoQuery.Where(x => x.BankId == searchParams.BankId);
if (searchParams.EmployeeId > 0)
bankInfoQuery = bankInfoQuery.Where(x => x.EmployeeId == searchParams.EmployeeId);
if (searchParams.EmployeeBankInfoIds.Any())
bankInfoQuery = bankInfoQuery.Where(x => searchParams.EmployeeBankInfoIds.Contains(x.Id));
var bankInfoList = bankInfoQuery.ToList();
return bankInfoList.GroupBy(x => x.EmployeeId).Select(x =>
{
return new EmployeeBankInformationViewModelForExcel()
{
EmployeeName = x.FirstOrDefault()?.FullName ?? "",
BankInformationList = x.Select(y => new BankInformationDtoForExcel()
{
BankName = y.BankName,
CardNumber = y.CardNumber,
BankAccountNumber = y.BankAccountNumber,
ShebaNumber = y.ShebaNumber,
IsDefault = y.IsDefault
}).ToList()
};
}).ToList();
}
public async Task<GetEmployeeBankInfoDetailsDto> GetDetailsByEmployeeIdAsync(long workshopId, long employeeId)
{
var employeeBankInfos =await _companyContext.EmployeeBankInformationSet
.Where(x => x.EmployeeId == employeeId && x.WorkshopId == workshopId).ToListAsync();
if (employeeBankInfos.Count == 0)
{
throw new NotFoundException("اطلاعات بانکی یافت نشد");
}
var employee = await _companyContext.Employees
.FirstOrDefaultAsync(x=>x.id == employeeId);
if (employee == null)
{
throw new NotFoundException("پرسنل مورد نظر یافت نشد");
}
var employeeFullName = employee.FullName;
var bankIds = employeeBankInfos.Select(x => x.BankId).Distinct().ToList();
var banks = await _companyContext.Banks.Where(x => bankIds.Contains(x.id)).ToListAsync();
var mediaIds = banks.Select(x => x.BankLogoMediaId).ToList();
var bankLogos = await _accountContext.Medias.Where(x=>mediaIds.Contains(x.id)).ToListAsync();
var res = new GetEmployeeBankInfoDetailsDto()
{
EmployeeId = employeeId,
EmployeeFullName = employeeFullName,
BankItems = employeeBankInfos.Select(x =>
{
var bank = banks.FirstOrDefault(y => y.id == x.BankId);
var bankLogo = bankLogos.FirstOrDefault(l => bank?.BankLogoMediaId == l.id);
return new GetEmployeeBankInfoDetailsBankItemDto()
{
BankId = x.BankId,
BankAccountNumber = x.BankAccountNumber,
BankLogoPath = bankLogo?.Path ?? "",
BankName = bank?.BankName ?? "",
CardNumber = x.CardNumber,
ShebaNumber = x.ShebaNumber,
IsDefault = x.IsDefault,
Id = x.id
};
}).ToList()
};
return res;
}
}