# Sistema de Actualización de Datos - Informados CV

Sistema web móvil para que los trabajadores actualicen su información personal y educativa mediante un enlace encriptado único, similar al sistema de vales de sistvales.

## Características

### Formulario Web Público (Mobile-First)

- **Acceso seguro**: Mediante código encriptado AES-256-CBC (misma encriptación que sistvales)
- **Diseño móvil optimizado**: Interfaz tipo Rappi/PedidosYa, responsive y táctil
- **Tecnología**: Livewire + Alpine.js para interactividad sin recargas
- **Dos secciones con tabs animados**:
  - **Datos Personales**: Dirección completa con mapa interactivo (Leaflet/OpenStreetMap), teléfonos, contacto de emergencia
  - **Datos Educativos**: Nivel educativo, institución, carrera, estado, carga de documentos con drag & drop

### Mapa Interactivo Mejorado

- Visualización de ubicación con **Leaflet** y **OpenStreetMap**
- **Marcador personalizado** arrastrable con diseño moderno
- **Geocodificación automática en tiempo real** al escribir la dirección
- Click directo en el mapa para ajustar ubicación
- Almacena latitud/longitud con 6 decimales de precisión
- Optimizado para pantallas táctiles móviles

### Gestión en CMS (Filament)

- Recurso completo: **WorkerDataUpdateResource**
- Listado con filtros por estado, tipo, fecha
- Tabs: Todas, Pendientes, Aprobadas, Auto-aprobadas, Rechazadas
- Badges con contadores en navegación
- Acciones: Aprobar, Rechazar (con notas), Eliminar
- Auditoría completa: IP, user agent, fechas, usuario revisor

## Instalación

### 1. Ejecutar Migraciones

```bash
# IMPORTANTE: Requiere PHP 8.3+
# Si usas Herd, asegúrate de tener PHP 8.3 configurado para este proyecto

php artisan migrate
```

Esto creará:
- Nuevos campos en `user_workers`: address, district, province, department, latitude, longitude, phone, mobile_phone, emergency_contact_name, emergency_contact_phone, education_level, education_institution, education_career, education_status, education_documents
- Nueva tabla `worker_data_updates`: para historial de actualizaciones

### 2. Crear Enlace Simbólico de Storage (si no existe)

```bash
php artisan storage:link
```

### 3. Verificar Permisos

Asegúrate de que Laravel pueda escribir en:
```bash
chmod -R 775 storage/app/public
chmod -R 775 storage/app/public/worker-documents
```

## Uso

### Generar Enlace para un Trabajador

**Método 1: Ruta de desarrollo (solo en local)**

Visita en tu navegador:
```
http://localhost:8000/dev/generar-codigo/{registro}
```

Ejemplo:
```
http://localhost:8000/dev/generar-codigo/T001234
```

Esto devolverá JSON con:
```json
{
  "register": "T001234",
  "codigo": "codigo_encriptado_base64...",
  "url": "http://localhost:8000/trabajadores/actualizar/codigo_encriptado_base64..."
}
```

**Método 2: PHP Artisan Tinker**

```bash
php artisan tinker
```

```php
$key = "bitlab_CV_2020";
$iv = "bitlab_YOP_2020";
$register = "T001234"; // Cambiar por registro real

$string = "BitLab&{$register}";
$encrypt_method = "AES-256-CBC";
$key_hash = hash('sha256', $key);
$iv_hash = substr(hash('sha256', $iv), 0, 16);
$codigo = base64_encode(openssl_encrypt($string, $encrypt_method, $key_hash, 0, $iv_hash));

echo "URL: " . url("/trabajadores/actualizar/{$codigo}");
```

**Método 3: Crear un comando Artisan (recomendado para producción)**

Puedes crear un comando que genere enlaces para todos los trabajadores y los envíe por email.

### Compartir el Enlace

Envía la URL generada al trabajador por:
- Email corporativo
- SMS
- WhatsApp corporativo
- Sistema de notificaciones de la app móvil

### Trabajador Actualiza sus Datos

1. Accede al enlace único
2. Ve su información actual pre-cargada
3. Modifica los datos necesarios
4. Datos personales: Ajusta ubicación en mapa si es necesario
5. Datos educativos: Carga documentos (PDF, JPG, PNG hasta 5MB)
6. Guarda cambios → **Se aplican automáticamente** (auto-aprobación)

### Administrador Revisa en CMS

1. Accede a `/admin/worker-data-updates`
2. Revisa el historial de todas las actualizaciones
3. Filtra por estado, tipo, fecha, trabajador
4. Puede aprobar/rechazar manualmente si se desactiva auto-aprobación
5. Ve todos los cambios realizados con auditoría completa

## Configuración Avanzada

### Cambiar a Aprobación Manual

Edita `app/Http/Controllers/PublicWorkerDataController.php`:

