```{toctree} ``` # Documentation des interactions SIAP APiLos [Tableau de bord des développements communs entre SIAP et APiLos](https://airtable.com/invite/l?inviteId=invjSqVR5SIISoGI3&inviteToken=5babfd0fd34037720159687a027598c3e25bda33d8ced8361dc1f9a3e18ba90f&utm_medium=email&utm_source=product_team&utm_content=transactional-alerts) ## Environnements | Environnement | URL SIAP | URL APiLos version SIAP | Propos de l'environement | | :--- | :--- |:--- |:--- | | Production | https://siap.logement.gouv.fr (MTE) | https://apilos.logement.gouv.fr | Partagé avec la version APiLos autonome de production | | Ecole | https://ecole.siap.logement.gouv.fr (MTE) | https://siap-ecole.apilos.beta.gouv.fr | Utilisé pour les formations | | Recette | https://minlog-siap.gateway.recette.sully-group.fr (Sully) | https://siap-recette.apilos.beta.gouv.fr | Rectte métier | | Integration | https://minlog-siap.gateway.intapi.recette.sully-group.fr (Sully) | https://siap-integration.apilos.beta.gouv.fr | Utilisé pour le développement et la validation des fonctionnalités impliquant les 2 plateformes Partagé avec la version APiLos autonome de staging | ## 2 API, même protocole Les 2 plateformes SIAP et APiLos mettent à disposition une API qui utilise le même processus d'authentification via JWT. l'API mise à disposition par APiLos est disponible dans le dossier [./api](https://github.com/MTES-MCT/apilos/tree/main/api) Le client d'API pour communiquer avec l'API SIAP est disponible dans le dossier [./siap](https://github.com/MTES-MCT/apilos/tree/main/siap) Chaque requête de ces 2 APIs est authentifiée grâce à un JWT token qui contient l'identifiant et l'hailitatio courante de l'utilisateur. ce JWT est signé avec le protocole HS256 via une clé secrête partagée par les 2 plateformes ## Responsabilité des plateformes 3 plateformes sont mentionnées dans ce document. ### CERBERE Cerbere est responsable de garantir l'identité de l'utilisateur. Cette plateforme est utilisé par le SIAP et par APiLos comme un SSO (Single Sign On) ### SIAP La plateforme SIAP est responsable de la partie financement des logements sociaux. Pour garantir la cohérente avec APiLos, la plateforme SIAP est responsable de : - La gestion des habilitations : APiLos consomme les habilitations depuis L'API du SIAP et applique ces habilitations - La gestion du menu : pour chaque couple utilisateur, habilitation, APiLos consomme l'API du SIAP et affiche le contenu du menu transmis par le SIAP ### APiLos La plateforme APiLos est responsable de la partie conventionnement APL des logements sociaux. La plateforme est responsable des indicateurs affichés parle tableau de bord du SIAP : pour chaque couple utilisateur, habilitation le SIAP consomme les indicateurs de conventionnement via l'API d'APiLos et les affiche sur le tableau de bord de l'utilisateur ## Cas d'utilisation ### Autentification au SIAP ou APiLos via CERBERE L'authentification via CERBERE utilise le même protocole pour le SIAP et APiLos ```mermaid sequenceDiagram actor Client participant SIAP / APiLos participant CERBERE Note over Client, CERBERE : Client non authentifié Client->>+SIAP / APiLos: Accès à l'application Client->>CERBERE: Redirection pour authentification Note over CERBERE: Authentification CERBERE->>Client: Redirection avec token Client->>SIAP / APiLos: Accès avec token SIAP / APiLos->>CERBERE: Vérification du token SIAP / APiLos->>-Client: Accès identifié Note over Client, CERBERE : Client authentifié ``` Ce processus d'authentification est représenté par le bloc nommé `Authentification via CERBERE` dans la suite du document ### Connexion au SIAP et redirection APiLos / SIAP via le menu Représentation de la bascule entre les 2 plateformes lorsque l'utilisateur clique sur les lien «Conventionnement» et «Financement» du menu. ```mermaid sequenceDiagram actor Client participant SIAP participant APiLos Client->>+SIAP: Accès à la plateforme Note over Client, APiLos: Authentification via CERBERE SIAP->>-Client: Affichage de la plateforme Note Over Client: clic sur `Oprération > Conventionnement` Client->>+APiLos: Redirection vers APiLos
avec habilitation_id active dans l'url Note over Client, APiLos: Authentification via CERBERE APiLos->>SIAP: GET habilitations APiLos->>APiLos: CREATE IF NOT EXIST de l'entité de l'habilitation APiLos->>SIAP: GET menu APiLos->>-Client: Affichage de l'application avec l'entête selon habilitations Note Over Client: clic sur `Opération > Financement` Client->>SIAP: Redirection vers APiLos
avec habilitation_id active dans l'url ``` ### Bascule vers le conventionnement à partir d'une opération SIAP Quand une opération est conventionnable, l'interface SIAP affiche un lien «Conventionnement» sur la page de convention qui redirige vers la page de conventionnement de l'opération. ```mermaid sequenceDiagram actor Client participant SIAP participant APiLos Client->>+SIAP: Affichage d'une opération Note over Client, APiLos: Authentification via CERBERE SIAP->>-Client: Affichage d'une opération Note Over Client: clic sur `Conventionner l'opération` Client->>+APiLos: Accès à l'application Note over Client, APiLos: Authentification via CERBERE APiLos->>SIAP: GET habilitations APiLos->>APiLos: CREATE IF NOT EXIST de l'entité de l'habilitation APiLos->>SIAP: GET menu APiLos->>SIAP: GET operation APiLos->>APiLos: CREATE IF NOT EXIST des conventions de l'opération APiLos->>-Client: Affichage des conventions de l'opération ``` ### Affichage des indicateurs de conventionnement dans le tableau de bord du SIAP Le SIAP collecte les KPI concernant le conventionnement à afficher sur le tableau de bord du SIAP via l'API mise à disposition par APiLos ```mermaid sequenceDiagram actor Client participant SIAP participant APiLos Client->>+SIAP: Accès au taleau de bord Note over Client, APiLos: Authentification via CERBERE SIAP->>+APiLos: GET indicateur de conventionnement
avec utilisateur et habilitation_id APiLos->>SIAP: GET habilitations APiLos->>APiLos: CREATE IF NOT EXIST de l'entité de l'habilitation APiLos->>-SIAP: retour des indicateurs de conventionnement SIAP->>-Client: Affichage du tableau de bord ``` ## Interprétation des Habilitations SIAP Les habilitations sont interprétées de 3 manières : 1. Les Bailleurs * Maitre d'ouvrage personne moral * Maitre d'ouvrage personne physique Les utilisateurs de type bailleur sont autoirisés à voir et modifier les opérations, conventions et objects associés appartenant à l'entité maitrise d'ouvrage définit par l'habilitation active. 2. Les instructeurs (Service gestionaire) * Service gestionnaire Les utilisateurs de type instructeur sont autoirisés à voir et modifier les opérations, conventions et objects associés appartenant à l'entité administrative définit par l'habilitation active. 3. Les administrateurs * Service départemental * Direction régionale * Administration centrale Les utilisateurs de type administrateur sont autoirisés à voir et modifier les opérations, conventions et objects associés selon la géographie du profile : le département, la région ou la france entièrte définit par l'habilitation active. Pour chacun de ces type, si l'habilitation est de type lecture seule, l'utilisateur n'a pas le droits de création ou modification des conventions. ## Partage d'objet avec le SIAP Les objets de la plateforme de financement (SIAP) sont récupérés et créés à la demande sur APiLos dans 2 cas de figure 1. Lorsqu'un utilisateur se connecte sur APiLos: 1. APiLos vérifie l'authentification de l'utilisateur via CERBERE 1. APiLos récupère les habilitations de l'utilisateur via le SIAP, l'habilitation active de l'utilisateur est transmise par le SIAP via le paramètre habilitation_id dans l'url. Si ce paramètre n'est pas présent, la première habilitation disponible dans la liste des habilitations récupérées du SIAP sera l'habilitation active. 1. APilos crée le Bailleur ou l'Administration de l'habilitation active de l'utilisateur si cette entité n'existe pas déjà 1. Les permissions associées à l'habilitation active sont stockées en session. 2. Lorsqu'un utilisateur accède aux conventions liées à une opération 1. APiLos récupère les informations liées à l'opération financée 1. APiLos crée la Bailleur et l'Administration de l'opération si ces entités n'existent pas déjà 1. APiLos crée l'Opération si cette entité n'existent pas déjà 1. APiLos crée 1 lots par Aide (PLUS, PLAI, PLS…) si ces lot n'exitent pas déjà, note : l'aide PLAI_ADP (PLAI adapté) sont inclus dans dans l'aide PLAI et nefont pas l'objet de convention spécifique 1. APiLos crée 1 convention par lots si cette convention n'existe pas déjà ### Détails des objets partagés par le SIAP et repris dans APiLos On notera : `champ_siap` (`champ_apilos` details) * Les Administrations * champ pivot : `code` (`code` de l'administration) * champs repris lors de la création : `libelle` (`nom` de l'administration) * Les Bailleurs * champ pivot : `siren` * champs repris lors de la création : * `nom` ou `raisonSociale` (`nom` du bailleur) * `adresse` interprété des champs d'adresses du SIAP (`adresse`) * `codePostal` (`code_postal`) * `ville` interprété des champs d'adresses du SIAP (`ville`) * `codeFamilleMO` (nature du bailleur) * Les Opérations (opérations financées via le SIAP) * champ pivot : `numeroOperation` (numero_operation) * champs repris lors de la création : * `nomOperation` (`nom`) * `adresse` interprété des champs d'adresses du SIAP (`adresse`) * `code_postal` interprété des champs d'adresses du SIAP (`code_postal`) * `ville` interprété des champs d'adresses du SIAP (`ville`) * `commune`/`codeInsee` (`code_insee_commune`) * `departement`/`codeInsee` (`code_insee_departement`) * `region`/`codeInsee` (`code_insee_region`) * `zonage123` (`zone_abc`) * `zonageABC` (`zone_123`) * `sansTravaux` ou `sousNatureOperation` (`type_operation`) * `natureLogement` (`nature_logement`) * Les Lots ( un lot par financement et par Opération) * champ pivot : `numero` de l'opération + `financement` * champs repris lors de la création : * `aide`/`code` (`financement`) * selon les valeurs `nbLogementsIndividuels`, `nbLogementsCollectifs` (`type_habitat` COLLECTIF, INDIVIDUEL ou MIXTE), * `nbLogementsIndividuels` + `nbLogementsCollectifs` (`nb_logements`) ### Les valeurs des listes valuées et leurs correspondances #### Nature du bailleur (SIAP -> APiLos) * HLM -> HLM * SEM -> SEM * par défaut (toute autre valeur) -> Bailleurs privés #### Type de l'opération (dépend des champs `sansTravaux` ou `sousNatureOperation`) (SIAP -> APiLos) * Si `sansTravaux` = 1 -> SANSTRAVAUX * CNE -> NEUF * AAM -> ACQUISAMELIORATION * AST -> ACQUISSANSTRAVAUX * par défaut (toute autre valeur) -> SANSOBJET #### Nature logement (SIAP -> APiLos) * ALF -> AUTRE * HEB -> HEBERGEMENT * RES -> RESISDENCESOCIALE * PEF -> PENSIONSDEFAMILLE * REA -> RESIDENCEDACCUEIL * REU -> RESIDENCEUNIVERSITAIRE * RHVS -> RHVS * LOO -> LOGEMENTSORDINAIRES Par défaut la valeur LOGEMENTSORDINAIRES est appliquée ## Tests des API SIAP et APiLos ### Pour tester le Client de l'API du SIAP dans un shell (Appel de l'application SIAP à partir du backend de l'application APiLos) Récupérer l'email de l'utilisteur utilisé pour les tests : généralement votre propre email utilisé pour se connecter à CERBERE Récupérer l'ID de l'habilitation utilisé pour les tests : les ID sont accéssibles en inspectant les liens du menu permettant de changer d'habilitation en haut à droite de l'écran Ouvrir un shell django, puis tester quelques appels: ```python from siap.siap_client.client import SIAPClient SIAPClient.get_instance().get_habilitations(user_login='user@domain.com') SIAPClient.get_instance().get_menu(user_login='user@domain.com', habilitation_id=5) SIAPClient.get_instance().get_operation(user_login='user@domain.com', habilitation_id=27, operation_identifier='20221000003') SIAPClient.get_instance().get_fusion(user_login='user@domain.com', habilitation_id=123, bailleur_siren="123456789") ``` L'ensemble des routes mises à disposition par l'API du SIAP sont disponible dans le fichier OpenAPI [siap/siap_client/api-siap-int.json](../siap/siap_client/api-siap-int.json) ### Pour tester le Client de l'API d'APiLos dans un shell (Appel de l'application APiLos à partir du backend de l'application SIAP) Les API pour dialoguer avec le SIAP sont disponibles sur le endpoint `api-siap/v0` Une interface swagger est disponible sur la route `/api-siap/v0/schema-ui/` et le contrat d'interface OpenAPI 3 sur la route `/api-siap/v0/schema/`. Récupérer l'email de l'utilisteur utilisé pour les tests : généralement votre propre email utilisé pour se connecter à CERBERE Récupérer l'ID de l'habilitation utilisé pour les tests : les ID sont accéssibles en inspectant les liens du menu permettant de changer d'habilitation en haut à droite de l'écran Ouvrir un shell django, pour générer un Token JWT : ```python from siap.siap_client.client import build_jwt build_jwt(user_login="my.name@beta.gouv.fr", habilitation_id=31) ``` Accéder à l'interface de test : /api-siap/v0/schema-ui/#/statistics/convention_kpi_list Cliquez sur le bouton `Authorize` à droite de d'écran et copier le JWT token L'ensemble des fonctions de la page sont maintenant testables ⚠️ Attention, le token JWT n'est valide que 5 minutes #### Exemple du contenu du token JWT généré par la fonction build_jwt ```json { "iat": 1555458148, "exp": 2655458448, "token_type": "access", "jti": "c14f318c99024a398a39281d3827e612", "user-login": "user@domain.com", "habilitation-id": 6 } ``` Il est possible aussi de générer de token via un site tel que https://jwt.io/ et en utilisant la clé JWT_SIGN_KEY pour signer le token ## Comportement APilos lors de l'accès à partir d'une opération SIAP Quand l'utilisateur accède à la page de conventionnement d'une operation, les conventions existantes sur APiLos sont collectées, si certains financement doivent-être conventionnés et que la convention n'existe pas, elle est créée, si des anomalies sont détectées toutes les conventions sont affiché et un message d'erreur indique à l'utilisateur qu'il a un conflit à résoudre. ```mermaid graph TD A["route /operations/num_op"] --> B[Collect Programmes, on collecte l'ensemble des programmes qui ont le numéro d'opération] B --> C{programmes existants ?} C -->|Oui| D[Collect Conventions, on collecte l'ensemble des conventions et leurs lots] C -->|Non| E[Creation du Programme] E --> F{Progrmme de type SECONDE_VIE ?} F -->|Oui| G[Gestion en mode seconde vie] F -->|Non| D D --> I{"Conventions (non annulées) alignées sur les financement de l'opération ?"} I -->|Oui| J[Affichage des conventions] I -->|Non| K{On ne trouve pas de conventions correspondant à chacun des financements de l'opération} K -->|Oui| L[Création des conventions/lots manquantes] L --> M{il y a trop de conventions : plusieurs conventions trouvé par type de financement?} M --> N[Création de messages d'erreur] N --> J ```