Skip to content

Commit

Permalink
Merge pull request #116 from eclipxe13/version-2.26.0
Browse files Browse the repository at this point in the history
Add CCE 2.0 & add move SAT definitions to Retenciones (version 2.26.0)
  • Loading branch information
eclipxe13 committed Jan 10, 2024
2 parents 3545050 + c0f2583 commit 9a2dbd6
Show file tree
Hide file tree
Showing 20 changed files with 460 additions and 13 deletions.
34 changes: 34 additions & 0 deletions development/ElementsMaker/specifications/ComercioExterior20.json
@@ -0,0 +1,34 @@
{
"php-namespace": "CfdiUtils\\Elements\\Cce20",
"prefix": "cce20",
"xml-namespace": "http://www.sat.gob.mx/ComercioExterior20",
"xml-schemalocation": "http://www.sat.gob.mx/sitio_internet/cfd/ComercioExterior20/ComercioExterior20.xsd",
"version-attribute": "Version",
"version-value": "2.0",
"root-element": "ComercioExterior",
"structure": {
"Emisor": {
"Domicilio": {}
},
"Propietario": {
"multiple": true
},
"Receptor": {
"Domicilio": {}
},
"Destinatario": {
"multiple": true,
"Domicilio": {
"multiple": true
}
},
"Mercancias": {
"Mercancia": {
"multiple": true,
"DescripcionesEspecificas": {
"multiple": true
}
}
}
}
}
12 changes: 12 additions & 0 deletions docs/CHANGELOG.md
Expand Up @@ -32,6 +32,18 @@
- Merge methods from `\CfdiUtils\Nodes\NodeHasValueInterface` into `\CfdiUtils\Nodes\NodeInterface`.
- Remove deprecated constant `CfdiUtils\Retenciones\Retenciones::RET_NAMESPACE`.

## Version 2.26.0 2024-01-10

Add `CfdiUtils\Elements\Cce30` *Elements* to work with "Complemento de Comercio Exterior 3.0".

Extract logic to move SAT definitions to root element to a helper in order to use it on other creators:

- Add `SatNsDefinitionsMover` helper.
- Change `CfdiCreatorTrait::moveSatDefinitionsToComprobante` to use helper.
- Add `RetencionesCreatorTrait::moveSatDefinitionsToRetenciones`.
- Document samples using `$creator->moveSatDefinitionsToRetenciones()`.
- Fix tests sample files with sat definitions on root element.

## Unreleased 2024-01-08

- Fix continuous integration code style.
Expand Down
6 changes: 6 additions & 0 deletions docs/crear/cfdi-de-retenciones-e-informacion-de-pagos.md
Expand Up @@ -66,6 +66,9 @@ $retenciones->addComplemento($dividendos);
$creator->putCertificado(new \CfdiUtils\Certificado\Certificado('archivo.cer'));
$creator->addSello('file://archivo.key.pem', 'la contraseña');

// método de ayuda para mover las declaraciones de espacios de nombre al nodo raíz
$creator->moveSatDefinitionsToRetenciones();

// Asserts contendrá el resultado de la validación
$asserts = $creator->validate();

Expand Down Expand Up @@ -132,6 +135,9 @@ $retenciones->addComplemento($dividendos);
$creator->putCertificado(new \CfdiUtils\Certificado\Certificado('archivo.cer'));
$creator->addSello('file://archivo.key.pem', 'la contraseña');

// método de ayuda para mover las declaraciones de espacios de nombre al nodo raíz
$creator->moveSatDefinitionsToRetenciones();

// Asserts contendrá el resultado de la validación
$asserts = $creator->validate();

Expand Down
13 changes: 4 additions & 9 deletions src/CfdiUtils/CfdiCreatorTrait.php
Expand Up @@ -8,11 +8,11 @@
use CfdiUtils\Certificado\Certificado;
use CfdiUtils\Certificado\CertificadoPropertyTrait;
use CfdiUtils\Nodes\NodeInterface;
use CfdiUtils\Nodes\NodeNsDefinitionsMover;
use CfdiUtils\Nodes\XmlNodeUtils;
use CfdiUtils\PemPrivateKey\PemPrivateKey;
use CfdiUtils\SumasConceptos\SumasConceptos;
use CfdiUtils\SumasConceptos\SumasConceptosWriter;
use CfdiUtils\Utils\SatNsDefinitionsMover;
use CfdiUtils\Validate\Asserts;
use CfdiUtils\Validate\Hydrater;
use CfdiUtils\Validate\MultiValidator;
Expand Down Expand Up @@ -75,15 +75,10 @@ public function asXml(): string
return XmlNodeUtils::nodeToXmlString($this->comprobante, true);
}

