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_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MYSQL_PASSWORD: ${DB_PASSWORD} MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_USER: ${DB_USERNAME} MYSQL_USER: ${DB_USERNAME}
ports:
- "${DB_FORWARD_PORT}:3306"
volumes: volumes:
- mysql_data:/var/lib/mysql - mysql_data:/var/lib/mysql
networks: networks:

View File

@ -350,8 +350,8 @@ public function cancelarTagNoAsignado(Request $request)
'motivo' => ($lastCancellation->cancellationReason && isset($lastCancellation->cancellationReason->name)) 'motivo' => ($lastCancellation->cancellationReason && isset($lastCancellation->cancellationReason->name))
? $lastCancellation->cancellationReason->name ? $lastCancellation->cancellationReason->name
: 'No especificado', : 'No especificado',
'operador' => ($lastCancellation->cancelledBy && isset($lastCancellation->cancelledBy->name)) 'operador' => ($lastCancellation->cancelledBy && isset($lastCancellation->cancelledBy->full_name))
? $lastCancellation->cancelledBy->name ? $lastCancellation->cancelledBy->full_name
: 'Sistema', : 'Sistema',
'modulo' => ($tag->module && isset($tag->module->name)) ? $tag->module->name : 'No especificado', 'modulo' => ($tag->module && isset($tag->module->name)) ? $tag->module->name : 'No especificado',
'ubicacion' => ($tag->module && isset($tag->module->address)) ? $tag->module->address : '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'), 'responsible_id' => $request->input('responsible_id'),
'municipality_id' => $request->input('municipality_id'), 'municipality_id' => $request->input('municipality_id'),
'address' => $request->input('address'), 'address' => $request->input('address'),
'colony' => $request->input('colony'),
'cp' => $request->input('cp'),
'longitude' => $request->input('longitude'), 'longitude' => $request->input('longitude'),
'latitude' => $request->input('latitude'), 'latitude' => $request->input('latitude'),
'status' => $request->input('status', true), // Por defecto activo 'status' => $request->input('status', true), // Por defecto activo
@ -99,8 +97,6 @@ public function store(ModuleStoreRequest $request)
'name' => $module->municipality->name, 'name' => $module->municipality->name,
] : null, ] : null,
'address' => $module->address, 'address' => $module->address,
'colony' => $module->colony,
'cp' => $module->cp,
'longitude' => $module->longitude, 'longitude' => $module->longitude,
'latitude' => $module->latitude, 'latitude' => $module->latitude,
'status' => $module->status ? 'Activo' : 'Inactivo', 'status' => $module->status ? 'Activo' : 'Inactivo',
@ -170,8 +166,6 @@ public function update(ModuleUpdateRequest $request, int $id)
'name' => $module->municipality->name, 'name' => $module->municipality->name,
] : null, ] : null,
'address' => $module->address, 'address' => $module->address,
'colony' => $module->colony,
'cp' => $module->cp,
'longitude' => $module->longitude, 'longitude' => $module->longitude,
'latitude' => $module->latitude, 'latitude' => $module->latitude,
'status' => $module->status ? 'Activo' : 'Inactivo', 'status' => $module->status ? 'Activo' : 'Inactivo',

View File

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

View File

@ -19,8 +19,7 @@ public function rules(): array
'responsible_id' => ['required', 'exists:users,id'], 'responsible_id' => ['required', 'exists:users,id'],
'municipality_id' => 'required|exists:municipalities,id', 'municipality_id' => 'required|exists:municipalities,id',
'address' => ['required', 'string', 'max:255'], 'address' => ['required', 'string', 'max:255'],
'colony' => ['required', 'string', 'max:100'],
'cp' => ['nullable', 'string', 'max:10'],
'longitude' => ['nullable', 'numeric', 'between:-180,180'], 'longitude' => ['nullable', 'numeric', 'between:-180,180'],
'latitude' => ['nullable', 'numeric', 'between:-90,90'], 'latitude' => ['nullable', 'numeric', 'between:-90,90'],
'status' => ['nullable', 'boolean'], 'status' => ['nullable', 'boolean'],
@ -38,11 +37,7 @@ public function messages(): array
'address.required' => 'La dirección es requerida', 'address.required' => 'La dirección es requerida',
'address.string' => 'La dirección debe ser una cadena de texto', 'address.string' => 'La dirección debe ser una cadena de texto',
'address.max' => 'La dirección no debe superar los 255 caracteres', '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.numeric' => 'La longitud debe ser un número',
'longitude.between' => 'La longitud debe estar entre -180 y 180', 'longitude.between' => 'La longitud debe estar entre -180 y 180',
'latitude.numeric' => 'La latitud debe ser un número', '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'))], 'name' => ['nullable', 'string', 'max:50', Rule::unique('modules', 'name')->ignore($this->route('module'))],
'municipality_id' => ['nullable', 'integer', 'exists:municipalities,id'], 'municipality_id' => ['nullable', 'integer', 'exists:municipalities,id'],
'responsible_id' => ['nullable', 'integer', 'exists:users,id'], 'responsible_id' => ['nullable', 'integer', 'exists:users,id'],
'address' => ['nullable', 'string', 'max:50'], 'address' => ['nullable', 'string', 'max:250'],
'colony' => ['nullable', 'string', 'max:100'],
'cp' => ['nullable', 'string', 'max:10'],
'longitude' => ['nullable', 'numeric', 'between:-180,180'], 'longitude' => ['nullable', 'numeric', 'between:-180,180'],
'latitude' => ['nullable', 'numeric', 'between:-90,90'], 'latitude' => ['nullable', 'numeric', 'between:-90,90'],
'status' => ['nullable', 'boolean'], 'status' => ['nullable', 'boolean'],
@ -39,10 +38,7 @@ public function messages(): array
'responsible_id.exists' => 'El responsable seleccionado no existe', 'responsible_id.exists' => 'El responsable seleccionado no existe',
'address.string' => 'La dirección debe ser texto', 'address.string' => 'La dirección debe ser texto',
'address.max' => 'La dirección no debe superar los 50 caracteres', '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.numeric' => 'La longitud debe ser un número',
'longitude.between' => 'La longitud debe estar entre -180 y 180', 'longitude.between' => 'La longitud debe estar entre -180 y 180',
'latitude.numeric' => 'La latitud debe ser un número', 'latitude.numeric' => 'La latitud debe ser un número',

View File

@ -14,8 +14,6 @@ class Module extends Model
'responsible_id', 'responsible_id',
'municipality_id', 'municipality_id',
'address', 'address',
'colony',
'cp',
'longitude', 'longitude',
'latitude', 'latitude',
'status', '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 LADO LATERAL DEL VEHÍCULO',
'FOTO UBICACIÓN DEL VIN', 'FOTO UBICACIÓN DEL VIN',
'FOTO CONSTANCIA DE INSCRIPCIÓN PEGADA (CI MORADA O AZUL)', 'FOTO CONSTANCIA DE INSCRIPCIÓN PEGADA (CI MORADA O AZUL)',
'FORMATO DE CONSTANCIA DE SUSTITUCIÓN', 'FORMATO DE CONSTANCIA SUSTITUIDA',
'EVIDENCIA ADICIONAL', 'EVIDENCIA ADICIONAL',
]; ];

View File

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

View File

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

View File

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