Доработки системы Zoho CRM производятся на языке Deluge, разработанном самой компанией Zoho. Deluge интегрирован также в продукт Zoho Creator, но в данной статье мы рассмотрим использование языка именно в Zoho CRM.
Что такое Deluge?
Определение с сайта (перевод с сайта).
Deluge (Data Enriched Language for the Universal Grid Environment ) — это online язык программирования, который помогает добавлять различные типы бизнес-логики в произвольные функции и делать их более мощными.
Deluge и ZOHO CRM
В Zoho CRM язык Deluge используется при написании так называемой Custom function.
Custom function — это произвольная функция, которая позволяет дорабатывать поведение системы в соответствии с пожеланиями пользователей, не завязываясь на какие-то предустановленные настройки.
С чего я предлагаю начать знакомство с этим языком? На сайте компании Zoho есть много примеров его использования, но я решил привести реальный пример из своей практики. Очень простой и наглядный пример, в котором будут видны основные моменты работы с языком и демонстрация его возможностей.
Описание примера
Мы рассмотри, как создается функция, которая была реализована на одном из проектов. Функция называется Contacts Phone Validate. Задача функции состоит в том, чтобы проверять правильность заполнения пользователями номера телефона контактного лица в Zoho CRM.
Функция должна работать следующим образом:
- пользователь вводит номер телефона контактного лица в Zoho CRM
- если телефон введен в неверном формате, то система сообщает об ошибке посредством отправки электронного письма
- если ошибки в формате ввода нет — номер телефона добавляется в систему
Телефон может быть неправильным по нескольким причинам:
- Если он введен в неверном формате
- Если такой номер уже имеется в системе
Итак, рассмотрим на этом примере, как происходит создание произвольной функции в системе Zoho CRM посредством языка Deluge.
Настройка функции производится непосредственно в учетной записи пользователя Zoho CRM и доступна пользователям с правами управления рабочим процессом Workflow.
Сразу хочу обратить ваше внимание на то, что ввиду неидеальной локализации системы Zoho CRM мы будем рассматривать настройку функции на английском языке.
Добавление произвольной функции
Добавление произвольной функции включает в себя этапы:
- Программирование функции
- Связывание функции с правилом рабочего процесса Workflow Rules
Рассмотрим подробно каждый из этапов.
1. Программирование функции
Для того, чтобы запрограммировать произвольную функцию выполните следующие действия:
1. Зайдите в Setup > Automation > Workflow > Custom Function
2. На странице Custom Functions нажмите Configure Custom Function
3. Далее нажмите Write your own

4. В открывшемся окне выполните следующие действия:
- Укажите имя функции. Наша функция будет называться ContactsPhoneValidate. Далее нажмите на ссылку Edit Arguments.
- Выберите модуль системы, в котором будет действовать функция. В нашем случае это модуль Contacts. Соотнесите данные функции с именем поля или с необходимым значением в модуле CRM. В нашем примере параметром функции является contactPhone, который соответствует полю Phone в модуле Contacts.

- Нажмите Done
5. Напишите требуемую функцию в конструкторе Deluge Script.
В нашем примере функция выглядела следующим образом. Объявляем переменные:
mapVariable=map();// Создаем переменную типа Map ( https://www.zoho.com/creator/help/script/create-map.html )
errorType=""; // В переменной храним текст ошибки
Проверяем корректность формата ввода и территориальную принадлежность:
if(input.contactPhone.startsWith(("+7"))) // Проверяем на +7, номер должен быть без +
{
errorType="Формат Российского номера должен быть 7XXXXXXXXXX!";
}
else if(input.contactPhone.startsWith(("+89"))) // Проверяем на начало +89
{
errorType=("Префикс +89 запрещен в ZOHO CRM!");
}
else if(input.contactPhone.startsWith(("+84"))) // Проверяем на начало +84
{
errorType=("Префикс +84 запрещен в ZOHO CRM!"); // Сохраняем ошибку
}
else if(input.contactPhone.startsWith("7")) // Если начинается с 7 без плюса
{
if(input.contactPhone.length() != 11) // но длина не равна 11 символам
{
errorType=("Длина российского номера должна быть равна 11 символам!");
}
else
{
phoneType="RUSSIA"; // Телефон российский
}
}
else if(input.contactPhone.startsWith(("+"))) // Если имеется символ +, но без цифры 7, то номер международный
{
phoneType="INTERNATIONAL";
}
else
{
errorType="Номер телефона некорректный";
}
Проверяем на наличие ошибок:
if(errorType != "") // Если переменная не пустая - ошибки есть
{
mapVariable.put("Phone error","Неверный формат телефона");
mapVariable.put("Phone","-");
sendmail // отсылаем сообщение об ошибке на email пользователя
[
from:zoho.loginuserid
to:zoho.loginuserid
subject:"Phone format error | Неверный формат телефона"
message:"Неверный формат телефона! См. инструкцию по CRM!<br>Phone format is not correct! Look through the CRM manual!<br>Error message for phone number <b>" + input.contactPhone + "</b> is: " + errorType + "!"
content type:HTML
]
updateAccount = zoho.crm.updateRecord("Contacts",input.contactId.toString(),mapVariable); // и вносим в базу данных CRM
}
Если с номером все в порядке, то проверяем на наличие дубликатов:
else // Если на данном этапе ошибки нет
{
contactPhone=input.contactPhone.replaceAll("\D",""); // Удаляем все не цифры
if(phoneType == "INTERNATIONAL")
{
contactPhone="+" + input.contactPhone;
}
mapVariable.put("Phone",input.contactPhone);
prevRecord = zoho.crm.searchRecords("Contacts","(Phone|=|" + input.contactPhone + ")",1); // Проверяем на наличие номера в базе данных
if(prevRecord.size() > 0) // если номер существует
{
i=0;
for each account in prevRecord // проверяем принадлежит ли номер текущему контакту
{
if((((account).get("CONTACTID")).toLong() != input.contactId) && (i == 0)) // если номер не принадлежит текущему контакту
{
i=1;
mapVariable.put("Phone error","В контакте задвоен телефон!");
mapVariable.put("Phone","-");
sendmail // Высылаем информацию о том что контакт с таким телефоном существует
[
from:zoho.loginuserid
to:zoho.loginuserid
subject:"Duplicate Phone | Задвоен телефон"
message:((((((("В контакте задвоен телефон<br>Phone in Contact(" + (account).get("CONTACTID")) + ") is duplicated<br>Phone ") + (account).get("Phone")) + "<br>Owner: <a href='https://crm.zoho.com/crm/ShowSetup.do?tab=usersPermi&subTab=viewUser&userId=") + (account).get("SMOWNERID")) + "'>") + (account).get("Contact Owner")) + "</a><br>Свяжитесь с владельцем контакта"
content type:HTML
]
}
}
}
else
{
mapVariable.put("Phone error","");
}
updateAccount = zoho.crm.updateRecord("Contacts",input.contactId.toString(),mapVariable); // Обновляем данные контакта.
}
6. После написания функции необходимо проверить код. Нажмите Save and Execute Script желаете проверить работу скрипта введя значения аргументов в всплывающем окне. Если ошибок нет, ваш скрипт готов к ассоциированию с правилом рабочего процесса Workflow.

