Skip to content
Snippets Groups Projects
Commit 4f77f929 authored by Jean-Philippe Metivier's avatar Jean-Philippe Metivier
Browse files

Merging

parents 0a516cc4 daf2ec40
No related branches found
No related tags found
No related merge requests found
......@@ -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)
......
# 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
<?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
......@@ -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(),
......
......@@ -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'
$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);
// 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);
}
$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;
......
......@@ -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);
}
}
......
......@@ -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++;
}
......
......@@ -65,6 +65,8 @@ class FichierTheseServiceFactory
/** @var PageDeCouverturePdfExporter $pdcPdfExporter */
$pdcPdfExporter = $container->get(PageDeCouverturePdfExporter::class);
$pdcPdfExporter
->setMarginTop(5)
->setMarginBottom(5)
->setTemplateFilePath($templateFilePath)
->setCssFilePath($cssFilePath);
......
......@@ -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,
......
......@@ -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]);
?>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment