Coder Social home page Coder Social logo

cfdiutils's Introduction

eclipxe/CfdiUtils

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

PHP Common utilities for Mexican CFDI 3.2, 3.3 & 4.0.

This library provides helper objects to work with Mexican CFDI (Comprobante Fiscal Digital por Internet).

🇲🇽 Visita la documentación en español de esta librería en Read the docs. También te esperamos en el canal #phpcfdi de discord.

The documentation related to this library and its API is on Read the docs. It is written in spanish language since is the language of the intended audience.

Nota: Este proyecto será migrado a phpcfdi/cfdiutils, aún no tenemos fecha planeada

No olvides visitar https://www.phpcfdi.com donde contamos con muchas más librerías relacionadas con CFDI y herramientas del SAT. Y próximamente el lugar donde publicaremos la versión 3.y.z.

Main features

  • Create CFDI version 3.3 & 4.0 based on a friendly extendable non XML objects (nodes).
  • Read CFDI version 3.2, 3.3 & 4.0.
  • Validate CFDI version 3.3 & 4.0 against schemas, CFDI signature (Sello) and custom rules.
  • Validate that the Timbre Fiscal Digital signature match with the CFDI 3.3 & CFDI 4.0, if not then the document has been modified after signature.
  • Helper objects to deal with:
    • Cadena de origen generation.
    • Extract information from CER files or Certificado attribute.
    • Calculate Comprobante sums based on the list of Conceptos.
    • Retrieve the CFDI version information.
  • Keep a local copy of the tree of XSD and XSLT file dependencies from SAT.
  • Keep a local copy of certificates to avoid downloads them each time.
  • Check the SAT WebService to get the status of a CFDI (Estado, EsCancelable, EstatusCancelacion and EFOS) without WSDL.

Installation

Use composer, so please run

composer require eclipxe/cfdiutils

Major versions

  • Version 1.x deprecated was deprecated time ago, that version didn't do much anyway.
  • Version 2.x current has a lot of features and helper objects.
  • Version 3.x future will be released with backward compatibility breaks.
    • See docs/CHANGELOG.md for backward compatibility breaks.
    • It may change to PHP 8.0.
    • It could be possible to migrate to phpcfdi/cfdi-utils under phpCfdi organization.

PHP Support

This library is compatible with PHP 7.3 and above. Please, try to use the language's full potential.

The intended support is to be aligned with the oldest Active support PHP Branch. See https://www.php.net/supported-versions.php for more details.

CfdiUtils PHP Supported versions Since
1.0 7.0, 7.1 2017-09-27
2.0 7.0, 7.1 2018-01-01
2.0.1 7.0, 7.1, 7.2 2018-01-03
2.8.1 7.0, 7.1, 7.2, 7.3 2019-03-05
2.12.7 7.0, 7.1, 7.2, 7.3, 7.4 2019-12-04
2.15.0 7.3, 7.4, 8.0 2021-03-17
2.20.1 7.3, 7.4, 8.0, 8.1 2022-03-08
2.23.5 7.3, 7.4, 8.0, 8.1, 8.2, 8.3 2023-05-26

Contributing

Contributions are welcome! Please read CONTRIBUTING for details and don't forget to take a look in the TODO and CHANGELOG files.

Copyright and License

The eclipxe/CfdiUtils library is copyright © Carlos C Soto and licensed for use under the MIT License (MIT). Please see LICENSE for more information.

cfdiutils's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cfdiutils's Issues

xlst de validacion de cadena original, de manera local

hola , recientemente en un proyecto , debido a restricciones de sitios y seguridad de la compañia que es excesivamente restrictiva en el acceso a sitios, validando con la gente de seguridad ellos hablan que al descargar el archivo para validacion y generacion de la cadena original (cadenaoriginal_3_3.xslt ) genera un paquete de RESET en el sitio del SAT. Resultado ,si accedes al SAT pero se corta la transmision por ese RESET que hace el SAT , temas complicados y que son dificiles que entre administradores se puedan resolver.

La solucion ,descargue los archivos localmente y ajuste el archivo src/CfdiUtils/CadenaOrigen/CfdiDefaultLocations.php paraque apunta a mi host local http://localhost/xlst/cadenaoriginal_3_3.xslt junto a sus dependencias.

Duda, existe alguna opcion de sobreescribir esta extender esta clase y registrarla para que responda con una ruta local o alguna otra modificada ?

Error en validación de comprobante

Qué tal!

He tenido un problema al querer validar el comprobante en la creación con el error:

TypeError: Argument 1 passed to Eclipxe\XmlSchemaValidator\SchemaValidator::__construct() must be an instance of DOMDocument, string given, called in /Sites/repos/Core/Validate/Cfdi33/Xml/XmlFollowSchema.php on line 51 in file /Sites/repos/vendor/eclipxe/xmlschemavalidator/src/SchemaValidator.php on line 35

Al parecer XmlFollowSchema.php espera en esta sección:

    // create the schema validator object
    $schemaValidator = new SchemaValidator($content);

