Заполнение реквизитов организации из Контур Фокус

28 2

Задача: заполнить реквизиты организации из Контур Фокус - далее "сервис"

Для заполнения реквизитов используется метод req. (Игровой стенд, Документация)

На сервис отправляется запрос вида "https://focus-api.kontur.ru/api3/req?inn=6663003127&key=3208d29d15c507395db770d0e65f3711e40374df", состоящий из ссылки на метод, ИНН или ОГРН запрашиваемой организации, ключа доступа (тестовый ключ с ограниченной функциональностью: 3208d29d15c507395db770d0e65f3711e40374df)

Сервис возвращает ответ в формате JSON, для удобства работы преобразуем JSON в классы C# (например, при помощи сайта https://json2csharp.com/ или при помощи Visual Studio - Правка/Специальная вставка/Вставить JSON как классы)

1) Создаем библиотеку классов, назовем ее focusapi3req. Метод Req принимает ссылку запроса сформированную в Directum RX.

using System;
using System.IO;
using System.Net;
using System.Text.Json;

namespace focusapi3req
{

    public class Api3
    {
        public static Root Req(string FocusRequestString)
        {
            string jsonString = String.Empty;

            WebRequest request = WebRequest.Create(FocusRequestString);
            WebResponse response = request.GetResponse();
            using (StreamReader stream = new StreamReader(response.GetResponseStream()))
            {
                jsonString = stream.ReadToEnd();
            }

            #region Подгоняем текст под десериализацию (убираем лишние квадратные скобки возвращаемые из сервиса)
            jsonString = jsonString.Substring(1);
            int len = jsonString.Length;
            jsonString = jsonString.Remove(len - 1, 1);
            #endregion
	    //Десериализация результата JSON
            Root Root = JsonSerializer.Deserialize<Root>(jsonString);
            return Root;
        }
    }

}

2) В отдельном файле определим классы, представляющие объекты JSON и их свойства. Стоит учесть, что метод сервиса req возвращает разные JSON ответы для юридических лиц и ИП. В коде ниже объединены два ответа, проверять результат будем в Directum RX. Чтобы придерживаться соглашения о первых прописных буквах имен свойств добавим атрибут [JsonPropertyName] для указания имени свойств в данных JSON.

 

using System;
using System.Collections.Generic;
using System.Text;
using System.Text.Json.Serialization;

namespace focusapi3req
{
    // Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse);
    public class Branch
    {
        [JsonPropertyName("kpp")]
        public string Kpp { get; set; }

        [JsonPropertyName("parsedAddressRF")]
        public ParsedAddressRF ParsedAddressRF { get; set; }

        [JsonPropertyName("date")]
        public string Date { get; set; }

        [JsonPropertyName("name")]
        public string Name { get; set; }
    }

    public class BriefReport
    {
        [JsonPropertyName("summary")]
        public Summary Summary { get; set; }
    }

    public class Bulk
    {
        [JsonPropertyName("topoShortName")]
        public string TopoShortName { get; set; }

        [JsonPropertyName("topoFullName")]
        public string TopoFullName { get; set; }

        [JsonPropertyName("topoValue")]
        public string TopoValue { get; set; }
    }

    public class City
    {
        [JsonPropertyName("topoShortName")]
        public string TopoShortName { get; set; }

        [JsonPropertyName("topoFullName")]
        public string TopoFullName { get; set; }

        [JsonPropertyName("topoValue")]
        public string TopoValue { get; set; }
    }

    public class ContactPhones
    {
        [JsonPropertyName("count")]
        public int Count { get; set; }
    }

    public class Flat
    {
        [JsonPropertyName("topoShortName")]
        public string TopoShortName { get; set; }

        [JsonPropertyName("topoFullName")]
        public string TopoFullName { get; set; }

        [JsonPropertyName("topoValue")]
        public string TopoValue { get; set; }
    }

    public class Head
    {
        [JsonPropertyName("fio")]
        public string Fio { get; set; }

        [JsonPropertyName("innfl")]
        public string Innfl { get; set; }

        [JsonPropertyName("position")]
        public string Position { get; set; }

        [JsonPropertyName("date")]
        public string Date { get; set; }

        [JsonPropertyName("firstDate")]
        public string FirstDate { get; set; }

        [JsonPropertyName("structuredFio")]
        public StructuredFio StructuredFio { get; set; }
    }

