Herramienta para limpiar Comprobantes Fiscales Digitales v3.3

Overview

phpcfdi/cfdi-cleaner

Source Code Latest Version Software License Build Status Scrutinizer Coverage Status Total Downloads

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.


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.


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.


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 >.

AppendXmlDeclaration

Agrega 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.

RemoveDuplicatedCfdi3Namespace

Elimina la declaración del espacio de nombres de CFDI 3 sin prefijo xmlns="http://www.sat.gob.mx/cfd/3" siempre y cuando también exista la declaración xmlns:cfdi="http://www.sat.gob.mx/cfd/3".

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 cuando no correspondan a la URI http://www.sat.gob.mx/**, por ejemplo xmlns:foo="http://tempuri.org/foo".

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.

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 hpcfdi/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.

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.

Comments
  • Cfdi4.0 not remove addendas

    Cfdi4.0 not remove addendas

    Este error se produce cuando se tiene un cfdi 4.0 que contiene addendas

    <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 cfdi44.xsd"
        Version="4.0">
        <cfdi:Addenda>
             <o:OtherData xmlns:o="http://tempuri.org/other" foo="bar" />
         </cfdi:Addenda>
    </cfdi:Comprobante>
    

    Cuando el proceso limpie el xml, lo esperado es que sea un cfdi sin addendas pero se sigue recibiendo tal cual con addendas

    opened by luffynando 1
  • Agregar la opción para excluir limpiadores específicos (v1.3.0)

    Agregar la opción para excluir limpiadores específicos (v1.3.0)

    Se agrega la opción de excluir limpiadores específicos por nombre de clase. En futuras versiones se implementará una mejor manera de manejar estas exclusiones. La implementación actual no genera cambios que rompan la compatibilidad y requieran una versión mayor.

    Cambios de mantenimiento

    • Se aplicó en los flujos de trabajo:
      • Incluir PHP 8.2 a la matriz de pruebas.
      • Ejecutar todo en PHP 8.2 excepto el trabajo php-cs-fixer.
      • Sustituir la instrucción ::set-output con el uso del archivo $GITHUB_OUTPUT.
    • Se corrigió la insignia badge-build.
    • Se actualizaron los archivos de estilo de código a las reglas utilizadas en los últimos proyectos.
    opened by eclipxe13 0
  • Mantenimiento 2022-06-21 (versión 1.2.4)

    Mantenimiento 2022-06-21 (versión 1.2.4)

    Se corrigen los limpiadores RemoveAddenda y CollapseComplemento porque no estaban actuando sobre CFDI 4.0. Gracias @luffynando.

    El problema de fondo es que la clase Cfdi3XPath solo actuaba sobre el XML namespace http://www.sat.gob.mx/cfd/3 y nunca sobre http://www.sat.gob.mx/cfd/4. En la corrección se renombra la clase interna Cfdi3XPath a CfdiXPath y esta clase actúa sobre el XML namespace del nodo principal siempre que sea http://www.sat.gob.mx/cfd/3 y http://www.sat.gob.mx/cfd/4.

    Se refactoriza internamente la clase CfdiXPath y ahora incluye un método querySchemaLocations.

    Se actualizan las librerías de desarrollo y el estilo de código. Siendo lo más importante la actualización de PHPStan 1.7.15 que lleva a múltiples definiciones de tipos.

    Se actualizan los flujos de trabajo de GitHub para usar PHP 8.1 y las acciones de GitHub en versión 3.

    opened by eclipxe13 0
  • Mejorar ejecución de `RemoveUnusedNamespaces` (Versión 1.2.3)

    Mejorar ejecución de `RemoveUnusedNamespaces` (Versión 1.2.3)

    La limpieza de CFDI grandes tardaba mucho tiempo en el limpiador RemoveUnusedNamespaces.

    Se optimizó para que el resultado de la llamada al método privado isPrefixedNamespaceOnUse (función pura) fuera almacenado en caché y así evitar hacer consultas XPath innecesarias.

    Después de la optimización, la ejecución de limpieza en un CFDI con más de 2500 conceptos pasó de 180 segundos a menos de 0.5 segundos.

    opened by eclipxe13 0
  • Version 1.2.2, improve fix xmlns:schemaLocation

    Version 1.2.2, improve fix xmlns:schemaLocation

    When xsi:schemaLocation is present the attribute xmlns:schemaLocation is removed. When xsi:schemaLocation is not present the attribute xmlns:schemaLocation is renamed. Closes #13

    opened by eclipxe13 0
  • Versión 1.2.1

    Versión 1.2.1

    Se agrega la definición del espacio de nombres de Ingresos de Hidrocarburos 1.0 a SetKnownSchemaLocations. Con esta actualización se corrige el proceso de integración continua.

    Se corrige el estilo de código:

    • Se modifican los textos HEREDOC usados como argumentos de funciones.
    • Se actualiza php-cs-fixer de 3.6.0 a 3.8.0.
    opened by eclipxe13 0
  • Version 1.2.0

    Version 1.2.0

    Se quita de los limpiadores por defecto al limpiador RemoveDuplicatedCfdi3Namespace

    Se crea un nuevo limpiador RenameElementAddPrefix que 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.

    Se mejoran los métodos para obtener y eliminar las definiciones de espacios de nombres

    Mantenimiento en general con correcciones menores

    opened by eclipxe13 0
  • Cannot create a DOM Document from xml string XML: Attribute xsi:schemaLocation redefined

    Cannot create a DOM Document from xml string XML: Attribute xsi:schemaLocation redefined

    Este error se produce cuando se tiene la siguiente estructura en el XML

    <cfdi:Comprobante
        xmlns:cfdi="http://www.sat.gob.mx/cfd/3"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd"
        xmlns:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd"
        Version="3.3"
    />
    

    Cuando el proceso limpia el XML, el resultado que se obtiene presenta una segunda definición de xsi:schemaLocation

    <?xml version="1.0" encoding="utf-8"?>
    <cfdi:Comprobante
        xmlns:cfdi="http://www.sat.gob.mx/cfd/3"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.sat.gob.mx/cfd/3  http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd"
        xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd"
    />
    
    opened by cruzcraul 0
  • Espacios de nombres conocidos (v1.1.5)

    Espacios de nombres conocidos (v1.1.5)

    Se actualiza la lista de espacios de nombres conocidos para:

    • CFDI 4.0.
    • CFDI de retenciones e información de pagos 2.0.
    • Complemento de pagos 2.0.
    • Complemento de carta porte 1.0.
    • Complemento de carta porte 2.0.

    Además, se agrega una prueba que usa https://github.com/phpcfdi/sat-ns-registry para verificar que la lista se mantiene actualizada.

    opened by eclipxe13 0
  • Corregir documentHasOverlappedNamespaces para entrar a moveNamespacesToRoot

    Corregir documentHasOverlappedNamespaces para entrar a moveNamespacesToRoot

    El método documentHasOverlappedNamespaces no permitía entrar a moveNamespacesToRoot. Se asegura que solo devuelva verdadero si la definición del espacio de nombres verdaderamente existe.

    opened by eclipxe13 0
  • Versión 1.1.4: Corregir problema de espacios de nombres duplicados

    Versión 1.1.4: Corregir problema de espacios de nombres duplicados

    Error al tratar espacios de nombres duplicados

    Se encontraron casos en los que el CFDI firmado por un PAC tiene errores de espacios de nombres XML, específicamente al duplicar un prefijo en uso en uno de los hijos. Si bien esto es correcto en XML, no es correcto en un CFDI.

    En este caso el limpiador MoveNamespaceDeclarationToRoot estaba generando una salida de XML no válida, cambiando el prefijo, por ejemplo de <cfdi:Complemento xmlns:cfdi="http://www.sat.gob.mx/cfd/3"> a <default:Complemento>.

    Se corrigió MoveNamespaceDeclarationToRoot para que utilice la misma estrategia alternativa de espacios de nombres con prefijos sobrepuestos y entregue una salida correcta.

    Mantenimiento

    • Se actualiza el año de licencia. ¡Feliz 2022!.
    • Se corrigió el nombre de archivo de configuración de PHPStan y ahora usa el nombre correcto en .gitattributes, de esta forma es correctamente excluido del paquete de distribución.
    • Se cambia el flujo de integración continua de pasos en el trabajo a trabajos separados.
    • Se corrige el nombre del grupo de mantenedores de código de PhpCfdi.
    • Se cambia de develop/install-development-tools a phive para instalar las herramientas de desarrollo.
    opened by eclipxe13 0
