电子发票工具包

Hacienda CR 是一个开源的 TypeScript 工具包,用于哥斯达黎加电子发票的生成、签名、提交和状态查询,可集成到应用程序、命令行或 AI 助手中。

  • by DojoCodingLabs
  • TypeScript
  • 本地部署
  • 25 星标
  • 更新于
在 GitHub 查看 DojoCodingLabs/hacienda-cr

使用说明

Hacienda CR

Facturación electrónica para Costa Rica, desde tu código, tu terminal o tu asistente de IA.

Toolkit open-source en TypeScript para trabajar con comprobantes electrónicos v4.4 del Ministerio de Hacienda: autenticación OAuth2, generación de XML, firma XAdES-EPES, cálculo de IVA y consulta de estados.

Casos de uso · Empezar · Documentación · Contribuir · Reportar un problema

Consultá las versiones publicadas y sus archivos verificados en GitHub Releases.

La visión: facturación dentro de tu producto

Que cada venta pueda convertirse en un comprobante electrónico desde el mismo lugar donde ocurre. Un checkout, una caja, un sistema de gestión o una conversación con un asistente pueden ser el punto de partida.

Hacienda CR aporta una base común para construir esos flujos: tu aplicación define la experiencia, conecta sus datos y usa el toolkit para generar, firmar, enviar y consultar comprobantes. La integración con Hacienda pasa a formar parte de tu producto, con código abierto que podés inspeccionar y adaptar.

La visión es una infraestructura abierta de facturación electrónica para Costa Rica: que más equipos puedan lanzar productos con facturación integrada y dedicar su esfuerzo a las necesidades de sus clientes.

Qué podés construir

1. Un SaaS que factura desde su propio panel

Para equipos que desarrollan software de gestión o servicios por suscripción. Al cerrar una orden o registrar un cobro, tu backend toma los datos del cliente, calcula los impuestos y genera el comprobante. Tu panel muestra si Hacienda lo aceptó o rechazó, junto con el motivo.

Valor para tu cliente: gestionar su operación y su facturación en una misma experiencia. Usá el SDK; tu aplicación administra las empresas, sus credenciales, los cobros y la programación de renovaciones.

2. Una tienda que conecta pedidos con comprobantes

Para ecommerce y plataformas de ventas. Cuando tu sistema confirma el pago de un pedido, podés iniciar el flujo de factura electrónica con el SDK y asociar la clave y el estado al pedido. Ante una devolución, podés construir una nota de crédito referenciada al comprobante original.

Valor para tu negocio: evitar volver a digitar una venta para facturarla. Tu tienda conecta su proveedor de pagos y decide cuándo emitir y cómo entregar el comprobante al comprador.

3. Un punto de venta con facturación integrada

Para productos de caja, restaurantes y comercios. Al cerrar una venta, tu aplicación puede generar una factura o un tiquete, calcular el IVA y enviar el XML firmado mediante el SDK. Para un ajuste posterior, puede generar la nota de crédito o débito correspondiente.

Valor para el comercio: convertir la facturación en un paso del flujo de caja, usando los datos que ya capturó el negocio.

4. Un ERP que incorpora el ciclo de comprobantes

Para equipos que integran ventas, compras y contabilidad. Podés conectar una orden con su factura, consultar el estado en Hacienda y construir mensajes de receptor para aceptar o rechazar comprobantes recibidos. Tu sistema conserva la relación entre la operación y sus documentos.

Valor para el equipo administrativo: seguir cada comprobante desde su sistema de gestión. Usá el SDK para la integración y la CLI para consultas y validaciones operativas.

5. Automatización para un despacho contable

Para desarrolladores que apoyan a contadores o administran varias empresas. Un script puede usar perfiles de la CLI para validar archivos, consultar comprobantes y devolver resultados con --json. Antes de enviar una factura, --dry-run permite revisar el XML generado.

Valor para el despacho: transformar tareas repetidas en flujos reproducibles y detectar errores antes del envío. El equipo define los datos de entrada y revisa los resultados.

6. Un asistente que prepara la factura por vos

Para productos con asistentes de IA y equipos que usan clientes MCP. Una persona describe el servicio, el cliente y el monto; el asistente usa el servidor MCP para preparar el borrador, consultar al contribuyente y generar XML sin firmar. Después, tu flujo permite revisar los datos y completar la firma y el envío con el SDK o la CLI.

Valor para quien factura: pasar de una conversación a un documento estructurado, con una etapa de revisión antes de emitirlo.

