diff --git a/Hcs.Client/Client/Api/HouseManagementApi.cs b/Hcs.Client/Client/Api/HouseManagementApi.cs index 5ef1245..4dc6ea9 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 ImportAccountDataAsync(ImportAccountDataPayload payload, CancellationToken token = default) + { + var request = new ImportAccountDataRequest(client); + return await request.ExecuteAsync(payload, token); + } + + /// /// Импорт новости для информирования граждан /// diff --git a/Hcs.Client/Client/Api/Payload/HouseManagement/ImportAccountDataPayload.cs b/Hcs.Client/Client/Api/Payload/HouseManagement/ImportAccountDataPayload.cs new file mode 100644 index 0000000..7bb429a --- /dev/null +++ b/Hcs.Client/Client/Api/Payload/HouseManagement/ImportAccountDataPayload.cs @@ -0,0 +1,97 @@ +using Hcs.Service.Async.HouseManagement; + +namespace Hcs.Client.Api.Payload.HouseManagement +{ + // http://open-gkh.ru/HouseManagement/importAccountRequest/Account.html + public class ImportAccountDataPayload + { + /// + /// Тип лицевого счета + /// + public enum AccountType + { + /// + /// Лицевой счет для оплаты за жилое помещение и коммунальные услуги + /// + UO, + + /// + /// Лицевой счет для оплаты за коммунальные услуги + /// + RSO, + + /// + /// Лицевой счет для оплаты капитального ремонта + /// + CR, + + /// + /// Лицевой счет РКЦ + /// + RC, + + /// + /// Лицевой счет ОГВ/ОМС + /// + OGVorOMS, + + /// + /// Лицевой счет ТКО + /// + TKO + } + + /// + /// Необязательное. Номер лицевого счета или иной идентификатор плательщика. Максимум 30 символов. + /// + public string accountNumber; + + /// + /// Необязательное. Идентификатор ЛС в ГИС ЖКХ (при обновлении данных ЛС). + /// + public string accountGUID; + + /// + /// Необязательное. Конкретизация оснований ЛС (договоров ресурсоснабжения, договоров социального найма, + /// договоров по обращению с ТКО). + /// + public AccountReasonsImportType accountReasons; + + /// + /// Тип лицевого счета + /// + public AccountType accountType; + + /// + /// Необязательное. Количество проживающих, не больше 9999. + /// + public uint? livingPersonsNumber; + + /// + /// Необязательное. Общая площадь для ЛС. Не более 4 цифр после целой. + /// + public decimal? totalSquare; + + /// + /// Необязательное. Жилая площадь. Не более 4 цифр после целой. + /// + public decimal? residentialSquare; + + /// + /// Необязательное. Отапливаемая площадь. Не более 4 цифр после целой. + /// + public decimal? heatedArea; + + // TODO: Добавить причину закрытия лицевого счета + + /// + /// Помещения + /// + public AccountTypeAccommodation[] accomodations; + + /// + /// Сведения о платильщике + /// + public AccountTypePayerInfo payerInfo; + } +} diff --git a/Hcs.Client/Client/Api/Request/HouseManagement/ImportAccountDataRequest.cs b/Hcs.Client/Client/Api/Request/HouseManagement/ImportAccountDataRequest.cs new file mode 100644 index 0000000..319f78e --- /dev/null +++ b/Hcs.Client/Client/Api/Request/HouseManagement/ImportAccountDataRequest.cs @@ -0,0 +1,108 @@ +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.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace Hcs.Client.Api.Request.HouseManagement +{ + internal class ImportAccountDataRequest(ClientBase client) : HouseManagementRequestBase(client) + { + protected override bool CanBeRestarted => false; + + internal async Task 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().ToList().ForEach(error => + { + throw RemoteException.CreateNew(error.ErrorCode, error.Description); + }); + + return true; + } + + 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; + } + } +} diff --git a/Hcs.Client/Hcs.Client.csproj b/Hcs.Client/Hcs.Client.csproj index 522967c..74c3c0b 100644 --- a/Hcs.Client/Hcs.Client.csproj +++ b/Hcs.Client/Hcs.Client.csproj @@ -69,6 +69,7 @@ + @@ -90,6 +91,7 @@ + diff --git a/Hcs.TestApp/TestApp/Program.cs b/Hcs.TestApp/TestApp/Program.cs index 494965b..74560d7 100644 --- a/Hcs.TestApp/TestApp/Program.cs +++ b/Hcs.TestApp/TestApp/Program.cs @@ -48,6 +48,8 @@ namespace Hcs.TestApp //houseManagementScenario.ExportSupplyResourceContractObjectAddressData(); + //houseManagementScenario.ImportAccountData(); + //houseManagementScenario.ImportNotificationData(); //houseManagementScenario.ImportSupplyResourceContractData(); diff --git a/Hcs.TestApp/TestApp/Scenario/HouseManagementScenario.cs b/Hcs.TestApp/TestApp/Scenario/HouseManagementScenario.cs index 2aa4e71..4029f5b 100644 --- a/Hcs.TestApp/TestApp/Scenario/HouseManagementScenario.cs +++ b/Hcs.TestApp/TestApp/Scenario/HouseManagementScenario.cs @@ -3,7 +3,6 @@ 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 { @@ -155,5 +154,51 @@ namespace Hcs.TestApp.Scenario var result = client.HouseManagement.ImportNotificationDataAsync(payload).Result; Console.WriteLine("Scenario execution " + (result ? "succeeded" : "failed")); } + + internal void ImportAccountData() + { + var payload = new ImportAccountDataPayload() + { + accountNumber = "385635479641", + accountReasons = new AccountReasonsImportType() + { + SupplyResourceContract = + [ + new() + { + Items = ["0aca4ebc-8d5c-4a39-801c-e25f0867adc6"], + ItemsElementName = [ItemsChoiceType17.ContractGUID] + } + ] + }, + accountType = ImportAccountDataPayload.AccountType.RC, + livingPersonsNumber = 1, + totalSquare = 29.3m, + residentialSquare = 29.3m, + heatedArea = 29.3m, + accomodations = + [ + new() + { + Item = "db041c58-4a14-45ce-8ecc-d99727e9683f", + ItemElementName = ItemChoiceType9.FIASHouseGuid + } + ], + payerInfo = new AccountTypePayerInfo() + { + IsRenter = true, + IsRenterSpecified = true, + Item = new AccountIndType() + { + Item = "62392021264", + FirstName = "Имя", + Surname = "Фамилия", + Patronymic = "Отчество" + } + } + }; + var result = client.HouseManagement.ImportAccountDataAsync(payload).Result; + Console.WriteLine("Scenario execution " + (result ? "succeeded" : "failed")); + } } }