public function moveSatDefinitionsToComprobante()
public function moveSatDefinitionsToComprobante(): void
{
$nodeNsDefinitionsMover = new NodeNsDefinitionsMover();
$nodeNsDefinitionsMover->setNamespaceFilter(
function (string $namespaceUri): bool {
return ('http://www.sat.gob.mx/' === (substr($namespaceUri, 0, 22) ?: ''));
}
);
$nodeNsDefinitionsMover->process($this->comprobante);
$mover = new SatNsDefinitionsMover();
$mover->move($this->comprobante);
}

public function saveXml(string $filename): bool
Expand Down
100 changes: 100 additions & 0 deletions src/CfdiUtils/Elements/Cce20/ComercioExterior.php
@@ -0,0 +1,100 @@
<?php

namespace CfdiUtils\Elements\Cce20;

use CfdiUtils\Elements\Common\AbstractElement;

class ComercioExterior extends AbstractElement
{
public function getElementName(): string
{
return 'cce20:ComercioExterior';
}

public function getChildrenOrder(): array
{
return [
'cce20:Emisor',
'cce20:Propietario',
'cce20:Receptor',
'cce20:Destinatario',
'cce20:Mercancias',
];
}

public function getFixedAttributes(): array
{
return [
'xmlns:cce20' => 'http://www.sat.gob.mx/ComercioExterior20',
'xsi:schemaLocation' => 'http://www.sat.gob.mx/ComercioExterior20'
. ' http://www.sat.gob.mx/sitio_internet/cfd/ComercioExterior20/ComercioExterior20.xsd',
'Version' => '2.0',
];
}

public function getEmisor(): Emisor
{
return $this->helperGetOrAdd(new Emisor());
}

public function addEmisor(array $attributes = []): Emisor
{
$subject = $this->getEmisor();
$subject->addAttributes($attributes);
return $subject;
}

public function addPropietario(array $attributes = []): Propietario
{
$subject = new Propietario($attributes);
$this->addChild($subject);
return $subject;
}

public function multiPropietario(array ...$elementAttributes): self
{
foreach ($elementAttributes as $attributes) {
$this->addPropietario($attributes);
}
return $this;
}

public function getReceptor(): Receptor
{
return $this->helperGetOrAdd(new Receptor());
}

public function addReceptor(array $attributes = []): Receptor
{
$subject = $this->getReceptor();
$subject->addAttributes($attributes);
return $subject;
}

public function addDestinatario(array $attributes = []): Destinatario
{
$subject = new Destinatario($attributes);
$this->addChild($subject);
return $subject;
}

public function multiDestinatario(array ...$elementAttributes): self
{
foreach ($elementAttributes as $attributes) {
$this->addDestinatario($attributes);
}
return $this;
}

public function getMercancias(): Mercancias
{
return $this->helperGetOrAdd(new Mercancias());
}

public function addMercancias(array $attributes = []): Mercancias
{
$subject = $this->getMercancias();
$subject->addAttributes($attributes);
return $subject;
}
}
13 changes: 13 additions & 0 deletions src/CfdiUtils/Elements/Cce20/DescripcionesEspecificas.php
@@ -0,0 +1,13 @@
<?php

namespace CfdiUtils\Elements\Cce20;

use CfdiUtils\Elements\Common\AbstractElement;

class DescripcionesEspecificas extends AbstractElement
{
public function getElementName(): string
{
return 'cce20:DescripcionesEspecificas';
}
}
28 changes: 28 additions & 0 deletions src/CfdiUtils/Elements/Cce20/Destinatario.php
@@ -0,0 +1,28 @@
<?php

namespace CfdiUtils\Elements\Cce20;

