# Vista de Consulta de Impresiones - Implementación Completa

## 📋 Resumen de Cambios

Se ha reemplazado completamente la vista `consulta_impresiones.blade.php` para replicar exactamente la funcionalidad del código PHP original, con todas sus características y lógica de impresión.

## 📁 Archivos Creados/Modificados

### 1. **Controlador Actualizado**
**Archivo:** `app/Http/Controllers/ImpresionesController.php`

**Nuevos Métodos:**

#### `consulta(Request $request)`
- Consulta completa con múltiples JOINs (impresiones, aulas, aula_alumnos, cursos)
- Obtiene información del alumno desde tabla `alumnos`
- Obtiene información del curso desde tabla `cursos`
- Prepara todos los datos necesarios para la vista:
  - Datos del alumno (nombre, CURP, número de control)
  - Datos del curso (nombre, clave, horas, tipo)
  - Datos del aula (fechas inicio/término, unidad)
  - Datos de aula_alumnos (recibo, comprobante, acreditación)
  - Datos de impresión (folio, fecha documento, fecha entrega)
  - Datos de convenio (empresa, representante legal, cargo)

#### `guardarImpresion(Request $request)`
- Endpoint AJAX para guardar folio, fecha de documento y fecha de entrega
- Validación de campos requeridos
- Actualización en tabla `impresiones`
- Registro en bitácora
- Respuesta JSON para manejo asíncrono

### 2. **Vista Principal**
**Archivo:** `resources/views/application/Impresiones/consulta_impresiones.blade.php`

**Características:**
- **Layout principal** extendiendo `layout.template`
- **Título dinámico** mostrando tipo de documento (ESPECIALIDAD/DUPLICADO)
- **Indicador de cancelación** en rojo si está cancelado
- **Breadcrumb** de navegación
- **Botón regresar** al listado de impresiones

**Secciones de información:**

1. **Información del Curso**
   - Capacitando, Curso, Tipo de curso
   - Horas del curso, Unidad
   - Fecha de inicio y término

