diff --git a/README.md b/README.md index 81c1950..bdb6f93 100644 --- a/README.md +++ b/README.md @@ -24,8 +24,8 @@ La documentación del proyecto está en español porque ese es el lenguaje de lo **Cambios recientes en el servicio**: -- Por motivo del cambio en el proceso de facturación en 2018 agregaron nuevos estados. -- Por una razón desconocida y hasta cierto punto inexplicable, el WSDL ya no se encuentra disponible desde 2018. +- Por motivo del cambio en el proceso de cancelación, en 2018 agregaron nuevos estados. +- Por una razón desconocida -e inexplicable-, el WSDL ya no se encuentra disponible desde 2018. Aunque sí se puede consumir el servicio. Esta librería **no utiliza SOAP** para hacer la llamada, hace una llamada HTTP que construye e interpreta. @@ -43,18 +43,24 @@ Usa [composer](https://getcomposer.org/) composer require phpcfdi/sat-estado-cfdi ``` +Si tienes problemas para instalar es probable que no cuentes con paques que satisfagan las dependencias de +[`psr/http-client-implementation`](https://packagist.org/providers/psr/http-client-implementation), +[`psr/http-message-implementation`](https://packagist.org/providers/psr/http-message-implementation) y +[`psr/http-factory-implementation`](https://packagist.org/providers/psr/http-factory-implementation). +Instala alguno de esos paquetes también. [Ver ejemplo](#compatibilidad-con-psr-7-psr-17-y-psr-18) ## Ejemplo básico de uso Los pasos básicos son: -- Crear la fábrica de objetos `WebServiceFactory`. +- Crear la fábrica de objetos `WebServiceFactory` [Ver ejemplo](#compatibilidad-con-psr-7-psr-17-y-psr-18). - Pedirle a la fábrica de objetos que nos entregue un consumidor `Consumer`. - Solicitarle al consumidor que ejecute la petición sobre una expresión. ```php createFactory()->getConsumer(); +/** @var \PhpCfdi\SatEstadoCfdi\WebServiceFactory $factory */ +$consumer = $factory->getConsumer(); $response = $consumer->execute('...expression'); @@ -107,7 +113,7 @@ Posibles estados: - `requestMethod`: Si el estado reportó `Cancelable con aceptación`. - `notCancellable`: en cualquier otro caso. -- `CfdiCancellationStatus cancelation`: `EstatusCancelacion`. +- `CfdiCancellationStatus cancellation`: `EstatusCancelacion`. - `cancelDirect`: Si el estado reportó `Cancelado sin aceptación`. - `pending`: Si el estado reportó `En proceso`. - `cancelByTimeout`: Si el estado reportó `Plazo vencido`. @@ -125,10 +131,20 @@ S - ... | Cancelado | * | 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ó S - ... | Vigente | No cancelable | * | No se puede cancelar -S - ... | Vigente | Cancelable sin aceptación | * | Se puede cancelar pero no se ha realizado solicitud, termina en SuccessStatus -S - ... | Vigente | Cancelable con aceptación | (ninguno) | Se puede cancelar pero no se ha realizado solicitud, Termina en Pending -S - ... | Vigente | Cancelable con aceptación | En proceso | Se hizo la solicitud y se está en espera -S - ... | Vigente | Cancelable con aceptación | Solicitud rechazada | Se hizo la solicitud y se está en espera +S - ... | Vigente | Cancelable sin aceptación | * | Se puede cancelar, pero no se ha realizado la cancelación +S - ... | Vigente | Cancelable con aceptación | (ninguno) | Se puede cancelar, pero no se ha realizado la solicitud +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, +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. +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. ### Compatibilidad con PSR-7 PSR-17 y PSR-18 @@ -137,8 +153,11 @@ Esta librería busca alta compatibilidad con los estándares propuestos por el [ Por lo que utiliza los siguientes estándares. - PSR-7: HTTP message interfaces: Interfaces de HTTP Request y Response. + - PSR-17: HTTP Factories: Interfaces de fábricas de HTTP Request y Response (para PSR-7). + - PSR-18: HTTP Client: Interfaces para clientes HTTP (el que hace la llamada POST). + Esta librería no contiene las implementaciones de los estándares, las librerías que implementan las interfaces ya existen fuera del ámbito de la aplicación. @@ -150,7 +169,7 @@ Te recomiendo usar las librerías de Sunrise ```shell # librerías para implementar PSR-18, PSR-17 y PSR-7 -composer require sunrise/http-client-curl, sunrise/http-factory y sunrise/http-message +composer require sunrise/http-client-curl sunrise/http-factory sunrise/http-message ``` Y puedes crear tu cliente de esta forma: @@ -173,8 +192,9 @@ $consumer = createSunriseSatEstadoCfdiFactory()->getConsumer(); ### Compatibilidad con HTTP Plug -Si tu aplicación usa HTTP Plug o es compatible con `php-http/discovery` entonces podrías usar -la clase `WebServiceDiscover`. +Si tu aplicación usa HTTP Plug o es compatible con +[`php-http/discovery`](http://docs.php-http.org/en/latest/discovery.html) +entonces podrías usar la clase `WebServiceDiscover`. ```php createFactory(); $consumer = $factory->getConsumer(); ``` -En el archivo [`tests/Discoverables/Sunrise.php`](blob/master/tests/Discoverables/Sunrise.php) -puedes ver una librería para que las implementaciones de Sunrise sean automáticamente descubiertas. +En el archivo [`tests/Discoverables/Sunrise.php`](tests/Discoverables/Sunrise.php) +puedes ver una clase para que las implementaciones de Sunrise sean automáticamente descubiertas. Para decirle al descubridor de componentes de HTTP Plug que las reconozca incluye las siguientes líneas: