{"id":41640373,"url":"https://github.com/bryancalisto/ec-sri-invoice-signer","last_synced_at":"2026-04-02T22:10:28.890Z","repository":{"id":65952085,"uuid":"603288985","full_name":"bryancalisto/ec-sri-invoice-signer","owner":"bryancalisto","description":"🇪🇨 Ecuador's SRI documents signer written in pure TypeScript","archived":false,"fork":false,"pushed_at":"2026-02-23T18:03:34.000Z","size":702,"stargazers_count":34,"open_issues_count":2,"forks_count":13,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-02-24T00:28:01.062Z","etag":null,"topics":["comprobante-de-retencion","digital-signature","ecuador","factura","firma-digital","guia-de-remision","invoice","nota-de-credito","nota-de-debito","sri"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bryancalisto.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-02-18T03:38:22.000Z","updated_at":"2026-02-23T18:03:10.000Z","dependencies_parsed_at":"2024-02-13T19:49:33.338Z","dependency_job_id":"85cf4359-549f-4913-b8de-212f2e02392a","html_url":"https://github.com/bryancalisto/ec-sri-invoice-signer","commit_stats":{"total_commits":58,"total_committers":2,"mean_commits":29.0,"dds":"0.051724137931034475","last_synced_commit":"688c0c4e1490001b290009469fc67c06ad8a6496"},"previous_names":["bryancalisto/ec-sri-invoice-sign","bryancalisto/ec-sri-invoice-signer","bryancalisto/ec-sri-utils"],"tags_count":26,"template":false,"template_full_name":null,"purl":"pkg:github/bryancalisto/ec-sri-invoice-signer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bryancalisto%2Fec-sri-invoice-signer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bryancalisto%2Fec-sri-invoice-signer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bryancalisto%2Fec-sri-invoice-signer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bryancalisto%2Fec-sri-invoice-signer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bryancalisto","download_url":"https://codeload.github.com/bryancalisto/ec-sri-invoice-signer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bryancalisto%2Fec-sri-invoice-signer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30242406,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-08T00:58:18.660Z","status":"online","status_checked_at":"2026-03-08T02:00:06.215Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["comprobante-de-retencion","digital-signature","ecuador","factura","firma-digital","guia-de-remision","invoice","nota-de-credito","nota-de-debito","sri"],"created_at":"2026-01-24T15:08:34.061Z","updated_at":"2026-03-08T02:19:29.789Z","avatar_url":"https://github.com/bryancalisto.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🇪🇨 ec-sri-invoice-signer 🇪🇨\nFirmador de comprobantes electrónicos del Servicio de Rentas Internas (SRI) ecuatoriano. Soporta facturas, notas de crédito, notas de débito, comprobantes de retención y guías de remisión. Está escrito en puro TypeScript, sin dependencias de binarios criptográficos como OpenSSL, DLLs con el código de firmado, JARs o similares.\n\nFunciona en Windows, Unix / Linux, o cualquier plataforma que soporte Node.js, sin configuraciones adicionales.\n\n## Guía de uso\n\n1. Instala el paquete.\n  ```bash\n  npm i ec-sri-invoice-signer\n  ```\n2. Usa la función correspondiente en tu código para firmar el documento respectivo. En este ejemplo se firmará una factura:\n  ```js\n  import fs from 'fs';\n  import {\n    signInvoiceXml,\n    // Otras funciones disponibles:\n    // signPurchaseLiquidationXml,\n    // signDebitNoteXml,\n    // signCreditNoteXml,\n    // signDeliveryGuideXml,\n    // signWithholdingCertificateXml,\n    } from 'ec-sri-invoice-signer';\n  /* Puedes user require() si usas módulos commonJS. */\n\n  /* El XML del documento a firmarse. */\n  const invoiceXml = '\u003cfactura id=\"comprobante\u003e...\u003c/factura\u003e';\n\n  /* El contenido del archivo pkcs12 (.p12/.pfx extension) del firmante representado como Node Buffer o string base64.\n  En este caso es un Node Buffer. */\n  const p12FileData = fs.readFileSync('signature.p12');\n\n  /* Firma la factura. Si no se pasa la opción pkcs12Password, '' será usada como contraseña. */\n  const signedInvoice = signInvoiceXml(invoiceXml, p12FileData, { pkcs12Password: 'thePKCS12FilePassword' });\n\n  doSomethingWithTheSignedInvoice(signedInvoice);\n  ```\n\n  Así mismo puedes firmar otros tipos de documentos.\n  ```js\n  /* Firma notas de débito */\n  const signedDebitNote = signDebitNoteXml(debitNoteXml, p12FileData, { pkcs12Password: 'thePKCS12FilePassword' });\n\n  /* Firma notas de crédito */\n  const signedCreditNote = signCreditNoteXml(creditNoteXml, p12FileData, { pkcs12Password: 'thePKCS12FilePassword' });\n\n  /* Firma guías de remisión */\n  const signedDeliveryGuide = signDeliveryGuideXml(deliveryGuideXml, p12FileData, { pkcs12Password: 'thePKCS12FilePassword' });\n\n  /* Firma comprobantes de retención */\n  const signedWithholdingCertificate = signWithholdingCertificateXml(withholdingCertificateXml, p12FileData, { pkcs12Password: 'thePKCS12FilePassword' });\n  ```\n\n3. Si este paquete te ha ayudado, considera dejar tu ⭐.\n\n ## Notas importantes sobre la estructura del XML\n Este paquete no implementa la especificación de [canonicalización](https://en.wikipedia.org/wiki/Canonicalization) http://www.w3.org/TR/2001/REC-xml-c14n-20010315 por completo.\n El XML es un lenguaje con muchas características sofisticadas que, probablemente, no tienen mucha cabida en una aplicación de facturación electrónica en el marco del SRI.\n Por tal razón, solo se implementa las partes del estándar requeridas para soportar XML con características relativamente comunes. Esto debería cubrir la mayoría de los casos de uso.\n\n Estas son las características requeridas del XML que se pretende firmar (ninguna de las características no soportadas es requerida para el intercambio de datos con el SRI):\n - El documento a firmarse debe consistir del nodo raíz (e.g. `factura` o `notaDebito`) con su respectivo id 'comprobante', su versión y sus etiquetas hijas describiendo el contenido del documento (sin otros namespaces).\n ```xml\n \u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n \u003cfactura Id=\"comprobante\" version=\"1.1.0\"\u003e\n  \u003cinfoTributaria\u003e...\u003c/infoTributaria\u003e\n  \u003cinfoFactura\u003e...\u003c/infoFactura\u003e\n  \u003cdetalles\u003e...\u003c/detalles\u003e\n \u003cfactura\u003e\n ```\n - La declaración del documento XML es opcional.\n ```xml\n \u003c!-- Con declaración --\u003e\n \u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n \u003cfactura Id=\"comprobante\" version=\"1.1.0\"\u003e\n ...\n \u003c/factura\u003e\n ```\n o\n ```xml\n \u003c!-- Sin declaración --\u003e\n \u003cfactura Id=\"comprobante\" version=\"1.1.0\"\u003e\n ...\n \u003c/factura\u003e\n ```\n son igual de válidos.\n - La factura debe estar en formato UTF-8.\n - No namespaces (xmlns).\n ```xml\n \u003c!-- En este ejemplo, el xmlns:ds=\"...\" debe ser eliminado. Como contexto, ningún namespace es necesario\n para la factura en sí. Este paquete se encarga de colocar los namespaces necesarios en la firma digital\n  generada --\u003e\n \u003cfactura Id=\"comprobante\" version=\"1.1.0\" xmlns:ds=\"...\"\u003e\n ...\n \u003c/factura\u003e\n ```\n\n ```xml\n \u003c!-- Esto es soportado --\u003e\n \u003cfactura Id=\"comprobante\" version=\"1.1.0\"\u003e\n ...\n \u003c/factura\u003e\n ```\n - No etiquetas de Document Type Definition (DOCTYPE).\n ```xml\n \u003c!-- Esto no es soportado --\u003e\n  \u003c!DOCTYPE note\n  [\n  \u003c!ELEMENT note (to,from,heading,body)\u003e\n  \u003c!ELEMENT to (#PCDATA)\u003e\n  \u003c!ELEMENT from (#PCDATA)\u003e\n  \u003c!ELEMENT heading (#PCDATA)\u003e\n  \u003c!ELEMENT body (#PCDATA)\u003e\n  ]\u003e\n \u003cfactura Id=\"comprobante\" version=\"1.1.0\"\u003e\n ...\n \u003cfactura\u003e\n ```\n - No atributos con prefijo xml (xml:\u003cattr_name\u003e).\n ```xml\n \u003c!-- Esto no es soportado debido a xml:foo=\"123\"--\u003e\n \u003cfactura Id=\"comprobante\" version=\"1.1.0\" xml:foo=\"123\"\u003e\n ...\n \u003c/factura\u003e\n ```\n\n ## Manejo de errores\nEste paquete exporta clases de error específicas para facilitar el manejo de excepciones:\n\n- `XmlFormatError`: Lanzado cuando el XML proporcionado no tiene un formato válido.\n- `UnsuportedPkcs12Error`: Lanzado cuando el archivo .p12 no es soportado o la contraseña es incorrecta.\n- `UnsupportedXmlFeatureError`: Lanzado cuando el XML contiene características no soportadas (como `DOCTYPE` o `xmlns`).\n- `UnsupportedDocumentTypeError`: Lanzado cuando el tipo de documento (nodo raíz) no es soportado.\n\nEjemplo de manejo:\n```js\nimport { signInvoiceXml, XmlFormatError, UnsupportedXmlFeatureError } from 'ec-sri-invoice-signer';\n\ntry {\n  const signedInvoice = signInvoiceXml(invoiceXml, p12FileData, { pkcs12Password });\n} catch (error) {\n  if (error instanceof XmlFormatError) {\n    console.error('El XML tiene errores de formato');\n  } else if (error instanceof UnsupportedXmlFeatureError) {\n    console.error('El XML contiene características no soportadas:', error.message);\n  } else {\n    console.error('Error inesperado:', error.message);\n  }\n}\n```\n\n## Nota importante sobre los archivos .p12\nEl paquete se ha probado satisfactoriamente usando .p12 de estos proveedores (no tengo .p12 de otros proveedores y tampoco he podido recibir el feedback de usuarios del paquete usando otras firmas):\n- Uanataca.\n- Security Data.\n- Lazzate.\n\nSi pruebas el paquete con .p12 de otros proveedores y encuentras problemas, por favor crea un [issue](https://github.com/bryancalisto/ec-sri-invoice-signer/issues)\n\n\n## Herramientas para prueba directa con servicios del SRI\nEl repositorio incluye herramientas para probar el firmado de facturas y notas de débito contra los servidores del SRI en modo 'prueba'.\n\nPara usarlas, primero configura los parámetros correspondientes al tipo de documento que quieres probar. Los scripts tomarán los parámetros configurados, firmarán el documento y lo enviarán al SRI para su validación y consultarán el servicio del SRI para verificar el estado del documento, reportando el resultado.\n\n**Nota:** No olvides primero ubicarte en la raíz del proyecto de node (directorio `ec-sri-invoice-signer/` donde está el package.json) antes de correr los comandos siguientes.\n\n### Facturas\nCrea el archivo `test/sri-live-test/invoice/invoice-params.json` (usa `test/sri-live-test/invoice/invoice-params-template.json` como plantilla).\n\nCorre la prueba:\n\n```bash\nnpm run test:sri:invoice\n```\n\n### Notas de Débito\nCrea el archivo `test/sri-live-test/debit-note/debit-note-params.json` (usa `test/sri-live-test/debit-note/debit-note-params-template.json` como plantilla).\n\nCorre la prueba:\n\n```bash\nnpm run test:sri:debit-note\n```\n\n### Notas de Crédito\nCrea el archivo `test/sri-live-test/credit-note/credit-note-params.json` (usa `test/sri-live-test/credit-note/credit-note-params-template.json` como plantilla).\n\nCorre la prueba:\n\n```bash\nnpm run test:sri:credit-note\n```\n\n### Guías de Remisión\nCrea el archivo `test/sri-live-test/delivery-guide/delivery-guide-params.json` (usa `test/sri-live-test/delivery-guide/delivery-guide-params-template.json` como plantilla).\n\nCorre la prueba:\n\n```bash\nnpm run test:sri:delivery-guide\n```\n\n### Comprobantes de Retención\nCrea el archivo `test/sri-live-test/withholding-certificate/withholding-certificate-params.json` (usa `test/sri-live-test/withholding-certificate/withholding-certificate-params-template.json` como plantilla).\n\nCorre la prueba:\n\n```bash\nnpm run test:sri:withholding-certificate\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbryancalisto%2Fec-sri-invoice-signer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbryancalisto%2Fec-sri-invoice-signer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbryancalisto%2Fec-sri-invoice-signer/lists"}