diff --git a/CHANGELOG.md b/CHANGELOG.md
index d461c17d73105482fb5f4599af31ef7b832a7187..97a438a54da8b854f84f704f991685cb4a999149 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,7 +4,18 @@ Journal des modifications
6.0.6
-----
- Passage dans UnicaenRenderer du template des historiques de co-encadrements
-- [FORMATION] Ajout d'un filtre sur l'année sur l'écran des formations pour masquer/afficher les sessions
+- Ajout d'un filtre sur l'année sur l'écran des formations pour masquer/afficher les sessions
+- Extraction CSV des thèses : amélioration du temps de génération (création d'une vue en bdd) ; ajout des colonnes
+'Dernier rapport d'activité', 'Dernier rapport CSI', 'Date d'extraction', 'Discipline Code SISE', 'Autorisation de MEL',
+'Années financées' ; modification du séparateur de valeurs multiples ',' en ' ; ' ; correction de la colonne
+'Date de dépôt version corrigée' toujours vide.
+- [FIX] Création d'un compte utilisateur local : vérif de l'email déjà utilisé remplacée par vérif de l'email déjà utilisé comme username.
+- [FIX] Création d'un compte utilisateur local : redirection vers la fiche du nouveau compte après création.
+- [FIX] Soutenance : message d'alerte affiché à tort systématiquement à propos de l'adresse Doctorat manquante.
+- [FIX] Chargement de la navigation : plantage d'une assertion à cause d'une variable null (role).
+- [FIX] Accès aux fiches individus.
+- [FIX] Pages de couverture : réduction de la marge en haut de page.
+- [FORMATION] Filtre selon les année pour les sessions
- [SOUTENANCE] Récupération de la date de fin de confidentialité depuis la thèse puis du dossier de soutenance pour le docuement de la présidence
6.0.5
@@ -12,7 +23,7 @@ Journal des modifications
- [FIX] Correction d'un bug empêchant la création d'établissement ; améliorations des validateurs des formulaires de structures.
- [FIX] Correction de bugs en cas d'utilisateur ayant à la fois le rôle Doctorant et un autre rôle.
- [FIX] Correction du plantage survenant dans RapportActiviteAssertion (interrogée par la navigation) lorsque l'utilisateur n'est pas authentifié.
-- [FIX] Destinataires de la notification de demande de validation d'une proposition de soutenance : adresse mail "aspects doctorat"
+- [FIX] Destinataires de la notification de demande de validation d'une proposition de soutenance : adresse mail 'aspects doctorat'
de l'établissement d'inscription, plutôt que la liste des individus ayant le rôle BDD obsolète.
- Onglet 'Rôles et membres' d'une ED/UR : renommage de 'Site' en 'Établissement d'inscription' (clarification).
- Complétion des qualités du jury sur la page de couverture avec le dossier de soutenance si manquante dans la donnée source
@@ -72,7 +83,7 @@ Journal des modifications
5.3.1
-----
-- [FIX] Donnée : ajout de garde lorsque le mail fourni par les données sources est " "
+- [FIX] Donnée : ajout de garde lorsque le mail fourni par les données sources est ' '
- [FIX] hydration des justificatifs
5.3.0
@@ -85,10 +96,10 @@ Journal des modifications
- Soutenance : Renommange de Parité en Équilibre (et ajustement des couleurs des barres de l'indicateur)
- Soutenance : Retravail du rapport de soutenance (Ajout d'une page blacnhe et d'une troisième page pour les signatures)
- Soutenance : Ajout du dépôt de l'autorisation de soutenance et du rapport de soutenance
-- Soutenance : Dépôt de l'attestation de la formation "Intégrité scientifique"
+- Soutenance : Dépôt de l'attestation de la formation 'Intégrité scientifique'
- Soutenance : Mise en place de l'horodatage
- Soutenance : Ajout d'une étape intermédiaire avant feu vert pour soutenance
-- Soutenance : [Fix] Echappement des caractères " et encapsulation des réponses
+- Soutenance : [Fix] Echappement des caractères ' et encapsulation des réponses
- Dépôt de thèse : un dépôt existant de la version corrigée reste visible même si l'avis de reproduction Apogée revient à Non.
- Menu Dépôt fichiers divers : remonté et affiché sans condition
- Page Dépôt fichiers divers : téléversement bloqué pour PV soutenance, Pré-rapport soutenance, Rapport soutenance
@@ -133,7 +144,7 @@ Journal des modifications
- Suppression du menu 'Mes données' : la modif de l'adresse de contact et du consentement associé est désormais sur la fiche Thèse
- Abandon (avant suppression) de la table obsolète doctorant_compl.
- Ajout d'un bloc dans l'écran de proposition de soutenance pour le téléchargement des pré-rapports et du serment
-- Nouveau document "Serment du docteur"
+- Nouveau document 'Serment du docteur'
- Modification du pv de soutenance
- Ajout d'un nouvel mail intermediare à la clôture des inscriptions + deplacement du mail d'echec d'inscription
- [FIX] Module Formation : Ordonnancement des séances sur les index des formations et des sessions
@@ -198,7 +209,7 @@ Journal des modifications
- Changement de l'assertion pour l'accès des rapporteurs à la proposition de soutenance
- [FIX] Remise en place du menu de dépôt de rapport de pré-soutenance
- Changement du libellé 'Aucun Site' => 'Multi-site' (module de formation)
-- Extension du mail "échec d'inscription" aux personnes non classées (module de formation)
+- Extension du mail 'échec d'inscription' aux personnes non classées (module de formation)
- Changements de libellés.
5.2.1
@@ -225,7 +236,7 @@ Journal des modifications
5.1.1
-----
- [FIX] Corrections suite à l'intégration du nouveau module Fichier.
-- [FIX] Suppression à tort des "attestations" du 1er dépôt à la place de celles du 2nd dépôt.
+- [FIX] Suppression à tort des 'attestations' du 1er dépôt à la place de celles du 2nd dépôt.
- [FIX] Suppression physique de l'ancien fichier lors du changement de logo d'une structure.
- [FIX] Correction et amélioration du calcul du nom de fichier du logo (existant ou nouveau) d'une structure.
- Template de pagination : abandon du module/Application/view/paginator.phtml et généralisation du module/Application/view/application/paginator.phtml
@@ -233,7 +244,7 @@ Journal des modifications
5.1.0
-----
-- Nouveau module "technique" Fichier proposant 2 modes de stockage des fichiers téléversés : Filesystem ou S3
+- Nouveau module 'technique' Fichier proposant 2 modes de stockage des fichiers téléversés : Filesystem ou S3
(cf. [releases notes](./doc/release-notes/v5.1.0.md)).
- [FIX] Correction du chemin de stockage des rapports CSI et de mi-parcours
@@ -311,7 +322,7 @@ Journal des modifications
4.0.4
-----
- Correction de typos dans mail de feu vert de la soutenance
-- Ajout de redirection de mail lorsque certains mails n'ont pas de destinataire "ATTENTION MAIL NON DÉLIVRÉ".
+- Ajout de redirection de mail lorsque certains mails n'ont pas de destinataire 'ATTENTION MAIL NON DÉLIVRÉ'.
- Compléments d'individu : mise en place des éléments de base
- Modification du texte de mail de réussite au doctorat
- [FIX] verification des assertions au niveau des actions de PropositionController
@@ -340,14 +351,14 @@ Journal des modifications
- Migration vers Bootstrap 5 (front-end JS & CSS).
- Réorganisation des infos affichées à propos de la connexion dans le menu principal.
- Cas de la connexion d'un utilisateur sans possibilité de trouver d'individu associé : plus de création automatique d'individu car peut bloquer un import ultétieur.
-- Amélioration de la page "Contact Assistance" en cas d'établissement indéterminé et/ou d'adresse d'assistance indéterminé ou invalide.
-- [FIX] Plantage de la page "Contact Assistance" en cas de connexion avec un compte local.
+- Amélioration de la page 'Contact Assistance' en cas d'établissement indéterminé et/ou d'adresse d'assistance indéterminé ou invalide.
+- [FIX] Plantage de la page 'Contact Assistance' en cas de connexion avec un compte local.
- [FIX] Activation de la mise en cache de la config lorsque le mode development est désactivé.
- [FIX] Lancement de la synchro des thèses pour prendre en compte la création/modification/suppression de substitution de structures.
- Ajout des unités de recherche fermées dans le filtre des thèses
- [FIX] correction du bug lié au typage de retour trop strict de l'entité Structure
- Mise en place de la déclaration de non plagiat dans la proposition de soutenance
-- [FIX] Plantage lors de la création/modification/suppression d'une substitution de structure ("Synchro introuvable avec ce nom : these")
+- [FIX] Plantage lors de la création/modification/suppression d'une substitution de structure ('Synchro introuvable avec ce nom : these')
3.0.12
------
@@ -374,7 +385,7 @@ Journal des modifications
3.0.10
-----
-- Ajout de la mention "La réservation du lieu de soutenance n'est pas faite automatiquement et reste à votre charge"
+- Ajout de la mention 'La réservation du lieu de soutenance n'est pas faite automatiquement et reste à votre charge'
- Meilleure gestion des tokens des membres d'une soutenance
- Déclaration tardive de visoconférence ajouté aux interventions de soutenance
- Avis sur rapport d'activité de fin de thèse
@@ -434,7 +445,7 @@ Journal des modifications
3.0.3
-----
-- Ajout d'une valeur d'état aux soutenances "Validée par l'établissement" post validation d'une soutenance par la présidence de l'établissement
+- Ajout d'une valeur d'état aux soutenances 'Validée par l'établissement' post validation d'une soutenance par la présidence de l'établissement
- [FIX] Plus de demande de justificatif pour la confidentialité si la demande est faite en amont de la soutenance
- [FIX] La notif de validation de la version corrigée par le Président du jury faisait mention à tort du Directeur de thèse.
- [FIX] Plantage de l'export CSV des thèses à cause d'un appel de méthode erroné (getMailContact).
@@ -472,12 +483,12 @@ Journal des modifications
2.2.3
-----
-- Scission du rôle "École doctorale" en 2 : "Responsable École doctorale" et "Gestionnaire École doctorale".
-- Scission du rôle "Unité de recherche" en 2 : "Responsable Unité de recherche" et "Gestionnaire Unité de recherche".
+- Scission du rôle 'École doctorale' en 2 : 'Responsable École doctorale' et 'Gestionnaire École doctorale'.
+- Scission du rôle 'Unité de recherche' en 2 : 'Responsable Unité de recherche' et 'Gestionnaire Unité de recherche'.
- Envoi automatique par mail des jetons d'authentification créés + possibilité de les renvoyer.
- Utilisation des dates et lieux des dossiers de soutenances plutôt que celles saisies dans les SIs pour la génération des documents du module soutenance.
- Précision de la date de rendu des rapports dès le premier mail des rapporteurs
-- Recherche de rapports d'activité : nouveau filtre "Annuel ou fin de thèse".
+- Recherche de rapports d'activité : nouveau filtre 'Annuel ou fin de thèse'.
- Fiche d'identité de la thèse : la date prévisionnelle de soutenance n'est plus affichée car elle peut être erronée.
- Rapports d'activité, CSI, de fin de thèse : la date de bascule pour déterminer l'année universitaire est le 01/11.
- [FIX] Dédoublonnage des origines de financement dans le filtres de la page des rapports.
@@ -495,7 +506,7 @@ Journal des modifications
- [FIX] Ligne de commande de lancement de toutes les synchros.
- [FIX] Correction du texte de la convocation s'attendant à avoir un individu (pas toujours le cas car le lien n'est pas fait systèmatiquement).
- [FIX] La recherche du doctorant lié à un individu doit écarter les individus historisés.
-- [FIX] Warning lors de la génération de la PDC à cause d'un tableau non initialisé"
+- [FIX] Warning lors de la génération de la PDC à cause d'un tableau non initialisé'
2.2.0
-----
@@ -575,8 +586,8 @@ Journal des modifications
- Ajout à l'export de l'annuaire des co-encadrants
- Onglets dans les pages d'information des structures
- Page de connexion scindée par type d'authentification activée.
-- Import du témoin "corrections effectuées" de chaque thèse.
-- Pages de dépôt de la version corrigée : visibles dès lors que le témoin "corrections effectuées" est à Oui.
+- Import du témoin 'corrections effectuées' de chaque thèse.
+- Pages de dépôt de la version corrigée : visibles dès lors que le témoin 'corrections effectuées' est à Oui.
- Amélioration du temps de réponse de la recherche textuelle de thèses.
- Retour du bouton d'import forcé de thèse qui avait disparu à cause d'une erreur de config.
- Mise en retrait des items de menus concernant le dépôt de la version initiale en cas de corrections attendues ou effectuées.
@@ -625,7 +636,7 @@ Journal des modifications
- Ajout d'une configuration pour le fil d'actualité.
- Ajout du champ IdREF pour toutes les structures et modification de l'affichage/saisie des informations.
- Changement de l'affichage des structures fermées dans le filtre des thèses.
-- Nouveau message "Dépôt terminé" au doctorant sur la page Rendez-vous BU.
+- Nouveau message 'Dépôt terminé' au doctorant sur la page Rendez-vous BU.
1.4.8 (01/09/2020)
------------------
@@ -637,15 +648,15 @@ Journal des modifications
------------------
- Lors du dépôt d'une version corrigée, l'autorisation de mise en ligne est reprise texto (dupliquée) du 1er dépôt,
-sauf si l'utilisateur possède le privilège "Saisie du formulaire d'autorisation de diffusion de la version corrigée",
+sauf si l'utilisateur possède le privilège 'Saisie du formulaire d'autorisation de diffusion de la version corrigée',
auquel cas elle est redemandée à l'utilisateur.
-Idem pour les attestations et le privilège "Modification des attestations concernant la version corrigée".
+Idem pour les attestations et le privilège 'Modification des attestations concernant la version corrigée'.
- Masquage du complément de financement dans la fiche d'identité de la thèse
- Optimisation de l'export CSV des thèses
- Pages de téléversement et de recherche des rapports annuels.
- Correction d'un bug dans la recherche de thèses par nom du doctorant.
- Correction d'un bug dans le package Oracle APP_IMPORT qui ne filtrait pas les thèses selon l'établissement spécifié.
-- Possibilité d'attribuer un "identifiant permanent" à un fichier (ex: 'RAPPORT_ANNUEL_MODELE') facilitant l'intégration
+- Possibilité d'attribuer un 'identifiant permanent' à un fichier (ex: 'RAPPORT_ANNUEL_MODELE') facilitant l'intégration
de lien de téléchargement de ce fichier dans une page.
- Listes de diffusion dynamique Sympa alimentées par SyGAL : pages de consultation des listes de diffusion déclarées
dans la config ; une URL pour fournir les abonnés, une autre pour fournir les propriétaires.
@@ -653,16 +664,16 @@ Idem pour les attestations et le privilège "Modification des attestations conce
1.4.6 (29/05/2020)
------------------
-- Ajout du drapeau "établissement d'inscription" et ajout des visualisations et interfaces pour gérer ce nouveau drapeau.
+- Ajout du drapeau 'établissement d'inscription' et ajout des visualisations et interfaces pour gérer ce nouveau drapeau.
- Restriction du filtre des établissements sur la partie annuaire aux établissements d'inscription.
- Ajout dans structures des champs adresse, tel, fax, site web, email qui sont utilisables pour l'édition de document.
- Utilisation des nouveaux champs dans la génération de la convention de MEL (requiert unicaen/app v1.3.19).
- Amélioration de la recherche textuelle de thèses : ajout d'une liste déroulante permettant de sélectionner
- précisément sur quels critères porte la recherche : "Titre de la thèse", "Numéro étudiant de l'auteur",
- "Nom de l'auteur", "Prénom de l'auteur", "Nom du directeur ou co-directeur de thèse",
- "Code national de l'école doctorale concernée (ex: 181)", "Unité de recherche concernée (ex: umr6211)".
-- Correction d'un dysfonctionnement de la recherche textuelle sur les critères "numéro étudiant", "unité de recherche"
- et "école doctorale".
+ précisément sur quels critères porte la recherche : 'Titre de la thèse', 'Numéro étudiant de l'auteur',
+ 'Nom de l'auteur', 'Prénom de l'auteur', 'Nom du directeur ou co-directeur de thèse',
+ 'Code national de l'école doctorale concernée (ex: 181)', 'Unité de recherche concernée (ex: umr6211)'.
+- Correction d'un dysfonctionnement de la recherche textuelle sur les critères 'numéro étudiant', 'unité de recherche'
+ et 'école doctorale'.
1.4.5 (08/04/2020)
@@ -691,7 +702,7 @@ Idem pour les attestations et le privilège "Modification des attestations conce
- Extraction CSV des thèses : nouvelles colonnes concernant l'embargo et refus de diffusion ;
virgule plutôt que point dans la durée de la thèse.
- Page d'accueil : affichage des actualités issues du flux RSS fourni par la COMUE.
-- Filtrage de la liste des thèses : correction de l'affichage du filtre "Unité de recherche".
+- Filtrage de la liste des thèses : correction de l'affichage du filtre 'Unité de recherche'.
- Corrections de textes sur la page RDV BU.
@@ -711,8 +722,8 @@ Idem pour les attestations et le privilège "Modification des attestations conce
- Modification des textes liés à l'autorisation de diffusion dans le formulaire et dans la convention PDF générée.
- Convention de MEL : suppression du petit logo dans l'entête puisqu'il y en a déjà un sous le titre
- Nouvelle charte de diffusion téléchargeable.
-- Ajout du flag "fermé" pour les structures et utilisations dans la recherche de thèses.
-- Ajout d'un champ "Id HAL" dans le formulaire d'autorisation de diffusion.
+- Ajout du flag 'fermé' pour les structures et utilisations dans la recherche de thèses.
+- Ajout d'un champ 'Id HAL' dans le formulaire d'autorisation de diffusion.
- Ajout d'un menu dépôt pour séparer les action liés au dépôt de la partie annuaire
- La couverture est maintenant recto/verso lorsque la premiere page n'est pas retirée
- Ajout de la colonne durée des thèses dans l'export
@@ -752,7 +763,7 @@ Idem pour les attestations et le privilège "Modification des attestations conce
- Convention de mise en ligne :
- Le libellé du tribunal compétent mentionné est importé de chaque établissement.
- - Utilisation de la mention générique "Le chef d'établissement" plutôt que d'exploiter les libellés
+ - Utilisation de la mention générique 'Le chef d'établissement' plutôt que d'exploiter les libellés
importés des établissements.
- Nouvelle ligne de commande pour importer une thèse à la demande.
@@ -763,7 +774,7 @@ Idem pour les attestations et le privilège "Modification des attestations conce
- Améliorations pour utiliser moins de mémoire ; meilleurs logs.
- Correction des exceptions de type `ORA-00001: unique constraint (SYGAL.TMP_ACTEUR_UNIQ) violated`
par un changement de stratégie côté web service (interrogation de tables plutôt que des vues).
-- Le bouton d'import d'une thèse à la demande avait disparu (menu "Page de couverture") à cause d'une config erronée.
+- Le bouton d'import d'une thèse à la demande avait disparu (menu 'Page de couverture') à cause d'une config erronée.
1.2.11 (13/11/2019)
------------------
@@ -782,7 +793,7 @@ Idem pour les attestations et le privilège "Modification des attestations conce
### Ajout
- Un message avertissant des formats d'image valide est maintenant ajouté dans les pages de modification des structures concertes
-- Utilisation de convert (imagemagick) pour convertir les logos "automatiquement" au format png
+- Utilisation de convert (imagemagick) pour convertir les logos 'automatiquement' au format png
1.2.9 (24/10/2019)
------------------
@@ -852,19 +863,19 @@ Idem pour les attestations et le privilège "Modification des attestations conce
### Ajout
-- Nouvelle page consacrée au dépôt de fichiers divers liés à une thèse (précédemment dans la page "Thèse").
-- Possibilité de déposer des fichiers dits "communs" utiles aux gestionnaires, ex: modèle d'avenant à la convention
+- Nouvelle page consacrée au dépôt de fichiers divers liés à une thèse (précédemment dans la page 'Thèse').
+- Possibilité de déposer des fichiers dits 'communs' utiles aux gestionnaires, ex: modèle d'avenant à la convention
de mise en ligne.
### Améliorations
-- Améliorations de la page "Privilèges", notamment le filtrage par rôle.
+- Améliorations de la page 'Privilèges', notamment le filtrage par rôle.
- Déplacement des privilèges de la catégorie `fichier-divers` vers la catégorie `these`
car ils concernent des fichiers liés à une thèse (ex: PV de soutenance).
La catégorie `fichier-divers` désigne désormais les privilèges concernant des fichiers sans lien aux
thèses (ex: fichiers déposés pour les pages d'informations).
- Refonte technique de la gestion des fichiers liés aux pages d'informations, prélable au travail sur les droits de
- dépôt de fichiers "divers" et "communs".
+ dépôt de fichiers 'divers' et 'communs'.
1.2.0 (10/07/2019)
diff --git a/doc/release-notes/v6.0.6.md b/doc/release-notes/v6.0.6.md
index 54a7f04a8f547f196f56d3703a3a908540bdec43..ba1620098ea9504dc6fdf138beeb498081b5da37 100644
--- a/doc/release-notes/v6.0.6.md
+++ b/doc/release-notes/v6.0.6.md
@@ -1,4 +1,4 @@
-# Version 6.0.5
+# Version 6.0.6
## 1. Sur le serveur d'application
@@ -8,7 +8,7 @@
pour installer la nouvelle version :
```bash
-git fetch --tags && git checkout --force 6.0.5 && bash ./install.sh
+git fetch --tags && git checkout --force 6.0.6 && bash ./install.sh
```
- Rechargez le moteur PHP, exemple :
@@ -20,6 +20,9 @@ systemctl reload php8.0-fpm
## 2. Dans la base de données
```postgresql
+alter table structure
+ alter column type_structure_id set not null;
+
-- INSERTION DE NOUVELLES MACROS --
INSERT INTO unicaen_renderer_macro (code, description, variable_name, methode_name) VALUES ('Acteur#Denomination', '<p>Retourne la dénomination de l''acteur sous la forme - Prénom Nom -</p>', 'acteur', 'getDenomination');
INSERT INTO unicaen_renderer_macro (code, description, variable_name, methode_name) VALUES ('Acteur#Etablissement', '<p>Retourne le libellé de l''établissement du co-encadrant</p>', 'acteur', 'getEtablissementAsLibelle');
@@ -28,5 +31,213 @@ INSERT INTO unicaen_renderer_macro (code, description, variable_name, methode_na
INSERT INTO unicaen_renderer_template (code, description, document_type, document_sujet, document_corps, document_css, namespace) VALUES ('COENCADREMENTS_JUSTIFICATIF', null, 'pdf', 'Justificatif de co-encadrements de VAR[Acteur#Denomination]', e'<h1>Justificatif de co-encadrements</h1>
<p>Ce document certifie que VAR[Acteur#Denomination], actuellement VAR[Acteur#Qualite] à VAR[Acteur#Etablissement], a assuré la fonction de co-encadrant sur pour les thèses suivantes :<br />###LISTING_THESE###</p>', null, 'These\Provider\Template');
+--
+-- Nouvelle vue pour l'extraction CSV des thèses.
+--
+drop view if exists v_extract_theses;
+create or replace view v_extract_theses as
+ with mails_contacts as (
+ select distinct individu_id,
+ first_value(email) over (partition by individu_id order by id desc) email
+ from mail_confirmation
+ where etat = 'C'/*confirmé*/
+ ), directeurs as (
+ select these_id,
+ string_agg(concat(i.nom_usuel, ' ', i.prenom1), ' ; ') identites
+ from acteur a
+ join role r on a.role_id = r.id and r.code = 'D'
+ join individu i on a.individu_id = i.id
+ where a.histo_destruction is null
+ group by these_id
+ ), codirecteurs as (
+ select these_id,
+ string_agg(concat(i.nom_usuel, ' ', i.prenom1), ' ; ') identites
+ from acteur a
+ join role r on a.role_id = r.id and r.code in ('C','K')
+ join individu i on a.individu_id = i.id
+ where a.histo_destruction is null
+ group by these_id
+ ), coencadrants as (
+ select these_id,
+ string_agg(concat(i.nom_usuel, ' ', i.prenom1), ' ; ') identites
+ from acteur a
+ join role r on a.role_id = r.id and r.code in ('B','N')
+ join individu i on a.individu_id = i.id
+ where a.histo_destruction is null
+ group by these_id
+ ), financements as (
+ select these_id,
+ string_agg(case o.visible when true then 'O' else 'N' end, ' ; ') financ_origs_visibles,
+ string_agg(f.annee::varchar, ' ; ') financ_annees,
+ string_agg(o.libelle_long, ' ; ') financ_origs,
+ string_agg(f.complement_financement, ' ; ') financ_compls,
+ string_agg(f.libelle_type_financement, ' ; ') financ_types
+ from financement f
+ join origine_financement o on f.origine_financement_id = o.id
+ where f.histo_destruction is null
+ group by these_id
+ ), domaines as (
+ select unite_id,
+ string_agg(d.libelle, ' ; ') libelles
+ from unite_domaine_linker udl
+ join domaine_scientifique d on d.id = udl.domaine_id
+ group by unite_id
+ ), depots_vo_pdf as (
+ select distinct these_id,
+ first_value(vf.code) over (partition by these_id order by ft.id desc) version_code,
+ first_value(f.histo_creation) over (partition by these_id order by ft.id desc) histo_creation
+ from fichier_these ft
+ join fichier f on ft.fichier_id = f.id and f.histo_destruction is null
+ join nature_fichier nf on f.nature_id = nf.id and nf.code = 'THESE_PDF'
+ join version_fichier vf on f.version_fichier_id = vf.id and vf.code = 'VO'
+ ), depots_voc_pdf as (
+ select distinct these_id,
+ first_value(vf.code) over (partition by these_id order by ft.id desc) version_code,
+ first_value(f.histo_creation) over (partition by these_id order by ft.id desc) histo_creation
+ from fichier_these ft
+ join fichier f on ft.fichier_id = f.id and f.histo_destruction is null
+ join nature_fichier nf on f.nature_id = nf.id and nf.code = 'THESE_PDF'
+ join version_fichier vf on f.version_fichier_id = vf.id and vf.code = 'VOC'
+ ), depots_non_pdf as (
+ select distinct these_id,
+ first_value(vf.code) over (partition by these_id order by ft.id desc) version_code,
+ first_value(f.histo_creation) over (partition by these_id order by ft.id desc) histo_creation
+ from fichier_these ft
+ join fichier f on ft.fichier_id = f.id and f.histo_destruction is null
+ join nature_fichier nf on f.nature_id = nf.id and nf.code = 'FICHIER_NON_PDF'
+ join version_fichier vf on f.version_fichier_id = vf.id and vf.code in ('VO', 'VOC')
+ ), diffusion as (
+ select distinct these_id,
+ first_value(autoris_mel) over (partition by these_id order by version_corrigee desc, id desc) autoris_mel,
+ first_value(autoris_embargo_duree) over (partition by these_id order by version_corrigee desc, id desc) autoris_embargo_duree,
+ first_value(autoris_motif) over (partition by these_id order by version_corrigee desc, id desc) autoris_motif
+ from diffusion d
+ where histo_destruction is null
+ ), dernier_rapport_activite as (
+ select distinct these_id,
+ first_value(annee_univ) over (partition by these_id order by annee_univ desc) annee
+ from rapport_activite ra
+ where ra.histo_destruction is null
+ ), dernier_rapport_csi as (
+ select distinct these_id,
+ first_value(annee_univ) over (partition by these_id order by annee_univ desc) annee
+ from rapport r
+ join type_rapport tr on r.type_rapport_id = tr.id and tr.code = 'RAPPORT_CSI'
+ where r.histo_destruction is null
+ )
+ select to_char(current_timestamp,'DD/MM/YYYY HH24:MI:SS') date_extraction,
+ th.id,
+ di.civilite,
+ di.nom_usuel,
+ di.nom_patronymique,
+ di.prenom1,
+ to_char(di.date_naissance,'DD/MM/YYYY') date_naissance,
+ di.nationalite,
+ coalesce(dic.email, di.email) email_pro,
+ mc.email email_contact,
+ d.ine,
+ substr(d.source_code, strpos(d.source_code, '::') + 2) num_etudiant,
+ th.source_code num_these,
+ th.titre,
+ th.code_sise_disc,
+ th.lib_disc,
+ dirs.identites dirs,
+ codirs.identites codirs,
+ coencs.identites coencs,
+ coalesce(se2.libelle, se.libelle) etab_lib,
+ coalesce(sed2.code, sed.code) ed_code,
+ coalesce(sed2.libelle, sed.libelle) ed_lib,
+ coalesce(sur2.code, sur.code) ur_code,
+ coalesce(sur2.libelle, sur.libelle) ur_lib,
+ th.lib_etab_cotut,
+ th.lib_pays_cotut,
+ ta.libelle_titre_acces,
+ ta.libelle_etb_titre_acces,
+ f.financ_origs_visibles,
+ f.financ_annees,
+ f.financ_origs,
+ f.financ_compls,
+ f.financ_types,
+ dom.libelles domaines,
+ to_char(th.date_prem_insc,'DD/MM/YYYY') date_prem_insc, to_char(th.date_abandon,'DD/MM/YYYY') date_abandon,
+ to_char(th.date_transfert,'DD/MM/YYYY') date_transfert, to_char(th.date_prev_soutenance,'DD/MM/YYYY') date_prev_soutenance,
+ to_char(th.date_soutenance,'DD/MM/YYYY') date_soutenance, to_char(th.date_fin_confid,'DD/MM/YYYY') date_fin_confid,
+ round((th.date_soutenance::date - th.date_prem_insc::date) / 30.5, 2) duree_these_mois,
+ to_char(depots_vo_pdf.histo_creation,'DD/MM/YYYY') date_depot_vo,
+ to_char(depots_voc_pdf.histo_creation,'DD/MM/YYYY') date_depot_voc,
+ case th.etat_these when 'E' then 'En cours' when 'A' then 'Abandonnée' when 'S' then 'Soutenue' when 'U' then 'Transférée' end etat_these,
+ th.soutenance_autoris,
+ case when th.date_fin_confid is null or th.date_fin_confid < current_timestamp then 'N' else 'O' end confidentielle,
+ th.resultat,
+ case when th.correc_autorisee_forcee = 'aucune' then 'N' else coalesce(th.correc_autorisee_forcee, th.correc_autorisee) end correc_autorisee,
+ case when depots_vo_pdf.these_id is null and depots_voc_pdf.these_id is null then 'N' else 'O' end depot_pdf,
+ case when depots_non_pdf.these_id is null then 'N' else 'O' end depot_annexe,
+ case diff.autoris_mel when 0 then 'Non' when 1 then 'Oui, avec embargo' when 2 then 'Oui, immédiatement' end autoris_mel,
+ diff.autoris_embargo_duree,
+ diff.autoris_motif,
+ case when ract.annee is not null then concat(ract.annee,'/',ract.annee+1) else null end dernier_rapport_activite,
+ case when rcsi.annee is not null then concat(rcsi.annee,'/',rcsi.annee+1) else null end dernier_rapport_csi
+ from these th
+ join doctorant d on th.doctorant_id = d.id
+ join individu di on d.individu_id = di.id
+ left join individu_compl dic on di.id = dic.individu_id and dic.histo_destruction is null
+ left join mails_contacts mc on mc.individu_id = di.id
+ join etablissement e on d.etablissement_id = e.id
+ join structure se on e.structure_id = se.id
+ left join structure_substit ses on se.id = ses.from_structure_id and ses.histo_destruction is null
+ left join structure se2 on se2.id = ses.to_structure_id
+ left join ecole_doct ed on th.ecole_doct_id = ed.id
+ left join structure sed on ed.structure_id = sed.id
+ left join structure_substit seds on sed.id = seds.from_structure_id and seds.histo_destruction is null
+ left join structure sed2 on sed2.id = seds.to_structure_id
+ left join unite_rech ur on th.unite_rech_id = ur.id
+ left join structure sur on ur.structure_id = sur.id
+ left join structure_substit surs on sur.id = surs.from_structure_id and surs.histo_destruction is null
+ left join structure sur2 on sur2.id = surs.to_structure_id
+ left join domaines dom on dom.unite_id = ur.id
+ left join titre_acces ta on th.id = ta.these_id and ta.histo_destruction is null
+ left join financements f on th.id = f.these_id
+ left join directeurs dirs on dirs.these_id = th.id
+ left join codirecteurs codirs on codirs.these_id = th.id
+ left join coencadrants coencs on coencs.these_id = th.id
+ left join depots_vo_pdf on depots_vo_pdf.these_id = th.id
+ left join depots_voc_pdf on depots_voc_pdf.these_id = th.id
+ left join depots_non_pdf on depots_non_pdf.these_id = th.id
+ left join diffusion diff on diff.these_id = th.id
+ left join dernier_rapport_activite ract on ract.these_id = th.id
+ left join dernier_rapport_csi rcsi on rcsi.these_id = th.id
+ where th.histo_destruction is null
+;
+
+
+create or replace function transfert_these(fromtheseid bigint, totheseid bigint) returns void
+ language plpgsql
+as
+$$
+BEGIN
+ -- select 'update '||rpad(table_name, 35)||' set '||column_name||' = totheseid where '||column_name||' = fromtheseid ;' from information_schema.columns
+-- where column_name ilike 'these_id' and
+-- table_name not ilike 'v\_%' and
+-- table_name not ilike 'src_%' and
+-- table_name not ilike 'tmp_%' and
+-- lower(table_name) not in ('acteur', 'financement', 'these_annee_univ', 'titre_acces', 'step_star_log');
+
+ --update soutenance_proposition set histo_destruction = now(), histo_destructeur_id = 1 where these_id = totheseid ;
+
+ update attestation set these_id = totheseid where these_id = fromtheseid ;
+ update diffusion set these_id = totheseid where these_id = fromtheseid ;
+ update fichier_these set these_id = totheseid where these_id = fromtheseid ;
+ update metadonnee_these set these_id = totheseid where these_id = fromtheseid ;
+ update rapport set these_id = totheseid where these_id = fromtheseid ;
+ update rdv_bu set these_id = totheseid where these_id = fromtheseid ;
+ update soutenance_intervention set these_id = totheseid where these_id = fromtheseid ;
+ update soutenance_proposition set these_id = totheseid where these_id = fromtheseid ;
+ update validation set these_id = totheseid where these_id = fromtheseid ;
+ update csi_membre set these_id = totheseid where these_id = fromtheseid ;
+ update rapport_activite set these_id = totheseid where these_id = fromtheseid ;
+
+ refresh materialized view mv_recherche_these;
+END;
+$$;
```
\ No newline at end of file
diff --git a/module/Application/config/others/export.config.php b/module/Application/config/others/export.config.php
index c06e427a15cac3fbe2e60520667f3d4304669dde..f73e85dac79e9812ffa6f7a5421e6eba93a2bb63 100755
--- a/module/Application/config/others/export.config.php
+++ b/module/Application/config/others/export.config.php
@@ -1,5 +1,6 @@
<?php
+use Application\Controller\ExportController;
use Application\Controller\Factory\ExportControllerFactory;
use These\Provider\Privilege\ThesePrivileges;
use UnicaenAuth\Guard\PrivilegeController;
@@ -9,7 +10,7 @@ return [
'guards' => [
PrivilegeController::class => [
[
- 'controller' => 'Application\Controller\Export',
+ 'controller' => ExportController::class,
'action' => [
'csv',
],
@@ -25,8 +26,7 @@ return [
'options' => [
'route' => '/export',
'defaults' => [
- '__NAMESPACE__' => 'Application\Controller',
- 'controller' => 'Export',
+ 'controller' => ExportController::class,
],
],
'may_terminate' => false,
@@ -36,6 +36,7 @@ return [
'options' => [
'route' => '/csv',
'defaults' => [
+ /** @see ExportController::csvAction() */
'action' => 'csv',
],
],
@@ -51,7 +52,7 @@ return [
],
'controllers' => [
'factories' => [
- 'Application\Controller\Export' => ExportControllerFactory::class,
+ ExportController::class => ExportControllerFactory::class,
],
],
];
\ No newline at end of file
diff --git a/module/Application/src/Application/Assertion/Rapport/RapportPageAssertion.php b/module/Application/src/Application/Assertion/Rapport/RapportPageAssertion.php
index 9aa0b7aeb383bd8065eb6ceb2c67ae9fff4748cc..04d73f230617cee8407d65130838149e33a149dc 100644
--- a/module/Application/src/Application/Assertion/Rapport/RapportPageAssertion.php
+++ b/module/Application/src/Application/Assertion/Rapport/RapportPageAssertion.php
@@ -57,7 +57,7 @@ class RapportPageAssertion implements PageAssertionInterface, UserContextService
$role = $this->userContextService->getSelectedIdentityRole();
// rôle doctorant
- if ($role->isDoctorant()) {
+ if ($role && $role->isDoctorant()) {
$doctorant = $this->userContextService->getIdentityDoctorant();
$this->assertTrue(
$this->these->getDoctorant()->getId() === $doctorant->getId(),
diff --git a/module/Application/src/Application/Controller/ExportController.php b/module/Application/src/Application/Controller/ExportController.php
index c64e7510f9dad9e0c73668afbfdad356ebe31375..da03865ef8a952d3f3e596505742aa87fb6f2639 100644
--- a/module/Application/src/Application/Controller/ExportController.php
+++ b/module/Application/src/Application/Controller/ExportController.php
@@ -2,16 +2,14 @@
namespace Application\Controller;
-use These\Entity\Db\Acteur;
-use Application\Entity\Db\Financement;
-use Application\Entity\Db\Role;
-use These\Entity\Db\These;
+use Application\Entity\Db\OrigineFinancement;
use Application\Provider\Privilege\FinancementPrivileges;
+use Application\SourceCodeStringHelperAwareTrait;
use Depot\Service\FichierThese\FichierTheseServiceAwareTrait;
+use Doctrine\DBAL\Exception;
+use RuntimeException;
use These\Service\These\TheseSearchServiceAwareTrait;
use These\Service\These\TheseServiceAwareTrait;
-use Application\SourceCodeStringHelperAwareTrait;
-use UnicaenApp\Exception\LogicException;
use UnicaenApp\View\Model\CsvModel;
class ExportController extends AbstractController
@@ -21,144 +19,90 @@ class ExportController extends AbstractController
use FichierTheseServiceAwareTrait;
use SourceCodeStringHelperAwareTrait;
- public function csvAction()
+ public function csvAction(): CsvModel
{
+ $originesFinancementsFilter = function ($r) {
+ if (empty($r['financ_origs'])) {
+ return null;
+ }
+ // certaines origines ne sont pas visibles par tout le monde (ex : handicap)
+ $origines = array_map('trim', explode(';', $r['financ_origs']));
+ $visibles = array_map('trim', explode(';', $r['financ_origs_visibles']));
+ $filteredOrigines = [];
+ foreach ($origines as $i => $orig) {
+ $isVisible = ['O'=>true,'N'=>false][$visibles[$i]];
+ if ($isVisible || $this->isAllowed(new OrigineFinancement(), FinancementPrivileges::FINANCEMENT_VOIR_ORIGINE_NON_VISIBLE)) {
+ $filteredOrigines[] = $orig;
+ }
+ }
+ return implode(" ; ", $filteredOrigines);
+ };
+
$headers = [
+ 'id' => fn($r) => $r['id'],
// Doctorant
- 'Civilité' => function ($variables) { return $variables['doctorant']->getIndividu()->getCivilite(); },
- 'Nom usuel' => function ($variables) { return $variables['doctorant']->getIndividu()->getNomUsuel(); },
- 'Prenom' => function ($variables) { return $variables['doctorant']->getIndividu()->getPrenom(); },
- 'Nom patronymique' => function ($variables) { return $variables['doctorant']->getIndividu()->getNomPatronymique(); },
- 'Date de naissance' => function ($variables) { return $variables['doctorant']->getIndividu()->getDateNaissance(); },
- 'Nationalité' => function ($variables) { return $variables['doctorant']->getIndividu()->getNationalite(); },
- 'Adresse électronique' => function ($variables) { return $variables['doctorant']->getIndividu()->getEmailPro(); },
- 'Adresse électronique personnelle' => function ($variables) { return $variables['doctorant']->getIndividu()->getEmailContact(); },
- 'Numéro étudiant' => function ($variables) { return $this->sourceCodeStringHelper->removePrefixFrom($variables['doctorant']->getSourceCode()); },
- 'I.N.E.' => function ($variables) { return $variables['doctorant']->getIne(); },
+ 'Civilité' => fn($r) => $r['civilite'],
+ 'Nom usuel' => fn($r) => $r['nom_usuel'],
+ 'Prenom' => fn($r) => $r['prenom1'],
+ 'Nom patronymique' => fn($r) => $r['nom_patronymique'],
+ 'Date de naissance' => fn($r) => $r['date_naissance'],
+ 'Nationalité' => fn($r) => $r['nationalite'],
+ 'Adresse électronique' => fn($r) => $r['email_pro'],
+ 'Adresse électronique personnelle' => fn($r) => $r['email_contact'],
+ 'Numéro étudiant' => fn($r) => $r['num_etudiant'],
+ 'I.N.E.' => fn($r) => $r['ine'],
//These
- 'Identifiant de la thèse' => function ($variables) { return $variables['these']->getSourceCode(); },
- 'Titre' => function ($variables) { return $variables['these']->getTitre(); },
- 'Discipline' => function ($variables) { return $variables['these']->getLibelleDiscipline(); },
+ 'Identifiant de la thèse' => fn($r) => $r['num_these'],
+ 'Titre' => fn($r) => $r['titre'],
+ 'Discipline Code SISE' => fn($r) => $r['code_sise_disc'],
+ 'Discipline' => fn($r) => $r['lib_disc'],
//Encadrements
- 'Directeurs' => function ($variables) {
- $directeurs = $variables['directeurs'];
- $noms = [];
- /** @var Acteur $directeur */
- foreach ($directeurs as $directeur) $noms[] = $directeur->getIndividu()->getNomComplet();
- return implode(",", $noms);
- },
- 'Co-directeurs' => function ($variables) {
- $directeurs = $variables['co-directeurs'];
- $noms = [];
- /** @var Acteur $directeur */
- foreach ($directeurs as $directeur) $noms[] = $directeur->getIndividu()->getNomComplet();
- return implode(",", $noms);
- },
- 'Co-encadrants' => function ($variables) {
- $acteurs = $variables['co-encadrants'];
- $noms = [];
- /** @var Acteur $acteurs */
- foreach ($acteurs as $directeur) $noms[] = $directeur->getIndividu()->getNomComplet();
- return implode(",", $noms);
- },
+ 'Directeurs' => fn($r) => $r['dirs'],
+ 'Co-directeurs' => fn($r) => $r['codirs'],
+ 'Co-encadrants' => fn($r) => $r['coencs'],
//Structures
- 'Etablissement' => function ($variables) { return $variables['etablissement']->getStructure()->getLibelle(); },
- 'Ecole Doctorale Code' => function ($variables) { return ($variables['ecole doctorale'])?$variables['ecole doctorale']->getStructure()->getCode():null; },
- 'Ecole Doctorale' => function ($variables) { return ($variables['ecole doctorale'])?$variables['ecole doctorale']->getStructure()->getLibelle():null; },
- 'Unité de Recherche Code' => function ($variables) { return ($variables['unite de recherche'])?$variables['unite de recherche']->getStructure()->getCode():null; },
- 'Unité de Recherche' => function ($variables) { return ($variables['unite de recherche'])?$variables['unite de recherche']->getStructure()->getLibelle():null; },
- 'Etablissement Co-Tutelle' => function ($variables) { return $variables['these']->getLibelleEtabCotutelle(); },
- 'Pays Co-Tutelle' => function ($variables) { return $variables['these']->getLibellePaysCotutelle(); },
+ 'Etablissement' => fn($r) => $r['etab_lib'],
+ 'Ecole Doctorale Code' => fn($r) => $r['ed_code'],
+ 'Ecole Doctorale' => fn($r) => $r['ed_lib'],
+ 'Unité de Recherche Code' => fn($r) => $r['ur_code'],
+ 'Unité de Recherche' => fn($r) => $r['ur_lib'],
+ 'Etablissement Co-Tutelle' => fn($r) => $r['lib_etab_cotut'],
+ 'Pays Co-Tutelle' => fn($r) => $r['lib_pays_cotut'],
//accession
- 'Diplôme d\'accession à la thèse' => function ($variables) { return ($variables['these']->getTitreAcces())?$variables['these']->getTitreAcces()->getLibelleTitreAcces():null; },
- 'Établissement d\'accession à la thèse' => function ($variables) { return ($variables['these']->getTitreAcces())?$variables['these']->getTitreAcces()->getLibelleEtabTitreAcces():null; },
+ "Diplôme d'accession à la thèse" => fn($r) => $r['libelle_titre_acces'],
+ "Établissement d'accession à la thèse" => fn($r) => $r['libelle_etb_titre_acces'],
//Financements
- 'Origines du financement' => function ($variables) {
- $these = $variables['these'];
- $financements = $these->getFinancements();
- $origines = [];
- /** @var Financement $financement */
- foreach ($financements as $financement) {
- $origine = $financement->getOrigineFinancement();
- if ($origine->isVisible() || $this->isAllowed($origine, FinancementPrivileges::FINANCEMENT_VOIR_ORIGINE_NON_VISIBLE)) {
- $origines[] = $origine->getLibelleLong();
- }
- }
- return implode(",", $origines);
- },
- 'Complément sur les financements' => function ($variables) {
- $these = $variables['these'];
- $financements = $these->getFinancements();
- $origines = [];
- /** @var Financement $financement */
- foreach ($financements as $financement) $origines[] = ($financement->getComplementFinancement())?:" - ";
- return implode(",", $origines);
- },
- 'Type du financement' => function ($variables) {
- $these = $variables['these'];
- $financements = $these->getFinancements();
- $types = [];
- /** @var Financement $financement */
- foreach ($financements as $financement) $types[] = $financement->getLibelleTypeFinancement();
- return implode(",", array_filter($types));
- },
+ 'Années financées' => fn($r) => $r['financ_annees'],
+ 'Origines du financement' => $originesFinancementsFilter,
+ 'Complément sur les financements' => fn($r) => $r['financ_compls'],
+ 'Type du financement' => fn($r) => $r['financ_types'],
//Domaine
- 'Domaines scientifiques' => function ($variables) {
- $unite = $variables['unite de recherche'];
- $domaines = ($unite)?$unite->getDomaines():[];
- $liste = [];
- /** @var Financement $financement */
- foreach ($domaines as $domaine) $liste[] = $domaine->getLibelle();
- return implode(",", $liste);
- },
+ 'Domaines scientifiques' => fn($r) => $r['domaines'],
//Dates
- 'Date de première inscription' => function ($variables) { return $variables['these']->getDatePremiereInscription(); },
- "Date d'abandon" => function ($variables) { return $variables['these']->getDateAbandon(); },
- 'Date de transfert' => function ($variables) { return $variables['these']->getDateTransfert(); },
- 'Date de prévisionnel de soutenance' => function ($variables) { return $variables['these']->getDatePrevisionSoutenance(); },
- 'Date de soutenance' => function ($variables) { return $variables['these']->getDateSoutenance(); },
- 'Date de fin de confientialité' => function ($variables) { return $variables['these']->getDateFinConfidentialite(); },
- 'Date de dépôt version initiale' => function ($variables) { return ($variables['version_initiale'])?$variables['version_initiale']->getFichier()->getHistoCreation()->format('d/m/Y'):"";},
- 'Date de dépôt version corigée' => function ($variables) { return ($variables['version_corrigee'])?$variables['version_corrigee']->getFichier()->getHistoCreation()->format('d/m/Y'):"";},
- 'Durée en mois de la thèse' => function ($variables) { try { return number_format($variables['these']->getDureeThese(), 2, ',', ''); } catch (LogicException $e) { return ""; } },
+ 'Date de première inscription' => fn($r) => $r['date_prem_insc'],
+ "Date d'abandon" => fn($r) => $r['date_abandon'],
+ 'Date de transfert' => fn($r) => $r['date_transfert'],
+ 'Date de prévisionnel de soutenance' => fn($r) => $r['date_prev_soutenance'],
+ 'Date de soutenance' => fn($r) => $r['date_soutenance'],
+ 'Date de fin de confientialité' => fn($r) => $r['date_fin_confid'],
+ 'Date de dépôt version initiale' => fn($r) => $r['date_depot_vo'],
+ 'Date de dépôt version corrigée' => fn($r) => $r['date_depot_voc'],
+ 'Durée en mois de la thèse' => fn($r) => $r['duree_these_mois'],
//Flags
- 'Etat de la thèse' => function ($variables) { return $variables['these']->getEtatTheseToString();},
- 'Autorisation à soutenir' => function ($variables) { return $variables['these']->getSoutenanceAutorisee();},
- 'Est confidentielle' => function ($variables) { $now = new \DateTime(); $end= $variables['these']->getDateFinConfidentialite(); if ($now > $end) return "N"; else return "O"; },
- 'Résultat' => function ($variables) { return $variables['these']->getResultat();},
- 'Corrections' => function ($variables) { return $variables['these']->getCorrectionAutorisee();},
- 'Thèse format PDF' => function ($variables) { return $variables['version_initiale']?'O':'N'; },
- 'Annexe non PDF' => function ($variables) { return $variables['annexe']?'O':'N'; },
-//
- //Embargo et refus de diffusion
- 'Embargo' => function ($variables) {
- $these = $variables['these'];
- $versionInitiale = $variables['version_initiale'];
- $versionCorrigee = $variables['version_corrigee'];
- if ($versionCorrigee !== null) {
- $diffusionCorrigee = $these->getDiffusionForVersion($versionCorrigee->getFichier()->getVersion());
- if ($diffusionCorrigee !== null) return $diffusionCorrigee->getAutorisEmbargoDuree();
- }
- if ($versionInitiale !== null) {
- $diffusionInitiale = $these->getDiffusionForVersion($versionInitiale->getFichier()->getVersion());
- if ($diffusionInitiale !== null) return $diffusionInitiale->getAutorisEmbargoDuree();
- }
- return null;
- },
- 'Refus de diffusion' => function ($variables) {
- $these = $variables['these'];
- $versionInitiale = $variables['version_initiale'];
- $versionCorrigee = $variables['version_corrigee']->getVersion;
- if ($versionCorrigee !== null) {
- $diffusionCorrigee = $these->getDiffusionForVersion($versionCorrigee->getFichier()->getVersion());
- if ($diffusionCorrigee !== null) return $diffusionCorrigee->getAutorisMotif();
- }
- if ($versionInitiale !== null) {
- $diffusionInitiale = $these->getDiffusionForVersion($versionInitiale->getFichier()->getVersion());
- if ($diffusionInitiale !== null) return $diffusionInitiale->getAutorisMotif();
- }
- return null;
- },
+ 'Etat de la thèse' => fn($r) => $r['etat_these'],
+ 'Autorisation à soutenir' => fn($r) => $r['soutenance_autoris'],
+ 'Est confidentielle' => fn($r) => $r['confidentielle'],
+ 'Résultat' => fn($r) => $r['resultat'],
+ 'Corrections' => fn($r) => $r['correc_autorisee'],
+ 'Thèse format PDF' => fn($r) => $r['depot_pdf'],
+ 'Annexe non PDF' => fn($r) => $r['depot_annexe'],
+ //Diffusion
+ 'Autorisation de MEL' => fn($r) => $r['autoris_mel'],
+ 'Embargo' => fn($r) => $r['autoris_embargo_duree'],
+ 'Refus de diffusion' => fn($r) => $r['autoris_motif'],
+ //Rapports
+ "Dernier rapport d'activité" => fn($r) => $r['dernier_rapport_activite'],
+ "Dernier rapport CSI" => fn($r) => $r['dernier_rapport_csi'],
];
$queryParams = $this->params()->fromQuery();
@@ -166,37 +110,40 @@ class ExportController extends AbstractController
$this->theseSearchService->init();
$this->theseSearchService->processQueryParams($queryParams);
$qb = $this->theseSearchService->getQueryBuilder();
- $theses = $qb->getQuery()->getResult();
+ $qb->select('these'); // pas besoin de tout sélectionner, seuls les ids nous intéressent
+ $theses = $qb->getQuery()->getArrayResult();
+ $thesesIds = array_map(fn(array $t) => $t['id'], $theses); // extraction des 'id'
+
+ // on fragmente la liste des id pour éviter de dépasser le nombre maxi de termes autorisés dans un IN()
+ $wheres = array_map(
+ fn(string $ids) => "id in ($ids)",
+ array_map(
+ fn(array $ids) => implode(',', $ids),
+ array_chunk($thesesIds, 3000)
+ )
+ );
+ $sql = sprintf('select * from v_extract_theses where %s', implode(' or ', $wheres));
+ try {
+ $records = $qb->getEntityManager()->getConnection()->executeQuery($sql)->fetchAllAssociative();
+ } catch (Exception $e) {
+ throw new RuntimeException("Erreur rencontrée lors de l'exécution de la requête SQL", null, $e);
+ }
- $records = [];
- for ($i = 0 ; $i < count($theses) ; $i++) {
- /** @var These $these */
- $these = $theses[$i];
- $record = [];
- foreach($headers as $key => $fct) {
- $variables = [
- 'these' => $these,
- 'doctorant' => $these->getDoctorant(),
- 'directeurs' => $these->getActeursByRoleCode(Role::CODE_DIRECTEUR_THESE),
- 'co-directeurs' => $these->getActeursByRoleCode(Role::CODE_CODIRECTEUR_THESE),
- 'co-encadrants' => $these->getActeursByRoleCode(Role::CODE_CO_ENCADRANT),
- 'etablissement' => $these->getEtablissement(),
- 'ecole doctorale' => $these->getEcoleDoctorale(),
- 'unite de recherche' => $these->getUniteRecherche(),
- 'version_initiale' => $these->hasVersionInitiale(),
- 'version_corrigée' => $these->hasVersionCorrigee(),
- 'annexe' => $these->hasAnnexe(),
- ];
- $record[] = $fct($variables);
+ $data = [];
+ foreach ($records as $r) {
+ $row = [];
+ /** @var callable $fct */
+ foreach ($headers as $fct) {
+ $row[] = $fct($r);
}
- $records[] = $record;
+ $data[] = $row;
}
$result = new CsvModel();
$result->setDelimiter(';');
- $result->setEnclosure('"');
+ $result->setEnclosure('"'); // indispensable car il peut y avoir des ; dans les données
$result->setHeader(array_keys($headers));
- $result->setData($records);
+ $result->setData($data);
$result->setFilename('export_theses.csv');
return $result;
diff --git a/module/Application/src/Application/Controller/UtilisateurController.php b/module/Application/src/Application/Controller/UtilisateurController.php
index 7e5ea56fbb615894275a143652c9e1b6f636ef26..76de3e40a11974d36e5577b9f7a9fe5ecd923716 100644
--- a/module/Application/src/Application/Controller/UtilisateurController.php
+++ b/module/Application/src/Application/Controller/UtilisateurController.php
@@ -275,7 +275,7 @@ class UtilisateurController extends \UnicaenAuth\Controller\UtilisateurControlle
$this->flashMessenger()->addSuccessMessage("Utilisateur <strong>{$utilisateur->getUsername()}</strong> créé avec succès.");
- return $this->redirect()->toRoute('utilisateur');
+ return $this->redirect()->toRoute('utilisateur/voir', ['utilisateur' => $utilisateur->getId()], [], true);
}
}
diff --git a/module/Application/src/Application/Form/Validator/NewEmailValidator.php b/module/Application/src/Application/Form/Validator/NewEmailValidator.php
index e584e31b4b98b88f86f648f739b8052effedc865..358d27f2df93e562d5b1d51072a5b2b46acc92e3 100644
--- a/module/Application/src/Application/Form/Validator/NewEmailValidator.php
+++ b/module/Application/src/Application/Form/Validator/NewEmailValidator.php
@@ -34,7 +34,7 @@ class NewEmailValidator extends AbstractValidator
$perimetre = $this->getPerimetre();
if (in_array('utilisateur', $perimetre)) {
- if ($this->entityManager->getRepository(Utilisateur::class)->findOneBy(['email' => $value]) !== null) {
+ if ($this->entityManager->getRepository(Utilisateur::class)->findOneBy(['username' => $value]) !== null) {
$this->error(self::UTILISATEUR);
$nb_pb++;
}
diff --git a/module/Depot/src/Depot/Service/FichierThese/FichierTheseServiceFactory.php b/module/Depot/src/Depot/Service/FichierThese/FichierTheseServiceFactory.php
index 268145630d6b71c206269634345219a3421f320e..94888984678ecdf60033d6126554c9a463626145 100644
--- a/module/Depot/src/Depot/Service/FichierThese/FichierTheseServiceFactory.php
+++ b/module/Depot/src/Depot/Service/FichierThese/FichierTheseServiceFactory.php
@@ -65,6 +65,8 @@ class FichierTheseServiceFactory
/** @var PageDeCouverturePdfExporter $pdcPdfExporter */
$pdcPdfExporter = $container->get(PageDeCouverturePdfExporter::class);
$pdcPdfExporter
+ ->setMarginTop(5)
+ ->setMarginBottom(5)
->setTemplateFilePath($templateFilePath)
->setCssFilePath($cssFilePath);
diff --git a/module/Individu/config/individu.config.php b/module/Individu/config/individu.config.php
index e721e1c10519f4fe4c1d6959d6a8afdef7b57ca6..e1bcbe5b8e60db38ad5aef49a4747aa046f27a53 100644
--- a/module/Individu/config/individu.config.php
+++ b/module/Individu/config/individu.config.php
@@ -3,6 +3,8 @@
namespace Individu;
use BjyAuthorize\Provider\Resource\Config;
+use Individu\Assertion\IndividuAssertion;
+use Individu\Assertion\IndividuAssertionFactory;
use Individu\Controller\IndividuController;
use Individu\Controller\IndividuControllerFactory;
use Individu\Form\IndividuForm;
@@ -46,27 +48,27 @@ return [
[
'controller' => IndividuController::class,
'action' => ['index', 'rechercher'],
- 'privilege' => IndividuPrivileges::INDIVIDU_LISTER,
+ 'privileges' => IndividuPrivileges::INDIVIDU_LISTER,
],
[
'controller' => IndividuController::class,
'action' => ['voir'],
- 'privilege' => IndividuPrivileges::INDIVIDU_CONSULTER,
+ 'privileges' => IndividuPrivileges::INDIVIDU_CONSULTER,
],
[
'controller' => IndividuController::class,
'action' => ['ajouter'],
- 'privilege' => IndividuPrivileges::INDIVIDU_AJOUTER,
+ 'privileges' => IndividuPrivileges::INDIVIDU_AJOUTER,
],
[
'controller' => IndividuController::class,
'action' => ['modifier'],
- 'privilege' => IndividuPrivileges::INDIVIDU_MODIFIER,
+ 'privileges' => IndividuPrivileges::INDIVIDU_MODIFIER,
],
[
'controller' => IndividuController::class,
'action' => ['supprimer', 'restaurer'],
- 'privilege' => IndividuPrivileges::INDIVIDU_SUPPRIMER,
+ 'privileges' => IndividuPrivileges::INDIVIDU_SUPPRIMER,
],
],
],
@@ -173,6 +175,7 @@ return [
'factories' => [
IndividuService::class => IndividuServiceFactory::class,
IndividuSearchService::class => IndividuSearchServiceFactory::class,
+ IndividuAssertion::class => IndividuAssertionFactory::class,
],
'aliases' => [
'IndividuService' => IndividuService::class,
diff --git a/module/Soutenance/view/soutenance/proposition/proposition.phtml b/module/Soutenance/view/soutenance/proposition/proposition.phtml
index 7e1d1fd09af6c54c3857af482526b45e92399a88..7e923341dc26d2de91e9dc7e3d24988b20e83179 100644
--- a/module/Soutenance/view/soutenance/proposition/proposition.phtml
+++ b/module/Soutenance/view/soutenance/proposition/proposition.phtml
@@ -39,7 +39,7 @@ use These\Entity\Db\These;
*
* @var IndividuRole[] $ecoleResponsables
* @var IndividuRole[] $uniteResponsables
- * @var IndividuRole[] $etablissementResponsables
+ * @var string[] $emailsAspectDoctorats
* @var bool $informationsOk
*
* @var $FORMULAIRE_DELOCALISATION
@@ -87,7 +87,7 @@ echo $this->partial('partial/informations', [
'directeurs' => $directeurs,
'uniteResponsables' => $uniteResponsables,
'ecoleResponsables' => $ecoleResponsables,
- 'etablissementResponsables' => $etablissementResponsables,
+ 'emailsAspectDoctorats' => $emailsAspectDoctorats,
'canModifier' => $canModifier]);
?>