|
| 1 | +# Complemento de Comercio Exterior 2.0 |
| 2 | + |
| 3 | +El espacio de nombres de `CfdiUtils\Elements\Cce20` permite trabajar en forma más fácil con los nodos |
| 4 | +con nombres y acciones específicas para implementar el Complemento de Comercio Exterior versión 2.0, |
| 5 | +vigente a partir del 15 de enero del 2024. |
| 6 | + |
| 7 | +La documentación del complemento la puedes encontrar en el sitio oficial del SAT: |
| 8 | + |
| 9 | +- Documentación Comercio Exterior 2.0: <http://omawww.sat.gob.mx/tramitesyservicios/Paginas/complemento_comercio_exterior.htm>. |
| 10 | +- Catálogos: <http://omawww.sat.gob.mx/tramitesyservicios/Paginas/catalogos_emision_cfdi_complemento_ce.htm>. |
| 11 | +- Ruta del estándar: <http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/EstandarComercioExterior_v20.pdf>. |
| 12 | + |
| 13 | +Según la documentación técnica el XML debe cumplir con la siguiente especificación: |
| 14 | + |
| 15 | +- Prefijo de namespace: `cce20`. |
| 16 | +- Namespace: `http://www.sat.gob.mx/ComercioExterior20`. |
| 17 | +- Archivo XSD: `http://www.sat.gob.mx/sitio_internet/cfd/ComercioExterior20/ComercioExterior20.xsd`. |
| 18 | + |
| 19 | +## Cambios con respecto a Comercio Exterior 1.1 |
| 20 | + |
| 21 | +Si ya se había implementado el Complemento de Comercio Exterior 1.0 notarás que los cambios de estructura son mínimos: |
| 22 | + |
| 23 | +- `ComercioExterior/Emisor/Domicilio` ahora es obligatorio. |
| 24 | +- `ComercioExterior/Mercancias` ahora es obligatorio. |
| 25 | +- `ComercioExterior/Mercancias/Mercancia@ValorUnitarioAduana` ahora admite 6 decimales. |
| 26 | +- `ComercioExterior/Mercancias/Mercancia@ValorDolares` ahora admite 4 decimales. |
| 27 | +- `ComercioExterior@Version` cambia de 1.1 a 2.0 |
| 28 | +- `ComercioExterior@TipoOperacion` fue eliminado. |
| 29 | +- `ComercioExterior@Subdivision` fue eliminado. |
| 30 | +- `ComercioExterior@ClaveDePedimento` ahora es obligatorio. |
| 31 | +- `ComercioExterior@CertificadoOrigen` ahora es obligatorio |
| 32 | +- `ComercioExterior@TipoCambioUSD` ahora es obligatorio |
| 33 | +- `ComercioExterior@TotalUSD` ahora es obligatorio |
| 34 | + |
| 35 | +## Jerarquía de nodos |
| 36 | + |
| 37 | +En la siguiente imagen se puede ver la jerarquía, el orden y el número de apariciones mínimas y máximas de los nodos en el Complemento de Comercio Exterior 2.0. |
| 38 | + |
| 39 | + |
| 40 | + |
| 41 | +## Métodos para agregar nodos |
| 42 | + |
| 43 | +Los métodos de ayuda para nodos de máximo una sola aparición tienen la forma `getElemento(): Elemento` |
| 44 | +y `addElemento(array $attributes): Elemento`. En donde `Elemento` se sustituye por el nombre del nodo. |
| 45 | +En este caso, `addElemento` siempre trabaja con el elemento que previamente exista. |
| 46 | + |
| 47 | +Los métodos de ayuda para nodos de múltiples apariciones tienen la forma `addElemento(array $attributes): Elemento` |
| 48 | +y `multiElemento(array $attributes): self`. En donde `Elemento` se sustituye por el nombre del nodo y `self` es el |
| 49 | +elemento que contiene el componente. |
| 50 | +En este caso, `addElemento` siempre agrega un nuevo elemento. |
| 51 | + |
| 52 | +```php |
| 53 | +<?php |
| 54 | +$cce = new \CfdiUtils\Elements\Cce20\ComercioExterior(); |
| 55 | + |
| 56 | +// acceso por prefijo get (Mercancias es de 1 aparición) |
| 57 | +$mercancias = $cce->getMercancias(); |
| 58 | + |
| 59 | +// agregar con prefijo add (Mercancia es de 1 aparición) |
| 60 | +$mercancia = $mercancias->addMercancia(['NoIdentificacion'=> 'PN001122', ...]); |
| 61 | + |
| 62 | +// agregar con prefijo multi (DescripcionesEspecificas es de múltiples) |
| 63 | +$mercancia->multiDescripcionesEspecificas( |
| 64 | + ['Marca' => 'Hitachi', 'Modelo' => 'XB-112244', ...], |
| 65 | + ['Marca' => 'Samsung', 'Modelo' => 'ECL-1-PXE', ...] |
| 66 | +); |
| 67 | +``` |
| 68 | + |
| 69 | +### Métodos de ayuda de los elementos |
| 70 | + |
| 71 | +#### Elemento `ComercioExterior` |
| 72 | + |
| 73 | +- `ComercioExterior::getEmisor(): Emisor`. |
| 74 | +- `ComercioExterior::addEmisor(array $attributes): Emisor`. |
| 75 | +- `ComercioExterior::addPropietario(array $attributes): Propietario`. |
| 76 | +- `ComercioExterior::multiPropietario(array ...$elementAttributes): self`. |
| 77 | +- `ComercioExterior::getReceptor(): Receptor`. |
| 78 | +- `ComercioExterior::addReceptor(array $attributes): Receptor`. |
| 79 | +- `ComercioExterior::addDestinatario(array $attributes): Destinatario`. |
| 80 | +- `ComercioExterior::multiDestinatario(array ...$elementAttributes): self`. |
| 81 | +- `ComercioExterior::getMercancias(): Mercancias`. |
| 82 | +- `ComercioExterior::addMercancias(array $attributes): Mercancias`. |
| 83 | + |
| 84 | +#### Elemento `Emisor` |
| 85 | + |
| 86 | +- `Emisor::getDomicilio(): Domicilio`. |
| 87 | +- `Emisor::addDomicilio(array $attributes): Domicilio`. |
| 88 | + |
| 89 | +#### Elemento `Receptor` |
| 90 | + |
| 91 | +- `Emisor::getDomicilio(): Domicilio`. |
| 92 | +- `Emisor::addDomicilio(array $attributes): Domicilio`. |
| 93 | + |
| 94 | +#### Elemento `Destinatario` |
| 95 | + |
| 96 | +- `Emisor::addDomicilio(array $attributes): Domicilio`. |
| 97 | +- `Emisor::multiDomicilio(array ...$elementAttributes): self`. |
| 98 | + |
| 99 | +#### Elemento `Mercancias` |
| 100 | + |
| 101 | +- `Emisor::addMercancias(array $attributes): Mercancias`. |
| 102 | +- `Emisor::multiMercancias(array ...$elementAttributes): self`. |
| 103 | + |
| 104 | +#### Elemento `Mercancia` |
| 105 | + |
| 106 | +- `Emisor::addDescripcionesEspecificas(array $attributes): DescripcionesEspecificas`. |
| 107 | +- `Emisor::multiDescripcionesEspecificas(array ...$elementAttributes): self`. |
| 108 | + |
| 109 | +### Agregar el Complemento de Comercio Exterior al comprobante |
| 110 | + |
| 111 | +Cuando se tiene un comprobante, se puede utilizar el método `Comprobante::addComplemento()` para insertar |
| 112 | +el elemento `ComercioExterior` al comprobante. |
| 113 | + |
| 114 | +```php |
| 115 | +<?php |
| 116 | +// clase de ayuda de creación del CFDI 4.0 |
| 117 | +$creator = new \CfdiUtils\CfdiCreator40(); |
| 118 | +// acceso al elemento Comprobante (el nodo principal del CFDI) |
| 119 | +$comprobante = $creator->comprobante(); |
| 120 | + |
| 121 | +$cce20 = new \CfdiUtils\Elements\Cce20\ComercioExterior(); |
| 122 | +// llenar la información de $cce20 |
| 123 | + |
| 124 | +// agregar $cce20 como complemento del $comprobante |
| 125 | +$comprobante->addComplemento($cce20); |
| 126 | +``` |
0 commit comments