Skip to content

Commit

Permalink
Merge pull request #118 from eclipxe13/version-2.28.0
Browse files Browse the repository at this point in the history
Deprecate Crp20277Fixer & fix build (version 2.28.0)
  • Loading branch information
eclipxe13 committed Jan 22, 2024
2 parents 59d523b + 7121ae1 commit 3ca86d3
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 46 deletions.
6 changes: 3 additions & 3 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
- name: Setup PHP
uses: shivammathur/setup-php@v2 # see https://github.com/marketplace/actions/setup-php-action
with:
php-version: '8.2'
php-version: '8.3'
coverage: none
tools: cs2pr, phpcs
env:
Expand All @@ -43,7 +43,7 @@ jobs:
- name: Setup PHP
uses: shivammathur/setup-php@v2 # see https://github.com/marketplace/actions/setup-php-action
with:
php-version: '8.2'
php-version: '8.3'
coverage: none
tools: cs2pr, php-cs-fixer
env:
Expand Down Expand Up @@ -84,7 +84,7 @@ jobs:
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.2'
php-version: '8.3'
extensions: soap, intl, xsl, fileinfo, bcmath
coverage: none
tools: composer:v2, phpstan
Expand Down
7 changes: 7 additions & 0 deletions docs/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,13 @@
- Remove classes `CfdiUtils\Elements\Cfdi33\Helpers\SumasConceptosWriter` and `CfdiUtils\Elements\Cfdi40\Helpers\SumasConceptosWriter`.
- Merge methods from `\CfdiUtils\Nodes\NodeHasValueInterface` into `\CfdiUtils\Nodes\NodeInterface`.
- Remove deprecated constant `CfdiUtils\Retenciones\Retenciones::RET_NAMESPACE`.
- Remove deprecated class `CfdiUtils\Utils\Crp20277Fixer`.

## Version 2.28.0 2024-01-22

- Deprecate `CfdiUtils\Utils\Crp20277Fixer` since SAT changed the rule `CRP20277`.
- Fix code style (use same case for `XsltProcessor`).
- Run GitHub jobs using PHP 8.3.

## Version 2.27.1 2024-01-12

Expand Down
67 changes: 25 additions & 42 deletions docs/utilerias/pagos20-crp20277.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# Regla CRP20277 del complemento de pagos 2.0

!!! note ""
Esta regla fue modificada el 2024-01-16 y no es necesario cambiar el valor de `EquivalenciaDR`.

El SAT creó la regla `CRP20277` en los Documentos técnicos del complemento de recepción de pagos 2.0, revisión B,
vigente a partir del 15 de enero de 2024, en la Matriz de errores. Donde dice:

Expand All @@ -8,68 +11,41 @@ vigente a partir del 15 de enero de 2024, en la Matriz de errores. Donde dice:
la misma moneda que la del Pago, para la fórmula en el cálculo del margen de variación se deben
considerar 10 decimales en la EquivalenciaDR cuando el valor sea 1.*
- Código de error:
*El campo EquivalenciaDR debe contener el valor "1.0000000000".*
~~*El campo EquivalenciaDR debe contener el valor "1.0000000000".*~~
*El valor de EquivalenciaDR para la fórmula del cálculo del margen de variación debe ser “1.0000000000”.*

Esta regla cambia lo especificado en la regla `CRP20238`. Que establece que si el atributo `Pago@MonedaP` es igual
Esta regla **no cambia** lo especificado en la regla `CRP20238`. Que establece que si el atributo `Pago@MonedaP` es igual
a `DoctoRelacionado@MonedaDR` entonces el valor de `DoctoRelacionado@EquivalenciaDR` debe ser `"1"`.

La regla `CRP20277` establece entonces que el valor debe ser `"1.0000000000"`, siempre que se cumplan las siguientes condiciones para el pago:
La regla `CRP20277` establece entonces que el valor debe **considerarse** como `"1.0000000000"`,
siempre que se cumplan las siguientes condiciones para el pago:

- *con más de un documento relacionado*:
Es decir, no aplica para cuando hay solo 1 `DoctoRelacionado`, debe haber al menos 2.
- *al menos uno de ellos contenga la misma moneda que la del Pago*:
Es decir, aplica con que exista 1 `DoctoRelacionado` donde el valor de `Pago@MonedaP` es el mismo que `DoctoRelacionado@MonedaDR`.
- *se deben considerar 10 decimales en la EquivalenciaDR cuando el valor sea 1*:
Es decir, `DoctoRelacionado@EquivalenciaDR` debe ser `"1"` (y va a cambiar a `"1.0000000000"`).
Es decir, `DoctoRelacionado@EquivalenciaDR` debe ser `"1"` (y se considerará para la validación como `"1.0000000000"`).

Y si las tres condiciones se cumplen:

