Фильтры

Мне надо обрабатывать ответы от сервиса https://developer.kontur.ru/doc/focus/method?type=get&path=/api3/person…

 

[
  {
    "inn": "344304391639",
    "fio": "Иванов Сергей Владимирович",
    "birthDate": "string",
    "snils": "07089340375",
    "address": "400107, Волгоградская обл., г. Волгоград, ул. Рионская, д. 7, кв. 29",
    "stage": "Реализация имущества",
    "stageDate": "string",
    "caseNumber": "А12-5151/2020",
    "lastMessageDate": "string",
    "extrajudicialBankruptcy": {
      "status": "string",
      "startDate": "string",
      "endDate": "string",
      "reasonForTermination": "string",
      "reasonForReturn": "string"
    },
    "arbitrManager": {
      "fio": "Федорова Марина Александровна",
      "inn": "644919823200",
      "ogrn": "string"
    },
    "stages": [
      {
        "id": "5099347",
        "stage": "Реализация имущества",
        "pubDate": "string",
        "decisionDate": "string"
      }
    ],
    "messages": [
      {
        "id": "5099347",
        "messageType": "Реализация имущества",
        "pubDate": "string",
        "decision": {
          "typeId": 19,
          "typeName": "о признании гражданина банкротом и введении реализации имущества гражданина",
          "date": "string"
        },
        "annulation": {
          "messageId": "string",
          "reason": "string"
        }
      }
    ]
  }
]

Для этого мне надо создать систему объектов в CRMке.

 

Напрашивается вариант что для каждого вложенного объекта в JSON файле я создаю отдельный объект, но смущает что будет неоправданно большое количество малоиспользуемых объектов.

 

Насколько это критично?
Может дадите какие то рекомендации для решения такой задачи?

Нравится

3 комментария
Лучший ответ

Evgeniy Grigorev,

не особо критично. у меня интеграционный метод объектов 10 сохраняет из xml-ки. отрабатывает моментально (принимая во внимание, что на объектах другие обработчики/триггеры не висят)

О, контур-фокус. плавали, знаем...
Вообще чисто от вас и строения вашей системы должно зависеть сколько объектов, какие связи и как парсится json. Чисто глядя на структуру:
- должен быть объект под дело (+статус дела/мапинг между вашими статусами и статусами кф). в него даты, причины, иную инфу

- возможно деталька с сообщениями от кф по истории

- инфо по контакту соответственно сгребаем в контакт (+заполнение детали адреса контакта)

- инфо по арбитр. менеджеру тоже в контакт (можно и не создавать, там болванки с фио и инн получаются какие-то)

Варфоломеев Данила,

А насколько критично для системы добавления кучи малоиспользуемых объектов?

Evgeniy Grigorev,

не особо критично. у меня интеграционный метод объектов 10 сохраняет из xml-ки. отрабатывает моментально (принимая во внимание, что на объектах другие обработчики/триггеры не висят)

Показать все комментарии

Проблема
Изменяю название колонки или объекта(представление. а не саму колонку или объект, другими словами название), загружаю пакет на другую среду они не меняетются
Пакет кастом на другой среде пустой
Мои изменения сохраняются в изменяемый пакет
Кэш редис чистил
SysModuleEdit после сохранения актуализируется
Не знаю куда копать еще

Нравится

3 комментария

Вам нужно в привязки данных поставить признак Обязательно для обновления для поля Название вашего объекта

я правильно понял необходимо в данных нужного объекта в SysModuleEdit_SysModuleEditManager_ для 

SysModuleEntity поставить обязательное обновление?

SysModuleEdit - это таблица, которая показывает связь объекта и его страницы редактирования. Вам, полагаю, нужно ставить признак именно для объекта.

Показать все комментарии

Доброго времени суток.

С тем, как со страницы запретить редактирование полей на детали с редактируемым реестром я разобрался, то как туда же прикрутить дополнительное условие затрудняюсь. Задача следующая, нужно разрешить редактировать одно поле на детали при условии, что редактирует пользователь, указанный в поле ответственный на странице редактирования объекта, где находится деталь или ответственный, что указан в самой детали. Как донести до детали ответственного со страницы разобрался, а вот как выполнить вторую половину, не могу понять.

 

Меняю доступность поля так:
 

