From dd2b3211dbb8af65b527179786043c49f67bc389 Mon Sep 17 00:00:00 2001 From: Juan Felipe Zapata Moreno Date: Mon, 3 Nov 2025 16:28:37 -0600 Subject: [PATCH] =?UTF-8?q?FIX:=20relaci=C3=B3n=20municipality=20con=20mod?= =?UTF-8?q?ules?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/Repuve/ModuleController.php | 36 +++++++++++++------ .../Requests/Repuve/ModuleStoreRequest.php | 6 ++-- app/Models/Module.php | 7 +++- app/Models/Municipality.php | 5 +++ ...pality_to_foreign_key_in_modules_table.php | 31 ++++++++++++++++ database/seeders/ModuleSeeder.php | 15 ++++---- 6 files changed, 78 insertions(+), 22 deletions(-) create mode 100644 database/migrations/2025_11_03_161709_change_municipality_to_foreign_key_in_modules_table.php diff --git a/app/Http/Controllers/Repuve/ModuleController.php b/app/Http/Controllers/Repuve/ModuleController.php index 25d183e..3d99f51 100644 --- a/app/Http/Controllers/Repuve/ModuleController.php +++ b/app/Http/Controllers/Repuve/ModuleController.php @@ -21,16 +21,17 @@ class ModuleController extends Controller public function index(Request $request) { try { - $query = Module::query('responsible')->withCount(['packages']); + $query = Module::with(['responsible', 'municipality'])->withCount(['packages']); // Filtro por nombre if ($request->filled('name')) { $query->where('name', 'like', '%' . $request->input('name') . '%'); } - // Filtro por municipio if ($request->filled('municipality')) { - $query->where('municipality', 'like', '%' . $request->input('municipality') . '%'); + $query->whereHas('municipality', function ($q) use ($request) { + $q->where('name', 'like', '%' . $request->input('municipality') . '%'); + }); } // Cargar relaciones para contar @@ -54,7 +55,11 @@ public function index(Request $request) 'name' => $module->responsible->full_name, 'email' => $module->responsible->email, ] : null, - 'municipality' => $module->municipality, + 'municipality' => $module->municipality ? [ + 'id' => $module->municipality->id, + 'code' => $module->municipality->code, + 'name' => $module->municipality->name, + ] : null, 'address' => $module->address, 'colony' => $module->colony, 'cp' => $module->cp, @@ -76,7 +81,6 @@ public function index(Request $request) 'to' => $modules->lastItem(), ], ]); - } catch (\Exception $e) { return ApiResponse::INTERNAL_ERROR->response([ 'message' => 'Error al listar módulos', @@ -97,7 +101,7 @@ public function store(ModuleStoreRequest $request) $module = Module::create([ 'name' => $request->input('name'), 'responsible_id' => $request->input('responsible_id'), - 'municipality' => $request->input('municipality'), + 'municipality_id' => $request->input('municipality_id'), 'address' => $request->input('address'), 'colony' => $request->input('colony'), 'cp' => $request->input('cp'), @@ -108,12 +112,18 @@ public function store(ModuleStoreRequest $request) DB::commit(); + $module->load('municipality'); + return ApiResponse::CREATED->response([ 'message' => 'Módulo creado exitosamente', 'module' => [ 'name' => $module->name, 'responsible_id' => $module->responsible_id, - 'municipality' => $module->municipality, + 'municipality' => $module->municipality ? [ + 'id' => $module->municipality->id, + 'code' => $module->municipality->code, + 'name' => $module->municipality->name, + ] : null, 'address' => $module->address, 'colony' => $module->colony, 'cp' => $module->cp, @@ -123,7 +133,6 @@ public function store(ModuleStoreRequest $request) 'created_at' => $module->created_at->format('Y-m-d H:i:s'), ], ]); - } catch (\Exception $e) { DB::rollBack(); return ApiResponse::INTERNAL_ERROR->response([ @@ -148,12 +157,19 @@ public function update(ModuleUpdateRequest $request, int $id) DB::commit(); + // Cargar la relación actualizada + $module->load('municipality'); + return ApiResponse::OK->response([ 'message' => 'Módulo actualizado exitosamente', 'module' => [ 'name' => $module->name, 'responsible_id' => $module->responsible_id, - 'municipality' => $module->municipality, + 'municipality' => $module->municipality ? [ + 'id' => $module->municipality->id, + 'code' => $module->municipality->code, + 'name' => $module->municipality->name, + ] : null, 'address' => $module->address, 'colony' => $module->colony, 'cp' => $module->cp, @@ -163,7 +179,6 @@ public function update(ModuleUpdateRequest $request, int $id) 'updated_at' => $module->updated_at->format('Y-m-d H:i:s'), ], ]); - } catch (ModelNotFoundException $e) { return ApiResponse::NOT_FOUND->response([ 'message' => 'Módulo no encontrado', @@ -206,7 +221,6 @@ public function toggleStatus(int $id) 'updated_at' => $module->updated_at->format('Y-m-d H:i:s'), ], ]); - } catch (ModelNotFoundException $e) { return ApiResponse::NOT_FOUND->response([ 'message' => 'Módulo no encontrado', diff --git a/app/Http/Requests/Repuve/ModuleStoreRequest.php b/app/Http/Requests/Repuve/ModuleStoreRequest.php index f85e6ee..d3e3220 100644 --- a/app/Http/Requests/Repuve/ModuleStoreRequest.php +++ b/app/Http/Requests/Repuve/ModuleStoreRequest.php @@ -16,7 +16,7 @@ public function rules(): array return [ 'name' => ['required', 'string', 'max:255'], 'responsible_id' => ['required', 'exists:users,id'], - 'municipality' => ['required', 'string', 'max:100'], + 'municipality_id' => 'required|exists:municipalities,id', 'address' => ['required', 'string', 'max:255'], 'colony' => ['required', 'string', 'max:100'], 'cp' => ['nullable', 'string', 'max:10'], @@ -32,9 +32,7 @@ public function messages(): array 'name.required' => 'El nombre del módulo es requerido', 'name.string' => 'El nombre debe ser una cadena de texto', 'name.max' => 'El nombre no debe superar los 255 caracteres', - 'municipality.required' => 'El municipio es requerido', - 'municipality.string' => 'El municipio debe ser una cadena de texto', - 'municipality.max' => 'El municipio no debe superar los 100 caracteres', + 'municipality_id.required' => 'El municipio es requerido', 'address.required' => 'La dirección es requerida', 'address.string' => 'La dirección debe ser una cadena de texto', 'address.max' => 'La dirección no debe superar los 255 caracteres', diff --git a/app/Models/Module.php b/app/Models/Module.php index 0fb1bd3..2619b12 100644 --- a/app/Models/Module.php +++ b/app/Models/Module.php @@ -12,7 +12,7 @@ class Module extends Model protected $fillable = [ 'name', 'responsible_id', - 'municipality', + 'municipality_id', 'address', 'colony', 'cp', @@ -30,6 +30,11 @@ protected function casts(): array ]; } + public function municipality() + { + return $this->belongsTo(Municipality::class); + } + public function devices() { return $this->belongsTo(Device::class, 'device_module') diff --git a/app/Models/Municipality.php b/app/Models/Municipality.php index b0d82a4..930ec93 100644 --- a/app/Models/Municipality.php +++ b/app/Models/Municipality.php @@ -19,4 +19,9 @@ class Municipality extends Model 'code', 'name', ]; + + public function modules() + { + return $this->hasMany(Module::class); + } } diff --git a/database/migrations/2025_11_03_161709_change_municipality_to_foreign_key_in_modules_table.php b/database/migrations/2025_11_03_161709_change_municipality_to_foreign_key_in_modules_table.php new file mode 100644 index 0000000..92d778b --- /dev/null +++ b/database/migrations/2025_11_03_161709_change_municipality_to_foreign_key_in_modules_table.php @@ -0,0 +1,31 @@ +dropColumn('municipality'); + + // Agregar la nueva columna con foreign key + $table->foreignId('municipality_id') + ->nullable() + ->constrained('municipalities') + ->onDelete('set null'); + }); + } + + public function down(): void + { + Schema::table('modules', function (Blueprint $table) { + $table->dropForeign(['municipality_id']); + $table->dropColumn('municipality_id'); + $table->string('municipality'); + }); + } +}; diff --git a/database/seeders/ModuleSeeder.php b/database/seeders/ModuleSeeder.php index 85ebfb9..47996d8 100644 --- a/database/seeders/ModuleSeeder.php +++ b/database/seeders/ModuleSeeder.php @@ -16,7 +16,7 @@ public function run(): void $modules = [ [ 'name' => 'MODULO PARQUE LA CHOCA', - 'municipality' => '4', + 'municipality_id' => 4, 'address' => 'CIRCUITO CARLOS PELLICER S/N JUNTO A PLAZA MALLORCA ESTACIONAMIENTO DEL PARQUE LA CHOCA', 'colony' => 'CENTRO', 'cp' => null, @@ -26,7 +26,7 @@ public function run(): void ], [ 'name' => 'MODULO FINANZAS BASE 4', - 'municipality' => '4', + 'municipality_id' => 4, 'address' => 'AV. RUIZ CORTINES S/N', 'colony' => 'CASA BLANCA', 'cp' => null, @@ -36,7 +36,7 @@ public function run(): void ], [ 'name' => 'MODULO CARDENAS', - 'municipality' => '2', + 'municipality_id' => 2, 'address' => 'ANILLO PERIFERICO CARLOS MOLINA S/N', 'colony' => 'SANTA MARIA DE GUADALUPE', 'cp' => null, @@ -46,7 +46,7 @@ public function run(): void ], [ 'name' => 'MODULO PASEO DE LA SIERRA', - 'municipality' => '4', + 'municipality_id' => 4, 'address' => ' AV. PASEO DE LA SIERRA #435 COL. REFORMA, C.P. 86080 VILLAHERMOSA, TABASCO,', 'colony' => 'REFORMA', 'cp' => null, @@ -56,7 +56,7 @@ public function run(): void ], [ 'name' => 'CENTRO DE ACTIVACION COMALCALCO', - 'municipality' => '5', + 'municipality_id' => 5, 'address' => 'MONSERRAT #5', 'colony' => 'SANTO DOMINGO', 'cp' => null, @@ -66,7 +66,10 @@ public function run(): void ], ]; foreach ($modules as $module) { - Module::create($module); + Module::updateOrCreate( + ['name' => $module['name']], // Buscar por nombre + $module // Actualizar o crear con estos datos + ); } }