Administrateurs

Paramétrage de la fiche détail
Paramétrer la fiche détail de l'établissement en fonction des catégories et des champs 

 <Strong>Informations générales</Strong>

{{ name|gogo_text }}

{{ email|gogo_email(label = "Courriel:") }}

{{ address|gogo_text(label = "Adresse:") }} {{ originalAddress.addressLocality }}

Téléphone: {{ telephone}}

RNE: {{ rne }}

{{ nom_commune }}

Mise à jour: {{ date_maj_ligne }}

<Strong>Autres informations</Strong>

{% for value in groups["type_etablissement"].children %}

<div>Type d'établissement: {{ value.option.name }}</div>

{% endfor %}

{% for value in groups["nom_circonscription"].children %}

<div>Circonscription: {{ value.option.name }}</div>

{% endfor %}

{% for value in groups["pial"].children %}

<div>PIAL: {{ value.option.name }}</div>

{% endfor %}

{% for value in groups["statut_public_prive"].children %}

<div>Statut: {{ value.option.name }}</div>

{% endfor %}

Nombre d'élèves: {{ nombre_d_eleves }}

{% if college_de_secteur %} Collège de secteur: {{ college_de_secteur }} {% else%} {% endif %}

 

 Version 27/05 

 <Strong>Informations générales</Strong>

{{ name|gogo_text }}

{{ email|gogo_email(label = "Courriel:") }}

{{ address|gogo_text(label = "Adresse:") }} {{ originalAddress.addressLocality }}

{{ files|gogo_text(label = "Toile:") }}

Téléphone: {{ telephone}}

RNE: {{ rne }}

{{ nom_commune }}

Mise à jour: {{ date_maj_ligne }}

<Strong>Autres informations</Strong>

{% for value in groups["type_etablissement"].children %}

<div>Type d'établissement: {{ value.option.name }}</div>

{% endfor %}

{% for value in groups["nom_circonscription"].children %}

<div>Circonscription: {{ value.option.name }}</div>

{% endfor %}

{% for value in groups["pial"].children %}

<div>PIAL: {{ value.option.name }}</div>

{% endfor %}

{% for value in groups["statut_public_prive"].children %}

<div>Statut: {{ value.option.name }}</div>

{% endfor %}

Nombre d'élèves: {{ nombre_d_eleves }}

{% if college_de_secteur %} Collège de secteur: {{ college_de_secteur }} {% else%} {% endif %}

{% if groups["labellisation"].children %} 

<div>Labellisation : {% for value in groups["labellisation"].children %}

 {{ value.option.name }}

{% endfor %}

 </div>

 {% else%}

 

 {% endif %}

 

 

 {% if groups["projet"].children %} 

 

 <div> ???? Projets : {% for value in groups["projet"].children %}

 {{ value.option.name }}

 <details> <summary>Les objectifs???? </summary> {{ objectif|gogo_text}} </details> </a>

 <details> <summary>Les objectifs détaillés???? </summary> {{ objectifs_detailles|gogo_text}} </details> </a>

 <details> <summary>Plan des actions???? </summary> {{ plan_action|gogo_text}} </details> </a>

 {{ partenaires_du_projet|gogo_text(label = "Partenaires:")}}

 

{% endfor %}

 </div>

 {% else%}

 

 {% endif %} 

 Version 3/07/2024 Intégration des données PIX avec % 

 <Strong>Informations générales</Strong>

{{ name|gogo_text }}

{{ email|gogo_email(label = "Courriel:") }}

{{ address|gogo_text(label = "Adresse:") }} {{ originalAddress.addressLocality }}

<a href="{{ files }}" target="_blank">Toile de l'établissement</a> </br>

Téléphone: {{ telephone}}

RNE: {{ rne }}

{{ nom_commune }}

 

{% if LUNDI_MATIN_DEBUT %} 

