06 · Documentación técnica
Cómo está construido
Referencia técnica de la Fase 1 para el personal de sistemas de la droguería y para quien opere el servicio. Describe la tecnología, la arquitectura, el ciclo de sincronización, las reglas, los controles, la configuración, los archivos y la verificación de calidad.
6.1Resumen técnico
PharmaSync Pro es un servicio de Windows que, cada 15 minutos, consulta la base de datos de SAINT Administrativo, construye el catálogo según las reglas de la droguería y publica seis archivos de texto delimitado en la carpeta que lee el portal SEPED/IKOMPRA. En esta fase el servicio es de solo lectura: no inserta, modifica ni borra nada en SAINT.
| Tipo de aplicación | Servicio de Windows, sin interfaz. También se puede ejecutar a mano para un solo ciclo. |
| Plataforma | .NET 10, lenguaje C# 13. Soporte de Microsoft a largo plazo. |
| Origen de datos | SAINT Administrativo sobre SQL Server. Ocho tablas, solo consulta. |
| Destino | Seis archivos TXT en la carpeta de subida del portal, según la especificación de Fulltech360. |
| Frecuencia | Un ciclo cada 15 minutos. Duración del ciclo con los datos actuales: 0,5 segundos. |
| Calidad | 81 pruebas automáticas. Compila sin advertencias. Verificación de la Fase 1 aprobada el 06-10-2026. |
| Dependencias externas | Ninguna fuera de las bibliotecas oficiales de Microsoft. Sin componentes con vulnerabilidades conocidas. |
6.2Pila tecnológica
| Componente | Tecnología | Para qué se usa |
|---|---|---|
| Lenguaje y plataforma | C# 13 · .NET 10 | Todo el código del servicio. Tipado estricto y advertencias tratadas como errores. |
| Servicio | Microsoft.Extensions.Hosting | Arranque como servicio de Windows, temporizador del ciclo, configuración y registro. |
| Acceso a datos | Microsoft.Data.SqlClient | Conexión cifrada a SQL Server. Consultas parametrizadas, solo lectura. |
| Configuración | appsettings.json | Reglas y parámetros editables sin recompilar. Se validan al arrancar. |
| Pruebas | xUnit | 81 pruebas de reglas, formato, escritura, configuración y controles. |
| Formato de salida | TXT delimitado · UTF-8 | Contrato SEPED/IKOMPRA. Separador, codificación y fin de línea configurables. |
| Verificación independiente | Python · SQL | Validador del formato de los TXT y cotejo de la salida contra SAINT, fuera del servicio. |
6.3Arquitectura
El servicio coordina tres módulos con una responsabilidad cada uno. Las reglas de negocio no tocan ni la base de datos ni el disco: reciben datos y devuelven archivos listos. Eso permite probarlas por completo sin SAINT.
| Módulo | Responsabilidad | Lo que no hace |
|---|---|---|
| PharmaSync.Service | Arranca como servicio, valida la configuración, ejecuta el ciclo cada 15 minutos, aplica el freno de publicación y registra todo con un identificador de ciclo. | No contiene reglas de negocio ni SQL. |
| PharmaSync.Saint | Lee de SAINT con seis consultas parametrizadas y entrega los datos en memoria. | No escribe en SAINT. No decide qué se publica. |
| PharmaSync.Core | Aplica las reglas: existencia, lote publicado, precio, moneda, tope, reparto producto/falla, formato de cada campo. | No accede a la base ni al disco. Por eso se prueba por completo sin SAINT. |
| PharmaSync.Seped | Escribe los archivos en una carpeta de trabajo y los mueve completos a la carpeta del portal, con reintentos. | No modifica el contenido que recibe. |
6.4Ciclo de sincronización
Secuencia completa de un ciclo. Recorra los pasos con los botones o reprodúzcalos en orden.
- Inicio del ciclo
- El servicio pide el catálogo
- Consultas a SAINT
- Respuesta de SAINT
- Datos en memoria
- Construcción del catálogo
- Archivos e incidencias
- Freno de publicación
- Orden de publicar
- Escritura y publicación
- Confirmación
- Cierre del ciclo
6.5Reglas de negocio
Cada regla tiene una condición, un resultado y, cuando aplica, el parámetro de configuración que la gobierna. Todas tienen pruebas automáticas.
| Regla | Condición | Resultado | Parámetro |
|---|---|---|---|
| Producto considerado | Activo en SAINT | Entra al catálogo: va a producto o a falla, nunca a los dos ni a ninguno | — |
| Lote publicable | Existencia mayor que cero, en un depósito de venta, no vencido | Cuenta en la existencia y sale en lotes.txt | DepositosVenta · PublicarLotesVencidos |
| Lote sin fecha | Sin fecha de vencimiento o con la fecha vacía de SAINT | Se trata como no vencido; en los archivos sale N/A | — |
| Existencia publicada | Suma de los lotes publicables del producto, sin decimales | Campos cantidad y cantreal | — |
| Lote que da el precio | Entre los lotes con precio válido, el de vencimiento más próximo; los sin fecha van al final; empate por número único | Campos lote, fecvence, precio1, precio2 y precio3 | — |
| Precio válido | Precio 1 mayor que cero y ninguno de los tres precios por encima del tope en dólares | Un lote inválido no da el precio y deja una incidencia | PrecioMaximoUsd |
| Producto en falla | Existencia cero, o con existencia pero sin ningún lote con precio válido | Va a prodfalla.txt; sus lotes no salen en lotes.txt | — |
| Moneda | Bolívares: precio del lote tal cual. Dólares: precio dividido entre el factor, a dos decimales | Campos de precio, moneda y factorcambiario; monedas.txt marca la preferida | Moneda |
| Refrigerado | Algún lote publicable en un depósito refrigerado | Campo refrigerado = 1 | DepositosRefrigerados |
| Tipo de producto | Categoría en la lista de misceláneos | Tipo C; el resto, M (medicamento) | InstanciasMiscelaneo |
| IVA | Exento, o porcentaje de SAINT | 0.00 para exentos; el porcentaje de SAINT para gravados | — |
| Texto | Cualquier campo de texto | Sin acentos, sin ñ, sin caracteres de control, sin el separador; recortado al largo del contrato | Separador |
6.6Controles y comportamiento ante fallos
El principio es fallar de forma visible y nunca publicar datos a medias o sin sentido.
| Situación | Qué hace el sistema | Qué queda en el registro |
|---|---|---|
| Precio fuera de rango en SAINT | El lote no da el precio. Si el producto no tiene otro lote válido, pasa a falla. Al corregir el precio, vuelve solo en el ciclo siguiente. | Incidencia con producto, lote, precio en Bs y en US$ y el tope. |
| Catálogo vacío o desplomado | No publica. Compara producto.txt nuevo con el publicado; frena si queda vacío o cae más del porcentaje admitido. | Error con las cifras comparadas y cómo levantar el freno si la caída es real. |
| Configuración inválida | El servicio no arranca. | Todos los errores de configuración, en lenguaje llano, con el parámetro a corregir. |
| Factor cambiario en cero o sucursal inexistente | No publica. | Error que señala el factor de la sucursal configurada. |
| Fallo al escribir un archivo | No publica ninguno: todos se arman antes de mover el primero. La carpeta de trabajo se limpia. | Error con el archivo y el campo que falló, sin el valor del campo. |
| El portal tiene un archivo abierto | Reintenta hasta cinco veces con espera creciente. Si no puede, el ciclo siguiente completa la publicación. | Aviso de publicación incompleta con los archivos que sí se publicaron. |
| Corte de energía durante la escritura | Cada archivo se fuerza a disco antes de moverse; el portal nunca ve uno a medias. | Al reiniciar, los restos de más de una hora se eliminan. |
| Carpeta reemplazada por un enlace | Se niega a escribir. Revisa toda la ruta antes de mover cada archivo. | Error que identifica la carpeta. |
| Error inesperado en un ciclo | El servicio sigue y reintenta en el próximo intervalo. | Error con el identificador del ciclo. |
6.7Configuración
Todo lo que la droguería puede decidir, y todo lo que Fulltech360 aún no confirma, está en el archivo de configuración y no fijo en el programa. Se valida al arrancar.
| Parámetro | Valor actual | Efecto |
|---|---|---|
| Moneda | BSS | Moneda de los precios publicados: BSS o USD. |
| PublicarLotesVencidos | false | Si los lotes vencidos con existencia se publican. |
| DepositosVenta | 001, 002 | Depósitos cuya existencia cuenta. Obligatorio. |
| DepositosRefrigerados | 002 | Depósitos que marcan el producto como refrigerado. |
| InstanciasMiscelaneo | (vacío) | Categorías cuyos productos son misceláneos. |
| PrecioMaximoUsd | 10000 | Tope de precio por lote, en dólares. 0 desactiva el control. |
| CaidaMaximaProductosPorcentaje | 50 | Caída admitida de producto.txt frente al publicado. 0 desactiva el control. |
| PublicarCosto | false | Si se publica el costo. |
| IntervaloMinutos | 15 | Minutos entre ciclos, de 1 a 1440. |
| CarpetaSubida | C:\SEPED\Subida | Carpeta que lee el portal. |
| CarpetaTrabajo | C:\SEPED\Trabajo | Carpeta donde se arman los archivos. Debe estar fuera de la de subida y en el mismo disco. |
| Separador | | | Separador de campos. Admite | , ~ o tabulador. Pendiente de Fulltech360. |
| SeparadorAlFinal | false | Si cada línea termina con el separador. Pendiente de Fulltech360. |
| Codificacion · ConBom | utf-8 · false | Codificación de los archivos y marca de orden de bytes. Pendiente de Fulltech360. |
| FinDeLinea | CRLF | Fin de línea: CRLF o LF. Pendiente de Fulltech360. |
| FormatoFechaLote | dd/MM/yyyy | Formato de la fecha en lotes.txt. Pendiente de Fulltech360. |
| Codisb · CodSucu | 506431599 · 00000 | RIF de la droguería, que va en todos los archivos, y sucursal de SAINT. |
6.8Archivos generados
Seis archivos de texto delimitado, según la especificación SEPED/IKOMPRA. Una línea por registro, sin encabezado. Cada campo ocupa su posición exacta; los que no aplican llevan el valor por defecto del contrato (N/A, 0, 0.00).
| Archivo | Campos | Clave | Registros | Contenido |
|---|---|---|---|---|
| producto.txt | 63 | codprod | 329 | Productos activos con existencia. Precio 1, 2 y 3 del lote publicado; psugerido = precio1; cantidad = cantreal; lote y fecvence; IVA; categoría en departamento y opc1; moneda y factor. |
| prodfalla.txt | 6 | codprod | 96 | Productos activos sin existencia publicable: barra, código, descripción, marca, principio activo, RIF. |
| lotes.txt | 10 | id | 349 | Lotes publicables de los productos publicados: código, descripción, lote, vencimiento, depósito, cantidad, RIF, id (número único de SAINT). |
| categoria.txt | 3 | codigo | 14 | Categorías de inventario: código, nombre, RIF. |
| vendedor.txt | 6 | codigo | 6 | Vendedores activos. |
| monedas.txt | 6 | codigo | 2 | BSS con factor 1.00 y USD con el factor del día; la preferida según la moneda configurada. |
Formato
- Separador
- Barra vertical. Ningún campo puede contener el separador: el texto se limpia antes y el escritor lo verifica.
- Codificación
- UTF-8 sin marca de orden de bytes. Como el texto se limpia a ASCII, los bytes son idénticos en ANSI.
- Fin de línea
- CRLF, también en la última línea. Sin líneas vacías.
- Números
- Punto decimal y dos cifras, sin separador de miles. Las existencias sin decimales, truncadas.
- Fechas
- yyyy-MM-dd HH:mm:ss en producto.txt; dd/MM/yyyy en lotes.txt. Sin fecha: N/A.
- Texto
- Mayúsculas de SAINT, sin acentos ni ñ, sin caracteres especiales. Descripción corta recortada a 30 caracteres.
Ejemplo real: lotes.txt
// codpadre|codhijo|desprod|lote|feclote|deposito|cantidad|codisb|nuevo|id
000452|000452|BIOLID LINEZOLID 600MG/ 300ML SOL INYECT|4530073N|09/01/2027|001|13|506431599|0|1919
000456|000456|DICLOFENAC POTASICO FENALGEN-K 75MG/3ML AMP|GN6853|10/01/2028|001|485|506431599|0|1920
Ejemplo real: monedas.txt
// codigo|descrip|factor|pref|simbolo|codisb
BSS|Bolivar Digital|1.00|SI|Bs.|506431599
USD|Dolar|871.37|NO|$|506431599
6.9Registro y operación
El servicio registra cada ciclo con un identificador corto. Las incidencias de datos van como avisos; los fallos, como errores con su identificador de ciclo. Un ciclo fallido no detiene el servicio: se reintenta en el intervalo siguiente.
// Ciclo real del 06-10-2026, 12:58 info Ciclo dc2dbd39 SAINT leído: 425 productos, 389 lotes con existencia, factor 871.37 warn Ciclo dc2dbd39 Producto 010-228, lote 2335 (2722): precio 1 de 5316737084.52 Bs (6101583.81 USD) supera el máximo configurado de 10000 USD. No se usa su precio. warn Ciclo dc2dbd39 Producto 010-228 tiene existencia (12) pero ningún lote con precio válido: se publica como falla. info Ciclo dc2dbd39 producto.txt: 329 líneas · prodfalla.txt: 96 · categoria.txt: 14 · lotes.txt: 349 · monedas.txt: 2 · vendedor.txt: 6 info Ciclo dc2dbd39 Catálogo publicado en C:\SEPED\Subida (6 archivos, 0.5 s, moneda BSS, vencidos excluidos, 4 incidencias)
| Ejecución manual | El mismo programa con la opción --una-vez ejecuta un ciclo y termina. Devuelve 0 si publicó y 1 si falló. Sirve para pruebas y para publicar fuera de horario. |
| Cambiar un parámetro | Editar el archivo de configuración y reiniciar el servicio. Si el valor es inválido, el servicio no arranca y el registro dice qué corregir. |
| Precio corregido en SAINT | No hay que hacer nada: el producto vuelve a publicarse en el ciclo siguiente. |
| Registro a archivo | Previsto para la fase de instalación, con rotación diaria. |
6.10Calidad y verificación
Antes de cerrar la fase, cuatro revisiones independientes la examinaron el 06-10-2026. La primera pasada salió rechazada por tres hallazgos; se corrigieron el mismo día, se repitió la revisión y quedó aprobada con observaciones. Las observaciones abiertas son decisiones de la droguería, confirmaciones de Fulltech360 y mejoras previstas para fases siguientes.
| Revisión | Resultado | Qué se comprobó |
|---|---|---|
| Código y pruebas | Aprobada | Compilación sin advertencias. 81 pruebas automáticas en verde, repetidas tres veces. Corridas reales del freno, de configuración inválida y de un archivo bloqueado por el portal. |
| Formato del portal | Aprobada | Validador independiente 6/6. Orden de los 63 campos, codificación, fin de línea, decimales, fechas y valores por defecto. Ningún producto repetido ni lote huérfano. |
| Seguridad | Aprobada | Consultas parametrizadas y de solo lectura. Escritura de archivos protegida frente a enlaces y restos. Sin componentes con vulnerabilidades conocidas. |
| Cotejo con SAINT | Aprobada | 329 productos y 349 lotes, uno por uno, en 16 campos, en bolívares y en dólares: sin diferencias. Existencias: 89.988 = 89.988. |
Criterios de salida de la Fase 1
| Criterio | Cumple | Evidencia |
|---|---|---|
| Validador del formato sin errores sobre la salida real | Sí | 6 de 6 archivos. |
| Cada producto activo en producto o en falla, nunca en ambos ni en ninguno | Sí | 329 + 96 = 425 activos; intersección vacía. |
| Precio = lote publicado ÷ factor según la moneda, cotejado contra SAINT | Sí | Los 329 productos, en BSS y en USD, sin diferencias. |
| Existencia publicada igual a SAINT con los mismos filtros | Sí | 89.988 unidades. |
| Ciclo completo en menos de un minuto | Sí | 0,5 segundos. |
Lo que falta por verificar con datos reales
Algunos casos no existen hoy en la base de la droguería y por eso solo están cubiertos con pruebas automáticas: productos inactivos, existencia en el depósito refrigerado, lotes en depósitos que no son de venta, y un lote con precio cero junto a otro válido. Se verificarán con datos de prueba en el entorno de pruebas, antes de la Fase 2.
6.11Próximas fases
| Fase 2 · Clientes y cartera | Cinco archivos más: clientes, proveedores, cuentas por cobrar, cuentas por pagar y bancos. Saldos y vencidos al céntimo, en ambas monedas. |
| Fase 3 · Ventas | Facturas de 90 días con sus renglones y el resumen diario. |
| Fase 4 · Pedidos | Primera escritura en SAINT: el pedido del portal entra como documento en espera, dentro de una transacción. Un pedido inválido no deja nada; uno repetido no se duplica. Se desarrolla contra una copia de la base y con el registro exacto de lo que SAINT hace al crear un documento a mano. |
| Fase 5 · Factura al portal | Depende de la estructura que confirme Fulltech360. |
| Fase 6 · Instalación | Instalador, cuenta de servicio con permisos mínimos, permisos de las carpetas, registro a archivo, licencia, manual y una semana en paralelo. |
6.12Glosario
- SAINT Administrativo
- Sistema administrativo de la droguería, sobre SQL Server. Es el origen de todos los datos.
- SEPED / IKOMPRA
- Portal de ventas operado por Fulltech360, que recibe el catálogo y enviará los pedidos.
- Ciclo
- Una ejecución completa: leer, filtrar, calcular, controlar, armar y publicar. Cada 15 minutos.
- Producto en falla
- Producto activo sin existencia publicable. El portal lo muestra como no disponible.
- Retenido
- Producto con existencia cuyo único lote con precio tiene un precio fuera del tope. Figura en falla hasta corregirlo.
- Lote publicado
- El lote que da el precio del producto: el de vencimiento más próximo con precio válido.
- Factor
- Tasa del día en SAINT para convertir bolívares a dólares.
- Carpeta de trabajo
- Carpeta donde se arman los archivos antes de moverlos completos a la del portal.
- Incidencia
- Aviso en el registro sobre un dato que requiere atención en SAINT, sin detener el ciclo.
- Freno de publicación
- Control que impide publicar un catálogo vacío o que cae de golpe frente al anterior.
