diff --git a/Hcs.Client/Client/Api/HouseManagementApi.cs b/Hcs.Client/Client/Api/HouseManagementApi.cs index 0fcc45d..5ef1245 100644 --- a/Hcs.Client/Client/Api/HouseManagementApi.cs +++ b/Hcs.Client/Client/Api/HouseManagementApi.cs @@ -59,6 +59,19 @@ namespace Hcs.Client.Api } + /// + /// Импорт новости для информирования граждан + /// + /// Пейлоад новости + /// Токен отмены + /// true, если операция выполнена успешно, иначе - false + public async Task ImportNotificationDataAsync(ImportNotificationDataPayload payload, CancellationToken token = default) + { + var request = new ImportNotificationDataRequest(client); + return await request.ExecuteAsync(payload, token); + } + + /// /// Импорт договора ресурсоснабжения с РСО /// diff --git a/Hcs.Client/Client/Api/Payload/HouseManagement/ImportNotificationDataPayload.cs b/Hcs.Client/Client/Api/Payload/HouseManagement/ImportNotificationDataPayload.cs new file mode 100644 index 0000000..2963143 --- /dev/null +++ b/Hcs.Client/Client/Api/Payload/HouseManagement/ImportNotificationDataPayload.cs @@ -0,0 +1,75 @@ +using Hcs.Service.Async.HouseManagement; +using System; +using System.Collections.Generic; + +namespace Hcs.Client.Api.Payload.HouseManagement +{ + // http://open-gkh.ru/HouseManagement/importNotificationRequest/notification/Create.html + public class ImportNotificationDataPayload + { + /// + /// Выборочное. Строковое представление темы, вместо ссылки на справочник. Максимальная длина + /// текста равно 200 символам. + /// + public string topic; + + /// + /// Выборочное. Тема из справочника 364, заместо строкового представления темы. + /// + public nsiRef topicFromRegistry; + + /// + /// Необязательное. Показывает высокую важность новости. + /// + public bool isImportant; + + /// + /// Необязательное. Текст новости с максимальной длиной в 5000 символов. + /// + public string content; + + /// + /// Адресаты. Подходящие типы для значения: + /// , если это глобальный уникальный идентификатор дома по ФИАС, + /// , + /// либо true, если все дома. + /// + public List> destinations; + + /// + /// Выборочное. Если true, то новость всегда актуальна. Иначе период актуальности берется из + /// и . + /// + public bool isNotLimit; + + /// + /// Условное. Период актуальности "С". Обязательно задается в случае = false. + /// + public DateTime? startDate; + + /// + /// Условное. Период актуальности "ДО". Обязательно задается в случае = false. + /// + public DateTime? endDate; + + /// + /// Необязательное. Документы новостей. + /// + public AttachmentType[] attachment; + + /// + /// Необязательное. Если true, то новость отправляется адресатам. + /// + public bool isShipOff; + + /// + /// Необязательное. Признак "Для публикации в мобильном приложении". + /// + public bool isForPublishToMobileApp; + + /// + /// Необязательное. Информация для новости, публикуемой в мобильном приложении. + /// + public importNotificationRequestNotificationCreateMobileAppData mobileAppData; + } +} diff --git a/Hcs.Client/Client/Api/Payload/HouseManagement/ImportSupplyResourceContractDataPayload.cs b/Hcs.Client/Client/Api/Payload/HouseManagement/ImportSupplyResourceContractDataPayload.cs index b023e5b..986a842 100644 --- a/Hcs.Client/Client/Api/Payload/HouseManagement/ImportSupplyResourceContractDataPayload.cs +++ b/Hcs.Client/Client/Api/Payload/HouseManagement/ImportSupplyResourceContractDataPayload.cs @@ -29,12 +29,12 @@ namespace Hcs.Client.Api.Payload.HouseManagement public DateTime effectiveDate; /// - /// Необязательное. По умолчанию = true. Договор заключен на неопределенный срок или нет + /// Необязательное. Договор заключен на неопределенный срок или нет /// public bool? indefiniteTerm; /// - /// Необязательное. По умолчанию = true. Автоматически пролонгировать договор на один год при наступлении + /// Необязательное. Автоматически пролонгировать договор на один год при наступлении /// даты окончания действия или нет. /// public bool? automaticRollOverOneYear; @@ -53,7 +53,7 @@ namespace Hcs.Client.Api.Payload.HouseManagement public SupplyResourceContractTypePeriod period; /// - /// Необязательное. По умолчанию = true. Показывает, разрешена ли гражданам передача текущих показаний по + /// Необязательное. Показывает, разрешена ли гражданам передача текущих показаний по /// индивидуальным приборам учета в любой день месяца. Заполнение возможно только если: в настройках /// организации установлена настройка "Разрешить передачу гражданам показаний индивидуальных или общих /// (квартирных) приборов учета в любой день месяца" ИЛИ в настройках организации установлена настройка @@ -70,14 +70,14 @@ namespace Hcs.Client.Api.Payload.HouseManagement public nsiRef[] contractBase; /// - /// Контрагент. По умолчанию = true. Подходящие типы: + /// Контрагент. Подходящие типы: /// , /// , /// , /// , /// либо true, если это договор оферты. /// - public object counterparty = true; + public object counterparty; /// /// Если в договоре в наличии плановый объем и режим подачи поставки ресурсов то true, иначе - false @@ -110,10 +110,10 @@ namespace Hcs.Client.Api.Payload.HouseManagement public SupplyResourceContractTypeSpecifyingQualityIndicators specifyingQualityIndicators; /// - /// Необязательное. По умолчанию = true. Признак "Отсутствие присоединения сетей объектов жилищного - /// фонда к централизованной системе водоснабжения". Может быть указан, только если показатели качества - /// коммунальных ресурсов ведутся в разрезе договора и предмет договора включает коммунальную услугу - /// "Холодное водоснабжение" И/ИЛИ "Горячее водоснабжение"/ + /// Необязательное. Признак "Отсутствие присоединения сетей объектов жилищного фонда к централизованной + /// системе водоснабжения". Может быть указан, только если показатели качества коммунальных ресурсов + /// ведутся в разрезе договора и предмет договора включает коммунальную услугу "Холодное водоснабжение" + /// И/ИЛИ "Горячее водоснабжение"/ /// public bool? noConnectionToWaterSupply; diff --git a/Hcs.Client/Client/Api/Request/HouseManagement/ImportNotificationDataRequest.cs b/Hcs.Client/Client/Api/Request/HouseManagement/ImportNotificationDataRequest.cs new file mode 100644 index 0000000..95057f8 --- /dev/null +++ b/Hcs.Client/Client/Api/Request/HouseManagement/ImportNotificationDataRequest.cs @@ -0,0 +1,110 @@ +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 ImportNotificationDataRequest(ClientBase client) : HouseManagementRequestBase(client) + { + protected override bool CanBeRestarted => false; + + internal async Task 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().ToList().ForEach(error => + { + throw RemoteException.CreateNew(error.ErrorCode, error.Description); + }); + + 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(); + var itemsElementName = new List(); + 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; + } + } +} diff --git a/Hcs.Client/Client/Api/Request/HouseManagement/ImportSupplyResourceContractDataRequest.cs b/Hcs.Client/Client/Api/Request/HouseManagement/ImportSupplyResourceContractDataRequest.cs index 0d7e6a5..96ea5a4 100644 --- a/Hcs.Client/Client/Api/Request/HouseManagement/ImportSupplyResourceContractDataRequest.cs +++ b/Hcs.Client/Client/Api/Request/HouseManagement/ImportSupplyResourceContractDataRequest.cs @@ -18,6 +18,7 @@ namespace Hcs.Client.Api.Request.HouseManagement { ThrowIfPayloadIncorrect(payload); + // http://open-gkh.ru/HouseManagement/SupplyResourceContractType.html var contract = new importSupplyResourceContractRequestContract { TransportGUID = Guid.NewGuid().ToString(), @@ -172,6 +173,7 @@ namespace Hcs.Client.Api.Request.HouseManagement private SupplyResourceContractType GetContractFromPayload(ImportSupplyResourceContractDataPayload payload) { + // http://open-gkh.ru/HouseManagement/SupplyResourceContractType.html var contract = new SupplyResourceContractType(); if (payload.isContract) diff --git a/Hcs.Client/Hcs.Client.csproj b/Hcs.Client/Hcs.Client.csproj index a2993c0..522967c 100644 --- a/Hcs.Client/Hcs.Client.csproj +++ b/Hcs.Client/Hcs.Client.csproj @@ -69,6 +69,7 @@ + @@ -89,6 +90,7 @@ + diff --git a/Hcs.TestApp/TestApp/Program.cs b/Hcs.TestApp/TestApp/Program.cs index 141da29..494965b 100644 --- a/Hcs.TestApp/TestApp/Program.cs +++ b/Hcs.TestApp/TestApp/Program.cs @@ -48,6 +48,8 @@ namespace Hcs.TestApp //houseManagementScenario.ExportSupplyResourceContractObjectAddressData(); + //houseManagementScenario.ImportNotificationData(); + //houseManagementScenario.ImportSupplyResourceContractData(); //nsiScenario.ExportDataProviderNsiItem1(); diff --git a/Hcs.TestApp/TestApp/Scenario/HouseManagementScenario.cs b/Hcs.TestApp/TestApp/Scenario/HouseManagementScenario.cs index 7ca6744..2aa4e71 100644 --- a/Hcs.TestApp/TestApp/Scenario/HouseManagementScenario.cs +++ b/Hcs.TestApp/TestApp/Scenario/HouseManagementScenario.cs @@ -3,6 +3,7 @@ using Hcs.Client.Api.Payload.HouseManagement; using Hcs.Client.Api.Registry; using Hcs.Service.Async.HouseManagement; using System; +using System.Collections.Generic; namespace Hcs.TestApp.Scenario { @@ -42,7 +43,6 @@ namespace Hcs.TestApp.Scenario var objectAddressGuid = Guid.NewGuid().ToString(); var contractSubjectGuid = Guid.NewGuid().ToString(); - var normGuid = Guid.NewGuid().ToString(); var payload = new ImportSupplyResourceContractDataPayload() { @@ -50,10 +50,6 @@ namespace Hcs.TestApp.Scenario contractNumber = "239297999", signingDate = signingDate, effectiveDate = effectiveDate, - // TODO: Очень странно, что сервис не дает отправить значения - // для indefiniteTerm и automaticRollOverOneYear одновременно, - // хотя в выгружаемом шаблоне они оба заполнены - //indefiniteTerm = false, automaticRollOverOneYear = true, comptetionDate = comptetionDate, // TODO: Не дает выгрузить период @@ -61,18 +57,14 @@ namespace Hcs.TestApp.Scenario //{ // Start = new SupplyResourceContractTypePeriodStart() // { - // StartDate = 20, - // // TODO: Ломается если отправить NextMonth = false, если отправить true - то все ОК - // //NextMonth = false, - // //NextMonthSpecified = true + // StartDate = 20 // }, // End = new SupplyResourceContractTypePeriodEnd() // { - // EndDate = 25, - // //NextMonth = false, - // //NextMonthSpecified = true + // EndDate = 25 // } //}, + counterparty = true, isPlannedVolume = false, contractSubject = [new SupplyResourceContractTypeContractSubject() { @@ -139,11 +131,29 @@ namespace Hcs.TestApp.Scenario //{ // PairKey = contractSubjectGuid, // Items = [true], - // NormGUID = normGuid + // NormGUID = "" //}] }; var result = client.HouseManagement.ImportSupplyResourceContractDataAsync(payload).Result; Console.WriteLine("Scenario execution " + (result != null ? "succeeded" : "failed")); } + + internal void ImportNotificationData() + { + var payload = new ImportNotificationDataPayload() + { + topic = "Тема новости", + isImportant = true, + content = "Содержимое новости", + destinations = + [ + new(ItemsChoiceType29.IsAll, true) + ], + isNotLimit = true, + isShipOff = true + }; + var result = client.HouseManagement.ImportNotificationDataAsync(payload).Result; + Console.WriteLine("Scenario execution " + (result ? "succeeded" : "failed")); + } } }