Releases(v1.3.0)
  • v1.3.0(Dec 22, 2022)

    Se agrega la opción de excluir limpiadores específicos por nombre de clase. En futuras versiones se implementará una mejor manera de manejar estas exclusiones. La implementación actual no genera cambios que rompan la compatibilidad y requieran una versión mayor.

    Source code(tar.gz)
    Source code(zip)
  • v1.2.4(Jun 22, 2022)

    Se corrigen los limpiadores RemoveAddenda y CollapseComplemento porque no estaban actuando sobre CFDI 4.0. Gracias @luffynando.

    El problema de fondo es que la clase Cfdi3XPath solo actuaba sobre el XML namespace http://www.sat.gob.mx/cfd/3 y nunca sobre http://www.sat.gob.mx/cfd/4. En la corrección se renombra la clase interna Cfdi3XPath a CfdiXPath y esta clase actúa sobre el XML namespace del nodo principal siempre que sea http://www.sat.gob.mx/cfd/3 y http://www.sat.gob.mx/cfd/4.

    Se refactoriza internamente la clase CfdiXPath y ahora incluye un método querySchemaLocations.

    Se actualizan las librerías de desarrollo y el estilo de código. Siendo lo más importante la actualización de PHPStan 1.7.15 que lleva a múltiples definiciones de tipos.

    Se actualizan los flujos de trabajo de GitHub para usar PHP 8.1 y las acciones de GitHub en versión 3.

    Source code(tar.gz)
    Source code(zip)
  • v1.2.3(May 4, 2022)

    La limpieza de CFDI grandes tardaba mucho tiempo en el limpiador RemoveUnusedNamespaces.

    Se optimizó para que el resultado de la llamada al método privado isPrefixedNamespaceOnUse (método puro) fuera almacenado en caché y así evitar hacer consultas XPath innecesarias.

    Después de la optimización, la ejecución de limpieza en un CFDI con más de 2500 conceptos pasó de 180 segundos a menos de 0.5 segundos.

    Source code(tar.gz)
    Source code(zip)
  • v1.2.2(Apr 27, 2022)

    Se modifica el limpiador XmlNsSchemaLocation para que la limpieza se realice a nivel elemento XML. Si no existe un atributo xsi:schemaLocation entonces el atributo xmlns:schemaLocation es renombrado. Si ya existe un atributo xsi:schemaLocation entonces el atributo xmlns:schemaLocation es eliminado. Esta modificación cierra el issue #13.

    Source code(tar.gz)
    Source code(zip)
  • v1.2.1(Mar 21, 2022)

    Se agrega la definición del espacio de nombres de Ingresos de Hidrocarburos 1.0 a SetKnownSchemaLocations. Con esta actualización se corrige el proceso de integración continua.

    Se corrige el estilo de código:

    • Se modifican los textos HEREDOC usados como argumentos de funciones.
    • Se actualiza php-cs-fixer de 3.6.0 a 3.8.0.
    Source code(tar.gz)
    Source code(zip)
  • v1.2.0(Mar 4, 2022)

    Definición de XML namespace duplicado pero sin uso

    Se han encontrado casos donde hay CFDI que incluyen un namespace que está en uso pero con un prefijo sin uso.

    En el siguiente ejemplo, el espacio de nombres http://www.sat.gob.mx/TimbreFiscalDigital está declarado con el prefijo nsx y tfd, donde el primer prefijo no está en uso y el segundo sí.

    <cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3"
            xmlns:nsx="http://www.sat.gob.mx/TimbreFiscalDigital"
            xmlns:tfd="http://www.sat.gob.mx/TimbreFiscalDigital">
      <tfd:TimbreFiscalDigital UUID="X"/>
    </cfdi:Comprobante>
    

    Se ha modificado el limpiador RemoveUnusedNamespaces para que cuando detecta si un espacio de nombres está en uso detecte también el prefijo. Con este cambio, el resultado de la limpieza sería:

    <cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3"
            xmlns:tfd="http://www.sat.gob.mx/TimbreFiscalDigital">
      <tfd:TimbreFiscalDigital UUID="X"/>
    </cfdi:Comprobante>
    

    Definición de XML namespace duplicado y sin prefijo

    Se han encontrado casos donde hay CFDI sucios, pero válidos, donde la definición de los nodos no cuenta con un prefijo. En estos casos el limpiador está produciendo un CFDI inválido después de limpiar.

    Para corregir este problema:

    • Se elimina de la lista de limpiadores de texto por defecto a RemoveDuplicatedCfdi3Namespace.
    • Se quita la funcionalidad de RemoveDuplicatedCfdi3Namespace y se emite un E_USER_DEPRECATED.
    • Se crea un nuevo limpiador RenameElementAddPrefix que 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>
    

    El limpiador RemoveDuplicatedCfdi3Namespace ha sido deprecado

    El limpiador RemoveDuplicatedCfdi3Namespace ha sido deprecado porque existen casos con un XML válido, pero sucio, y el limpiador convierte el CFDI en inválido. La funcionalidad será absorvida por otro limpiador.

    CFDI con XML correcto, pero sucio:

    <cfdi:Comprobante xmlns="http://www.sat.gob.mx/cfd/3" xmlns:cfdi="http://www.sat.gob.mx/cfd/3">
      <Emisor xmlns="http://www.sat.gob.mx/cfd/3" />
    </cfdi:Comprobante>
    

    Resultado del limpiador, donde Emisor ahora no pertenece al espacio de nombres http://www.sat.gob.mx/cfd/3. El XML es correcto, pero como CFDI ya no lo es:

    <cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3">
      <Emisor />
    </cfdi:Comprobante>
    

    Mejoras al manejo interno de definiciones de espacios de nombres XML

    Se modificó el trait XmlNamespaceMethodsTrait para que detectara si un elemento de espacios de nombres DOMNameSpaceNode está eliminado revisando si la propiedad namespaceURI es NULL. Antes se validaba contra la propiedad nodeValue, pero esta propiedad puede ser vacía, por ejemplo en xmlns="".

    Al momento de verificar si un espacio de nombres es reservado, ya no se excluye cuando el espacio de nombres es vacío.

    Eliminación de definición de espacio de nombres sin prefijo

    Se modificó el trait XmlNamespaceMethodsTrait para que pueda eliminar un espacio de nombres sin prefijo, por ejemplo xmlns="http://tempuri.org/root" o xmlns="".

    Source code(tar.gz)
    Source code(zip)
  • v1.1.5(Jan 21, 2022)

    Espacios de nombres conocidos

    Se actualiza la lista de espacios de nombres conocidos para:

    • CFDI 4.0.
    • CFDI de retenciones e información de pagos 2.0.
    • Complemento de pagos 2.0.
    • Complemento de carta porte 1.0.
    • Complemento de carta porte 2.0.

    Además, se agrega una prueba que usa https://github.com/phpcfdi/sat-ns-registry para verificar que la lista se mantiene actualizada.

    Integración continua

    • Se agrega PHP 8.1 a la matriz de pruebas.
    • Se configura SonarCloud.
    • Se remueve Scrutinizer CI. Gracias por todo.
    • Se actualizan los badges del proyecto.
    Source code(tar.gz)
    Source code(zip)
  • v1.1.4(Jan 11, 2022)

    Error al tratar espacios de nombres duplicados

    Se encontraron casos en los que el CFDI firmado por un PAC tiene errores de espacios de nombres XML, específicamente al duplicar un prefijo en uso en uno de los hijos. Si bien esto es correcto en XML, no es correcto en un CFDI.

    En este caso el limpiador MoveNamespaceDeclarationToRoot estaba generando una salida de XML no válida, cambiando el prefijo, por ejemplo de <cfdi:Complemento xmlns:cfdi="http://www.sat.gob.mx/cfd/3"> a <default:Complemento>.

    Se corrigió MoveNamespaceDeclarationToRoot para que utilice la misma estrategia alternativa de espacios de nombres con prefijos sobrepuestos y entregue una salida correcta.

    Mantenimiento

    • Se actualiza el año de licencia. ¡Feliz 2022!.
    • Se corrigió el nombre de archivo de configuración de PHPStan y ahora usa el nombre correcto en .gitattributes, de esta forma es correctamente excluido del paquete de distribución.
    • Se cambia el flujo de integración continua de pasos en el trabajo a trabajos separados.
    • Se corrige el nombre del grupo de mantenedores de código de PhpCfdi.
    • Se cambia de develop/install-development-tools a phive para instalar las herramientas de desarrollo.
    Source code(tar.gz)
    Source code(zip)
  • v1.1.3(Aug 5, 2021)

    Error al tratar espacios de nombres predefinidos

    Se encontraron casos en los que el CFDI firmado por un PAC tiene severos errores de espacios de nombres XML, específicamente al redefinir un prefijo en uso por otro espacio de nombres. Si bien esto es correcto en XML, no es correcto en un CFDI.

    En este caso el limpiador MoveNamespaceDeclarationToRoot estaba generando una salida de XML no válida.

    Se corrigió MoveNamespaceDeclarationToRoot para que utilice una estrategia alternativa en el caso de encontrar espacios de nombres con prefijos sobrepuestos y entregue una salida correcta.

    tests/clean.php

    Se agregó el archivo tests/clean.php para limpiar un archivo CFDI y entregar la respuesta en la salida estándar.

    Source code(tar.gz)
    Source code(zip)
  • v1.1.2(Jul 23, 2021)

    Se encontró un error interno en el que, después de eliminar espacios de nombres no usados, se caía en un error al momento de volver a iterar sobre los nodos de espacios de nombre. Lo que terminaba en una excepción.

    Es importante actualizar si se está observando un error parecido a este:

    TypeError: Argument 1 passed to PhpCfdi\CfdiCleaner\XmlDocumentCleaners\MoveNamespaceDeclarationToRoot::isNamespaceReserved()
    must be of the type string, null given, called in .../vendor/phpcfdi/cfdi-cleaner/src/Internal/XmlNamespaceMethodsTrait.php on line 28
    
    Source code(tar.gz)
    Source code(zip)
  • v1.1.1(Jul 12, 2021)

  • v1.1.0(Jun 29, 2021)

    Se agrega el limpiador de texto XML SplitXmlDeclarationFromDocument que separa la declaración XML del resto del documento XML utilizando uno y solo un caracter LF. Por ejemplo:

    --- <?xml version="1.0"?><root />
    +++ <?xml version="1.0"?>
    +++ <root />
    

    Además, se incluyen los siguientes cambios previamente no liberados:

    2021-06-28: Se reconfiguró PHPUnit para que fallara con un test incompleto o un test suite vacío, pasara con un test riesgoso y no fuera verbose.

    2021-06-28: Se corrigió el título del código de conducta.

    2021-06-28: Se corrigió el nombre de la prueba AddXmlDeclarationTest a AppendXmlDeclarationTest.

    2021-05-18: Se reconfiguró el proyecto para el uso de php-cs-fixer: ^3.0.

    2021-05-18: Se corrigieron las extensiones usadas por la acción build.yml/setup-php.

    2021-05-18: Se actualiza la configuración de PHPUnit con la ubicación del caché.

    2021-04-28: Las pruebas no funcionaban correctamente con LibXML < 2.9.10. Presumiblemente por la canonicalización y recarga realizada por PHPUnit sebastian/comparator. Esto provocaba que los test no pasaran en sistemas con estas versiones, por ejemplo, Scrutinizer. La solución más simple fue cambiar los espacios de nombres urn:foo a http://tempuri.org/foo.

    Source code(tar.gz)
    Source code(zip)
  • v1.0.0(Apr 26, 2021)