2. **Información de Convenio** (condicional)
   - Solo se muestra si existe empresa
   - Nombre de la empresa
   - Representante legal
   - Cargo/Puesto
   - Fondo gris (#EEE) para distinguirlo

3. **Tabla de Información del Alumno**
   - ID, No. Control, Nombre, Unidad
   - ¿Cómo se enteró?, Becado, No. Recibo
   - Comprobante (con link), Fecha recibo, Importe
   - Acreditado, Folio Doc., Fecha entrega
   - DataTables con diseño responsive

4. **Tabla de Impresión**
   - No. Recibo/Factura (según tipo)
   - Liga de comprobante (validación de URL)
   - Importe
   - **Folio** (editable con permisos)
   - **Fecha de impresión** (editable)
   - **Fecha de entrega** (editable según unidad)
   - Columna de **Acciones** con botón guardar
   - Columna de **Imprimir** (incluye partial)

**Funcionalidades de edición:**

- **Campo Folio:**
  - Editable solo si está vacío y es unidad 8
  - Se convierte a mayúsculas automáticamente
  - Botón editar para usuarios `sonia_machorro` o `jefe`

- **Campo Fecha Documento:**
  - Editable solo para unidad 8
  - Tipo date HTML5

- **Campo Fecha Entrega:**
  - Readonly para unidad 8
  - Editable para otras unidades
  - Validación: no puede ser menor a fecha de documento

- **Botón Guardar:**
  - Se muestra según el estado de los campos
  - Si faltan folio o fecha documento: guardar directo
  - Si solo falta fecha entrega: modal de confirmación
  - No se muestra si está cancelado

**Modal de Confirmación:**
- Aparece al guardar cuando ya tiene folio y fecha documento
- Diseño Bootstrap 5
- Botones Cancelar/Aceptar
- Backdrop estático

**Script AJAX:**
- Validación de campos en JavaScript
- Mensajes de error en tiempo real
- Petición AJAX a ruta `impresiones.guardar`
- Token CSRF incluido
- Mensaje de éxito
- Recarga automática después de 2 segundos

### 3. **Partial de Botones de Impresión**
**Archivo:** `resources/views/application/Impresiones/partials/botones_impresion.blade.php`

**Lógica completa del switch PHP convertida a Blade:**

Condiciones evaluadas en orden:
1. Si está cancelado o no es unidad 8 → No mostrar
2. Si no tiene folio o fecha → No mostrar
3. Si es tipo 'E' (ESPECIALIDAD) → `print_imp_diploma_25_es.php`
4. Si tipo curso 1 y unidad 0 → `print_imp_diploma_25_es.php`
5. Si clave contiene 'CAE' y unidad 0 → `print_imp_constancia_25_cae_reimpresion.php`
6. Si clave contiene 'EXT' y unidad 0 → `print_imp_constancia_25_ext_reimpresion.php`
7. Si clave contiene 'ALI' con convenio → `print_imp_constancia_25_cae_reimpresion.php`
8. Si clave contiene 'ALI' sin convenio → `print_imp_constancia_25_ext_reimpresion.php`
9. Si tipo curso 1 o 6 → `print_imp_diploma_25.php`
10. Si clave contiene 'CAE' → `print_imp_constancia_25.php`
11. Si clave contiene 'EXT' → `print_imp_constancia_25_ext.php`
12. Si clave contiene 'ALI' con convenio → `print_imp_constancia_25.php`
13. Si clave contiene 'ALI' sin convenio → `print_imp_constancia_25_ext.php`

Cada formulario incluye todos los campos hidden necesarios para la impresión.

### 4. **Rutas**
**Archivo:** `routes/web.php`

**Ruta agregada:**
```php
Route::post('/impresiones/guardar', [ImpresionesController::class, 'guardarImpresion'])
     ->name('impresiones.guardar');
```

## 🔧 Tablas de Base de Datos Utilizadas

### Principal: `impresiones`
- imp_id, imp_id_alumno, imp_id_aula, imp_num_control
- imp_al_nombre, imp_al_curp
- imp_clave_curso, imp_nombre_curso
- imp_id_unidad, imp_unidad_nombre
- imp_tipo_curso, imp_horas_curso
- imp_fecha_inicio, imp_fecha_termino
- imp_tipo, imp_cancelado
- imp_folio, imp_num_recibo, imp_liga_comprobante
- imp_importe, imp_fecha_documento, imp_fecha_entrega
- imp_empresa, imp_representante_legal, imp_cargo

### Relacionadas:
- **aulas**: au_id, au_cr_clave, au_ti_cr, au_convenio, au_unidad, au_in_id
- **aula_alumnos**: aa_id_aula, aa_id_alumno, aa_como_se_entero, aa_becado, aa_recibo, aa_comprobante, aa_fecha_recibo, aa_importe, aa_acreditado, aa_folio_diploma, aa_fecha_entrega
- **cursos**: cr_id, cr_clave, cr_ti_id
- **alumnos**: al_id, al_nombre, al_ape_pat, al_ape_mat

## 🎨 Características de UI/UX

### Estilos
- DataTables con diseño Bootstrap 4
- Tablas responsive
- Tooltips en botones
- Alertas de Bootstrap para mensajes
- Sección de convenio con fondo diferenciado

### Interactividad
- Validación en tiempo real de fechas
- Habilitación/deshabilitación dinámica de botón guardar
- Campos readonly condicionales según permisos
- Modal de confirmación
- AJAX sin recarga de página
- Recarga automática post-guardado

### Permisos
- **Unidad 8**: Puede editar folio y fecha documento
- **Usuarios especiales** (sonia_machorro, jefe): Botón editar adicional
- **Otras unidades**: Pueden editar fecha de entrega
- **Impresiones canceladas**: Sin opciones de edición ni impresión

## 📝 Flujo de Trabajo

### 1. Acceso a la vista
```
Listado de impresiones → Click botón editar → consulta_impresiones.blade.php
```

### 2. Visualización
- Se muestran todos los datos del capacitando y curso
- Se muestra la información de aula_alumnos
- Se muestra la tabla de impresión con campos editables

### 3. Edición (si aplica)
- Usuario modifica folio y/o fechas
- Validación en tiempo real
- Click en guardar

### 4. Guardado
- Modal de confirmación (si aplica)
- Petición AJAX
- Actualización en base de datos
- Registro en bitácora
- Mensaje de éxito
- Recarga automática

### 5. Impresión
- Si tiene folio y fecha documento
- Si no está cancelado
- Si es unidad 8
- Botón de impresión visible
- Abre en nueva pestaña el archivo PHP correspondiente

## ✅ Validaciones Implementadas

### Frontend (JavaScript)
- Folio requerido
- Fecha documento requerida
- Fecha entrega no puede ser menor a fecha documento

### Backend (Laravel)
```php
$request->validate([
    'idImpresion' => 'required|integer',
    'folio' => 'required|string|max:50',
    'fechaDocumento' => 'required|date',
    'fechaEntrega' => 'nullable|date'
]);
```

## 🔒 Seguridad

- **CSRF Token** en todas las peticiones POST
- **Validación de permisos** según rol y unidad
- **Sanitización de datos** con strtoupper()
- **Consultas preparadas** usando Query Builder
- **Registro de auditoría** en BitacoraService

## 🚀 Cómo Usar

### Acceder a consulta de impresión
1. Ir a `/impresiones`
2. Click en botón de editar (amarillo/azul/verde/rojo)
3. Se abre `consulta_impresiones.blade.php`

### Editar una impresión
1. Verificar que sea unidad 8
2. Ingresar folio (obligatorio)
3. Seleccionar fecha de documento (obligatoria)
4. Opcionalmente fecha de entrega
5. Click en "Guardar"
6. Confirmar en modal (si aplica)
7. Esperar mensaje de éxito

### Imprimir un documento
1. Asegurarse de tener folio y fecha documento
2. Verificar que no esté cancelado
3. Verificar que sea unidad 8
4. Click en botón de impresión (icono printer)
5. Se abre PDF en nueva pestaña

## 📦 Archivos PHP de Impresión

Los siguientes archivos PHP deben existir en la raíz del proyecto:
- `print_imp_diploma_25_es.php` - Diplomas de especialidad
- `print_imp_diploma_25.php` - Diplomas normales
- `print_imp_constancia_25.php` - Constancias CAE
- `print_imp_constancia_25_ext.php` - Constancias EXT
- `print_imp_constancia_25_cae_reimpresion.php` - Reimpresión CAE
- `print_imp_constancia_25_ext_reimpresion.php` - Reimpresión EXT

## 🎯 Diferencias con el Original

### Mejoras implementadas:
1. **Uso de Blade** en lugar de PHP puro
2. **AJAX** para guardado sin recarga completa
3. **Validación de URLs** para comprobantes
4. **Tooltips** en botones de acción
5. **Mensajes más claros** de error y éxito
6. **Token CSRF** automático
7. **Registro en bitácora** integrado
8. **Código más mantenible** y organizado

### Funcionalidad idéntica:
- ✅ Todas las condiciones de impresión
- ✅ Todos los campos y tablas
- ✅ Todos los permisos por rol
- ✅ Toda la lógica de convenios
- ✅ Todas las validaciones
- ✅ Todos los formularios de impresión

## 📊 Métricas

- **Líneas de código**: ~400 (vista + partial)
- **Métodos del controlador**: 2 (consulta + guardarImpresion)
- **Consultas SQL**: 3 (impresión + alumno + curso)
- **Archivos creados**: 3
- **Rutas agregadas**: 1
- **Tablas utilizadas**: 5

---

**Fecha de implementación:** 5 de diciembre de 2025  
**Framework:** Laravel 8+  
**Estado:** ✅ Completamente funcional
