using System; using System.Collections.Generic; using _0_Framework.InfraStructure; using Microsoft.AspNetCore.Http; using Microsoft.EntityFrameworkCore; using System.Linq; 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.Domain.AccountAgg; using AccountManagement.Domain.TaskAgg; using static Microsoft.EntityFrameworkCore.DbLoggerCategory; namespace AccountMangement.Infrastructure.EFCore.Repository; public class TaskRepository : RepositoryBase, ITaskRepository { private readonly AccountContext _accountContext; private readonly IHttpContextAccessor _contextAccessor; private readonly IAccountRepository _accountRepository; public TaskRepository(IHttpContextAccessor contextAccessor, AccountContext accountContext, IAccountRepository accountRepository) : base(accountContext) { _contextAccessor = contextAccessor; _accountContext = accountContext; _accountRepository = accountRepository; } public EditTask GetDetails(long TaskId) { return _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(); } public void Remove(long id) { var task=Get(id); Remove(task); } public List GetAllRequestedTasks(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.Task.IsDone == false && x.Task.IsActiveString == "true" && (x.Task.IsCanceledRequest == true || x.Task.TimeRequest == true||x.Task.IsDoneRequest)).Select(x => new TaskViewModel() { AssignedId = x.AssignedId, AssignerId = x.AssignerId, CreateDate = x.Task.CreationDate.ToFarsi(), EndTaskDateFA = x.Task.EndTaskDate.ToFarsi(), IsDone = x.Task.IsDone, EndTaskDateGE = x.Task.EndTaskDate, Name = x.Task.Title, RequestCancel = x.Task.IsCanceledRequest, RequestTime = x.Task.TimeRequest, Id = x.Task.id, CreateTaskDateGE = x.Task.CreationDate, IsCancel = x.Task.IsCancel, AcceptedTimeRequest = x.Task.AcceptedTimeRequest, IsCancelRequest = x.Task.IsCanceledRequest, ContractingPartyName = x.Task.ContractingPartyName, MediaCount = x.Task.TaskMedias.Count(m => m.TaskId == x.id), Description = x.Task.Description, IsDoneRequest = x.Task.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); var res = query.Select(x => new TaskViewModel() { Sender = x.AssignerId == accountId ? _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) : _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 = x.AssignedId == accountId ? ExtraTools.AddAccountIdToList(_accountContext.Assigns.Where(a => a.TaskId == x.Id && a.AssignerId == accountId).Select(a => a.AssignedId).ToList(), accountId) : _accountContext.Assigns.Where(a => a.TaskId == x.Id) .Where(x => x.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.OrderBy(x => x.IsDone ? 1 : 0) .ThenBy(x => x.EndTaskDateGE).ThenBy(x => x.IsCancel ? 0 : 1); 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)) .Select(a => new AssignViewModel() { AssignedName = a.Fullname, AssignedPositionValue = a.Position.PositionValue }).ToList(), Sender = x.Sender.Id == accountId ? emptyAcc : 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.SelfAssigned && !x.SelfAssigner ? x.AssignViewModels.GroupBy(a => a.AssignedPositionValue).Select(a => new AssignList() { AssignViewModels = a.ToList(), PosValue = a.Key }).ToList() : 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 = (!string.IsNullOrWhiteSpace(x.Description) || 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) ? ExtraTools.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 }).ToList(); return final; } public List GetTasks(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.AssignedId == accountId || x.AssignerId == accountId) || x.AssignerPositionValue > positionValue)) .Select(x => new TaskViewModel() { AssignedId = x.AssignedId, AssignerId = x.AssignerId, CreateDate = x.Task.CreationDate.ToFarsi(), EndTaskDateFA = x.Task.EndTaskDate.ToFarsi(), IsDone = x.Task.IsDone, EndTaskDateGE = x.Task.EndTaskDate, Name = x.Task.Title, RequestCancel = x.Task.IsCanceledRequest, RequestTime = x.Task.TimeRequest, Id = x.Task.id, CreateTaskDateGE = x.Task.CreationDate, IsCancel = x.Task.IsCancel, AcceptedTimeRequest = x.Task.AcceptedTimeRequest, IsCancelRequest = x.Task.IsCanceledRequest, ContractingPartyName = x.Task.ContractingPartyName, MediaCount = _accountContext.TaskMedias.Count(m => m.TaskId == x.Task.id), Description = x.Task.Description, IsDoneRequest=x.Task.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); var res = query.Select(x => new TaskViewModel() { Sender = x.AssignerId == accountId ? _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) : _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 = x.AssignedId == accountId ? ExtraTools.AddAccountIdToList(_accountContext.Assigns.Where(a => a.TaskId == x.Id && a.AssignerId == accountId).Select(a => a.AssignedId).ToList(), accountId) : _accountContext.Assigns.Where(a => a.TaskId == x.Id) .Where(x => x.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)) .Select(a => new AssignViewModel() { AssignedName = a.Fullname, AssignedPositionValue = a.Position.PositionValue }).ToList(), Sender = x.Sender.Id == accountId ? emptyAcc : 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.SelfAssigned && !x.SelfAssigner ? x.AssignViewModels.GroupBy(a => a.AssignedPositionValue).Select(a => new AssignList() { AssignViewModels = a.ToList(), PosValue = a.Key }).ToList() : 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 = (!string.IsNullOrWhiteSpace(x.Description) || x.MediaCount > 0)?true:false, 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) ? ExtraTools.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 }).ToList(); return final; } public string SetTasksColors(DateTime date,bool isCancel) { if (isCancel) { return "brown"; } var now = DateTime.Now.Date; if (date.Date < now) { return "dark"; } else if (date.Date == now) { return "red"; } else if (date.Date == now.AddDays(1)) { return "yellow"; } else if (date.Date > now.AddDays(1)) { 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 int GetRequestedTasksCount() { return _accountContext.Assigns.Include(x => x.Task).Where(x => x.Task.IsDone == false && x.Task.IsActiveString == "true" && (x.Task.IsCanceledRequest == true || x.Task.TimeRequest == true||x.Task.IsDoneRequest)).GroupBy(x => x.TaskId) .Select(x => x.First()).Count(); } public TaskViewModel GetRequestDetails(long id) { return _accountContext.Tasks.Where(x => x.id == id).Select(x=>new TaskViewModel() { Id = x.id, Name = x.Title, ContractingPartyName = x.ContractingPartyName, TimeRequestDescription = x.TimeRequestDescription, CancelDescription = x.CancelDescription, IsDoneDescription = x.DoneDescription, IsCancelRequest = x.IsDoneRequest, RequestTime = x.TimeRequest, IsDoneRequest = x.IsDoneRequest, RequestTaskDate = x.RequestDate==null?"":x.RequestDate.ToFarsi() }).FirstOrDefault(); } } public static class ExtraTools { public 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; } public static List AddAccountIdToList(List list, long accountId) { list.Add(accountId); return list; } }