Exemple #1
0
 /**
  * <p>Возвращает список <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#event_type">типов событий</a>.</p>
  *
  *
  *
  *
  * @param string &$by = "s_today_counter" Поле для сортировки. Возможные значения: <ul> <li> <b>s_id</b> - ID типа
  * события; </li> <li> <b>s_date_last</b> - дата последнего <a
  * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#event">события</a> данного типа; </li> <li>
  * <b>s_date_enter</b> - дата первого события данного типа; </li> <li> <b>s_today_counter</b>
  * - количество событий данного типа за сегодня; </li> <li> <b>s_yesterday_counter</b>
  * - количество событий данного типа за вчера; </li> <li> <b>s_b_yesterday_counter</b> -
  * количество событий данного типа за позавчера; </li> <li> <b>s_total_counter</b> -
  * суммарное количество событий данного типа; </li> <li> <b>s_period_counter</b> -
  * количество событий данного типа за указанный период
  * <nobr>(<i>filter</i>[<b>DATE1_PERIOD</b>], <i>filter</i>[<b>DATE2_PERIOD</b>])</nobr>; </li> <li> <b>s_name</b> -
  * название типа события; </li> <li> <b>s_event1</b> - <a
  * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#event_type_id">идентификатор event1</a> типа
  * события; </li> <li> <b>s_event2</b> - идентификатор event2 типа события; </li> <li>
  * <b>s_event12</b> - сортировка по "EVENT1, EVENT2"; </li> <li> <b>s_chart</b> - сортировка по
  * "DIAGRAM_DEFAULT desc, TOTAL_COUNTER"; </li> <li> <b>s_stat</b> - сортировка по "TODAY_COUNTER desc,
  * YESTERDAY_COUNTER desc, B_YESTERDAY_COUNTER desc, TOTAL_COUNTER desc, PERIOD_COUNTER". </li> </ul>
  *
  *
  *
  * @param string &$order = "desc" Порядок сортировки. Возможные значения: <ul> <li> <b>asc</b> - по
  * возрастанию; </li> <li> <b>desc</b> - по убыванию. </li> </ul>
  *
  *
  *
  * @param array $filter = array() Массив для фильтрации результирующего списка. В массиве
  * допустимы следующие ключи: <ul> <li> <b>ID</b>* - ID типа события; </li> <li>
  * <b>ID_EXACT_MATCH</b> - если значение равно "N", то при фильтрации по <b>ID</b>
  * будет искаться вхождение; </li> <li> <b>EVENT1</b>* - идентификатор event1 типа
  * события; </li> <li> <b>EVENT1_EXACT_MATCH</b> - если значение равно "Y", то при
  * фильтрации по <b>EVENT1</b> будет искаться точное совпадение; </li> <li>
  * <b>EVENT2</b>* - идентификатор event2 типа события; </li> <li> <b>EVENT2_EXACT_MATCH</b> -
  * если значение равно "Y", то при фильтрации по <b>EVENT2</b> будет
  * искаться точное совпадение; </li> <li> <b>NAME</b>* - название типа события;
  * </li> <li> <b>NAME_EXACT_MATCH</b> - если значение равно "Y", то при фильтрации по
  * <b>NAME</b> будет искаться точное совпадение; </li> <li> <b>DESCRIPTION</b>* -
  * описание типа события; </li> <li> <b>DESCRIPTION_EXACT_MATCH</b> - если значение
  * равно "Y", то при фильтрации по <b>DESCRIPTION</b> будет искаться точное
  * совпадение; </li> <li> <b>DATE_ENTER_1</b> - начальное значение интервала для
  * поля "дата первого события данного типа"; </li> <li> <b>DATE_ENTER_2</b> -
  * конечное значение интервала для поля "дата первого события
  * данного типа"; </li> <li> <b>DATE_LAST_1</b> - начальное значение интервала для
  * поля "дата последнего события данного типа"; </li> <li> <b>DATE_LAST_2</b> -
  * конечное значение интервала для поля "дата последнего события
  * данного типа"; </li> <li> <b>DATE1_PERIOD</b> - начальное значение значение для
  * произвольного периода; </li> <li> <b>DATE2_PERIOD</b> - конечное значение
  * значение для произвольного периода; </li> <li> <b>COUNTER1</b> - начальное
  * значение интервала для поля "суммарное количество событий
  * данного типа"; </li> <li> <b>COUNTER2</b> - конечное значение интервала для
  * поля "суммарное количество событий данного типа"; </li> <li> <b>ADV_VISIBLE</b>
  * - флаг включать ли статистику по данному типу события в отчет по
  * рекламным кампаниям, возможные значения: <ul> <li> <b>Y</b> - включать; </li>
  * <li> <b>N</b> - не включать. </li> </ul> </li> <li> <b>DIAGRAM_DEFAULT</b> - флаг включать ли
  * данный тип события в круговую диаграмму и график по умолчанию,
  * возможные значения: <ul> <li> <b>Y</b> - включать; </li> <li> <b>N</b> - не включать.
  * </li> </ul> </li> <li> <b>KEEP_DAYS1</b> - начальное значение интервала для поля
  * "количество дней отведенное для хранения событий данного типа";
  * </li> <li> <b>KEEP_DAYS2</b> - конечное значение интервала для поля
  * "количество дней отведенное для хранения событий данного типа";
  * </li> <li> <b>DYNAMIC_KEEP_DAYS1</b> - начальное значение интервала для поля
  * "количество дней отведенное для хранения статистики по данному
  * типу события в разрезе по дням"; </li> <li> <b>DYNAMIC_KEEP_DAYS2</b> - конечное
  * значение интервала для поля "количество дней отведенное для
  * хранения статистики по данному типу события в разрезе по дням";
  * </li> <li> <b>MONEY1</b> - начальное значение интервала для поля "суммарная
  * денежная сумма для данного типа событий"; </li> <li> <b>MONEY2</b> - конечное
  * значение интервала для поля "суммарная денежная сумма для
  * данного типа событий"; </li> <li> <b>CURRENCY</b> - трехсимвольный
  * идентификатор валюты для денежной суммы; </li> <li> <b>GROUP</b> -
  * группировка результирующего списка, возможные значения: <ul> <li>
  * <b>event1</b> - группировка по <i>event1</i>; </li> <li> <b>event2</b> - группировка по
  * <i>event2</i>. </li> </ul> </li> </ul> * - допускается <a
  * href="http://dev.1c-bitrix.ru/api_help/main/general/filter.php">сложная логика</a>
  *
  *
  *
  * @param bool &$is_filtered  Флаг отфильтрованности результирующего списка. Если значение
  * равно "true", то список был отфильтрован.
  *
  *
  *
  * @param mixed $limit = false Максимальное число типов событий которые будут выбраны в списке.
  * Если значение равно "false", то кол-во РК будет ограничено в
  * соответствии со значением параметра <b>Максимальное кол-во
  * показываемых записей в таблицах</b> из настроек модуля
  * "Статистика".
  *
  *
  *
  * @return CDBResult 
  *
  *
  * <h4>Example</h4> 
  * <pre>
  * &lt;?
  * // получим данные только по тем типам событий 
  * // у которых event1 = "download"
  * // а также получим дополнительные данные на декабрь 2007 года
  * $arFilter = array(
  *     "DATE1_PERIOD" =&gt; "01.12.2007",
  *     "DATE2_PERIOD" =&gt; "31.12.2007",
  *     "EVENT1"       =&gt; "download"
  *     );
  * 
  * // получим список записей
  * $rs = <b>CStatEventType::GetList</b>(
  *     ($by = "s_today_counter"), 
  *     ($order = "desc"), 
  *     $arFilter, 
  *     $is_filtered
  *     );
  * 
  * // выведем все записи
  * while ($ar = $rs-&gt;Fetch())
  * {
  *     echo "&lt;pre&gt;"; print_r($ar); echo "&lt;/pre&gt;";    
  * }
  * ?&gt;
  * </pre>
  *
  *
  *
  * <h4>See Also</h4> 
  * <ul> <li> <a
  * href="http://dev.1c-bitrix.ru/api_help/statistic/classes/cstateventtype/getdynamiclist.php">CStatEventType::GetDynamicList</a>
  * </li> <li> <a
  * href="http://dev.1c-bitrix.ru/api_help/statistic/classes/cstateventtype/getsimplelist.php">CStatEventType::GetSimpleList</a>
  * </li> <li> <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#event_type">Термин "Тип
  * события"</a> </li> </ul> </ht<a name="examples"></a>
  *
  *
  * @static
  * @link http://dev.1c-bitrix.ru/api_help/statistic/classes/cstateventtype/getlist.php
  * @author Bitrix
  */
 public static function GetList(&$by, &$order, $arFilter = array(), &$is_filtered, $LIMIT = false)
 {
     $err_mess = "File: " . __FILE__ . "<br>Line: ";
     $DB = CDatabase::GetModuleConnection('statistic');
     $find_group = $arFilter["GROUP"];
     if ($find_group != "event1" && $find_group != "event2" && $find_group != "total") {
         $find_group = "";
     }
     $arSqlSearch = array();
     $arSqlSearch_h = array();
     $strSqlSearch_h = "";
     $filter_period = false;
     $strSqlPeriod = "";
     $strT = "";
     $CURRENCY = "";
     if (is_array($arFilter)) {
         ResetFilterLogic();
         $date1 = $arFilter["DATE1_PERIOD"];
         $date2 = $arFilter["DATE2_PERIOD"];
         $date_from = MkDateTime(ConvertDateTime($date1, "D.M.Y"), "d.m.Y");
         $date_to = MkDateTime(ConvertDateTime($date2, "D.M.Y") . " 23:59", "d.m.Y H:i");
         if (strlen($date1) > 0) {
             $filter_period = true;
             if (strlen($date2) > 0) {
                 $strSqlPeriod = "if(D.DATE_STAT<FROM_UNIXTIME('{$date_from}'),0, if(D.DATE_STAT>FROM_UNIXTIME('{$date_to}'),0,";
                 $strT = "))";
             } else {
                 $strSqlPeriod = "if(D.DATE_STAT<FROM_UNIXTIME('{$date_from}'),0,";
                 $strT = ")";
             }
         } elseif (strlen($date2) > 0) {
             $filter_period = true;
             $strSqlPeriod = "if(D.DATE_STAT>FROM_UNIXTIME('{$date_to}'),0,";
             $strT = ")";
         }
         foreach ($arFilter as $key => $val) {
             if (is_array($val)) {
                 if (count($val) <= 0) {
                     continue;
                 }
             } else {
                 if (strlen($val) <= 0 || $val === "NOT_REF") {
                     continue;
                 }
             }
             $match_value_set = array_key_exists($key . "_EXACT_MATCH", $arFilter);
             $key = strtoupper($key);
             switch ($key) {
                 case "ID":
                     $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $match_value_set ? "Y" : "N";
                     $arSqlSearch[] = GetFilterQuery("E." . $key, $val, $match);
                     break;
                 case "DATE_ENTER_1":
                     if (CheckDateTime($val)) {
                         $arSqlSearch[] = "E.DATE_ENTER>=" . $DB->CharToDateFunction($val, "SHORT");
                     }
                     break;
                 case "DATE_ENTER_2":
                     if (CheckDateTime($val)) {
                         $arSqlSearch[] = "E.DATE_ENTER<" . $DB->CharToDateFunction($val, "SHORT") . " + INTERVAL 1 DAY";
                     }
                     break;
                 case "DATE_LAST_1":
                     if (CheckDateTime($val)) {
                         $arSqlSearch_h[] = "max(D.DATE_LAST)>=" . $DB->CharToDateFunction($val, "SHORT");
                     }
                     break;
                 case "DATE_LAST_2":
                     if (CheckDateTime($val)) {
                         $arSqlSearch_h[] = "max(D.DATE_LAST)<" . $DB->CharToDateFunction($val, "SHORT") . " + INTERVAL 1 DAY";
                     }
                     break;
                 case "EVENT1":
                 case "EVENT2":
                     $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y";
                     $arSqlSearch[] = GetFilterQuery("E." . $key, $val, $match);
                     break;
                 case "COUNTER1":
                     $arSqlSearch_h[] = "TOTAL_COUNTER>='" . intval($val) . "'";
                     break;
                 case "COUNTER2":
                     $arSqlSearch_h[] = "TOTAL_COUNTER<='" . intval($val) . "'";
                     break;
                 case "MONEY1":
                     $arSqlSearch_h[] = "TOTAL_MONEY>='" . roundDB($val) . "'";
                     break;
                 case "MONEY2":
                     $arSqlSearch_h[] = "TOTAL_MONEY<='" . roundDB($val) . "'";
                     break;
                 case "ADV_VISIBLE":
                 case "DIAGRAM_DEFAULT":
                     $arSqlSearch[] = $val == "Y" ? "E." . $key . "='Y'" : "E." . $key . "='N'";
                     break;
                 case "DESCRIPTION":
                 case "NAME":
                     $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y";
                     $arSqlSearch[] = GetFilterQuery("E." . $key, $val, $match);
                     break;
                 case "KEEP_DAYS1":
                     $arSqlSearch[] = "E.KEEP_DAYS>='" . intval($val) . "'";
                     break;
                 case "KEEP_DAYS2":
                     $arSqlSearch[] = "E.KEEP_DAYS<='" . intval($val) . "'";
                     break;
                 case "DYNAMIC_KEEP_DAYS1":
                     $arSqlSearch[] = "E.DYNAMIC_KEEP_DAYS>='" . intval($val) . "'";
                     break;
                 case "DYNAMIC_KEEP_DAYS2":
                     $arSqlSearch[] = "E.DYNAMIC_KEEP_DAYS<='" . intval($val) . "'";
                     break;
                 case "CURRENCY":
                     $CURRENCY = $val;
                     break;
             }
         }
     }
     $rate = 1;
     $base_currency = GetStatisticBaseCurrency();
     $view_currency = $base_currency;
     if (strlen($base_currency) > 0) {
         if (CModule::IncludeModule("currency")) {
             if ($CURRENCY != $base_currency && strlen($CURRENCY) > 0) {
                 $rate = CCurrencyRates::GetConvertFactor($base_currency, $CURRENCY);
                 $view_currency = $CURRENCY;
             }
         }
     }
     if ($by == "s_id" && $find_group == "") {
         $strSqlOrder = "ORDER BY E.ID";
     } elseif ($by == "s_date_last") {
         $strSqlOrder = "ORDER BY E_DATE_LAST";
     } elseif ($by == "s_date_enter") {
         $strSqlOrder = "ORDER BY DATE_ENTER";
     } elseif ($by == "s_today_counter") {
         $strSqlOrder = "ORDER BY TODAY_COUNTER";
     } elseif ($by == "s_yesterday_counter") {
         $strSqlOrder = "ORDER BY YESTERDAY_COUNTER";
     } elseif ($by == "s_b_yesterday_counter") {
         $strSqlOrder = "ORDER BY B_YESTERDAY_COUNTER";
     } elseif ($by == "s_total_counter") {
         $strSqlOrder = "ORDER BY TOTAL_COUNTER";
     } elseif ($by == "s_period_counter") {
         $strSqlOrder = "ORDER BY PERIOD_COUNTER";
     } elseif ($by == "s_name" && $find_group == "") {
         $strSqlOrder = "ORDER BY E.NAME";
     } elseif ($by == "s_event1" && $find_group == "") {
         $strSqlOrder = "ORDER BY E.EVENT1";
     } elseif ($by == "s_event1" && $find_group == "event1") {
         $strSqlOrder = "ORDER BY E.EVENT1";
     } elseif ($by == "s_event2" && $find_group == "") {
         $strSqlOrder = "ORDER BY E.EVENT2";
     } elseif ($by == "s_event2" && $find_group == "event2") {
         $strSqlOrder = "ORDER BY E.EVENT2";
     } elseif ($by == "s_event12" && $find_group == "") {
         $strSqlOrder = "ORDER BY E.EVENT1, E.EVENT2";
     } elseif ($by == "s_chart" && $find_group == "") {
         $strSqlOrder = "ORDER BY E.DIAGRAM_DEFAULT desc, TOTAL_COUNTER ";
     } elseif ($by == "s_stat") {
         $strSqlOrder = "ORDER BY TODAY_COUNTER desc, YESTERDAY_COUNTER desc, B_YESTERDAY_COUNTER desc, TOTAL_COUNTER desc, PERIOD_COUNTER";
     } else {
         $by = "s_today_counter";
         $strSqlOrder = "ORDER BY TODAY_COUNTER desc, YESTERDAY_COUNTER desc, B_YESTERDAY_COUNTER desc, TOTAL_COUNTER desc, PERIOD_COUNTER";
     }
     if ($order != "asc") {
         $strSqlOrder .= " desc ";
         $order = "desc";
     }
     $strSqlSearch = GetFilterSqlSearch($arSqlSearch);
     foreach ($arSqlSearch_h as $sqlWhere) {
         $strSqlSearch_h .= " and (" . $sqlWhere . ") ";
     }
     $limit_sql = "LIMIT " . intval(COption::GetOptionString('statistic', 'RECORDS_LIMIT'));
     if (intval($LIMIT) > 0) {
         $limit_sql = "LIMIT " . intval($LIMIT);
     }
     if ($find_group == "") {
         $strSql = "\n\t\t\tSELECT\n\t\t\t\tE.ID,\n\t\t\t\tE.EVENT1,\n\t\t\t\tE.EVENT2,\n\t\t\t\tE.COUNTER,\n\t\t\t\tE.DIAGRAM_DEFAULT,\n\t\t\t\t'" . $DB->ForSql($view_currency) . "'\t\t\t\t\t\t\t\t\tCURRENCY,\n\t\t\t\t" . $DB->DateToCharFunction("E.DATE_ENTER") . "\t\t\t\t\t\tDATE_ENTER,\n\t\t\t\t" . $DB->DateToCharFunction("max(D.DATE_LAST)") . "\t\t\t\t\t\tDATE_LAST,\n\t\t\t\tmax(ifnull(D.DATE_LAST,'1980-01-01'))\t\t\t\t\t\t\tE_DATE_LAST,\n\t\t\t\tsum(ifnull(D.COUNTER,0))+ifnull(E.COUNTER,0)\t\t\t\t\t\tTOTAL_COUNTER,\n\t\t\t\tsum(round(ifnull(D.MONEY,0)*{$rate},2))+round(ifnull(E.MONEY,0)*{$rate},2)\t\t\tTOTAL_MONEY,\n\t\t\t\tsum(if(to_days(curdate())=to_days(D.DATE_STAT),ifnull(D.COUNTER,0),0))\t\t\tTODAY_COUNTER,\n\t\t\t\tsum(if(to_days(curdate())-to_days(D.DATE_STAT)=1,ifnull(D.COUNTER,0),0))\t\tYESTERDAY_COUNTER,\n\t\t\t\tsum(if(to_days(curdate())-to_days(D.DATE_STAT)=2,ifnull(D.COUNTER,0),0))\t\tB_YESTERDAY_COUNTER,\n\t\t\t\tsum(" . ($filter_period ? $strSqlPeriod . 'ifnull(D.COUNTER,0)' . $strT : 0) . ")\t\tPERIOD_COUNTER,\n\t\t\t\tsum(round(if(to_days(curdate())-to_days(D.DATE_STAT)=0,ifnull(D.MONEY,0),0)*{$rate},2))\tTODAY_MONEY,\n\t\t\t\tsum(round(if(to_days(curdate())-to_days(D.DATE_STAT)=1,ifnull(D.MONEY,0),0)*{$rate},2))\tYESTERDAY_MONEY,\n\t\t\t\tsum(round(if(to_days(curdate())-to_days(D.DATE_STAT)=2,ifnull(D.MONEY,0),0)*{$rate},2))\tB_YESTERDAY_MONEY,\n\t\t\t\tsum(round(" . ($filter_period ? $strSqlPeriod . 'ifnull(D.MONEY,0)' . $strT : 0) . "*{$rate},2))\tPERIOD_MONEY,\n\t\t\t\tE.NAME,\n\t\t\t\tE.DESCRIPTION,\n\t\t\t\tif (length(E.NAME)>0, E.NAME, concat(E.EVENT1,' / ',ifnull(E.EVENT2,'')))\t\tEVENT\n\t\t\tFROM\n\t\t\t\tb_stat_event E\n\t\t\tLEFT JOIN b_stat_event_day D ON (D.EVENT_ID = E.ID)\n\t\t\tWHERE\n\t\t\t{$strSqlSearch}\n\t\t\tGROUP BY E.ID\n\t\t\tHAVING\n\t\t\t\t'1'='1'\n\t\t\t\t{$strSqlSearch_h}\n\t\t\t{$strSqlOrder}\n\t\t\t{$limit_sql}\n\t\t\t";
         $res = $DB->Query($strSql, false, $err_mess . __LINE__);
     } elseif ($find_group == "total") {
         $arResult = array("TOTAL_COUNTER" => 0, "TOTAL_MONEY" => 0, "TODAY_COUNTER" => 0, "YESTERDAY_COUNTER" => 0, "B_YESTERDAY_COUNTER" => 0, "PERIOD_COUNTER" => 0, "TODAY_MONEY" => 0, "YESTERDAY_MONEY" => 0, "B_YESTERDAY_MONEY" => 0, "PERIOD_MONEY" => 0);
         $strSql = "\n\t\t\tSELECT\n\t\t\t\tsum(ifnull(D.COUNTER,0))\t\t\t\t\t\t\t\tTOTAL_COUNTER,\n\t\t\t\tsum(round(ifnull(D.MONEY,0)*{$rate},2))\t\t\t\t\t\t\tTOTAL_MONEY,\n\t\t\t\tsum(if(to_days(curdate())=to_days(D.DATE_STAT),ifnull(D.COUNTER,0),0))\t\t\tTODAY_COUNTER,\n\t\t\t\tsum(if(to_days(curdate())-to_days(D.DATE_STAT)=1,ifnull(D.COUNTER,0),0))\t\tYESTERDAY_COUNTER,\n\t\t\t\tsum(if(to_days(curdate())-to_days(D.DATE_STAT)=2,ifnull(D.COUNTER,0),0))\t\tB_YESTERDAY_COUNTER,\n\t\t\t\tsum(" . ($filter_period ? $strSqlPeriod . 'ifnull(D.COUNTER,0)' . $strT : 0) . ")\t\tPERIOD_COUNTER,\n\t\t\t\tsum(round(if(to_days(curdate())-to_days(D.DATE_STAT)=0,ifnull(D.MONEY,0),0)*{$rate},2))\tTODAY_MONEY,\n\t\t\t\tsum(round(if(to_days(curdate())-to_days(D.DATE_STAT)=1,ifnull(D.MONEY,0),0)*{$rate},2))\tYESTERDAY_MONEY,\n\t\t\t\tsum(round(if(to_days(curdate())-to_days(D.DATE_STAT)=2,ifnull(D.MONEY,0),0)*{$rate},2))\tB_YESTERDAY_MONEY,\n\t\t\t\tsum(round(" . ($filter_period ? $strSqlPeriod . 'ifnull(D.MONEY,0)' . $strT : 0) . "*{$rate},2))\tPERIOD_MONEY\n\t\t\tFROM\n\t\t\t\tb_stat_event E\n\t\t\t\tLEFT JOIN b_stat_event_day D ON (D.EVENT_ID = E.ID)\n\t\t\tWHERE\n\t\t\t\t{$strSqlSearch}\n\t\t\tHAVING\n\t\t\t\t'1'='1'\n\t\t\t\t{$strSqlSearch_h}\n\t\t\t";
         $res = $DB->Query($strSql, false, $err_mess . __LINE__);
         if ($ar = $res->Fetch()) {
             foreach ($ar as $k => $v) {
                 $arResult[$k] += $v;
             }
         }
         $strSql = "\n\t\t\tSELECT\n\t\t\t\tsum(ifnull(E.COUNTER,0))\t\tTOTAL_COUNTER,\n\t\t\t\tsum(round(ifnull(E.MONEY,0)*{$rate},2))\tTOTAL_MONEY\n\t\t\tFROM\n\t\t\t\tb_stat_event E\n\t\t\tWHERE\n\t\t\t\t{$strSqlSearch}\n\t\t\t";
         $res = $DB->Query($strSql, false, $err_mess . __LINE__);
         if ($ar = $res->Fetch()) {
             foreach ($ar as $k => $v) {
                 $arResult[$k] += $v;
             }
         }
         $arResult["CURRENCY"] = $view_currency;
         $res = new CDBResult();
         $res->InitFromArray(array($arResult));
     } else {
         $arResult = array();
         if ($find_group == "event1") {
             $group = "E.EVENT1";
         } else {
             $group = "E.EVENT2";
         }
         $strSql = "\n\t\t\tSELECT\n\t\t\t\t{$group}\t\t\t\t\t\t\t\t\t\t\tGROUPING_KEY,\n\t\t\t\t{$group},\n\t\t\t\t'" . $DB->ForSql($view_currency) . "'\t\t\t\t\t\t\t\t\tCURRENCY,\n\t\t\t\t" . $DB->DateToCharFunction("min(E.DATE_ENTER)") . "\t\t\t\t\tDATE_ENTER,\n\t\t\t\t" . $DB->DateToCharFunction("max(D.DATE_LAST)") . "\t\t\t\t\t\tDATE_LAST,\n\t\t\t\tmax(ifnull(D.DATE_LAST,'1980-01-01'))\t\t\t\t\t\t\tE_DATE_LAST,\n\t\t\t\tsum(ifnull(D.COUNTER,0))\t\t\t\t\t\t\t\tTOTAL_COUNTER,\n\t\t\t\tsum(round(ifnull(D.MONEY,0)*{$rate},2))\t\t\t\t\t\t\tTOTAL_MONEY,\n\t\t\t\tsum(if(to_days(curdate())=to_days(D.DATE_STAT),ifnull(D.COUNTER,0),0))\t\t\tTODAY_COUNTER,\n\t\t\t\tsum(if(to_days(curdate())-to_days(D.DATE_STAT)=1,ifnull(D.COUNTER,0),0))\t\tYESTERDAY_COUNTER,\n\t\t\t\tsum(if(to_days(curdate())-to_days(D.DATE_STAT)=2,ifnull(D.COUNTER,0),0))\t\tB_YESTERDAY_COUNTER,\n\t\t\t\tsum(" . ($filter_period ? $strSqlPeriod . 'ifnull(D.COUNTER,0)' . $strT : 0) . ")\t\tPERIOD_COUNTER,\n\t\t\t\tsum(round(if(to_days(curdate())-to_days(D.DATE_STAT)=0,ifnull(D.MONEY,0),0)*{$rate},2))\tTODAY_MONEY,\n\t\t\t\tsum(round(if(to_days(curdate())-to_days(D.DATE_STAT)=1,ifnull(D.MONEY,0),0)*{$rate},2))\tYESTERDAY_MONEY,\n\t\t\t\tsum(round(if(to_days(curdate())-to_days(D.DATE_STAT)=2,ifnull(D.MONEY,0),0)*{$rate},2))\tB_YESTERDAY_MONEY,\n\t\t\t\tsum(round(" . ($filter_period ? $strSqlPeriod . 'ifnull(D.MONEY,0)' . $strT : 0) . "*{$rate},2))\tPERIOD_MONEY\n\t\t\tFROM\n\t\t\t\tb_stat_event E\n\t\t\tLEFT JOIN b_stat_event_day D ON (D.EVENT_ID = E.ID)\n\t\t\tWHERE\n\t\t\t{$strSqlSearch}\n\t\t\tGROUP BY {$group}\n\t\t\tHAVING\n\t\t\t\t'1'='1'\n\t\t\t\t{$strSqlSearch_h}\n\t\t\t{$strSqlOrder}\n\t\t\t";
         $res = $DB->Query($strSql, false, $err_mess . __LINE__);
         while ($ar = $res->Fetch()) {
             $arResult[$ar["GROUPING_KEY"]] = $ar;
         }
         $strSql = "\n\t\t\tSELECT\n\t\t\t\t{$group}\t\t\t\t\t\t\tGROUPING_KEY,\n\t\t\t\t'" . $DB->ForSql($view_currency) . "'\t\t\t\t\tCURRENCY,\n\t\t\t\tsum(ifnull(E.COUNTER,0))\t\t\t\tCOUNTER,\n\t\t\t\tsum(round(ifnull(E.MONEY,0)*{$rate},2))\t\t\tTOTAL_MONEY,\n\t\t\t\t" . $DB->DateToCharFunction("min(E.DATE_ENTER)") . "\tDATE_ENTER\n\t\t\tFROM\n\t\t\t\tb_stat_event E\n\t\t\tWHERE\n\t\t\t{$strSqlSearch}\n\t\t\tGROUP BY {$group}\n\t\t\t";
         $res = $DB->Query($strSql, false, $err_mess . __LINE__);
         while ($ar = $res->Fetch()) {
             if (array_key_exists($ar["GROUPING_KEY"], $arResult)) {
                 $arResult[$ar["GROUPING_KEY"]]["TOTAL_COUNTER"] += $ar["COUNTER"];
                 $arResult[$ar["GROUPING_KEY"]]["TOTAL_MONEY"] += $ar["MONEY"];
             } else {
                 $arResult[$ar["GROUPING_KEY"]] = array("GROUPING_KEY" => $ar["GROUPING_KEY"], $find_group == "event1" ? "EVENT1" : "EVENT2" => $ar["GROUPING_KEY"], "CURRENCY" => $ar["CURRENCY"], "DATE_ENTER" => $ar["DATE_ENTER"], "TOTAL_COUNTER" => $ar["COUNTER"], "TOTAL_MONEY" => $ar["MONEY"], "TODAY_COUNTER" => 0, "YESTERDAY_COUNTER" => 0, "B_YESTERDAY_COUNTER" => 0, "PERIOD_COUNTER" => 0, "TODAY_MONEY" => 0, "YESTERDAY_MONEY" => 0, "B_YESTERDAY_MONEY" => 0, "PERIOD_MONEY" => 0);
                 /*DATE_LAST,E_DATE_LAST,*/
             }
         }
         $res = new CDBResult();
         $res->InitFromArray($arResult);
     }
     $is_filtered = IsFiltered($strSqlSearch) || $filter_period || strlen($strSqlSearch_h) > 0 || $find_group != "";
     return $res;
 }
