Skip to content

Commit 9a2dbd6

Browse files
authored
Merge pull request #116 from eclipxe13/version-2.26.0
Add CCE 2.0 & add move SAT definitions to Retenciones (version 2.26.0)
2 parents 3545050 + c0f2583 commit 9a2dbd6

20 files changed

+460
-13
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
{
2+
"php-namespace": "CfdiUtils\\Elements\\Cce20",
3+
"prefix": "cce20",
4+
"xml-namespace": "http://www.sat.gob.mx/ComercioExterior20",
5+
"xml-schemalocation": "http://www.sat.gob.mx/sitio_internet/cfd/ComercioExterior20/ComercioExterior20.xsd",
6+
"version-attribute": "Version",
7+
"version-value": "2.0",
8+
"root-element": "ComercioExterior",
9+
"structure": {
10+
"Emisor": {
11+
"Domicilio": {}
12+
},
13+
"Propietario": {
14+
"multiple": true
15+
},
16+
"Receptor": {
17+
"Domicilio": {}
18+
},
19+
"Destinatario": {
20+
"multiple": true,
21+
"Domicilio": {
22+
"multiple": true
23+
}
24+
},
25+
"Mercancias": {
26+
"Mercancia": {
27+
"multiple": true,
28+
"DescripcionesEspecificas": {
29+
"multiple": true
30+
}
31+
}
32+
}
33+
}
34+
}

docs/CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,18 @@
3232
- Merge methods from `\CfdiUtils\Nodes\NodeHasValueInterface` into `\CfdiUtils\Nodes\NodeInterface`.
3333
- Remove deprecated constant `CfdiUtils\Retenciones\Retenciones::RET_NAMESPACE`.
3434

35+
## Version 2.26.0 2024-01-10
36+
37+
Add `CfdiUtils\Elements\Cce30` *Elements* to work with "Complemento de Comercio Exterior 3.0".
38+
39+
Extract logic to move SAT definitions to root element to a helper in order to use it on other creators:
40+
41+
- Add `SatNsDefinitionsMover` helper.
42+
- Change `CfdiCreatorTrait::moveSatDefinitionsToComprobante` to use helper.
43+
- Add `RetencionesCreatorTrait::moveSatDefinitionsToRetenciones`.
44+
- Document samples using `$creator->moveSatDefinitionsToRetenciones()`.
45+
- Fix tests sample files with sat definitions on root element.
46+
3547
## Unreleased 2024-01-08
3648

3749
- Fix continuous integration code style.

docs/crear/cfdi-de-retenciones-e-informacion-de-pagos.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ $retenciones->addComplemento($dividendos);
6666
$creator->putCertificado(new \CfdiUtils\Certificado\Certificado('archivo.cer'));
6767
$creator->addSello('file://archivo.key.pem', 'la contraseña');
6868

69+
// método de ayuda para mover las declaraciones de espacios de nombre al nodo raíz
70+
$creator->moveSatDefinitionsToRetenciones();
71+
6972
// Asserts contendrá el resultado de la validación
7073
$asserts = $creator->validate();
7174

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

138+
// método de ayuda para mover las declaraciones de espacios de nombre al nodo raíz
139+
$creator->moveSatDefinitionsToRetenciones();
140+
135141
// Asserts contendrá el resultado de la validación
136142
$asserts = $creator->validate();
137143

src/CfdiUtils/CfdiCreatorTrait.php

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@
88
use CfdiUtils\Certificado\Certificado;
99
use CfdiUtils\Certificado\CertificadoPropertyTrait;
1010
use CfdiUtils\Nodes\NodeInterface;
11-
use CfdiUtils\Nodes\NodeNsDefinitionsMover;
1211
use CfdiUtils\Nodes\XmlNodeUtils;
1312
use CfdiUtils\PemPrivateKey\PemPrivateKey;
1413
use CfdiUtils\SumasConceptos\SumasConceptos;
1514
use CfdiUtils\SumasConceptos\SumasConceptosWriter;
15+
use CfdiUtils\Utils\SatNsDefinitionsMover;
1616
use CfdiUtils\Validate\Asserts;
1717
use CfdiUtils\Validate\Hydrater;
1818
use CfdiUtils\Validate\MultiValidator;
@@ -75,15 +75,10 @@ public function asXml(): string
7575
return XmlNodeUtils::nodeToXmlString($this->comprobante, true);
7676
}
7777

