PHARMASYNC PROInforme de avance · Fase 1 06 / 06

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ónServicio 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 datosSAINT Administrativo sobre SQL Server. Ocho tablas, solo consulta.
DestinoSeis archivos TXT en la carpeta de subida del portal, según la especificación de Fulltech360.
FrecuenciaUn ciclo cada 15 minutos. Duración del ciclo con los datos actuales: 0,5 segundos.
Calidad81 pruebas automáticas. Compila sin advertencias. Verificación de la Fase 1 aprobada el 06-10-2026.
Dependencias externasNinguna fuera de las bibliotecas oficiales de Microsoft. Sin componentes con vulnerabilidades conocidas.

6.2Pila tecnológica

ComponenteTecnologíaPara qué se usa
Lenguaje y plataformaC# 13 · .NET 10Todo el código del servicio. Tipado estricto y advertencias tratadas como errores.
ServicioMicrosoft.Extensions.HostingArranque como servicio de Windows, temporizador del ciclo, configuración y registro.
Acceso a datosMicrosoft.Data.SqlClientConexión cifrada a SQL Server. Consultas parametrizadas, solo lectura.
Configuraciónappsettings.jsonReglas y parámetros editables sin recompilar. Se validan al arrancar.
PruebasxUnit81 pruebas de reglas, formato, escritura, configuración y controles.
Formato de salidaTXT delimitado · UTF-8Contrato SEPED/IKOMPRA. Separador, codificación y fin de línea configurables.
Verificación independientePython · SQLValidador 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óduloResponsabilidadLo que no hace
PharmaSync.ServiceArranca 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.SaintLee de SAINT con seis consultas parametrizadas y entrega los datos en memoria.No escribe en SAINT. No decide qué se publica.
PharmaSync.CoreAplica 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.SepedEscribe 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.

Servicio Lectura SAINT Reglas Publicación Carpeta 01Inicia el ciclo: id de ciclo y registro 02Leer catálogo (sucursal) 036 consultas de solo lectura 04425 productos · 389 lotes · factor 05Datos del catálogo en memoria 06Construir el catálogo con las reglas y el tope de precio 076 archivos listos · 4 incidencias 08Freno: compara con el catálogo ya publicado 09Escribir los 6 archivos 10Arma, verifica y mueve 116 archivos publicados 12Registra el resumen y espera 15 minutos
  1. Inicio del ciclo
  2. El servicio pide el catálogo
  3. Consultas a SAINT
  4. Respuesta de SAINT
  5. Datos en memoria
  6. Construcción del catálogo
  7. Archivos e incidencias
  8. Freno de publicación
  9. Orden de publicar
  10. Escritura y publicación
  11. Confirmación
  12. 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.

ReglaCondiciónResultadoParámetro
Producto consideradoActivo en SAINTEntra al catálogo: va a producto o a falla, nunca a los dos ni a ninguno—
Lote publicableExistencia mayor que cero, en un depósito de venta, no vencidoCuenta en la existencia y sale en lotes.txtDepositosVenta · PublicarLotesVencidos
Lote sin fechaSin fecha de vencimiento o con la fecha vacía de SAINTSe trata como no vencido; en los archivos sale N/A—
Existencia publicadaSuma de los lotes publicables del producto, sin decimalesCampos cantidad y cantreal—
Lote que da el precioEntre los lotes con precio válido, el de vencimiento más próximo; los sin fecha van al final; empate por número únicoCampos lote, fecvence, precio1, precio2 y precio3—
Precio válidoPrecio 1 mayor que cero y ninguno de los tres precios por encima del tope en dólaresUn lote inválido no da el precio y deja una incidenciaPrecioMaximoUsd
Producto en fallaExistencia cero, o con existencia pero sin ningún lote con precio válidoVa a prodfalla.txt; sus lotes no salen en lotes.txt—
MonedaBolívares: precio del lote tal cual. Dólares: precio dividido entre el factor, a dos decimalesCampos de precio, moneda y factorcambiario; monedas.txt marca la preferidaMoneda
RefrigeradoAlgún lote publicable en un depósito refrigeradoCampo refrigerado = 1DepositosRefrigerados
Tipo de productoCategoría en la lista de misceláneosTipo C; el resto, M (medicamento)InstanciasMiscelaneo
IVAExento, o porcentaje de SAINT0.00 para exentos; el porcentaje de SAINT para gravados—
TextoCualquier campo de textoSin acentos, sin ñ, sin caracteres de control, sin el separador; recortado al largo del contratoSeparador

