Aceptacion de Compras Electronicas AY-002

Guia completa del flujo de aceptacion, procesamiento y reglas del modulo de compras electronicas

Menú Ayuda

Descripcion General

El modulo de Aceptacion de Compras Electronicas permite recibir facturas XML de proveedores via correo electronico (POP3), procesarlas automaticamente e insertarlas como compras en el sistema. El proceso incluye identificacion de la empresa receptora, creacion automatica de proveedores nuevos, homologacion de articulos y envio de confirmacion a Hacienda.

Pantalla Principal

La pantalla se divide en 3 columnas:

ColumnaContenido
Izquierda (256px)Servidores POP3 configurados y botones Auto / Acept. Auto
Centro (280px)Lista de empresas. Se resalta automaticamente la empresa cuando se identifica un XML
Derecha (flexible)Arbol de archivos XML entrantes y log de aceptacion (ultimas 50 entradas)

Flujo de Aceptacion

1

Descarga POP3

El sistema descarga XMLs de los buzones de correo configurados. Los archivos se guardan en /var/www/xml_compras_entrantes/. Tambien soporta archivos .eml adjuntos (los descompone recursivamente para extraer XMLs).

2

Identificacion de Empresa

Para cada XML, el sistema identifica a cual empresa (base de datos) corresponde:

  1. Paso 1 - Cedula + Email: Busca en dbnegocio empresas cuya cedula coincida con la del receptor XML, y compara los emails del XML contra email_compras.
  2. Paso 2 - Solo cedula (fallback): Si no hay coincidencia por email, busca solo por cedula. Si hay multiples empresas, prioriza las que tengan email_compras configurado.
3

Proveedor

El sistema busca el proveedor por cedula + moneda del documento:

  • Si no existe: Crea uno nuevo con los datos del XML (nombre, cedula, email, telefono, direccion, actividad economica). El tipo de compra default es 01.
  • Si ya existe: Usa el proveedor encontrado. No se modifica su actividad economica ni tipo de proveedor.
4

Insercion de la Compra

Se inserta la cabecera en CompraMadre (estado borrador) y las lineas en CompraHija. Si la factura ya fue procesada (estado distinto de borrador), se rechaza como duplicado.

5

Homologacion de Articulos

El sistema busca en RelCodProveedor si el codigo del articulo del proveedor ya esta relacionado con un articulo local. Si encuentra coincidencia, asigna automaticamente el codigo local, CABYS y cuenta contable.

6

Ajuste por Unidades por Medida (UxM)

Despues de homologar, si el articulo local tiene UnidadesXMedida > 1, el sistema ajusta automaticamente:

  • Cantidad: se multiplica por UxM (ej: 3 cajas x 3 unidades = 9 unidades)
  • Costo unitario: se divide por UxM (para mantener el total de linea igual)

Ejemplo: TREX UxM=3, XML envia cantidad=3 y costo=1,299.54. Resultado: cantidad=9, costo=433.18. SubTotal se mantiene en 3,898.62.

7

Confirmacion a Hacienda

Se genera el XML de MensajeReceptor (aceptacion/rechazo) con consecutivo tipo 05, se inserta en XmlDocumentos y se encola para envio a Hacienda.

Correo de la confirmacion: cuando Hacienda acepta o rechaza el MensajeReceptor, se envia el comprobante por correo. El proveedor (emisor del documento original) siempre lo recibe. La copia de respaldo es opcional: solo se envia si la empresa configuro un correo de respaldo (parametro 149); si no, no se manda copia interna (antes llegaba duplicado al correo principal de la empresa).

Ciclo Automatico

Los botones Auto y Acept. Auto activan ciclos automaticos:

BotonFuncionIntervalo
AutoDescarga XMLs de los buzones POP3Cada 41 segundos
Acept. AutoAcepta automaticamente los XMLs descargadosCada 30 segundos

El estado de estos botones se guarda en localStorage y se restaura al recargar la pagina. El log de aceptacion mantiene las ultimas 50 entradas entre ciclos (no se borra al terminar un ciclo).

Log de Aceptacion

El log muestra 9 columnas por cada XML procesado:

ColumnaFuenteColor
Cedula EmisorXMLGris
Nombre EmisorXMLBlanco
Email EmisorXMLAmarillo
Cedula ReceptorXMLGris
Email ReceptorXMLAmarillo
BDdbnegocio.serverdbAzul
Email BDdbnegocio.email_comprasPurpura
Matchemail (verde) / cedula (naranja)Variable
EstadoResultadoOK / Error / Duplicado

Validacion de Tarifa IVA

Si el XML trae un codigo de tarifa IVA que no existe en la tabla TipoTarifaImpuesto de la empresa, el sistema aplica un fallback automatico:

  1. Fallback primario: Codigo 10 (IVA 0%)
  2. Fallback secundario: El primer codigo disponible en la tabla

Esto evita errores de Foreign Key al insertar las lineas de la compra.

Validaciones al Aplicar la Compra

Cuando se aplica una compra desde el editor (CO-006), el sistema valida antes de hacer cualquier cambio:

