Exemplo n.º 1
0
 /**
  * <p>Добавляет <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#event">событие</a> по заданному <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#event_type">типу</a> и <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#gid">специальному параметру</a>.</p> <p><b>Примечание</b>. Метод использует внутреннюю транзакцию. Если у вас используется <b>MySQL</b> и <b>InnoDB</b>, и ранее была открыта транзакция, то ее необходимо закрыть до подключения метода.</p>
  *
  *
  * @param int $type_id  ID типа события.
  *
  * @param string $event3  <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#event3">Дополнительный параметр
  * event3</a> события.
  *
  * @param string $date  Дата в <a href="http://dev.1c-bitrix.ru/api_help/main/general/constants.php#format_datetime">текущем
  * формате</a>.
  *
  * @param string $gid  <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#gid">Специальный параметр</a> в
  * котором закодированы все необходимые данные для добавления
  * события.
  *
  * @param mixed $money = "" Денежная сумма.
  *
  * @param string $currency = "" Трехсимвольный идентификатор валюты. Идентификаторы валют
  * задаются в модуле "Валюты".
  *
  * @param string $chargeback = "N" Флаг отрицательной суммы. Используется, когда необходимо
  * зафиксировать событие о возврате денег (chargeback). Возможные
  * значения: <ul> <li> <b>Y</b> - денежная сумма отрицательная; </li> <li> <b>N</b> -
  * денежная сумма положительная. </li> </ul>
  *
  * @return int <p>Функция возвращает ID добавленного события в случае успеха и 0
  * если событие не было добавлено по каким либо причинам.</p>
  *
  * <h4>Example</h4> 
  * <pre>
  * &lt;?
  * // добавим событие по типу события #1
  * // данный тип должен быть заранее создан
  * 
  * // специальный параметр события в незакодированном виде
  * $gid = "BITRIX_SM.995.82.N0.25.N.ru"; 
  * 
  * // дата должна быть заданы в формате текущего сайта или языка
  * $date = "23.12.2005 18:15:10";
  * 
  * <b>CStatEvent::Add</b>(1, "", $date, $gid, 99, "USD");
  * ?&gt;
  * 
  * &lt;?
  * // добавим событие по типу события #2
  * // данный тип должен быть заранее создан
  * 
  * // специальный параметр события в закодированном виде
  * $gid = "BITRIX_SM.OTk1LjgyLk4wLjI1Lk4ucnU%3D";
  * 
  * // дата должна быть заданы в формате текущего сайта или языка
  * $date = "01.06.2005";
  * 
  * <b>CStatEvent::Add</b>(2, "", $date, $gid, "199", "EUR");
  * ?&gt;
  * </pre>
  *
  *
  * <h4>See Also</h4> 
  * <ul> <li> <a
  * href="http://dev.1c-bitrix.ru/api_help/statistic/classes/cstatevent/addbyevents.php">CStatEvent::AddByEvents</a> </li>
  * <li> <a href="http://dev.1c-bitrix.ru/api_help/statistic/classes/cstatevent/addcurrent.php">CStatEvent::AddCurrent</a>
  * </li> <li> <a href="http://www.1c-bitrix.ru/user_help/statistic/events/event_edit.php">Загрузка
  * событий</a> </li> <li> <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#event">Термин
  * "Событие"</a> </li> <li> <a href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#event3">Термин
  * "Дополнительный параметр события (event3)"</a> </li> <li> <a
  * href="http://dev.1c-bitrix.ru/api_help/statistic/terms.php#gid">Термин "Специальный параметр
  * события"</a> </li> </ul> <a name="examples"></a>
  *
  *
  * @static
  * @link http://dev.1c-bitrix.ru/api_help/statistic/classes/cstatevent/add.php
  * @author Bitrix
  */
 public static function Add($EVENT_ID, $EVENT3, $DATE_ENTER, $PARAM, $MONEY = "", $CURRENCY = "", $CHARGEBACK = "N")
 {
     $err_mess = "File: " . __FILE__ . "<br>Line: ";
     $DB = CDatabase::GetModuleConnection('statistic');
     $EVENT_ID = intval($EVENT_ID);
     $EVENT_LIST_ID = 0;
     $strSql = "SELECT KEEP_DAYS FROM b_stat_event WHERE ID = {$EVENT_ID}";
     $rsEvent = $DB->Query($strSql, false, $err_mess . __LINE__);
     if ($arEvent = $rsEvent->Fetch()) {
         $MONEY = doubleval($MONEY);
         // если указана валюта то конвертируем
         if (strlen(trim($CURRENCY)) > 0) {
             $base_currency = GetStatisticBaseCurrency();
             if (strlen($base_currency) > 0) {
                 if ($CURRENCY != $base_currency) {
                     if (CModule::IncludeModule("currency")) {
                         $rate = CCurrencyRates::GetConvertFactor($CURRENCY, $base_currency);
                         if ($rate > 0 && $rate != 1) {
                             $MONEY = $MONEY * $rate;
                         }
                     }
                 }
             }
         }
         $MONEY = round($MONEY, 2);
         $arr = CStatEvent::DecodeGid($PARAM);
         $SESSION_ID = intval($arr["SESSION_ID"]);
         $GUEST_ID = intval($arr["GUEST_ID"]);
         $COUNTRY_ID = $arr["COUNTRY_ID"];
         $ADV_ID = intval($arr["ADV_ID"]);
         $ADV_BACK = $arr["ADV_BACK"] == "Y" ? "Y" : "N";
         $CHARGEBACK = $CHARGEBACK == "Y" ? "Y" : "N";
         $SITE_ID = $arr["SITE_ID"];
         $DATE_ENTER = strlen(trim($DATE_ENTER)) > 0 ? $DATE_ENTER : GetTime(time(), "FULL");
         $TIME_ENTER_TMSTMP = MakeTimeStamp($DATE_ENTER);
         if (!$TIME_ENTER_TMSTMP) {
             $DATE_ENTER = GetTime(time(), "FULL");
             $TIME_ENTER_TMSTMP = MakeTimeStamp($DATE_ENTER);
         }
         $TIME_ENTER_SQL = "FROM_UNIXTIME('" . $TIME_ENTER_TMSTMP . "')";
         $DAY_ENTER_TMSTMP = MakeTimeStamp($DATE_ENTER);
         $DAY_ENTER_SQL = "FROM_UNIXTIME('" . $DAY_ENTER_TMSTMP . "')";
         $DB->StartTransaction();
         $arFields = array("EVENT_ID" => $EVENT_ID, "EVENT3" => "'" . $DB->ForSql($EVENT3, 255) . "'", "MONEY" => $MONEY, "DATE_ENTER" => $TIME_ENTER_SQL, "SESSION_ID" => intval($SESSION_ID) > 0 ? intval($SESSION_ID) : "null", "GUEST_ID" => intval($GUEST_ID) > 0 ? intval($GUEST_ID) : "null", "ADV_ID" => intval($ADV_ID) > 0 ? intval($ADV_ID) : "null", "ADV_BACK" => $ADV_BACK == "Y" ? "'Y'" : "'N'", "COUNTRY_ID" => strlen($COUNTRY_ID) > 0 ? "'" . $DB->ForSql($COUNTRY_ID, 2) . "'" : "null", "KEEP_DAYS" => intval($arEvent["KEEP_DAYS"]) > 0 ? intval($arEvent["KEEP_DAYS"]) : "null", "CHARGEBACK" => "'" . $CHARGEBACK . "'", "SITE_ID" => strlen($SITE_ID) > 0 ? "'" . $DB->ForSql($SITE_ID, 2) . "'" : "null");
         $EVENT_LIST_ID = $DB->Insert("b_stat_event_list", $arFields, $err_mess . __LINE__);
         // увеличиваем счетчик для страны
         if (strlen($COUNTRY_ID) > 0) {
             CStatistics::UpdateCountry($COUNTRY_ID, array("C_EVENTS" => 1));
         }
         // если нужно обновляем дату первого события для данного типа события
         $arFields = array("DATE_ENTER" => $DB->GetNowFunction());
         $DB->Update("b_stat_event", $arFields, "WHERE ID='" . $EVENT_ID . "' and DATE_ENTER is null", $err_mess . __LINE__);
         // обновляем счетчик по дням для данного типа события
         $arFields = array("DATE_LAST" => $DB->GetNowFunction(), "COUNTER" => "COUNTER + 1", "MONEY" => "MONEY + " . $MONEY);
         $rows = $DB->Update("b_stat_event_day", $arFields, "WHERE EVENT_ID='" . $EVENT_ID . "' and DATE_STAT = " . $DAY_ENTER_SQL, $err_mess . __LINE__);
         // если обсчета по дням нет то
         if (intval($rows) <= 0) {
             // добавляем его
             $arFields_i = array("DATE_STAT" => $DAY_ENTER_SQL, "DATE_LAST" => $TIME_ENTER_SQL, "EVENT_ID" => $EVENT_ID, "COUNTER" => 1, "MONEY" => $MONEY);
             $DB->Insert("b_stat_event_day", $arFields_i, $err_mess . __LINE__);
         } elseif (intval($rows) > 1) {
             // удалим лишние
             $strSql = "SELECT ID FROM b_stat_event_day WHERE EVENT_ID='" . $EVENT_ID . "' and DATE_STAT = " . $DAY_ENTER_SQL . " ORDER BY ID";
             $i = 0;
             $rs = $DB->Query($strSql, false, $err_mess . __LINE__);
             while ($ar = $rs->Fetch()) {
                 $i++;
                 if ($i > 1) {
                     $strSql = "DELETE FROM b_stat_event_day WHERE ID = " . $ar["ID"];
                     $DB->Query($strSql, false, $err_mess . __LINE__);
                 }
             }
         }
         // обновляем сессию и гостя
         $arFields = array("C_EVENTS" => "C_EVENTS+1");
         $DB->Update("b_stat_session", $arFields, "WHERE ID=" . $SESSION_ID, $err_mess . __LINE__, false, false, false);
         $DB->Update("b_stat_guest", $arFields, "WHERE ID=" . $GUEST_ID, $err_mess . __LINE__, false, false, false);
         // обновляем дневной счетчик
         $arFields = array("C_EVENTS" => "C_EVENTS + 1");
         $DB->Update("b_stat_day", $arFields, "WHERE DATE_STAT = " . $DAY_ENTER_SQL, $err_mess . __LINE__, false, false, false);
         // увеличиваем счетчик траффика
         CTraffic::IncParam(array("EVENT" => 1), array(), false, $DATE_ENTER);
         // если сайт определен то
         if (strlen($SITE_ID) > 0) {
             // обновляем дневной счетчик
             $arFields = array("C_EVENTS" => "C_EVENTS+1");
             $DB->Update("b_stat_day_site", $arFields, "WHERE SITE_ID='" . $DB->ForSql($SITE_ID, 2) . "' and DATE_STAT = " . $DAY_ENTER_SQL, $err_mess . __LINE__);
             // увеличиваем счетчик траффика
             CTraffic::IncParam(array(), array("EVENT" => 1), $SITE_ID, $DATE_ENTER);
         }
         if ($ADV_ID > 0) {
             $a = $DB->Query("SELECT 'x' FROM b_stat_adv WHERE ID='" . $ADV_ID . "'", false, $err_mess . __LINE__);
             // если есть такая рекламная кампания то
             if ($ar = $a->Fetch()) {
                 // увеличиваем доход рекламной кампании
                 if ($MONEY != 0) {
                     $sign = $CHARGEBACK == "Y" ? "-" : "+";
                     $arFields = array("REVENUE" => "REVENUE " . $sign . " " . $MONEY);
                     $DB->Update("b_stat_adv", $arFields, "WHERE ID='{$ADV_ID}'", $err_mess . __LINE__, false, false, false);
                 }
                 // обновляем счетчик связки рекламной кампании и типа события
                 if ($ADV_BACK == "Y") {
                     $arFields = array("COUNTER_BACK" => "COUNTER_BACK + 1", "MONEY_BACK" => "MONEY_BACK + " . $MONEY);
                 } else {
                     $arFields = array("COUNTER" => "COUNTER + 1", "MONEY" => "MONEY + " . $MONEY);
                 }
                 $rows = $DB->Update("b_stat_adv_event", $arFields, "WHERE ADV_ID='{$ADV_ID}' and EVENT_ID='{$EVENT_ID}'", $err_mess . __LINE__);
                 // если связки нет то
                 if (intval($rows) <= 0 && intval($ADV_ID) > 0 && intval($EVENT_ID) > 0) {
                     // вставляем связку
                     $arFields = array("ADV_ID" => "'" . intval($ADV_ID) . "'", "EVENT_ID" => "'" . intval($EVENT_ID) . "'");
                     if ($ADV_BACK == "Y") {
                         $arFields["COUNTER_BACK"] = 1;
                         $arFields["MONEY_BACK"] = $MONEY;
                     } else {
                         $arFields["COUNTER"] = 1;
                         $arFields["MONEY"] = $MONEY;
                     }
                     $DB->Insert("b_stat_adv_event", $arFields, $err_mess . __LINE__);
                 }
                 // обновляем счетчик связки по дням
                 if ($ADV_BACK == "Y") {
                     $arFields = array("COUNTER_BACK" => "COUNTER_BACK + 1", "MONEY_BACK" => "MONEY_BACK + " . $MONEY);
                 } else {
                     $arFields = array("COUNTER" => "COUNTER + 1", "MONEY" => "MONEY + " . $MONEY);
                 }
                 $rows = $DB->Update("b_stat_adv_event_day", $arFields, "WHERE ADV_ID='{$ADV_ID}' and EVENT_ID='{$EVENT_ID}' and DATE_STAT = " . $DAY_ENTER_SQL, $err_mess . __LINE__, false, false, false);
                 // если нет такой связки то
                 if (intval($rows) <= 0 && intval($ADV_ID) > 0 && intval($EVENT_ID) > 0) {
                     // вставляем ее
                     $arFields = array("DATE_STAT" => $DAY_ENTER_SQL, "ADV_ID" => "'" . $ADV_ID . "'", "EVENT_ID" => "'" . $EVENT_ID . "'");
                     if ($ADV_BACK == "Y") {
                         $arFields["COUNTER_BACK"] = 1;
                         $arFields["MONEY_BACK"] = $MONEY;
                     } else {
                         $arFields["COUNTER"] = 1;
                         $arFields["MONEY"] = $MONEY;
                     }
                     $DB->Insert("b_stat_adv_event_day", $arFields, $err_mess . __LINE__);
                 }
             }
         }
         $DB->Commit();
     }
     return intval($EVENT_LIST_ID);
 }
