Задача: заполнить реквизиты организации из Контур Фокус - далее "сервис"
Для заполнения реквизитов используется метод 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 Организации тоже окрашиваются при заполнении? Есть ли какой-то справочник постановки организаций на наблюдение?
Евгений, Здравствуйте, на текущий момент только заполнение реквизитов организации по кнопке.
Авторизуйтесь, чтобы написать комментарий