Exemple #2
0
 function GetEventList($ID, &$by, &$order, $arFilter = array(), &$is_filtered)
 {
     $err_mess = "File: " . __FILE__ . "<br>Line: ";
     $DB = CDatabase::GetModuleConnection('statistic');
     $find_group = $arFilter["GROUP"];
     $ID = intval($ID);
     $arSqlSearch = array();
     $arSqlSearch_h = array();
     $strSqlSearch_h = "";
     $filter_period = false;
     $strSqlPeriod = "";
     $strT = "";
     if (is_array($arFilter)) {
         $date1 = $arFilter["DATE1_PERIOD"];
         $date2 = $arFilter["DATE2_PERIOD"];
         $date_from = MkDateTime(ConvertDateTime($date1, "D.M.Y"), "d.m.Y");
         $date_to = MkDateTime(ConvertDateTime($date2, "D.M.Y") . " 23:59", "d.m.Y H:i");
         if (strlen($date1) > 0) {
             $filter_period = true;
             if (strlen($date2) > 0) {
                 $strSqlPeriod = "sum(if(AE.DATE_STAT<FROM_UNIXTIME('{$date_from}'),0, if(AE.DATE_STAT>FROM_UNIXTIME('{$date_to}'),0,";
                 $strT = ")))";
             } else {
                 $strSqlPeriod = "sum(if(AE.DATE_STAT<FROM_UNIXTIME('{$date_from}'),0,";
                 $strT = "))";
             }
         } elseif (strlen($date2) > 0) {
             $filter_period = true;
             $strSqlPeriod = "sum(if(AE.DATE_STAT>FROM_UNIXTIME('{$date_to}'),0,";
             $strT = "))";
         }
         foreach ($arFilter as $key => $val) {
             if (is_array($val)) {
                 if (count($val) <= 0) {
                     continue;
                 }
             } else {
                 if (strlen($val) <= 0 || $val === "NOT_REF") {
                     continue;
                 }
             }
             $match_value_set = array_key_exists($key . "_EXACT_MATCH", $arFilter);
             $key = strtoupper($key);
             switch ($key) {
                 case "ID":
                     $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $match_value_set ? "Y" : "N";
                     $arSqlSearch[] = GetFilterQuery("E.ID", $val, $match);
                     break;
                 case "EVENT1":
                 case "EVENT2":
                     $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y";
                     $arSqlSearch[] = GetFilterQuery("E." . $key, $val, $match);
                     break;
                 case "KEYWORDS":
                     $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y";
                     $arSqlSearch[] = GetFilterQuery("E.DESCRIPTION, E.NAME", $val, $match);
                     break;
                 case "COUNTER_PERIOD_1":
                     $arSqlSearch_h[] = "COUNTER_PERIOD>='" . intval($val) . "'";
                     break;
                 case "COUNTER_PERIOD_2":
                     $arSqlSearch_h[] = "COUNTER_PERIOD<='" . intval($val) . "'";
                     break;
                 case "COUNTER_BACK_PERIOD_1":
                     $arSqlSearch_h[] = "COUNTER_BACK_PERIOD>='" . intval($val) . "'";
                     break;
                 case "COUNTER_BACK_PERIOD_2":
                     $arSqlSearch_h[] = "COUNTER_BACK_PERIOD<='" . intval($val) . "'";
                     break;
                 case "COUNTER_ADV_DYNAMIC_LIST":
                     $arSqlSearch_h[] = "(COUNTER_PERIOD>='" . intval($val) . "' or COUNTER_BACK_PERIOD>='" . intval($val) . "')";
                     break;
                 case "MONEY1":
                     $arSqlSearch_h[] = "(MONEY+MONEY_BACK)>='" . roundDB($val) . "'";
                     break;
                 case "MONEY2":
                     $arSqlSearch_h[] = "(MONEY+MONEY_BACK)<='" . roundDB($val) . "'";
                     break;
                 case "MONEY_PERIOD_1":
                     $arSqlSearch_h[] = "(MONEY_PERIOD+MONEY_BACK_PERIOD)>='" . roundDB($val) . "'";
                     break;
                 case "MONEY_PERIOD_2":
                     $arSqlSearch_h[] = "(MONEY_PERIOD+MONEY_BACK_PERIOD)<='" . roundDB($val) . "'";
                     break;
             }
         }
     }
     if ($by == "s_id") {
         $strSqlOrder = "ORDER BY E.ID";
     } elseif ($by == "s_event1") {
         $strSqlOrder = "ORDER BY E.EVENT1";
     } elseif ($by == "s_event2") {
         $strSqlOrder = "ORDER BY E.EVENT2";
     } elseif ($by == "s_sort") {
         $strSqlOrder = "ORDER BY C_SORT";
     } elseif ($by == "s_name") {
         $strSqlOrder = "ORDER BY E.NAME";
     } elseif ($by == "s_description") {
         $strSqlOrder = "ORDER BY E.DESCRIPTION";
     } elseif ($by == "s_counter") {
         $strSqlOrder = "ORDER BY COUNTER";
     } elseif ($by == "s_counter_back") {
         $strSqlOrder = "ORDER BY COUNTER_BACK";
     } elseif ($by == "s_counter_period") {
         $strSqlOrder = "ORDER BY COUNTER_PERIOD";
     } elseif ($by == "s_counter_back_period") {
         $strSqlOrder = "ORDER BY COUNTER_BACK_PERIOD";
     } elseif ($by == "s_counter_today") {
         $strSqlOrder = "ORDER BY COUNTER_TODAY";
     } elseif ($by == "s_counter_back_today") {
         $strSqlOrder = "ORDER BY COUNTER_BACK_TODAY";
     } elseif ($by == "s_counter_yestoday") {
         $strSqlOrder = "ORDER BY COUNTER_YESTERDAY";
     } elseif ($by == "s_counter_back_yestoday") {
         $strSqlOrder = "ORDER BY COUNTER_BACK_YESTERDAY";
     } elseif ($by == "s_counter_bef_yestoday") {
         $strSqlOrder = "ORDER BY COUNTER_BEF_YESTERDAY";
     } elseif ($by == "s_counter_back_bef_yestoday") {
         $strSqlOrder = "ORDER BY COUNTER_BACK_BEF_YESTERDAY";
     } elseif ($by == "s_def") {
         $strSqlOrder = "\n\t\t\tORDER BY\n\t\t\t\tE.C_SORT desc,\n\t\t\t\tCOUNTER_TODAY desc, COUNTER_BACK_TODAY desc,\n\t\t\t\tCOUNTER_YESTERDAY desc, COUNTER_BACK_YESTERDAY desc,\n\t\t\t\tCOUNTER_BEF_YESTERDAY desc, COUNTER_BACK_BEF_YESTERDAY desc,\n\t\t\t\t" . ($filter_period ? "COUNTER_PERIOD desc, COUNTER_BACK_PERIOD desc," : "") . "\n\t\t\t\tCOUNTER desc, COUNTER_BACK\n\t\t\t";
     } else {
         $by = "s_counter";
         $strSqlOrder = "ORDER BY COUNTER";
     }
     if ($order != "asc") {
         $strSqlOrder .= " desc ";
         $order = "desc";
     }
     $strSqlSearch = GetFilterSqlSearch($arSqlSearch);
     foreach ($arSqlSearch_h as $sqlWhere) {
         $strSqlSearch_h .= " and (" . $sqlWhere . ") ";
     }
     $find_group = strlen($find_group) <= 0 ? "NOT_REF" : $find_group;
     $sqlDays = "\n\t\t\tsum(if(to_days(curdate())=to_days(AE.DATE_STAT),ifnull(AE.COUNTER,0),0))\t\t\t\t\t\tCOUNTER_TODAY,\n\t\t\tsum(if(to_days(curdate())-to_days(AE.DATE_STAT)=1,ifnull(AE.COUNTER,0),0))\t\t\t\t\t\tCOUNTER_YESTERDAY,\n\t\t\tsum(if(to_days(curdate())-to_days(AE.DATE_STAT)=2,ifnull(AE.COUNTER,0),0))\t\t\t\t\t\tCOUNTER_BEF_YESTERDAY,\n\t\t\tsum(if(to_days(curdate())=to_days(AE.DATE_STAT),ifnull(AE.COUNTER_BACK,0),0))\t\t\t\t\tCOUNTER_BACK_TODAY,\n\t\t\tsum(if(to_days(curdate())-to_days(AE.DATE_STAT)=1,ifnull(AE.COUNTER_BACK,0),0))\t\t\t\t\tCOUNTER_BACK_YESTERDAY,\n\t\t\tsum(if(to_days(curdate())-to_days(AE.DATE_STAT)=2,ifnull(AE.COUNTER_BACK,0),0))\t\t\t\t\tCOUNTER_BACK_BEF_YESTERDAY,\n\t\t\t" . ($filter_period ? $strSqlPeriod . 'ifnull(AE.COUNTER,0)' . $strT : 'sum(AE.COUNTER)') . "\t\t\tCOUNTER_PERIOD,\n\t\t\t" . ($filter_period ? $strSqlPeriod . 'ifnull(AE.COUNTER_BACK,0)' . $strT : 'sum(AE.COUNTER_BACK)') . "\tCOUNTER_BACK_PERIOD,\n\n\t\t\tsum(if(to_days(curdate())=to_days(AE.DATE_STAT),ifnull(AE.MONEY,0),0))\t\t\t\t\t\t\tMONEY_TODAY,\n\t\t\tsum(if(to_days(curdate())-to_days(AE.DATE_STAT)=1,ifnull(AE.MONEY,0),0))\t\t\t\t\t\tMONEY_YESTERDAY,\n\t\t\tsum(if(to_days(curdate())-to_days(AE.DATE_STAT)=2,ifnull(AE.MONEY,0),0))\t\t\t\t\t\tMONEY_BEF_YESTERDAY,\n\t\t\tsum(if(to_days(curdate())=to_days(AE.DATE_STAT),ifnull(AE.MONEY_BACK,0),0))\t\t\t\t\t\tMONEY_BACK_TODAY,\n\t\t\tsum(if(to_days(curdate())-to_days(AE.DATE_STAT)=1,ifnull(AE.MONEY_BACK,0),0))\t\t\t\t\tMONEY_BACK_YESTERDAY,\n\t\t\tsum(if(to_days(curdate())-to_days(AE.DATE_STAT)=2,ifnull(AE.MONEY_BACK,0),0))\t\t\t\t\tMONEY_BACK_BEF_YESTERDAY,\n\t\t\t" . ($filter_period ? $strSqlPeriod . 'ifnull(AE.MONEY,0)' . $strT : 'sum(AE.MONEY)') . "\t\t\t\tMONEY_PERIOD,\n\t\t\t" . ($filter_period ? $strSqlPeriod . 'ifnull(AE.MONEY_BACK,0)' . $strT : 'sum(AE.MONEY_BACK)') . "\t\tMONEY_BACK_PERIOD,\n\t\t\t";
     if ($find_group == "NOT_REF") {
         $strSql = "\n\t\t\t\tSELECT\n\t\t\t\t\tE.ID, E.EVENT1, E.EVENT2, E.C_SORT, E.NAME, E.DESCRIPTION,\n\t\t\t\t\tsum(AE.COUNTER) COUNTER,\n\t\t\t\t\tsum(AE.COUNTER_BACK) COUNTER_BACK,\n\t\t\t\t\tsum(AE.MONEY) MONEY,\n\t\t\t\t\tsum(AE.MONEY_BACK) MONEY_BACK,\n\t\t\t\t\t{$sqlDays}\n\t\t\t\t\tif (length(E.NAME)>0, E.NAME,\n\t\t\t\t\t\tconcat(ifnull(E.EVENT1,''),' / ',ifnull(E.EVENT2,''))) EVENT\n\t\t\t\tFROM\n\t\t\t\t\tb_stat_event E,\n\t\t\t\t\tb_stat_adv_event_day AE\n\t\t\t\tWHERE\n\t\t\t\t{$strSqlSearch}\n\t\t\t\tand\tE.ADV_VISIBLE = 'Y'\n\t\t\t\tand AE.ADV_ID = '{$ID}'\n\t\t\t\tand AE.EVENT_ID = E.ID\n\t\t\t\tGROUP BY E.ID, E.EVENT1, E.EVENT2, E.C_SORT, E.NAME, E.DESCRIPTION\n\t\t\t\tHAVING\n\t\t\t\t\t1=1\n\t\t\t\t{$strSqlSearch_h}\n\t\t\t\t{$strSqlOrder}\n\t\t\t\tLIMIT " . intval(COption::GetOptionString('statistic', 'RECORDS_LIMIT')) . "\n\t\t\t\t";
     } else {
         if ($find_group == "event1") {
             $group = "E.EVENT1";
         } else {
             $group = "E.EVENT2";
         }
         $strSql = "\n\t\t\t\tSELECT\n\t\t\t\t\t{$group},\n\t\t\t\t\tsum(E.C_SORT) C_SORT,\n\t\t\t\t\t{$sqlDays}\n\t\t\t\t\tsum(AE.COUNTER) COUNTER,\n\t\t\t\t\tsum(AE.COUNTER_BACK) COUNTER_BACK,\n\t\t\t\t\tsum(AE.MONEY) MONEY,\n\t\t\t\t\tsum(AE.MONEY_BACK) MONEY_BACK\n\t\t\t\tFROM\n\t\t\t\t\tb_stat_event E,\n\t\t\t\t\tb_stat_adv_event_day AE\n\t\t\t\tWHERE\n\t\t\t\t{$strSqlSearch}\n\t\t\t\tand\tE.ADV_VISIBLE = 'Y'\n\t\t\t\tand AE.ADV_ID = '{$ID}'\n\t\t\t\tand AE.EVENT_ID = E.ID\n\t\t\t\tGROUP BY {$group}\n\t\t\t\tHAVING\n\t\t\t\t\t1=1\n\t\t\t\t{$strSqlSearch_h}\n\t\t\t\t{$strSqlOrder}\n\t\t\t\tLIMIT " . intval(COption::GetOptionString('statistic', 'RECORDS_LIMIT')) . "\n\t\t\t";
     }
     $res = $DB->Query($strSql, false, $err_mess . __LINE__);
     $is_filtered = IsFiltered($strSqlSearch) || $filter_period || strlen($strSqlSearch_h) > 0 || $find_group != "NOT_REF";
     return $res;
 }
 /**
  * @param double $file_size
  * @return CDBResult
  */
 function DecFileCounter($file_size = 0.0)
 {
     global $DB;
     $res = $DB->Query("\n\t\t\tUPDATE b_clouds_file_bucket\n\t\t\tSET FILE_COUNT = FILE_COUNT - 1\n\t\t\t" . ($file_size > 0.0 ? ",FILE_SIZE = if(FILE_SIZE - " . roundDB($file_size) . " > 0, FILE_SIZE - " . roundDB($file_size) . ", 0)" : "") . "\n\t\t\tWHERE ID = " . $this->_ID . " AND FILE_COUNT > 0\n\t\t");
     return $res;
 }
