diff --git a/bin/.gitignore b/bin/.gitignore
deleted file mode 100644
index 07873cfef23f82ff95812ddf0855ea3f645391d3..0000000000000000000000000000000000000000
--- a/bin/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-aaa.sh
\ No newline at end of file
diff --git a/bin/create-version-file.sh b/bin/create-version-file.sh
deleted file mode 100755
index 851d67c944e1d22f3953ab5b1229fa82155bff48..0000000000000000000000000000000000000000
--- a/bin/create-version-file.sh
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/bin/bash
-
-set -e
-
-usage() {
-  cat << EOF
-Script de génération du fichier de version.
-Usage :
-  $0 <gitdir>
-  <gitdir> : Chemin du répertoire des métadonnées git (.git), ou du dépôt git intermédiaire. Obligatoire.
-Exemples :
-  $0 /workspace/sygal/.git
-EOF
-  exit 0;
-}
-
-CURR_DIR=$(cd `dirname $0` && pwd)
-APPDIR=$(cd ${CURR_DIR}/.. && pwd)
-
-GITDIR=$1
-
-[[ -z "$GITDIR" ]] && usage
-
-function generate_version_file() {
-  GITDIR=$1
-  VERSION_CMD="git --git-dir ${GITDIR} describe"
-  DATE_CMD="git --git-dir ${GITDIR} log --pretty='format:%ad' --date=format:'%d/%m/%Y %H:%M:%S' -1"
-  echo "==> Génération du fichier de version..."
-  ver_num=$(eval ${VERSION_CMD})
-  ver_date=$(eval ${DATE_CMD})
-  cd ${APPDIR} && ./create-version-config-file --number ${ver_num} --date ${ver_date}
-}
-
-generate_version_file $(realpath $GITDIR)
diff --git a/doc/INSTALL.md b/doc/INSTALL.md
index d3754863411a40a0e691b464ee85524f500f2dab..d2dc9f57361e59a6bd74330e9df10ac4ac73d476 100644
--- a/doc/INSTALL.md
+++ b/doc/INSTALL.md
@@ -50,10 +50,10 @@ git clone https://git.unicaen.fr/open-source/docker/unicaen-image.git ${UNICAEN_
 cd ${UNICAEN_IMAGE_TMP_DIR}
 ```
 
-- Lancez-y le script `Dockerfile-7.x.sh` conçu pour la version 7.4 de PHP. 
+- Lancez-y le script `Dockerfile-8.x.sh` conçu pour la version 8.0 de PHP. 
 ```bash
-PHP_VERSION=7.4
-bash Dockerfile-7.x.sh ${PHP_VERSION}
+PHP_VERSION=8.0
+bash Dockerfile-8.x.sh ${PHP_VERSION}
 ```
 
 - Ensuite, quelque part sur le serveur, récupérez cette fois l'image Docker `sygal-image` puis placez-vous dans 
@@ -98,12 +98,12 @@ Notamment, lorsque sa valeur est `development`, cela active l'affichage détaill
 - Prenez connaissance du chemin spécifié par le paramètre `error_log` du fichier de config `/etc/php/${PHP_VERSION}/fpm/php-fpm.conf`, 
 exemple :
 ```conf
-error_log = /var/log/php7.4-fpm.log
+error_log = /var/log/php8.0-fpm.log
 ```
 
 - Créez le fichier de log avec le propriétaire qui va bien, exemple :
 ```bash
