Commit fd0f7e67 authored by Jean-Philippe Metivier's avatar Jean-Philippe Metivier
Browse files

Merge branch 'soutenance_adresse' into release_6.0.9

parents d0c762e2 5703cd6f
Loading
Loading
Loading
Loading
+3 −0
Changes for module/Soutenance/config/others/presoutenance.config.php: 3 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@ use Soutenance\Form\DateRenduRapport\DateRenduRapportHydrator;
use Soutenance\Provider\Privilege\AvisSoutenancePrivileges;
use Soutenance\Provider\Privilege\EngagementImpartialitePrivileges;
use Soutenance\Provider\Privilege\PresoutenancePrivileges;
use Soutenance\Service\Adresse\AdresseService;
use Soutenance\Service\Adresse\AdresseServiceFactory;
use UnicaenAuth\Guard\PrivilegeController;
use UnicaenAuth\Provider\Rule\PrivilegeRuleProvider;
use Laminas\Router\Http\Literal;
@@ -388,6 +390,7 @@ return [
    'service_manager' => [
        'factories' => [
            PresoutenanceAssertion::class => PresoutenanceAssertionFactory::class,
            AdresseService::class => AdresseServiceFactory::class,
        ],
    ],
    'controllers' => [
+86 −0
Changes for module/Soutenance/config/others/proposition.config.php: 86 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -113,12 +113,26 @@ return [
                        'anglais',
                        'confidentialite',
                        'changement-titre',
                        'ajouter-adresse',
                        'modifier-adresse',
                        'historiser-adresse',
                        'restaurer-adresse',
                    ],
                    'privileges' => [
                        PropositionPrivileges::PROPOSITION_MODIFIER,
                        PropositionPrivileges::PROPOSITION_MODIFIER_GESTION,
                    ],
                ],
                [
                    'controller' => PropositionController::class,
                    'action' => [
                        'supprimer-adresse',
                        'demander-adresse',
                    ],
                    'privileges' => [
                        PropositionPrivileges::PROPOSITION_MODIFIER_GESTION,
                    ],
                ],
                [
                    'controller' => PropositionController::class,
                    'action' => [
@@ -216,6 +230,78 @@ return [
                            ],
                        ],
                        'child_routes' => [
                            'ajouter-adresse' => [
                                'type' => Segment::class,
                                'may_terminate' => true,
                                'options' => [
                                    'route' => '/ajouter-adresse/:proposition',
                                    'defaults' => [
                                        /** @see PropositionController::ajouterAdresseAction() */
                                        'controller' => PropositionController::class,
                                        'action' => 'ajouter-adresse',
                                    ],
                                ],
                            ],
                            'modifier-adresse' => [
                                'type' => Segment::class,
                                'may_terminate' => true,
                                'options' => [
                                    'route' => '/modifier-adresse/:adresse',
                                    'defaults' => [
                                        /** @see PropositionController::modifierAdresseAction() */
                                        'controller' => PropositionController::class,
                                        'action' => 'modifier-adresse',
                                    ],
                                ],
                            ],
                            'historiser-adresse' => [
                                'type' => Segment::class,
                                'may_terminate' => true,
                                'options' => [
                                    'route' => '/historiser-adresse/:adresse',
                                    'defaults' => [
                                        /** @see PropositionController::historiserAdresseAction() */
                                        'controller' => PropositionController::class,
                                        'action' => 'historiser-adresse',
                                    ],
                                ],
                            ],
                            'restaurer-adresse' => [
                                'type' => Segment::class,
                                'may_terminate' => true,
                                'options' => [
                                    'route' => '/restaurer-adresse/:adresse',
                                    'defaults' => [
                                        /** @see PropositionController::restaurerAdresseAction() */
                                        'controller' => PropositionController::class,
                                        'action' => 'restaurer-adresse',
                                    ],
                                ],
                            ],
                            'supprimer-adresse' => [
                                'type' => Segment::class,
                                'may_terminate' => true,
                                'options' => [
                                    'route' => '/supprimer-adresse/:adresse',
                                    'defaults' => [
                                        /** @see PropositionController::supprimerAdresseAction() */
                                        'controller' => PropositionController::class,
                                        'action' => 'supprimer-adresse',
                                    ],
                                ],
                            ],
                            'demander-adresse' => [
                                'type' => Segment::class,
                                'may_terminate' => true,
                                'options' => [
                                    'route' => '/demander-adresse/:proposition',
                                    'defaults' => [
                                        /** @see PropositionController::demanderAdresseAction() */
                                        'controller' => PropositionController::class,
                                        'action' => 'demander-adresse',
                                    ],
                                ],
                            ],
                            'horodatages' => [
                                'type' => Segment::class,
                                'may_terminate' => true,
+123 −1
Changes for module/Soutenance/src/Soutenance/Controller/PropositionController.php: 123 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -21,9 +21,11 @@ use Laminas\View\Model\ViewModel;
use Laminas\View\Renderer\PhpRenderer;
use Notification\Service\NotifierServiceAwareTrait;
use Soutenance\Assertion\PropositionAssertionAwareTrait;
use Soutenance\Entity\Adresse;
use Soutenance\Entity\Etat;
use Soutenance\Entity\Membre;
use Soutenance\Entity\Proposition;
use Soutenance\Form\AdresseSoutenance\AdresseSoutenanceFormAwareTrait;
use Soutenance\Form\Anglais\AnglaisFormAwareTrait;
use Soutenance\Form\ChangementTitre\ChangementTitreFormAwareTrait;
use Soutenance\Form\Confidentialite\ConfidentialiteFormAwareTrait;
@@ -35,6 +37,7 @@ use Soutenance\Provider\Parametre\SoutenanceParametres;
use Soutenance\Provider\Privilege\PropositionPrivileges;
use Soutenance\Provider\Template\PdfTemplates;
use Soutenance\Provider\Validation\TypeValidation;
use Soutenance\Service\Adresse\AdresseServiceAwareTrait;
use Soutenance\Service\Avis\AvisServiceAwareTrait;
use Soutenance\Service\Exporter\SermentExporter\SermentPdfExporter;
use Soutenance\Service\Horodatage\HorodatageService;
@@ -50,7 +53,6 @@ use Structure\Service\Etablissement\EtablissementServiceAwareTrait;
use These\Entity\Db\Acteur;
use These\Service\Acteur\ActeurServiceAwareTrait;
use UnicaenApp\Exception\RuntimeException;
use UnicaenAuth\Entity\Db\RoleInterface;
use UnicaenParametre\Service\Parametre\ParametreServiceAwareTrait;
use UnicaenRenderer\Service\Rendu\RenduServiceAwareTrait;

@@ -58,6 +60,7 @@ use UnicaenRenderer\Service\Rendu\RenduServiceAwareTrait;
class PropositionController extends AbstractController
{
    use ActeurServiceAwareTrait;
    use AdresseServiceAwareTrait;
    use AvisServiceAwareTrait;
    use EcoleDoctoraleServiceAwareTrait;
    use EtablissementServiceAwareTrait;
@@ -75,6 +78,7 @@ class PropositionController extends AbstractController
    use RenduServiceAwareTrait;
    use ValidatationServiceAwareTrait;

    use AdresseSoutenanceFormAwareTrait;
    use DateLieuFormAwareTrait;
    use MembreFromAwareTrait;
    use LabelEuropeenFormAwareTrait;
@@ -853,6 +857,124 @@ class PropositionController extends AbstractController
        return $vm;
    }

    /** Adresse de la soutenance **************************************************************************************/

    public function ajouterAdresseAction(): ViewModel
    {
        $proposition = $this->getPropositionService()->getRequestedProposition($this);
        $these = $proposition->getThese();

        $adresse = new Adresse();
        $adresse->setProposition($proposition);
        $form = $this->getAdresseSoutenanceForm();
        $form->setAttribute('action', $this->url()->fromRoute('soutenance/proposition/ajouter-adresse', ['these' => $these->getId(), 'proposition' => $proposition->getId()], [], true));
        $form->bind($adresse);

        $request = $this->getRequest();
        if ($request->isPost()) {
            $data = $request->getPost();
            $form->setData($data);
            if ($form->isValid()) {
                $this->getAdresseService()->create($adresse);
                exit();
            }
        }

        $vm = new ViewModel([
            'title' => "Ajout de l'adresse exacte de soutenance",
            'form' => $form,
        ]);
        $vm->setTemplate('soutenance/default/default-form');
        return $vm;
    }

    public function modifierAdresseAction(): ViewModel
    {
        $adresse = $this->getAdresseService()->getRequestedAdresse($this);
        $form = $this->getAdresseSoutenanceForm();
        $form->setAttribute('action', $this->url()->fromRoute('soutenance/proposition/modifier-adresse', ['these' => $adresse->getAssociatedThese()->getId(), 'adresse' => $adresse->getId()], [], true));
        $form->bind($adresse);

        $request = $this->getRequest();
        if ($request->isPost()) {
            $data = $request->getPost();
            $form->setData($data);
            if ($form->isValid()) {
                $this->getAdresseService()->update($adresse);
                exit();
            }
        }

        $vm = new ViewModel([
            'title' => "Modification de l'adresse exacte de soutenance",
            'form' => $form,
        ]);
        $vm->setTemplate('soutenance/default/default-form');
        return $vm;
    }

    public function historiserAdresseAction(): Response
    {
        $adresse = $this->getAdresseService()->getRequestedAdresse($this);
        $this->getAdresseService()->historise($adresse);

        $retour = $this->params()->fromQuery('retour');
        if ($retour) return $this->redirect()->toUrl($retour);
        return $this->redirect()->toRoute('soutenance/proposition', ['these' => $adresse->getAssociatedThese()->getId()], [], true);
    }

    public function restaurerAdresseAction(): Response
    {
        $adresse = $this->getAdresseService()->getRequestedAdresse($this);
        $this->getAdresseService()->restore($adresse);

        $retour = $this->params()->fromQuery('retour');
        if ($retour) return $this->redirect()->toUrl($retour);
        return $this->redirect()->toRoute('soutenance/proposition', ['these' => $adresse->getAssociatedThese()->getId()], [], true);
    }

    public function supprimerAdresseAction(): ViewModel
    {
        $adresse = $this->getAdresseService()->getRequestedAdresse($this);

        $request = $this->getRequest();
        if ($request->isPost()) {
            $data = $request->getPost();
            if ($data["reponse"] === "oui") $this->getAdresseService()->delete($adresse);
            exit();
        }

        $vm = new ViewModel();
        if ($adresse !== null) {
            $vm->setTemplate('soutenance/default/confirmation');
            $vm->setVariables([
                'title' => "Suppression de l'adresse exacte",
                'text' => "La suppression est définitive êtes-vous sûr·e de vouloir continuer ?",
                'action' => $this->url()->fromRoute('soutenance/proposition/supprimer-adresse', ['these' => $adresse->getAssociatedThese()->getId(), "adresse" => $adresse->getId()], [], true),
            ]);
        }
        return $vm;
    }

    public function demanderAdresseAction(): Response
    {
        $proposition = $this->getPropositionService()->getRequestedProposition($this);
        $these = $proposition->getThese();

        try {
            $notif = $this->soutenanceNotificationFactory->createNotificationDemandeAdresse($proposition);
            if (empty($notif->getTo())) {
                throw new RuntimeException(
                    "Aucune adresse mail trouvée pour les aspects Doctorat de l'établissement d'inscription '{$these->getEtablissement()}'");
            }
            $this->notifierService->trigger($notif);
        } catch (\Notification\Exception\RuntimeException $e) {
            // aucun destinataire , todo : cas à gérer !
        }

        return $this->redirect()->toRoute('soutenance/proposition', ['these' => $these->getId()], [], true);
    }

    /** Error *********************************************************************************************************/

    /**
+9 −1
Changes for module/Soutenance/src/Soutenance/Controller/PropositionControllerFactory.php: 9 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -12,6 +12,7 @@ use Notification\Service\NotifierService;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
use Soutenance\Assertion\PropositionAssertion;
use Soutenance\Form\AdresseSoutenance\AdresseSoutenanceForm;
use Soutenance\Form\Anglais\AnglaisForm;
use Soutenance\Form\ChangementTitre\ChangementTitreForm;
use Soutenance\Form\Confidentialite\ConfidentialiteForm;
@@ -19,6 +20,7 @@ use Soutenance\Form\DateLieu\DateLieuForm;
use Soutenance\Form\LabelEuropeen\LabelEuropeenForm;
use Soutenance\Form\Membre\MembreForm;
use Soutenance\Form\Refus\RefusForm;
use Soutenance\Service\Adresse\AdresseService;
use Soutenance\Service\Avis\AvisService;
use Soutenance\Service\Horodatage\HorodatageService;
use Soutenance\Service\Justificatif\JustificatifService;
@@ -45,6 +47,7 @@ class PropositionControllerFactory
    {
        /**
         * @var ActeurService $acteurService
         * @var AdresseService $adresseService
         * @var AvisService $avisService
         * @var EcoleDoctoraleService $ecoleDoctoraleService
         * @var EtablissementService $etablissementService
@@ -62,6 +65,7 @@ class PropositionControllerFactory
         * @var RenduService $renduService
         */
        $acteurService = $container->get(ActeurService::class);
        $adresseService = $container->get(AdresseService::class);
        $avisService = $container->get(AvisService::class);
        $ecoleDoctoraleService = $container->get(EcoleDoctoraleService::class);
        $etablissementService = $container->get(EtablissementService::class);
@@ -79,6 +83,7 @@ class PropositionControllerFactory
        $renduService = $container->get(RenduService::class);

        /**
         * @var AdresseSoutenanceForm $adresseForm
         * @var DateLieuForm $dateLieuForm
         * @var MembreForm $membreForm
         * @var LabelEuropeenForm $labelEuropeenForm
@@ -87,6 +92,7 @@ class PropositionControllerFactory
         * @var RefusForm $refusForm
         * @var ChangementTitreForm $changementTitreForm
         */
        $adresseForm = $container->get('FormElementManager')->get(AdresseSoutenanceForm::class);
        $dateLieuForm = $container->get('FormElementManager')->get(DateLieuForm::class);
        $membreForm = $container->get('FormElementManager')->get(MembreForm::class);
        $labelEuropeenForm = $container->get('FormElementManager')->get(LabelEuropeenForm::class);
@@ -106,6 +112,7 @@ class PropositionControllerFactory
        $controller = new PropositionController();

        $controller->setActeurService($acteurService);
        $controller->setAdresseService($adresseService);
        $controller->setAvisService($avisService);
        $controller->setEcoleDoctoraleService($ecoleDoctoraleService);
        $controller->setEtablissementService($etablissementService);
@@ -122,6 +129,7 @@ class PropositionControllerFactory
        $controller->setParametreService($parametreService);
        $controller->setRenduService($renduService);

        $controller->setAdresseSoutenanceForm($adresseForm);
        $controller->setDateLieuForm($dateLieuForm);
        $controller->setMembreForm($membreForm);
        $controller->setLabelEuropeenForm($labelEuropeenForm);
@@ -134,7 +142,7 @@ class PropositionControllerFactory

        $controller->setPropositionAssertion($propositionAssertion);

        /** @var \Soutenance\Service\Notification\SoutenanceNotificationFactory $soutenanceNotificationFactory */
        /** @var SoutenanceNotificationFactory $soutenanceNotificationFactory */
        $soutenanceNotificationFactory = $container->get(SoutenanceNotificationFactory::class);
        $controller->setSoutenanceNotificationFactory($soutenanceNotificationFactory);

+98 −0
Changes for module/Soutenance/src/Soutenance/Entity/Adresse.php: 98 added lines, 0 removed lines.
Original line number Diff line number Diff line
<?php

namespace Soutenance\Entity;

use JetBrains\PhpStorm\Pure;
use These\Entity\Db\These;
use UnicaenApp\Entity\HistoriqueAwareInterface;
use UnicaenApp\Entity\HistoriqueAwareTrait;

class Adresse implements HistoriqueAwareInterface {
    use HistoriqueAwareTrait;

    private ?int $id = null;
    private ?Proposition $proposition = null;
    private ?string $ligne1 = null; // Salle et batiment
    private ?string $ligne2 = null; // Numéro et voie
    private ?string $ligne3 = null; // compléments
    private ?string $ligne4 = null; // Code postal et ville

    public function getId(): ?int
    {
        return $this->id;
    }

    public function setId(?int $id): void
    {
        $this->id = $id;
    }

    public function getProposition(): ?Proposition
    {
        return $this->proposition;
    }

    public function setProposition(?Proposition $proposition): void
    {
        $this->proposition = $proposition;
    }

    public function getLigne1(): ?string
    {
        return $this->ligne1;
    }

    public function setLigne1(?string $ligne1): void
    {
        $this->ligne1 = $ligne1;
    }

    public function getLigne2(): ?string
    {
        return $this->ligne2;
    }

    public function setLigne2(?string $ligne2): void
    {
        $this->ligne2 = $ligne2;
    }

    public function getLigne3(): ?string
    {
        return $this->ligne3;
    }

    public function setLigne3(?string $ligne3): void
    {
        $this->ligne3 = $ligne3;
    }

    public function getLigne4(): ?string
    {
        return $this->ligne4;
    }

    public function setLigne4(?string $ligne4): void
    {
        $this->ligne4 = $ligne4;
    }

    /** Helpers *******************************************************************************************************/

    #[Pure] public function getAssociatedThese() : ?These
    {
        $proposition = $this->getProposition();
        if ($proposition === null) return null;
        return $proposition->getThese();
    }

    #[Pure] public function format(): string
    {
        $texte = "";
        if ($this->getLigne1()) $texte .= $this->getLigne1() . "<br>";
        if ($this->getLigne2()) $texte .= $this->getLigne2() . "<br>";
        if ($this->getLigne3()) $texte .= $this->getLigne3() . "<br>";
        if ($this->getLigne4()) $texte .= $this->getLigne4() . "<br>";
        return $texte;
    }
}
 No newline at end of file
Loading