Owner
phpCfdi
PHP Tools and utilities for Mexican CFDI
phpCfdi
Jéssica Paula 7 Aug 12, 2022
Este es un sitema bibliotecario para registro de adquisiciones y prestamos para INATEC Siuna

About Laravel Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experie

James Reyes 3 Mar 26, 2022
Plugin de Wordpress para criar um Hacker News-like para o ManualdoUsuario.net

?? Órbita Plugin de Wordpress para criar um painel de debates baseado em links, similar ao Hacker News, para o Manual do Usuário. Rodar o projeto Requ

Gabriel Nunes 7 Nov 14, 2022
Uma solucão simples para integrar sua aplicação Laravel a API PIX do Banco Central do Brasil

Uma solução simples para integrar a sua aplicação Laravel com a API PIX do Banco Central do Brasil Instalação Publicando os assets Publicando o arquiv

Mateus Junges 74 Dec 19, 2022
Projeto utilizado para prática de TDD usando PHP com a equipe de desenvolvimento.

?? TDD com PHP ?? Detalhamento do projeto Projeto desenvolvido durante um DOJO que organizei com os colegas de equipe da GAM Distribuidora. A proposta

Felipe Fernandes 3 Sep 11, 2021
Biblioteca para busca (on-line) de estados e os seus respectivos municípios via API disponibilizada pelo IBGE.

