127 lines
4.2 KiB
PHP
127 lines
4.2 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'
|
|
];
|
|
|
|
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 combinations AS (
|
|
SELECT
|
|
axis_type_id,
|
|
step
|
|
FROM (
|
|
SELECT 1 AS axis_type_id UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5
|
|
) a
|
|
CROSS JOIN (
|
|
SELECT 1 AS step UNION ALL SELECT 2 UNION ALL SELECT 3
|
|
) s
|
|
),
|
|
provinces AS (
|
|
SELECT DISTINCT province_fa FROM safety_and_privacy WHERE info_id = ?
|
|
),
|
|
data AS (
|
|
SELECT
|
|
p.province_fa,
|
|
c.axis_type_id,
|
|
c.step,
|
|
COUNT(sp.id) AS total
|
|
FROM combinations c
|
|
CROSS JOIN provinces p
|
|
LEFT JOIN safety_and_privacy sp
|
|
ON sp.axis_type_id = c.axis_type_id
|
|
AND sp.step = c.step
|
|
AND sp.province_fa = p.province_fa
|
|
AND sp.info_id = ?
|
|
GROUP BY p.province_fa, c.axis_type_id, c.step
|
|
)
|
|
SELECT
|
|
province_fa,
|
|
axis_type_id,
|
|
step,
|
|
total,
|
|
SUM(total) OVER (PARTITION BY province_fa) AS total_sum
|
|
FROM data
|
|
ORDER BY province_fa, axis_type_id, step
|
|
", [$info_id, $info_id]);
|
|
}
|
|
|
|
public function provinceActivity(int $info_id, int $province_id): array
|
|
{
|
|
return DB::select("
|
|
WITH combinations AS (
|
|
SELECT axis_type_id, step
|
|
FROM (
|
|
SELECT 1 AS axis_type_id UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5
|
|
) a
|
|
CROSS JOIN (
|
|
SELECT 1 AS step UNION ALL SELECT 2 UNION ALL SELECT 3
|
|
) s
|
|
),
|
|
edarat AS (
|
|
SELECT id AS edare_id, name_fa
|
|
FROM edarate_shahri
|
|
WHERE province_id = :provinceId
|
|
),
|
|
data AS (
|
|
SELECT
|
|
e.edare_id,
|
|
c.axis_type_id,
|
|
c.step,
|
|
COUNT(sp.id) AS total
|
|
FROM combinations c
|
|
CROSS JOIN edarat e
|
|
LEFT JOIN safety_and_privacy sp
|
|
ON sp.axis_type_id = c.axis_type_id
|
|
AND sp.step = c.step
|
|
AND sp.city_id = e.edare_id
|
|
AND sp.info_id = :infoId
|
|
GROUP BY e.edare_id, c.axis_type_id, c.step
|
|
)
|
|
SELECT
|
|
e.edare_id,
|
|
e.name_fa AS edare_name,
|
|
d.axis_type_id,
|
|
d.step,
|
|
d.total,
|
|
SUM(d.total) OVER (PARTITION BY e.edare_id) AS total_sum
|
|
FROM data d
|
|
JOIN edarat e ON e.edare_id = d.edare_id
|
|
ORDER BY e.edare_id, d.axis_type_id, d.step
|
|
",[
|
|
'provinceId' => $province_id,
|
|
'infoId' => $info_id,
|
|
]);
|
|
}
|
|
|
|
} |