- (a) *se deben considerar 10 decimales*, (b) *el campo EquivalenciaDR debe contener el valor "1.0000000000"*:
Es decir, el valor de `DoctoRelacionado@EquivalenciaDR` cambia de `"1"` a `"1.0000000000"`.
- (a) *se deben considerar 10 decimales*, ~~(b) *el campo EquivalenciaDR debe contener el valor "1.0000000000"*~~:
Es decir, el valor de `DoctoRelacionado@EquivalenciaDR` se considera como `"1.0000000000"` y no como `"1"`.

## Utilería `Crp20277Fixer`

Para facilitar la aplicación de la regla `CRP20277` y modificar `@EquivalenciaDR`, se ha creado
la clase `Crp20277Fixer`, que hace las revisiones necesarias para cuando es necesario cambiar
Para facilitar la aplicación de la regla `CRP20277` y modificar `@EquivalenciaDR` cuando era necesario,
se creó la clase `Crp20277Fixer`, que hace las revisiones necesarias para cuando era necesario cambiar
el valor de `DoctoRelacionado@EquivalenciaDR` de `"1"` a `"1.0000000000"`.

Recomendación de uso:

- Fabrica el *Pre-CFDI* considerando el valor `1` cuando `Pago@MonedaP` es igual a `DoctoRelacionado@MonedaDR`,
tal como do dice la regla `CRP20238`.
- Después de llenar el complemento y antes de firmar el *Pre-CFDI*, llama al método `Crp20277Fixer::staticFix()`.

Para el siguiente ejemplo se omite la lógica de cómo crear o llenar un CFDI 4.0 con Complemento de pagos 2.0,
la parte importante es ilustrar el llamado a `Crp20277Fixer::staticFix()`.

```php
<?php

use CfdiUtils\CfdiCreator40;
use CfdiUtils\Elements\Pagos20\Pagos;
use CfdiUtils\Utils\Crp20277Fixer;

// se fabrica el creador de CFDI 4.0
$creator = new CfdiCreator40(/* atributos del comprobante */);

// se crea el complemento de pagos
$complementoPagos = new Pagos();
// se agrega un pago
$pago = $complementoPagos->addPago([/* atributos del pago */]);
// se agrega uno o más documentos
$pago->addDoctoRelacionado([/* atributos del documento relacionado */]);


// se llama a la utilería para cambiar los valores DoctoRelacionado@MonedaDR de 1 a 1.0000000000 cuando sea necesario
Crp20277Fixer::staticFix($complementoPagos);


// se sigue con la lógica de firmado del Pre-CFDI, timbrado con el PAC, etc.
$creator->addSello($key, $password);
```
A partir de 2024-01-16, no es necesario hacer el cambio, dado que el valor `1` se debe mantener en el CFDI,
y solamente para hacer las validaciones, se debe considerar como `"1.0000000000"`. Luego entonces,
esta utilería ha sido deprecada desde la versión `2.28.0` y no se recomienda su uso.

## Reflexión de la regla

### En su implementación original

Creo que el SAT ha cometido un error grave en esta regla, dado que la necesidad de 10 decimales
solamente aplica para el cálculo del margen de variación, dentro de las validaciones de un PAC.

Expand All @@ -83,3 +59,10 @@ debería decir *El campo EquivalenciaDR se debe interpretar con el valor "1.0000

Pero, al no hacerlo, se tiene que implementar una doble lógica, la primera es para seguir la especificación de `CRP20238`
y la segunda para cumplir con el requisito de la regla `CRP20277`.

### En su implementación a partir de 2024-01-16

Afortunadamente, el SAT ha recapacitado y ha cambiado el mensaje de error, con este cambio, se elimina la doble lógica
y la contradicción entre `CRP20238` y `CRP20277` mencionada anteriormente.

Esta modificación del valor aplica únicamente para los PAC o aquellos que calculen el margen de variación por su propia cuenta.
2 changes: 1 addition & 1 deletion src/CfdiUtils/CadenaOrigen/GenkgoXslBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public function __construct()

protected function transform(DOMDocument $xml, DOMDocument $xsl): string
{
$xslt = new XSLTProcessor(new NullCache());
$xslt = new XsltProcessor(new NullCache());
$xslt->importStyleSheet($xsl);

try {
Expand Down
6 changes: 6 additions & 0 deletions src/CfdiUtils/Utils/Crp20277Fixer.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,13 @@
* El campo EquivalenciaDR debe contener el valor "1.0000000000".
* Esta regla cambia lo especificado en la regla CRP20238.
*
* Deprecación:
* El código de error cambió el 2024-01-16 a:
* El valor de EquivalenciaDR para la fórmula del cálculo del margen de variación debe ser “1.0000000000”.
* Por lo tanto, no es necesario hacer el cambio de valores en el CFDI.
*
* @see http://omawww.sat.gob.mx/tramitesyservicios/Paginas/recepcion_de_pagos.htm
* @deprecated 2.28.0 No es necesario mantener esta clase y será removida en una nueva versión mayor.
*/
final class Crp20277Fixer
{
Expand Down

0 comments on commit 3ca86d3

Please sign in to comment.