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

Merge branch 'release_6.0.4'

parents a2453b81 1d563184
Loading
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
Journal des modifications
=========================

6.0.4
-----
- [FIX] Recherche de rapports d'Activité/CSI/Mi-parcours : les filtres Établissement/ED/UR géraient mal la subsitution de structures.
- Changement de la page de couverture pour tenir compte de la co-accréditation
- Module Soutenance : Possibilité pour les structures de révoquer leur validation (avec modal de confirmation)

6.0.3
-----
- [FIX] Signature de méthode setObject() modifiée en PHP8 dans Doctrine\Laminas\Hydrator\Strategy\AbstractCollectionStrategy.

data/SQL/profil.sql

deleted100755 → 0
+0 −58
Original line number Diff line number Diff line

rename ROLE_MODELE to PROFIL;
rename ROLE_PRIVILEGE_MODELE to PROFIL_PRIVILEGE;

alter table PROFIL add description varchar2(1024);

create sequence PROFIL_ID_SEQ;

--
-- Avance d'une sequence.
--
declare
  maxid integer;
  seqnextval integer;
begin
  select max(PROFIL.id) into maxid from PROFIL;
  LOOP
    select PROFIL_ID_SEQ.nextval into seqnextval from dual;
    EXIT WHEN seqnextval >= maxid;
  END LOOP;
end;

create unique index PROFIL_ROLE_ID_uindex on PROFIL (ROLE_ID);

truncate table PROFIL_PRIVILEGE;

alter table PROFIL modify STructure_type null;

alter table PROFIL_PRIVILEGE drop constraint ROLE_PRIV_MOD_PK;
alter table PROFIL_PRIVILEGE drop column ROLE_CODE;
alter table PROFIL_PRIVILEGE add PROFIL_ID number;
alter table PROFIL_PRIVILEGE add constraint PROFIL_PRIVILEGE_PROFIL_ID_fk foreign key (PROFIL_ID) references PROFIL;
alter table PROFIL_PRIVILEGE add constraint PROFIL_PRIVILEGE_PK primary key (PROFIL_ID, PRIVILEGE_ID);

create table PROFIL_TO_ROLE (
                              PROFIL_ID integer not null constraint PROFIL_TO_ROLE_PROFIL_ID_fk references PROFIL,
                              ROLE_ID integer not null constraint PROFIL_TO_ROLE_ROLE_ID_fk references ROLE,
                              constraint PROFIL_TO_ROLE_pk primary key (PROFIL_ID, ROLE_ID)
);

-- INSERT INTO PROFIL (ID, LIBELLE, ROLE_ID, STRUCTURE_TYPE, DESCRIPTION) VALUES (1, 'Unité de recherche', 'UR', 3, null);
-- INSERT INTO PROFIL (ID, LIBELLE, ROLE_ID, STRUCTURE_TYPE, DESCRIPTION) VALUES (2, 'École doctorale', 'ED', 2, null);
-- INSERT INTO PROFIL (ID, LIBELLE, ROLE_ID, STRUCTURE_TYPE, DESCRIPTION) VALUES (3, 'Administrateur', 'ADMIN', 1, 'Administrateur d''établissement');
-- INSERT INTO PROFIL (ID, LIBELLE, ROLE_ID, STRUCTURE_TYPE, DESCRIPTION) VALUES (4, 'Maison du doctorat', 'BDD', 1, null);
-- INSERT INTO PROFIL (ID, LIBELLE, ROLE_ID, STRUCTURE_TYPE, DESCRIPTION) VALUES (5, 'Bibliothèque universitaire', 'BU', 1, null);
INSERT INTO PROFIL (ID, LIBELLE, ROLE_ID, STRUCTURE_TYPE, DESCRIPTION) VALUES (6, 'Administrateur technique', 'ADMIN_TECH', null, null);
INSERT INTO PROFIL (ID, LIBELLE, ROLE_ID, STRUCTURE_TYPE, DESCRIPTION) VALUES (7, 'Doctorant', 'DOCTORANT', null, null);
INSERT INTO PROFIL (ID, LIBELLE, ROLE_ID, STRUCTURE_TYPE, DESCRIPTION) VALUES (8, 'Observateur', 'OBSERV', null, null);
INSERT INTO PROFIL (ID, LIBELLE, ROLE_ID, STRUCTURE_TYPE, DESCRIPTION) VALUES (9, 'Directeur', 'D', null, null);
INSERT INTO PROFIL (ID, LIBELLE, ROLE_ID, STRUCTURE_TYPE, DESCRIPTION) VALUES (10, 'Co-directeur', 'K', null, null);
INSERT INTO PROFIL (ID, LIBELLE, ROLE_ID, STRUCTURE_TYPE, DESCRIPTION) VALUES (11, 'Rapporteur', 'R', null, null);
INSERT INTO PROFIL (ID, LIBELLE, ROLE_ID, STRUCTURE_TYPE, DESCRIPTION) VALUES (12, 'Membre', 'M', null, null);
INSERT INTO PROFIL (ID, LIBELLE, ROLE_ID, STRUCTURE_TYPE, DESCRIPTION) VALUES (61, 'Doctorant sans dépôt', 'NODEPOT', null, 'Rôle de doctorant temporaire');

