Commit e72fc6a3 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

[FIX] Soutenance : la création de plusieurs adresses de soutenance doit être...

[FIX] Soutenance : la création de plusieurs adresses de soutenance doit être empêchée (màj BDD requise).
parent 10120d48
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ Journal des modifications
- [FIX] Export Excel des formations/sessions/séances : correction de la config pour inclure les colonnes session_statut_inscription et session_nb_heures.
- [FIX] Module Step-Star : création des répertoires de travail avec les bonnes permissions.
- [FIX] Modification d'un acteur sur la fiche Thèse : l'affichage du formulaire (bouton 'crayon') plantait (pb dans la vue).
- [FIX] Soutenance : la création de plusieurs adresses de soutenance doit être empêchée (màj BDD requise).

10.2.1
------
+52 −0
Original line number Diff line number Diff line
--
-- v10.3.0
--

alter table soutenance_adresse
    add constraint soutenance_adresse_pk
        primary key (id);

alter table soutenance_adresse
    add constraint soutenance_adresse_proposition_fk
        foreign key (proposition_id) references soutenance_proposition
            on delete restrict;

alter table soutenance_adresse
    add constraint soutenance_adresse_hc_fk
        foreign key (histo_createur_id) references utilisateur
            on delete restrict;

alter table soutenance_adresse
    add constraint soutenance_adresse_hd_fk
        foreign key (histo_destructeur_id) references utilisateur
            on delete restrict;

alter table soutenance_adresse
    add constraint soutenance_adresse_hm_fk
        foreign key (histo_modificateur_id) references utilisateur
            on delete restrict;

create unique index soutenance_adresse_uniq
    on soutenance_adresse (proposition_id)
    where (histo_destruction IS NULL);

create unique index soutenance_adresse_uniq_histo
    on soutenance_adresse (proposition_id, histo_destruction)
    where (histo_destruction IS NOT NULL);

alter table soutenance_avis
    add constraint soutenance_avis_pk
        primary key (id);

create unique index soutenance_avis_uniq
    on soutenance_avis (proposition_id, membre_id)
    where (histo_destruction IS NULL);
-- Si ça ne passe pas, recherchez les doublons ainsi et historisez (avec histo_destructeur_id et histo_destruction) le dernier :
-- select proposition_id, membre_id, count(*) from soutenance_avis where histo_destruction is null group by proposition_id, membre_id having count(*) > 1;

create unique index soutenance_avis_uniq_histo
    on soutenance_avis (proposition_id, membre_id, histo_destruction)
    where (histo_destruction IS NOT NULL);

create unique index soutenance_etat_uniq
    on soutenance_etat (code);
+7 −1
Original line number Diff line number Diff line
@@ -606,12 +606,17 @@ abstract class PropositionController extends AbstractSoutenanceController

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

    public function ajouterAdresseAction(): ViewModel
    public function ajouterAdresseAction(): ViewModel|Response
    {
        $this->initializeFromType();

        if ($adresse = $this->proposition->getAdresseActive()) {
            return $this->redirect()->toRoute("soutenance_{$this->type}/proposition/modifier-adresse", ['id' => $this->entity->getId(), 'adresse' => $adresse->getId()], [], true);
        }

        $adresse = new Adresse();
        $adresse->setProposition($this->proposition);

        $form = $this->getAdresseSoutenanceForm();
        $form->setAttribute('action', $this->url()->fromRoute("soutenance_{$this->type}/proposition/ajouter-adresse", ['id' => $this->entity->getId(), 'proposition' => $this->proposition->getId()], [], true));
        $form->bind($adresse);
@@ -632,6 +637,7 @@ abstract class PropositionController extends AbstractSoutenanceController
            'form' => $form,
        ]);
        $vm->setTemplate('soutenance/default/default-form');

        return $vm;
    }

+5 −11
Original line number Diff line number Diff line
@@ -336,18 +336,12 @@ class Proposition implements HistoriqueAwareInterface, HasHorodatagesInterface {

    public function getAdresseActive() : ?Adresse
    {
        $result = null;
        /** @var Adresse $adresse */
        foreach ($this->adresses as $adresse) {
            if ($adresse->estNonHistorise()) {
                if ($result === null) {
                    $result = $adresse;
                } else {
        $adresses = $this->adresses->filter(fn($adresse) => $adresse->estNonHistorise());
        if ($adresses->count() > 1) {
            throw new RuntimeException("Plusieurs [".Adresse::class."] sont actives pour la proposition [".$this->getId()."]");
        }
            }
        }
        return $result;

        return $adresses->first() ?: null;
    }

    /**
+1 −1
Original line number Diff line number Diff line
@@ -26,7 +26,7 @@ $object = $proposition->getObject();
                    <p class="lead">Vous pouvez modifier celle-ci sans annulation du dossier tant que les convocations n'ont pas été éditées.</p>
                <?php endif; ?>
                <?php if ($proposition->getEtat()->getCode() !== Etat::VALIDEE) : ?>
                    <?php if ($adresse === null) : ?>
                    <?php if ($adresse) : ?>
                        <?php /** @see \Soutenance\Controller\PropositionController::ajouterAdresseAction() */ ?>
                        <a href="<?php echo $this->url("soutenance_{$typeProposition}/proposition/ajouter-adresse", ['id' => $object->getId(), 'proposition' => $proposition->getId()], [], true); ?>"
                           class="btn btn-primary ajax-modal" data-event="edition-adresse">