Jump to content

Процессы в SuiteCRM: Связь между двумя добавляемыми записями


Recommended Posts

Всем привет!

Хочу показать мой вариант решения следующей проблемы:

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

  1. Запись в модуле "Обращения"
  2. Запись в модуле "Документы"

Но вся сложность заключается в том, что и Обращение и Документ должны не просто добавиться в Контрагент, но и между собой сформировать связь. То есть зайдя потом в карточку созданного Обращения мы должны увидеть в сабпанели созданный Документ!

Если очень упрощенно, то мой бизнес-процесс выглядит так:

2018-06-01_16-57-10.thumb.png.de07167365bad05d390ede26b788b0ad.png

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

Но вот Обращение с Документом между собой никак не хотели связываться! Как я не тестировал, что не пробовал, но без доработки CRM-системы чисто имеющимися средствами эту задачу решить не получилось.

Я пожалуй не буду утомлять рассуждениями на тему "что же тут делать и как я пришел к конечному результату", а просто опишу то, что в итоге было сделано в CRM-системе, что позволило решить эту задачу:

1. Первое: Добавляем в модуль Контрагенты два новых поля:

custom/Extension/modules/Accounts/Ext/Vardefs/custom_fields.tmp.php:

<?php
$dictionary['Account']['fields']['tmp_document_id'] = array (
	'required' => false,
	'name' => 'tmp_document_id',
	'vname' => 'LBL_TMP_DOCUMENT_ID',
	'type' => 'id',
	'massupdate' => 0,
	'no_default' => false,
	'comments' => '',
	'help' => '',
	'importable' => 'true',
	'duplicate_merge' => 'disabled',
	'duplicate_merge_dom_value' => 0,
	'audited' => false,
	'inline_edit' => true,
	'reportable' => false,
	'unified_search' => false,
	'merge_filter' => 'disabled',
	'len' => 36,
	'size' => '20',
	'source' => 'non-db',
);

$dictionary['Account']['fields']['tmp_document'] = array (
	'required' => false,
	'source' => 'non-db',
	'name' => 'tmp_document',
	'vname' => 'LBL_TMP_DOCUMENT',
	'type' => 'relate',
	'massupdate' => 1,
	'no_default' => false,
	'comments' => '',
	'help' => '',
	'importable' => 'true',
	'duplicate_merge' => 'disabled',
	'duplicate_merge_dom_value' => '0',
	'audited' => false,
	'inline_edit' => true,
	'reportable' => true,
	'unified_search' => false,
	'merge_filter' => 'disabled',
	'len' => '255',
	'size' => '20',
	'id_name' => 'tmp_document_id',
	'ext2' => 'Documents',
	'module' => 'Documents',
	'rname' => 'name',
	'quicksearch' => 'enabled',
	'studio' => 'visible',
);
$dictionary['Account']['fields']['tmp_case_id'] = array (
	'required' => false,
	'name' => 'tmp_case_id',
	'vname' => 'LBL_TMP_CASE_ID',
	'type' => 'id',
	'massupdate' => 0,
	'no_default' => false,
	'comments' => '',
	'help' => '',
	'importable' => 'true',
	'duplicate_merge' => 'disabled',
	'duplicate_merge_dom_value' => 0,
	'audited' => false,
	'inline_edit' => true,
	'reportable' => false,
	'unified_search' => false,
	'merge_filter' => 'disabled',
	'len' => 36,
	'size' => '20',
	'source' => 'non-db',
);

$dictionary['Account']['fields']['tmp_case'] = array (
	'required' => false,
	'source' => 'non-db',
	'name' => 'tmp_case',
	'vname' => 'LBL_TMP_CASE',
	'type' => 'relate',
	'massupdate' => 1,
	'no_default' => false,
	'comments' => '',
	'help' => '',
	'importable' => 'true',
	'duplicate_merge' => 'disabled',
	'duplicate_merge_dom_value' => '0',
	'audited' => false,
	'inline_edit' => true,
	'reportable' => true,
	'unified_search' => false,
	'merge_filter' => 'disabled',
	'len' => '255',
	'size' => '20',
	'id_name' => 'tmp_case_id',
	'ext2' => 'Cases',
	'module' => 'Cases',
	'rname' => 'name',
	'quicksearch' => 'enabled',
	'studio' => 'visible',
);

custom/Extension/modules/Accounts/Ext/Language/ru_RU.TMP.php:

<?php

$mod_strings['LBL_TMP_DOCUMENT'] = 'TMP.DOCUMENT';
$mod_strings['LBL_TMP_DOCUMENT_ID'] = 'TMP.DOCUMENT_ID';
$mod_strings['LBL_TMP_CASE'] = 'TMP.CASE';
$mod_strings['LBL_TMP_CASE_ID'] = 'TMP.CASE_ID';

