Files
backend/app/Services/Cartables/SafetyAndPrivacy/OperatorService.php
2025-08-27 09:22:22 +03:30

106 lines
3.6 KiB
PHP

<?php
namespace App\Services\Cartables\SafetyAndPrivacy;
use App\Exceptions\ProhibitedAction;
use App\Facades\DataTable\DataTableFacade;
use App\Models\SafetyAndPrivacy;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class OperatorService
{
public function dataTable(Request $request)
{
$user = auth()->user();
$fields = [
'id','lat','lon', 'recognize_picture','action_picture','created_at','step', 'final_description',
'info_fa', 'activity_date_time', 'action_picture_document_upload_date', 'judiciary_document_upload_date',
'step_fa', 'axis_type_id', 'axis_type_name', 'action_date', 'is_finished', 'status_fa', 'supervisor_description',
'operator_description', 'finish_picture', 'evidence_picture', 'recognize_picture_second'
];
throw_if(is_null($user->edarate_shahri_id), new ProhibitedAction('اداره ای برای شما در سامانه ثبت نشده است!'));
$query = SafetyAndPrivacy::query()->where('edare_shahri_id', '=', $user->edarate_shahri_id);
return DataTableFacade::run(
$query,
$request,
allowedFilters: ['*'],
allowedSortings: ['*'],
allowedSelects: $fields
);
}
public function countryActivity(int $info_id): array
{
return DB::select("
WITH province_data AS (
SELECT
p.id AS province_id,
a.id AS axis_type_id,
SUM(CASE WHEN t.step = 1 THEN 1 ELSE 0 END) AS s1,
SUM(CASE WHEN t.step = 2 THEN 1 ELSE 0 END) AS c2,
SUM(CASE WHEN t.step = 3 THEN 1 ELSE 0 END) AS c3
FROM provinces p
CROSS JOIN axis_types a
LEFT JOIN safety_and_privacy t
ON p.id = t.province_id
AND a.id = t.axis_type_id
AND t.info_id = :infoId
GROUP BY p.id, a.id
)
SELECT * FROM province_data
UNION ALL
SELECT
-1 AS province_id,
axis_type_id,
SUM(s1) AS s1,
SUM(c2) AS c2,
SUM(c3) AS c3
FROM province_data
GROUP BY axis_type_id
ORDER BY province_id, axis_type_id
", [
'infoId' => $info_id,
]);
}
public function provinceActivity(int $info_id, int $province_id): array
{
return DB::select("
WITH edareh_data AS (
SELECT
e.id AS edareh_id,
a.id AS axis_type_id,
SUM(CASE WHEN t.step = 1 THEN 1 ELSE 0 END) AS c1,
SUM(CASE WHEN t.step = 2 THEN 1 ELSE 0 END) AS c2,
SUM(CASE WHEN t.step = 3 THEN 1 ELSE 0 END) AS c3
FROM edarate_shahri e
CROSS JOIN axis_types a
LEFT JOIN safety_and_privacy t
ON e.id = t.edare_shahri_id
AND a.id = t.axis_type_id
AND t.info_id = :infoId
WHERE e.province_id = :provinceId
GROUP BY e.id, a.id
)
SELECT * FROM edareh_data
UNION ALL
SELECT
-1 AS edareh_id,
axis_type_id,
SUM(s1) AS s1,
SUM(c2) AS c2,
SUM(c3) AS c3
FROM edareh_data
GROUP BY axis_type_id
ORDER BY edareh_id, axis_type_id
", [
'provinceId' => $province_id,
'infoId' => $info_id,
]);
}
}