From c4935d529850e306cb47da8173259ea3a4d51fcd Mon Sep 17 00:00:00 2001 From: Juan Felipe Zapata Moreno Date: Thu, 23 Oct 2025 11:55:38 -0600 Subject: [PATCH] =?UTF-8?q?WIP=20-=20correci=C3=B3n=20de=20la=20respuesta?= =?UTF-8?q?=20de=20consulta=20vehiculos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/Repuve/DeviceController.php | 57 +++++++++++++++++++ .../Repuve/InscriptionController.php | 6 ++ .../Controllers/Repuve/ModuleController.php | 6 +- .../Requests/Repuve/DeviceStoreRequest.php | 32 +++++++++++ .../Requests/Repuve/DeviceUpdateRequest.php | 32 +++++++++++ app/Models/Device.php | 4 +- app/Models/Module.php | 2 +- database/factories/TagFactory.php | 2 +- routes/api.php | 4 ++ 9 files changed, 136 insertions(+), 9 deletions(-) create mode 100644 app/Http/Controllers/Repuve/DeviceController.php create mode 100644 app/Http/Requests/Repuve/DeviceStoreRequest.php create mode 100644 app/Http/Requests/Repuve/DeviceUpdateRequest.php diff --git a/app/Http/Controllers/Repuve/DeviceController.php b/app/Http/Controllers/Repuve/DeviceController.php new file mode 100644 index 0000000..b1bc0fe --- /dev/null +++ b/app/Http/Controllers/Repuve/DeviceController.php @@ -0,0 +1,57 @@ +filled('serie') && !$request->filled('brand')){ + return ApiResponse::BAD_REQUEST->response([ + 'message' => 'Debe proporcionar al menos uno de los siguientes parámetros: serie o marca.' + ]); + } + + if ($request->filled('serie')){ + $query->where('serie', 'LIKE', '%' . $request->input('serie') . '%'); + } + + if ($request->filled('brand')){ + $query->where('brand', 'LIKE', '%' . $request->input('brand') . '%'); + } + + $perPage = $request->input('per_page', 10); + $devices = $query->paginate($perPage); + + return ApiResponse::OK->response([ + 'devices' => $devices->map(function ($devices){ + return [ + 'id' => $devices->id, + 'brand' => $devices->brand, + 'serie' => $devices->serie, + 'status' => $devices->status, + ]; + }), + 'pagination' => [ + 'total' => $devices->total(), + 'per_page' => $devices->perPage(), + 'current_page' => $devices->currentPage(), + 'last_page' => $devices->lastPage(), + 'from' => $devices->firstItem(), + 'to' => $devices->lastItem(), + ], + ]); + } catch(\Exception $e){ + return ApiResponse::INTERNAL_ERROR->response([ + 'message' => 'Error al obtener la lista de dispositivos.', + 'error' => $e->getMessage(), + ]); + } + } +} diff --git a/app/Http/Controllers/Repuve/InscriptionController.php b/app/Http/Controllers/Repuve/InscriptionController.php index 6a22e52..0d05515 100644 --- a/app/Http/Controllers/Repuve/InscriptionController.php +++ b/app/Http/Controllers/Repuve/InscriptionController.php @@ -369,6 +369,7 @@ public function searchRecord(Request $request) return [ 'id' => $record->id, 'folio' => $record->folio, + 'created_at' => $record->created_at->toDateTimeString(), 'vehicle' => [ 'id' => $record->vehicle->id, 'placa' => $record->vehicle->placa, @@ -383,6 +384,11 @@ public function searchRecord(Request $request) 'full_name' => $record->vehicle->owner->full_name, 'rfc' => $record->vehicle->owner->rfc, ], + 'tag' =>[ + 'id' => $record->vehicle->tag ? $record->vehicle->tag->id : null, + 'folio' => $record->vehicle->tag ? $record->vehicle->tag->folio : null, + 'status' => $record->vehicle->tag ? $record->vehicle->tag->status : null, + ], 'files' => $record->files->map(function ($file) { return [ 'id' => $file->id, diff --git a/app/Http/Controllers/Repuve/ModuleController.php b/app/Http/Controllers/Repuve/ModuleController.php index 0e4715e..31951ab 100644 --- a/app/Http/Controllers/Repuve/ModuleController.php +++ b/app/Http/Controllers/Repuve/ModuleController.php @@ -17,7 +17,7 @@ class ModuleController extends Controller { /** - * Listar módulos existentes con filtros y paginación + * Listar módulos existentes */ public function index(Request $request) { @@ -87,10 +87,6 @@ public function index(Request $request) ]); } catch (\Exception $e) { - Log::error('Error al listar módulos: ' . $e->getMessage(), [ - 'trace' => $e->getTraceAsString() - ]); - return ApiResponse::INTERNAL_ERROR->response([ 'message' => 'Error al listar módulos', 'error' => $e->getMessage(), diff --git a/app/Http/Requests/Repuve/DeviceStoreRequest.php b/app/Http/Requests/Repuve/DeviceStoreRequest.php new file mode 100644 index 0000000..021871b --- /dev/null +++ b/app/Http/Requests/Repuve/DeviceStoreRequest.php @@ -0,0 +1,32 @@ + 'required|string|max:255', + 'serie' => 'required|string|unique:devices,serie|max:255', + 'module_id' => 'required|exists:modules,id', + 'status' => 'nullable|boolean', + ]; + } + + public function messages(): array + { + return [ + 'brand.required' => 'La marca del dispositivo es requerida', + 'serie.required' => 'El número de serie del dispositivo es requerido', + 'module_id.required' => 'El módulo asignado es requerido', + ]; + } +} diff --git a/app/Http/Requests/Repuve/DeviceUpdateRequest.php b/app/Http/Requests/Repuve/DeviceUpdateRequest.php new file mode 100644 index 0000000..927e68e --- /dev/null +++ b/app/Http/Requests/Repuve/DeviceUpdateRequest.php @@ -0,0 +1,32 @@ + 'sometimes|string|max:255', + 'serie' => 'sometimes|string|unique:devices,serie,{id}|max:255', + 'module_id' => 'sometimes|exists:modules,id', + 'status' => 'nullable|boolean', + ]; + } + + public function messages(): array + { + return [ + 'brand.required' => 'La marca del dispositivo es requerida', + 'serie.required' => 'El número de serie del dispositivo es requerido', + 'module_id.required' => 'El módulo asignado es requerido', + ]; + } +} diff --git a/app/Models/Device.php b/app/Models/Device.php index 64ba251..6fd2690 100644 --- a/app/Models/Device.php +++ b/app/Models/Device.php @@ -24,7 +24,7 @@ protected function casts(): array public function modules() { - return $this->belongsToMany(Module::class, 'device_module') + return $this->belongsTo(Module::class, 'device_module') ->withPivot('status') ->withTimestamps(); } @@ -36,7 +36,7 @@ public function deviceModules() public function activeModules() { - return $this->belongsToMany(Module::class, 'device_module') + return $this->belongsTo(Module::class, 'device_module') ->wherePivot('status', true) ->withPivot('status') ->withTimestamps(); diff --git a/app/Models/Module.php b/app/Models/Module.php index 560aaa2..0fb1bd3 100644 --- a/app/Models/Module.php +++ b/app/Models/Module.php @@ -32,7 +32,7 @@ protected function casts(): array public function devices() { - return $this->belongsToMany(Device::class, 'device_module') + return $this->belongsTo(Device::class, 'device_module') ->withPivot('status') ->withTimestamps(); } diff --git a/database/factories/TagFactory.php b/database/factories/TagFactory.php index d692547..3ce621a 100644 --- a/database/factories/TagFactory.php +++ b/database/factories/TagFactory.php @@ -39,7 +39,7 @@ private function generateFolio(): string { $year = fake()->numberBetween(2020, 2025); $series = strtoupper(fake()->bothify('??')); - $number = fake()->unique()->numerify('########'); + $number = fake()->unique()->numerify('####################'); return 'TAG-' . $year . '-' . $series . '-' . $number; } diff --git a/routes/api.php b/routes/api.php index 999cd59..70d5dd3 100644 --- a/routes/api.php +++ b/routes/api.php @@ -6,6 +6,7 @@ use App\Http\Controllers\Repuve\InscriptionController; use App\Http\Controllers\Repuve\UpdateController; use App\Http\Controllers\Admin\RoleController; +use App\Http\Controllers\Repuve\DeviceController; /** * Rutas del núcleo de la aplicación. @@ -51,6 +52,9 @@ // Rutas de roles, mostrar roles para asignar a usuarios Route::get('/admin/roles-all', [RoleController::class, 'listAll']); + + //Rutas de dispositivos + Route::get('/devices', [DeviceController::class, 'index']); }); /** Rutas públicas */