function process_conversion($data) { // Default account currency id: 16; RUB $main_currency_id = 16; $cnt = count($this->params); $i = 0; $is_lead = isset($data['is_lead']) ? 1 : 0; $is_sale = isset($data['is_sale']) ? 1 : 0; unset($data['is_lead']); unset($data['is_sale']); $arr_currencies = get_active_currencies(); $conversion_currency_code = strtoupper($data['txt_param20']); if ($conversion_currency_code == 'RUB') { $conversion_currency_code = 'RUR'; } $conversion_currency_id = 0; foreach ($arr_currencies as $id => $cur) { if ($cur['code'] == $conversion_currency_code) { $conversion_currency_id = $id; } } // Currency is not found in active, use default currency if ($conversion_currency_id == 0) { $conversion_currency_id = $main_currency_id; } if ($conversion_currency_id == $main_currency_id) { $conversion_profit = $data['profit']; } else { $conversion_profit = convert_currency($data['profit'], $conversion_currency_id, $main_currency_id, date('Y-m-d')); } $conversion_profit_currency = $data['profit']; // Специальная обработка "статусного постбэка" от сети CTR. // В этом случае приходит только статус, связанный с остальными данными через order_id (i3) // и нужно поменять статус соостветствующей конвертации. $ctr_order = false; // флаг, о том, что некоторые операции (замену логов) выполнять не нужно, // так как это не полный запрос, а только статус if ($data['network'] == 'CTR' and !empty($data['status'])) { $q = 'SELECT * FROM `tbl_conversions` WHERE (`i3` = "' . mysql_real_escape_string($data['i3']) . '" AND `network` = "CTR") LIMIT 1'; if ($rs = db_query($q) and mysql_num_rows($rs) > 0) { $r = mysql_fetch_assoc($rs); $data['subid'] = $r['subid']; } dmp($data); foreach ($data as $k => $v) { if (!in_array($k, array('network', 'i3', 'status', 'txt_status', 'ak', 'date_add', 'subid'))) { unset($data[$k]); } } $ctr_order = true; } if (isset($data['subid']) && $data['subid'] != '') { $table = 'tbl_clicks'; $subid = $data['subid']; // мы скоро обнулим массив data, а subid нам ещё понадобится $status = $data['status']; // Проверяем есть ли клик с этим SibID $q = 'SELECT `id`, `is_sale`, `is_lead` FROM `' . $table . '` WHERE `subid` = "' . mysql_real_escape_string($subid) . '"'; $r = mysql_query($q) or die($q . '<br />' . mysql_error()); if (mysql_num_rows($r) > 0) { $f = mysql_fetch_assoc($r); $click_id = $f['id']; if ($data['profit'] > 0) { $is_lead = $f['is_lead'] > 0 ? 1 : 0; $is_sale = 1; } else { $is_lead = 1; $is_sale = $f['is_sale'] > 0 ? 1 : 0; } $q = "UPDATE `" . $table . "` SET\n `is_sale` = " . intval($is_sale) . ",\n `is_lead` = " . intval($is_lead) . ",\n `conversion_currency_sum` = '" . mysql_real_escape_string($conversion_profit_currency) . "',\n `conversion_currency_id` = '" . mysql_real_escape_string($conversion_currency_id) . "',\n `conversion_price_main` = '" . mysql_real_escape_string($conversion_profit) . "'\n WHERE `id` = '" . mysql_real_escape_string($click_id) . "'"; mysql_query($q) or die(mysql_error()); } // ---------------------------- // Готовим данные для конверсии // ---------------------------- $upd = array(); // Инициализируем массив для запроса на обновление // Дополнительные поля, которых нет в $params, но которые нам нужны в БД $additional_fields = array('date_add', 'txt_status', 'status', 'network', 'type'); foreach ($data as $name => $value) { if (array_key_exists($name, $this->params) or in_array($name, $additional_fields)) { $upd[$name] = $value; unset($data[$name]); } } $upd['date_add'] = mysql_now(); // date('Y-m-d H:i:s'); $upd['profit'] = $conversion_profit; $upd['currency_id'] = $conversion_currency_id; $upd['profit_currency'] = $conversion_profit_currency; // Проверяем, есть ли уже конверсия с таким SubID $q = "SELECT * FROM `tbl_conversions` WHERE `subid` = '" . mysql_real_escape_string($subid) . "' LIMIT 1"; $r = db_query($q) or die(mysql_error()); if (mysql_num_rows($r) > 0) { $f = mysql_fetch_assoc($r); $upd['id'] = $conv_id = $f['id']; $q = updatesql($upd, 'tbl_conversions', 'id'); db_query($q); // Чистим логи if (!$ctr_order) { db_query('DELETE FROM `tbl_postback_params` WHERE `conv_id` = ' . $f['id']) or die(mysql_error()); } } else { $q = insertsql($upd, 'tbl_conversions'); db_query($q); $conv_id = mysql_insert_id(); } // Нужно ли нам отменить продажу? if ($status == 2) { delete_sale($click_id, $conv_id, 'sale'); } // Пишем postback логи foreach ($data as $name => $value) { if (strpos($name, 'pbsave_') !== false) { $name = str_replace('pbsave_', '', $name); $ins = array('conv_id' => $conv_id, 'name' => $name, 'value' => value); $q = insertsql($ins, 'tbl_postback_params'); db_query($q); } } } }
/** * Подготовка данных для отчётов: * subtype - колонка, по которой группируем данные (то же, что и group_by, если не задан limited_to) * limited_to - фильтр по subtype * group_by - группировка второго уровня, если задан limited_to * type - hourly, daily, monthly с каким шагом собираем статистику * from, to - временные рамки, за которые нужна статистика, обязательно в формате Y-m-d H:i:s * where - дополнительные условия выборки кликов * mode - режим выборки и группировки: offers, landings, lp_offers * cache - разрешить использовать кэш, 1 - из кэша, 2 - для кэша (без часового пояса) */ function get_clicks_report_grouped2($params) { global $group_types; // Флаги существующих параметров $campaign_params = array(1 => 0, 0, 0, 0, 0); $click_params = array(1 => 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); // По временным промежуткам $date_formats = array('hour' => 'H', 'day' => 'Y-m-d', 'month' => 'm.Y'); $groups = array('00' => 'click', '01' => 'lead', '10' => 'sale', '11' => 'sale_lead'); // Смещение часового пояса $timezone_shift = get_current_timezone_shift(); $timezone_shift_sec = get_current_timezone_shift(true); $timezone_backup = date_default_timezone_get(); // Поправка на разницу времени PHP и Базы $timezone_shift_sec += strtotime(mysql_now()) - time(); $rows = array(); // все клики за период $data = array(); // сгруппированные данные $data2 = array(); $arr_dates = array(); // даты для отчёта if ($params['part'] == 'month') { $arr_dates = getMonthsBetween($params['from'], $params['to']); } elseif ($params['part'] == 'day') { $arr_dates = getDatesBetween($params['from'], $params['to']); } elseif ($params['part'] == 'hour') { $arr_dates = getHours24(); } global $pop_sort_by, $pop_sort_order; $pop_sort_by = 'cnt'; $pop_sort_order = 1; // Режим показов конвертаций, все, только действия, только продажи, только лиды, без конвертаций. // В отчете "популярных параметров" этот фильтр работает ТОЛЬКО как параметр сортировки, в других режимах как условие для WHERE if ($params['conv'] != 'all') { if ($params['mode'] == 'popular') { if ($params['conv'] == 'sale') { $pop_sort_by = 'sale'; } elseif ($params['conv'] == 'lead') { $pop_sort_by = 'lead'; } elseif ($params['conv'] == 'act') { $pop_sort_by = 'act'; } elseif ($params['conv'] == 'none') { $pop_sort_by = $params['col']; $pop_sort_order = -1; } } else { /* Если так сделать - то не посчитаются клики if($params['conv'] == 'sale') { $params['where'] = '`is_sale` = 1'; } elseif($params['conv'] == 'lead') { $params['where'] = '`is_lead` = 1'; } elseif($params['conv'] == 'act') { $params['where'] = '(`is_sale` = 1 or `is_lead` = 1)'; } elseif($params['conv'] == 'none') { //$params['where'] = ''; $params['where'] = '`is_sale` = 0 and `is_lead` = 0'; } */ } } $parent_clicks = array(); // массив для единичного зачёта дочерних кликов (иначе у нас LP CTR больше 100% может быть) $limit = 5000; $start = 0; $start_s = 0; $more = 1; // Используем кэш if ($params['cache'] == 1) { list($data, $click_params, $campaign_params) = load_from_cache($params); $load_live_data = 0; } else { $load_live_data = 1; } if ($load_live_data) { while ($more) { $rows = array(); // Получаем порцию данных list($more, $start, $start_s, $rows, $campaign_params, $click_params) = get_clicks_rows($params, $start, $start_s, $limit, $campaign_params, $click_params); // Режим обработки для Landing Page // группируем всю информацию с подчинённых переходов на родительские if ($params['mode'] == 'lp' or $params['mode'] == '') { foreach ($rows as $k => $r) { if ($r['parent_id'] > 0) { // ссылка на оффер if (parent_row($r['parent_id'], 'id') == 0) { unset($rows[$k]); // не найден лэндинг, удаляем переход continue; } // не будем считать более одного исходящего с лэндинга $out_calc = isset($parent_clicks[$r['parent_id']]) ? 0 : 1; $parent_clicks[$r['parent_id']] = 1; // исходящие $rows[$r['parent_id']]['out'] += $out_calc; } } } if ($params['mode'] == 'lp_offers') { foreach ($rows as $k => $r) { if ($r['parent_id'] > 0) { // ссылка на оффер // Несём продажи наверх, к лэндингу $rows[$r['parent_id']]['is_sale'] += $r['is_sale']; $rows[$r['parent_id']]['is_lead'] += $r['is_lead']; $rows[$r['parent_id']]['conversion_price_main'] += $r['conversion_price_main']; // А расходы вниз, к офферу $rows[$k]['click_price'] += $rows[$r['parent_id']]['click_price']; // Считаем исходящие для лэндингов $out_calc = isset($parent_clicks[$r['parent_id']]) ? 0 : 1; $parent_clicks[$r['parent_id']] = 1; $rows[$r['parent_id']]['out'] += $out_calc; } } } // Фильтры показа if (!empty($params['filter'][1])) { $parent_clicks2 = array(); // $parent_clicks у нас для исходящих, а тут костыль ( $rows_new = array(); // сюда будем складывать новые строчки, вместо unset существующих foreach ($rows as $k => $v) { if ($v['parent_id'] > 0) { if (empty($parent_clicks2[$v['parent_id']])) { $parent_clicks2[$v['parent_id']] = 1; } else { continue; } } //dmp($params['filter'][1]); $viz_filter = 1; foreach ($params['filter'][1] as $name => $value) { list($cur_val, $parent_val) = explode('|', $value); if ($name == 'referer') { $v[$name] = param_key($v, $name); } if ($params['subgroup_by'] == 'out_id' and ($parent_val == 0 and ($v[$name] == $cur_val or parent_row($v['parent_id'], $name) == $cur_val) or $parent_val > 0 and ($v['parent_id'] > 0 and parent_row($v['parent_id'], $name) == $parent_val) and $v[$name] == $cur_val) or $v[$name] == $cur_val and (empty($parent_val) or $v[$params['group_by']] == $parent_val)) { /* $lp_offers_valid[$cur_val] = 1; // Сбрасываем parent_id, чтобы оффер у нас был как бы "самостоятельный", без лэндинга. Иначе придётся дорабатывать шаблон отчёта if($parent_val > 0) { $v['parent_id'] = 0; } $rows_new[$k] = $v; */ //dmp($v); } else { $viz_filter = 0; break; } } if ($viz_filter) { //echo '1'; $lp_offers_valid[$cur_val] = 1; // Сбрасываем parent_id, чтобы оффер у нас был как бы "самостоятельный", без лэндинга. Иначе придётся дорабатывать шаблон отчёта if ($parent_val > 0) { $v['parent_id'] = 0; } $rows_new[$k] = $v; } } //dmp($rows_new); $rows = $rows_new; unset($rows_new); // Прибираемся unset($parent_clicks2); } //dmp($rows); // Режим популярных значений // Вынесен в отдельное условие из-за особой обработки по дням и месяцам if ($params['mode'] == 'popular') { foreach ($rows as $r) { foreach ($group_types as $k => $v) { $name = param_key($r, $k); $data[$k][$name]['cnt'] += $r['cnt']; $data[$k][$name]['price'] += $r['click_price']; $data[$k][$name]['unique'] += $r['is_unique']; $data[$k][$name]['income'] += $r['conversion_price_main']; $data[$k][$name]['sale'] += $r['is_sale']; $data[$k][$name]['lead'] += $r['is_lead']; $data[$k][$name]['act'] += $r['is_lead'] + $r['is_sale']; $data[$k][$name]['out'] += $r['out']; // Продажи + Лиды = Действия. $sl = $r['is_sale'] + $r['is_lead']; if ($sl > 2) { $sl = 2; } // Не более двух на переход $data[$k][$name]['sale_lead'] += $sl; // Если это не общий режим - добавляем информацию о датах if ($params['part'] != 'all') { //$k1 = (trim($r['name']) == '' ? '{empty}' : $r['name']); $k2 = date($date_formats[$params['part']], $r['time_add']); //$k3 = $groups[$r['is_sale'].$r['is_lead']]; /* $data2[$k][$name][$k2][$k3]['cnt'] += 1; $data2[$k][$name][$k2][$k3]['cost'] += $r['clicks_price']; $data2[$k][$name][$k2][$k3]['earnings'] += $r['conversions_sum']; $data2[$k][$name][$k2][$k3]['is_parent_cnt'] += $r['is_parent']; */ $data2[$k][$name][$k2]['cnt'] += 1; $data2[$k][$name][$k2]['cost'] += $r['clicks_price']; $data2[$k][$name][$k2]['earnings'] += $r['conversions_sum']; $data2[$k][$name][$k2]['is_parent_cnt'] += $r['is_parent']; stat_inc($data2[$k][$name][$k2], $r, $name, $r['name']); } } } // Режим показа группировки офферов и лэндингов // Тоже вынесен в отдельное условие из-за особой обработки по дням и месяцам } elseif ($params['mode'] == 'lp_offers') { $parent_clicks = array(); // массив для единичного зачёта дочерних кликов (иначе у нас LP CTR больше 100% может быть) // Вся статистика, без разбиения по времени foreach ($rows as $r) { $k = param_key($r, $params['group_by']); $name = param_val($r, $params['group_by']); if (!isset($data[$k])) { $data[$k] = array('id' => $k, 'name' => $name, 'price' => 0, 'unique' => 0, 'income' => 0, 'direct' => 0, 'sale' => 0, 'lead' => 0, 'out' => 0, 'cnt' => 0, 'sale_lead' => 0); } // Продажи + Лиды = Действия. $r['sale_lead'] = $r['is_sale'] + $r['is_lead']; if ($r['sale_lead'] > 2) { $r['sale_lead'] = 2; } // Не более одного на переход // Подчиненные связи будут формироваться не по parent_id перехода, // а через другие параметры этого перехода (например через источники, с которых пришли) // Лэндинг 1 // ├ Источник 1 // └ Источник 2 if ($params['subgroup_by'] != $params['group_by']) { if ($r['parent_id'] == 0) { $k1 = param_key($r, $params['subgroup_by']); $r['name'] = param_val($r, $params['subgroup_by']); // Общая часть статистики stat_inc($data[$k]['sub'][$k1], $r, $k1, $r['name']); // Выдаём офферу разрешение на показ (тут ведь у нас лэндинги, просто так не покажем) $lp_offers_valid[$k] = 1; // Информация о датах if ($params['part'] != 'all') { $timekey = date($date_formats[$params['part']], $r['time_add']); stat_inc($data[$k]['sub'][$k1][$timekey], $r, $k1, $r['name']); } } else { // Будем считать исходящий только если у этого родителя его ещё нет $r['cnt'] = isset($parent_clicks[$r['parent_id']]) ? 0 : 1; $parent_clicks[$r['parent_id']] = 1; // Отмечаем исходящий для лэндинга if ($r['cnt']) { $parent_row = parent_row($r['parent_id']); $k0 = param_key($parent_row, $params['group_by']); $data[$k0]['out'] += 1; } continue; } } // Подчиненные связи будут формироваться по parent_id перехода // Лэндинг 1 // ├ Оффер 1 // └ Оффер 2 if ($r['parent_id'] > 0) { // Будем считать исходящий только если у этого родителя его ещё нет $r['cnt'] = isset($parent_clicks[$r['parent_id']]) ? 0 : 1; $parent_clicks[$r['parent_id']] = 1; $parent_row = parent_row($r['parent_id']); $k0 = param_key($parent_row, $params['group_by']); $k1 = param_key($r, $params['subgroup_by']); $name = param_val($r, $params['subgroup_by']); stat_inc($data[$k0]['sub'][$k1], $r, $k1, $name); // Отмечаем исходящий для лэндинга if ($r['cnt']) { $data[$k0]['out'] += 1; } $data[$k]['order'] = 1; // Выдаём офферу разрешение на показ $lp_offers_valid[$k0] = 1; $lp_offers_valid[$k1] = 1; // Запрошена информация по дням if ($params['part'] != 'all') { $k2 = date($date_formats[$params['part']], $r['time_add']); $id = param_key($r, $params['subgroup_by']); $name = param_val($r, $params['subgroup_by']); stat_inc($data[$k0]['sub'][$k1][$k2], $r, $id, $name); } // Обычный инкремент статистики } else { stat_inc($data[$k], $r, $k, $name); // Информация о датах if ($params['part'] != 'all') { $timekey = date($date_formats[$params['part']], $r['time_add']); stat_inc($data[$k][$timekey], $r, $k, $name); } } } //dmp($data); /* * ********** */ } else { // Данные выбраны, начинаем группировку // Статистика за весь период if ($params['part'] == 'all') { $parent_clicks = array(); // массив для единичного зачёта дочерних кликов (иначе у нас LP CTR больше 100% может быть) // Вся статистика, без разбиения по времени foreach ($rows as $r) { $k = param_key($r, $params['group_by']); $name = param_val($r, $params['group_by']); // Продажи + Лиды = Действия. $r['sale_lead'] = $r['is_sale'] + $r['is_lead']; if ($r['sale_lead'] > 2) { $r['sale_lead'] = 2; } // Не более одного на переход stat_inc($data[$k], $r, $k, $name); } // Статистика по дням } else { //echo mysql_now() . ' ' . time() . ' ' . date('Y-m-d H:i:s'). '<br>' ; foreach ($rows as $r) { $k1 = param_key($r, $params['group_by']); $timekey = date($date_formats[$params['part']], $r['time_add']); stat_inc($data[$k1], $r, $k1, $r['name']); stat_inc($data[$k1][$timekey], $r, $k1, $r['name']); } } } // Стандартный режим } // Цикличный сбор данных из БД } // ---------------------------------------- // Постобработка, когда ВСЕ данные получены // ---------------------------------------- //if($params['part'] == 'all') { if ($params['mode'] == 'popular') { if ($params['group_by'] != '') { foreach ($data as $k => $v) { if ($k != $params['group_by']) { unset($data[$k]); } else { $total = sum_arr($v, 'cnt'); foreach ($data[$k] as $k1 => $v1) { $data[$k][$k1]['total'] = $total; } } } } else { //dmp($data); foreach ($data as $k => $v) { uasort($v, 'params_order'); $data[$k] = current($v); // Для этого режима нам нужны ТОЛЬКО нулевые конвертации if ($params['conv'] == 'none' and $data[$k][$params['col']] != 0) { unset($data[$k]); continue; } $data[$k]['total'] = sum_arr($v, 'cnt'); $data[$k]['name'] = $k; $data[$k]['popular'] = current(array_keys($v)); } } // Убираем из популярных "не определено", отфильрованные значения и если 100% foreach ($data as $k => $r) { if ($r['popular'] == $group_types[$r['name']][1] or $r['popular'] == '' or !empty($params['filter'][0][$r['name']]) or ($r['cnt'] == $r['total'] or round($r['cnt'] / $r['total'] * 100) == 100)) { unset($data[$k]); } } if ($params['part'] != 'all') { $data3 = array(); foreach ($data as $k => $v) { //$name = $group_types[$v['name']][1]; $name = $v['name']; $data3[$name] = $data2[$k][$v['popular']]; $data3[$name]['popular'] = $v['popular']; } unset($data2); $data = $data3; } } else { // Убираем строчки с конверсиями $data = conv_filter($data, $params['conv']); // "Один источник" - если группировка по источнику и он у нас один, то берём его именованные параметры if ($params['group_by'] == 'source_name' and count($data) == 1) { // global $one_source; $one_source = current(array_keys($data)); } } //} if ($part != 'all') { // Оставляем только те даты, за которые есть данные $arr_dates = strip_empty_dates($arr_dates, $data); } // Особая сортировка для режима lp_offers, офферы с прямыми переходами в конце if ($params['mode'] == 'lp_offers') { //and $params['part'] == 'all' uasort($data, 'lp_order'); //dmp($data); //111 $lp_offers_valid = array_keys($lp_offers_valid); $ln = 0; // номер лэндинга - условное значение, необходимое для группировки при сортировке таблицы с подчиненными офферами. У лэндинга и его офферов должен быть один номер, уникальный для этой группы foreach ($data as $k => $v) { if (!in_array($k, $lp_offers_valid) and $v['direct'] == 0 or $v['cnt'] == 0) { unset($data[$k]); } else { $data[$k]['ln'] = $ln; if (!empty($data[$k]['sub'])) { foreach ($data[$k]['sub'] as $k0 => $v0) { $data[$k]['sub'][$k0]['ln'] = $ln; } } $ln++; } } } // Удаляем страницы, у которых нет исходящих (Это не Лэндинги) //and $params['part'] == 'all' if ($params['mode'] == 'lp' and empty($parent_val)) { foreach ($data as $k => $v) { if (empty($v['out']) and empty($v['direct'])) { unset($data[$k]); } } } // cсылка "Другие", для Площадки, параметров ссылки и перехода // если не выбран какой-то определенный лэндинг. // global $pop_sort_by, $pop_sort_order; $max_sub = 50; // После скольки объектов начинаем сворачивать if ($params['no_other'] == 0 and !isset($params['filter'][1]['out_id']) and ($params['subgroup_by'] == 'referer' and $params['mode'] == 'lp_offers' or $params['group_by'] == 'referer' and $params['mode'] == '' or strstr($params['subgroup_by'], 'click_param_value') !== false)) { if ($params['mode'] == 'lp_offers') { foreach ($data as $k => &$v) { if (isset($v['sub']) and count($v['sub']) > $max_sub) { uasort($v['sub'], 'sub_order'); $sub = array_slice($v['sub'], $max_sub); $v['sub'] = array_slice($v['sub'], 0, $max_sub); $other = array(); // Сюда мы соберём всю статистику "других" foreach ($sub as $sub_row) { stat_inc($other, $sub_row, -1, 'Другие'); } $v['sub'][-1] = $other; //dmp($other); } } } elseif (($params['mode'] == '' or $params['mode'] == 'lp') and count($data) > $max_sub) { $pop_sort_by = 'cnt'; $pop_sort_order = 1; uasort($data, 'params_order'); $other_arr = array_slice($data, $max_sub); foreach ($other_arr as $row) { if ($params['mode'] == '' and empty($row['out']) or $params['mode'] == 'lp' and !empty($row['out'])) { foreach ($row as $k => $v) { if (is_array($v)) { foreach ($v as $d => $vd) { $other[$k][$d] += $vd; } } else { $other[$k] += $v; } } } } $data = array_slice($data, 0, $max_sub); $other['id'] = -1; $other['name'] = 'Другие'; $data[-1] = $other; } } return array('data' => $data, 'dates' => $arr_dates, 'click_params' => $click_params, 'campaign_params' => $campaign_params); }
function process_conversion($data) { $cnt = count($this->params); $i = 0; $is_lead = isset($data['is_lead']) ? 1 : 0; $is_sale = isset($data['is_sale']) ? 1 : 0; unset($data['is_lead']); unset($data['is_sale']); switch ($data['txt_param20']) { case 'UAH': case 'uah': $data['profit'] = convert_to_usd('uah', $data['profit']); break; case 'USD': case 'usd': $data['profit'] = convert_to_usd('usd', $data['profit']); break; default: $data['profit'] = convert_to_usd('rub', $data['profit']); break; } // Специальная обработка "статусного постбэка" от сети CTR. В этом случае приходит только статус, связанный с остальными данными через order_id (i3) и нужно поменять статус соостветствующей конвертации. // https://uniquedesign.teamworkpm.net/tasks/3679474 $ctr_order = false; // флаг, о том, что некоторые операции (замену логов) выполнять не нужно, так как это не полный запрос, а только статус if ($data['network'] == 'CTR' and !empty($data['status'])) { $q = 'SELECT * FROM `tbl_conversions` WHERE (`i3` = "' . mysql_real_escape_string($data['i3']) . '" AND `network` = "CTR") LIMIT 1'; if ($rs = db_query($q) and mysql_num_rows($rs) > 0) { $r = mysql_fetch_assoc($rs); $data['subid'] = $r['subid']; } dmp($data); foreach ($data as $k => $v) { if (!in_array($k, array('network', 'i3', 'status', 'txt_status', 'ak', 'date_add', 'subid'))) { unset($data[$k]); } } $ctr_order = true; } dmp($data); if (isset($data['subid']) && $data['subid'] != '') { //to_log('data', $data); $subid = $data['subid']; // мы скоро обнулим массив data, а subid нам ещё понадобится $status = $data['status']; $click_info = array(); // информация о клике //Проверяем есть ли клик с этим SibID $q = 'SELECT * FROM `tbl_clicks` WHERE `subid` = "' . mysql_real_escape_string($subid) . '"'; $r = mysql_query($q) or die(mysql_error()); if (mysql_num_rows($r) > 0) { $click_info = mysql_fetch_assoc($r); $click_id = $click_info['id']; if ($data['profit'] > 0) { $is_lead = $click_info['is_lead'] > 0 ? 1 : 0; $is_sale = 1; } else { $is_lead = 1; $is_sale = $click_info['is_sale'] > 0 ? 1 : 0; } mysql_query('UPDATE `tbl_clicks` SET `is_sale` = ' . $is_sale . ', `is_lead` = ' . intval($is_lead) . ', `conversion_price_main` = "' . mysql_real_escape_string($data['profit']) . '" WHERE `id` = ' . $click_id) or die(mysql_error()); } // ---------------------------- // Готовим данные для конверсии // ---------------------------- $upd = array(); // Инициализируем массив для запроса на обновление // Дополнительные поля, которых нет в $params, но которые нам нужны в БД $additional_fields = array('date_add', 'txt_status', 'status', 'network', 'type'); foreach ($data as $name => $value) { if (array_key_exists($name, $this->params) or in_array($name, $additional_fields)) { $upd[$name] = $value; unset($data[$name]); } } //if (empty($upd['date_add'])) { $upd['date_add'] = mysql_now(); // date('Y-m-d H:i:s'); //} // Проверяем, есть ли уже конверсия с таким SubID $q = 'SELECT * FROM `tbl_conversions` WHERE `subid` = "' . mysql_real_escape_string($subid) . '" LIMIT 1'; $r = db_query($q) or die(mysql_error()); if (mysql_num_rows($r) > 0) { $f = mysql_fetch_assoc($r); $upd['id'] = $conv_id = $f['id']; $q = updatesql($upd, 'tbl_conversions', 'id'); db_query($q); // Чистим логи if (!$ctr_order) { db_query('DELETE FROM `tbl_postback_params` WHERE `conv_id` = ' . $f['id']) or die(mysql_error()); } } else { $q = insertsql($upd, 'tbl_conversions'); db_query($q); $conv_id = mysql_insert_id(); } // Нужно ли нам отменить продажу? if ($status == 2) { delete_sale($click_id, $conv_id, 'sale'); //return false; } // S2S сети // https://uniquedesign.teamworkpm.net/tasks/4160565 $q = "select * \n \tfrom `tbl_adnets` \n \twhere `status` = '0' \n \tand `name` = '" . mysql_real_escape_string($data['n']) . "'"; if ($rs = db_query($q) and mysql_num_rows($rs) > 0) { // Подставляем переменные в ссылку $replace = array('[SUBID]' => $subid, '[PROFIT_USD]' => $this->source_data['profit'], '[PROFIT_RUB]' => convert_usd_to('rub', $this->source_data['profit']), '[PROFIT_EUR]' => convert_usd_to('eur', $this->source_data['profit']), '[PROFIT_UAH]' => convert_usd_to('uah', $this->source_data['profit'])); // Добавляем параметры Postback foreach ($this->source_data as $name => $value) { $replace['[POSTBACK_' . $name . ']'] = $value; } // Добавляем параметры перехода for ($i = 1; $i <= 15; $i++) { if (!empty($click_info['click_param_name' . $i])) { $replace['[CLICK_' . $click_info['click_param_name' . $i] . ']'] = $click_info['click_param_value' . $i]; } } dmp($replace); while ($r = mysql_fetch_assoc($rs)) { $url = $r['url']; // Поставляем все переменные foreach ($replace as $k => $v) { $url = str_ireplace($k, $v, $url); } // Cleaning not used []-params $url = preg_replace('/\\ = (\\[[a-z\\_0-9]+\\])/i', ' = ', $url); $result = send_post_request($url, array()); // Сохраняем S2S лог $str = date('Y-m-d H:i:s') . ' SubID: ' . $subid . "\nURL:" . $url . "\\Result:" . $result[1] . "\n\n"; dmp(htmlspecialchars($str)); file_put_contents(_CACHE_PATH . '/log/' . '.s2s_' . date('Y-m-d'), $str, FILE_APPEND | LOCK_EX); } } // Пишем postback логи foreach ($data as $name => $value) { if (strpos($name, 'pbsave_') !== false) { $name = str_replace('pbsave_', '', $name); $ins = array('conv_id' => $conv_id, 'name' => $name, 'value' => value); $q = insertsql($ins, 'tbl_postback_params'); db_query($q); } } } }