From 9f08804454cc61bf106adb21a39cf5bb5b7235ee Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Mon, 3 Mar 2025 15:38:06 +0330 Subject: [PATCH] debug the report tables --- app/Enums/AxisTypes.php | 26 +++++ .../CountryActivityReport.php | 16 +++ .../ProvinceActivityReport.php | 21 +++- .../SafetyAndPrivacyReportController.php | 2 +- .../Dashboard/SafetyAndPrivacyController.php | 3 + .../FirstStepStoreRequest.php | 1 + app/Models/AxisType.php | 13 +++ app/Models/SafetyAndPrivacy.php | 9 +- .../SafetyAndPrivacyTableService.php | 97 ++++++++----------- database/factories/AxisTypeFactory.php | 23 +++++ ...5_03_03_152632_create_axis_types_table.php | 28 ++++++ ...add_column_to_safety_and_privacy_table.php | 30 ++++++ database/seeders/AxisTypeSeeder.php | 17 ++++ routes/v3.php | 1 + 14 files changed, 229 insertions(+), 58 deletions(-) create mode 100644 app/Enums/AxisTypes.php create mode 100644 app/Models/AxisType.php create mode 100644 database/factories/AxisTypeFactory.php create mode 100644 database/migrations/2025_03_03_152632_create_axis_types_table.php create mode 100644 database/migrations/2025_03_03_152816_add_column_to_safety_and_privacy_table.php create mode 100644 database/seeders/AxisTypeSeeder.php diff --git a/app/Enums/AxisTypes.php b/app/Enums/AxisTypes.php new file mode 100644 index 00000000..ae9ac691 --- /dev/null +++ b/app/Enums/AxisTypes.php @@ -0,0 +1,26 @@ + 'آزادراه', + 2 => 'بزرگراه', + 3 => 'اصلی', + 4 => 'فرعی', + 5 => 'روستایی', + ]; + + return $mapArray[$state]; + } +} \ No newline at end of file diff --git a/app/Exports/V3/SafetyAndPrivacy/CountryActivityReport.php b/app/Exports/V3/SafetyAndPrivacy/CountryActivityReport.php index 99a9fb7d..b8c6b0e7 100644 --- a/app/Exports/V3/SafetyAndPrivacy/CountryActivityReport.php +++ b/app/Exports/V3/SafetyAndPrivacy/CountryActivityReport.php @@ -19,6 +19,22 @@ class CountryActivityReport implements FromView, WithEvents, ShouldAutoSize, Wit public function view(): View { $data = $this->data; + $existedProvinces = array_keys($data['activities']); + + foreach (\App\Models\Province::all() as $value) { + $provinceId = $value->id; + + if (!array_key_exists($provinceId, $existedProvinces)) { + $data['activities'][] = [ + 'province_id' => $provinceId, + 'name_fa' => $value->name_fa, + 'sum' => 0, + '89' => ['1' => 0, '2' => 0, '3' => 0], + '90' => ['1' => 0, '2' => 0, '3' => 0], + '91' => ['1' => 0, '2' => 0, '3' => 0], + ]; + } + } return view('v3.Reports.SafetyAndPrivacy.CountryActivityReport', [ 'data' => $data['activities'], diff --git a/app/Exports/V3/SafetyAndPrivacy/ProvinceActivityReport.php b/app/Exports/V3/SafetyAndPrivacy/ProvinceActivityReport.php index c5ffa6ab..78fe8ace 100644 --- a/app/Exports/V3/SafetyAndPrivacy/ProvinceActivityReport.php +++ b/app/Exports/V3/SafetyAndPrivacy/ProvinceActivityReport.php @@ -2,8 +2,10 @@ namespace App\Exports\V3\SafetyAndPrivacy; +use App\Models\EdarateShahri; use Illuminate\Contracts\View\View; use Illuminate\Database\Eloquent\Collection; +use Illuminate\Http\Request; use Maatwebsite\Excel\Concerns\FromView; use Maatwebsite\Excel\Concerns\ShouldAutoSize; use Maatwebsite\Excel\Concerns\WithDrawings; @@ -14,11 +16,28 @@ use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; class ProvinceActivityReport implements FromView, WithEvents, ShouldAutoSize, WithDrawings { - public function __construct(private array $data){} + public function __construct(private array $data, Request $request){} public function view(): View { $data = $this->data; + $existedCities = array_keys($data['activities']); + $edarat = EdarateShahri::query()->where('province_id', '=', $this->request->province_id)->get(['id', 'name_fa']); + + foreach ($edarat as $value) { + $edareId = $value->id; + + if (!array_key_exists($edareId, $existedCities)) { + $data['activities'][] = [ + 'edare_shahri_id' => $edareId, + 'name_fa' => $value->name_fa, + 'sum' => 0, + '89' => ['1' => 0, '2' => 0, '3' => 0], + '90' => ['1' => 0, '2' => 0, '3' => 0], + '91' => ['1' => 0, '2' => 0, '3' => 0], + ]; + } + } return view('v3.Reports.SafetyAndPrivacy.ProvinceActivityReport', [ 'data' => $data['activities'], diff --git a/app/Http/Controllers/V3/Dashboard/Reports/SafetyAndPrivacyReportController.php b/app/Http/Controllers/V3/Dashboard/Reports/SafetyAndPrivacyReportController.php index 0b0b5a84..cc3d5673 100644 --- a/app/Http/Controllers/V3/Dashboard/Reports/SafetyAndPrivacyReportController.php +++ b/app/Http/Controllers/V3/Dashboard/Reports/SafetyAndPrivacyReportController.php @@ -47,6 +47,6 @@ class SafetyAndPrivacyReportController extends Controller { $data = $safetyAndPrivacyTableService->provinceActivity($request); $name = 'گزارش از نگهداری حریم راه ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; - return Excel::download(new ProvinceActivityReport($data), $name); + return Excel::download(new ProvinceActivityReport($data, $request), $name); } } diff --git a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php index f1562b5d..a36842d3 100644 --- a/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php +++ b/app/Http/Controllers/V3/Dashboard/SafetyAndPrivacyController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\V3\Dashboard; +use App\Enums\AxisTypes; use App\Exports\V3\SafetyAndPrivacy\CartableReport; use App\Facades\File\FileFacade; use App\Http\Controllers\Controller; @@ -73,6 +74,8 @@ class SafetyAndPrivacyController extends Controller 'edare_shahri_id' => $user->edarate_shahri_id, 'edare_shahri_name' => $user->edarate_shahri_name, 'way_id' => $nominatimService->get_way_id_from_nominatim($coordinates[0], $coordinates[1]), + 'axis_type_id' => $request->axis_type_id, + 'axis_type_name' => AxisTypes::name($request->axis_type_id), 'step' => 1, 'step_fa' => 'گام اول (شناسایی)' ]); diff --git a/app/Http/Requests/V3/SafetyAndPrivacy/FirstStepStoreRequest.php b/app/Http/Requests/V3/SafetyAndPrivacy/FirstStepStoreRequest.php index a307f87e..b7b7cf82 100644 --- a/app/Http/Requests/V3/SafetyAndPrivacy/FirstStepStoreRequest.php +++ b/app/Http/Requests/V3/SafetyAndPrivacy/FirstStepStoreRequest.php @@ -27,6 +27,7 @@ class FirstStepStoreRequest extends FormRequest 'activity_date' => 'required|date_format:Y-m-d', 'activity_time' => 'required|date_format:H:i', 'recognize_picture' => 'required|image', + 'axis_type_id' => 'required|integer|exists:axis_types,id', ]; } diff --git a/app/Models/AxisType.php b/app/Models/AxisType.php new file mode 100644 index 00000000..59fbeec1 --- /dev/null +++ b/app/Models/AxisType.php @@ -0,0 +1,13 @@ + [ - '1' => 0, - '2' => 0, - '3' => 0, - ], - '90' => [ - '1' => 0, - '2' => 0, - '3' => 0, - ], - '91' => [ - '1' => 0, - '2' => 0, - '3' => 0, - ], - ]; - foreach ($provinces as $key => $value) { - $provinceTotalSum += $value->qty; - $provinceData[$value->info_id][$value->step] = $value->qty; - $provinceData["sum"] = $provinceTotalSum; - $provinceData["province_fa"] = $value->province_fa; - $provinceData["province_id"] = $value->province_id; - $activities[] = $provinceData; + foreach ($provinces as $value) { + $provinceId = $value->province_id; + + // Check if the province already exists in the activities array + if (!isset($activities[$provinceId])) { + $activities[$provinceId] = (object) [ + 'province_id' => $provinceId, + 'name_fa' => $value->province_fa, + 'sum' => 0, + '89' => ['1' => 0, '2' => 0, '3' => 0], + '90' => ['1' => 0, '2' => 0, '3' => 0], + '91' => ['1' => 0, '2' => 0, '3' => 0], + ]; + } + + $activities[$provinceId]->{$value->info_id}[$value->step] = $value->qty; + $activities[$provinceId]->sum += $value->qty; } + $activities = array_values($activities); + return [ 'activities' => $activities, 'fromDate' => $fromDate, @@ -133,7 +127,7 @@ class SafetyAndPrivacyTableService $activities = []; $province = DB::select(' - SELECT COUNT(*) as qty,info_id, step,step_fa, info_fa FROM safety_and_privacy where province_id ='.$provinceId.' and created_at BETWEEN "'.$fromDate.'" and "'.$toDate.'" GROUP BY info_id,step + SELECT COUNT(*) as qty,info_id, step FROM safety_and_privacy where province_id ='.$provinceId.' and created_at BETWEEN "'.$fromDate.'" and "'.$toDate.'" GROUP BY info_id,step '); $provinceTotalSum = 0; @@ -158,42 +152,35 @@ class SafetyAndPrivacyTableService ]; foreach ($province as $key => $value) { $provinceTotalSum += $value->qty; - $provinceData["info-".$value->info_id]["step-".$value->step] = $value->qty; + $provinceData[$value->info_id][$value->step] = $value->qty; $provinceData["sum"] = $provinceTotalSum; } $activities[] = $provinceData; $cities = DB::select(' - SELECT edare_shahri_id, COUNT(*) as qty,info_id, step,step_fa, info_fa FROM safety_and_privacy where province_id ='.$provinceId.' and created_at BETWEEN "'.$fromDate.'" and "'.$toDate.'" GROUP BY info_id,step,edare_shahri_id + SELECT edare_shahri_id, COUNT(*) as qty,info_id, step FROM safety_and_privacy where province_id ='.$provinceId.' and created_at BETWEEN "'.$fromDate.'" and "'.$toDate.'" GROUP BY info_id,step,edare_shahri_id '); - $cityTotalSum = 0; - $cityData = [ - '89' => [ - '1' => 0, - '2' => 0, - '3' => 0, - ], - '90' => [ - '1' => 0, - '2' => 0, - '3' => 0, - ], - '91' => [ - '1' => 0, - '2' => 0, - '3' => 0, - ], - ]; - foreach ($cities as $key => $value) { - $cityTotalSum += $value->qty; - $cityData[$value->info_id][$value->step] = $value->qty; - $cityData["name_fa"] = \App\Models\EdarateShahri::query()->find($value->edare_shahri_id)->name_fa; - $cityData["edare_shahri_id"] = $value->edare_shahri_id; - $cityData["sum"] = $cityTotalSum; - $activities[] = $cityData; + foreach ($cities as $value) { + $cityId = $value->edare_shahri_id; + + // Initialize data for each unique city + if (!isset($activities[$cityId])) { + $activities[$cityId] = (object) [ + 'edare_shahri_id' => $cityId, + 'name_fa' => \App\Models\EdarateShahri::query()->find($cityId)->name_fa, + 'sum' => 0, + '89' => ['1' => 0, '2' => 0, '3' => 0], + '90' => ['1' => 0, '2' => 0, '3' => 0], + '91' => ['1' => 0, '2' => 0, '3' => 0], + ]; + } + $activities[$cityId]->{$value->info_id}[$value->step] = $value->qty; + $activities[$cityId]->sum += $value->qty; } + $activities = array_values($activities); + return [ 'activities' => $activities, 'fromDate' => $fromDate, diff --git a/database/factories/AxisTypeFactory.php b/database/factories/AxisTypeFactory.php new file mode 100644 index 00000000..78b69bdf --- /dev/null +++ b/database/factories/AxisTypeFactory.php @@ -0,0 +1,23 @@ + + */ +class AxisTypeFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + // + ]; + } +} diff --git a/database/migrations/2025_03_03_152632_create_axis_types_table.php b/database/migrations/2025_03_03_152632_create_axis_types_table.php new file mode 100644 index 00000000..ec264207 --- /dev/null +++ b/database/migrations/2025_03_03_152632_create_axis_types_table.php @@ -0,0 +1,28 @@ +id(); + $table->string('name'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('axis_types'); + } +}; diff --git a/database/migrations/2025_03_03_152816_add_column_to_safety_and_privacy_table.php b/database/migrations/2025_03_03_152816_add_column_to_safety_and_privacy_table.php new file mode 100644 index 00000000..f591eba1 --- /dev/null +++ b/database/migrations/2025_03_03_152816_add_column_to_safety_and_privacy_table.php @@ -0,0 +1,30 @@ +foreignId('axis_type_id')->nullable()->constrained('axis_types'); + $table->string('axis_type_name')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('safety_and_privacy', function (Blueprint $table) { + $table->dropForeign('axis_type_id'); + $table->dropColumn('axis_type_name'); + }); + } +}; diff --git a/database/seeders/AxisTypeSeeder.php b/database/seeders/AxisTypeSeeder.php new file mode 100644 index 00000000..f8ae72bc --- /dev/null +++ b/database/seeders/AxisTypeSeeder.php @@ -0,0 +1,17 @@ +controller(SafetyAndPrivacyController::class) ->group(function () { Route::get('/', 'index')->name('index')->middleware('permission:show-safety-and-privacy-operator-cartable|show-safety-and-privacy-operator-cartable-province|show-safety-and-privacy-operator-cartable-edarate-shahri'); + Route::get('/excel_report', 'excelReport')->name('excelReport')->middleware('permission:show-safety-and-privacy-operator-cartable|show-safety-and-privacy-operator-cartable-province|show-safety-and-privacy-operator-cartable-edarate-shahri'); Route::post('/first_step_store', 'firstStepStore')->name('firstStepStore')->middleware('permission:add-safety-and-privacy'); Route::post('/second_step_store/{safetyAndPrivacy}', 'secondStepStore')->name('secondStepStore')->middleware('permission:add-safety-and-privacy'); Route::post('/third_step_store/{safetyAndPrivacy}', 'thirdStepStore')->name('thirdStepStore')->middleware('permission:add-safety-and-privacy');