Sistema completo para emitir Documentos Tributarios Electronicos (DTE) conectado al ambiente de certificacion del Servicio de Impuestos Internos de Chile. Incluye backend Node.js + Express y panel administrativo React + Vite + Tailwind.
- Autenticacion con certificado digital
.pfx(X.509) - Generacion de DTE tipo 33 (Factura Electronica) y 39 (Boleta Electronica) en XML segun esquema del SII
- Firma digital XML con
xml-crypto(xmldsig enveloped, rsa-sha1) - Cliente SOAP para el WSDL del SII (
CrSeed,GetTokenFromSeed,DTEUpload,QueryEstUp) - Consulta de estado de envios mediante TRACKID
- Generacion/descarga de PDF con timbre electronico (QR)
- Persistencia en SQLite (
better-sqlite3) - Panel admin con formulario de emision, listado y detalle
- Node.js 18 o superior
- npm 9 o superior
- Un certificado digital tributario emitido por alguna Autoridad Certificadora aceptada por el SII (en formato
.pfxo.p12) - Estar registrado como contribuyente electronico de pruebas en el SII
- Compra un certificado digital tributario en alguno de los proveedores autorizados por el SII:
- E-Certchile (https://www.e-certchile.cl)
- E-Sign (https://www.esign.cl)
- Acepta (https://www.acepta.com)
- ToolNet/Firma Chile, entre otros
- Algunos proveedores ofrecen certificados de prueba gratuitos validos por un corto periodo (por ejemplo, E-Certchile ofrece demos). Contacta al proveedor para solicitarlo.
- El certificado te llegara como archivo
.pfxo.p12, protegido por una contrasena que tu defines al emitirlo. - Copia el archivo a la carpeta
backend/certs/(creala si no existe) y apunta la variableCERT_PFX_PATHa esa ruta.
- Accede a https://www.sii.cl con tu RUT y clave tributaria.
- Ingresa a Servicios online > Factura electronica > Sistema de facturacion gratuito del SII.
- Sigue el proceso de Postulacion a ser Facturador Electronico en el menu Certificacion y Autorizacion.
- El SII te entregara un set de pruebas con casos que debes emitir para certificarte. Cada set incluye los tipos de documento a emitir, montos, detalles y referencias.
- Descarga los Codigos de Autorizacion de Folios (CAF) de prueba desde el menu Folios del portal SII. Los CAF son archivos XML que autorizan rangos de folios para cada tipo de DTE.
- Coloca los CAF en
backend/certs/caf/(este repositorio contiene un placeholder en el campoTEDdel XML; debes integrar tus CAF reales para firmar el timbre y pasar la certificacion). - Una vez superado el set de pruebas, el SII te certifica como emisor electronico.
Nota: este sistema genera el XML del DTE valido segun el esquema del SII, pero el timbre electronico TED se emite con un placeholder. Para pasar la certificacion SII debes reemplazar ese bloque cargando tus CAFs autorizados y firmando el bloque
<DD>con la clave privada asociada al CAF (distinta a la del certificado tributario).
cd backend
npm install
cp .env.example .env
# Editar .env con tus datos realescd frontend
npm install| Variable | Descripcion |
|---|---|
RUT_EMPRESA |
RUT del emisor (formato 12345678-9) |
CERT_PFX_PATH |
Ruta al archivo .pfx del certificado digital |
CERT_PFX_PASSWORD |
Contrasena del certificado |
RAZON_SOCIAL |
Razon social del emisor |
GIRO |
Giro comercial |
DIRECCION |
Direccion de casa matriz |
COMUNA |
Comuna de casa matriz |
CIUDAD |
Ciudad |
PORT |
Puerto del backend (default 3000) |
SII_AMBIENTE |
certificacion o produccion |
SII_URL_BASE |
URL base del SII (https://maullin.sii.cl/DTEWS para certificacion) |
FECHA_RESOLUCION |
Fecha de resolucion SII que autoriza DTE |
NUMERO_RESOLUCION |
Numero de resolucion (usar 0 en certificacion) |
cd backend
npm start
# o en desarrollo con recarga automatica
npm run devcd frontend
npm run devLuego abre http://localhost:5173 en tu navegador.
GET /api/health- Estado del backend y configuracionGET /api/auth/cert- Verifica que el.pfxse cargue correctamenteGET /api/auth/semilla- Solicita una semilla al SIIGET /api/auth/token- Obtiene un token de sesion del SII (semilla firmada)
GET /api/dte- Lista todos los DTEsPOST /api/dte/emitir- Emite y firma un nuevo DTE{ "tipo": 33, "rutReceptor": "12345678-9", "razonSocialReceptor": "Cliente Demo SpA", "giroReceptor": "Comercio", "direccionReceptor": "Calle Falsa 123", "comunaReceptor": "Santiago", "items": [ { "nombre": "Servicio consultoria", "cantidad": 1, "precio": 100000 } ] }GET /api/dte/:id- Detalle completo del DTEGET /api/dte/:id/xml- Descarga el XML firmadoGET /api/dte/:id/pdf- Descarga la representacion impresa PDFPOST /api/dte/:id/enviar- Envia el DTE al SII (retorna TRACKID)GET /api/dte/:id/estado- Consulta el estado del envio en el SII
01_sii_facturacion_electronica/
├── backend/
│ ├── package.json
│ ├── .env.example
│ ├── data/ # Base SQLite (ignorada en git)
│ └── src/
│ ├── server.js # Entrada Express
│ ├── db.js # Capa SQLite
│ ├── routes/
│ │ ├── dte.js # Rutas REST de DTEs
│ │ └── auth.js # Rutas de autenticacion SII
│ ├── services/
│ │ ├── signer.js # Carga .pfx y firma XML con xml-crypto
│ │ ├── dte.js # Genera XML del DTE tipo 33/39
│ │ ├── sii.js # Cliente SOAP/HTTP del SII
│ │ └── pdf.js # Genera PDF con timbre QR
│ └── templates/
│ ├── dte_33.xml # Plantilla referencia factura
│ └── dte_39.xml # Plantilla referencia boleta
├── frontend/
│ ├── package.json
│ ├── vite.config.js
│ ├── tailwind.config.js
│ ├── postcss.config.js
│ ├── index.html
│ └── src/
│ ├── main.jsx
│ ├── App.jsx
│ ├── api.js # Cliente del backend
│ ├── index.css
│ └── pages/
│ ├── Emitir.jsx
│ ├── Listado.jsx
│ └── Detalle.jsx
├── README.md
└── .gitignore
- El timbre electronico TED se emite con un placeholder. Para pasar la certificacion SII debes integrar tus CAFs reales firmando el bloque
<DD>con la clave privada del CAF. - El cliente SOAP esta implementado con
axiosy XML manual en vez de una libreria WSDL. Esto es intencional: los servicios del SII usan namespaces idiosincraticos y es mas robusto armar el SOAP a mano. - La firma del DTE usa
rsa-sha1porque es el algoritmo exigido por el esquema del SII. No cambiar a sha256 salvo que el SII lo documente. - El PDF generado es una representacion simplificada; para produccion se recomienda ajustar el diseno al formato de cedible oficial.
Hector Riquelme