# Perfiles de Importación ##### Descripción En general desde los sistemas podemos exportar información estructurada (p.ej. en archivos de texto delimitados por comas o archivos de Excel), lo que es una buena alternativa cuando deseamos hacer una migración de datos y evitar transcribir información de un sistema a otro . También es deseable permitir alternativas a teclear la información usando las pantallas del sistema, por ejemplo, cuando la información se repite cada mes con pequeñas variantes. En este caso podemos guardar un archivo de origen, copiarlo y hacer las modificaciones con una herramienta adecuada (p.ej. Excel) y luego importar la información al Q3. Cada origen de datos que usamos para cargar información tiene una estructura definida que raramente cambia, por lo que guardamos el perfil en el sistema para usarlo cada vez que tengamos información que cargar. Para esto necesitamos configurar cada perfil en nuestro sistema para especificar cómo está estructurada la información, qué datos vienen, dónde los queremos guardar y qué sucede si la información que queremos cargar ya existe en el sistema. Para esto sirven los perfiles de importación, para definir la estructura de un origen de datos a importar al Q3, por ejemplo un estado de cuenta en formato CSV o un excel de ventas emitidas descargado de la Agencia Virtual SAT. Tenemos entonces los siguientes conceptos:
Origen de datos El archivo de origen que queremos cargar al sistema.
Destino de datos El tipo de documento que estamos cargando, p.ej. transacciones bancarias o compras.
Perfil de Importación Estructura de un origen de datos y configuración de cómo cargarlo al destino de datos.
##### Implementación El método que usamos tiene el siguiente orden: 1. Extraer: cargar desde el archivo a una tabla intermedia 2. Transformar: validar, limpiar y enriquecer los datos en la tabla intermedia 3. Cargar: guardar los datos transformados de la tabla intermedia a la(s) tabla(s) de destino Los perfiles de importación se consideran configuración del sistema, por lo que son accesibles en los Parámetros Generales. Cada perfil de importación tiene: 1. Un mapeo de columnas de origen y destino para la extracción 2. Una tabla intermedia según el destino 3. Una lista de acciones con orden, descripción y el comando SQL a ejecutar en la tabla de destino Puede existir cualquier cantidad de perfiles de importación, por defecto el sistema incluye los necesarios para la carga inicial o migración de datos para implementaciones.

La validación, transformación y carga se hace en el servidor, lo único que debe hacer la aplicación es cargar las líneas del archivo a la tabla intermedia.

