fvildoso / sii-dte-php
Librería PHP para integración con DTE (Documentos Tributarios Electrónicos) del SII de Chile
Requires
- php: >=8.4
- ext-curl: *
- ext-dom: *
- ext-libxml: *
- ext-openssl: *
- ext-soap: *
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.0
- phpstan/phpstan: ^2.2
- phpunit/phpunit: ^10.0
Suggests
None
Provides
None
Conflicts
None
Replaces
None
This package is auto-updated.
Last update: 2026-11-07 22:47:52 UTC
README
Librería PHP moderna y tipada para la emisión e integración de Documentos Tributarios Electrónicos (DTE) con el Servicio de Impuestos Internos (SII) de Chile.
Características
- Autenticación SII: Obtención de semilla, firma y token de sesión con renovación y caché automática.
- Generación y Firma XML: Construcción conforme al estándar XMLDSig y esquema EnvioDTE del SII.
- Cálculo de Totales: Desglose automático de montos netos, IVA (19%), montos exentos y totales.
- Gestión de CAF y Folios: Asignación atómica y control de concurrencia con
FolioManager(SELECT FOR UPDATE). - Seguridad de Certificados: Carga desde archivo
.p12/.pfxo base64 (CertificateStore), con validación de fechas de vigencia y bloqueo de rutas públicas. - Persistencia y Trazabilidad: Repositorio PDO opcional (
DteRepository) para registrar XML emitidos, Track IDs y estados. - Plantillas HTML para PDF: Generación de plantillas listas para renderizar mediante librerías como Dompdf.
Tipos de DTE soportados
| Código | Nombre | IVA | Consideraciones |
|---|---|---|---|
| 33 | Factura Electrónica | Afecta | Requiere datos completos del receptor y giro. |
| 34 | Factura No Afecta o Exenta | Exenta | No genera débito fiscal. |
| 39 | Boleta Electrónica | Afecta | Venta a consumidor final. |
| 41 | Boleta No Afecta o Exenta | Exenta | Boleta para operaciones exentas de IVA. |
| 46 | Factura de Compra | Afecta | Emitida por el comprador cuando retiene IVA. |
| 52 | Guía de Despacho | Afecta | Requiere indicador de traslado (ind_traslado). |
| 56 | Nota de Débito | Afecta | Requiere nodo de referencia al documento original. |
| 61 | Nota de Crédito | Afecta | Requiere nodo de referencia y código de corrección. |
| 110 | Factura de Exportación | Sin IVA | Operaciones internacionales en moneda extranjera. |
| 111 | Nota de Débito de Exportación | Sin IVA | Ajustes a facturas de exportación. |
| 112 | Nota de Crédito de Exportación | Sin IVA | Correcciones a facturas de exportación. |
Requisitos
- PHP 8.4 o superior.
- Extensiones PHP requeridas:
ext-soapext-opensslext-domext-libxmlext-curlext-pdo(opcional, si se utilizaFolioManageroDteRepository)
Instalación
Instala el paquete vía Composer:
composer require fvildoso/sii-dte-php
Guía de uso
1. Base de datos (Opcional)
Si utilizas persistencia y gestión automática de folios, ejecuta las migraciones SQL disponibles en database/migrations.sql (compatible con MySQL 8+ y PostgreSQL 14+):
# MySQL / MariaDB mysql -u usuario -p mi_base_de_datos < database/migrations.sql # PostgreSQL psql -U usuario -d mi_base_de_datos -f database/migrations.sql
También se incluyen adaptadores para frameworks en el directorio
database/migrations/(Laravel, Doctrine/Symfony, CakePHP, Phinx y Phalcon).
2. Carga del Certificado Digital
El certificado .p12 o .pfx debe almacenarse fuera de directorios accesibles vía web.
use SiiDte\Storage\CertificateStore; // Desde archivo local $certStore = CertificateStore::fromFile( '/var/secure/certs/empresa.p12', getenv('SII_CERT_PASS') ); // O desde variable de entorno en Base64 (ideal para contenedores y CI/CD) $certStore = CertificateStore::fromEnv('SII_CERT_B64', 'SII_CERT_PASS');
3. Cargar CAF (Código de Autorización de Folios)
Para que la librería asigne folios correlativos automáticamente:
use SiiDte\Folio\FolioManager; $pdo = new PDO('mysql:host=localhost;dbname=mi_bd;charset=utf8mb4', 'user', 'pass'); $folioManager = new FolioManager($pdo); // Importar el XML del CAF descargado desde el portal del SII $cafXml = file_get_contents('/ruta/segura/caf_tipo33.xml'); $folioManager->importarCaf($cafXml, tipoDte: 33); // Consultar folios disponibles $disponibles = $folioManager->foliosDisponibles(33);
4. Inicializar SiiClient
use SiiDte\SiiClient; use SiiDte\Folio\FolioManager; use SiiDte\Storage\CertificateStore; use SiiDte\Storage\DteRepository; $certStore = CertificateStore::fromFile('/var/secure/certs/empresa.p12', getenv('SII_CERT_PASS')); $pdo = new PDO('mysql:host=localhost;dbname=mi_bd;charset=utf8mb4', 'user', 'pass'); $folioManager = new FolioManager($pdo); $dteRepo = new DteRepository($pdo); $client = new SiiClient( config: [ 'rut_emisor' => '76123456', 'dv_emisor' => '0', 'razon_social' => 'Mi Empresa SpA', 'giro' => 'Servicios Informáticos', 'direccion' => 'Av. Providencia 1234, Of. 501', 'ciudad' => 'Santiago', 'codigo_actividad' => '620200', 'numero_resolucion' => 0, // 0 durante certificación 'fecha_resolucion' => '2019-10-18', // Fecha de resolución 'ambiente' => 'certificacion', // 'certificacion' o 'produccion' ], certStore: $certStore ); // Vincular componentes opcionales $client ->usarFolioManager($folioManager) ->usarRepositorio($dteRepo);
5. Emitir un DTE
use SiiDte\Document\DteTypes; $resultado = $client->enviarDte(DteTypes::FACTURA_ELECTRONICA, [ 'fecha' => date('Y-m-d'), 'receptor' => [ 'rut' => '77987654', 'dv' => '3', 'razon_social' => 'Cliente SpA', 'giro' => 'Comercio General', 'direccion' => 'Av. Las Condes 567', 'ciudad' => 'Santiago', ], 'detalle' => [ [ 'codigo' => 'SERV-01', 'nombre' => 'Consultoría Técnica', 'cantidad' => 1, 'precio_unitario' => 150000, // Precio neto ], ], ]); echo "DTE emitido exitosamente.\n"; echo "Folio asignado: " . $resultado['folio'] . "\n"; echo "Track ID SII: " . $resultado['trackId'] . "\n";
Para especificaciones de estructuras y campos soportados por tipo de documento, consulta estructura_datos.md.
6. Consultar Estado en el SII
El SII procesa los envíos de forma asíncrona. Puedes consultar el estado del envío mediante el Track ID:
$estado = $client->consultarEstado($resultado['trackId']); // Códigos de estado habituales: // EPR: Envejecimiento / Aceptado // RSC: Rechazado // SOK: En proceso echo "Estado: " . $estado['estado'] . " - " . $estado['glosa'] . "\n";
Para procesar en segundo plano todos los DTE que estén pendientes en la base de datos (por ejemplo, mediante una tarea Cron):
// Tarea cron programada periódicamente: $resultados = $client->procesarPendientes();
7. Renderizar a PDF
La librería provee un generador de plantilla HTML estructurada:
$html = $client->generarHtmlPdf($resultado['xml'], [ 'logo_url' => 'https://miempresa.cl/assets/logo.png', 'color_primario' => '#1e3a8a', ]); // Renderizado con Dompdf (requiere dompdf/dompdf): $dompdf = new \Dompdf\Dompdf(); $dompdf->loadHtml($html); $dompdf->setPaper('letter', 'portrait'); $dompdf->render(); file_put_contents("dte_{$resultado['folio']}.pdf", $dompdf->output());
Estructura del repositorio
sii-dte-php/
├── src/
│ ├── SiiClient.php # Fachada y orquestador principal
│ ├── Auth/TokenManager.php # Autenticación y tokens del SII
│ ├── Document/
│ │ ├── DteBuilder.php # Generador de XML DTE
│ │ └── DteTypes.php # Tipos de DTE y constantes
│ ├── Envelope/EnvelopeBuilder.php# Generador de sobre EnvioDTE
│ ├── Exceptions/ # Excepciones de dominio
│ ├── Folio/FolioManager.php # Gestión de CAF y folios
│ ├── Pdf/PdfGenerator.php # Generador de HTML para representación impresa
│ ├── Signature/XmlSigner.php # Firma digital XMLDSig
│ ├── Storage/
│ │ ├── CertificateStore.php # Manejo de certificados (.p12/.pfx)
│ │ └── DteRepository.php # Persistencia en BD
│ └── Utils/
│ ├── RutHelper.php # Utilidades de validación y formateo de RUT
│ └── SiiWebService.php # Cliente HTTP SOAP/REST hacia el SII
├── database/ # Migraciones SQL y esquemas por framework
├── examples/ # Scripts de ejemplo de integración
├── tests/ # Suite de pruebas unitarias y de integración
├── estructura_datos.md # Diccionario de datos y payloads por DTE
├── composer.json
└── LICENSE
Entornos del SII
| Parámetro | Ambiente | URL Web Service |
|---|---|---|
'certificacion' |
Maullin (Pruebas) | https://maullin.sii.cl/ |
'produccion' |
Producción | https://palena.sii.cl/ |
Enlaces de Referencia
- Portal Facturación Electrónica SII
- Formatos y Esquemas Técnicos DTE
- Ambiente de Certificación SII (Maullín)
Publicación de releases
Al completar correctamente las pruebas, cada push a main crea o reutiliza un release de GitHub para el commit verificado y solicita a Packagist que actualice el paquete. Los pull requests y las ramas distintas de main solo ejecutan CI.
Las versiones siguen el formato vYYYY.MM.DD-<run_id>+<sha_corto> (por ejemplo, v2026.11.07-123456+abcdef0): la fecha corresponde al inicio UTC de la ejecución de GitHub Actions, el identificador de ejecución distingue las publicaciones del día y el SHA permite rastrear el commit. Composer normaliza el guion posterior a la fecha igual que el separador anterior y elimina los metadatos de compilación (+<sha>); por ello, el SHA no interviene en la comparación de versiones.
Para habilitar la actualización automática, configura estos secretos en Settings → Secrets and variables → Actions del repositorio:
PACKAGIST_USERNAME: usuario de Packagist.PACKAGIST_API_TOKEN: token de API de Packagist (el token seguro basta para solicitar la actualización).
El paquete debe estar registrado previamente en Packagist. El workflow no mueve etiquetas ya creadas: publica el release y solicita la actualización de Packagist solo cuando la etiqueta nueva o existente apunta al commit probado. Si se reintenta una ejecución, reutiliza la etiqueta y el release existentes solo si apuntan al mismo commit.
Licencia
Este proyecto está licenciado bajo la licencia MIT. Consulta el archivo LICENSE para más detalles.