Saltar al contenido
dte-sdk

Introducción

dte-sdk crea, timbra y firma DTE (Documento Tributario Electrónico) de Chile como los espera el SII, los envía por los servicios web del SII y les hace seguimiento. También cubre lo que rodea a la emisión: la verificación de los documentos que te envían tus proveedores, los libros del SII, el portal del SII autenticado con certificado (folios, el registro de compras y ventas, el respaldo MIPYME, la verificación de actividades), el proceso de certificación y las muestras impresas. La API está en inglés legible, con documentación bilingüe (EN/ES) en cada campo.

No está listo para producción. La 0.8.0 de dte-sdk está en npm, la versión más reciente, y estas páginas la documentan. La 1.0.0 será la primera recomendada para producción. Hasta entonces la API puede cambiar en cualquier versión, y buena parte de lo documentado aquí todavía no se ha probado contra el SII real: revisa el Estado del proyecto.

Qué cubre#

Todo está probado contra respuestas sintéticas del SII, con una barrera de cobertura de 100 % en CI. La página de estado del proyecto dice, área por área, qué ya se probó contra el SII real.

Documentos y totales

Tipos de documento 33, 34, 39, 41, 43, 46, 52, 56 y 61. Se valida la entrada, se sanea el texto, se exigen los largos del esquema y los totales se calculan con redondeo por línea.

TED y firmas

El timbre electrónico (TED) firmado con la llave del CAF y la firma XMLDSig envuelta hecha con tu certificado. Los documentos que envía un proveedor se revisan igual: firma, timbre y la firma del SII sobre su CAF.

Sobres

EnvioDTE y EnvioBOLETA con su carátula y su SetDTE firmado.

Servicios web del SII

Semilla y token, envíos, estado de sobres y documentos, sondeo, aceptación y reclamos con la regla de los ocho días, y el registro público de emisores autorizados. Transporte inyectable, reintentos, una caché de tokens que puede vivir en disco y captura HTTP con datos sensibles tachados.

Libros del SII

El libro de compras y ventas, el libro de guías de despacho y el reporte de consumo de folios, con sus resúmenes calculados desde las líneas.

Portal del SII y folios

Ingreso con certificado, datos de la empresa, la verificación de actividades, cupo de folios, solicitud de CAF, anulación y recuperación, un registro local de folios y la búsqueda de archivos CAF en disco.

Registro de compras y ventas

Los documentos y los resúmenes oficiales de un período, el catálogo de los 49 códigos de documento del registro, la reclasificación de compras y el respaldo MIPYME con el XML de los documentos emitidos y recibidos.

Muestras impresas

Un PDF por documento según el manual del SII, con su timbre PDF417 y la oficina del SII de la comuna del emisor.

Certificación

Los sets de pruebas del SII leídos y emitidos, sus libros, la simulación, las respuestas de intercambio, un ejecutor reanudable y la certificación de boletas.

Dos propiedades valen para todo lo anterior. El modelo de dominio está en inglés (totalAmount, issuer.businessName) y se traduce a las etiquetas oficiales del SII (MntTotal, RznSoc) mediante un códec. Los errores son valores DteError tipados, con códigos estables y sin datos personales en sus mensajes (Errores).

El ciclo de vida de un vistazo#

Todo documento pasa por los mismos pasos. Cada función recibe el resultado de la anterior y los tipos impiden saltarse un paso: no puedes firmar un documento que no se ha timbrado.

PasoFunciónQué ocurre
1. CrearcreateDocument()Valida la entrada, sanea el texto, numera las líneas y calcula los totales
2. TimbrarstampDocument()Arma el TED y lo firma con la llave privada del CAF
3. FirmarsignDocument()Firma el documento con tu certificado (XMLDSig envuelta); el resultado trae el XML final
1 a 3 de una vezissueDocument()Ejecuta los tres pasos anteriores en una sola llamada
4. SobrecreateEnvelope(), signEnvelope()Agrupa documentos firmados bajo una carátula y firma el SetDTE (EnvioDTE o EnvioBOLETA)
5. EnviarcreateSiiClient(), uploadEnvelope()Se autentica con el SII y sube el sobre; devuelve un track id
6. SeguirwaitForUploadStatus()Consulta al SII hasta que el envío deja de estar pendiente