El content al imprimirlo tiene un objecto de tipo Comprobante:

$asserts = new Asserts();
        $validator->validate($this->comprobante(), $asserts);
        dd($validator);
        return $asserts;

Y cuando llega al SchemaValidator:

 // obtain content
        if ('' === $content = $this->getXmlString()) {
            $content = XmlNodeUtils::nodeToXmlString($comprobante);
        }
        dd($content);
        // create the schema validator object
        $schemaValidator = new SchemaValidator($content);
"""
<?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" Version="3.3" Serie="A" Folio="1" Fecha="2020-12-10T11:06:28" FormaPago="01" Moneda="MXN" TipoDeComprobante="I" LugarExpedicion="52000" NoCertificado="30001000000400002335" Certificado="MIIFijCCA3KgAwIBAgIUMzAwMDEwMDAwMDA0MDAwMDIzMzUwDQYJKoZIhvcNAQELBQAwggErMQ8wDQYDVQQDDAZBQyBVQVQxLjAsBgNVBAoMJVNFUlZJQ0lPIERFIEFETUlOSVNUUkFDSU9OIFRSSUJVVEFSSUExGjAYBgNVBAsMEVNBVC1JRVMgQXV0aG9yaXR5MSgwJgYJKoZIhvcNAQkBFhlvc2Nhci5tYXJ0aW5lekBzYXQuZ29iLm14MR0wGwYDVQQJDBQzcmEgY2VycmFkYSBkZSBjYWRpejEOMAwGA1UEEQwFMDYzNzAxCzAJBgNVBAYTAk1YMRkwFwYDVQQIDBBDSVVEQUQgREUgTUVYSUNPMREwDwYDVQQHDAhDT1lPQUNBTjERMA8GA1UELRMIMi41LjQuNDUxJTAjBgkqhkiG9w0BCQITFnJlc3BvbnNhYmxlOiBBQ0RNQS1TQVQwHhcNMTkwNTI5MTk1MDAxWhcNMjMwNTI5MTk1MDAxWjCBsTEdMBsGA1UEAxMUWE9DSElMVCBDQVNBUyBDSEFWRVoxHTAbBgNVBCkTFFhPQ0hJTFQgQ0FTQVMgQ0hBVkVaMR0wGwYDVQQKExRYT0NISUxUIENBU0FTIENIQVZFWjEWMBQGA1UELRMNQ0FDWDc2MDUxMDFQODEbMBkGA1UEBRMSQ0FDWDc2MDUxME1HVFNIQzA0MR0wGwYDVQQLExRYT0NISUxUIENBU0FTIENIQVZFWjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKvYaTyUuvtUIwymg88xS3Ri7W2J758lusEgwUaxdyIyxLQK2736yrK6RotjDu7pfbzqD5CyJ6gkT70x29QNe5MHUgcNPnARoYK2+0a0kWjpweNqjb0pCOMevUCzblF72c7MkErbW5qolIRIsI4UFSZOlLDI9O9lKm0Tk85Ab0siaqUefGl9lOOkjPT7Pr/CkHk4jxZJOzY2cWVey00vgFh/t9xxbF6Rvi738dfZ9R9h2TVEpaRRYb+m4rpTMos6HEfmhuKSsNe2/M8NDxC4zkcwdC5WS9NhNd4kUQ+7TFLmIo14tOXXSBZVVsg49/L+lq/eh44K1Ze3iSW9M7Ii8mECAwEAAaMdMBswDAYDVR0TAQH/BAIwADALBgNVHQ8EBAMCBsAwDQYJKoZIhvcNAQELBQADggIBAK1bJ6vhkqIF0Y4XnDUFQ/nZUOsQCXbs+czwu62kVaOffHWcKhJ1mTaSwkmFoqykV3VAib7RYKYTXcERow21uGEfnOhNxeSi4l2An7y6PtJOGy4wTjAX++iAeoh+ZDel3VBhvNYv6IZAcsVqdTl0Mfs/E7EuCc6YqumEBTbFTMcp92A31HWHqkI+UnXcogYndsaIK2m+iER6AHhUokfOjOiSJmSEovaXmaJVkmjbv3g07FeMB2fZ8fp3rrRtHjgTzbZyPY2LjhBnV/0vaTnGZH4l1RWZ+dgFn5/09GJJYLgaTBHpuRNBI6JRQ9/iR4NMjOEbNXDIpKibnIg3zG1yqQtUwQBUic0lF958n1KOg7fM+Msgq9Fjg2FY3aI2DAoGWKJR8PTiFbXy+Arpzd669QWzgIusT7KLwlFhKm+a+9dmE2lp0WUj2QH0drJdfSuvqA9ZIu3I0yvnpUT0jlun0PZyoloTOd5X+8z2kLSAxbZaOu9I4XATcwZntZK0FIueh4Htom524ne/MNp6nEXzpxV4HPiW626VoykB4AHJwIp7ljcg8D4IJ7oIF/0UEduwbsx3amAfDeg/9YtPRC4j5M0h3l7zLcJ2/BFwr8qYM74d0v00Hm4msirCPkE+kr58oL1NjwN7vvPA96HbSeBohH+f/X8FcZ965FhmjmZWgj0W" MetodoPago="PUE" SubTotal="2000.00" Total="1740.00" Descuento="500.00" Sello="kSMe94w1MtrcnIdYCW4ATJbguSH/QHig1qBR2+v/lENQhDkmYYGRdWdxYehLPQ9uiQTcxZp26MDuiWIcZcYt6hob6QbrNdZk8fbePDrnsr8IFpuYEZpbp/+SGGlINvPZAJJWsmEe6zGpyxlXoU8EAmTTWTB9MJCMj4LP+OMuc7spD4CN1ZpFkMKQx8xdWJcz6gjgEgKTYa7p77J4yyIF4JA+2DxFR4kUPKXxHlCtU5WV0i7jPK1QpC7YMLFKbuuuVDngrpZVpG7OrcSBlQXyXgUOg2cdflkFH4Ndq4uUSFzRnZ3HWbVNNNzIl609voMYY34PuOICIWKDb5k/w3KWtw==">
  <cfdi:Emisor Nombre="XOCHILT CASAS CHAVEZ" Rfc="CACX7605101P8" RegimenFiscal="612"/>
  <cfdi:Receptor Rfc="COSC8001137NA" Nombre="Carlos Cortés Soto" UsoCFDI="G01"/>
  <cfdi:Conceptos>
    <cfdi:Concepto ClaveProdServ="52161557" NoIdentificacion="GAMEPAD007" Cantidad="4" ClaveUnidad="H87" Unidad="PIEZA" Descripcion="Portable tetris gamepad pro++" ValorUnitario="500" Importe="2000" Descuento="500">
      <cfdi:Impuestos>
        <cfdi:Traslados>
          <cfdi:Traslado Base="100" Impuesto="002" TipoFactor="Tasa" TasaOCuota="0.160000" Importe="240"/>
        </cfdi:Traslados>
      </cfdi:Impuestos>
    </cfdi:Concepto>
  </cfdi:Conceptos>
  <cfdi:Impuestos TotalImpuestosTrasladados="240.00">
    <cfdi:Traslados>
      <cfdi:Traslado Impuesto="002" TipoFactor="Tasa" TasaOCuota="0.160000" Importe="240.00"/>
    </cfdi:Traslados>
  </cfdi:Impuestos>
</cfdi:Comprobante>
"""

