static function GetList($arSort=array(), $arFilter=Array(), $nPageTop = false)
{
global $DB, $USER;
$currentUser = (isset($USER) && ((get_class($USER) === 'CUser') || ($USER instanceof CUser))) ? $USER : (new CUser());
$arSqlSearch = Array();
$strSqlSearch = "";
$err_mess = (self::err_mess()).'
Function: GetList
Line: ';
if (isset($arFilter['ENTITY']))
{
$ar = explode('_', $arFilter['ENTITY']);
$arFilter['ENTITY_TYPE'] = CUserTypeCrm::GetLongEntityType($ar[0]);
$arFilter['ENTITY_ID'] = intval($ar[1]);
unset($arFilter['ENTITY']);
}
// permission check
$strPermission = "";
if (!$currentUser->IsAdmin())
{
$CCrmPerms = new CCrmPerms($currentUser->GetID());
$arUserAttr = array();
$arEntity = array();
if (empty($arFilter['ENTITY_TYPE']))
$arEntity = array('LEAD', 'DEAL', 'CONTACT', 'COMPANY', 'QUOTE');
else if (is_array($arFilter['ENTITY_TYPE']))
$arEntity = $arFilter['ENTITY_TYPE'];
else
$arEntity = array($arFilter['ENTITY_TYPE']);
$arInEntity = array();
foreach ($arEntity as $sEntityType)
{
$arEntityAttr = $CCrmPerms->GetUserAttrForSelectEntity($sEntityType, 'READ');
$arUserAttr[$sEntityType] = $arEntityAttr;
}
if (empty($arUserAttr))
{
$CDBResult = new CDBResult();
$CDBResult->InitFromArray(array());
return $CDBResult;
}
$arUserPerm = array();
foreach ($arUserAttr as $sEntityType => $_arAttrs)
{
if (isset($_arAttrs[0]) && is_array($_arAttrs[0]) && empty($_arAttrs[0]))
{
$arInEntity[] = $sEntityType;
continue;
}
foreach ($_arAttrs as $_arAttr)
{
if (empty($_arAttr))
continue;
$_icnt = count($_arAttr);
$_idcnt = -1;
foreach ($_arAttr as $sAttr)
if ($sAttr[0] == 'D')
$_idcnt++;
if ($_icnt == 1 && ($_idcnt == 1 || $_idcnt == -1))
$_idcnt = 0;
$arUserPerm[] = "(P.ENTITY = '$sEntityType' AND SUM(CASE WHEN P.ATTR = '".implode("' or P.ATTR = '", $_arAttr)."' THEN 1 ELSE 0 END) = ".($_icnt - $_idcnt).')';
}
}
$arPermission = array();
if (!empty($arInEntity))
$arPermission[] = " CER.ENTITY_TYPE IN ('".implode("','", $arInEntity)."')";
if (!empty($arUserPerm))
$arPermission[] = "
EXISTS(
SELECT 1
FROM b_crm_entity_perms P
WHERE P.ENTITY = CER.ENTITY_TYPE AND CER.ENTITY_ID = P.ENTITY_ID
GROUP BY P.ENTITY, P.ENTITY_ID
HAVING ".implode(" \n\t\t\t\t\t\t\t\tOR ", $arUserPerm)."
)";
if (!empty($arPermission))
$strPermission = 'AND ('.implode(' OR ', $arPermission).')';
}
$sOrder = '';
foreach($arSort as $key => $val)
{
$ord = (mb_strtoupper($val) <> 'ASC'? 'DESC':'ASC');
switch(mb_strtoupper($key))
{
case 'ID':
$sOrder .= ', CER.ID '.$ord;
break;
case 'CREATED_BY_ID':
$sOrder .= ', CE.CREATED_BY_ID '.$ord;
break;
case 'EVENT_TYPE':
$sOrder .= ', CE.EVENT_TYPE '.$ord;
break;
case 'ENTITY_TYPE':
$sOrder .= ', CER.ENTITY_TYPE '.$ord;
break;
case 'ENTITY_ID':
$sOrder .= ', CER.ENTITY_ID '.$ord;
break;
case 'EVENT_ID':
$sOrder .= ', CE.EVENT_ID '.$ord;
break;
case 'DATE_CREATE':
$sOrder .= ', CE.DATE_CREATE '.$ord;
break;
case 'EVENT_NAME':
$sOrder .= ', CE.EVENT_NAME '.$ord;
break;
case 'ENTITY_FIELD':
$sOrder .= ', CER.ENTITY_FIELD '.$ord;
break;
}
}
if ($sOrder == '')
$sOrder = 'CER.ID DESC';
$strSqlOrder = ' ORDER BY '.TrimEx($sOrder,',');
// where
$arWhereFields = array(
'ID' => array(
'TABLE_ALIAS' => 'CER',
'FIELD_NAME' => 'CER.ID',
'FIELD_TYPE' => 'int',
'JOIN' => false
),
'ENTITY_TYPE' => array(
'TABLE_ALIAS' => 'CER',
'FIELD_NAME' => 'CER.ENTITY_TYPE',
'FIELD_TYPE' => 'string',
'JOIN' => false
),
'EVENT_REL_ID' => array(
'TABLE_ALIAS' => 'CER',
'FIELD_NAME' => 'CER.EVENT_ID',
'FIELD_TYPE' => 'string',
'JOIN' => false
),
'EVENT_ID' => array(
'TABLE_ALIAS' => 'CE',
'FIELD_NAME' => 'CE.EVENT_ID',
'FIELD_TYPE' => 'string',
'JOIN' => false
),
'CREATED_BY_ID' => array(
'TABLE_ALIAS' => 'CE',
'FIELD_NAME' => 'CE.CREATED_BY_ID',
'FIELD_TYPE' => 'int',
'JOIN' => false
),
'ASSIGNED_BY_ID' => array(
'TABLE_ALIAS' => 'CER',
'FIELD_NAME' => 'CER.ASSIGNED_BY_ID',
'FIELD_TYPE' => 'int',
'JOIN' => false
),
'EVENT_TYPE' => array(
'TABLE_ALIAS' => 'CE',
'FIELD_NAME' => 'CE.EVENT_TYPE',
'FIELD_TYPE' => 'string',
'JOIN' => false
),
'EVENT_DESC' => array(
'TABLE_ALIAS' => 'CE',
'FIELD_NAME' => 'CE.EVENT_TEXT_1',
'FIELD_TYPE' => 'string',
'JOIN' => false
),
'ENTITY_ID' => array(
'TABLE_ALIAS' => 'CER',
'FIELD_NAME' => 'CER.ENTITY_ID',
'FIELD_TYPE' => 'int',
'JOIN' => false
),
'ENTITY_FIELD' => array(
'TABLE_ALIAS' => 'CER',
'FIELD_NAME' => 'CER.ENTITY_FIELD',
'FIELD_TYPE' => 'string',
'JOIN' => false
),
'DATE_CREATE' => array(
'TABLE_ALIAS' => 'CE',
'FIELD_NAME' => 'CE.DATE_CREATE',
'FIELD_TYPE' => 'datetime',
'JOIN' => false
)
);
$obQueryWhere = new CSQLWhere();
$obQueryWhere->SetFields($arWhereFields);
if (!is_array($arFilter))
$arFilter = array();
$sQueryWhereFields = $obQueryWhere->GetQuery($arFilter);
if (!empty($sQueryWhereFields))
$strSqlSearch .= "\n\t\t\t\tAND ($sQueryWhereFields) ";
$strSql = "
SELECT
CER.ID,
CER.ENTITY_TYPE,
CER.ENTITY_ID,
CER.ENTITY_FIELD,
".$DB->DateToCharFunction('CE.DATE_CREATE')." DATE_CREATE,
CER.EVENT_ID,
CE.EVENT_NAME,
CE.EVENT_TYPE,
CE.EVENT_TEXT_1,
CE.EVENT_TEXT_2,
CE.FILES,
CE.CREATED_BY_ID,
U.LOGIN as CREATED_BY_LOGIN,
U.NAME as CREATED_BY_NAME,
U.LAST_NAME as CREATED_BY_LAST_NAME,
U.SECOND_NAME as CREATED_BY_SECOND_NAME
FROM
b_crm_event_relations CER,
b_crm_event CE LEFT JOIN b_user U ON CE.CREATED_BY_ID = U.ID
WHERE
CER.EVENT_ID = CE.ID
$strSqlSearch
$strPermission
$strSqlOrder";
if ($nPageTop !== false)
{
$nPageTop = (int) $nPageTop;
$strSql = $DB->TopSql($strSql, $nPageTop);
}
$res = $DB->Query($strSql, false, $err_mess.__LINE__);
$res->SetUserFields(array('FILES' => array('MULTIPLE' => 'Y')));
return $res;
}