generateActiveRowControlsConfig: function(id, columnsConfig, rowConfig) {
    this.columnsConfig = columnsConfig;
    var gridLayoutItems = [];
    var currentColumnIndex = 0;
    this.Terrasoft.each(columnsConfig, function(columnConfig) {
        var cellConfig = this.getActiveRowCellConfig(columnConfig, currentColumnIndex);
        var columnName = columnConfig.key[0].name.bindTo;
        if (columnName === "UsrOwner") {
            cellConfig.enabled = this.$IsOwner && this.$IsNewStage; // Это атрибуты, проставляются с помощью сообщения с карточки
        }
        if (!cellConfig.hasOwnProperty("isNotFound")) {
            gridLayoutItems.push(cellConfig);
        }
        currentColumnIndex += cellConfig.layout.colSpan;
    }, this);
    this.applyBusinessRulesForActiveRow(id, gridLayoutItems);
    var viewGenerator = this.Ext.create(this.getRowViewGeneratorClassName());
    viewGenerator.viewModelClass = this;
    var gridLayoutConfig = viewGenerator.generateGridLayout({
        name: this.name,
        items: gridLayoutItems
    });
    rowConfig.push(gridLayoutConfig);
}

В строку "cellConfig.enabled = ..." нужно дописать условие, для этого нужно взять информация с записи детали. Как это можно сделать?

Нравится

4 комментария

Добрый вечер.

 

В редактируемом гриде применяются бизнес-правила, настроенные в карточке редактирования для данной детали.

Если Вы сможете настроить нужные бизнес-правила в карточке редактирования, то для редактируемого грида ничего дополнительно прописывать не нужно.

Правила работают, но, не знаю почему, отрабатывают некорректно. Например, если сравнивать поля ответственный с карточки детали и с карточки объекта, со связкой или, то почему-то на карточке детали можно редактировать поле, а в реестре нельзя. Также затирается разрешение на редактирование, что написано кодом

Есть такой баг в редактируемом реестре, что бизнес правила не работают, если сравнивать из вложенной записи (т.е. ваш случай, что в правиле пытаемся прочитать значение из родительской карточки).

 

Коллеги из террасофт обещали с этим разобраться, но воз и ныне там. Если что обращение SR-0978724

Кажется я нашел, как боролся с данным багом.

Нужно добавить в схему детали такой метод. Тогда бизнесс-правила в редактируемом реестре увидят значение из колонки родителя.

 

            getGridDataColumns: function() {
                var baseGridDataColumns = this.callParent(arguments);
                var gridDataColumns = {
                    "UsrParent.Owner": {path: "UsrParent.Owner"},
                };
                return Ext.apply(baseGridDataColumns, gridDataColumns);
            },

 

Показать все комментарии

Добрый день!

 

Пытаюсь добавить фильтр в метод loadGridData, фильтр успешно отрабатывает, показывает нужные данные, но при нажатии кнопки "Действия" - "Выбрать все" выбираются все записи, даже которые скрыты. Подскажите, как можно убрать этот эффект?

 

Мой код:

loadGridData: function() {
					this.beforeLoadGridData();
					var esq = this.getGridDataESQ();
					esq.filters.add("CurrentUser", this.Terrasoft.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.EQUAL, "Owner", Terrasoft.SysValue.CURRENT_USER_CONTACT.value));
					this.initQueryColumns(esq);
					this.initQuerySorting(esq);
					this.initQueryFilters(esq);
					this.initQueryOptions(esq);
					this.initQueryEvents(esq);
					esq.getEntityCollection(function(response) {
						this.destroyQueryEvents(esq);
						this.updateLoadedGridData(response, this.onGridDataLoaded, this);
						this.checkNotFoundColumns(response);
					}, this);
				}

 

Скриншот проблемы:

 

Нравится

6 комментариев
Лучший ответ

Попробуйте решить свою задачу другим способом:

Заместить метод getFilters, добавив в него еще свой кастомный фильтр, а loadGridData не трогать

            getFilters: function() {
                var filters = this.callParent(arguments);
                return this.initCustomSectionFilters(filters);
            },

initCustomSectionFilters(filters) {
                filters.add("CurrentUser", this.Terrasoft.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.EQUAL, "Owner", Terrasoft.SysValue.CURRENT_USER_CONTACT.value));    
                return filters;
            }

Попробуйте решить свою задачу другим способом:

Заместить метод getFilters, добавив в него еще свой кастомный фильтр, а loadGridData не трогать

            getFilters: function() {
                var filters = this.callParent(arguments);
                return this.initCustomSectionFilters(filters);
            },