Elegí un flujo y probalo en sandbox: empezá con una operación de tu producto, generá su comprobante y consultá la respuesta de Hacienda. Los ejemplos de abajo te dan el punto de entrada para cada herramienta.

Elegí tu herramienta

Paquete Para qué usarlo Documentación
@dojocoding/hacienda-sdk Integrar autenticación, XML, firma y API en tu aplicación. SDK
@dojocoding/hacienda-cli Crear borradores, validar, firmar, enviar y consultar desde la terminal. CLI
@dojocoding/hacienda-mcp Generar borradores y XML con asistentes que soportan MCP. MCP

El SDK y la CLI permiten trabajar en sandbox y producción. El servidor MCP genera XML sin firmar; completá la firma y el envío con el SDK o la CLI.

Empezá acá

Necesitás Node.js 22+. Para autenticarte, usá tus credenciales del IDP de Hacienda del ambiente elegido. Para firmar y enviar comprobantes, necesitás además un certificado .p12 y su PIN.

SDK: desde tu aplicación

npm install @dojocoding/hacienda-sdk

Definí HACIENDA_USERNAME y HACIENDA_PASSWORD en tu entorno y ejecutá este ejemplo en un módulo TypeScript:

import {
  HaciendaClient,
  Environment,
  IdType,
  DocumentType,
  Situation,
} from "@dojocoding/hacienda-sdk";

const client = new HaciendaClient({
  environment: Environment.Sandbox,
  credentials: {
    idType: IdType.PersonaJuridica,
    idNumber: "3101234567", // Reemplazá por tu cédula jurídica.
    username: process.env.HACIENDA_USERNAME!, // Full issued IDP username.
    password: process.env.HACIENDA_PASSWORD!,
  },
});

await client.authenticate();

const clave = client.buildClave({
  date: new Date(),
  taxpayerId: "3101234567",
  documentType: DocumentType.FACTURA_ELECTRONICA,
  sequence: 1, // Asigná un consecutivo único para cada comprobante.
  situation: Situation.NORMAL,
});

console.log(clave); // Clave numérica de 50 dígitos.

Continuá con creación de documentos, firma digital y envío y consulta. HaciendaClient gestiona autenticación y claves; las operaciones de XML, firma y envío se usan como funciones del SDK.

CLI: desde tu terminal

npm install -g @dojocoding/hacienda-cli

# Definí HACIENDA_USERNAME y HACIENDA_PASSWORD antes de autenticarte.
hacienda auth login --cedula-type 02 --cedula 3101234567 --environment sandbox

# Creá y validá un borrador.
hacienda draft --interactive --output factura.json
hacienda validate factura.json

# Revisá el XML antes de enviarlo.
hacienda submit factura.json --dry-run

# Consulta pública, sin autenticación.
hacienda lookup 3101234567

Para enviar, configurá el certificado y el PIN según la referencia de la CLI. Los comandos admiten --json para automatización.

MCP: desde tu asistente de IA

Agregá este servidor a la configuración MCP de tu cliente (por ejemplo, Claude Desktop):

{
  "mcpServers": {
    "hacienda-cr": {
      "command": "npx",
      "args": ["-y", "@dojocoding/hacienda-mcp"]
    }
  }
}

Probá: “Generá un borrador de factura por dos horas de consultoría a ₡50.000 cada una con IVA del 13%.”

Herramientas: draft_invoice, create_invoice, lookup_taxpayer, check_status, list_documents y get_document. Consultá configuración, parámetros y recursos MCP.

Comprobantes soportados

Comprobante Builder del SDK
Factura Electrónica buildFacturaXml()
Nota de Débito Electrónica buildNotaDebitoXml()
Nota de Crédito Electrónica buildNotaCreditoXml()
Tiquete Electrónico buildTiqueteXml()
Factura Electrónica de Compra buildFacturaCompraXml()
Factura Electrónica de Exportación buildFacturaExportacionXml()
Recibo Electrónico de Pago buildReciboPagoXml()
Mensaje Receptor (aceptación o rechazo) buildMensajeReceptorXml()

Documentación

Verificación de firma

verifySignedDocumentXml (SDK) verifica el comprobante que el propio SDK firma: los digests de cada referencia, la firma RSA sobre el ds:SignedInfo canónico, la canonicalización declarada, la vigencia del certificado, la política de firma (identificador, método de digest y hash contra la política publicada) y la identidad de las partes contra la clave. El tipo de comprobante sale de la raíz del documento, nunca del contenido.

