329 lines
11 KiB
PHP
329 lines
11 KiB
PHP
<?php
|
||
|
||
require_once($_SERVER['DOCUMENT_ROOT'] . "/config.php");
|
||
function get_users($agency_id, $pdo){
|
||
$users = array();
|
||
$sql = "SELECT * FROM `mango_call_users` WHERE agency_id = ".$agency_id;
|
||
$q = $pdo->query($sql);
|
||
while($r = $pdo->fetch_assoc($q)){
|
||
$temp_user = array();
|
||
$temp_user['fio'] = $r['fio'];
|
||
|
||
$temp_user['groups'] = '';
|
||
if(!empty($r['groups'])){
|
||
$groups = json_decode($r['groups']);
|
||
// var_dump($groups);
|
||
if(is_array($groups)){
|
||
foreach ($groups as $group) {
|
||
$sql_g = "SELECT * FROM mango_call_groups WHERE group_id = ".$group;
|
||
$q_g = $pdo->query($sql_g);
|
||
if($pdo->num_rows($q_g) > 0){
|
||
while($r_g = $pdo->fetch_assoc($q_g)){
|
||
if($temp_user['groups'] != '') $temp_user['groups'] .= ', ';
|
||
$temp_user['groups'] .= $r_g['name'];
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
$users[$r['number_sip']] = $temp_user;
|
||
}
|
||
return $users;
|
||
}
|
||
|
||
function int_to_time($second) {
|
||
$total_seconds = $second;
|
||
$seconds = intval($total_seconds%60);
|
||
if(strlen($seconds) == 1) $seconds = "0".$seconds;
|
||
$seconds .= ' сек.';
|
||
|
||
$total_minutes = intval($total_seconds/60);
|
||
$minutes = $total_minutes%60;
|
||
if($minutes == 0) {
|
||
$minutes = '';
|
||
} else {
|
||
if(strlen($minutes) == 1) $minutes = "0".$minutes;
|
||
$minutes .= ' м.';
|
||
}
|
||
$hours = intval($total_minutes/60);
|
||
|
||
if($hours == 0) {
|
||
$hours = '';
|
||
} else {
|
||
if(strlen($hours) == 1) $hours = "0".$hours;
|
||
$hours .= ' ч.';
|
||
}
|
||
|
||
return $hours." ".$minutes." ".$seconds;
|
||
}
|
||
|
||
|
||
|
||
require_once($_SERVER['DOCUMENT_ROOT'] . '/vendor/autoload.php');
|
||
|
||
if ($_SESSION['id'] == 11874) {
|
||
error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT & ~E_NOTICE);
|
||
ini_set('display_errors', 1);
|
||
}
|
||
set_time_limit(0);
|
||
ini_set('memory_limit', '8192M');
|
||
|
||
// hide_client_contacts: маскируем сырые телефоны в выгрузке звонков.
|
||
// ФИО сотрудников из mango_call_users НЕ маскируем — они не клиенты.
|
||
$hideContactsCalls = function_exists('should_hide_contacts_for_current_user')
|
||
&& should_hide_contacts_for_current_user();
|
||
|
||
$pdo = new MysqlPdo(hst, ndb, user, pass);
|
||
|
||
$pdo->query("SET NAMES 'utf8'");
|
||
|
||
$pdopg = new MysqlPdo(hstpg, ndbpg, userpg, passpg, false, '5432', true);
|
||
|
||
$columns = [
|
||
array('id'=>'date', 'title'=>'Дата звонка'),
|
||
array('id'=>'on_out', 'title'=>'Входящий/Исходящий'),
|
||
array('id'=>'phoneIn', 'title'=>'Телефон кто звонил'),
|
||
array('id'=>'phoneOut', 'title'=>'Номер, на который был звонок'),
|
||
array('id'=>'nameEmp', 'title'=>'Имя сотрудника, кто принял звонок'),
|
||
array('id'=>'status', 'title'=>'Статус (пропущенный, состоявшийся)'),
|
||
array('id'=>'duration', 'title'=>'Длительность звонка'),
|
||
array('id'=>'operator', 'title'=>'Оператор'),
|
||
];
|
||
|
||
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
||
use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
|
||
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
|
||
$spreadsheet = new Spreadsheet();
|
||
$sheet = $spreadsheet->getActiveSheet();
|
||
$agency_id = 0;
|
||
if(isset($_POST['agency_id']) && $_POST['agency_id'] > 0){
|
||
$agency_id = (int)$_POST['agency_id'];
|
||
}
|
||
|
||
|
||
$sheet->setTitle('Журнал звонков');
|
||
|
||
$arrColExccel = ['B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','AA','AB','AC','AD','AE','AF'];
|
||
$columnStart = 'A';
|
||
$rowStart = 1;
|
||
|
||
$j = 0;
|
||
$arrayHeder = [
|
||
$columnStart => [
|
||
'title' => '№',
|
||
'width' => 5
|
||
]
|
||
];
|
||
|
||
$arrRows = [];
|
||
$arrSearch = [];
|
||
foreach($columns as $col) {
|
||
$header = [];
|
||
//if ($col['visible'] && ($col['id'] != 'edit' && $col['id'] != 'archive' && $col['id'] != 'links')) {
|
||
$arrSearch[$col['id']] = $col;
|
||
$header['title'] = $col['title'];
|
||
if ($col['id'] == 'fio') {
|
||
$header['width'] = 35;
|
||
} else {
|
||
$header['width'] = 20;
|
||
}
|
||
$arrayHeder[$arrColExccel[$j]] = $header;
|
||
$arrRows[$arrColExccel[$j]] = $col['id'];
|
||
$j++;
|
||
//}
|
||
}
|
||
$sql = '';
|
||
|
||
$calls = [];
|
||
if (isset($_SESSION['calls_query'])) {
|
||
$sql = $_SESSION['calls_query'];
|
||
}
|
||
$is_pg = false;
|
||
if (isset($_SESSION['calls_query_pg'])) {
|
||
$sql = $_SESSION['calls_query_pg'];
|
||
$is_pg = true;
|
||
}
|
||
session_write_close();
|
||
$starttime = microtime(true);
|
||
|
||
if(!empty($sql) && $agency_id > 0){
|
||
$users = get_users($agency_id, $pdo);
|
||
$calls_arr = array();
|
||
|
||
if($is_pg){
|
||
$qpg = $pdopg->query($sql, true);
|
||
while ($calla = $pdopg->fetch_assoc($qpg)) {
|
||
$calls_arr[] = $calla;
|
||
}
|
||
} else {
|
||
$q = $pdo->query($sql, true);
|
||
while ($calla = $pdo->fetch_assoc($q)) {
|
||
$calls_arr[] = $calla;
|
||
}
|
||
}
|
||
|
||
//var_dump($calls);
|
||
|
||
foreach($calls_arr as $r){
|
||
//var_dump($r);
|
||
$call = [];
|
||
$type = 'mango';
|
||
$call['start'] = date('d.m.Y H:i:s', $r['start']);
|
||
if(!empty($r['from_extension'])){
|
||
$call['on_out'] = 'Исходящий';
|
||
} else {
|
||
$call['on_out'] = 'Входящий';
|
||
}
|
||
if(isset($users[$r['from_number']])){
|
||
$call['from_number'] = $users[$r['from_number']]['fio'];
|
||
} else {
|
||
// Сырой номер — для hide_client_contacts маскируем как клиентский
|
||
$call['from_number'] = $hideContactsCalls
|
||
? mask_client_phone($r['from_number'])
|
||
: $r['from_number'];
|
||
}
|
||
|
||
if(isset($users[$r['entry_id']])){
|
||
$call['entry_id'] = $users[$r['entry_id']]['fio'];
|
||
} else {
|
||
$call['entry_id'] = $hideContactsCalls
|
||
? mask_client_phone($r['entry_id'])
|
||
: $r['entry_id'];
|
||
}
|
||
|
||
if(isset($users[$r['to_number']])) {
|
||
$call['to_number'] = $users[$r['to_number']]['fio'];
|
||
} else {
|
||
$call['to_number'] = $hideContactsCalls
|
||
? mask_client_phone($r['to_number'])
|
||
: $r['to_number'];
|
||
}
|
||
|
||
$call['answer'] = 'Не отвечен';
|
||
if($r['answer'] > 0) {
|
||
$call['answer'] = 'Отвечен';
|
||
}
|
||
$call['time'] = int_to_time((int)$r['finish'] - (int)$r['start']);
|
||
|
||
if($r['line_number'] == 'telphin'){
|
||
$type = 'telphin';
|
||
|
||
} else if($r['line_number'] == 'beeline'){
|
||
$type = 'beeline';
|
||
|
||
|
||
} else if($r['line_number'] == 'megafon'){
|
||
$type = 'megafon';
|
||
|
||
|
||
} else if($r['line_number'] == 'mts'){
|
||
$type = 'mts';
|
||
|
||
|
||
} else if($r['line_number'] == 'tele2'){
|
||
$type = 'tele2';
|
||
|
||
|
||
}
|
||
$call['line_number'] = $type;
|
||
|
||
$calls[] = $call;
|
||
}
|
||
|
||
// var_dump($arrSearch);
|
||
|
||
|
||
if (count($calls) > 0) {
|
||
foreach($arrayHeder as $h => $w) {
|
||
$sheet->setCellValue($h.$rowStart, $w['title']);
|
||
$sheet->getColumnDimension($h)->setWidth($w['width']);
|
||
$sheet->getStyle($h.$rowStart)->getFont()->applyFromArray( [ 'name' => 'Arial', 'bold' => TRUE, 'italic' => FALSE, 'strikethrough' => FALSE, 'color' => [ 'rgb' => '808080' ], ] );
|
||
$sheet->getStyle($h)->getAlignment()->setWrapText(true);
|
||
$sheet->getStyle($h.$rowStart)->getAlignment()->setWrapText(true);
|
||
}
|
||
|
||
$i = $rowStart+1;
|
||
$k = 1;
|
||
foreach ($calls as $call) {
|
||
|
||
$sheet->setCellValue('A'.$i, $k);
|
||
$j = 0;
|
||
|
||
if (isset($arrSearch['date'])) {
|
||
$sheet->setCellValue($arrColExccel[$j].$i, html_entity_decode($call['start']));
|
||
$j++;
|
||
}
|
||
if (isset($arrSearch['on_out'])) {
|
||
$sheet->setCellValue($arrColExccel[$j].$i, html_entity_decode($call['on_out']));
|
||
$j++;
|
||
}
|
||
if (isset($arrSearch['phoneIn'])) {
|
||
$sheet->setCellValue($arrColExccel[$j].$i, html_entity_decode($call['from_number']));
|
||
$j++;
|
||
}
|
||
if (isset($arrSearch['phoneOut'])) {
|
||
$sheet->setCellValue($arrColExccel[$j].$i, html_entity_decode($call['entry_id']));
|
||
$j++;
|
||
}
|
||
if (isset($arrSearch['nameEmp'])) {
|
||
$sheet->setCellValue($arrColExccel[$j].$i, html_entity_decode($call['to_number']));
|
||
$j++;
|
||
}
|
||
if (isset($arrSearch['status'])) {
|
||
$sheet->setCellValue($arrColExccel[$j].$i, html_entity_decode($call['answer']));
|
||
$j++;
|
||
}
|
||
if (isset($arrSearch['duration'])) {
|
||
$sheet->setCellValue($arrColExccel[$j].$i, html_entity_decode($call['time']));
|
||
$j++;
|
||
}
|
||
if (isset($arrSearch['operator'])) {
|
||
$sheet->setCellValue($arrColExccel[$j].$i, html_entity_decode($call['line_number']));
|
||
$j++;
|
||
}
|
||
|
||
|
||
$i++;
|
||
$k++;
|
||
}
|
||
|
||
$styleArray = [
|
||
'borders' => [
|
||
'allBorders' => [
|
||
'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
|
||
'color' => [
|
||
'rgb' => '808080'
|
||
],
|
||
],
|
||
],
|
||
];
|
||
$sheet->getStyle('A' . ($rowStart) . ':' . $arrColExccel[$j-1] . ($rowStart + count($objects)))->applyFromArray($styleArray);
|
||
|
||
}
|
||
|
||
$writer = new Xlsx($spreadsheet);
|
||
if (!file_exists($_SERVER['DOCUMENT_ROOT'] . '/server/excel')) {
|
||
mkdir($_SERVER['DOCUMENT_ROOT'] . '/server/excel', 0777);
|
||
}
|
||
|
||
$name_file = null;
|
||
$name = null;
|
||
$date = date('d.m.Y_H-i-s');
|
||
|
||
$name_file = '/server/excel/my_calls_' . $date . '.xlsx';
|
||
$name = 'my_calls_'.$date.'.xlsx';
|
||
|
||
|
||
if ($name_file && $name) {
|
||
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');
|
||
$writer->save($_SERVER['DOCUMENT_ROOT'] . $name_file);
|
||
echo json_encode([
|
||
'file' => $name_file,
|
||
'result' => 'ok',
|
||
'name' => $name,
|
||
]);
|
||
}
|
||
}
|
||
|