Files
backend/app/Services/Dashboard/Province/ReportService.php
2025-08-13 14:14:28 +03:30

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: ['*'],
);
}
}