Руководство пользователя Semantic MDM
×
Меню
Индекс

Пример обогащения позиции данными, полученными из Контур.Фокус

 
Данный пример наглядно демонстрирует решение следующих задач:
Разработанный 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;
}