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

188 lines
7.8 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
(
COUNT(CASE WHEN disposition <> 'BUSY' AND dst BETWEEN 101 AND 105 THEN 1 END)
- (
COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'ANSWERED' AND dst BETWEEN 101 AND 104 THEN 1 END)
+ COUNT(CASE WHEN dcontext = 'from-internal' AND disposition = 'NO ANSWER' AND dst BETWEEN 101 AND 104 AND duration > 14 THEN 1 END)
)
) AS fail,
")->groupByRaw('DATE(calldate)');
$data = DataTableFacade::run(
$query,
$request,
allowedFilters: ['*'],
allowedSortings: ['*'],
);
$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('asteriskcdrdb.cdr')
->selectRaw("
DATE(calldate) as d,
dst,
COUNT(CASE WHEN dcontext = 'from-internal'
AND disposition = 'ANSWERED'
AND dst > 100 AND dst < 105 THEN 1 END) AS ok,
COUNT(CASE WHEN dcontext = 'from-internal'
AND disposition = 'NO ANSWER'
AND dst > 100 AND dst < 105
AND duration > 14 THEN 1 END) AS nok,
COUNT(CASE WHEN dcontext = 'from-internal'
AND disposition = 'ANSWERED'
AND dst > 100 AND dst < 105
AND billsec > 9 THEN 1 END) AS b10,
COUNT(CASE WHEN lastapp = 'Busy' THEN 1 END) AS dnd,
COUNT(CASE WHEN dst > 501 AND dst < 600 THEN 1 END) AS trans,
COUNT(CASE WHEN disposition <> 'BUSY'
AND dst BETWEEN 101 AND 105 THEN 1 END) AS total,
(COUNT(CASE WHEN disposition <> 'BUSY'
AND dst BETWEEN 101 AND 105 THEN 1 END)
- (COUNT(CASE WHEN dcontext = 'from-internal'
AND disposition = 'ANSWERED'
AND dst > 100 AND dst < 105 THEN 1 END)
+ COUNT(CASE WHEN dcontext = 'from-internal'
AND disposition = 'NO ANSWER'
AND dst > 100 AND dst < 105
AND duration > 14 THEN 1 END)
)
) AS fail
")
->whereBetween('dst', [1, 104]) // dst>100 AND dst<105
->groupBy('dst', DB::raw('DATE(calldate)'))
->orderBy('dst');
return DataTableFacade::run(
$query,
$request,
allowedFilters: ['*'],
allowedSortings: ['*'],
);
}
public function operatorPerformanceTotal(Request $request)
{
$query = DB::table('asteriskcdrdb.cdr')
->selectRaw("
dst,
COUNT(CASE WHEN dcontext = 'from-internal'
AND disposition = 'ANSWERED'
AND dst > 100 AND dst < 105 THEN 1 END) AS ok,
COUNT(CASE WHEN dcontext = 'from-internal'
AND disposition = 'NO ANSWER'
AND dst > 100 AND dst < 105
AND duration > 14 THEN 1 END) AS nok,
COUNT(CASE WHEN dcontext = 'from-internal'
AND disposition = 'ANSWERED'
AND dst > 100 AND dst < 105
AND billsec > 9 THEN 1 END) AS b10,
COUNT(CASE WHEN lastapp = 'Busy' THEN 1 END) AS dnd,
COUNT(CASE WHEN dst > 501 AND dst < 600 THEN 1 END) AS trans,
COUNT(CASE WHEN disposition <> 'BUSY'
AND dst BETWEEN 101 AND 105 THEN 1 END) AS total,
(COUNT(CASE WHEN disposition <> 'BUSY'
AND dst BETWEEN 101 AND 105 THEN 1 END)
- (COUNT(CASE WHEN dcontext = 'from-internal'
AND disposition = 'ANSWERED'
AND dst > 100 AND dst < 105 THEN 1 END)
+ COUNT(CASE WHEN dcontext = 'from-internal'
AND disposition = 'NO ANSWER'
AND dst > 100 AND dst < 105
AND duration > 14 THEN 1 END)
)
) AS fail
")
->whereBetween('dst', [1, 104])
->groupBy('dst')
->orderBy(DB::raw('DATE(calldate)'))
->orderBy('dst');
return DataTableFacade::run(
$query,
$request,
allowedFilters: ['*'],
allowedSortings: ['*'],
);
}
}