case 'campaigns':
$data = $this->table('definitions')->where('module', 'campaign');
$deniedRows = ['id', 'check'];
$dataCount = $data->count();
if(strlen($search['value']) !== 0){
$data = $data->where(function($query) use ($columns, $search, $deniedRows){
foreach ($columns as $key => $value) {
if(in_array($columns[$key]['data'], $deniedRows)) {
unset($columns[$key]);
}else{
if(strlen($columns[$key]['data']) !== 0){
if(!is_numeric($search['value'])){
$query = $query->orWhere($columns[$key]['data'], '~*', $search['value']);
}else{
$query = $query->orWhere($columns[$key]['data'], '=', $search['value']);
}
}
}
}
});
$searchCount = $data->count();
}
foreach ($order as $order) {
$colKey = $order['column'];
$orderDir = $order['dir'];
if(strlen($columns[$colKey]['data']) !== 0 && strlen($orderDir) !== 0){
if(!in_array($columns[$colKey]['data'], $deniedRows)) {
$data = $data->orderBy($columns[$colKey]['data'], $orderDir);
}
}
}
if($length !== "-1"){
$data = $data->skip($start)->take($length);
}
$data = $data->orderBy('definitions.datetime','desc');
foreach ($data->get() as $key => $value) {
$result['data'][$key]['id'] = $value->id;
/*
Campaign Name => name
Budget => budget
Lead Count => lead_count
Lead Per Cost => lead_per_cost
Conversion Rate => conversion_rate
Sales => sales
*/
$data = json_decode($value->data);
$result['data'][$key]['name'] = $value->definition;
$result['data'][$key]['budget'] = (is_null($data->data->budget) ? 0 : (int) $data->data->budget);
$result['data'][$key]['lead_count'] = 0;
$result['data'][$key]['lead_per_cost'] = 0;
$result['data'][$key]['conversion_rate'] = 0;
$result['data'][$key]['sales'] = 0;
$channels = $this->table('all_channel')->get();
$total_sale = 0;
$sale_count = 0;
foreach ($channels as $i => $channel) {
$result['data'][$key]['lead_count'] += (int) $channel->lead_count;
/*------------------------------DİKKAT---------------------------*/
/* Bu controllerda ekte yolladığım ekran görüntüsüne denk düşen değerleri kontrol eden bölüm. Kod çalışıyor. Fakat sorun şu kanımca for içinde fazlaca for döngüsü var, alttaki $sales değişkeni en çok buna neden olan şey çünkü dönküde sürekli sorgu yapıyor, onu kaldırdığımda hızlıca geliyor sayfa ama bu seferde doğal olarak bazı değerler gelmiyor, sürekli databaseden
sorgu yaptığı ve bu değerlerle hesaplama yaptığı için ekrana çok geç geldiğini düşünüyorum, bunu nasıl optimize edebilirim? */
$sales = $this->table('ipd_sales')->where('channel_data','=',$channel->data)->get();
foreach ($sales as $i => $sale) {
$sale_data = json_decode($sale->operation_data);
$total_sale += (int) $sale_data->total;
$sale_count++;
}
}
/* $value->lead_count */
$result['data'][$key]['sales'] = $sale_count;
$result['data'][$key]['conversion_rate'] = floor(100 / ((int) $result['data'][$key]['lead_count'] / $sale_count) * 100) / 100 . '%';
$result['data'][$key]['lead_per_cost'] = floor((int) $result['data'][$key]['budget'] / (int) $result['data'][$key]['lead_count'] * 100) / 100;
$result['data'][$key]['actions'] = '<div class="btn-group">
<a class="btn green btn-xs" href="javascript:;" data-toggle="dropdown" aria-expanded="false">
<i class="fa fa-user"></i> Options
<i class="fa fa-angle-down"></i>
</a>
<ul class="dropdown-menu"><li>
<a href="'.$this->getRootPath().'/panel/edit_campaign/'.$value->id.'">
<i class="fa fa-file-text-o"></i> '._('Edit').' </a>
</li>';
if($this->checkPermission('delete')){
$result['data'][$key]['actions'] .= '<li>
<a href="#" onclick="Campaigns.delete('.$value->id.', {title: \''._('Are you sure?').'\', text: \''._('This campaign will be delete!').'\', confirmButtonText: \''._('Yes').'\', cancelButtonText: \''._('No').'\', deletedText: \''._('Deleted!').'\'});">
<i class="fa fa-trash-o"></i> '._('Delete').' </a>
</li>';
}
$result['data'][$key]['actions'] .= '
</ul>
</div>';
}
$result['recordsFiltered'] = ($search['value'] !== "" ? $searchCount : $dataCount);
$result['recordsTotal'] = $this->table('definitions')->where('module', 'campaign')->count();
break;