Exemple #4
0
 public static function UpdateMemberValues($CONTROLLER_MEMBER_ID, $arValues, $preserve = false)
 {
     global $DB;
     $CONTROLLER_MEMBER_ID = intval($CONTROLLER_MEMBER_ID);
     if (!$preserve) {
         $DB->Query("\n\t\t\t\tDELETE FROM b_controller_counter_value\n\t\t\t\tWHERE CONTROLLER_MEMBER_ID = " . $CONTROLLER_MEMBER_ID . "\n\t\t\t");
     }
     foreach ($arValues as $CONTROLLER_COUNTER_ID => $value) {
         $CONTROLLER_COUNTER_ID = intval($CONTROLLER_COUNTER_ID);
         if ($CONTROLLER_COUNTER_ID > 0) {
             if (isset($arValues["DATE_FORMAT"]) && CheckDateTime($value, $arValues["DATE_FORMAT"])) {
                 $sqlDate = $DB->CharToDateFunction($DB->FormatDate($value, $arValues["DATE_FORMAT"], CLang::GetDateFormat("FULL", LANGUAGE_ID)));
             } elseif (CheckDateTime($value, "YYYY-MM-DD HH:MI:SS")) {
                 $sqlDate = $DB->CharToDateFunction($DB->FormatDate($value, "YYYY-MM-DD HH:MI:SS", CLang::GetDateFormat("FULL", LANGUAGE_ID)));
             } else {
                 $sqlDate = "NULL";
             }
             if ($preserve) {
                 $DB->Query("\n\t\t\t\t\t\tDELETE FROM b_controller_counter_value\n\t\t\t\t\t\tWHERE CONTROLLER_MEMBER_ID = " . $CONTROLLER_MEMBER_ID . "\n\t\t\t\t\t\tAND CONTROLLER_COUNTER_ID = " . $CONTROLLER_COUNTER_ID . "\n\t\t\t\t\t");
             }
             $res = $DB->Query("\n\t\t\t\t\tINSERT INTO b_controller_counter_value\n\t\t\t\t\t(CONTROLLER_MEMBER_ID, CONTROLLER_COUNTER_ID, VALUE_INT, VALUE_FLOAT, VALUE_DATE, VALUE_STRING)\n\t\t\t\t\tSELECT\n\t\t\t\t\t\tcm.ID\n\t\t\t\t\t\t,cc.ID\n\t\t\t\t\t\t," . intval($value) . "\n\t\t\t\t\t\t," . roundDB($value) . "\n\t\t\t\t\t\t," . $sqlDate . "\n\t\t\t\t\t\t,'" . $DB->ForSQL($value, 255) . "'\n\t\t\t\t\tFROM\n\t\t\t\t\t\tb_controller_member cm\n\t\t\t\t\t\tINNER JOIN b_controller_counter_group ccg ON ccg.CONTROLLER_GROUP_ID = cm.CONTROLLER_GROUP_ID\n\t\t\t\t\t\tINNER JOIN b_controller_counter cc ON cc.ID = ccg.CONTROLLER_COUNTER_ID\n\t\t\t\t\tWHERE\n\t\t\t\t\t\tcm.ID = " . $CONTROLLER_MEMBER_ID . "\n\t\t\t\t\t\tand cc.ID = " . $CONTROLLER_COUNTER_ID . "\n\t\t\t\t", true);
             if (!$res) {
                 break;
             }
         }
     }
     return true;
 }
