Пример обогащения позиции данными, полученными из Контур.Фокус
Данный пример наглядно демонстрирует решение следующих задач:
-
подключение к веб-сервису Контур.Фокус и получение данных по контрагенту;
-
чтение полученных из Контур.Фокус данных и заполнение атрибутов контрагента данными;
-
синхронизация списков, полученных из Контур.Фокуса со массивом позиций в атрибуте связи.
Разработанный groovy-скрипт должен быть размещен в постобработчике на изменение значения атрибута “ИНН” справочника “Контрагенты”.
Сценарий работы пользователя: пользователь создает новую позицию и в карточке новой позиции, в атрибут “ИНН” вводит ИНН и нажимает кнопку запуска пост-обработчика. Система выполняет запрос данных по ИНН в Контур.Фокус, после чего выполняет автоматическое заполнение атрибутов новой позиции полученными данными из Контур.Фокус. Пользователь проводит дозаполнение требуемых атрибутов и публикует пакет изменений.
Скрипт постобработчика
// Получение данных по контрагенту из Контур.Фокус по ИНН
import groovy.json.JsonSlurper
String postProcessValue(String value){
// value - изменённое значение
// @[...] - атрибутика обрабатываемой позиции
// @[#currentuser][...] - атрибутика пользователя, выполняеющего функцию
// вернуть строку!=null, если требуется сигнализировать ошибку
// Получить из сервиса машинного обучения предсказанные значения атрибутов, на основе полного наименование объекта(FULL_NAME)
HttpURLConnection connection = new URL("https://focus-api.kontur.ru/api3/req?key=3208d29d15c507395db770d0e65f3711e40374df&inn=" + value
).openConnection() as HttpURLConnection;
//Выполним парсинг JSON, с результатом предсказания
def rootNodes = new JsonSlurper().parseText(connection.inputStream.text);
def rootNode = rootNodes[0];
//Получим построитель запроса на изменение значений текущей позиции
UpdateItemBuilder itemValueUpdates = postOperation.updateItem(scriptData.getItemUid(null));
String stringValue = "";
//Получим экспресс-статус
String ca_statement = "информация об экспрес-статусе отсутствует";
stringValue = rootNode.briefReport.summary.greenStatements;
if (stringValue == "true")
ca_statement = "С данным контрагентом можно заключать договора";
stringValue = rootNode.briefReport.summary.yellowStatements;
if (stringValue == "true")
ca_statement = "Данный контрагент либо прекратил свою деятельность, либо скоро может прекратить. Требуется проверка контрагента.";
stringValue = rootNode.briefReport.summary.redStatements;
if (stringValue == "true")
ca_statement = "Данного контрагента нужно обязательно проверить";
itemValueUpdates.set(ca_statement, @[Экспресс статус].toId())
//Добавим "Нормализован через ЕГРЮЛ/ЕГРИП"
itemValueUpdates.set("true", @[Нормализован через ЕГРЮЛ/ЕГРИП].toId());
//Добавим страну регистрации РОССИЯ
itemValueUpdates.set("p8iGlqNQ7dTbAqMjj1Jcxa", @[Страна регистрации (ОКСМ)].toId());
//Дата закрытия
stringValue = rootNode.UL.dissolutionDate;
if ((stringValue!=null)&&(stringValue!=""))
itemValueUpdates.set(stringValue, @[Дата закрытия].toId());
else
itemValueUpdates.clear(@[Дата закрытия].toId());
//КПП
stringValue = rootNode.UL.kpp;
//return stringValue
if ((stringValue!=null)&&(stringValue!=""))
itemValueUpdates.set(stringValue, @[КПП].toId());
else
itemValueUpdates.clear(@[КПП].toId());
//Полное наименование контрагента
stringValue = rootNode.UL.legalName.full;
if ((stringValue!=null)&&(stringValue!=""))
itemValueUpdates.set(stringValue, @[Полное наименование контрагента].toId());
else
itemValueUpdates.clear(@[Полное наименование контрагента].toId());
//Сокращённое наименование контрагента
stringValue = rootNode.UL.legalName.short;
if ((stringValue!=null)&&(stringValue!=""))
itemValueUpdates.set(stringValue, @[Сокращённое наименование контрагента].toId());
else
itemValueUpdates.clear(@[Сокращённое наименование контрагента].toId());
//@[Код ОКАТО]
stringValue = rootNode.UL.okato;
if ((stringValue!=null)&&(stringValue!=""))
itemValueUpdates.set(stringValue, @[Код ОКАТО].toId());
else
itemValueUpdates.clear(@[Код ОКАТО].toId());
//@[Организационно-правовая форма]
stringValue = rootNode.UL.opf;
if ((stringValue!=null)&&(stringValue!=""))
itemValueUpdates.set(stringValue, @[Организационно-правовая форма].toId());
else
itemValueUpdates.clear(@[Организационно-правовая форма].toId());
//@[Дата регистрации]
/*stringValue = rootNode.UL.registrationDate;
if ((stringValue!=null)&&(stringValue!=""))
itemValueUpdates.set(stringValue, @[Дата регистрации].toId());
else
itemValueUpdates.clear(@[Дата регистрации].toId());*/
//@[Статус контрагента]
stringValue = rootNode.UL.status.statusString;
if ((stringValue!=null)&&(stringValue!=""))
itemValueUpdates.set(stringValue, @[Статус контрагента].toId());
else
itemValueUpdates.clear(@[Статус контрагента].toId());
//@[ОГРН/Регистрационный номер в стране регистрации]
stringValue = rootNode.ogrn;
if ((stringValue!=null)&&(stringValue!=""))
itemValueUpdates.set(stringValue, @[ОГРН/Регистрационный номер в стране регистрации].toId());
else
itemValueUpdates.clear(@[ОГРН/Регистрационный номер в стране регистрации].toId());
//@[ИНН/Налоговый номер в стране регистрации]
stringValue = value;
if ((stringValue!=null)&&(stringValue!=""))
itemValueUpdates.set(stringValue, @[ИНН/Налоговый номер в стране регистрации].toId());
else
itemValueUpdates.clear(@[ИНН/Налоговый номер в стране регистрации].toId());
//@[ОКОПФ]
stringValue = rootNode.UL.okopf;
List<String> itemUids = support.findInNode("20cde407-f1a7-41f3-8d16-6df887f2c119").byValue(stringValue,@[Код ОКОПФ].toPath()).invoke();
//return stringValue
if (itemUids.size()>0)
itemValueUpdates.set(itemUids[0], @[ОКОПФ].toId());
else
itemValueUpdates.clear(@[ОКОПФ].toId());
//@[ОКФС]
stringValue = rootNode.UL.okfs;
itemUids = support.findInNode("ad59292a-1ef9-42c3-8373-2b099158b648").byValue(stringValue,@[Код ОКФС].toPath()).invoke();
//return stringValue
if (itemUids.size()>0)
itemValueUpdates.set(itemUids[0], @[ОКФС].toId());
else
itemValueUpdates.clear(@[ОКФС].toId());
//ЗАПОЛНИМ АТРИБУТЫ АДРЕСА
if (rootNode.UL.legalAddress.parsedAddressRF != null) {
stringValue = @[Адрес (место нахождения)];
if (stringValue==null)
stringValue = postOperation.createItem("c63b55da-eda9-4e8b-9ff5-e32f79126b5f");
itemValueUpdates.set(stringValue, @[Адрес (место нахождения)].toId());
//Получим построитель запроса на изменение значений позиции с адресом
UpdateItemBuilder itemAggValueUpdates = postOperation.updateItem(stringValue);
if (rootNode.UL.legalAddress.parsedAddressRF.bulk!=null) {
//@[Тип строения]
stringValue = rootNode.UL.legalAddress.parsedAddressRF.bulk.topoShortName;
if ((stringValue!=null)&&(stringValue!=""))
itemAggValueUpdates.set(stringValue, @[Тип строения].toId());
else
itemAggValueUpdates.clear(@[Тип строения].toId());
//@[Строение]
stringValue = rootNode.UL.legalAddress.parsedAddressRF.bulk.topoValue;
if ((stringValue!=null)&&(stringValue!=""))
itemAggValueUpdates.set(stringValue, @[Строение].toId());
else
itemAggValueUpdates.clear(@[Строение].toId());
}
else {
itemAggValueUpdates.clear(@[Тип строения].toId());
itemAggValueUpdates.clear(@[Строение].toId());
}
if (rootNode.UL.legalAddress.parsedAddressRF.city!=null) {
//@[Тип города]
stringValue = rootNode.UL.legalAddress.parsedAddressRF.city.topoShortName;
if ((stringValue!=null)&&(stringValue!=""))
itemAggValueUpdates.set(stringValue, @[Тип города].toId());
else
itemAggValueUpdates.clear(@[Тип города].toId());
//@[Город]
stringValue = rootNode.UL.legalAddress.parsedAddressRF.city.topoValue;
if ((stringValue!=null)&&(stringValue!=""))
itemAggValueUpdates.set(stringValue, @[Город].toId());
else
itemAggValueUpdates.clear(@[Город].toId());
}
if (rootNode.UL.legalAddress.parsedAddressRF.city!=null) {
//@[Тип района]
stringValue = rootNode.UL.legalAddress.parsedAddressRF.district.topoShortName;
if ((stringValue!=null)&&(stringValue!=""))
itemAggValueUpdates.set(stringValue, @[Тип района].toId());
else
itemAggValueUpdates.clear(@[Тип района].toId());
//@[Район]
stringValue = rootNode.UL.legalAddress.parsedAddressRF.district.topoValue;
if ((stringValue!=null)&&(stringValue!=""))
itemAggValueUpdates.set(stringValue, @[Район].toId());
else
itemAggValueUpdates.clear(@[Район].toId());
}
if (rootNode.UL.legalAddress.parsedAddressRF.house!=null) {
//@[Тип дома]
stringValue = rootNode.UL.legalAddress.parsedAddressRF.house.topoShortName;
if ((stringValue!=null)&&(stringValue!=""))
itemAggValueUpdates.set(stringValue, @[Тип дома].toId());
else
itemAggValueUpdates.clear(@[Тип дома].toId());
//@[Дом]
stringValue = rootNode.UL.legalAddress.parsedAddressRF.house.topoValue;
if ((stringValue!=null)&&(stringValue!=""))
itemAggValueUpdates.set(stringValue, @[Дом].toId());
else
itemAggValueUpdates.clear(@[Дом].toId());
}
if (rootNode.UL.legalAddress.parsedAddressRF.regionName!=null) {
//@[Тип региона]
stringValue = rootNode.UL.legalAddress.parsedAddressRF.regionName.topoShortName;
if ((stringValue!=null)&&(stringValue!=""))
itemAggValueUpdates.set(stringValue, @[Тип региона].toId());
else
itemAggValueUpdates.clear(@[Тип региона].toId());
//@[Регион]
stringValue = rootNode.UL.legalAddress.parsedAddressRF.regionName.topoValue;
if ((stringValue!=null)&&(stringValue!=""))
itemAggValueUpdates.set(stringValue, @[Регион].toId());
else
itemAggValueUpdates.clear(@[Регион].toId());
}
if (rootNode.UL.legalAddress.parsedAddressRF.settlement!=null) {
//@[Тип населённого пункта]
stringValue = rootNode.UL.legalAddress.parsedAddressRF.settlement.topoShortName;
if ((stringValue!=null)&&(stringValue!=""))
itemAggValueUpdates.set(stringValue, @[Тип населённого пункта].toId());
else
itemAggValueUpdates.clear(@[Тип населённого пункта].toId());
//@[Населённый пункт]
stringValue = rootNode.UL.legalAddress.parsedAddressRF.settlement.topoValue;
if ((stringValue!=null)&&(stringValue!=""))
itemAggValueUpdates.set(stringValue, @[Населённый пункт].toId());
else
itemAggValueUpdates.clear(@[Населённый пункт].toId());
}
if (rootNode.UL.legalAddress.parsedAddressRF.street!=null) {
//@[Тип улицы]
stringValue = rootNode.UL.legalAddress.parsedAddressRF.street.topoShortName;
if ((stringValue!=null)&&(stringValue!=""))
itemAggValueUpdates.set(stringValue, @[Тип улицы].toId());
else
itemAggValueUpdates.clear(@[Тип улицы].toId());
//@[Улица]
stringValue = rootNode.UL.legalAddress.parsedAddressRF.street.topoValue;
if ((stringValue!=null)&&(stringValue!=""))
itemAggValueUpdates.set(stringValue, @[Улица].toId());
else
itemAggValueUpdates.clear(@[Улица].toId());
}
//@[Почтовый индекс]
stringValue = rootNode.UL.legalAddress.parsedAddressRF.zipCode;
if ((stringValue!=null)&&(stringValue!=""))
itemAggValueUpdates.set(stringValue, @[Почтовый индекс].toId());
else
itemAggValueUpdates.clear(@[Почтовый индекс].toId());
}
def aggrItemsValues = [:];
List<PropertyValueDto> propValues;
PropertyValueDto propValue;
String FindeditemUid;
List<String> aggrItems;
//ОБРАБОТАЕМ: Лица, имеющих право подписи
aggrItems = scriptData.getValues(@[Лицо, имеющее право подписи]);
for(String itemUid in aggrItems) {
propValues = support.getItemPropertyValues(itemUid);
aggrItemsValues.put(itemUid, propValues);
}
int ulHeadCount = rootNode.UL.heads.size();
for(int i = 0; i < ulHeadCount; i++) {
if ((rootNode.UL.heads[i]!=null)) {
headDateValue = rootNode.UL.heads[i].date;
headFioValue = rootNode.UL.heads[i].fio;
headInnflValue = rootNode.UL.heads[i].innfl;
headPositionValue = rootNode.UL.heads[i].position;
FindeditemUid = null;
for(String itemUid in aggrItems) {
propValues = aggrItemsValues.get(itemUid);
propValue = propValues.find {element -> element.propertyId==@[ФИО лица имеющего право подписи].toId()};
if ((propValue!=null)&&(propValue.stringValue==headFioValue)) {
FindeditemUid = itemUid;
aggrItems.remove(aggrItems.findIndexOf {it==itemUid});
}
}
if (FindeditemUid == null) {
FindeditemUid = postOperation.createItem("6628f5b7-5297-48f6-a897-a3f11f16bf70");
itemValueUpdates.set(FindeditemUid, @[Лицо, имеющее право подписи].toId());
}
//Получим построитель запроса на изменение значений позиции с адресом
itemAggValueUpdates = postOperation.updateItem(FindeditemUid);
//new SimpleDateFormat("yyyy-MM-dd").parse(headDateValue)
if ((headDateValue!=null)&&(headDateValue!=""))
itemAggValueUpdates.set(headDateValue, @[Дата внесения изменений ЕГРЮЛ].toId());
else
itemAggValueUpdates.clear(@[Дата внесения изменений ЕГРЮЛ].toId());
if ((headInnflValue!=null)&&(headInnflValue!=""))
itemAggValueUpdates.set(headInnflValue, @[ИНН/Налоговый номер в стране регистрации].toId());
else
itemAggValueUpdates.clear(@[ИНН/Налоговый номер в стране регистрации].toId());
if ((headPositionValue!=null)&&(headPositionValue!=""))
itemAggValueUpdates.set(headPositionValue, @[Должность].toId());
else
itemAggValueUpdates.clear(@[Должность].toId());
}
}
//Удалим оставшиеся позиции, отсутствующие в списке
for(String itemUid in aggrItems) {
postOperation.deleteItem(itemUid);
}
aggrItems.clear();
//ОБРАБОТАЕМ: Управляющие компании
aggrItems = scriptData.getValues(@[Управляющие компании]);
for(String itemUid in aggrItems) {
propValues = support.getItemPropertyValues(itemUid);
aggrItemsValues.put(itemUid, propValues);
}
int ulMCCount = rootNode.UL.managementCompanies.size();
//return rootNode.UL.managementCompanies[0];//.isEmpty()
for(int i = 0; i < ulMCCount; i++) {
if (rootNode.UL.managementCompanies[i]!=null) {
mcDateValue = rootNode.UL.managementCompanies[i].date;
mcInnValue = rootNode.UL.managementCompanies[i].inn;
mcNameValue = rootNode.UL.managementCompanies[i].name;
mcOgrnValue = rootNode.UL.managementCompanies[i].ogrn;
FindeditemUid = null;
for(String itemUid in aggrItems) {
propValues = aggrItemsValues.get(itemUid);
if ((mcInnValue == null)||(mcInnValue == "")) {
propValue = propValues.find {element -> element.propertyId==@[Наименование контрагента].toId()};
if ((propValue!=null)&&(propValue.stringValue==mcNameValue)) {
FindeditemUid = itemUid;
aggrItems.remove(aggrItems.findIndexOf {it==itemUid});
}
}
else {
propValue = propValues.find {element -> element.propertyId==@[ИНН/Налоговый номер в стране регистрации].toId()};
if ((propValue!=null)&&(propValue.stringValue==mcInnValue)) {
FindeditemUid = itemUid;
aggrItems.remove(aggrItems.findIndexOf {it==itemUid});
}
}
}
if (FindeditemUid == null) {
FindeditemUid = postOperation.createItem("da926515-7cc9-4381-9ce7-abc70a24315e");
itemValueUpdates.set(FindeditemUid, @[Управляющие компании].toId());
}
//Получим построитель запроса на изменение значений позиции с адресом
itemAggValueUpdates = postOperation.updateItem(FindeditemUid);
//new SimpleDateFormat("yyyy-MM-dd").parse(headDateValue)
if ((mcDateValue!=null)&&(mcDateValue!=""))
itemAggValueUpdates.set(mcDateValue, @[Дата внесения изменений ЕГРЮЛ].toId());
else
itemAggValueUpdates.clear(@[Дата внесения изменений ЕГРЮЛ].toId());
if ((mcInnValue!=null)&&(mcInnValue!=""))
itemAggValueUpdates.set(mcInnValue, @[ИНН/Налоговый номер в стране регистрации].toId());
else
itemAggValueUpdates.clear(@[ИНН/Налоговый номер в стране регистрации].toId());
if ((mcNameValue!=null)&&(mcNameValue!=""))
itemAggValueUpdates.set(mcNameValue, @[Наименование контрагента].toId());
else
itemAggValueUpdates.clear(@[Наименование контрагента].toId());
if ((mcOgrnValue!=null)&&(mcOgrnValue!=""))
itemAggValueUpdates.set(mcOgrnValue, @[ОГРН/Регистрационный номер в стране регистрации].toId());
else
itemAggValueUpdates.clear(@[ОГРН/Регистрационный номер в стране регистрации].toId());
}
}
//Удалим оставшиеся позиции, отсутствующие в списке
for(String itemUid in aggrItems) {
postOperation.deleteItem(itemUid);
}
aggrItems.clear();
//ОБРАБОТАЕМ: Историю КПП
List<String> KPPs = [];
aggrItems = scriptData.getValues(@[История КПП]);
for(String itemUid in aggrItems) {
propValues = support.getItemPropertyValues(itemUid);
aggrItemsValues.put(itemUid, propValues);
}
int ulKppCount = rootNode.UL.history.kpps.size();
for(int i = 0; i < ulKppCount; i++) {
if (rootNode.UL.history.kpps[i]!=null) {
kppDateValue = rootNode.UL.history.kpps[i].date;
kppValue = rootNode.UL.history.kpps[i].kpp;
FindeditemUid = null;
for(String itemUid in aggrItems) {
propValues = aggrItemsValues.get(itemUid);
propValue = propValues.find {element -> element.propertyId==@[КПП].toId()};
if ((propValue!=null)&&(propValue.stringValue==kppValue)) {
FindeditemUid = itemUid;
aggrItems.remove(aggrItems.findIndexOf {it==itemUid});
}
}
if (FindeditemUid == null) {
FindeditemUid = postOperation.createItem("f04a053e-04a0-441e-908b-830fbf695ca4");
itemValueUpdates.set(FindeditemUid, @[История КПП].toId());
}
else return FindeditemUid;
//Получим построитель запроса на изменение значений позиции с адресом
itemAggValueUpdates = postOperation.updateItem(FindeditemUid);
//new SimpleDateFormat("yyyy-MM-dd").parse(headDateValue)
if ((kppDateValue!=null)&&(kppDateValue!=""))
itemAggValueUpdates.set(kppDateValue, @[Дата внесения изменений ЕГРЮЛ].toId());
else
itemAggValueUpdates.clear(@[Дата внесения изменений ЕГРЮЛ].toId());
if ((kppValue!=null)&&(kppValue!=""))
itemAggValueUpdates.set(kppValue, @[КПП].toId());
else
itemAggValueUpdates.clear(@[КПП].toId());
}
}
//Удалим оставшиеся позиции, отсутствующие в списке
for(String itemUid in aggrItems) {
postOperation.deleteItem(itemUid);
}
aggrItems.clear();
//ОБРАБОТАЕМ: Историю наименований контрагента
aggrItems = scriptData.getValues(@[История наименований]);
for(String itemUid in aggrItems) {
propValues = support.getItemPropertyValues(itemUid);
aggrItemsValues.put(itemUid, propValues);
}
int ulNmCount = rootNode.UL.history.legalNames.size();
for(int i = 0; i < ulNmCount; i++) {
if (rootNode.UL.history.legalNames[i]!=null) {
nmDateValue = rootNode.UL.history.legalNames[i].date;
nmFullValue = rootNode.UL.history.legalNames[i].full;
nmReadableValue = rootNode.UL.history.legalNames[i].readable;
nmShortValue = rootNode.UL.history.legalNames[i].short;
FindeditemUid = null;
for (String itemUid in aggrItems) {
propValues = aggrItemsValues.get(itemUid);
propValue = propValues.find {element -> element.propertyId==@[Дата внесения изменений ЕГРЮЛ].toId()};
if ((propValue!=null)&&(propValue.stringValue==nmDateValue)) {
FindeditemUid = itemUid;
aggrItems.remove(aggrItems.findIndexOf {it==itemUid});
}
}
if (FindeditemUid == null) {
FindeditemUid = postOperation.createItem("037c00c4-b8ae-4baa-b30f-64395fd5bdba");
itemValueUpdates.set(FindeditemUid, @[История наименований].toId());
}
//Получим построитель запроса на изменение значений позиции с адресом
itemAggValueUpdates = postOperation.updateItem(FindeditemUid);
//new SimpleDateFormat("yyyy-MM-dd").parse(headDateValue)
if ((nmDateValue!=null)&&(nmDateValue!=""))
itemAggValueUpdates.set(nmDateValue, @[Дата внесения изменений ЕГРЮЛ].toId());
else
itemAggValueUpdates.clear(@[Дата внесения изменений ЕГРЮЛ].toId());
if ((nmFullValue!=null)&&(nmFullValue!=""))
itemAggValueUpdates.set(nmFullValue, @[Полное наименование контрагента].toId());
else
itemAggValueUpdates.clear(@[Полное наименование контрагента].toId());
if ((nmReadableValue!=null)&&(nmReadableValue!=""))
itemAggValueUpdates.set(nmReadableValue, @[Сокращённое наименование контрагента].toId());
else
itemAggValueUpdates.clear(@[Сокращённое наименование контрагента].toId());
if ((nmShortValue!=null)&&(nmShortValue!=""))
itemAggValueUpdates.set(nmShortValue, @[Наименование контрагента].toId());
else
itemAggValueUpdates.clear(@[Наименование контрагента].toId());
}
}
//Удалим оставшиеся позиции, отсутствующие в списке
for(String itemUid in aggrItems) {
postOperation.deleteItem(itemUid);
}
aggrItems.clear();
return null;
}