7. Нажмите Save для сохранения скрипта.

2. Связывание функции с правилом рабочего процесса Workflow Rules
Чтобы связать пользовательскую функцию с правилом рабочего процесса зайдите в Setup > Automation > Workflow Rules, далее нажмите Create Rule.
Выполните следующие действия:
1. Выберите необходимый модуль из раскрывающегося списка (в нашем случае это модуль Contacts), задайте название и описание правила.

2. В разделе Rule Trigger выберите пункт Create or Edit

3. В разделе Rule Criteria устанавливаем критерии
4. В разделе Actions выберите Call Custom Function
- Нажимите +

- На странице Configure Custom Function перейдите по ссылке Customized Functions

- Выберите необходимую ранее созданную функцию. Мы выбираем функцию СontactsPhoneValidate
5. Нажмите Save
Теперь наша функция связана с правилом рабочего процесса Workflow, и при вводе неверного формата телефона, или при дублировании номера пользователь получает сообщение об ошибке.
Заключение
Мы увидели, как с помощью языка Deluge создать в Zoho CRM функцию и как эта функция работает внутри системы. Создание функции на языке Deluge — не сложная вещь, которая позволяет дорабатывать поведение системы Zoho CRM в соответствии с вашими пожеланиями и значительно расширяет возможности программы.
Об использовании Deluge в другом продукте компании Zoho — Zoho Creator я расскажу уже в следующей статье.
Комментарии (6)
xytop
04.12.2015 19:59-1Deluge, deluge… Это же обычный Javascript (ES6)
impwx
04.12.2015 20:30Это какой-то изуродованный JS, при том, что даже обычный JS далеко не красавец. Взгляните на функцию
sendmail
— в ней отличается от остальных вызовов вообще всё: скобки, способ указания аргументов, точка с запятой после нее не ставится. Почему в некоторых местах строки и другие выражения взяты в дополнительные скобки — тоже не понятно. Надеюсь, что это небрежность автора статьи, а не требования грамматики, потому что логики я так и не нашел.
Для DSL слишком многословно, для языка общего назначения слишком… странно.JustRamil
04.12.2015 20:50У Zoho во многих местах реализации решений своя логика. Не общепринятая.Я предполагаю — это оттого что они работают внутри своей экосистемы. Это же онлайн язык и нигде кроме как в решениях ZOHO его невозможно использовать.
impwx
04.12.2015 22:36Мне тоже было интересно написать свой язык программирования, и не один. Как-то раз даже подвернулась на работе отличная возможность его использовать… Но при всей любви к детищу подумал о поддерживаемости такого решения и обо всех эпитетах, которыми меня бы наградил тот, кто будет дорабатывать софт после меня — и сдержался.
Что двигало ребятами из Zoho — загадка.
hiddenman
О, коллега, приветствую. Очень много интересного могу рассказать про все сервисы Zoho и их скрипты, написана масса всего, подводные камни все исследованы.
Все отлично там сейчас, только одна головная боль — JSON, долго я с ними воевал, но до сих пор еще слабая очень поддержка и руками приходится все парсить, аналога executeXPath до сих пор нет.