Files
backend/app/Services/Commands/SendCallStatsReportService.php

92 lines
3.6 KiB
PHP

<?php
namespace App\Services\Commands;
use Exception;
use Illuminate\Http\Client\ConnectionException;
use Illuminate\Http\Client\RequestException;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
class SendCallStatsReportService
{
private string $url;
private string $channelName;
private string $provinceId;
private string $provinceName;
public function __construct()
{
$this->url = config('ProvinceInfo.center_ip');
$this->channelName = 'send_call_stats_report';
$this->provinceId = config('ProvinceInfo.id');
$this->provinceName = config('ProvinceInfo.name');
}
/**
* @throws ConnectionException
* @throws RequestException
*/
public function execute(): void
{
try
{
$data = $this->prepare();
Http::post($this->url, $data)->throw();
Log::channel($this->channelName)->info(SendCallStatsReportService::class, [$this->provinceName, array_sum($data), 'successful']);
}
catch (Exception $e)
{
Log::channel($this->channelName)->error(SendCallStatsReportService::class, [$e->getMessage()]);
throw $e;
}
}
private function prepare(): array
{
$query = "SELECT
{$this->provinceId} AS province_id,
'{$this->provinceName}' AS province_name,
date,
total,
route_to_teh4,
route_to_teh5,
route_to_os4,
route_to_os5,
answered,
missed,
answered_over10,
dnd,
transferred,
talked_to_operator,
c_agency,
c_agency_driver,
average_calls_time,
(talked_to_operator - (answered + missed) + c_agency + c_agency_driver) AS fails
FROM (
SELECT
DATE(calldate) AS date,
COUNT(CASE WHEN recordingfile = '' OR recordingfile LIKE 'q-%' THEN 1 END) AS total,
COUNT(CASE WHEN lastdata = 'IAX2/serverpeer/100' THEN 1 END) AS route_to_teh4,
COUNT(CASE WHEN lastdata = 'IAX2/serverpeer/200' THEN 1 END) AS route_to_teh5,
COUNT(CASE WHEN dst = '500' THEN 1 END) AS route_to_os4,
COUNT(CASE WHEN dst = '600' THEN 1 END) AS route_to_os5,
COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'ANSWERED' AND dst BETWEEN 101 AND 104 THEN 1 END) AS answered,
COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'NO ANSWER' AND dst BETWEEN 101 AND 104 AND duration > 14 THEN 1 END) AS missed,
COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'ANSWERED' AND dst BETWEEN 101 AND 104 AND billsec > 9 THEN 1 END) AS answered_over10,
COUNT(CASE WHEN lastapp = 'Busy' THEN 1 END) AS dnd,
COUNT(CASE WHEN dst BETWEEN 502 AND 599 THEN 1 END) AS transferred,
COUNT(CASE WHEN disposition <> 'BUSY' AND dst BETWEEN 101 AND 105 THEN 1 END) AS talked_to_operator,
COUNT(CASE WHEN lastdata LIKE '%custom/agency%' THEN 1 END) AS c_agency,
COUNT(CASE WHEN lastdata LIKE '%custom/agency-driver%' THEN 1 END) AS c_agency_driver,
AVG(CASE WHEN dcontext = 'from-internal' AND disposition = 'ANSWERED' THEN billsec END) AS average_calls_time
FROM asteriskcdrdb.cdr
WHERE calldate >= NOW() - INTERVAL 3 DAY
GROUP BY date
)
WHERE date >= DATE(NOW() - INTERVAL 3 DAY)";
return DB::select($query);
}
}