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

wip

parent ff2db52a
Loading
Loading
Loading
Loading
+1 −1
Changes for composer.json: 1 added line, 1 removed line.
Original line number Diff line number Diff line
@@ -61,7 +61,7 @@

        "unicaen/alerte": "^3.2",
        "unicaen/api": "dev-master",
        "unicaen/app": "6.3",
        "unicaen/app": "^6.3",
        "unicaen/auth-token": "^7.1",
        "unicaen/authentification": "^6.4",
        "unicaen/privilege": "^6.3.0",
+2 −2
Changes for module/Application/view/application/rapport/partial/rapports-table.phtml: 2 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -320,7 +320,7 @@ $acteursFormatterCodirecteurs->asSeparated()
                <!----------------- Autorisation de réinscription ----------------->
                <?php
                /** @var AutorisationInscriptionThese|null $autorisationInscription */
                if ($autorisationsInscriptionParAnneeUniv->offsetExists($rapport->getAnneeUniv())) {
                if ($autorisationsInscriptionParAnneeUniv?->offsetExists($rapport->getAnneeUniv())) {
                    $autorisationInscription = $autorisationsInscriptionParAnneeUniv->offsetGet($rapport->getAnneeUniv());
                } else {
                    $autorisationInscription = new AutorisationInscriptionThese();
@@ -335,7 +335,7 @@ $acteursFormatterCodirecteurs->asSeparated()
                <!----------------- Autorisation de diplomation ----------------->
                <?php
                /** @var AutorisationDiplomationThese|null $autorisationDiplomationThese */
                if ($autorisationsDiplomationParAnneeUniv->offsetExists($rapport->getAnneeUniv())) {
                if ($autorisationsDiplomationParAnneeUniv?->offsetExists($rapport->getAnneeUniv())) {
                    $autorisationDiplomationThese = $autorisationsDiplomationParAnneeUniv->offsetGet($rapport->getAnneeUniv());
                } else {
                    $autorisationDiplomationThese = new AutorisationDiplomationThese();
+270 −0
Changes for module/AutorisationDiplomationThese/doc/connecteur_pegase_sygal.md: 270 added lines, 0 removed lines.
Original line number Diff line number Diff line
Connecteur Pégase-SyGAL
=======================

Flux Autorisation de diplomation (SyGAL => Pégase)
--------------------------------------------------

### Configuration

- SyGAL

Deux aspects à configurer : l'accès à l'API Pégase proprement dite et l'accès pour l'obtention du token JWT de
sécurisation.

```php
    'unicaen-api' => [
        /**
         * Config des clients d'API.
         * @see \UnicaenApi\ApiClientPluginManager
         */
        'api_clients' => [
            'clients' => [
                // Nom unique du client => config
                'diplomation_api_client' => [
                    // Classe du client HTTP
                    'class' => RestClient::class,
                    // Options
                    'options' => [
                        // Options standards
                        'base_uri' => 'https://coc.pilote-unicaen.pc-scol.fr/api/coc/ext/v1',
                        'proxy' => false, // ['no' => 'localhost']
                        'verify' => false,
                        //'allow_redirects' => false,
                        'timeout' => 10,
                        'debug' => true,
                        'debug_file' => '/tmp/debug_curl.log',

                        // Taille maxi du corps des messages d'erreurs reçus
                        'http_errors_truncate_at' => 1500,

                        // Middlewares Guzzle éventuels (https://docs.guzzlephp.org/en/stable/handlers-and-middleware.html)
                        'middlewares' => [
                            'jwt_middleware',
                        ],
                    ],
                ],
            ],
        ],
        'api_client_middlewares' => [
            'factories' => [
                JwtMiddleware::class => JwtMiddlewareFactory::class, // substitution nécessaire
            ],
            'middlewares' => [
                'jwt_middleware' => [
                    'class' => JwtMiddleware::class,
                    'options' => [
                        'base_uri' => 'https://auth.domain.fr',
                        'token_url' => '/cas/v1/tickets',
                        'username' => 'xxxxx',
                        'password' => 'xxxxx',
                        'auth_strategy' => JwtMiddlewareAuthStrategy::class, // auth strategy qui ajoute "token=true"
                        'persistence_strategy' => SimpleCacheTokenPersistence::class,
                    ],
                ],
            ],
        ],
    ],
    'caches' => [
        /**
         * Cache utilisé pour persister les tokens JWT et éviter ainsi qu'un nouveau token soit demandé avant chaque appel d'API.
         */
        'jwt_middleware_token_persistence_cache' => [
            'options' => [
                'ttl' => 60*60, // 1h
                'cache_dir' => __DIR__ . '/../../data/cache',
            ],
        ],
    ],
```

- Pégase

Cf. doc Pégase !


### Envoi d'une Autorisation de diplomation de test vers Pégase en ligne de commande

Les commandes curl utilisées pour générer les exemples de cette doc figurent dans les fichiers `curl.txt` des différents
sous-dossiers de ce dossier.

- Obtention d'un token

```bash
username='????'
password='????'
tokenurl='https://auth.domain.fr/cas/v1/tickets'
token=$(curl -k -d "username=$username&password=$password&token=true" -H "Content-Type: application/x-www-form-urlencoded" -X POST $tokenurl)
echo $token
```

- Appel de l'API

Exemple : envoi d'une autorisation de diplomation...

```bash
etab='ETABL0'
apprenant='000000111'
objet='THTEST-123'
periode='PER-23-24'
fichier='admis.json'
# contenu du fichier admis.json :
#{
#  "codeTypeResultat": "TRE001",
#
#  "dateSoutenance": "2025-11-06",
#  "sujetThese": "string",
#  "directeurThese": {
#    "nomFamille": "Hochon",
#    "prenom": "Paul",
#    "titre": "Directeur de thèse",
#    "fonction": "Prof des universités",
#    "universite": "Université de Caen",
#    "pays": "France"
#  },
#  "president": {
#    "nomFamille": "Ptitegoutte",
#    "prenom": "Justine",
#    "titre": "Présidente du jury",
#    "fonction": "Professeure des universités",
#    "universite": "Université de Caen",
#    "pays": "France"
#  },
#  "listeCoEncadrantThese": [
#    {
#      "nomFamille": "Dame",
#      "prenom": "Madame",
#      "titre": "string",
#      "fonction": "string",
#      "universite": "string",
#      "pays": "string"
#    }
#  ],
#  "listeMembreJury": [
#    {
#      "nomFamille": "Terrieur",
#      "prenom": "Alain",
#      "titre": "string",
#      "fonction": "Membre du jury",
#      "universite": "Université de Strasbourg",
#      "pays": "string"
#    },
#    {
#      "nomFamille": "Terrieur",
#      "prenom": "Alex",
#      "titre": "string",
#      "fonction": "Membre du jury",
#      "universite": "Université de Strasbourg",
#      "pays": "string"
#    }
#  ],
#  "listeEtablissementDeCoTutelle": [
#    {
#      "nom": "string",
#      "pays": "string",
#      "dateConvention": "2025-11-06"
#    }
#  ]
#}
curl -X 'PUT' \
  "$apiurl/etablissements/$etab/periodes/$periode/objets-maquette/$objet/apprenants/$apprenant/troisieme-cycle/diplome" \
  -H 'accept: */*' \
  -H "Authorization: Bearer $token" \
  -H 'Content-Type: application/json' \
  --data-binary "@./module/AutorisationDiplomationThese/tests/curl/json/$fichier"
```


### Envoi d'une Autorisation de diplomation vers Pégase

Du fait que l'autorisation de displomation dépend théoriquement de la teneur du rapport CSI de l'année en cours, 
le point de départ du processus d'envoi d'une autorisation de diplomation vers Pégase se trouve sur la page des 
rapports CSI de la thèse considérée :

![autoris_diplo_rapport_csi.png](resources/autoris_diplo_rapport_csi.png)

La création d'une autorisation de diplomation se fait via le bouton "Autorisation de diplomation" sur l'année 
*en cours* (ex : 2024/2025). Voici le formulaire qui s'affiche lorsqu'on clique sur ce bouton : 

![autoris_insc_form.png](resources/autoris_insc_form.png)

Une fois créée, l'autorisation figure sur la page des rapports CSI :

![autoris_insc_creee.png](resources/autoris_insc_creee.png)

On peut retrouver les autorisations de diplomation créées en cliquant sur le lien "Autorisations de diplomation"

![autoris_insc_liste.png](resources/autoris_insc_liste.png)

NB : en l'état actuel, toutes les autorisations de diplomations de toutes les thèses figurent sur cette page, navré ;
vous pouvez néanmoins faire une recherche pour une thèse précise en utilisant le champ de recherche textuelle
(identique à celui de l'annuaire de thèses).

Cliquez sur le lien correspondant à l'autorisation de diplomation qui vous intéresse (ex : 2025/2026) pour accéder 
aux détails et au nécessaire pour l'envoi vers Pégase :

![autoris_insc_detail.png](resources/autoris_insc_detail.png)

NB : pour l'instant, le processus est entièrement manuel et paraîtra peut-être fastidieux mais le développement ayant
été fait sans pilote fonctionnel dans l'avion, mieux valait décomposer en étapes élémentaires.

Cliquez sur le bouton "Créer les données" pour accéder au formulaire de création des données nécessaires à la 
transmission de l'autorisation vers Pégase :

![autoris_insc_form_donnees_tx.png](resources/autoris_insc_form_donnees_tx.png)

Si une inscription administrative reçue de Pégase l'année précédente existe, il est possible de la sélectionner,
ce qui évite de resaisir les différentes informations nécessaires à l'envoi vers Pégase.

Une fois le formulaire validé, les données de transmission sont créées et s'affichent :

![autoris_insc_donnees_tx_crees.png](resources/autoris_insc_donnees_tx_crees.png)

Cliquez sur le bouton "Programmer la transmission" : une tâche, appelée "événement" dans l'application, sera créée.
C'est cette tâche (événement), lorsqu'elle sera exécutée, qui réalisera la transmission de l'autorisation 
de diplomation à Pégase.

![autoris_insc_tx_programmee.png](resources/autoris_insc_tx_programmee.png)

Notez bien qu'une fois programmée, la transmission n'est pas effectuée immédiatement mais dans les minutes qui suivent 
(sauf incident, ou si le traitement périodique des événements n'est pas programmé).
Ensuite, pour vérifier la bonne exécution de la transmission, vous devrez recharger cette page ou y revenir quelques 
minutes plus tard.

NB : si le traitement périodique des événements n'est pas programmé (opération technique, cf. doc de la bibliotheque
unicaen/evenement), il vous faudra ouvrir *dans un autre onglet* (ctrl + clic) la page "Administration > Événements" 
(menu principal) pour retrouver l'événement en question (ex : événement 51) :

![autoris_insc_evenements.png](resources/autoris_insc_evenements.png)

Pour exécuter l'événement, cliquez sur le lien en forme de triangle bleu. Une fenêtre apparaîtra indiquant le succès
ou l'échec de l'opération. Réactualiser la page des événements, vous aurez accès au statut/état et détails
de l'exécution de l'évenement (en cliquant sur le lien en forme d'oeil) :

![autoris_insc_evenement_apres_exec.png](resources/autoris_insc_evenement_apres_exec.png)

Dans les détails de l'événement, vous voyez notamment le statut/état, la date et le log de la dernière exécution :

![autoris_insc_evenement_details.png](resources/autoris_insc_evenement_details.png)

Retournez sur l'onglet (que vous avez laissé ouvert normalement) affichant la page des données de transmission de 
l'autorisation de diplomation en question, après avoir réactualisé la page vous y retrouverez toutes les tentatives 
d'exécution de la transmission de l'autorisation de diplomation :

![autoris_insc_donnees_tx_effectuees.png](resources/autoris_insc_donnees_tx_effectuees.png)

En cas d'échec de transmission, vous pourrez reprogrammer la transmission en cliquant sur le bouton correspondant.



Flux Autorisation de diplomation (SyGAL => Pégase)
--------------------------------------------------

### Configuration

- SyGAL



- Pégase

Cf. doc Pégase.
+86.9 KiB
Loading image diff...
+80 −0
Changes for module/AutorisationDiplomationThese/doc/resources/data.sql: 80 added lines, 0 removed lines.
Original line number Diff line number Diff line
--
--                          Transmission d'autorisation de diplomation
--
-- Création du doctorant, de sa thèse, d'une année universitaire et d'un rapport CSI.
--

INSERT INTO individu (id, type, civilite, nom_usuel, nom_patronymique, prenom1, prenom2, prenom3, email,
                      date_naissance, nationalite, source_code, source_id, histo_createur_id, histo_creation,
                      supann_id, pays_id_nationalite, id_ref, npd_force, est_substituant_modifiable,
                      synchro_undelete_enabled, synchro_update_on_deleted_enabled, apatride, pays_naissance_id,
                      orcid, id_hal)
VALUES (nextval('individu_id_seq'), 'doctorant', 'Mme', 'HOCHON', 'HOCHON', 'Paule', 'Bernadette', null,
        'paule.hochon@mail.fr',
        '1988-03-04 00:00:00.000000', 'FRANCAIS(E)', 'SYGAL::053386367AA', 1, 1, current_timestamp,
        '22313702', 79, null, null, true, true, false,
        false, null, null, null);

INSERT INTO doctorant (id, etablissement_id, individu_id, source_code, source_id, histo_createur_id,
                       histo_creation, ine, source_code_sav,
                       code_apprenant_in_source, npd_force,
                       est_substituant_modifiable, synchro_undelete_enabled, synchro_update_on_deleted_enabled)
VALUES (nextval('doctorant_id_seq'), 2, currval('individu_id_seq'), 'SYGAL::053386367AA', 1, 1, current_timestamp,
        '053386367AA', null, null, null, true, true, false);

INSERT INTO these (id, etablissement_id, doctorant_id, ecole_doct_id, unite_rech_id, correc_autorisee,
                   date_fin_confid, date_prem_insc, date_soutenance, etat_these, lib_etab_cotut, lib_pays_cotut,
                   resultat, soutenance_autoris, tem_avenant_cotut, titre, source_code, source_id,
                   histo_createur_id, histo_creation, correc_autorisee_forcee, date_abandon,
                   date_transfert, correc_effectuee, correc_date_butoir_avec_sursis, code_sise_disc,
                   etab_cotut_id, pays_cotut_id, discipline_sise_id,
                   resaisir_autorisation_diffusion_depot_version_corrigee,
                   resaisir_attestations_depot_version_corrigee)
VALUES (nextval('these_id_seq'), 2, currval('doctorant_id_seq'), 86, 841, null, null, null, null, 'E', null, null, null,
        null, 'N',
        'Laideur et dysharmonie',
        'SYGAL::053386367AA', 1, 1, current_timestamp, null, null, null,
        'N', null, '4200031', null, null, 31, null, null);

insert into these_annee_univ(id, source_code, source_id, these_id, annee_univ, histo_createur_id,
                             est_1ere_annee_inscription)
values (nextval('these_annee_univ_id_seq'), 'SYGAL::053386367AA', 1, currval('these_id_seq'), 2024, 1, false);

/*
select * from these_annee_univ where source_code = 'SYGAL::053386367AA';
select * from these where source_code = 'SYGAL::053386367AA' ;
select * from doctorant where source_code = 'SYGAL::053386367AA';
select * from individu where source_code = 'SYGAL::053386367AA';
select * from these where source_code = 'SYGAL::053386367AA';
-- ménage :
delete from these_annee_univ where source_code = 'SYGAL::053386367AA';
delete from these where source_code = 'UCN::31546145';
delete from doctorant where source_code = 'SYGAL::053386367AA';
delete from individu where source_code = 'SYGAL::053386367AA';
*/

INSERT INTO fichier (id, uuid, nature_id, nom, nom_original, type_mime, taille, description, version_fichier_id,
                            histo_creation, histo_createur_id, histo_modification, histo_modificateur_id)
select nextval('fichier_id_seq'), '953e0e55-12be-431b-8804-053386367AA', 121, 'RAPPORT-CSI-ED558-HOCHON-Paule-2024-2025-953e0e55.pdf',
        'rapport1.pdf', 'application/pdf', 42338, null, 3, current_timestamp, 1, current_timestamp, 1;
INSERT INTO rapport (id, these_id, fichier_id, annee_univ, est_final, histo_createur_id, histo_modificateur_id,
                            histo_creation, type_rapport_id)
select nextval('rapport_id_seq'), currval('these_id_seq'), currval('fichier_id_seq'), 2024, false, 1,
       1, current_timestamp, 3;
---
-- INSERT INTO fichier (id, uuid, nature_id, nom, nom_original, type_mime, taille, description, version_fichier_id,
--                             histo_creation, histo_createur_id, histo_modification, histo_modificateur_id)
-- select nextval('fichier_id_seq'), 'd060dbd7-da8b-4c0f-bab9-053386367AA', 121, 'RAPPORT-CSI-ED558-HOCHON-Paule-2025-2026-d060dbd7.pdf',
--        'rapport2.pdf', 'application/pdf', 3153, null, 3, '2026-04-29 13:53:26.668608', 1, '2026-04-29 13:53:26.668608', 1;
-- INSERT INTO rapport (id, these_id, fichier_id, annee_univ, est_final, histo_createur_id, histo_modificateur_id,
--                             histo_creation, type_rapport_id)
-- select nextval('rapport_id_seq'), currval('these_id_seq'), currval('fichier_id_seq'), 2025, false, 1,
--        1, '2026-04-29 13:53:26.676593', 3;

/*
select * from rapport where these_id = (select id from these where source_code = 'SYGAL::053386367AA');
select * from fichier where uuid like '%-053386367AA';
-- ménage :
delete from rapport where these_id = (select id from these where source_code = 'SYGAL::053386367AA');
delete from fichier where uuid like '%-053386367AA';
*/
 No newline at end of file
Loading