PasoValidacionError si falla
4i-1Todas las lineas deben tener cuenta contable asignada"N linea(s) sin cuenta contable"
4i-2Lineas con cuenta de inventario deben tener articulo local homologado"N linea(s) con cuenta de inventario sin articulo homologado"

La cuenta contable determina si la linea va a inventario o a gasto. Si la cuenta empieza con el prefijo del Parametro 92, se considera inventario y requiere articulo local.

Carpeta de XMLs

Los XMLs descargados se almacenan en /var/www/xml_compras_entrantes/ (carpeta unica, sin subcarpetas). Segun el resultado del procesamiento, se mueven a:

CarpetaSignificado
procesados/Aceptados correctamente
duplicados/Factura ya existia en la BD
no_localizados/No se pudo identificar la empresa receptora
errores/Fallo en el procesamiento

Configuracion de Emails

El campo email_compras en dbnegocio puede contener multiples emails separados por coma o punto y coma:

compras@empresa.com;bodega@empresa.com,admin@empresa.com

El sistema separa correctamente ambos delimitadores para comparar con el email del XML.

Lista de empresas

La columna central muestra todas las empresas registradas en dbcontrol.dbnegocio. Cada fila representa una empresa única, agrupada por servidor + base de datos + buzón.

Estructura de cada fila

  • Nombre de la BD (laheredad, botanikalfarma, …): identificador técnico que también se usa como conexión SQL
  • Nombre comercial: razón social real (sincronizada desde param 54)
  • Cédula jurídica/física: sincronizada desde param 66
  • Servidor SQL y buzón: dirección IP + número de socket WinSock para descarga POP3
  • Email de compras: email al que el emisor del XML envía la factura (param 117)
  • Badge de usuarios [👥 N]: cantidad de usuarios FactuPOS que tienen acceso a la empresa. Hover muestra la lista completa de emails de usuarios

La lista se ordena alfabéticamente por nombre de la base de datos. Una empresa con múltiples usuarios aparece una sola vez en la lista — los duplicados de dbnegocio por usuario se colapsan visualmente.

Botón Sync

El botón Sync (nube amarilla, arriba-derecha de la lista de empresas) recorre todos los servidores SQL configurados en dbcontrol.Servidores y rellena los campos vacíos de dbnegocio con los valores reales de cada empresa.

Qué lee

Por cada base de datos en cada servidor, consulta ParametrosEmpresa y toma:

  • Param 54 → columna nombre_empresa (razón social)
  • Param 66 → columna cedula (sólo dígitos)
  • Param 117 → columna email_compras (email receptor de FE)

Protecciones

  • Si la BD no existe o está offline, lo marca como warn y NO toca la fila
  • Si la tabla ParametrosEmpresa no está creada, salta
  • Si los 3 parámetros vienen vacíos, NO hace UPDATE (preserva lo que había antes — evita borrar por equivocación)
  • Solo escribe cuando al menos 1 de los 3 params trae valor

Conexión SQL

Siempre conecta al puerto SQL default 1433. La columna socket de dbnegocio es el buzón WinSock VB6 (444, 555, 600, 700…) usado para correos POP3, NO es el puerto SQL. Se agrupan las empresas por IP y se abre una sola conexión por servidor.

Respuesta

Al terminar muestra tres contadores:

  • Actualizados: filas efectivamente modificadas
  • Saltados: BDs con params vacíos (intencionalmente no actualizadas)
  • Errores: BDs no accesibles / sin tabla / con excepción

Tarda ~30-60 segundos porque recorre los 15 servidores SQL registrados en Servidores. Al finalizar, la lista se recarga automáticamente con los datos frescos.

Cuándo correrlo

  • Después de crear una empresa nueva en FactuPOS (para que aparezca completa en la lista)
  • Cuando una empresa cambió su nombre, cédula o email de compras en Datos Empresa (CF-001)
  • Como mantenimiento semanal opcional

Buscador

Arriba de la lista hay un input "Buscar por BD, nombre o cédula…" que filtra las filas en tiempo real (client-side, sin ir al servidor). Busca contra el texto completo de cada fila — nombre técnico, razón social, cédula, servidor, buzón y email.

El contador del header cambia a N/total mientras el filtro está activo. Para limpiar, borrá el contenido del input.

Match de empresa por XML

Cuando llega un XML por POP3, el sistema busca a qué empresa del sistema pertenece usando la función identificarEmpresa() en _funciones.php.

Paso 1 — cédula + email_compras

  1. Extrae del XML: Receptor.Identificacion.Numero (cédula) y Receptor.CorreoElectronico (emails)
  2. Busca en dbnegocio todas las empresas con esa cédula
  3. Por cada empresa, compara los emails del XML contra el email_compras (param 117) de la empresa
  4. Separa por , y ; (una empresa puede tener múltiples emails de compras configurados)
  5. Si hay 1 match → se usa esa empresa (matchTipo = 'email')

El match sólo usa email_compras (param 117). La columna email de dbnegocio (que contiene emails de usuarios individuales) no interviene en el match.

