using System; using System.Collections.Generic; using _0_Framework.InfraStructure; using Microsoft.AspNetCore.Http; using Microsoft.EntityFrameworkCore; using System.Linq; using System.Threading.Tasks; using _0_Framework.Application; using AccountManagement.Application.Contracts.Account; using AccountManagement.Application.Contracts.Assign; using AccountManagement.Application.Contracts.Media; using AccountManagement.Application.Contracts.Task; using AccountManagement.Application.Contracts.TaskMessage; using AccountManagement.Domain.AccountAgg; using AccountManagement.Domain.TaskAgg; using AccountManagement.Domain.TicketAgg; using Microsoft.AspNetCore.Hosting; using AccountManagement.Application.Contracts.Ticket; using AccountManagement.Domain.PositionAgg; using Microsoft.Identity.Client; namespace AccountMangement.Infrastructure.EFCore.Repository; public class TaskRepository : RepositoryBase, ITaskRepository { private readonly AccountContext _accountContext; private readonly IHttpContextAccessor _contextAccessor; private readonly IAccountRepository _accountRepository; private readonly IPositionRepository _positionRepository; private readonly IWebHostEnvironment _webHostEnvironment; private readonly IAuthHelper _authHelper; private readonly ITicketRepository _ticketRepository; public TaskRepository(IHttpContextAccessor contextAccessor, AccountContext accountContext, IAccountRepository accountRepository, IPositionRepository positionRepository, IWebHostEnvironment webHostEnvironment, IAuthHelper authHelper, ITicketRepository ticketRepository) : base(accountContext) { _contextAccessor = contextAccessor; _accountContext = accountContext; _accountRepository = accountRepository; _positionRepository = positionRepository; _webHostEnvironment = webHostEnvironment; _authHelper = authHelper; _ticketRepository = ticketRepository; } public EditTask GetDetails(long TaskId) { var userId = _authHelper.CurrentAccountId(); EditTask res = _accountContext.Tasks.Include(x => x.Assigns).Where(x => x.id == TaskId).Select(x => new EditTask() { Description = x.Description, Id = x.id, Title = x.Title, medias = _accountContext.TaskMedias.Include(z => z.Media).Where(e => e.TaskId == x.id).Select(m => new MediaViewModel() { Path = m.Media.Path, Type = m.Media.Type, Category = m.Media.Category, Id = m.Media.id }).ToList(), ContractingPartyName = x.ContractingPartyName, ReceiverId = _accountContext.Assigns.Where(a => a.TaskId == x.id).Select(a => a.AssignedId).ToList(), SenderId = x.SenderId, AssignViewModels = x.Assigns.Select(a => new AssignViewModel() { Id = a.id, EndTaskDateFa = a.EndTaskDate.ToFarsi(), IsCancel = a.IsCancel, IsCanceledRequest = a.IsCanceledRequest, IsDone = a.IsDone, IsDoneRequest = a.IsDoneRequest, TimeRequest = a.TimeRequest, AssignedName = a.AssignedName, AssignedId = a.AssignedId, AssignerId = a.AssignerId }).ToList(), IsDone = x.Assigns.All(a => a.IsDone), IsCancel = x.Assigns.All(a => a.IsCancel), TicketId = x.TicketId, CreateDateFa = x.CreationDate.ToFarsi(), SenderViewModel = _accountContext.Accounts.Where(a => a.id == x.SenderId).Select(a => new AccountViewModel() { Fullname = a.Fullname, Id = a.id, }).FirstOrDefault(), TaskScheduleId = x.TaskScheduleId ?? 0 }).FirstOrDefault(); res.TicketViewModel = res.TicketId != null && res.TicketId > 0 ? _ticketRepository.GetDetails(res.TicketId.Value) : null; if (res.AssignViewModels.Any(x => x.AssignedId == userId)) { res.EndTaskDate = _accountContext.Assigns.First(a => a.TaskId == res.Id && a.AssignedId == userId) .EndTaskDate.ToFarsi(); res.AssignViewModels = res.AssignViewModels.Where(x => x.AssignedId == userId).ToList(); res.IsDone = res.AssignViewModels.First(x => x.AssignedId == userId).IsDone; res.IsCancel = res.AssignViewModels.First(x => x.AssignedId == userId).IsCancel; } if (res.TaskScheduleId>0) { var taskSchedule = _accountContext.TaskSchedules.FirstOrDefault(x => x.id == res.TaskScheduleId); res.ScheduleUnitType = taskSchedule.UnitType; res.ScheduleType = taskSchedule.Type; res.ScheduleCount = taskSchedule.Count; res.ScheduleUnitNumber = taskSchedule.UnitNumber; } //_accountContext.Tasks.Where(x => x.id == TaskId).Select(x => new EditTask() //{ // EndTaskDate = x.EndTaskDate.ToFarsi(), // Description = x.Description, // Id = x.id, // Title = x.Title, // medias = _accountContext.TaskMedias.Include(z => z.Media).Where(e => e.TaskId == x.id).Select(m => // new MediaViewModel() // { // Path = m.Media.Path, // Type = m.Media.Type, // Category = m.Media.Category, // Id = m.Media.id // }).ToList(), // EndTaskTime = x.EndTaskDate.ToFarsiFull().Substring(11), // ContractingPartyName = x.ContractingPartyName, // CompleteDescription = x.DoneDescription, // IsDone = x.IsDone, // ReceiverId = _accountContext.Assigns.Where(a => a.TaskId == x.id).Select(a => a.AssignedId).ToList(), // SenderId = x.SenderId //}).FirstOrDefault(); return res; } public Tasks GetIncludeAssign(long taskId) { return _accountContext.Tasks.Include(x => x.Assigns).FirstOrDefault(x => x.id == taskId); } public void Remove(long id) { var task = Get(id); Remove(task); } public List GetRequestedTasks(TaskSearchModel searchModel) { var accountId = long.Parse(_contextAccessor.HttpContext.User.FindFirst("AccountId").Value); var positionValue = int.Parse(_contextAccessor.HttpContext.User.FindFirst("PositionValue").Value); var emptyAcc = new AccountViewModel() { Fullname = "-", PositionValue = 0 }; IQueryable query; query = _accountContext.Assigns.Include(x => x.Task).Where(x => !x.IsDone && x.Task.IsActiveString == "true" && !x.IsCancel && (x.IsCanceledRequest || x.TimeRequest || x.IsDoneRequest) && accountId == x.Task.SenderId && x.Task.TicketId == null).Select(x => new TaskViewModel() { AssignedId = x.AssignedId, AssignerId = x.AssignerId, CreateDate = x.Task.CreationDate.ToFarsi(), EndTaskDateFA = x.EndTaskDate.ToFarsi(), IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDate, Name = x.Task.Title, RequestCancel = x.IsCanceledRequest, RequestTime = x.TimeRequest, Id = x.Task.id, CreateTaskDateGE = x.Task.CreationDate, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCanceledRequest, ContractingPartyName = x.Task.ContractingPartyName, MediaCount = x.Task.TaskMedias.Count(m => m.TaskId == x.id), Description = x.Task.Description, IsDoneRequest = x.IsDoneRequest }); //res = res.GroupBy(x => x.Id).Select(x => x.First()); //res = res.OrderBy(x => x.IsDone ? 1 : 0) // .ThenBy(x => x.EndTaskDateGE).ThenBy(x => x.IsCancel ? 0 : 1); if (!string.IsNullOrWhiteSpace(searchModel.GeneralSearch)) { query = query.Where(x => (x.Description != null && x.Description.Contains(searchModel.GeneralSearch)) || x.ContractingPartyName.Contains(searchModel.GeneralSearch) || x.Name.Contains(searchModel.GeneralSearch)); } var res = query.Select(x => new TaskViewModel() { Sender = _accountContext.Accounts.Include(a => a.Position).Select(a => new AccountViewModel() { PositionValue = a.Position.PositionValue, Id = a.id, Fullname = a.Fullname, }).FirstOrDefault(a => a.Id == x.AssignerId), SelfName = _accountContext.Accounts.FirstOrDefault(a => a.id == accountId).Fullname, Assigned = _accountContext.Assigns.Where(a => a.TaskId == x.Id) .Where(a => a.AssignedPositionValue >= positionValue).Select(a => a.AssignedId).ToList(), CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestCancel = x.RequestCancel, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, MediaCount = x.MediaCount, Description = x.Description, IsDoneRequest = x.IsDoneRequest }); if (!string.IsNullOrWhiteSpace(searchModel.StartDate) && !string.IsNullOrWhiteSpace(searchModel.EndDate)) { var start = searchModel.StartDate.ToGeorgianDateTime(); var end = searchModel.EndDate.ToGeorgianDateTime(); res = res.Where(x => ((start > x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end > x.EndTaskDateGE && x.EndTaskDateGE > start)) || ((start < x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end < x.EndTaskDateGE && x.EndTaskDateGE > start)) || ((start < x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end > x.EndTaskDateGE && x.EndTaskDateGE > start)) || ((start > x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end < x.EndTaskDateGE && x.EndTaskDateGE > end))); } if (!string.IsNullOrWhiteSpace(searchModel.IsDoneRequest)) { bool isDoneReq = bool.Parse(searchModel.IsDoneRequest); res = res.Where(x => x.IsDoneRequest == isDoneReq); } if (!string.IsNullOrWhiteSpace(searchModel.IsDone)) { bool isDone = bool.Parse(searchModel.IsDone); res = res.Where(x => x.IsDone == isDone); } if (!string.IsNullOrWhiteSpace(searchModel.IsCanceled)) { bool isCancel = bool.Parse(searchModel.IsCanceled); res = res.Where(x => x.IsCancel == isCancel); } if (!string.IsNullOrWhiteSpace(searchModel.IsTimeRequest)) { bool isTimeRequest = bool.Parse(searchModel.IsTimeRequest); res = res.Where(x => x.RequestTime == isTimeRequest); } if (!string.IsNullOrWhiteSpace(searchModel.TimeRequestAccepted)) { res = res.Where(x => x.AcceptedTimeRequest > 0); } if (!string.IsNullOrWhiteSpace(searchModel.IsCancelRequest)) { bool isCancelReq = bool.Parse(searchModel.IsCancelRequest); res = res.Where(x => x.IsCancelRequest == isCancelReq); } var resEnum = res.AsEnumerable(); var result = resEnum.GroupBy(x => x.Id).Select(x => x.First()); if (searchModel.AccountId > 0) { result = result.Where(x => x.Sender.Id == searchModel.AccountId || x.Assigned.Contains(searchModel.AccountId)); } var orderResult = result.OrderByDescending(x => x.IsCancelRequest) .ThenByDescending(x => x.RequestTime).ThenByDescending(x => x.IsDoneRequest); var finalList = orderResult.Skip(searchModel.PageIndex).Take(30).ToList(); var addAssign = finalList.Select(x => new TaskViewModel() { AssignViewModels = _accountContext.Accounts.Include(x => x.Position).Where(a => x.Assigned.Contains(a.id) && accountId != a.id) .Select(a => new AssignViewModel() { AssignedName = a.Fullname, AssignedPositionValue = a.Position.PositionValue }).ToList(), Sender = x.Sender, SelfAssigner = x.Sender.Id == accountId ? true : false, Assigned = x.Assigned, SelfAssigned = x.Assigned.Any(a => a == accountId) ? true : false, CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestCancel = x.RequestCancel, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, MediaCount = x.MediaCount, SelfName = x.SelfName, Description = x.Description, IsDoneRequest = x.IsDoneRequest, }).ToList(); var finalAssign = addAssign.Select(x => new TaskViewModel() { AssignList = x.AssignViewModels.GroupBy(a => a.AssignedPositionValue).Select(a => new AssignList() { AssignViewModels = a.ToList(), PosValue = a.Key }).ToList(), Sender = x.Sender, Assigned = x.Assigned, CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestCancel = x.RequestCancel, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, Color = x.IsCancelRequest || x.RequestTime || x.IsDoneRequest ? SetRequestTasksColors(x.RequestTime, x.IsCancelRequest, x.IsDoneRequest) : "", MediaCount = x.MediaCount, HasAttachment = x.MediaCount > 0, SelfName = x.SelfName, SelfAssigned = x.SelfAssigned, SelfAssigner = x.SelfAssigner, Description = x.Description, IsDoneRequest = x.IsDoneRequest, AssignViewModels = x.AssignViewModels }).ToList(); var final = finalAssign.Select(x => new TaskViewModel() { AssignList = !(x.SelfAssigned || x.SelfAssigner) ? AddAssign(x.AssignList, x.Sender) : x.AssignList, Sender = !(x.SelfAssigned || x.SelfAssigner) ? new AccountViewModel() { PositionValue = 0, Fullname = "-" } : x.Sender, Assigned = x.Assigned, CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestCancel = x.RequestCancel, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, Color = x.Color, MediaCount = x.MediaCount, HasAttachment = x.HasAttachment, SelfName = !(x.SelfAssigned || x.SelfAssigner) ? "-" : x.SelfName, EndTaskTime = $"{x.EndTaskDateGE.Hour}:{x.EndTaskDateGE.Minute}:{x.EndTaskDateGE.Second}" != "23:59:59" ? $"{x.EndTaskDateGE.Hour}:{x.EndTaskDateGE.Minute}" : "", Description = x.Description, IsDoneRequest = x.IsDoneRequest, CanCheckRequests = x.Sender.PositionValue >= positionValue, Assigner = x.Sender.Id == accountId ? emptyAcc.Fullname : x.Sender.Fullname, AssignedReceiverViewModel = x.AssignViewModels.Any() ? x.AssignViewModels.MinBy(a => a.AssignedPositionValue) : new() { AssignedName = "-", AssignedPositionValue = 0 }, }).ToList(); return final; } public List GetRequestTaskHasTicket(TaskSearchModel searchModel) { var accountId = long.Parse(_contextAccessor.HttpContext.User.FindFirst("AccountId").Value); var positionValue = int.Parse(_contextAccessor.HttpContext.User.FindFirst("PositionValue").Value); var emptyAcc = new AccountViewModel() { Fullname = "-", PositionValue = 0 }; var query = _accountContext.Assigns.Include(x => x.Task).Where(x => !x.IsDone && x.Task.IsActiveString == "true" && !x.IsCancel && (x.IsCanceledRequest || x.TimeRequest || x.IsDoneRequest) && accountId == x.Task.SenderId && (x.Task.TicketId != null && x.Task.TicketId > 0)).Select(x => new TaskViewModel() { AssignedId = x.AssignedId, AssignerId = x.AssignerId, CreateDate = x.Task.CreationDate.ToFarsi(), EndTaskDateFA = x.EndTaskDate.ToFarsi(), IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDate, Name = x.Task.Title, RequestCancel = x.IsCanceledRequest, RequestTime = x.TimeRequest, Id = x.Task.id, CreateTaskDateGE = x.Task.CreationDate, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCanceledRequest, ContractingPartyName = x.Task.ContractingPartyName, MediaCount = x.Task.TaskMedias.Count(m => m.TaskId == x.id), Description = x.Task.Description, IsDoneRequest = x.IsDoneRequest }); //res = res.GroupBy(x => x.Id).Select(x => x.First()); //res = res.OrderBy(x => x.IsDone ? 1 : 0) // .ThenBy(x => x.EndTaskDateGE).ThenBy(x => x.IsCancel ? 0 : 1); if (!string.IsNullOrWhiteSpace(searchModel.GeneralSearch)) { query = query.Where(x => (x.Description != null && x.Description.Contains(searchModel.GeneralSearch)) || x.ContractingPartyName.Contains(searchModel.GeneralSearch) || x.Name.Contains(searchModel.GeneralSearch)); } var res = query.Select(x => new TaskViewModel() { Sender = _accountContext.Accounts.Include(a => a.Position).Select(a => new AccountViewModel() { PositionValue = a.Position.PositionValue, Id = a.id, Fullname = a.Fullname, }).FirstOrDefault(a => a.Id == x.AssignerId), SelfName = _accountContext.Accounts.FirstOrDefault(a => a.id == accountId).Fullname, Assigned = _accountContext.Assigns.Where(a => a.TaskId == x.Id) .Where(a => a.AssignedPositionValue >= positionValue).Select(a => a.AssignedId).ToList(), CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestCancel = x.RequestCancel, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, MediaCount = x.MediaCount, Description = x.Description, IsDoneRequest = x.IsDoneRequest }); if (!string.IsNullOrWhiteSpace(searchModel.StartDate) && !string.IsNullOrWhiteSpace(searchModel.EndDate)) { var start = searchModel.StartDate.ToGeorgianDateTime(); var end = searchModel.EndDate.ToGeorgianDateTime(); res = res.Where(x => ((start > x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end > x.EndTaskDateGE && x.EndTaskDateGE > start)) || ((start < x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end < x.EndTaskDateGE && x.EndTaskDateGE > start)) || ((start < x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end > x.EndTaskDateGE && x.EndTaskDateGE > start)) || ((start > x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end < x.EndTaskDateGE && x.EndTaskDateGE > end))); } if (!string.IsNullOrWhiteSpace(searchModel.IsDoneRequest)) { bool isDoneReq = bool.Parse(searchModel.IsDoneRequest); res = res.Where(x => x.IsDoneRequest == isDoneReq); } if (!string.IsNullOrWhiteSpace(searchModel.IsDone)) { bool isDone = bool.Parse(searchModel.IsDone); res = res.Where(x => x.IsDone == isDone); } if (!string.IsNullOrWhiteSpace(searchModel.IsCanceled)) { bool isCancel = bool.Parse(searchModel.IsCanceled); res = res.Where(x => x.IsCancel == isCancel); } if (!string.IsNullOrWhiteSpace(searchModel.IsTimeRequest)) { bool isTimeRequest = bool.Parse(searchModel.IsTimeRequest); res = res.Where(x => x.RequestTime == isTimeRequest); } if (!string.IsNullOrWhiteSpace(searchModel.TimeRequestAccepted)) { res = res.Where(x => x.AcceptedTimeRequest > 0); } if (!string.IsNullOrWhiteSpace(searchModel.IsCancelRequest)) { bool isCancelReq = bool.Parse(searchModel.IsCancelRequest); res = res.Where(x => x.IsCancelRequest == isCancelReq); } var resEnum = res.AsEnumerable(); var result = resEnum.GroupBy(x => x.Id).Select(x => x.First()); if (searchModel.AccountId > 0) { result = result.Where(x => x.Sender.Id == searchModel.AccountId || x.Assigned.Contains(searchModel.AccountId)); } var orderResult = result.OrderByDescending(x => x.IsCancelRequest) .ThenByDescending(x => x.RequestTime).ThenByDescending(x => x.IsDoneRequest); var finalList = orderResult.Skip(searchModel.PageIndex).Take(30).ToList(); var addAssign = finalList.Select(x => new TaskViewModel() { AssignViewModels = _accountContext.Accounts.Include(x => x.Position).Where(a => x.Assigned.Contains(a.id) && accountId != a.id) .Select(a => new AssignViewModel() { AssignedName = a.Fullname, AssignedPositionValue = a.Position.PositionValue }).ToList(), Sender = x.Sender, SelfAssigner = x.Sender.Id == accountId ? true : false, Assigned = x.Assigned, SelfAssigned = x.Assigned.Any(a => a == accountId) ? true : false, CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestCancel = x.RequestCancel, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, MediaCount = x.MediaCount, SelfName = x.SelfName, Description = x.Description, IsDoneRequest = x.IsDoneRequest, }).ToList(); var finalAssign = addAssign.Select(x => new TaskViewModel() { AssignList = x.AssignViewModels.GroupBy(a => a.AssignedPositionValue).Select(a => new AssignList() { AssignViewModels = a.ToList(), PosValue = a.Key }).ToList(), Sender = x.Sender, Assigned = x.Assigned, CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestCancel = x.RequestCancel, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, Color = x.IsCancelRequest || x.RequestTime || x.IsDoneRequest ? SetRequestTasksColors(x.RequestTime, x.IsCancelRequest, x.IsDoneRequest) : "", MediaCount = x.MediaCount, HasAttachment = x.MediaCount > 0, SelfName = x.SelfName, SelfAssigned = x.SelfAssigned, SelfAssigner = x.SelfAssigner, Description = x.Description, IsDoneRequest = x.IsDoneRequest, AssignViewModels = x.AssignViewModels }).ToList(); var final = finalAssign.Select(x => new TaskViewModel() { AssignList = !(x.SelfAssigned || x.SelfAssigner) ? AddAssign(x.AssignList, x.Sender) : x.AssignList, Sender = !(x.SelfAssigned || x.SelfAssigner) ? new AccountViewModel() { PositionValue = 0, Fullname = "-" } : x.Sender, Assigned = x.Assigned, CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestCancel = x.RequestCancel, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, Color = x.Color, MediaCount = x.MediaCount, HasAttachment = x.HasAttachment, SelfName = !(x.SelfAssigned || x.SelfAssigner) ? "-" : x.SelfName, EndTaskTime = $"{x.EndTaskDateGE.Hour}:{x.EndTaskDateGE.Minute}:{x.EndTaskDateGE.Second}" != "23:59:59" ? $"{x.EndTaskDateGE.Hour}:{x.EndTaskDateGE.Minute}" : "", Description = x.Description, IsDoneRequest = x.IsDoneRequest, CanCheckRequests = x.Sender.PositionValue >= positionValue, Assigner = x.Sender.Id == accountId ? emptyAcc.Fullname : x.Sender.Fullname, AssignedReceiverViewModel = x.AssignViewModels.Any() ? x.AssignViewModels.MinBy(a => a.AssignedPositionValue) : new() { AssignedName = "-", AssignedPositionValue = 0 }, }).ToList(); return final; } public List GetAllTasks(TaskSearchModel searchModel) { var accountId = long.Parse(_contextAccessor.HttpContext.User.FindFirst("AccountId").Value); var positionValue = int.Parse(_contextAccessor.HttpContext.User.FindFirst("PositionValue").Value); var emptyAcc = new AccountViewModel() { Fullname = "-", PositionValue = 0 }; IQueryable query; if (positionValue == 1) { query = _accountContext.Assigns.Include(x => x.Task).ThenInclude(x => x.TaskMedias) .ThenInclude(x => x.Media) .Where(x => x.Task.IsActiveString == "true" && (!x.IsCanceledRequest && !x.TimeRequest && !x.IsDoneRequest)) .Select(x => new TaskViewModel() { AssignedId = x.AssignedId, AssignerId = x.AssignerId, CreateDate = x.Task.CreationDate.ToFarsi(), EndTaskDateFA = x.EndTaskDate.ToFarsi(), IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDate, Name = x.Task.Title, RequestCancel = x.IsCanceledRequest, RequestTime = x.TimeRequest, Id = x.Task.id, CreateTaskDateGE = x.Task.CreationDate, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCanceledRequest, ContractingPartyName = x.Task.ContractingPartyName, MediaCount = _accountContext.TaskMedias.Count(m => m.TaskId == x.Task.id), Description = x.Task.Description, IsDoneRequest = x.IsDoneRequest, }); } else { return new(); } if (!string.IsNullOrWhiteSpace(searchModel.GeneralSearch)) { query = query.Where(x => (x.Description != null && x.Description.Contains(searchModel.GeneralSearch)) || x.ContractingPartyName.Contains(searchModel.GeneralSearch) || x.Name.Contains(searchModel.GeneralSearch)); } //res = res.GroupBy(x => x.Id).Select(x => x.First()); //res = res.OrderBy(x => x.IsDone ? 1 : 0) // .ThenBy(x => x.EndTaskDateGE).ThenBy(x => x.IsCancel ? 0 : 1); var res = query.Select(x => new TaskViewModel() { Sender = _accountContext.Accounts.Include(a => a.Position).Select(a => new AccountViewModel() { PositionValue = a.Position.PositionValue, Id = a.id, Fullname = a.Fullname, }).FirstOrDefault(a => a.Id == x.AssignerId), SelfName = _accountContext.Accounts.FirstOrDefault(a => a.id == accountId).Fullname, Assigned = _accountContext.Assigns.Where(a => a.TaskId == x.Id) .Where(a => a.AssignedPositionValue >= positionValue).Select(a => a.AssignedId) .ToList(), CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestCancel = x.RequestCancel, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, MediaCount = x.MediaCount, Description = x.Description, IsDoneRequest = x.IsDoneRequest }); if (!string.IsNullOrWhiteSpace(searchModel.StartDate) && !string.IsNullOrWhiteSpace(searchModel.EndDate)) { var start = searchModel.StartDate.ToGeorgianDateTime(); var end = searchModel.EndDate.ToGeorgianDateTime(); res = res.Where(x => ((start > x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end > x.EndTaskDateGE && x.EndTaskDateGE > start)) || ((start < x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end < x.EndTaskDateGE && x.EndTaskDateGE > start)) || ((start < x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end > x.EndTaskDateGE && x.EndTaskDateGE > start)) || ((start > x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end < x.EndTaskDateGE && x.EndTaskDateGE > end))); } if (!string.IsNullOrWhiteSpace(searchModel.IsDoneRequest)) { bool isDoneReq = bool.Parse(searchModel.IsDoneRequest); res = res.Where(x => x.IsDoneRequest == isDoneReq); } if (!string.IsNullOrWhiteSpace(searchModel.IsDone)) { bool isDone = bool.Parse(searchModel.IsDone); res = res.Where(x => x.IsDone == isDone); } if (!string.IsNullOrWhiteSpace(searchModel.IsCanceled)) { bool isCancel = bool.Parse(searchModel.IsCanceled); res = res.Where(x => x.IsCancel == isCancel); } if (!string.IsNullOrWhiteSpace(searchModel.IsTimeRequest)) { bool isTimeRequest = bool.Parse(searchModel.IsTimeRequest); res = res.Where(x => x.RequestTime == isTimeRequest); } if (!string.IsNullOrWhiteSpace(searchModel.TimeRequestAccepted)) { res = res.Where(x => x.AcceptedTimeRequest > 0); } if (!string.IsNullOrWhiteSpace(searchModel.IsCancelRequest)) { bool isCancelReq = bool.Parse(searchModel.IsCancelRequest); res = res.Where(x => x.IsCancelRequest == isCancelReq); } var resEnum = res.AsEnumerable(); var result = resEnum.GroupBy(x => x.Id).Select(x => x.First()); if (searchModel.AccountId > 0) { result = result.Where(x => x.Sender.Id == searchModel.AccountId || x.Assigned.Contains(searchModel.AccountId)); } var orderResult = result.OrderByDescending(x => x.IsCancel ? 0 : 1).ThenBy(x => x.IsDone ? 1 : 0) .ThenBy(x => x.EndTaskDateGE); var final = orderResult.Skip(searchModel.PageIndex).Take(30).ToList(); final = final.Select(x => new TaskViewModel() { AssignViewModels = _accountContext.Accounts.Include(x => x.Position) .Where(a => x.Assigned.Contains(a.id) && accountId != a.id) .Select(a => new AssignViewModel() { AssignedName = a.Fullname, AssignedPositionValue = a.Position.PositionValue }).ToList(), Sender = x.Sender, SelfAssigner = x.Sender.Id == accountId ? true : false, Assigned = x.Assigned, SelfAssigned = x.Assigned.Any(a => a == accountId) ? true : false, CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestCancel = x.RequestCancel, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, MediaCount = x.MediaCount, SelfName = x.SelfName, Description = x.Description, IsDoneRequest = x.IsDoneRequest }).ToList(); final = final.Select(x => new TaskViewModel() { Sender = x.Sender, Assigned = x.Assigned, CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestCancel = x.RequestCancel, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, Color = x.IsDone ? "green" : SetTasksColors(x.EndTaskDateGE, x.IsCancel), MediaCount = x.MediaCount, HasAttachment = x.MediaCount > 0, SelfName = x.SelfName, SelfAssigned = x.SelfAssigned, SelfAssigner = x.SelfAssigner, Description = x.Description, IsDoneRequest = x.IsDoneRequest, AssignViewModels = x.AssignViewModels }).ToList(); final = final.Select(x => new TaskViewModel() { Sender = !(x.SelfAssigned || x.SelfAssigner) ? new AccountViewModel() { PositionValue = 0, Fullname = "-" } : x.Sender, Assigned = x.Assigned, CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestCancel = x.RequestCancel, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, Color = x.Color, MediaCount = x.MediaCount, HasAttachment = x.HasAttachment, SelfName = !(x.SelfAssigned || x.SelfAssigner) ? "-" : x.SelfName, EndTaskTime = $"{x.EndTaskDateGE.Hour}:{x.EndTaskDateGE.Minute}:{x.EndTaskDateGE.Second}" != "23:59:59" ? $"{x.EndTaskDateGE.Hour}:{x.EndTaskDateGE.Minute}" : "", Description = x.Description, IsDoneRequest = x.IsDoneRequest, CanAssign = _positionRepository.GetLastPositionValue() != positionValue, CanDelete = x.Sender.Id == accountId, CanEdit = x.Sender.Id == accountId && !(_accountContext.Assigns.Any(a => a.TaskId == x.Id && (a.AcceptedTimeRequest > 0 || a.IsCanceledRequest || a.IsDoneRequest || a.TimeRequest || a.IsCancel || a.IsDone))), Assigner = x.Sender.Id == accountId ? emptyAcc.Fullname : x.Sender.Fullname, AssignedReceiverViewModel = x.AssignViewModels.Any() ? x.AssignViewModels.MinBy(a => a.AssignedPositionValue) : new() { AssignedName = "-", AssignedPositionValue = 0 }, }).ToList(); return final; } public List GetSentTasks(TaskSearchModel searchModel) { var accountId = long.Parse(_contextAccessor.HttpContext.User.FindFirst("AccountId").Value); var positionValue = int.Parse(_contextAccessor.HttpContext.User.FindFirst("PositionValue").Value); var emptyAcc = new AccountViewModel() { Fullname = "-", PositionValue = 0 }; IQueryable query; if (positionValue == 1) { query = _accountContext.Assigns.Include(x => x.Task).ThenInclude(x => x.TaskMedias) .ThenInclude(x => x.Media) .Where(x => x.Task.IsActiveString == "true" && (x.AssignerId == accountId && x.AssignedId != accountId) && (!x.IsCanceledRequest && !x.TimeRequest && !x.IsDoneRequest) && x.Task.TicketId == null && x.Task.SenderId == accountId && x.Task.TaskScheduleId == null) .Select(x => new TaskViewModel() { AssignedId = x.AssignedId, AssignerId = x.AssignerId, CreateDate = x.Task.CreationDate.ToFarsi(), EndTaskDateFA = x.EndTaskDate.ToFarsi(), IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDate, Name = x.Task.Title, RequestCancel = x.IsCanceledRequest, RequestTime = x.TimeRequest, Id = x.Task.id, CreateTaskDateGE = x.Task.CreationDate, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCanceledRequest, ContractingPartyName = x.Task.ContractingPartyName, MediaCount = _accountContext.TaskMedias.Count(m => m.TaskId == x.Task.id), Description = x.Task.Description, IsDoneRequest = x.IsDoneRequest, }); } else { query = _accountContext.Assigns.Include(x => x.Task).ThenInclude(x => x.TaskMedias) .ThenInclude(x => x.Media) .Where(x => x.Task.IsActiveString == "true" && x.AssignerId == accountId && (!x.IsCanceledRequest && !x.TimeRequest && !x.IsDoneRequest)) .Select(x => new TaskViewModel() { AssignedId = x.AssignedId, AssignerId = x.AssignerId, CreateDate = x.Task.CreationDate.ToFarsi(), EndTaskDateFA = x.EndTaskDate.ToFarsi(), IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDate, Name = x.Task.Title, RequestCancel = x.IsCanceledRequest, RequestTime = x.TimeRequest, Id = x.Task.id, CreateTaskDateGE = x.Task.CreationDate, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCanceledRequest, ContractingPartyName = x.Task.ContractingPartyName, MediaCount = _accountContext.TaskMedias.Count(m => m.TaskId == x.Task.id), Description = x.Task.Description, IsDoneRequest = x.IsDoneRequest, }); } if (!string.IsNullOrWhiteSpace(searchModel.GeneralSearch)) { query = query.Where(x => (x.Description != null && x.Description.Contains(searchModel.GeneralSearch)) || x.ContractingPartyName.Contains(searchModel.GeneralSearch) || x.Name.Contains(searchModel.GeneralSearch)); } var res = query.Select(x => new TaskViewModel() { Sender = _accountContext.Accounts.Include(a => a.Position).Select(a => new AccountViewModel() { PositionValue = a.Position.PositionValue, Id = a.id, Fullname = a.Fullname, }).FirstOrDefault(a => a.Id == x.AssignerId), SelfName = _accountContext.Accounts.FirstOrDefault(a => a.id == accountId).Fullname, Assigned = _accountContext.Assigns.Where(a => a.TaskId == x.Id) .Where(a => a.AssignedPositionValue >= positionValue).Select(a => a.AssignedId) .ToList(), CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, MediaCount = x.MediaCount, Description = x.Description, IsDoneRequest = x.IsDoneRequest }); #region Search if (!string.IsNullOrWhiteSpace(searchModel.StartDate) && !string.IsNullOrWhiteSpace(searchModel.EndDate)) { var start = searchModel.StartDate.ToGeorgianDateTime(); var end = searchModel.EndDate.ToGeorgianDateTime(); res = res.Where(x => ((start > x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end > x.EndTaskDateGE && x.EndTaskDateGE > start)) || ((start < x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end < x.EndTaskDateGE && x.EndTaskDateGE > start)) || ((start < x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end > x.EndTaskDateGE && x.EndTaskDateGE > start)) || ((start > x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end < x.EndTaskDateGE && x.EndTaskDateGE > end))); } if (!string.IsNullOrWhiteSpace(searchModel.IsDoneRequest)) { bool isDoneReq = bool.Parse(searchModel.IsDoneRequest); res = res.Where(x => x.IsDoneRequest == isDoneReq); } if (!string.IsNullOrWhiteSpace(searchModel.IsDone)) { bool isDone = bool.Parse(searchModel.IsDone); res = res.Where(x => x.IsDone == isDone); } if (!string.IsNullOrWhiteSpace(searchModel.IsCanceled)) { bool isCancel = bool.Parse(searchModel.IsCanceled); res = res.Where(x => x.IsCancel == isCancel); } if (!string.IsNullOrWhiteSpace(searchModel.IsTimeRequest)) { bool isTimeRequest = bool.Parse(searchModel.IsTimeRequest); res = res.Where(x => x.RequestTime == isTimeRequest); } if (!string.IsNullOrWhiteSpace(searchModel.TimeRequestAccepted)) { res = res.Where(x => x.AcceptedTimeRequest > 0); } if (!string.IsNullOrWhiteSpace(searchModel.IsCancelRequest)) { bool isCancelReq = bool.Parse(searchModel.IsCancelRequest); res = res.Where(x => x.IsCancelRequest == isCancelReq); } #endregion var resEnum = res.AsEnumerable(); var result = resEnum.GroupBy(x => x.Id).Select(x => new TaskViewModel() { Sender = x.First().Sender, SelfName = x.First().SelfName, Assigned = x.First().Assigned, CreateDate = x.First().CreateDate, EndTaskDateFA = x.Min(e => e.EndTaskDateGE).ToFarsi(), IsDone = x.All(a => a.IsDone) ? true : false, EndTaskDateGE = x.All(a => a.IsDone) ? x.Min(e => e.EndTaskDateGE) : x.Where(e => !e.IsDone).Min(e => e.EndTaskDateGE), Name = x.First().Name, RequestTime = x.First().RequestTime, Id = x.Key, CreateTaskDateGE = x.First().CreateTaskDateGE, IsCancel = x.First().IsCancel, AcceptedTimeRequest = x.First().AcceptedTimeRequest, IsCancelRequest = x.First().IsCancelRequest, ContractingPartyName = x.First().ContractingPartyName, MediaCount = x.First().MediaCount, Description = x.First().Description, IsDoneRequest = x.First().IsDoneRequest, }); if (searchModel.AccountId > 0) { result = result.Where(x => x.Sender.Id == searchModel.AccountId || x.Assigned.Contains(searchModel.AccountId)); } var orderResult = result.OrderByDescending(x => x.IsCancel ? 0 : 1).ThenBy(x => x.IsDone ? 1 : 0) .ThenBy(x => x.EndTaskDateGE); var final = orderResult.Skip(searchModel.PageIndex).Take(30).ToList(); final = final.Select(x => new TaskViewModel() { AssignViewModels = _accountContext.Accounts.Include(x => x.Position) .Where(a => x.Assigned.Contains(a.id) && accountId != a.id) .Select(a => new AssignViewModel() { AssignedName = a.Fullname, AssignedPositionValue = a.Position.PositionValue }).ToList(), Sender = x.Sender, SelfAssigner = x.Sender.Id == accountId ? true : false, Assigned = x.Assigned, SelfAssigned = x.Assigned.Any(a => a == accountId) ? true : false, CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, MediaCount = x.MediaCount, SelfName = x.SelfName, Description = x.Description, IsDoneRequest = x.IsDoneRequest }).ToList(); final = final.Select(x => new TaskViewModel() { AssignList = x.AssignViewModels.GroupBy(a => a.AssignedPositionValue).Select(a => new AssignList() { AssignViewModels = a.ToList(), PosValue = a.Key }).ToList(), Sender = x.Sender, Assigned = x.Assigned, CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, Color = x.IsDone ? "green" : SetTasksColors(x.EndTaskDateGE, x.IsCancel), MediaCount = x.MediaCount, HasAttachment = x.MediaCount > 0, SelfName = x.SelfName, SelfAssigned = x.SelfAssigned, SelfAssigner = x.SelfAssigner, Description = x.Description, IsDoneRequest = x.IsDoneRequest, AssignViewModels = x.AssignViewModels }).ToList(); final = final.Select(x => new TaskViewModel() { AssignList = !(x.SelfAssigned || x.SelfAssigner) ? AddAssign(x.AssignList, x.Sender) : x.AssignList, Sender = !(x.SelfAssigned || x.SelfAssigner) ? new AccountViewModel() { PositionValue = 0, Fullname = "-" } : x.Sender, Assigned = x.Assigned, CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, Color = x.Color, MediaCount = x.MediaCount, HasAttachment = x.HasAttachment, SelfName = !(x.SelfAssigned || x.SelfAssigner) ? "-" : x.SelfName, EndTaskTime = $"{x.EndTaskDateGE.Hour}:{x.EndTaskDateGE.Minute}:{x.EndTaskDateGE.Second}" != "23:59:59" ? $"{x.EndTaskDateGE.Hour}:{x.EndTaskDateGE.Minute}" : "", Description = x.Description, IsDoneRequest = x.IsDoneRequest, CanAssign = _positionRepository.GetLastPositionValue() != positionValue, CanDelete = x.Sender.Id == accountId, CanEdit = x.Sender.Id == accountId && !(_accountContext.Assigns.Any(a => a.TaskId == x.Id && (a.AcceptedTimeRequest > 0 || a.IsCanceledRequest || a.IsDoneRequest || a.TimeRequest || a.IsCancel || a.IsDone))), Assigner = x.Sender.Id == accountId ? emptyAcc.Fullname : x.Sender.Fullname, AssignedReceiverViewModel = x.AssignViewModels.Any() ? x.AssignViewModels.MinBy(a => a.AssignedPositionValue) : new() { AssignedName = "-", AssignedPositionValue = 0 }, }).ToList(); return final; } public List AllRequestedTasks(TaskSearchModel searchModel) { var accountId = long.Parse(_contextAccessor.HttpContext.User.FindFirst("AccountId").Value); var positionValue = int.Parse(_contextAccessor.HttpContext.User.FindFirst("PositionValue").Value); var emptyAcc = new AccountViewModel() { Fullname = "-", PositionValue = 0 }; IQueryable query; if (positionValue == 1) { query = _accountContext.Assigns.Include(x => x.Task).Where(x => !x.IsDone && x.Task.IsActiveString == "true" && (x.IsCanceledRequest || x.TimeRequest || x.IsDoneRequest)).Select(x => new TaskViewModel() { AssignedId = x.AssignedId, AssignerId = x.AssignerId, CreateDate = x.Task.CreationDate.ToFarsi(), EndTaskDateFA = x.EndTaskDate.ToFarsi(), IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDate, Name = x.Task.Title, RequestCancel = x.IsCanceledRequest, RequestTime = x.TimeRequest, Id = x.Task.id, CreateTaskDateGE = x.Task.CreationDate, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCanceledRequest, ContractingPartyName = x.Task.ContractingPartyName, MediaCount = x.Task.TaskMedias.Count(m => m.TaskId == x.id), Description = x.Task.Description, IsDoneRequest = x.IsDoneRequest }); } else { return new(); } //res = res.GroupBy(x => x.Id).Select(x => x.First()); //res = res.OrderBy(x => x.IsDone ? 1 : 0) // .ThenBy(x => x.EndTaskDateGE).ThenBy(x => x.IsCancel ? 0 : 1); if (!string.IsNullOrWhiteSpace(searchModel.GeneralSearch)) { query = query.Where(x => (x.Description != null && x.Description.Contains(searchModel.GeneralSearch)) || x.ContractingPartyName.Contains(searchModel.GeneralSearch) || x.Name.Contains(searchModel.GeneralSearch)); } if (!string.IsNullOrWhiteSpace(searchModel.GeneralSearch)) { query = query.Where(x => (x.Description != null && x.Description.Contains(searchModel.GeneralSearch)) || x.ContractingPartyName.Contains(searchModel.GeneralSearch) || x.Name.Contains(searchModel.GeneralSearch)); } var res = query.Select(x => new TaskViewModel() { Sender = _accountContext.Accounts.Include(a => a.Position).Select(a => new AccountViewModel() { PositionValue = a.Position.PositionValue, Id = a.id, Fullname = a.Fullname, }).FirstOrDefault(a => a.Id == x.AssignerId), SelfName = _accountContext.Accounts.FirstOrDefault(a => a.id == accountId).Fullname, Assigned = _accountContext.Assigns.Where(a => a.TaskId == x.Id) .Where(a => a.AssignedPositionValue >= positionValue).Select(a => a.AssignedId).ToList(), CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestCancel = x.RequestCancel, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, MediaCount = x.MediaCount, Description = x.Description, IsDoneRequest = x.IsDoneRequest }); if (!string.IsNullOrWhiteSpace(searchModel.StartDate) && !string.IsNullOrWhiteSpace(searchModel.EndDate)) { var start = searchModel.StartDate.ToGeorgianDateTime(); var end = searchModel.EndDate.ToGeorgianDateTime(); res = res.Where(x => ((start > x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end > x.EndTaskDateGE && x.EndTaskDateGE > start)) || ((start < x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end < x.EndTaskDateGE && x.EndTaskDateGE > start)) || ((start < x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end > x.EndTaskDateGE && x.EndTaskDateGE > start)) || ((start > x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end < x.EndTaskDateGE && x.EndTaskDateGE > end))); } if (!string.IsNullOrWhiteSpace(searchModel.IsDoneRequest)) { bool isDoneReq = bool.Parse(searchModel.IsDoneRequest); res = res.Where(x => x.IsDoneRequest == isDoneReq); } if (!string.IsNullOrWhiteSpace(searchModel.IsDone)) { bool isDone = bool.Parse(searchModel.IsDone); res = res.Where(x => x.IsDone == isDone); } if (!string.IsNullOrWhiteSpace(searchModel.IsCanceled)) { bool isCancel = bool.Parse(searchModel.IsCanceled); res = res.Where(x => x.IsCancel == isCancel); } if (!string.IsNullOrWhiteSpace(searchModel.IsTimeRequest)) { bool isTimeRequest = bool.Parse(searchModel.IsTimeRequest); res = res.Where(x => x.RequestTime == isTimeRequest); } if (!string.IsNullOrWhiteSpace(searchModel.TimeRequestAccepted)) { res = res.Where(x => x.AcceptedTimeRequest > 0); } if (!string.IsNullOrWhiteSpace(searchModel.IsCancelRequest)) { bool isCancelReq = bool.Parse(searchModel.IsCancelRequest); res = res.Where(x => x.IsCancelRequest == isCancelReq); } var resEnum = res.AsEnumerable(); var result = resEnum.GroupBy(x => x.Id).Select(x => x.First()); if (searchModel.AccountId > 0) { result = result.Where(x => x.Sender.Id == searchModel.AccountId || x.Assigned.Contains(searchModel.AccountId)); } var orderResult = result.OrderByDescending(x => x.IsCancelRequest) .ThenByDescending(x => x.RequestTime).ThenByDescending(x => x.IsDoneRequest); var finalList = orderResult.Skip(searchModel.PageIndex).Take(30).ToList(); var addAssign = finalList.Select(x => new TaskViewModel() { AssignViewModels = _accountContext.Accounts.Include(x => x.Position).Where(a => x.Assigned.Contains(a.id) && accountId != a.id) .Select(a => new AssignViewModel() { AssignedName = a.Fullname, AssignedPositionValue = a.Position.PositionValue }).ToList(), Sender = x.Sender, SelfAssigner = x.Sender.Id == accountId ? true : false, Assigned = x.Assigned, SelfAssigned = x.Assigned.Any(a => a == accountId) ? true : false, CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestCancel = x.RequestCancel, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, MediaCount = x.MediaCount, SelfName = x.SelfName, Description = x.Description, IsDoneRequest = x.IsDoneRequest, }).ToList(); var finalAssign = addAssign.Select(x => new TaskViewModel() { AssignList = x.AssignViewModels.GroupBy(a => a.AssignedPositionValue).Select(a => new AssignList() { AssignViewModels = a.ToList(), PosValue = a.Key }).ToList(), Sender = x.Sender, Assigned = x.Assigned, CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestCancel = x.RequestCancel, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, Color = x.IsCancelRequest || x.RequestTime || x.IsDoneRequest ? SetRequestTasksColors(x.RequestTime, x.IsCancelRequest, x.IsDoneRequest) : "", MediaCount = x.MediaCount, HasAttachment = x.MediaCount > 0, SelfName = x.SelfName, SelfAssigned = x.SelfAssigned, SelfAssigner = x.SelfAssigner, Description = x.Description, IsDoneRequest = x.IsDoneRequest, AssignViewModels = x.AssignViewModels }).ToList(); var final = finalAssign.Select(x => new TaskViewModel() { AssignList = !(x.SelfAssigned || x.SelfAssigner) ? AddAssign(x.AssignList, x.Sender) : x.AssignList, Sender = !(x.SelfAssigned || x.SelfAssigner) ? new AccountViewModel() { PositionValue = 0, Fullname = "-" } : x.Sender, Assigned = x.Assigned, CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestCancel = x.RequestCancel, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, Color = x.Color, MediaCount = x.MediaCount, HasAttachment = x.HasAttachment, SelfName = !(x.SelfAssigned || x.SelfAssigner) ? "-" : x.SelfName, EndTaskTime = $"{x.EndTaskDateGE.Hour}:{x.EndTaskDateGE.Minute}:{x.EndTaskDateGE.Second}" != "23:59:59" ? $"{x.EndTaskDateGE.Hour}:{x.EndTaskDateGE.Minute}" : "", Description = x.Description, IsDoneRequest = x.IsDoneRequest, CanCheckRequests = x.Sender.PositionValue >= positionValue, Assigner = x.Sender.Id == accountId ? emptyAcc.Fullname : x.Sender.Fullname, AssignedReceiverViewModel = x.AssignViewModels.Any() ? x.AssignViewModels.MinBy(a => a.AssignedPositionValue) : new() { AssignedName = "-", AssignedPositionValue = 0 }, }).ToList(); return final; } public List GetTasksHaveTicket(TaskSearchModel searchModel) { var accountId = long.Parse(_contextAccessor.HttpContext.User.FindFirst("AccountId").Value); var positionValue = int.Parse(_contextAccessor.HttpContext.User.FindFirst("PositionValue").Value); var emptyAcc = new AccountViewModel() { Fullname = "-", PositionValue = 0 }; var raw = _accountContext.Assigns.Include(x => x.Task).ThenInclude(x => x.TaskMedias) .ThenInclude(x => x.Media) .Where(x => x.Task.IsActiveString == "true" && (x.AssignedId == accountId || x.Task.SenderId == accountId) && x.Task.TicketId != null && (!x.IsCanceledRequest && !x.TimeRequest && !x.IsDoneRequest)); if (!string.IsNullOrWhiteSpace(searchModel.GeneralSearch)) { raw = raw.Where(x => (x.Task.Description != null && x.Task.Description.Contains(searchModel.GeneralSearch)) || x.Task.ContractingPartyName.Contains(searchModel.GeneralSearch) || x.Task.Title.Contains(searchModel.GeneralSearch)); } var query = raw.Select(x => new TaskViewModel() { AssignedId = x.AssignedId, AssignerId = x.AssignerId, CreateDate = x.Task.CreationDate.ToFarsi(), EndTaskDateFA = x.EndTaskDate.ToFarsi(), IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDate, Name = x.Task.Title, RequestCancel = x.IsCanceledRequest, RequestTime = x.TimeRequest, Id = x.Task.id, CreateTaskDateGE = x.Task.CreationDate, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCanceledRequest, ContractingPartyName = x.Task.ContractingPartyName, MediaCount = _accountContext.TaskMedias.Count(m => m.TaskId == x.Task.id), Description = x.Task.Description, IsDoneRequest = x.IsDoneRequest, }); if (!string.IsNullOrWhiteSpace(searchModel.GeneralSearch)) { query = query.Where(x => (x.Description != null && x.Description.Contains(searchModel.GeneralSearch)) || x.ContractingPartyName.Contains(searchModel.GeneralSearch) || x.Name.Contains(searchModel.GeneralSearch)); } var res = query.Select(x => new TaskViewModel() { Sender = _accountContext.Accounts.Include(a => a.Position).Select(a => new AccountViewModel() { PositionValue = a.Position.PositionValue, Id = a.id, Fullname = a.Fullname, }).FirstOrDefault(a => a.Id == x.AssignerId), SelfName = _accountContext.Accounts.FirstOrDefault(a => a.id == accountId).Fullname, Assigned = _accountContext.Assigns.Where(a => a.TaskId == x.Id) .Where(a => a.AssignedPositionValue >= positionValue).Select(a => a.AssignedId) .ToList(), CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestCancel = x.RequestCancel, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, MediaCount = x.MediaCount, Description = x.Description, IsDoneRequest = x.IsDoneRequest }); if (!string.IsNullOrWhiteSpace(searchModel.StartDate) && !string.IsNullOrWhiteSpace(searchModel.EndDate)) { var start = searchModel.StartDate.ToGeorgianDateTime(); var end = searchModel.EndDate.ToGeorgianDateTime(); res = res.Where(x => ((start > x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end > x.EndTaskDateGE && x.EndTaskDateGE > start)) || ((start < x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end < x.EndTaskDateGE && x.EndTaskDateGE > start)) || ((start < x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end > x.EndTaskDateGE && x.EndTaskDateGE > start)) || ((start > x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end < x.EndTaskDateGE && x.EndTaskDateGE > end))); } if (!string.IsNullOrWhiteSpace(searchModel.IsDoneRequest)) { bool isDoneReq = bool.Parse(searchModel.IsDoneRequest); res = res.Where(x => x.IsDoneRequest == isDoneReq); } if (!string.IsNullOrWhiteSpace(searchModel.IsDone)) { bool isDone = bool.Parse(searchModel.IsDone); res = res.Where(x => x.IsDone == isDone); } if (!string.IsNullOrWhiteSpace(searchModel.IsCanceled)) { bool isCancel = bool.Parse(searchModel.IsCanceled); res = res.Where(x => x.IsCancel == isCancel); } if (!string.IsNullOrWhiteSpace(searchModel.IsTimeRequest)) { bool isTimeRequest = bool.Parse(searchModel.IsTimeRequest); res = res.Where(x => x.RequestTime == isTimeRequest); } if (!string.IsNullOrWhiteSpace(searchModel.TimeRequestAccepted)) { res = res.Where(x => x.AcceptedTimeRequest > 0); } if (!string.IsNullOrWhiteSpace(searchModel.IsCancelRequest)) { bool isCancelReq = bool.Parse(searchModel.IsCancelRequest); res = res.Where(x => x.IsCancelRequest == isCancelReq); } var result = res.AsEnumerable(); if (searchModel.AccountId > 0) { result = result.Where(x => x.Sender.Id == searchModel.AccountId || x.Assigned.Contains(searchModel.AccountId)); } var orderResult = result.OrderByDescending(x => x.IsCancel ? 0 : 1).ThenBy(x => x.IsDone ? 1 : 0) .ThenBy(x => x.EndTaskDateGE); var final = orderResult.Skip(searchModel.PageIndex).Take(30).ToList(); final = final.Select(x => new TaskViewModel() { AssignViewModels = _accountContext.Accounts.Include(x => x.Position) .Where(a => x.Assigned.Contains(a.id) && accountId != a.id) .Select(a => new AssignViewModel() { AssignedName = a.Fullname, AssignedPositionValue = a.Position.PositionValue }).ToList(), Sender = x.Sender, SelfAssigner = x.Sender.Id == accountId ? true : false, Assigned = x.Assigned, SelfAssigned = x.Assigned.Any(a => a == accountId) ? true : false, CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestCancel = x.RequestCancel, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, MediaCount = x.MediaCount, SelfName = x.SelfName, Description = x.Description, IsDoneRequest = x.IsDoneRequest }).ToList(); final = final.Select(x => new TaskViewModel() { AssignList = x.AssignViewModels.GroupBy(a => a.AssignedPositionValue).Select(a => new AssignList() { AssignViewModels = a.ToList(), PosValue = a.Key }).ToList(), Sender = x.Sender, Assigned = x.Assigned, CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestCancel = x.RequestCancel, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, Color = x.IsDone ? "green" : SetTasksColors(x.EndTaskDateGE, x.IsCancel), MediaCount = x.MediaCount, HasAttachment = x.MediaCount > 0, SelfName = x.SelfName, SelfAssigned = x.SelfAssigned, SelfAssigner = x.SelfAssigner, Description = x.Description, IsDoneRequest = x.IsDoneRequest, AssignViewModels = x.AssignViewModels }).ToList(); final = final.Select(x => new TaskViewModel() { AssignList = !(x.SelfAssigned || x.SelfAssigner) ? AddAssign(x.AssignList, x.Sender) : x.AssignList, Sender = !(x.SelfAssigned || x.SelfAssigner) ? new AccountViewModel() { PositionValue = 0, Fullname = "-" } : x.Sender, Assigned = x.Assigned, CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestCancel = x.RequestCancel, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, Color = x.Color, MediaCount = x.MediaCount, HasAttachment = x.HasAttachment, SelfName = !(x.SelfAssigned || x.SelfAssigner) ? "-" : x.SelfName, EndTaskTime = $"{x.EndTaskDateGE.Hour}:{x.EndTaskDateGE.Minute}:{x.EndTaskDateGE.Second}" != "23:59:59" ? $"{x.EndTaskDateGE.Hour}:{x.EndTaskDateGE.Minute}" : "", Description = x.Description, IsDoneRequest = x.IsDoneRequest, CanAssign = _positionRepository.GetLastPositionValue() != positionValue, CanDelete = x.Sender.Id == accountId, CanEdit = x.Sender.Id == accountId && !(_accountContext.Assigns.Any(a => a.TaskId == x.Id && (a.AcceptedTimeRequest > 0 || a.IsCanceledRequest || a.IsDoneRequest || a.TimeRequest || a.IsCancel || a.IsDone))), Assigner = x.Sender.Id == accountId ? emptyAcc.Fullname : x.Sender.Fullname, AssignedReceiverViewModel = x.AssignViewModels.Any() ? x.AssignViewModels.MinBy(a => a.AssignedPositionValue) : new() { AssignedName = "-", AssignedPositionValue = 0 }, }).ToList(); return final; } public List GetTaskScheduleList(TaskSearchModel searchModel) { var accountId = long.Parse(_contextAccessor.HttpContext.User.FindFirst("AccountId").Value); var positionValue = int.Parse(_contextAccessor.HttpContext.User.FindFirst("PositionValue").Value); var emptyAcc = new AccountViewModel() { Fullname = "-", PositionValue = 0 }; var raw = _accountContext.Assigns.Include(x => x.Task).ThenInclude(x => x.TaskMedias) .ThenInclude(x => x.Media) .Include(x => x.Task).ThenInclude(x => x.TaskSchedule) .Where(x => x.Task.IsActiveString == "true" && x.Task.SenderId == accountId && x.Task.TaskScheduleId != null && x.Task.TaskScheduleId > 0 && (!x.IsCanceledRequest && !x.TimeRequest && !x.IsDoneRequest) && x.Task.TaskSchedule.IsActive == IsActive.True); if (!string.IsNullOrWhiteSpace(searchModel.GeneralSearch)) { raw = raw.Where(x => (x.Task.Description != null && x.Task.Description.Contains(searchModel.GeneralSearch)) || x.Task.ContractingPartyName.Contains(searchModel.GeneralSearch) || x.Task.Title.Contains(searchModel.GeneralSearch)); } var query = raw.GroupBy(x => x.Task.TaskScheduleId).Select(x => new TaskViewModel() { AssignedId = x.First().AssignedId, AssignerId = x.First().AssignerId, CreateDate = x.First().Task.CreationDate.ToFarsi(), EndTaskDateFA = x.First().EndTaskDate.ToFarsi(), IsDone = x.First().IsDone, EndTaskDateGE = x.First().EndTaskDate, Name = x.First().Task.Title, RequestCancel = x.First().IsCanceledRequest, RequestTime = x.First().TimeRequest, Id = x.First().Task.id, CreateTaskDateGE = x.First().Task.CreationDate, IsCancel = x.First().IsCancel, AcceptedTimeRequest = x.First().AcceptedTimeRequest, IsCancelRequest = x.First().IsCanceledRequest, ContractingPartyName = x.First().Task.ContractingPartyName, MediaCount = _accountContext.TaskMedias.Count(m => m.TaskId == x.First().Task.id), Description = x.First().Task.Description, IsDoneRequest = x.First().IsDoneRequest, ScheduleType = x.First().Task.TaskSchedule.Type, ScheduleUnitType = x.First().Task.TaskSchedule.UnitType, TaskScheduleId = (long)x.First().Task.TaskScheduleId } ); if (!string.IsNullOrWhiteSpace(searchModel.GeneralSearch)) { query = query.Where(x => (x.Description != null && x.Description.Contains(searchModel.GeneralSearch)) || x.ContractingPartyName.Contains(searchModel.GeneralSearch) || x.Name.Contains(searchModel.GeneralSearch)); } var res = query.Select(x => new TaskViewModel() { Sender = _accountContext.Accounts.Include(a => a.Position).Select(a => new AccountViewModel() { PositionValue = a.Position.PositionValue, Id = a.id, Fullname = a.Fullname, }).FirstOrDefault(a => a.Id == x.AssignerId), SelfName = _accountContext.Accounts.FirstOrDefault(a => a.id == accountId).Fullname, Assigned = _accountContext.Assigns.Where(a => a.TaskId == x.Id) .Where(a => a.AssignedPositionValue >= positionValue).Select(a => a.AssignedId) .ToList(), CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestCancel = x.RequestCancel, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, MediaCount = x.MediaCount, Description = x.Description, IsDoneRequest = x.IsDoneRequest, ScheduleType = x.ScheduleType, ScheduleUnitType = x.ScheduleUnitType, TaskScheduleId = x.TaskScheduleId }); if (!string.IsNullOrWhiteSpace(searchModel.StartDate) && !string.IsNullOrWhiteSpace(searchModel.EndDate)) { var start = searchModel.StartDate.ToGeorgianDateTime(); var end = searchModel.EndDate.ToGeorgianDateTime(); res = res.Where(x => ((start > x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end > x.EndTaskDateGE && x.EndTaskDateGE > start)) || ((start < x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end < x.EndTaskDateGE && x.EndTaskDateGE > start)) || ((start < x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end > x.EndTaskDateGE && x.EndTaskDateGE > start)) || ((start > x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end < x.EndTaskDateGE && x.EndTaskDateGE > end))); } if (!string.IsNullOrWhiteSpace(searchModel.IsDoneRequest)) { bool isDoneReq = bool.Parse(searchModel.IsDoneRequest); res = res.Where(x => x.IsDoneRequest == isDoneReq); } if (!string.IsNullOrWhiteSpace(searchModel.IsDone)) { bool isDone = bool.Parse(searchModel.IsDone); res = res.Where(x => x.IsDone == isDone); } if (!string.IsNullOrWhiteSpace(searchModel.IsCanceled)) { bool isCancel = bool.Parse(searchModel.IsCanceled); res = res.Where(x => x.IsCancel == isCancel); } if (!string.IsNullOrWhiteSpace(searchModel.IsTimeRequest)) { bool isTimeRequest = bool.Parse(searchModel.IsTimeRequest); res = res.Where(x => x.RequestTime == isTimeRequest); } if (!string.IsNullOrWhiteSpace(searchModel.TimeRequestAccepted)) { res = res.Where(x => x.AcceptedTimeRequest > 0); } if (!string.IsNullOrWhiteSpace(searchModel.IsCancelRequest)) { bool isCancelReq = bool.Parse(searchModel.IsCancelRequest); res = res.Where(x => x.IsCancelRequest == isCancelReq); } var result = res.AsEnumerable(); if (searchModel.AccountId > 0) { result = result.Where(x => x.Sender.Id == searchModel.AccountId || x.Assigned.Contains(searchModel.AccountId)); } var orderResult = result.OrderByDescending(x => x.IsCancel ? 0 : 1).ThenBy(x => x.IsDone ? 1 : 0) .ThenBy(x => x.EndTaskDateGE); var final = orderResult.Skip(searchModel.PageIndex).Take(30).ToList(); final = final.Select(x => new TaskViewModel() { AssignViewModels = _accountContext.Accounts.Include(x => x.Position) .Where(a => x.Assigned.Contains(a.id) && accountId != a.id) .Select(a => new AssignViewModel() { AssignedName = a.Fullname, AssignedPositionValue = a.Position.PositionValue }).ToList(), Sender = x.Sender, SelfAssigner = x.Sender.Id == accountId ? true : false, Assigned = x.Assigned, SelfAssigned = x.Assigned.Any(a => a == accountId) ? true : false, CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestCancel = x.RequestCancel, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, MediaCount = x.MediaCount, SelfName = x.SelfName, Description = x.Description, IsDoneRequest = x.IsDoneRequest, ScheduleType = x.ScheduleType, ScheduleUnitType = x.ScheduleUnitType, TaskScheduleId = x.TaskScheduleId }).ToList(); final = final.Select(x => new TaskViewModel() { AssignList = x.AssignViewModels.GroupBy(a => a.AssignedPositionValue).Select(a => new AssignList() { AssignViewModels = a.ToList(), PosValue = a.Key }).ToList(), Sender = x.Sender, Assigned = x.Assigned, CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestCancel = x.RequestCancel, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, Color = x.IsDone ? "green" : SetTasksColors(x.EndTaskDateGE, x.IsCancel), MediaCount = x.MediaCount, HasAttachment = x.MediaCount > 0, SelfName = x.SelfName, SelfAssigned = x.SelfAssigned, SelfAssigner = x.SelfAssigner, Description = x.Description, IsDoneRequest = x.IsDoneRequest, AssignViewModels = x.AssignViewModels, ScheduleType = x.ScheduleType, ScheduleUnitType = x.ScheduleUnitType, TaskScheduleId = x.TaskScheduleId }).ToList(); final = final.Select(x => new TaskViewModel() { AssignList = !(x.SelfAssigned || x.SelfAssigner) ? AddAssign(x.AssignList, x.Sender) : x.AssignList, Sender = !(x.SelfAssigned || x.SelfAssigner) ? new AccountViewModel() { PositionValue = 0, Fullname = "-" } : x.Sender, Assigned = x.Assigned, CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestCancel = x.RequestCancel, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, Color = x.Color, MediaCount = x.MediaCount, HasAttachment = x.HasAttachment, SelfName = !(x.SelfAssigned || x.SelfAssigner) ? "-" : x.SelfName, EndTaskTime = $"{x.EndTaskDateGE.Hour}:{x.EndTaskDateGE.Minute}:{x.EndTaskDateGE.Second}" != "23:59:59" ? $"{x.EndTaskDateGE.Hour}:{x.EndTaskDateGE.Minute}" : "", Description = x.Description, IsDoneRequest = x.IsDoneRequest, CanAssign = _positionRepository.GetLastPositionValue() != positionValue, CanDelete = x.Sender.Id == accountId, CanEdit = x.Sender.Id == accountId && !(_accountContext.Assigns.Any(a => a.TaskId == x.Id && (a.AcceptedTimeRequest > 0 || a.IsCanceledRequest || a.IsDoneRequest || a.TimeRequest || a.IsCancel || a.IsDone))), Assigner = x.Sender.Id == accountId ? emptyAcc.Fullname : x.Sender.Fullname, AssignedReceiverViewModel = x.AssignViewModels.Any() ? x.AssignViewModels.MinBy(a => a.AssignedPositionValue) : new() { AssignedName = "-", AssignedPositionValue = 0 }, ScheduleType = x.ScheduleType, ScheduleUnitType = x.ScheduleUnitType, TaskScheduleId = x.TaskScheduleId }).ToList(); return final; } public string SetTasksColors(DateTime date, bool isCancel) { if (isCancel) { //return "brown"; return "green"; } var now = DateTime.Now.Date; if (date.Date < now) { return "dark"; } else if (date.Date == now) { return "red"; } else if (date.Date > now) { return "gray"; } return ""; } public string SetRequestTasksColors(bool timeRequest, bool cancelRequest, bool isDoneRequest) { if (timeRequest) { return "yellow"; } else if (cancelRequest) { return "red"; } else if (isDoneRequest) { return "green"; } else { return ""; } } public async Task GetRequestedTasksCount() { var positionValue = int.Parse(_contextAccessor.HttpContext.User.FindFirst("PositionValue").Value); var accountId = long.Parse(_contextAccessor.HttpContext.User.FindFirst("AccountId").Value); if (positionValue == 1) { return await _accountContext.Assigns.Include(x => x.Task).Where(x => !x.IsDone && x.Task.IsActiveString == "true" && !x.IsCancel && (x.IsCanceledRequest || x.TimeRequest || x.IsDoneRequest) && (accountId == x.Task.SenderId) && x.Task.TicketId == null).GroupBy(x => x.TaskId) .Select(x => x.First()).CountAsync(); } else { return await _accountContext.Assigns.Include(x => x.Task).Where(x => !x.IsDone && x.Task.IsActiveString == "true" && !x.IsCancel && (x.IsCanceledRequest || x.TimeRequest || x.IsDoneRequest) && (accountId == x.Task.SenderId) && x.Task.TicketId == null).GroupBy(x => x.TaskId) .Select(x => x.First()).CountAsync(); } } public EditTask GetRequestDetails(long id) { var task = Get(id); EditTask res; if (task.SenderId == _authHelper.CurrentAccountId() || int.Parse(_contextAccessor.HttpContext.User.FindFirst("PositionValue").Value) == 1) { var query = _accountContext.Tasks.Include(x => x.Assigns).Where(x => x.id == id).Select(x => new EditTask() { Description = x.Description, Id = x.id, Title = x.Title, medias = _accountContext.TaskMedias.Include(z => z.Media).Where(e => e.TaskId == x.id).Select(m => new MediaViewModel() { Path = m.Media.Path, Type = m.Media.Type, Category = m.Media.Category, Id = m.Media.id }).ToList(), ContractingPartyName = x.ContractingPartyName, ReceiverId = _accountContext.Assigns.Where(a => a.TaskId == x.id).Select(a => a.AssignedId).ToList(), SenderId = x.SenderId, CreateDateFa = x.CreationDate.ToFarsi(), TicketId = x.TicketId, AssignViewModels = x.Assigns.Where(a => a.IsCanceledRequest || a.IsDoneRequest || a.TimeRequest).Select( a => new AssignViewModel() { Id = a.id, EndTaskDateFa = a.EndTaskDate.ToFarsiFull(), IsCancel = a.IsCancel, IsCanceledRequest = a.IsCanceledRequest, IsDone = a.IsDone, IsDoneRequest = a.IsDoneRequest, TimeRequest = a.TimeRequest, AssignedName = a.AssignedName, AssignedId = a.AssignedId, RequestDateFa = a.RequestDate.ToFarsi() }).ToList(), }).FirstOrDefault(); if (query.TicketId != null && query.TicketId > 0) { query.TicketViewModel = _ticketRepository.GetDetails(query.TicketId.Value); query.HasTicket = true; } else { query.TicketViewModel = null; } return query; } return new(); } public string GetWebEnvironmentPath() { return _webHostEnvironment.ContentRootPath; } public bool HasOverdueTasks(long userId) { var nowDate = DateTime.Now.Date; var hasOverDueTask = _accountContext.Assigns.Where(x => x.AssignedId == userId && x.EndTaskDate.Date < nowDate && !x.IsCancel && !x.IsCanceledRequest && !x.IsDone && !x.IsDoneRequest && !x.TimeRequest).GroupBy(x => x.TaskId).Select(x => x.First()).Any(); var hasOverDueRequest = _accountContext.Assigns.Include(x => x.TaskMessageList) .Where(x => (x.IsCanceledRequest || x.IsDoneRequest || x.TimeRequest) && !x.IsCancel && !x.IsDone && x.TaskMessageList.OrderByDescending(m => m.id).First().CreationDate.Date < nowDate).GroupBy(x => x.TaskId).Select(x => x.First()).Any(); if (hasOverDueRequest || hasOverDueTask) { return true; } else { return false; } } public async Task RequestedAndOverdueTasksCount(long userId) { var account = _accountRepository.GetIncludePositions(userId); if (account.Position == null) return 0; DateTime now = DateTime.Now; var overdueTasksCount = await OverdueTasksCount(userId); //overdueTasksCount = _accountContext.Tasks.Include(x => // x.Assigns).Count(x => !x.Assigns.Any(a => a.IsCancel) && !x.Assigns.Any(a => a.IsCanceledRequest) && // !x.Assigns.Any(a => a.IsDone) && !x.Assigns.Any(a => a.IsDoneRequest) && // !x.Assigns.Any(a => a.TimeRequest) // && x.Assigns.Any(a => a.AssignedId == userId) && // (x.Assigns.First(a => a.AssignedId == userId).EndTaskDate.Date <= DateTime.Now.Date)); var overdueRequestsCount = await GetRequestedTasksCount(); var ticketRequested = await TasksHaveTicketRequestsCount(userId); var overdueTicket = await TasksHaveTicketCounts(userId); return overdueTasksCount + overdueRequestsCount + ticketRequested + overdueTicket; } public int OverdueRequestsCount(long userId) { var overdueRequestsCount = _accountContext.Assigns.Include(x => x.Task) .Where(x => (x.IsCanceledRequest || x.IsDoneRequest || x.TimeRequest) && !x.IsCancel && !x.IsDone && x.Task.IsActiveString == "true" && x.Task.SenderId == userId).GroupBy(x => x.TaskId).Select(x => x.First()).Count(); return overdueRequestsCount; } public async Task OverdueTasksCount(long userId) { var account = _accountRepository.GetIncludePositions(userId); if (account.Position == null) return 0; var positionValue = account.Position.PositionValue; int overdueTasksCount; if (positionValue == 1) { overdueTasksCount = await _accountContext.Assigns.Include(x => x.Task).Where(x => x.AssignedId == userId && x.AssignerId == userId && x.Task.Assigns.Count == 1 && !x.IsCancel && !x.IsCanceledRequest && !x.IsDone && !x.TimeRequest && !x.IsDoneRequest && x.EndTaskDate.Date <= DateTime.Now.Date && x.Task.IsActiveString == "true" && x.Task.TicketId == null) .GroupBy(x => x.TaskId).Select(x => x.First()).CountAsync(); //overdueTasksCount = _accountContext.Tasks.Include(x => // x.Assigns).Count(x => !x.Assigns.Any(a => a.IsCancel) && !x.Assigns.Any(a => a.IsCanceledRequest) && // !x.Assigns.Any(a => a.IsDone) && !x.Assigns.Any(a => a.IsDoneRequest) && // !x.Assigns.Any(a => a.TimeRequest) // && x.Assigns.Any(a => a.AssignedId == userId && a.AssignerId == userId) && // (x.Assigns.First(a => a.AssignedId == userId && a.AssignerId == userId) // .EndTaskDate.Date <= DateTime.Now.Date) && x.Assigns.Count == 1); } else { overdueTasksCount = await _accountContext.Assigns.Include(x => x.Task).Where(x => x.AssignedId == userId && !x.IsCancel && !x.IsCanceledRequest && !x.IsDone && !x.TimeRequest && !x.IsDoneRequest && x.EndTaskDate.Date <= DateTime.Now.Date && x.Task.IsActiveString == "true" && x.Task.TicketId == null) .GroupBy(x => x.TaskId).Select(x => x.First()).CountAsync(); ; } return overdueTasksCount; } public List GetTasksByTaskScheduleId(long taskScheduleId) { return _accountContext.Tasks.Include(x=>x.Assigns).Where(x => x.TaskScheduleId != null && x.TaskScheduleId == taskScheduleId).ToList(); } public async Task TasksHaveTicketCounts(long userId) { return await _accountContext.Assigns.Include(x => x.Task).Where(x => !x.IsDone && x.Task.IsActiveString == "true" && !x.IsCancel && !x.IsCanceledRequest && !x.IsDoneRequest && !x.TimeRequest && (x.AssignerId == userId || x.AssignedId == userId) && (x.Task.TicketId != null && x.Task.TicketId > 0)).GroupBy(x => x.TaskId).CountAsync(); } public async Task TasksHaveTicketRequestsCount(long userId) { var positionValue = int.Parse(_contextAccessor.HttpContext.User.FindFirst("PositionValue").Value); var accountId = long.Parse(_contextAccessor.HttpContext.User.FindFirst("AccountId").Value); if (positionValue == 1) { return await _accountContext.Assigns.Include(x => x.Task).Where(x => !x.IsDone && x.Task.IsActiveString == "true" && !x.IsCancel && (x.IsCanceledRequest || x.TimeRequest || x.IsDoneRequest) && (accountId == x.Task.SenderId) && x.Task.TicketId != null && x.Task.TicketId > 0).GroupBy(x => x.TaskId) .Select(x => x.First()).CountAsync(); } else { return await _accountContext.Assigns.Include(x => x.Task).Where(x => !x.IsDone && x.Task.IsActiveString == "true" && !x.IsCancel && (x.IsCanceledRequest || x.TimeRequest || x.IsDoneRequest) && (accountId == x.Task.SenderId) && x.Task.TicketId != null && x.Task.TicketId > 0).GroupBy(x => x.TaskId) .Select(x => x.First()).CountAsync(); } } // public OperationResult MoveDataFRomTaskToAssign() // { // var res = new OperationResult(); // try // { // var tasks = _accountContext.Tasks.ToList(); // foreach (var task in tasks) // { // var assigns = _accountContext.Assigns.Where(x => x.TaskId == task.id).ToList(); // foreach (var assign in assigns) // { // assign.InsertNewData(task.EndTaskDate, task.TimeRequest, task.AcceptedTimeRequest, task.RequestDate, task.TimeRequestDescription, task.IsCanceledRequest, // task.IsCancel, task.CancelDescription, task.IsDone, task.IsDoneRequest, task.DoneDescription); // } // } //_positionRepository.SaveChanges(); // return res.Succcedded(); // } // catch (Exception e) // { // Console.WriteLine(e); // return res.Failed("خطای سیستمی"); // } // } public List GetSelfTasks(TaskSearchModel searchModel) { var accountId = long.Parse(_contextAccessor.HttpContext.User.FindFirst("AccountId").Value); var positionValue = int.Parse(_contextAccessor.HttpContext.User.FindFirst("PositionValue").Value); var emptyAcc = new AccountViewModel() { Fullname = "-", PositionValue = 0 }; var query = _accountContext.Assigns.Include(x => x.Task).ThenInclude(x => x.TaskMedias) .ThenInclude(x => x.Media) .Where(x => x.Task.IsActiveString == "true" && (x.AssignerId == accountId && x.AssignedId == accountId) && (!x.IsCanceledRequest && !x.TimeRequest && !x.IsDoneRequest) && x.Task.Assigns.Count == 1 && x.Task.TicketId == null) .Select(x => new TaskViewModel() { AssignedId = x.AssignedId, AssignerId = x.AssignerId, CreateDate = x.Task.CreationDate.ToFarsi(), EndTaskDateFA = x.EndTaskDate.ToFarsi(), IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDate, Name = x.Task.Title, RequestCancel = x.IsCanceledRequest, RequestTime = x.TimeRequest, Id = x.Task.id, CreateTaskDateGE = x.Task.CreationDate, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCanceledRequest, ContractingPartyName = x.Task.ContractingPartyName, MediaCount = _accountContext.TaskMedias.Count(m => m.TaskId == x.Task.id), Description = x.Task.Description, IsDoneRequest = x.IsDoneRequest, }); if (!string.IsNullOrWhiteSpace(searchModel.GeneralSearch)) { query = query.Where(x => (x.Description != null && x.Description.Contains(searchModel.GeneralSearch)) || x.ContractingPartyName.Contains(searchModel.GeneralSearch) || x.Name.Contains(searchModel.GeneralSearch)); } var res = query.Select(x => new TaskViewModel() { Sender = _accountContext.Accounts.Include(a => a.Position).Select(a => new AccountViewModel() { PositionValue = a.Position.PositionValue, Id = a.id, Fullname = a.Fullname, }).FirstOrDefault(a => a.Id == x.AssignerId), SelfName = _accountContext.Accounts.FirstOrDefault(a => a.id == accountId).Fullname, Assigned = _accountContext.Assigns.Where(a => a.TaskId == x.Id) .Where(a => a.AssignedPositionValue >= positionValue).Select(a => a.AssignedId) .ToList(), CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestCancel = x.RequestCancel, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, MediaCount = x.MediaCount, Description = x.Description, IsDoneRequest = x.IsDoneRequest }); if (!string.IsNullOrWhiteSpace(searchModel.StartDate) && !string.IsNullOrWhiteSpace(searchModel.EndDate)) { var start = searchModel.StartDate.ToGeorgianDateTime(); var end = searchModel.EndDate.ToGeorgianDateTime(); res = res.Where(x => ((start > x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end > x.EndTaskDateGE && x.EndTaskDateGE > start)) || ((start < x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end < x.EndTaskDateGE && x.EndTaskDateGE > start)) || ((start < x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end > x.EndTaskDateGE && x.EndTaskDateGE > start)) || ((start > x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end < x.EndTaskDateGE && x.EndTaskDateGE > end))); } if (!string.IsNullOrWhiteSpace(searchModel.IsDoneRequest)) { bool isDoneReq = bool.Parse(searchModel.IsDoneRequest); res = res.Where(x => x.IsDoneRequest == isDoneReq); } if (!string.IsNullOrWhiteSpace(searchModel.IsDone)) { bool isDone = bool.Parse(searchModel.IsDone); res = res.Where(x => x.IsDone == isDone); } if (!string.IsNullOrWhiteSpace(searchModel.IsCanceled)) { bool isCancel = bool.Parse(searchModel.IsCanceled); res = res.Where(x => x.IsCancel == isCancel); } if (!string.IsNullOrWhiteSpace(searchModel.IsTimeRequest)) { bool isTimeRequest = bool.Parse(searchModel.IsTimeRequest); res = res.Where(x => x.RequestTime == isTimeRequest); } if (!string.IsNullOrWhiteSpace(searchModel.TimeRequestAccepted)) { res = res.Where(x => x.AcceptedTimeRequest > 0); } if (!string.IsNullOrWhiteSpace(searchModel.IsCancelRequest)) { bool isCancelReq = bool.Parse(searchModel.IsCancelRequest); res = res.Where(x => x.IsCancelRequest == isCancelReq); } var result = res.AsEnumerable(); if (searchModel.AccountId > 0) { result = result.Where(x => x.Sender.Id == searchModel.AccountId || x.Assigned.Contains(searchModel.AccountId)); } var orderResult = result.OrderByDescending(x => x.IsCancel ? 0 : 1).ThenBy(x => x.IsDone ? 1 : 0) .ThenBy(x => x.EndTaskDateGE); var final = orderResult.Skip(searchModel.PageIndex).Take(30).ToList(); final = final.Select(x => new TaskViewModel() { AssignViewModels = _accountContext.Accounts.Include(x => x.Position) .Where(a => x.Assigned.Contains(a.id) && accountId != a.id) .Select(a => new AssignViewModel() { AssignedName = a.Fullname, AssignedPositionValue = a.Position.PositionValue }).ToList(), Sender = x.Sender, SelfAssigner = x.Sender.Id == accountId ? true : false, Assigned = x.Assigned, SelfAssigned = x.Assigned.Any(a => a == accountId) ? true : false, CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestCancel = x.RequestCancel, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, MediaCount = x.MediaCount, SelfName = x.SelfName, Description = x.Description, IsDoneRequest = x.IsDoneRequest }).ToList(); final = final.Select(x => new TaskViewModel() { AssignList = x.AssignViewModels.GroupBy(a => a.AssignedPositionValue).Select(a => new AssignList() { AssignViewModels = a.ToList(), PosValue = a.Key }).ToList(), AssignViewModels = x.AssignViewModels, Sender = x.Sender, Assigned = x.Assigned, CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestCancel = x.RequestCancel, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, Color = x.IsDone ? "green" : SetTasksColors(x.EndTaskDateGE, x.IsCancel), MediaCount = x.MediaCount, HasAttachment = x.MediaCount > 0, SelfName = x.SelfName, SelfAssigned = x.SelfAssigned, SelfAssigner = x.SelfAssigner, Description = x.Description, IsDoneRequest = x.IsDoneRequest }).ToList(); final = final.Select(x => new TaskViewModel() { AssignList = !(x.SelfAssigned || x.SelfAssigner) ? AddAssign(x.AssignList, x.Sender) : x.AssignList, Sender = !(x.SelfAssigned || x.SelfAssigner) ? new AccountViewModel() { PositionValue = 0, Fullname = "-" } : x.Sender, Assigned = x.Assigned, CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestCancel = x.RequestCancel, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, Color = x.Color, MediaCount = x.MediaCount, HasAttachment = x.HasAttachment, SelfName = !(x.SelfAssigned || x.SelfAssigner) ? "-" : x.SelfName, EndTaskTime = $"{x.EndTaskDateGE.Hour}:{x.EndTaskDateGE.Minute}:{x.EndTaskDateGE.Second}" != "23:59:59" ? $"{x.EndTaskDateGE.Hour}:{x.EndTaskDateGE.Minute}" : "", Description = x.Description, IsDoneRequest = x.IsDoneRequest, CanAssign = _positionRepository.GetLastPositionValue() != positionValue, CanDelete = x.Sender.Id == accountId, CanEdit = x.Sender.Id == accountId && !(_accountContext.Assigns.Any(a => a.TaskId == x.Id && (a.AcceptedTimeRequest > 0 || a.IsCanceledRequest || a.IsDoneRequest || a.TimeRequest || a.IsCancel || a.IsDone))), Assigner = x.Sender.Id == accountId ? emptyAcc.Fullname : x.Sender.Fullname, AssignedReceiverViewModel = x.AssignViewModels.Any() ? x.AssignViewModels.MinBy(a => a.AssignedPositionValue) : new() { AssignedName = "-", AssignedPositionValue = 0 }, }).ToList(); return final; } public List GetReceivedTasks(TaskSearchModel searchModel) { var accountId = long.Parse(_contextAccessor.HttpContext.User.FindFirst("AccountId").Value); var positionValue = int.Parse(_contextAccessor.HttpContext.User.FindFirst("PositionValue").Value); var emptyAcc = new AccountViewModel() { Fullname = "-", PositionValue = 0 }; var raw = _accountContext.Assigns.Include(x => x.Task).ThenInclude(x => x.TaskMedias) .ThenInclude(x => x.Media) .Where(x => x.Task.IsActiveString == "true" && x.AssignedId == accountId && (!x.IsCanceledRequest && !x.TimeRequest && !x.IsDoneRequest) && x.Task.TicketId == null); if (!string.IsNullOrWhiteSpace(searchModel.GeneralSearch)) { raw = raw.Where(x => (x.Task.Description != null && x.Task.Description.Contains(searchModel.GeneralSearch)) || x.Task.ContractingPartyName.Contains(searchModel.GeneralSearch) || x.Task.Title.Contains(searchModel.GeneralSearch)); } var query = raw.Select(x => new TaskViewModel() { AssignedId = x.AssignedId, AssignerId = x.AssignerId, CreateDate = x.Task.CreationDate.ToFarsi(), EndTaskDateFA = x.EndTaskDate.ToFarsi(), IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDate, Name = x.Task.Title, RequestCancel = x.IsCanceledRequest, RequestTime = x.TimeRequest, Id = x.Task.id, CreateTaskDateGE = x.Task.CreationDate, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCanceledRequest, ContractingPartyName = x.Task.ContractingPartyName, MediaCount = _accountContext.TaskMedias.Count(m => m.TaskId == x.Task.id), Description = x.Task.Description, IsDoneRequest = x.IsDoneRequest, }); if (!string.IsNullOrWhiteSpace(searchModel.GeneralSearch)) { query = query.Where(x => (x.Description != null && x.Description.Contains(searchModel.GeneralSearch)) || x.ContractingPartyName.Contains(searchModel.GeneralSearch) || x.Name.Contains(searchModel.GeneralSearch)); } var res = query.Select(x => new TaskViewModel() { Sender = _accountContext.Accounts.Include(a => a.Position).Select(a => new AccountViewModel() { PositionValue = a.Position.PositionValue, Id = a.id, Fullname = a.Fullname, }).FirstOrDefault(a => a.Id == x.AssignerId), SelfName = _accountContext.Accounts.FirstOrDefault(a => a.id == accountId).Fullname, Assigned = _accountContext.Assigns.Where(a => a.TaskId == x.Id) .Where(a => a.AssignedPositionValue >= positionValue).Select(a => a.AssignedId) .ToList(), CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestCancel = x.RequestCancel, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, MediaCount = x.MediaCount, Description = x.Description, IsDoneRequest = x.IsDoneRequest }); if (!string.IsNullOrWhiteSpace(searchModel.StartDate) && !string.IsNullOrWhiteSpace(searchModel.EndDate)) { var start = searchModel.StartDate.ToGeorgianDateTime(); var end = searchModel.EndDate.ToGeorgianDateTime(); res = res.Where(x => ((start > x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end > x.EndTaskDateGE && x.EndTaskDateGE > start)) || ((start < x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end < x.EndTaskDateGE && x.EndTaskDateGE > start)) || ((start < x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end > x.EndTaskDateGE && x.EndTaskDateGE > start)) || ((start > x.CreateTaskDateGE && x.CreateTaskDateGE < end) && (end < x.EndTaskDateGE && x.EndTaskDateGE > end))); } if (!string.IsNullOrWhiteSpace(searchModel.IsDoneRequest)) { bool isDoneReq = bool.Parse(searchModel.IsDoneRequest); res = res.Where(x => x.IsDoneRequest == isDoneReq); } if (!string.IsNullOrWhiteSpace(searchModel.IsDone)) { bool isDone = bool.Parse(searchModel.IsDone); res = res.Where(x => x.IsDone == isDone); } if (!string.IsNullOrWhiteSpace(searchModel.IsCanceled)) { bool isCancel = bool.Parse(searchModel.IsCanceled); res = res.Where(x => x.IsCancel == isCancel); } if (!string.IsNullOrWhiteSpace(searchModel.IsTimeRequest)) { bool isTimeRequest = bool.Parse(searchModel.IsTimeRequest); res = res.Where(x => x.RequestTime == isTimeRequest); } if (!string.IsNullOrWhiteSpace(searchModel.TimeRequestAccepted)) { res = res.Where(x => x.AcceptedTimeRequest > 0); } if (!string.IsNullOrWhiteSpace(searchModel.IsCancelRequest)) { bool isCancelReq = bool.Parse(searchModel.IsCancelRequest); res = res.Where(x => x.IsCancelRequest == isCancelReq); } var result = res.AsEnumerable(); if (searchModel.AccountId > 0) { result = result.Where(x => x.Sender.Id == searchModel.AccountId || x.Assigned.Contains(searchModel.AccountId)); } var orderResult = result.OrderByDescending(x => x.IsCancel ? 0 : 1).ThenBy(x => x.IsDone ? 1 : 0) .ThenBy(x => x.EndTaskDateGE); var final = orderResult.Skip(searchModel.PageIndex).Take(30).ToList(); final = final.Select(x => new TaskViewModel() { AssignViewModels = _accountContext.Accounts.Include(x => x.Position) .Where(a => x.Assigned.Contains(a.id) && accountId != a.id) .Select(a => new AssignViewModel() { AssignedName = a.Fullname, AssignedPositionValue = a.Position.PositionValue }).ToList(), Sender = x.Sender, SelfAssigner = x.Sender.Id == accountId ? true : false, Assigned = x.Assigned, SelfAssigned = x.Assigned.Any(a => a == accountId) ? true : false, CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestCancel = x.RequestCancel, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, MediaCount = x.MediaCount, SelfName = x.SelfName, Description = x.Description, IsDoneRequest = x.IsDoneRequest }).ToList(); final = final.Select(x => new TaskViewModel() { AssignList = x.AssignViewModels.GroupBy(a => a.AssignedPositionValue).Select(a => new AssignList() { AssignViewModels = a.ToList(), PosValue = a.Key }).ToList(), Sender = x.Sender, Assigned = x.Assigned, CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestCancel = x.RequestCancel, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, Color = x.IsDone ? "green" : SetTasksColors(x.EndTaskDateGE, x.IsCancel), MediaCount = x.MediaCount, HasAttachment = x.MediaCount > 0, SelfName = x.SelfName, SelfAssigned = x.SelfAssigned, SelfAssigner = x.SelfAssigner, Description = x.Description, IsDoneRequest = x.IsDoneRequest, AssignViewModels = x.AssignViewModels }).ToList(); final = final.Select(x => new TaskViewModel() { AssignList = !(x.SelfAssigned || x.SelfAssigner) ? AddAssign(x.AssignList, x.Sender) : x.AssignList, Sender = !(x.SelfAssigned || x.SelfAssigner) ? new AccountViewModel() { PositionValue = 0, Fullname = "-" } : x.Sender, Assigned = x.Assigned, CreateDate = x.CreateDate, EndTaskDateFA = x.EndTaskDateFA, IsDone = x.IsDone, EndTaskDateGE = x.EndTaskDateGE, Name = x.Name, RequestCancel = x.RequestCancel, RequestTime = x.RequestTime, Id = x.Id, CreateTaskDateGE = x.CreateTaskDateGE, IsCancel = x.IsCancel, AcceptedTimeRequest = x.AcceptedTimeRequest, IsCancelRequest = x.IsCancelRequest, ContractingPartyName = x.ContractingPartyName, Color = x.Color, MediaCount = x.MediaCount, HasAttachment = x.HasAttachment, SelfName = !(x.SelfAssigned || x.SelfAssigner) ? "-" : x.SelfName, EndTaskTime = $"{x.EndTaskDateGE.Hour}:{x.EndTaskDateGE.Minute}:{x.EndTaskDateGE.Second}" != "23:59:59" ? $"{x.EndTaskDateGE.Hour}:{x.EndTaskDateGE.Minute}" : "", Description = x.Description, IsDoneRequest = x.IsDoneRequest, CanAssign = _positionRepository.GetLastPositionValue() != positionValue, CanDelete = x.Sender.Id == accountId, CanEdit = x.Sender.Id == accountId && !(_accountContext.Assigns.Any(a => a.TaskId == x.Id && (a.AcceptedTimeRequest > 0 || a.IsCanceledRequest || a.IsDoneRequest || a.TimeRequest || a.IsCancel || a.IsDone))), Assigner = x.Sender.Id == accountId ? emptyAcc.Fullname : x.Sender.Fullname, AssignedReceiverViewModel = x.AssignViewModels.Any() ? x.AssignViewModels.MinBy(a => a.AssignedPositionValue) : new() { AssignedName = "-", AssignedPositionValue = 0 }, }).ToList(); return final; } private static List AddAssign(List list, AccountViewModel acc) { list.Add(new AssignList() { AssignViewModels = new List() { new () { AssignedName = acc.Fullname, AssignedPositionValue = acc.PositionValue }, }.ToList(), PosValue = acc.PositionValue }); return list; } private static List AddAccountIdToList(List list, long accountId) { list.Add(accountId); return list; } }