Commit d08ebf12 authored by Stephane Bouvry's avatar Stephane Bouvry
Browse files

- Ajout d'un événement signature:status déclenché quand le statut des signatures change

 - Command de mise à jour des signatures
parent fc3ed165
Loading
Loading
Loading
Loading
Loading
+28 −0
Changes for src/Command/SignatureUpdateAllCommand.php: 28 added lines, 0 removed lines.
Original line number Diff line number Diff line
<?php

namespace UnicaenSignature\Command;

use Laminas\ServiceManager\ServiceManager;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use UnicaenSignature\Entity\Db\Signature;

class SignatureUpdateAllCommand extends SignatureCommandAbstract
{
    protected static $defaultName = 'signature:update-all';

    protected function configure()
    {
        $this
            ->setDescription("Actualise l'état des signatures");
    }

    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $io = $this->getIO($input, $output);

        $this->getSignatureService()->updateAll();

        return self::SUCCESS;
    }
}
 No newline at end of file
+1 −1
Changes for src/Controller/SignatureController.php: 1 added line, 1 removed line.
Original line number Diff line number Diff line
@@ -113,7 +113,7 @@ class SignatureController extends AbstractActionController
            $form->setData($post);
            if ($form->isValid()) {
                try {
                    $this->getSignatureService()->saveNewSignature($form->getData());
                    $this->getSignatureService()->saveNewSignature($form->getData(), true);
                } catch (Exception $e) {
                    $this->flash()->addErrorMessage($e->getMessage());
                }
+16 −1
Changes for src/Entity/Repository/SignatureRepository.php: 16 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -3,8 +3,23 @@
namespace UnicaenSignature\Entity\Repository;

use Doctrine\ORM\EntityRepository;
use UnicaenSignature\Entity\Db\Signature;

class SignatureRepository extends EntityRepository
{

    /**
     * Retourne la liste des signatures pouvant être mises à jour.
     *
     * @return Signature[]
     */
    public function getSignaturesUpdatable() :array {
        $statusUpdatable = [
            Signature::STATUS_SIGNATURE_WAIT
        ];
        return $this->createQueryBuilder('s')
            ->where('s.status in(:statusUpdatable)')
            ->setParameter('statusUpdatable', $statusUpdatable)
            ->getQuery()
            ->getResult();
    }
}
 No newline at end of file
+28 −0
Changes for src/Service/SharedEventManagerAwareTrait.php: 28 added lines, 0 removed lines.
Original line number Diff line number Diff line
<?php

namespace UnicaenSignature\Service;

use Laminas\EventManager\SharedEventManager;

trait SharedEventManagerAwareTrait {

    private SharedEventManager $sharedEventManager;

    /**
     * @return SharedEventManager
     */
    public function getSharedEventManager(): SharedEventManager
    {
        return $this->sharedEventManager;
    }

    /**
     * @param SharedEventManager $sharedEventManager
     * @return void
     */
    public function setSharedEventManager(SharedEventManager $sharedEventManager): void
    {
        $this->sharedEventManager = $sharedEventManager;
    }

}
 No newline at end of file
+94 −7
Changes for src/Service/SignatureService.php: 94 added lines, 7 removed lines.
Original line number Diff line number Diff line
@@ -3,6 +3,9 @@
namespace UnicaenSignature\Service;

use DoctrineModule\Persistence\ProvidesObjectManager;
use Laminas\EventManager\Event;
use Laminas\EventManager\EventManager;
use Laminas\EventManager\SharedEventManager;
use UnicaenSignature\Entity\Data\LevelInfo;
use UnicaenSignature\Entity\Db\Signature;
use UnicaenSignature\Entity\Db\SignatureRecipient;
@@ -14,9 +17,11 @@ use UnicaenSignature\Utils\SignatureException;

class SignatureService
{
    use ProvidesObjectManager,
    use
        LetterfileServiceAwareTrait,
        LoggerServiceAwareTrait,
        ProvidesObjectManager,
        SharedEventManagerAwareTrait,
        SignatureConfigurationServiceAwareTrait;

    const ERR_SIGNATURETYPE_LIST = "Impossible de charger la liste des types de signature";
@@ -30,16 +35,31 @@ class SignatureService
        return $this->getObjectManager()->getRepository(Signature::class);
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ///// LISTES

    /**
     * @return array
     * @return Signature[]
     * @throws \Exception
     */
    public function getSignatures(): array
    {
        try {
            return $this->getSignatureRepository()->findAll();
        } catch (\Exception $e) {
            $this->getLoggerService()->critical("Get signature ERROR : " . $e->getMessage());
            throw new SignatureException("Impossible de charger les signatures");
        }
    }

    /**
     * @return Signature[]
     * @throws \Exception
     */
    public function getSignaturesUpdatable() :array
    {
        try {
            return $this->getSignatureRepository()->getSignaturesUpdatable();
        } catch (\Exception $e) {
            $this->getLoggerService()->throwLoggedException($e);
        }
@@ -102,12 +122,16 @@ class SignatureService

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ///

    public function saveNewSignature(Signature $signature, bool $pushToLetterFile = false): void
    {
        $this->getLoggerService()->info("Enregistrement de la demande de signature");
        try {
            $this->getObjectManager()->persist($signature);
            $this->getObjectManager()->flush($signature);
            if( $pushToLetterFile ){
                $this->sendSignature($signature);
            }
        } catch (\Exception $e) {
            $msg = "Impossible d'enregistrer la demande de signature";
            $this->getLoggerService()->critical("$msg : " . $e->getMessage());
@@ -115,6 +139,24 @@ class SignatureService
        }
    }

    /**
     * Mise à jour des signatures.
     *
     * @return void
     */
    public function updateAll() :void
    {
        $signatures = $this->getSignatureRepository()->getSignaturesUpdatable();
        foreach ($signatures as $signature) {
            $this->updateStatusSignature($signature);
        }
    }

    /**
     * @param int $id
     * @return void
     * @throws SignatureException
     */
    public function updateStatusSignatureById(int $id): void
    {
        $this->updateStatusSignature($this->getSignature($id));
@@ -127,41 +169,82 @@ class SignatureService
     */
    public function updateStatusSignature(Signature $signature): void
    {
        try {
            $letterFileStrategy = $this->getLetterfileService()->getLetterFileStrategy($signature->getLetterfileKey());
            $status = $letterFileStrategy->getSignatureStatus($signature);
            if( $status != $signature->getStatus() ){
                $signature->setStatus($status);
                $this->getObjectManager()->flush();
                $this->triggerEventStatusUpdate($signature);
            }
        } catch (\Exception $e) {
            $this->getLoggerService()->error("Update signature error : " . $e->getMessage());
            throw new SignatureException("Impossible de mettre à jour le statut de la signature");
        }
    }

    /**
     * @param Signature $signature
     * @return void
     */
    protected function triggerEventStatusUpdate(Signature $signature) :void
    {
        $em = new EventManager($this->getSharedEventManager());
        $em->trigger('signature:status', null, ['id' => $signature->getId()]);
    }

    /**
     * @param int $id
     * @return void
     * @throws SignatureException
     */
    public function deleteSignatureById(int $id): void
    {
        $this->deleteSignature($this->getSignature($id));
    }

    /**
     * Suppression d'une demande signature.
     *
     * @param Signature $signature
     * @return void
     * @throws SignatureException
     */
    public function deleteSignature(Signature $signature): void
    {
        if ($signature->getStatus() == Signature::STATUS_SIGNATURE_DRAFT) {
            try {
                $this->getObjectManager()->remove($signature);
                $this->getObjectManager()->flush();
            } catch (\Exception $exception) {
                $this->getLoggerService()->error("Error DB : " . $exception->getMessage());
                throw new SignatureException("Impossible de supprimer la demande de la base de donnée");
            }
        } else {
            try {
                $letterFile = $this->getLetterfileService()->getLetterFileStrategy($signature->getLetterfileKey());
                $letterFile->deleteSignature($signature);
            } catch (\Exception $e) {
                $this->updateStatusSignature($signature);
            } catch (\Exception $exception) {
                $this->getLoggerService()->error("Error PARAFEUR : " . $exception->getMessage());
                throw new SignatureException("Impossible de supprimer la demande du parafeur");
                return;
            }
            $this->updateStatusSignature($signature);
        }
    }

    /**
     * @param int $id
     * @return string
     * @throws SignatureException
     */
    public function getDocumentSignedSignatureById(int $id): string
    {
        return $this->getDocumentSignedSignature($this->getSignature($id));
    }

    /**
     * Retourne le document.
     * Retourne le document (Flux de données).
     *
     * @param Signature $signature
     * @return string
@@ -205,11 +288,16 @@ class SignatureService
                    $signature->getLetterfileKey()
                )->addSignRequestFromSignature($signature);
            } catch (\Exception $e) {
                throw $e;
                throw new SignatureException("Un problème est survenu lors de l'envoi au parafeur");
            }
            try {
                $signature->setDateSend(new \DateTime())
                    ->setStatus(Signature::STATUS_SIGNATURE_WAIT);
                $this->getObjectManager()->flush();
            } catch (\Exception $exception) {
                $this->getLoggerService()->critical("Can't save Signature, DB error : " . $exception->getMessage());
                throw new SignatureException("La demande a été envoyé mais un problème est survenu lors de l'enregistrement du statut");
            }
        } else {
            throw new SignatureException("La demande '" . $signature->getId() . "' ne peut pas être envoyée");
        }
@@ -236,5 +324,4 @@ class SignatureService
            $signatureRecipient->setPhone($recipientData['phone']);
        }
    }

}
 No newline at end of file
Loading