using _0_Framework.Application; using Company.Domain.EmployeeAgg; using Company.Domain.LeftWorkAgg; using Company.Domain.RollCallEmployeeAgg; using Company.Domain.RollCallEmployeeStatusAgg; using CompanyManagment.App.Contracts.RollCallEmployee; using CompanyManagment.App.Contracts.RollCallEmployeeStatus; using Microsoft.AspNetCore.Hosting; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Transactions; using _0_Framework.Application.FaceEmbedding; using static Microsoft.EntityFrameworkCore.DbLoggerCategory.Database; namespace CompanyManagment.Application; public class RollCallEmployeeApplication : IRollCallEmployeeApplication { private readonly IRollCallEmployeeRepository _rollCallEmployeeRepository; private readonly IRollCallEmployeeStatusApplication _rollCallEmployeeStatusApplication; private readonly IEmployeeRepository _employeeRepository; private readonly ILeftWorkRepository _leftWorkRepository; private readonly IRollCallEmployeeStatusRepository _rollCallEmployeeStatusRepository; private readonly IWebHostEnvironment _webHostEnvironment; private readonly IFaceEmbeddingService _faceEmbeddingService; public RollCallEmployeeApplication(IRollCallEmployeeRepository rollCallEmployeeRepository, IEmployeeRepository employeeRepository, IRollCallEmployeeStatusApplication rollCallEmployeeStatusApplication, ILeftWorkRepository leftWorkRepository, IRollCallEmployeeStatusRepository rollCallEmployeeStatusRepository, IWebHostEnvironment webHostEnvironment, IFaceEmbeddingService faceEmbeddingService) { _rollCallEmployeeRepository = rollCallEmployeeRepository; _employeeRepository = employeeRepository; _rollCallEmployeeStatusApplication = rollCallEmployeeStatusApplication; _leftWorkRepository = leftWorkRepository; _rollCallEmployeeStatusRepository = rollCallEmployeeStatusRepository; _webHostEnvironment = webHostEnvironment; _faceEmbeddingService = faceEmbeddingService; } public OperationResult Create(CreateRollCallEmployee command) { var opreation = new OperationResult(); if (_rollCallEmployeeRepository.Exists(x => x.EmployeeId == command.EmployeeId && x.WorkshopId == command.EmployeeId)) return opreation.Succcedded(); var fullname = _employeeRepository.GetDetails(command.EmployeeId); if (fullname == null) return opreation.Failed("پرسنل یافت نشد"); var create = new RollCallEmployee(command.WorkshopId, command.EmployeeId, fullname.FName, fullname.LName); _rollCallEmployeeRepository.Create(create); if (command.HasUploadedImage == "true") create.HasImage(); _rollCallEmployeeRepository.SaveChanges(); return opreation.Succcedded(create.id); } public OperationResult Active(long id) { var opreation = new OperationResult(); var emp = _rollCallEmployeeRepository.Get(id); if (emp == null) return opreation.Failed("پرسنل یافت نشد"); if (!_leftWorkRepository.Exists(x => x.EmployeeId == emp.EmployeeId && x.WorkshopId == emp.WorkshopId && x.StartWorkDate <= DateTime.Now && x.LeftWorkDate > DateTime.Now)) return opreation.Failed("کارمند شروع به کار ندارد"); if (emp.HasUploadedImage == "false") return opreation.Failed("لطفا ابتدا عکس پرسنل را آپلود کنید"); using var transaction = new TransactionScope(); emp.Active(); var operation2 = _rollCallEmployeeStatusApplication.Create(new CreateRollCallEmployeeStatus() { RollCallEmployeeId = id }); if (operation2.IsSuccedded == false) return operation2; _rollCallEmployeeRepository.SaveChanges(); transaction.Complete(); return operation2; } public OperationResult DeActive(long id) { var opreation = new OperationResult(); var emp = _rollCallEmployeeRepository.GetWithRollCallStatus(id); if (emp == null) return opreation.Failed("پرسنل یافت نشد"); var lastStatus = emp.EmployeesStatus.MaxBy(x => x.StartDate); emp.DeActive(); _rollCallEmployeeRepository.SaveChanges(); _rollCallEmployeeStatusApplication.Deactivate(lastStatus.id); return opreation.Succcedded(); } public OperationResult UploadedImage(long Employeeid, long WorkshopId) { var opreation = new OperationResult(); var emp = _rollCallEmployeeRepository.GetByEmployeeIdAndWorkshopId(Employeeid, WorkshopId); if (emp == null) return opreation.Failed("پرسنل یافت نشد"); var rollCall = _rollCallEmployeeRepository.Get(emp.Id); rollCall.HasImage(); _rollCallEmployeeRepository.SaveChanges(); var path = Path.Combine(_webHostEnvironment.ContentRootPath, "Faces", WorkshopId.ToString(), Employeeid.ToString()); var thumbnailPath = Path.Combine(path, "Thumbnail.jpg"); try { var thumbnail = Tools.ResizeImage(Path.Combine(path, "1.jpg"), 150, 150); System.IO.File.WriteAllBytes(thumbnailPath, Convert.FromBase64String(thumbnail)); } catch { // ignored } return opreation.Succcedded(); } public List GetByWorkshopId(long workshopId) { return _rollCallEmployeeRepository.GetByWorkshopId(workshopId); } public EditRollCallEmployee GetDetails(long id) { return _rollCallEmployeeRepository.GetDetails(id); } public RollCallEmployeeViewModel GetByEmployeeIdAndWorkshopId(long employeeId, long workshopId) { return _rollCallEmployeeRepository.GetByEmployeeIdAndWorkshopId(employeeId, workshopId); } public List GetPersonnelRollCallListPaginate(RollCallEmployeeSearchModel command) { return _rollCallEmployeeRepository.GetPersonnelRollCallListPaginate(command); } public int activedPerson(long workshopId) { return _rollCallEmployeeRepository.activedPerson(workshopId); } #region Pooya public List GetRollCallEmployeesByWorkshopId(long workshopId) { return _rollCallEmployeeRepository.GetRollCallEmployeesByWorkshopId(workshopId); } public List GetActivePersonnelByWorkshopId(long workshopId) { return _rollCallEmployeeRepository.GetActivePersonnelByWorkshopId(workshopId); } public bool IsEmployeeRollCallActive(long employeeId, long workshopId) { RollCallEmployeeViewModel rollCallEmployee = _rollCallEmployeeRepository.GetByEmployeeIdAndWorkshopId(employeeId, workshopId); if (rollCallEmployee == null || rollCallEmployee.IsActiveString != "true" || rollCallEmployee.HasUploadedImage != "true") return false; var now = DateTime.Now; return _rollCallEmployeeStatusRepository.Exists(x => x.RollCallEmployeeId == rollCallEmployee.Id && x.StartDate < now && x.EndDate > now); } public List GetEmployeeRollCalls(long workshopId) { return _rollCallEmployeeRepository.GetEmployeeRollCalls(workshopId); } public (int activeEmployees, int deActiveEmployees) GetActiveAndDeActiveRollCallEmployees(long workshopId) { return _rollCallEmployeeRepository.GetActiveAndDeActiveRollCallEmployees(workshopId); } public List GetPersonnelRollCallListAll(long workshopId) { return _rollCallEmployeeRepository.GetPersonnelRollCallListAll(workshopId); } public bool HasEmployees(long workshopId) { return _rollCallEmployeeRepository.HasEmployees(workshopId); } public OperationResult ChangeEmployeeRollCallName(long rollCallEmployeeId, string fName, string lName) { OperationResult result = new(); if (string.IsNullOrWhiteSpace(lName) || string.IsNullOrWhiteSpace(fName)) return result.Failed("نام و نام خانوادگی نمی توانند خالی باشند"); fName = fName.Trim(); lName = lName.Trim(); var fullName = $"{fName} {lName}"; var entity = _rollCallEmployeeRepository.Get(rollCallEmployeeId); if (entity == null) return result.Failed(ApplicationMessages.RecordNotFound); if (_rollCallEmployeeRepository.Exists(x => x.WorkshopId == entity.WorkshopId && x.EmployeeFullName == fullName && x.id != rollCallEmployeeId)) return result.Failed("نام و نام خانوادگی کارمند نمی تواند با نام و نام خانوادگی کارمند دیگری در آن کارگاه یکسان باشد"); if (entity.IsActiveString != "true") return result.Failed("امکان تغییر نام برای کارمند غیر فعال وجود ندارد"); var transaction = _rollCallEmployeeRepository.BeginTransactionAsync().GetAwaiter().GetResult(); entity.ChangeName(fName, lName); _rollCallEmployeeRepository.SaveChanges(); var embeddingRes =_faceEmbeddingService .UpdateEmbeddingFullNameAsync(entity.EmployeeId, entity.WorkshopId, fullName) .GetAwaiter().GetResult(); if (!embeddingRes.IsSuccedded) return result.Failed("خطا در به روز رسانی نام در سیستم تشخیص چهره: " + embeddingRes.Message); transaction.Commit(); return result.Succcedded(); } #endregion }