LocalidadeX Biblioteca para busca (on-line) e listagem de estados e seus respectivos municípios, efetua a consulta via API do IBGE, disponibilizando o

Estênio Mariano 3 Feb 12, 2022
Imagem de Laravel com Docker para projetos futuros

LaraDocker Este projeto foi criado com a intensão de facilitar o desenvolvimento de novos projetos que podem a ser desenvolvidos por mim, ou por outra

Silas S. da Silva. 1 Nov 6, 2021
Capitalize uma frase para o padrão brasileiro de capitalização.

php-capitalize-pt-br Esta biblioteca basicamente está resumida em uma única função. Ela capitaliza uma frase para o padrão brasileiro de capitalização

Cristian Curtinaz 15 Jan 4, 2023
Um container colaborativo de inteligência artificial para análise de ativos da b3

B3 Analyser Um container colaborativo de inteligência artificial para análise de ativos da b3 Como colaborar? Faça um FORK do projeto, isto é, copiar

null 1 Nov 15, 2021
Plugins para Adianti Framework

Adianti-Plugins Plugins para Adianti Framework Componentes disponíveis Componente Fonte de abstração VanillaDBTree https://github.com/finom/vanillatre

Augusto César da Costa Marques 6 Dec 1, 2022
Projeto de TCC. Sistema para melhoria de gestão e administração de bibliotecas.

