Skip to content

Commit

Permalink
Merge pull request #6 from eclipxe13/master
Browse files Browse the repository at this point in the history
Target 0.6.0
  • Loading branch information
eclipxe13 authored Mar 29, 2019
2 parents bf7d459 + d7b3148 commit d4e1b20
Show file tree
Hide file tree
Showing 15 changed files with 139 additions and 163 deletions.
49 changes: 26 additions & 23 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,38 +85,38 @@ $expression = $expressionExtractor->extract($document);
Después de consumir el servicio, se responderá con un objeto `CfdiStatus` que agrupa de los cuatro estados.

No compares directamente los valores de los estados, en su lugar utiliza los métodos `is*`,
por ejemplo `$response->active()->isCancelled()`.
por ejemplo `$response->document()->isCancelled()`.

Posibles estados:

- `CfdiRequestStatus request`: `CodigoEstatus`.
- `CodigoEstatus`: `query(): QueryStatus`.
- `found`: Si el estado inicia con `S - `.
- `notFound`: en cualquier otro caso.

- `CfdiActiveStatus active`: `Estado`.
- `Estado`: `document(): DocumentStatus`.
- `active`: Si el estado reportó `Vigente`.
- `cancelled`: Si el estado reportó `Cancelado`.
- `notFound`: en cualquier otro caso.

- `CfdiCancellableStatus cancellable`: `EsCancelable`.
- `directMethod`: Si el estado reportó `Cancelable sin aceptación`.
- `requestMethod`: Si el estado reportó `Cancelable con aceptación`.
- `EsCancelable`: `cancellable(): CancellableStatus`.
- `cancellableByDirectCall`: Si el estado reportó `Cancelable sin aceptación`.
- `cancellableByApproval`: Si el estado reportó `Cancelable con aceptación`.
- `notCancellable`: en cualquier otro caso.

- `CfdiCancellationStatus cancellation`: `EstatusCancelacion`.
- `cancelDirect`: Si el estado reportó `Cancelado sin aceptación`.
- `EstatusCancelacion`: `cancellation(): CancellationStatus`.
- `cancelledByDirectCall`: Si el estado reportó `Cancelado sin aceptación`.
- `cancelledByApproval`: Si el estado reportó `Cancelado con aceptación`.
- `cancelledByExpiration`: Si el estado reportó `Plazo vencido`.
- `pending`: Si el estado reportó `En proceso`.
- `cancelByTimeout`: Si el estado reportó `Plazo vencido`.
- `cancelByRequest`: Si el estado reportó `Cancelado con aceptación`.
- `rejected`: Si el estado reportó `Solicitud rechazada`.
- `disapproved`: Si el estado reportó `Solicitud rechazada`.
- `undefined`: en cualquier otro caso.


#### Estados mutuamente excluyentes:

CodigoEstatus | Estado | EsCancelable | EstatusCancelacion | Explicación
------------- | ------------- | ------------------------- | ------------------------ | -----------------------------------------------------
N - ... | * | * | * | El SAT no sabe del CFDI con los datos ofrecidos
N - ... | * | * | * | El SAT no sabe del CFDI con la expresión dada
S - ... | Cancelado | * | Plazo vencido | Cancelado por plazo vencido
S - ... | Cancelado | * | Cancelado con aceptación | Cancelado con aceptación del receptor
S - ... | Cancelado | * | Cancelado sin aceptación | No fue requerido preguntarle al receptor y se canceló
Expand All @@ -126,15 +126,19 @@ S - ... | Vigente | Cancelable con aceptación | (ninguno)
S - ... | Vigente | Cancelable con aceptación | En proceso | Se hizo la solicitud y está en espera de respuesta
S - ... | Vigente | Cancelable con aceptación | Solicitud rechazada | Se hizo la solicitud y fue rechazada

Cuando tienes un CFDI *Cancelable con aceptación* y mandas a hacer la cancelación (*En proceso*),
el receptor puede aceptar la cancelación (*Cancelado con aceptación*) o rechazarla (*Solicitud rechazada*).
Si es la primera vez que se hace la solicitud el receptor tiene 72 horas para aceptarla o rechazarla,
Cuando tienes un CFDI en estato *Cancelable con aceptación*
y mandas a hacer la cancelación entonces su estado de cancelación cambiaría a *En proceso*.

El receptor puede aceptar la cancelación (*Cancelado con aceptación*) o rechazarla (*Solicitud rechazada*).

