%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/support/classes/general/ |
| Current File : /home/bitrix/www/bitrix/modules/support/classes/general/timetable.php |
<?php
IncludeModuleLangFile(__FILE__);
class CSupportTimetable
{
static $fieldsTypes = array(
"ID" => array("TYPE" => CSupportTableFields::VT_NUMBER, "DEF_VAL" => 0, "AUTO_CALCULATED" => true),
"NAME" => array("TYPE" => CSupportTableFields::VT_STRING, "DEF_VAL" => "", "MAX_STR_LEN" => 255),
"DESCRIPTION" => array("TYPE" => CSupportTableFields::VT_STRING, "DEF_VAL" => "", "MAX_STR_LEN" => 2000),
);
static $fieldsTypesShedule = array(
"ID" => array("TYPE" => CSupportTableFields::VT_NUMBER, "DEF_VAL" => 0, "AUTO_CALCULATED" => true),
"SLA_ID" => array("TYPE" => CSupportTableFields::VT_NUMBER, "DEF_VAL" => 0),
"TIMETABLE_ID" => array("TYPE" => CSupportTableFields::VT_NUMBER, "DEF_VAL" => null),
"WEEKDAY_NUMBER" => array("TYPE" => CSupportTableFields::VT_NUMBER, "DEF_VAL" => 0),
"OPEN_TIME" => array("TYPE" => CSupportTableFields::VT_STRING, "DEF_VAL" => "24H", "LIST" => array("24H", "CLOSED", "CUSTOM")),
"MINUTE_FROM" => array("TYPE" => CSupportTableFields::VT_NUMBER, "DEF_VAL" => null),
"MINUTE_TILL" => array("TYPE" => CSupportTableFields::VT_NUMBER, "DEF_VAL" => null),
);
const TABLE = "b_ticket_timetable";
const TABLE_SHEDULE = "b_ticket_sla_shedule";
static function err_mess()
{
$module_id = "support";
@include($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/" . $module_id . "/install/version.php");
return "<br>Module: " . $module_id . " <br>Class: CSupportTimetable<br>File: " . __FILE__;
}
function Set($arFields, $arFieldsShedule) //$arFields, $arFieldsShedule = array(0 => array("ID" => 1 ...), 1 => array("ID" => 3 ...) ...)
{
global $DB, $APPLICATION;
$err_mess = (self::err_mess())."<br>Function: Set<br>Line: ";
$isDemo = null;
$isSupportClient = null;
$isSupportTeam = null;
$isAdmin = null;
$isAccess = null;
$userID = null;
CTicket::GetRoles($isDemo, $isSupportClient, $isSupportTeam, $isAdmin, $isAccess, $userID);
if(!$isAdmin)
{
$arMsg = Array();
$arMsg[] = array("id"=>"PERMISSION", "text"=> GetMessage("SUP_ERROR_ACCESS_DENIED"));
$e = new CAdminException($arMsg);
$APPLICATION->ThrowException($e);
return false;
}
if(is_array($arFields))
{
$f = new CSupportTableFields(self::$fieldsTypes);
$f->FromArray($arFields);
}
else $f = $arFields;
if(is_array($arFieldsShedule))
{
$f_s = new CSupportTableFields(self::$fieldsTypesShedule, CSupportTableFields::C_Table);
$f_s->FromTable($arFieldsShedule);
}
else $f_s = $arFieldsShedule;
$table = self::TABLE;
$table_shedule = self::TABLE_SHEDULE;
$id = $f->ID;
$isNew = ($f->ID <= 0);
if(strlen($f->NAME) <= 0)
{
$APPLICATION->ThrowException(GetMessage('SUP_ERROR_EMPTY_NAME'));
return false;
}
$arFields_i = $f->ToArray(CSupportTableFields::ALL, array(CSupportTableFields::NOT_NULL,CSupportTableFields::NOT_DEFAULT), true);
$res = 0;
if(count($arFields_i) > 0)
{
if($isNew)
{
$res = $DB->Insert($table, $arFields_i, $err_mess . __LINE__);
}
else
{
$res = $DB->Update($table, $arFields_i, "WHERE ID=" . $id . "", $err_mess . __LINE__);
}
}
if(intval($res) <= 0)
{
$APPLICATION->ThrowException(GetMessage('SUP_ERROR_DB_ERROR'));
return false;
}
if($isNew)
{
$id = $res;
}
$DB->Query("DELETE FROM $table_shedule WHERE TIMETABLE_ID = $id", false, $err_mess . __LINE__);
$noWrite = array();
$f_s->ResetNext();
while($f_s->Next())
{
$f_s->TIMETABLE_ID = $id;
if (isset($noWrite[$f_s->WEEKDAY_NUMBER]) && ($noWrite[$f_s->WEEKDAY_NUMBER] != "CUSTOM" || $f_s->OPEN_TIME != "CUSTOM") )
{
continue;
}
if($f_s->OPEN_TIME == "CUSTOM" && $f_s->MINUTE_FROM <= 0 && $f_s->MINUTE_TILL <= 0)
{
continue;
}
$DB->Insert($table_shedule, $f_s->ToArray(CSupportTableFields::ALL, array(CSupportTableFields::NOT_NULL), true), $err_mess . __LINE__);
$noWrite[$f_s->WEEKDAY_NUMBER] = $f_s->OPEN_TIME;
}
for($i = 0; $i <= 6; $i++)
{
$a = array(
"SLA_ID" => 0,
"TIMETABLE_ID" => intval($id),
"WEEKDAY_NUMBER" => intval($i),
"OPEN_TIME" => "'CLOSED'",
"MINUTE_FROM" => null,
"MINUTE_TILL" => null
);
if (!isset($noWrite[$i]))
{
$DB->Insert($table_shedule, $a, $err_mess . __LINE__);
}
}
// recalculate only affected sla
$affected_sla = array();
$res = $DB->Query("SELECT ID FROM b_ticket_sla WHERE TIMETABLE_ID = $id");
while ($row = $res->Fetch())
{
$affected_sla[] = $row['ID'];
}
CSupportTimetableCache::toCache(array('SLA_ID' => $affected_sla));
return $id;
}
// get Timetable list
function GetList($arSort = null, $arFilter = null)
{
$err_mess = (self::err_mess())."<br>Function: GetList<br>Line: ";
global $DB, $USER, $APPLICATION;
$table = self::TABLE;
$arSqlSearch = Array();
if(!is_array($arFilter))
{
$arFilter = Array();
}
foreach($arFilter as $key => $val)
{
if((is_array($val) && count($val) <= 0) || (!is_array($val) && (strlen($val) <= 0 || $val === 'NOT_REF')))
{
continue;
}
$key = strtoupper($key);
if (is_array($val))
{
$val = implode(" | ",$val);
}
switch($key)
{
case "ID":
$arSqlSearch[] = GetFilterQuery("T.ID", $val, "N");
break;
case "~NAME":
//case "DESCRIPTION":
$arSqlSearch[] = GetFilterQuery("T.NAME", $val, "N");
break;
}
}
$strSqlSearch = GetFilterSqlSearch($arSqlSearch);
$arSort = is_array($arSort) ? $arSort : array();
if(isset($arSort["DESCRIPTION"]))
{
unset($arSort["DESCRIPTION"]);
}
if(count($arSort) > 0)
{
$ar1 = array_merge($DB->GetTableFieldsList($table), array());
$ar2 = array_keys($arSort);
$arDiff = array_diff($ar2, $ar1);
if(is_array($arDiff) && count($arDiff) > 0) foreach($arDiff as $value) unset($arSort[$value]);
}
if(count($arSort) <= 0)
{
$arSort = array("ID" => "asc");
}
foreach($arSort as $by => $order)
{
if(strtoupper($order) != "DESC")
{
$order="ASC";
}
$arSqlOrder[] = $by . " " . $order;
}
if(is_array($arSqlOrder) && count($arSqlOrder) > 0)
{
$strSqlOrder = " ORDER BY " . implode(",", $arSqlOrder);
}
$strSql = "
SELECT
T.*
FROM
$table T
WHERE
$strSqlSearch
$strSqlOrder
";
$rs = $DB->Query($strSql, false, $err_mess.__LINE__);
return $rs;
}
function GetSheduleByID($id, $needObj = false)
{
global $DB;
$err_mess = (self::err_mess())."<br>Function: Set<br>Line: ";
$tableShedule = self::TABLE_SHEDULE;
$id = intval($id);
$strSql = "
SELECT
T.*
FROM
$tableShedule T
WHERE
T.TIMETABLE_ID = $id
";
$res = $DB->Query($strSql, false, $err_mess . __LINE__);
if(!$needObj)
{
return $res;
}
$f_s = new CSupportTableFields(self::$fieldsTypesShedule, CSupportTableFields::C_Table);
$f_s->RemoveExistingRows();
while ($resR = $res->Fetch())
{
$f_s->AddRow();
$f_s->FromArray($resR);
}
return $f_s;
}
// delete Timetable
function Delete($id, $checkRights=true)
{
$err_mess = (self::err_mess())."<br>Function: Delete<br>Line: ";
global $DB, $USER, $APPLICATION;
$id = intval($id);
$table = self::TABLE;
$tableShedule = self::TABLE_SHEDULE;
if($id <= 0)
{
return false;
}
$isDemo = null;
$isSupportClient = null;
$isSupportTeam = null;
$isAdmin = null;
$isAccess = null;
$userID = null;
CTicket::GetRoles($isDemo, $isSupportClient, $isSupportTeam, $isAdmin, $isAccess, $userID, $checkRights);
if(!$isAdmin)
{
$arMsg = Array();
$arMsg[] = array("id"=>"PERMISSION", "text"=> GetMessage("SUP_ERROR_ACCESS_DENIED"));
$e = new CAdminException($arMsg);
$APPLICATION->ThrowException($e);
return false;
}
$strSql = "SELECT DISTINCT 'x' FROM b_ticket_sla WHERE TIMETABLE_ID = $id";
$rs = $DB->Query($strSql, false, $err_mess.__LINE__);
if (!$rs->Fetch())
{
$DB->Query("DELETE FROM $table WHERE ID = $id", false, $err_mess . __LINE__);
$DB->Query("DELETE FROM $tableShedule WHERE TIMETABLE_ID = $id", false, $err_mess . __LINE__);
return true;
}
else
$APPLICATION->ThrowException(str_replace("#ID#", "$id", GetMessage("SUP_ERROR_TIMETABLE_HAS_SLA")));
return false;
}
}
?>