    public class History
    {
        [JsonPropertyName("kpps")]
        public List<Kpp> Kpps { get; set; }

        [JsonPropertyName("legalNames")]
        public List<LegalName> LegalNames { get; set; }

        [JsonPropertyName("legalAddresses")]
        public List<LegalAddress> LegalAddresses { get; set; }

        [JsonPropertyName("heads")]
        public List<Head> Heads { get; set; }
    }

    public class House
    {
        [JsonPropertyName("topoShortName")]
        public string TopoShortName { get; set; }

        [JsonPropertyName("topoFullName")]
        public string TopoFullName { get; set; }

        [JsonPropertyName("topoValue")]
        public string TopoValue { get; set; }
    }

    public class Kpp
    {
        [JsonPropertyName("kpp")]
        public string KppProperty { get; set; }

        [JsonPropertyName("date")]
        public string Date { get; set; }
    }

    public class LegalAddress
    {
        [JsonPropertyName("parsedAddressRF")]
        public ParsedAddressRF ParsedAddressRF { get; set; }

        [JsonPropertyName("date")]
        public string Date { get; set; }

        [JsonPropertyName("firstDate")]
        public string FirstDate { get; set; }
    }

    public class LegalAddress2
    {
        [JsonPropertyName("parsedAddressRF")]
        public ParsedAddressRF ParsedAddressRF { get; set; }

        [JsonPropertyName("date")]
        public string Date { get; set; }

        [JsonPropertyName("firstDate")]
        public string FirstDate { get; set; }
    }

    public class LegalName
    {
        [JsonPropertyName("short")]
        public string Short { get; set; }

        [JsonPropertyName("full")]
        public string Full { get; set; }

        [JsonPropertyName("readable")]
        public string Readable { get; set; }

        [JsonPropertyName("date")]
        public string Date { get; set; }
    }

    public class LegalName2
    {
        [JsonPropertyName("short")]
        public string Short { get; set; }

        [JsonPropertyName("full")]
        public string Full { get; set; }

        [JsonPropertyName("readable")]
        public string Readable { get; set; }

        [JsonPropertyName("date")]
        public string Date { get; set; }
    }

    public class ParsedAddressRF
    {
        [JsonPropertyName("zipCode")]
        public string ZipCode { get; set; }

        [JsonPropertyName("kladrCode")]
        public string KladrCode { get; set; }

        [JsonPropertyName("regionCode")]
        public string RegionCode { get; set; }

        [JsonPropertyName("regionName")]
        public RegionName RegionName { get; set; }

        [JsonPropertyName("city")]
        public City City { get; set; }

        [JsonPropertyName("street")]
        public Street Street { get; set; }

        [JsonPropertyName("bulk")]
        public Bulk Bulk { get; set; }

        [JsonPropertyName("bulkRaw")]
        public string BulkRaw { get; set; }

        [JsonPropertyName("house")]
        public House House { get; set; }

        [JsonPropertyName("flat")]
        public Flat Flat { get; set; }

        [JsonPropertyName("houseRaw")]
        public string HouseRaw { get; set; }

        [JsonPropertyName("flatRaw")]
        public string FlatRaw { get; set; }

        [JsonPropertyName("isConverted")]
        public bool? IsConverted { get; set; }
    }

    public class RegionName
    {
        [JsonPropertyName("topoShortName")]
        public string TopoShortName { get; set; }

        [JsonPropertyName("topoFullName")]
        public string TopoFullName { get; set; }

        [JsonPropertyName("topoValue")]
        public string TopoValue { get; set; }
    }

    public class Root
    {
        [JsonPropertyName("inn")]
        public string Inn { get; set; }

        [JsonPropertyName("ogrn")]
        public string Ogrn { get; set; }

        [JsonPropertyName("focusHref")]
        public string FocusHref { get; set; }

        [JsonPropertyName("UL")]
        public UL UL { get; set; }

        [JsonPropertyName("IP")]
        public IP IP { get; set; }

        [JsonPropertyName("briefReport")]
        public BriefReport BriefReport { get; set; }

        [JsonPropertyName("contactPhones")]
        public ContactPhones ContactPhones { get; set; }
    }

    public class Status
    {
        [JsonPropertyName("statusString")]
        public string StatusString { get; set; }
    }

    public class Street
    {
        [JsonPropertyName("topoShortName")]
        public string TopoShortName { get; set; }

