using System; using System.Linq; using System.Threading; using System.Threading.Tasks; using DebtRequests = Hcs.Service.Async.DebtRequests.v14_5_0_1; namespace Hcs.ClientApi.DebtRequestsApi { public class HcsDebtResponseImporter : HcsDebtRequestsMethod { public HcsDebtResponseImporter(HcsClientConfig config) : base(config) { } public async Task ImportDSRResponses( HcsDebtResponse[] debtResponses, CancellationToken token = default) { if (debtResponses == null || debtResponses.Length == 0) throw new ArgumentException("Пустой debtResponses"); var actions = debtResponses.Select(x => ConvertToImportAction(x)).ToArray(); var requestHeader = CreateRequestHeader(); var requestBody = new DebtRequests.importDSRResponsesRequest { Id = HcsConstants.SignedXmlElementId, // TODO: Проверить комментарий // Версия предустановлена в WSDL, реальная версия шаблонов дает ошибку "Bad Request" //version = HcsConstants.DefaultHCSVersionString, action = actions }; var request = new DebtRequests.importResponsesRequest { RequestHeader = requestHeader, importDSRResponsesRequest = requestBody }; var ack = await SendAsync(request, token); var result = await WaitForResultAsync(ack, true, token); var responseResults = result.Items.Select( x => ParseDebtResponseResultSafely(x)).ToArray(); if (debtResponses.Length != responseResults.Length) throw new HcsException( $"Количество направленных ответов {debtResponses.Length} не совпадает" + $" с количеством {responseResults.Length} результатов обработки"); foreach (var response in debtResponses) { var found = responseResults.FirstOrDefault(x => x.TransportGuid == response.TransportGuid); if (found != null) found.SubrequestGuid = response.SubrequestGuid; } return responseResults; } private DebtRequests.importDSRResponsesRequestAction ConvertToImportAction( HcsDebtResponse source) { DebtRequests.DebtInfoType[] debtInfo = null; if (source.HasDebt) { if (IsArrayEmpty(source.PersonalData)) throw new HcsException("Не указаны должники"); debtInfo = source.PersonalData.Select(x => new DebtRequests.DebtInfoType { person = new DebtRequests.DebtInfoTypePerson { firstName = x.FirstName, lastName = x.LastName, middleName = x.MiddleName } }).ToArray(); } var responseData = new DebtRequests.ImportDSRResponseType() { hasDebt = source.HasDebt, description = source.Description, Items = debtInfo, // TODO: Проверить комментарий //debtInfo = debtInfo, // Так было в hcs-v13 executorGUID = ClientConfig.ExecutorGUID }; return new DebtRequests.importDSRResponsesRequestAction() { subrequestGUID = source.SubrequestGuid.ToString(), TransportGUID = source.TransportGuid.ToString(), actionType = DebtRequests.DSRResponseActionType.Send, responseData = responseData }; } private HcsDebtResponseResult ParseDebtResponseResultSafely(object resultItem) { try { return ParseDebtResponseResult(resultItem); } catch (Exception e) { return new HcsDebtResponseResult() { Error = e }; } } private HcsDebtResponseResult ParseDebtResponseResult(object resultItem) { if (resultItem == null) throw new HcsException("Пустой resultItem"); var common = resultItem as DebtRequests.CommonResultType; if (common == null) throw new HcsException($"Неожиданный тип экземпляра ответа {resultItem.GetType()}"); if (common.Items == null || common.Items.Length == 0) throw new HcsException("Пустой набор common.Items"); var result = new HcsDebtResponseResult(); foreach (var commonItem in common.Items) { if (commonItem == null) throw new HcsException("Пустой commonItem"); switch (commonItem) { case DebtRequests.CommonResultTypeError error: result.Error = new HcsRemoteException(error.ErrorCode, error.Description); break; case DateTime updateDate: result.UpdateDate = updateDate; break; default: throw new HcsException($"Неожиданный тип сommonItem" + commonItem.GetType()); } } result.TransportGuid = ParseGuid(common.TransportGUID); return result; } } }