Importación Facturas Genérico¶
Autor: Iker
Selector: app-importacion-facturas-generico
Ubicación: SitioLogiGho/src/app/components/importacion-facturas-generico
¿Qué hace?¶
Modal reutilizable para importar facturas de cualquier transportadora al sistema. Recibe una TransportadoraStrategy como @Input() y usa su configuración para descargar la plantilla Excel desde S3, leer el archivo subido por el usuario, mapear sus columnas y insertar los registros en la colección MongoDB correspondiente por lotes de 5000.
Este componente reemplaza el patrón de un componente de importación por transportadora. Cualquier transportadora nueva que use el patrón Strategy lo reutiliza sin modificarlo.
Roles y acceso¶
| Acceso | Descripción |
|---|---|
| Autenticado | Requiere login |
| Rol específico | Requiere rol: controller |
Estructura de archivos¶
importacion-facturas-generico/
├── importacion-facturas-generico.component.ts
├── importacion-facturas-generico.component.html
└── importacion-facturas-generico.component.scss
Inputs y Outputs¶
| Propiedad | Tipo | Default | Descripción |
|---|---|---|---|
strategy |
TransportadoraStrategy |
requerido | Configuración y lógica de la transportadora: colección, campos, plantilla, mapeo |
isOpen |
boolean |
false |
Controla si el modal está visible. Al pasar a true descarga la plantilla automáticamente |
closeEvent |
EventEmitter<void> |
— | Emitido cuando el modal se cierra (por el usuario o al finalizar la inserción) |
refreshDataEvent |
EventEmitter<void> |
— | Disponible para que el padre recargue sus datos tras una inserción exitosa |
Propiedades internas¶
| Propiedad | Tipo | Default | Descripción |
|---|---|---|---|
form |
FormGroup |
{ archivo: '' } |
Formulario reactivo que controla el input de archivo |
isLoading |
boolean |
false |
Muestra el estado de carga durante la descarga de plantilla o inserción |
fileToUpload |
File \| null |
null |
Archivo Excel seleccionado por el usuario |
uploadProgress |
number |
0 |
Porcentaje de progreso de inserción (0–100) |
currentBatch |
number |
0 |
Número de lote que se está procesando actualmente |
totalBatches |
number |
0 |
Total de lotes calculados según el tamaño del archivo |
fileName |
string |
'' |
Nombre del archivo de plantilla descargado desde S3 |
fileBlob |
Blob |
— | Contenido binario de la plantilla para permitir su descarga |
Métodos¶
ngOnChanges(changes: SimpleChanges): void¶
Descripción: Detecta cuando isOpen cambia a true y dispara la descarga de la plantilla automáticamente.
Proceso:
1. Detecta cambio en isOpen
2. Si el nuevo valor es true, llama a obtenerPlantilla()
obtenerPlantilla(): void¶
Descripción: Descarga la plantilla Excel desde el bucket S3 logigho-plantillas usando el nombre definido en strategy.plantillaFileName.
Proceso:
1. Activa isLoading = true
2. Llama a GetObjectService.obtenerObjeto() con bucket logigho-plantillas y strategy.plantillaFileName
3. Convierte la respuesta base64 a Blob con base64ToBlob()
4. Guarda el blob en fileBlob para descarga posterior
5. Desactiva isLoading
onPlantillaClick(): void¶
Descripción: Permite al usuario descargar la plantilla Excel en su equipo creando un enlace temporal con el Blob guardado.
onFileChangeCarga(event: any): void¶
Descripción: Captura el archivo seleccionado en el input y lo asigna a fileToUpload.
Parámetros:
- event — Evento del input type="file"
uploadFile(): void¶
Descripción: Procesa el archivo Excel subido por el usuario y lanza la inserción en MongoDB.
Proceso:
1. Valida que existe un archivo seleccionado
2. Lee el archivo con FileReader en modo binario
3. Parsea el Excel con XLSX y extrae encabezados y filas
4. Mapea los encabezados del Excel a campos de MongoDB usando strategy.columnMapping
5. Filtra filas vacías
6. Fuerza a string el campo definido en strategy.campoGuia para preservar ceros iniciales (ej: IDFACTURA: "0005090781")
7. Llama a procesarInsercionPorLotes() con los registros mapeados
close(): void¶
Descripción: Cierra el modal, resetea el formulario y emite closeEvent al componente padre.
resetFileInput(): void¶
Descripción: Limpia el valor del input de archivo en el DOM para permitir subir el mismo archivo nuevamente.
base64ToBlob(base64: string, mimeType: string): Blob (privado)¶
Descripción: Convierte un string base64 (recibido del API) a un objeto Blob descargable.
Parámetros:
- base64 — String base64 con prefijo separado por |
- mimeType — Tipo MIME del archivo resultante
Retorna: Blob con el contenido binario del archivo
procesarInsercionPorLotes(registros: any[], coleccion: string): Promise<void> (privado)¶
Descripción: Inserta los registros en MongoDB en lotes de 5000 de forma recursiva y secuencial, actualizando el progreso en cada lote.
Parámetros:
- registros — Array completo de objetos a insertar
- coleccion — Endpoint con la colección destino (metodoGenerico?coleccion=FacturacionServientrega)
Proceso:
1. Calcula el total de lotes (Math.ceil(registros.length / 5000))
2. Por cada lote: llama a insertarGenerico(), actualiza uploadProgress y llama al siguiente lote de forma recursiva
3. Al terminar todos los lotes: muestra alerta de éxito, resetea el input y cierra el modal
4. En caso de error: muestra alerta, resetea el progreso y el input
Flujo principal¶
Usuario abre modal (isOpen = true)
→ ngOnChanges()
→ obtenerPlantilla() → descarga plantilla desde S3
Usuario selecciona archivo
→ onFileChangeCarga() → guarda archivo en fileToUpload
Usuario hace click en "Cargar"
→ uploadFile()
→ FileReader.readAsBinaryString()
→ XLSX.read() → parsea el Excel
→ mapear columnas → strategy.columnMapping
→ filtrar vacíos
→ procesarInsercionPorLotes()
→ lote 1 → insertarGenerico() → uploadProgress 33%
→ lote 2 → insertarGenerico() → uploadProgress 66%
→ lote N → insertarGenerico() → uploadProgress 100%
→ Swal éxito → close()
Dependencias externas¶
| Librería | Versión | Uso |
|---|---|---|
| XLSX (SheetJS) | ^0.18 | Lectura y parseo de archivos Excel |
| sweetalert2 | ^11.x | Alertas de éxito, advertencia y error |
Servicios Angular utilizados¶
| Servicio | Métodos usados | Propósito |
|---|---|---|
ConsumoGenericoService |
insertarGenerico() |
Inserción de registros en MongoDB |
GetObjectService |
obtenerObjeto() |
Descarga de la plantilla Excel desde S3 |
FormBuilder |
group() |
Construcción del formulario reactivo |
Estilos¶
Este componente hereda los estilos globales del sistema. No define variables SCSS propias.
Animaciones¶
| Animación | Duración | Uso |
|---|---|---|
| — | — | Sin animaciones propias |
Subcomponentes¶
Este componente no tiene subcomponentes. Es un componente hoja.
Cómo usarlo desde un componente padre¶
// En el .ts del padre
readonly miStrategy = TransportadoraFactory.crear('servientrega');
isModalOpen = false;
openModal() { this.isModalOpen = true; }
closeModal() { this.isModalOpen = false; }
<!-- En el .html del padre -->
<app-importacion-facturas-generico
[strategy]="miStrategy"
[isOpen]="isModalOpen"
(closeEvent)="closeModal()">
</app-importacion-facturas-generico>
<button (click)="openModal()">Cargar Facturas</button>
Changelog del componente¶
| Fecha | Autor | Cambio |
|---|---|---|
| 2026-03-23 | Iker | Creación del componente genérico como parte de la implementación del patrón Strategy para transportadoras |
| 2026-05-02 | Adalberto | Validación estricta de columnas en importacion-facturas-generico: si el archivo Excel tiene columnas faltantes o no reconocidas respecto a columnMapping, se muestra 'Documento no válido' y se aborta la inserción sin tocar MongoDB. |
| 2026-05-02 | Adalberto | Filtro de fila totales en importacion-facturas-generico: se descartan filas donde cualquier celda sea exactamente 'total' (case-insensitive) antes de insertar. |
Observaciones¶
- El componente asume que la plantilla existe en el bucket S3
logigho-plantillascon el nombre exacto definido enstrategy.plantillaFileName. Si no existe, mostrará una advertencia pero no bloqueará el flujo de carga. - El tamaño de lote está fijado en 5000 registros (
TAMANO_LOTE = 5000). Si se necesita ajustar, modificar la constante enprocesarInsercionPorLotes. refreshDataEventestá declarado pero no está siendo emitido actualmente. El componente padre recarga los datos vía el evento(updated)del componenteapp-tables. Pendiente evaluar si se necesita.