El mismo patrón se repite para los libros (createPurchaseSalesBook(), signPurchaseSalesBook(), uploadBook()) y el reporte de consumo de folios. El Inicio rápido recorre todo el camino.

Ejemplo rápido#

TypeScript
import { readFileSync } from 'node:fs'
import { loadCertificateFromPkcs12, parseCaf, issueDocument, createEnvelope, signEnvelope, encodeLatin1 } from 'dte-sdk'
 
const certificate = loadCertificateFromPkcs12(readFileSync('firma.pfx'), process.env.PFX_PASSWORD!)
const caf = parseCaf(readFileSync('caf-33.xml', 'utf8'))
 
const invoice = issueDocument({
  document: {
    type: 33,
    folio: 1,
    issuer: {
      rut: '76543210-3',
      businessName: 'Comercial Andina SpA',
      businessActivity: 'Software',
      address: 'Av. Los Aromos 1540',
      commune: 'Santiago',
      activityCode: 620200,
    },
    receiver: {
      rut: '12345678-5',
      businessName: 'Comercializadora Rapel Ltda',
      businessActivity: 'Comercio',
      address: 'Pasaje Los Olmos 88',
      commune: 'Providencia',
    },
    items: [{ name: 'Plan anual', quantity: 1, unitPrice: 100000 }],
  },
  caf,
  certificate,
})
 
invoice.header.totals // { netAmount: 100000, vatRate: 19, vatAmount: 19000, totalAmount: 119000 }
invoice.xml // <DTE> firmado, con su TED
 
const envelope = signEnvelope(
  createEnvelope({
    kind: 'dte',
    documents: [invoice],
    cover: {
      issuerRut: '76543210-3',
      senderRut: certificate.rut!,
      resolutionDate: '2024-01-15',
      resolutionNumber: 123,
    },
  }),
  certificate,
)
 
encodeLatin1(envelope.xml) // bytes ISO-8859-1, tal como los recibe el SII

El Inicio rápido continúa desde aquí: envía el sobre al ambiente de certificación del SII y lee la respuesta.

Qué necesitas#

El paquete se ocupa del formato, la criptografía y el transporte. Para emitir documentos que el SII acepte necesitas además tres cosas que solo entregan el SII y un proveedor de certificados:

  • Un CAF (Código de Autorización de Folios) por cada tipo de documento que emitas: el archivo que autoriza un rango de folios. Contiene una llave privada, así que es un secreto.
  • Un certificado digital, como archivo .pfx o .p12 o como PEM, de una persona autorizada para firmar por la empresa. También es un secreto.
  • Autorización como emisor electrónico: el número y la fecha de la resolución del SII, o el proceso de certificación (el ambiente de pruebas del SII) mientras validas tu sistema.

Conceptos básicos explica cada uno. Lee Seguridad antes de ponerlos en un servidor.

Puntos de entrada#

El paquete tiene cuatro entradas, separadas según lo que necesitan del entorno de ejecución. DteError y isDteError vienen de dte-sdk y reconocen lo que lanza cualquier entrada. Puntos de entrada explica la separación.

Importa desdeQué contieneDónde corre
dte-sdkDocumentos, timbres, firmas, sobres, libros, la verificación de documentos recibidos, el cliente de los servicios web del SII sobre fetch y el registro público de emisores autorizadosNode, Bun, Deno; se empaqueta para el navegador sin configuración
dte-sdk/nodeAdaptadores de Node: transporte HTTPS, captura HTTP, archivo de envíos, caché de tokens y sesiones, registro de folios y búsqueda de archivos CAF en discoNode
dte-sdk/portalPortal del SII, folios y solicitud de CAF, registro de compras y ventas, respaldo MIPYME, verificación de actividades y certificaciónNode
dte-sdk/pdfMuestras impresas y la oficina del SII de cada comunaNode, con pdf-lib y bwip-js instalados

Siguientes pasos#

Licencia#

MIT © Arrow Software. Uso libre personal y comercial, incluso en productos cerrados y de pago, sin más obligación de atribución que conservar el aviso de licencia.