/** * <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> * <? * // добавим событие по типу события #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"); * ?> * * <? * // добавим событие по типу события #2 * // данный тип должен быть заранее создан * * // специальный параметр события в закодированном виде * $gid = "BITRIX_SM.OTk1LjgyLk4wLjI1Lk4ucnU%3D"; * * // дата должна быть заданы в формате текущего сайта или языка * $date = "01.06.2005"; * * <b>CStatEvent::Add</b>(2, "", $date, $gid, "199", "EUR"); * ?> * </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); }
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; } }