informacion de schemalocation complemento de pago

Al crear un complemento de pago:
$comprobanteAtributos = [
'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 http://www.sat.gob.mx/Pagos http://www.sat.gob.mx/sitio_internet/cfd/Pagos/Pagos10.xsd" ,
'xmlns:pago10' => "http://www.sat.gob.mx/Pagos",

la funcion de
$xml_content = $creator->asXml();

regresa schemalocation con las 2 primeras partes unicamente ,

xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd"
xmlns:pago10="http://www.sat.gob.mx/Pagos"

Pagos:20

Para cuando estará lista la actualización de pagos:20?

Validacion de elemento Addenda

Hola tengo un problema con la validacion de un xml el cual contiene un elemento addenda de esta manera,
cfdi:Addenda
<ad:ADENDAS xmlns:ad="http://www.addenda.com">
<ad:CAB LABEL="CABADD" TIPO_DOC="1" CODIGO_FUF="20231122C010K01P00" PERIODO_ECD="2024-03-20" FECHA_LIM_PAGO="" ID_PARTIC_CENACE="C010K01" BANCO="Bancomer" SUCURSAL="No.2" CUENTA="123457891234567891112234" CLAVE="123457891234567891" REF_BANCO="1234578912345" CONTACTO="[email protected]" IMPORTE_TOTAL="118270.96" MONTO_LETRA="CIENTO DIECIOCHO MIL DOSCIENTOS SETENTA con 96/100">
ad:Conceptos
<ad:LINEA LABEL="linadd" NUM_LIN="1" FOLIO_UNICO="A012" CONCEPTO="xyz" Cantidad="2" Unidad="KG" PrecioUnit="12.03" ImporteLinea="24.06" Iva="16" Total="30.06"/>
</ad:Conceptos>
</ad:CAB>
</ad:ADENDAS>
</cfdi:Addenda>
y el validador me regresa el error "Schema validation failed: Element '{http://www.addenda.com}ADENDAS': No matching global element declaration available, but demanded by the strict wildcard.", he estado investigando y cambiando la estructura de la addenda pero siempre regresa error en el primer child de la Addenda. Estoy usando la version 4.0 de cfdi.

Retenciones 2.0

Soporte para los CFDI que amparan retenciones e información de pagos 2.0

  • Agregar el nuevo nodo de CfdiRetenRelacionados
  • Cambiar el nombre de los atributos del certificado.
  • Schemas y namespaces.
  • Desarrollar RetencionesCreator20.
  • Crear los test unitarios necesarios.

Actualmente ya me encuentro trabajando en incorporar esta feature.

Complementos de pagos

Como evito que la etiqueta pago10:Pago se repita en cada pago10:DoctoRelacionado, ya que estos estan como hijos dentro de la etiqueta pago10:Pagos

<pago10:Pagos xmlns:pago10="http://www.sat.gob.mx/Pagos" xsi:schemaLocation="http://www.sat.gob.mx/Pagos http://www.sat.gob.mx/sitio_internet/cfd/Pagos/Pagos10.xsd" Version="1.0"> <pago10:Pago FechaPago="2021-10-14T17:31:34" FormaDePagoP="1" MonedaP="MXN" Monto="400"/> <pago10:Pago> <pago10:DoctoRelacionado idDocumento="F61BF8D0-11A0-45ED-9F2F-C69DEF0B426D" Serie="RRF" Folio="126" MonedaDR="MXN" MetodoDePagoDR="PPD" NumParcialidad="1" ImpSaldoAnt="383.2" ImpPagado="383.2" ImpSaldoInsoluto="0"/> </pago10:Pago> <pago10:Pago> <pago10:DoctoRelacionado idDocumento="19D2F772-8D33-43FB-A09E-7C827574DF42" Serie="RRF" Folio="129" MonedaDR="USD" MetodoDePagoDR="PPD" TipoCambioDR="20.44" NumParcialidad="1" ImpSaldoAnt="8.53" ImpPagado="0.82" ImpSaldoInsoluto="7.71"/> </pago10:Pago> </pago10:Pagos>

Ejemplo de Pago20

Hola buen día a quien corresponda.

Hay algún ejemplo de cómo implementar el Pago20 sobre todo el nodo de Totales.?

Muchas gracias de antemano

Duda: CFDI de tipo I/E con complemento de recepción de pagos

Duda contable: Técnicamente es posible emitir un CFDI de tipo I o E e incluir el complemento de pago en el mismo comprobante (sin establecer en el complemento documentos relacionados ni impuestos).
La duda es: Cuál es el caso en donde esto puede suceder?

  • No es en el caso de anticipos, dado que un anticipo es un PUE
  • No es el caso de pago al momento de la operación, dado que es un PUE

Validation Timeout

Hi today doing some test, When I was trying to "timbrar" an XML got time out, and after removing the validation code: $asserts = $creator->validate(); Everything was fine.

I still haven't seen that particular code for validation, I will get back if I have some more information.

Thank you Carlos

Add Carta Porte 1.0 & 2.0 Documentation

@AndreyPootMay add the source and test for CartaPorte10. But documentation is missing.

Could anybody please contribute to create the docs/crear/complemento-carta-porte10.md file?

The documentation of Complemento de Nómina 1.2b can help as a guide to create it.

Documentación Pagos20

¿Hay alguna documentación para usar la clase Pagos20 para Pago Parcialidades?
Algo como RetencionesCreator20 pero para los pagos20 y para pago parcialidades?

Ejemplo de xml:
image

Saludos,

Tasa Exento

Buen dia,

Al agregar un impuesto exento crea el CFDI sumando los traslados sin valor

<cfdi:Impuestos TotalImpuestosTrasladados="0.00">
cfdi:Traslados
<cfdi:Traslado Impuesto="002" TipoFactor="Exento" TasaOCuota="" Importe="0.00"/>
</cfdi:Traslados>
</cfdi:Impuestos>

Lo cual genera un error en TasaOCuota el cual deberia ser 0.00000

Timbrado de CFDI 3.3

Hola que tal, soy nuevo en esto de generar facturas y más cuando deben ser con formato válido del SAT, da la casualidad que me lo asignaron como proyecto, buscando y buscando di con tu código que me parece excelente, pero tengo dudas en cuanto como se debe proceder el timbrado del XML una vez creado y como validarlo, estuve buscando en la documentacion pero no he encontrado esa parte. Agradezco de antemano tu respuesta.
Saludos.

Cannot add sello as file path on windows

When calling CfdiCreator33::addSello using file path on windows and it contains something like c:\dir\... then it throws the exception The key is not a file or a string PEM format private key.

Must not double check '' === (string) parse_url($filename, PHP_URL_SCHEME) because it returns 'C'

Almacenamiento local de recursos del SAT

A la hora de realizar el almacenamiento local para archivos del SAT me marca una respuesta message: "The payload is invalid.", exception: "Illuminate\Contracts\Encryption\DecryptException

No descarga el timbrefiscaldigital. Tienen alguna solución?

Call to undefined method CfdiUtils\Elements\Cfdi33\Traslado::addRetencion()

Alguna forma de solucionar este error Call to undefined method CfdiUtils\Elements\Cfdi33\Traslado::addRetencion()
$comprobante->addConcepto([
'ClaveProdServ' => '50211503',
'NoIdentificacion' => 'NoId',
'Cantidad' => '1',
'ClaveUnidad' => 'H87',
'Unidad' => 'Pieza',
'Descripcion' => 'Producto Generico',
'ValorUnitario' => '100.00',
'Importe' => '100.00',
'Descuento' => '0',
'ObjetoImp' => '02',
])->addTraslado([
'Base'=>'1.00',
'Impuesto'=>'002',
'TipoFactor'=>'Tasa',
'TasaOCuota'=>'0.160000',
'Importe'=>'16.00',
])->addRetencion([
'Base'=>'1.00',
'Impuesto'=>'001',
'TipoFactor'=>'Tasa',
'TasaOCuota'=>'0.100000',
'Importe'=>'0.00',
]);

Error al validar CFDI Tipo T (Traslado)

Al validar un CFDI del Tipo T (Traslado) me arroja el siguiente mensaje de error:

ERROR: FORMAPAGO01 - El campo forma de pago no debe existir cuando existe el complemento para recepción de pagos (CFDI33103)

Al abrir el XML no existe dicho complemento.

Leer campos Total y SubTotal de un tipo de comprobante P retornan vacíos

Al leer los campos Total y SubTotal de un complemento de pago (tipo de comprobante = P) el resultado es una cadena vacía

$c = \CfdiUtils\Cfdi::newFromString(file_get_contents('comp.xml'))
   ->getQuickReader();
echo $c['TipoDeComprobante'];
echo isset($c['Total']) ? "existe ".$c['Total']: "no existe ".$c['Total'];
echo isset($c['SubTotal']) ? "existe ".$c['SubTotal']: "no existe ".$c['SubTotal'];
echo  isset($c['Moneda']) ? "existe ".$c['Moneda']: "no existe ".$c['Moneda']; ``

123 fw

Imprime
P

existe

existe

existe XXX

comprobante de pago

Hola que tal,

queria ver si me pueden ayudar con algun ejemplo de como agregar el complemento de pago.

Espero su ayuda y muchas gracias.

Soporte para php 8.1

Al actualizar a la versión 9 de laravel, lanza un error debido a que no soporta php 8.1

CartaPorte V 3.0

No se si esten teniendo problemas con el xml de cpp 3.0 ya que en 2.0 me hace el sello bien pero en 3.0
El resultado de la digestión debe ser igual al resultado de la desencripción del sello. Cadena Origial:||4.0|TEST|414|2023-11-21T13:13:47|99|30001000000500003364|5500.50|MXN|1|6380.58|I|01|PPD|44960|XIQB891116QE4|BERENICE XIMO QUEZADA|626|FUNK671228PH6|KARLA FUENTE NOLASCO|44970|612|G03|78121603|1002|1.00|E48|Servicio de Flete Nacional|5500.50|5500.50|02|5500.50|002|Tasa|0.160000|880.08|5500.50|002|Tasa|0.160000|880.08|880.08|3.0|CCCBCD94-870A-4332-A52A-A52AA52AA52A|No|213|No|01|01|Origen|OR000001|EKU9003173C9|GRUPO INDUSTRIAL DELEBA SA DE CV|2024-09-11T00:00:00|Paseo del Estribillo|213213|1457|09|Puerta cafe|042|SON|MEX|85800|Destino|DE000001|EKU9003173C9|NombreRemitenteDestinatario1|2024-09-11T18:00:00|213|Privada de la Soledad|12312|2755|07|Puerta cafe|030|SON|MEX|83198|100|KGM|1000|1|1500.00|No|10101504|543215|tester|1|KGM|PAR|18/62/31cm|Cajas de Aluminio|01|test|test|DenominacionGenericaProd1|DenominacionDistintivaProd1|Fabricante1|2028-01-01|LoteMedic1|01|01|RegistroSanita1|321|ASDASD321|321asd|asdedasd5|65as4d|65a4sd6|100|1|MXN|0E94D982-ECFD-46F3-8648-CCD38B34E6A7|1|OR101010|DE202020|TPAF01|1|VL|1|qwe1232|2019|GNP|ds22241s|CTR004|VL45K98|01|EKU9003173C9|213122534|Jorge Gomez Junco|02|CACX7605101P8|Propietario|PT01||
Gracias

Escritura del atributo Importe de Comprobante/Impuestos/Traslados/Traslado es redondeado y no debería

Al revisar el issue #38 se encontró que la escritura de un CFDI no escribe la correcta suma en los atributos cfdi:Comprobante/cfdi:Impuestos/cfdi:Traslados/cfdi:Traslado@Importe y cfdi:Comprobante/cfdi:Impuestos/cfdi:Retenciones/cfdi:Retencion@Importe.

Este problema es porque:
a) El la clase SumasConceptos dichos atributos son redondeados
b) En la clase SumasConceptosWriter dichos atributos son redondeados

