|
| 1 | +# Leer un CFDI de Retenciones |
| 2 | + |
| 3 | +Existen otro tipo de CFDI definido en el Anexo 20 sección II adicionales los CFDI de tipo |
| 4 | +Comprobante `<cfdi:Comprobante/>` (ingresos, egresos, traslados y pagos). |
| 5 | + |
| 6 | +Este CFDI se llama *CFDI de retenciones e información de pagos* y tiene la misma esencia de |
| 7 | +los comprobantes "tradicionales" (definir en campos requeridos, condicionales y obligatorios) |
| 8 | +pero cuenta con una estructura totalmente diferente. |
| 9 | + |
| 10 | +## Acerca de los CFDI de Retenciones e información de pagos |
| 11 | + |
| 12 | +Existe poca información alrededor de este tipo de comprobantes porque su generación es mucho |
| 13 | +menor a los CFDI tradicionales. |
| 14 | + |
| 15 | +Su obligatoriedad y la información que contienen está sujeta a LIVA, LISR y LIEPS. |
| 16 | +Si requieres saber si caes en algún supuesto en donde requieras emitir este tipo de comprobantes |
| 17 | +te recomiendo lo verifiques con tu contador de confianza. |
| 18 | + |
| 19 | +Entre las diferencias fundamentales de *CFDI de retenciones* y *CFDI tradicionales* están: |
| 20 | + |
| 21 | +- El espacio de nombres XML <http://www.sat.gob.mx/esquemas/retencionpago/1> |
| 22 | +- El nombre de los atributos principales, como `retencion:Retenciones@Cert` en lugar de `cfdi:Comprobante@Certificado` |
| 23 | +- Tiene sus propios catálogos de información |
| 24 | +- El sello se procesa usando el algoritmo de digestión `SHA1` en lugar de `SHA256` |
| 25 | +- La fecha se expresa en ISO-8601 (contiene al final `-06:00`) |
| 26 | + |
| 27 | +Entre las semejanzas están: |
| 28 | + |
| 29 | +- Se maneja con complementos |
| 30 | +- Puede contener addendas |
| 31 | +- También requiere firmarse por un PAC entregando un Timbre Fiscal Digital |
| 32 | + |
| 33 | + |
| 34 | +### Herramientas gratuitas |
| 35 | + |
| 36 | +Es importante notar que **el SAT no cuenta con una herramienta para elaborar CFDI de retenciones e información de pagos** |
| 37 | +como la tiene para los CFDI tradicionales, en su explicación de esquema operativo explican que se requiere utilizar |
| 38 | +a un PAC para poderlos emitir. |
| 39 | + |
| 40 | +Por otro lado, el SAT no les ha exigido a los PAC que cuenten con herramientas gratuitas para elaborarlos, |
| 41 | +por lo que generalmente se requerirá contratar el uso de una aplicación o bien contratar los servicios de timbrado. |
| 42 | + |
| 43 | +Con `CfdiUtils` podrás generar el *precfdi* y mandarlo timbrar con tu PAC habitual, el PAC te devolverá el *cfdi* |
| 44 | +incluyendo el timbre fiscal digital y este es el comprobante legal. |
| 45 | + |
| 46 | + |
| 47 | +### Más información |
| 48 | + |
| 49 | +- Esquema de factura de retenciones e información de pagos |
| 50 | + <https://www.sat.gob.mx/consulta/65554/conoce-el-esquema-de-factura-electronica-de-retenciones-e-informacion-de-pagos> |
| 51 | +- Video chat No.21: CFDI de retenciones e información de pagos con sus complementos |
| 52 | + <https://www.youtube.com/watch?v=Z0TadVAjrFc> |
| 53 | +- Anexo 20 |
| 54 | + <http://omawww.sat.gob.mx/tramitesyservicios/Paginas/anexo_20_version3-3.htm> |
| 55 | +- Preguntas frecuentes de retenciones e información de pagos |
| 56 | + <https://www.sat.gob.mx/cs/Satellite?blobcol=urldata&blobkey=id&blobtable=MungoBlobs&blobwhere=1461173416174&ssbinary=true> |
| 57 | +- Esquema XML de estructura |
| 58 | + <http://www.sat.gob.mx/esquemas/retencionpago/1/retencionpagov1.xsd> |
| 59 | +- Esquema XML de catálogos |
| 60 | + <http://www.sat.gob.mx/esquemas/retencionpago/1/catalogos/catRetenciones.xsd> |
| 61 | +- Archivo PDF con los catálogos |
| 62 | + <https://www.sat.gob.mx/cs/Satellite?blobcol=urldata&blobkey=id&blobtable=MungoBlobs&blobwhere=1461172330889&ssbinary=true> |
| 63 | +- Herramienta de transformación XML para generar la cadena original |
| 64 | + <http://www.sat.gob.mx/esquemas/retencionpago/1/retenciones.xslt> |
| 65 | + |
| 66 | + |
| 67 | +## Lectura de CFDI de retenciones e información de pagos |
| 68 | + |
| 69 | +La estrategia para leer CFDI de retenciones e información de pagos es la misma que se utiliza para realizar la |
| 70 | +[lectura de CFDI](leer-cfdi.md). Consulta la información relacionada con el uso de |
| 71 | +[elementos](../componentes/elements.md), [nodos](../componentes/nodes.md) y [lectura rápida](quickreader.md). |
| 72 | + |
| 73 | +### Clase `CfdiUtils\Retenciones\Retenciones` |
| 74 | + |
| 75 | +El objeto que se utiliza para poder hacer la lectura es `CfdiUtils\Retenciones\Retenciones`. Y lo puedes inicializar |
| 76 | +por su constructor natural `$retenciones = new Retenciones(DOMDocument $document)` o con el constructor estático |
| 77 | +`$retenciones = Retenciones::newFromString(string $xmlContent)`. |
| 78 | + |
| 79 | +### Inmutabilidad |
| 80 | + |
| 81 | +El objeto `Retenciones` es inmutable, es creado con un objeto `DOMDocument` pero es clonado al momento de su |
| 82 | +construcción, por lo que si se hacen cambios en este objeto no se verán reflejados en el lector. |
| 83 | +A su vez, el objeto devuelto por los métodos `getDocument()` o `getNode()`, a pesar de ser en sí mismos mutables, |
| 84 | +no tendrán un impacto en el contenedor. |
| 85 | + |
| 86 | +### Versión |
| 87 | + |
| 88 | +El CFDI de retenciones solo tiene la versión 1.0, en caso de que se fabrique un objeto que contiene un número de versión |
| 89 | +diferente, entonces el método `Retenciones::getVersion()` devolverá una cadena vacía. Esto es por homogeneidad con la |
| 90 | +lectura de CFDI regulares. |
| 91 | + |
| 92 | +### Lectura formal |
| 93 | + |
| 94 | +La lectura formal utiliza [nodos](../componentes/nodes.md), que es una representación en memoria del contenido |
| 95 | +de la estructura XML. En esta forma, los elementos XML se deben acceder utilizando su prefijo y nombre exacto, |
| 96 | +y los atributos su nombre exacto. Para obtener el nodo raíz se usa el método `Retenciones::getNode()`. |
| 97 | + |
| 98 | +### Lectura rápida |
| 99 | + |
| 100 | +La lectura rápida utiliza [nodos](../componentes/nodes.md), que es una representación en memoria del contenido |
| 101 | +de la estructura XML. En esta forma, a diferencia del modo formal, los elementos se obtienen solo por su nombre |
| 102 | +simple y los nombres de elementos y atributos no son sensibles a mayúsculas y minúsculas. |
| 103 | +Para obtener el nodo raíz se usa el método `Retenciones::getQuickReader()`. |
| 104 | + |
| 105 | +### Ejemplo de lectura de CFDI de retenciones e información de pagos |
| 106 | + |
| 107 | +```php |
| 108 | +<?php |
| 109 | + |
| 110 | +// construir el lector desde un contenido XML |
| 111 | +$xmlContent = file_get_contents('cfdi-retenciones-e-informacion-de-pagos.xml'); |
| 112 | +$reader = \CfdiUtils\Retenciones\Retenciones::newFromString($xmlContent); |
| 113 | + |
| 114 | +// obtener el nodo para lectura formal |
| 115 | +$nodeRetenciones = $reader->getNode(); |
| 116 | +echo $nodeRetenciones->searchAttribute('retenciones:Emisor', 'RFCEmisor'); // AAA010101AAA |
| 117 | + |
| 118 | +// obtener el QuickReader para lectura rápida |
| 119 | +$qrRetenciones = $reader->getQuickReader(); |
| 120 | +echo $qrRetenciones->emisor['rfcemisor']; // AAA010101AAA |
| 121 | +``` |
0 commit comments