6.6Controles y comportamiento ante fallos

El principio es fallar de forma visible y nunca publicar datos a medias o sin sentido.

SituaciónQué hace el sistemaQué queda en el registro
Precio fuera de rango en SAINTEl 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 desplomadoNo 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álidaEl servicio no arranca.Todos los errores de configuración, en lenguaje llano, con el parámetro a corregir.
Factor cambiario en cero o sucursal inexistenteNo publica.Error que señala el factor de la sucursal configurada.
Fallo al escribir un archivoNo 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 abiertoReintenta 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 escrituraCada 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 enlaceSe niega a escribir. Revisa toda la ruta antes de mover cada archivo.Error que identifica la carpeta.
Error inesperado en un cicloEl 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ámetroValor actualEfecto
MonedaBSSMoneda de los precios publicados: BSS o USD.
PublicarLotesVencidosfalseSi los lotes vencidos con existencia se publican.
DepositosVenta001, 002Depósitos cuya existencia cuenta. Obligatorio.
DepositosRefrigerados002Depósitos que marcan el producto como refrigerado.
InstanciasMiscelaneo(vacío)Categorías cuyos productos son misceláneos.
PrecioMaximoUsd10000Tope de precio por lote, en dólares. 0 desactiva el control.
CaidaMaximaProductosPorcentaje50Caída admitida de producto.txt frente al publicado. 0 desactiva el control.
PublicarCostofalseSi se publica el costo.
IntervaloMinutos15Minutos entre ciclos, de 1 a 1440.
CarpetaSubidaC:\SEPED\SubidaCarpeta que lee el portal.
CarpetaTrabajoC:\SEPED\TrabajoCarpeta 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.
SeparadorAlFinalfalseSi cada línea termina con el separador. Pendiente de Fulltech360.
Codificacion · ConBomutf-8 · falseCodificación de los archivos y marca de orden de bytes. Pendiente de Fulltech360.
FinDeLineaCRLFFin de línea: CRLF o LF. Pendiente de Fulltech360.
FormatoFechaLotedd/MM/yyyyFormato de la fecha en lotes.txt. Pendiente de Fulltech360.
Codisb · CodSucu506431599 · 00000RIF 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).

ArchivoCamposClaveRegistrosContenido
producto.txt63codprod329Productos 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.txt6codprod96Productos activos sin existencia publicable: barra, código, descripción, marca, principio activo, RIF.
lotes.txt10id349Lotes publicables de los productos publicados: código, descripción, lote, vencimiento, depósito, cantidad, RIF, id (número único de SAINT).
categoria.txt3codigo14Categorías de inventario: código, nombre, RIF.
vendedor.txt6codigo6Vendedores activos.
monedas.txt6codigo2BSS 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 manualEl 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ámetroEditar 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 SAINTNo hay que hacer nada: el producto vuelve a publicarse en el ciclo siguiente.
Registro a archivoPrevisto 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ónResultadoQué se comprobó
Código y pruebasAprobadaCompilació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 portalAprobadaValidador 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.
SeguridadAprobadaConsultas parametrizadas y de solo lectura. Escritura de archivos protegida frente a enlaces y restos. Sin componentes con vulnerabilidades conocidas.
Cotejo con SAINTAprobada329 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

CriterioCumpleEvidencia
Validador del formato sin errores sobre la salida realSí6 de 6 archivos.
Cada producto activo en producto o en falla, nunca en ambos ni en ningunoSí329 + 96 = 425 activos; intersección vacía.
Precio = lote publicado ÷ factor según la moneda, cotejado contra SAINTSíLos 329 productos, en BSS y en USD, sin diferencias.
Existencia publicada igual a SAINT con los mismos filtrosSí89.988 unidades.
Ciclo completo en menos de un minutoSí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 carteraCinco archivos más: clientes, proveedores, cuentas por cobrar, cuentas por pagar y bancos. Saldos y vencidos al céntimo, en ambas monedas.
Fase 3 · VentasFacturas de 90 días con sus renglones y el resumen diario.
Fase 4 · PedidosPrimera 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 portalDepende de la estructura que confirme Fulltech360.
Fase 6 · InstalaciónInstalador, 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.