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:
| Columna | Contenido |
|---|---|
| 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
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).
Identificacion de Empresa
Para cada XML, el sistema identifica a cual empresa (base de datos) corresponde:
- Paso 1 - Cedula + Email: Busca en
dbnegocioempresas cuya cedula coincida con la del receptor XML, y compara los emails del XML contraemail_compras. - Paso 2 - Solo cedula (fallback): Si no hay coincidencia por email, busca solo por cedula. Si hay multiples empresas, prioriza las que tengan
email_comprasconfigurado.
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.
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.
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.
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.
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.
La confirmacion espera a que el proveedor registre su factura en Hacienda. Hay proveedores que mandan la factura por correo en el momento, pero la registran en Hacienda horas despues (a veces al dia siguiente). Si la confirmacion saliera antes, Hacienda la rechazaria con el mensaje «el comprobante al cual se esta haciendo referencia no se encuentra registrado» (codigo -29). Por eso, antes de enviarla, el sistema le pregunta a Hacienda si ya tiene la factura: si todavia no, la confirmacion queda pendiente y se vuelve a revisar cada 20 minutos, hasta 8 dias. En cuanto el proveedor la registra, la confirmacion sale sola. No hay que hacer nada.
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).
Que trae el correo de confirmacion: ademas del estado (aceptado / rechazado) y la clave numerica, el correo muestra en un recuadro aparte el numero de la factura del proveedor y su fecha de emision — no hay que descifrarlos de la clave. La fecha y el consecutivo del mensaje de aceptacion salen abajo, rotulados como Fecha de aceptacion y Consecutivo del mensaje, para que no se confundan con los de la factura.
Adjuntos: el correo lleva cuatro archivos: el XML del mensaje de confirmacion, el XML de la respuesta de Hacienda, el XML de la factura del proveedor y un PDF con la representacion grafica de esa factura (se arma del XML: emisor, receptor, lineas, impuestos y totales). Si el XML de la factura no aparece ni en la base ni en el respaldo de red, el correo sale igual con los dos primeros adjuntos.
Una factura se acepta una sola vez: si el mismo XML vuelve a entrar a la cola (porque alguien lo reenvia, o porque el correo de confirmacion regresa al buzon con la factura adjunta), el sistema lo reconoce y lo archiva sin volver a procesarlo. No se genera un segundo mensaje de aceptacion ni se le manda otro correo al proveedor. En la pantalla de aceptacion ese archivo aparece como ya procesada.
El correo de confirmacion no se vuelve a leer: muchas empresas reenvian su bandeja de compras al buzon que lee FactuPOS, asi que la confirmacion que el sistema envio termina volviendo a ese buzon. Al descargar el correo, esos mensajes se reconocen como propios y se descartan; solo se procesan las facturas que mandan los proveedores.
Rechazar un documento
En Aceptacion de Compras y Gastos (CO-005), junto al boton verde Aceptar esta el boton rojo Rechazar. Se usa cuando el documento que mando el proveedor no corresponde: mercaderia que nunca llego, precios que no son los acordados, una factura repetida o que ni siquiera es de su empresa.
| Si usted... | Que hace el sistema |
|---|---|
| Acepta | Registra la compra como borrador y le avisa a Hacienda que el documento se acepta. |
| Rechaza | No registra ninguna compra. No toca inventario ni contabilidad. Solo le avisa a Hacienda que el documento se devuelve, con el motivo que usted escriba. |
Como se rechaza
- Cargue los XML como siempre y marque los que va a devolver.
- Toque Rechazar. Se abre la ventana MC-020 con la lista de lo que va a rechazar.
- Escriba el motivo. Puede tocar uno de los motivos sugeridos y editarlo. El boton de confirmar no se enciende hasta que haya un motivo.
- Confirme. El sistema muestra los pasos uno por uno, igual que al aceptar.
El motivo lo lee el proveedor. Viaja dentro del mensaje que se le manda a Hacienda, asi que conviene que sea claro y concreto: "No recibi esta mercaderia" dice mas que "error". Admite hasta 160 caracteres, que es el maximo que acepta Hacienda.
El rechazo no se puede deshacer. Una vez enviado, ese documento ya no se va a poder aceptar: si lo intenta, la pantalla le dice cuando se rechazo y con que motivo. Si el proveedor corrige el documento, tiene que enviarle uno nuevo.
Un documento ya aceptado no se puede rechazar. Si la compra ya quedo registrada, la pantalla le dice la fecha en que se acepto. Para deshacerla el camino es anular la compra en el modulo de compras, no rechazar el XML.
Queda constancia. El XML del proveedor se archiva igual que si se hubiera aceptado, y el rechazo queda guardado con el motivo, la fecha, el usuario que lo hizo y el numero con que salio el aviso a Hacienda.
Permiso: es el mismo 575 · Aceptar Compras. Quien puede aceptar puede rechazar.
Ciclo Automatico
Los botones Auto y Acept. Auto activan ciclos automaticos:
| Boton | Funcion | Intervalo |
|---|---|---|
| Auto | Descarga XMLs de los buzones POP3 | Cada 41 segundos |
| Acept. Auto | Acepta automaticamente los XMLs descargados | Cada 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:
| Columna | Fuente | Color |
|---|---|---|
| Cedula Emisor | XML | Gris |
| Nombre Emisor | XML | Blanco |
| Email Emisor | XML | Amarillo |
| Cedula Receptor | XML | Gris |
| Email Receptor | XML | Amarillo |
| BD | dbnegocio.serverdb | Azul |
| Email BD | dbnegocio.email_compras | Purpura |
| Match | email (verde) / cedula (naranja) | Variable |
| Estado | Resultado | OK / 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:
- Fallback primario: Codigo
10(IVA 0%) - 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:
| Paso | Validacion | Error si falla |
|---|---|---|
| 4i-1 | Todas las lineas deben tener cuenta contable asignada | "N linea(s) sin cuenta contable" |
| 4i-2 | Lineas 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:
| Carpeta | Significado |
|---|---|
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
ParametrosEmpresano 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
- Extrae del XML:
Receptor.Identificacion.Numero(cédula) yReceptor.CorreoElectronico(emails) - Busca en
dbnegociotodas las empresas con esa cédula - Por cada empresa, compara los emails del XML contra el
email_compras(param 117) de la empresa - Separa por
,y;(una empresa puede tener múltiples emails de compras configurados) - 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_comprasconfigurado, 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:
- Buscar o crear proveedor en
Proveedor(por cédula+moneda) - Verificar que la factura no esté ya procesada (
Estado NOT IN 0,1) - Eliminar borradores previos (Estado 0 o 1)
- Insertar cabecera en
CompraMadre(estado 0, tipo = posiciones 9-10 del consecutivo) - Insertar líneas en
CompraHija(valida código de tarifa IVA con fallback "10") - Actualizar totales de
CompraMadrecon suma real de líneas - Homologar artículos con
ProveedorArticuloHomologacion+ asignar CABYS + cuenta contable + ajustar UxM - Insertar XML original en
XmlDocumentos(Base64) - Generar
MensajeReceptorXML con clave y consecutivo tipo 05 (solo si la empresa tiene FE activa, param 125 = 1) - Insertar confirmación en
fac_bitacora(servidor del cliente; auto-registra enfac_companiasi 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ódigo | Nombre | Qué autoriza | Dó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 |
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ódigo | Nombre | Qué controla | Valores |
|---|---|---|---|
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) |
Exportar a Excel: permiso 720
Si el botón Excel aparece gris, no es una falla: exportar este reporte se habilita persona por persona con su propio permiso:
- Permiso 720 — Compras · Histórico de Aceptación
CO-021
SE-001: elegir a la persona, escribir el número del permiso (o la palabra Excel) en el buscador de permisos y marcar la casilla. Toma efecto recargando la pantalla, sin cerrar sesión.
Al pasar el mouse sobre el botón gris, el sistema dice qué le falta. Que a un compañero sí le funcione no significa que esté habilitado para todos: el permiso es por persona (por ejemplo, el usuario del contador suele ser uno aparte y necesita el suyo). Si el mensaje dice en cambio que la exportación está apagada para la empresa, esa no se abre desde el sistema: la solicita el dueño o la gerencia a Soporte Real. Ver el reporte en pantalla no pide este permiso; solo la descarga a Excel. Más detalles en El Excel de los reportes.