Aquí un test para ilustrar el caso:

    public function testUsesAllDecimalsOnComplementoImpuestosTrasladosTrasladoImporte()
    {
        $comprobante = new Comprobante();
        $comprobante->addConcepto()->addTraslado(
            ['Importe' => '7.777777', 'Impuesto' => '002', 'TipoFactor' => 'Tasa', 'TasaOCuota' => '0.160000']
        );
        $comprobante->addConcepto()->addTraslado(
            ['Importe' => '2.222222', 'Impuesto' => '002', 'TipoFactor' => 'Tasa', 'TasaOCuota' => '0.160000']
        );

        $precision = 3;
        $sumasConceptos = new SumasConceptos($comprobante, $precision);
        $writer = new SumasConceptosWriter($comprobante, $sumasConceptos, $precision);
        $writer->put();

        print_r(XmlNodeUtils::nodeToXmlString($comprobante));

        $this->assertSame('10.000', $comprobante->searchAttribute('cfdi:Impuestos', 'TotalImpuestosTrasladados'));
        $this->assertSame(
            '9.999999',
            $comprobante->searchAttribute('cfdi:Impuestos', 'cfdi:Traslados', 'cfdi:Traslado', 'Importe')
        );
    }

Importante: Este no es un problema si al escribir el importe de cfdi:Comprobante/cfdi:Conceptos/cfdi:Concepto/cfdi:Impuestos/cfdi:Traslados/cfdi:Traslado@Importe y cfdi:Comprobante/cfdi:Conceptos/cfdi:Concepto/cfdi:Impuestos/cfdi:Retenciones/cfdi:Retencion@Importe ya se escribe redondeado.

