using Microsoft.EntityFrameworkCore; using MTWorkHR.Application.Identity; using MTWorkHR.Application.Mapper; using MTWorkHR.Application.Models; using MTWorkHR.Core.Global; using MTWorkHR.Core.UnitOfWork; using MTWorkHR.Application.Services.Interfaces; using MTWorkHR.Core.Entities; using System.Linq.Dynamic.Core; using Microsoft.AspNetCore.Identity; using MTWorkHR.Infrastructure.Entities; using System.Linq; using MTWorkHR.Core.IDto; using MTWorkHR.Core.Entities.User; namespace MTWorkHR.Application.Services { public class ContractService : BaseService, IContractService { private readonly IUnitOfWork _unitOfWork; private readonly IUserService _userService; private readonly GlobalInfo _globalInfo; private readonly IOrderAllocationService _orderAllocationService; public ContractService(IUnitOfWork unitOfWork, IUserService userService, GlobalInfo globalInfo, IOrderAllocationService orderAllocationService) : base(unitOfWork) { _unitOfWork = unitOfWork; _userService = userService; _globalInfo = globalInfo; _orderAllocationService = orderAllocationService; } public override async Task GetById(long id) { var entity = await _unitOfWork.Contract.GetByIdWithAllChildren(id); var response = MapperObject.Mapper.Map(entity); response.WorkingDays = entity.WorkingDays != null ? entity.WorkingDays.Split(",").ToList() : null; return response; } public override async Task Create(ContractDto input) { var entity = MapperObject.Mapper.Map(input); if (entity is null) { throw new AppException(ExceptionEnum.MapperIssue); } entity.WorkingDays = input.WorkingDays!=null? string.Join(",", input.WorkingDays): null; var team = await _unitOfWork.Contract.AddAsync(entity); await _unitOfWork.CompleteAsync(); var response = MapperObject.Mapper.Map(team); return response; } //public override async Task Update(ContractDto input) //{ // var entity = MapperObject.Mapper.Map(input); // if (entity is null) // { // throw new AppException(ExceptionEnum.MapperIssue); // } // var contract = await _unitOfWork.Contract.upd(entity); // await _unitOfWork.CompleteAsync(); // var response = Mapper.MapperObject.Mapper.Map(entity); // return response; //} public async Task> GetAll(ContractPagingInputDto PagingInputDto) { var res = await _unitOfWork.Contract.GetAllWithChildrenAsync(); var query = res.Item1; if (_globalInfo.UserType != UserTypeEnum.Business) { // query = query.Where(m => m.ContractUsers != null && m.ContractUsers.Count > 0 && m.ContractUsers.Count(u=> u.AssignedUserId == _globalInfo.UserId) > 0); } if (PagingInputDto.Filter != null) { var filter = PagingInputDto.Filter; query = query.Where(u => u.JobDescription != null && u.JobDescription.Contains(filter)); } if (PagingInputDto.ContractStatusId != null) { query = query.Where(u => (int)u.ContractStatusId == PagingInputDto.ContractStatusId); } if (PagingInputDto.ContractTypeId != null) { query = query.Where(u => (int)u.ContractTypeId == PagingInputDto.ContractTypeId); } var order = query.OrderBy(PagingInputDto.OrderByField + " " + PagingInputDto.OrderType); var page = order.Skip((PagingInputDto.PageNumber * PagingInputDto.PageSize) - PagingInputDto.PageSize).Take(PagingInputDto.PageSize); var total = await query.CountAsync(); var list = MapperObject.Mapper .Map>(await page.ToListAsync()); foreach (var item in list) { if (item.UserId != null) { var user = await _userService.GetUserWithAttachmentById(item.UserId); if (user != null) { item.EmployeeName = user.FirstName + " " + user.LastName; item.EmployeeEmail = user.Email; } } } var response = new PagingResultDto { Result = list, Total = total }; return response; } #region HR data____________________________ public async Task> GetAllForHr(ContractPagingInputDto PagingInputDto) { var res = await _unitOfWork.Contract.GetAllWithChildrenAsync(); var query = res.Item1; if (_globalInfo.UserType != UserTypeEnum.Business) { // query = query.Where(m => m.ContractUsers != null && m.ContractUsers.Count > 0 && m.ContractUsers.Count(u=> u.AssignedUserId == _globalInfo.UserId) > 0); } if (PagingInputDto.Filter != null) { var filter = PagingInputDto.Filter; query = query.Where(u => u.JobDescription.Contains(filter)); } if (PagingInputDto.ContractStatusId != null) { query = query.Where(u => (int)u.ContractStatusId == PagingInputDto.ContractStatusId); } if (PagingInputDto.ContractTypeId != null) { query = query.Where(u => (int)u.ContractTypeId == PagingInputDto.ContractTypeId); } var order = query.OrderBy(PagingInputDto.OrderByField + " " + PagingInputDto.OrderType); var page = order.Skip((PagingInputDto.PageNumber * PagingInputDto.PageSize) - PagingInputDto.PageSize).Take(PagingInputDto.PageSize); var total = await query.CountAsync(); var list = MapperObject.Mapper .Map>(await page.ToListAsync()); var teamUsersList = await _unitOfWork.TeamUser.GetAllWithChildrenAsync(); var vacationAllocations = await _unitOfWork.OrderAllocation.GetAllAsync(); foreach (var item in list) { if (item.UserId != null) { var user = await _userService.GetUserWithAttachmentById(item.UserId); if (user != null) { item.EmployeeName = user.FirstName + " " + user.LastName; item.EmployeeEmail = user.Email; //___________Get Teams //var TeamsList = teamUsersList.Item1.Where(t => t.AssignedUserId == item.UserId).Select(t => GlobalInfo.lang == "en" ? t.Team.NameEn : t.Team.NameAr); //item.Teams = TeamsList == null ? "" : string.Join(",", TeamsList); var latestTeam = teamUsersList.Item1.OrderByDescending(a=> a.Id).FirstOrDefault(t => t.AssignedUserId == item.UserId); item.Teams = latestTeam == null ? "" : GlobalInfo.lang == "en" ? latestTeam.Team?.NameEn : latestTeam.Team?.NameAr; //_____________Get vacation balance var remainVacations = vacationAllocations.Item1.FirstOrDefault(t => t.EmployeeId == item.UserId && t.ContractId == item.Id); item.RestVacations = remainVacations == null ? item.VacationDays : remainVacations.NumberOfDays ; item.SpentVacations = item.VacationDays - item.RestVacations; } } } // Filter employees by name if provided if (!string.IsNullOrEmpty(PagingInputDto.UserName)) { var filter = PagingInputDto.UserName; list = list.Where(u => (u.EmployeeName != null && u.EmployeeName.Contains(filter)) || (u.EmployeeEmail != null && u.EmployeeEmail.Contains(filter)) ).ToList(); } var response = new PagingResultDto { Result = list, Total = list.Count }; return response; } public async Task GetByIdHRDetails(long contractId) { var entity = await _unitOfWork.Contract.GetByIdWithAllChildren(contractId); if (entity != null) { var response = MapperObject.Mapper.Map(entity); response.WorkingDays = entity.WorkingDays != null ? entity.WorkingDays.Split(",").ToList() : null; //-------------------- var user = await _userService.GetUserWithAttachmentById(entity.UserId); response.EmployeeName = user.FirstName + " " + user.LastName; response.EmployeeEmail = user.Email; //___________Get Teams var teamUsersList = await _unitOfWork.TeamUser.GetUserTeams(entity.UserId); var teamsList = MapperObject.Mapper.Map>(teamUsersList.Item1); response.TeamList = teamsList; //_____________Get vacation balance var vacationAllocations = await _unitOfWork.OrderAllocation.GetUserAllocations(entity.UserId, 1, 1, entity.Id, DateTime.Now.Year); var remainVacations = vacationAllocations; response.RestVacations = remainVacations == null ? entity.VacationDays : remainVacations.NumberOfDays; response.SpentVacations = entity.VacationDays - response.RestVacations; //__-----------Order Requests---- var orderRequestsList = await _unitOfWork.OrderRequest.GetAllUserOrdersAsync(entity.UserId, contractId); var vacationsList = orderRequestsList.Item1.Where(o => o.OrderStatus == ApprovalStatusEnum.Approved && o.OrderTypeId == 1 && (o.LeaveTypeId == 1 || o.LeaveTypeId == 2)); var orderList = MapperObject.Mapper.Map>(vacationsList); response.OrderList = orderList; /////------------------------ var invoiceList = await _unitOfWork.Invoice.GetAllUserInvoices(contractId); var Invoices = MapperObject.Mapper.Map>(invoiceList.Item1); response.InvoiceList = Invoices; //------------------ if(entity.ContractTypeId == (int)ContractTypeEnum.EmployeeContract) { var lastInvoice = Invoices.LastOrDefault(); var diffDate = DateTime.Now.Date - entity.StartDate.Value.Date; if(lastInvoice != null) { if (entity.BillingCycle == "Monthly") response.NextSalaryDate = lastInvoice.InvoiceDate.Value.AddMonths(1); else if (entity.BillingCycle == "Fortnightly") response.NextSalaryDate = lastInvoice.InvoiceDate.Value.AddDays(15); } else { if (entity.BillingCycle == "Monthly") response.NextSalaryDate = entity.StartDate.Value.AddMonths(1); else if(entity.BillingCycle == "Fortnightly") response.NextSalaryDate = entity.StartDate.Value.AddDays(15); } } return response; } return new ContractHRDto(); } #endregion public async Task ChangeStatus(long contractId, int statusId) { var entity = await _unitOfWork.Contract.GetByIdAsync(contractId); if (entity == null) throw new AppException(ExceptionEnum.RecordNotExist); entity.ContractStatusId = statusId; bool result = true; if (statusId == (int)ContractStatusEnum.Approved) { var updatedSuccess = await _userService.Update(entity.UserId, entity.CompanyId); addVacationAllocation(entity.VacationDays.HasValue ? entity.VacationDays.Value : 0, entity.UserId, contractId); if (!updatedSuccess) { result = false; } } return result; } private async Task addVacationAllocation(int noVacationDays, string employeeId, long contractId) { try { await _orderAllocationService.Create(new OrderAllocationDto { ContractId = contractId, EmployeeId = employeeId, OrderTypeId = 1, LeaveTypeId = 1, NumberOfDays = noVacationDays, Period = DateTime.Now.Year }); // var orderTypes = await _unitOfWork.OrderType.GetAllAsync(); // var leaveTypes = await _unitOfWork.LeaveType.GetAllAsync(); //foreach (var orderType in orderTypes.Item1) //{ // foreach (var leaveType in leaveTypes.Item1) // { // if (orderType.Id != 1 && leaveType.Id != 1 && (leaveType.DefaultDays > 0 || orderType.DefaultDays > 0)) // { // await _orderAllocationService.Create(new OrderAllocationDto // { // ContractId = contractId, // EmployeeId = employeeId, // OrderTypeId = (int)orderType.Id, // LeaveTypeId = (int)leaveType.Id, // NumberOfDays = leaveType.DefaultDays > 0 ? leaveType.DefaultDays : orderType.DefaultDays, // Period = DateTime.Now.Year // } // ); // } // } //} } catch(Exception ex) { throw ; } } } }