Files
hcs/Hcs.Client/ClientApi/DebtRequestsApi/HcsDebtResponseImporter.cs
HOME-LAPTOP\kshkulev 33ab055b43 Add project
Basic formatting applied. Unnecessary comments have been removed. Suspicious code is covered by TODO.
2025-08-12 11:21:10 +09:00

142 lines
5.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}
}
}