herramientaenvioestupendo
v1.1.77
Published
Proyecto para envio documentos masivos
Readme
EstupendoCLI — v1.1.74
Esta herramienta esta destinada para uso de los Ing. implementadores y de soporte de la empresa Estupendo-Colombia.
Requerimientos:
- node 20.9.0 Descargar aqui
- npm 9.6.7
Instalacion
Abrir CMD (Windows) o terminal (Unix):
npm i -g herramientaenvioestupendoActualizar:
npm update herramientaenvioestupendo -gValidar version instalada:
estupendo --versionVer comandos disponibles:
estupendo --helpComandos disponibles
| Comando | Descripcion |
|---|---|
| send_txt | Envio masivo de archivos TXT |
| send_xml | Envio masivo de archivos XML |
| send_txt_CYP | Envio masivo TXT para empresas CYP |
| send_txt_Flexo | Envio masivo TXT para empresas Flexo |
| send_json_tramontina | Envio masivo JSON al endpoint /JsonTramontina: corrige comas colgantes del JSON antes de enviarlo |
| send_attached | Envio masivo attachedPdf |
| send_json | Envio masivo JSON nomina |
| send_nomina_xml | Envio masivo XML nomina |
| send_documento | Envio masivo XML al endpoint /documento: cuadra NIT, quita firma si tiene, correo receptor y fecha opcionales, prefijo SETT en pruebas, validacion FAU02/FAU04 y prefijo+secuencial personalizados (con -v) |
| request_document_race | Descarga XML y PDF de documentos recepcionados |
| send_db2_sp | Extrae documentos desde DB2/AS400 via SP y envia a la API |
Ejemplos basicos
estupendo send_txt -d "C:\ruta\archivos"
estupendo send_xml -d "C:\ruta\archivos"
estupendo send_attached -d "C:\ruta\archivos" -psend_documento
Envia XML al endpoint /documento. Antes de enviar cada archivo: quita la firma electronica si el XML la trae, agrega el correo del receptor solo si no tiene uno (parametro opcional), fuerza la fecha de emision solo si se envia por parametro, y en pruebas cambia las letras del prefijo del consecutivo por SETT (ej. FM19 -> SETT19; si el numero se sale del rango 1-5,000,000 lo ajusta con modulo). Tambien guarda el base64 de cada XML ya transformado (justo antes de enviarlo) en una carpeta xml/.
# Pruebas (por defecto), sin correo ni fecha forzada
estupendo send_documento -d "C:\ruta\xmls" -n 901985067 -t "MI_API_KEY"
# Pruebas, forzando correo del receptor y fecha de emision
estupendo send_documento -d "C:\ruta\xmls" -n 901985067 -t "MI_API_KEY" -c "[email protected]" -f "2026-07-28"
# Produccion
estupendo send_documento -d "C:\ruta\xmls" -n 901985067 -t "MI_API_KEY" -pValidacion -v (FAU02 / FAU04 / prefijo y secuencial personalizados)
Sin -v el documento se procesa y se envia tal cual, aunque la DIAN lo pueda rechazar. Con -v, antes de enviar cada XML:
- Convierte los
AllowanceChargeque sean un cargo (ChargeIndicator=true) en descuento:PriceAmount/BaseAmountquedan enBaseAmount + 3 x Amount,ChargeIndicatorpasa afalse, yLineExtensionAmountde esa linea queda en el nuevoBaseAmount - Amount. - FAU02: corrige
LegalMonetaryTotal/LineExtensionAmountpara que sea igual a la suma deLineExtensionAmountde todas lasInvoiceLine. - FAU04: corrige
LegalMonetaryTotal/TaxExclusiveAmountpara que sea igual a la suma deTaxTotal[1]/TaxSubtotal[1]/TaxableAmountde cadaInvoiceLine.
estupendo send_documento -d "C:\ruta\xmls" -n 901985067 -t "MI_API_KEY" -vPrefijo y secuencial personalizados: si ademas de -v se pasan --prefijo y --secuencial juntos, el cbc:ID del XML se reemplaza por prefijo + secuencial (ej. --prefijo SETP --secuencial 1 -> SETP1). El secuencial se incrementa en 1 solo cuando el documento anterior queda autorizado (estado === 2); si no queda autorizado, el siguiente documento reintenta con el mismo numero. Si falta --prefijo o --secuencial, no se toca el cbc:ID (se usa el que ya trae el XML, o el SETT automatico en pruebas).
estupendo send_documento -d "C:\ruta\xmls" -n 901985067 -t "MI_API_KEY" -v --prefijo SETP --secuencial 1Conector DB2 / AS400 por procedimientos almacenados
El comando send_db2_sp se conecta a una base de datos DB2 o IBM iSeries AS/400, ejecuta el SP de documentos pendientes, convierte las filas a JSON agrupadas por NumeroDocumento + TipoDocumento y las envia al endpoint HTTP con estructura { "documents": [] }.
El SP de pendientes debe devolver filas con la columna TipoRegistro segun el manual de emision por SP (Cabecera, Emisor, Cliente, Lineas, Impuestos, etc.).
Dependencias
DB2 directo (modo por defecto):
npm installAS/400 via ODBC:
- Instalar IBM i Access Client Solutions (incluye el driver ODBC)
- Instalar el paquete ODBC:
npm install odbcVariables de entorno soportadas
| Variable | Descripcion | Default |
|---|---|---|
| DB2_CONNECTION_STRING | Cadena de conexion completa | — |
| DB2_DRIVER | Driver: ibm_db u odbc | ibm_db |
| DB2_HOST | Host DB2 o SYSTEM del AS/400 | — |
| DB2_PORT | Puerto DB2 | 50000 |
| DB2_DATABASE | Nombre de la base de datos (ibm_db) | — |
| ODBC_DSN | Nombre del DSN ODBC configurado en Windows | — |
| DB2_LIBRARY | Libreria/schema del AS/400 (odbc) | *LIBL |
| DB2_USER | Usuario | — |
| DB2_PASSWORD | Password | — |
| DB2_LIMIT | Cantidad de documentos por ejecucion | 50 |
| DB2_SP_LIST_PENDING | SP de pendientes | Facture_Documents_Issue_ListPending |
| DB2_SP_UPDATE_STATUS | SP de actualizacion de estado | Facture_Documents_Issue_UpdateStatus |
| ESTUPENDO_DB2_API_URL | Endpoint que recibira el JSON | /api/load/array/data |
Parametros de linea de comandos
-n, --nit <char> NIT del emisor (requerido)
-l, --limit <number> Cantidad maxima de documentos (default: 50)
--connection-string <char> Cadena de conexion completa
--driver <char> Driver: ibm_db (default) u odbc
--host <char> Host DB2 o SYSTEM del AS/400
--port <char> Puerto DB2 (default: 50000)
--database <char> Base de datos DB2 (ibm_db)
--dsn <char> DSN ODBC configurado en Windows
--library <char> Libreria AS/400 (default: *LIBL)
--user <char> Usuario
--password <char> Password
--sp-list-pending <char> SP para listar documentos pendientes
--sp-list-extra-param <char> Tercer parametro del SP de pendientes
--sp-list-no-nit Pasa primer parametro como '' en vez del NIT
--sp-update-status <char> SP para actualizar estado
--api-url <char> Endpoint que recibe el JSON
--skip-update-status No ejecutar SP de actualizacion
--dry-run Solo extrae y guarda JSON local, no envia
-p, --prod Usar endpoint de produccionModo DB2 directo
# Solo extraer y guardar JSON local
estupendo send_db2_sp -n 900000000 --host 127.0.0.1 --database FACTURE \
--user db2user --password db2pass --dry-run
# Enviar a endpoint especifico
estupendo send_db2_sp -n 900000000 \
--connection-string "DATABASE=FACTURE;HOSTNAME=127.0.0.1;PORT=50000;PROTOCOL=TCPIP;UID=db2user;PWD=db2pass;" \
--api-url https://pruebas.estupendo.com.co/api/documentosModo AS/400 iSeries via ODBC
Opcion 1 — Con DSN configurado en el Administrador ODBC de Windows
estupendo send_db2_sp -n 900000000 --driver odbc --dsn NombreDSN \
--user usuario --password clave --dry-runOpcion 2 — Conexion directa al AS/400 (sin DSN)
estupendo send_db2_sp -n 900000000 --driver odbc --host 192.168.1.100 \
--library BIBLIOT --user usuario --password clave --dry-runOpcion 3 — Cadena de conexion ODBC completa
estupendo send_db2_sp -n 900000000 \
--connection-string "DRIVER={IBM i Access ODBC Driver};SYSTEM=192.168.1.100;UID=usuario;PWD=clave;DBQ=BIBLIOT;" \
--driver odbc --dry-runSP para IBM iSeries AS/400 con resultado unico (LISTPENDING_V2)
El driver ODBC odbc v2.5.0 (binario precompilado para Windows) no expone el metodo moreResults(), por lo que solo puede leer el primer result set de un SP con DYNAMIC RESULT SETS N.
Para solucionar esto se incluye el archivo LISTPENDING_V2.sql en la raiz del proyecto. Este archivo contiene el SP FLXAPLDAT.FACTURE_DOCUMENTS_ISSUE_LISTPENDING_V2 que:
- Usa
DYNAMIC RESULT SETS 1(un solo cursor de retorno) - Internamente crea una tabla de sesion
SESSION.ALLROWS_V2con todas las columnas comoVARCHAR - Inserta con
EXECUTE IMMEDIATElos datos de los 15 cursores reales del SP original - Retorna todas las filas en un unico
SELECT * FROM SESSION.ALLROWS_V2
Como instalar el SP en el AS/400:
Abrir ACS (IBM i Access Client Solutions) → Run SQL Scripts y ejecutar el contenido de LISTPENDING_V2.sql.
Como usarlo con el conector:
estupendo send_db2_sp \
-n 800184269 \
--driver odbc \
--dsn NombreDSN \
--user usuario \
--password clave \
--sp-list-pending FLXAPLDAT.FACTURE_DOCUMENTS_ISSUE_LISTPENDING_V2 \
--sp-list-extra-param "" \
--dry-runNo se requiere ninguna modificacion al conector Node.js: el resultado unico del V2 es leido directamente por el primer execute() del statement ODBC.
SP con schema personalizado
estupendo send_db2_sp -n 900000000 \
--sp-list-pending SCHEMA.Facture_Documents_Issue_ListPending \
--sp-update-status SCHEMA.Facture_Documents_Issue_UpdateStatus \
--dry-runArchivos de salida
| Ruta | Contenido |
|---|---|
| db2_payloads/db2_raw_documents_*.json | JSON agrupado tal como sale del SP |
| db2_payloads/db2_api_payload_*.json | JSON final enviado a la API |
| logs/Output_db2_sp_*.json | Log de la ejecucion con errores y respuestas |