Si es la *primera vez* que se hace la solicitud, el receptor tiene 72 horas para aceptarla o rechazarla,
si no lo hace entonces automáticamente será cancelada (*Plazo vencido*).

Podrías volver a enviar la solicitud de cancelación *por segunda vez* aún cuando la solicitud fue rechazada.
Podrías volver a enviar la solicitud de cancelación *por segunda vez* aún cuando la solicitud fue previamente rechazada.

En ese caso, el receptor puede aceptar o rechazar la cancelación, pero ya no aplicará un lapzo de 72 horas.
Eso significa que podrías tener el CFDI en estado de cancelación *en proceso* indefinidamente.
O, incluso, que la cancelación suceda meses después de lo esperado.
Por lo anterior entonces podrías tener el CFDI en estado de cancelación *en proceso* indefinidamente.
Incluso, que la cancelación suceda meses después de lo esperado.


## Clientes de conexión
Expand All @@ -152,19 +156,18 @@ O si lo prefieres, existen los siguientes consumidores oficiales:
Consume el webservice haciendo una llamada SOAP (sin WSDL) para obtener el resultado.
- [phpcfdi/sat-estado-cfdi-http-psr](https://github.com/phpcfdi/sat-estado-cfdi-http-psr)
Consume el webservice haciendo una HTTP utilizando objetos de PSR-7, PSR17 y PSR18 *que tu provees*.
- [phpcfdi/sat-estado-cfdi-http-sunrise](https://github.com/phpcfdi/sat-estado-cfdi-http-sunrise)
Consume el webservice haciendo una HTTP utilizando objetos de PSR-7, PSR17 y PSR18 con los paquetes de *sunrise*.

### Prueba de cumplimiento de implementación

Se incluye la clase `PhpCfdi\SatEstadoCfdi\ComplianceTester\ComplianceTester` que contacta al
webservice del SAT con datos conocidos y evalua la respuesta.

Los paquetes `phpcfdi/sat-estado-cfdi-soap` y `phpcfdi/sat-estado-cfdi-http-sunrise` implementan
Los paquetes `phpcfdi/sat-estado-cfdi-soap` y `phpcfdi/sat-estado-cfdi-http-psr` implementan
un test para asegurarse que cumplen correctamente.

Si haces tu propia implementación, asegúrate de crear un test que lo cubra, puedes ver como ejemplo
<https://github.com/phpcfdi/sat-estado-cfdi-soap/blob/master/tests/Compliance/ComplianceTest.php>
Si haces tu propia implementación, asegúrate de crear un test que lo cubra, puedes ver como ejemplos
<https://github.com/phpcfdi/sat-estado-cfdi-soap/blob/master/tests/Compliance/ComplianceTest.php> o
<https://github.com/phpcfdi/sat-estado-cfdi-http-psr/blob/master/tests/Compliance/ComplianceTest.php>


## Compatilibilidad
Expand Down
7 changes: 2 additions & 5 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,7 @@
"phpstan/phpstan-shim": "^0.11"
},
"suggest": {
"phpcfdi/cfdi-expresiones": "Utilería para crear expresiones de CFD 3.2, CFDI 3.3 y RET 1.0",
"phpcfdi/sat-estado-cfdi-soap": "Consume webservice using SOAP (ext-soap) without WSDL",
"phpcfdi/sat-estado-cfdi-http-psr": "Consume webservice using PSR-7, PSR17 y PSR18 (provided by you)",
"phpcfdi/sat-estado-cfdi-http-sunrise": "Consume webservice using PSR-7, PSR17 y PSR18 (sunrise based)"
"phpcfdi/cfdi-expresiones": "Genera expresiones de CFDI 3.3, CFDI 3.2 y RET 1.0"
},
"autoload": {
"psr-4": {
Expand All @@ -61,7 +58,7 @@
"vendor/bin/phplint",
"vendor/bin/phpunit --testdox --verbose --stop-on-failure",
"find . -type f -name .phpunit.result.cache -delete",
"vendor/bin/phpstan analyse --verbose --level max src/ tests/"
"vendor/bin/phpstan analyse --no-progress --verbose --level max src/ tests/"
],
"dev:coverage": [
"@php -dzend_extension=xdebug.so vendor/bin/phpunit --coverage-text --coverage-html build/coverage/html/"
Expand Down
7 changes: 7 additions & 0 deletions docs/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
# CHANGELOG

## Version 0.6.0 2019-03-25

- Rename CfdiStatus properties, status classes and status enums using descriptions.
- Remove references to sunrise package that is not going to exists on phpcfdi umbrella.
- Update `README.md` according to last changes.


## Version 0.5.0 2019-03-28

- Remove `CfdiExpression` and `CfdiExpressionBuilder` (now on its own project `phpcfdi/cfdi-expresiones`)
Expand Down
31 changes: 0 additions & 31 deletions docs/DEVNOTES.md

This file was deleted.

24 changes: 12 additions & 12 deletions src/CfdiStatus.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,46 +6,46 @@

class CfdiStatus
{
/** @var Status\CfdiRequestStatus */
/** @var Status\QueryStatus */
private $request;

/** @var Status\CfdiActiveStatus */
/** @var Status\DocumentStatus */
private $active;

/** @var Status\CfdiCancellableStatus */
/** @var Status\CancellableStatus */
private $cancellable;

/** @var Status\CfdiCancellationStatus */
/** @var Status\CancellationStatus */
private $cancellation;

public function __construct(
Status\CfdiRequestStatus $request,
Status\CfdiActiveStatus $active,
Status\CfdiCancellableStatus $cancellable,
Status\CfdiCancellationStatus $cancellation
Status\QueryStatus $request,
Status\DocumentStatus $active,
Status\CancellableStatus $cancellable,
Status\CancellationStatus $cancellation
) {
$this->request = $request;
$this->active = $active;
$this->cancellable = $cancellable;
$this->cancellation = $cancellation;
}

public function request(): Status\CfdiRequestStatus
public function request(): Status\QueryStatus
{
return $this->request;
}

public function active(): Status\CfdiActiveStatus
public function active(): Status\DocumentStatus
{
return $this->active;
}

public function cancellable(): Status\CfdiCancellableStatus
public function cancellable(): Status\CancellableStatus
{
return $this->cancellable;
}

public function cancellation(): Status\CfdiCancellationStatus
public function cancellation(): Status\CancellationStatus
{
return $this->cancellation;
}
Expand Down
2 changes: 1 addition & 1 deletion src/ComplianceTester/ComplianceTester.php
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ protected function contactWebServiceWithActiveCfdi(): void
if (! $response->active()->isActive()) {
throw new \RuntimeException('It was expected CFDI status active: active');
}
if (! $response->cancellable()->isDirectMethod()) {
if (! $response->cancellable()->isCancellableByDirectCall()) {
throw new \RuntimeException('It was expected CFDI status cancellable: directMethod');
}
if (! $response->cancellation()->isUndefined()) {
Expand Down
20 changes: 20 additions & 0 deletions src/Status/CancellableStatus.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php

declare(strict_types=1);

namespace PhpCfdi\SatEstadoCfdi\Status;

use Eclipxe\Enum\Enum;

/**
* @method static self cancellableByDirectCall()
* @method static self cancellableByApproval()
* @method static self notCancellable()
*
* @method bool isCancellableByDirectCall()
* @method bool isCancellableByApproval()
* @method bool isNotCancellable()
*/
class CancellableStatus extends Enum
{
}
26 changes: 26 additions & 0 deletions src/Status/CancellationStatus.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php

declare(strict_types=1);

namespace PhpCfdi\SatEstadoCfdi\Status;

use Eclipxe\Enum\Enum;

/**
* @method static self undefined()
* @method static self pending()
* @method static self disapproved()
* @method static self cancelledByApproval()
* @method static self cancelledByExpiration()
* @method static self cancelledByDirectCall()
*
* @method bool isUndefined()
* @method bool isPending()
* @method bool isDisapproved()
* @method bool isCancelledByApproval()
* @method bool isCancelledByExpiration()
* @method bool isCancelledByDirectCall()
*/
class CancellationStatus extends Enum
{
}
20 changes: 0 additions & 20 deletions src/Status/CfdiCancellableStatus.php

This file was deleted.

26 changes: 0 additions & 26 deletions src/Status/CfdiCancellationStatus.php

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,6 @@
* @method bool isCancelled()
* @method bool isNotFound()
*/
class CfdiActiveStatus extends Enum
class DocumentStatus extends Enum
{
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,6 @@
* @method bool isFound()
* @method bool isNotFound()
*/
class CfdiRequestStatus extends Enum
class QueryStatus extends Enum
{
}
Loading

0 comments on commit d4e1b20

Please sign in to comment.