15 $flow_link_new =
self::GetEditLink([
SITE_ID, rtrim(
GetDirPath($cur_page),
'/') .
'/untitled.php'], $status_id, $status_title,
'standart.php', LANGUAGE_ID, $cur_page_param);
16 $create_permission = $flow_link_new <>
'' &&
$USER->CanDoFileOperation(
'fm_edit_in_workflow', [
SITE_ID, $cur_dir]);
18 $flow_link_hist =
'/bitrix/admin/workflow_history_list.php?lang=' . LANGUAGE_ID .
'&find_filename=' . urlencode($cur_page) .
'&find_filename_exact_match=Y&set_filter=Y';
19 $history_permission =
$USER->CanDoFileOperation(
'fm_edit_in_workflow', [
SITE_ID, $cur_page]);
21 $flow_link_edit =
self::GetEditLink([
SITE_ID, $cur_page], $status_id, $status_title,
'', LANGUAGE_ID, $cur_page_param);
22 $edit_permission = $flow_link_edit <>
'' && $history_permission;
28 'URL' => $flow_link_edit .
'&bxpublic=Y&from_module=workflow',
38 'HREF' =>
'javascript:' . $public_edit,
41 'ICON' =>
'bx-panel-edit-page-icon',
47 'HK_ID' =>
'top_panel_edit_new',
48 'RESORT_MENU' =>
true,
50 'TITLE' =>
GetMessage(
'top_panel_edit_new_tooltip_title'),
51 'TEXT' =>
GetMessage(
'top_panel_edit_new_tooltip'),
57 if ($create_permission)
59 $APPLICATION->AddPanelButtonMenu(
'create', [
'SEPARATOR' =>
true,
'SORT' => 49]);
61 'SRC' =>
'/bitrix/images/workflow/new_page.gif',
62 'TEXT' =>
GetMessage(
'FLOW_PANEL_CREATE_WITH_WF'),
63 'TITLE' =>
GetMessage(
'FLOW_PANEL_CREATE_ALT'),
64 'ACTION' =>
"jsUtils.Redirect([], '" . CUtil::JSEscape($flow_link_new) .
"')",
65 'HK_ID' =>
'FLOW_PANEL_CREATE_WITH_WF',
70 if ($edit_permission || $history_permission)
72 $APPLICATION->AddPanelButtonMenu(
'edit', [
'SEPARATOR' =>
true,
'SORT' => 79]);
79 'SRC' =>
'/bitrix/images/workflow/edit_flow_public.gif',
80 'TEXT' =>
GetMessage(
'FLOW_PANEL_EDIT_WITH_WF'),
81 'TITLE' => (intval($status_id) > 0 ?
GetMessage(
'FLOW_CURRENT_STATUS') .
' [' . $status_id .
'] ' . $status_title :
GetMessage(
'FLOW_PANEL_EDIT_ALT')),
82 'ACTION' =>
"jsUtils.Redirect([], '" . CUtil::JSEscape($flow_link_edit) .
"')",
83 'HK_ID' =>
'FLOW_PANEL_EDIT_WITH_WF',
89 if ($history_permission)
91 $flow_link_hist =
'/bitrix/admin/workflow_history_list.php?lang=' . LANGUAGE_ID .
'&find_filename=' . urlencode($cur_page) .
'&find_filename_exact_match=Y&set_filter=Y';
93 'SRC' =>
'/bitrix/images/workflow/history.gif',
95 'TITLE' =>
GetMessage(
'FLOW_PANEL_HISTORY_ALT'),
96 'ACTION' =>
"jsUtils.Redirect([], '" . CUtil::JSEscape($flow_link_hist) .
"')",
97 'HK_ID' =>
'FLOW_PANEL_HISTORY',
105 global $BX_WORKFLOW_PUBLISHED_PATH, $BX_WORKFLOW_PUBLISHED_SITE;
106 if ($BX_WORKFLOW_PUBLISHED_PATH ==
$path && $BX_WORKFLOW_PUBLISHED_SITE ==
$site)
112 $HISTORY_SIMPLE_EDITING = COption::GetOptionString(
'workflow',
'HISTORY_SIMPLE_EDITING',
'N');
113 if ($HISTORY_SIMPLE_EDITING ==
'Y')
115 $HISTORY_COPIES = intval(COption::GetOptionString(
'workflow',
'HISTORY_COPIES',
'10'));
117 if ($HISTORY_COPIES > 0)
122 $TITLE = $arContent[
'TITLE'];
123 $BODY = $arContent[
'CONTENT'];
131 'BODY_TYPE' =>
'html',
133 '~TIMESTAMP_X' =>
$DB->CurrentTimeFunction(),
135 $DB->Add(
'b_workflow_log',
$arFields, [
'BODY'],
'workflow');
145 $DOCUMENT_ID = intval($DOCUMENT_ID);
146 $HISTORY_COPIES = intval(COption::GetOptionString(
'workflow',
'HISTORY_COPIES',
'10'));
148 if (
$zr =
$z->Fetch())
151 if ($HISTORY_COPIES > 0)
154 'DOCUMENT_ID' => $DOCUMENT_ID,
155 'MODIFIED_BY' =>
$zr[
'MODIFIED_BY'],
156 'TITLE' =>
$zr[
'TITLE'],
157 'FILENAME' =>
$zr[
'FILENAME'],
158 'SITE_ID' =>
$zr[
'SITE_ID'],
159 'BODY' =>
$zr[
'BODY'],
160 'BODY_TYPE' =>
$zr[
'BODY_TYPE'],
161 'STATUS_ID' =>
$zr[
'STATUS_ID'],
162 'COMMENTS' =>
$zr[
'COMMENTS'],
163 '~TIMESTAMP_X' =>
$DB->CurrentTimeFunction(),
165 $LOG_ID =
$DB->Add(
'b_workflow_log',
$arFields, [
'BODY'],
'workflow');
177 if ($HISTORY_COPIES ===
false)
179 $HISTORY_COPIES = intval(COption::GetOptionString(
'workflow',
'HISTORY_COPIES',
'10'));
182 $DOCUMENT_ID = intval($DOCUMENT_ID);
183 if ($DOCUMENT_ID > 0)
185 $strSqlSearch =
' and ID = ' . $DOCUMENT_ID .
' ';
192 $strSql =
'SELECT ID FROM b_workflow_document WHERE 1=1 ' . $strSqlSearch;
193 $z =
$DB->Query($strSql);
194 while (
$zr =
$z->Fetch())
203 DOCUMENT_ID = ' . $DID .
'
207 $t =
$DB->Query($strSql);
210 while ($tr = $t->Fetch())
213 if (
$i > $HISTORY_COPIES)
215 $str_id .=
', ' . $tr[
'ID'];
218 $strSql =
'DELETE FROM b_workflow_log WHERE ID in (' . $str_id .
')';
228 if ($HISTORY_COPIES ===
false)
230 $HISTORY_COPIES = intval(COption::GetOptionString(
'workflow',
'HISTORY_COPIES',
'10'));
238 FILENAME = '" .
$DB->ForSql($FILENAME, 255) .
"'
243 $t =
$DB->Query($strSql);
246 while ($tr = $t->Fetch())
249 if (
$i > $HISTORY_COPIES)
251 $str_id .=
', ' . $tr[
'ID'];
254 $strSql =
'DELETE FROM b_workflow_log WHERE ID in (' . $str_id .
')';
259 public static function SetMove($DOCUMENT_ID, $STATUS_ID, $OLD_STATUS_ID, $LOG_ID)
263 $DOCUMENT_ID = intval($DOCUMENT_ID);
264 $STATUS_ID = intval($STATUS_ID);
265 $OLD_STATUS_ID = intval($OLD_STATUS_ID);
266 $LOG_ID = intval($LOG_ID);
269 'TIMESTAMP_X' =>
$DB->GetNowFunction(),
270 'DOCUMENT_ID' => $DOCUMENT_ID,
271 'OLD_STATUS_ID' => $OLD_STATUS_ID,
272 'STATUS_ID' => $STATUS_ID,
274 'USER_ID' => intval(
$USER->GetID()),
278 if ($STATUS_ID != $OLD_STATUS_ID)
280 CTimeZone::Disable();
284 if ($dr = $d->Fetch())
286 $STATUS_ID = $dr[
'STATUS_ID'];
289 $WORKFLOW_ADMIN_GROUP_ID = COption::GetOptionInt(
'workflow',
'WORKFLOW_ADMIN_GROUP_ID', 0);
298 UG.GROUP_ID = ' . $WORKFLOW_ADMIN_GROUP_ID .
"
299 and U.ID = UG.USER_ID
302 $a =
$DB->Query($strSql);
304 while (
$ar =
$a->Fetch())
306 $arAdmin[
$ar[
'ID']] =
$ar[
'EMAIL'];
319 DOCUMENT_ID = ' . $DOCUMENT_ID .
'
320 and OLD_STATUS_ID = ' . $STATUS_ID .
'
322 $z =
$DB->Query($strSql);
323 while (
$zr =
$z->Fetch())
325 $arBCC[
$zr[
'EMAIL']] =
$zr[
'EMAIL'];
336 b_workflow_status2group SG,
340 S.ID = ' . $STATUS_ID .
"
342 and SG.STATUS_ID = S.ID
343 and SG.PERMISSION_TYPE = '2'
344 and UG.GROUP_ID = SG.GROUP_ID
345 and U.ID = UG.USER_ID
348 $z =
$DB->Query($strSql);
349 while (
$zr =
$z->Fetch())
351 if (!array_key_exists(
$zr[
'EMAIL'], $arBCC))
355 while (
$ar =
$rs->Fetch())
357 $grp[] =
$ar[
'GROUP_ID'];
364 if (in_array(
'fm_edit_in_workflow', $arOps))
366 $arBCC[
$zr[
'EMAIL']] =
$zr[
'EMAIL'];
374 unset($arBCC[$dr[
'EUSER_EMAIL']]);
376 if (array_key_exists($dr[
'ENTERED_BY'], $arAdmin))
378 $dr[
'EUSER_NAME'] .=
' (Admin)';
382 if ($OLD_STATUS_ID > 0)
384 if (array_key_exists($dr[
'MODIFIED_BY'], $arAdmin))
386 $dr[
'MUSER_NAME'] .=
' (Admin)';
393 'ADMIN_EMAIL' => implode(
',', $arAdmin),
394 'BCC' => implode(
',', $arBCC),
395 'PREV_STATUS_ID' => $OLD_STATUS_ID,
396 'PREV_STATUS_TITLE' => $qr[
'TITLE'],
397 'STATUS_ID' => $dr[
'STATUS_ID'],
398 'STATUS_TITLE' => $dr[
'STATUS_TITLE'],
399 'DATE_ENTER' => $dr[
'DATE_ENTER'],
400 'ENTERED_BY_ID' => $dr[
'ENTERED_BY'],
401 'ENTERED_BY_NAME' => $dr[
'EUSER_NAME'],
402 'ENTERED_BY_EMAIL' => $dr[
'EUSER_EMAIL'],
403 'DATE_MODIFY' => $dr[
'DATE_MODIFY'],
404 'MODIFIED_BY_ID' => $dr[
'MODIFIED_BY'],
405 'MODIFIED_BY_NAME' => $dr[
'MUSER_NAME'],
406 'FILENAME' => $dr[
'FILENAME'],
407 'SITE_ID' => $dr[
'SITE_ID'],
408 'TITLE' => $dr[
'TITLE'],
409 'BODY_HTML' => ($dr[
'BODY_TYPE'] ==
'html' ? $dr[
'BODY'] :
TxtToHTML($dr[
'BODY'])),
410 'BODY_TEXT' => ($dr[
'BODY_TYPE'] ==
'text' ? $dr[
'BODY'] : HtmlToTxt($dr[
'BODY'])),
411 'BODY' => $dr[
'BODY'],
412 'BODY_TYPE' => $dr[
'BODY_TYPE'],
413 'COMMENTS' => $dr[
'COMMENTS'],
415 CEvent::Send(
'WF_STATUS_CHANGE', $dr[
'SITE_ID'], $arEventFields);
422 'ADMIN_EMAIL' => implode(
',', $arAdmin),
423 'BCC' => implode(
',', $arBCC),
424 'STATUS_ID' => $dr[
'STATUS_ID'],
425 'STATUS_TITLE' => $dr[
'STATUS_TITLE'],
426 'DATE_ENTER' => $dr[
'DATE_ENTER'],
427 'ENTERED_BY_ID' => $dr[
'ENTERED_BY'],
428 'ENTERED_BY_NAME' => $dr[
'EUSER_NAME'],
429 'ENTERED_BY_EMAIL' => $dr[
'EUSER_EMAIL'],
430 'FILENAME' => $dr[
'FILENAME'],
431 'SITE_ID' => $dr[
'SITE_ID'],
432 'TITLE' => $dr[
'TITLE'],
433 'BODY_HTML' => ($dr[
'BODY_TYPE'] ==
'html' ? $dr[
'BODY'] :
TxtToHTML($dr[
'BODY'])),
434 'BODY_TEXT' => ($dr[
'BODY_TYPE'] ==
'text' ? $dr[
'BODY'] : HtmlToTxt($dr[
'BODY'])),
435 'BODY' => $dr[
'BODY'],
436 'BODY_TYPE' => $dr[
'BODY_TYPE'],
437 'COMMENTS' => $dr[
'COMMENTS'],
439 CEvent::Send(
'WF_NEW_DOCUMENT', $dr[
'SITE_ID'], $arEventFields);
445 public static function Delete($DOCUMENT_ID)
451 $DB->Query(
'DELETE FROM b_workflow_move WHERE DOCUMENT_ID = ' . intval($DOCUMENT_ID));
452 $DB->Query(
'DELETE FROM b_workflow_document WHERE ID = ' . intval($DOCUMENT_ID));
459 if (
$USER->IsAdmin())
465 $WORKFLOW_ADMIN_GROUP_ID = COption::GetOptionString(
'workflow',
'WORKFLOW_ADMIN_GROUP_ID');
466 if (in_array($WORKFLOW_ADMIN_GROUP_ID,
$USER->GetUserGroupArray()))
477 public static function IsAllowEdit($DOCUMENT_ID, &$locked_by, &$date_lock, $CHECK_RIGHTS=
'Y')
480 $DOCUMENT_ID = intval($DOCUMENT_ID);
482 if ($LOCK_STATUS ==
'red')
486 if ($LOCK_STATUS ==
'yellow')
490 if ($LOCK_STATUS ==
'green')
492 if ($CHECK_RIGHTS ==
'Y')
509 $DOCUMENT_ID = intval($DOCUMENT_ID);
514 b_workflow_document D,
517 D.ID=' . $DOCUMENT_ID .
'
518 and S.ID = D.STATUS_ID
520 $z =
$DB->Query($strSql);
546 b_workflow_document D,
547 b_workflow_status2group G
549 D.ID = ' . intval($DOCUMENT_ID) .
"
550 and G.STATUS_ID = D.STATUS_ID
551 and G.PERMISSION_TYPE >= '2'
552 and G.GROUP_ID in (" . implode(
', ',
$arGroups) .
')
554 $z =
$DB->Query($strSql);
556 if (
$zr =
$z->Fetch())
566 public static function UnLock($DOCUMENT_ID)
570 $DOCUMENT_ID = intval($DOCUMENT_ID);
573 if (self::IsAdmin() ||
$zr[
'LOCKED_BY'] ==
$USER->GetID())
576 'DATE_LOCK' =>
'null',
577 'LOCKED_BY' =>
'null',
579 $rows =
$DB->Update(
'b_workflow_document',
$arFields,
'WHERE ID=' . $DOCUMENT_ID);
581 return intval(
$rows);
587 public static function Lock($DOCUMENT_ID)
591 $DOCUMENT_ID = intval($DOCUMENT_ID);
593 if (
$zr =
$z->Fetch())
595 if (
$zr[
'STATUS_ID'] != 1)
598 'DATE_LOCK' =>
$DB->GetNowFunction(),
599 'LOCKED_BY' =>
$USER->GetID(),
601 $DB->Update(
'b_workflow_document',
$arFields,
"WHERE ID='" . $DOCUMENT_ID .
"'");
612 CMain::InitPathVars(
$SITE_ID, $FILENAME);
614 if (
$USER->CanDoFileOperation(
'fm_edit_in_workflow', [
$SITE_ID, $FILENAME]))
617 if (!self::IsAdmin())
626 'PERMISSION_TYPE_1' => 1,
629 if (!$rsStatuses->Fetch())
635 $link =
'/bitrix/admin/workflow_edit.php?lang=' .
$lang .
'&site=' .
$SITE_ID .
'&fname=' . $FILENAME;
638 $link .=
'&template=' . urlencode(
$template);
640 if ($return_url <>
'')
642 $link .=
'&return_url=' . urlencode($return_url);
645 if (
$zr =
$z->Fetch())
647 $status_id =
$zr[
'STATUS_ID'];
648 $status_title =
$zr[
'STATUS_TITLE'];
651 $DOCUMENT_ID =
$zr[
'ID'];
652 if (self::IsHaveEditRights($DOCUMENT_ID))
654 $link .=
'&ID=' . $DOCUMENT_ID;
671 DELETE FROM b_workflow_log
672 WHERE ID = ' . intval(
$ID) .
'
683 return 'CWorkflow::CleanUp();';
686 public static function CleanUpFiles($DOCUMENT_ID=
false, $FILE_ID=
false)
690 if ($DOCUMENT_ID ===
false)
692 $strSql =
'SELECT TEMP_FILENAME FROM b_workflow_file WHERE DOCUMENT_ID is null';
696 $DOCUMENT_ID = intval($DOCUMENT_ID);
697 $strSql =
'SELECT TEMP_FILENAME FROM b_workflow_file WHERE DOCUMENT_ID = ' . $DOCUMENT_ID;
699 if ($FILE_ID !==
false)
701 $FILE_ID = intval($FILE_ID);
702 $strSql .=
' and ID = ' . $FILE_ID;
704 $z =
$DB->Query($strSql);
705 while (
$zr =
$z->Fetch())
715 if ($DOCUMENT_ID ===
false)
719 P.FILENAME, D.SITE_ID
721 b_workflow_document D,
725 and P.DOCUMENT_ID = D.ID
730 $DOCUMENT_ID = intval($DOCUMENT_ID);
737 DOCUMENT_ID = ' . $DOCUMENT_ID .
'
740 $z =
$DB->Query($strSql);
741 while (
$zr =
$z->Fetch())
751 $strSql =
"DELETE FROM b_workflow_preview WHERE FILENAME='" .
$DB->ForSql($FILENAME, 255) .
"'";
755 if (file_exists(
$path))
765 $strSql =
"DELETE FROM b_workflow_file WHERE TEMP_FILENAME='" .
$DB->ForSql($FILENAME, 255) .
"'";
768 if (file_exists($temp_path))
778 $strSql =
"SELECT ID FROM b_workflow_file WHERE TEMP_FILENAME='" .
$DB->ForSql($FILENAME, 255) .
"'";
779 $z =
$DB->Query($strSql);
782 return intval(
$zr[
'ID']);
788 $temp_file = md5(
$filename . uniqid(rand())) .
'.' . $ext;
789 while (self::IsFilenameExists($temp_file))
791 $temp_file = md5(
$filename . uniqid(rand())) .
'.' . $ext;
803 FROM b_workflow_preview
804 WHERE FILENAME='" .
$DB->ForSql($FILENAME, 255) .
"'
809 return intval(
$zr[
'ID']);
818 FROM b_workflow_document
819 WHERE ID = ' . intval($DOCUMENT_ID) .
'
828 $temp_file = $DOCUMENT_PATH . md5(uniqid(rand())) .
'.php';
830 while (self::IsPreviewExists($temp_file));
836 public static function SetStatus($DOCUMENT_ID, $STATUS_ID, $OLD_STATUS_ID, $history=
true)
841 $DOCUMENT_ID = intval($DOCUMENT_ID);
842 $STATUS_ID = intval($STATUS_ID);
843 $OLD_STATUS_ID = intval($OLD_STATUS_ID);
848 while ($file = $files->Fetch())
850 $path = $file[
'FILENAME'];
855 $USER->CanDoFileOperation(
'fm_edit_in_workflow', [$file[
'SITE_ID'],
$path])
856 &&
$USER->CanDoFileOperation(
'fm_edit_existent_file', [$file[
'SITE_ID'],
$path])
857 &&
$USER->CanDoFileOperation(
'fm_create_new_file', [$file[
'SITE_ID'],
$path])
860 if (!copy($pathfrom, $pathto))
880 $USER->CanDoFileOperation(
'fm_edit_in_workflow', [$yr[
'SITE_ID'], $yr[
'FILENAME']])
881 &&
$USER->CanDoFileOperation(
'fm_edit_existent_file', [$yr[
'SITE_ID'], $yr[
'FILENAME']])
882 &&
$USER->CanDoFileOperation(
'fm_create_new_file', [$yr[
'SITE_ID'], $yr[
'FILENAME']])
886 $prolog = $yr[
'PROLOG'];
894 $epilog = $yr[
'EPILOG'];
896 global $BX_WORKFLOW_PUBLISHED_PATH, $BX_WORKFLOW_PUBLISHED_SITE;
897 $BX_WORKFLOW_PUBLISHED_PATH = $yr[
'FILENAME'];
898 $BX_WORKFLOW_PUBLISHED_SITE = $yr[
'SITE_ID'];
901 $BX_WORKFLOW_PUBLISHED_PATH =
'';
902 $BX_WORKFLOW_PUBLISHED_SITE =
'';
907 $str =
GetMessage(
'FLOW_ACCESS_DENIED_FOLDER', [
'#FILENAME#' => $yr[
'FILENAME']]);
917 'DATE_MODIFY' =>
$DB->GetNowFunction(),
918 'MODIFIED_BY' =>
$USER->GetID(),
919 'STATUS_ID' => intval($STATUS_ID),
921 $DB->Update(
'b_workflow_document',
$arFields,
'WHERE ID=' . $DOCUMENT_ID);
922 if ($history ===
true)
925 self::SetMove($DOCUMENT_ID, $STATUS_ID, $OLD_STATUS_ID, $LOG_ID);
939 $DOCUMENT_ID = intval($DOCUMENT_ID);
940 if (is_array($arUploadedFiles) &&
count($arUploadedFiles) > 0)
942 foreach ($arUploadedFiles as $FILE_ID)
944 $FILE_ID = intval($FILE_ID);
945 $strSql =
'UPDATE b_workflow_file SET DOCUMENT_ID=' . $DOCUMENT_ID .
' WHERE ID=' . $FILE_ID;
956 $DOCUMENT_ID = intval($DOCUMENT_ID);
963 F.DOCUMENT_ID = ' . $DOCUMENT_ID .
"
964 and F.FILENAME = '" .
$DB->ForSql($FILENAME, 255) .
"'
966 $z =
$DB->Query($strSql);
973 $upload_dir = COption::GetOptionString(
'',
'upload_dir',
'/upload/');
974 $dir =
$_SERVER[
'DOCUMENT_ROOT'] .
'/' . $upload_dir .
'/workflow/';
975 $dir = str_replace(
'//',
'/',
$dir);
991 $io->ValidatePathString($fname)
1001 if (
$zr =
$z->Fetch())
1005 if (file_exists(
$path))
1013 $strSql =
'SELECT FILENAME, SITE_ID FROM b_workflow_document WHERE ID = ' . $did;
1014 $y =
$DB->Query($strSql);
1016 if ($yr = $y->Fetch())
1027 if ($ur = $u->Fetch())
1031 if (file_exists(
$path))
1039 if (
$USER->CanDoFileOperation(
'fm_view_file', [$yr[
'SITE_ID'], $pathto]))
1051 $pathto =
Rel2Abs($wf_path, $fname);
1053 if (file_exists(
$path))
1056 if (
$USER->CanDoFileOperation(
'fm_view_file', [
$site, $pathto]))
1068 if (file_exists(
$path))
1071 if (
$USER->CanDoFileOperation(
'fm_view_file', [
$site, $fname]))
1080 return GetMessage(
'FLOW_ACCESS_DENIED_PHP_VIEW');
1086 if (
$site !==
false)
1109 $arFields[
'~DATE_MODIFY'] =
$DB->CurrentTimeFunction();
1124 if (
$zr =
$z->Fetch())
1140 $strUpdate =
$DB->PrepareUpdate(
'b_workflow_document',
$arFields,
'workflow');
1144 UPDATE b_workflow_document
1145 SET ' . $strUpdate .
', DATE_MODIFY=now(), DATE_ENTER=now()
1146 WHERE ID = ' . $DOCUMENT_ID,
1163 $DOCUMENT_ID = intval($DOCUMENT_ID);
1164 $MAX_LOCK = COption::GetOptionInt(
'workflow',
'MAX_LOCK_TIME',
'60');
1169 ' .
$DB->DateToCharFunction(
'DATE_LOCK') .
" DATE_LOCK,
1171 when DATE_LOCK is null then 'green'
1172 when " . $helper->addSecondsToDateTime($MAX_LOCK * 60,
'DATE_LOCK') .
" < now() then 'green'
1173 when LOCKED_BY = " .
$uid .
" then 'yellow'
1174 else 'red' end LOCK_STATUS
1178 ID = " . $DOCUMENT_ID .
'
1180 $z =
$DB->Query($strSql);
1182 $locked_by =
$zr ?
$zr[
'LOCKED_BY'] : 0;
1183 $date_lock =
$zr?
$zr[
'DATE_LOCK'] :
false;
1185 return $zr[
'LOCK_STATUS'];
1195 static $arWhereFields = [
1197 'TABLE_ALIAS' =>
'D',
1198 'FIELD_NAME' =>
'D.ID',
1199 'FIELD_TYPE' =>
'int',
1203 'TABLE_ALIAS' =>
'D',
1204 'FIELD_NAME' =>
'D.MODIFIED_BY',
1205 'FIELD_TYPE' =>
'int',
1209 'TABLE_ALIAS' =>
'D',
1210 'FIELD_NAME' =>
'D.STATUS_ID',
1211 'FIELD_TYPE' =>
'int',
1215 $obQueryWhere->SetFields($arWhereFields);
1218 $MAX_LOCK = COption::GetOptionInt(
'workflow',
'MAX_LOCK_TIME',
'60');
1230 if ((
string)
$val ==
'' || (
string)
$val ==
'NOT_REF')
1238 $match_value_set = array_key_exists(
$key .
'_EXACT_MATCH',
$arFilter);
1244 $arSqlSearch[] = $obQueryWhere->GetQuery([
$key =>
$val]);
1247 case 'DATE_MODIFY_1':
1250 $arSqlSearch[] =
'D.DATE_MODIFY >= ' .
$DB->CharToDateFunction(
$val,
'SHORT');
1254 case 'DATE_MODIFY_2':
1257 $arSqlSearch[] =
'D.DATE_MODIFY < ' .
$DB->CharToDateFunction(
$val,
'SHORT') .
' + INTERVAL 1 DAY';
1262 $match = ($match_value_set &&
$arFilter[
$key .
'_EXACT_MATCH'] ==
'Y') ?
'N' :
'Y';
1266 $arSqlSearch[] = $obQueryWhere->GetQuery([
'MODIFIED_BY' =>
$val]) .
' or ' .
$filter;
1270 case 'MODIFIED_USER_ID':
1271 $arSqlSearch[] = $obQueryWhere->GetQuery([
'MODIFIED_BY' =>
$val]);
1277 when D.DATE_LOCK is null then 'green'
1278 when " . $helper->addSecondsToDateTime($MAX_LOCK * 60,
'D.DATE_LOCK') .
" < now() then 'green'
1279 when D.LOCKED_BY = " .
$uid .
" then 'yellow'
1280 else 'red' end = '" .
$DB->ForSql(
$val) .
"'";
1284 $match = ($match_value_set &&
$arFilter[
$key .
'_EXACT_MATCH'] ==
'Y') ?
'N' :
'Y';
1288 $arSqlSearch[] = $obQueryWhere->GetQuery([
'STATUS_ID' =>
$val]) .
' or ' .
$filter;
1295 $match = ($match_value_set &&
$arFilter[
$key .
'_EXACT_MATCH'] ==
'Y') ?
'N' :
'Y';
1300 $match = ($match_value_set &&
$arFilter[
$key .
'_EXACT_MATCH'] ==
'Y') ?
'N' :
'Y';
1310 $strSqlOrder =
'ORDER BY D.ID';
1312 elseif ($by ===
's_lock_status')
1314 $strSqlOrder =
'ORDER BY LOCK_STATUS';
1316 elseif ($by ===
's_date_modify')
1318 $strSqlOrder =
'ORDER BY D.DATE_MODIFY';
1320 elseif ($by ===
's_modified_by')
1322 $strSqlOrder =
'ORDER BY D.MODIFIED_BY';
1324 elseif ($by ===
's_filename')
1326 $strSqlOrder =
'ORDER BY D.FILENAME';
1328 elseif ($by ===
's_title')
1330 $strSqlOrder =
'ORDER BY D.TITLE';
1332 elseif ($by ===
's_site_id')
1334 $strSqlOrder =
'ORDER BY D.SITE_ID';
1336 elseif ($by ===
's_status')
1338 $strSqlOrder =
'ORDER BY D.STATUS_ID';
1342 $strSqlOrder =
'ORDER BY D.DATE_MODIFY';
1347 $strSqlOrder .=
' desc ';
1351 if (self::IsAdmin())
1356 ' .
$DB->DateToCharFunction(
'D.DATE_ENTER') .
' DATE_ENTER,
1357 ' .
$DB->DateToCharFunction(
'D.DATE_MODIFY') .
' DATE_MODIFY,
1358 ' .
$DB->DateToCharFunction(
'D.DATE_LOCK') .
" DATE_LOCK,
1359 concat_ws(' ', " .
$DB->Concat(
"'('",
'UM.LOGIN',
"')'") .
", nullif(UM.NAME, ''), nullif(UM.LAST_NAME, '')) MUSER_NAME,
1360 concat_ws(' ', " .
$DB->Concat(
"'('",
'UE.LOGIN',
"')'") .
", nullif(UE.NAME, ''), nullif(UE.LAST_NAME, '')) EUSER_NAME,
1361 S.TITLE STATUS_TITLE,
1363 when D.DATE_LOCK is null then 'green'
1364 when " . $helper->addSecondsToDateTime($MAX_LOCK * 60,
'D.DATE_LOCK') .
" < now() then 'green'
1365 when D.LOCKED_BY = " .
$uid .
" then 'yellow'
1366 else 'red' end LOCK_STATUS
1368 b_workflow_document D
1369 LEFT JOIN b_workflow_status S ON (S.ID = D.STATUS_ID)
1370 LEFT JOIN b_user UM ON (UM.ID = D.MODIFIED_BY)
1371 LEFT JOIN b_user UE ON (UE.ID = D.ENTERED_BY)
1373 " . $strSqlSearch .
'
1374 ' . $strSqlOrder .
'
1382 ' .
$DB->DateToCharFunction(
'D.DATE_ENTER') .
' DATE_ENTER,
1383 ' .
$DB->DateToCharFunction(
'D.DATE_MODIFY') .
' DATE_MODIFY,
1384 ' .
$DB->DateToCharFunction(
'D.DATE_LOCK') .
" DATE_LOCK,
1385 concat_ws(' ', " .
$DB->Concat(
"'('",
'UM.LOGIN',
"')'") .
", nullif(UM.NAME, ''), nullif(UM.LAST_NAME, '')) MUSER_NAME,
1386 concat_ws(' ', " .
$DB->Concat(
"'('",
'UE.LOGIN',
"')'") .
", nullif(UE.NAME, ''), nullif(UE.LAST_NAME, '')) EUSER_NAME,
1387 S.TITLE STATUS_TITLE,
1389 when D.DATE_LOCK is null then 'green'
1390 when " . $helper->addSecondsToDateTime($MAX_LOCK * 60,
'D.DATE_LOCK') .
" < now() then 'green'
1391 when D.LOCKED_BY = " .
$uid .
" then 'yellow'
1392 else 'red' end LOCK_STATUS
1394 b_workflow_document D
1395 INNER JOIN b_workflow_status2group G ON (G.STATUS_ID = D.STATUS_ID)
1396 LEFT JOIN b_workflow_status S ON (S.ID = D.STATUS_ID)
1397 LEFT JOIN b_user UM ON (UM.ID = D.MODIFIED_BY)
1398 LEFT JOIN b_user UE ON (UE.ID = D.ENTERED_BY)
1400 " . $strSqlSearch .
'
1401 and G.GROUP_ID in (' .
$groups .
")
1402 and G.PERMISSION_TYPE >= '2'
1403 " . $strSqlOrder .
'
1407 $rs =
$DB->Query($strSql);
1409 while (
$ar =
$rs->Fetch())
1411 if (
$USER->CanDoFileOperation(
'fm_edit_in_workflow', [
$ar[
'SITE_ID'],
$ar[
'FILENAME']]))
1416 $rs =
new CDBResult();
1429 $MAX_LOCK = COption::GetOptionInt(
'workflow',
'MAX_LOCK_TIME',
'60');
1434 ' .
$DB->DateToCharFunction(
'D.DATE_ENTER') .
' DATE_ENTER,
1435 ' .
$DB->DateToCharFunction(
'D.DATE_MODIFY') .
' DATE_MODIFY,
1436 ' .
$DB->DateToCharFunction(
'D.DATE_LOCK') .
" DATE_LOCK,
1437 concat_ws(' ', " .
$DB->Concat(
"'('",
'UM.LOGIN',
"')'") .
", nullif(UM.NAME, ''), nullif(UM.LAST_NAME, '')) MUSER_NAME,
1438 concat_ws(' ', " .
$DB->Concat(
"'('",
'UE.LOGIN',
"')'") .
", nullif(UE.NAME, ''), nullif(UE.LAST_NAME, '')) EUSER_NAME,
1439 concat_ws(' ', " .
$DB->Concat(
"'('",
'UL.LOGIN',
"')'") .
", nullif(UL.NAME, ''), nullif(UL.LAST_NAME, '')) LUSER_NAME,
1440 UE.EMAIL EUSER_EMAIL,
1441 S.TITLE STATUS_TITLE,
1443 when D.DATE_LOCK is null then 'green'
1444 when " . $helper->addSecondsToDateTime($MAX_LOCK * 60,
'D.DATE_LOCK') .
" < now() then 'green'
1445 when D.LOCKED_BY = " .
$uid .
" then 'yellow'
1446 else 'red' end LOCK_STATUS
1448 b_workflow_document D
1449 LEFT JOIN b_user UM ON (UM.ID = D.MODIFIED_BY)
1450 LEFT JOIN b_user UE ON (UE.ID = D.ENTERED_BY)
1451 LEFT JOIN b_user UL ON (UL.ID = D.LOCKED_BY)
1452 LEFT JOIN b_workflow_status S ON (S.ID = D.STATUS_ID)
1471 $obQueryWhere->SetFields([
1473 'TABLE_ALIAS' =>
'D',
1474 'FIELD_NAME' =>
'D.STATUS_ID',
1475 'FIELD_TYPE' =>
'int',
1479 $strSqlWhere = $obQueryWhere->GetQuery(
$arFilter);
1485 $MAX_LOCK = COption::GetOptionInt(
'workflow',
'MAX_LOCK_TIME',
'60');
1490 ' .
$DB->DateToCharFunction(
'D.DATE_ENTER') .
' DATE_ENTER,
1491 ' .
$DB->DateToCharFunction(
'D.DATE_MODIFY') .
' DATE_MODIFY,
1492 ' .
$DB->DateToCharFunction(
'D.DATE_LOCK') .
" DATE_LOCK,
1493 concat_ws(' ', " .
$DB->Concat(
"'('",
'UM.LOGIN',
"')'") .
", nullif(UM.NAME, ''), nullif(UM.LAST_NAME, '')) MUSER_NAME,
1494 concat_ws(' ', " .
$DB->Concat(
"'('",
'UE.LOGIN',
"')'") .
", nullif(UE.NAME, ''), nullif(UE.LAST_NAME, '')) EUSER_NAME,
1495 concat_ws(' ', " .
$DB->Concat(
"'('",
'UL.LOGIN',
"')'") .
", nullif(UL.NAME, ''), nullif(UL.LAST_NAME, '')) LUSER_NAME,
1496 S.TITLE STATUS_TITLE,
1498 when D.DATE_LOCK is null then 'green'
1499 when " . $helper->addSecondsToDateTime($MAX_LOCK * 60,
'D.DATE_LOCK') .
" < now() then 'green'
1500 when D.LOCKED_BY = " .
$uid .
" then 'yellow'
1501 else 'red' end LOCK_STATUS
1503 b_workflow_document D
1504 LEFT JOIN b_user UM ON (UM.ID = D.MODIFIED_BY)
1505 LEFT JOIN b_user UE ON (UE.ID = D.ENTERED_BY)
1506 LEFT JOIN b_user UL ON (UL.ID = D.LOCKED_BY)
1507 LEFT JOIN b_workflow_status S ON (S.ID = D.STATUS_ID)
1510 AND D.FILENAME = '" .
$DB->ForSql($FILENAME, 255) .
"'
1511 " . ($strSqlWhere ?
'AND ' . $strSqlWhere :
'') .
'
1525 static $arWhereFields = [
1527 'TABLE_ALIAS' =>
'L',
1528 'FIELD_NAME' =>
'L.ID',
1529 'FIELD_TYPE' =>
'int',
1533 'TABLE_ALIAS' =>
'L',
1534 'FIELD_NAME' =>
'L.DOCUMENT_ID',
1535 'FIELD_TYPE' =>
'int',
1539 'TABLE_ALIAS' =>
'L',
1540 'FIELD_NAME' =>
'L.MODIFIED_BY',
1541 'FIELD_TYPE' =>
'int',
1545 'TABLE_ALIAS' =>
'L',
1546 'FIELD_NAME' =>
'L.STATUS_ID',
1547 'FIELD_TYPE' =>
'int',
1551 $obQueryWhere->SetFields($arWhereFields);
1558 if ((
string)
$val ==
'' || (
string)
$val ==
'NOT_REF')
1566 $match_value_set = array_key_exists(
$key .
'_EXACT_MATCH',
$arFilter);
1574 $arSqlSearch[] = $obQueryWhere->GetQuery([
$key =>
$val]);
1577 case 'DATE_MODIFY_1':
1580 $arSqlSearch[] =
'L.TIMESTAMP_X >= ' .
$DB->CharToDateFunction(
$val,
'SHORT');
1584 case 'DATE_MODIFY_2':
1587 $arSqlSearch[] =
'L.TIMESTAMP_X < ' . $helper->addDaysToDateTime(1,
$DB->CharToDateFunction(
$val,
'SHORT'));
1591 case 'MODIFIED_USER':
1592 $match = ($match_value_set &&
$arFilter[
$key .
'_EXACT_MATCH'] ==
'Y') ?
'N' :
'Y';
1596 $arSqlSearch[] = $obQueryWhere->GetQuery([
'MODIFIED_BY' =>
$val]) .
' or ' .
$filter;
1602 $match = ($match_value_set &&
$arFilter[
$key .
'_EXACT_MATCH'] ==
'Y') ?
'N' :
'Y';
1607 $match = ($match_value_set &&
$arFilter[
$key .
'_EXACT_MATCH'] ==
'Y') ?
'N' :
'Y';
1612 $match = ($match_value_set &&
$arFilter[
$key .
'_EXACT_MATCH'] ==
'N') ?
'Y' :
'N';
1617 $match = ($match_value_set &&
$arFilter[
$key .
'_EXACT_MATCH'] ==
'Y') ?
'N' :
'Y';
1621 $arSqlSearch[] = $obQueryWhere->GetQuery([
'STATUS_ID' =>
$val]) .
' or ' .
$filter;
1631 $strSqlOrder =
'ORDER BY L.ID';
1633 elseif ($by ===
's_document_id')
1635 $strSqlOrder =
'ORDER BY L.DOCUMENT_ID';
1637 elseif ($by ===
's_date_modify')
1639 $strSqlOrder =
'ORDER BY L.TIMESTAMP_X';
1641 elseif ($by ===
's_modified_by')
1643 $strSqlOrder =
'ORDER BY L.MODIFIED_BY';
1645 elseif ($by ===
's_filename')
1647 $strSqlOrder =
'ORDER BY L.FILENAME';
1649 elseif ($by ===
's_site_id')
1651 $strSqlOrder =
'ORDER BY L.SITE_ID';
1653 elseif ($by ===
's_title')
1655 $strSqlOrder =
'ORDER BY L.TITLE';
1657 elseif ($by ===
's_status')
1659 $strSqlOrder =
'ORDER BY L.STATUS_ID';
1663 $strSqlOrder =
'ORDER BY L.ID';
1668 $strSqlOrder .=
' desc ';
1675 ' .
$DB->DateToCharFunction(
'L.TIMESTAMP_X') .
" TIMESTAMP_X,
1676 concat_ws(' ', " .
$DB->Concat(
"'('",
'U.LOGIN',
"')'") .
", nullif(U.NAME, ''), nullif(U.LAST_NAME, '')) USER_NAME,
1677 S.TITLE STATUS_TITLE
1680 LEFT JOIN b_workflow_status S ON (S.ID = L.STATUS_ID)
1681 LEFT JOIN b_user U ON (U.ID = L.MODIFIED_BY)
1683 " . $strSqlSearch .
'
1684 ' . $strSqlOrder .
'
1700 ' .
$DB->DateToCharFunction(
'L.TIMESTAMP_X') .
" TIMESTAMP_X,
1701 concat_ws(' ', " .
$DB->Concat(
"'('",
'U.LOGIN',
"')'") .
", nullif(U.NAME, ''), nullif(U.LAST_NAME, '')) USER_NAME,
1702 S.TITLE STATUS_TITLE
1705 LEFT JOIN b_workflow_status S ON (S.ID = L.STATUS_ID)
1706 LEFT JOIN b_user U ON (U.ID = L.MODIFIED_BY)
1720 $HISTORY_DAYS = COption::GetOptionInt(
'workflow',
'HISTORY_DAYS',
'-1');
1721 if ($HISTORY_DAYS >= 0)
1723 $strSql =
'DELETE FROM b_workflow_log WHERE TIMESTAMP_X < ' . $helper->addDaysToDateTime(-$HISTORY_DAYS);
1727 if (CModule::IncludeModule(
'iblock'))
1729 CIblockElement::WF_CleanUpHistory();
1738 $DAYS_AFTER_PUBLISHING = COption::GetOptionInt(
'workflow',
'DAYS_AFTER_PUBLISHING',
'0');
1739 if ($DAYS_AFTER_PUBLISHING >= 0)
1748 and DATE_MODIFY < ' . $helper->addDaysToDateTime(-$DAYS_AFTER_PUBLISHING) .
'
1751 while (
$zr =
$z->fetch())
1762 $DOCUMENT_ID = intval($DOCUMENT_ID);
1766 ' .
$DB->DateToCharFunction(
'F.TIMESTAMP_X') .
" TIMESTAMP_X,
1767 concat_ws(' ', " .
$DB->Concat(
"'('",
'U.LOGIN',
"')'") .
", nullif(U.NAME, ''), nullif(U.LAST_NAME, '')) USER_NAME
1769 b_workflow_document D
1770 INNER JOIN b_workflow_file F ON (F.DOCUMENT_ID = D.ID)
1771 LEFT JOIN b_user U ON (U.ID = F.MODIFIED_BY)
1773 D.ID = " . $DOCUMENT_ID .
'
1777 $z =
$DB->Query($strSql);
static getConnection($name="")
static getDocumentRoot($siteId=null)
static GetOperations($ID, $return_names=false)
static Lock($DOCUMENT_ID)
static CleanUpPublished()
static IsHaveEditRights($DOCUMENT_ID)
static GetFileByID($DOCUMENT_ID, $FILENAME)
static GetHistoryByID($ID)
static IsFilenameExists($FILENAME)
static OnChangeFile($path, $site)
static IsPreviewExists($FILENAME)
static GetStatus($DOCUMENT_ID)
static GetFileList($DOCUMENT_ID)
static IsAllowEdit($DOCUMENT_ID, &$locked_by, &$date_lock, $CHECK_RIGHTS='Y')
static LinkFiles2Document($arUploadedFiles, $DOCUMENT_ID)
static GetList($by='s_date_modify', $order='desc', $arFilter=[])
static __CheckSite($site)
static SetStatus($DOCUMENT_ID, $STATUS_ID, $OLD_STATUS_ID, $history=true)
static GetFileContent($did, $fname, $wf_path='', $site=false)
static CleanUpHistoryCopies($DOCUMENT_ID=false, $HISTORY_COPIES=false)
static DeletePreview($FILENAME, $site=false)
static Update($arFields, $DOCUMENT_ID)
static CleanUpHistoryCopies_SE($FILENAME, $HISTORY_COPIES=false)
static SetHistory($DOCUMENT_ID)
static GetHistoryList($by='s_id', $order='desc', $arFilter=[])
static CleanUpPreview($DOCUMENT_ID=false)
static GetEditLink($FILENAME, &$status_id, &$status_title, $template='', $lang=LANGUAGE_ID, $return_url='')
static GetByFilename($FILENAME, $SITE_ID, $arFilter=false)
static Delete($DOCUMENT_ID)
static GetUniquePreview($DOCUMENT_ID)
static GetLockStatus($DOCUMENT_ID, &$locked_by, &$date_lock)
static GetUniqueFilename($filename)
static DeleteHistory($ID)
static CleanUpFiles($DOCUMENT_ID=false, $FILE_ID=false)
static SetMove($DOCUMENT_ID, $STATUS_ID, $OLD_STATUS_ID, $LOG_ID)
static UnLock($DOCUMENT_ID)
static DeleteFile($FILENAME)
static GetList($by='s_c_sort', $order='asc', $arFilter=[], $is_filtered=null, $arSelect=[])
$_SERVER["DOCUMENT_ROOT"]
SetPrologTitle($prolog, $title)
if(!defined('SITE_ID')) $lang
ParseFileContent($filesrc, $params=[])
HasScriptExtension($check_name)
htmlspecialcharsbx($string, $flags=ENT_COMPAT, $doubleEncode=true)
TxtToHTML( $str, $bMakeUrls=true, $iMaxStringLen=0, $QUOTE_ENABLED="N", $NOT_CONVERT_AMPERSAND="Y", $CODE_ENABLED="N", $BIU_ENABLED="N", $quote_table_class="quotetable", $quote_head_class="tdquotehead", $quote_body_class="tdquote", $code_table_class="codetable", $code_head_class="tdcodehead", $code_body_class="tdcodebody", $code_textarea_class="codetextarea", $link_class="txttohtmllink", $arUrlEvent=[], $link_target="_self")
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Rel2Abs($curdir, $relpath)
GetMessage($name, $aReplace=null)
CheckDateTime($datetime, $format=false)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
if(empty($signedUserToken)) $key
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"