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")); } }