Estos son los campos del perfil de importación y su uso:
**Campo** **Descripción**
Descripción El nombre del perfil.
Destino Lo que estamos importando, internamente se guardan en la tabla clases bajo 'importar.destinos' y la columna código de esa tabla es el nombre de la tabla intermedia.
Tipo de archivo El tipo de archivo puede ser CSV, XLS o XLSX.
Codificación Para archivos tipo CSV ya que los archivos de texto tiene una codificación específica, usualmente son UTF-8.
Delimitador de columna Para archivos tipo CSV, es el delimitador de columna utilizado en cada línea del archivo.
Delimitador de texto Para archivos tipo CSV, dentro de cada columna, cuando el valor de la columna incluye el caracter usado como delimitador de columna se delimita la columna con este caracter, p.ej. si el delimitador es una coma (,) y una línea tiene los campos: <col1>, Empresa, S.A., <col2> debería aparecer en el archivo de texto como: <col1>,"Empresa, S.A.",<col2> para evitar errores de lectura. En este caso el delimitador de columna es una coma (,) y el delimitador de texto es una doble comilla (").
Columnas por fila La cantidad total de columnas que tiene cada línea (o fila si es tipo excel), sirve para validar que todas las líneas vengan completas y sin datos adicionales. Aquí hay que poner la cantidad total de columnas que vienen aunque solo vayamos a importar algunas.
Fila encabezado La línea/fila que trae los nombres de las columnas en el archivo a cargar, usualmente la número 1.
Primera fila datos La línea/fila en la cual empiezan los datos, usualmente la número 2.
Número de hoja Para archvios tipo XLS y XLSX, es el número de hoja a importar, la primera hoja del archivo es la 1.
Estos son los campos de las columnas del perfil de importación y su uso:
**Campo** **Descripción**
Destino El nombre de la columna de destino, este nombre es el comentario de la columna de la tabla intermedia en la base de datos.
Índice columna origen La columna (comenzando con 1) de la columna de origen, esto lo usa el importador al cargar los datos del archivo a la tabla intermedia.
Columna de origen El nombre de la columna de origen, esto sirve solamente como información adicional.
Estos son los campos de las acciones del perfil de importación y su uso:
**Campo** **Descripción**
Orden Para definir la secuencia de acciones, porque las acciones modifican los datos de la tabla intermedia incrementalmente.
Descripción La descripción de la acción para referencia.
Comando El comando SQL que modifica la tabla intermedia, limpiando, eliminando o enriqueciendo los datos antes de importarlos. El sistema agrega automáticamente a cada comando una cláusula WHERE/AND lote='< código lote >'

La última acción debería ser un INSERT desde la tabla intermedia al destino e incluir el código del lote de operación

##### Destinos de Perfiles de Importación Para crear un nuevo destino hay que hacer lo siguiente: 1. Crear una tabla intermedia que incluya **todas** las columnas que importaremos a las tablas de destino, esta nueva tabla debe heredar de la tabla importar.intermedia y debe estar ubicada en el esquema importar. 2. Ponerle un comentario a todas las columnas de la tabla intermedia con un nombre descriptivo para el usuario, p.ej. si la columna se llama tipo\_documento, el comentario sería Tipo Documento. 3. Incluir el nuevo destino en la tabla clases y en el archivo sql/crear/clases.sql (buscar donde se insertan las clases con código 'importar.destinos'). La clase es 'importar.destinos', el código debe ser el nombre de la tabla (con esquema, p.ej. 'importar.transacciones'), y la descripción es como aparecerá en la lista de destinos en la interfaz gráfica, p.ej. 'Transacciones Bancarias'. 4. Agregar un ítem al menú Importar en Operaciones y hacer que se active con el permiso de editar el destino, p.ej. si estamos importando Gastos, le pondríamos de etiqueta 'Gastos' al ítem y se debe activar con el permiso (7, Gastos). ##### Permisos La premisa es: si tengo permiso para operar, tengo permiso para importar, p.ej. un usuario con el permiso de operar transacciones bancarias tendrá acceso a importar transacciones bancarias. Aparte, para poder editar perfiles de importación es necesario el permiso de parámetros generales. Por esto, todos los permisos necesarios ya existen, aquí está la lista:
**id** **Nombre** **Tipo**
11 Parámetros Generales Administración
17 Transacciones Bancarias Operación
##### Clases .NET
**Clase** **Carpetas** **Descripción**
PerfilImportacion gen/importar, src/importar Corresponde a importar.perfiles, incluye los métodos para leer los tipos de archivo a las tablas intermedias
ColumnaPerfilImportacion gen/importar, src/importarCorresponde a importar.perfiles\_columnas
AccionPerfilImportacion gen/importar, src/importarCorresponde a importar.perfiles\_acciones
##### Objetos DB
**Tipo** **Nombre** **Descripción**
Esquema importar Para agrupar todo lo de importar.
Tabla importar.perfiles Para guardar los perfiles.
Tabla importar.perfiles\_acciones
Tabla importar.perfiles\_columnas
Secuencia importar.perfiles\_id\_seq
Secuencia importar.perfiles\_columnas\_id\_seq
Secuencia importar.perfiles\_acciones\_id\_seq
Tabla importar.intermedia Tiene las columnas necesarias para que cualquier tabla intermedia funcione correctamente.
Tabla importar.transacciones La tabla intermedia para perfiles con destino de transacciones bancarias.
Función importar.codigo\_lote Genera el código del lote según la fecha, el usuario y el destino. Este código es importante para agrupar los datos en la tabla intermedia y luego en el destino.
Funciónimportar.crear\_columnas Al crear un nuevo perfil de importación, esta función jala los nombres de columna y sus comentarios para insertarlos en la tabla importar.perfiles\_columnas.
Funciónimportar.duplicar\_perfil Duplica el perfil recibido, incluyendo sus columnas y acciones.
Funciónimportar.validar\_y\_cargar\_lote Valida que el lote y el perfil estén correctos, luego ejecuta las acciones del perfil en la tabla intermedia.
##### Errores DB
**Código** **Descripción**
Q3005 Errores en importación
##### Pantallas
**Form** **Accesible desde** **Descripción**
Importar/PerfilesImportacion.vbParámetros Generales Para crear/editar/eliminar perfiles de importación
Importar/EditarPerfilImportacion.vb Perfiles Importación
Importar/EditarPerfilAccion.vb Editar Perfil Importación
Importar/ImportarPerfil.vb Operación Sirve para importar cualquier perfil de importación, se configura con PerfilImportacion.Destinos