> For the complete documentation index, see [llms.txt](https://documentation.efalia.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://documentation.efalia.com/connecteurs/connecteurs-generiques/balises.md).

# Balises

## Introduction

Efalia Utilities embarque un module de classement automatique de documents dans la GED Efalia Doc : le module Balises. Le classement est piloté par une ou plusieurs balises textuelles intégrées au document PDF lui-même — de simples chaînes de caractères, qui peuvent être rendues invisibles à la lecture en jouant sur la taille et/ou la couleur de la police — et qui portent les métadonnées nécessaires au classement dans la GED.

C'est ce mécanisme générique qui sert de brique technique à plusieurs connecteurs métiers nommés, qui l'utilisent pour transmettre leurs documents métiers à Efalia Doc. Cette page décrit le fonctionnement du module et la syntaxe des balises qu'il reconnaît ; elle s'adresse aux chefs de projet techniques amenés à installer ou diagnostiquer un connecteur qui s'appuie sur ce mécanisme.

## Principes généraux

* Un document PDF unique peut regrouper plusieurs documents à classer, concaténés bout à bout ; le module détecte chaque document et le reclasse individuellement.
* Seule la première page de chaque document doit porter une balise détectable — les balises éventuelles sur les pages suivantes ne sont pas prises en compte pour la détection.
* Deux modes de déclenchement sont possibles :
  * **Appel WebService** : requête `POST` sur `https://<serveur-utilities>/connecteurs/balises/process.php`, fichier transmis dans la clé `content` (ex. `curl --location '.../process.php' --form 'content=@"/fichier.pdf"'`).
  * **Dépôt de fichier** : dépôt du PDF dans `/utilities/connecteurs/balises/workspace/input/`, dossier surveillé par un cron ; le module traite un fichier par passage, avec tous les documents qu'il contient.
* Le traitement complet enchaîne : découpage du PDF page par page, conversion de chaque page en texte, détection des balises et reconstruction des documents, connexion à l'API Efalia Doc et chargement des armoires, puis pour chaque document détecté : vérification de l'armoire et de ses droits, chargement du plan de classement, vérification du gabarit de dossier puis du gabarit de document, recherche ou création du dossier cible, et envoi du document dans l'armoire Efalia Doc.
* Le fichier source et les métadonnées extraites (CSV balise/document) peuvent être archivés automatiquement par date, et les fichiers temporaires nettoyés en fin de traitement.

## Périmètre fonctionnel : syntaxe des balises

Seules les balises listées ci-dessous sont reconnues. Un document dont la balise diffère de ces syntaxes, ou dont les éléments attendus sont incomplets, est ignoré lors de l'analyse.

### GEDDDP

Identifie l'élément où classer un document dans Efalia Doc.

* Balises de détection : ouvrante `<GEDDDP=`, fermante `GEDDDPFIN>`
* Attributs séparés par `*`, chacun sous la forme `PREFIXE:valeur`

| Attribut                          | Description                                                                                                                                                                                        |
| --------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `USER`                            | Nom d'utilisateur du compte à prendre pour l'import.                                                                                                                                               |
| `N2PR`                            | Identifiant externe de l'armoire et du gabarit de dossier cible, concaténés et séparés par `_` (ex. `MDPH_DDP`).                                                                                   |
| `NPRO`                            | Métadonnée utilisée pour retrouver le dossier cible ; une seule valeur, qui doit identifier un dossier de façon unique (ex. `NPRO:654678` pour le dossier dont le numéro de procédure est 654678). |
| `SDOS`, `SSDO`, `N2ID`, `IIPR`    | Attributs ignorés par ce module.                                                                                                                                                                   |
| `TDOC`                            | Identifiant externe du gabarit de document cible (ex. `TDOC:NotificationsRQTH`).                                                                                                                   |
| `SITU`, `PUBL`, `PJ`, `CODESDECI` | Valeur de la métadonnée correspondante à écrire dans la GED ; la métadonnée doit être présente dans le gabarit de document défini par `TDOC`.                                                      |

Exemple : `<GEDDDP=USER:xxx*N2PR:xxx*NPRO:xxx*SDOS:xxx*SSDO:xxx*TDOC:xxx*N2ID:xxx*IIPR:xxx*SITU:xxx*PUBL:xxx*PJ:xxx*CODESDECI:xxxGEDDDPFIN>`

### GEDDDP + INFODEST

La balise `INFODEST` ne peut pas être utilisée seule : elle doit obligatoirement suivre une balise `GEDDDP`, qui définit où déposer le document. `INFODEST` permet d'enregistrer un lot de métadonnées supplémentaires sur ce document.

* Balises de détection : ouvrante `<INFODEST=`, fermante `INFODESTFIN>`
* Attributs séparés par `*` ; chaque métadonnée doit être présente dans le gabarit de document défini par `TDOC` (dans la balise `GEDDDP` qui précède)

| Attribut   | Préfixe     |
| ---------- | ----------- |
| `IDDEST`   | `IDDEST:`   |
| `NATU`     | `NATU:`     |
| `NOMPREN`  | `NOMPREN:`  |
| `MODEDIFF` | `MODEDIFF:` |
| `IDENTLS`  | `IDENTLS:`  |

Exemple : `<INFODEST=IDDEST:54922*NATU:I*NOMPREN:Mathilde LEFRANC*MODEDIFF:P*IDENTLS:INFODESTFIN>`

### GEDCLASSEMENT

Alternative à `GEDDDP` pour identifier l'élément où classer un document, à partir d'une recherche par métadonnées plutôt que par numéro de procédure unique.

* Balises de détection : ouvrante `<GEDCLASSEMENT=`, fermante `GEDCLASSEMENTFIN>`
* Attributs séparés par `*`

| Attribut         | Description                                                                                                                                                                                                                  |
| ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `USER`           | Nom d'utilisateur du compte à prendre pour l'import (première position, sans préfixe).                                                                                                                                       |
| `ARMOIRE`        | Identifiant externe de l'armoire et du gabarit de dossier cible, concaténés et séparés par `_` (ex. `armoireAgent_carrière`).                                                                                                |
| `CHAMP_MATCHING` | Une ou plusieurs métadonnées utilisées pour retrouver le dossier cible, sous la forme `clé=valeur` (la clé est l'identifiant externe de la métadonnée), séparées par `\|` si plusieurs (ex. `nom=MARTIN\|matricule=852456`). |
| `SD`, `SSD`      | Attributs ignorés par ce module.                                                                                                                                                                                             |
| `FILE`           | Identifiant externe du gabarit de document cible.                                                                                                                                                                            |

Exemple : `<GEDCLASSEMENT=admin*armoireAgent_carrière*nom=MARTIN|matricule=852456***relevéDeSituation*GEDCLASSEMENTFIN>`

### GEDCLASSEMENT + GEDMDATA

La balise `GEDMDATA` ne peut pas être utilisée seule : elle doit obligatoirement suivre une balise `GEDCLASSEMENT`. Elle permet d'enregistrer un lot de métadonnées supplémentaires sur le document classé.

* Balises de détection : ouvrante `<GEDMDATA=`, fermante `>`
* Liste de paires clé/valeur séparées par `*`, chaque paire étant au format `clé:valeur` (la clé est l'identifiant externe de la métadonnée)

Exemple, pour ajouter les métadonnées `date = 2025-01-01`, `type = bilan annuel` et `statut = terminé` :

```
<GEDCLASSEMENT=USER*ARMOIRE*CHAMP_MATCHING=VALEUR|...*SD*SSD*FILE*GEDCLASSEMENTFIN>
<GEDMDATA=date:2025-01-01*type:bilan annuel*statut:terminé>
```

## Points d'attention et bonnes pratiques

{% hint style="warning" %}
Seule la première page de chaque document doit porter une balise détectable : une balise présente sur une page suivante empêche la reconstruction correcte des documents concaténés.
{% endhint %}

* **Dépendances système** : le découpage des PDF nécessite les paquets `pdftk` et `poppler-utils` sur la machine Efalia Utilities (`sudo apt-get install -y pdftk poppler-utils`).
* **Paramétrage** : après installation du code, copier `config-dist.php` en `config.php` à la racine du module (ce fichier est ignoré par les mises à jour de livraison). Exemple :

  ```php
  [
      "name" => "efaliaDocBalises",
      "apiURL" => "https://connectorhub-doc.efalia.net:1202",
      "absoluteRootPath" => '/vagrant/connecteurs/balises/',
      "authenticationMode" => "login/password",
      "userLogin" => "xxxx",
      "userPassword" => "yyyy",
      "inputFolder" => "workspace/input",
      "outputFolder" => "workspace/output",
      "temporaryFolder" => "tmpdir",
      "archiveFolder" => "archive",
      "csvFileName" => "file.csv",
      "archiveInputs" => true,
      "archiveOutputs" => true,
      "cleanFolders" => true,
      "armoireGabaritSeparator" => "_",
      "logs" => [
          "path" => "/logs",
          "journal" => 1,
          "debug" => false,
      ],
  ]
  ```

  * `apiURL` : lien d'accès à l'API Efalia Doc — à vérifier à chaque installation.
  * `userLogin` / `userPassword` : identifiants à vérifier à chaque installation.
  * `armoireGabaritSeparator` : caractère séparant l'armoire et le gabarit dans les balises `N2PR` / `ARMOIRE` (`_` par défaut).
  * `archiveInputs` / `archiveOutputs` : archivage respectif du fichier source et du CSV de balises détectées.
  * `cleanFolders` : suppression de tous les fichiers de travail créés pendant le traitement.
  * `logs.journal` : `0` désactivé, `1` erreurs seulement, `2` tous les appels ; `logs.debug` recommandé à `false` en production.

  <div data-gb-custom-block data-tag="hint" data-style="info" class="hint hint-info"><p>Les connecteurs métiers construits sur ce module (Iodas, Solis) étendent cette configuration de base avec des clés supplémentaires propres à leurs échanges (dossiers SFTP surveillés, bannettes, notifications email) — voir leurs pages respectives.</p></div>
* **Journal d'exécution** : quand les logs sont activés, chaque appel enregistre notamment la date et l'heure, la durée totale, le nombre de pages envoyées, de documents reconstitués, de documents valides, de documents importés et de documents ignorés (doublons), ainsi que la durée de chaque étape (découpage, conversion, reconstruction, chargement Efalia Doc, envoi).
* **Archivage** : un sous-dossier par jour recense, dans `inputFolder`, les fichiers PDF reçus, et dans `outputFolder`, les fichiers CSV associant chaque document aux balises détectées.

## Ressources

Connecteurs métiers s'appuyant sur ce mécanisme :

* [Iodas](/connecteurs/connecteurs-metiers/iodas.md) — dépôt de documents métiers via des balises `GEDDDP`.
* [Solis](/connecteurs/connecteurs-metiers/solis.md) — dépôt de documents métiers via un format de balises propre à Solis (voir la documentation ArcheMC2).

{% hint style="info" %}
Les connecteurs PCRM Rio et Eksaé n'utilisent pas ce mécanisme de balises : PCRM Rio interroge Efalia Doc en lecture seule via des WebServices REST, et Eksaé dépose ses documents par appel HTTP direct avec les métadonnées transmises en paramètres, sans balise textuelle intégrée au fichier.
{% endhint %}


---

# 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://documentation.efalia.com/connecteurs/connecteurs-generiques/balises.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.