TCC PROJETO ATHENA. (BIBLIOTECA ATHENA). Projeto criado por mim e integrantes do meu grupo de TCC na ETEC Juscelino Kubitschek de Oliveira. INTEGRANTE

Lucas Menchon 2 Jun 7, 2022
Aplicação criada com Angular e Laravel em conjunto para fazer um treinamento de autenticação com sistema de login, guarda de rotas e cadastro de usuários no banco de dados MySQL

Times-de-Futebol-BR Descrição do Projeto Aplicação criada com Angular e Laravel em conjunto para fazer um treinamento de autenticação com sistema de l

Lucas Henrique Pessutto 5 Mar 14, 2022
Projeto pessoal, cuja finalidade principal é apresentar uma sugestão de APi para procedimentos de transferências financeiras simplificada entre usuários. Projeto em Laravel.

Desafio Autor: Fábio Sousa de Sant'Ana Projeto pessoal, cuja finalidade principal é apresentar uma sugestão de APi para procedimentos de transferência

Fábio Santana 1 Dec 5, 2021
Repositório, usado para testar integração entre laravel e vercel

About Laravel Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experie

3ret 2 Dec 6, 2021
Plugin para mostrar el precio a 3,6,12 Meses sin Intereses en la página individual de productos de WooCommerce.