use CfdiUtils\Elements\Common\AbstractElement;

class Destinatario extends AbstractElement
{
public function getElementName(): string
{
return 'cce20:Destinatario';
}

public function addDomicilio(array $attributes = []): Domicilio
{
$subject = new Domicilio($attributes);
$this->addChild($subject);
return $subject;
}

public function multiDomicilio(array ...$elementAttributes): self
{
foreach ($elementAttributes as $attributes) {
$this->addDomicilio($attributes);
}
return $this;
}
}
13 changes: 13 additions & 0 deletions src/CfdiUtils/Elements/Cce20/Domicilio.php
@@ -0,0 +1,13 @@
<?php

namespace CfdiUtils\Elements\Cce20;

use CfdiUtils\Elements\Common\AbstractElement;

class Domicilio extends AbstractElement
{
public function getElementName(): string
{
return 'cce20:Domicilio';
}
}
25 changes: 25 additions & 0 deletions src/CfdiUtils/Elements/Cce20/Emisor.php
@@ -0,0 +1,25 @@
<?php

namespace CfdiUtils\Elements\Cce20;

use CfdiUtils\Elements\Common\AbstractElement;

class Emisor extends AbstractElement
{
public function getElementName(): string
{
return 'cce20:Emisor';
}

public function getDomicilio(): Domicilio
{
return $this->helperGetOrAdd(new Domicilio());
}

public function addDomicilio(array $attributes = []): Domicilio
{
$subject = $this->getDomicilio();
$subject->addAttributes($attributes);
return $subject;
}
}
28 changes: 28 additions & 0 deletions src/CfdiUtils/Elements/Cce20/Mercancia.php
@@ -0,0 +1,28 @@
<?php

namespace CfdiUtils\Elements\Cce20;

use CfdiUtils\Elements\Common\AbstractElement;

class Mercancia extends AbstractElement
{
public function getElementName(): string
{
return 'cce20:Mercancia';
}

public function addDescripcionesEspecificas(array $attributes = []): DescripcionesEspecificas
{
$subject = new DescripcionesEspecificas($attributes);
$this->addChild($subject);
return $subject;
}

public function multiDescripcionesEspecificas(array ...$elementAttributes): self
{
foreach ($elementAttributes as $attributes) {
$this->addDescripcionesEspecificas($attributes);
}
return $this;
}
}
28 changes: 28 additions & 0 deletions src/CfdiUtils/Elements/Cce20/Mercancias.php
@@ -0,0 +1,28 @@
<?php

namespace CfdiUtils\Elements\Cce20;

use CfdiUtils\Elements\Common\AbstractElement;

class Mercancias extends AbstractElement
{
public function getElementName(): string
{
return 'cce20:Mercancias';
}

public function addMercancia(array $attributes = []): Mercancia
{
$subject = new Mercancia($attributes);
$this->addChild($subject);
return $subject;
}

public function multiMercancia(array ...$elementAttributes): self
{
foreach ($elementAttributes as $attributes) {
$this->addMercancia($attributes);
}
return $this;
}
}
13 changes: 13 additions & 0 deletions src/CfdiUtils/Elements/Cce20/Propietario.php
@@ -0,0 +1,13 @@
<?php

namespace CfdiUtils\Elements\Cce20;

use CfdiUtils\Elements\Common\AbstractElement;

class Propietario extends AbstractElement
{
public function getElementName(): string
{
return 'cce20:Propietario';
}
}
25 changes: 25 additions & 0 deletions src/CfdiUtils/Elements/Cce20/Receptor.php
@@ -0,0 +1,25 @@
<?php

namespace CfdiUtils\Elements\Cce20;

use CfdiUtils\Elements\Common\AbstractElement;

class Receptor extends AbstractElement
{
public function getElementName(): string
{
return 'cce20:Receptor';
}

public function getDomicilio(): Domicilio
{
return $this->helperGetOrAdd(new Domicilio());
}

public function addDomicilio(array $attributes = []): Domicilio
{
$subject = $this->getDomicilio();
$subject->addAttributes($attributes);
return $subject;
}
}

0 comments on commit 9a2dbd6

Please sign in to comment.