{# Horaire de l'établissement #}

 <div>

 <details> <summary><Strong>Horaire de l'établissement????</Strong> </summary> 

 <table style="border-collapse: collapse; border: 1px solid black" >

 <tr style="border-collapse: collapse; border: 1px solid black">

 <th style="border-collapse: collapse; border: 1px solid black">Lundi</th>

 <th style="border-collapse: collapse; border: 1px solid black">Mardi</th>

 {% if MERCREDI_MATIN_DEBUT %} 

 <th style="border-collapse: collapse; border: 1px solid black">Mercredi</th>

 {% else%} {% endif %}

	 <th style="border-collapse: collapse; border: 1px solid black">Jeudi</th>

 <th style="border-collapse: collapse; border: 1px solid black">Vendredi</th>

 {% if SAMEDI_MATIN_DEBUT %}

 <th style="border-collapse: collapse; border: 1px solid black">Samedi</th>

 {% else%} {% endif %}

 </tr>

 <tr style="border-collapse: collapse; border: 1px solid black">

 <td style="border-collapse: collapse; border: 1px solid black">{{ LUNDI_MATIN_DEBUT.substring(0, 5) }} - {{ LUNDI_MATIN_FIN.substring(0, 5) }} </td>

 

 <td style="border-collapse: collapse; border: 1px solid black">{{ MARDI_MATIN_DEBUT.substring(0, 5) }} - {{ MARDI_MATIN_FIN.substring(0, 5)}} </td>

 

 {% if MERCREDI_MATIN_DEBUT %} 

 <td style="border-collapse: collapse; border: 1px solid black">{{ MERCREDI_MATIN_DEBUT.substring(0, 5) }} - {{ MERCREDI_MATIN_FIN.substring(0, 5)}} </td>

 {% else%} {% endif %}

 <td style="border-collapse: collapse; border: 1px solid black">{{ JEUDI_MATIN_DEBUT.substring(0, 5) }} - {{ JEUDI_MATIN_FIN.substring(0, 5)}} </td>

 <td style="border-collapse: collapse; border: 1px solid black">{{ VENDREDI_MATIN_DEBUT.substring(0, 5) }} - {{ VENDREDI_MATIN_FIN.substring(0, 5)}} </td>

 {% if SAMEDI_MATIN_DEBUT %} 

 <td style="border-collapse: collapse; border: 1px solid black">{{ SAMED_MATIN_DEBUT.substring(0, 5) }} - {{ SAMEDI_MATIN_FIN.substring(0, 5)}} </td>

 {% else%} {% endif %}

 </tr>

 <tr style="border-collapse: collapse; border: 1px solid black">

 <td style="border-collapse: collapse; border: 1px solid black">{{ LUNDI_APRES_MIDI_DEBUT.substring(0, 5) }} - {{ LUNDI_APRES_MIDI_FIN.substring(0, 5) }} </td> 

 <td style="border-collapse: collapse; border: 1px solid black">{{ MARDI_APRES_MIDI_DEBUT.substring(0, 5) }} - {{ MARDI_APRES_MIDI_FIN.substring(0, 5) }} </td> 

 {% if MERCREDI_MATIN_DEBUT %} 

 <td style="border-collapse: collapse; border: 1px solid black">{{ MERCREDI_APRES_MIDI_DEBUT.substring(0, 5) }} - {{ MERCREDI_APRES_MIDI_FIN.substring(0, 5) }} </td> 

 {% else%} {% endif %}

 <td style="border-collapse: collapse; border: 1px solid black">{{ JEUDI_APRES_MIDI_DEBUT.substring(0, 5) }} - {{ JEUDI_APRES_MIDI_FIN.substring(0, 5) }} </td> 

 <td style="border-collapse: collapse; border: 1px solid black">{{ VENDREDI_APRES_MIDI_DEBUT.substring(0, 5) }} - {{ VENDREDI_APRES_MIDI_FIN.substring(0, 5) }} </td> 

 {% if SAMEDI_MATIN_DEBUT %} 

 <td style="border-collapse: collapse; border: 1px solid black">{{ SAMEDI_APRES_MIDI_DEBUT.substring(0, 5) }} - {{ SAMED_APRES_MIDI_FIN.substring(0, 5) }} </td> 

 {% else%} {% endif %}

 </tr>

</table>

{% else%} {% endif %}

</details>

</div>

Mise à jour: {{ date_maj_ligne }}

<Strong>Autres informations</Strong>

{% for value in groups["type_etablissement"].children %}

<div>Type d'établissement: {{ value.option.name }}</div>

{% endfor %}

{% for value in groups["nom_circonscription"].children %}

<div>Circonscription: {{ value.option.name }}</div>

{% endfor %}

{% for value in groups["pial"].children %}

<div>PIAL: {{ value.option.name }}</div>

{% endfor %}

{% for value in groups["statut_public_prive"].children %}

<div>Statut: {{ value.option.name }}</div>

{% endfor %}

Nombre d'élèves: {{ nombre_d_eleves }}

{% if college_de_secteur %} Collège de secteur: {{ college_de_secteur }} {% else%} {% endif %}

{% if groups["labellisation"].children %} 

<div>Labellisation-Certification : {% for value in groups["labellisation"].children %}

 {{ value.option.name }}

{% endfor %}

 </div>

 {% else%}

 

 {% endif %}

 {% if groups["labellisation"].children %}

{% if participants %}

<div> <strong>PIX : </strong>{{ certifies}} élèves certifiés soit {% set reussite = (certifies/participants*100)//1 %} {{reussite}} % </br>

 {# <table style="border-collapse: collapse; border: 1px solid black">#}

 {# <tr style=" border: 1px solid black">#}

 {# <th style=" border: 1px solid black">Participants:</th> #}

 {# <th style=" border: 1px solid black">Non Certifies:</th> #}

 {# <th style=" border: 1px solid black">Certifies:</th>#}

 {# </tr>#}

 {# <tr>#}

 {# <td style=" border: 1px solid black">{{ participants|gogo_text}}</td>#}

 {# <td style=" border: 1px solid black">{{ non_obtenues|gogo_text}}</td> #}

 {# <td style=" border: 1px solid black">{{ certifies|gogo_text}}</td>#}

 {# </tr>#}

 

 {# </table> #}

 

 </div>

 {% else%} {% endif %}

 

 {% else%}

 

 {% endif %}

 

 

 

 

 

 

 {% if groups["projet"].children %} 

 

 <div> ???? Projets : {% for value in groups["projet"].children %}

 {{ value.option.name }}

 <details> <summary>Les objectifs???? </summary> {{ objectif|gogo_text}} </details> </a>

 <details> <summary>Les objectifs détaillés???? </summary> {{ objectifs_detailles|gogo_text}} </details> </a>

 <details> <summary>Plan des actions???? </summary> {{ plan_action|gogo_text}} </details> </a>

 {{ partenaires_du_projet|gogo_text(label = "Partenaires:")}}

 

{% endfor %}

 </div>

 {% else%}

 

 {% endif %}

Catégorie
 

Sous-couche de carte
SAEI : Les 3 antennes 01-cole_inclusive_2024.geojson 

 SAEI : Les 3 antennes 02-ecole_inclusive_couleur.geojson 

 Communes de la Réunion : https://geo.api.gouv.fr/departements/974/communes?format=geojson&geometry=contour

Liste des API
API dans l'ordre d'importance 

 1) Liste des établissements - Données locales https://portail.ac-reunion.fr/swami/public/api/etablissements/ 

 Importation du fichier vierge avec les têtes de colonne dans GRIST : Annuaire-ETAB-ACA-ALL.csv 

 Ce code permet d'ajouter, de corriger les établissements mis à jour. 

 <!DOCTYPE html>

<html lang="fr">

<head>

 <meta charset="utf-8">

 <title>Import Lycées La Réunion</title>

 <script src="https://docs.getgrist.com/grist-plugin-api.js"></script>

 <style>

 #importEtabBtn {

 margin: 10px;

 padding: 10px 20px;

 background-color: #4CAF50;

 color: white;

 border: none;

 border-radius: 4px;

 cursor: pointer;

 font-family: sans-serif;

 font-size: 14px;

 transition: background-color 0.3s;

 }

 #importEtabBtn:hover:not(:disabled) {

 background-color: #45a049;

 }

 #importEtabBtn:disabled {

 background-color: #cccccc;

 cursor: not-allowed;

 }

 </style>

</head>

<body>

 <div style="font-family: sans-serif; padding: 1em;">

 <h2>Import des établissements</h2>

 <p>Cliquez sur le bouton ci-dessous pour mettre à jour la table **"Annuaire_ETAB_ACA_ALL"**.</p>

 <button id="importEtabBtn">Mettre à jour l'annuaire</button>

 <p id="status" style="margin-top: 10px; color: #666;"></p>

 </div>

 <script>

 // Demande un accès complet pour lire et écrire

 grist.ready({ requiredAccess: 'full' });

 

 // Liste des noms de colonnes pour la cohérence

 const COLUMN_NAMES = [

 "uaj", "nom", "denominationOfficielle", "uajDenominationOfficielle",

 "type", "rue", "bassin", "code_postal", "ville", "tel", "fax", "mail", "lat", "lon"

 ];

 /**

 * Récupère les données d'établissements via l'API externe.

 */

 async function fetchEtab() {

 const apiUrl = "https://portail.ac-reunion.fr/swami/public/api/etablissements/";

 try {

 document.getElementById("status").textContent = "Récupération des données en cours...";

 const response = await fetch(apiUrl);

 if (!response.ok) {

 throw new Error(`HTTP ${response.status}`);

 }

 const data = await response.json();

 const results = data.data?.values || [];

 document.getElementById("status").textContent = `${results.length} établissements trouvés.`;

 return results;

 } catch (error) {

 document.getElementById("status").textContent = `Erreur : ${error.message}`;

 console.error("Erreur API :", error);

 return [];

 }

 }

 /**

 * Met à jour (UpdateRecord) ou insère (AddRecord) les enregistrements.

 */

 async function upsertIntoGristOptimized(etabs) {

 document.getElementById("status").textContent = "Préparation des mises à jour en cours...";

 const tableId = "Annuaire_ETAB_ACA_ALL";

 const uajColumn = "uaj";

 // 1. LECTURE : Récupération des enregistrements existants (docApi.fetchTable est fiable)

 const allRecords = await grist.docApi.fetchTable(tableId, ['id', uajColumn]);

 

 // Création de la Map de recherche rapide

 const uajToIdMap = new Map();

 if (allRecords[uajColumn]) {

 allRecords[uajColumn].forEach((uaj, index) => {

 uajToIdMap.set(uaj, allRecords.id[index]);

 });

 }

 const actions = []; // Liste des actions à envoyer

 let createdCount = 0;

 let updatedCount = 0;

 for (const etab of etabs) {

 const recordId = uajToIdMap.get(etab.uaj);

 

 // Construction de l'objet d'enregistrement (format clé-valeur)

 const recordObject = {};

 COLUMN_NAMES.forEach(col => {

 const value = etab[col];

 // Assurer que les valeurs manquantes sont correctement traitées

 if (value !== undefined && value !== null) {

 recordObject[col] = value;

 } else if (["rue", "bassin", "fax", "mail"].includes(col)) {

 recordObject[col] = ""; // Les champs texte optionnels doivent être des chaînes vides

 } else {

 recordObject[col] = null; // Autres champs (nombre/lien) sont null

 }

 });

 if (recordId) {

 // MISE À JOUR (Action Ligne par Ligne)

 // Format: ['UpdateRecord', TableID, RowID, RecordObject]

 actions.push(

 ['UpdateRecord', tableId, recordId, recordObject] 

 );

 updatedCount++;

 } else {

 // CRÉATION (Action Ligne par Ligne)

 // Format: ['AddRecord', TableID, RowID (null), RecordObject]

 actions.push(

 ['AddRecord', tableId, null, recordObject] 

 );

 createdCount++;

 }

 }

 

 // 2. ENVOI DES ACTIONS

 if (actions.length > 0) {

 document.getElementById("status").textContent = `Envoi de ${actions.length} opérations à Grist... (peut prendre du temps)`;

 // Envoi de toutes les actions (créations + mises à jour ligne par ligne)

 await grist.docApi.applyUserActions(actions);

 }

 return { created: createdCount, updated: updatedCount };

 }

 /**

 * Fonction principale déclenchée par le bouton.

 */

 async function importEtab() {

 const btn = document.getElementById("importEtabBtn");

 btn.disabled = true;

 btn.textContent = "Importation en cours...";

 try {

 const etabs = await fetchEtab();

 if (etabs.length > 0) {

 document.getElementById("status").textContent = "Mise à jour de la base en cours...";

 const result = await upsertIntoGristOptimized(etabs);

 document.getElementById("status").textContent =

 `✅ **${result.created}** établissements ajoutés, **${result.updated}** établissements mis à jour.`;

 } else {

 document.getElementById("status").textContent = "Aucun établissement trouvé à traiter.";

 }

 } catch (error) {

 document.getElementById("status").textContent = "❌ Une erreur critique est survenue. Vérifiez la console (F12) et l'accès.";

 console.error("Erreur critique d'importation :", error);

 } finally {

 btn.disabled = false;

 btn.textContent = "Mettre à jour l'annuaire";

 }

 }

 document.getElementById("importEtabBtn").addEventListener("click", importEtab);

 </script>

</body>

</html>