> 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/documentations/efalia-process/vue-ensemble/contrat-prive.md).

# Contrat Privé

**Contrat Privé** est le service de signature électronique fourni par Efalia. Il s'intègre nativement dans Efalia Process via deux connecteurs dédiés permettant d'initier et de vérifier des signatures directement depuis un workflow.

{% hint style="info" %}
**Version requise**

Les connecteurs Contrat Privé sont disponibles depuis **Efalia Process 6.36.0**.
{% endhint %}

***

## Configuration

Avant d'utiliser les connecteurs, configurez le service dans l'administration Efalia Process.

{% stepper %}
{% step %}

#### Accéder aux paramètres Contrat Privé

Dans l'administration (`/workey/admin`), naviguez vers **Paramètres > Contrat Privé**.

📸 **CAPTURE : contrat-prive-01-parametres.png**

> Panneau de configuration Contrat Privé avec les 3 paramètres de connexion et le bouton d'activation
> {% endstep %}

{% step %}

#### Renseigner les paramètres de connexion

Trois paramètres sont requis :

1. **URL du service** Contrat Privé (fournie par Efalia)
2. **Identifiant** du compte Contrat Privé
3. **Clé secrète** du compte

Activez ensuite le service avec le bouton dédié.
{% endstep %}
{% endstepper %}

***

## Principe du Workflow de Signature

Un workflow intégrant Contrat Privé suit généralement le schéma suivant :

1. **Préparation** — Le document à signer est généré ou déposé dans un champ pièce jointe
2. **Envoi à la signature** — Le connecteur `CreateContractConnector` crée le contrat dans Contrat Privé et envoie les invitations aux signataires
3. **Attente de signature** — Le workflow attend dans un état intermédiaire
4. **Vérification** — Le connecteur `CheckContractConnector` vérifie périodiquement l'état du contrat
5. **Récupération** — Quand le contrat est signé (`closed`), les documents signés sont récupérés dans le formulaire Process

***

## Connecteur CreateContractConnector

**Classe :** `com.clog.workey.sign.contratprive.connectors.CreateContractConnector`

Initie un nouveau contrat à signer dans Contrat Privé.

**Paramètres en entrée :**

1. `jsonMapping` — JSON de configuration (voir ci-dessous)
2. `jsonStamper` — JSON issu du composant *Signataires et cachets* *(optionnel — prioritaire sur `jsonMapping` pour le positionnement du cachet, mais limité à un seul document pour un seul signataire)*

**Paramètres en sortie :**

* `publicId` — Référence publique du contrat
* `signatoriesPublicId` — Référence publique des signataires

***

## Connecteur CheckContractConnector

**Classe :** `com.clog.workey.sign.contratprive.connectors.CheckContractConnector`

Vérifie l'état d'un contrat existant et récupère les documents signés le cas échéant.

**Paramètres en entrée :**

1. `jsonMapping` — JSON de configuration
2. `publicId` — Référence publique du contrat (sortie de `CreateContractConnector`)

**Paramètres en sortie :**

* `contractStatus` — État du contrat : `canceled`, `closed`, `deleted`, `draft`, `expired`, `submited` ou `suspended`
* `signedUUID` — UUIDs des pièces jointes des documents signés (disponibles quand `contractStatus = closed`)

***

## Structure du JSON de Configuration

### Champs du Contrat

Les propriétés en **gras** sont obligatoires. Par convention, les champs du formulaire Process sont nommés `ContratPrive_{clé}` (ex : `ContratPrive_title`).

| Propriété               | Description                                                                                                                 | Champ par défaut                 |
| ----------------------- | --------------------------------------------------------------------------------------------------------------------------- | -------------------------------- |
| **`title`**             | Titre du contrat                                                                                                            | `ContratPrive_title`             |
| **`language`**          | Langue du contrat                                                                                                           | `ContratPrive_language`          |
| **`signatureRequired`** | Signature obligatoire                                                                                                       | `ContratPrive_signatureRequired` |
| **`action`**            | `true` = soumettre à signature, `false` = sauvegarder en brouillon                                                          | `ContratPrive_action`            |
| `type`                  | Type de contrat (`custom`, `classique`, `devis_mono`, `devis_bi`, `emargement`, `travail`, `location`, `assurance`, `horo`) | `ContratPrive_type`              |
| `signDueDate`           | Date limite de signature (future)                                                                                           | `ContratPrive_signDueDate`       |
| `autoClosingDate`       | Date de clôture automatique (future)                                                                                        | `ContratPrive_autoClosingDate`   |
| `signPage`              | Ajout d'une page de signature (`true` par défaut)                                                                           | `ContratPrive_signPage`          |

### Documents

| Propriété         | Description                         | Champ par défaut               |
| ----------------- | ----------------------------------- | ------------------------------ |
| **`documents`**   | Documents à signer                  | `ContratPrive_documents`       |
| `appendices`      | Documents annexes                   | `ContratPrive_appendices`      |
| `signedDocuments` | Champ recevant les documents signés | `ContratPrive_signedDocuments` |

### Signataires

