Modulo
Funciones compartidas entre facturas de venta (Invoice) y compras (Bill) para evitar duplicacion de logica de moneda. Maneja deteccion, diferenciacion de entidades, tipo de cambio y formateo.
const CurrencyUtils = require('../utils/currencyUtils');
// Detectar moneda de una factura
const config = CurrencyUtils.determinarConfiguracionMoneda(factura);
// { moneda: 'USD', exchangeRate: 520, simbolo: '$', ... }
API Reference
determinarConfiguracionMoneda(facturaData, clienteProveedorData?)
Detecta la moneda de una factura analizando campos moneda, currency y el nombre del cliente/proveedor.
facturaData Object — Datos de la factura
clienteProveedorData Object? — Datos del cliente o proveedor (opcional)
→ { moneda, requiereConfiguracion, exchangeRate, simbolo, nombre }
buscarEntidadPorMoneda(entidades, nombre, configMoneda, normalizarFn)
Busca cliente o proveedor considerando el sufijo de moneda. Primero busca con sufijo exacto, luego variaciones.
entidades Array — Lista de clientes/proveedores QB
nombre string — Nombre a buscar
configMoneda Object — Config de determinarConfiguracionMoneda
normalizarFn Function — Funcion para normalizar nombres
→ Object | null (entidad encontrada o null)
crearNombreConMoneda(nombre, configMoneda, normalizarFn)
Crea el DisplayName con sufijo de moneda. Normaliza el nombre y agrega CRC o USD (max 41 chars).
nombre string — Nombre base
configMoneda Object — Config de moneda
→ string (ej: "EMPRESA ABC USD")
agregarConfiguracionMoneda(estructura, configMoneda)
Agrega CurrencyRef y ExchangeRate a una estructura QB (Bill o Invoice). Solo modifica si la moneda es USD.
estructura Object — Bill o Invoice data
configMoneda Object — Config de moneda
→ void (muta el objeto directamente)
formatearMonto(monto, configMoneda)
Formatea un monto con el simbolo de moneda apropiado.
monto number — Monto a formatear
configMoneda Object — Config de moneda
→ string (ej: "$1500.00" o "₡1500.00")
Uso en scripts
Facturas de compra (Bills)
const CurrencyUtils = require('../../src/utils/currencyUtils');
async convertirABill(facturaCompra) {
// 1. Determinar moneda
const configMoneda = CurrencyUtils.determinarConfiguracionMoneda(facturaCompra);
// 2. Buscar proveedor con sufijo de moneda
const proveedor = CurrencyUtils.buscarEntidadPorMoneda(
proveedores, facturaCompra.nombre, configMoneda, this.normalizar
);
// 3. Crear estructura Bill
const billData = {
VendorRef: { value: proveedor.Id },
DocNumber: facturaCompra.numero,
TxnDate: facturaCompra.fecha,
Line: [/* ... */]
};
// 4. Agregar CurrencyRef + ExchangeRate si USD
CurrencyUtils.agregarConfiguracionMoneda(billData, configMoneda);
return billData;
}
Facturas de venta (Invoices)
const CurrencyUtils = require('../../src/utils/currencyUtils');
async procesarFactura(factura) {
const configMoneda = CurrencyUtils.determinarConfiguracionMoneda(factura);
// Buscar cliente con diferenciacion por moneda
const cliente = CurrencyUtils.buscarEntidadPorMoneda(
clientes, factura.cliente, configMoneda, this.normalizar
);
// Si no existe, crear con nombre + sufijo
if (!cliente) {
const displayName = CurrencyUtils.crearNombreConMoneda(
factura.cliente, configMoneda, this.normalizar
);
// crear cliente con displayName...
}
}