В начале 2015 года мною была опубликована статья про Zoho CRM, в которой я описал функционал данной системы, но не рассматривал вопросы ее доработки. Сейчас я решил рассказать о доработках подробнее, так как на практике это оказалось очень актуальным. С системой я работаю уже больше года, и ее часто приходится дорабатывать под те или иные запросы пользователей.

Доработки системы 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)


  1. hiddenman
    04.12.2015 19:00

    О, коллега, приветствую. Очень много интересного могу рассказать про все сервисы Zoho и их скрипты, написана масса всего, подводные камни все исследованы.
    Все отлично там сейчас, только одна головная боль — JSON, долго я с ними воевал, но до сих пор еще слабая очень поддержка и руками приходится все парсить, аналога executeXPath до сих пор нет.


  1. xytop
    04.12.2015 19:59
    -1

    Deluge, deluge… Это же обычный Javascript (ES6)


    1. impwx
      04.12.2015 20:30

      Это какой-то изуродованный JS, при том, что даже обычный JS далеко не красавец. Взгляните на функцию sendmail — в ней отличается от остальных вызовов вообще всё: скобки, способ указания аргументов, точка с запятой после нее не ставится. Почему в некоторых местах строки и другие выражения взяты в дополнительные скобки — тоже не понятно. Надеюсь, что это небрежность автора статьи, а не требования грамматики, потому что логики я так и не нашел.

      Для DSL слишком многословно, для языка общего назначения слишком… странно.


      1. xytop
        04.12.2015 20:43

        Да, это похоже на микс Js + CoffeeScript в одном флаконе :)


      1. JustRamil
        04.12.2015 20:50

        У Zoho во многих местах реализации решений своя логика. Не общепринятая.Я предполагаю — это оттого что они работают внутри своей экосистемы. Это же онлайн язык и нигде кроме как в решениях ZOHO его невозможно использовать.


        1. impwx
          04.12.2015 22:36

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

          Что двигало ребятами из Zoho — загадка.