144 lines
5.9 KiB
PHP
144 lines
5.9 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Dashboard\Province;
|
|
|
|
use App\Facades\DataTable\DataTableFacade;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Collection;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class ReportService
|
|
{
|
|
public function cumulative(Request $request): Collection
|
|
{
|
|
$query = DB::table('asteriskcdrdb.cdr')
|
|
->selectRaw("
|
|
DATE(calldate) AS d,
|
|
COUNT(CASE WHEN (recordingfile = '' OR recordingfile LIKE 'q-%') THEN 1 END) AS total,
|
|
COUNT(CASE WHEN lastdata = 'IAX2/serverpeer/100' THEN 1 END) AS teh4,
|
|
COUNT(CASE WHEN lastdata = 'IAX2/242serverpeer/200' THEN 1 END) AS teh5,
|
|
COUNT(CASE WHEN dst = '500' THEN 1 END) AS os4,
|
|
COUNT(CASE WHEN dst = '600' THEN 1 END) AS os5,
|
|
COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'ANSWERED' AND dst BETWEEN 101 AND 104 THEN 1 END) AS ok,
|
|
COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'NO ANSWER' AND dst BETWEEN 101 AND 104 AND duration > 14 THEN 1 END) AS nok,
|
|
COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'ANSWERED' AND dst BETWEEN 101 AND 104 AND billsec > 9 THEN 1 END) AS b10,
|
|
COUNT(CASE WHEN lastapp = 'Busy' THEN 1 END) AS dnd,
|
|
COUNT(CASE WHEN dst BETWEEN 502 AND 599 THEN 1 END) AS trans,
|
|
COUNT(CASE WHEN disposition <> 'BUSY' AND dst BETWEEN 101 AND 105 THEN 1 END) AS all_calls,
|
|
AVG(CASE WHEN dcontext = 'from-internal' AND disposition = 'ANSWERED' THEN billsec END) AS avg
|
|
")->groupByRaw('DATE(calldate)');
|
|
|
|
$data = DataTableFacade::run(
|
|
$query,
|
|
$request,
|
|
allowedFilters: ['*'],
|
|
allowedSortings: ['*'],
|
|
allowedGroupBy: ['d']
|
|
);
|
|
|
|
$data = collect($data);
|
|
|
|
$totals = [
|
|
'd' => 'TOTAL',
|
|
'total' => $data->sum('total'),
|
|
'teh4' => $data->sum('teh4'),
|
|
'teh5' => $data->sum('teh5'),
|
|
'os4' => $data->sum('os4'),
|
|
'os5' => $data->sum('os5'),
|
|
'ok' => $data->sum('ok'),
|
|
'nok' => $data->sum('nok'),
|
|
'b10' => $data->sum('b10'),
|
|
'dnd' => $data->sum('dnd'),
|
|
'trans' => $data->sum('trans'),
|
|
'all' => $data->sum('all'),
|
|
'avg' => round($data->avg('avg'), 2),
|
|
];
|
|
|
|
$data->push($totals);
|
|
|
|
return $data;
|
|
}
|
|
|
|
public function peopleMessages(Request $request)
|
|
{
|
|
$query = DB::table('people_messages')
|
|
->selectRaw('
|
|
COUNT(CASE WHEN is_listen = 1 THEN 1 END) AS l,
|
|
COUNT(CASE WHEN is_listen = 0 THEN 1 END) AS nl
|
|
');
|
|
|
|
return DataTableFacade::run(
|
|
$query,
|
|
$request,
|
|
allowedFilters: ['*'],
|
|
allowedSortings: ['*'],
|
|
);
|
|
}
|
|
|
|
public function detailedLogs(Request $request)
|
|
{
|
|
$query = DB::table('asteriskcdrdb.cdr')
|
|
->where('recordingfile', '<>', '');
|
|
|
|
return DataTableFacade::run(
|
|
$query,
|
|
$request,
|
|
allowedFilters: ['*'],
|
|
allowedSortings: ['*'],
|
|
allowedSelects: ['calldate', 'src', 'dst', 'disposition', 'duration']
|
|
);
|
|
}
|
|
|
|
public function operatorPerformanceDaily(Request $request)
|
|
{
|
|
$query = DB::table(DB::raw("(SELECT *, CAST(dst AS UNSIGNED) AS dst_num FROM asteriskcdrdb.cdr) AS cdr"))
|
|
->selectRaw("
|
|
DATE(calldate) AS d,
|
|
dst,
|
|
COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'ANSWERED' AND dst_num BETWEEN 1 AND 104 THEN 1 END) AS ok,
|
|
COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'NO ANSWER' AND dst_num BETWEEN 1 AND 104 AND duration > 14 THEN 1 END) AS nok,
|
|
COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'ANSWERED' AND dst_num BETWEEN 1 AND 104 AND billsec > 9 THEN 1 END) AS b10,
|
|
COUNT(CASE WHEN lastapp = 'Busy' THEN 1 END) AS dnd,
|
|
COUNT(CASE WHEN dst_num BETWEEN 502 AND 599 THEN 1 END) AS trans,
|
|
COUNT(CASE WHEN disposition <> 'BUSY' AND dst_num BETWEEN 1 AND 105 THEN 1 END) AS total_calls
|
|
")
|
|
->whereBetween('dst_num', [1, 105])
|
|
->groupBy(DB::raw('DATE(calldate)'), 'dst')
|
|
->orderBy(DB::raw('DATE(calldate)'))
|
|
->orderBy('dst');
|
|
|
|
return DataTableFacade::run(
|
|
$query,
|
|
$request,
|
|
allowedFilters: ['*'],
|
|
allowedSortings: ['*'],
|
|
);
|
|
}
|
|
|
|
public function operatorPerformanceTotal(Request $request)
|
|
{
|
|
$query = DB::table(DB::raw("(SELECT *, CAST(dst AS UNSIGNED) AS dst_num FROM asteriskcdrdb.cdr) AS cdr"))
|
|
->selectRaw("
|
|
DATE(calldate) AS d,
|
|
dst,
|
|
COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'ANSWERED' AND dst_num BETWEEN 1 AND 104 THEN 1 END) AS ok,
|
|
COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'NO ANSWER' AND dst_num BETWEEN 1 AND 104 AND duration > 14 THEN 1 END) AS nok,
|
|
COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'ANSWERED' AND dst_num BETWEEN 1 AND 104 AND billsec > 9 THEN 1 END) AS b10,
|
|
COUNT(CASE WHEN lastapp = 'Busy' THEN 1 END) AS dnd,
|
|
COUNT(CASE WHEN dst_num BETWEEN 502 AND 599 THEN 1 END) AS trans,
|
|
COUNT(CASE WHEN disposition <> 'BUSY' AND dst_num BETWEEN 1 AND 105 THEN 1 END) AS total_calls
|
|
")
|
|
->whereBetween('dst_num', [1, 105])
|
|
->groupBy('dst')
|
|
->orderBy(DB::raw('DATE(calldate)'))
|
|
->orderBy('dst');
|
|
|
|
return DataTableFacade::run(
|
|
$query,
|
|
$request,
|
|
allowedFilters: ['*'],
|
|
allowedSortings: ['*'],
|
|
);
|
|
}
|
|
}
|