Обращаю ваше внимание на то, что данные поля имеют параметр 'source' => 'non-db', что говорит о том, что эти поля исключительно расчетные, и не хранят значения в базе данных.

2. Второе. Добавляю Hook на добавление связи Контрагента с чем-либо:

custom/Extension/modules/Accounts/Ext/LogicHooks/tmp.hooks.php:

<?php

$hook_array['after_relationship_add'][] = Array(
    10,
    'TMP Fields',
    'custom/modules/Accounts/TMPLogicHooks.php',
    'TMPLogicHooks',
    'setTMPFields'
);

custom/modules/Accounts/TMPLogicHooks.php:

<?php
/**
 * Created by PhpStorm.
 * User: crmhosting
 * Date: 01.06.2018
 * Time: 15:52
 */

class TMPLogicHooks {

    /**
     * Заполняем временные поля значениями
     * @param $bean
     * @param $event
     * @param $arguments
     */
    function setTMPFields($bean, $event, $arguments) {

        if($arguments['module'] == 'Accounts' AND $arguments['related_module'] == 'Cases') {
            // Если сейчас связь Контрагента и Обращения
            $bean->tmp_case_id = $arguments['related_bean']->id;
        }
        elseif ($arguments['module'] == 'Accounts' AND $arguments['related_module'] == 'Documents') {
            // Если сейчас связь Контрагента и Документа
            $bean->tmp_document_id = $arguments['related_bean']->id;
        }


    }

}

Таким образом мы во время связи Контрагента с Обращением или Документом заполняем наши вспомогательные поля.

3. Третье. Делаем быстрое восстановление.

Чтобы в системе применились все добавленные поля и хуки.

4. Четвертое. В Бизнес-процессе в действии добавления Документа указываем связь с Обращением через нашу переменную  tmp_case_id:

Вот как теперь будет выглядеть бизнес-процесс:

2018-06-01_17-08-50.thumb.png.211a976dcd298e89105e0458f861af29.png

После срабатывания такого бизнес-процесса у создаваемого обращения появляется прямая связь с создаваемым документом. Что нам и было нужно.

 

Давайте теперь немного объясню что же у нас получилось:

  • Мы в Контрагенте создали пару полей. Но не простых, а типа relate - это когда в текущем модуле есть связь с записью в другом модул
  • Мы в Контрагенты добавили хук after_relationship_add, который будет срабатывать каждый раз, когда к Контрагенту будет добавляться связь с записью другого модуля
  • В момент, когда срабатывает бизнес-процесс, в первую очередь создается Обращение, а затем добавляется связь этого обращения с Контрагентом, что приводит к срабатыванию нашего хука
  • Внутри хука мы видим, что добавляется связь Контрагента и Обращения. Мы добавляем в поле Контрагента tmp_case_id айди созданного и добавляемого Обращения
  • Все, Обращение создано и привязано к Контрагенту
  • Далее по бизнес-процессу создается Документ
  • Документ мало того, что привязывается к Контрагенту, так мы в бизнес-процессе еще прописали ему некую связь с Обращениями, и указали, что связать он должен по полю TMP.CASE (а это как раз наше поле tmp_case_id, которое мы заполнили в прошлый раз, когда добавляли связь с Обращением)
  • Таким образом создаваемый документ связывается с ранее созданным Обращением.
  • Ну и связь двухсторонняя: если привязали Документ к Обращению, значит и Обращение привязано к Документу.
  • Profit!

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

 

Link to comment
Share on other sites

  • 1 year later...

Здравствуйте Уважаемые форумчане
У меня есть 2 контроллера, которые необходимо связать по ISO on TCP, а именно 315-2dp и 315-2pn/dp. Через нетпро не выходит, т.к. последний не выносит подобные фокусы. Он поддерживает только S7-connection через нетпро. Зато он может общаться через ISO on TCP, используя FB TCON, FB TSEND, FB TRCV,FB TDISCON. При этом в нетпро ничего не делается. В то же время 315-2dp, на сколько я понял, не может использовать эти FB. На 315-2dp я пытался проделывать соединение через эти ФБ, но после FB TCON в статусе его пишет сообщение W#16#17A, а на 315-2pn/dp пишет W#16#7002, при чем и там и там BUSY=true. W#16#7002 - ошибка, а вот W#16#17A хрен его пойми что такое значит. DB для этого дела конфигурировал с помощью OC Wizard. В гугле ничего путнего не нашел.
Может кто-нибудь сталкивался с подобной проблемой?
Всем за ранее спасибо.

С наступающем новым годом Вас всех.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...