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

487 lines
21 KiB
C#

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using _0_Framework.Application;
using _0_Framework.InfraStructure;
using Company.Domain.RollCallEmployeeAgg;
using Company.Domain.RollCallEmployeeStatusAgg;
using Company.Domain.RollCallServiceAgg;
using CompanyManagment.App.Contracts.LeftWorkTemp;
using CompanyManagment.App.Contracts.RollCallEmployee;
using CompanyManagment.App.Contracts.RollCallEmployeeStatus;
using Microsoft.AspNetCore.Hosting;
using Microsoft.EntityFrameworkCore;
using static Microsoft.EntityFrameworkCore.DbLoggerCategory.Database;
namespace CompanyManagment.EFCore.Repository;
public class RollCallEmployeeRepository : RepositoryBase<long, RollCallEmployee>, IRollCallEmployeeRepository
{
private readonly CompanyContext _context;
private readonly IPasswordHasher _passwordHasher;
private readonly IWebHostEnvironment _webHostEnvironment;
private IRollCallServiceRepository _rollCallServiceRepository;
private IRollCallEmployeeStatusRepository _employeeRollCallStatusRepository;
// private IRollCallEmployeeRepository _rollCallEmployeeRepositoryImplementation;
public RollCallEmployeeRepository(CompanyContext context, IPasswordHasher passwordHasher,
IWebHostEnvironment webHostEnvironment, IRollCallServiceRepository rollCallServiceRepository, IRollCallEmployeeStatusRepository employeeRollCallStatusRepository) : base(context)
{
_context = context;
_passwordHasher = passwordHasher;
_webHostEnvironment = webHostEnvironment;
_rollCallServiceRepository = rollCallServiceRepository;
_employeeRollCallStatusRepository = employeeRollCallStatusRepository;
}
public bool HasRollCallRecord(long employeeId, long workshopId, DateTime contractStart, DateTime contractEnd)
{
//موقت
// دادمهرگستر 11 *
//585 کاشی گالری سرامیس (بابک ابراهیمی )
//آموزشگاه ملل 604 *
//کاریابی ملل 605 *
//368 پیتزا امیر آماده سازی
//367 پیتزا امیر رستوران
//286 مرکز توان بخشی رسالت *
//610 بیمارستان پارس - رازقی طعام
DateTime start1404 = new DateTime(2025, 03, 21);
bool skipRollCallByWorkshopId = false;
if (contractStart < start1404)
{
skipRollCallByWorkshopId = workshopId is 11 or 585 or 604 or 605 or 368 or 367 or 286;
}
else
{
skipRollCallByWorkshopId = workshopId is 368 or 610;
}
//#if DEBUG
// skipRollCallByWorkshopId = workshopId is 11 or 585 or 604 or 605 or 368 or 367;
//#endif
if (skipRollCallByWorkshopId)
return false;
// 42550 مصطفی مقدس نژاد فومنی
bool skipRollCallByEmployeeId = employeeId is 42550;
if (skipRollCallByEmployeeId)
return false;
//9211 محسا تازه
if (employeeId == 9211 && contractStart >= start1404)
return false;
var service = _rollCallServiceRepository.GetAllServiceByWorkshopId(workshopId);
if (!service.Any(x => x.StartService.Date <= contractStart.Date && x.EndService.Date >= contractEnd.Date))
return false;
//var rollCallEmployee = GetByEmployeeIdAndWorkshopId(employeeId, workshopId);
//if (rollCallEmployee == null)
// return false;
var rollCallEmployee = _context.RollCallEmployees
.Where(x => x.EmployeeId == employeeId && x.WorkshopId == workshopId)
.Include(x => x.EmployeesStatus);
if (!rollCallEmployee.Any())
return false;
var a = rollCallEmployee.Any(x => x.EmployeesStatus.Any(s =>
(s.StartDate <= contractStart.Date && s.EndDate.Date >= contractEnd.Date) ||
(s.StartDate.Date <= contractStart.Date && s.EndDate.Date > contractStart.Date)));
//var result = _employeeRollCallStatusRepository.w(x => x.RollCallEmployeeId == rollCallEmployee.Id &&
// (x.StartDate.Date <= contractStart.Date && x.EndDate.Date >= contractEnd.Date) ||
// (x.StartDate.Date <= contractStart.Date && x.EndDate.Date > contractStart.Date));
return a;
}
public List<RollCallEmployeeViewModel> GetByWorkshopId(long workshopId)
{
var query = _context.RollCallEmployees.Select(x => new RollCallEmployeeViewModel()
{
Id = x.id,
EmployeeId = x.EmployeeId,
WorkshopId = x.WorkshopId,
EmployeeFullName = x.EmployeeFullName,
IsActiveString = x.IsActiveString,
HasUploadedImage = x.HasUploadedImage
}).Where(x => x.WorkshopId == workshopId);
return query.ToList();
}
public EditRollCallEmployee GetDetails(long id)
{
return _context.RollCallEmployees.Select(x => new EditRollCallEmployee()
{
Id = x.id,
WorkshopId = x.WorkshopId,
EmployeeId = x.EmployeeId,
EmployeeFullName = x.EmployeeFullName,
IsActiveString = x.IsActiveString,
HasUploadedImage = x.HasUploadedImage
}).FirstOrDefault(x => x.Id == id);
}
public RollCallEmployeeViewModel GetByEmployeeIdAndWorkshopId(long employeeId, long workshopId)
{
return _context.RollCallEmployees.Where(x => x.EmployeeId == employeeId && x.WorkshopId == workshopId).Select(
x => new RollCallEmployeeViewModel()
{
Id = x.id,
EmployeeId = x.EmployeeId,
WorkshopId = x.WorkshopId,
EmployeeFName = x.FName,
EmployeeLName = x.LName,
EmployeeFullName = x.EmployeeFullName,
IsActiveString = x.IsActiveString,
HasUploadedImage = x.HasUploadedImage,
Statuses = x.EmployeesStatus.Select(x => new RollCallEmployeeStatusViewModel()
{
StartDateGr = x.StartDate,
EndDateGr = x.EndDate
})
}).FirstOrDefault();
}
public List<RollCallEmployeeViewModel> GetPersonnelRollCallListPaginate(RollCallEmployeeSearchModel command)
{
var dateNow = DateTime.Now;
var employeeQuery = _context.Employees.IgnoreQueryFilters().AsQueryable();
//if (!string.IsNullOrWhiteSpace(command.Name))
//{
// var rollCallNames = _context.RollCallEmployees.Where(x => command.WorkshopId == x.WorkshopId &&
// x.EmployeeFullName.Contains(command.Name)).Select(
// x => new
// {
// x.EmployeeId,
// x.EmployeeFullName
// });
// employeeQuery = employeeQuery.Where(x => rollCallNames.Any(y => y.EmployeeId == x.id));
//}
var rawQuery = employeeQuery.Include(x => x.LeftWorks).Include(x => x.LeftWorkInsurances)
.GroupJoin(_context.LeftWorkTemps.Where(x => x.WorkshopId == command.WorkshopId),
employee => employee.id,
leftWorkTemp => leftWorkTemp.EmployeeId,
((employee, temp) => new { employee, temp }))
.SelectMany(x => x.temp.DefaultIfEmpty(),
(x, temp) => new { x.employee, temp })
.Where(x => x.employee.LeftWorks.Any(y =>
y.WorkshopId == command.WorkshopId && y.StartWorkDate <= dateNow &&
y.LeftWorkDate > dateNow || (y.WorkshopId == command.WorkshopId && y.StartWorkDate > dateNow)) ||
x.temp != null).OrderByDescending(x => x.employee.id)
.Select(x => new
{
Id = x.employee.id,
FullName = x.employee.FName + " " + x.employee.LName,
x.employee.NationalCode,
workshopTemp = x.temp
}).AsSplitQuery();
var rollCallEmployees = _context.RollCallEmployees.Where(x => x.WorkshopId == command.WorkshopId);
var employeeClient = _context.EmployeeClientTemps.Where(x => x.WorkshopId == command.WorkshopId);
var joinedQuery = from employee in rawQuery
join rollCallEmployee in rollCallEmployees
on employee.Id equals rollCallEmployee.EmployeeId into grp
from joinedRollCall in grp.DefaultIfEmpty()
join employeeClientT in employeeClient on employee.Id equals employeeClientT.EmployeeId into employeeCT
from clientTemp in employeeCT.DefaultIfEmpty()
select new RollCallEmployeeViewModel()
{
WorkshopId = command.WorkshopId,
EmployeeId = employee.Id,
Id = joinedRollCall == null ? 0 : joinedRollCall.id,
EmployeeFullName = employee.FullName,
NationalCode = employee.NationalCode,
IsActiveString =
joinedRollCall.EmployeesStatus.Any(y =>
y.StartDate.Date <= dateNow.Date && y.EndDate.Date > dateNow.Date)
? "true"
: "false",
HasUploadedImage = joinedRollCall == null ? "false" : joinedRollCall.HasUploadedImage,
CreatedByClient = clientTemp != null || (employee.workshopTemp != null && employee.workshopTemp.LeftWorkType == LeftWorkTempType.StartWork),
RollCallEmployeeName = joinedRollCall == null ? null : joinedRollCall.EmployeeFullName,
HasChangedName = joinedRollCall != null && joinedRollCall.HasChangedName
};
if (!string.IsNullOrWhiteSpace(command.Name))
{
joinedQuery = joinedQuery.Where(x => x.EmployeeFullName.Contains(command.Name));
}
var firstlist = joinedQuery.AsSplitQuery();
var list = firstlist.OrderByDescending(x => x.CreatedByClient).ThenByDescending(x => x.IsActiveString == "true" ? 0 : 1)
.ThenByDescending(x => x.HasUploadedImage == "true" ? 1 : 0)
.Skip(command.PageIndex).Take(30).ToList();
var watch = new Stopwatch();
watch.Start();
list.ForEach(x =>
{
x.EmployeeSlug = _passwordHasher.SlugHasher(x.EmployeeId);
if (x.HasUploadedImage == "true")
{
try
{
var path = Path.Combine(_webHostEnvironment.ContentRootPath, "Faces", command.WorkshopId.ToString(),
x.EmployeeId.ToString());
var thumbnailPath = Path.Combine(path, "Thumbnail.jpg");
if (System.IO.File.Exists(thumbnailPath))
{
var bytes = System.IO.File.ReadAllBytes(thumbnailPath);
var image = Convert.ToBase64String(bytes);
x.ImagePath = image;
}
else if (System.IO.File.Exists(Path.Combine(path, "1.jpg")))
{
var thumbnail = Tools.ResizeImage(Path.Combine(path, "1.jpg"), 150, 150);
System.IO.File.WriteAllBytes(thumbnailPath, Convert.FromBase64String(thumbnail));
x.ImagePath = thumbnail;
}
}
catch
{
// ignored
}
}
});
Console.WriteLine(watch.Elapsed);
return list;
}
public RollCallEmployee GetWithRollCallStatus(long id)
{
return _context.RollCallEmployees.Include(x => x.EmployeesStatus)
.FirstOrDefault(x => x.id == id);
}
public int activedPerson(long workshopId)
{
return _context.RollCallEmployees.Count(x =>
x.WorkshopId == workshopId && x.IsActiveString == "true" && x.HasUploadedImage == "true");
}
#region Pooya
public List<RollCallEmployeeViewModel> GetRollCallEmployeesByWorkshopId(long workshopId)
{
var dateNow = DateTime.Now.Date;
var personnelCodes = _context.PersonnelCodeSet.Where(x => x.WorkshopId == workshopId);
return _context.RollCallEmployees.Include(x => x.EmployeesStatus).Where(x => x.WorkshopId == workshopId &&
personnelCodes.Any(y => y.EmployeeId == x.EmployeeId))
.Select(x =>
new RollCallEmployeeViewModel()
{
EmployeeId = x.EmployeeId,
EmployeeFullName = x.EmployeeFullName,
Id = x.id,
WorkshopId = x.WorkshopId,
IsActiveString = x.EmployeesStatus.Any(y => y.StartDate.Date <= dateNow && y.EndDate.Date > dateNow) ? "true" : "false",
HasUploadedImage = x.HasUploadedImage,
Statuses = x.EmployeesStatus.Select(y => new RollCallEmployeeStatusViewModel()
{
StartDateGr = y.StartDate,
EndDateGr = y.EndDate,
Id = y.id
})
}).ToList();
}
public List<RollCallEmployeeViewModel> GetByEmployeeIdWithStatuses(long employeeId)
{
return _context.RollCallEmployees.Include(x => x.EmployeesStatus)
.Where(x => x.EmployeeId == employeeId).Select(x =>
new RollCallEmployeeViewModel()
{
EmployeeId = x.EmployeeId,
EmployeeFullName = x.EmployeeFullName,
Id = x.id,
WorkshopId = x.WorkshopId,
IsActiveString = x.IsActiveString,
HasUploadedImage = x.HasUploadedImage,
Statuses = x.EmployeesStatus.Select(y => new RollCallEmployeeStatusViewModel()
{
StartDateGr = y.StartDate,
EndDateGr = y.EndDate,
Id = y.id
})
}).ToList();
;
}
public List<RollCallEmployeeViewModel> GetActivePersonnelByWorkshopId(long workshopId)
{
var dateNow = DateTime.Now.Date;
var leftWork = _context.LeftWorkList.Where(x =>
x.WorkshopId == workshopId && x.StartWorkDate <= dateNow && x.LeftWorkDate >= dateNow);
var rollCallEmployeesQuery = _context.RollCallEmployees.Include(x => x.EmployeesStatus)
.Where(x => x.WorkshopId == workshopId
&& x.EmployeesStatus.Any(y => y.StartDate.Date <= dateNow && y.EndDate.Date > dateNow)
&& x.HasUploadedImage == "true" && leftWork.Any(l => l.EmployeeId == x.EmployeeId && l.WorkshopId == x.WorkshopId));
var personnel =
_context.PersonnelCodeSet.Where(x => x.WorkshopId == workshopId && rollCallEmployeesQuery.Any(y => y.EmployeeId == x.EmployeeId && y.WorkshopId == x.WorkshopId))
.Select(x => new { x.EmployeeId, x.PersonnelCode }).ToList();
var rollCallEmployeesList = rollCallEmployeesQuery.ToList();
return personnel.Select(x =>
{
var name = rollCallEmployeesList.FirstOrDefault(y => x.EmployeeId == y.EmployeeId);
return new RollCallEmployeeViewModel()
{
PersonelCode = x.PersonnelCode,
EmployeeFName = name.FName,
EmployeeLName = name.LName,
EmployeeId = x.EmployeeId,
EmployeeFullName = name.EmployeeFullName
};
}).OrderBy(x => x.EmployeeLName).ToList();
}
public List<RollCallEmployeeViewModel> GetEmployeeRollCalls(long workshopId)
{
var personnelCodes = _context.PersonnelCodeSet.Where(x => x.WorkshopId == workshopId);
var rollCallEmployeesQuery = _context.RollCallEmployees.Include(x => x.EmployeesStatus)
.Where(x => x.WorkshopId == workshopId && x.EmployeesStatus.Any() && personnelCodes.Any(y => y.EmployeeId == x.EmployeeId));
var res = rollCallEmployeesQuery.Select(x => new RollCallEmployeeViewModel
{
RollCallEmployeeId = x.id,
EmployeeId = x.EmployeeId,
EmployeeFullName = x.EmployeeFullName
})
.ToList();
return res;
}
public List<RollCallEmployeeViewModel> GetPersonnelRollCallListAll(long workshopId)
{
//var dateNow = DateTime.Now;
//var f = _context.Employees.Include(x => x.LeftWorks).Include(x => x.LeftWorkInsurances)
// .Where(x => x.LeftWorks.Any(y => y.WorkshopId == workshopId && y.StartWorkDate <= dateNow && y.LeftWorkDate > dateNow) ||
// x.LeftWorkInsurances.Any(y => y.WorkshopId == workshopId && y.StartWorkDate <= dateNow &&
// (y.LeftWorkDate > dateNow || y.LeftWorkDate == null))).ToList();
//var res = f.Select(x => new RollCallEmployeeViewModel
//{
// WorkshopId = workshopId,
// EmployeeId = x.id,
// Id = _context.RollCallEmployees.Any(r => r.EmployeeId == x.id && r.WorkshopId == workshopId) ?
// _context.RollCallEmployees.FirstOrDefault(r => r.EmployeeId == x.id && r.WorkshopId == workshopId)!.id : 0,
// EmployeeFullName = $"{x.FName} {x.LName}",
// EmployeeSlug = _passwordHasher.SlugHasher(x.id),
// NationalCode = _context.Employees.FirstOrDefault(e => e.id == x.id).NationalCode,
// IsActiveString = _context.RollCallEmployees.Any(r => r.EmployeeId == x.id && r.WorkshopId == workshopId && r.IsActiveString == "true") ? "true" : "false",
// HasUploadedImage = _context.RollCallEmployees.Any(r => r.EmployeeId == x.id && r.WorkshopId == workshopId && r.HasUploadedImage == "true") ? "true" : "false",
// ImagePath = (System.IO.File.Exists(Path.Combine(_webHostEnvironment.ContentRootPath, "Faces", workshopId.ToString(), x.id.ToString(), "1.jpg")))
// ? Tools.ResizeImage(Path.Combine(_webHostEnvironment.ContentRootPath, "Faces", workshopId.ToString(), x.id.ToString(), "1.jpg"), 150, 150)
// : "",
//}).OrderBy(x => x.PersonelCode)
// .ToList();
//return res;
return new();
}
#endregion
#region Farokhi&Mahan
public (int activeEmployees, int deActiveEmployees) GetActiveAndDeActiveRollCallEmployees(long workshopId)
{
var dateNow = DateTime.Now;
var rawQuery = _context.Employees.Include(x => x.LeftWorks).Include(x => x.LeftWorkInsurances)
.Where(x => x.LeftWorks.Any(y =>
y.WorkshopId == workshopId && y.StartWorkDate <= dateNow &&
y.LeftWorkDate > dateNow) ||
x.LeftWorkInsurances.Any(y =>
y.WorkshopId == workshopId && y.StartWorkDate <= dateNow &&
(y.LeftWorkDate > dateNow || y.LeftWorkDate == null))).OrderByDescending(x => x.id)
.Select(x => new
{
Id = x.id,
}).Distinct();
var rollCallEmployees = _context.RollCallEmployees.Include(x => x.EmployeesStatus).Where(x => x.WorkshopId == workshopId);
var joinedQuery = from employee in rawQuery
join rollCallEmployee in rollCallEmployees
on employee.Id equals rollCallEmployee.EmployeeId into grp
from joinedRollCall in grp.DefaultIfEmpty()
select new RollCallEmployeeViewModel()
{
IsActiveString = joinedRollCall.EmployeesStatus.Any(y => y.StartDate.Date <= dateNow.Date && y.EndDate.Date > dateNow.Date) ? "true" : "false",
};
var deActiveCount = joinedQuery.Count(x => x.IsActiveString == "false");
var ActiveCount = joinedQuery.Count(x => x.IsActiveString == "true");
return (ActiveCount, deActiveCount);
}
public bool HasEmployees(long workshopId)
{
var dateNow = DateTime.Now;
return _context.Employees.Include(x => x.LeftWorks).Include(x => x.LeftWorkInsurances)
.Any(x => x.LeftWorks.Any(y =>
y.WorkshopId == workshopId && y.StartWorkDate <= dateNow &&
y.LeftWorkDate > dateNow) ||
x.LeftWorkInsurances.Any(y =>
y.WorkshopId == workshopId && y.StartWorkDate <= dateNow &&
(y.LeftWorkDate > dateNow || y.LeftWorkDate == null)));
}
public RollCallEmployee GetBy(long employeeId, long workshopId)
{
return _context.RollCallEmployees.Include(x => x.EmployeesStatus)
.FirstOrDefault(x => x.EmployeeId == employeeId && x.WorkshopId == workshopId);
}
#endregion
}