diff --git a/Hcs.Client/Client/Api/HouseManagementApi.cs b/Hcs.Client/Client/Api/HouseManagementApi.cs
index 15e5e10..0fcc45d 100644
--- a/Hcs.Client/Client/Api/HouseManagementApi.cs
+++ b/Hcs.Client/Client/Api/HouseManagementApi.cs
@@ -1,4 +1,5 @@
-using Hcs.Client.Api.Request.HouseManagement;
+using Hcs.Client.Api.Payload.HouseManagement;
+using Hcs.Client.Api.Request.HouseManagement;
using Hcs.Service.Async.HouseManagement;
using System;
using System.Collections.Generic;
@@ -56,5 +57,18 @@ namespace Hcs.Client.Api
var request = new ExportSupplyResourceContractObjectAddressDataRequest(client);
return await request.ExecuteAsync(contractRootGuid, token);
}
+
+
+ ///
+ /// Импорт договора ресурсоснабжения с РСО
+ ///
+ /// Пейлоад договора ресурсоснабжения
+ /// Токен отмены
+ /// Импортированный договор
+ public async Task ImportSupplyResourceContractDataAsync(ImportSupplyResourceContractDataPayload payload, CancellationToken token = default)
+ {
+ var request = new ImportSupplyResourceContractDataRequest(client);
+ return await request.ExecuteAsync(payload, token);
+ }
}
}
diff --git a/Hcs.Client/Client/Api/Payload/HouseManagement/ImportSupplyResourceContractDataPayload.cs b/Hcs.Client/Client/Api/Payload/HouseManagement/ImportSupplyResourceContractDataPayload.cs
new file mode 100644
index 0000000..aefb1e1
--- /dev/null
+++ b/Hcs.Client/Client/Api/Payload/HouseManagement/ImportSupplyResourceContractDataPayload.cs
@@ -0,0 +1,212 @@
+using Hcs.Service.Async.HouseManagement;
+using System;
+
+namespace Hcs.Client.Api.Payload.HouseManagement
+{
+ // http://open-gkh.ru/HouseManagement/SupplyResourceContractType.html
+ public class ImportSupplyResourceContractDataPayload
+ {
+ ///
+ /// Если договор не является публичным и/или присутствует заключенный на бумажном носителе
+ /// (электронной форме) и/или не заключен в отношении нежилых помещений в многоквартирных домах,
+ /// то равно true, иначе - false
+ ///
+ public bool isContract;
+
+ ///
+ /// Номер договора
+ ///
+ public string contractNumber;
+
+ ///
+ /// Дата заключения
+ ///
+ public DateTime signingDate;
+
+ ///
+ /// Дата вступления в силу
+ ///
+ public DateTime effectiveDate;
+
+ ///
+ /// Необязательное. По умолчанию = true. Договор заключен на неопределенный срок или нет
+ ///
+ public bool? indefiniteTerm;
+
+ ///
+ /// Необязательное. По умолчанию = true. Автоматически пролонгировать договор на один год при наступлении
+ /// даты окончания действия или нет.
+ ///
+ public bool? automaticRollOverOneYear;
+
+ ///
+ /// Условное. Дата окончания действия. Обязательно для заполнения, если
+ /// = true.
+ ///
+ public DateTime? comptetionDate;
+
+ ///
+ /// Условное. Период передачи текущих показаний по индивидуальным приборам учета. Обязателен для
+ /// заполнения, если поле = true ИЛИ если поле
+ /// = true.
+ ///
+ public SupplyResourceContractTypePeriod period;
+
+ ///
+ /// Необязательное. По умолчанию = true. Показывает, разрешена ли гражданам передача текущих показаний по
+ /// индивидуальным приборам учета в любой день месяца. Заполнение возможно только если: в настройках
+ /// организации установлена настройка "Разрешить передачу гражданам показаний индивидуальных или общих
+ /// (квартирных) приборов учета в любой день месяца" ИЛИ в настройках организации установлена настройка
+ /// "Разрешить передачу гражданам показаний индивидуальных или общих (квартирных) приборов учета только
+ /// в сроки, установленные в договоре, или в любой день месяца, если в договоре установлен признак
+ /// "Разрешить передачу показаний приборов учета в любой день месяца" И заполнен .
+ ///
+ public bool? indicationsAnyDay;
+
+ ///
+ /// Необязательное. Ссылка на НСИ "Основание заключения договора" (реестровый номер 58). Значения
+ /// брать из .
+ ///
+ public nsiRef[] contractBase;
+
+ ///
+ /// Контрагент. По умолчанию = true. Подходящие типы:
+ /// ,
+ /// ,
+ /// ,
+ /// ,
+ /// либо true, если это договор оферты.
+ ///
+ public object counterparty = true;
+
+ ///
+ /// Если в договоре в наличии плановый объем и режим подачи поставки ресурсов то true, иначе - false
+ ///
+ public bool isPlannedVolume;
+
+ ///
+ /// Необязательное. Тип ведения планового объема и режима подачи: D - в разрезе договора,
+ /// O - в разрезе объектов жилищного фонда. Заполняется при наличии в договоре планового объема и
+ /// режима поставки ресурсов.
+ ///
+ public SupplyResourceContractTypePlannedVolumeType? plannedVolumeType;
+
+ ///
+ /// Предмет договора. Максимум 100 записей.
+ ///
+ public SupplyResourceContractTypeContractSubject[] contractSubject;
+
+ ///
+ /// Условное. Размещение информации о начислениях за коммунальные услуги осуществляет: R(SO)- РСО,
+ /// P(roprietor) - исполнитель коммунальных услуг. Заполняется, если порядок размещения информации
+ /// о начислениях за коммунальные услуги ведется в разрезе договора.
+ ///
+ public SupplyResourceContractTypeCountingResource? countingResource;
+
+ ///
+ /// Показатели качества коммунальных ресурсов и температурный график ведутся: D - в разрезе договора,
+ /// O - в разрезе объектов жилищного фонда
+ ///
+ public SupplyResourceContractTypeSpecifyingQualityIndicators specifyingQualityIndicators;
+
+ ///
+ /// Необязательное. По умолчанию = true. Признак "Отсутствие присоединения сетей объектов жилищного
+ /// фонда к централизованной системе водоснабжения". Может быть указан, только если показатели качества
+ /// коммунальных ресурсов ведутся в разрезе договора и предмет договора включает коммунальную услугу
+ /// "Холодное водоснабжение" И/ИЛИ "Горячее водоснабжение"/
+ ///
+ public bool? noConnectionToWaterSupply;
+
+ ///
+ /// Условное. Данные об объекте жилищного фонда. При импорте договора должен быть добавлен как минимум
+ /// один адрес объекта жилищного фонда.
+ ///
+ public SupplyResourceContractTypeObjectAddress[] objectAddress;
+
+ ///
+ /// Необязательное. Показатель качества (содержащийся в справочнике показателей качества). Если
+ /// показатели указываются в разрезе договора, то ссылка на ОЖФ не заполняется. Если показатели
+ /// указываются в разрезе ОЖФ, то ссылка на ОЖФ обязательна.
+ ///
+ public SupplyResourceContractTypeQuality[] quality;
+
+ ///
+ /// Необязательное. Иной показатель качества коммунального ресурса (не содержащийся в справочнике
+ /// показателей качества). Если показатели указываются в разрезе договора, то ссылка на ОЖФ
+ /// не заполняется. Если показатели указываются в разрезе ОЖФ, то ссылка на ОЖФ обязательна.
+ ///
+ public SupplyResourceContractTypeOtherQualityIndicator[] otherQualityIndicator;
+
+ ///
+ /// Необязательное. Информация о температурном графике. Если показатели качества указываются в разрезе
+ /// договора, то ссылка на ОЖФ в данном элементе не заполняется и элемент может заполняться только если
+ /// в предмете договора хотя бы раз встречается ресурс "Тепловая энергия". Если показатели качества
+ /// указываются в разрезе ОЖФ, то ссылка на ОЖФ обязательна и элемент заполняется только если
+ /// в рамках ОЖФ встречается ресурс "Тепловая энергия".
+ ///
+ public SupplyResourceContractTypeTemperatureChart[] temperatureChart;
+
+ ///
+ /// Условное. Срок представления (выставления) платежных документов, не позднее. Является
+ /// обязательным, если вторая сторона договора отличается от "Управляющая организация" ИЛИ если
+ /// заполнено поле . Не заполняется, если
+ /// = true.
+ ///
+ public SupplyResourceContractTypeBillingDate billingDate;
+
+ ///
+ /// Условное. Срок внесения платы, не позднее. Является обязательным, если вторая сторона договора
+ /// отличается от "Управляющая организация" И договор не является публичным И/ИЛИ присутствует
+ /// заключенный на бумажном носителе или в электронной форме И в поле
+ /// = false. Не заполняется, если = true.
+ ///
+ public SupplyResourceContractTypePaymentDate paymentDate;
+
+ ///
+ /// Условное. Срок предоставления информации о поступивших платежах, не позднее. Является
+ /// обязательным, если второй стороной договора является "Управляющая организация",
+ /// "Размещение информации о начислениях за коммунальные услуги осуществляет" = "РСО" И
+ /// договор не является публичным и/или присутствует заключенный на бумажном носителе или в
+ /// электронной форме.
+ ///
+ public SupplyResourceContractTypeProvidingInformationDate providingInformationDate;
+
+ ///
+ /// Условное. Указывает на то, что размещение информации об индивидуальных приборах учета и их
+ /// показаниях осуществляет ресурсоснабжающая организация или нет. Обязательно для заполнения,
+ /// если в указано "РСО". В остальных случаях не заполняется.
+ ///
+ public bool? meteringDeviceInformation;
+
+ ///
+ /// Необязательное. Указывает на то, что объем поставки ресурса(ов) определяется на основании прибора
+ /// учета или нет. Поле не заполняется, если вторая сторона договора "Управляющая организация"
+ /// ИЛИ поле = true.
+ ///
+ public bool? volumeDepends;
+
+ ///
+ /// Необязательное. Указывает на то, что оплата предоставленных услуг осуществляется ли единоразово
+ /// при отгрузке указанных ресурсов без заведения лицевых счетов для потребителей. Доступно
+ /// для заполнения, только если вторая сторона договора отлична от "Управляющая организация".
+ ///
+ public bool? oneTimePayment;
+
+ ///
+ /// Необязательное. Порядок размещения информации о начислениях за коммунальные услуги ведется: D - в
+ /// разрезе договора, O - в разрезе объектов жилищного фонда. Заполняется, если второй стороной договора
+ /// является исполнитель коммунальных услуг.
+ ///
+ public SupplyResourceContractTypeAccrualProcedure? accrualProcedure;
+
+ ///
+ /// Необязательное. Информация о применяемом тарифе.
+ ///
+ public SupplyResourceContractTypeTariff[] tariff;
+
+ ///
+ /// Необязательное. Информация о нормативе потребления коммунальной услуги.
+ ///
+ public SupplyResourceContractTypeNorm[] norm;
+ }
+}
diff --git a/Hcs.Client/Client/Api/Registry/Registry239.cs b/Hcs.Client/Client/Api/Registry/Registry239.cs
new file mode 100644
index 0000000..0b01940
--- /dev/null
+++ b/Hcs.Client/Client/Api/Registry/Registry239.cs
@@ -0,0 +1,20 @@
+using Hcs.Service.Async.HouseManagement;
+
+namespace Hcs.Client.Api.Registry
+{
+ ///
+ /// НСИ "Тарифицируемый ресурс" (реестровый номер 239)
+ /// Взято из https://dom.gosuslugi.ru/opendataapi/nsi-239/v1.
+ ///
+ public static class Registry239
+ {
+ ///
+ /// Тепловая энергия
+ ///
+ public static ContractSubjectTypeMunicipalResource Element4 => new()
+ {
+ Code = "4",
+ GUID = "eec6e4b8-76c8-4fce-99b7-c95718edad19"
+ };
+ }
+}
diff --git a/Hcs.Client/Client/Api/Registry/Registry276.cs b/Hcs.Client/Client/Api/Registry/Registry276.cs
new file mode 100644
index 0000000..769bda0
--- /dev/null
+++ b/Hcs.Client/Client/Api/Registry/Registry276.cs
@@ -0,0 +1,29 @@
+using Hcs.Service.Async.HouseManagement;
+
+namespace Hcs.Client.Api.Registry
+{
+ ///
+ /// НСИ "Показатели качества коммунальных ресурсов" (реестровый номер 276)
+ /// Взято из https://dom.gosuslugi.ru/opendataapi/nsi-276/v1.
+ ///
+ public static class Registry276
+ {
+ ///
+ /// Величина тепловой нагрузки
+ ///
+ public static nsiRef Element4 => new()
+ {
+ Code = "4",
+ GUID = "f5624700-3c3f-460f-8313-8fcae00d261c"
+ };
+
+ ///
+ /// Диапазон давления теплоносителя в подающем трубопроводе
+ ///
+ public static nsiRef Element10 => new()
+ {
+ Code = "10",
+ GUID = "88443e22-867c-4420-9945-f8c8bc6e7f08"
+ };
+ }
+}
diff --git a/Hcs.Client/Client/Api/Registry/Registry3.cs b/Hcs.Client/Client/Api/Registry/Registry3.cs
new file mode 100644
index 0000000..1d3551d
--- /dev/null
+++ b/Hcs.Client/Client/Api/Registry/Registry3.cs
@@ -0,0 +1,20 @@
+using Hcs.Service.Async.HouseManagement;
+
+namespace Hcs.Client.Api.Registry
+{
+ ///
+ /// НСИ "Вид коммунальной услуги" (реестровый номер 3)
+ /// Взято из https://dom.gosuslugi.ru/opendataapi/nsi-3/v1.
+ ///
+ public static class Registry3
+ {
+ ///
+ /// Отопление
+ ///
+ public static ContractSubjectTypeServiceType Element6 => new()
+ {
+ Code = "6",
+ GUID = "74925764-ddf3-4b4b-b18d-85994187c13a"
+ };
+ }
+}
diff --git a/Hcs.Client/Client/Api/Registry/Registry58.cs b/Hcs.Client/Client/Api/Registry/Registry58.cs
new file mode 100644
index 0000000..bab4056
--- /dev/null
+++ b/Hcs.Client/Client/Api/Registry/Registry58.cs
@@ -0,0 +1,101 @@
+using Hcs.Service.Async.HouseManagement;
+
+namespace Hcs.Client.Api.Registry
+{
+ ///
+ /// НСИ "Основание заключения договора" (реестровый номер 58).
+ /// Взято из https://dom.gosuslugi.ru/opendataapi/nsi-58/v1.
+ ///
+ public static class Registry58
+ {
+ ///
+ /// Решение собрания собственников
+ ///
+ public static nsiRef Element1 => new()
+ {
+ Code = "1",
+ GUID = "110d48b2-32a9-4a44-939c-b784d9794621"
+ };
+
+ ///
+ /// Открытый конкурс
+ ///
+ public static nsiRef Element2 => new()
+ {
+ Code = "2",
+ GUID = "a9dc59c3-d53f-42eb-ba98-cf8c74d88d36"
+ };
+
+ ///
+ /// Договор управления
+ ///
+ public static nsiRef Element3 => new()
+ {
+ Code = "3",
+ GUID = "11efe618-79f8-4f53-bfd6-11620e8e9e1e"
+ };
+
+ ///
+ /// Устав
+ ///
+ public static nsiRef Element4 => new()
+ {
+ Code = "4",
+ GUID = "a2eb920c-8163-4958-812a-ad153a5dfde6"
+ };
+
+ ///
+ /// Решение правления
+ ///
+ public static nsiRef Element5 => new()
+ {
+ Code = "5",
+ GUID = "58639715-2708-4b8e-a5e6-7cae4ddbf03b"
+ };
+
+ ///
+ /// Решение органа управления застройщика
+ ///
+ public static nsiRef Element6 => new()
+ {
+ Code = "6",
+ GUID = "9b606ef5-7701-4a12-a837-d81b50939160"
+ };
+
+ ///
+ /// Заявление потребителя
+ ///
+ public static nsiRef Element7 => new()
+ {
+ Code = "7",
+ GUID = "93cd9d85-91b8-4bf9-ae48-c5f1e691949f"
+ };
+
+ ///
+ /// Нормативный правовой акт
+ ///
+ public static nsiRef Element8 => new()
+ {
+ Code = "8",
+ GUID = "8b8ee37b-fa79-40cc-b98d-0e51f0c38d03"
+ };
+
+ ///
+ /// Разрешение на ввод в эксплуатацию
+ ///
+ public static nsiRef Element9 => new()
+ {
+ Code = "9",
+ GUID = "16331000-d96e-4a33-a6c7-3cb9eacf4927"
+ };
+
+ ///
+ /// Устав
+ ///
+ public static nsiRef Element10 => new()
+ {
+ Code = "10",
+ GUID = "555638ae-a207-46fa-99bd-88bdb297c45a"
+ };
+ }
+}
diff --git a/Hcs.Client/Client/Api/Request/HouseManagement/ImportSupplyResourceContractDataRequest.cs b/Hcs.Client/Client/Api/Request/HouseManagement/ImportSupplyResourceContractDataRequest.cs
new file mode 100644
index 0000000..e1f1e4b
--- /dev/null
+++ b/Hcs.Client/Client/Api/Request/HouseManagement/ImportSupplyResourceContractDataRequest.cs
@@ -0,0 +1,214 @@
+using Hcs.Client.Api.Payload.HouseManagement;
+using Hcs.Client.Api.Request.Exception;
+using Hcs.Client.Internal;
+using Hcs.Service.Async.HouseManagement;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Hcs.Client.Api.Request.HouseManagement
+{
+ internal class ImportSupplyResourceContractDataRequest(ClientBase client) : HouseManagementRequestBase(client)
+ {
+ protected override bool CanBeRestarted => false;
+
+ internal async Task ExecuteAsync(ImportSupplyResourceContractDataPayload payload, CancellationToken token)
+ {
+ 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().ToList().ForEach(error =>
+ {
+ throw RemoteException.CreateNew(error.ErrorCode, error.Description);
+ });
+
+ var importResults = result.Items.OfType();
+ 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 SupplyResourceContractType GetContractFromPayload(ImportSupplyResourceContractDataPayload payload)
+ {
+ 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,
+ EffectiveDate = payload.effectiveDate
+ };
+ contract.Item = isNotContract;
+ }
+
+ var items = new List