initCustomSectionFilters(filters) {
                filters.add("CurrentUser", this.Terrasoft.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.EQUAL, "Owner", Terrasoft.SysValue.CURRENT_USER_CONTACT.value));    
                return filters;
            }

Трефилов Павел Сергеевич,

спасибо! это то, что нужно

 

А можете еще подсказать, если аналогично для мобильного приложения делать, то нужно реализовывать подобное и в клиентском модуле реестра мобильного приложения?

Роман Сидаш,

про мобильное приложение к сожалению не подскажу, мы не делали такой доработки. Но вероятно есть похожие методы, нужно смотреть модуль для приложения.

Роман Сидаш,

Что касается мобильного приложения, то там логика работы фильтров немного иная. Для понимания наведу пример кастомного мобильного фильтра на раздел контрагенты:

Ext.define('Ext.Terrasoft.ListLogicalFilter', {
 
    extend: 'Terrasoft.controls.BaseFilterModule',
 
    xtype: 'tslistlogicalfilter',
 
    config: {
        columnName: null,
        title: null,
        compareType: null,
        checked: false,
        component: {
            xtype: 'tscheckbox',
            checked: false,
            style: 'margin-top: 10px;'
        }
    },
 
    initialize: function() {
        Ext.apply(this.config.component, {
            label: this.initialConfig.title
        });
        this.callParent(arguments);
        var component = this.getComponent();
        component.setChecked(this.getChecked());
        component.on('check', this.execute, this);
        component.on('uncheck', this.execute, this);
    },
 
    getFilter: function() {
        var component = this.getComponent();
        if (!component.config) {
            return null;
        }
        var value = component.getChecked();
        if (value === true) {
            var compareType = this.getCompareType() || Terrasoft.ComparisonTypes.Equal;
            return Ext.create('Terrasoft.Filter', {
                property: this.getColumnName(),
                compareType: compareType,
                valueIsMacros: true,
                value: Terrasoft.ValueMacros.CurrentUserContactId
            });
        }
        return null;
    }
 
});
Terrasoft.sdk.GridPage.setAdditionalFilterModule('Account', {
    type: 'tslistlogicalfilter',
    columnName: 'Owner',
    compareType: Terrasoft.ComparisonTypes.Equal,
    title: 'Мои account',
    checked: true
});

После его добавления при открытии списка контрагентов данный фильтр будет автоматически применён.
Ярким примером подобных фильтров является фильтр на период в активности. Если необходимо реализовать логику применения своего фильтра, то рекомендую ознакомится с кодом схемы MobileActivityGridPageControllerV2 пакета Mobile и тоё его части, что отвечает за PeriodFilter. Там описана логика его инициализации, смены значения и прочее.

Дима Вовченко,

спасибо!

Подскажите, а в Вашем примере кода для чего нужна секция "config", вернее свойства его, которые равны null?

Роман Сидаш,

Давно писал код и точно сказать не могу, насколько помню, пытался реализовать применение фильтра по нажатию на чек-бокс и 

config нужен для него. Однако, с ним не срослось и фильтр всегда применялся автоматом при старте страницы.

Показать все комментарии

Добрый день. Есть некоторые дорабоки которые находятся в пакете custom на стенде dev. Подскажите пожалуйста, каким образом, безболезненно для системы, мы можем перенести пакеты на продакшн версию? Спасибо.

Нравится

2 комментария
Лучший ответ

Здравствуйте.

Если Вы знаете, в каких сервисах и какие доработки выполнялись, то можно выполнить только перенос нужных сервисов. Если есть привязки с данными, то их можно перенести sql-запросами.

На будущее, если планируете дорабатывать что-то ещё, лучше будет создать свой пакет, выполнить соответствующую настройку, чтобы изменения из мастеров деталей и разделов попадали в Ваш пакет, а не в Custom и переносить обновления через выгрузку пакетов, как рекомендует Алексей.

Создать свой пакет, перенести туда все доработки. Экспортировать пакет в ZIP и установить его на продакшн.

Здравствуйте.

Если Вы знаете, в каких сервисах и какие доработки выполнялись, то можно выполнить только перенос нужных сервисов. Если есть привязки с данными, то их можно перенести sql-запросами.

На будущее, если планируете дорабатывать что-то ещё, лучше будет создать свой пакет, выполнить соответствующую настройку, чтобы изменения из мастеров деталей и разделов попадали в Ваш пакет, а не в Custom и переносить обновления через выгрузку пакетов, как рекомендует Алексей.

Показать все комментарии