Exemple #5
0
 /**
  * <p>Возвращает список <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#event">событий</a>.</p>
  *
  *
  * @param string &$by = "s_id" Поле для сортировки. Возможные значения: <ul> <li> <b>s_id</b> - ID события;
  * </li> <li> <b>s_site_id</b> - ID сайта; </li> <li> <b>s_type_id</b> - ID <a
  * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#event_type">типа события</a>; </li> <li>
  * <b>s_event3</b> - <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#event3">дополнительный
  * параметр event3</a> события; </li> <li> <b>s_date_enter</b> - время создания события;
  * </li> <li> <b>s_adv_id</b> - ID <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#adv">рекламной
  * кампании</a>; </li> <li> <b>s_adv_back</b> - флаг <a
  * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#adv_back">возврата</a> либо <a
  * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#adv_first">прямого захода</a> по
  * рекламной кампании; </li> <li> <b>s_session_id</b> - ID <a
  * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#session">сессии</a>; </li> <li> <b>s_guest_id</b> - ID
  * <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#guest">посетителя</a>; </li> <li>
  * <b>s_hit_id</b> - ID <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#hit">хита</a>; </li> <li>
  * <b>s_url</b> - страница где зафиксированно событие; </li> <li> <b>s_referer_url</b> - <a
  * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#referer">ссылающаяся страница</a>; </li>
  * <li> <b>s_redirect_url</b> - страница куда был перенаправлен посетитель после
  * фиксации события; </li> <li> <b>s_country_id</b> - ID страны посетителя; </li> <li>
  * <b>s_money</b> - денежная сумма. </li> </ul>
  *
  * @param string &$order = "desc" Порядок сортировки. Возможные значения: <ul> <li> <b>asc</b> - по
  * возрастанию; </li> <li> <b>desc</b> - по убыванию. </li> </ul>
  *
  * @param array $filter = array() Массив для фильтрации результирующего списка. В массиве
  * допустимы следующие ключи: <ul> <li> <b>ID</b>* - ID события; </li> <li>
  * <b>ID_EXACT_MATCH</b> - если значение равно "N", то при фильтрации по <b>ID</b>
  * будет искаться вхождение; </li> <li> <b>EVENT_ID</b>* - ID типа события; </li> <li>
  * <b>EVENT_ID_EXACT_MATCH</b> - если значение равно "N", то при фильтрации по
  * <b>EVENT_ID</b> будет искаться вхождение; </li> <li> <b>EVENT_NAME</b>* - название
  * типа события; </li> <li> <b>EVENT_NAME_EXACT_MATCH</b> - если значение равно "Y", то
  * при фильтрации по <b>EVENT_NAME</b> будет искаться точное совпадение; </li>
  * <li> <b>EVENT1</b>* - <a
  * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#event_type_id">идентификатор event1</a> типа
  * события; </li> <li> <b>EVENT1_EXACT_MATCH</b> - если значение равно "Y", то при
  * фильтрации по <b>EVENT1</b> будет искаться точное совпадение; </li> <li>
  * <b>EVENT2</b>* - <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#event_type_id">идентификатор
  * event2</a> типа события; </li> <li> <b>EVENT2_EXACT_MATCH</b> - если значение равно "Y",
  * то при фильтрации по <b>EVENT2</b> будет искаться точное совпадение; </li>
  * <li> <b>EVENT3</b>* - дополнительный параметр event3 события; </li> <li>
  * <b>EVENT3_EXACT_MATCH</b> - если значение равно "Y", то при фильтрации по
  * <b>EVENT3</b> будет искаться точное совпадение; </li> <li> <b>DATE</b> - время
  * события (точное совпадение); </li> <li> <b>DATE1</b> - начальное значение
  * интервала для поля "дата события"; </li> <li> <b>DATE2</b> - начальное
  * значение интервала для поля "дата события"; </li> <li> <b>MONEY</b> -
  * денежная сумма события (точное совпадение); </li> <li> <b>MONEY1</b> -
  * начальное значение интервала для поля "денежная сумма"; </li> <li>
  * <b>MONEY2</b> - конечное значение интервала для поля "денежная сумма";
  * </li> <li> <b>CURRENCY</b> - трехсимвольный идентификатор валюты для
  * денежной суммы; </li> <li> <b>SESSION_ID</b>* - ID сессии; </li> <li> <b>SESSION_ID_EXACT_MATCH</b> -
  * если значение равно "N", то при фильтрации по <b>SESSION_ID</b> будет
  * искаться вхождение; </li> <li> <b>GUEST_ID</b>* - ID посетителя; </li> <li>
  * <b>GUEST_ID_EXACT_MATCH</b> - если значение равно "N", то при фильтрации по
  * <b>GUEST_ID</b> будет искаться вхождение; </li> <li> <b>ADV_ID</b>* - ID рекламной
  * кампании; </li> <li> <b>ADV_ID_EXACT_MATCH</b> - если значение равно "N", то при
  * фильтрации по <b>ADV_ID</b> будет искаться вхождение; </li> <li> <b>ADV_BACK</b> -
  * флаг "возврат по рекламной кампании", возможные значения: <ul> <li>
  * <b>Y</b> - был возврат; </li> <li> <b>N</b> - был прямой заход. </li> </ul> </li> <li>
  * <b>HIT_ID</b>* - ID хита; </li> <li> <b>HIT_ID_EXACT_MATCH</b> - если значение равно "N", то
  * при фильтрации по <b>HIT_ID</b> будет искаться вхождение; </li> <li>
  * <b>COUNTRY_ID</b>* - ID страны посетителя сгенерировавшего событие; </li> <li>
  * <b>COUNTRY_ID_EXACT_MATCH</b> - если значение равно "N", то при фильтрации по
  * <b>COUNTRY_ID</b> будет искаться вхождение; </li> <li> <b>COUNTRY</b>* - название
  * страны посетителя сгенерировавшего событие; </li> <li> <b>COUNTRY_EXACT_MATCH</b>
  * - если значение равно "Y", то при фильтрации по <b>COUNTRY</b> будет
  * искаться точное совпадение; </li> <li> <b>REFERER_URL</b>* - ссылающаяся
  * страница; </li> <li> <b>REFERER_URL_EXACT_MATCH</b> - если значение равно "Y", то при
  * фильтрации по <b>REFERER_URL</b> будет искаться точное совпадение; </li> <li>
  * <b>REFERER_SITE_ID</b> - ID сайта для ссылающейся страницы; </li> <li> <b>URL</b>* -
  * страница на которой было зафиксировано событие; </li> <li>
  * <b>URL_EXACT_MATCH</b> - если значение равно "Y", то при фильтрации по <b>URL</b>
  * будет искаться точное совпадение; </li> <li> <b>SITE_ID</b> - ID сайта для
  * страницы на которой было зафиксировано событие; </li> <li> <b>REDIRECT_URL</b>*
  * - страница куда был перенаправлен посетитель после фиксации
  * события; </li> <li> <b>REDIRECT_URL_EXACT_MATCH</b> - если значение равно "Y", то при
  * фильтрации по <b>REDIRECT_URL</b> будет искаться точное совпадение. </li> </ul>
  * * - допускается <a href="http://dev.1c-bitrix.ru/api_help/main/general/filter.php">сложная
  * логика</a>
  *
  * @param bool &$is_filtered  Флаг отфильтрованности результирующего списка. Если значение
  * равно "true", то список был отфильтрован.
  *
  * @return CDBResult 
  *
  * <h4>Example</h4> 
  * <pre>
  * &lt;?
  * // выберем все неудаленные события посетителя #1025
  * $arFilter = array(
  *     "GUEST_ID" =&gt; "1025"
  *     );
  * 
  * // получим список записей
  * $rs = <b>CStatEvent::GetList</b>(
  *     ($by = "s_id"), 
  *     ($order = "desc"), 
  *     $arFilter, 
  *     $is_filtered
  *     );
  * 
  * // выведем все записи
  * while ($ar = $rs-&gt;Fetch())
  * {
  *     echo "&lt;pre&gt;"; print_r($ar); echo "&lt;/pre&gt;";    
  * }
  * ?&gt;
  * </pre>
  *
  *
  * <h4>See Also</h4> 
  * <ul> <li> <a
  * href="http://dev.1c-bitrix.ru/api_help/statistic/classes/cstatevent/getlistbyguest.php">CStatEvent::GetListByGuest</a>
  * </li> <li> <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#event">Термин "Событие"</a> </li>
  * </ul> <a name="examples"></a>
  *
  *
  * @static
  * @link http://dev.1c-bitrix.ru/api_help/statistic/classes/cstatevent/getlist.php
  * @author Bitrix
  */
 public static function GetList(&$by, &$order, $arFilter = array(), &$is_filtered)
 {
     $err_mess = "File: " . __FILE__ . "<br>Line: ";
     $DB = CDatabase::GetModuleConnection('statistic');
     $arSqlSearch = array();
     $arSqlSearch_h = array();
     $strSqlSearch_h = "";
     $CURRENCY = "";
     if (is_array($arFilter)) {
         foreach ($arFilter as $key => $val) {
             if (is_array($val)) {
                 if (count($val) <= 0) {
                     continue;
                 }
             } else {
                 if (strlen($val) <= 0 || $val === "NOT_REF") {
                     continue;
                 }
             }
             $match_value_set = array_key_exists($key . "_EXACT_MATCH", $arFilter);
             $key = strtoupper($key);
             switch ($key) {
                 case "ID":
                 case "EVENT_ID":
                     $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $match_value_set ? "Y" : "N";
                     $arSqlSearch[] = GetFilterQuery("E." . $key, $val, $match);
                     break;
                 case "EVENT_NAME":
                     $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y";
                     $arSqlSearch[] = GetFilterQuery("V.NAME", $val, $match);
                     break;
                 case "EVENT1":
                 case "EVENT2":
                     $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y";
                     $arSqlSearch[] = GetFilterQuery("V." . $key, $val, $match);
                     break;
                 case "EVENT3":
                     $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y";
                     $arSqlSearch[] = GetFilterQuery("E.EVENT3", $val, $match);
                     break;
                 case "DATE":
                     if (CheckDateTime($val)) {
                         $arSqlSearch[] = "E.DATE_ENTER=" . $DB->CharToDateFunction($val);
                     }
                     break;
                 case "DATE1":
                     if (CheckDateTime($val)) {
                         $arSqlSearch[] = "E.DATE_ENTER>=" . $DB->CharToDateFunction($val, "SHORT");
                     }
                     break;
                 case "DATE2":
                     if (CheckDateTime($val)) {
                         $arSqlSearch[] = "E.DATE_ENTER<" . $DB->CharToDateFunction($val, "SHORT") . " + INTERVAL 1 DAY";
                     }
                     break;
                 case "REDIRECT_URL":
                     $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y";
                     $arSqlSearch[] = GetFilterQuery("E.REDIRECT_URL", $val, $match, array("/", "\\", ".", "?", "#", ":"));
                     break;
                 case "MONEY":
                     $arSqlSearch_h[] = "MONEY='" . roundDB($val) . "'";
                     break;
                 case "MONEY1":
                     $arSqlSearch_h[] = "MONEY>='" . roundDB($val) . "'";
                     break;
                 case "MONEY2":
                     $arSqlSearch_h[] = "MONEY<='" . roundDB($val) . "'";
                     break;
                 case "SESSION_ID":
                 case "GUEST_ID":
                 case "ADV_ID":
                 case "HIT_ID":
                 case "COUNTRY_ID":
                     $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $match_value_set ? "Y" : "N";
                     $arSqlSearch[] = GetFilterQuery("E." . $key, $val, $match);
                     break;
                 case "ADV_BACK":
                     $arSqlSearch[] = $val == "Y" ? "E.ADV_BACK='Y'" : "E.ADV_BACK='N'";
                     break;
                 case "REFERER_URL":
                 case "URL":
                     $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y";
                     $arSqlSearch[] = GetFilterQuery("E." . $key, $val, $match, array("/", "\\", ".", "?", "#", ":"));
                     break;
                 case "COUNTRY":
                     $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $match_value_set ? "N" : "Y";
                     $arSqlSearch[] = GetFilterQuery("C.NAME", $val, $match);
                     break;
                 case "SITE_ID":
                     if (is_array($val)) {
                         $val = implode(" | ", $val);
                     }
                     $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $match_value_set ? "Y" : "N";
                     $arSqlSearch[] = GetFilterQuery("E.SITE_ID", $val, $match);
                     break;
                 case "REFERER_SITE_ID":
                     if (is_array($val)) {
                         $val = implode(" | ", $val);
                     }
                     $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $match_value_set ? "Y" : "N";
                     $arSqlSearch[] = GetFilterQuery("E.REFERER_SITE_ID", $val, $match);
                     break;
                 case "CURRENCY":
                     $CURRENCY = $val;
                     break;
             }
         }
     }
     $rate = 1;
     $base_currency = GetStatisticBaseCurrency();
     $view_currency = $base_currency;
     if (strlen($base_currency) > 0) {
         if (CModule::IncludeModule("currency")) {
             if ($CURRENCY != $base_currency && strlen($CURRENCY) > 0) {
                 $rate = CCurrencyRates::GetConvertFactor($base_currency, $CURRENCY);
                 $view_currency = $CURRENCY;
             }
         }
     }
     $strSqlSearch = GetFilterSqlSearch($arSqlSearch);
     foreach ($arSqlSearch_h as $sqlWhere) {
         $strSqlSearch_h .= " and (" . $sqlWhere . ") ";
     }
     if ($by == "s_id") {
         $strSqlOrder = "ORDER BY E.ID";
     } elseif ($by == "s_site_id") {
         $strSqlOrder = "ORDER BY E.SITE_ID";
     } elseif ($by == "s_event_id" || $by == "s_type_id") {
         $strSqlOrder = "ORDER BY E.EVENT_ID";
     } elseif ($by == "s_event3") {
         $strSqlOrder = "ORDER BY E.EVENT3";
     } elseif ($by == "s_date_enter") {
         $strSqlOrder = "ORDER BY E.DATE_ENTER";
     } elseif ($by == "s_adv_id") {
         $strSqlOrder = "ORDER BY E.ADV_ID";
     } elseif ($by == "s_adv_back") {
         $strSqlOrder = "ORDER BY E.ADV_BACK";
     } elseif ($by == "s_session_id") {
         $strSqlOrder = "ORDER BY E.SESSION_ID";
     } elseif ($by == "s_guest_id") {
         $strSqlOrder = "ORDER BY E.GUEST_ID";
     } elseif ($by == "s_hit_id") {
         $strSqlOrder = "ORDER BY E.HIT_ID";
     } elseif ($by == "s_url") {
         $strSqlOrder = "ORDER BY E.URL";
     } elseif ($by == "s_referer_url") {
         $strSqlOrder = "ORDER BY E.REFERER_URL";
     } elseif ($by == "s_redirect_url") {
         $strSqlOrder = "ORDER BY E.REDIRECT_URL";
     } elseif ($by == "s_country_id") {
         $strSqlOrder = "ORDER BY E.COUNTRY_ID";
     } elseif ($by == "s_money") {
         $strSqlOrder = "ORDER BY MONEY";
     } else {
         $by = "s_id";
         $strSqlOrder = "ORDER BY E.ID";
     }
     if ($order != "asc") {
         $strSqlOrder .= " desc ";
         $order = "desc";
     }
     if ($arFilter["GROUP"] == "total") {
         $strSql = "\n\t\t\t\tSELECT\n\t\t\t\t\tCOUNT(1)\t\t\t\t\t\t\tCOUNTER,\n\t\t\t\t\tround(sum(if(E.CHARGEBACK='Y',-E.MONEY,E.MONEY)*{$rate}),2)\tMONEY,\n\t\t\t\t\t'" . $DB->ForSql($view_currency) . "'\t\t\t\t\t\tCURRENCY\n\t\t\t\tFROM\n\t\t\t\t\tb_stat_event_list E\n\t\t\t\tINNER JOIN b_stat_event V ON (V.ID=E.EVENT_ID)\n\t\t\t\tLEFT JOIN b_stat_country C ON (C.ID=E.COUNTRY_ID)\n\t\t\t\tWHERE\n\t\t\t\t{$strSqlSearch}\n\t\t\t\tHAVING\n\t\t\t\t\t1=1\n\t\t\t\t\t{$strSqlSearch_h}\n\t\t\t\t";
     } else {
         $strSql = "\n\t\t\t\tSELECT\n\t\t\t\t\tE.ID, E.EVENT3, E.EVENT_ID, E.ADV_ID, E.ADV_BACK, E.COUNTRY_ID, E.SESSION_ID, E.GUEST_ID, E.HIT_ID, E.REFERER_URL, E.URL, E.REDIRECT_URL, E.CHARGEBACK, E.SITE_ID, E.REFERER_SITE_ID,\n\t\t\t\t\tround((E.MONEY*{$rate}),2)\t\t\t\t\t\t\t\t\t\tMONEY,\n\t\t\t\t\t'" . $DB->ForSql($view_currency) . "'\t\t\t\t\t\t\t\t\t\t\t\tCURRENCY,\n\t\t\t\t\t" . $DB->DateToCharFunction("E.DATE_ENTER") . "\t\t\t\t\t\tDATE_ENTER,\n\t\t\t\t\tV.ID\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tTYPE_ID,\n\t\t\t\t\tV.DESCRIPTION, V.NAME, V.EVENT1, V.EVENT2,\n\t\t\t\t\tC.NAME\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tCOUNTRY_NAME,\n\t\t\t\t\tif (length(V.NAME)>0, V.NAME,\n\t\t\t\t\t\tconcat(ifnull(V.EVENT1,''),' / ',ifnull(V.EVENT2,'')))\t\tEVENT\n\t\t\t\tFROM\n\t\t\t\t\tb_stat_event_list E\n\t\t\t\tINNER JOIN b_stat_event V ON (V.ID=E.EVENT_ID)\n\t\t\t\tLEFT JOIN b_stat_country C ON (C.ID=E.COUNTRY_ID)\n\t\t\t\tWHERE\n\t\t\t\t{$strSqlSearch}\n\t\t\t\tHAVING\n\t\t\t\t\t1=1\n\t\t\t\t\t{$strSqlSearch_h}\n\t\t\t\t{$strSqlOrder}\n\t\t\t\tLIMIT " . intval(COption::GetOptionString('statistic', 'RECORDS_LIMIT')) . "\n\t\t\t\t";
     }
     $res = $DB->Query($strSql, false, $err_mess . __LINE__);
     $is_filtered = IsFiltered($strSqlSearch) || strlen($strSqlSearch_h) > 0;
     return $res;
 }
