feat: actualiza configuración de Docker, mejora la gestión de permisos y renombra campos en las vistas de constancias

This commit is contained in:
Juan Felipe Zapata Moreno 2026-03-03 18:00:11 -06:00
parent e701d5348a
commit 3e7d381f15
12 changed files with 62 additions and 44 deletions

View File

@ -51,6 +51,8 @@ services:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_USER: ${DB_USERNAME}
ports:
- "${DB_FORWARD_PORT}:3306"
volumes:
- mysql_data:/var/lib/mysql
networks:

View File

@ -350,8 +350,8 @@ public function cancelarTagNoAsignado(Request $request)
'motivo' => ($lastCancellation->cancellationReason && isset($lastCancellation->cancellationReason->name))
? $lastCancellation->cancellationReason->name
: 'No especificado',
'operador' => ($lastCancellation->cancelledBy && isset($lastCancellation->cancelledBy->name))
? $lastCancellation->cancelledBy->name
'operador' => ($lastCancellation->cancelledBy && isset($lastCancellation->cancelledBy->full_name))
? $lastCancellation->cancelledBy->full_name
: 'Sistema',
'modulo' => ($tag->module && isset($tag->module->name)) ? $tag->module->name : 'No especificado',
'ubicacion' => ($tag->module && isset($tag->module->address)) ? $tag->module->address : 'No especificado',

View File

@ -77,8 +77,6 @@ public function store(ModuleStoreRequest $request)
'responsible_id' => $request->input('responsible_id'),
'municipality_id' => $request->input('municipality_id'),
'address' => $request->input('address'),
'colony' => $request->input('colony'),
'cp' => $request->input('cp'),
'longitude' => $request->input('longitude'),
'latitude' => $request->input('latitude'),
'status' => $request->input('status', true), // Por defecto activo
@ -99,8 +97,6 @@ public function store(ModuleStoreRequest $request)
'name' => $module->municipality->name,
] : null,
'address' => $module->address,
'colony' => $module->colony,
'cp' => $module->cp,
'longitude' => $module->longitude,
'latitude' => $module->latitude,
'status' => $module->status ? 'Activo' : 'Inactivo',
@ -170,8 +166,6 @@ public function update(ModuleUpdateRequest $request, int $id)
'name' => $module->municipality->name,
] : null,
'address' => $module->address,
'colony' => $module->colony,
'cp' => $module->cp,
'longitude' => $module->longitude,
'latitude' => $module->latitude,
'status' => $module->status ? 'Activo' : 'Inactivo',

View File