-FPM_PHP_LOG_FILE=/var/log/php7.4-fpm.log
+FPM_PHP_LOG_FILE=/var/log/php8.0-fpm.log
 touch ${FPM_PHP_LOG_FILE} && chown www-data:www-data ${FPM_PHP_LOG_FILE}
 ```
 
diff --git a/doc/bootstrap4-migration.md b/doc/bootstrap4-migration.md
deleted file mode 100644
index ca5dfece382539f97a26f0c6dae3229e6dda7a71..0000000000000000000000000000000000000000
--- a/doc/bootstrap4-migration.md
+++ /dev/null
@@ -1,55 +0,0 @@
-Migration vers Bootstrap 4
-==========================
-
-- passage à jquery 3.x ?
-
-Remplacements
--------------
-
-- .dl-horizontal => .row + grid column classes (or mixins) on its <dt> and <dd> children.
-- .navbar-inverse, .navbar-header disparaissent
-- .navbar-fixed-top => .fixed-top
-- .navbar-toggle => .navbar-toggler
-- nouvelles classes : .nav-link, .nav-item
-- .input-group-addon => input-group-prepend ou input-group-append
-- .col-xs-* => .col-*
-- .panel => .card + .card-body (panel-primary supprimé, alternatiove à trouver https://getbootstrap.com/docs/4.0/components/card/#card-styles)
-- glyphicon glyphicon-* => icon icon-* (nouveau dans unicaen/app)
-- .table-condensed => .table-sm
-- control-label => .col-form-label.
-- .input-lg and .input-sm => .form-control-lg and .form-control-sm, respectively.
-- .help-block => .form-text (https://getbootstrap.com/docs/4.0/migration/#forms-1)
-- .form-horizontal supprimé : trouver une parade (https://getbootstrap.com/docs/4.0/migration/#forms-1)
-- .has-error, .has-warning, and .has-success disparaissent : style à récupérer
-- .btn-default => .btn-secondary
-- .btn-xs => .btn-sm
-- navbar : navbar-expand-md ajouté pour gestion du collapse, + navbar-dark bg-dark. Quid de .navbar-inverse ?
-- .breadcrumb-item, is now required on the descendants of .breadcrumbs
-
-
-NB
---
-
-- "Added a new sm grid tier below 768px for more granular control. We now have xs, sm, md, lg, and xl. This also means 
-every tier has been bumped up one level (so .col-md-6 in v3 is now .col-lg-6 in v4)."
-(https://getbootstrap.com/docs/4.0/migration/#grid-system)
-
-- màj bootstrap-confirmation : fait pour B4, mais pas de version pour B5 !
-- màj bootstrap-datetimepicker nécessaire ? Non, unicaen/app fournit la dernière version 4.17.47 et elle semble pouvoir fonctionner avec B5.
-- màj bootstrap-select ? Non, fonctionne avec B4 (ex: filtres de thèses).
-- màj bootstrap-multiselect ? non, ça semble fonctionner (ex: filtre textuel de thèses)
-
-- popover : option `sanitize: true` requise sinon pas de <table> possible das un popover ! 
-- .page-header disparaît
-- <blockquote> plus stylé : utiliser .blockquote and the .blockquote-reverse 
-- nouveau : .table-inverse, .thead-default and .thead-inverse.
-- disparaissent : $().button(string) and $().button('reset') 
-- envisager de remplacer <div.navbar> par <nav>
-
-
-
-
-SyGAL RAF
----------
-
-- remplacer : $().button(string) and $().button('reset') https://getbootstrap.com/docs/4.0/migration/#buttons
\ No newline at end of file
diff --git a/generate-version-config-file.sh b/generate-version-config-file.sh
deleted file mode 100755
index 761c15b95b83ef6159c7832b245b4e88e60db1a6..0000000000000000000000000000000000000000
--- a/generate-version-config-file.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/usr/bin/env bash
-
-DIR=$(cd `dirname $0` && pwd)
-
-cd ${DIR}
-
-DIST_FILE_PATH=${DIR}/config/autoload/auto.version.local.php.dist
-TARGET_FILE_PATH=${DIR}/config/autoload/auto.version.local.php
-
-ver_num=$(git describe) && \
-ver_date=$(git log --pretty='format:%ad' --date=format:'%d/%m/%Y %H:%M:%S' -1) && \
-
-cp -f ${DIST_FILE_PATH} ${TARGET_FILE_PATH} && \
-sed -i "s#_VERSION_NUMBER_#${ver_num}#; s#_VERSION_DATE_#${ver_date}#; s#_GENERATION_DATE_#$(date)#" ${TARGET_FILE_PATH} && \
-
-echo "Fichier de version généré : ${TARGET_FILE_PATH} (version = '${ver_num}', date = '${ver_date}')"
diff --git a/script_mv_.sql b/script_mv_.sql
deleted file mode 100644
index c44d7a0a9142bc9ccff13b3a2ab975e097366af6..0000000000000000000000000000000000000000
--- a/script_mv_.sql
+++ /dev/null
@@ -1,592 +0,0 @@
-alter table these alter column lib_etab_cotut type varchar(100) using lib_etab_cotut::varchar(100);
-
-drop view v_diff_these;
-drop materialized view mv_indicateur_1;
-drop materialized view mv_indicateur_2;
-drop materialized view mv_indicateur_3;
-drop materialized view mv_indicateur_4;
-drop materialized view mv_indicateur_5;
-drop materialized view mv_indicateur_6;
-drop materialized view mv_indicateur_81;
-
------
-
-create materialized view mv_indicateur_1 as
-SELECT these.id,
-       these.etablissement_id,
-       these.doctorant_id,
-       these.ecole_doct_id,
-       these.unite_rech_id,
-       these.besoin_expurge,
-       these.cod_unit_rech,
-       these.correc_autorisee,
-       these.date_autoris_soutenance,
-       these.date_fin_confid,
-       these.date_prem_insc,
-       these.date_prev_soutenance,
-       these.date_soutenance,
-       these.etat_these,
-       these.lib_disc,
-       these.lib_etab_cotut,
-       these.lib_pays_cotut,
-       these.lib_unit_rech,
-       these.resultat,
-       these.soutenance_autoris,
-       these.tem_avenant_cotut,
-       these.titre,
-       these.source_code,
-       these.source_id,
-       these.histo_createur_id,
-       these.histo_creation,
-       these.histo_modificateur_id,
-       these.histo_modification,
-       these.histo_destructeur_id,
-       these.histo_destruction
-FROM these these;
-
-
-create materialized view mv_indicateur_2 as
-SELECT t.id,
-       t.etablissement_id,
-       t.doctorant_id,
-       t.ecole_doct_id,
-       t.unite_rech_id,
-       t.besoin_expurge,
-       t.cod_unit_rech,
-       t.correc_autorisee,
-       t.date_autoris_soutenance,
-       t.date_fin_confid,
-       t.date_prem_insc,
-       t.date_prev_soutenance,
-       t.date_soutenance,
-       t.etat_these,
-       t.lib_disc,
-       t.lib_etab_cotut,
-       t.lib_pays_cotut,
-       t.lib_unit_rech,
-       t.resultat,
-       t.soutenance_autoris,
-       t.tem_avenant_cotut,
-       t.titre,
-       t.source_code,
-       t.source_id,
-       t.histo_createur_id,
-       t.histo_creation,
-       t.histo_modificateur_id,
-       t.histo_modification,
-       t.histo_destructeur_id,
-       t.histo_destruction,
-       t.correc_autorisee_forcee,
-       t.date_abandon,
-       t.date_transfert,
-       t.correc_effectuee
-FROM these t
-         LEFT JOIN validation v ON t.id = v.these_id
-         LEFT JOIN type_validation n ON v.type_validation_id = n.id
-WHERE t.date_soutenance > ('now'::text::timestamp without time zone - '2 mons'::interval)
-  AND t.etat_these::text = 'E'::text
-  AND n.code::text = 'PAGE_DE_COUVERTURE'::text
-  AND v.id IS NULL;
-
-
-
-create materialized view mv_indicateur_3 as
-SELECT t.id,
-       t.etablissement_id,
-       t.doctorant_id,
-       t.ecole_doct_id,
-       t.unite_rech_id,
-       t.besoin_expurge,
-       t.cod_unit_rech,
-       t.correc_autorisee,
-       t.date_autoris_soutenance,
-       t.date_fin_confid,
-       t.date_prem_insc,
-       t.date_prev_soutenance,
-       t.date_soutenance,
-       t.etat_these,
-       t.lib_disc,
-       t.lib_etab_cotut,
-       t.lib_pays_cotut,
-       t.lib_unit_rech,
-       t.resultat,
-       t.soutenance_autoris,
-       t.tem_avenant_cotut,
-       t.titre,
-       t.source_code,
-       t.source_id,
-       t.histo_createur_id,
-       t.histo_creation,
-       t.histo_modificateur_id,
-       t.histo_modification,
-       t.histo_destructeur_id,
-       t.histo_destruction,
-       t.correc_autorisee_forcee,
-       t.date_abandon,
-       t.date_transfert,
-       t.correc_effectuee
-FROM these t
-         LEFT JOIN fichier_these f ON t.id = f.these_id
-         LEFT JOIN fichier fi ON fi.id = f.fichier_id
-         LEFT JOIN nature_fichier n ON fi.nature_id = n.id
-WHERE t.date_soutenance > ('now'::text::timestamp without time zone - '1 mon'::interval)
-  AND t.etat_these::text = 'E'::text
-  AND n.code::text = 'THESE_PDF'::text
-  AND f.id IS NULL;
-
-create materialized view mv_indicateur_4 as
-SELECT t.id,
-       t.etablissement_id,
-       t.doctorant_id,
-       t.ecole_doct_id,
-       t.unite_rech_id,
-       t.besoin_expurge,
-       t.cod_unit_rech,
-       t.correc_autorisee,
-       t.date_autoris_soutenance,
-       t.date_fin_confid,
-       t.date_prem_insc,
-       t.date_prev_soutenance,
-       t.date_soutenance,
-       t.etat_these,
-       t.lib_disc,
-       t.lib_etab_cotut,
-       t.lib_pays_cotut,
-       t.lib_unit_rech,
-       t.resultat,
-       t.soutenance_autoris,
-       t.tem_avenant_cotut,
-       t.titre,
-       t.source_code,
-       t.source_id,
-       t.histo_createur_id,
-       t.histo_creation,
-       t.histo_modificateur_id,
-       t.histo_modification,
-       t.histo_destructeur_id,
-       t.histo_destruction,
-       t.correc_autorisee_forcee,
-       t.date_abandon,
-       t.date_transfert,
-       t.correc_effectuee
-FROM these t
-WHERE t.etat_these::text = 'E'::text
-  AND t.date_soutenance < 'now'::text::timestamp without time zone;
-
-
-create materialized view mv_indicateur_5 as
-SELECT t.id,
-       t.etablissement_id,
-       t.doctorant_id,
-       t.ecole_doct_id,
-       t.unite_rech_id,
-       t.besoin_expurge,
-       t.cod_unit_rech,
-       t.correc_autorisee,
-       t.date_autoris_soutenance,
-       t.date_fin_confid,
-       t.date_prem_insc,
-       t.date_prev_soutenance,
-       t.date_soutenance,
-       t.etat_these,
-       t.lib_disc,
-       t.lib_etab_cotut,
-       t.lib_pays_cotut,
-       t.lib_unit_rech,
-       t.resultat,
-       t.soutenance_autoris,
-       t.tem_avenant_cotut,
-       t.titre,
-       t.source_code,
-       t.source_id,
-       t.histo_createur_id,
-       t.histo_creation,
-       t.histo_modificateur_id,
-       t.histo_modification,
-       t.histo_destructeur_id,
-       t.histo_destruction,
-       t.correc_autorisee_forcee,
-       t.date_abandon,
-       t.date_transfert,
-       t.correc_effectuee
-FROM these t
-WHERE t.etat_these::text = 'E'::text
-  AND t.date_soutenance > 'now'::text::timestamp without time zone;
-
-create materialized view mv_indicateur_6 as
-SELECT t.id,
-       t.etablissement_id,
-       t.doctorant_id,
-       t.ecole_doct_id,
-       t.unite_rech_id,
-       t.besoin_expurge,
-       t.cod_unit_rech,
-       t.correc_autorisee,
-       t.date_autoris_soutenance,
-       t.date_fin_confid,
-       t.date_prem_insc,
-       t.date_prev_soutenance,
-       t.date_soutenance,
-       t.etat_these,
-       t.lib_disc,
-       t.lib_etab_cotut,
-       t.lib_pays_cotut,
-       t.lib_unit_rech,
-       t.resultat,
-       t.soutenance_autoris,
-       t.tem_avenant_cotut,
-       t.titre,
-       t.source_code,
-       t.source_id,
-       t.histo_createur_id,
-       t.histo_creation,
-       t.histo_modificateur_id,
-       t.histo_modification,
-       t.histo_destructeur_id,
-       t.histo_destruction,
-       t.correc_autorisee_forcee,
-       t.date_abandon,
-       t.date_transfert,
-       t.correc_effectuee
-FROM these t
-WHERE t.etat_these::text = 'E'::text
-  AND t.date_prem_insc < ('now'::text::timestamp without time zone - '6 years'::interval);
-
-create materialized view mv_indicateur_81 as
-SELECT t.id,
-       t.etablissement_id,
-       t.doctorant_id,
-       t.ecole_doct_id,
-       t.unite_rech_id,
-       t.besoin_expurge,
-       t.cod_unit_rech,
-       t.correc_autorisee,
-       t.date_autoris_soutenance,
-       t.date_fin_confid,
-       t.date_prem_insc,
-       t.date_prev_soutenance,
-       t.date_soutenance,
-       t.etat_these,
-       t.lib_disc,
-       t.lib_etab_cotut,
-       t.lib_pays_cotut,
-       t.lib_unit_rech,
-       t.resultat,
-       t.soutenance_autoris,
-       t.tem_avenant_cotut,
-       t.titre,
-       t.source_code,
-       t.source_id,
-       t.histo_createur_id,
-       t.histo_creation,
-       t.histo_modificateur_id,
-       t.histo_modification,
-       t.histo_destructeur_id,
-       t.histo_destruction,
-       t.correc_autorisee_forcee,
-       t.date_abandon,
-       t.date_transfert,
-       t.correc_effectuee
-FROM these t
-WHERE t.date_prem_insc <= ('now'::text::timestamp without time zone - '5 years'::interval)
-  AND t.etat_these::text = 'E'::text
-  AND (t.id IN (SELECT these_annee_univ.these_id
-                FROM these_annee_univ
-                         JOIN these t_1 ON these_annee_univ.these_id = t_1.id
-                WHERE t_1.etat_these::text = 'E'::text
-                GROUP BY these_annee_univ.these_id
-                HAVING max(these_annee_univ.annee_univ)::double precision <=
-                       date_part('year'::text, 'now'::text::timestamp without time zone - '1 year'::interval)));
-
-create view v_diff_these
-            (source_code, source_id, operation, u_source_id, u_etablissement_id, u_doctorant_id, u_ecole_doct_id,
-             u_unite_rech_id, u_titre, u_etat_these, u_resultat, u_code_sise_disc, u_lib_disc, u_date_prem_insc,
-             u_date_prev_soutenance, u_date_soutenance, u_date_fin_confid, u_lib_etab_cotut, u_lib_pays_cotut,
-             u_correc_autorisee, u_correc_effectuee, u_soutenance_autoris, u_date_autoris_soutenance,
-             u_tem_avenant_cotut, u_date_abandon, u_date_transfert, s_source_id, s_etablissement_id, s_doctorant_id,
-             s_ecole_doct_id, s_unite_rech_id, s_titre, s_etat_these, s_resultat, s_code_sise_disc, s_lib_disc,
-             s_date_prem_insc, s_date_prev_soutenance, s_date_soutenance, s_date_fin_confid, s_lib_etab_cotut,
-             s_lib_pays_cotut, s_correc_autorisee, s_correc_effectuee, s_soutenance_autoris, s_date_autoris_soutenance,
-             s_tem_avenant_cotut, s_date_abandon, s_date_transfert, d_source_id, d_etablissement_id, d_doctorant_id,
-             d_ecole_doct_id, d_unite_rech_id, d_titre, d_etat_these, d_resultat, d_code_sise_disc, d_lib_disc,
-             d_date_prem_insc, d_date_prev_soutenance, d_date_soutenance, d_date_fin_confid, d_lib_etab_cotut,
-             d_lib_pays_cotut, d_correc_autorisee, d_correc_effectuee, d_soutenance_autoris, d_date_autoris_soutenance,
-             d_tem_avenant_cotut, d_date_abandon, d_date_transfert)
-as
-WITH diff AS (
-    SELECT COALESCE(s.source_code, d.source_code) AS source_code,
-           COALESCE(s.source_id, d.source_id)     AS source_id,
-           CASE
-               WHEN s.source_code IS NOT NULL AND d.source_code IS NULL THEN 'insert'::text
-               WHEN s.source_code IS NOT NULL AND d.source_code IS NOT NULL AND
-                    (d.histo_destruction IS NULL OR d.histo_destruction > 'now'::text::timestamp(0) without time zone)
-                   THEN 'update'::text
-               WHEN s.source_code IS NOT NULL AND d.source_code IS NOT NULL AND d.histo_destruction IS NOT NULL AND
-                    d.histo_destruction <= 'now'::text::timestamp(0) without time zone THEN 'undelete'::text
-               WHEN s.source_code IS NULL AND d.source_code IS NOT NULL AND
-                    (d.histo_destruction IS NULL OR d.histo_destruction > 'now'::text::timestamp(0) without time zone)
-                   THEN 'delete'::text
-               ELSE NULL::text
-               END                                AS operation,
-           CASE
-               WHEN d.source_id <> s.source_id OR d.source_id IS NULL AND s.source_id IS NOT NULL OR
-                    d.source_id IS NOT NULL AND s.source_id IS NULL THEN 1
-               ELSE 0
-               END                                AS u_source_id,
-           CASE
-               WHEN d.etablissement_id <> s.etablissement_id OR
-                    d.etablissement_id IS NULL AND s.etablissement_id IS NOT NULL OR
-                    d.etablissement_id IS NOT NULL AND s.etablissement_id IS NULL THEN 1
-               ELSE 0
-               END                                AS u_etablissement_id,
-           CASE
-               WHEN d.doctorant_id <> s.doctorant_id OR d.doctorant_id IS NULL AND s.doctorant_id IS NOT NULL OR
-                    d.doctorant_id IS NOT NULL AND s.doctorant_id IS NULL THEN 1
-               ELSE 0
-               END                                AS u_doctorant_id,
-           CASE
-               WHEN d.ecole_doct_id <> s.ecole_doct_id OR d.ecole_doct_id IS NULL AND s.ecole_doct_id IS NOT NULL OR
-                    d.ecole_doct_id IS NOT NULL AND s.ecole_doct_id IS NULL THEN 1
-               ELSE 0
-               END                                AS u_ecole_doct_id,
-           CASE
-               WHEN d.unite_rech_id <> s.unite_rech_id OR d.unite_rech_id IS NULL AND s.unite_rech_id IS NOT NULL OR
-                    d.unite_rech_id IS NOT NULL AND s.unite_rech_id IS NULL THEN 1
-               ELSE 0
-               END                                AS u_unite_rech_id,
-           CASE
-               WHEN d.titre::text <> s.titre::text OR d.titre IS NULL AND s.titre IS NOT NULL OR
-                    d.titre IS NOT NULL AND s.titre IS NULL THEN 1
-               ELSE 0
-               END                                AS u_titre,
-           CASE
-               WHEN d.etat_these::text <> s.etat_these::text OR d.etat_these IS NULL AND s.etat_these IS NOT NULL OR
-                    d.etat_these IS NOT NULL AND s.etat_these IS NULL THEN 1
-               ELSE 0
-               END                                AS u_etat_these,
-           CASE
-               WHEN d.resultat::numeric <> s.resultat OR d.resultat IS NULL AND s.resultat IS NOT NULL OR
-                    d.resultat IS NOT NULL AND s.resultat IS NULL THEN 1
-               ELSE 0
-               END                                AS u_resultat,
-           CASE
-               WHEN d.code_sise_disc::text <> s.code_sise_disc::text OR
-                    d.code_sise_disc IS NULL AND s.code_sise_disc IS NOT NULL OR
-                    d.code_sise_disc IS NOT NULL AND s.code_sise_disc IS NULL THEN 1
-               ELSE 0
-               END                                AS u_code_sise_disc,
-           CASE
-               WHEN d.lib_disc::text <> s.lib_disc::text OR d.lib_disc IS NULL AND s.lib_disc IS NOT NULL OR
-                    d.lib_disc IS NOT NULL AND s.lib_disc IS NULL THEN 1
-               ELSE 0
-               END                                AS u_lib_disc,
-           CASE
-               WHEN d.date_prem_insc <> s.date_prem_insc OR d.date_prem_insc IS NULL AND s.date_prem_insc IS NOT NULL OR
-                    d.date_prem_insc IS NOT NULL AND s.date_prem_insc IS NULL THEN 1
-               ELSE 0
-               END                                AS u_date_prem_insc,
-           CASE
-               WHEN d.date_prev_soutenance <> s.date_prev_soutenance OR
-                    d.date_prev_soutenance IS NULL AND s.date_prev_soutenance IS NOT NULL OR
-                    d.date_prev_soutenance IS NOT NULL AND s.date_prev_soutenance IS NULL THEN 1
-               ELSE 0
-               END                                AS u_date_prev_soutenance,
-           CASE
-               WHEN d.date_soutenance <> s.date_soutenance OR
-                    d.date_soutenance IS NULL AND s.date_soutenance IS NOT NULL OR
-                    d.date_soutenance IS NOT NULL AND s.date_soutenance IS NULL THEN 1
-               ELSE 0
-               END                                AS u_date_soutenance,
-           CASE
-               WHEN d.date_fin_confid <> s.date_fin_confid OR
-                    d.date_fin_confid IS NULL AND s.date_fin_confid IS NOT NULL OR
-                    d.date_fin_confid IS NOT NULL AND s.date_fin_confid IS NULL THEN 1
-               ELSE 0
-               END                                AS u_date_fin_confid,
-           CASE
-               WHEN d.lib_etab_cotut::text <> s.lib_etab_cotut::text OR
-                    d.lib_etab_cotut IS NULL AND s.lib_etab_cotut IS NOT NULL OR
-                    d.lib_etab_cotut IS NOT NULL AND s.lib_etab_cotut IS NULL THEN 1
-               ELSE 0
-               END                                AS u_lib_etab_cotut,
-           CASE
-               WHEN d.lib_pays_cotut::text <> s.lib_pays_cotut::text OR
-                    d.lib_pays_cotut IS NULL AND s.lib_pays_cotut IS NOT NULL OR
-                    d.lib_pays_cotut IS NOT NULL AND s.lib_pays_cotut IS NULL THEN 1
-               ELSE 0
-               END                                AS u_lib_pays_cotut,
-           CASE
-               WHEN d.correc_autorisee::text <> s.correc_autorisee::text OR
-                    d.correc_autorisee IS NULL AND s.correc_autorisee IS NOT NULL OR
-                    d.correc_autorisee IS NOT NULL AND s.correc_autorisee IS NULL THEN 1
-               ELSE 0
-               END                                AS u_correc_autorisee,
-           CASE
-               WHEN d.correc_effectuee::text <> s.correc_effectuee::text OR
-                    d.correc_effectuee IS NULL AND s.correc_effectuee IS NOT NULL OR
-                    d.correc_effectuee IS NOT NULL AND s.correc_effectuee IS NULL THEN 1
-               ELSE 0
-               END                                AS u_correc_effectuee,
-           CASE
-               WHEN d.soutenance_autoris::text <> s.soutenance_autoris::text OR
-                    d.soutenance_autoris IS NULL AND s.soutenance_autoris IS NOT NULL OR
-                    d.soutenance_autoris IS NOT NULL AND s.soutenance_autoris IS NULL THEN 1
-               ELSE 0
-               END                                AS u_soutenance_autoris,
-           CASE
-               WHEN d.date_autoris_soutenance <> s.date_autoris_soutenance OR
-                    d.date_autoris_soutenance IS NULL AND s.date_autoris_soutenance IS NOT NULL OR
-                    d.date_autoris_soutenance IS NOT NULL AND s.date_autoris_soutenance IS NULL THEN 1
-               ELSE 0
-               END                                AS u_date_autoris_soutenance,
-           CASE
-               WHEN d.tem_avenant_cotut::text <> s.tem_avenant_cotut::text OR
-                    d.tem_avenant_cotut IS NULL AND s.tem_avenant_cotut IS NOT NULL OR
-                    d.tem_avenant_cotut IS NOT NULL AND s.tem_avenant_cotut IS NULL THEN 1
-               ELSE 0
-               END                                AS u_tem_avenant_cotut,
-           CASE
-               WHEN d.date_abandon <> s.date_abandon OR d.date_abandon IS NULL AND s.date_abandon IS NOT NULL OR
-                    d.date_abandon IS NOT NULL AND s.date_abandon IS NULL THEN 1
-               ELSE 0
-               END                                AS u_date_abandon,
-           CASE
-               WHEN d.date_transfert <> s.date_transfert OR d.date_transfert IS NULL AND s.date_transfert IS NOT NULL OR
-                    d.date_transfert IS NOT NULL AND s.date_transfert IS NULL THEN 1
-               ELSE 0
-               END                                AS u_date_transfert,
-           s.source_id                            AS s_source_id,
-           s.etablissement_id                     AS s_etablissement_id,
-           s.doctorant_id                         AS s_doctorant_id,
-           s.ecole_doct_id                        AS s_ecole_doct_id,
-           s.unite_rech_id                        AS s_unite_rech_id,
-           s.titre                                AS s_titre,
-           s.etat_these                           AS s_etat_these,
-           s.resultat                             AS s_resultat,
-           s.code_sise_disc                       AS s_code_sise_disc,
-           s.lib_disc                             AS s_lib_disc,
-           s.date_prem_insc                       AS s_date_prem_insc,
-           s.date_prev_soutenance                 AS s_date_prev_soutenance,
-           s.date_soutenance                      AS s_date_soutenance,
-           s.date_fin_confid                      AS s_date_fin_confid,
-           s.lib_etab_cotut                       AS s_lib_etab_cotut,
-           s.lib_pays_cotut                       AS s_lib_pays_cotut,
-           s.correc_autorisee                     AS s_correc_autorisee,
-           s.correc_effectuee                     AS s_correc_effectuee,
-           s.soutenance_autoris                   AS s_soutenance_autoris,
-           s.date_autoris_soutenance              AS s_date_autoris_soutenance,
-           s.tem_avenant_cotut                    AS s_tem_avenant_cotut,
-           s.date_abandon                         AS s_date_abandon,
-           s.date_transfert                       AS s_date_transfert,
-           d.source_id                            AS d_source_id,
-           d.etablissement_id                     AS d_etablissement_id,
-           d.doctorant_id                         AS d_doctorant_id,
-           d.ecole_doct_id                        AS d_ecole_doct_id,
-           d.unite_rech_id                        AS d_unite_rech_id,
-           d.titre                                AS d_titre,
-           d.etat_these                           AS d_etat_these,
-           d.resultat                             AS d_resultat,
-           d.code_sise_disc                       AS d_code_sise_disc,
-           d.lib_disc                             AS d_lib_disc,
-           d.date_prem_insc                       AS d_date_prem_insc,
-           d.date_prev_soutenance                 AS d_date_prev_soutenance,
-           d.date_soutenance                      AS d_date_soutenance,
-           d.date_fin_confid                      AS d_date_fin_confid,
-           d.lib_etab_cotut                       AS d_lib_etab_cotut,
-           d.lib_pays_cotut                       AS d_lib_pays_cotut,
-           d.correc_autorisee                     AS d_correc_autorisee,
-           d.correc_effectuee                     AS d_correc_effectuee,
-           d.soutenance_autoris                   AS d_soutenance_autoris,
-           d.date_autoris_soutenance              AS d_date_autoris_soutenance,
-           d.tem_avenant_cotut                    AS d_tem_avenant_cotut,
-           d.date_abandon                         AS d_date_abandon,
-           d.date_transfert                       AS d_date_transfert
-    FROM these d
-             JOIN source src ON src.id = d.source_id AND src.importable = true
-             FULL JOIN src_these s ON s.source_id = d.source_id AND s.source_code::text = d.source_code::text
-)
-SELECT diff.source_code,
-       diff.source_id,
-       diff.operation,
-       diff.u_source_id,
-       diff.u_etablissement_id,
-       diff.u_doctorant_id,
-       diff.u_ecole_doct_id,
-       diff.u_unite_rech_id,
-       diff.u_titre,
-       diff.u_etat_these,
-       diff.u_resultat,
-       diff.u_code_sise_disc,
-       diff.u_lib_disc,
-       diff.u_date_prem_insc,
-       diff.u_date_prev_soutenance,
-       diff.u_date_soutenance,
-       diff.u_date_fin_confid,
-       diff.u_lib_etab_cotut,
-       diff.u_lib_pays_cotut,
-       diff.u_correc_autorisee,
-       diff.u_correc_effectuee,
-       diff.u_soutenance_autoris,
-       diff.u_date_autoris_soutenance,
-       diff.u_tem_avenant_cotut,
-       diff.u_date_abandon,
-       diff.u_date_transfert,
-       diff.s_source_id,
-       diff.s_etablissement_id,
-       diff.s_doctorant_id,
-       diff.s_ecole_doct_id,
-       diff.s_unite_rech_id,
-       diff.s_titre,
-       diff.s_etat_these,
-       diff.s_resultat,
-       diff.s_code_sise_disc,
-       diff.s_lib_disc,
-       diff.s_date_prem_insc,
-       diff.s_date_prev_soutenance,
-       diff.s_date_soutenance,
-       diff.s_date_fin_confid,
-       diff.s_lib_etab_cotut,
-       diff.s_lib_pays_cotut,
-       diff.s_correc_autorisee,
-       diff.s_correc_effectuee,
-       diff.s_soutenance_autoris,
-       diff.s_date_autoris_soutenance,
-       diff.s_tem_avenant_cotut,
-       diff.s_date_abandon,
-       diff.s_date_transfert,
-       diff.d_source_id,
-       diff.d_etablissement_id,
-       diff.d_doctorant_id,
-       diff.d_ecole_doct_id,
-       diff.d_unite_rech_id,
-       diff.d_titre,
-       diff.d_etat_these,
-       diff.d_resultat,
-       diff.d_code_sise_disc,
-       diff.d_lib_disc,
-       diff.d_date_prem_insc,
-       diff.d_date_prev_soutenance,
-       diff.d_date_soutenance,
-       diff.d_date_fin_confid,
-       diff.d_lib_etab_cotut,
-       diff.d_lib_pays_cotut,
-       diff.d_correc_autorisee,
-       diff.d_correc_effectuee,
-       diff.d_soutenance_autoris,
-       diff.d_date_autoris_soutenance,
-       diff.d_tem_avenant_cotut,
-       diff.d_date_abandon,
-       diff.d_date_transfert
-FROM diff
-WHERE diff.operation IS NOT NULL
-  AND (diff.operation = 'undelete'::text OR 0 < (diff.u_source_id + diff.u_etablissement_id + diff.u_doctorant_id +
-                                                 diff.u_ecole_doct_id + diff.u_unite_rech_id + diff.u_titre +
-                                                 diff.u_etat_these + diff.u_resultat + diff.u_code_sise_disc +
-                                                 diff.u_lib_disc + diff.u_date_prem_insc + diff.u_date_prev_soutenance +
-                                                 diff.u_date_soutenance + diff.u_date_fin_confid +
-                                                 diff.u_lib_etab_cotut + diff.u_lib_pays_cotut +
-                                                 diff.u_correc_autorisee + diff.u_correc_effectuee +
-                                                 diff.u_soutenance_autoris + diff.u_date_autoris_soutenance +
-                                                 diff.u_tem_avenant_cotut + diff.u_date_abandon +
-                                                 diff.u_date_transfert));
-