INSERT INTO PRIVILEGE (ID, CATEGORIE_ID, CODE, LIBELLE, ORDRE) VALUES (36, 19, 'consultation-toutes-structures', 'Consultation de toutes les substitutions', 200);
INSERT INTO PRIVILEGE (ID, CATEGORIE_ID, CODE, LIBELLE, ORDRE) VALUES (37, 19, 'consultation-sa-structure', 'Consultation de la substitution de sa structure', 300);
INSERT INTO PRIVILEGE (ID, CATEGORIE_ID, CODE, LIBELLE, ORDRE) VALUES (38, 19, 'modification-toutes-structures', 'Modification de toutes les substitutions ', 400);
INSERT INTO PRIVILEGE (ID, CATEGORIE_ID, CODE, LIBELLE, ORDRE) VALUES (39, 19, 'modification-sa-structure', 'Modification de la substitution de sa structure', 500);
+69 −0
Original line number Diff line number Diff line
# Version 6.0.4

## 1. Sur le serveur d'application

*Rappel : depuis la version 6.0.0, la version de PHP requise est la 8.0.*

- Placez-vous dans le répertoire de l'application puis lancez la commande suivante
  pour installer la nouvelle version :

```bash
git fetch --tags && git checkout --force 6.0.4 && bash ./install.sh
```

- Rechargez le moteur PHP, exemple :

```bash
systemctl reload php8.0-fpm
```

## 2. Dans la base de données

```postgresql
-- Ajout du privilège pour revoquer
INSERT INTO privilege (categorie_id, code, libelle, ordre)
WITH d(code, lib, ordre) AS (
    SELECT 'proposition-revoquer-structure', 'Révoquer la validation (structure) de la proposition', 34
)
SELECT cp.id, d.code, d.lib, d.ordre
FROM d
JOIN categorie_privilege cp ON cp.CODE = 'soutenance';

--Ajout au profil
INSERT INTO PROFIL_PRIVILEGE (PRIVILEGE_ID, PROFIL_ID)
with data(categ, priv) as (
  select 'soutenance'::text, 'proposition-revoquer-structure'::text
)
select p.id as PRIVILEGE_ID, profil.id as PROFIL_ID
from data
       join PROFIL on profil.ROLE_ID in ('RESP_ED', 'RESP_UR', 'BDD')
       join CATEGORIE_PRIVILEGE cp on cp.CODE = data.categ
       join PRIVILEGE p on p.CATEGORIE_ID = cp.id and p.code = data.priv
where not exists (
  select * from PROFIL_PRIVILEGE where PRIVILEGE_ID = p.id and PROFIL_ID = profil.id
);

INSERT INTO PROFIL_PRIVILEGE (PRIVILEGE_ID, PROFIL_ID)
with data(categ, priv) as (
  select 'missionenseignement'::text, 'missionenseignement_modifier'::text
)
select p.id as PRIVILEGE_ID, profil.id as PROFIL_ID
from data
       join PROFIL on profil.ROLE_ID in ('ADMIN_TECH', 'GEST_FORMATION', 'BDD', 'ADMIN')
       join CATEGORIE_PRIVILEGE cp on cp.CODE = data.categ
       join PRIVILEGE p on p.CATEGORIE_ID = cp.id and p.code = data.priv
where not exists (
  select * from PROFIL_PRIVILEGE where PRIVILEGE_ID = p.id and PROFIL_ID = profil.id
);

insert into ROLE_PRIVILEGE (ROLE_ID, PRIVILEGE_ID)
select p2r.ROLE_ID, pp.PRIVILEGE_ID
from PROFIL_TO_ROLE p2r
       join profil pr on pr.id = p2r.PROFIL_ID
       join PROFIL_PRIVILEGE pp on pp.PROFIL_ID = pr.id
where not exists (
  select * from role_privilege where role_id = p2r.role_id and privilege_id = pp.privilege_id
);


```
 No newline at end of file
