458 lines
26 KiB
PHP
458 lines
26 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\V3\Dashboard;
|
|
|
|
use App\Enums\AccidentWayGeoTypes;
|
|
use App\Enums\AccidentWeatherConditions;
|
|
use App\Enums\AxisTypes;
|
|
use App\Facades\DataTable\DataTableFacade;
|
|
use App\Facades\File\FileFacade;
|
|
use App\Http\Controllers\Controller;
|
|
use App\Http\Requests\V3\DailyAccident\StoreRequest;
|
|
use App\Http\Requests\V3\DailyAccident\SupervisorRequest;
|
|
use App\Http\Traits\ApiResponse;
|
|
use App\Models\DailyAccident;
|
|
use App\Models\DailyAccidentSettings;
|
|
use App\Models\Province;
|
|
use App\Services\NominatimService;
|
|
use Carbon\Carbon;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Throwable;
|
|
|
|
class DailyAccidentController extends Controller
|
|
{
|
|
use ApiResponse;
|
|
|
|
/**
|
|
* Display a listing of the resource.
|
|
*/
|
|
public function index(Request $request)
|
|
{
|
|
auth()->user()->addActivityComplete(1117);
|
|
|
|
$query = DailyAccident::query();
|
|
|
|
$dataTable = DataTableFacade::run(
|
|
$query,
|
|
$request,
|
|
allowedFilters: ['*'],
|
|
allowedSortings: ['*']
|
|
);
|
|
|
|
return response()->json($dataTable);
|
|
}
|
|
|
|
/**
|
|
* Store a newly created resource in storage.
|
|
* @throws Throwable
|
|
*/
|
|
public function store(StoreRequest $request, NominatimService $nominatimService)
|
|
{
|
|
$province = Province::query()->find($request->province_id);
|
|
|
|
$data = [
|
|
'province_id' => $province->id,
|
|
'province_fa' => $province->name_fa,
|
|
'axis_name' => $request->axis_name,
|
|
'axis_type' => $request->axis_type,
|
|
'axis_type_fa' => AxisTypes::name($request->axis_type),
|
|
'axis_start' => $request->axis_start,
|
|
'axis_end' => $request->axis_end,
|
|
'distance_axis_start' => $request->distance_axis_start,
|
|
'local_name' => $request->local_name,
|
|
'lat' => $request->lat,
|
|
'lng' => $request->lng,
|
|
'police_serial' => $request->police_serial,
|
|
'accident_date' => $request->accident_date,
|
|
'accident_time' => $request->accident_time,
|
|
'day_of_the_week' => $request->day_of_the_week,
|
|
'direction' => $request->direction,
|
|
'direction_fa' => $request->direction == 1 ? 'رفت' : 'برگشت',
|
|
'number_of_injured' => $request->number_of_injured,
|
|
'number_of_died' => $request->number_of_died,
|
|
'weather_condition' => $request->weather_condition,
|
|
'weather_condition_fa' => AccidentWeatherConditions::name($request->weather_condition),
|
|
'way_geometri' => $request->way_geometri,
|
|
'way_geometri_fa' => AccidentWayGeoTypes::name($request->way_geometri),
|
|
'collision_type' => $request->collision_type,
|
|
'collision_type_fa' => DailyAccidentSettings::query()
|
|
->where([
|
|
['type', '=', 'collision_type'],
|
|
['key', '=', $request->collision_type]
|
|
])->first()->value,
|
|
'participants_heavy_vehicle' => $request->participants_heavy_vehicle,
|
|
'participants_light_vehicle' => $request->participants_light_vehicle,
|
|
'participants_bicycle' => $request->participants_bicycle,
|
|
'accident_type' => $request->accident_type,
|
|
'accident_type_fa' => DailyAccidentSettings::query()
|
|
->where([
|
|
['type', '=', 'accident_type'],
|
|
['name', '=', $request->accident_type]
|
|
])->first()->value,
|
|
'legal_speed' => $request->legal_speed,
|
|
'avarage_speed' => $request->avarage_speed,
|
|
'increase_damage_reasons_feqdan_jodakonnande_dar_miyane_rah' => $request->increase_damage_reasons_feqdan_jodakonnande_dar_miyane_rah ?? 0,
|
|
'increase_damage_reasons_naqs_ya_adam_kefayat_hefaze_miyani' => $request->increase_damage_reasons_naqs_ya_adam_kefayat_hefaze_miyani ?? 0,
|
|
'increase_damage_reasons_naqs_ya_adam_kefayat_narde_pol' => $request->increase_damage_reasons_naqs_ya_adam_kefayat_narde_pol ?? 0,
|
|
'increase_damage_reasons_naqs_ya_adam_kefayat' => $request->increase_damage_reasons_naqs_ya_adam_kefayat ?? 0,
|
|
'increase_damage_reasons_naqs_dar_naheye_enteqali' => $request->increase_damage_reasons_naqs_dar_naheye_enteqali ?? 0,
|
|
'increase_damage_reasons_mane_solb_bedone_hefaz' => $request->increase_damage_reasons_mane_solb_bedone_hefaz ?? 0,
|
|
'increase_damage_reasons_sar_azad_hefaz' => $request->increase_damage_reasons_sar_azad_hefaz ?? 0,
|
|
'increase_damage_reasons_shirvani_tond_ya_partgah' => $request->increase_damage_reasons_shirvani_tond_ya_partgah ?? 0,
|
|
'accident_reason_dor_monaseb_dar_qus' => $request->accident_reason_dor_monaseb_dar_qus ?? 0,
|
|
'accident_reason_saraziri_tond' => $request->accident_reason_saraziri_tond ?? 0,
|
|
'accident_reason_nabod_dar_khat_sebqat_dar_sarbalaye' => $request->accident_reason_nabod_dar_khat_sebqat_dar_sarbalaye ?? 0,
|
|
'accident_reason_mantaqe_ba_rizesh_az_divar' => $request->accident_reason_mantaqe_ba_rizesh_az_divar ?? 0,
|
|
'accident_reason_mantaqe_ba_afzayesh_nagahani' => $request->accident_reason_mantaqe_ba_afzayesh_nagahani ?? 0,
|
|
'accident_reason_kahesh_na_monaseb_tedad' => $request->accident_reason_kahesh_na_monaseb_tedad ?? 0,
|
|
'accident_reason_mantaqe_ba_obor_heyvanat_ahli' => $request->accident_reason_mantaqe_ba_obor_heyvanat_ahli ?? 0,
|
|
'accident_reason_mantaqe_ba_tadakhol_terafiki' => $request->accident_reason_mantaqe_ba_tadakhol_terafiki ?? 0,
|
|
'accident_reason_arze_kam_savare_ro' => $request->accident_reason_arze_kam_savare_ro ?? 0,
|
|
'accident_reason_mantaqe_meh_gir' => $request->accident_reason_mantaqe_meh_gir ?? 0,
|
|
'accident_reason_adam_roshanaye_zarori_dar_noqte' => $request->accident_reason_adam_roshanaye_zarori_dar_noqte ?? 0,
|
|
'accident_reason_tabdil_na_monaseb_noe_rah' => $request->accident_reason_tabdil_na_monaseb_noe_rah ?? 0,
|
|
'accident_reason_oftadegi_dar_labe_asphalt' => $request->accident_reason_oftadegi_dar_labe_asphalt ?? 0,
|
|
'accident_reason_naqs_dar_ashkarsazi_navahi' => $request->accident_reason_naqs_dar_ashkarsazi_navahi ?? 0,
|
|
'accident_reason_mahal_na_monaseb_dastrasi' => $request->accident_reason_mahal_na_monaseb_dastrasi ?? 0,
|
|
'accident_reason_roye_na_monaseb' => $request->accident_reason_roye_na_monaseb ?? 0,
|
|
'accident_reason_naqs_dar_ashkar_sazi_shrayet_khas' => $request->accident_reason_naqs_dar_ashkar_sazi_shrayet_khas ?? 0,
|
|
'accident_reason_hendese_na_monaseb_vorodi_va_khoroji' => $request->accident_reason_hendese_na_monaseb_vorodi_va_khoroji ?? 0,
|
|
'accident_reason_adam_rayat_fasele_tooli' => $request->accident_reason_adam_rayat_fasele_tooli ?? 0,
|
|
'accident_reason_naqs_dar_alayem_ekhtari_va_entezami' => $request->accident_reason_naqs_dar_alayem_ekhtari_va_entezami ?? 0,
|
|
'accident_reason_qus_ofoqi_dar_saraziri_tond' => $request->accident_reason_qus_ofoqi_dar_saraziri_tond ?? 0,
|
|
'accident_reason_adam_rayat_obor' => $request->accident_reason_adam_rayat_obor ?? 0,
|
|
'accident_reason_naqs_dar_alayem_pish_agahi' => $request->accident_reason_naqs_dar_alayem_pish_agahi ?? 0,
|
|
'accident_reason_qarar_gire_qus_ofoqi' => $request->accident_reason_qarar_gire_qus_ofoqi ?? 0,
|
|
'accident_reason_adam_rayat_sebghat_mojaz' => $request->accident_reason_adam_rayat_sebghat_mojaz ?? 0,
|
|
'accident_reason_did_na_kafi' => $request->accident_reason_did_na_kafi ?? 0,
|
|
'accident_reason_qus_tond_qaem' => $request->accident_reason_qus_tond_qaem ?? 0,
|
|
'accident_reason_adam_rayat_sorat_mojaz' => $request->accident_reason_adam_rayat_sorat_mojaz ?? 0,
|
|
'accident_reason_ebham_dar_masir' => $request->accident_reason_ebham_dar_masir ?? 0,
|
|
'accident_reason_qus_tond_ofoghi' => $request->accident_reason_qus_tond_ofoghi ?? 0,
|
|
'way_id' => $nominatimService->get_way_id_from_nominatim($request->lat, $request->lng)
|
|
];
|
|
|
|
DB::transaction(function () use ($data, $request)
|
|
{
|
|
$accident = DailyAccident::query()->create($data);
|
|
|
|
$accident->first_image = $request->has('first_image') ? FileFacade::save($request->file('first_image'), "daily_accident_files/{$accident->id}") : null;
|
|
$accident->second_image = $request->has('second_image') ? FileFacade::save($request->file('second_image'), "daily_accident_files/{$accident->id}") : null;
|
|
$accident->police_file = $request->has('police_file') ? FileFacade::save($request->file('police_file'), "daily_accident_files/{$accident->id}") : null;
|
|
$accident->save();
|
|
|
|
auth()->user()->addActivityComplete(1118);
|
|
});
|
|
|
|
return $this->successResponse();
|
|
}
|
|
|
|
/**
|
|
* Display the specified resource.
|
|
*/
|
|
public function show(DailyAccident $dailyAccident)
|
|
{
|
|
return $this->successResponse($dailyAccident);
|
|
}
|
|
|
|
/**
|
|
* Update the specified resource in storage.
|
|
*/
|
|
public function update(Request $request, DailyAccident $dailyAccident)
|
|
{
|
|
//
|
|
}
|
|
|
|
/**
|
|
* Remove the specified resource from storage.
|
|
*/
|
|
public function destroy(DailyAccident $dailyAccident)
|
|
{
|
|
auth()->user()->addActivityComplete(1120, $dailyAccident);
|
|
|
|
FileFacade::deleteDirectory("daily_accident_files/{$dailyAccident->id}");
|
|
|
|
$dailyAccident->delete();
|
|
|
|
return $this->successResponse();
|
|
}
|
|
|
|
/**
|
|
* @throws Throwable
|
|
*/
|
|
public function supervise(DailyAccident $dailyAccident, SupervisorRequest $request)
|
|
{
|
|
DB::transaction(function () use ($request, $dailyAccident) {
|
|
$dailyAccident->update([
|
|
'state' => $request->state,
|
|
'state_fa' => $request->state == '1' ? 'تایید شده' : 'عدم تایید',
|
|
'message' => $request->message,
|
|
'state_updated_at' => now(),
|
|
]);
|
|
|
|
auth()->user()->addActivityComplete(1121, $dailyAccident);
|
|
});
|
|
|
|
return $this->successResponse();
|
|
}
|
|
|
|
public function map(Request $request)
|
|
{
|
|
$dataTable = DataTableFacade::run(
|
|
DailyAccident::query(),
|
|
$request,
|
|
allowedFilters: ['*'],
|
|
allowedSortings: ['*'],
|
|
allowedSelects: ['lat', 'lng', 'id']
|
|
);
|
|
|
|
return response()->json($dataTable);
|
|
}
|
|
|
|
public function poster(Request $request)
|
|
{
|
|
$request->validate([
|
|
'province_id' => 'numeric',
|
|
'from_date' => 'date_format:Y-m-d',
|
|
'to_date' => 'date_format:Y-m-d',
|
|
]);
|
|
|
|
$province_id = $request->province_id;
|
|
$from_date = $request->from_date;
|
|
$to_date = $request->to_date;
|
|
$data = [];
|
|
|
|
$data['payamad_tasadof'] = DailyAccident::when($province_id, function ($query, $province_id) {
|
|
$query->where('province_id', $province_id);
|
|
})
|
|
->when(($from_date && $to_date), function ($query) use ($from_date, $to_date) {
|
|
$query->whereBetween('accident_date', [$from_date . ' 00:00:00', $to_date . ' 23:59:59']);
|
|
})
|
|
->selectRaw('sum(number_of_died) as number_of_died, sum(number_of_injured) as number_of_injured, count(id) as number_of_accident')
|
|
->get();
|
|
|
|
// ACCIDENT REPORT -> PIE CHART
|
|
$accident_types_with_zero_accidents = DailyAccident::selectRaw('0 as cnt, accident_type, accident_type_fa, 0 as percentage')
|
|
->whereNotIn('accident_type_fa', function ($query) use ($province_id, $from_date, $to_date) {
|
|
$query->select('accident_type_fa')->distinct()
|
|
->from('daily_accidents')
|
|
->when($province_id, function ($query, $province_id) {
|
|
$query->where('province_id', $province_id);
|
|
})
|
|
->when(($from_date && $to_date), function ($query) use ($from_date, $to_date) {
|
|
$query->whereBetween('accident_date', [$from_date . ' 00:00:00', $to_date . ' 23:59:59']);
|
|
});
|
|
})
|
|
->groupBy('accident_type_fa');
|
|
|
|
$data['accident_report']['pie_chart'] = DailyAccident::when($province_id, function ($query, $province_id) {
|
|
$query->where('province_id', $province_id);
|
|
})
|
|
->when(($from_date && $to_date), function ($query) use ($from_date, $to_date) {
|
|
$query->whereBetween('accident_date', [$from_date . ' 00:00:00', $to_date . ' 23:59:59']);
|
|
})
|
|
->groupBy('accident_type_fa')
|
|
->selectRaw('count(accident_type) as cnt, accident_type, accident_type_fa, round(count(*) * 100 / sum(count(*)) over(), 1) as percentage')
|
|
->union($accident_types_with_zero_accidents)
|
|
// ->orderBy('accident_type', 'desc')
|
|
->get();
|
|
|
|
// END
|
|
|
|
// ACCIDENT REPORT -> schematic_map AND NUMBER OF ACCIDENTS PER PROVINCE
|
|
if(!$province_id){
|
|
|
|
$provinces_with_zero_accidents = Province::whereNotIn('id', function ($query) use ($from_date, $to_date) {
|
|
$query->select('province_id')
|
|
->distinct('province_id')
|
|
->from('daily_accidents')
|
|
->when(($from_date && $to_date), function ($query) use ($from_date, $to_date) {
|
|
$query->whereBetween('accident_date', [$from_date . ' 00:00:00', $to_date . ' 23:59:59']);
|
|
});
|
|
})->selectRaw('null, id, name_fa');
|
|
|
|
$data['accident_report']['schematic_map'] = DailyAccident::when(($from_date && $to_date), function ($query) use ($from_date, $to_date) {
|
|
$query->whereBetween('accident_date', [$from_date . ' 00:00:00', $to_date . ' 23:59:59']);
|
|
})
|
|
->groupBy('province_id')
|
|
->selectRaw('count(*) as cnt, province_id, province_fa')
|
|
->union($provinces_with_zero_accidents)
|
|
->orderBy('province_id', 'asc')
|
|
// ->orderBy('cnt', 'asc')
|
|
->get();
|
|
|
|
$data['number_of_accidents_per_province'] = $data['accident_report']['schematic_map'];
|
|
}
|
|
// END
|
|
|
|
// ACCIDENT REPORT -> bar chart
|
|
$way_geometries_with_zero_accidents = DailyAccident::selectRaw('0 as cnt, way_geometri, way_geometri_fa')
|
|
->whereNotIn('way_geometri', function ($query) use ($province_id, $from_date, $to_date) {
|
|
$query->select('way_geometri')->distinct()
|
|
->from('daily_accidents')
|
|
->when($province_id, function ($query, $province_id) {
|
|
$query->where('province_id', $province_id);
|
|
})
|
|
->when(($from_date && $to_date), function ($query) use ($from_date, $to_date) {
|
|
$query->whereBetween('accident_date', [$from_date . ' 00:00:00', $to_date . ' 23:59:59']);
|
|
});
|
|
})
|
|
->groupBy('way_geometri');
|
|
|
|
$data['accident_report']['bar_chart'] = DailyAccident::when($province_id, function ($query, $province_id) {
|
|
$query->where('province_id', $province_id);
|
|
})
|
|
->when(($from_date && $to_date), function ($query) use ($from_date, $to_date) {
|
|
$query->whereBetween('accident_date', [$from_date . ' 00:00:00', $to_date . ' 23:59:59']);
|
|
})
|
|
->groupBy('way_geometri')
|
|
->selectRaw('count(*) as cnt, way_geometri, way_geometri_fa')
|
|
->union($way_geometries_with_zero_accidents)
|
|
->orderBy('cnt', 'desc')
|
|
->get();
|
|
|
|
// END
|
|
|
|
// share_of_accidents_by_road_type
|
|
$share_by_road_type_data = DailyAccident::when($province_id, function ($query, $province_id) {
|
|
$query->where('province_id', $province_id);
|
|
})
|
|
->when(($from_date && $to_date), function ($query) use ($from_date, $to_date) {
|
|
$query->whereBetween('accident_date', [$from_date . ' 00:00:00', $to_date . ' 23:59:59']);
|
|
})
|
|
->groupBy('axis_type', 'accident_type')
|
|
->selectRaw('count(*) as cnt, axis_type, axis_type_fa, accident_type, accident_type_fa')
|
|
->get()->toArray();
|
|
|
|
$result = [
|
|
['accident_type_fa' => 'خسارتی', 'data' => [['axis_type_fa' => 'آزادراه', 'cnt' => 0], ['axis_type_fa' => 'بزرگراه', 'cnt' => 0], ['axis_type_fa' => 'اصلی', 'cnt' => 0], ['axis_type_fa' => 'فرعی', 'cnt' => 0]]],
|
|
['accident_type_fa' => 'جرحی', 'data' => [['axis_type_fa' => 'آزادراه', 'cnt' => 0], ['axis_type_fa' => 'بزرگراه', 'cnt' => 0], ['axis_type_fa' => 'اصلی', 'cnt' => 0], ['axis_type_fa' => 'فرعی', 'cnt' => 0]]],
|
|
['accident_type_fa' => 'فوتی', 'data' => [['axis_type_fa' => 'آزادراه', 'cnt' => 0], ['axis_type_fa' => 'بزرگراه', 'cnt' => 0], ['axis_type_fa' => 'اصلی', 'cnt' => 0], ['axis_type_fa' => 'فرعی', 'cnt' => 0]]],
|
|
];
|
|
|
|
foreach ($share_by_road_type_data as $item) {
|
|
$key = $item['accident_type'] - 1;
|
|
|
|
foreach ($result[$key]['data'] as $k => $axis_data) {
|
|
if ($axis_data['axis_type_fa'] == $item['axis_type_fa']) {
|
|
$result[$key]['data'][$k]['cnt'] = $item['cnt'];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
$data['share_of_accidents_by_road_type'] = $result;
|
|
// END
|
|
|
|
// share_of_accidents_by_road_geometry
|
|
$share_by_road_geometry_data = DailyAccident::when($province_id, function ($query, $province_id) {
|
|
$query->where('province_id', $province_id);
|
|
})
|
|
->when(($from_date && $to_date), function ($query) use ($from_date, $to_date) {
|
|
$query->whereBetween('accident_date', [$from_date . ' 00:00:00', $to_date . ' 23:59:59']);
|
|
})
|
|
->groupBy('way_geometri', 'axis_type')
|
|
->selectRaw('count(*) as cnt, way_geometri, way_geometri_fa, axis_type, axis_type_fa')
|
|
->get()->toArray();
|
|
|
|
$result = [
|
|
['way_geometri_fa' => 'تقاطع - دسترسی', 'data' => [['axis_type_fa' => 'آزادراه', 'cnt' => 0], ['axis_type_fa' => 'بزرگراه', 'cnt' => 0], ['axis_type_fa' => 'اصلی', 'cnt' => 0], ['axis_type_fa' => 'فرعی', 'cnt' => 0]]],
|
|
['way_geometri_fa' => 'قوس افقی یا قائم', 'data' => [['axis_type_fa' => 'آزادراه', 'cnt' => 0], ['axis_type_fa' => 'بزرگراه', 'cnt' => 0], ['axis_type_fa' => 'اصلی', 'cnt' => 0], ['axis_type_fa' => 'فرعی', 'cnt' => 0]]],
|
|
['way_geometri_fa' => 'پل', 'data' => [['axis_type_fa' => 'آزادراه', 'cnt' => 0], ['axis_type_fa' => 'بزرگراه', 'cnt' => 0], ['axis_type_fa' => 'اصلی', 'cnt' => 0], ['axis_type_fa' => 'فرعی', 'cnt' => 0]]],
|
|
['way_geometri_fa' => 'پل و قوس', 'data' => [['axis_type_fa' => 'آزادراه', 'cnt' => 0], ['axis_type_fa' => 'بزرگراه', 'cnt' => 0], ['axis_type_fa' => 'اصلی', 'cnt' => 0], ['axis_type_fa' => 'فرعی', 'cnt' => 0]]],
|
|
['way_geometri_fa' => 'تونل', 'data' => [['axis_type_fa' => 'آزادراه', 'cnt' => 0], ['axis_type_fa' => 'بزرگراه', 'cnt' => 0], ['axis_type_fa' => 'اصلی', 'cnt' => 0], ['axis_type_fa' => 'فرعی', 'cnt' => 0]]],
|
|
['way_geometri_fa' => 'میدان', 'data' => [['axis_type_fa' => 'آزادراه', 'cnt' => 0], ['axis_type_fa' => 'بزرگراه', 'cnt' => 0], ['axis_type_fa' => 'اصلی', 'cnt' => 0], ['axis_type_fa' => 'فرعی', 'cnt' => 0]]],
|
|
['way_geometri_fa' => 'دوربرگردان', 'data' => [['axis_type_fa' => 'آزادراه', 'cnt' => 0], ['axis_type_fa' => 'بزرگراه', 'cnt' => 0], ['axis_type_fa' => 'اصلی', 'cnt' => 0], ['axis_type_fa' => 'فرعی', 'cnt' => 0]]],
|
|
['way_geometri_fa' => 'بریدگی', 'data' => [['axis_type_fa' => 'آزادراه', 'cnt' => 0], ['axis_type_fa' => 'بزرگراه', 'cnt' => 0], ['axis_type_fa' => 'اصلی', 'cnt' => 0], ['axis_type_fa' => 'فرعی', 'cnt' => 0]]],
|
|
['way_geometri_fa' => 'تقاطع و قوس', 'data' => [['axis_type_fa' => 'آزادراه', 'cnt' => 0], ['axis_type_fa' => 'بزرگراه', 'cnt' => 0], ['axis_type_fa' => 'اصلی', 'cnt' => 0], ['axis_type_fa' => 'فرعی', 'cnt' => 0]]],
|
|
['way_geometri_fa' => 'نقطه عادی', 'data' => [['axis_type_fa' => 'آزادراه', 'cnt' => 0], ['axis_type_fa' => 'بزرگراه', 'cnt' => 0], ['axis_type_fa' => 'اصلی', 'cnt' => 0], ['axis_type_fa' => 'فرعی', 'cnt' => 0]]],
|
|
];
|
|
|
|
foreach ($share_by_road_geometry_data as $item) {
|
|
$key = $item['way_geometri'] - 1;
|
|
|
|
foreach ($result[$key]['data'] as $k => $axis_data) {
|
|
if ($axis_data['axis_type_fa'] == $item['axis_type_fa']) {
|
|
$result[$key]['data'][$k]['cnt'] = $item['cnt'];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
$data['share_of_accidents_by_road_geometry'] = $result;
|
|
// END
|
|
|
|
// collision type
|
|
$collision_types_with_zero_accidents = DailyAccident::selectRaw('0 as percentage, collision_type, collision_type_fa')
|
|
->whereNotIn('collision_type', function ($query) use ($province_id, $from_date, $to_date) {
|
|
$query->select('collision_type')->distinct()
|
|
->from('daily_accidents')
|
|
->when($province_id, function ($query, $province_id) {
|
|
$query->where('province_id', $province_id);
|
|
})
|
|
->when(($from_date && $to_date), function ($query) use ($from_date, $to_date) {
|
|
$query->whereBetween('accident_date', [$from_date . ' 00:00:00', $to_date . ' 23:59:59']);
|
|
});
|
|
|
|
})
|
|
->groupBy('collision_type');
|
|
|
|
// dd($collision_types_with_zero_accidents->get()) ;
|
|
|
|
$data['collision_type'] = DailyAccident::when($province_id, function ($query, $province_id) {
|
|
$query->where('province_id', $province_id);
|
|
})
|
|
->when(($from_date && $to_date), function ($query) use ($from_date, $to_date) {
|
|
$query->whereBetween('accident_date', [$from_date . ' 00:00:00', $to_date . ' 23:59:59']);
|
|
})
|
|
->whereNotNull(['collision_type', 'collision_type_fa'])
|
|
->groupBy('collision_type')
|
|
->selectRaw('round(count(*) * 100 / sum(count(*)) over(), 1) as percentage, collision_type, collision_type_fa')
|
|
->union($collision_types_with_zero_accidents)
|
|
->orderBy('percentage', 'desc')
|
|
->get();
|
|
// END
|
|
|
|
|
|
// per day
|
|
$where_province_exists = ($province_id) ? "province_id = $province_id and" : '';
|
|
$where_date_exists = ($from_date && $to_date) ? "accident_date BETWEEN '$from_date 00:00:00' and '$to_date 23:59:59' and" : '';
|
|
// dd($where_date_exists);
|
|
$per_day_array = DB::select("SELECT t1.*, round(sum(t1.cnt) over(PARTITION by day_part) * 100 / sum(t1.cnt) over(), 1) as day_percentage
|
|
from
|
|
(select count(*) as cnt, sum(count(*)) over() as total, round(count(*) * 100/ sum(count(*)) over(), 1) as percent, accident_type, accident_type_fa, 'day' as day_part
|
|
from daily_accidents da where $where_province_exists $where_date_exists accident_time BETWEEN '06:00:00' and '18:00:00' group by accident_type
|
|
UNION
|
|
select count(*) as cnt, sum(count(*)) over() as total, round(count(*) * 100/ sum(count(*)) over(), 1) as percent, accident_type, accident_type_fa, 'night' as day_part
|
|
from daily_accidents da where $where_province_exists $where_date_exists accident_time not BETWEEN '06:00:00' and '18:00:00' group by accident_type)t1
|
|
order by day_part");
|
|
|
|
// dd($per_day_array);
|
|
|
|
$per_day_result = [
|
|
['accident_type_fa' => 'خسارتی', 'night' => ['cnt' => 0, 'percent' => 0, 'total_percentage' => 0], 'day' => ['cnt' => 0, 'percent' => 0, 'total_percentage' => 0]],
|
|
['accident_type_fa' => 'جرحی', 'night' => ['cnt' => 0, 'percent' => 0, 'total_percentage' => 0], 'day' => ['cnt' => 0, 'percent' => 0, 'total_percentage' => 0]],
|
|
['accident_type_fa' => 'فوتی', 'night' => ['cnt' => 0, 'percent' => 0, 'total_percentage' => 0], 'day' => ['cnt' => 0, 'percent' => 0, 'total_percentage' => 0]]
|
|
];
|
|
|
|
$per_day_array = json_decode(json_encode($per_day_array), true);
|
|
|
|
foreach ($per_day_array as $item) {
|
|
$key = $item['accident_type'] - 1;
|
|
$per_day_result[$key][$item['day_part']]['cnt'] = $item['cnt'];
|
|
$per_day_result[$key][$item['day_part']]['percent'] = $item['percent'];
|
|
// $per_day_result[$key][$item['day_part']]['total_percentage'] = $item['day_percentage'];
|
|
|
|
for ($i=0; $i < count($per_day_result); $i++) {
|
|
$per_day_result[$i][$item['day_part']]['total_percentage'] = $item['day_percentage'];
|
|
}
|
|
}
|
|
|
|
$data['per_day'] = $per_day_result;
|
|
// END
|
|
|
|
return view('posters.DailyAccidentPoster', compact("data"));
|
|
}
|
|
}
|