78-
public function moveSatDefinitionsToComprobante()
78+
public function moveSatDefinitionsToComprobante(): void
7979
{
80-
$nodeNsDefinitionsMover = new NodeNsDefinitionsMover();
81-
$nodeNsDefinitionsMover->setNamespaceFilter(
82-
function (string $namespaceUri): bool {
83-
return ('http://www.sat.gob.mx/' === (substr($namespaceUri, 0, 22) ?: ''));
84-
}
85-
);
86-
$nodeNsDefinitionsMover->process($this->comprobante);
80+
$mover = new SatNsDefinitionsMover();
81+
$mover->move($this->comprobante);
8782
}
8883

8984
public function saveXml(string $filename): bool
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
<?php
2+
3+
namespace CfdiUtils\Elements\Cce20;
4+
5+
use CfdiUtils\Elements\Common\AbstractElement;
6+
7+
class ComercioExterior extends AbstractElement
8+
{
9+
public function getElementName(): string
10+
{
11+
return 'cce20:ComercioExterior';
12+
}
13+
14+
public function getChildrenOrder(): array
15+
{
16+
return [
17+
'cce20:Emisor',
18+
'cce20:Propietario',
19+
'cce20:Receptor',
20+
'cce20:Destinatario',
21+
'cce20:Mercancias',
22+
];
23+
}
24+
25+
public function getFixedAttributes(): array
26+
{
27+
return [
28+
'xmlns:cce20' => 'http://www.sat.gob.mx/ComercioExterior20',
29+
'xsi:schemaLocation' => 'http://www.sat.gob.mx/ComercioExterior20'
30+
. ' http://www.sat.gob.mx/sitio_internet/cfd/ComercioExterior20/ComercioExterior20.xsd',
31+
'Version' => '2.0',
32+
];
33+
}
34+
35+
public function getEmisor(): Emisor
36+
{
37+
return $this->helperGetOrAdd(new Emisor());
38+
}
39+
40+
public function addEmisor(array $attributes = []): Emisor
41+
{
42+
$subject = $this->getEmisor();
43+
$subject->addAttributes($attributes);
44+
return $subject;
45+
}
46+
47+
public function addPropietario(array $attributes = []): Propietario
48+
{
49+
$subject = new Propietario($attributes);
50+
$this->addChild($subject);
51+
return $subject;
52+
}
53+
54+
public function multiPropietario(array ...$elementAttributes): self
55+
{
56+
foreach ($elementAttributes as $attributes) {
57+
$this->addPropietario($attributes);
58+
}
59+
return $this;
60+
}
61+
62+
public function getReceptor(): Receptor
63+
{
64+
return $this->helperGetOrAdd(new Receptor());
65+
}
66+
67+
public function addReceptor(array $attributes = []): Receptor
68+
{
69+
$subject = $this->getReceptor();
70+
$subject->addAttributes($attributes);
71+
return $subject;
72+
}
73+
74+
public function addDestinatario(array $attributes = []): Destinatario
75+
{
76+
$subject = new Destinatario($attributes);
77+
$this->addChild($subject);
78+
return $subject;
79+
}
80+
81+
public function multiDestinatario(array ...$elementAttributes): self
82+
{
83+
foreach ($elementAttributes as $attributes) {
84+
$this->addDestinatario($attributes);
85+
}
86+
return $this;
87+
}
88+
89+
public function getMercancias(): Mercancias
90+
{
91+
return $this->helperGetOrAdd(new Mercancias());
92+
}
93+
94+
public function addMercancias(array $attributes = []): Mercancias
95+
{
96+
$subject = $this->getMercancias();
97+
$subject->addAttributes($attributes);
98+
return $subject;
99+
}
100+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
namespace CfdiUtils\Elements\Cce20;
4+
5+
use CfdiUtils\Elements\Common\AbstractElement;
6+
7+
class DescripcionesEspecificas extends AbstractElement
8+
{
9+
public function getElementName(): string
10+
{
11+
return 'cce20:DescripcionesEspecificas';
12+
}
13+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
namespace CfdiUtils\Elements\Cce20;
4+
5+
use CfdiUtils\Elements\Common\AbstractElement;
6+
7+
class Destinatario extends AbstractElement
8+
{
9+
public function getElementName(): string
10+
{
11+
return 'cce20:Destinatario';
12+
}
13+
14+
public function addDomicilio(array $attributes = []): Domicilio
15+
{
16+
$subject = new Domicilio($attributes);
17+
$this->addChild($subject);
18+
return $subject;
19+
}
20+
21+
public function multiDomicilio(array ...$elementAttributes): self
22+
{
23+
foreach ($elementAttributes as $attributes) {
24+
$this->addDomicilio($attributes);
25+
}
26+
return $this;
27+
}
28+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
namespace CfdiUtils\Elements\Cce20;
4+
5+
use CfdiUtils\Elements\Common\AbstractElement;
6+
7+
class Domicilio extends AbstractElement
8+
{
9+
public function getElementName(): string
10+
{
11+
return 'cce20:Domicilio';
12+
}
13+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
namespace CfdiUtils\Elements\Cce20;
4+
5+
use CfdiUtils\Elements\Common\AbstractElement;
6+
7+
class Emisor extends AbstractElement
8+
{
9+
public function getElementName(): string
10+
{
11+
return 'cce20:Emisor';
12+
}
13+
14+
public function getDomicilio(): Domicilio
15+
{
16+
return $this->helperGetOrAdd(new Domicilio());
17+
}
18+
19+
public function addDomicilio(array $attributes = []): Domicilio
20+
{
21+
$subject = $this->getDomicilio();
22+
$subject->addAttributes($attributes);
23+
return $subject;
24+
}
25+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
namespace CfdiUtils\Elements\Cce20;
4+
5+
use CfdiUtils\Elements\Common\AbstractElement;
6+
7+
class Mercancia extends AbstractElement
8+
{
9+
public function getElementName(): string
10+
{
11+
return 'cce20:Mercancia';
12+
}
13+
14+
public function addDescripcionesEspecificas(array $attributes = []): DescripcionesEspecificas
15+
{
16+
$subject = new DescripcionesEspecificas($attributes);
17+
$this->addChild($subject);
18+
return $subject;
19+
}
20+
21+
public function multiDescripcionesEspecificas(array ...$elementAttributes): self
22+
{
23+
foreach ($elementAttributes as $attributes) {
24+
$this->addDescripcionesEspecificas($attributes);
25+
}
26+
return $this;
27+
}
28+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
namespace CfdiUtils\Elements\Cce20;
4+
5+
use CfdiUtils\Elements\Common\AbstractElement;
6+
7+
class Mercancias extends AbstractElement
8+
{
9+
public function getElementName(): string
10+
{
11+
return 'cce20:Mercancias';
12+
}
13+
14+
public function addMercancia(array $attributes = []): Mercancia
15+
{
16+
$subject = new Mercancia($attributes);
17+
$this->addChild($subject);
18+
return $subject;
19+
}
20+
21+
public function multiMercancia(array ...$elementAttributes): self
22+
{
23+
foreach ($elementAttributes as $attributes) {
24+
$this->addMercancia($attributes);
25+
}
26+
return $this;
27+
}
28+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
namespace CfdiUtils\Elements\Cce20;
4+
5+
use CfdiUtils\Elements\Common\AbstractElement;
6+
7+
class Propietario extends AbstractElement
8+
{
9+
public function getElementName(): string
10+
{
11+
return 'cce20:Propietario';
12+
}
13+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
namespace CfdiUtils\Elements\Cce20;
4+
5+
use CfdiUtils\Elements\Common\AbstractElement;
6+
7+
class Receptor extends AbstractElement
8+
{
9+
public function getElementName(): string
10+
{
11+
return 'cce20:Receptor';
12+
}
13+
14+
public function getDomicilio(): Domicilio
15+
{
16+
return $this->helperGetOrAdd(new Domicilio());
17+
}
18+
19+
public function addDomicilio(array $attributes = []): Domicilio
20+
{
21+
$subject = $this->getDomicilio();
22+
$subject->addAttributes($attributes);
23+
return $subject;
24+
}
25+
}

0 commit comments

Comments
 (0)