/// <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()); }