Skip to content

Commit c131b58

Browse files
authored
Merge pull request #27 from eclipxe13/cancel-2022
Cancelación versión 2022
2 parents 70f95db + 56a9c41 commit c131b58

36 files changed

+761
-221
lines changed

.phive/phars.xml

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<phive xmlns="https://phar.io/phive">
3-
<phar name="php-cs-fixer" version="^3.2.2" installed="3.3.2" location="./tools/php-cs-fixer" copy="false"/>
4-
<phar name="phpcs" version="^3.6.1" installed="3.6.1" location="./tools/phpcs" copy="false"/>
5-
<phar name="phpcbf" version="^3.6.1" installed="3.6.1" location="./tools/phpcbf" copy="false"/>
6-
<phar name="phpstan" version="^1.1.2" installed="1.1.2" location="./tools/phpstan" copy="false"/>
7-
<phar name="psalm" version="^4.12.0" installed="4.12.0" location="./tools/psalm" copy="false"/>
3+
<phar name="php-cs-fixer" version="^3.4.0" installed="3.4.0" location="./tools/php-cs-fixer" copy="false"/>
4+
<phar name="phpcs" version="^3.6.2" installed="3.6.2" location="./tools/phpcs" copy="false"/>
5+
<phar name="phpcbf" version="^3.6.2" installed="3.6.2" location="./tools/phpcbf" copy="false"/>
6+
<phar name="phpstan" version="^1.3.3" installed="1.3.3" location="./tools/phpstan" copy="false"/>
7+
<phar name="psalm" version="^4.18.0" installed="4.18.0" location="./tools/psalm" copy="false"/>
88
<phar name="infection" version="^0.23.0" installed="0.23.0" location="./tools/infection" copy="false"/>
99
</phive>

LICENSE

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
The MIT License (MIT)
22

3-
Copyright (c) 2019 - 2021 PhpCfdi https://www.phpcfdi.com/
3+
Copyright (c) 2019 - 2022 PhpCfdi https://www.phpcfdi.com/
44

55
Permission is hereby granted, free of charge, to any person obtaining a copy
66
of this software and associated documentation files (the "Software"), to deal

README.md

