phpcfdi/cfdi-cleaner
Composer 安装命令:
composer require phpcfdi/cfdi-cleaner
包简介
Clean up Mexican CFDI
README 文档
README
Herramienta para limpiar Comprobantes Fiscales Digitales por Internet mexicanos.
🇺🇸 The documentation of this project is in spanish as this is the natural language for the intended audience.
Acerca de phpcfdi/cfdi-cleaner
Los archivos XML de Comprobantes Fiscales Digitales por Internet (CFDI) suelen contener errores. Esta librería se encarga de reparar los errores (reparables) conocidos/comunes para poder trabajar con ellos.
Todas las operaciones que realiza esta librería con sobre partes del CFDI que no influyen en la generación de la cadena de origen ni del sello.
Instalación
Usa composer
composer require phpcfdi/cfdi-cleaner
Referencia de uso
La clase de trabajo es \PhpCfdi\CfdiCleaner\Cleaner y ofrece los siguientes métodos de limpieza:
staticClean(string $xml): string
Realiza la limpieza de texto y del documento xml a partir de una cadena de caracteres y entrega la representación limpia también en texto.
Este método es estático, por lo que no se necesita crear una instancia del objeto Cleaner.
<?php use PhpCfdi\CfdiCleaner\Cleaner; $xml = file_get_contents('cfdi.xml'); echo Cleaner::staticClean($xml);
cleanStringToString(string $xml): string
Realiza la limpieza de texto y del documento xml a partir de una cadena de caracteres y entrega la representación limpia también en texto.
<?php use PhpCfdi\CfdiCleaner\Cleaner; $xml = file_get_contents('cfdi.xml'); $cleaner = new Cleaner(); echo $cleaner->cleanStringToString($xml);
cleanStringToDocument(string $xml): DOMDocument
Realiza la limpieza de texto y del documento xml a partir de una cadena de caracteres y entrega el documento XML limpio.
Este método es útil si se necesita utilizar inmediatamente el objeto documento XML.
<?php use PhpCfdi\CfdiCleaner\Cleaner; $xml = file_get_contents('cfdi.xml'); $cleaner = new Cleaner(); $document = $cleaner->cleanStringToDocument($xml); echo $document->saveXML();
Acciones de limpieza
Hay dos tipos de limpiezas que se pueden hacer, una sobre el texto XML antes de que se intente cargar como objetos DOM, y la otra una vez que se pudo cargar el contenido como objetos DOM.
Limpiezas sobre el texto XML
Estos limpiadores deben ejecutarse antes de intentar leer el contenido XML y están hechos para prevenir que el objeto documento XML no se pueda crear.
RemoveNonXmlStrings
Elimina todo contenido antes del primer caracter < y posterior al último >.
SplitXmlDeclarationFromDocument
Separa por un LF ("\n") la declaración XML <?xml version="1.0"?> del cuerpo XML.
AppendXmlDeclaration
Agrega <?xml version="1.0"?> al inicio del archivo si no existe, es muy útil porque
las herramientas de detección de MIME no reconocen un archivo XML si no trae la cabecera.
XmlNsSchemaLocation
Elimina un error frecuentemente encontrado en los CFDI emitidos por el SAT donde dice xmlns:schemaLocation
en lugar de xsi:schemaLocation. En caso de que existan ambos, el único que se mantiene es xsi:schemaLocation.
Limpiezas sobre el documento XML (DOMDocument)
Estas limpiezas se realizan sobre el documento XML.
RemoveAddenda
Remueve cualquier nodo de tipo Addenda en el espacio de nombres http://www.sat.gob.mx/cfd/3.
RemoveIncompleteSchemaLocations
Actúa sobre cada uno de los xsi:schemaLocations.
Lee el contenido e intenta interpretar el espacio de nombres y la ubicación del esquema de validación.
Para considerar que es un esquema de validación verifica que termine con .xsd (insensible a mayúsculas o minusculas).
Si encuentra un espacio de nombres sin esquema lo omite.
Si encuentra un esquema sin espacio de nombres lo omite.
RemoveNonSatNamespacesNodes
Verifica todas las definiciones de espacios de nombres y si no pertenece a un espacio de nombres con la URI
http://www.sat.gob.mx/** entonces elimina los nodos y atributos relacionados.
RemoveNonSatSchemaLocations
Actúa sobre cada uno de los xsi:schemaLocations.
Verifica las definiciones de espacios de nombres y elimina todos los pares donde el espacio de nombres que no
correspondan a la URI http://www.sat.gob.mx/**.
RemoveUnusedNamespaces
Remueve todas las declaraciones de espacios de nombres (junto con su prefijo) que no estén en uso.
RenameElementAddPrefix
Agrega el prefijo al nodo que no lo tiene por estar utilizando la definición simple xmlns.
Además, elimina los namespace superfluos y las definiciones xmlns redundantes.
Ejemplo de CFDI sucio:
<cfdi:Comprobante xmlns="http://www.sat.gob.mx/cfd/4" xmlns:cfdi="http://www.sat.gob.mx/cfd/4"> <Emisor xmlns="http://www.sat.gob.mx/cfd/4" /> <cfdi:Receptor xmlns:cfdi="http://www.sat.gob.mx/cfd/4" /> </cfdi:Comprobante>
Ejemplo de CFDI limpio:
<cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/4"> <cfdi:Emisor /> <cfdi:Receptor /> </cfdi:Comprobante>
MoveNamespaceDeclarationToRoot
Mueve todas las declaraciones de espacios de nombres al nodo raíz.
Por lo regular el SAT pide en la documentación técnica que los espacios de nombres se definan en el nodo raíz, sin embargo, es frecuente que se definan en el nodo que los implementa.
Hay casos extremos de CFDI que siguen las reglas de XML, pero que no siguen las reglas de CFDI y generan prefijos que se superponen. En este caso, se moverán solamente los espacios de nombres que no se superponen, por ejemplo:
<?xml version="1.0" encoding="utf-8" ?> <cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3"> <cfdi:Complemento> <cfdi:Otro xmlns:cfdi="http://www.sat.gob.mx/otro" /> <tfd:TimbreFiscalDigital xmlns:tfd="http://www.sat.gob.mx/TimbreFiscalDigital" /> </cfdi:Complemento> </cfdi:Comprobante>
Genera el siguiente resultado:
<?xml version="1.0" encoding="utf-8" ?> <cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3" xmlns:tfd="http://www.sat.gob.mx/TimbreFiscalDigital"> <cfdi:Complemento> <cfdi:Otro xmlns:cfdi="http://www.sat.gob.mx/otro" /> <tfd:TimbreFiscalDigital /> </cfdi:Complemento> </cfdi:Comprobante>
Ante un caso como el anterior, no se están siguiendo las reglas establecidas en el Anexo 20 y en el complemento. Es mejor que siempre considere ese caso como un CFDI inválido, aun cuando se haya firmado, y solicite la sustitución por un CFDI que sí contenga los prefijos de los espacios de nombres correctos.
MoveSchemaLocationsToRoot
Mueve todas las declaraciones de ubicaciones de archivos de esquema al nodo principal.
Por lo regular el SAT pide en la documentación técnica que las ubicaciones de archivos de esquema se definan en el nodo principal, sin embargo, es frecuente que se definan en el nodo que los implementa.
SetKnownSchemaLocations
Verifica que las ubicaciones de los esquemas de espacios de nombres conocidos sean exactamente las direcciones conocidas, en caso de no serlo las modifican.
Anteriormente, el SAT permitía que las ubicaciones de los esquemas de espacios de nombres estuvieran escritos sin sensibilidad a mayúsculas o minúsculas, incluso tenía varias ubicaciones para obtener estos archivos. Sin embargo, recientemente ha eliminado la tolerancia a estas ubicaciones y solo permite las definiciones oficiales.
Este limpiador tiene la información de espacio de nombres, versión a la que aplica y ubicación conocida con base en el proyecto phpcfdi/sat-ns-registry.
En caso de que no se encuentre la ruta conocida para un espacio de nombres entonces no aplicará ninguna corrección y dejará el valor tal como estaba.
CollapseComplemento
Este limpiador se crea para solventar la inconsistencia en la documentación del SAT.
Por un lado, en el Anexo 20 de CFDI 3.3, el SAT exige que exista uno y solamente un nodo cfdi:Complemento.
Sin embargo, en el archivo de validación XSD permite que existan más de uno.
Con esta limpieza, se deja un solo cfdi:Complemento con todos los complementos en él.
RebuildDocument
Este limpiador se crea para establecer los prefijos de espacios de nombres del SAT.
Lamentablemente, algunos PAC timbran (o han timbrado) sin seguir las instrucciones marcadas en la documentación técnica del comprobante o de algún complemento, donde se establece el prefijo que se debe usar para el espacio de nombres. Esto lleva a problemas de lectura.
Con esta limpieza, el archivo CFDI es leído y nodo por nodo se vuelve a construir, comprobando para cada atributo y cada elemento hijo si corresponde a un espacio de nombres reservado por el SAT y establece el prefijo correcto. Hay que tomar en cuenta que este limpiador puede llegar a consumir muchos recursos, debido a que mientras está en ejecución cargará el archivo original en memoria y al recrearlo duplicará el consumo de la misma.
Los nodos que son recreados son: elementos, atributos, textos, CDATA y comentarios.
Ejemplo de archivo origen:
<x:Comprobante xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:x="http://www.sat.gob.mx/cfd/4" i:schemaLocation="http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd" > <x:Complemento> <t:TimbreFiscalDigital xmlns:t="http://www.sat.gob.mx/TimbreFiscalDigital" attr="foo-tfd" /> </x:Complemento> </x:Comprobante>
Después de hacer la limpieza:
<cfdi:Comprobante xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cfdi="http://www.sat.gob.mx/cfd/4" xsi:schemaLocation="http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd" > <cfdi:Complemento> <cfdi:TimbreFiscalDigital xmlns:tfd="http://www.sat.gob.mx/TimbreFiscalDigital" attr="foo-tfd" /> </cfdi:Complemento> </cfdi:Comprobante>
Exclusión de limpiadores
Para no tener que modificar la creación del objeto limpiador y permitir la exclusión de limpiadores específicos, y de esta forma ser compatibles con nuevas actualizaciones de la librería, se puede crear el limpiador estándar y luego aplicar exclusiones.
El siguiente ejemplo muestra cómo excluir los limpiadores que afectan a una Addenda.
<?php use PhpCfdi\CfdiCleaner\Cleaner; use PhpCfdi\CfdiCleaner\ExcludeList; use PhpCfdi\CfdiCleaner\XmlDocumentCleaners\RemoveAddenda, use PhpCfdi\CfdiCleaner\XmlDocumentCleaners\RemoveNonSatNamespacesNodes, use PhpCfdi\CfdiCleaner\XmlDocumentCleaners\RemoveNonSatSchemaLocations, /** * @var string $contents El contenido XML sucio. */ $exclude = new ExcludeList( RemoveAddenda::class, RemoveNonSatNamespacesNodes::class, RemoveNonSatSchemaLocations::class, ); $cleaner = new Cleaner(); $cleaner->exclude($exclude); $contents = $cleaner->cleanStringToString($contents);
Soporte
Puedes obtener soporte abriendo un ticket en Github.
Adicionalmente, esta librería pertenece a la comunidad PhpCfdi, así que puedes usar los mismos canales de comunicación para obtener ayuda de algún miembro de la comunidad.
Compatibilidad
Esta librería se mantendrá compatible con al menos la versión con soporte activo de PHP más reciente.
También utilizamos Versionado Semántico 2.0.0 por lo que puedes usar esta librería sin temor a romper tu aplicación.
Contribuciones
Las contribuciones con bienvenidas. Por favor lee CONTRIBUTING para más detalles y recuerda revisar el archivo de tareas pendientes TODO y el archivo CHANGELOG.
Copyright and License
The phpcfdi/cfdi-cleaner library is copyright © PhpCfdi
and licensed for use under the MIT License (MIT). Please see LICENSE for more information.
phpcfdi/cfdi-cleaner 适用场景与选型建议
phpcfdi/cfdi-cleaner 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 43.88k 次下载、GitHub Stars 达 13, 最近一次更新时间为 2021 年 04 月 26 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「mexico」 「sat」 「cfdi」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 phpcfdi/cfdi-cleaner 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 phpcfdi/cfdi-cleaner 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 phpcfdi/cfdi-cleaner 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Servicio Postal Mexicano (Sepomex) not official laravel library
Servicio Postal Mexicano PHP Library (Unofficial)
Librería para descargar los XSLT de la Cadena Original del Servicio de Administración Tributaria (SAT)
Parse and validate CFDIs against SAT México
This package allow you to convert csd to required pem files
This Package allow to conect multiple Pac providers sistems
统计信息
- 总下载量: 43.88k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 13
- 点击次数: 21
- 依赖项目数: 1
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2021-04-26