Esempio n. 1
0
 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);
}
Esempio n. 3
0
 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);
             }
         }
     }
 }