Публикация

Краткая инструкция по фичам с датами.

Пример кода условного потока, который проверяет, что «дата изменения средства связи» меньше или равно 90 дн.

(DateTime.Now.Subtract([#Читать средство связи Физ.лица.Первый элемент результирующей коллекции.Дата изменения#])).TotalDays <= 90 

DateTime.Now = это эквивалент [#Системная переменная.Текущее значение даты и времени#]

То есть, запись может быть и:

(([#Системная переменная.Текущее значение даты и времени#]).Subtract([#Читать средство связи Физ.лица.Первый элемент результирующей коллекции.Дата изменения#])).TotalDays <= 90

Пояснения

Метод Subtract работает так: ДатаВремя1. Subtract(ДатаВремя2) возвращает временной интервал равный ДатаВремя1 - ДатаВремя2.

Временной интервал содержит следующие свойства, доступные через точку ((предположим интервал составляет 1 день 12 часов 15 минут 20 секунд)):

2.1.

ДатаВремя1. Subtract(ДатаВремя2).Days – целое количество дней = 1

2.2.

ДатаВремя1. Subtract(ДатаВремя2).TotalDays – дробное количество дней ~ 1.5…

2.3.

ДатаВремя1. Subtract(ДатаВремя2).Hours – количество часов = 12

2.4.

ДатаВремя1. Subtract(ДатаВремя2).TotalHours – общее дробное количество часов ~ 36.25…

2.5.

ДатаВремя1. Subtract(ДатаВремя2).Minutes – количество минут = 15

2.6.

ДатаВремя1. Subtract(ДатаВремя2).TotalMinutes – общее дробное количество минут ~ 2160.33

2.7.

Аналогично для Seconds и Milliseconds

Проверка дня недели:

ДатаВремя1.DayOfWeek.

Например: проверим четверг сегодня или нет:

[#Системная переменная.Текущее значение даты#]).DayOfWeek == DayOfWeek.Thursday 

Добавить (вычесть) время

ДатаВремя1.AddDays(2).

Возвращает ДатаВремя1 + 2 дня.

(Аналогично Add.Seconds(N)/Minutes(N)/Hours()/Months()/Years().

Если указать отрицательное число, то ДатаВремя1 уменьшится на заданное значение (ДатаВремя1.AddHours(-5) = отнять 5 часов).

Другие возможности типа данных DateTime:

https://msdn.microsoft.com/ru-ru/library/system.datetime(v=vs.110).aspx

Нравится

Поделиться

1 комментарий

Подскажите. Почему выдает ошибку этот код?

[#System variable.Current Date#].DayOfWeek == DayOfWeek.Thursday

 

Показать все комментарии
Публикация
//Добавляем в методы
methods: {
    //TODO: Изначальная инициализация
    tabRender: function(tabObject) {
        //TODO
    },
    subscribeForEvents: function() {
        this.on("change:UsrType", this.changeTabsVisibility.bind(this)); //UsrType - поле, по которому будут скрываться вкладки
    },
    changeTabsVisibility: function() {
        var usrType = this.get("UsrType") || {}; //"UsrType" - поле, по которому будут скрываться вкладки
        switch(usrType.value) {
            case "933b3812-4882-484f-9ba7-37b272443f36": //id одного из состояний из поля UsrType
                this.hideTabByName( "Tab98e9ceedTabLabel", true ); //Имя нужной вкладки, в diff выглядит так "name": "Tab98e9ceedTabLabel",
                this.hideTabByName( "Tabc65f2ae2TabLabel", true ); //Имя нужной вкладки. Та, что true будет скрыта
                this.hideTabByName( "Tabfcd67f08TabLabel", false ); //Имя нужной вкладки. Та, что false будет отображаться
                break;
            case "49bbaa75-dfdd-4de5-a2fa-4d9b2ba54b96": //id одного из состояний из поля UsrType
                case "8daf0d76-5522-4444-843d-54f05bae3ad9": //id одного из состояний из поля UsrType
                    this.hideTabByName( "Tabfcd67f08TabLabel", true ); //Имя нужной вкладки
                    this.hideTabByName( "Tabc65f2ae2TabLabel", true ); //Имя нужной вкладки
                    this.hideTabByName( "Tab98e9ceedTabLabel", false ); //Имя нужной вкладки
                    break;
                case "b74416cd-ae95-4e6c-b7f9-fc80dcbcf7af": //id одного из состояний из поля UsrType
                    this.hideTabByName( "Tabfcd67f08TabLabel", true ); //Имя нужной вкладки
                    this.hideTabByName( "Tab98e9ceedTabLabel", true ); //Имя нужной вкладки
                    this.hideTabByName( "Tabc65f2ae2TabLabel", false ); //Имя нужной вкладки
                    break;
                default: //Если состояние не указано
                    this.hideTabByName( "Tabfcd67f08TabLabel", false ); //Имя нужной вкладки
                    this.hideTabByName( "Tab98e9ceedTabLabel", false ); //Имя нужной вкладки
                    this.hideTabByName( "Tabc65f2ae2TabLabel", false ); //Имя нужной вкладки
        }
    },
    init: function() {
        this.callParent(arguments);
        this.subscribeForEvents();
    },
    hideTabByName: function(tabName, isHide){
        var tabsCollection = this.get("TabsCollection");
        if(tabsCollection){
            var tabIndex = tabsCollection.collection.keys.indexOf(tabName);
            var tabsPanelDomElement = document.getElementById("ActivityPageV2TabsTabPanel-tabpanel-items"); // Вместо "ActivityPageV2..." в этой строке подставьте своё)
            if(tabsPanelDomElement){
                tabDomElement = tabsPanelDomElement.querySelector('[data-item-index="'+tabIndex.toString()+'"]');
                if(tabDomElement){
                    if(isHide){
                        tabDomElement.style.display = "none";
                    }else{
                        tabDomElement.style.display = null;
                    }
                }
            }    
        }
    }
},

 

Нравится

Поделиться

0 комментариев
Показать все комментарии
"caption": {
    "bindTo": "Resources.Strings.SchemaLocalizableString4"  //Strings.SchemaLocalizableString4 - это строка, которую мы добавили
},

 

Нравится

Поделиться

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

1. Сначала создаем параметр в который будем записывать строку: ProcessSchemaParameter1

2. Создаем параметр в который будем записывать конечную строку (можно записывать в тот же параметр)

3. Выбираем в БП элемент "задание-сценарий". Копируем туда код.

String value = Get<string>("ProcessSchemaParameter1");// читаем параметр и записываем его значение в "value"
int startIndex = 2; //с какого символа по порядку начинать "вытягивать" 0 - с самого начала строки, то есть первый символ, 1 - 2й символ и тд.
      int length = 3;// к-во символов которое нам необходимо вытянуть. ПРИМЕР: слово "Синхрофазатрон". Если использовать этот код без изменений, то на выходе получим "нхр"(н-3я буква, от нее еще 3 символа)
      String substring = value.Substring(startIndex, length);
      Set("ProcessSchemaParameter1", substring);// в какой параметр записываем конечную строку
return true;

 

Нравится

Поделиться

0 комментариев
Показать все комментарии
IF NOT EXISTS (
 
    SELECT 1 FROM sys.columns
 
    WHERE [Name] = N'TIME_ZONE_ID'
 
    AND [Object_ID] =
Object_ID(N'[dbo].[QRTZ_SIMPROP_TRIGGERS]')
 
)
 
BEGIN
 
    ALTER TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] ADD [TIME_ZONE_ID]
[NVARCHAR] (80);
 
END;  

 

Нравится

Поделиться

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

1. Добавить в конфигураторе в Custom - действие процесса

Заголовок: Звонок в CTI-панель

Название:UsrCtiPanelCallUserTask

Скрипт:

var message = "{\"number\": \"" + PhoneNumber + "\"}";
MsgChannelUtilities.PostMessage(UserConnection, "CtiPanelCallFromProcess", message);
return true;

Добавить в этом же юзер таске параметр

Название: PhoneNumber

Подпись: Номер телефона

Тип данных: строка

И добавить два Usings

    Terrasoft.Configuration
    Terrasoft.Core.Factories

2. Добавить  в конфигураторе в Custom - замещающий клиентский модуль

Родительский обьект: ClientMessageBridge

Скоприровать Название в Заголовок.

Сохранить

Вставить код:

define("ClientMessageBridge", [], function() {
    return {
        messages: {
            "CallCustomer": {
                "mode": Terrasoft.MessageMode.PTP,
                "direction": Terrasoft.MessageDirectionType.PUBLISH
            }
        },
        methods: {
            init: function() {
                this.callParent(arguments);
                this.addMessageConfig({
                    sender: "CtiPanelCallFromProcess",
                    messageName: "CallCustomer"
                });
            },
            beforePublishMessage: function(sandboxMessageName, webSocketBody) {
                if (sandboxMessageName === "CallCustomer") {
                    // Здесь вставить дополнительный код, который будет выполняться перед звонком
                }
            },
            afterPublishMessage: function(sandboxMessageName, webSocketBody) {
                if (sandboxMessageName === "CallCustomer") {
                    // Здесь вставить дополнительный код, который будет выполняться после звонка
                }
            }
        }
    };
});

Сохранить

3. После конфигуратора в БП добавляем блок "Выполнить действие процесса", где выбираем: Звонок в CTI-панель

Указываем в параметре номер телефона для звонка.

Нравится

Поделиться

0 комментариев
Показать все комментарии
define('ContactPage', ['terrasoft', 'Contact', 'ContactPageStructure', 'ContactPageResources'],
    function(Terrasoft, Contact, structure, resources) {
    structure.userCode = function() {
        var account;
        var accountPhone;
        var groupIndex = 0;
        var itemIndex = 0;
        var group = this.schema.leftPanel[groupIndex];
        var item = group.items[itemIndex];
        //перебором ищем нужный контрол по имени
        while (item.name !== 'Account') {
            if (itemIndex === group.items.length - 1) {
                groupIndex++;
                itemIndex = -1;
                group = this.schema.leftPanel[groupIndex];
            }
            itemIndex++;
            item = this.schema.leftPanel[groupIndex].items[itemIndex];
        }
        //пушим новую виртуальную колонку номера контрагента
        this.schema.leftPanel[groupIndex].items.push({
            type: Terrasoft.ViewModelSchemaItem.ATTRIBUTE,
            caption: "Account Phone",
            columnType: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
            name: 'AccountPhone',
            dataValueType: Terrasoft.DataValueType.TEXT,
            visible: true,
            customConfig: {
                enabled: false
            },
            dependencies: ['Account'],
            methodName: 'onAccountChange'
        });
        //описываем выборку из базы значения номера телефона по Id текущего контрагента
        //и заполняем добавленную виртуальную колонку
        var baseOnAccountChange = this.methods.onAccountChange;
        this.methods.onAccountChange = function() {
            if (Ext.isFunction(baseOnAccountChange)) {
                baseOnAccountChange.call(this);
            }
            account = this.get('Account');
            var esq = Ext.create('Terrasoft.EntitySchemaQuery', {
                rootSchemaName: 'Account'
            });
            esq.rowCount = 1;
            esq.addColumn('Id');
            esq.addColumn('Name');
            esq.addColumn('Phone');
            esq.getEntity(account.value, function(result) {
                var entity = result.entity;
                accountPhone = entity.get('Phone');
                this.set('AccountPhone', accountPhone);
            }, this);
        };
        //вызываем функцию заполнения колонки при первичной загрузке страницы
        var childOnAccountChange = this.methods.onAccountChange;
        var baseInit = this.methods.init;
        this.methods.init = function() {
            if (Ext.isFunction(baseInit)) {
                baseInit.call(this);
            }
            childOnAccountChange.call(this);
        };
    };
    return structure;
});

 

Нравится

Поделиться

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

Добавляем действие перехода к контакту на деталь «Карьера контакта»

Чтобы добавить кнопку «Перейти к контакту» необходимо реализовать несложный замещающий модуль страницы детали «Деталь карьера контакта».

define('ContactCareerDetail', ['terrasoft', 'ContactCareer', 'ContactCareerDetailStructure',
'ContactCareerDetailResources'],
function(Terrasoft, ContactCareer, structure, resources) {
    structure.userCode = function() {
        //в этом методе можно работать со списком действий детали
        this.modifyUtilsButton = function(utilsButton) {
            //получаем список действий
            var utilsMenuItems = utilsButton.menu.items;
            //добавляем новый пункт в начало списка
            utilsMenuItems.unshift(actionGoToContact);
            return utilsButton;
        };
        var actionGoToContact = {
            caption: resources.localizableStrings.GoToContact,
            click: {
                bindTo: 'goToContact'
            },
            enabled: {
                bindTo: 'isAnySelected'
            }
        };
        this.methods.goToContact = function() {
            var selectedRows = this.GetSelectedItems();
            if (Ext.isEmpty(selectedRows)) {
                return;
            }
            var viewModel = this;
            var cardSchemaName;
            var moduleStructure = Terrasoft.configuration.ModuleStructure.Contact;
            var config = Terrasoft.configuration.EntityStructure[this.entitySchema.columns.Contact.name];
            if (config) {
                cardSchemaName = config.pages[0].cardSchema;
            }
            var gridData = this.get('gridData');
            var contactId;
            gridData.collection.items.forEach( function(item) {
                if (item.values.Id == selectedRows[0]) {
                    contactId = item.values.Contact.value;
                }
            });
            if (contactId) {
                var token = moduleStructure.cardModule + '/' + cardSchemaName + '/view/' + contactId;
                Terrasoft.Router.pushState(null, null, token);
            }
            else {
                return;
            }
        };
    };
return structure;
});

 

Нравится

Поделиться

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

Добрый день!

Есть вопрос следующего характера: "демо версия базы и рабочая версия отличается только количеством возможных записей?"
Есть возможность дать Вам базу, что бы Вы поменяли параметр возможных записей, либо мы это сможет сделать сами?

Заранее благодарю за ответ!

Нравится

1 комментарий

Светлана, для реализации возможности увеличения ограничений по записям в демо версии, прошу обращаться в Службу поддержки Террасофт.

Более подробную информацию, я отправил вашему коллеге Уханову Егоур Андреевичу.

С уважением,
Белецкий Арсений
Группа компаний Terrasoft

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