SELLO04: Demasiado estricto

Ocurre lo siguiente con un cfdi emitido por Interjet:

El nombre del emisor del comprobante igual al encontrado en el certificado
Rfc certificado: ABC AEROLINEAS SA DE CV, Rfc comprobante: ABC Aerolíneas S.A. de C.V

  1. Si bien el texto del cfdi no coincide con el certificado debería ser menos estricto en su comparación.
  2. El mensaje de error dice RFC.

Posibles soluciones:

  1. Que el resultado de esta validación sea como máximo WARNING
  2. Establecer una comparación menos estricta y declararlo OK / ERROR
  3. Establecer una comparación menos estricta y declararlo OK / WARNING

Código fuente: https://github.com/eclipxe13/CfdiUtils/blob/master/src/CfdiUtils/Validate/Cfdi33/Standard/SelloDigitalCertificado.php#L118

Descuento attribute is missing in the Comprobante node.

When using $creator->addSumasConceptos(null, 2);, and the Descuento attribute is on the Concepto node with value = 0, and there is no other Concepto with Descuento attribute value > 0.

SAT requirements.

Comprobante->Descuento: El valor registrado debe ser menor o igual que el atributo Subtotal.

Comprobante->Descuento: Cuando el TipoDeComprobante sea I, E o N y algún concepto incluya el atributo Descuento, debe existir este atributo y debe ser igual a la suma de los atributos Descuento registrados en los conceptos; en otro caso se debe omitir este atributo.