| Propriété                 | Description                             | Champ par défaut                     |
| ------------------------- | --------------------------------------- | ------------------------------------ |
| **`signatoryExternalId`** | Référence externe du signataire         | `ContratPrive_signatoryExternalId`   |
| **`signatoryFirstname`**  | Prénom                                  | `ContratPrive_signatoryFirstname`    |
| **`signatoryLastname`**   | Nom de famille                          | `ContratPrive_signatoryLastname`     |
| **`signatoryEmail`**      | Email                                   | `ContratPrive_signatoryEmail`        |
| **`signatoryPhone`**      | Téléphone portable                      | `ContratPrive_signatoryPhone`        |
| `signatoryPayment`        | Montant acompte (en centimes, 0–50 000) | `ContratPrive_signatoryPayment`      |
| `signatoryOrganization`   | Entreprise du signataire                | `ContratPrive_signatoryOrganization` |

### Notifications

| Propriété       | Description                             | Champ par défaut             |
| --------------- | --------------------------------------- | ---------------------------- |
| `notifications` | Configuration des notifications         | `ContratPrive_notifications` |
| **`message`**   | Corps du message envoyé aux signataires | `ContratPrive_message`       |
| `sendSms`       | `true` = envoi SMS à la création        | `ContratPrive_sendSms`       |

***

## Position des Signatures

Trois méthodes sont disponibles pour définir l'emplacement du cachet de signature (mutuellement exclusives) :

{% tabs %}
{% tab title="4 champs multivalués" %}
Un champ par paramètre de position :

| Propriété       | Champ par défaut             |
| --------------- | ---------------------------- |
| `signatoryPage` | `ContratPrive_signatoryPage` |
| `signatoryX1`   | `ContratPrive_signatoryX1`   |
| `signatoryY1`   | `ContratPrive_signatoryY1`   |
| `signatoryX2`   | `ContratPrive_signatoryX2`   |
| `signatoryY2`   | `ContratPrive_signatoryY2`   |
| {% endtab %}    |                              |

{% tab title="1 champ JSON" %}
Un seul champ JSON multivalué regroupant les 4 paramètres :

```json
{"page": 1, "x1": 10, "y1": 20, "x2": 30, "y2": 40}
```

Propriété : `signatoryPosition` → `ContratPrive_signatoryPosition`
{% endtab %}

{% tab title="JSON global" %}
Un paramètre JSON global définissant toutes les positions :

```json
"signPositions": [
    { "page": 1, "x1": 10, "y1": 20, "x2": 100, "y2": 100 },
    { "page": 1, "x1": 50, "y1": 20, "x2": 150, "y2": 120 }
]
```

Propriété : `signPositions` (N/A — valeur directe dans le JSON)
{% endtab %}
{% endtabs %}

***

## Exemple Complet de JSON de Configuration

```json
{
    "title": "ContratPrive_title",
    "documents": "ContratPrive_documents",
    "appendices": "ContratPrive_appendices",
    "signedDocuments": "ContratPrive_signedDocuments",
    "signatureRequired": "ContratPrive_signatureRequired",
    "action": "ContratPrive_action",
    "language": "ContratPrive_language",
    "signPage": "ContratPrive_signPage",
    "signDueDate": "ContratPrive_signDueDate",
    "autoClosingDate": "ContratPrive_autoClosingDate",
    "type": "ContratPrive_type",
    "signatoryFirstname": "ContratPrive_signatoryFirstname",
    "signatoryLastname": "ContratPrive_signatoryLastname",
    "signatoryEmail": "ContratPrive_signatoryEmail",
    "signatoryPhone": "ContratPrive_signatoryPhone",
    "signatoryExternalId": "ContratPrive_signatoryExternalId",
    "signatoryPayment": "ContratPrive_signatoryPayment",
    "signatoryOrganization": "ContratPrive_signatoryOrganization",
    "signatoryPublicId": "ContratPrive_signatoryPublicId",
    "notifications": "ContratPrive_notifications",
    "message": "ContratPrive_message",
    "status": "ContratPrive_status",
    "contractId": "ContratPrive_contractId",
    "sendSms": "ContratPrive_sendSms",
    "signatoryPosition": "ContratPrive_signatoryPosition"
}
```

{% hint style="warning" %}
Les propriétés JSON peuvent également référencer **directement les champs de votre formulaire** Process si vous avez utilisé des noms différents de la convention `ContratPrive_{clé}`. La valeur dans le JSON correspond au nom interne du champ Process dont la valeur sera utilisée.
{% endhint %}

***

## Questions Fréquentes

<details>

<summary>Comment modéliser l'attente de signature dans le workflow ?</summary>

Créez un état intermédiaire (ex : "En attente de signature"). Planifiez un agent ou utilisez une opération déclenchée manuellement (ou par webhook) pour exécuter `CheckContractConnector`. Si `contractStatus = closed`, déclenchez l'opération de validation ; sinon, le document reste dans l'état d'attente.

</details>

<details>

<summary>Que se passe-t-il si le signataire refuse de signer ?</summary>

Le statut du contrat passe à `canceled` ou `suspended` selon la raison du refus. `CheckContractConnector` retourne ce statut, ce qui vous permet de modéliser une transition vers un état de traitement du refus.

</details>

<details>

<summary>Peut-on avoir plusieurs signataires ?</summary>

Oui. Les propriétés signataires (`signatoryFirstname`, `signatoryEmail`…) acceptent des champs multivalués. Chaque entrée dans ces champs correspond à un signataire. Les positions de signature doivent également être multivaluées si nécessaire.

</details>

***

Pour aller plus loin :

* [Signature Électronique (vue d'ensemble)](/documentations/efalia-process/vue-ensemble/signature-electronique.md)
* [Vue d'Ensemble des Intégrations](/documentations/efalia-process/vue-ensemble.md)


---

# 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/documentations/efalia-process/vue-ensemble/contrat-prive.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.
