Basic formatting applied. Unnecessary comments have been removed. Suspicious code is covered by TODO.
142 lines
5.6 KiB
C#
142 lines
5.6 KiB
C#
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<HcsDebtResponseResult[]> 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;
|
||
}
|
||
}
|
||
}
|