Comprobante->Descuento: El valor de este atributo debe tener hasta la cantidad de decimales que soporte la moneda.

Comprobante/Conceptos/Concepto->Descuento: El valor de este atributo debe tener hasta la cantidad de decimales que soporte la moneda.

Comprobante/Conceptos/Concepto->Descuento: El valor registrado debe ser menor o igual al atributo Importe.

http://www.sat.gob.mx/informacion_fiscal/factura_electronica/Documents/matriz%20de%20errores/MatrizDeErrores_CFDI_v33.xls

Example

$documento->addConcepto([
                        'ClaveProdServ' => '15121500',
                        'NoIdentificacion' => 'C10W30-1L',
                        'Cantidad' => '4',
                        'ClaveUnidad' => 'H87',
                        'Unidad' => 'Pieza',
                        'Descripcion' => 'CASTROL ACEITE 10W30  MINERAL 1L',
                        'ValorUnitario' => '100.00000',
                        'Importe' => '400.00000',
                        'Descuento' => '0.00000',
                    ])->addTraslado([
                        'Impuesto' => '002',
                        'Base' => '400',
                        'TipoFactor' => 'Tasa',
                        'TasaOCuota' => '0.16000',
                        'Importe' => '64.00000',
                    ]);

Whill produce.

<?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" Version="3.3" Serie="A" Folio="F2018A000059" Fecha="2018-01-23T11:39:21" FormaPago="01" Moneda="MXN" TipoCambio="1" TipoDeComprobante="I" MetodoPago="PUE" LugarExpedicion="97780" NoCertificado="30001000000300023708" Certificado="" SubTotal="400.00" Total="464.00" Sello="">
  <cfdi:Emisor RegimenFiscal="601" Nombre="ACCEM SERVICIOS EMPRESARIALES SC" Rfc="AAA010101AAA"/>
  <cfdi:Receptor Rfc="AAA010101AAA" UsoCFDI="G03" Nombre=""/>
  <cfdi:Conceptos>
    <cfdi:Concepto ClaveProdServ="15121500" NoIdentificacion="C10W30-1L" Cantidad="4" ClaveUnidad="H87" Unidad="Pieza" Descripcion="CASTROL ACEITE 10W30  MINERAL 1L" ValorUnitario="100.00000" Importe="400.00000" Descuento="0.00000">
      <cfdi:Impuestos>
        <cfdi:Traslados>
          <cfdi:Traslado Impuesto="002" Base="400" TipoFactor="Tasa" TasaOCuota="0.16000" Importe="64.00000"/>
        </cfdi:Traslados>
      </cfdi:Impuestos>
    </cfdi:Concepto>
  </cfdi:Conceptos>
  <cfdi:Impuestos TotalImpuestosTrasladados="64.00">
    <cfdi:Traslados>
      <cfdi:Traslado Impuesto="002" TipoFactor="Tasa" TasaOCuota="0.16000" Importe="64.00"/>
    </cfdi:Traslados>
  </cfdi:Impuestos>
