Files
backend/app/Services/Cartables/AccidentReceiptTableService.php
2025-09-17 10:55:19 +03:30

136 lines
5.7 KiB
PHP

<?php
namespace App\Services\Cartables;
use App\Facades\DataTable\DataTableFacade;
use App\Http\Traits\ApiResponse;
use App\Models\Accident;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class AccidentReceiptTableService
{
use ApiResponse;
public function dataTable(Request $request, $loadRelations = false)
{
$user = auth()->user();
$query = null;
if ($user->hasPermissionTo('show-receipt')) {
$query = Accident::query()
->when($loadRelations, fn ($query) => $query->with('damages'));
}
else {
if (is_null($user->province_id)) {
return $this->errorResponse('استانی برای شما در سامانه ثبت نشده است!');
}
$query = Accident::query()
->where('province_id', '=', $user->province_id)
->when($loadRelations, fn ($query) => $query->with('damages'));
}
return DataTableFacade::run(
$query,
$request,
allowedFilters: ['*'],
allowedSortings: ['*']
);
}
public function countryReport(Request $request): array
{
$data = DB::select(
'SELECT
"کشوری" as province_fa,
-1 as province_id,
COUNT(id) AS tedade,
COUNT(CASE WHEN STATUS =0 THEN 1 END ) AS egdam,
COUNT(CASE WHEN STATUS IN (1,2,3,4) THEN 1 END) AS pardakht,
COUNT(CASE WHEN STATUS =5 THEN 1 END ) AS khatm,
COUNT(CASE WHEN report_base = 0 THEN 1 END) AS police_rah,
COUNT(CASE WHEN report_base = 1 THEN 1 END) AS gozaresh_gasht,
SUM(`driver_share_amount`) AS kol_sabt_shode,
SUM(CASE WHEN STATUS > 3 THEN `sum` END) AS vasel_shode,
SUM(CASE WHEN STATUS > 3 THEN `deposit_insurance_amount` END) AS vasel_shode_bimeh,
SUM(CASE WHEN STATUS > 3 THEN `deposit_daghi_amount` END) AS vasel_shode_daghi,
SUM(CASE WHEN STATUS > 3 THEN `final_amount` END) AS vasel_shode_final
FROM `accidents`
where created_at BETWEEN "'.$request->from_date.' 00:00:00" AND "'.$request->date_to.' 23:59:59"
union
SELECT
province_fa,
province_id,
COUNT(id) AS tedade,
COUNT(CASE WHEN STATUS =0 THEN 1 END ) AS egdam,
COUNT(CASE WHEN STATUS IN (1,2,3,4) THEN 1 END) AS pardakht,
COUNT(CASE WHEN STATUS =5 THEN 1 END ) AS khatm,
COUNT(CASE WHEN report_base = 0 THEN 1 END) AS police_rah,
COUNT(CASE WHEN report_base = 1 THEN 1 END) AS gozaresh_gasht,
SUM(`driver_share_amount`) AS kol_sabt_shode,
SUM(CASE WHEN STATUS > 3 THEN `sum` END) AS vasel_shode,
SUM(CASE WHEN STATUS > 3 THEN `deposit_insurance_amount` END) AS vasel_shode_bimeh,
SUM(CASE WHEN STATUS > 3 THEN `deposit_daghi_amount` END) AS vasel_shode_daghi,
SUM(CASE WHEN STATUS > 3 THEN `final_amount` END) AS vasel_shode_final
FROM `accidents`
where created_at BETWEEN "'.$request->from_date.' 00:00:00" AND "'.$request->date_to.' 23:59:59"
GROUP BY province_id
'
);
return [
'data' => $data,
'fromDate' => $request->from_date,
'toDate' => $request->date_to,
];
}
public function provinceReport(Request $request): array
{
$data = DB::select(
'SELECT
"استانی" as city_fa,
-1 as city_id,
COUNT(id) AS tedade,
COUNT(CASE WHEN STATUS =0 THEN 1 END ) AS egdam,
COUNT(CASE WHEN STATUS IN (1,2,3,4) THEN 1 END) AS pardakht,
COUNT(CASE WHEN STATUS =5 THEN 1 END ) AS khatm,
COUNT(CASE WHEN report_base = 0 THEN 1 END) AS police_rah,
COUNT(CASE WHEN report_base = 1 THEN 1 END) AS gozaresh_gasht,
SUM(`driver_share_amount`) AS kol_sabt_shode,
SUM(CASE WHEN STATUS > 3 THEN `sum` END) AS vasel_shode,
SUM(CASE WHEN STATUS > 3 THEN `deposit_insurance_amount` END) AS vasel_shode_bimeh,
SUM(CASE WHEN STATUS > 3 THEN `deposit_daghi_amount` END) AS vasel_shode_daghi,
SUM(CASE WHEN STATUS > 3 THEN `final_amount` END) AS vasel_shode_final
FROM `accidents`
where created_at BETWEEN "'.$request->from_date.' 00:00:00" AND "'.$request->date_to.' 23:59:59" AND province_id ='.$request->province_id.'
union
SELECT
city_fa,
city_id,
COUNT(id) AS tedade,
COUNT(CASE WHEN STATUS =0 THEN 1 END ) AS egdam,
COUNT(CASE WHEN STATUS IN (1,2,3,4) THEN 1 END) AS pardakht,
COUNT(CASE WHEN STATUS =5 THEN 1 END ) AS khatm,
COUNT(CASE WHEN report_base = 0 THEN 1 END) AS police_rah,
COUNT(CASE WHEN report_base = 1 THEN 1 END) AS gozaresh_gasht,
SUM(`driver_share_amount`) AS kol_sabt_shode,
SUM(CASE WHEN STATUS > 3 THEN `sum` END) AS vasel_shode,
SUM(CASE WHEN STATUS > 3 THEN `deposit_insurance_amount` END) AS vasel_shode_bimeh,
SUM(CASE WHEN STATUS > 3 THEN `deposit_daghi_amount` END) AS vasel_shode_daghi,
SUM(CASE WHEN STATUS > 3 THEN `final_amount` END) AS vasel_shode_final
FROM `accidents`
where created_at BETWEEN "'.$request->from_date.' 00:00:00" AND "'.$request->date_to.' 23:59:59" AND province_id ='.$request->province_id.'
GROUP BY city_id
'
);
return [
'data' => $data,
'fromDate' => $request->from_date,
'toDate' => $request->date_to,
];
}
}