/// <summary>
        /// Метод получит список заданий для вкладки "Мои задания". Т.е задания, работа над которыми начата текущим исполнителем.
        /// <param name="account">Логин исполнителя.</param>
        /// </summary>
        /// <returns>Список заданий.</returns>
        public async Task <GetResultTask> GetWorkTasksAsync(string account)
        {
            try
            {
                GetResultTask result = new GetResultTask();

                string executorId = await _userService.GetUserIdByLogin(account);

                if (string.IsNullOrEmpty(executorId))
                {
                    throw new NotFoundUserException(account);
                }

                var tasks = await _postgre.Tasks
                            .Join(_postgre.TaskCategories, t => t.CategoryCode, tc => tc.CategoryCode,
                                  (t, tc) => new { Tasks = t, ParentTaskCategory = tc })
                            .Join(_postgre.Users, ts => ts.Tasks.OwnerId, u => u.Id, (ts, u) => new
                                  { TaskCategory = ts, User = u })
                            .Join(_postgre.TaskStatuses, tcc => tcc.TaskCategory.Tasks.StatusCode, s => s.StatusCode,
                                  (tcc, s) => new { Result = tcc, TaskStatus = s })
                            .Join(_postgre.Invities,
                                  x => x.Result.TaskCategory.Tasks.TaskId,
                                  i => i.TaskId,
                                  (x, i) => new { ChildUser = x, Invite = i })
                            .Where(c => c.Invite.IsAccept.Equals(true) &&
                                   c.ChildUser.TaskStatus.StatusCode.Equals(StatusCode.CODE_WORK) &&
                                   c.ChildUser.Result.TaskCategory.Tasks.ExecutorId.Equals(executorId) &&
                                   c.ChildUser.Result.TaskCategory.Tasks.IsPay.Equals(true))
                            .Select(res => new
                {
                    res.ChildUser.Result.TaskCategory.Tasks.TaskId,
                    TaskEndda = string.Format("{0:f}", res.ChildUser.Result.TaskCategory.Tasks.TaskEndda),
                    res.ChildUser.Result.TaskCategory.Tasks.TaskTitle,
                    res.ChildUser.Result.TaskCategory.Tasks.TaskDetail,
                    TaskPrice = string.Format("{0:0,0}", res.ChildUser.Result.TaskCategory.Tasks.TaskPrice),
                    res.ChildUser.Result.TaskCategory.Tasks.CountOffers,
                    res.ChildUser.Result.TaskCategory.Tasks.CountViews,
                    res.ChildUser.Result.TaskCategory.Tasks.TypeCode,
                    res.ChildUser.Result.User.UserName,
                    res.ChildUser.Result.TaskCategory.ParentTaskCategory.CategoryName,
                    res.ChildUser.TaskStatus.StatusName
                })
                            .ToListAsync();

                // Если заданий нет.
                if (!tasks.Any())
                {
                    return(result);
                }

                // Запишет логины заказчиков по их OwnerId.
                foreach (object task in tasks)
                {
                    string           jsonString = JsonSerializer.Serialize(task);
                    ResultTaskOutput item       = JsonSerializer.Deserialize <ResultTaskOutput>(jsonString);

                    // Возьмет первые 100 символов из заголовка задания.
                    item.TaskTitle = item.TaskTitle.Length > 100
                        ? string.Concat(item.TaskTitle.Substring(0, 100), "...")
                        : item.TaskTitle;

                    // Возьмет первые 200 символов из описания задания.
                    item.TaskDetail = item.TaskDetail.Length > 200
                        ? string.Concat(item.TaskDetail.Substring(0, 200), "...")
                        : item.TaskDetail;

                    result.Tasks.Add(item);
                }

                return(result);
            }

            catch (Exception ex)
            {
                Console.WriteLine(ex);
                Logger logger = new Logger(_db, ex.GetType().FullName, ex.Message, ex.StackTrace);
                await logger.LogCritical();

                throw;
            }
        }
        /// <summary>
        /// Метод выгрузит список заданий, в которых был выбран исполнитель.
        /// </summary>
        /// <param name="account">Логин исполнителя.</param>
        /// <returns>Список приглашений с данными заданий.</returns>
        public async Task <GetResultTask> InviteAsync(string account)
        {
            try
            {
                GetResultTask result = new GetResultTask();

                // Выберет Id текущего исполнителя по его логину.
                string executorId = await _userService.GetUserIdByLogin(account);

                // Получит список заданий, в которых выбран исполнитель.
                var invities = await _postgre.Tasks
                               .Join(_postgre.TaskCategories, t => t.CategoryCode, tc => tc.CategoryCode, (t, tc) => new { Tasks = t, ParentTaskCategory = tc })
                               .Join(_postgre.Users, ts => ts.Tasks.OwnerId, u => u.Id, (ts, u) => new
                                     { TaskCategory = ts, User = u })
                               .Join(_postgre.TaskStatuses, tcc => tcc.TaskCategory.Tasks.StatusCode, s => s.StatusCode, (tcc, s) => new { Result = tcc, TaskStatus = s })
                               .Join(_postgre.Invities,
                                     x => x.Result.TaskCategory.Tasks.TaskId,
                                     i => i.TaskId,
                                     (x, i) => new { ChildUser = x, Invite = i })
                               .Where(c => c.Invite.ExecutorId.Equals(executorId) &&
                                      c.ChildUser.Result.TaskCategory.Tasks.StatusCode.Equals(StatusCode.CODE_AUCTION))
                               .Select(res => new
                {
                    res.ChildUser.Result.TaskCategory.Tasks.TaskId,
                    TaskEndda = string.Format("{0:f}", res.ChildUser.Result.TaskCategory.Tasks.TaskEndda),
                    res.ChildUser.Result.TaskCategory.Tasks.TaskTitle,
                    res.ChildUser.Result.TaskCategory.Tasks.TaskDetail,
                    TaskPrice = string.Format("{0:0,0}", res.ChildUser.Result.TaskCategory.Tasks.TaskPrice),
                    res.ChildUser.Result.TaskCategory.Tasks.CountOffers,
                    res.ChildUser.Result.TaskCategory.Tasks.CountViews,
                    res.ChildUser.Result.TaskCategory.Tasks.TypeCode,
                    res.ChildUser.Result.User.UserName,
                    res.ChildUser.Result.TaskCategory.ParentTaskCategory.CategoryName,
                    res.ChildUser.TaskStatus.StatusName
                })
                               .ToListAsync();

                // Если приглашений нет.
                if (invities.Count <= 0)
                {
                    return(result);
                }

                // Запишет логины заказчиков по их OwnerId.
                invities.ForEach(invite =>
                {
                    string jsonString     = JsonSerializer.Serialize(invite);
                    ResultTaskOutput item = JsonSerializer.Deserialize <ResultTaskOutput>(jsonString);

                    // Запишет логин заказчика.
                    if (item != null)
                    {
                        // Возьмет первые 100 символов из заголовка задания.
                        item.TaskTitle = item.TaskTitle.Length > 100
                            ? string.Concat(item.TaskTitle.Substring(0, 100), "...")
                            : item.TaskTitle;

                        // Возьмет первые 200 символов из описания задания.
                        item.TaskDetail = item.TaskDetail.Length > 200
                            ? string.Concat(item.TaskDetail.Substring(0, 200), "...")
                            : item.TaskDetail;
                    }

                    result.Tasks.Add(item);
                });

                return(result);
            }

            catch (Exception ex)
            {
                Console.WriteLine(ex);
                Logger logger = new Logger(_db, ex.GetType().FullName, ex.Message, ex.StackTrace);
                await logger.LogCritical();

                throw;
            }
        }