Add new Hcs.Broker to communicate with ГИС ЖКХ via CryptoPro LibCore
This commit is contained in:
@ -0,0 +1,30 @@
|
||||
using Hcs.Broker.Internal;
|
||||
using Hcs.Service.Async.HouseManagement;
|
||||
|
||||
namespace Hcs.Broker.Api.Request.HouseManagement
|
||||
{
|
||||
internal class ExportAccountRequest(Client client) : HouseManagementRequestBase(client)
|
||||
{
|
||||
protected override bool EnableMinimalResponseWaitDelay => false;
|
||||
|
||||
internal async Task<IEnumerable<exportAccountResultType>> ExecuteAsync(string fiasHouseGuid, CancellationToken token)
|
||||
{
|
||||
// http://open-gkh.ru/HouseManagement/exportAccountRequest.html
|
||||
var request = new exportAccountRequest
|
||||
{
|
||||
Id = Constants.SIGNED_XML_ELEMENT_ID,
|
||||
version = "10.0.1.1",
|
||||
Items = [fiasHouseGuid],
|
||||
ItemsElementName = [ItemsChoiceType26.FIASHouseGuid]
|
||||
};
|
||||
|
||||
var result = await SendAndWaitResultAsync(request, async asyncClient =>
|
||||
{
|
||||
var response = await asyncClient.exportAccountDataAsync(CreateRequestHeader(), request);
|
||||
return response.AckRequest.Ack;
|
||||
}, token);
|
||||
|
||||
return result.Items.OfType<exportAccountResultType>();
|
||||
}
|
||||
}
|
||||
}
|
||||
29
Hcs.Broker/Api/Request/HouseManagement/ExportHouseRequest.cs
Normal file
29
Hcs.Broker/Api/Request/HouseManagement/ExportHouseRequest.cs
Normal file
@ -0,0 +1,29 @@
|
||||
using Hcs.Broker.Internal;
|
||||
using Hcs.Service.Async.HouseManagement;
|
||||
|
||||
namespace Hcs.Broker.Api.Request.HouseManagement
|
||||
{
|
||||
internal class ExportHouseRequest(Client client) : HouseManagementRequestBase(client)
|
||||
{
|
||||
protected override bool EnableMinimalResponseWaitDelay => false;
|
||||
|
||||
internal async Task<IEnumerable<exportHouseResultType>> ExecuteAsync(string fiasHouseGuid, CancellationToken token)
|
||||
{
|
||||
// http://open-gkh.ru/HouseManagement/exportHouseRequest.html
|
||||
var request = new exportHouseRequest
|
||||
{
|
||||
Id = Constants.SIGNED_XML_ELEMENT_ID,
|
||||
version = "15.6.0.1",
|
||||
FIASHouseGuid = fiasHouseGuid
|
||||
};
|
||||
|
||||
var result = await SendAndWaitResultAsync(request, async asyncClient =>
|
||||
{
|
||||
var response = await asyncClient.exportHouseDataAsync(CreateRequestHeader(), request);
|
||||
return response.AckRequest.Ack;
|
||||
}, token);
|
||||
|
||||
return result.Items.OfType<exportHouseResultType>();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,130 @@
|
||||
using Hcs.Broker.Api.Request.Exception;
|
||||
using Hcs.Broker.Internal;
|
||||
using Hcs.Service.Async.HouseManagement;
|
||||
|
||||
namespace Hcs.Broker.Api.Request.HouseManagement
|
||||
{
|
||||
internal class ExportSupplyResourceContractDataRequest(Client client) : HouseManagementRequestBase(client)
|
||||
{
|
||||
protected override bool EnableMinimalResponseWaitDelay => false;
|
||||
|
||||
internal async Task<IEnumerable<exportSupplyResourceContractResultType>> ExecuteAsync(CancellationToken token)
|
||||
{
|
||||
var result = new List<exportSupplyResourceContractResultType>();
|
||||
|
||||
void OnResultReceived(exportSupplyResourceContractResultType[] contracts)
|
||||
{
|
||||
if (contracts?.Length > 0)
|
||||
{
|
||||
result.AddRange(contracts);
|
||||
}
|
||||
}
|
||||
|
||||
var pageNum = 0;
|
||||
Guid? exportContractRootGuid = null;
|
||||
while (true)
|
||||
{
|
||||
pageNum++;
|
||||
|
||||
client.TryLog($"Querying page #{pageNum}...");
|
||||
|
||||
var data = await QueryBatchAsync(null, null, exportContractRootGuid, OnResultReceived, token);
|
||||
if (data.IsLastPage)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
exportContractRootGuid = data.NextGuid;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
internal async Task<exportSupplyResourceContractResultType> ExecuteAsync(Guid contractRootGuid, CancellationToken token)
|
||||
{
|
||||
exportSupplyResourceContractResultType result = null;
|
||||
|
||||
void OnResultReceived(exportSupplyResourceContractResultType[] contracts)
|
||||
{
|
||||
result = contracts?.Length > 0 ? contracts[0] : null;
|
||||
}
|
||||
|
||||
await QueryBatchAsync(contractRootGuid, null, null, OnResultReceived, token);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
internal async Task<exportSupplyResourceContractResultType> ExecuteAsync(string contractNumber, CancellationToken token)
|
||||
{
|
||||
exportSupplyResourceContractResultType result = null;
|
||||
|
||||
void OnResultReceived(exportSupplyResourceContractResultType[] contracts)
|
||||
{
|
||||
result = contracts?.Length > 0 ? contracts[0] : null;
|
||||
}
|
||||
|
||||
await QueryBatchAsync(null, contractNumber, null, OnResultReceived, token);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private async Task<PaginationData> QueryBatchAsync(
|
||||
Guid? contractRootGuid, string contractNumber, Guid? exportContractRootGuid,
|
||||
Action<exportSupplyResourceContractResultType[]> onResultReceived,
|
||||
CancellationToken token)
|
||||
{
|
||||
var itemsElementName = new List<ItemsChoiceType32>();
|
||||
var items = new List<object>();
|
||||
|
||||
if (contractRootGuid.HasValue)
|
||||
{
|
||||
itemsElementName.Add(ItemsChoiceType32.ContractRootGUID);
|
||||
items.Add(contractRootGuid.ToString());
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(contractNumber))
|
||||
{
|
||||
itemsElementName.Add(ItemsChoiceType32.ContractNumber);
|
||||
items.Add(contractNumber);
|
||||
}
|
||||
|
||||
if (exportContractRootGuid.HasValue)
|
||||
{
|
||||
itemsElementName.Add(ItemsChoiceType32.ExportContractRootGUID);
|
||||
items.Add(exportContractRootGuid.ToString());
|
||||
}
|
||||
|
||||
// http://open-gkh.ru/HouseManagement/exportSupplyResourceContractRequest.html
|
||||
var request = new exportSupplyResourceContractRequest
|
||||
{
|
||||
Id = Constants.SIGNED_XML_ELEMENT_ID,
|
||||
version = "13.1.1.1",
|
||||
ItemsElementName = [.. itemsElementName],
|
||||
Items = [.. items]
|
||||
};
|
||||
|
||||
try
|
||||
{
|
||||
var result = await SendAndWaitResultAsync(request, async asyncClient =>
|
||||
{
|
||||
var ackResponse = await asyncClient.exportSupplyResourceContractDataAsync(
|
||||
CreateRequestHeader(), request);
|
||||
return ackResponse.AckRequest.Ack;
|
||||
}, token);
|
||||
|
||||
var contractResult = result.Items.OfType<getStateResultExportSupplyResourceContractResult>().First();
|
||||
onResultReceived?.Invoke(contractResult.Contract);
|
||||
|
||||
return new PaginationData(contractResult.Item);
|
||||
}
|
||||
catch (NoResultsRemoteException)
|
||||
{
|
||||
return PaginationData.CreateLastPageData();
|
||||
}
|
||||
catch (System.Exception e)
|
||||
{
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,91 @@
|
||||
using Hcs.Broker.Api.Request.Exception;
|
||||
using Hcs.Broker.Internal;
|
||||
using Hcs.Service.Async.HouseManagement;
|
||||
|
||||
namespace Hcs.Broker.Api.Request.HouseManagement
|
||||
{
|
||||
internal class ExportSupplyResourceContractObjectAddressDataRequest(Client client) : HouseManagementRequestBase(client)
|
||||
{
|
||||
internal async Task<IEnumerable<exportSupplyResourceContractObjectAddressResultType>> ExecuteAsync(Guid contractRootGuid, CancellationToken token)
|
||||
{
|
||||
var result = new List<exportSupplyResourceContractObjectAddressResultType>();
|
||||
|
||||
void OnResultReceived(exportSupplyResourceContractObjectAddressResultType[] addresses)
|
||||
{
|
||||
if (addresses?.Length > 0)
|
||||
{
|
||||
result.AddRange(addresses);
|
||||
}
|
||||
}
|
||||
|
||||
var pageNum = 0;
|
||||
Guid? exportObjectGuid = null;
|
||||
while (true)
|
||||
{
|
||||
pageNum++;
|
||||
|
||||
client.TryLog($"Querying page #{pageNum}...");
|
||||
|
||||
var data = await QueryBatchAsync(contractRootGuid, exportObjectGuid, OnResultReceived, token);
|
||||
if (data.IsLastPage)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
exportObjectGuid = data.NextGuid;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private async Task<PaginationData> QueryBatchAsync(
|
||||
Guid contractRootGuid, Guid? exportObjectGuid,
|
||||
Action<exportSupplyResourceContractObjectAddressResultType[]> onResultReceived,
|
||||
CancellationToken token)
|
||||
{
|
||||
var itemsElementName = new List<ItemsChoiceType34>();
|
||||
var items = new List<string>();
|
||||
|
||||
itemsElementName.Add(ItemsChoiceType34.ContractRootGUID);
|
||||
items.Add(contractRootGuid.ToString());
|
||||
|
||||
if (exportObjectGuid.HasValue)
|
||||
{
|
||||
itemsElementName.Add(ItemsChoiceType34.ExportObjectGUID);
|
||||
items.Add(exportObjectGuid.ToString());
|
||||
}
|
||||
|
||||
// http://open-gkh.ru/HouseManagement/exportSupplyResourceContractObjectAddressRequest.html
|
||||
var request = new exportSupplyResourceContractObjectAddressRequest
|
||||
{
|
||||
Id = Constants.SIGNED_XML_ELEMENT_ID,
|
||||
version = "13.1.1.1",
|
||||
ItemsElementName = [.. itemsElementName],
|
||||
Items = [.. items]
|
||||
};
|
||||
|
||||
try
|
||||
{
|
||||
var result = await SendAndWaitResultAsync(request, async asyncClient =>
|
||||
{
|
||||
var ackResponse = await asyncClient.exportSupplyResourceContractObjectAddressDataAsync(
|
||||
CreateRequestHeader(), request);
|
||||
return ackResponse.AckRequest.Ack;
|
||||
}, token);
|
||||
|
||||
var contractResult = result.Items.OfType<getStateResultExportSupplyResourceContractObjectAddress>().First();
|
||||
onResultReceived?.Invoke(contractResult.ObjectAddress);
|
||||
|
||||
return new PaginationData(contractResult.Item);
|
||||
}
|
||||
catch (NoResultsRemoteException)
|
||||
{
|
||||
return PaginationData.CreateLastPageData();
|
||||
}
|
||||
catch (System.Exception e)
|
||||
{
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,78 @@
|
||||
using Hcs.Broker.Api.Request.Adapter;
|
||||
using Hcs.Broker.Api.Request.Exception;
|
||||
using Hcs.Service.Async.HouseManagement;
|
||||
|
||||
namespace Hcs.Service.Async.HouseManagement
|
||||
{
|
||||
#pragma warning disable IDE1006
|
||||
public partial class getStateResult : IGetStateResultMany { }
|
||||
#pragma warning restore IDE1006
|
||||
|
||||
public partial class HouseManagementPortsTypeAsyncClient : IAsyncClient<RequestHeader>
|
||||
{
|
||||
public async Task<IGetStateResponse> GetStateAsync(RequestHeader header, IGetStateRequest request)
|
||||
{
|
||||
return await getStateAsync(header, (getStateRequest)request);
|
||||
}
|
||||
}
|
||||
|
||||
#pragma warning disable IDE1006
|
||||
public partial class getStateResponse : IGetStateResponse
|
||||
#pragma warning restore IDE1006
|
||||
{
|
||||
public IGetStateResult GetStateResult => getStateResult;
|
||||
}
|
||||
|
||||
public partial class AckRequestAck : IAck { }
|
||||
|
||||
public partial class ErrorMessageType : IErrorMessage { }
|
||||
|
||||
#pragma warning disable IDE1006
|
||||
public partial class getStateRequest : IGetStateRequest { }
|
||||
#pragma warning restore IDE1006
|
||||
}
|
||||
|
||||
namespace Hcs.Broker.Api.Request.HouseManagement
|
||||
{
|
||||
internal class HouseManagementRequestBase(Client client) :
|
||||
RequestBase<getStateResult,
|
||||
HouseManagementPortsTypeAsyncClient,
|
||||
HouseManagementPortsTypeAsync,
|
||||
RequestHeader,
|
||||
AckRequestAck,
|
||||
ErrorMessageType,
|
||||
getStateRequest>(client)
|
||||
{
|
||||
protected override EndPoint EndPoint => EndPoint.HomeManagementAsync;
|
||||
|
||||
protected override bool EnableMinimalResponseWaitDelay => true;
|
||||
|
||||
protected override bool CanBeRestarted => true;
|
||||
|
||||
protected override int RestartTimeoutMinutes => 20;
|
||||
|
||||
protected getStateResultImportResultCommonResult[] GetCommonResults(IEnumerable<getStateResultImportResult> importResults)
|
||||
{
|
||||
var result = new List<getStateResultImportResultCommonResult>();
|
||||
foreach (var importResult in importResults)
|
||||
{
|
||||
importResult.Items.OfType<ErrorMessageType>().ToList().ForEach(error =>
|
||||
{
|
||||
throw RemoteException.CreateNew(error.ErrorCode, error.Description);
|
||||
});
|
||||
|
||||
var commonResults = importResult.Items.OfType<getStateResultImportResultCommonResult>();
|
||||
foreach (var commonResult in commonResults)
|
||||
{
|
||||
commonResult.Items.OfType<CommonResultTypeError>().ToList().ForEach(error =>
|
||||
{
|
||||
throw RemoteException.CreateNew(error.ErrorCode, error.Description);
|
||||
});
|
||||
}
|
||||
|
||||
result.AddRange(commonResults);
|
||||
}
|
||||
return [.. result];
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,114 @@
|
||||
using Hcs.Broker.Api.Payload.HouseManagement;
|
||||
using Hcs.Broker.Api.Request.Exception;
|
||||
using Hcs.Broker.Internal;
|
||||
using Hcs.Service.Async.HouseManagement;
|
||||
|
||||
namespace Hcs.Broker.Api.Request.HouseManagement
|
||||
{
|
||||
internal class ImportAccountDataRequest(Client client) : HouseManagementRequestBase(client)
|
||||
{
|
||||
protected override bool CanBeRestarted => false;
|
||||
|
||||
internal async Task<bool> ExecuteAsync(ImportAccountDataPayload payload, CancellationToken token)
|
||||
{
|
||||
// TODO: Добавить проверку пейлоада
|
||||
|
||||
// http://open-gkh.ru/HouseManagement/importAccountRequest.html
|
||||
var request = new importAccountRequest
|
||||
{
|
||||
Id = Constants.SIGNED_XML_ELEMENT_ID,
|
||||
version = "10.0.1.1",
|
||||
Account = [GetAccountFromPayload(payload)]
|
||||
};
|
||||
|
||||
var result = await SendAndWaitResultAsync(request, async asyncClient =>
|
||||
{
|
||||
var response = await asyncClient.importAccountDataAsync(CreateRequestHeader(), request);
|
||||
return response.AckRequest.Ack;
|
||||
}, token);
|
||||
|
||||
result.Items.OfType<ErrorMessageType>().ToList().ForEach(error =>
|
||||
{
|
||||
throw RemoteException.CreateNew(error.ErrorCode, error.Description);
|
||||
});
|
||||
|
||||
var importResults = result.Items.OfType<getStateResultImportResult>();
|
||||
var commonResults = GetCommonResults(importResults);
|
||||
foreach (var commonResult in commonResults)
|
||||
{
|
||||
if (commonResult.ItemElementName == ItemChoiceType26.ImportAccount)
|
||||
{
|
||||
return commonResult.Item is getStateResultImportResultCommonResultImportAccount;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private importAccountRequestAccount GetAccountFromPayload(ImportAccountDataPayload payload)
|
||||
{
|
||||
var account = new importAccountRequestAccount()
|
||||
{
|
||||
TransportGUID = Guid.NewGuid().ToString(),
|
||||
AccountNumber = payload.accountNumber,
|
||||
AccountGUID = payload.accountGUID,
|
||||
AccountReasons = payload.accountReasons,
|
||||
Item = true,
|
||||
Accommodation = payload.accomodations,
|
||||
PayerInfo = payload.payerInfo
|
||||
};
|
||||
|
||||
switch (payload.accountType)
|
||||
{
|
||||
case ImportAccountDataPayload.AccountType.UO:
|
||||
account.ItemElementName = ItemChoiceType8.isUOAccount;
|
||||
break;
|
||||
|
||||
case ImportAccountDataPayload.AccountType.RSO:
|
||||
account.ItemElementName = ItemChoiceType8.isRSOAccount;
|
||||
break;
|
||||
|
||||
case ImportAccountDataPayload.AccountType.CR:
|
||||
account.ItemElementName = ItemChoiceType8.isCRAccount;
|
||||
break;
|
||||
|
||||
case ImportAccountDataPayload.AccountType.RC:
|
||||
account.ItemElementName = ItemChoiceType8.isRCAccount;
|
||||
break;
|
||||
|
||||
case ImportAccountDataPayload.AccountType.OGVorOMS:
|
||||
account.ItemElementName = ItemChoiceType8.isOGVorOMSAccount;
|
||||
break;
|
||||
|
||||
case ImportAccountDataPayload.AccountType.TKO:
|
||||
account.ItemElementName = ItemChoiceType8.isTKOAccount;
|
||||
break;
|
||||
}
|
||||
|
||||
if (payload.livingPersonsNumber.HasValue)
|
||||
{
|
||||
account.LivingPersonsNumber = payload.livingPersonsNumber.Value.ToString();
|
||||
}
|
||||
|
||||
if (payload.totalSquare.HasValue)
|
||||
{
|
||||
account.TotalSquare = payload.totalSquare.Value;
|
||||
account.TotalSquareSpecified = true;
|
||||
}
|
||||
|
||||
if (payload.residentialSquare.HasValue)
|
||||
{
|
||||
account.ResidentialSquare = payload.residentialSquare.Value;
|
||||
account.ResidentialSquareSpecified = true;
|
||||
}
|
||||
|
||||
if (payload.heatedArea.HasValue)
|
||||
{
|
||||
account.HeatedArea = payload.heatedArea.Value;
|
||||
account.HeatedAreaSpecified = true;
|
||||
}
|
||||
|
||||
return account;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,81 @@
|
||||
using Hcs.Broker.Api.Payload.HouseManagement;
|
||||
using Hcs.Broker.Api.Request.Exception;
|
||||
using Hcs.Broker.Internal;
|
||||
using Hcs.Service.Async.HouseManagement;
|
||||
|
||||
namespace Hcs.Broker.Api.Request.HouseManagement
|
||||
{
|
||||
internal class ImportContractDataRequest(Client client) : HouseManagementRequestBase(client)
|
||||
{
|
||||
protected override bool CanBeRestarted => false;
|
||||
internal async Task<importContractResultType> ExecuteAsync(ImportContractDataPayload payload, CancellationToken token)
|
||||
{
|
||||
// TODO: Добавить проверку пейлоада
|
||||
|
||||
// http://open-gkh.ru/HouseManagement/importContractRequest/Contract.html
|
||||
var contract = new importContractRequestContract
|
||||
{
|
||||
TransportGUID = Guid.NewGuid().ToString(),
|
||||
Item = GetContractFromPayload(payload)
|
||||
};
|
||||
|
||||
// http://open-gkh.ru/HouseManagement/importContractRequest.html
|
||||
var request = new importContractRequest
|
||||
{
|
||||
Id = Constants.SIGNED_XML_ELEMENT_ID,
|
||||
version = "11.9.0.1",
|
||||
Contract = [contract]
|
||||
};
|
||||
|
||||
var result = await SendAndWaitResultAsync(request, async asyncClient =>
|
||||
{
|
||||
var response = await asyncClient.importContractDataAsync(CreateRequestHeader(), request);
|
||||
return response.AckRequest.Ack;
|
||||
}, token);
|
||||
|
||||
result.Items.OfType<ErrorMessageType>().ToList().ForEach(error =>
|
||||
{
|
||||
throw RemoteException.CreateNew(error.ErrorCode, error.Description);
|
||||
});
|
||||
|
||||
var importResults = result.Items.OfType<getStateResultImportResult>();
|
||||
var commonResults = GetCommonResults(importResults);
|
||||
foreach (var commonResult in commonResults)
|
||||
{
|
||||
if (commonResult.ItemElementName == ItemChoiceType26.importContract)
|
||||
{
|
||||
if (commonResult.Item is importContractResultType importedContract)
|
||||
{
|
||||
return importedContract;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private importContractRequestContractPlacingContract GetContractFromPayload(ImportContractDataPayload payload)
|
||||
{
|
||||
// http://open-gkh.ru/HouseManagement/importContractRequest/Contract/PlacingContract.html
|
||||
var contract = new importContractRequestContractPlacingContract()
|
||||
{
|
||||
ContractObject = payload.contractObjects,
|
||||
DocNum = payload.docNum,
|
||||
SigningDate = payload.signingDate,
|
||||
EffectiveDate = payload.effectiveDate,
|
||||
PlanDateComptetion = payload.planDateComptetion,
|
||||
Item = true,
|
||||
ItemElementName = ItemChoiceType13.Owners,
|
||||
ContractBase = new nsiRef()
|
||||
{
|
||||
Code = payload.contractBase.Code,
|
||||
GUID = payload.contractBase.GUID
|
||||
},
|
||||
DateDetails = payload.dateDetailsType,
|
||||
ContractAttachment = payload.contractAttachment
|
||||
};
|
||||
|
||||
return contract;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,113 @@
|
||||
using Hcs.Broker.Api.Payload.HouseManagement;
|
||||
using Hcs.Broker.Api.Request.Exception;
|
||||
using Hcs.Broker.Internal;
|
||||
using Hcs.Service.Async.HouseManagement;
|
||||
|
||||
namespace Hcs.Broker.Api.Request.HouseManagement
|
||||
{
|
||||
internal class ImportHouseUODataRequest(Client client) : HouseManagementRequestBase(client)
|
||||
{
|
||||
protected override bool CanBeRestarted => false;
|
||||
|
||||
internal async Task<bool> ExecuteAsync(ImportLivingHouseUODataPayload payload, CancellationToken token)
|
||||
{
|
||||
// TODO: Добавить проверку пейлоада
|
||||
|
||||
// http://open-gkh.ru/HouseManagement/importHouseUORequest.html
|
||||
var request = new importHouseUORequest
|
||||
{
|
||||
Id = Constants.SIGNED_XML_ELEMENT_ID,
|
||||
version = "13.2.3.2",
|
||||
Item = GetLivingHouseFromPayload(payload)
|
||||
};
|
||||
|
||||
var result = await SendAndWaitResultAsync(request, async asyncClient =>
|
||||
{
|
||||
var response = await asyncClient.importHouseUODataAsync(CreateRequestHeader(), request);
|
||||
return response.AckRequest.Ack;
|
||||
}, token);
|
||||
|
||||
result.Items.OfType<ErrorMessageType>().ToList().ForEach(error =>
|
||||
{
|
||||
throw RemoteException.CreateNew(error.ErrorCode, error.Description);
|
||||
});
|
||||
|
||||
var importResults = result.Items.OfType<getStateResultImportResult>();
|
||||
var commonResults = GetCommonResults(importResults);
|
||||
foreach (var commonResult in commonResults)
|
||||
{
|
||||
if (commonResult.ItemElementName == ItemChoiceType26.ImportHouseUO)
|
||||
{
|
||||
return commonResult.Item is OGFImportStatusType;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private importHouseUORequestLivingHouse GetLivingHouseFromPayload(ImportLivingHouseUODataPayload payload)
|
||||
{
|
||||
var livingHouse = new importHouseUORequestLivingHouseLivingHouseToCreate()
|
||||
{
|
||||
TransportGUID = Guid.NewGuid().ToString(),
|
||||
BasicCharacteristicts = new HouseBasicUOType()
|
||||
{
|
||||
FIASHouseGuid = payload.fiasHouseGuid.ToString(),
|
||||
TotalSquare = payload.totalSquare,
|
||||
State = new nsiRef()
|
||||
{
|
||||
Code = payload.state.Code,
|
||||
GUID = payload.state.GUID
|
||||
},
|
||||
LifeCycleStage = new nsiRef()
|
||||
{
|
||||
Code = payload.lifeCycleStage.Code,
|
||||
GUID = payload.lifeCycleStage.GUID
|
||||
},
|
||||
UsedYear = payload.usedYear,
|
||||
FloorCount = payload.floorCount,
|
||||
OKTMO = payload.oktmo,
|
||||
OlsonTZ = new nsiRef()
|
||||
{
|
||||
Code = payload.olsonTZ.Code,
|
||||
GUID = payload.olsonTZ.GUID
|
||||
},
|
||||
CulturalHeritage = payload.culturalHeritage,
|
||||
OGFData = payload.ogfData,
|
||||
// TODO: Разобраться с кадастровым номером
|
||||
Items = [true, payload.conditionalNumber],
|
||||
ItemsElementName = [ItemsChoiceType3.NoCadastralNumber, ItemsChoiceType3.ConditionalNumber]
|
||||
}
|
||||
};
|
||||
|
||||
if (!payload.isMunicipalProperty)
|
||||
{
|
||||
livingHouse.BasicCharacteristicts.IsMunicipalProperty = false;
|
||||
livingHouse.BasicCharacteristicts.IsMunicipalPropertySpecified = true;
|
||||
}
|
||||
|
||||
if (!payload.isRegionProperty)
|
||||
{
|
||||
livingHouse.BasicCharacteristicts.IsRegionProperty = false;
|
||||
livingHouse.BasicCharacteristicts.IsRegionPropertySpecified = true;
|
||||
}
|
||||
|
||||
if (payload.hasBlocks)
|
||||
{
|
||||
livingHouse.HasBlocks = true;
|
||||
livingHouse.HasBlocksSpecified = true;
|
||||
}
|
||||
|
||||
if (payload.hasMultipleHousesWithSameAddress)
|
||||
{
|
||||
livingHouse.HasMultipleHousesWithSameAddress = true;
|
||||
livingHouse.HasMultipleHousesWithSameAddressSpecified = true;
|
||||
}
|
||||
|
||||
return new importHouseUORequestLivingHouse()
|
||||
{
|
||||
Item = livingHouse
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,52 @@
|
||||
using Hcs.Broker.Api.Request.Exception;
|
||||
using Hcs.Broker.Internal;
|
||||
using Hcs.Service.Async.HouseManagement;
|
||||
|
||||
namespace Hcs.Broker.Api.Request.HouseManagement
|
||||
{
|
||||
internal class ImportMeteringDeviceDataRequest(Client client) : HouseManagementRequestBase(client)
|
||||
{
|
||||
protected override bool CanBeRestarted => false;
|
||||
|
||||
internal async Task<bool> ExecuteAsync(MeteringDeviceFullInformationType meteringDevice, CancellationToken token)
|
||||
{
|
||||
// http://open-gkh.ru/HouseManagement/importMeteringDeviceDataRequest.html
|
||||
var request = new importMeteringDeviceDataRequest
|
||||
{
|
||||
Id = Constants.SIGNED_XML_ELEMENT_ID,
|
||||
version = "11.1.0.8",
|
||||
MeteringDevice =
|
||||
[
|
||||
new importMeteringDeviceDataRequestMeteringDevice()
|
||||
{
|
||||
TransportGUID = Guid.NewGuid().ToString(),
|
||||
Item = meteringDevice
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
var result = await SendAndWaitResultAsync(request, async asyncClient =>
|
||||
{
|
||||
var response = await asyncClient.importMeteringDeviceDataAsync(CreateRequestHeader(), request);
|
||||
return response.AckRequest.Ack;
|
||||
}, token);
|
||||
|
||||
result.Items.OfType<ErrorMessageType>().ToList().ForEach(error =>
|
||||
{
|
||||
throw RemoteException.CreateNew(error.ErrorCode, error.Description);
|
||||
});
|
||||
|
||||
var importResults = result.Items.OfType<getStateResultImportResult>();
|
||||
var commonResults = GetCommonResults(importResults);
|
||||
foreach (var commonResult in commonResults)
|
||||
{
|
||||
if (commonResult.ItemElementName == ItemChoiceType26.importMeteringDevice)
|
||||
{
|
||||
return commonResult.Item is getStateResultImportResultCommonResultImportMeteringDevice;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,108 @@
|
||||
using Hcs.Broker.Api.Payload.HouseManagement;
|
||||
using Hcs.Broker.Api.Request.Exception;
|
||||
using Hcs.Broker.Internal;
|
||||
using Hcs.Service.Async.HouseManagement;
|
||||
|
||||
namespace Hcs.Broker.Api.Request.HouseManagement
|
||||
{
|
||||
internal class ImportNotificationDataRequest(Client client) : HouseManagementRequestBase(client)
|
||||
{
|
||||
protected override bool CanBeRestarted => false;
|
||||
|
||||
internal async Task<bool> ExecuteAsync(ImportNotificationDataPayload payload, CancellationToken token)
|
||||
{
|
||||
// TODO: Добавить проверку пейлоада
|
||||
|
||||
var notification = new importNotificationRequestNotification()
|
||||
{
|
||||
TransportGUID = Guid.NewGuid().ToString(),
|
||||
Item = GetNotificationFromPayload(payload)
|
||||
};
|
||||
|
||||
// http://open-gkh.ru/HouseManagement/importNotificationRequest.html
|
||||
var request = new importNotificationRequest
|
||||
{
|
||||
Id = Constants.SIGNED_XML_ELEMENT_ID,
|
||||
version = "13.2.2.0",
|
||||
notification = [notification]
|
||||
};
|
||||
|
||||
var result = await SendAndWaitResultAsync(request, async asyncClient =>
|
||||
{
|
||||
var response = await asyncClient.importNotificationDataAsync(CreateRequestHeader(), request);
|
||||
return response.AckRequest.Ack;
|
||||
}, token);
|
||||
|
||||
result.Items.OfType<ErrorMessageType>().ToList().ForEach(error =>
|
||||
{
|
||||
throw RemoteException.CreateNew(error.ErrorCode, error.Description);
|
||||
});
|
||||
|
||||
var importResults = result.Items.OfType<getStateResultImportResult>();
|
||||
var commonResults = GetCommonResults(importResults);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private importNotificationRequestNotificationCreate GetNotificationFromPayload(ImportNotificationDataPayload payload)
|
||||
{
|
||||
var notification = new importNotificationRequestNotificationCreate();
|
||||
|
||||
if (!string.IsNullOrEmpty(payload.topic))
|
||||
{
|
||||
notification.Item = payload.topic;
|
||||
}
|
||||
else
|
||||
{
|
||||
notification.Item = payload.topicFromRegistry;
|
||||
}
|
||||
|
||||
if (payload.isImportant)
|
||||
{
|
||||
notification.IsImportant = true;
|
||||
notification.IsImportantSpecified = true;
|
||||
}
|
||||
|
||||
notification.content = payload.content;
|
||||
|
||||
var items = new List<object>();
|
||||
var itemsElementName = new List<ItemsChoiceType29>();
|
||||
foreach (var tuple in payload.destinations)
|
||||
{
|
||||
items.Add(tuple.Item2);
|
||||
itemsElementName.Add(tuple.Item1);
|
||||
}
|
||||
notification.Items = [.. items];
|
||||
notification.ItemsElementName = [.. itemsElementName];
|
||||
|
||||
if (payload.isNotLimit)
|
||||
{
|
||||
notification.Items1 = [true];
|
||||
notification.Items1ElementName = [Items1ChoiceType.IsNotLimit];
|
||||
}
|
||||
else
|
||||
{
|
||||
notification.Items1 = [payload.startDate.Value, payload.endDate.Value];
|
||||
notification.Items1ElementName = [Items1ChoiceType.StartDate, Items1ChoiceType.EndDate];
|
||||
}
|
||||
|
||||
// TODO: Добавить добавление аттачмента
|
||||
|
||||
if (payload.isShipOff)
|
||||
{
|
||||
notification.IsShipOff = true;
|
||||
notification.IsShipOffSpecified = true;
|
||||
}
|
||||
|
||||
if (payload.isForPublishToMobileApp)
|
||||
{
|
||||
notification.IsForPublishToMobileApp = true;
|
||||
notification.IsForPublishToMobileAppSpecified = true;
|
||||
}
|
||||
|
||||
notification.MobileAppData = payload.mobileAppData;
|
||||
|
||||
return notification;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,297 @@
|
||||
using Hcs.Broker.Api.Payload.HouseManagement;
|
||||
using Hcs.Broker.Api.Request.Exception;
|
||||
using Hcs.Broker.Internal;
|
||||
using Hcs.Service.Async.HouseManagement;
|
||||
|
||||
namespace Hcs.Broker.Api.Request.HouseManagement
|
||||
{
|
||||
internal class ImportSupplyResourceContractDataRequest(Client client) : HouseManagementRequestBase(client)
|
||||
{
|
||||
protected override bool CanBeRestarted => false;
|
||||
|
||||
internal async Task<getStateResultImportResultCommonResultImportSupplyResourceContract> ExecuteAsync(ImportSupplyResourceContractDataPayload payload, CancellationToken token)
|
||||
{
|
||||
ThrowIfPayloadIncorrect(payload);
|
||||
|
||||
// http://open-gkh.ru/HouseManagement/SupplyResourceContractType.html
|
||||
var contract = new importSupplyResourceContractRequestContract
|
||||
{
|
||||
TransportGUID = Guid.NewGuid().ToString(),
|
||||
Item1 = GetContractFromPayload(payload)
|
||||
};
|
||||
|
||||
// http://open-gkh.ru/HouseManagement/importSupplyResourceContractRequest.html
|
||||
var request = new importSupplyResourceContractRequest
|
||||
{
|
||||
Id = Constants.SIGNED_XML_ELEMENT_ID,
|
||||
version = "11.3.0.5",
|
||||
Contract = [contract]
|
||||
};
|
||||
|
||||
var result = await SendAndWaitResultAsync(request, async asyncClient =>
|
||||
{
|
||||
var response = await asyncClient.importSupplyResourceContractDataAsync(CreateRequestHeader(), request);
|
||||
return response.AckRequest.Ack;
|
||||
}, token);
|
||||
|
||||
result.Items.OfType<ErrorMessageType>().ToList().ForEach(error =>
|
||||
{
|
||||
throw RemoteException.CreateNew(error.ErrorCode, error.Description);
|
||||
});
|
||||
|
||||
var importResults = result.Items.OfType<getStateResultImportResult>();
|
||||
var commonResults = GetCommonResults(importResults);
|
||||
foreach (var commonResult in commonResults)
|
||||
{
|
||||
if (commonResult.ItemElementName == ItemChoiceType26.ImportSupplyResourceContract)
|
||||
{
|
||||
if (commonResult.Item is getStateResultImportResultCommonResultImportSupplyResourceContract importedContract)
|
||||
{
|
||||
return importedContract;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private void ThrowIfPayloadIncorrect(ImportSupplyResourceContractDataPayload payload)
|
||||
{
|
||||
if (string.IsNullOrEmpty(payload.contractNumber))
|
||||
{
|
||||
throw new ArgumentException($"{nameof(payload.contractNumber)} is empty");
|
||||
}
|
||||
|
||||
if (payload.signingDate.Equals(default) || payload.effectiveDate.Equals(default))
|
||||
{
|
||||
throw new ArgumentException($"{nameof(payload.signingDate)} OR/AND {nameof(payload.effectiveDate)} are default");
|
||||
}
|
||||
|
||||
if (!payload.comptetionDate.HasValue && payload.automaticRollOverOneYear)
|
||||
{
|
||||
throw new ArgumentException($"{nameof(payload.comptetionDate)} is null but {nameof(payload.automaticRollOverOneYear)} has value");
|
||||
}
|
||||
|
||||
if (payload.period == null && (payload.volumeDepends.HasValue && payload.volumeDepends.Value
|
||||
|| payload.meteringDeviceInformation.HasValue && payload.meteringDeviceInformation.Value))
|
||||
{
|
||||
throw new ArgumentException($"{nameof(payload.period)} is null but {nameof(payload.volumeDepends)} OR/AND {nameof(payload.meteringDeviceInformation)} have value");
|
||||
}
|
||||
|
||||
if (payload.indicationsAnyDay && payload.period == null)
|
||||
{
|
||||
throw new ArgumentException($"{nameof(payload.indicationsAnyDay)} has value but {nameof(payload.period)} is null");
|
||||
}
|
||||
|
||||
// TODO: Add counterparty check
|
||||
|
||||
if (payload.plannedVolumeType.HasValue && !payload.isPlannedVolume)
|
||||
{
|
||||
throw new ArgumentException($"{nameof(payload.plannedVolumeType)} has value but {nameof(payload.isPlannedVolume)} is false");
|
||||
}
|
||||
|
||||
if (payload.contractSubject == null || payload.contractSubject.Length == 0)
|
||||
{
|
||||
throw new ArgumentException($"{nameof(payload.contractSubject)} is empty");
|
||||
}
|
||||
|
||||
if (payload.contractSubject != null && payload.contractSubject.Length > 100)
|
||||
{
|
||||
throw new ArgumentException($"{nameof(payload.contractSubject)} exceeds its limit ({payload.contractSubject.Length} of 100)");
|
||||
}
|
||||
|
||||
if (payload.countingResource.HasValue && (!payload.accrualProcedure.HasValue ||
|
||||
payload.accrualProcedure.Value == SupplyResourceContractTypeAccrualProcedure.O))
|
||||
{
|
||||
throw new ArgumentException($"{nameof(payload.countingResource)} has value but {nameof(payload.accrualProcedure)} is null OR has inappropriate value");
|
||||
}
|
||||
|
||||
// TODO: Add noConnectionToWaterSupply check
|
||||
|
||||
if (payload.objectAddress == null || payload.objectAddress.Length == 0)
|
||||
{
|
||||
throw new ArgumentException($"{nameof(payload.objectAddress)} is empty");
|
||||
}
|
||||
|
||||
// TODO: Add quality check
|
||||
// TODO: Add otherQualityIndicator check
|
||||
// TODO: Add temperatureChart check
|
||||
|
||||
if (payload.billingDate == null && (payload.counterparty is not SupplyResourceContractTypeOrganization ||
|
||||
payload.meteringDeviceInformation.HasValue))
|
||||
{
|
||||
throw new ArgumentException($"{nameof(payload.billingDate)} is null but {nameof(payload.meteringDeviceInformation)} has value");
|
||||
}
|
||||
|
||||
if (payload.billingDate != null && payload.oneTimePayment.HasValue && payload.oneTimePayment.Value)
|
||||
{
|
||||
throw new ArgumentException($"{nameof(payload.billingDate)} has value but {nameof(payload.oneTimePayment)} is true");
|
||||
}
|
||||
|
||||
if (payload.paymentDate == null && payload.counterparty is not SupplyResourceContractTypeOrganization &&
|
||||
payload.isContract && payload.oneTimePayment.HasValue && !payload.oneTimePayment.Value)
|
||||
{
|
||||
throw new ArgumentException($"{nameof(payload.paymentDate)} is null but should have value");
|
||||
}
|
||||
|
||||
if (payload.paymentDate != null && payload.oneTimePayment.HasValue && payload.oneTimePayment.Value)
|
||||
{
|
||||
throw new ArgumentException($"{nameof(payload.paymentDate)} has value but {nameof(payload.oneTimePayment)} is true");
|
||||
}
|
||||
|
||||
if (payload.providingInformationDate == null && payload.counterparty is SupplyResourceContractTypeOrganization &&
|
||||
payload.countingResource.HasValue && payload.countingResource.Value == SupplyResourceContractTypeCountingResource.R &&
|
||||
payload.isContract)
|
||||
{
|
||||
throw new ArgumentException($"{nameof(payload.providingInformationDate)} is null but should have value");
|
||||
}
|
||||
|
||||
if (!payload.meteringDeviceInformation.HasValue &&
|
||||
payload.countingResource.HasValue && payload.countingResource == SupplyResourceContractTypeCountingResource.R)
|
||||
{
|
||||
throw new ArgumentException($"{nameof(payload.meteringDeviceInformation)} is null but should have value");
|
||||
}
|
||||
|
||||
if (payload.volumeDepends.HasValue && (payload.counterparty is SupplyResourceContractTypeOrganization ||
|
||||
payload.oneTimePayment.HasValue && payload.oneTimePayment.Value))
|
||||
{
|
||||
throw new ArgumentException($"{nameof(payload.volumeDepends)} has value but should have not one");
|
||||
}
|
||||
|
||||
if (payload.oneTimePayment.HasValue && payload.counterparty is SupplyResourceContractTypeOrganization)
|
||||
{
|
||||
throw new ArgumentException($"{nameof(payload.oneTimePayment)} has value but {nameof(payload.counterparty)} has inappropriate value");
|
||||
}
|
||||
|
||||
// TODO: Add accrualProcedure check
|
||||
}
|
||||
|
||||
private SupplyResourceContractType GetContractFromPayload(ImportSupplyResourceContractDataPayload payload)
|
||||
{
|
||||
// http://open-gkh.ru/HouseManagement/SupplyResourceContractType.html
|
||||
var contract = new SupplyResourceContractType();
|
||||
|
||||
if (payload.isContract)
|
||||
{
|
||||
var isContract = new SupplyResourceContractTypeIsContract()
|
||||
{
|
||||
ContractNumber = payload.contractNumber,
|
||||
SigningDate = payload.signingDate,
|
||||
EffectiveDate = payload.effectiveDate
|
||||
};
|
||||
contract.Item = isContract;
|
||||
}
|
||||
else
|
||||
{
|
||||
var isNotContract = new SupplyResourceContractTypeIsNotContract()
|
||||
{
|
||||
ContractNumber = payload.contractNumber,
|
||||
SigningDate = payload.signingDate,
|
||||
SigningDateSpecified = true,
|
||||
EffectiveDate = payload.effectiveDate,
|
||||
EffectiveDateSpecified = true
|
||||
};
|
||||
contract.Item = isNotContract;
|
||||
}
|
||||
|
||||
var items = new List<object>();
|
||||
var itemsElementName = new List<ItemsChoiceType9>();
|
||||
if (payload.indefiniteTerm)
|
||||
{
|
||||
items.Add(payload.indefiniteTerm);
|
||||
itemsElementName.Add(ItemsChoiceType9.IndefiniteTerm);
|
||||
}
|
||||
if (payload.automaticRollOverOneYear)
|
||||
{
|
||||
items.Add(payload.automaticRollOverOneYear);
|
||||
itemsElementName.Add(ItemsChoiceType9.AutomaticRollOverOneYear);
|
||||
|
||||
items.Add(payload.comptetionDate.Value);
|
||||
itemsElementName.Add(ItemsChoiceType9.ComptetionDate);
|
||||
}
|
||||
if (items.Count > 0 && itemsElementName.Count > 0)
|
||||
{
|
||||
contract.Items = [.. items];
|
||||
contract.ItemsElementName = [.. itemsElementName];
|
||||
}
|
||||
|
||||
if (payload.period != null)
|
||||
{
|
||||
contract.Period = payload.period;
|
||||
}
|
||||
|
||||
if (payload.indicationsAnyDay)
|
||||
{
|
||||
contract.IndicationsAnyDay = true;
|
||||
contract.IndicationsAnyDaySpecified = true;
|
||||
}
|
||||
|
||||
if (payload.contractBase != null && payload.contractBase.Length > 0)
|
||||
{
|
||||
contract.ContractBase = payload.contractBase;
|
||||
}
|
||||
|
||||
contract.Item1 = payload.counterparty;
|
||||
contract.IsPlannedVolume = payload.isPlannedVolume;
|
||||
|
||||
if (payload.plannedVolumeType.HasValue)
|
||||
{
|
||||
contract.PlannedVolumeType = payload.plannedVolumeType.Value;
|
||||
contract.PlannedVolumeTypeSpecified = true;
|
||||
}
|
||||
|
||||
contract.ContractSubject = payload.contractSubject;
|
||||
|
||||
if (payload.countingResource.HasValue)
|
||||
{
|
||||
contract.CountingResource = payload.countingResource.Value;
|
||||
contract.CountingResourceSpecified = true;
|
||||
}
|
||||
|
||||
contract.SpecifyingQualityIndicators = payload.specifyingQualityIndicators;
|
||||
|
||||
if (payload.noConnectionToWaterSupply)
|
||||
{
|
||||
contract.NoConnectionToWaterSupply = true;
|
||||
contract.NoConnectionToWaterSupplySpecified = true;
|
||||
}
|
||||
|
||||
contract.ObjectAddress = payload.objectAddress;
|
||||
contract.Quality = payload.quality;
|
||||
contract.OtherQualityIndicator = payload.otherQualityIndicator;
|
||||
contract.TemperatureChart = payload.temperatureChart;
|
||||
contract.BillingDate = payload.billingDate;
|
||||
contract.PaymentDate = payload.paymentDate;
|
||||
contract.ProvidingInformationDate = payload.providingInformationDate;
|
||||
|
||||
if (payload.meteringDeviceInformation.HasValue)
|
||||
{
|
||||
contract.MeteringDeviceInformation = payload.meteringDeviceInformation.Value;
|
||||
contract.MeteringDeviceInformationSpecified = true;
|
||||
}
|
||||
|
||||
if (payload.volumeDepends.HasValue)
|
||||
{
|
||||
contract.VolumeDepends = payload.volumeDepends.Value;
|
||||
contract.VolumeDependsSpecified = true;
|
||||
}
|
||||
|
||||
if (payload.oneTimePayment.HasValue)
|
||||
{
|
||||
contract.OneTimePayment = payload.oneTimePayment.Value;
|
||||
contract.OneTimePaymentSpecified = true;
|
||||
}
|
||||
|
||||
if (payload.accrualProcedure.HasValue)
|
||||
{
|
||||
contract.AccrualProcedure = payload.accrualProcedure.Value;
|
||||
contract.AccrualProcedureSpecified = true;
|
||||
}
|
||||
|
||||
contract.Tariff = payload.tariff;
|
||||
contract.Norm = payload.norm;
|
||||
|
||||
return contract;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,301 @@
|
||||
using Hcs.Broker.Api.Payload.HouseManagement;
|
||||
using Hcs.Broker.Api.Request.Exception;
|
||||
using Hcs.Broker.Internal;
|
||||
using Hcs.Service.Async.HouseManagement;
|
||||
|
||||
namespace Hcs.Broker.Api.Request.HouseManagement
|
||||
{
|
||||
internal class ImportSupplyResourceContractProjectRequest(Client client) : HouseManagementRequestBase(client)
|
||||
{
|
||||
protected override bool CanBeRestarted => false;
|
||||
|
||||
internal async Task<getStateResultImportResultCommonResultImportSupplyResourceContractProject> ExecuteAsync(ImportSupplyResourceContractProjectPayload payload, CancellationToken token)
|
||||
{
|
||||
ThrowIfPayloadIncorrect(payload);
|
||||
|
||||
// http://open-gkh.ru/HouseManagement/importSupplyResourceContractProjectRequest/Contract.html
|
||||
var contract = new importSupplyResourceContractProjectRequestContract
|
||||
{
|
||||
TransportGUID = Guid.NewGuid().ToString(),
|
||||
Item1 = GetContractFromPayload(payload)
|
||||
};
|
||||
|
||||
// http://open-gkh.ru/HouseManagement/importSupplyResourceContractProjectRequest.html
|
||||
var request = new importSupplyResourceContractProjectRequest
|
||||
{
|
||||
Id = Constants.SIGNED_XML_ELEMENT_ID,
|
||||
version = "11.7.0.3",
|
||||
Contract = [contract]
|
||||
};
|
||||
|
||||
var result = await SendAndWaitResultAsync(request, async asyncClient =>
|
||||
{
|
||||
var response = await asyncClient.importSupplyResourceContractProjectDataAsync(CreateRequestHeader(), request);
|
||||
return response.AckRequest.Ack;
|
||||
}, token);
|
||||
|
||||
result.Items.OfType<ErrorMessageType>().ToList().ForEach(error =>
|
||||
{
|
||||
throw RemoteException.CreateNew(error.ErrorCode, error.Description);
|
||||
});
|
||||
|
||||
var importResults = result.Items.OfType<getStateResultImportResult>();
|
||||
var commonResults = GetCommonResults(importResults);
|
||||
foreach (var commonResult in commonResults)
|
||||
{
|
||||
if (commonResult.ItemElementName == ItemChoiceType26.ImportSupplyResourceContractProject)
|
||||
{
|
||||
if (commonResult.Item is getStateResultImportResultCommonResultImportSupplyResourceContractProject importedContract)
|
||||
{
|
||||
return importedContract;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
// TODO: Дополнить проверки
|
||||
private void ThrowIfPayloadIncorrect(ImportSupplyResourceContractProjectPayload payload)
|
||||
{
|
||||
if (string.IsNullOrEmpty(payload.contractNumber))
|
||||
{
|
||||
throw new ArgumentException($"{nameof(payload.contractNumber)} is empty");
|
||||
}
|
||||
|
||||
if (payload.signingDate.Equals(default) || payload.effectiveDate.Equals(default))
|
||||
{
|
||||
throw new ArgumentException($"{nameof(payload.signingDate)} OR/AND {nameof(payload.effectiveDate)} are default");
|
||||
}
|
||||
|
||||
if (!payload.comptetionDate.HasValue && payload.automaticRollOverOneYear)
|
||||
{
|
||||
throw new ArgumentException($"{nameof(payload.comptetionDate)} is null but {nameof(payload.automaticRollOverOneYear)} has value");
|
||||
}
|
||||
|
||||
if (payload.period == null && (payload.volumeDepends.HasValue && payload.volumeDepends.Value
|
||||
|| payload.meteringDeviceInformation.HasValue && payload.meteringDeviceInformation.Value))
|
||||
{
|
||||
throw new ArgumentException($"{nameof(payload.period)} is null but {nameof(payload.volumeDepends)} OR/AND {nameof(payload.meteringDeviceInformation)} have value");
|
||||
}
|
||||
|
||||
if (payload.indicationsAnyDay && payload.period == null)
|
||||
{
|
||||
throw new ArgumentException($"{nameof(payload.indicationsAnyDay)} has value but {nameof(payload.period)} is null");
|
||||
}
|
||||
|
||||
// TODO: Add counterparty check
|
||||
|
||||
if (payload.plannedVolumeType.HasValue && !payload.isPlannedVolume)
|
||||
{
|
||||
throw new ArgumentException($"{nameof(payload.plannedVolumeType)} has value but {nameof(payload.isPlannedVolume)} is false");
|
||||
}
|
||||
|
||||
if (payload.contractSubject == null || payload.contractSubject.Length == 0)
|
||||
{
|
||||
throw new ArgumentException($"{nameof(payload.contractSubject)} is empty");
|
||||
}
|
||||
|
||||
if (payload.contractSubject != null && payload.contractSubject.Length > 100)
|
||||
{
|
||||
throw new ArgumentException($"{nameof(payload.contractSubject)} exceeds its limit ({payload.contractSubject.Length} of 100)");
|
||||
}
|
||||
|
||||
if (payload.countingResource.HasValue && (!payload.accrualProcedure.HasValue ||
|
||||
payload.accrualProcedure.Value == SupplyResourceContractProjectTypeAccrualProcedure.O))
|
||||
{
|
||||
throw new ArgumentException($"{nameof(payload.countingResource)} has value but {nameof(payload.accrualProcedure)} is null OR has inappropriate value");
|
||||
}
|
||||
|
||||
// TODO: Add noConnectionToWaterSupply check
|
||||
// TODO: Add quality check
|
||||
// TODO: Add otherQualityIndicator check
|
||||
// TODO: Add temperatureChart check
|
||||
|
||||
if (payload.billingDate == null && (payload.counterparty is not SupplyResourceContractTypeOrganization ||
|
||||
payload.meteringDeviceInformation.HasValue))
|
||||
{
|
||||
throw new ArgumentException($"{nameof(payload.billingDate)} is null but {nameof(payload.meteringDeviceInformation)} has value");
|
||||
}
|
||||
|
||||
if (payload.billingDate != null && payload.oneTimePayment.HasValue && payload.oneTimePayment.Value)
|
||||
{
|
||||
throw new ArgumentException($"{nameof(payload.billingDate)} has value but {nameof(payload.oneTimePayment)} is true");
|
||||
}
|
||||
|
||||
if (payload.paymentDate == null && payload.counterparty is not SupplyResourceContractTypeOrganization &&
|
||||
payload.isContract && payload.oneTimePayment.HasValue && !payload.oneTimePayment.Value)
|
||||
{
|
||||
throw new ArgumentException($"{nameof(payload.paymentDate)} is null but should have value");
|
||||
}
|
||||
|
||||
if (payload.paymentDate != null && payload.oneTimePayment.HasValue && payload.oneTimePayment.Value)
|
||||
{
|
||||
throw new ArgumentException($"{nameof(payload.paymentDate)} has value but {nameof(payload.oneTimePayment)} is true");
|
||||
}
|
||||
|
||||
if (payload.providingInformationDate == null && payload.counterparty is SupplyResourceContractTypeOrganization &&
|
||||
payload.countingResource.HasValue && payload.countingResource.Value == SupplyResourceContractProjectTypeCountingResource.R &&
|
||||
payload.isContract)
|
||||
{
|
||||
throw new ArgumentException($"{nameof(payload.providingInformationDate)} is null but should have value");
|
||||
}
|
||||
|
||||
if (!payload.meteringDeviceInformation.HasValue &&
|
||||
payload.countingResource.HasValue && payload.countingResource == SupplyResourceContractProjectTypeCountingResource.R)
|
||||
{
|
||||
throw new ArgumentException($"{nameof(payload.meteringDeviceInformation)} is null but should have value");
|
||||
}
|
||||
|
||||
if (payload.volumeDepends.HasValue && (payload.counterparty is SupplyResourceContractTypeOrganization ||
|
||||
payload.oneTimePayment.HasValue && payload.oneTimePayment.Value))
|
||||
{
|
||||
throw new ArgumentException($"{nameof(payload.volumeDepends)} has value but should have not one");
|
||||
}
|
||||
|
||||
if (payload.oneTimePayment.HasValue && payload.counterparty is SupplyResourceContractTypeOrganization)
|
||||
{
|
||||
throw new ArgumentException($"{nameof(payload.oneTimePayment)} has value but {nameof(payload.counterparty)} has inappropriate value");
|
||||
}
|
||||
|
||||
// TODO: Add accrualProcedure check
|
||||
}
|
||||
|
||||
private SupplyResourceContractProjectType GetContractFromPayload(ImportSupplyResourceContractProjectPayload payload)
|
||||
{
|
||||
// http://open-gkh.ru/HouseManagement/SupplyResourceContractProjectType.html
|
||||
var contract = new SupplyResourceContractProjectType();
|
||||
|
||||
if (payload.isContract)
|
||||
{
|
||||
var isContract = new SupplyResourceContractProjectTypeIsContract()
|
||||
{
|
||||
ContractNumber = payload.contractNumber,
|
||||
SigningDate = payload.signingDate,
|
||||
EffectiveDate = payload.effectiveDate
|
||||
};
|
||||
contract.Item = isContract;
|
||||
}
|
||||
else
|
||||
{
|
||||
var isNotContract = new SupplyResourceContractProjectTypeIsNotContract()
|
||||
{
|
||||
ContractNumber = payload.contractNumber,
|
||||
SigningDate = payload.signingDate,
|
||||
SigningDateSpecified = true,
|
||||
EffectiveDate = payload.effectiveDate,
|
||||
EffectiveDateSpecified = true
|
||||
};
|
||||
contract.Item = isNotContract;
|
||||
}
|
||||
|
||||
var items = new List<object>();
|
||||
var itemsElementName = new List<ItemsChoiceType14>();
|
||||
if (payload.indefiniteTerm)
|
||||
{
|
||||
items.Add(payload.indefiniteTerm);
|
||||
itemsElementName.Add(ItemsChoiceType14.IndefiniteTerm);
|
||||
}
|
||||
if (payload.automaticRollOverOneYear)
|
||||
{
|
||||
items.Add(payload.automaticRollOverOneYear);
|
||||
itemsElementName.Add(ItemsChoiceType14.AutomaticRollOverOneYear);
|
||||
|
||||
items.Add(payload.comptetionDate.Value);
|
||||
itemsElementName.Add(ItemsChoiceType14.ComptetionDate);
|
||||
}
|
||||
if (items.Count > 0 && itemsElementName.Count > 0)
|
||||
{
|
||||
contract.Items = [.. items];
|
||||
contract.ItemsElementName = [.. itemsElementName];
|
||||
}
|
||||
|
||||
if (payload.period != null)
|
||||
{
|
||||
contract.Period = payload.period;
|
||||
}
|
||||
|
||||
if (payload.indicationsAnyDay)
|
||||
{
|
||||
contract.IndicationsAnyDay = true;
|
||||
contract.IndicationsAnyDaySpecified = true;
|
||||
}
|
||||
|
||||
if (payload.contractBase != null && payload.contractBase.Length > 0)
|
||||
{
|
||||
contract.ContractBase = payload.contractBase;
|
||||
}
|
||||
|
||||
contract.Item1 = payload.counterparty;
|
||||
contract.IsPlannedVolume = payload.isPlannedVolume;
|
||||
|
||||
if (payload.plannedVolumeType.HasValue)
|
||||
{
|
||||
contract.PlannedVolumeType = payload.plannedVolumeType.Value;
|
||||
contract.PlannedVolumeTypeSpecified = true;
|
||||
}
|
||||
|
||||
contract.ContractSubject = payload.contractSubject;
|
||||
|
||||
if (payload.countingResource.HasValue)
|
||||
{
|
||||
contract.CountingResource = payload.countingResource.Value;
|
||||
contract.CountingResourceSpecified = true;
|
||||
}
|
||||
|
||||
contract.SpecifyingQualityIndicators = payload.specifyingQualityIndicators;
|
||||
|
||||
if (payload.noConnectionToWaterSupply)
|
||||
{
|
||||
contract.NoConnectionToWaterSupply = true;
|
||||
contract.NoConnectionToWaterSupplySpecified = true;
|
||||
}
|
||||
|
||||
contract.Quality = payload.quality;
|
||||
contract.OtherQualityIndicator = payload.otherQualityIndicator;
|
||||
contract.TemperatureChart = payload.temperatureChart;
|
||||
contract.BillingDate = payload.billingDate;
|
||||
contract.PaymentDate = payload.paymentDate;
|
||||
contract.ProvidingInformationDate = payload.providingInformationDate;
|
||||
|
||||
if (payload.meteringDeviceInformation.HasValue)
|
||||
{
|
||||
contract.MeteringDeviceInformation = payload.meteringDeviceInformation.Value;
|
||||
contract.MeteringDeviceInformationSpecified = true;
|
||||
}
|
||||
|
||||
if (payload.volumeDepends.HasValue)
|
||||
{
|
||||
contract.VolumeDepends = payload.volumeDepends.Value;
|
||||
contract.VolumeDependsSpecified = true;
|
||||
}
|
||||
|
||||
if (payload.oneTimePayment.HasValue)
|
||||
{
|
||||
contract.OneTimePayment = payload.oneTimePayment.Value;
|
||||
contract.OneTimePaymentSpecified = true;
|
||||
}
|
||||
|
||||
if (payload.accrualProcedure.HasValue)
|
||||
{
|
||||
contract.AccrualProcedure = payload.accrualProcedure.Value;
|
||||
contract.AccrualProcedureSpecified = true;
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(payload.regionCodeFias))
|
||||
{
|
||||
contract.RegionalSettings = new SupplyResourceContractProjectTypeRegionalSettings()
|
||||
{
|
||||
Region = new RegionType()
|
||||
{
|
||||
code = payload.regionCodeFias
|
||||
},
|
||||
Tariff = payload.tariff,
|
||||
Norm = payload.norm
|
||||
};
|
||||
}
|
||||
|
||||
return contract;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user