**Datos Personales** (línea ~130):
```php
// Cambiar de:
$update->autoApprove();

// A:
// $update->autoApprove(); // Comentar o eliminar
// Ahora requiere aprobación manual en Filament
```

**Datos Educativos** (línea ~220):
```php
// Cambiar de:
$update->autoApprove();

// A:
// $update->autoApprove(); // Comentar o eliminar
```

### Personalizar Campos Educativos

Edita las opciones del select en:
`resources/views/public/worker-data/partials/education-form.blade.php`

### Integrar con Sistema de Notificaciones

Puedes agregar notificaciones push cuando:
- Un trabajador actualiza sus datos
- Un admin aprueba/rechaza una actualización

## Arquitectura

### Modelos

- **UserWorker**: Modelo principal con campos nuevos de dirección y educación
- **WorkerDataUpdate**: Historial de actualizaciones con JSON para datos

### Controladores

- **PublicWorkerDataController**: Maneja el acceso seguro mediante código encriptado

### Componentes Livewire

- **PersonalDataForm**: Formulario reactivo de datos personales con validación en tiempo real
- **EducationDataForm**: Formulario educativo con carga de archivos mediante Livewire

### Rutas Públicas

```php
GET  /trabajadores/actualizar/{codigo}     // Ver formulario (requiere código encriptado)
GET  /dev/generar-codigo/{register}        // Generar código (solo local)
```

### Vistas

- `resources/views/public/worker-data/index-mobile.blade.php` - Vista principal mobile-first con tabs
- `resources/views/livewire/worker-data-update/personal-data-form.blade.php` - Componente Livewire de datos personales + mapa
- `resources/views/livewire/worker-data-update/education-data-form.blade.php` - Componente Livewire de datos educativos + documentos

### Filament Resource

- `app/Filament/Resources/WorkerDataUpdateResource.php` - Recurso completo de Filament
- `app/Filament/Resources/WorkerDataUpdateResource/Pages/` - Páginas del recurso

## Seguridad

### Encriptación

- **AES-256-CBC** con claves fijas compatibles con sistvales
- Formato: `BitLab&{register}` → Base64
- Validación de formato en cada request

### Validación de Archivos

- Solo PDF, JPG, JPEG, PNG
- Máximo 5MB por archivo
- Almacenados en `storage/app/public/worker-documents/{register}/`

### Auditoría

Cada actualización registra:
- IP del usuario
- User agent del navegador
- Fecha y hora exacta
- Usuario administrador que revisó (si aplica)
- Notas de aprobación/rechazo

## Características Técnicas Mobile-First

### Optimizaciones Móviles

- **Diseño responsive**: Se adapta a cualquier tamaño de pantalla
- **Theme color**: Color azul en la barra de navegación del navegador
- **Touch optimizado**: Áreas táctiles de mínimo 44x44px
- **Viewport fijo**: `maximum-scale=1, user-scalable=no` para prevenir zoom accidental
- **Scrollbar oculto**: Experiencia más limpia en iOS
- **Font smoothing**: Tipografía optimizada para pantallas retina

### Interactividad con Livewire

- **Sin recargas de página**: Toda la interacción es dinámica
- **Validación en tiempo real**: Errores se muestran instantáneamente
- **Loading states**: Indicadores visuales durante operaciones
- **Wire:model.live.debounce**: Geocodificación optimizada con debounce de 500ms
- **File uploads**: Carga de documentos con barra de progreso

### Animaciones y Transiciones

- **Tabs animados**: Indicador deslizante con cubic-bezier
- **Fade in**: Mensajes de éxito con animación
- **Slide in**: Contenido de tabs con transición suave
- **Loading spinners**: Animaciones mientras se guardan datos

### Componentes UI Modernos

- **Gradientes**: Headers con gradientes de colores según sección
- **Iconos SVG**: Sin dependencias externas, inline para performance
- **Radio buttons personalizados**: Selección visual de estado educativo
- **Drag & drop**: Zona de carga de archivos con feedback visual
- **Sticky elements**: Header y tabs fijos durante scroll

## Próximas Mejoras

- [ ] Comando Artisan para generar enlaces masivos
- [ ] Envío automático de emails con enlaces
- [ ] Integración con notificaciones push de la app móvil
- [ ] Historial de cambios por campo (diff)
- [ ] Validación de documentos por tipo (título, certificado, etc.)
- [ ] Expiración de enlaces después de X días
- [ ] Límite de actualizaciones por período
- [ ] Notificación al trabajador cuando admin aprueba/rechaza
- [ ] PWA (Progressive Web App) para instalación en home screen
- [ ] Modo offline con sincronización posterior
- [ ] Compresión automática de imágenes antes de subir

## Soporte

Para dudas o problemas, contacta al equipo de desarrollo.
