Merge pull request #82 from witelgroup/feature/DailyAccidentCartable
create daily accident cartable
This commit is contained in:
24
app/Enums/AccidentWayGeoTypes.php
Normal file
24
app/Enums/AccidentWayGeoTypes.php
Normal file
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums;
|
||||
|
||||
enum AccidentWayGeoTypes: int
|
||||
{
|
||||
public static function name(int $state): string
|
||||
{
|
||||
$mapArray = [
|
||||
1 => "تقاطع - دسترسی",
|
||||
2 => "قوس افقی یا قائم",
|
||||
3 => "پل",
|
||||
4 => "پل و قوس",
|
||||
5 => "تونل",
|
||||
6 => "میدان",
|
||||
7 => "دوربرگردان",
|
||||
8 => "بریدگی",
|
||||
9 => "تقاطع و قوس",
|
||||
10 => "نقطه عادی",
|
||||
];
|
||||
|
||||
return $mapArray[$state];
|
||||
}
|
||||
}
|
||||
28
app/Enums/AccidentWeatherConditions.php
Normal file
28
app/Enums/AccidentWeatherConditions.php
Normal file
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums;
|
||||
|
||||
enum AccidentWeatherConditions: int
|
||||
{
|
||||
case BARFI= 1;
|
||||
case KOLAK = 2;
|
||||
case AFTABI = 3;
|
||||
|
||||
case BARANI = 4;
|
||||
case YAKHBANDAN = 5;
|
||||
case MEH = 6;
|
||||
|
||||
public static function name(int $state): string
|
||||
{
|
||||
$mapArray = [
|
||||
1 => 'برفی',
|
||||
2 => 'کولاک',
|
||||
3 => 'آفتابی',
|
||||
4 => 'بارانی',
|
||||
5 => 'یخبندان',
|
||||
6 => 'مه آلود',
|
||||
];
|
||||
|
||||
return $mapArray[$state];
|
||||
}
|
||||
}
|
||||
457
app/Http/Controllers/V3/Dashboard/DailyAccidentController.php
Normal file
457
app/Http/Controllers/V3/Dashboard/DailyAccidentController.php
Normal file
@@ -0,0 +1,457 @@
|
||||
<?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"));
|
||||
}
|
||||
}
|
||||
94
app/Http/Requests/V3/DailyAccident/StoreRequest.php
Normal file
94
app/Http/Requests/V3/DailyAccident/StoreRequest.php
Normal file
@@ -0,0 +1,94 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Requests\V3\DailyAccident;
|
||||
|
||||
use Illuminate\Contracts\Validation\ValidationRule;
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class StoreRequest extends FormRequest
|
||||
{
|
||||
/**
|
||||
* Determine if the user is authorized to make this request.
|
||||
*/
|
||||
public function authorize(): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*
|
||||
* @return array<string, ValidationRule|array|string>
|
||||
*/
|
||||
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' => '',
|
||||
];
|
||||
}
|
||||
}
|
||||
30
app/Http/Requests/V3/DailyAccident/SupervisorRequest.php
Normal file
30
app/Http/Requests/V3/DailyAccident/SupervisorRequest.php
Normal file
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Requests\V3\DailyAccident;
|
||||
|
||||
use Illuminate\Contracts\Validation\ValidationRule;
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class SupervisorRequest extends FormRequest
|
||||
{
|
||||
/**
|
||||
* Determine if the user is authorized to make this request.
|
||||
*/
|
||||
public function authorize(): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*
|
||||
* @return array<string, ValidationRule|array|string>
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'state' => 'required|in:0,1',
|
||||
'message' => 'required_if:state,2|string',
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user