Paso 2 — fallback por cédula

Si no hubo match de email:

  • Si hay 1 sola empresa con esa cédula → se usa esa (matchTipo = 'cedula')
  • Si hay múltiples → prioriza las que tengan email_compras configurado, y emite warning con la lista

La empresa que resuelva el match aparece resaltada en verde en la lista con scroll automático, mientras se procesa el XML.

Ciclo automático

Hay dos toggles independientes que activan procesamiento continuo en segundo plano:

  • Auto descarga POP3 (cada 41s): baja XMLs nuevos de los buzones configurados y los guarda en /var/www/xml_compras_entrantes/
  • Acept. Auto (cada 30s): procesa los XMLs descargados e intenta insertar cada uno en la empresa identificada

Los dos estados se persisten en localStorage — si se activa Auto hoy y se cierra la pestaña, al volver a abrir mañana sigue activo. Claves: compras_auto y compras_aceptar_auto.

El log abajo guarda las últimas 50 filas y NO se borra entre ciclos — se removió el location.reload() para preservar el histórico durante la sesión.

Inserción en CompraMadre

Cuando el match identifica la empresa correcta, el XML se envía a /api/compras/procesar_compra_electronica.php, que ejecuta 10 pasos en secuencia contra la base de datos de la empresa:

  1. Buscar o crear proveedor en Proveedor (por cédula+moneda)
  2. Verificar que la factura no esté ya procesada (Estado NOT IN 0,1)
  3. Eliminar borradores previos (Estado 0 o 1)
  4. Insertar cabecera en CompraMadre (estado 0, tipo = posiciones 9-10 del consecutivo)
  5. Insertar líneas en CompraHija (valida código de tarifa IVA con fallback "10")
  6. Actualizar totales de CompraMadre con suma real de líneas
  7. Homologar artículos con ProveedorArticuloHomologacion + asignar CABYS + cuenta contable + ajustar UxM
  8. Insertar XML original en XmlDocumentos (Base64)
  9. Generar MensajeReceptor XML con clave y consecutivo tipo 05 (solo si la empresa tiene FE activa, param 125 = 1)
  10. Insertar confirmación en fac_bitacora (servidor del cliente; auto-registra en fac_compania si no existe) (solo si param 125 = 1)

Empresas sin Factura Electrónica (param 125 ≠ 1): la compra se registra normalmente (pasos 1 a 8), pero los pasos 9 y 10 se omiten — no se genera el MensajeReceptor ni se inserta en fac_bitacora, así que no se acepta ni se envía nada a Hacienda.

Si el proveedor es nuevo, CompraMadreTipo se fuerza a '01' y se copia ActividadEconomica del XML. Si ya existe, respeta el CodTipoProveedor que tenga.

El ajuste automático de UxM (multiplicar cantidad, dividir costo) se aplica incondicionalmente después de la homologación cuando Articulos.UnidadesXMedida > 1. Los totales de línea se preservan porque cantidad×costo no cambia.

Permisos del módulo

El módulo de Aceptación de Compras Electrónicas no requiere permiso específico propio para acceder, pero el procesamiento posterior sí consume los permisos de compras. Se asignan al grupo de usuarios desde el módulo de Seguridad (SE-001).

CódigoNombreQué autorizaDónde aplica
552 Compras — Aplicar Una vez aceptada la compra electrónica e insertada en el sistema, se requiere este permiso para aplicarla (registrar inventario y contabilidad). CO-006, editar_compra
558 Compras — Ver facturas Las compras procesadas desde este módulo aparecen en CO-001 (Facturas de Compra). Se necesita este permiso para consultarlas. CO-001
Procesamiento automático El proceso de aceptación electrónica corre como un servicio de fondo (daemon POP3). No requiere permiso de usuario para ejecutarse, ya que opera con credenciales del sistema.

Parámetros de empresa

Los parámetros controlan el comportamiento de la aceptación electrónica. Se configuran desde Configuración → Parámetros (CF-004) y también en Datos de la Empresa → Facturación Electrónica.

CódigoNombreQué controlaValores
125 Facturación Electrónica activa Indica si la empresa opera con Hacienda. La compra del proveedor se registra igual en ambos casos; lo que cambia es la aceptación: si está en 0 (o no configurado), NO se genera el MensajeReceptor ni se inserta en fac_bitacora — es decir, no se acepta ni se envía nada a Hacienda. Si está en 1, se completan los pasos 9 y 10 (confirmación a Hacienda). 1 = activo / 0 = inactivo
66 Cédula jurídica de la empresa Identifica a la empresa receptora al procesar XMLs. El sistema busca qué empresa de la base de datos corresponde a la cédula en el XML del proveedor. Cédula (ej: 3-101-123456)
92 Cuenta Contable CxP por defecto Cuenta de Cuentas por Pagar asignada cuando el proveedor nuevo (creado automáticamente) no tiene cuenta configurada. Código de cuenta (ej: 210401)
249 Moneda nacional de la empresa Moneda base para registrar la compra cuando el XML del proveedor viene en otra divisa. Código ISO (ej: CRC)