КП: Запуск бизнес-процесса из письма

КП: Запуск бизнес-процесса из письма

1233
27.01.2014

Необходимо при поступлении нового письма на соответствующий e-mail, заведенный в корпортале создавать задачу пользователю на обработку данных из письма, а также запускать соответствующий бизнес-процесс. 

В продолжение  предыдущего поста  новая задача. 

Итак, задача: 

Необходимо при поступлении нового письма на соответствующий e-mail, заведенный в корпортале создавать задачу пользователю на обработку данных из письма, а также запускать соответствующий бизнес-процесс. 

Решение. 

Создаем для данного письма ручное правило. Прописываем php-код: 

if (CModule::IncludeModule("tasks")) {
   $from = CMailUtil::ExtractMailAddress($arMessageFields['FIELD_FROM']);

   $USER_GROUP = array(ИД группы пользователей для обработки);

   $UFilter = array("ACTIVE" => "Y","GROUPS_ID" => $USER_GROUP);
   $sort_by = "ID";
   $sort_ord = "ASC";
   $dbUsers = CUser::GetList($sort_by, $sort_ord, $UFilter);
   while ($arUser = $dbUsers->Fetch()) {
      $USERS_for_TASK[] = $arUser["ID"];
   }

   if(count($USERS_for_TASK)>0){
      $arFields = Array(
         "TITLE"          => $from.': Обработать письмо от '.date('d.m.Y H:i:s') ,
         "DESCRIPTION"    => $arMessageFields['TITLE'].$arMessageFields['BODY'],
         "RESPONSIBLE_ID" => $USERS_for_TASK[0],
         "STATUS"         => 2,
         "CREATED_BY"     => $USERS_for_TASK[0]
      );

      $obTask = new CTasks;
      $ID = $obTask->Add($arFields);
      $success = ($ID > 0);

      if ($success) {
         if (count($USERS_for_TASK) > 1) {
            $Accomplices = $USERS_for_TASK;
            unset($Accomplices[0]);
            CTasks::AddAccomplices($ID, $Accomplices);

         }

         //добавляем к задаче вложения
         $dbr_attach = CMailAttachment::GetList(Array("NAME" => "ASC", "ID" => "ASC"), Array("MESSAGE_ID" => $arMessageFields['ID']));
         while ($dbr_attach_arr = $dbr_attach->GetNext()) {
            if ($dbr_attach_arr["FILE_NAME"]=='1.tmp' ||
               preg_match_all('/\\.(?:exe|html|phtml|pl|js|htm|py|php|php4|php3|phtml|shtml)$/i', 
                                $dbr_attach_arr["FILE_NAME"], $p_matches, PREG_PATTERN_ORDER))
               continue;
            $attach_id = $dbr_attach_arr["ID"];
            $dbr = CMailAttachment::GetByID($attach_id);
            if($dbr_arr = $dbr->Fetch())
            {
               $fname =  $_SERVER['DOCUMENT_ROOT']."/upload/from_mail/".$dbr_attach_arr["FILE_NAME"];
               $handle = fopen($fname, 'wb');
               fwrite($handle, $dbr_arr["FILE_DATA"]);
               fclose($handle);
               $arFile = CFile::MakeFileArray($fname);
               $arFile["old_file"] = "";
               $arFile["del"] = "Y";
               $arFile["MODULE_ID"] = "tasks";
               $fid[] = CFile::SaveFile($arFile, "tasks");
            }
         }

         CTasks::AddFiles($ID, $fid);


         if(CModule::IncludeModule("im")){
            foreach ($USERS_for_TASK as $taskUser) {
               $TaskLink = $_SERVER['HTTP_HOST'].'/company/personal/user/' . $taskUser . '/tasks/task/view/' . $ID . '/';
               $arMessageFields = array(
                  "TO_USER_ID"     => $taskUser, // получатель
                  "FROM_USER_ID"   => 0, // отправитель (может быть >0)
                  "NOTIFY_TYPE"    => IM_NOTIFY_SYSTEM, // тип уведомления
                  "NOTIFY_MODULE"  => "tasks", // модуль запросивший отправку уведомления
                  "NOTIFY_TAG"     => "FAX-TASKS", 
                    // символьный тэг для группировки (будет выведено только одно сообщение), 
                    // если это не требуется - не задаем параметр
                    // текст уведомления на сайте (доступен html и бб-коды)
                  "NOTIFY_MESSAGE" => '[b]Внимание:[/b] получен новый заказ с сайта. Для просмотра перейдите по <a
        href="' . $TaskLink . '">ссылке</a>',
               );
               CIMNotify::Add($arMessageFields);
            }
         }


         if(
            CModule::IncludeModule("bizproc")
            &&
            CModule::IncludeModule("iblock")
         ){
            $arErrorsTmp = array();


            $el = new CIBlockElement;

            $PROP = array();

            $arLoadProductArray = Array(
               "MODIFIED_BY"    => $taskUser, 
               "IBLOCK_SECTION_ID" => false, 
               "IBLOCK_ID"      => ИД_инфоблока_с_бизнес-процессом,
               "PROPERTY_VALUES"=> $PROP,
               "NAME"           => $from.': Обработать письмо '.date('d.m.Y H:i:s'),
               "ACTIVE"         => "Y", 
               "PREVIEW_TEXT"   => $arMessageFields['TITLE'].$arMessageFields['BODY'],
            );

            if($PRODUCT_ID = $el->Add($arLoadProductArray)){
               $arWorkflowParameters = array('TaskID'=>$ID);
               $wfId = CBPDocument::StartWorkflow(
                  ИД_шаблона_инфоблока,
                  array("bizproc", "CBPVirtualDocument", $PRODUCT_ID),
                  array_merge($arWorkflowParameters, array("TargetUser" => "user_".$taskUser)),
                  $arErrorsTmp
               );
            } else {
               $arErrorsTmp[] = "Error: ".$el->LAST_ERROR;
            }

            if (count($arErrorsTmp) > 0)
            {
               foreach ($arErrorsTmp as $e)
                  $errorMessage .= "[".$e["code"]."] ".$e["message"]."";

               $arMessageFields = array(
                  "TO_USER_ID"     => $taskUser, // получатель
                  "FROM_USER_ID"   => 0, // отправитель (может быть >0)
                  "NOTIFY_TYPE"    => IM_NOTIFY_SYSTEM, // тип уведомления
                  "NOTIFY_MODULE"  => "tasks", // модуль запросивший отправку уведомления
                  "NOTIFY_TAG"     => "FAX-TASKS", // символьный тэг для группировки (будет выведено только одно сообщение),
                                                   //если это не требуется - не задаем параметр
                                                   // текст уведомления на сайте (доступен html и бб-коды)
                  "NOTIFY_MESSAGE" => 'ERROR: '.$errorMessage,
               );
               CIMNotify::Add($arMessageFields);
            }
         }
      }

   }
}
			 if (CModule::IncludeModule("tasks")) {    $from = CMailUtil::ExtractMailAddress($arMessageFields['FIELD_FROM']);    $USER_GROUP = array(ИД группы пользователей для обработки);    $UFilter = array("ACTIVE" => "Y","GROUPS_ID" => $USER_GROUP);    $sort_by = "ID";    $sort_ord = "ASC";    $dbUsers = CUser::GetList($sort_by, $sort_ord, $UFilter);    while ($arUser = $dbUsers->Fetch()) {       $USERS_for_TASK[] = $arUser["ID"];    }    if(count($USERS_for_TASK)>0){       $arFields = Array(          "TITLE"          => $from.': Обработать письмо от '.date('d.m.Y H:i:s') ,          "DESCRIPTION"    => $arMessageFields['TITLE'].$arMessageFields['BODY'],          "RESPONSIBLE_ID" => $USERS_for_TASK[0],          "STATUS"         => 2,          "CREATED_BY"     => $USERS_for_TASK[0]       );       $obTask = new CTasks;       $ID = $obTask->Add($arFields);       $success = ($ID > 0);       if ($success) {          if (count($USERS_for_TASK) > 1) {             $Accomplices = $USERS_for_TASK;             unset($Accomplices[0]);             CTasks::AddAccomplices($ID, $Accomplices);          }          //добавляем к задаче вложения          $dbr_attach = CMailAttachment::GetList(Array("NAME" => "ASC", "ID" => "ASC"), Array("MESSAGE_ID" => $arMessageFields['ID']));          while ($dbr_attach_arr = $dbr_attach->GetNext()) {             if ($dbr_attach_arr["FILE_NAME"]=='1.tmp' ||                preg_match_all('/\\.(?:exe|html|phtml|pl|js|htm|py|php|php4|php3|phtml|shtml)$/i', $dbr_attach_arr["FILE_NAME"], $p_matches, PREG_PATTERN_ORDER))                continue;             $attach_id = $dbr_attach_arr["ID"];             $dbr = CMailAttachment::GetByID($attach_id);             if($dbr_arr = $dbr->Fetch())             {                $fname =  $_SERVER['DOCUMENT_ROOT']."/upload/from_mail/".$dbr_attach_arr["FILE_NAME"];                $handle = fopen($fname, 'wb');                fwrite($handle, $dbr_arr["FILE_DATA"]);                fclose($handle);                $arFile = CFile::MakeFileArray($fname);                $arFile["old_file"] = "";                $arFile["del"] = "Y";                $arFile["MODULE_ID"] = "tasks";                $fid[] = CFile::SaveFile($arFile, "tasks");             }          }          CTasks::AddFiles($ID, $fid);          if(CModule::IncludeModule("im")){             foreach ($USERS_for_TASK as $taskUser) {                $TaskLink = $_SERVER['HTTP_HOST'].'/company/personal/user/' . $taskUser . '/tasks/task/view/' . $ID . '/';                $arMessageFields = array(                   "TO_USER_ID"     => $taskUser, // получатель                   "FROM_USER_ID"   => 0, // отправитель (может быть >0)                   "NOTIFY_TYPE"    => IM_NOTIFY_SYSTEM, // тип уведомления                   "NOTIFY_MODULE"  => "tasks", // модуль запросивший отправку уведомления                   "NOTIFY_TAG"     => "FAX-TASKS", // символьный тэг для группировки (будет выведено только одно сообщение), если это не требуется - не задаем параметр                   // текст уведомления на сайте (доступен html и бб-коды)                   "NOTIFY_MESSAGE" => '[b]Внимание:[/b] получен новый заказ с сайта. Для просмотра перейдите по <a href="' . $TaskLink . '">ссылке</a>',                );                CIMNotify::Add($arMessageFields);             }          }          if(             CModule::IncludeModule("bizproc")             &&             CModule::IncludeModule("iblock")          ){             $arErrorsTmp = array();             $el = new CIBlockElement;             $PROP = array();             $arLoadProductArray = Array(                "MODIFIED_BY"    => $taskUser,                "IBLOCK_SECTION_ID" => false,                "IBLOCK_ID"      => ИД_инфоблока_с_бизнес-процессом,                "PROPERTY_VALUES"=> $PROP,                "NAME"           => $from.': Обработать письмо '.date('d.m.Y H:i:s'),                "ACTIVE"         => "Y",                "PREVIEW_TEXT"   => $arMessageFields['TITLE'].$arMessageFields['BODY'],             );             if($PRODUCT_ID = $el->Add($arLoadProductArray)){                $arWorkflowParameters = array('TaskID'=>$ID);                $wfId = CBPDocument::StartWorkflow(                   ИД_шаблона_инфоблока,                   array("bizproc", "CBPVirtualDocument", $PRODUCT_ID),                   array_merge($arWorkflowParameters, array("TargetUser" => "user_".$taskUser)),                   $arErrorsTmp                );             } else {                $arErrorsTmp[] = "Error: ".$el->LAST_ERROR;             }             if (count($arErrorsTmp) > 0)             {                foreach ($arErrorsTmp as $e)                   $errorMessage .= "[".$e["code"]."] ".$e["message"]."";                $arMessageFields = array(                   "TO_USER_ID"     => $taskUser, // получатель                   "FROM_USER_ID"   => 0, // отправитель (может быть >0)                   "NOTIFY_TYPE"    => IM_NOTIFY_SYSTEM, // тип уведомления                   "NOTIFY_MODULE"  => "tasks", // модуль запросивший отправку уведомления                   "NOTIFY_TAG"     => "FAX-TASKS", // символьный тэг для группировки (будет выведено только одно сообщение), если это не требуется - не задаем параметр                   // текст уведомления на сайте (доступен html и бб-коды)                   "NOTIFY_MESSAGE" => 'ERROR: '.$errorMessage,                );                CIMNotify::Add($arMessageFields);             }          }       }    } }
		

После создания новой задачи (комментарии к алгоритму в предыдущем посте) необходимо запустить новый экземпляр бизнес-процесса. 

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

Создаем элемент инфоблока с бизнес-процессами и запускаем новый экземпляр бизнес-процесса для созданного элемента инфоблока.


Источник: http://dev.1c-bitrix.ru/community/webdev/user/60622/blog/9503/


Благодарю за внимание! Делитесь вашими замечаниями в комментариях ниже.


P.S. Обращайтесь ко мне за приобретением лицензий и продлений на 1C-Битрикс "Управление сайтом", лицензий на облачную и коробочную версии Битрикс 24 а также за приобретением и внедрением готовых решений на базе 1С-Битрикс от партнеров. За более подробной информацией свяжитесь со мной любым удобным для вас способом


Комментарии

Еще никто не комментировал данную публикацию. Будьте первыми!

Добавить комментарий

captcha

Возврат к списку