        [JsonPropertyName("topoFullName")]
        public string TopoFullName { get; set; }

        [JsonPropertyName("topoValue")]
        public string TopoValue { get; set; }
    }

    public class StructuredFio
    {
        [JsonPropertyName("firstName")]
        public string FirstName { get; set; }

        [JsonPropertyName("lastName")]
        public string LastName { get; set; }

        [JsonPropertyName("middleName")]
        public string MiddleName { get; set; }
    }

    public class Summary
    {
        [JsonPropertyName("greenStatements")]
        public bool GreenStatements { get; set; }

        [JsonPropertyName("yellowStatements")]
        public bool YellowStatements { get; set; }
    }

    public class UL
    {
        [JsonPropertyName("kpp")]
        public string Kpp { get; set; }

        [JsonPropertyName("okpo")]
        public string Okpo { get; set; }

        [JsonPropertyName("okato")]
        public string Okato { get; set; }

        [JsonPropertyName("okfs")]
        public string Okfs { get; set; }

        [JsonPropertyName("oktmo")]
        public string Oktmo { get; set; }

        [JsonPropertyName("okogu")]
        public string Okogu { get; set; }

        [JsonPropertyName("okopf")]
        public string Okopf { get; set; }

        [JsonPropertyName("opf")]
        public string Opf { get; set; }

        [JsonPropertyName("legalName")]
        public LegalName LegalName { get; set; }

        [JsonPropertyName("legalAddress")]
        public LegalAddress LegalAddress { get; set; }

        [JsonPropertyName("branches")]
        public List<Branch> Branches { get; set; }

        [JsonPropertyName("status")]
        public Status Status { get; set; }

        [JsonPropertyName("registrationDate")]
        public string RegistrationDate { get; set; }

        [JsonPropertyName("heads")]
        public List<Head> Heads { get; set; }

        [JsonPropertyName("history")]
        public History History { get; set; }
    }

    public class IP
    {
        [JsonPropertyName("fio")]
        public string Fio { get; set; }

        [JsonPropertyName("okpo")]
        public string Okpo { get; set; }

        [JsonPropertyName("okato")]
        public string Okato { get; set; }

        [JsonPropertyName("okfs")]
        public string Okfs { get; set; }

        [JsonPropertyName("okogu")]
        public string Okogu { get; set; }

        [JsonPropertyName("okopf")]
        public string Okopf { get; set; }

        [JsonPropertyName("opf")]
        public string Opf { get; set; }

        [JsonPropertyName("oktmo")]
        public string Oktmo { get; set; }

        [JsonPropertyName("registrationDate")]
        public string RegistrationDate { get; set; }

        [JsonPropertyName("dissolutionDate")]
        public string DissolutionDate { get; set; }

        [JsonPropertyName("status")]
        public Status Status { get; set; }
    }


}

 

 