</cfdi:Comprobante>

Régimen de capital CFDI v4

Hola! una duda.... hay algún método implementado en la librería para quitar el régimen de capital cuando se genera un CFDI v4.0 ? Muchas gracias de antemano.

Inyectar comprobante a la clase CfdiCreator33

Tengo un objeto $cfdi = \CfdiUtils\Nodes\XmlNodeUtils::nodeFromXmlString($content);
y un objeto $creator = new CfdiCreator33();
Como puedo inyectar el objeto cfdi en el objeto creator? Hay alguna manera de convertir una clase "Node" a "Comprobante"?

Broken build (2021-10-10)

The build process is broken, apparently the new version of php-cs-fixer check don't pass.
Please, fix the code base and make the build process pass again.

Leer CFDI Retenciones

Al no ser un CFDI de uso "General", cambia la estructura del CFDI de Retenciones y la versión del mismo ¿CfdiUtils puede leer al día de hoy este tipo de CFDI?

SUMAS06: False positive with sums

El el siguiente CFDI se genera este error:

El importe del impuesto Grupo traslado Impuesto 002 Tipo factor Tasa Tasa o cuota 0.160000 es igual a el importe del nodo.
Calculado: 51.86, Encontrado: 51.86207

Por lo tanto, el cálculo del importe de la suma de los impuestos trasladados es incorrecto o bien no debería redondearse.

<?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" Version="3.3" Fecha="2018-06-29T07:36:18" Total="376" SubTotal="324.14" Moneda="MXN" TipoCambio="1" Certificado="..." FormaPago="01" NoCertificado="00001000000305747164" TipoDeComprobante="I" LugarExpedicion="44610" Serie="BB" Folio="978903" MetodoPago="PUE" Sello="UPl9dKr7oa2pguvaA/4L3FlnTNLrCgxAILRXSx2oYmq1S5iCAlh8814Wut/mXYwhxLSkFksDx2VjuyVdpi9e+v4NOzBAZk0wPMBcaKnj9fhgnGFJGvDczJ22/7Yq/4F0RKupk3jt/CWwmSH6Nta8GYUxHrOtGzYGMDZnyjVszes=">
  <cfdi:Emisor RegimenFiscal="601" Nombre="RED DE CARRETERAS DE OCCIDENTE SAB DE CV" Rfc="RCO0708136F7"/>
  <cfdi:Receptor Nombre="DAY INTERNATIONAL DE MEXICO SA DE CV" Rfc="DIM8701081LA" UsoCFDI="P01"/>
  <cfdi:Conceptos>
    <cfdi:Concepto Cantidad="1.000000" Descripcion="PEAJE EN EFECTIVO CORRESPONDIENTE AL CRUCE DE NRU: 0180510004916289A09A511E2C097A78 FECHA: 26/06/0018 HORA: 11:17:45 CASETA: LEON CLASE: A" ValorUnitario="39.655172" Importe="39.655172" Unidad="SERVICIO" NoIdentificacion="0180510004916289A09A511E2C097A78" ClaveUnidad="E48" ClaveProdServ="95111500">
      <cfdi:Impuestos>
        <cfdi:Traslados>
          <cfdi:Traslado Importe="6.344828" TasaOCuota="0.160000" TipoFactor="Tasa" Impuesto="002" Base="39.655172"/>
        </cfdi:Traslados>
      </cfdi:Impuestos>
    </cfdi:Concepto>
    <cfdi:Concepto Cantidad="1.000000" Descripcion="PEAJE EN EFECTIVO CORRESPONDIENTE AL CRUCE DE NRU: 018062000477388671A49097D0622D1F FECHA: 26/06/0018 HORA: 19:03:26 CASETA: LEON CLASE: A" ValorUnitario="39.655172" Importe="39.655172" Unidad="SERVICIO" NoIdentificacion="018062000477388671A49097D0622D1F" ClaveUnidad="E48" ClaveProdServ="95111500">
      <cfdi:Impuestos>
        <cfdi:Traslados>
          <cfdi:Traslado Importe="6.344828" TasaOCuota="0.160000" TipoFactor="Tasa" Impuesto="002" Base="39.655172"/>
        </cfdi:Traslados>
      </cfdi:Impuestos>
    </cfdi:Concepto>
    <cfdi:Concepto Cantidad="1.000000" Descripcion="PEAJE EN EFECTIVO CORRESPONDIENTE AL CRUCE DE NRU: 0180410000070284E442D19AE5862434 FECHA: 28/06/0018 HORA: 08:35:32 CASETA: LEON CLASE: A" ValorUnitario="122.413793" Importe="122.413793" Unidad="SERVICIO" NoIdentificacion="0180410000070284E442D19AE5862434" ClaveUnidad="E48" ClaveProdServ="95111500">
      <cfdi:Impuestos>
        <cfdi:Traslados>
          <cfdi:Traslado Importe="19.586207" TasaOCuota="0.160000" TipoFactor="Tasa" Impuesto="002" Base="122.413793"/>
        </cfdi:Traslados>
      </cfdi:Impuestos>
    </cfdi:Concepto>
    <cfdi:Concepto Cantidad="1.000000" Descripcion="PEAJE EN EFECTIVO CORRESPONDIENTE AL CRUCE DE NRU: 0185320002694707AFDE353139DF224E FECHA: 28/06/0018 HORA: 20:55:02 CASETA: LEON CLASE: A" ValorUnitario="122.413793" Importe="122.413793" Unidad="SERVICIO" NoIdentificacion="0185320002694707AFDE353139DF224E" ClaveUnidad="E48" ClaveProdServ="95111500">
      <cfdi:Impuestos>
        <cfdi:Traslados>
          <cfdi:Traslado Importe="19.586207" TasaOCuota="0.160000" TipoFactor="Tasa" Impuesto="002" Base="122.413793"/>
        </cfdi:Traslados>
      </cfdi:Impuestos>
    </cfdi:Concepto>
  </cfdi:Conceptos>
  <cfdi:Impuestos TotalImpuestosTrasladados="51.86">
    <cfdi:Traslados>
      <cfdi:Traslado Importe="51.862070" TasaOCuota="0.160000" TipoFactor="Tasa" Impuesto="002"/>
    </cfdi:Traslados>
  </cfdi:Impuestos>