+61-41
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,16 @@ composer require phpcfdi/xml-cancelacion
4242
```php
4343
<?php
4444
declare(strict_types=1);
45+
use PhpCfdi\XmlCancelacion\Models\CancelAnswer;
46+
use PhpCfdi\XmlCancelacion\Models\CancelDocument;
47+
use PhpCfdi\XmlCancelacion\Models\RfcRole;
4548
use PhpCfdi\XmlCancelacion\XmlCancelacionHelper;
46-
use PhpCfdi\XmlCancelacion\Definitions\RfcRole;
47-
use PhpCfdi\XmlCancelacion\Definitions\CancelAnswer;
4849

4950
$xmlCancelacion = new XmlCancelacionHelper();
5051

5152
$solicitudCancelacion = $xmlCancelacion
5253
->setNewCredentials('certificado.cer', 'llaveprivada.key', 'contraseña')
53-
->signCancellation('11111111-2222-3333-4444-000000000001');
54+
->signCancellation(CancelDocument::newNotExecuted('11111111-2222-3333-4444-000000000001'));
5455

5556
$consultaRelacionados = $xmlCancelacion->signObtainRelated(
5657
'11111111-2222-3333-4444-000000000002', // uuid a consultar
@@ -71,14 +72,20 @@ $consultaRelacionados = $xmlCancelacion->signCancellationAnswer(
7172
<?php
7273
declare(strict_types=1);
7374
use PhpCfdi\XmlCancelacion\Capsules\Cancellation;
74-
use PhpCfdi\XmlCancelacion\Signers\DOMSigner;
7575
use PhpCfdi\XmlCancelacion\Credentials;
76+
use PhpCfdi\XmlCancelacion\Models\CancelDocument;
77+
use PhpCfdi\XmlCancelacion\Models\CancelDocuments;
78+
use PhpCfdi\XmlCancelacion\Signers\DOMSigner;
7679

7780
// certificado, llave privada y clave de llave
7881
$credentials = new Credentials('certificado.cer.pem', 'privatekey.key.pem', '12345678a');
7982

8083
// datos de cancelación
81-
$data = new Cancellation('LAN7008173R5', ['12345678-1234-1234-1234-123456789012'], new DateTimeImmutable());
84+
$data = new Cancellation(
85+
'EKU9003173C9',
86+
new CancelDocuments(CancelDocument::newWithErrorsUnrelated('62B00C5E-4187-4336-B569-44E0030DC729')),
87+
new DateTimeImmutable()
88+
);
8289

8390
// generación del xml
8491
$xml = (new DOMSigner())->signCapsule($data, $credentials);
@@ -89,41 +96,41 @@ La salida esperada es algo como lo siguiente (sin los espacios en blanco, que ag
8996
```xml
9097
<?xml version="1.0" encoding="UTF-8"?>
9198
<Cancelacion xmlns="http://cancelacfd.sat.gob.mx"
92-
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
93-
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
94-
RfcEmisor="LAN7008173R5" Fecha="2019-04-05T16:29:17">
95-
<Folios>
96-
<UUID>12345678-1234-1234-1234-123456789012</UUID>
97-
</Folios>
98-
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
99-
<SignedInfo>
100-
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
101-
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
102-
<Reference URI="">
103-
<Transforms>
104-
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
105-
</Transforms>
106-
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
107-
<DigestValue>j2x4spEq57R1mQD9lwXh2mmOyK8=</DigestValue>
108-
</Reference>
109-
</SignedInfo>
110-
<SignatureValue>e0Cyi/rXOTFwW8ckNnwQEQ1oC6m73PDvExunnniCsZWQrDRV2SiaH9NoAhJhb5W9p5vJgB+PWu4J6uchG7EikDPbDPw19K3B7uZKTH7tZLffV/bZx6rozzreInvP+S1HhrnOqLPwebBm3Q3yRQk3pbaW2sHFPPuRPLqP+1h3Fegv4GEnwy+0G7LRg3H05v6fDXvONgikCrC2sdzA0kM6qvrOpGfbgBd4au7eFFRjCA4oX9zcQUG9E4m+uVovj0ebp4EqDn9SC+Az3fi5AHom6adju8wx4uJvi8isVg8ZP9KcuqEfXhIkyFutJrD61l00+XyZe4n5T1Aya+Ta0Q6NrA==</SignatureValue>
111-
<KeyInfo>
112-
<X509Data>
113-
<X509IssuerSerial>
114-
<X509IssuerName>/CN=CINDEMEX SA DE CV/name=CINDEMEX SA DE CV/O=CINDEMEX SA DE CV/x500UniqueIdentifier=LAN7008173R5 / FUAB770117BXA/serialNumber= / FUAB770117MDFRNN09/OU=Prueba_CFDI</X509IssuerName>
115-
<X509SerialNumber>20001000000300022815</X509SerialNumber>
116-
</X509IssuerSerial>
117-
<X509Certificate>MIIFxTCCA62gAwIBAgIUMjAwMDEwMDAwMDAzMDAwMjI4MTUwDQYJKoZIhvcNAQELBQAwggFmMSAwHgYDVQQDDBdBLkMuIDIgZGUgcHJ1ZWJhcyg0MDk2KTEvMC0GA1UECgwmU2VydmljaW8gZGUgQWRtaW5pc3RyYWNpw7NuIFRyaWJ1dGFyaWExODA2BgNVBAsML0FkbWluaXN0cmFjacOzbiBkZSBTZWd1cmlkYWQgZGUgbGEgSW5mb3JtYWNpw7NuMSkwJwYJKoZIhvcNAQkBFhphc2lzbmV0QHBydWViYXMuc2F0LmdvYi5teDEmMCQGA1UECQwdQXYuIEhpZGFsZ28gNzcsIENvbC4gR3VlcnJlcm8xDjAMBgNVBBEMBTA2MzAwMQswCQYDVQQGEwJNWDEZMBcGA1UECAwQRGlzdHJpdG8gRmVkZXJhbDESMBAGA1UEBwwJQ295b2Fjw6FuMRUwEwYDVQQtEwxTQVQ5NzA3MDFOTjMxITAfBgkqhkiG9w0BCQIMElJlc3BvbnNhYmxlOiBBQ0RNQTAeFw0xNjEwMjUyMTUyMTFaFw0yMDEwMjUyMTUyMTFaMIGxMRowGAYDVQQDExFDSU5ERU1FWCBTQSBERSBDVjEaMBgGA1UEKRMRQ0lOREVNRVggU0EgREUgQ1YxGjAYBgNVBAoTEUNJTkRFTUVYIFNBIERFIENWMSUwIwYDVQQtExxMQU43MDA4MTczUjUgLyBGVUFCNzcwMTE3QlhBMR4wHAYDVQQFExUgLyBGVUFCNzcwMTE3TURGUk5OMDkxFDASBgNVBAsUC1BydWViYV9DRkRJMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgvvCiCFDFVaYX7xdVRhp/38ULWto/LKDSZy1yrXKpaqFXqERJWF78YHKf3N5GBoXgzwFPuDX+5kvY5wtYNxx/Owu2shNZqFFh6EKsysQMeP5rz6kE1gFYenaPEUP9zj+h0bL3xR5aqoTsqGF24mKBLoiaK44pXBzGzgsxZishVJVM6XbzNJVonEUNbI25DhgWAd86f2aU3BmOH2K1RZx41dtTT56UsszJls4tPFODr/caWuZEuUvLp1M3nj7Dyu88mhD2f+1fA/g7kzcU/1tcpFXF/rIy93APvkU72jwvkrnprzs+SnG81+/F16ahuGsb2EZ88dKHwqxEkwzhMyTbQIDAQABox0wGzAMBgNVHRMBAf8EAjAAMAsGA1UdDwQEAwIGwDANBgkqhkiG9w0BAQsFAAOCAgEAJ/xkL8I+fpilZP+9aO8n93+20XxVomLJjeSL+Ng2ErL2GgatpLuN5JknFBkZAhxVIgMaTS23zzk1RLtRaYvH83lBH5E+M+kEjFGp14Fne1iV2Pm3vL4jeLmzHgY1Kf5HmeVrrp4PU7WQg16VpyHaJ/eonPNiEBUjcyQ1iFfkzJmnSJvDGtfQK2TiEolDJApYv0OWdm4is9Bsfi9j6lI9/T6MNZ+/LM2L/t72Vau4r7m94JDEzaO3A0wHAtQ97fjBfBiO5M8AEISAV7eZidIl3iaJJHkQbBYiiW2gikreUZKPUX0HmlnIqqQcBJhWKRu6Nqk6aZBTETLLpGrvF9OArV1JSsbdw/ZH+P88RAt5em5/gjwwtFlNHyiKG5w+UFpaZOK3gZP0su0sa6dlPeQ9EL4JlFkGqQCgSQ+NOsXqaOavgoP5VLykLwuGnwIUnuhBTVeDbzpgrg9LuF5dYp/zs+Y9ScJqe5VMAagLSYTShNtN8luV7LvxF9pgWwZdcM7lUwqJmUddCiZqdngg3vzTactMToG16gZA4CWnMgbU4E+r541+FNMpgAZNvs2CiW/eApfaaQojsZEAHDsDv4L5n3M1CC7fYjE/d61aSng1LaO6T1mh+dEfPvLzp7zyzz+UgWMhi5Cs4pcXx1eic5r7uxPoBwcCTt3YI1jKVVnV7/w=</X509Certificate>
118-
</X509Data>
119-
<KeyValue>
120-
<RSAKeyValue>
121-
<Modulus>gvvCiCFDFVaYX7xdVRhp/38ULWto/LKDSZy1yrXKpaqFXqERJWF78YHKf3N5GBoXgzwFPuDX+5kvY5wtYNxx/Owu2shNZqFFh6EKsysQMeP5rz6kE1gFYenaPEUP9zj+h0bL3xR5aqoTsqGF24mKBLoiaK44pXBzGzgsxZishVJVM6XbzNJVonEUNbI25DhgWAd86f2aU3BmOH2K1RZx41dtTT56UsszJls4tPFODr/caWuZEuUvLp1M3nj7Dyu88mhD2f+1fA/g7kzcU/1tcpFXF/rIy93APvkU72jwvkrnprzs+SnG81+/F16ahuGsb2EZ88dKHwqxEkwzhMyTbQ==</Modulus>
122-
<Exponent>AQAB</Exponent>
123-
</RSAKeyValue>
124-
</KeyValue>
125-
</KeyInfo>
126-
</Signature>
99+
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
100+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
101+
RfcEmisor="EKU9003173C9" Fecha="2022-01-06T17:49:12">
102+
<Folios>
103+
<Folio UUID="62B00C5E-4187-4336-B569-44E0030DC729" Motivo="02" FolioSustitucion=""></Folio>
104+
</Folios>
105+
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
106+
<SignedInfo>
107+
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
108+
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
109+
<Reference URI="">
110+
<Transforms>
111+
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
112+
</Transforms>
113+
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
114+
<DigestValue>C5CrlWmW2k+LRbwIz2JTydPW2+g=</DigestValue>
115+
</Reference>
116+
</SignedInfo>
117+
<SignatureValue>Kxm+BjKx10C/G3c8W8IItAXgdxKP1hmBf2F4DnVcPLTKNfvRu/E29NG2PXDcXGUauAOLi13+7BT2ovURHQKNsjErmAD5Ya09gkUHNstg8ja6K3O5haTNWSIGGf1ZGi1fY8pZ/VSL32L1BnJsu3d81tnxnpriSWkqSQHG2xcll9L2qxdjxlhPfllL1D9nF1TrCv6QCGzgmnRXs6sgUz7Zb2nZaJzPPnausyktEs56LnQr+dpgGs12G8X4NyqFVo8byNA5/fSwF6WLl7RN4p9fKI1WGZg93yHLG6R1fZ+80N0vebNmRDJCHnTrO2aLOn1dkneCqBExOzj8hJMWljzWGQ==</SignatureValue>
118+
<KeyInfo>
119+
<X509Data>
120+
<X509IssuerSerial>
121+
<X509IssuerName>CN=AC UAT,O=SERVICIO DE ADMINISTRACION TRIBUTARIA,OU=SAT-IES Authority,[email protected],street=3ra cerrada de cadiz,postalCode=06370,C=MX,ST=CIUDAD DE MEXICO,L=COYOACAN,x500UniqueIdentifier=2.5.4.45,unstructuredName=responsable: ACDMA-SAT</X509IssuerName>
122+
<X509SerialNumber>30001000000400002434</X509SerialNumber>
123+
</X509IssuerSerial>
124+
<X509Certificate>MIIFuzCCA6OgAwIBAgIUMzAwMDEwMDAwMDA0MDAwMDI0MzQwDQYJKoZIhvcNAQELBQAwggErMQ8wDQYDVQQDDAZBQyBVQVQxLjAsBgNVBAoMJVNFUlZJQ0lPIERFIEFETUlOSVNUUkFDSU9OIFRSSUJVVEFSSUExGjAYBgNVBAsMEVNBVC1JRVMgQXV0aG9yaXR5MSgwJgYJKoZIhvcNAQkBFhlvc2Nhci5tYXJ0aW5lekBzYXQuZ29iLm14MR0wGwYDVQQJDBQzcmEgY2VycmFkYSBkZSBjYWRpejEOMAwGA1UEEQwFMDYzNzAxCzAJBgNVBAYTAk1YMRkwFwYDVQQIDBBDSVVEQUQgREUgTUVYSUNPMREwDwYDVQQHDAhDT1lPQUNBTjERMA8GA1UELRMIMi41LjQuNDUxJTAjBgkqhkiG9w0BCQITFnJlc3BvbnNhYmxlOiBBQ0RNQS1TQVQwHhcNMTkwNjE3MTk0NDE0WhcNMjMwNjE3MTk0NDE0WjCB4jEnMCUGA1UEAxMeRVNDVUVMQSBLRU1QRVIgVVJHQVRFIFNBIERFIENWMScwJQYDVQQpEx5FU0NVRUxBIEtFTVBFUiBVUkdBVEUgU0EgREUgQ1YxJzAlBgNVBAoTHkVTQ1VFTEEgS0VNUEVSIFVSR0FURSBTQSBERSBDVjElMCMGA1UELRMcRUtVOTAwMzE3M0M5IC8gWElRQjg5MTExNlFFNDEeMBwGA1UEBRMVIC8gWElRQjg5MTExNk1HUk1aUjA1MR4wHAYDVQQLExVFc2N1ZWxhIEtlbXBlciBVcmdhdGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCN0peKpgfOL75iYRv1fqq+oVYsLPVUR/GibYmGKc9InHFy5lYF6OTYjnIIvmkOdRobbGlCUxORX/tLsl8Ya9gm6Yo7hHnODRBIDup3GISFzB/96R9K/MzYQOcscMIoBDARaycnLvy7FlMvO7/rlVnsSARxZRO8Kz8Zkksj2zpeYpjZIya/369+oGqQk1cTRkHo59JvJ4Tfbk/3iIyf4H/Ini9nBe9cYWo0MnKob7DDt/vsdi5tA8mMtA953LapNyCZIDCRQQlUGNgDqY9/8F5mUvVgkcczsIgGdvf9vMQPSf3jjCiKj7j6ucxl1+FwJWmbvgNmiaUR/0q4m2rm78lFAgMBAAGjHTAbMAwGA1UdEwEB/wQCMAAwCwYDVR0PBAQDAgbAMA0GCSqGSIb3DQEBCwUAA4ICAQBcpj1TjT4jiinIujIdAlFzE6kRwYJCnDG08zSp4kSnShjxADGEXH2chehKMV0FY7c4njA5eDGdA/G2OCTPvF5rpeCZP5Dw504RZkYDl2suRz+wa1sNBVpbnBJEK0fQcN3IftBwsgNFdFhUtCyw3lus1SSJbPxjLHS6FcZZ51YSeIfcNXOAuTqdimusaXq15GrSrCOkM6n2jfj2sMJYM2HXaXJ6rGTEgYmhYdwxWtil6RfZB+fGQ/H9I9WLnl4KTZUS6C9+NLHh4FPDhSk19fpS2S/56aqgFoGAkXAYt9Fy5ECaPcULIfJ1DEbsXKyRdCv3JY89+0MNkOdaDnsemS2o5Gl08zI4iYtt3L40gAZ60NPh31kVLnYNsmvfNxYyKp+AeJtDHyW9w7ftM0Hoi+BuRmcAQSKFV3pk8j51la+jrRBrAUv8blbRcQ5BiZUwJzHFEKIwTsRGoRyEx96sNnB03n6GTwjIGz92SmLdNl95r9rkvp+2m4S6q1lPuXaFg7DGBrXWC8iyqeWE2iobdwIIuXPTMVqQb12m1dAkJVRO5NdHnP/MpqOvOgLqoZBNHGyBg4Gqm4sCJHCxA1c8Elfa2RQTCk0tAzllL4vOnI1GHkGJn65xokGsaU4B4D36xh7eWrfj4/pgWHmtoDAYa8wzSwo2GVCZOs+mtEgOQB91/g==</X509Certificate>
125+
</X509Data>
126+
<KeyValue>
127+
<RSAKeyValue>
128+
<Modulus>jdKXiqYHzi++YmEb9X6qvqFWLCz1VEfxom2JhinPSJxxcuZWBejk2I5yCL5pDnUaG2xpQlMTkV/7S7JfGGvYJumKO4R5zg0QSA7qdxiEhcwf/ekfSvzM2EDnLHDCKAQwEWsnJy78uxZTLzu/65VZ7EgEcWUTvCs/GZJLI9s6XmKY2SMmv9+vfqBqkJNXE0ZB6OfSbyeE325P94iMn+B/yJ4vZwXvXGFqNDJyqG+ww7f77HYubQPJjLQPedy2qTcgmSAwkUEJVBjYA6mPf/BeZlL1YJHHM7CIBnb3/bzED0n944woio+4+rnMZdfhcCVpm74DZomlEf9KuJtq5u/JRQ==</Modulus>
129+
<Exponent>AQAB</Exponent>
130+
</RSAKeyValue>
131+
</KeyValue>
132+
</KeyInfo>
133+
</Signature>
127134
</Cancelacion>
128135
```
129136

@@ -173,6 +180,19 @@ TIP: Por la experiencia en el uso de los servicios de SAT es recomendado usar si
173180

174181
## Objetos de trabajo
175182

183+
## Documentos a cancelar
184+
185+
**`CancelDocuments`** es una colección de objetos a cancelar. A pesar de que es posible solicitar
186+
la cancelación de múltiples documentos se recomienda enviar uno por uno.
187+
188+
**`CancelDocument`** es la especificación de objeto a cancelar. El objeto se puede crear utilizando el constructor,
189+
o bien, utilizando los métodos de ayuda que incluyen el motivo de la cancelación:
190+
191+
- `CancelDocuments::newWithErrorsRelated(string $uuid, string $substituteOf)`.
192+
- `CancelDocuments::newWithErrorsUnrelated(string $uuid)`.
193+
- `CancelDocuments::newNotExecuted(string $uuid)`.
194+
- `CancelDocuments::newNormativeToGlobal(string $uuid)`.
195+
176196
**`CapsuleInterface`** son los objetos que contienen toda la información relacionada con los datos a firmar,
177197
este tipo de objetos tiene la facultad de poder revisar si el RFC es el mismo usado en la firma así como
178198
poder generar el documento XML a firmar.
@@ -226,7 +246,7 @@ usar esta librería sin temor a romper tu aplicación.
226246

227247
## Contribuciones
228248

229-
Las contribuciones con bienvenidas. Por favor lee [CONTRIBUTING][] para más detalles
249+
Las contribuciones con bienvenidas. Por favor, revisa [CONTRIBUTING][] para más detalles
230250
y recuerda revisar el archivo de tareas pendientes [TODO][] y el archivo [CHANGELOG][].
231251

232252
## Copyright and License

docs/CHANGELOG.md

+9-2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,15 @@ Usamos [Versionado Semántico 2.0.0](SEMVER.md) por lo que puedes usar esta libr
99
Pueden aparecer cambios no liberados que se integran a la rama principal, pero no ameritan una nueva liberación de
1010
versión, aunque sí su incorporación en la rama principal de trabajo. Generalmente se tratan de cambios en el desarrollo.
1111

12+
## Listado de cambios
13+
14+
### Versión 2.0.0 2022-01-08
15+
16+
- Se actualiza al nuevo esquema de datos de cancelación del SAT, ahora no se pide un arreglo de UUID,
17+
se pide un objeto `CancelDocuments`. Se crean diferentes objetos de valor relacionados a los nuevos campos.
18+
- Se cambia el namespace `PhpCfdi\XmlCancelacion\Definitions` a `PhpCfdi\XmlCancelacion\Models`.
19+
- Actualización de licencia, feliz 2022.
20+
1221
### UNRELEASED 2021-11-15
1322

1423
- Se actualizan las dependencias de las librerías de desarrollo.
@@ -20,8 +29,6 @@ versión, aunque sí su incorporación en la rama principal de trabajo. Generalm
2029
- Se remueve la anotación del tipo de variable para `DOMElement::documentElement`, `psalm` ya lo detecta correctamente.
2130
- Se actualizan las versiones de dependencias en `.phive/phars.xml`.
2231

23-
## Listado de cambios
24-
2532
### Versión 1.1.2 2021-09-03
2633

2734
- La versión menor de PHP es 7.3.

src/Capsules/Cancellation.php

+26-22
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,22 @@
77
use Countable;
88
use DateTimeImmutable;
99
use DOMDocument;
10-
use PhpCfdi\XmlCancelacion\Definitions\DocumentType;
10+
use PhpCfdi\XmlCancelacion\Models\DocumentType;
1111
use PhpCfdi\XmlCancelacion\Internal\XmlHelperFunctions;
12+
use PhpCfdi\XmlCancelacion\Models\CancelDocuments;
1213

1314
class Cancellation implements Countable, CapsuleInterface
1415
{
1516
use XmlHelperFunctions;
1617

17-
private const UUID_EXISTS = true;
18-
1918
/** @var string */
2019
private $rfc;
2120

2221
/** @var DateTimeImmutable */
2322
private $date;
2423

25-
/** @var array<string, bool> This is a B-Tree array, values are stored in keys */
26-
private $uuids;
24+
/** @var CancelDocuments */
25+
private $documents;
2726

2827
/** @var DocumentType */
2928
private $documentType;
@@ -32,19 +31,20 @@ class Cancellation implements Countable, CapsuleInterface
3231
* DTO for cancellation request, it supports CFDI and Retention
3332
*
3433
* @param string $rfc
35-
* @param string[] $uuids
34+
* @param CancelDocuments $documents
3635
* @param DateTimeImmutable $date
3736
* @param DocumentType|null $type Uses CFDI if non provided
3837
*/
39-
public function __construct(string $rfc, array $uuids, DateTimeImmutable $date, DocumentType $type = null)
40-
{
38+
public function __construct(
39+
string $rfc,
40+
CancelDocuments $documents,
41+
DateTimeImmutable $date,
42+
DocumentType $type = null
43+
) {
4144
$this->rfc = $rfc;
4245
$this->date = $date;
43-
$this->uuids = [];
46+
$this->documents = $documents;
4447
$this->documentType = $type ?? DocumentType::cfdi();
45-
foreach ($uuids as $uuid) {
46-
$this->uuids[strtoupper($uuid)] = self::UUID_EXISTS;
47-
}
4848
}
4949

5050
public function rfc(): string
@@ -62,30 +62,34 @@ public function documentType(): DocumentType
6262
return $this->documentType;
6363
}
6464

65-
/**
66-
* The list of UUIDS
67-
* @return string[]
68-
*/
69-
public function uuids(): array
65+
public function documents(): CancelDocuments
7066
{
71-
return array_keys($this->uuids);
67+
return $this->documents;
7268
}
7369

7470
public function count(): int
7571
{
76-
return count($this->uuids);
72+
return $this->documents->count();
7773
}
7874

75+
/** @noinspection PhpUnhandledExceptionInspection */
7976
public function exportToDocument(): DOMDocument
8077
{
8178
$document = (new BaseDocumentBuilder())->createBaseDocument('Cancelacion', $this->documentType->value());
8279

8380
$cancelacion = $this->xmlDocumentElement($document);
8481
$cancelacion->setAttribute('RfcEmisor', $this->rfc()); // en el anexo 20 es opcional!
8582
$cancelacion->setAttribute('Fecha', $this->date()->format('Y-m-d\TH:i:s'));
86-
$folios = $cancelacion->appendChild($document->createElement('Folios'));
87-
foreach ($this->uuids() as $uuid) {
88-
$folios->appendChild($document->createElement('UUID', htmlspecialchars($uuid, ENT_XML1)));
83+
84+
$folios = $document->createElement('Folios');
85+
$cancelacion->appendChild($folios);
86+
foreach ($this->documents as $cancelDocument) {
87+
$folio = $document->createElement('Folio');
88+
$folios->appendChild($folio);
89+
$subsituteOf = $cancelDocument->hasSubstituteOf() ? (string) $cancelDocument->substituteOf() : '';
90+
$folio->setAttribute('UUID', (string) $cancelDocument->uuid());
91+
$folio->setAttribute('Motivo', (string) $cancelDocument->reason());
92+
$folio->setAttribute('FolioSustitucion', $subsituteOf);
8993
}
9094

9195
return $document;

src/Capsules/CancellationAnswer.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66

77
use DateTimeImmutable;
88
use DOMDocument;
9-
use PhpCfdi\XmlCancelacion\Definitions\CancelAnswer;
10-
use PhpCfdi\XmlCancelacion\Definitions\DocumentType;
9+
use PhpCfdi\XmlCancelacion\Models\CancelAnswer;
10+
use PhpCfdi\XmlCancelacion\Models\DocumentType;
1111
use PhpCfdi\XmlCancelacion\Internal\XmlHelperFunctions;
1212

1313
class CancellationAnswer implements CapsuleInterface

src/Capsules/ObtainRelated.php

+5-5
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
namespace PhpCfdi\XmlCancelacion\Capsules;
66

77
use DOMDocument;
8-
use PhpCfdi\XmlCancelacion\Definitions;
9-
use PhpCfdi\XmlCancelacion\Definitions\DocumentType;
10-
use PhpCfdi\XmlCancelacion\Definitions\RfcRole;
8+
use PhpCfdi\XmlCancelacion\Models;
9+
use PhpCfdi\XmlCancelacion\Models\DocumentType;
10+
use PhpCfdi\XmlCancelacion\Models\RfcRole;
1111
use PhpCfdi\XmlCancelacion\Internal\XmlHelperFunctions;
1212

1313
class ObtainRelated implements CapsuleInterface
@@ -20,7 +20,7 @@ class ObtainRelated implements CapsuleInterface
2020
/** @var string */
2121
private $rfc;
2222

23-
/** @var Definitions\RfcRole */
23+
/** @var Models\RfcRole */
2424
private $role;
2525

2626
/** @var string */
@@ -44,7 +44,7 @@ public function rfc(): string
4444
return $this->rfc;
4545
}
4646

47-
public function role(): Definitions\RfcRole
47+
public function role(): Models\RfcRole
4848
{
4949
return $this->role;
5050
}

0 commit comments

Comments
 (0)