Files
crm.e5.pl/modules/EcmCalls/EcmCallsChartImg.php
2024-04-27 09:23:34 +02:00

403 lines
15 KiB
PHP
Executable File

<?php
$GLOBALS['db'] = new MysqlManager();
$GLOBALS['db']->connect();
global $mod_strings;
//***********************************************************************************************************************//
function returnErrorData() {
header("Content-type: image/png");
if(isset($_GET['imgWidth']) && $_GET['imgWidth'] != '') $imgWidth = intval($_GET['imgWidth']); else $imgWidth = 600;
if(isset($_GET['imgHeight']) && $_GET['imgHeight'] != '') $imgHeight = intval($_GET['imgHeight']); else $imgHeight = 600;
$im = @imagecreate($imgWidth, $imgHeight)
or die("Cannot Initialize new GD image stream");
$background_color = imagecolorallocate($im, 255, 255, 255);
$text_color = imagecolorallocate($im, 100, 100, 100);
$grey = imagecolorallocate($im, 135, 135, 135);
imagerectangle($im, 0, 0, $imgWidth-1, $imgHeight-1, $grey);
global $mod_strings;
imagestring($im, 7, 20, 20, translate('LBL_ECMCALLS_NO_DATA', 'Charts'), $text_color);
//imagettftext($im, 18, 20, 20, 18, $text_color, "CENTURY.TTF", $mod_strings['LBL_ECMCALLS_NO_DATA']);
imagepng($im);
imagedestroy($im);
die();
}
// ecmcall_id, calldate, phone
function getUserData($id, $options, $type) {
$data = array();
$query = "SELECT `user_name`, `phone_work`, `phone_mobile`, `phone_home`, `phone_other`, `phone_fax`,`first_name`,`last_name` FROM `users` WHERE `id`='$id' LIMIT 1";
$name = $GLOBALS['db']->fetchByAssoc($GLOBALS['db']->query($query));
if ($name['phone_work'] != '') $name['phone'] = 'phone_work';
elseif ($name['phone_mobile'] != '') $name['phone'] = 'phone_mobile';
elseif ($name['phone_home'] != '') $name['phone'] = 'phone_home';
elseif ($name['phone_other'] != '') $name['phone'] = 'phone_other';
elseif ($name['phone_fax'] != '') $name['phone'] = 'phone_fax';
$phone = $name[$name['phone']];
if ($name['phone_work'] != '' && strlen($phone) > strlen($name['phone_work'])) $phone = $name['phone_work'];
elseif ($name['phone_mobile'] != '' && strlen($phone) > strlen($name['phone_mobile'])) $phone = $name['phone_mobile'];
elseif ($name['phone_home'] != '' && strlen($phone) > strlen($name['phone_home'])) $phone = $name['phone_home'];
elseif ($name['phone_other'] != '' && strlen($phone) > strlen($name['phone_other'])) $phone = $name['phone_other'];
elseif ($name['phone_fax'] != '' && strlen($phone) > strlen($name['phone_fax'])) $phone = $name['phone_fax'];
if($options['pbuts_show_numbers'] == 1) $name['user_name'] .= "\n(".$phone.')';
//die();
$query = "SELECT DISTINCT `cdr`.`calldate`, `cdr`.`src`, `cdr`.`duration`, `cdr`.`billsec` ";
$query .= "FROM `cdr`, `ecmcalls_beans` AS `eb` ";
$query .= "WHERE `cdr`.`id`=`eb`.`ecmcall_id` ";
$query .= "AND `eb`.`bean_id`='$id' ";
if($type == "outgoing")
$query .= "AND ((LPAD(`eb`.`src`,50,'0')=LPAD(`cdr`.`src`,50,'0')) OR (LPAD(`eb`.`src`,50,'0')=LPAD(`cdr`.`dcontext`,50,'0'))) ";
else
if($type == "incoming")
$query .= "AND (LPAD(`eb`.`src`,50,'0')=LPAD(`cdr`.`dst`,50,'0')) ";
$where = '';
if($options['pbuts_date_select'] == 'THIS_DAY' || $options['pbuts_date_select'] == 'LAST_DAY') {
require_once('modules/EcmCalls/TimeDateC.php');
$tdc = new TimeDateC();
$td = $tdc->queryFilter($options['pbuts_date_select']);
if($options['pbuts_date_select'] == 'LAST_DAY') {
$td = $td['end'];
} elseif($options['pbuts_date_select'] == 'THIS_DAY') {
$td = $td['begin'];
//convert date
global $timedate, $timezones;
require_once('modules/EcmCalls/TimeDateC.php');
$tdc = new TimeDateC();
$td = $tdc->handle_offset($td, $tdc->get_db_date_time_format(), true);
}
$td = substr($td,0,-9);
$options['pbuts_date'] = $td;
}
$time_to = '00:00:00';
if(isset($options['pbuts_time_to']) && $options['pbuts_time_to'] != '') {
$time_to = $options['pbuts_time_to'];
$pbuts_date = $options['pbuts_date'];
if($time_to == '24:00') $time_to = '23:59:59'; else $time_to .= ':00';
$time_to = $pbuts_date.' '.$time_to;
//convert date
global $timedate, $timezones;
require_once('modules/EcmCalls/TimeDateC.php');
$tdc = new TimeDateC();
$time_to = $timedate->handle_offset($time_to, $timedate->get_db_date_time_format(), false);
$time_to = $tdc->handle_offset($time_to, $tdc->get_db_date_time_format(), true);
}
$time_from = '00:00:00';
if(isset($options['pbuts_time_from']) && $options['pbuts_time_from'] != '') {
$time_from = $options['pbuts_time_from'];
$pbuts_date = $options['pbuts_date'];
if($time_from == '24:00') $time_from = '23:59:59'; else $time_from .= ':00';
$time_from = $pbuts_date.' '.$time_from;
//convert date
global $timedate, $timezones;
require_once('modules/EcmCalls/TimeDateC.php');
$tdc = new TimeDateC();
$time_from = $timedate->handle_offset($time_from, $timedate->get_db_date_time_format(), false);
$time_from = $tdc->handle_offset($time_from, $tdc->get_db_date_time_format(), true);
}
//var_dump($time_from);
//var_dump($time_to);
//die();
if(isset($options['pbuts_date']) && $options['pbuts_date'] != '') {
if($where != '') $where .= "AND ";
$where .= "`cdr`.`calldate` >= '$time_from' AND `cdr`.`calldate` <= '$time_to' ";
}
$query .= 'AND '.$where;
$results = $GLOBALS['db']->query($query);
if(is_resource($results)) {
$calls = array();
while($row = $GLOBALS['db']->fetchByAssoc($results)) $calls[] = $row;
$data_tmp = array();
$data_tmp['values']['<=60']['x'] = array();
$data_tmp['values']['>60']['x'] = array();
foreach($calls as $value) {
$date_ = substr($value['calldate'],0,-3);
$dd = split(" ",$date_);
$dd[0] = str_replace("-", "", $dd[0]);
$dd[1] = split(":",$dd[1]);
$dur = intval($options['pbuts_watch_seconds']);
if($options['pbuts_watch'] == 'duration') {
if(intval($value['duration']) <= $dur) $kk = '<=60'; else $kk = '>60';
} else {
if(intval($value['billsec']) <= $dur) $kk = '<=60'; else $kk = '>60';
}
$yyy = intval($dd[1][0])*60+intval($dd[1][1]);
if(!isset($yax)) $ymax = $yyy; elseif($yyy > $ymax) $ymax = $yyy;
if(!isset($ymin)) $ymin = $yyy; elseif($yyy < $ymin) $ymin = $yyy;
$data_tmp['values'][$kk]['y'][] = $yyy;
}
if(count($data_tmp['values']['<=60']['y']) > 0 || count($data_tmp['values']['>60']['y']) > 0) {
$data = $data_tmp;
$name['user_name']=iconv("utf-8","iso-8859-2",$name['first_name']."\n".$name['last_name']."\n(".$name['phone_work'].")");
$data['name'] = $name['user_name'];
$data['ymin'] = $ymin;
$data['ymax'] = $ymax;
$data['count'] = count($data);
}
//print_r($data);
}
return $data;
}
//**********************************************************************************************************************//
global $current_user;
$options = $_SESSION['EcmCallsChart'][$_REQUEST['chartName']][$current_user->id];
if(isset($_GET['imgWidth']) && $_GET['imgWidth'] != '') $imgWidth = intval($_GET['imgWidth']); else $imgWidth = 600;
if(isset($_GET['imgHeight']) && $_GET['imgHeight'] != '') $imgHeight = intval($_GET['imgHeight']); else $imgHeight = 600;
if(!is_array($options)) return;
//function getUserPthones
//print_r($options);
//die();
include ("include/jpgraph/1.26/src/jpgraph.php");
include ("include/jpgraph/1.26/src/jpgraph_scatter.php");
$graph = new Graph($imgWidth,$imgHeight);
$yaxis = array();
for($i=0; $i<=24*60; $i+=1) $yaxis[intval(sprintf("%02d%02d",$i/60,$i%60))] = sprintf("%02d:%02d",$i/60,$i%60);
$colors = array('red', 'blue', 'yellow', 'green', 'white', 'brown', 'orange');
$yLabels = array(); $yLabels[0] = ' ';
$users_ = array();
$users_['start'] = array('name' => ' ', 'lp' => 0);
if($options['pbuts_type'] == 'incoming' || $options['pbuts_type'] == 'both') {
$data1 = array();
$yLc = 1;
foreach($options['pbuts_users'] as $key => $user_id) {
//for($powiel=0; $powiel<5; $powiel++){
$data_tmp = getUserData($user_id, $options, 'incoming');
if(is_array($data_tmp) && count($data_tmp) > 0) {
if(!isset($users_[$user_id])) $users_[$user_id] = array('name' => $data_tmp['name'], 'lp' => count($users_));
$data_tmp['values']['<=60']['x'] = array_pad($data_tmp['values']['<=60']['x'], count($data_tmp['values']['<=60']['y']), $users_[$user_id]['lp']);
$data_tmp['values']['>60']['x'] = array_pad($data_tmp['values']['>60']['x'], count($data_tmp['values']['>60']['y']), $users_[$user_id]['lp']);
$data1[] = $data_tmp;
$yLabels[$yLc++] = $data_tmp['name'];
if(!isset($ymin)) $ymin = $data_tmp['ymin']; elseif($data_tmp['ymin'] < $ymin) $ymin = $data_tmp['ymin'];
if(!isset($ymax)) $ymax = $data_tmp['ymax']; elseif($data_tmp['ymax'] > $ymax) $ymax = $data_tmp['ymax'];
}
//}
}
if(count($data1) > 0) {
$less60legend = false;
$more60legend = false;
$sp = array();
foreach($data1 as $key => $value) {
if(count($value['values']['<=60']['x']) > 0) {
$sp['<=60'][$key] = new ScatterPlot($value['values']['<=60']['x'],$value['values']['<=60']['y']);
$sp['<=60'][$key]->mark->SetType(MARK_FILLEDCIRCLE);
$sp['<=60'][$key]->mark->SetFillColor('red');
$sp['<=60'][$key]->mark->SetWidth(5);
if(!$less60legend) {
$less60legend = true;
$sp['<=60'][$key]->SetLegend($mod_strings['LBL_INCOMING_LESS_THAN'].intval($options['pbuts_watch_seconds']).'s');
}
$graph->Add($sp['<=60'][$key]);
}
if(count($value['values']['>60']['x']) > 0) {
$sp['>60'][$key] = new ScatterPlot($value['values']['>60']['x'],$value['values']['>60']['y']);
$sp['>60'][$key]->mark->SetType(MARK_FILLEDCIRCLE);
$sp['>60'][$key]->mark->SetFillColor('blue');
$sp['>60'][$key]->mark->SetWidth(5);
if(!$more60legend) {
$more60legend = true;
$sp['>60'][$key]->SetLegend($mod_strings['LBL_INCOMING_MORE_THAN'].intval($options['pbuts_watch_seconds']).'s');
}
$graph->Add($sp['>60'][$key]);
}
}
}
} //echo "\n";
if($options['pbuts_type'] == 'both' || $options['pbuts_type'] == 'outgoing') {
$data2 = array();
$yLc = 1;
foreach($options['pbuts_users'] as $key => $user_id) {
//for($powiel=0; $powiel<5; $powiel++){
$data_tmp = getUserData($user_id, $options, 'outgoing');
if(is_array($data_tmp) && count($data_tmp) > 0) {
if(!isset($users_[$user_id])) $users_[$user_id] = array('name' => $data_tmp['name'], 'lp' => count($users_));
$data_tmp['values']['<=60']['x'] = array_pad($data_tmp['values']['<=60']['x'], count($data_tmp['values']['<=60']['y']), $users_[$user_id]['lp']);
$data_tmp['values']['>60']['x'] = array_pad($data_tmp['values']['>60']['x'], count($data_tmp['values']['>60']['y']), $users_[$user_id]['lp']);
$data2[] = $data_tmp;
$yLabels[$yLc++] = $data_tmp['name'];
if(!isset($ymin)) $ymin = $data_tmp['ymin']; elseif($data_tmp['ymin'] < $ymin) $ymin = $data_tmp['ymin'];
if(!isset($ymax)) $ymax = $data_tmp['ymax']; elseif($data_tmp['ymax'] > $ymax) $ymax = $data_tmp['ymax'];
}
//}
}
if(count($data2) > 0) {
$less60legend = false;
$more60legend = false;
$sp = array();
foreach($data2 as $key => $value) {
if(count($value['values']['<=60']['x']) > 0) {
$sp['<=60'][$key] = new ScatterPlot($value['values']['<=60']['x'],$value['values']['<=60']['y']);
$sp['<=60'][$key]->mark->SetType(MARK_UTRIANGLE);
//$sp['<=60'][$key]->mark->SetType(MARK_IMG,'modules/Home/Dashlets/MyEcmCallsMoreDashlets/green.gif',1);
$sp['<=60'][$key]->mark->SetFillColor('red');
$sp['<=60'][$key]->mark->SetWidth(10);
if(!$less60legend) {
$less60legend = true;
$sp['<=60'][$key]->SetLegend($mod_strings['LBL_OUTGOING_LESS_THAN'].intval($options['pbuts_watch_seconds']).'s');
}
$graph->Add($sp['<=60'][$key]);
}
if(count($value['values']['>60']['x']) > 0) {
$sp['>60'][$key] = new ScatterPlot($value['values']['>60']['x'],$value['values']['>60']['y']);
$sp['>60'][$key]->mark->SetType(MARK_UTRIANGLE);
//$sp['<=60'][$key]->mark->SetType(MARK_IMG,'modules/Home/Dashlets/MyEcmCallsMoreDashlets/red.gif',1);
$sp['>60'][$key]->mark->SetFillColor('blue');
$sp['>60'][$key]->mark->SetWidth(10);
if(!$more60legend) {
$more60legend = true;
$sp['>60'][$key]->SetLegend($mod_strings['LBL_OUTGOING_MORE_THAN'].intval($options['pbuts_watch_seconds']).'s');
}
$graph->Add($sp['>60'][$key]);
}
}
}
}
$users_['end'] = array( 'name' => ' ', 'lp' => count($users_));
//die();
$yLabels = array();
foreach($users_ as $key => $value) $yLabels[$value['lp']] = $value['name'];
if(count($data1)==0 && count($data2)==0) returnErrorData();
$d1 = new ScatterPlot(array(0),array($ymin));
$d1->mark->SetType(MARK_FILLEDRECTANGLE);
$d1->mark->SetFillColor('green');
$d1->mark->SetWidth(10);
$graph->Add($d1);
$d2 = new ScatterPlot(array(count($users_)-1),array($ymin));
$d2->mark->SetType(MARK_FILLEDRECTANGLE);
$d2->mark->SetFillColor('green');
$d2->mark->SetWidth(10);
$graph->Add($d2);
//var_dump(count($data));
//die();
if($options['pbuts_date_select'] == 'THIS_DAY' || $options['pbuts_date_select'] == 'LAST_DAY') {
require_once('modules/EcmCalls/TimeDateC.php');
$tdc = new TimeDateC();
$td = $tdc->queryFilter($options['pbuts_date_select']);
if($options['pbuts_date_select'] == 'LAST_DAY') {
$td = $td['end'];
} elseif($options['pbuts_date_select'] == 'THIS_DAY') {
$td = $td['begin'];
//convert date
global $timedate, $timezones;
require_once('modules/EcmCalls/TimeDateC.php');
$tdc = new TimeDateC();
$td = $tdc->handle_offset($td, $tdc->get_db_date_time_format(), true);
}
$td = substr($td,0,-9);
$date = $td;
}
$graph->SetMarginColor('white');
$graph->SetScale("linlin");
$sTitle = ", ".(isset($date) && $date != '' ? $date : $options['pbuts_date']).' '.$options['pbuts_time_from'].' - '.$options['pbuts_time_to'];
$graph->title->Set($options['title'].$sTitle);
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->SetMargin(80,30,40,130);
$graph->xgrid->Show();
$graph->xgrid->SetColor('gray@0.5');
$graph->ygrid->SetColor('gray@0.5');
$graph->SetFrame(true,'gray@0.3');
$ymin = intval($ymin/5)*5;
$ymax = intval($ymax/5)*5;
$xLabels = array();
$xTF = split(":",$options['pbuts_time_from']);
$xTFrom = $ymin-15;//intval($xTF[0])*60+intval($xTF[1]);
$xTT = split(":",$options['pbuts_time_to']);
$xTTo = $ymax+15;//intval($xTT[0])*60+intval($xTT[1]);
$tick = abs($xTTo-$xTFrom); if($tick == 0) $tick = 15;
$tick = intval($tick/60);
//var_dump($tick);
if($tick/5 > 4) $tick = 60;
elseif($tick/5 >= 3) $tick = 45;
elseif($tick/5 >= 2) $tick = 30;
elseif($tick/5 >= 1) $tick = 30;
elseif($tick%5 == 0) $tick = intval(($tick/5))*10; else $tick = intval(($tick/5))*10 + 10;
if(abs($xTFrom-$xTTo) < 60) $tick = 2;
if($tick == 0) $tick = 5;
//var_dump(intval($tick)); die();
for( $i = 0, $j=$xTFrom; $i <= abs($xTTo-$xTFrom); $i+=$tick, $j+=$tick) {
$xLabels[] = sprintf("%02d:%02d",$j/60,$j%60);
$xTickPositions[] = $j;
}
//print_r($xTickPositions);
//print_r($xLabels);
//die();
$graph->xaxis->SetTickPositions($xTickPositions,null,$xLabels);
$graph->xaxis->SetLabelAngle(90);
$yTickPositions = array();
foreach($yLabels as $key=>$value) $yTickPositions[] = count($yTickPositions);
if(count($yLabels) == 1) {
$yTickPositions[] = count($yTickPositions);
$yLabels[] = '';
}
$graph->yaxis->SetTickPositions($yTickPositions,null,$yLabels);
//print_r($yTickPositions);
//print_r($yLabels);
//die();
//$graph->legend->SetLayout(LEGEND_HOR);
$graph->legend->Pos(0.2,0.97,"left","bottom");
$graph->Stroke();
?>