La confianza la establece el pin de hoja que provee el consumidor: el certificado embebido en el documento no establece confianza, no se valida cadena de CA ni revocación, y nada sale a la red. Sin pin, el resultado declara la confianza como no establecida y no es válido.

Verificar una firma no es aceptación fiscal. El verificador no consulta a Hacienda, no habilita regímenes y no sustituye la respuesta del API: un documento puede verificar criptográficamente y ser rechazado. La aceptación real sólo la establece Hacienda sobre el documento enviado.

Credenciales y configuración

Variable Uso
HACIENDA_USERNAME Usuario IDP completo emitido por Hacienda; conserva guiones y dominio.
HACIENDA_PASSWORD Contraseña del IDP de Hacienda.
HACIENDA_P12_PATH Ruta al certificado .p12 para los comandos que la admiten.
HACIENDA_P12_PIN PIN del certificado .p12.

Los perfiles se guardan en ~/.hacienda-cr/config.toml. Las contraseñas y PINs se suministran por variables de entorno y no se guardan en los perfiles. Empezá con sandbox antes de usar credenciales de producción.

Descargas históricas de npm

El contador suma las descargas de SDK, CLI, MCP y shared, desde la creación de cada paquete hasta el último día disponible en npm. Son descargas del registro, incluyendo CI y dependencias transitivas; no representan instalaciones únicas ni personas.

Ver totales por paquete y fecha de corte. El workflow de actualización actualiza el contador diariamente y también puede ejecutarse manualmente.

Desarrollo y contribuciones

Para desarrollar en este repositorio, usá Node.js 22.13+ y la versión de pnpm declarada en package.json. Los paquetes publicados conservan su requisito Node.js 22+.

git clone https://github.com/DojoCodingLabs/hacienda-cr.git
cd hacienda-cr
pnpm install
pnpm verify
packages/sdk/   Autenticación, XML, firma digital, impuestos y API
packages/cli/   Binario hacienda
packages/mcp/   Servidor MCP con transporte stdio
shared/         Tipos, esquemas y constantes compartidos
docs/           Referencia, banner y métricas de npm

Para trabajar en un paquete: pnpm --filter @dojocoding/hacienda-sdk test.

Catálogos de códigos y sus alias

Los catálogos de códigos se generan desde packages/sdk/schemas/codes.json con pnpm spec:generate y viven en shared/src/generated/ (nunca se editan a mano: cada archivo empieza con NO EDITAR). El registro de parejas tabla→export vive en scripts/codes-generate/table-map.mjs; cuando Hacienda publica un código nuevo, se amplía ahí con la clave revisada y se regenera.

Ese mismo registro declara los alias deprecados que la API publicada expone y que el generador no emite (no son códigos del XSD, son nombres heredados de un código canónico):

Alias Código canónico Motivo
DocumentTypeCode.COMPRA_PAGO DocumentTypeCode.FACTURA_ELECTRONICA_COMPRA (08) nombre heredado de la factura electrónica de compra
DocumentTypeCode.GASTO_VIAJE DocumentTypeCode.FACTURA_ELECTRONICA_EXPORTACION (09) nombre heredado de la factura electrónica de exportación

La paridad de valor no los cuenta (no hay tabla que los pardee); una prueba verifica que cada alias declarado siga publicado y apunte a su código canónico.

Encontrá trabajo en Issues, abrí un issue con pasos para reproducir un error o proponé una mejora. Para contribuir código, hacé un fork, creá una rama, agregá los tests correspondientes y ejecutá los checks anteriores antes de abrir un pull request. Usamos Changesets para versionar los paquetes.

Agradecimientos

Gracias a CRLibre/API_Hacienda y CRLibre/fe-hacienda-cr-misc por sus referencias y recursos para la comunidad de facturación electrónica costarricense.

Licencia

MIT. Construido por Dojo Coding para la comunidad de desarrolladores de Costa Rica 🇨🇷.

Guías para contribuidores: desarrollo y pruebas y versionado y publicación.

The additive exact decimal ordinary FE API preserves supported financial strings through BigInt calculation, JSON and XML; legacy numeric APIs are unchanged. Its explicit IVA13/full-payment scope does not imply all domestic fiscal cases or external acceptance.

El simulador de transporte es una herramienta interna en packages/mock; no está publicado en npm ni establece aceptación fiscal.