Commit 97da096b authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Soutenance de thèse : ajout de l'avis de la direction de l'ED (après la...

Soutenance de thèse : ajout de l'avis de la direction de l'ED (après la déclaration de complétude du dossier et avant la validation finale de l'établissement).
parent 7b3b8a2a
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@ Journal des modifications
- [FIX] Step-Star : prise en compte des thèses écartées dans le comptage des fichiers TEF générés.
- [FIX] Formation : plantage lors de l'ouverture de la page de modification d'une Formation.
- [FIX] Script de purge des fichiers temporaires : correction pour ce qui concerne la génération XML/TEF (envoi vers step-star). 
- Soutenance de thèse : ajout de l'avis de la direction de l'ED (après la déclaration de complétude du dossier et avant la validation finale de l'établissement).
- Soutenance : déplacement sous "Soutenance" du menu "Dépôt du rapport" et renommage en "Accès rapide Rapporteur".
- Indicateur au format Thèse : inclusion de la colonne 'etat_these' et d'une colonne facultative 'extra'.
- Soutenance Thèse : ajout d'une alerte quand une association membre=>acteur est incorrecte en raison du rôle inadéquat de l'acteur.
+3 −3
Original line number Diff line number Diff line
@@ -52,7 +52,7 @@
        "webmozart/assert": "^1.3",

        "unicaen/alerte": "^3.0",
        "unicaen/app": "^6.2",
        "unicaen/app": "6.2.1",
        "unicaen/auth-token": "^7.1",
        "unicaen/authentification": "^6.4",
        "unicaen/privilege": "^6.3.0",
@@ -64,10 +64,11 @@
        "unicaen/idref": "^2.0",
        "unicaen/ldap": "^6.0",
        "unicaen/livelog": "^4.0",
        "unicaen/mail": "^6.1",
        "unicaen/maintenance-mode": "^1.0",
        "unicaen/parametre": "^6.0",
        "unicaen/pdf": "dev-release_7.0.0",
        "unicaen/renderer": "dev-release_7.0.6",
        "unicaen/renderer": "dev-release_7.2.0",
        "unicaen/search": "^1.1",
        "unicaen/sql": "^2.0",
        "unicaen/sygal-api": "dev-master",
@@ -103,7 +104,6 @@
            "Substitution\\": "module/Substitution/src",
            "SygalApi\\": "vendor/unicaen/sygal-api/src",
            "These\\": "module/These/src",
            "UnicaenAvis\\": "module/UnicaenAvis/src",
            "Validation\\": "module/Validation/src"
        },
        "psr-4": {
+6 −6
Original line number Diff line number Diff line
@@ -4,7 +4,7 @@
        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
        "This file is @generated automatically"
    ],
    "content-hash": "08652ab571b9f18fd804b35837de0697",
    "content-hash": "30888d6e3783a3db724e1b2f869c4cbd",
    "packages": [
        {
            "name": "apereo/phpcas",
@@ -11943,7 +11943,7 @@
            "source": {
                "type": "git",
                "url": "https://git.unicaen.fr/lib/unicaen/avis.git",
                "reference": "84e106d7cf1a3b146f845f53180de36e0c83e2e5"
                "reference": "5f0f1b1e3283ec84841b7e3ee62272625fa41171"
            },
            "require": {
                "doctrine/doctrine-laminas-hydrator": "^2.0 || ^3.0",
@@ -11984,7 +11984,7 @@
                ]
            },
            "description": "Module Unicaen de gestion des avis",
            "time": "2025-07-09T07:24:14+00:00"
            "time": "2025-12-08T09:43:15+00:00"
        },
        {
            "name": "unicaen/bjy-authorize",
@@ -12466,11 +12466,11 @@
        },
        {
            "name": "unicaen/renderer",
            "version": "dev-release_7.0.6",
            "version": "dev-release_7.2.0",
            "source": {
                "type": "git",
                "url": "https://git.unicaen.fr/lib/unicaen/renderer.git",
                "reference": "35c2c119c376b0d2aff1749b7304b28c4e2f54e4"
                "reference": "a49a305167e4634a29fea450e581d9d6f4c7030d"
            },
            "require": {
                "laminas/laminas-view": "^2.27",
@@ -12488,7 +12488,7 @@
                ]
            },
            "description": "Module de rendu de texte avec templates et macros",
            "time": "2025-05-13T12:51:30+00:00"
            "time": "2025-11-26T10:25:54+00:00"
        },
        {
            "name": "unicaen/search",
+211 −0
Original line number Diff line number Diff line
--
-- 10.5.0
--

-------------------------- Renommage de soutenance_avis en soutenance_avis_membre --------------------------------------
alter table soutenance_avis rename to soutenance_avis_membre;
alter index soutenance_avis_pk rename to soutenance_avis_membre_pk;
alter index soutenance_avis_uniq rename to soutenance_avis_membre_uniq;
alter index soutenance_avis_uniq_histo rename to soutenance_avis_membre_uniq_histo;
alter table soutenance_avis_membre rename constraint soutenance_avis_pk to soutenance_avis_membre_pk;
alter table soutenance_avis_membre rename constraint avis_proposition_id to avis_membre_proposition_id;
alter table soutenance_avis_membre rename constraint avis_membre_fk to avis_membre_membre_fk;
alter table soutenance_avis_membre rename constraint avis_validation_fk to avis_membre_validation_fk;
alter table soutenance_avis_membre rename constraint avis_modificateur_fk to avis_membre_modificateur_fk;
alter table soutenance_avis_membre rename constraint avis_destructeur_id to avis_membre_destructeur_id;
alter table soutenance_avis_membre rename constraint soutenance_avis_fichier_these_id_fk to sout_membreenance_avis_fichier_these_id_fk;
alter table soutenance_avis_membre rename constraint soutenance_avis_fichier_hdr_id_fkey to sout_membreenance_avis_fichier_hdr_id_fkey;
alter table soutenance_avis_membre rename constraint soutenance_avis_validation_hdr_id_fkey to sout_membreenance_avis_validation_hdr_id_fkey;

update unicaen_privilege_privilege set code = 'avis-membre-annuler' where unicaen_privilege_privilege.categorie_id = (select id from unicaen_privilege_categorie where code = 'soutenance') and code = 'avis-annuler';
update unicaen_privilege_privilege set code = 'avis-membre-modifier' where unicaen_privilege_privilege.categorie_id = (select id from unicaen_privilege_categorie where code = 'soutenance') and code = 'avis-modifier';
update unicaen_privilege_privilege set code = 'avis-membre-notifier' where unicaen_privilege_privilege.categorie_id = (select id from unicaen_privilege_categorie where code = 'soutenance') and code = 'avis-notifier';
update unicaen_privilege_privilege set code = 'avis-membre-visualisation' where unicaen_privilege_privilege.categorie_id = (select id from unicaen_privilege_categorie where code = 'soutenance') and code = 'avis-visualisation';



------------------------------------- Soutenance Thèse : Avis de la direction d'ED ------------------------------------
-- Nouveau type d'avis
insert into unicaen_avis_type (code, libelle, description, ordre)
values ('AVIS_SOUTENANCE_THESE_DIR_ED', 'Avis de la direction de l''école doctorale', 'Point de vue de la direction de l''ED', 30);

-- Nouvelles valeurs d'avis : "favorable", "défavorable"
insert into unicaen_avis_valeur (code, valeur, valeur_bool, tags)
with v (code, valeur, valeurb, tags) as (
    select 'AVIS_SOUTENANCE_THESE_VALEUR_FAVORABLE', 'Avis favorable', true, 'icon-ok' union all
    select 'AVIS_SOUTENANCE_THESE_VALEUR_DEFAVORABLE', 'Avis défavorable', false, 'icon-ko'
)
select code, valeur, valeurb, tags from v ;

-- Valeurs d'avis possibles pour ce type d'avis : "favorable", "défavorable"
insert into unicaen_avis_type_valeur (avis_type_id, avis_valeur_id)
select t.id, v.id
from unicaen_avis_type t,
     unicaen_avis_valeur v
where t.code = 'AVIS_SOUTENANCE_THESE_DIR_ED'
  and v.code in ('AVIS_SOUTENANCE_THESE_VALEUR_DEFAVORABLE',
                 'AVIS_SOUTENANCE_THESE_VALEUR_FAVORABLE');

-- Champ complémentaire obligatoire si avis === "défavorable" : motif
insert into unicaen_avis_type_valeur_complem (avis_type_valeur_id, code, obligatoire_un_au_moins, type, libelle)
with tmp (code, oblig, type, libelle) as (select 'AVIS_SOUTENANCE_THESE_VALEUR_DEFAVORABLE_MOTIF', true, 'textarea', 'Motif')
select tv.id, concat(t.code, '__', v.code, '__', tmp.code), tmp.oblig, tmp.type, tmp.libelle
from tmp,
     unicaen_avis_type_valeur tv
         join unicaen_avis_type t on t.id = tv.avis_type_id and t.code = 'AVIS_SOUTENANCE_THESE_DIR_ED'
         join unicaen_avis_valeur v on v.id = tv.avis_valeur_id and v.code in ('AVIS_SOUTENANCE_THESE_VALEUR_DEFAVORABLE');

-- Champ complémentaire facultatif si avis === "favorable" : commentaire
insert into unicaen_avis_type_valeur_complem (avis_type_valeur_id, code, obligatoire_un_au_moins, type, libelle)
with tmp (code, oblig, type, libelle) as (select 'AVIS_SOUTENANCE_THESE_VALEUR_FAVORABLE_COMMENT', false, 'textarea', 'Commentaires')
select tv.id, concat(t.code, '__', v.code, '__', tmp.code), tmp.oblig, tmp.type, tmp.libelle
from tmp,
     unicaen_avis_type_valeur tv
         join unicaen_avis_type t on t.id = tv.avis_type_id and t.code = 'AVIS_SOUTENANCE_THESE_DIR_ED'
         join unicaen_avis_valeur v on v.id = tv.avis_valeur_id and v.code in ('AVIS_SOUTENANCE_THESE_VALEUR_FAVORABLE');

-- -- Message d'info si avis === "défavorable"
-- insert into unicaen_avis_type_valeur_complem (avis_type_valeur_id, code, obligatoire_un_au_moins, type, libelle)
-- with tmp (code, oblig, type, libelle) as (
--     select 'AVIS_SOUTENANCE_THESE_VALEUR_DEFAVORABLE_COMPLEM',
--            false,
--            'information',
--            'Si l''avis est défavorable, ...')
-- select tv.id, concat(t.code, '__', v.code, '__', tmp.code), tmp.oblig, tmp.type, tmp.libelle
-- from tmp,
--      unicaen_avis_type_valeur tv
--          join unicaen_avis_type t on t.id = tv.avis_type_id and t.code = 'AVIS_SOUTENANCE_THESE_DIR_ED'
--          join unicaen_avis_valeur v on v.id = tv.avis_valeur_id and v.code in (
--          'AVIS_SOUTENANCE_THESE_VALEUR_DEFAVORABLE'
--          );
--
-- -- Message d'info si avis === "favorable"
-- insert into unicaen_avis_type_valeur_complem (avis_type_valeur_id, code, obligatoire_un_au_moins, type, libelle)
-- with tmp (code, oblig, type, libelle) as (
--     select 'AVIS_SOUTENANCE_THESE_VALEUR_FAVORABLE_COMPLEM',
--            false,
--            'information',
--            'Si l''avis est favorable, ...')
-- select tv.id, concat(t.code, '__', v.code, '__', tmp.code), tmp.oblig, tmp.type, tmp.libelle
-- from tmp,
--      unicaen_avis_type_valeur tv
--          join unicaen_avis_type t on t.id = tv.avis_type_id and t.code = 'AVIS_SOUTENANCE_THESE_DIR_ED'
--          join unicaen_avis_valeur v on v.id = tv.avis_valeur_id and v.code in (
--          'AVIS_SOUTENANCE_THESE_VALEUR_FAVORABLE'
--          );

create table soutenance_avis_ed
(
    id bigserial not null constraint soutenance_avis__pk primary key,
    proposition_id bigint not null constraint soutenance_avis__proposition_fk references soutenance_proposition,
    avis_id bigint not null constraint soutenance_avis__avis_fk references unicaen_avis,
    ecole_doct_id bigint not null constraint soutenance_avis_ed__ed_fk references ecole_doct,
    histo_createur_id bigint not null,
    histo_modificateur_id bigint not null,
    histo_destructeur_id bigint,
    histo_creation timestamp default ('now'::text)::timestamp without time zone not null,
    histo_modification timestamp without time zone,
    histo_destruction timestamp
);

create index soutenance_avis_ed__proposition_idx on soutenance_avis_ed (proposition_id);
create index soutenance_avis_ed__avis_idx on soutenance_avis_ed (avis_id);
create index soutenance_avis_ed__ed_idx on soutenance_avis_ed (ecole_doct_id);


INSERT INTO soutenance_etat (id, code, libelle, ordre)
select nextval('soutenance_etat_id_seq'), 'EN_COURS_EXAMEN_ADMIN', 'En cours d''examen administratif', 30;
UPDATE soutenance_etat SET ordre = 10 where code = 'EN_COURS_SAISIE';
UPDATE soutenance_etat SET ordre = 20 where code = 'EN_COURS_EXAMEN';
UPDATE soutenance_etat SET ordre = 40 where code = 'COMPLET';
UPDATE soutenance_etat SET ordre = 50 where code = 'ETABLISSEMENT';
UPDATE soutenance_etat SET ordre = 60 where code = 'VALIDEE';
UPDATE soutenance_etat SET ordre = 70 where code = 'REJETEE';

UPDATE soutenance_etat SET libelle = 'Avis de soutenance en cours de validation au chef d’établissement' where code = 'ETABLISSEMENT';


INSERT INTO unicaen_privilege_privilege(CATEGORIE_ID, CODE, LIBELLE, ORDRE)
WITH d(code, lib, ordre) AS (
    SELECT 'presoutenance-donner-feu-vert', 'Donner le feu vert pour une soutenance', 100
)
SELECT cp.id, d.code, d.lib, d.ordre
FROM d JOIN unicaen_privilege_categorie cp ON cp.CODE = 'soutenance'
on conflict (categorie_id, code) DO UPDATE set LIBELLE = EXCLUDED.libelle, ORDRE = EXCLUDED.ordre;

select privilege__grant_privileges_to_profiles(
               'soutenance',
               ARRAY['presoutenance-donner-feu-vert'],
               ARRAY['ADMIN_TECH', 'BDD', 'GEST_ED']
       );


INSERT INTO unicaen_privilege_privilege(CATEGORIE_ID, CODE, LIBELLE, ORDRE)
WITH d(code, lib, ordre) AS (
    SELECT 'ajouter-avis-ed-tout', 'Ajouter un avis ED sur n''importe quelle soutenance', 10 UNION
    SELECT 'ajouter-avis-ed-sien', 'Ajouter un avis ED sur ses soutenances', 15 UNION
    SELECT 'modifier-avis-ed-tout', 'Modifier un avis ED sur n''importe quelle soutenance', 20 UNION
    SELECT 'modifier-avis-ed-sien', 'Modifier un avis ED sur ses soutenances', 25 UNION
    SELECT 'supprimer-avis-ed-tout', 'Supprimer un avis ED sur n''importe quelle soutenance', 30 UNION
    SELECT 'supprimer-avis-ed-sien', 'Supprimer un avis ED sur ses soutenances', 35
)
SELECT cp.id, d.code, d.lib, d.ordre
FROM d JOIN unicaen_privilege_categorie cp ON cp.CODE = 'soutenance'
on conflict (categorie_id, code) DO UPDATE set LIBELLE = EXCLUDED.libelle, ORDRE = EXCLUDED.ordre;

select privilege__grant_privileges_to_profiles(
               'soutenance',
               ARRAY['ajouter-avis-ed-tout', 'modifier-avis-ed-tout', 'supprimer-avis-ed-tout'],
               ARRAY['ADMIN_TECH', 'BDD']
       );
select privilege__grant_privileges_to_profiles(
               'soutenance',
               ARRAY['ajouter-avis-ed-sien', 'modifier-avis-ed-sien', 'supprimer-avis-ed-sien'],
               ARRAY['RESP_ED']
       );


--------------- Templates de mail ----------------

--delete from unicaen_renderer_template where code = 'SOUTENANCE_THESE_AVIS_ED_ATTENDU';
INSERT INTO unicaen_renderer_template (code, description, document_type, document_sujet, document_corps,
                                       document_css, namespace, engine)
VALUES ('SOUTENANCE_THESE_AVIS_ED_ATTENDU',
        '<p>Mail informant que l''avis de la direction d''ED est attendu sur une proposition de soutenance</p>',
        'mail',
        'Avis de la direction d''ED attendu sur la proposition de soutenance de {{ apprenant }}',
        e'<p>Bonjour,</p>
<p>Ceci est un mail envoyé automatiquement par l\'application ESUP-SyGAL.</p>
<p>L''avis de la direction de l''école doctorale &laquo; {{ ed }} &raquo; est attendu pour la proposition de soutenance de {{ apprenant }}.</p>
<p>Cliquez sur le lien suivant pour accéder au dossier :
<a href="{{ url.getSoutenancePresoutenance }}">soutenance de {{ apprenant }}</a>.</p>',
        null,
        'Soutenance\Provider\Template',
        'twig');


--delete from unicaen_renderer_template where code = 'SOUTENANCE_THESE_AVIS_ED';
INSERT INTO unicaen_renderer_template (code, description, document_type, document_sujet, document_corps,
                                       document_css, namespace, engine)
VALUES ('SOUTENANCE_THESE_AVIS_ED',
        '<p>Mail informant qu''un avis de la direction de l''ED a été rendu au sujet d''une proposition de soutenance </p>',
        'mail',
        'Avis rendu sur la proposition de soutenance de {{ apprenant }}',
        e'<p>Bonjour,</p>
<p>Ceci est un mail envoyé automatiquement par l\'application ESUP-SyGAL.</p>
<p>À partir des rapports de soutenance déposés dans l''application ESUP-SyGAL pour la soutenance de {{ apprenant }},
l''avis suivant vient d''être rendu :</p>
<p style="padding-left: 2rem; font-weight: bold;">
    {{ avisEd.avis }}
</p>
{% if avisEd.avis.avisComplems %}
    <div style="padding-left: 3rem; font-weight: bold;">
        {{ avisEd.avis.avisComplemsToHtml|raw }}
    </div>
{% endif %}
<p>Cet avis va être soumis à la direction de votre établissement pour donner l''autorisation de soutenance.</p>
<p>Afin de suivre l\'avancée du dossier, connectez-vous sur la plateforme ESUP-SyGAL via le lien suivant :
<a href="{{ url.getSoutenancePresoutenance }}">soutenance de {{ apprenant }}</a>.</p>',
        null,
        'Soutenance\Provider\Template',
        'twig');
+11 −0
Original line number Diff line number Diff line
@@ -63,6 +63,17 @@ services:
    extra_hosts:
      - "host.docker.internal:host-gateway"

  maildev:
    image: maildev/maildev:2.2.1
    container_name: sygal-maildev
    command: 'bin/maildev --web 1080 --smtp 25 --hide-extensions STARTTLS --base-path /maildev'
    environment:
      - TZ=${TZ:-Europe/Paris}
    ports:
      - "1080:1080"
    networks:
      - sygalnet

  sygal-db-demo:
    image: registre.unicaen.fr:5000/sygal-db-image
    restart: always
Loading