> For the complete documentation index, see [llms.txt](https://ksaar.gitbook.io/ksaar-documentation/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ksaar.gitbook.io/ksaar-documentation/les-bonnes-pratiques/architecture.md).

# Architecture

## 🤔 Fiche ou suivi

#### Privilégier les fiches :

* Pour la consultation de données
* Pour les modifications simples, non liées à un processus ou à un traitement automatisé des données
* Pour avoir une navigation libre entre plusieurs pages

**Exemple :**

* Une fiche pour ajouter les notes d'un élève
* Une fiche montrant les informations d'une entreprise avec une page sur le personnel et une page sur les statistiques

#### Privilégier les suivis :

* Pour la gestion des champs obligatoires et limiter les possibilités de modifier des données quand elles n'ont pas à être modifiées
* Pour réaliser des actions automatiquement ou au cours du parcours
* Pour avoir une navigation structurée, étape par étape

**Exemple :**

* Un formulaire pour une demande (champs obligatoires, obliger le client à remplir au fur et à mesure sans sauter d'étapes)
* Programmer un entretien avec un envoi de mail automatique et récupérer l'intervieweur selon l'utilisateur connecté

## 🗑️ Suppression

#### Pour vos enregistrement classique

Il est recommandé de toujours anticiper le choix entre la suppression et l’archivage des données.\
Dans de nombreux cas, l’archivage peut s’avérer plus pertinent car il permet de préserver  un historique et de faciliter la restauration des données si besoin.

#### Pour vos éléments [LIST](/ksaar-documentation/les-bonnes-pratiques/syntaxe/syntaxe-des-autres-elements.md#pour-un-workflow-qui-sert-de-reference-a-une-liste)&#x20;

Il est recommandé de ne jamais supprimer définitivement les données, mais plutôt de les archiver. Cela permet de conserver un historique sans perte de données liées, de prévenir les erreurs de suppression et de récupérer une données si nécessaire.

#### Pour mettre en place un mécanisme d'archivage :

* Ajouter un champ booléen `bool_archive_{table}`
* Utiliser ce champ pour masquer la donnée côté End-User tout en la conservant en base.

## 📋 Administration des listes déroulantes

#### Single/Multi select

Il est recommandé d'utiliser les champs Single et Multi select uniquement si les trois conditions suivantes sont remplies :&#x20;

* Il y a moins de 10 valeurs
* Ces valeurs changent rarement (moins de 2 modifications par an)
* Il n’est pas nécessaire de :
  * comparer ces valeurs à d’autres tables
  * filtrer les données par rapport à ce champ
  * effectuer des boucles sur ces valeurs
  * autoriser l'ajout par un utilisateur

{% hint style="info" %}
Lors de la création de votre Single et Multi select, veillez à assigner une valeur numérique à chaque option. Ainsi, malgré des changements d'orthographe, vos formules ou call API ne seront pas affectés.
{% endhint %}

**Exemple :**

* Un type de priorité (Haute, Moyenne, Basse en Single select)&#x20;
* Les jours de présence (Lundi, Mardi, Mercredi, Jeudi, Vendredi en Multi select)

#### Liaison simple/multiple

Il est recommandé de créer une table annexe qui fera office de liste de référence. La mise en place d'une liaison simple/multiple fera alors le même travail qu'un Single/Multi select.

Cela permet alors :

* D'administrer les valeurs proposées (ajouter, modifier, supprimer/archiver)
* D'ajouter des précisions sur les valeurs proposées
* De filtrer des données&#x20;
* De boucler sur la sélection&#x20;

**Exemple :**&#x20;

* La sélection d'une nationalité avec le nom du pays associé et les langues parlées dans ce pays
* Le niveau des élèves d'un collège pour filtrer la liste des élèves par niveau avec un filtre persistant
* Créer une fiche d'évaluation pour chaque critères sélectionnés dans une offre d'emploi

{% hint style="warning" %}
Avoir beaucoup de tables ne doit pas vous inquiéter. Cela permet en général une plus grande maniabilité des données
{% endhint %}

## 🖇️ Éléments de liaisons

Lorsque des liaisons logiques existent entre plusieurs tables, il est recommandé de privilégier l’utilisation de formules de liaison ou de liaisons synchronisées.\
Cela permet de garantir la cohérence des données entre les tables, en s’appuyant sur les mécanismes d’intégrité internes à Ksaar, plutôt que sur des pratiques manuelles laissées à l’initiative du Maker.

**Exemple :**&#x20;

* Lorsqu’un professeur principal souhaite obtenir la liste des élèves de sa classe, il est recommandé d’utiliser une formule de liaison. Cela permet de s’assurer que seuls les élèves appartenant à la classe dont il est titulaire sont récupérés automatiquement.
* Pour ajouter des élèves dans une classe, on utilise une liaison multiple sur la table Classe, permettant de sélectionner plusieurs élèves. Afin que chaque élève soit correctement assigné à sa classe, il est essentiel d’utiliser une liaison synchronisée.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://ksaar.gitbook.io/ksaar-documentation/les-bonnes-pratiques/architecture.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