Exemple #6
0
	public static function UpdateMemberValues($CONTROLLER_MEMBER_ID, $arValues)
	{
		global $DB;
		$CONTROLLER_MEMBER_ID = intval($CONTROLLER_MEMBER_ID);

		$DB->Query("DELETE FROM b_controller_counter_value WHERE CONTROLLER_MEMBER_ID = ".$CONTROLLER_MEMBER_ID);
		foreach($arValues as $CONTROLLER_COUNTER_ID => $value)
		{
			$CONTROLLER_COUNTER_ID = intval($CONTROLLER_COUNTER_ID);
			if($CONTROLLER_COUNTER_ID > 0)
			{
				if(isset($arValues["DATE_FORMAT"]) && CheckDateTime($value, $arValues["DATE_FORMAT"]))
					$sqlDate = $DB->CharToDateFunction($DB->FormatDate($value, $arValues["DATE_FORMAT"], CLang::GetDateFormat("FULL", LANGUAGE_ID)));
				elseif(CheckDateTime($value, "YYYY-MM-DD HH:MI:SS"))
					$sqlDate = $DB->CharToDateFunction($DB->FormatDate($value, "YYYY-MM-DD HH:MI:SS", CLang::GetDateFormat("FULL", LANGUAGE_ID)));
				else
					$sqlDate = "NULL";

				$DB->Query("
					INSERT INTO b_controller_counter_value
					(CONTROLLER_MEMBER_ID, CONTROLLER_COUNTER_ID, VALUE_INT, VALUE_FLOAT, VALUE_DATE, VALUE_STRING)
					SELECT
						cm.ID
						,cc.ID
						,".intval($value)."
						,".roundDB($value)."
						,".$sqlDate."
						,'".$DB->ForSQL($value, 255)."'
					FROM
						b_controller_member cm
						INNER JOIN b_controller_counter_group ccg ON ccg.CONTROLLER_GROUP_ID = cm.CONTROLLER_GROUP_ID
						INNER JOIN b_controller_counter cc ON cc.ID = ccg.CONTROLLER_COUNTER_ID
					WHERE
						cm.ID = ".$CONTROLLER_MEMBER_ID."
						and cc.ID = ".$CONTROLLER_COUNTER_ID."
				");
			}
		}

		return true;
	}