+7 −4
Original line number Diff line number Diff line
@@ -83,7 +83,7 @@ class RapportSearchService extends SearchService
        $etablissementInscrFilter = $this->getEtablissementTheseSearchFilter()
            ->setQueryBuilderApplier(function (SelectSearchFilter $filter, DefaultQueryBuilder $qb) {
                $qb
                    ->andWhere('etab.sourceCode = :sourceCodeEtab OR etab_structureSubstituante.sourceCode = :sourceCodeEtab')
                    ->andWhere('etab.sourceCode = :sourceCodeEtab OR etab_substituant.sourceCode = :sourceCodeEtab')
                    ->setParameter('sourceCodeEtab', $filter->getValue());
            })
            ->setDataProvider(function() {
@@ -96,7 +96,7 @@ class RapportSearchService extends SearchService
        $uniteRechercheFilter = $this->getUniteRechercheSearchFilter()
            ->setQueryBuilderApplier(function (SelectSearchFilter $filter, DefaultQueryBuilder $qb) {
                $qb
                    ->andWhere('ur.sourceCode = :sourceCodeUR OR ur_structureSubstituante.sourceCode = :sourceCodeUR')
                    ->andWhere('ur.sourceCode = :sourceCodeUR OR ur_substituant.sourceCode = :sourceCodeUR')
                    ->setParameter('sourceCodeUR', $filter->getValue());
            })
            ->setDataProvider(function() {
@@ -105,7 +105,7 @@ class RapportSearchService extends SearchService
        $ecoleDoctoraleFilter = $this->getEcoleDoctoraleSearchFilter()
            ->setQueryBuilderApplier(function (SelectSearchFilter $filter, DefaultQueryBuilder $qb) {
                $qb
                    ->andWhere('ed.sourceCode = :sourceCodeED OR ed_structureSubstituante.sourceCode = :sourceCodeED')
                    ->andWhere('ed.sourceCode = :sourceCodeED OR ed_substituant.sourceCode = :sourceCodeED')
                    ->setParameter('sourceCodeED', $filter->getValue());
            })
            ->setDataProvider(function() {
@@ -318,7 +318,10 @@ class RapportSearchService extends SearchService
            ->leftJoin('ur.structure', 'ur_structure')->addSelect('ur_structure')
            ->leftJoinStructureSubstituante('etab_structure', 'etab_structureSubstituante')
            ->leftJoinStructureSubstituante('ed_structure', 'ed_structureSubstituante')
            ->leftJoinStructureSubstituante('ur_structure', 'ur_structureSubstituante');
            ->leftJoinStructureSubstituante('ur_structure', 'ur_structureSubstituante')
            ->leftJoin('etab_structureSubstituante.etablissement', 'etab_substituant')->addSelect('etab_substituant')
            ->leftJoin('ed_structureSubstituante.ecoleDoctorale', 'ed_substituant')->addSelect('ed_substituant')
            ->leftJoin('ur_structureSubstituante.uniteRecherche', 'ur_substituant')->addSelect('ur_substituant');

        if ($this->typeRapport !== null) {
            $qb->andWhere('tr = :type')->setParameter('type', $this->typeRapport);
+3 −3
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@ use Application\Entity\Db\Utilisateur;
use UnicaenApp\Form\Element\SearchAndSelect;
?>

<?php if ($individu !== null and $utilisateur !== null and $utilisateur->getIndividu() === $individu) : ?>
<?php if (isset($individu) and $utilisateur !== null and $utilisateur->getIndividu() === $individu) : ?>

    <div class="alert alert-success">
        Le compte utilisateur &laquo; <?php echo $utilisateur->getDisplayName(); ?> &raquo;
@@ -51,7 +51,7 @@ use UnicaenApp\Form\Element\SearchAndSelect;
        </div>
    </div>

    <?php if ($individu)  : ?>
    <?php if (isset($individu))  : ?>
        <div class="box card">
            <div class="card-header bg-dark text-white">
                <h2 class="first">
@@ -168,7 +168,7 @@ use UnicaenApp\Form\Element\SearchAndSelect;

        <?php echo $this->ajouterIndividuChildView ?>

    <?php elseif ($individu === null) : ?>
    <?php elseif (!isset($individu)) : ?>

        <form method="post"
              action="<?php echo $this->url('utilisateur/lier-individu', ['utilisateur' => $utilisateur->getId()], [], true); ?>">
Loading