Exemplo n.º 1
0
        /// <summary>
        /// Для переданного absId возвращает все приходные транзакции с распознаннм
        /// признаком типа дохода
        /// </summary>
        /// <param name="absId">Идентификатор клиента из АБС</param>
        /// <returns></returns>
        /// <exception cref="Aeb.SampleService.BL.ClientNotFoundException">
        /// Выбрасывается в случае, если для переданного absId не было задач на импорт
        /// </exception>
        /// <exception cref="Aeb.SampleService.BL.ImportNotCompletedException">
        /// Выбрасывается в случае, если для переданного absId ни одна задача на импорт
        /// ещё не была звершена
        /// </exception>
        public IncomeTransaction[] GetClientIncomeTransactions(int absId)
        {
            // Выбираем все задачи на импорт для переданного absId,
            // для каждой задачи из последнегго изменения состояния выбираем берём статус,
            // по умолчанию проставляя его в 0
            var tasks = _dalService.Tasks()
                        .Where(t => t.AbsId == absId)
                        .GroupJoin(_dalService.TaskChangeLogs(),
                                   k1 => k1.Id,
                                   k2 => k2.TaskId,
                                   (task, changelog) => new {
                Task      = task,
                LastState = changelog.OrderByDescending(c => c.CreatedAt).FirstOrDefault()?.State ?? 0
            }
                                   );

            // Ошибка, если задач на импорт для переданного absId вообще не было
            if (tasks.Count() == 0)
            {
                throw new ClientNotFoundException(absId);
            }

            // Ошибка, если для переданного absId нет ни одной завершённой задачи на импорт
            if (!tasks.Any(item => item.LastState == 1))
            {
                throw new ImportNotCompletedException(absId);
            }

            // Выбираем самый последний по дате создания снапшот для переданного absId
            var lastShapshot = _dalService.Snapshots()
                               .Join(tasks,
                                     k1 => k1.TaskId,
                                     k2 => k2.Task.Id,
                                     (snapshot, task) => snapshot
                                     )
                               .OrderByDescending(s => s.CreatedAt)
                               .FirstOrDefault();

            // Перестраховываемся на случай, если в базе данные несогласованы, и снапшот отсутствует
            if (lastShapshot == null)
            {
                throw new ImportNotCompletedException(absId);
            }

            return(_dalService.SnapshotRecords()
                   .Where(s => s.SnapshotId == lastShapshot.Id)
                   .Select(s => new IncomeTransaction().FillFromDalEntities(s))
                   .ToArray());
        }