3) Собираем библиотеку
4) В Directum RX, в своё решение, добавляем полученную выше библиотеку
5) В перекрытом справочнике Организации заменяем код действия заполнения реквизитов

 public override void FillFromService(Sungero.Domain.Client.ExecuteActionArgs e)
    {
      
      #region Query parameters
      string FocusReq = string.Empty;
      string FocusPath = "https://focus-api.kontur.ru/api3/req?";
      string key = "&key=" + PublicConstants.Parties.Company.FocusKey;
      
      //Если указан ИНН - заполняем по ИНН
      if (!string.IsNullOrWhiteSpace(_obj.TIN))
        FocusReq = FocusPath + "inn=" + _obj.TIN.Trim() + key;
      else if (!string.IsNullOrWhiteSpace(_obj.PSRN))
        FocusReq = FocusPath + "ogrn=" + _obj.PSRN.Trim() + key;
      else
      {
        e.AddInformation("Необходимо указать ИНН или ОГРН организации");
        return;
      }
      #endregion

      var root = focusapi3req.Api3.Req(FocusReq);
      
      //если Юр.лицо
      if (root.UL != null)
      {
        //юр наименование
        _obj.LegalName = root.UL.LegalName.Full;
        //наименование
        _obj.Name = root.UL.LegalName.@Short;
        //ОГРН
        _obj.PSRN = root.Ogrn;
        //ИНН
        _obj.TIN = root.Inn;
        //кпп
        _obj.TRRC = root.UL.Kpp;
        //ОКПО
        _obj.TRRC = root.UL.Okpo;
        //ОКОГУ
        _obj.OKOGUcentrvd = root.UL.Okogu;
        //ОКОПФ
        _obj.OKOPFcentrvd = root.UL.Okopf;
        //ОКФС
        _obj.OKFScentrvd = root.UL.Okfs;
        //ОКАТО 
        _obj.OKATOcentrvd = root.UL.Okato;
        
        #region  Город
        string City = string.Empty;
        
        if (root.UL.LegalAddress.ParsedAddressRF.RegionName.TopoFullName == "область")
        {
          City = "г. " + root.UL.LegalAddress.ParsedAddressRF.City.TopoValue;
        }
        //в случае Москвы регион это город
        else if (root.UL.LegalAddress.ParsedAddressRF.RegionName.TopoFullName == "город")
        {
          City = "г. " + root.UL.LegalAddress.ParsedAddressRF.RegionName.TopoValue;
        }
        
        if (!string.IsNullOrEmpty(City))
        {
          var Cities = Sungero.Commons.Cities.GetAll().Where(n => n.Name == City);
          if (Cities.Any())
          {
            _obj.City = Cities.First();
          }
        }
        #endregion
        
        #region юридический адрес
        string address = string.Empty;
        //индекс
        address += root.UL.LegalAddress.ParsedAddressRF.ZipCode + ", ";
        //регион
        if (root.UL.LegalAddress.ParsedAddressRF.RegionName.TopoFullName == "область")
        {
          address += root.UL.LegalAddress.ParsedAddressRF.RegionName.TopoValue + " " + root.UL.LegalAddress.ParsedAddressRF.RegionName.TopoShortName + "., ";
          address += root.UL.LegalAddress.ParsedAddressRF.City.TopoShortName + ". " + root.UL.LegalAddress.ParsedAddressRF.City.TopoValue + ", ";
        }
        else if (root.UL.LegalAddress.ParsedAddressRF.RegionName.TopoFullName == "город")
        {
          address += root.UL.LegalAddress.ParsedAddressRF.RegionName.TopoShortName + ". " + root.UL.LegalAddress.ParsedAddressRF.RegionName.TopoValue + ", ";
        }
        //улица
        address += root.UL.LegalAddress.ParsedAddressRF.Street.TopoShortName + ". " + root.UL.LegalAddress.ParsedAddressRF.Street.TopoValue + ", ";

        //дом
        if (root.UL.LegalAddress.ParsedAddressRF.HouseRaw != null)
          address += root.UL.LegalAddress.ParsedAddressRF.HouseRaw + ", ";
        //строение
        address += root.UL.LegalAddress.ParsedAddressRF.BulkRaw;
        
        _obj.LegalAddress = address;
        
        #endregion
        
        //Дата образования
        _obj.RegDatecentrvd = DateTime.Parse(root.UL.RegistrationDate);
        
        //вид контрагента
        _obj.CounterpartyTypecentrvd = CounterpartyTypecentrvd.UL;
      }
      //Иначе ИП
      else
      {
        //юр наименование
        _obj.LegalName = root.IP.Fio;
        //наименование
        _obj.Name = root.IP.Fio;
        //ОГРН
        _obj.PSRN = root.Ogrn;
        //ИНН
        _obj.TIN = root.Inn;
        //ОКАТО 
        _obj.OKATOcentrvd = root.IP.Okato;
        //ОКПО
        _obj.TRRC = root.IP.Okpo;
        //ОКФС
        _obj.OKFScentrvd = root.IP.Okfs;
        //ОКОГУ
        _obj.OKOGUcentrvd = root.IP.Okogu;
        //ОКОПФ
        _obj.OKOPFcentrvd = root.IP.Okopf;
        //Дата образования
        _obj.RegDatecentrvd = DateTime.Parse(root.IP.RegistrationDate);
        //вид контрагента
        _obj.CounterpartyTypecentrvd = CounterpartyTypecentrvd.IP;
      }
      
    }

 

Евгений Ясашных

Роман, приветствую.
В Directum RX Организации тоже окрашиваются при заполнении? Есть ли какой-то справочник постановки организаций на наблюдение?

 

Роман Груздев

Евгений, Здравствуйте, на текущий момент только заполнение реквизитов организации по кнопке.

Авторизуйтесь, чтобы написать комментарий