Plugin de WooCommerce para El Buen Fin (México) Plugin para mostrar el precio a 3,6,12 Meses sin Intereses en la página individual de productos de Woo

Manuel Ramirez Coronel 3 Oct 27, 2021
Practice-php - Repositório para praticar a sintaxe de php.

Configuração Inicial para desenvolver em PHP Instalando o PHP no Linux (Ubuntu) sudo apt install php libapache2-mod-php sudo apt-get update Utilizand

Lucas Muffato 4 Dec 29, 2022
Realice un programa en cualquier lenguaje de programación en el cual implemente un sistema de registro de asistencias para los ayudantes y becarios del LTIC.

About Laravel Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experie

Darwin Contreras 1 Jan 5, 2022
Tradução Magento 2 oficial para português do Brasil do site Crowdin

Tradução para Magento 2 em Português do Brasil (pt_BR) Inclui a tradução mais atualizada para todas as versões do Magento 2. Esse pacote de linguagem

Rafael Corrêa Gomes 67 Dec 21, 2022
Magento 2 Spanish (Spain) language package - Paquete de idioma Español (España) para Magento 2

Magento 2 Spanish (Spain) language package - Paquete de idioma Español (España) para Magento 2 Traducciones Se han recopilado las traducciones existen

Lito 13 Aug 5, 2022