diff --git a/app/Enums/AccidentWayGeoTypes.php b/app/Enums/AccidentWayGeoTypes.php new file mode 100644 index 00000000..09130863 --- /dev/null +++ b/app/Enums/AccidentWayGeoTypes.php @@ -0,0 +1,24 @@ + "تقاطع - دسترسی", + 2 => "قوس افقی یا قائم", + 3 => "پل", + 4 => "پل و قوس", + 5 => "تونل", + 6 => "میدان", + 7 => "دوربرگردان", + 8 => "بریدگی", + 9 => "تقاطع و قوس", + 10 => "نقطه عادی", + ]; + + return $mapArray[$state]; + } +} \ No newline at end of file diff --git a/app/Enums/AccidentWeatherConditions.php b/app/Enums/AccidentWeatherConditions.php new file mode 100644 index 00000000..88f11c28 --- /dev/null +++ b/app/Enums/AccidentWeatherConditions.php @@ -0,0 +1,28 @@ + 'برفی', + 2 => 'کولاک', + 3 => 'آفتابی', + 4 => 'بارانی', + 5 => 'یخبندان', + 6 => 'مه آلود', + ]; + + return $mapArray[$state]; + } +} \ No newline at end of file diff --git a/app/Http/Controllers/V3/Dashboard/DailyAccidentController.php b/app/Http/Controllers/V3/Dashboard/DailyAccidentController.php new file mode 100644 index 00000000..94a1f129 --- /dev/null +++ b/app/Http/Controllers/V3/Dashboard/DailyAccidentController.php @@ -0,0 +1,457 @@ +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")); + } +} diff --git a/app/Http/Requests/V3/DailyAccident/StoreRequest.php b/app/Http/Requests/V3/DailyAccident/StoreRequest.php new file mode 100644 index 00000000..c2f0bf1f --- /dev/null +++ b/app/Http/Requests/V3/DailyAccident/StoreRequest.php @@ -0,0 +1,94 @@ + + */ + public function rules(): array + { + return [ + 'province_id' => 'required|integer|exists:provinces,id', + 'axis_name' => 'required|string|max:255', + 'axis_type' => '', + 'axis_start' => '', + 'axis_end' => '', + 'distance_axis_start' => '', + 'local_name' => '', + 'lat' => '', + 'lng' => '', + 'police_serial' => '', + 'accident_date' => '', + 'accident_time' => '', + 'day_of_the_week' => '', + 'direction' => '', + 'number_of_injured' => '', + 'number_of_died' => '', + 'weather_condition' => '', + 'way_geometri' => '', + 'collision_type' => '', + 'participants_heavy_vehicle' => '', + 'participants_light_vehicle' => '', + 'participants_bicycle' => '', + 'accident_type' => '', + 'legal_speed' => '', + 'avarage_speed' => '', + 'increase_damage_reasons_feqdan_jodakonnande_dar_miyane_rah' => '', + 'increase_damage_reasons_naqs_ya_adam_kefayat_hefaze_miyani' => '', + 'increase_damage_reasons_naqs_ya_adam_kefayat_narde_pol' => '', + 'increase_damage_reasons_naqs_ya_adam_kefayat' => '', + 'increase_damage_reasons_naqs_dar_naheye_enteqali' => '', + 'increase_damage_reasons_mane_solb_bedone_hefaz' => '', + 'increase_damage_reasons_sar_azad_hefaz' => '', + 'increase_damage_reasons_shirvani_tond_ya_partgah' => '', + 'accident_reason_dor_monaseb_dar_qus' => '', + 'accident_reason_saraziri_tond' => '', + 'accident_reason_nabod_dar_khat_sebqat_dar_sarbalaye' => '', + 'accident_reason_mantaqe_ba_rizesh_az_divar' => '', + 'accident_reason_mantaqe_ba_afzayesh_nagahani' => '', + 'accident_reason_kahesh_na_monaseb_tedad' => '', + 'accident_reason_mantaqe_ba_obor_heyvanat_ahli' => '', + 'accident_reason_mantaqe_ba_tadakhol_terafiki' => '', + 'accident_reason_arze_kam_savare_ro' => '', + 'accident_reason_mantaqe_meh_gir' => '', + 'accident_reason_adam_roshanaye_zarori_dar_noqte' => '', + 'accident_reason_tabdil_na_monaseb_noe_rah' => '', + 'accident_reason_oftadegi_dar_labe_asphalt' => '', + 'accident_reason_naqs_dar_ashkarsazi_navahi' => '', + 'accident_reason_mahal_na_monaseb_dastrasi' => '', + 'accident_reason_roye_na_monaseb' => '', + 'accident_reason_naqs_dar_ashkar_sazi_shrayet_khas' => '', + 'accident_reason_hendese_na_monaseb_vorodi_va_khoroji' => '', + 'accident_reason_adam_rayat_fasele_tooli' => '', + 'accident_reason_naqs_dar_alayem_ekhtari_va_entezami' => '', + 'accident_reason_qus_ofoqi_dar_saraziri_tond' => '', + 'accident_reason_adam_rayat_obor' => '', + 'accident_reason_naqs_dar_alayem_pish_agahi' => '', + 'accident_reason_qarar_gire_qus_ofoqi' => '', + 'accident_reason_adam_rayat_sebghat_mojaz' => '', + 'accident_reason_did_na_kafi' => '', + 'accident_reason_qus_tond_qaem' => '', + 'accident_reason_adam_rayat_sorat_mojaz' => '', + 'accident_reason_ebham_dar_masir' => '', + 'accident_reason_qus_tond_ofoghi' => '', + 'first_image' => '', + 'second_image' => '', + 'police_file' => '', + ]; + } +} diff --git a/app/Http/Requests/V3/DailyAccident/SupervisorRequest.php b/app/Http/Requests/V3/DailyAccident/SupervisorRequest.php new file mode 100644 index 00000000..891a5487 --- /dev/null +++ b/app/Http/Requests/V3/DailyAccident/SupervisorRequest.php @@ -0,0 +1,30 @@ + + */ + public function rules(): array + { + return [ + 'state' => 'required|in:0,1', + 'message' => 'required_if:state,2|string', + ]; + } +}