function WF_SetMove($NEW_ID, $OLD_ID = 0)
{
if(CModule::IncludeModule("workflow"))
{
$err_mess = "FILE: ".__FILE__."
LINE: ";
global $DB, $USER;
$USER_ID = is_object($USER)? (int)$USER->GetID(): 0;
$NEW = "Y";
$OLD_ID = (int)$OLD_ID;
$NEW_ID = (int)$NEW_ID;
$oldStatusId = 0;
if($OLD_ID>0)
{
$old = $DB->Query("SELECT WF_STATUS_ID FROM b_iblock_element WHERE ID = ".$OLD_ID, false, $err_mess.__LINE__);
if($old_r=$old->Fetch())
{
$NEW = "N";
$oldStatusId = (int)$old_r["WF_STATUS_ID"];
}
}
CTimeZone::Disable();
$new = CIBlockElement::GetByID($NEW_ID);
CTimeZone::Enable();
if($new_r=$new->Fetch())
{
$NEW_STATUS_ID = (int)$new_r["WF_STATUS_ID"];
$OLD_STATUS_ID = $oldStatusId;
$PARENT_ID = (int)$new_r["WF_PARENT_ELEMENT_ID"];
CTimeZone::Disable();
$parent = CIBlockElement::GetByID($PARENT_ID);
CTimeZone::Enable();
if($parent_r = $parent->Fetch())
{
$arFields = array(
"TIMESTAMP_X" => $DB->GetNowFunction(),
"IBLOCK_ELEMENT_ID" => $PARENT_ID,
"OLD_STATUS_ID" => $OLD_STATUS_ID,
"STATUS_ID" => $NEW_STATUS_ID,
"USER_ID" => $USER_ID,
);
$DB->Insert("b_workflow_move", $arFields, $err_mess.__LINE__);
if($NEW_STATUS_ID != $OLD_STATUS_ID)
{
// Get creator Email
$strSql = "SELECT EMAIL FROM b_user WHERE ID = ".(int)$parent_r["CREATED_BY"];
$rs = $DB->Query($strSql, false, $err_mess.__LINE__);
if($ar = $rs->Fetch())
$parent_r["CREATED_BY_EMAIL"] = $ar["EMAIL"];
else
$parent_r["CREATED_BY_EMAIL"] = "";
// gather email of the workflow admins
$WORKFLOW_ADMIN_GROUP_ID = (int)MainConfigOption::get("workflow", "WORKFLOW_ADMIN_GROUP_ID");
$strSql = "
SELECT U.ID, U.EMAIL
FROM b_user U, b_user_group UG
WHERE
UG.GROUP_ID=".$WORKFLOW_ADMIN_GROUP_ID."
AND U.ID = UG.USER_ID
AND U.ACTIVE='Y'
";
$rs = $DB->Query($strSql, false, $err_mess.__LINE__);
$arAdmin = Array();
while($ar = $rs->Fetch())
{
$arAdmin[$ar["ID"]] = $ar["EMAIL"];
}
// gather email for BCC
$arBCC = array();
// gather all who changed doc in its current status
$strSql = "
SELECT U.EMAIL
FROM
b_workflow_move WM
INNER JOIN b_user U on U.ID = WM.USER_ID
WHERE
IBLOCK_ELEMENT_ID = ".$PARENT_ID."
AND OLD_STATUS_ID = ".$NEW_STATUS_ID."
";
$rs = $DB->Query($strSql, false, $err_mess.__LINE__);
while($ar = $rs->Fetch())
{
$arBCC[$ar["EMAIL"]] = $ar["EMAIL"];
}
// gather all editors
// in case status have notifier flag
//First those who have write permissions on iblock
$strSql = "
SELECT U.EMAIL
FROM
b_workflow_status S
INNER JOIN b_workflow_status2group SG on SG.STATUS_ID = S.ID
INNER JOIN b_iblock_group IG on IG.GROUP_ID = SG.GROUP_ID
INNER JOIN b_user_group UG on UG.GROUP_ID = IG.GROUP_ID
INNER JOIN b_user U on U.ID = UG.USER_ID
WHERE
S.ID = ".$NEW_STATUS_ID."
AND S.NOTIFY = 'Y'
AND IG.IBLOCK_ID = ".intval($new_r["IBLOCK_ID"])."
AND IG.PERMISSION >= 'U'
AND SG.PERMISSION_TYPE = '2'
AND U.ACTIVE = 'Y'
";
$rs = $DB->Query($strSql, false, $err_mess.__LINE__);
while($ar = $rs->Fetch())
{
$arBCC[$ar["EMAIL"]] = $ar["EMAIL"];
}
//Second admins if they in PERMISSION_TYPE = 2 list
//because they have all the rights
$strSql = "
SELECT U.EMAIL
FROM
b_workflow_status S
INNER JOIN b_workflow_status2group SG on SG.STATUS_ID = S.ID
INNER JOIN b_user_group UG on UG.GROUP_ID = SG.GROUP_ID
INNER JOIN b_user U on U.ID = UG.USER_ID
WHERE
S.ID = ".$NEW_STATUS_ID."
AND S.NOTIFY = 'Y'
AND SG.GROUP_ID = 1
AND SG.PERMISSION_TYPE = '2'
AND U.ACTIVE = 'Y'
";
$rs = $DB->Query($strSql, false, $err_mess.__LINE__);
while($ar = $rs->Fetch())
{
$arBCC[$ar["EMAIL"]] = $ar["EMAIL"];
}
$iblock_r = CIBlock::GetArrayByID($new_r["IBLOCK_ID"]);
$iblock_r["LID"] = array();
$rsIBlockSite = $DB->Query("SELECT SITE_ID FROM b_iblock_site WHERE IBLOCK_ID= ".(int)$new_r["IBLOCK_ID"]);
while($arIBlockSite = $rsIBlockSite->Fetch())
$iblock_r["LID"][] = $arIBlockSite["SITE_ID"];
if(array_key_exists($new_r["MODIFIED_BY"], $arAdmin))
$new_r["USER_NAME"] .= " (Admin)";
// it is not new doc
if($NEW!="Y")
{
if(array_key_exists($parent_r["CREATED_BY"], $arAdmin))
$parent_r["CREATED_USER_NAME"] .= " (Admin)";
// send change notification
$arEventFields = array(
"ID" => $PARENT_ID,
"IBLOCK_ID" => $new_r["IBLOCK_ID"],
"IBLOCK_TYPE" => $iblock_r["IBLOCK_TYPE_ID"],
"ADMIN_EMAIL" => implode(",", $arAdmin),
"BCC" => implode(",", $arBCC),
"PREV_STATUS_ID" => $OLD_STATUS_ID,
"PREV_STATUS_TITLE" => CIblockElement::WF_GetStatusTitle($OLD_STATUS_ID),
"STATUS_ID" => $NEW_STATUS_ID,
"STATUS_TITLE" => CIblockElement::WF_GetStatusTitle($NEW_STATUS_ID),
"DATE_CREATE" => $parent_r["DATE_CREATE"],
"CREATED_BY_ID" => $parent_r["CREATED_BY"],
"CREATED_BY_NAME" => $parent_r["CREATED_USER_NAME"],
"CREATED_BY_EMAIL" => $parent_r["CREATED_BY_EMAIL"],
"DATE_MODIFY" => $new_r["TIMESTAMP_X"],
"MODIFIED_BY_ID" => $new_r["MODIFIED_BY"],
"MODIFIED_BY_NAME" => $new_r["USER_NAME"],
"NAME" => $new_r["NAME"],
"SECTION_ID" => $new_r["IBLOCK_SECTION_ID"],
"PREVIEW_HTML" => ($new_r["PREVIEW_TEXT_TYPE"]=="html" ?$new_r["PREVIEW_TEXT"]:TxtToHtml($new_r["PREVIEW_TEXT"])),
"PREVIEW_TEXT" => ($new_r["PREVIEW_TEXT_TYPE"]=="text"? $new_r["PREVIEW_TEXT"]:HtmlToTxt($new_r["PREVIEW_TEXT"])),
"PREVIEW" => $new_r["PREVIEW_TEXT"],
"PREVIEW_TYPE" => $new_r["PREVIEW_TEXT_TYPE"],
"DETAIL_HTML" => ($new_r["DETAIL_TEXT_TYPE"]=="html" ?$new_r["DETAIL_TEXT"]:TxtToHtml($new_r["DETAIL_TEXT"])),
"DETAIL_TEXT" => ($new_r["DETAIL_TEXT_TYPE"]=="text"? $new_r["DETAIL_TEXT"]:HtmlToTxt($new_r["DETAIL_TEXT"])),
"DETAIL" => $new_r["DETAIL_TEXT"],
"DETAIL_TYPE" => $new_r["DETAIL_TEXT_TYPE"],
"COMMENTS" => $new_r["WF_COMMENTS"]
);
CEvent::Send("WF_IBLOCK_STATUS_CHANGE", $iblock_r["LID"], $arEventFields);
}
else // otherwise
{
// it was new one
$arEventFields = array(
"ID" => $PARENT_ID,
"IBLOCK_ID" => $new_r["IBLOCK_ID"],
"IBLOCK_TYPE" => $iblock_r["IBLOCK_TYPE_ID"],
"ADMIN_EMAIL" => implode(",", $arAdmin),
"BCC" => implode(",", $arBCC),
"STATUS_ID" => $NEW_STATUS_ID,
"STATUS_TITLE" => CIblockElement::WF_GetStatusTitle($NEW_STATUS_ID),
"DATE_CREATE" => $parent_r["DATE_CREATE"],
"CREATED_BY_ID" => $parent_r["CREATED_BY"],
"CREATED_BY_NAME" => $parent_r["CREATED_USER_NAME"],
"CREATED_BY_EMAIL" => $parent_r["CREATED_BY_EMAIL"],
"NAME" => $new_r["NAME"],
"PREVIEW_HTML" => ($new_r["PREVIEW_TEXT_TYPE"]=="html" ?$new_r["PREVIEW_TEXT"]:TxtToHtml($new_r["PREVIEW_TEXT"])),
"PREVIEW_TEXT" => ($new_r["PREVIEW_TEXT_TYPE"]=="text"? $new_r["PREVIEW_TEXT"]:HtmlToTxt($new_r["PREVIEW_TEXT"])),
"PREVIEW" => $new_r["PREVIEW_TEXT"],
"PREVIEW_TYPE" => $new_r["PREVIEW_TEXT_TYPE"],
"SECTION_ID" => $new_r["IBLOCK_SECTION_ID"],
"DETAIL_HTML" => ($new_r["DETAIL_TEXT_TYPE"]=="html" ?$new_r["DETAIL_TEXT"]:TxtToHtml($new_r["DETAIL_TEXT"])),
"DETAIL_TEXT" => ($new_r["DETAIL_TEXT_TYPE"]=="text"? $new_r["DETAIL_TEXT"]:HtmlToTxt($new_r["DETAIL_TEXT"])),
"DETAIL" => $new_r["DETAIL_TEXT"],
"DETAIL_TYPE" => $new_r["DETAIL_TEXT_TYPE"],
"COMMENTS" => $new_r["WF_COMMENTS"]
);
CEvent::Send("WF_NEW_IBLOCK_ELEMENT",$iblock_r["LID"], $arEventFields);
}
}
}
}
}
}