From 42c3dc4ce82c7024b3652d5514fff3bd436556f0 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Sat, 28 Dec 2024 11:22:55 +0330 Subject: [PATCH 01/28] add machines and rahdaran to road patrols --- .../V3/RoadPatrolProjectController.php | 23 +++++++++++------- .../V3/RoadPatrolProject/StoreRequest.php | 11 ++++++++- app/Models/RoadPatrol.php | 24 ++++++++++++++++++- 3 files changed, 47 insertions(+), 11 deletions(-) diff --git a/app/Http/Controllers/V3/RoadPatrolProjectController.php b/app/Http/Controllers/V3/RoadPatrolProjectController.php index 21b505db..90519087 100644 --- a/app/Http/Controllers/V3/RoadPatrolProjectController.php +++ b/app/Http/Controllers/V3/RoadPatrolProjectController.php @@ -37,7 +37,7 @@ class RoadPatrolProjectController extends Controller 'operator_name', 'officer_plaque', 'officer_phone_number', 'officer_name', 'supervisor_description', 'supervising_time', 'supervisor_name', 'status', 'status_fa', 'distance', 'province_id', 'province_fa', 'edare_id', 'edare_name', - 'start_time', 'end_time','description' + 'start_time', 'end_time','description', 'cmmsMachines.machine_code' ); $allowedFilters = $columns; @@ -47,13 +47,16 @@ class RoadPatrolProjectController extends Controller $query = null; if ($user->hasPermissionTo('show-road-patrol-supervise-cartable')) { - $query = RoadPatrol::query(); + $query = RoadPatrol::query() + ->with(['rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number']); } elseif ($user->hasPermissionTo('show-road-patrol-supervise-cartable-province')) { if (is_null($user->province_id)) { return $this->errorResponse('استانی برای شما در سامانه ثبت نشده است!'); } - $query = RoadPatrol::query()->where('province_id', '=', $user->province_id); + $query = RoadPatrol::query() + ->with(['rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number']) + ->where('province_id', '=', $user->province_id); } $data = DataTableFacade::run( @@ -123,13 +126,15 @@ class RoadPatrolProjectController extends Controller $columns = array( 'id', 'start_lat', 'start_lon', 'end_lat', 'end_lon', 'officer_plaque', 'officer_phone_number', 'officer_name', 'supervisor_description', 'supervising_time', - 'supervisor_name', 'status', 'status_fa', 'distance', 'start_time', 'end_time' + 'supervisor_name', 'status', 'status_fa', 'distance', 'start_time', 'end_time', 'cmmsMachines.machine_code' ); $allowedFilters = $columns; $allowedSortings = $columns; - $query = RoadPatrol::query()->where('operator_id', '=', auth()->user()->id); + $query = RoadPatrol::query() + ->with(['rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number']) + ->where('operator_id', '=', auth()->user()->id); $data = DataTableFacade::run( $query, @@ -192,6 +197,9 @@ class RoadPatrolProjectController extends Controller 'description' => $request->description ?? null, ]); + $road_patrol->rahdaran()->attach($request->rahdaran_id); + $road_patrol->cmmsMachines()->attach($request->machines_id); + if ($request->observed_items) { foreach ($request->observed_items as $index => $item) { $info_item = InfoItem::where('item', $item['item_id']) @@ -297,10 +305,7 @@ class RoadPatrolProjectController extends Controller return $road_patrol; }); - return response()->json([ - 'road_patrol_id' => $road_patrol->id, - 'message' => 'succussful' - ]); + return $this->successResponse(); } public function getReport(RoadPatrol $roadPatrol): JsonResponse diff --git a/app/Http/Requests/V3/RoadPatrolProject/StoreRequest.php b/app/Http/Requests/V3/RoadPatrolProject/StoreRequest.php index 9dbd916a..fcdb3d2a 100644 --- a/app/Http/Requests/V3/RoadPatrolProject/StoreRequest.php +++ b/app/Http/Requests/V3/RoadPatrolProject/StoreRequest.php @@ -11,7 +11,7 @@ class StoreRequest extends FormRequest */ public function authorize(): bool { - return false; + return true; } /** @@ -47,7 +47,16 @@ class StoreRequest extends FormRequest 'observed_items.*.priority' => 'integer|in:1,2,3|required_if:instant_action,0', 'observed_items.*.priority_fa' => 'string|required_if:instant_action,0', 'description' => 'string|required_with:observed_items', + 'machines_id' => 'required|array', + 'machines_id.*' => 'required|exists:cmms_machines,id', + 'rahdaran_id' => 'required|array', + 'rahdaran_id.*' => 'required|exists:rahdaran,id', + ]; + } + public function attributes(): array + { + return [ 'start_time' => 'ساعت شروع گشت', 'end_time' => 'ساعت پایان گشت', ]; diff --git a/app/Models/RoadPatrol.php b/app/Models/RoadPatrol.php index d439e2d8..c39af8c2 100644 --- a/app/Models/RoadPatrol.php +++ b/app/Models/RoadPatrol.php @@ -4,6 +4,8 @@ namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Database\Eloquent\Relations\MorphToMany; class RoadPatrol extends Model { @@ -11,8 +13,28 @@ class RoadPatrol extends Model protected $guarded = ['id']; - public function observedItems() + public function observedItems(): HasMany { return $this->hasMany(ObservedItem::class); } + + public function cmmsMachines(): MorphToMany + { + return $this->morphToMany(CMMSMachine::class, + 'machinable', + 'machinables', + 'machinable_id', + 'machine_id' + ); + } + + public function rahdaran(): MorphToMany + { + return $this->morphToMany(Rahdaran::class, + 'rahdarable', + 'rahdarables', + 'rahdarable_id', + 'rahdar_id', + ); + } } From 51161854bdb5b4caf3a237b5fe9a3d373e934ae5 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Sat, 28 Dec 2024 15:22:32 +0330 Subject: [PATCH 02/28] create fms service api --- .../Controllers/V3/CMMSMachinesController.php | 4 +-- .../V3/FMSVehicleManagementController.php | 31 +++++++++++++++++++ .../V3/RoadPatrolProjectController.php | 3 ++ routes/v3.php | 8 +++++ 4 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 app/Http/Controllers/V3/FMSVehicleManagementController.php diff --git a/app/Http/Controllers/V3/CMMSMachinesController.php b/app/Http/Controllers/V3/CMMSMachinesController.php index ffba9760..e575d179 100644 --- a/app/Http/Controllers/V3/CMMSMachinesController.php +++ b/app/Http/Controllers/V3/CMMSMachinesController.php @@ -14,7 +14,7 @@ class CMMSMachinesController extends Controller public function list(): JsonResponse { - $machinesList = CMMSMachine::query()->get(['machine_code', 'id']); + $machinesList = CMMSMachine::query()->get(['machine_code', 'id', 'plak_number', 'car_name']); return $this->successResponse($machinesList); } @@ -23,7 +23,7 @@ class CMMSMachinesController extends Controller { $matchedSearchedMachines = CMMSMachine::query() ->where('machine_code', 'LIKE', "%{$request->machine_code}%") - ->get(['machine_code', 'id']); + ->get(['machine_code', 'id', 'plak_number', 'car_name']); return $this->successResponse($matchedSearchedMachines); } diff --git a/app/Http/Controllers/V3/FMSVehicleManagementController.php b/app/Http/Controllers/V3/FMSVehicleManagementController.php new file mode 100644 index 00000000..f50221a7 --- /dev/null +++ b/app/Http/Controllers/V3/FMSVehicleManagementController.php @@ -0,0 +1,31 @@ +setInputParameters([ + "machineCode" => $request->machineCode, + "startDT" => $request->startDT, + "endDT" => $request->endDT, + "minStopDuration" => $request->minStopDuration + ]); + + $data = $getVehicleActivityService->run(); + return $this->successResponse($data); + } +} diff --git a/app/Http/Controllers/V3/RoadPatrolProjectController.php b/app/Http/Controllers/V3/RoadPatrolProjectController.php index 90519087..0ef03630 100644 --- a/app/Http/Controllers/V3/RoadPatrolProjectController.php +++ b/app/Http/Controllers/V3/RoadPatrolProjectController.php @@ -293,6 +293,9 @@ class RoadPatrolProjectController extends Controller 'message' => 'اقدام مربوطه قبلا رسیدگی شده است.' ], 400); } + + $road_item->rahdaran()->attach($request->rahdaran_id); + $road_item->cmmsMachines()->attach($request->machines_id); } } } diff --git a/routes/v3.php b/routes/v3.php index 46e28e75..cab2d0a7 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -5,6 +5,7 @@ use App\Http\Controllers\V3\Azmayesh\AzmayeshController; use App\Http\Controllers\V3\Azmayesh\AzmayeshSampleController; use App\Http\Controllers\V3\Azmayesh\AzmayeshTypeController; use App\Http\Controllers\V3\CMMSMachinesController; +use App\Http\Controllers\V3\FMSVehicleManagementController; use App\Http\Controllers\V3\Harim\DivarkeshiController; use App\Http\Controllers\V3\ProfileController; use App\Http\Controllers\V3\RahdaranController; @@ -170,3 +171,10 @@ Route::prefix('rahdaran') Route::get('/list', 'list')->name('list'); Route::get('/search', 'search')->name('search'); }); + +Route::prefix('fms_vehicle') + ->name('fmsVehicle.') + ->controller(FMSVehicleManagementController::class) + ->group(function () { + Route::get('/get_activity', 'getActivity')->name('getActivity'); + }); From b507e706d0d1449a8661a90e815b8ff361a2eca6 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Tue, 31 Dec 2024 11:11:12 +0330 Subject: [PATCH 03/28] add activity for azmayesh --- .../V3/Azmayesh/AzmayeshController.php | 6 ++++++ .../V3/Azmayesh/AzmayeshTypeController.php | 6 ++++++ app/Http/Controllers/V3/ProfileController.php | 2 +- .../V3/RoadPatrolProjectController.php | 8 ++++---- .../V3/RoadPatrolProject/StoreRequest.php | 19 ++++++++++++------- storage/sql-files/log_lists.sql | 12 ++++++++++++ 6 files changed, 41 insertions(+), 12 deletions(-) diff --git a/app/Http/Controllers/V3/Azmayesh/AzmayeshController.php b/app/Http/Controllers/V3/Azmayesh/AzmayeshController.php index 83802ce4..fb3fd81b 100644 --- a/app/Http/Controllers/V3/Azmayesh/AzmayeshController.php +++ b/app/Http/Controllers/V3/Azmayesh/AzmayeshController.php @@ -84,6 +84,8 @@ class AzmayeshController extends Controller 'contract_subitem_id' => $request->contract_subitem_id ]); + $user->addActivityComplete(1158); + return $this->successResponse(); } @@ -122,6 +124,8 @@ class AzmayeshController extends Controller 'contract_subitem_id' => $request->contract_subitem_id ]); + auth()->user()->addActivityComplete(1159); + return $this->successResponse(); } @@ -133,6 +137,8 @@ class AzmayeshController extends Controller try { $azmayesh->delete(); + auth()->user()->addActivityComplete(1160); + return $this->successResponse(); } catch (QueryException $exception) { diff --git a/app/Http/Controllers/V3/Azmayesh/AzmayeshTypeController.php b/app/Http/Controllers/V3/Azmayesh/AzmayeshTypeController.php index 5fd99ad0..ec450099 100644 --- a/app/Http/Controllers/V3/Azmayesh/AzmayeshTypeController.php +++ b/app/Http/Controllers/V3/Azmayesh/AzmayeshTypeController.php @@ -67,6 +67,8 @@ class AzmayeshTypeController extends Controller } $azmayeshType->azmayeshFields()->attach($fieldsID); + + auth()->user()->addActivityComplete(1162); }); return $this->successResponse(); @@ -100,6 +102,8 @@ class AzmayeshTypeController extends Controller } $azmayeshType->azmayeshFields()->sync($fieldsID); + + auth()->user()->addActivityComplete(1163); }); return $this->successResponse(); @@ -113,6 +117,8 @@ class AzmayeshTypeController extends Controller try { $azmayeshType->delete(); + auth()->user()->addActivityComplete(1164); + return $this->successResponse(); } catch (QueryException $exception) { diff --git a/app/Http/Controllers/V3/ProfileController.php b/app/Http/Controllers/V3/ProfileController.php index b5841811..930a2f0a 100644 --- a/app/Http/Controllers/V3/ProfileController.php +++ b/app/Http/Controllers/V3/ProfileController.php @@ -81,7 +81,7 @@ class ProfileController extends Controller public function addActivity(Request $request): JsonResponse { - auth()->user()->addActivityComplete($request->query('activityCode')); + auth()->user()->addActivityComplete($request->activityCode); return $this->successResponse(); } } diff --git a/app/Http/Controllers/V3/RoadPatrolProjectController.php b/app/Http/Controllers/V3/RoadPatrolProjectController.php index 0ef03630..a66cf00a 100644 --- a/app/Http/Controllers/V3/RoadPatrolProjectController.php +++ b/app/Http/Controllers/V3/RoadPatrolProjectController.php @@ -197,8 +197,8 @@ class RoadPatrolProjectController extends Controller 'description' => $request->description ?? null, ]); - $road_patrol->rahdaran()->attach($request->rahdaran_id); - $road_patrol->cmmsMachines()->attach($request->machines_id); + $road_patrol->rahdaran()->attach($request->road_patrol_rahdaran_id); + $road_patrol->cmmsMachines()->attach($request->road_patrol_machines_id); if ($request->observed_items) { foreach ($request->observed_items as $index => $item) { @@ -294,8 +294,8 @@ class RoadPatrolProjectController extends Controller ], 400); } - $road_item->rahdaran()->attach($request->rahdaran_id); - $road_item->cmmsMachines()->attach($request->machines_id); + $road_item->rahdaran()->attach($item['road_item_rahdaran_id']); + $road_item->cmmsMachines()->attach($item['road_item_machines_id']); } } } diff --git a/app/Http/Requests/V3/RoadPatrolProject/StoreRequest.php b/app/Http/Requests/V3/RoadPatrolProject/StoreRequest.php index fcdb3d2a..8a71cb1b 100644 --- a/app/Http/Requests/V3/RoadPatrolProject/StoreRequest.php +++ b/app/Http/Requests/V3/RoadPatrolProject/StoreRequest.php @@ -41,16 +41,21 @@ class StoreRequest extends FormRequest // road item projects fields 'observed_items.*.start_point' => 'required', 'observed_items.*.end_point' => '', - 'observed_items.*.amount' => 'numeric|required_if:instant_action,1', + 'observed_items.*.amount' => 'numeric|required_if:observed_items.*.instant_action,1', 'observed_items.*.before_image' => 'image|max:4096', 'observed_items.*.after_image' => 'image|max:4096', - 'observed_items.*.priority' => 'integer|in:1,2,3|required_if:instant_action,0', - 'observed_items.*.priority_fa' => 'string|required_if:instant_action,0', + 'observed_items.*.priority' => 'integer|in:1,2,3|required_if:observed_items.*.instant_action,0', + 'observed_items.*.priority_fa' => 'string|required_if:observed_items.*.instant_action,0', 'description' => 'string|required_with:observed_items', - 'machines_id' => 'required|array', - 'machines_id.*' => 'required|exists:cmms_machines,id', - 'rahdaran_id' => 'required|array', - 'rahdaran_id.*' => 'required|exists:rahdaran,id', + 'road_patrol_machines_id' => 'required|array', + 'road_patrol_machines_id.*' => 'required|exists:cmms_machines,id', + 'road_patrol_rahdaran_id' => 'required|array', + 'road_patrol_rahdaran_id.*' => 'required|exists:rahdaran,id', + + 'observed_items.*.road_item_machines_id' => 'required_if:observed_items.*.instant_action,1|array', + 'observed_items.*.road_item_machines_id.*' => 'required_if:observed_items.*.instant_action,1|exists:cmms_machines,id', + 'observed_items.*.road_item_rahdaran_id' => 'required_if:observed_items.*.instant_action,1|array', + 'observed_items.*.road_item_rahdaran_id.*' => 'required_if:observed_items.*.instant_action,1|exists:rahdaran,id', ]; } diff --git a/storage/sql-files/log_lists.sql b/storage/sql-files/log_lists.sql index 97afa167..914b9823 100644 --- a/storage/sql-files/log_lists.sql +++ b/storage/sql-files/log_lists.sql @@ -149,3 +149,15 @@ INSERT INTO log_lists (description,log_unique_code,action_type,is_done) VALUES ('ثبت فعالیت روزانه','1154','action',0), ('حذف نگهداری و حریم','1155','action',0), ('ورود به نقشه نگهداری حریم','1156','show',1); +INSERT INTO log_lists (description,log_unique_code,action_type,is_done) VALUES + ('ورود به کارتابل آزمایشات','1157','action',0), + ('ثبت آزمایش','1158','action',0), + ('ویرایش آزمایش','1159','action',0), + ('حذف آزمایش','1160','action',0), + ('ورود به کارتابل نوع آزمایشات','1161','action',0), + ('ثبت نوع آزمایش','1162','action',0), + ('ویرایش نوع آزمایش','1163','action',0), + ('حذف نوع آزمایش','1164','action',0), + ('ثبت نمونه آزمایش','1165','action',0), + ('ویرایش نمونه آزمایش','1166','action',0), + ('حذف نمونه آزمایش','1167','action',0), From 68109744f059a6a1dd1ec229e0947e96a7b4b532 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Tue, 31 Dec 2024 16:40:21 +0330 Subject: [PATCH 04/28] add new columns to road patrol --- .../V3/RoadPatrolProjectController.php | 5 ++- .../V3/RoadPatrolProject/StoreRequest.php | 11 +++-- ...33123_add_column_to_road_patrols_table.php | 40 +++++++++++++++++++ 3 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 database/migrations/2024_12_31_133123_add_column_to_road_patrols_table.php diff --git a/app/Http/Controllers/V3/RoadPatrolProjectController.php b/app/Http/Controllers/V3/RoadPatrolProjectController.php index a66cf00a..4e2fbded 100644 --- a/app/Http/Controllers/V3/RoadPatrolProjectController.php +++ b/app/Http/Controllers/V3/RoadPatrolProjectController.php @@ -145,7 +145,7 @@ class RoadPatrolProjectController extends Controller return response()->json($data); } - public function store(StoreRequest $request, NominatimService $nominatimService) + public function store(StoreRequest $request, NominatimService $nominatimService): JsonResponse { $user = auth()->user(); @@ -195,6 +195,9 @@ class RoadPatrolProjectController extends Controller 'start_time' => $request->start_time, 'end_time' => $request->end_time, 'description' => $request->description ?? null, + 'fuel_consumption' => $request->fuel_consumption, + 'vehicle_runtime' => $request->vehicle_runtime, + 'stop_points' => json_encode($request->stop_points), ]); $road_patrol->rahdaran()->attach($request->road_patrol_rahdaran_id); diff --git a/app/Http/Requests/V3/RoadPatrolProject/StoreRequest.php b/app/Http/Requests/V3/RoadPatrolProject/StoreRequest.php index 8a71cb1b..353a814c 100644 --- a/app/Http/Requests/V3/RoadPatrolProject/StoreRequest.php +++ b/app/Http/Requests/V3/RoadPatrolProject/StoreRequest.php @@ -30,6 +30,13 @@ class StoreRequest extends FormRequest 'officer_phone_number' => 'required|digits:11', 'start_time' => 'required|date_format:Y-m-d H:i', 'end_time' => 'required|date_format:Y-m-d H:i|after:start_time', + 'fuel_consumption' => 'required|integer', + 'vehicle_runtime' => 'required|integer', + 'stop_points' => 'required|array', + 'road_patrol_machines_id' => 'required|array', + 'road_patrol_machines_id.*' => 'required|exists:cmms_machines,id', + 'road_patrol_rahdaran_id' => 'required|array', + 'road_patrol_rahdaran_id.*' => 'required|exists:rahdaran,id', 'observed_items' => 'array', 'observed_items.*.item_id' => 'required|integer', @@ -47,10 +54,6 @@ class StoreRequest extends FormRequest 'observed_items.*.priority' => 'integer|in:1,2,3|required_if:observed_items.*.instant_action,0', 'observed_items.*.priority_fa' => 'string|required_if:observed_items.*.instant_action,0', 'description' => 'string|required_with:observed_items', - 'road_patrol_machines_id' => 'required|array', - 'road_patrol_machines_id.*' => 'required|exists:cmms_machines,id', - 'road_patrol_rahdaran_id' => 'required|array', - 'road_patrol_rahdaran_id.*' => 'required|exists:rahdaran,id', 'observed_items.*.road_item_machines_id' => 'required_if:observed_items.*.instant_action,1|array', 'observed_items.*.road_item_machines_id.*' => 'required_if:observed_items.*.instant_action,1|exists:cmms_machines,id', diff --git a/database/migrations/2024_12_31_133123_add_column_to_road_patrols_table.php b/database/migrations/2024_12_31_133123_add_column_to_road_patrols_table.php new file mode 100644 index 00000000..47cbc9dd --- /dev/null +++ b/database/migrations/2024_12_31_133123_add_column_to_road_patrols_table.php @@ -0,0 +1,40 @@ +decimal('start_lat', 12, 10)->nullable()->change(); + $table->decimal('start_lng', 12, 10)->nullable()->change(); + $table->decimal('end_lat', 12, 10)->nullable()->change(); + $table->decimal('end_lng', 12, 10)->nullable()->change(); + $table->integer('fuel_consumption')->nullable(); + $table->integer('vehicle_runtime')->nullable(); + $table->json('stop_points')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('road_patrols', function (Blueprint $table) { + $table->decimal('start_lat', 12, 10)->change(); + $table->decimal('start_lng', 12, 10)->change(); + $table->decimal('end_lat', 12, 10)->change(); + $table->decimal('end_lng', 12, 10)->change(); + $table->dropColumn('fuel_consumption'); + $table->dropColumn('vehicle_runtime'); + $table->dropColumn('stop_points'); + }); + } +}; From 7a761b4fb5b53e8faff21a185beeb8ea82af6a24 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Wed, 1 Jan 2025 16:42:20 +0330 Subject: [PATCH 05/28] fix the migration type --- ...1_133123_add_column_to_road_patrols_table.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/database/migrations/2024_12_31_133123_add_column_to_road_patrols_table.php b/database/migrations/2024_12_31_133123_add_column_to_road_patrols_table.php index 47cbc9dd..9dcd85bc 100644 --- a/database/migrations/2024_12_31_133123_add_column_to_road_patrols_table.php +++ b/database/migrations/2024_12_31_133123_add_column_to_road_patrols_table.php @@ -12,10 +12,10 @@ return new class extends Migration public function up(): void { Schema::table('road_patrols', function (Blueprint $table) { - $table->decimal('start_lat', 12, 10)->nullable()->change(); - $table->decimal('start_lng', 12, 10)->nullable()->change(); - $table->decimal('end_lat', 12, 10)->nullable()->change(); - $table->decimal('end_lng', 12, 10)->nullable()->change(); + $table->double('start_lat', null, 0)->nullable()->change(); + $table->double('start_lon', null, 0)->nullable()->change(); + $table->double('end_lat', null, 0)->nullable()->change(); + $table->double('end_lon', null, 0)->nullable()->change(); $table->integer('fuel_consumption')->nullable(); $table->integer('vehicle_runtime')->nullable(); $table->json('stop_points')->nullable(); @@ -28,10 +28,10 @@ return new class extends Migration public function down(): void { Schema::table('road_patrols', function (Blueprint $table) { - $table->decimal('start_lat', 12, 10)->change(); - $table->decimal('start_lng', 12, 10)->change(); - $table->decimal('end_lat', 12, 10)->change(); - $table->decimal('end_lng', 12, 10)->change(); + $table->double('start_lat', null, 0)->change(); + $table->double('start_lon', null, 0)->change(); + $table->double('end_lat', null, 0)->change(); + $table->double('end_lon', null, 0)->change(); $table->dropColumn('fuel_consumption'); $table->dropColumn('vehicle_runtime'); $table->dropColumn('stop_points'); From 294f89b4adc72063306c3f77cc9a931f57eba2b6 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Sat, 4 Jan 2025 13:14:14 +0330 Subject: [PATCH 06/28] create a rule to verify otp --- .../V3/FMSVehicleManagementController.php | 1 - .../V3/RoadPatrolProjectController.php | 15 +---------- .../V3/RoadPatrolProject/StoreRequest.php | 7 ++--- app/Rules/VerificationCode.php | 27 +++++++++++++++++++ .../FMS/GetVehicleActivityService.php | 1 + 5 files changed, 31 insertions(+), 20 deletions(-) create mode 100644 app/Rules/VerificationCode.php diff --git a/app/Http/Controllers/V3/FMSVehicleManagementController.php b/app/Http/Controllers/V3/FMSVehicleManagementController.php index f50221a7..898ede9d 100644 --- a/app/Http/Controllers/V3/FMSVehicleManagementController.php +++ b/app/Http/Controllers/V3/FMSVehicleManagementController.php @@ -22,7 +22,6 @@ class FMSVehicleManagementController extends Controller "machineCode" => $request->machineCode, "startDT" => $request->startDT, "endDT" => $request->endDT, - "minStopDuration" => $request->minStopDuration ]); $data = $getVehicleActivityService->run(); diff --git a/app/Http/Controllers/V3/RoadPatrolProjectController.php b/app/Http/Controllers/V3/RoadPatrolProjectController.php index 4e2fbded..27f84c65 100644 --- a/app/Http/Controllers/V3/RoadPatrolProjectController.php +++ b/app/Http/Controllers/V3/RoadPatrolProjectController.php @@ -161,24 +161,13 @@ class RoadPatrolProjectController extends Controller ], 400); } - $start_coordinates = explode(',', $request->start_point); - $end_coordinates = explode(',', $request->end_point); - $edare_id = $user->edarate_shahri_id ?? $user->edarate_ostani_id; $edare_name = $user->edarate_shahri_id ? $user->edarate_shahri_name : $user->edarate_ostani_name; - $road_patrol = DB::transaction(function () use ($request, $start_coordinates, - $end_coordinates, $edare_id, + $road_patrol = DB::transaction(function () use ($request, $edare_id, $edare_name, $nominatimService, $user) { $road_patrol = RoadPatrol::query()->create([ - 'start_lat' => $start_coordinates[0], - 'start_lon' => $start_coordinates[1], - 'end_lat' => $end_coordinates[0], - 'end_lon' => $end_coordinates[1], - 'officer_name' => $request->officer_name, - 'officer_phone_number' => $request->officer_phone_number, - 'officer_plaque' => $request->officer_plaque, 'operator_id' => $user->id, 'operator_name' => $user->name, 'province_id' => $user->province_id, @@ -187,8 +176,6 @@ class RoadPatrolProjectController extends Controller 'city_fa' => $user->city_fa, 'edare_id' => $edare_id, 'edare_name' => $edare_name, - 'start_way_id' => $nominatimService->get_way_id_from_nominatim($start_coordinates[0], $start_coordinates[1]), - 'end_way_id' => $nominatimService->get_way_id_from_nominatim($end_coordinates[0], $end_coordinates[1]), 'status' => 0, 'status_fa' => 'در حال بررسی', 'distance' => $request->distance, diff --git a/app/Http/Requests/V3/RoadPatrolProject/StoreRequest.php b/app/Http/Requests/V3/RoadPatrolProject/StoreRequest.php index 353a814c..b0986e4b 100644 --- a/app/Http/Requests/V3/RoadPatrolProject/StoreRequest.php +++ b/app/Http/Requests/V3/RoadPatrolProject/StoreRequest.php @@ -2,6 +2,7 @@ namespace App\Http\Requests\V3\RoadPatrolProject; +use App\Rules\VerificationCode; use Illuminate\Foundation\Http\FormRequest; class StoreRequest extends FormRequest @@ -22,12 +23,8 @@ class StoreRequest extends FormRequest public function rules(): array { return [ - 'start_point' => 'required', - 'end_point' => 'required', + 'verification_code' => ['required', 'string', new VerificationCode($this->phone_number)], 'distance' => 'numeric', - 'officer_name' => 'required', - 'officer_plaque' => 'required', - 'officer_phone_number' => 'required|digits:11', 'start_time' => 'required|date_format:Y-m-d H:i', 'end_time' => 'required|date_format:Y-m-d H:i|after:start_time', 'fuel_consumption' => 'required|integer', diff --git a/app/Rules/VerificationCode.php b/app/Rules/VerificationCode.php new file mode 100644 index 00000000..fedeb0c5 --- /dev/null +++ b/app/Rules/VerificationCode.php @@ -0,0 +1,27 @@ +phone_number, $value); + + if (!$verified) { + $fail('The :attribute is not valid.')->translate(); + } + } +} diff --git a/app/Services/FMS/GetVehicleActivityService.php b/app/Services/FMS/GetVehicleActivityService.php index 94f124eb..e7b6dd28 100644 --- a/app/Services/FMS/GetVehicleActivityService.php +++ b/app/Services/FMS/GetVehicleActivityService.php @@ -63,6 +63,7 @@ class GetVehicleActivityService $inputData = $this->inputParameters + array( "username" => $this->username, "password" => $this->password, + "minStopDuration" => 1, ); return json_encode($inputData); From 311f03921c87d10004b42e63f45212bb6106b70e Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Sat, 4 Jan 2025 14:57:43 +0330 Subject: [PATCH 07/28] create datatable for observed item --- .../Controllers/V3/ObservedItemController.php | 60 +++++++++++++++++++ .../V3/ObservedItem/FilterRequest.php | 39 ++++++++++++ routes/v3.php | 10 +++- 3 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 app/Http/Controllers/V3/ObservedItemController.php create mode 100644 app/Http/Requests/V3/ObservedItem/FilterRequest.php diff --git a/app/Http/Controllers/V3/ObservedItemController.php b/app/Http/Controllers/V3/ObservedItemController.php new file mode 100644 index 00000000..64a2167e --- /dev/null +++ b/app/Http/Controllers/V3/ObservedItemController.php @@ -0,0 +1,60 @@ +successResponse($observed_item); + } + + public function searchByFilter(FilterRequest $request): JsonResponse + { + $columns = array( + 'id', 'item_id', 'sub_item_id' + ); + + $allowedFilters = $columns; + $allowedSortings = $columns; + + $data = ObservedItem::query()->whereNull('road_item_id') + ->when($request->start_date, function (Builder $query) use ($request) { + return $query->whereHas('roadPatrol', function (Builder $query) use ($request) { + $query->WhereBetween('start_time', [$request->start_date.' 00:00:00', $request->end_date.' 23:59:59']) + ->orWhereBetween('end_time', [$request->start_date.' 00:00:00', $request->end_date.' 23:59:59']); + }); + }) + ->when($request->road_patrol_id, function (Builder $query) use ($request) { + return $query->where('road_patrol_id', $request->road_patrol_id); + }) + ->when($request->item_id, function (Builder $query) use ($request) { + return $query->where('item_id', $request->item_id); + }) + ->selectRaw('id as item, item_id, item_name, sub_item_id, sub_item_name, local_name'); + + if($data->get()->isEmpty()) { + return $this->errorResponse('موردی یافت نشد'); + } + + $dataTable = DataTableFacade::run( + $data, + $request, + allowedFilters: $allowedFilters, + allowedSortings: $allowedSortings); + + + return response()->json($dataTable); + } +} diff --git a/app/Http/Requests/V3/ObservedItem/FilterRequest.php b/app/Http/Requests/V3/ObservedItem/FilterRequest.php new file mode 100644 index 00000000..5c67f2c3 --- /dev/null +++ b/app/Http/Requests/V3/ObservedItem/FilterRequest.php @@ -0,0 +1,39 @@ +|string> + */ + public function rules(): array + { + return [ + 'start_date' => 'date_format:Y-m-d', + 'end_date' => 'date_format:Y-m-d|after_or_equal:start_date', + 'road_patrol_id' => 'numeric', + 'item_id' => 'numeric', + ]; + } + + public function attributes(): array + { + return [ + 'start_date' => 'ساعت شروع گشت', + 'end_date' => 'ساعت پایان گشت', + ]; + } +} diff --git a/routes/v3.php b/routes/v3.php index cab2d0a7..dda1d4e8 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -7,6 +7,7 @@ use App\Http\Controllers\V3\Azmayesh\AzmayeshTypeController; use App\Http\Controllers\V3\CMMSMachinesController; use App\Http\Controllers\V3\FMSVehicleManagementController; use App\Http\Controllers\V3\Harim\DivarkeshiController; +use App\Http\Controllers\V3\ObservedItemController; use App\Http\Controllers\V3\ProfileController; use App\Http\Controllers\V3\RahdaranController; use App\Http\Controllers\V3\RoadItemsProjectController; @@ -176,5 +177,12 @@ Route::prefix('fms_vehicle') ->name('fmsVehicle.') ->controller(FMSVehicleManagementController::class) ->group(function () { - Route::get('/get_activity', 'getActivity')->name('getActivity'); + Route::post('/get_activity', 'getActivity')->name('getActivity'); + }); + +Route::prefix('obseved_item') + ->name('observedItem.') + ->controller(ObservedItemController::class) + ->group(function () { + Route::post('/filter', 'filter')->name('filter'); }); From e95e4ca8cea328019fd45aff86b6c8f51824d08a Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Sat, 4 Jan 2025 15:02:09 +0330 Subject: [PATCH 08/28] fix the name route --- routes/v3.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routes/v3.php b/routes/v3.php index dda1d4e8..ee190848 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -180,7 +180,7 @@ Route::prefix('fms_vehicle') Route::post('/get_activity', 'getActivity')->name('getActivity'); }); -Route::prefix('obseved_item') +Route::prefix('observed_items') ->name('observedItem.') ->controller(ObservedItemController::class) ->group(function () { From 57bb53475c58bc95806d1e831560d6ef06b7eee9 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Sat, 4 Jan 2025 15:24:51 +0330 Subject: [PATCH 09/28] add detail api --- app/Http/Controllers/V3/ObservedItemController.php | 6 +++--- routes/v3.php | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/V3/ObservedItemController.php b/app/Http/Controllers/V3/ObservedItemController.php index 64a2167e..39169d72 100644 --- a/app/Http/Controllers/V3/ObservedItemController.php +++ b/app/Http/Controllers/V3/ObservedItemController.php @@ -15,12 +15,12 @@ use Illuminate\Support\Facades\Validator; class ObservedItemController extends Controller { use ApiResponse; - public function details(ObservedItem $observed_item): JsonResponse + public function show(ObservedItem $observedItem): JsonResponse { - return $this->successResponse($observed_item); + return $this->successResponse($observedItem); } - public function searchByFilter(FilterRequest $request): JsonResponse + public function filter(FilterRequest $request): JsonResponse { $columns = array( 'id', 'item_id', 'sub_item_id' diff --git a/routes/v3.php b/routes/v3.php index ee190848..6a71fb03 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -185,4 +185,5 @@ Route::prefix('observed_items') ->controller(ObservedItemController::class) ->group(function () { Route::post('/filter', 'filter')->name('filter'); + Route::get('/{observedItem}', 'show')->name('show'); }); From ad97658216d355f7e99609416e8fc777b3a8fc5c Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Sat, 4 Jan 2025 16:04:11 +0330 Subject: [PATCH 10/28] create road observed filter datatable --- .../Controllers/V3/ObservedItemController.php | 25 +++---------------- routes/v3.php | 2 +- 2 files changed, 5 insertions(+), 22 deletions(-) diff --git a/app/Http/Controllers/V3/ObservedItemController.php b/app/Http/Controllers/V3/ObservedItemController.php index 39169d72..2bc271ce 100644 --- a/app/Http/Controllers/V3/ObservedItemController.php +++ b/app/Http/Controllers/V3/ObservedItemController.php @@ -23,37 +23,20 @@ class ObservedItemController extends Controller public function filter(FilterRequest $request): JsonResponse { $columns = array( - 'id', 'item_id', 'sub_item_id' + 'id', 'item_id', 'road_patrol_id', 'roadPatrol.start_time', 'roadPatrol.end_time', ); $allowedFilters = $columns; $allowedSortings = $columns; - $data = ObservedItem::query()->whereNull('road_item_id') - ->when($request->start_date, function (Builder $query) use ($request) { - return $query->whereHas('roadPatrol', function (Builder $query) use ($request) { - $query->WhereBetween('start_time', [$request->start_date.' 00:00:00', $request->end_date.' 23:59:59']) - ->orWhereBetween('end_time', [$request->start_date.' 00:00:00', $request->end_date.' 23:59:59']); - }); - }) - ->when($request->road_patrol_id, function (Builder $query) use ($request) { - return $query->where('road_patrol_id', $request->road_patrol_id); - }) - ->when($request->item_id, function (Builder $query) use ($request) { - return $query->where('item_id', $request->item_id); - }) - ->selectRaw('id as item, item_id, item_name, sub_item_id, sub_item_name, local_name'); - - if($data->get()->isEmpty()) { - return $this->errorResponse('موردی یافت نشد'); - } + $data = ObservedItem::query()->whereNull('road_item_id'); $dataTable = DataTableFacade::run( $data, $request, allowedFilters: $allowedFilters, - allowedSortings: $allowedSortings); - + allowedSortings: $allowedSortings + ); return response()->json($dataTable); } diff --git a/routes/v3.php b/routes/v3.php index 6a71fb03..405f76c8 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -184,6 +184,6 @@ Route::prefix('observed_items') ->name('observedItem.') ->controller(ObservedItemController::class) ->group(function () { - Route::post('/filter', 'filter')->name('filter'); + Route::get('/filter', 'filter')->name('filter'); Route::get('/{observedItem}', 'show')->name('show'); }); From a4e32d49b23edf20068e4d3076ec04c20e9343c1 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Sun, 5 Jan 2025 09:23:47 +0330 Subject: [PATCH 11/28] remove the form request --- .../Controllers/V3/ObservedItemController.php | 5 +-- .../V3/ObservedItem/FilterRequest.php | 39 ------------------- 2 files changed, 1 insertion(+), 43 deletions(-) delete mode 100644 app/Http/Requests/V3/ObservedItem/FilterRequest.php diff --git a/app/Http/Controllers/V3/ObservedItemController.php b/app/Http/Controllers/V3/ObservedItemController.php index 2bc271ce..1f4b7bd0 100644 --- a/app/Http/Controllers/V3/ObservedItemController.php +++ b/app/Http/Controllers/V3/ObservedItemController.php @@ -4,13 +4,10 @@ namespace App\Http\Controllers\V3; use App\Facades\DataTable\DataTableFacade; use App\Http\Controllers\Controller; -use App\Http\Requests\V3\ObservedItem\FilterRequest; use App\Http\Traits\ApiResponse; use App\Models\ObservedItem; -use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; -use Illuminate\Support\Facades\Validator; class ObservedItemController extends Controller { @@ -20,7 +17,7 @@ class ObservedItemController extends Controller return $this->successResponse($observedItem); } - public function filter(FilterRequest $request): JsonResponse + public function filter(Request $request): JsonResponse { $columns = array( 'id', 'item_id', 'road_patrol_id', 'roadPatrol.start_time', 'roadPatrol.end_time', diff --git a/app/Http/Requests/V3/ObservedItem/FilterRequest.php b/app/Http/Requests/V3/ObservedItem/FilterRequest.php deleted file mode 100644 index 5c67f2c3..00000000 --- a/app/Http/Requests/V3/ObservedItem/FilterRequest.php +++ /dev/null @@ -1,39 +0,0 @@ -|string> - */ - public function rules(): array - { - return [ - 'start_date' => 'date_format:Y-m-d', - 'end_date' => 'date_format:Y-m-d|after_or_equal:start_date', - 'road_patrol_id' => 'numeric', - 'item_id' => 'numeric', - ]; - } - - public function attributes(): array - { - return [ - 'start_date' => 'ساعت شروع گشت', - 'end_date' => 'ساعت پایان گشت', - ]; - } -} From 90914793ff7170bf421dcfc2146943c9b6e9df03 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Tue, 7 Jan 2025 10:04:56 +0330 Subject: [PATCH 12/28] create report system --- .../V3/Reports/RoadItemsReportController.php | 215 ++++++++++++++++++ .../V3/Reports/RoadPatrolReportController.php | 44 ++++ routes/v3.php | 23 ++ storage/sql-files/edarate_shahri.sql | 1 + 4 files changed, 283 insertions(+) create mode 100644 app/Http/Controllers/V3/Reports/RoadItemsReportController.php create mode 100644 app/Http/Controllers/V3/Reports/RoadPatrolReportController.php diff --git a/app/Http/Controllers/V3/Reports/RoadItemsReportController.php b/app/Http/Controllers/V3/Reports/RoadItemsReportController.php new file mode 100644 index 00000000..777dd568 --- /dev/null +++ b/app/Http/Controllers/V3/Reports/RoadItemsReportController.php @@ -0,0 +1,215 @@ +groupBy('item')->get(); + + return $this->successResponse([ + 'items' => $items, + 'data' => $data, + ]); + } + + public function getItems(Request $request): JsonResponse + { + $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); + $toDate = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString(); + $item = $request->item; + + $all = RoadItemsProject::query()->selectRaw(' + sub_item AS t, + COUNT(*) AS c, + CAST(SUM(CASE WHEN sub_item_data > 0 THEN sub_item_data ELSE ABS(sub_item_data) END) AS UNSIGNED) AS s, + province_id AS p') + ->where('item', '=', $item) + ->whereBetween('activity_date_time', [$fromDate, $toDate]) + ->where('status', '=', 1) + ->groupBy('province_id', 'sub_item') + ->get(); + + $country = RoadItemsProject::query()->selectRaw(' + sub_item AS t, + COUNT(*) AS c, + CAST(SUM(CASE WHEN sub_item_data > 0 THEN sub_item_data ELSE ABS(sub_item_data) END) AS UNSIGNED) AS s, + -1 AS p') + ->where('item', '=', $item) + ->whereBetween('activity_date_time', [$fromDate, $toDate]) + ->where('status', '=', 1) + ->groupBy('sub_item') + ->get(); + + $itemsFa = InfoItem::query()->where('item', '=', $item)->get()->keyBy('sub_item'); + + $all->each(function ($value) use ($itemsFa) { + if (isset($itemsFa[$value->t])) { + $value->u = $itemsFa[$value->t]->sub_item_unit; + } + }); + + return $this->successResponse([ + 'data' => $all, + 'country' => $country, + 'items_fa' => $itemsFa + ]); + } + + public function getItemsCity(Request $request): JsonResponse + { + $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); + $toDate = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString(); + $item = $request->item; + $province = $request->province_id; + + $all = RoadItemsProject::query()->selectRaw(' + sub_item AS t, + COUNT(*) AS c, + CAST(SUM(CASE WHEN sub_item_data > 0 THEN sub_item_data ELSE ABS(sub_item_data) END) AS UNSIGNED) AS s, + province_id AS p, + edarat_id AS ci + ') + ->where('item', '=', $item) + ->where('province_id', '=', $province) + ->whereBetween('activity_date_time', [$fromDate, $toDate]) + ->where('status', '=', 1) + ->groupBy('edarat_id', 'sub_item') + ->get(); + + $itemsFa = InfoItem::where('item', $item)->get()->keyBy('sub_item'); + + $all->each(function ($value) use ($itemsFa) { + if (isset($itemsFa[$value->t])) { + $value->u = $itemsFa[$value->t]->sub_item_unit; + } + }); + + return $this->successResponse([ + 'data' => $all, + 'items_fa' => $itemsFa + ]); + } + + public function provinceExcel(Request $request): JsonResponse + { + if (auth()->check()) { + auth()->user()->addActivityComplete(1033); + } + + $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); + $toDate = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString(); + $user = auth()->user(); + $isSpecialUser = in_array($user->username, ['witel', 'drdanesh']); + $provinceId = $isSpecialUser ? null : $user->province_id; + + // Base queries + $roadItemsProjectsQuery = RoadItemsProject::query() + ->selectRaw('COUNT(*) AS s, province_id AS p, item AS i') + ->where('status', 1) + ->whereBetween('activity_date_time', [$fromDate, $toDate]) + ->when(!$isSpecialUser, function ($query) use ($provinceId) { + $query->where('province_id', $provinceId); + }) + ->groupBy('province_id', 'item'); + + $roadPatrolsQuery = RoadPatrol::query() + ->selectRaw('COUNT(*) AS s, province_id AS p, 77 AS i') + ->whereBetween('start_time', [$fromDate, $toDate]) + ->when(!$isSpecialUser, function ($query) use ($provinceId) { + $query->where('province_id', $provinceId); + }) + ->groupBy('province_id'); + + $roadItemsProjectsSummaryQuery = RoadItemsProject::query() + ->selectRaw('COUNT(*) AS s, -1 AS p, item AS i') + ->where('status', 1) + ->whereBetween('activity_date_time', [$fromDate, $toDate]) + ->when(!$isSpecialUser, function ($query) use ($provinceId) { + $query->where('province_id', $provinceId); + }) + ->groupBy('item'); + + $roadPatrolsSummaryQuery = RoadPatrol::query() + ->selectRaw('COUNT(*) AS s, -1 AS p, 77 AS i') + ->whereBetween('start_time', [$fromDate, $toDate]) + ->when(!$isSpecialUser, function ($query) use ($provinceId) { + $query->where('province_id', $provinceId); + }); + + // Combine queries using UNION ALL + $data = $roadItemsProjectsQuery + ->unionAll($roadPatrolsQuery) + ->unionAll($roadItemsProjectsSummaryQuery) + ->unionAll($roadPatrolsSummaryQuery) + ->get(); + + return $this->successResponse($data); + } + + public function cityExcel(Request $request): JsonResponse + { + $provinceId = $request->province_id; + $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); + $toDate = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString(); + + $roadItemsProjectsQuery = RoadItemsProject::query() + ->selectRaw(' + COUNT(*) AS s, + edarat_id AS c, + item AS i') + ->where('status', '=', 1) + ->whereBetween('activity_date_time', [$fromDate, $toDate]) + ->where('province_id', $provinceId) + ->groupBy('item', 'edarat_id'); + + $roadPatrolsQuery = RoadPatrol::query() + ->selectRaw(' + COUNT(*) AS s, + edare_id AS c, + 77 AS i') + ->whereBetween('start_time', [$fromDate, $toDate]) + ->where('province_id', '=', $provinceId) + ->groupBy('edare_id'); + + $data = $roadItemsProjectsQuery + ->unionAll($roadPatrolsQuery) + ->get(); + + return $this->successResponse($data); + } + + public function map(Request $request): JsonResponse + { + $provinceId = $request->province_id; + $cityId = $request->city_id; + $subId = $request->sub_id; + $dateFrom = $request->date_from ? $request->date_from . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); + $dateTo = $request->date_to ? $request->date_to . ' 23:59:59' : now()->addDay()->startOfDay()->toDateTimeString(); + + $data = RoadItemsProject::query() + ->where('is_new', '=', 1) + ->when($provinceId, fn($query) => $query->where('province_id', '=', $provinceId)) + ->when($cityId, fn($query) => $query->where('city_id', '=', $cityId)) + ->when($subId, fn($query) => $query->where('sub_items', 'like', '%' . $subId . '%')) + ->when($request->item, fn($query) => $query->where('item', '=', $request->item)) + ->when(!is_null($request->status), fn($query) => $query->where('status', '=', $request->status)) + ->whereBetween('activity_date', [$dateFrom, $dateTo]) + ->leftJoin('users', 'users.id', '=', 'road_items_projects.user_id') + ->select('road_items_projects.id as i', 'start_lat as l', 'start_lng as g', 'status') + ->get(); + + return $this->successResponse($data); + } +} diff --git a/app/Http/Controllers/V3/Reports/RoadPatrolReportController.php b/app/Http/Controllers/V3/Reports/RoadPatrolReportController.php new file mode 100644 index 00000000..4c56abac --- /dev/null +++ b/app/Http/Controllers/V3/Reports/RoadPatrolReportController.php @@ -0,0 +1,44 @@ +from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); + $dateTo = $request->date_to ? $request->date_to . ' 23:59:59' : now()->addDay()->startOfDay()->toDateTimeString(); + + $data = RoadPatrolProject::provincePatrolData($fromDate, $dateTo); + return $this->successResponse($data); + } + + public function edarehPatrolData(Request $request): JsonResponse + { + $request->validate(["province_id" => "required",]); + $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); + $dateTo = $request->date_to ? $request->date_to . ' 23:59:59' : now()->addDay()->startOfDay()->toDateTimeString(); + + $data = RoadPatrolProject::edarehPatrolData($fromDate, $dateTo, $request->province_id); + return $this->successResponse($data); + } + + public function roadPatrolsReportTable(Request $request): BinaryFileResponse + { + $name = 'گزارش از گشت راهداری و ترابری ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; + + return Excel::download( + new RoadPatrolTable($request->from_date, $request->date_to), $name + ); + } +} diff --git a/routes/v3.php b/routes/v3.php index 405f76c8..08ea3979 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -10,6 +10,8 @@ use App\Http\Controllers\V3\Harim\DivarkeshiController; use App\Http\Controllers\V3\ObservedItemController; use App\Http\Controllers\V3\ProfileController; use App\Http\Controllers\V3\RahdaranController; +use App\Http\Controllers\V3\Reports\RoadItemsReportController; +use App\Http\Controllers\V3\Reports\RoadPatrolReportController; use App\Http\Controllers\V3\RoadItemsProjectController; use App\Http\Controllers\V3\RoadPatrolProjectController; use Illuminate\Support\Facades\Route; @@ -187,3 +189,24 @@ Route::prefix('observed_items') Route::get('/filter', 'filter')->name('filter'); Route::get('/{observedItem}', 'show')->name('show'); }); + +Route::prefix('road_item_reports') + ->name('roadItemReports.') + ->controller(RoadItemsReportController::class) + ->group(function () { + Route::get('/get_sub_items', 'getSubItems')->name('getSubItems'); + Route::get('/get_items', 'getItems')->name('getItems'); + Route::get('/get_items_city', 'getItemsCity')->name('getItemsCity'); + Route::get('/province_excel', 'provinceExcel')->name('provinceExcel'); + Route::get('/city_excel', 'cityExcel')->name('cityExcel'); + Route::get('/map', 'map')->name('map'); + }); + +Route::prefix('road_patrol_reports') + ->name('roadPatrolReports.') + ->controller(RoadPatrolReportController::class) + ->group(function () { + Route::get('/province_data', 'provincePatrolData')->name('provincePatrolData'); + Route::get('/edareh_data', 'edarehPatrolData')->name('edarehPatrolData'); + Route::get('/report_excel', 'roadPatrolsReportTable')->name('roadPatrolsReportTable'); + }); diff --git a/storage/sql-files/edarate_shahri.sql b/storage/sql-files/edarate_shahri.sql index b61474b3..85a2b042 100644 --- a/storage/sql-files/edarate_shahri.sql +++ b/storage/sql-files/edarate_shahri.sql @@ -520,3 +520,4 @@ INSERT INTO edarate_shahri (name_fa,province_id,created_at,updated_at) VALUES ('اداره خمام',28,'2023-06-17 08:43:14','2023-06-17 08:43:14'), ('اداره اصلاندوز',3,'2023-08-15 09:33:55','2023-08-15 09:33:55'); ('اداره گالیکش',27,'2024-11-16 14:33:55','2024-11-16 14:33:55'); + ('آزادراه ساوه-تهران',32,'2025-01-06 14:33:55','2025-01-06 14:33:55'); From 53dd73103bc1ba9e0d2d7939f49f0c7bba14c4bc Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Tue, 7 Jan 2025 16:06:22 +0330 Subject: [PATCH 13/28] remove road patrol summary --- .../V3/Reports/RoadItemsReportController.php | 40 ++++++------------- routes/v3.php | 4 +- 2 files changed, 14 insertions(+), 30 deletions(-) diff --git a/app/Http/Controllers/V3/Reports/RoadItemsReportController.php b/app/Http/Controllers/V3/Reports/RoadItemsReportController.php index 777dd568..8a18b684 100644 --- a/app/Http/Controllers/V3/Reports/RoadItemsReportController.php +++ b/app/Http/Controllers/V3/Reports/RoadItemsReportController.php @@ -102,7 +102,7 @@ class RoadItemsReportController extends Controller ]); } - public function provinceExcel(Request $request): JsonResponse + public function activityStatisticsPerProvince(Request $request): JsonResponse { if (auth()->check()) { auth()->user()->addActivityComplete(1033); @@ -124,14 +124,6 @@ class RoadItemsReportController extends Controller }) ->groupBy('province_id', 'item'); - $roadPatrolsQuery = RoadPatrol::query() - ->selectRaw('COUNT(*) AS s, province_id AS p, 77 AS i') - ->whereBetween('start_time', [$fromDate, $toDate]) - ->when(!$isSpecialUser, function ($query) use ($provinceId) { - $query->where('province_id', $provinceId); - }) - ->groupBy('province_id'); - $roadItemsProjectsSummaryQuery = RoadItemsProject::query() ->selectRaw('COUNT(*) AS s, -1 AS p, item AS i') ->where('status', 1) @@ -141,24 +133,14 @@ class RoadItemsReportController extends Controller }) ->groupBy('item'); - $roadPatrolsSummaryQuery = RoadPatrol::query() - ->selectRaw('COUNT(*) AS s, -1 AS p, 77 AS i') - ->whereBetween('start_time', [$fromDate, $toDate]) - ->when(!$isSpecialUser, function ($query) use ($provinceId) { - $query->where('province_id', $provinceId); - }); - - // Combine queries using UNION ALL $data = $roadItemsProjectsQuery - ->unionAll($roadPatrolsQuery) ->unionAll($roadItemsProjectsSummaryQuery) - ->unionAll($roadPatrolsSummaryQuery) ->get(); return $this->successResponse($data); } - public function cityExcel(Request $request): JsonResponse + public function activityStatisticsPerCity(Request $request): JsonResponse { $provinceId = $request->province_id; $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); @@ -174,17 +156,18 @@ class RoadItemsReportController extends Controller ->where('province_id', $provinceId) ->groupBy('item', 'edarat_id'); - $roadPatrolsQuery = RoadPatrol::query() + $roadItemsProjectsSummaryQuery = RoadItemsProject::query() ->selectRaw(' COUNT(*) AS s, - edare_id AS c, - 77 AS i') - ->whereBetween('start_time', [$fromDate, $toDate]) - ->where('province_id', '=', $provinceId) - ->groupBy('edare_id'); + -1 AS c, + item AS i') + ->where('status', '=', 1) + ->whereBetween('activity_date_time', [$fromDate, $toDate]) + ->where('province_id', $provinceId) + ->groupBy('item'); $data = $roadItemsProjectsQuery - ->unionAll($roadPatrolsQuery) + ->unionAll($roadItemsProjectsSummaryQuery) ->get(); return $this->successResponse($data); @@ -195,6 +178,7 @@ class RoadItemsReportController extends Controller $provinceId = $request->province_id; $cityId = $request->city_id; $subId = $request->sub_id; + $item = $request->item; $dateFrom = $request->date_from ? $request->date_from . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); $dateTo = $request->date_to ? $request->date_to . ' 23:59:59' : now()->addDay()->startOfDay()->toDateTimeString(); @@ -203,7 +187,7 @@ class RoadItemsReportController extends Controller ->when($provinceId, fn($query) => $query->where('province_id', '=', $provinceId)) ->when($cityId, fn($query) => $query->where('city_id', '=', $cityId)) ->when($subId, fn($query) => $query->where('sub_items', 'like', '%' . $subId . '%')) - ->when($request->item, fn($query) => $query->where('item', '=', $request->item)) + ->when($item, fn($query) => $query->where('item', '=', $item)) ->when(!is_null($request->status), fn($query) => $query->where('status', '=', $request->status)) ->whereBetween('activity_date', [$dateFrom, $dateTo]) ->leftJoin('users', 'users.id', '=', 'road_items_projects.user_id') diff --git a/routes/v3.php b/routes/v3.php index 08ea3979..079d83c2 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -197,8 +197,8 @@ Route::prefix('road_item_reports') Route::get('/get_sub_items', 'getSubItems')->name('getSubItems'); Route::get('/get_items', 'getItems')->name('getItems'); Route::get('/get_items_city', 'getItemsCity')->name('getItemsCity'); - Route::get('/province_excel', 'provinceExcel')->name('provinceExcel'); - Route::get('/city_excel', 'cityExcel')->name('cityExcel'); + Route::get('/province_statistics', 'activityStatisticsPerProvince')->name('activityStatisticsPerProvince'); + Route::get('/city_statistics', 'activityStatisticsPerCity')->name('activityStatisticsPerCity'); Route::get('/map', 'map')->name('map'); }); From 6b310a099a7d93600fa47814f6d73216aec8fb62 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Tue, 7 Jan 2025 16:53:15 +0330 Subject: [PATCH 14/28] write meaningful names --- .../V3/Reports/RoadItemsReportController.php | 36 +++++++++---------- routes/v3.php | 4 +-- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/app/Http/Controllers/V3/Reports/RoadItemsReportController.php b/app/Http/Controllers/V3/Reports/RoadItemsReportController.php index 8a18b684..c5be196a 100644 --- a/app/Http/Controllers/V3/Reports/RoadItemsReportController.php +++ b/app/Http/Controllers/V3/Reports/RoadItemsReportController.php @@ -24,13 +24,13 @@ class RoadItemsReportController extends Controller ]); } - public function getItems(Request $request): JsonResponse + public function getRoadItemsPerSubItem(Request $request): JsonResponse { $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); $toDate = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString(); $item = $request->item; - $all = RoadItemsProject::query()->selectRaw(' + $provinceRoadItemsPerSubItem = RoadItemsProject::query()->selectRaw(' sub_item AS t, COUNT(*) AS c, CAST(SUM(CASE WHEN sub_item_data > 0 THEN sub_item_data ELSE ABS(sub_item_data) END) AS UNSIGNED) AS s, @@ -41,7 +41,7 @@ class RoadItemsReportController extends Controller ->groupBy('province_id', 'sub_item') ->get(); - $country = RoadItemsProject::query()->selectRaw(' + $countryRoadItemsPerSubItem = RoadItemsProject::query()->selectRaw(' sub_item AS t, COUNT(*) AS c, CAST(SUM(CASE WHEN sub_item_data > 0 THEN sub_item_data ELSE ABS(sub_item_data) END) AS UNSIGNED) AS s, @@ -52,29 +52,29 @@ class RoadItemsReportController extends Controller ->groupBy('sub_item') ->get(); - $itemsFa = InfoItem::query()->where('item', '=', $item)->get()->keyBy('sub_item'); + $infoItems = InfoItem::query()->where('item', '=', $item)->get()->keyBy('sub_item'); - $all->each(function ($value) use ($itemsFa) { - if (isset($itemsFa[$value->t])) { - $value->u = $itemsFa[$value->t]->sub_item_unit; + $provinceRoadItemsPerSubItem->each(function ($value) use ($infoItems) { + if (isset($infoItems[$value->t])) { + $value->u = $infoItems[$value->t]->sub_item_unit; } }); return $this->successResponse([ - 'data' => $all, - 'country' => $country, - 'items_fa' => $itemsFa + 'provincesData' => $provinceRoadItemsPerSubItem, + 'countryData' => $countryRoadItemsPerSubItem, + 'items' => $infoItems ]); } - public function getItemsCity(Request $request): JsonResponse + public function getCityRoadItemsPerSubItem(Request $request): JsonResponse { $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); $toDate = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString(); $item = $request->item; $province = $request->province_id; - $all = RoadItemsProject::query()->selectRaw(' + $cityRoadItemsPerSubItem = RoadItemsProject::query()->selectRaw(' sub_item AS t, COUNT(*) AS c, CAST(SUM(CASE WHEN sub_item_data > 0 THEN sub_item_data ELSE ABS(sub_item_data) END) AS UNSIGNED) AS s, @@ -88,17 +88,17 @@ class RoadItemsReportController extends Controller ->groupBy('edarat_id', 'sub_item') ->get(); - $itemsFa = InfoItem::where('item', $item)->get()->keyBy('sub_item'); + $items = InfoItem::where('item', $item)->get()->keyBy('sub_item'); - $all->each(function ($value) use ($itemsFa) { - if (isset($itemsFa[$value->t])) { - $value->u = $itemsFa[$value->t]->sub_item_unit; + $cityRoadItemsPerSubItem->each(function ($value) use ($items) { + if (isset($items[$value->t])) { + $value->u = $items[$value->t]->sub_item_unit; } }); return $this->successResponse([ - 'data' => $all, - 'items_fa' => $itemsFa + 'citiesData' => $cityRoadItemsPerSubItem, + 'items' => $items ]); } diff --git a/routes/v3.php b/routes/v3.php index 079d83c2..c8a023a6 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -195,8 +195,8 @@ Route::prefix('road_item_reports') ->controller(RoadItemsReportController::class) ->group(function () { Route::get('/get_sub_items', 'getSubItems')->name('getSubItems'); - Route::get('/get_items', 'getItems')->name('getItems'); - Route::get('/get_items_city', 'getItemsCity')->name('getItemsCity'); + Route::get('/get_items', 'getRoadItemsPerSubItem')->name('getRoadItemsPerSubItem'); + Route::get('/get_items_city', 'getCityRoadItemsPerSubItem')->name('getCityRoadItemsPerSubItem'); Route::get('/province_statistics', 'activityStatisticsPerProvince')->name('activityStatisticsPerProvince'); Route::get('/city_statistics', 'activityStatisticsPerCity')->name('activityStatisticsPerCity'); Route::get('/map', 'map')->name('map'); From 72717a19fdb6bf867c474f4d15730191cc299229 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Wed, 8 Jan 2025 13:30:48 +0330 Subject: [PATCH 15/28] change functions name --- .../V3/Reports/RoadItemsReportController.php | 27 +++++++++++++------ .../V3/Reports/RoadPatrolReportController.php | 4 +-- routes/v3.php | 8 +++--- 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/app/Http/Controllers/V3/Reports/RoadItemsReportController.php b/app/Http/Controllers/V3/Reports/RoadItemsReportController.php index c5be196a..d89dbb3b 100644 --- a/app/Http/Controllers/V3/Reports/RoadItemsReportController.php +++ b/app/Http/Controllers/V3/Reports/RoadItemsReportController.php @@ -4,7 +4,9 @@ namespace App\Http\Controllers\V3\Reports; use App\Http\Controllers\Controller; use App\Http\Traits\ApiResponse; +use App\Models\EdarateShahri; use App\Models\InfoItem; +use App\Models\Province; use App\Models\RoadItemsProject; use App\Models\RoadPatrol; use Illuminate\Http\JsonResponse; @@ -24,7 +26,7 @@ class RoadItemsReportController extends Controller ]); } - public function getRoadItemsPerSubItem(Request $request): JsonResponse + public function provinceActivityPerSubItem(Request $request): JsonResponse { $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); $toDate = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString(); @@ -67,7 +69,7 @@ class RoadItemsReportController extends Controller ]); } - public function getCityRoadItemsPerSubItem(Request $request): JsonResponse + public function cityActivityPerSubItem(Request $request): JsonResponse { $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); $toDate = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString(); @@ -88,7 +90,7 @@ class RoadItemsReportController extends Controller ->groupBy('edarat_id', 'sub_item') ->get(); - $items = InfoItem::where('item', $item)->get()->keyBy('sub_item'); + $items = InfoItem::query()->where('item', $item)->get()->keyBy('sub_item'); $cityRoadItemsPerSubItem->each(function ($value) use ($items) { if (isset($items[$value->t])) { @@ -102,7 +104,7 @@ class RoadItemsReportController extends Controller ]); } - public function activityStatisticsPerProvince(Request $request): JsonResponse + public function provinceActivityPerItem(Request $request): JsonResponse { if (auth()->check()) { auth()->user()->addActivityComplete(1033); @@ -114,7 +116,6 @@ class RoadItemsReportController extends Controller $isSpecialUser = in_array($user->username, ['witel', 'drdanesh']); $provinceId = $isSpecialUser ? null : $user->province_id; - // Base queries $roadItemsProjectsQuery = RoadItemsProject::query() ->selectRaw('COUNT(*) AS s, province_id AS p, item AS i') ->where('status', 1) @@ -137,10 +138,15 @@ class RoadItemsReportController extends Controller ->unionAll($roadItemsProjectsSummaryQuery) ->get(); - return $this->successResponse($data); + $provinces = Province::all(['id', 'name']); + + return $this->successResponse([ + 'activities' => $data, + 'provinces' => $provinces, + ]); } - public function activityStatisticsPerCity(Request $request): JsonResponse + public function cityActivityPerItem(Request $request): JsonResponse { $provinceId = $request->province_id; $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); @@ -170,7 +176,12 @@ class RoadItemsReportController extends Controller ->unionAll($roadItemsProjectsSummaryQuery) ->get(); - return $this->successResponse($data); + $edarateShahri = EdarateShahri::all(['id', 'name'])->where('province_id', $provinceId); + + return $this->successResponse([ + 'activities' => $data, + 'edaratShahri' => $edarateShahri, + ]); } public function map(Request $request): JsonResponse diff --git a/app/Http/Controllers/V3/Reports/RoadPatrolReportController.php b/app/Http/Controllers/V3/Reports/RoadPatrolReportController.php index 4c56abac..16f85d01 100644 --- a/app/Http/Controllers/V3/Reports/RoadPatrolReportController.php +++ b/app/Http/Controllers/V3/Reports/RoadPatrolReportController.php @@ -17,7 +17,7 @@ class RoadPatrolReportController extends Controller public function provincePatrolData(Request $request): JsonResponse { $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); - $dateTo = $request->date_to ? $request->date_to . ' 23:59:59' : now()->addDay()->startOfDay()->toDateTimeString(); + $dateTo = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString(); $data = RoadPatrolProject::provincePatrolData($fromDate, $dateTo); return $this->successResponse($data); @@ -27,7 +27,7 @@ class RoadPatrolReportController extends Controller { $request->validate(["province_id" => "required",]); $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); - $dateTo = $request->date_to ? $request->date_to . ' 23:59:59' : now()->addDay()->startOfDay()->toDateTimeString(); + $dateTo = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString(); $data = RoadPatrolProject::edarehPatrolData($fromDate, $dateTo, $request->province_id); return $this->successResponse($data); diff --git a/routes/v3.php b/routes/v3.php index c8a023a6..198fc35d 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -195,10 +195,10 @@ Route::prefix('road_item_reports') ->controller(RoadItemsReportController::class) ->group(function () { Route::get('/get_sub_items', 'getSubItems')->name('getSubItems'); - Route::get('/get_items', 'getRoadItemsPerSubItem')->name('getRoadItemsPerSubItem'); - Route::get('/get_items_city', 'getCityRoadItemsPerSubItem')->name('getCityRoadItemsPerSubItem'); - Route::get('/province_statistics', 'activityStatisticsPerProvince')->name('activityStatisticsPerProvince'); - Route::get('/city_statistics', 'activityStatisticsPerCity')->name('activityStatisticsPerCity'); + Route::get('/get_items', 'provinceActivityPerSubItem')->name('provinceActivityPerSubItem'); + Route::get('/get_items_city', 'cityActivityPerSubItem')->name('cityActivityPerSubItem'); + Route::get('/province_statistics', 'provinceActivityPerItem')->name('provinceActivityPerItem'); + Route::get('/city_statistics', 'cityActivityPerItem')->name('cityActivityPerItem'); Route::get('/map', 'map')->name('map'); }); From f260fdc9de047a8c09d72a07129d41e5dfe1479c Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Wed, 8 Jan 2025 14:16:10 +0330 Subject: [PATCH 16/28] bugfix --- app/Http/Controllers/V3/Reports/RoadItemsReportController.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/V3/Reports/RoadItemsReportController.php b/app/Http/Controllers/V3/Reports/RoadItemsReportController.php index d89dbb3b..24e7c32c 100644 --- a/app/Http/Controllers/V3/Reports/RoadItemsReportController.php +++ b/app/Http/Controllers/V3/Reports/RoadItemsReportController.php @@ -138,7 +138,7 @@ class RoadItemsReportController extends Controller ->unionAll($roadItemsProjectsSummaryQuery) ->get(); - $provinces = Province::all(['id', 'name']); + $provinces = Province::all(['id', 'name_fa']); return $this->successResponse([ 'activities' => $data, @@ -176,7 +176,7 @@ class RoadItemsReportController extends Controller ->unionAll($roadItemsProjectsSummaryQuery) ->get(); - $edarateShahri = EdarateShahri::all(['id', 'name'])->where('province_id', $provinceId); + $edarateShahri = EdarateShahri::query()->where('province_id', '=', $provinceId)->get(['id', 'name']); return $this->successResponse([ 'activities' => $data, From a295c1958b67b9b9fab091c87f8c45d757b3982f Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Wed, 8 Jan 2025 16:27:13 +0330 Subject: [PATCH 17/28] add province to user info --- app/Http/Controllers/V3/ProfileController.php | 1 + .../Controllers/V3/Reports/RoadItemsReportController.php | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/V3/ProfileController.php b/app/Http/Controllers/V3/ProfileController.php index 930a2f0a..008ec6e7 100644 --- a/app/Http/Controllers/V3/ProfileController.php +++ b/app/Http/Controllers/V3/ProfileController.php @@ -30,6 +30,7 @@ class ProfileController extends Controller 'major' => $user->major, 'degree' => $user->degree, 'mobile' => $user->mobile, + 'province_id' => $user->province_id, 'avatar' => $user->avatarUrl() ]); } diff --git a/app/Http/Controllers/V3/Reports/RoadItemsReportController.php b/app/Http/Controllers/V3/Reports/RoadItemsReportController.php index 24e7c32c..fd4b1fe8 100644 --- a/app/Http/Controllers/V3/Reports/RoadItemsReportController.php +++ b/app/Http/Controllers/V3/Reports/RoadItemsReportController.php @@ -113,7 +113,8 @@ class RoadItemsReportController extends Controller $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); $toDate = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString(); $user = auth()->user(); - $isSpecialUser = in_array($user->username, ['witel', 'drdanesh']); +// $isSpecialUser = in_array($user->username, ['witel', 'drdanesh']); + $isSpecialUser = $user->hasPermissionTo("show-road-item-supervise-cartable"); $provinceId = $isSpecialUser ? null : $user->province_id; $roadItemsProjectsQuery = RoadItemsProject::query() @@ -176,7 +177,7 @@ class RoadItemsReportController extends Controller ->unionAll($roadItemsProjectsSummaryQuery) ->get(); - $edarateShahri = EdarateShahri::query()->where('province_id', '=', $provinceId)->get(['id', 'name']); + $edarateShahri = EdarateShahri::query()->where('province_id', '=', $provinceId)->get(['id', 'name_fa']); return $this->successResponse([ 'activities' => $data, From c79caa21932ea88f90aa1a5db365f361d44986a8 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Thu, 9 Jan 2025 10:18:33 +0330 Subject: [PATCH 18/28] fix the directory structure --- .../Azmayesh/AzmayeshController.php | 6 +++--- .../Azmayesh/AzmayeshSampleController.php | 16 +++++++--------- .../Azmayesh/AzmayeshTypeController.php | 2 +- .../{ => Dashboard}/ObservedItemController.php | 2 +- .../Reports/RoadItemsReportController.php | 3 +-- .../Reports/RoadPatrolReportController.php | 2 +- .../RoadItemsProjectController.php | 6 +----- .../RoadPatrolProjectController.php | 2 +- routes/v3.php | 16 ++++++++-------- 9 files changed, 24 insertions(+), 31 deletions(-) rename app/Http/Controllers/V3/{ => Dashboard}/Azmayesh/AzmayeshController.php (98%) rename app/Http/Controllers/V3/{ => Dashboard}/Azmayesh/AzmayeshSampleController.php (96%) rename app/Http/Controllers/V3/{ => Dashboard}/Azmayesh/AzmayeshTypeController.php (98%) rename app/Http/Controllers/V3/{ => Dashboard}/ObservedItemController.php (95%) rename app/Http/Controllers/V3/{ => Dashboard}/Reports/RoadItemsReportController.php (99%) rename app/Http/Controllers/V3/{ => Dashboard}/Reports/RoadPatrolReportController.php (96%) rename app/Http/Controllers/V3/{ => Dashboard}/RoadItemsProjectController.php (98%) rename app/Http/Controllers/V3/{ => Dashboard}/RoadPatrolProjectController.php (99%) diff --git a/app/Http/Controllers/V3/Azmayesh/AzmayeshController.php b/app/Http/Controllers/V3/Dashboard/Azmayesh/AzmayeshController.php similarity index 98% rename from app/Http/Controllers/V3/Azmayesh/AzmayeshController.php rename to app/Http/Controllers/V3/Dashboard/Azmayesh/AzmayeshController.php index fb3fd81b..72a3bd70 100644 --- a/app/Http/Controllers/V3/Azmayesh/AzmayeshController.php +++ b/app/Http/Controllers/V3/Dashboard/Azmayesh/AzmayeshController.php @@ -1,9 +1,11 @@ name('harim')->group(function () { From a246108acab8dcb5d41e8e63d9bf4c39acc0256c Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Thu, 9 Jan 2025 11:25:51 +0330 Subject: [PATCH 19/28] merge the response data to one array --- .../Reports/RoadItemsReportController.php | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php b/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php index 6e9374af..0f8df544 100644 --- a/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php +++ b/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php @@ -62,8 +62,7 @@ class RoadItemsReportController extends Controller }); return $this->successResponse([ - 'provincesData' => $provinceRoadItemsPerSubItem, - 'countryData' => $countryRoadItemsPerSubItem, + 'activities' => [$provinceRoadItemsPerSubItem, $countryRoadItemsPerSubItem], 'items' => $infoItems ]); } @@ -89,6 +88,20 @@ class RoadItemsReportController extends Controller ->groupBy('edarat_id', 'sub_item') ->get(); + $provinceRoadItemsPerSubItem = RoadItemsProject::query()->selectRaw(' + sub_item AS t, + COUNT(*) AS c, + CAST(SUM(CASE WHEN sub_item_data > 0 THEN sub_item_data ELSE ABS(sub_item_data) END) AS UNSIGNED) AS s, + province_id AS p, + -1 AS ci + ') + ->where('item', '=', $item) + ->where('province_id', '=', $province) + ->whereBetween('activity_date_time', [$fromDate, $toDate]) + ->where('status', '=', 1) + ->groupBy('sub_item') + ->get(); + $items = InfoItem::query()->where('item', $item)->get()->keyBy('sub_item'); $cityRoadItemsPerSubItem->each(function ($value) use ($items) { @@ -98,7 +111,7 @@ class RoadItemsReportController extends Controller }); return $this->successResponse([ - 'citiesData' => $cityRoadItemsPerSubItem, + 'activities' => [$cityRoadItemsPerSubItem, $provinceRoadItemsPerSubItem], 'items' => $items ]); } From 8060ff2d64fbf46eea81e9d20fd7ba3955a5c628 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Thu, 9 Jan 2025 11:57:24 +0330 Subject: [PATCH 20/28] add sub item to api --- .../Reports/RoadItemsReportController.php | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php b/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php index 0f8df544..103e4870 100644 --- a/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php +++ b/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php @@ -61,9 +61,16 @@ class RoadItemsReportController extends Controller } }); + $activities = $provinceRoadItemsPerSubItem->push(...$countryRoadItemsPerSubItem); + + $subItems = InfoItem::query() + ->where('item', $item) + ->get(['id', 'item', 'item_str', 'sub_item_str', 'sub_item_unit', 'sub_item']); + return $this->successResponse([ - 'activities' => [$provinceRoadItemsPerSubItem, $countryRoadItemsPerSubItem], - 'items' => $infoItems + 'activities' => $activities, + 'items' => $infoItems, + 'sub_items' => $subItems, ]); } @@ -110,8 +117,10 @@ class RoadItemsReportController extends Controller } }); + $activities = $cityRoadItemsPerSubItem->push(...$provinceRoadItemsPerSubItem); + return $this->successResponse([ - 'activities' => [$cityRoadItemsPerSubItem, $provinceRoadItemsPerSubItem], + 'activities' => $activities, 'items' => $items ]); } From 1b4a6da397d223ede8cdb2357fd55728f0a2e465 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Thu, 9 Jan 2025 12:31:57 +0330 Subject: [PATCH 21/28] return more data in api --- .../V3/Dashboard/Reports/RoadItemsReportController.php | 10 ++++++++-- routes/v3.php | 8 ++++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php b/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php index 103e4870..eda71fbf 100644 --- a/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php +++ b/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php @@ -62,6 +62,7 @@ class RoadItemsReportController extends Controller }); $activities = $provinceRoadItemsPerSubItem->push(...$countryRoadItemsPerSubItem); + $provinces = Province::all(['id', 'name_fa']); $subItems = InfoItem::query() ->where('item', $item) @@ -69,8 +70,8 @@ class RoadItemsReportController extends Controller return $this->successResponse([ 'activities' => $activities, - 'items' => $infoItems, 'sub_items' => $subItems, + 'provinces' => $provinces, ]); } @@ -110,6 +111,7 @@ class RoadItemsReportController extends Controller ->get(); $items = InfoItem::query()->where('item', $item)->get()->keyBy('sub_item'); + $edarateShahri = EdarateShahri::query()->where('province_id', '=', $province)->get(['id', 'name_fa']); $cityRoadItemsPerSubItem->each(function ($value) use ($items) { if (isset($items[$value->t])) { @@ -118,10 +120,14 @@ class RoadItemsReportController extends Controller }); $activities = $cityRoadItemsPerSubItem->push(...$provinceRoadItemsPerSubItem); + $subItems = InfoItem::query() + ->where('item', $item) + ->get(['id', 'item', 'item_str', 'sub_item_str', 'sub_item_unit', 'sub_item']); return $this->successResponse([ 'activities' => $activities, - 'items' => $items + 'edarateShahri' => $edarateShahri, + 'sub_items' => $subItems, ]); } diff --git a/routes/v3.php b/routes/v3.php index 3c05630f..60f6140b 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -195,10 +195,10 @@ Route::prefix('road_item_reports') ->controller(RoadItemsReportController::class) ->group(function () { Route::get('/get_sub_items', 'getSubItems')->name('getSubItems'); - Route::get('/get_items', 'provinceActivityPerSubItem')->name('provinceActivityPerSubItem'); - Route::get('/get_items_city', 'cityActivityPerSubItem')->name('cityActivityPerSubItem'); - Route::get('/province_statistics', 'provinceActivityPerItem')->name('provinceActivityPerItem'); - Route::get('/city_statistics', 'cityActivityPerItem')->name('cityActivityPerItem'); + Route::get('/province_activity_per_sub_item', 'provinceActivityPerSubItem')->name('provinceActivityPerSubItem'); + Route::get('/city_activity_per_sub_item', 'cityActivityPerSubItem')->name('cityActivityPerSubItem'); + Route::get('/province_activity_per_item', 'provinceActivityPerItem')->name('provinceActivityPerItem'); + Route::get('/city_activity_per_item', 'cityActivityPerItem')->name('cityActivityPerItem'); Route::get('/map', 'map')->name('map'); }); From 4c4593c032071ad5df81236b25d41cef4bf7fe43 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Thu, 9 Jan 2025 13:03:30 +0330 Subject: [PATCH 22/28] remove unused elements --- .../Reports/RoadItemsReportController.php | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php b/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php index eda71fbf..c87e63d3 100644 --- a/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php +++ b/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php @@ -53,17 +53,9 @@ class RoadItemsReportController extends Controller ->groupBy('sub_item') ->get(); - $infoItems = InfoItem::query()->where('item', '=', $item)->get()->keyBy('sub_item'); - - $provinceRoadItemsPerSubItem->each(function ($value) use ($infoItems) { - if (isset($infoItems[$value->t])) { - $value->u = $infoItems[$value->t]->sub_item_unit; - } - }); $activities = $provinceRoadItemsPerSubItem->push(...$countryRoadItemsPerSubItem); $provinces = Province::all(['id', 'name_fa']); - $subItems = InfoItem::query() ->where('item', $item) ->get(['id', 'item', 'item_str', 'sub_item_str', 'sub_item_unit', 'sub_item']); @@ -110,15 +102,8 @@ class RoadItemsReportController extends Controller ->groupBy('sub_item') ->get(); - $items = InfoItem::query()->where('item', $item)->get()->keyBy('sub_item'); + $edarateShahri = EdarateShahri::query()->where('province_id', '=', $province)->get(['id', 'name_fa']); - - $cityRoadItemsPerSubItem->each(function ($value) use ($items) { - if (isset($items[$value->t])) { - $value->u = $items[$value->t]->sub_item_unit; - } - }); - $activities = $cityRoadItemsPerSubItem->push(...$provinceRoadItemsPerSubItem); $subItems = InfoItem::query() ->where('item', $item) @@ -208,7 +193,7 @@ class RoadItemsReportController extends Controller return $this->successResponse([ 'activities' => $data, - 'edaratShahri' => $edarateShahri, + 'edarateShahri' => $edarateShahri, ]); } From 7288b7fce6ef5feb34b28cb768c96f1c11a2dd22 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Sat, 11 Jan 2025 10:26:58 +0330 Subject: [PATCH 23/28] rename the methods --- .../V3/Dashboard/Reports/RoadPatrolReportController.php | 6 +++--- routes/v3.php | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/Http/Controllers/V3/Dashboard/Reports/RoadPatrolReportController.php b/app/Http/Controllers/V3/Dashboard/Reports/RoadPatrolReportController.php index ec6b8526..2c297caa 100644 --- a/app/Http/Controllers/V3/Dashboard/Reports/RoadPatrolReportController.php +++ b/app/Http/Controllers/V3/Dashboard/Reports/RoadPatrolReportController.php @@ -14,7 +14,7 @@ use Symfony\Component\HttpFoundation\BinaryFileResponse; class RoadPatrolReportController extends Controller { use ApiResponse; - public function provincePatrolData(Request $request): JsonResponse + public function provincePatrolActivity(Request $request): JsonResponse { $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); $dateTo = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString(); @@ -23,7 +23,7 @@ class RoadPatrolReportController extends Controller return $this->successResponse($data); } - public function edarehPatrolData(Request $request): JsonResponse + public function cityPatrolActivity(Request $request): JsonResponse { $request->validate(["province_id" => "required",]); $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); @@ -33,7 +33,7 @@ class RoadPatrolReportController extends Controller return $this->successResponse($data); } - public function roadPatrolsReportTable(Request $request): BinaryFileResponse + public function excel(Request $request): BinaryFileResponse { $name = 'گزارش از گشت راهداری و ترابری ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; diff --git a/routes/v3.php b/routes/v3.php index 60f6140b..78e8be34 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -206,7 +206,7 @@ Route::prefix('road_patrol_reports') ->name('roadPatrolReports.') ->controller(RoadPatrolReportController::class) ->group(function () { - Route::get('/province_data', 'provincePatrolData')->name('provincePatrolData'); - Route::get('/edareh_data', 'edarehPatrolData')->name('edarehPatrolData'); - Route::get('/report_excel', 'roadPatrolsReportTable')->name('roadPatrolsReportTable'); + Route::get('/province_activity', 'provincePatrolActivity')->name('provincePatrolActivity'); + Route::get('/city_activity', 'cityPatrolActivity')->name('cityPatrolActivity'); + Route::get('/excel', 'excel')->name('excel'); }); From 8fbae148b774ca0cb952e7d8c2522bc21f9abb65 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Sat, 11 Jan 2025 13:30:35 +0330 Subject: [PATCH 24/28] add more data to api --- .../Reports/RoadItemsReportController.php | 58 +++++++++++++++---- .../Reports/RoadPatrolReportController.php | 20 +++++-- 2 files changed, 64 insertions(+), 14 deletions(-) diff --git a/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php b/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php index c87e63d3..5c0d789c 100644 --- a/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php +++ b/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\V3\Dashboard\Reports; +use App\Exports\Activities\One\AllSheets as OneSheet; use App\Http\Controllers\Controller; use App\Http\Traits\ApiResponse; use App\Models\EdarateShahri; @@ -10,6 +11,8 @@ use App\Models\Province; use App\Models\RoadItemsProject; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Maatwebsite\Excel\Facades\Excel; +use Symfony\Component\HttpFoundation\BinaryFileResponse; class RoadItemsReportController extends Controller { @@ -129,7 +132,7 @@ class RoadItemsReportController extends Controller $isSpecialUser = $user->hasPermissionTo("show-road-item-supervise-cartable"); $provinceId = $isSpecialUser ? null : $user->province_id; - $roadItemsProjectsQuery = RoadItemsProject::query() + $provinceActivity = RoadItemsProject::query() ->selectRaw('COUNT(*) AS s, province_id AS p, item AS i') ->where('status', 1) ->whereBetween('activity_date_time', [$fromDate, $toDate]) @@ -138,7 +141,7 @@ class RoadItemsReportController extends Controller }) ->groupBy('province_id', 'item'); - $roadItemsProjectsSummaryQuery = RoadItemsProject::query() + $countryActivity = RoadItemsProject::query() ->selectRaw('COUNT(*) AS s, -1 AS p, item AS i') ->where('status', 1) ->whereBetween('activity_date_time', [$fromDate, $toDate]) @@ -147,14 +150,14 @@ class RoadItemsReportController extends Controller }) ->groupBy('item'); - $data = $roadItemsProjectsQuery - ->unionAll($roadItemsProjectsSummaryQuery) + $activities = $provinceActivity + ->unionAll($countryActivity) ->get(); $provinces = Province::all(['id', 'name_fa']); return $this->successResponse([ - 'activities' => $data, + 'activities' => $activities, 'provinces' => $provinces, ]); } @@ -165,7 +168,7 @@ class RoadItemsReportController extends Controller $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); $toDate = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString(); - $roadItemsProjectsQuery = RoadItemsProject::query() + $edarehActivity = RoadItemsProject::query() ->selectRaw(' COUNT(*) AS s, edarat_id AS c, @@ -175,7 +178,7 @@ class RoadItemsReportController extends Controller ->where('province_id', $provinceId) ->groupBy('item', 'edarat_id'); - $roadItemsProjectsSummaryQuery = RoadItemsProject::query() + $cityActivity = RoadItemsProject::query() ->selectRaw(' COUNT(*) AS s, -1 AS c, @@ -185,14 +188,14 @@ class RoadItemsReportController extends Controller ->where('province_id', $provinceId) ->groupBy('item'); - $data = $roadItemsProjectsQuery - ->unionAll($roadItemsProjectsSummaryQuery) + $activities = $edarehActivity + ->unionAll($cityActivity) ->get(); $edarateShahri = EdarateShahri::query()->where('province_id', '=', $provinceId)->get(['id', 'name_fa']); return $this->successResponse([ - 'activities' => $data, + 'activities' => $activities, 'edarateShahri' => $edarateShahri, ]); } @@ -220,4 +223,39 @@ class RoadItemsReportController extends Controller return $this->successResponse($data); } + + public function activityExcelPerItem(Request $request): BinaryFileResponse + { + auth()->user()->addActivityComplete(1034); + $name = 'گزارش از فعالیت روزانه و جاری - جدول 1 ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; + return Excel::download(new OneSheet($request->fromDate, $request->toDate, $request->province), $name); + } + + public function activityExcelPerSubItem(Request $request) + { + $url_correction = $request->province ? "&province={$request->province}" : ""; + + return match ($request->type) { + 1 => redirect("/reports/two/maremat?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), + 2 => redirect("/reports/two/paksazi?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), + 3 => redirect("/reports/two/alaem?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), + 4 => redirect("/reports/two/hefaz?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), + 5 => redirect("/reports/two/roshanaei?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), + 6 => redirect("/reports/two/khatkeshi?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), + 7 => redirect("/reports/two/rangamizi?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), + 8 => redirect("/reports/two/shosteshoo?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), + 9 => redirect("/reports/two/imensazi?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), + 10 => redirect("/reports/two/harim?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), + 11 => redirect("/reports/two/pol?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), + 12 => redirect("/reports/two/toonel?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), + 13 => redirect("/reports/two/zemestani?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), + 14 => redirect("/reports/two/mashinalat?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), + 15 => redirect("/reports/two/rahdar?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), + 16 => redirect("/reports/two/ezterari?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), + 20 => redirect("/reports/two/bazrasi?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), + default => response()->json([ + 'error' => '404' + ], 404), + }; + } } diff --git a/app/Http/Controllers/V3/Dashboard/Reports/RoadPatrolReportController.php b/app/Http/Controllers/V3/Dashboard/Reports/RoadPatrolReportController.php index 2c297caa..262cce9f 100644 --- a/app/Http/Controllers/V3/Dashboard/Reports/RoadPatrolReportController.php +++ b/app/Http/Controllers/V3/Dashboard/Reports/RoadPatrolReportController.php @@ -5,6 +5,8 @@ namespace App\Http\Controllers\V3\Dashboard\Reports; use App\Exports\V2\RoadPatrol\RoadPatrolTable\AllSheets as RoadPatrolTable; use App\Http\Controllers\Controller; use App\Http\Traits\ApiResponse; +use App\Models\EdarateShahri; +use App\Models\Province; use App\Models\RoadPatrolProject; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -19,8 +21,13 @@ class RoadPatrolReportController extends Controller $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); $dateTo = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString(); - $data = RoadPatrolProject::provincePatrolData($fromDate, $dateTo); - return $this->successResponse($data); + $activities = RoadPatrolProject::provincePatrolData($fromDate, $dateTo); + $provinces = Province::all(['id', 'name_fa']); + + return $this->successResponse([ + 'activities' => $activities, + 'provinces' => $provinces + ]); } public function cityPatrolActivity(Request $request): JsonResponse @@ -29,8 +36,13 @@ class RoadPatrolReportController extends Controller $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); $dateTo = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString(); - $data = RoadPatrolProject::edarehPatrolData($fromDate, $dateTo, $request->province_id); - return $this->successResponse($data); + $activities = RoadPatrolProject::edarehPatrolData($fromDate, $dateTo, $request->province_id); + $edarateShahri = EdarateShahri::query()->where('province_id', '=', $request->province_id)->get(['id', 'name_fa']); + + return $this->successResponse([ + 'activities' => $activities, + 'edarateShahri' => $edarateShahri, + ]); } public function excel(Request $request): BinaryFileResponse From a97c8f3f5c5e9ed2c9be40c9dc142d4f60cc8dbf Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Sat, 11 Jan 2025 13:44:56 +0330 Subject: [PATCH 25/28] add sub_item to allowed filters --- .../Controllers/V3/Dashboard/RoadItemsProjectController.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/V3/Dashboard/RoadItemsProjectController.php b/app/Http/Controllers/V3/Dashboard/RoadItemsProjectController.php index 74af2099..0d9ecc5e 100644 --- a/app/Http/Controllers/V3/Dashboard/RoadItemsProjectController.php +++ b/app/Http/Controllers/V3/Dashboard/RoadItemsProjectController.php @@ -32,7 +32,7 @@ class RoadItemsProjectController extends Controller { $columns = array( 'id', 'user_id', 'start_lat', 'start_lng', 'end_lat', - 'end_lng', 'project_distance', 'item', 'item_fa', 'sub_item_fa', + 'end_lng', 'project_distance', 'item', 'item_fa', 'sub_item_fa', 'sub_item', 'sub_item_data', 'created_at', 'updated_at', 'province_id', 'province_fa', 'unit_fa', 'status', 'status_fa', 'supervisor_description', 'supervising_time', 'supervisor_name', 'edarat_id', 'edarat_name', 'activity_date_time','cmmsMachines.machine_code' @@ -139,7 +139,7 @@ class RoadItemsProjectController extends Controller { $columns = array( 'id', 'user_id', 'start_lat', 'start_lng', 'end_lat', - 'end_lng', 'project_distance', 'item', 'item_fa', 'sub_item_fa', + 'end_lng', 'project_distance', 'item', 'item_fa', 'sub_item_fa', 'sub_item', 'sub_item_data', 'created_at', 'updated_at', 'province_id', 'province_fa', 'unit_fa', 'status', 'status_fa', 'supervisor_description', 'supervising_time', 'supervisor_name', 'edarat_id', 'edarat_name', 'activity_date_time', 'cmmsMachines.machine_code' From 8141ecc0c6b8845492bf59b153654a504e2ba3b2 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Sat, 11 Jan 2025 15:43:26 +0330 Subject: [PATCH 26/28] add ostan activity to query --- .../Reports/RoadPatrolReportController.php | 104 +++++++++++++++++- 1 file changed, 101 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/V3/Dashboard/Reports/RoadPatrolReportController.php b/app/Http/Controllers/V3/Dashboard/Reports/RoadPatrolReportController.php index 262cce9f..26e218ba 100644 --- a/app/Http/Controllers/V3/Dashboard/Reports/RoadPatrolReportController.php +++ b/app/Http/Controllers/V3/Dashboard/Reports/RoadPatrolReportController.php @@ -10,6 +10,7 @@ use App\Models\Province; use App\Models\RoadPatrolProject; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Illuminate\Support\Facades\DB; use Maatwebsite\Excel\Facades\Excel; use Symfony\Component\HttpFoundation\BinaryFileResponse; @@ -21,7 +22,50 @@ class RoadPatrolReportController extends Controller $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); $dateTo = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString(); - $activities = RoadPatrolProject::provincePatrolData($fromDate, $dateTo); + $activities = DB::select('SELECT + "کشوری" as province_fa, + -1 as province_id, + COUNT(*) tedade, + SUM(tedad_mavarede_moshede_shode_adi) as tedad_mavarede_moshede_shode_adi, + SUM(tedad_mavarede_moshede_shode_fori) as tedad_mavarede_moshede_shode_fori, + SUM(tedad_mavarede_moshede_shode_ani) as tedad_mavarede_moshede_shode_ani, + SUM(tedad_mavarede_peygiri_shode) as tedad_mavarede_peygiri_shode, + SUM(tedad_faliyat_sabt_shode) as tedad_faliyat_sabt_shode, + ROUND(SUM(distance)) as masafat_tey_shode + FROM (SELECT + province_id, + province_fa, + distance, + (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 1) AS tedad_mavarede_moshede_shode_adi, + (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 2) AS tedad_mavarede_moshede_shode_fori, + (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 3) AS tedad_mavarede_moshede_shode_ani, + (SELECT COUNT(*) FROM `observed_items` oii WHERE rp.`id`= oii.road_patrol_id AND oii.road_item_id IS NOT NULL AND priority IS NOT NULL) AS tedad_mavarede_peygiri_shode, + (SELECT COUNT(*) FROM `observed_items` oii WHERE rp.`id`= oii.road_patrol_id AND oii.road_item_id IS NOT NULL AND priority IS NULL) AS tedad_faliyat_sabt_shode + FROM `road_patrols` rp where rp.start_time BETWEEN "'.$fromDate.'" AND "'.$dateTo.'") temp + union + SELECT + province_fa, + province_id, + COUNT(*) tedade, + SUM(tedad_mavarede_moshede_shode_adi) as tedad_mavarede_moshede_shode_adi, + SUM(tedad_mavarede_moshede_shode_fori) as tedad_mavarede_moshede_shode_fori, + SUM(tedad_mavarede_moshede_shode_ani) as tedad_mavarede_moshede_shode_ani, + SUM(tedad_mavarede_peygiri_shode) as tedad_mavarede_peygiri_shode, + SUM(tedad_faliyat_sabt_shode) as tedad_faliyat_sabt_shode, + ROUND(SUM(distance)) as masafat_tey_shode + FROM (SELECT + province_id, + province_fa, + distance, + (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 1) AS tedad_mavarede_moshede_shode_adi, + (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 2) AS tedad_mavarede_moshede_shode_fori, + (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 3) AS tedad_mavarede_moshede_shode_ani, + (SELECT COUNT(*) FROM `observed_items` oii WHERE rp.`id`= oii.road_patrol_id AND oii.road_item_id IS NOT NULL AND priority IS NOT NULL) AS tedad_mavarede_peygiri_shode, + (SELECT COUNT(*) FROM `observed_items` oii WHERE rp.`id`= oii.road_patrol_id AND oii.road_item_id IS NOT NULL AND priority IS NULL) AS tedad_faliyat_sabt_shode + FROM `road_patrols` rp where rp.start_time BETWEEN "'.$fromDate.'" AND "'.$dateTo.'") temp + GROUP BY province_id' + ); + $provinces = Province::all(['id', 'name_fa']); return $this->successResponse([ @@ -35,9 +79,63 @@ class RoadPatrolReportController extends Controller $request->validate(["province_id" => "required",]); $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); $dateTo = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString(); + $provinceId = $request->province_id; - $activities = RoadPatrolProject::edarehPatrolData($fromDate, $dateTo, $request->province_id); - $edarateShahri = EdarateShahri::query()->where('province_id', '=', $request->province_id)->get(['id', 'name_fa']); + $activities = DB::select( + 'SELECT + province_fa, + province_id, + -1 AS edare_id, + "استانی" AS edare_name, + COUNT(*) tedade, + SUM(tedad_mavarede_moshede_shode_adi) as tedad_mavarede_moshede_shode_adi, + SUM(tedad_mavarede_moshede_shode_fori) as tedad_mavarede_moshede_shode_fori, + SUM(tedad_mavarede_moshede_shode_ani) as tedad_mavarede_moshede_shode_ani, + SUM(tedad_mavarede_peygiri_shode) as tedad_mavarede_peygiri_shode, + SUM(tedad_faliyat_sabt_shode) as tedad_faliyat_sabt_shode, + ROUND(SUM(distance)) as masafat_tey_shode + FROM (SELECT + province_id, + province_fa, + edare_id, + edare_name, + distance, + (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 1) AS tedad_mavarede_moshede_shode_adi, + (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 2) AS tedad_mavarede_moshede_shode_fori, + (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 3) AS tedad_mavarede_moshede_shode_ani, + (SELECT COUNT(*) FROM `observed_items` oii WHERE rp.`id`= oii.road_patrol_id AND oii.road_item_id IS NOT NULL AND priority IS NOT NULL) AS tedad_mavarede_peygiri_shode, + (SELECT COUNT(*) FROM `observed_items` oii WHERE rp.`id`= oii.road_patrol_id AND oii.road_item_id IS NOT NULL AND priority IS NULL) AS tedad_faliyat_sabt_shode + FROM `road_patrols` rp where rp.province_id = "'.$provinceId.'" AND rp.start_time BETWEEN "'.$fromDate.'" AND "'.$dateTo.'") temp + UNION + SELECT + province_fa, + province_id, + edare_id, + edare_name, + COUNT(*) tedade, + SUM(tedad_mavarede_moshede_shode_adi) as tedad_mavarede_moshede_shode_adi, + SUM(tedad_mavarede_moshede_shode_fori) as tedad_mavarede_moshede_shode_fori, + SUM(tedad_mavarede_moshede_shode_ani) as tedad_mavarede_moshede_shode_ani, + SUM(tedad_mavarede_peygiri_shode) as tedad_mavarede_peygiri_shode, + SUM(tedad_faliyat_sabt_shode) as tedad_faliyat_sabt_shode, + ROUND(SUM(distance)) as masafat_tey_shode + FROM (SELECT + province_id, + province_fa, + edare_id, + edare_name, + distance, + (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 1) AS tedad_mavarede_moshede_shode_adi, + (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 2) AS tedad_mavarede_moshede_shode_fori, + (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 3) AS tedad_mavarede_moshede_shode_ani, + (SELECT COUNT(*) FROM `observed_items` oii WHERE rp.`id`= oii.road_patrol_id AND oii.road_item_id IS NOT NULL AND priority IS NOT NULL) AS tedad_mavarede_peygiri_shode, + (SELECT COUNT(*) FROM `observed_items` oii WHERE rp.`id`= oii.road_patrol_id AND oii.road_item_id IS NOT NULL AND priority IS NULL) AS tedad_faliyat_sabt_shode + FROM `road_patrols` rp where rp.province_id = "'.$provinceId.'" AND rp.start_time BETWEEN "'.$fromDate.'" AND "'.$dateTo.'") temp + GROUP BY edare_id + ' + ); + + $edarateShahri = EdarateShahri::query()->where('province_id', '=', $provinceId)->get(['id', 'name_fa']); return $this->successResponse([ 'activities' => $activities, From d3d41f3bebf3a6280d3201d98f923479b6affcc3 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Sun, 12 Jan 2025 11:23:27 +0330 Subject: [PATCH 27/28] add city filter to camp --- app/Http/Controllers/CampController.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/Http/Controllers/CampController.php b/app/Http/Controllers/CampController.php index 83f48508..8360f00d 100644 --- a/app/Http/Controllers/CampController.php +++ b/app/Http/Controllers/CampController.php @@ -17,6 +17,7 @@ class CampController extends Controller public function index(Request $request) { $province = $request->province ?? null; + $city = $request->city ?? null; $blockageDate = $request->blockage_date ?? null; $axisType = $request->axis_type ?? null; $blockageReason = $request->blockage ?? null; @@ -28,6 +29,9 @@ class CampController extends Controller ->when($province, function ($query, $province) { return $query->where('province_id', $province); }) + ->when($city, function ($query, $city) { + return $query->where('city_id', $city); + }) ->when($blockageDate, function ($query, $blockageDate) { return $query->whereBetween('submited_at', [$blockageDate . ' 00:00:00', $blockageDate . ' 23:59:59']); }) @@ -48,6 +52,9 @@ class CampController extends Controller ->when($blockageDate, function ($query, $blockageDate) { return $query->whereBetween('submited_at', [$blockageDate . ' 00:00:00', $blockageDate . ' 23:59:59']); }) + ->when($city, function ($query, $city) { + return $query->where('city_id', $city); + }) ->when($axisType, function ($query, $axisType) { return $query->where('axis_type', $axisType); }) From d05101fe0b418a4bfcf4b797e2593369b731b0e2 Mon Sep 17 00:00:00 2001 From: Witel Group Date: Sun, 12 Jan 2025 08:20:13 +0000 Subject: [PATCH 28/28] add date filter to camp --- app/Http/Controllers/CampController.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/CampController.php b/app/Http/Controllers/CampController.php index 8360f00d..c122a258 100644 --- a/app/Http/Controllers/CampController.php +++ b/app/Http/Controllers/CampController.php @@ -18,7 +18,11 @@ class CampController extends Controller { $province = $request->province ?? null; $city = $request->city ?? null; - $blockageDate = $request->blockage_date ?? null; + $blockageStartDate = $request->blockage_start_date ?? null; + $blockageEndDate = $request->blockage_end_date ?? null; + $blockageDate = $blockageStartDate && $blockageEndDate ? + [$blockageStartDate . ' 00:00:00', $blockageEndDate . ' 23:59:59'] : + null; $axisType = $request->axis_type ?? null; $blockageReason = $request->blockage ?? null; @@ -33,7 +37,7 @@ class CampController extends Controller return $query->where('city_id', $city); }) ->when($blockageDate, function ($query, $blockageDate) { - return $query->whereBetween('submited_at', [$blockageDate . ' 00:00:00', $blockageDate . ' 23:59:59']); + return $query->whereBetween('submited_at', $blockageDate); }) ->when($axisType, function ($query, $axisType) { return $query->where('axis_type', $axisType);