Exemplo n.º 2
0
function LoadEventsBySteps($csvfile, $time_step, $next_line, &$step_processed, &$step_loaded, &$step_duplicate, $check_unique = "Y", $base_currency = "", &$next_pos)
{
    if ($fp = fopen($csvfile, "rb")) {
        if ($next_pos > 0) {
            fseek($fp, $next_pos);
        }
        $start = getmicrotime();
        $all_loaded = "";
        $next_line = intval($next_line);
        $read_lines = 0;
        $step_loaded = 0;
        $step_processed = 0;
        $step_duplicate = 0;
        while (!feof($fp)) {
            $arrCSV = fgetcsv($fp, 4096, ",");
            if (is_array($arrCSV) && count($arrCSV) > 0) {
                array_walk($arrCSV, "CleanUpResultCsv");
                $read_lines++;
                $step_processed++;
                $EVENT_ID = $arrCSV[0];
                $EVENT3 = $arrCSV[1];
                $DATE_ENTER = $arrCSV[2];
                $PARAMETER = $arrCSV[3];
                $MONEY = $arrCSV[4];
                $CURRENCY = $arrCSV[5];
                $CHARGEBACK = $arrCSV[6];
                $RES_MONEY = $MONEY;
                $EVENT_ID = intval($EVENT_ID);
                $CHARGEBACK = $CHARGEBACK == "Y" ? "Y" : "N";
                if ($EVENT_ID > 0) {
                    if (strlen($base_currency) <= 0) {
                        $base_currency = GetStatisticBaseCurrency();
                    }
                    if (strlen($base_currency) > 0) {
                        if ($CURRENCY != $base_currency && strlen(trim($CURRENCY)) > 0) {
                            if (CModule::IncludeModule("currency")) {
                                $stmp = MkDateTime(ConvertDateTime($DATE_ENTER, "D.M.Y H:I:S"), "d.m.Y H:i:s");
                                $valDate = date("Y-m-d", $stmp);
                                $rate = CCurrencyRates::GetConvertFactor($CURRENCY, $base_currency, $valDate);
                                if ($rate > 0) {
                                    $RES_MONEY = $MONEY * $rate;
                                }
                            }
                        }
                    }
                    $RES_MONEY = round($RES_MONEY, 2);
                    $add_event = "Y";
                    if ($check_unique == "Y") {
                        $arr = CStatEvent::DecodeGid($PARAMETER);
                        $arFilter = array("EVENT_ID" => $EVENT_ID, "EVENT3" => $EVENT3, "DATE" => $DATE_ENTER, "SESSION_ID" => $arr["SESSION_ID"], "GUEST_ID" => $arr["GUEST_ID"], "COUNTRY_ID" => $arr["COUNTRY_ID"], "ADV_ID" => $arr["ADV_ID"], "ADV_BACK" => $arr["ADV_BACK"], "SITE_ID" => $arr["SITE_ID"]);
                        $rsEvents = CStatEvent::GetListUniqueCheck($arFilter);
                        if ($arEvent = $rsEvents->Fetch()) {
                            $add_event = "N";
                            $step_duplicate++;
                        }
                    }
                    if ($add_event == "Y") {
                        CStatEvent::AddByID($EVENT_ID, $EVENT3, $DATE_ENTER, $PARAMETER, $RES_MONEY, "", $CHARGEBACK);
                        $step_loaded++;
                    }
                    $end = getmicrotime();
                    if (intval($time_step) > 0 && $end - $start > intval($time_step)) {
                        $all_loaded = "N";
                        break;
                    }
                }
            }
        }
        if ($all_loaded == "N") {
            $next_pos = ftell($fp);
        } else {
            $next_pos = 0;
        }
        @fclose($fp);
        if ($all_loaded != "N") {
            $all_loaded = "Y";
            @unlink($csvfile);
        }
        return $all_loaded;
    }
}