create service and command for sending reports
This commit is contained in:
91
app/Services/Commands/SendCallStatsReportService.php
Normal file
91
app/Services/Commands/SendCallStatsReportService.php
Normal file
@@ -0,0 +1,91 @@
|
||||
<?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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user