FIX: relación municipality con modules

This commit is contained in:
Juan Felipe Zapata Moreno 2025-11-03 16:28:37 -06:00
parent 7a5bf3a2a0
commit dd2b3211db
6 changed files with 78 additions and 22 deletions

View File

@ -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',

View File

@ -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',

View File

@ -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')

View File

@ -19,4 +19,9 @@ class Municipality extends Model
'code',
'name',
];
public function modules()
{
return $this->hasMany(Module::class);
}
}

View File

@ -0,0 +1,31 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::table('modules', function (Blueprint $table) {
// Eliminar la columna antigua
$table->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');
});
}
};

View File

@ -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
);
}
}