</cfdi:Comprobante>

Impuestos Order Error

Hi

I have an error when I try to "timbrar" an XML with retenciones and traslados, If i look at the XML file I can see that the order for impuestos is wrong, I am getting first the Traslados and then the Retenciones.

Original text (Failes to Timbrar):
<cfdi:Impuestos TotalImpuestosTrasladados="160.00" TotalImpuestosRetenidos="100.00">
cfdi:Traslados
<cfdi:Traslado Impuesto="002" TipoFactor="Tasa" TasaOCuota="0.160000" Importe="160.00"/>
</cfdi:Traslados>
cfdi:Retenciones
<cfdi:Retencion Impuesto="001" Importe="100.00"/>
</cfdi:Retenciones>
</cfdi:Impuestos>

And if a change the XML file and try to "timbrar" it goes fine:
<cfdi:Impuestos TotalImpuestosTrasladados="160.00" TotalImpuestosRetenidos="100.00">
cfdi:Retenciones
<cfdi:Retencion Impuesto="001" Importe="100.00"/>
</cfdi:Retenciones>
cfdi:Traslados
<cfdi:Traslado Impuesto="002" TipoFactor="Tasa" TasaOCuota="0.160000" Importe="160.00"/>
</cfdi:Traslados>
</cfdi:Impuestos>

I see that I can change the orden on Impuestos, but this also change the order on conceptos and it fails too.

Not sure if this is a validation by my timbres service provider or if this is really a bug

Validador no acepta regimen fiscal 626 en cfdi33

A la hora de validar el contenido de un xml usando una instancia de la clase \CfdiUtils\CfdiCreator33 con el método validate() dónde el régimen fiscal del emisor es: 626 - "Régimen Simplificado de Confianza".
Obtenemos el error:

"REGFIS01" => CfdiUtils\Validate\Assert^ {#3503
    -title: "El régimen fiscal contenga un valor apropiado según el tipo de RFC emisor (CFDI33130 y CFDI33131)"
    -status: CfdiUtils\Validate\Status^ {#3484
      -status: "ERROR"
    }
    -explanation: "Rfc: "AAA010101AAA", Regimen Fiscal: "626""
    -code: "REGFIS01"
  }

Parece que en la clase: CfdiUtils\Validate\Cfdi33\Standard\EmisorRegimenFiscal el valideCode correspondiente a este régimen no ha sido agregado:
image

Documentación o ejemplo para complemento pagos 2.0

Hola buenas comunidad, he estado indagando e implementado la librería de cfdi, pero tengo una duda se que existe el modulo de recepción de pagos pero no encuentro la documentación para poder aplicarlo alguien tendrá el link o ejemplo que me pudiera proporcionar por favor.

Addendas

Buena tarde, estoy teniendo el detalle que, cuando las facturas a validar de estructura tienen un addenda particular, no puede descargar o validar esto. Manda error de descarga y para en el resto de la validación.

pem file error

Hi I get: The key is not a file or a string PEM format private key

but the pem file have in headers:

-----BEGIN RSA PRIVATE KEY-----

What could be the problem?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.