@ -477,7 +477,7 @@ private function cancellationData(Tag $tag)
if ($tagCancellationLog) {
$data['fecha'] = $tagCancellationLog->cancellation_at->format('d/m/Y');
$data['motivo'] = $tagCancellationLog->cancellationReason->name ?? 'No especificado';
$data['operador'] = $tagCancellationLog->cancelledBy->name ?? 'Sistema';
$data['operador'] = $tagCancellationLog->cancelledBy->full_name ?? 'Sistema';
// Extraer datos adicionales de las observaciones
$this->extractAdditionalDataFromObservations($tagCancellationLog->cancellation_observations, $data);
@ -503,7 +503,7 @@ private function cancellationData(Tag $tag)
if ($vehicleTagLog) {
$data['motivo'] = $vehicleTagLog->cancellationReason->name ?? 'No especificado';
$data['operador'] = $vehicleTagLog->cancelledBy->name ?? 'Sistema';
$data['operador'] = $vehicleTagLog->cancelledBy->full_name ?? 'Sistema';
// Cargar módulo del cual el usuario es responsable
if ($vehicleTagLog->cancelledBy) {

View File

@ -19,8 +19,7 @@ public function rules(): array
'responsible_id' => ['required', 'exists:users,id'],
'municipality_id' => 'required|exists:municipalities,id',
'address' => ['required', 'string', 'max:255'],
'colony' => ['required', 'string', 'max:100'],
'cp' => ['nullable', 'string', 'max:10'],
'longitude' => ['nullable', 'numeric', 'between:-180,180'],
'latitude' => ['nullable', 'numeric', 'between:-90,90'],
'status' => ['nullable', 'boolean'],
@ -38,11 +37,7 @@ public function messages(): array
'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',
'colony.required' => 'La colonia es requerida',
'colony.string' => 'La colonia debe ser una cadena de texto',
'colony.max' => 'La colonia no debe superar los 100 caracteres',
'cp.string' => 'El código postal debe ser una cadena de texto',
'cp.max' => 'El código postal no debe superar los 10 caracteres',
'longitude.numeric' => 'La longitud debe ser un número',
'longitude.between' => 'La longitud debe estar entre -180 y 180',
'latitude.numeric' => 'La latitud debe ser un número',

View File

@ -18,9 +18,8 @@ public function rules(): array
'name' => ['nullable', 'string', 'max:50', Rule::unique('modules', 'name')->ignore($this->route('module'))],
'municipality_id' => ['nullable', 'integer', 'exists:municipalities,id'],
'responsible_id' => ['nullable', 'integer', 'exists:users,id'],
'address' => ['nullable', 'string', 'max:50'],
'colony' => ['nullable', 'string', 'max:100'],
'cp' => ['nullable', 'string', 'max:10'],
'address' => ['nullable', 'string', 'max:250'],
'longitude' => ['nullable', 'numeric', 'between:-180,180'],
'latitude' => ['nullable', 'numeric', 'between:-90,90'],
'status' => ['nullable', 'boolean'],
@ -39,10 +38,7 @@ public function messages(): array
'responsible_id.exists' => 'El responsable seleccionado no existe',
'address.string' => 'La dirección debe ser texto',
'address.max' => 'La dirección no debe superar los 50 caracteres',
'colony.string' => 'La colonia debe ser texto',
'colony.max' => 'La colonia no debe superar los 100 caracteres',
'cp.string' => 'El código postal debe ser texto',
'cp.max' => 'El código postal no debe superar los 10 caracteres',
'longitude.numeric' => 'La longitud debe ser un número',
'longitude.between' => 'La longitud debe estar entre -180 y 180',
'latitude.numeric' => 'La latitud debe ser un número',

View File

@ -14,8 +14,6 @@ class Module extends Model
'responsible_id',
'municipality_id',
'address',
'colony',
'cp',
'longitude',
'latitude',
'status',

View File

@ -0,0 +1,29 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('modules', function (Blueprint $table) {
$table->dropColumn(['colony', 'cp']);
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('modules', function (Blueprint $table) {
$table->string('colony')->nullable();
$table->string('cp')->nullable();
});
}
};

View File

@ -50,7 +50,7 @@ public function run(): void
'FOTO LADO LATERAL DEL VEHÍCULO',
'FOTO UBICACIÓN DEL VIN',
'FOTO CONSTANCIA DE INSCRIPCIÓN PEGADA (CI MORADA O AZUL)',
'FORMATO DE CONSTANCIA DE SUSTITUCIÓN',
'FORMATO DE CONSTANCIA SUSTITUIDA',
'EVIDENCIA ADICIONAL',
];

View File

@ -29,7 +29,7 @@ class RoleSeeder extends Seeder
public function run(): void
{
// === USUARIOS ===
$users = PermissionType::firstOrCreate(['name' => 'Usuarios']);
$users = PermissionType::updateOrCreate(['name' => 'Usuarios']);
[
$userIndex,
@ -39,7 +39,7 @@ public function run(): void
] = $this->onCRUD('users', $users, 'api');
// === ROLES ===
$roles = PermissionType::firstOrCreate(['name' => 'Roles']);
$roles = PermissionType::updateOrCreate(['name' => 'Roles']);
[
$roleIndex,
@ -51,7 +51,7 @@ public function run(): void
$rolePermissions = $this->onPermission('roles.permissions', 'Permisos de roles', $roles, 'api');
// === MÓDULOS ===
$modules = PermissionType::firstOrCreate(['name' => 'Módulos']);
$modules = PermissionType::updateOrCreate(['name' => 'Módulos']);
[
$moduleIndex,
@ -64,7 +64,7 @@ public function run(): void
$moduleToggleStatus = $this->onPermission('module.toggle_status', 'Cambiar estado del módulo', $modules, 'api');
// === DISPOSITIVOS MÓVILES ===
$devices = PermissionType::firstOrCreate(['name' => 'Dispositivos Móviles']);
$devices = PermissionType::updateOrCreate(['name' => 'Dispositivos Móviles']);
[
$deviceIndex,
@ -76,31 +76,31 @@ public function run(): void
$deviceToggleStatus = $this->onPermission('devices.toggle_status', 'Cambiar estado del dispositivo', $devices, 'api');
// === INSCRIPCIONES ===
$inscriptions = PermissionType::firstOrCreate(['name' => 'Proceso de Sustitución por primera vez']);
$inscriptions = PermissionType::updateOrCreate(['name' => 'Proceso de Sustitución por primera vez']);
$inscriptionVehicle = $this->onPermission('inscription.vehicle', 'Inscribir vehículo', $inscriptions, 'api');
$inscriptionSearchNational = $this->onPermission('inscription.search.national', 'Buscar en consulta nacional', $inscriptions, 'api');
$inscriptionSearch = $this->onPermission('inscription.search', 'Buscar en consulta', $inscriptions, 'api');
// === CANCELACIONES ===
$cancellations = PermissionType::firstOrCreate(['name' => 'Cancelaciones']);
$cancellations = PermissionType::updateOrCreate(['name' => 'Cancelaciones']);
$cancellationTagNoAsignado = $this->onPermission('cancellations.cancel_tag_no_asignado', 'Cancelar constancia no asignada', $cancellations, 'api');
// === SISTEMA ===
$system = PermissionType::firstOrCreate(['name' => 'Sistema']);
$system = PermissionType::updateOrCreate(['name' => 'Sistema']);
$systemSettings = $this->onPermission('system.settings', 'Configurar credenciales REPUVE', $system, 'api');
// === ACTUALIZAR REGISTRO ===
$updates = PermissionType::firstOrCreate(['name' => 'Actualizar Registro']);
$updates = PermissionType::updateOrCreate(['name' => 'Actualizar Registro']);
$updateVehicleData = $this->onPermission('updates.vehicle-data', 'Actualizar datos de vehículo por formulario', $updates, 'api');
$updateVehicleUpdate = $this->onPermission('updates.vehicle-update', 'Actualizar datos de vehículo', $updates, 'api');
$updateResendToRepuve = $this->onPermission('updates.resend-to-repuve', 'Reenviar a REPUVE', $updates, 'api');
// === GENERAR FORMATOS ===
$formats = PermissionType::firstOrCreate(['name' => 'Generar Formatos']);
$formats = PermissionType::updateOrCreate(['name' => 'Generar Formatos']);
$recordGeneratePdf = $this->onPermission('records.generate_pdf', 'Generar Hoja de recepción', $formats, 'api');
$recordGeneratePdfForm = $this->onPermission('records.generate_pdf_form', 'Generar solicitud de sustitución', $formats, 'api');
@ -108,7 +108,7 @@ public function run(): void
$recordGeneratePdfConstancia = $this->onPermission('records.generate_pdf_constancia', 'Generar Impresión en la constancia', $formats, 'api');
// === REPORTES ===
$reports = PermissionType::firstOrCreate(['name' => 'Reportes - Excel']);
$reports = PermissionType::updateOrCreate(['name' => 'Reportes - Excel']);
$reportVehicleUpdates = $this->onPermission('reports.vehicle_updates.index', 'Reporte de actualizaciones', $reports, 'api');
$reportSubstitutions = $this->onPermission('reports.substitutions.index', 'Reporte de sustituciones', $reports, 'api');
@ -117,12 +117,12 @@ public function run(): void
$reportSearchRecords = $this->onPermission('reports.search_records.index', 'Reporte de consulta nacional', $reports, 'api');
// === ACTIVIDAD ===
$activities = PermissionType::firstOrCreate(['name' => 'Actividad']);
$activities = PermissionType::updateOrCreate(['name' => 'Actividad']);
$activityIndex = $this->onPermission('activities.index', 'Ver actividad de usuarios', $activities, 'api');
// === CAJAS ===
$packages = PermissionType::firstOrCreate(['name' => 'Cajas']);
$packages = PermissionType::updateOrCreate(['name' => 'Cajas']);
[
$packageIndex,
@ -134,7 +134,7 @@ public function run(): void
$packageBoxTags = $this->onPermission('packages.box_tags', 'Ver constancias de caja', $packages, 'api');
// === CONSTANCIAS DE INSCRIPCIÓN ===
$tags = PermissionType::firstOrCreate(['name' => 'Constancias de Inscripción']);
$tags = PermissionType::updateOrCreate(['name' => 'Constancias de Inscripción']);
[
$tagIndex,

View File

@ -2,7 +2,7 @@
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Constancia Cancelada - REPUVE Tabasco</title>
<title>Constancia Dañada - REPUVE Tabasco</title>
<style>
@page {
margin: 2cm 1.5cm;

View File

@ -2,7 +2,7 @@
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Constancia Cancelada - REPUVE Tabasco</title>
<title>Constancia Dañada - REPUVE Tabasco</title>
<style>
@page {
margin: 2cm 1.5cm;
@ -100,7 +100,7 @@
<!-- Subheader -->
<div class="subheader">
CONSTANCIA CANCELADA
CONSTANCIA DAÑADA
</div>
<!-- Espacio para pegar constancia -->
@ -125,9 +125,13 @@
<td class="data-value">{{ $cancellation['tag_number'] ?? 'N/A' }}</td>
</tr>
<tr class="data-row">
<td class="data-label">PLACA:</td>
<td class="data-label">PLACAS</td>
<td class="data-value">{{ $cancellation['placa'] ?? 'N/A' }}</td>
</tr>
<tr class="data-row">
<td class="data-label">NIV</td>
<td class="data-value">{{ $cancellation['niv'] ?? 'N/A' }}</td>
</tr>
<tr class="data-row">
<td class="data-label">MOTIVO:</td>
<td class="data-value">{{ mb_strtoupper($cancellation['motivo'] ?? '') }}</td>