# Verrouiller un devis BTP après signature électronique, sans le geler entièrement

> Après la signature d'un devis, les champs commerciaux doivent rester intouchables tandis que les notes internes restent modifiables. Voici comment verrouiller un devis WordPress par groupe de champs plutôt qu'en bloc.

- Auteur : WordPress Développement
- Publié le : 2024-03-18
- Mis à jour le : 2024-03-18
- Catégorie : Astuces
- URL : https://www.wpmoderne.fr/tips/verrouiller-devis-btp-apres-signature-electronique/

## L’essentiel

- Seuls les champs commerciaux sont verrouillés après signature
- Les notes internes restent modifiables sans limite
- Le verrouillage repose sur le filtre acf/prepare_field

Le Codex de WordPress décrit le filtre `acf/prepare_field` comme le point d'entrée permettant de modifier la configuration d'un champ juste avant son affichage dans l'éditeur, y compris pour le rendre en lecture seule ou le désactiver entièrement. C'est exactement l'outil nécessaire quand un devis signé électroniquement doit rester intouchable sur ses montants, tout en restant ouvert aux notes internes ajoutées après coup.

Le piège classique consiste à verrouiller l'intégralité du devis dès la signature, ce qui empêche ensuite le commercial d'ajouter une remarque sur un délai négocié par téléphone, ou le conducteur de travaux de noter une contrainte d'accès chantier découverte après validation. Le verrouillage doit donc s'appliquer champ par champ, pas au niveau de l'article entier.

## Séparer les champs commerciaux des champs internes

Sur un type de contenu `devis_btp`, les champs se répartissent en deux groupes distincts dans la structure ACF : un groupe `montant_ht`, `montant_ttc`, `conditions_paiement` qui engage contractuellement l'entreprise une fois le devis signé, et un groupe `note_interne`, `contrainte_chantier`, `rappel_planning` destiné exclusivement à l'équipe.

## Verrouiller uniquement les champs commerciaux

Le statut de signature est stocké dans un champ `date_signature_electronique`. Tant que ce champ est vide, tous les champs restent modifiables. Une fois rempli, seuls les champs commerciaux passent en lecture seule :

> L'essentiel à retenir : Seuls les champs commerciaux sont verrouillés après signature ; Les notes internes restent modifiables sans limite ; Le verrouillage repose sur le filtre acf/prepare_field

```
add_filter( 'acf/prepare_field', 'wpm_verrouiller_champs_commerciaux_devis' );

function wpm_verrouiller_champs_commerciaux_devis( $field ) {
    global $post;

    if ( ! $post || 'devis_btp' !== $post->post_type ) {
        return $field;
    }

    $champs_commerciaux = array( 'montant_ht', 'montant_ttc', 'conditions_paiement' );

    if ( ! in_array( $field['name'], $champs_commerciaux, true ) ) {
        return $field;
    }

    $signe = get_field( 'date_signature_electronique', $post->ID );

    if ( $signe ) {
        $field['readonly'] = 1;
    }

    return $field;
}
```

### Pourquoi readonly plutôt que disabled

La propriété `readonly` conserve la valeur du champ lors de la soumission du formulaire d'édition, contrairement à `disabled` qui empêche l'envoi de la valeur et provoquerait, sans précaution supplémentaire, un enregistrement vide du montant lors de la sauvegarde suivante. Ce détail, facile à manquer, évite une perte de données bien réelle sur un devis déjà signé.

## Une double sécurité côté enregistrement

Le verrouillage visuel ne suffit pas : un utilisateur habitué aux outils de développement du navigateur pourrait retirer l'attribut en local. Une vérification côté serveur, au moment de l'enregistrement, referme la porte :

```
add_filter( 'acf/update_value/name=montant_ht', 'wpm_bloquer_modification_montant', 10, 3 );

function wpm_bloquer_modification_montant( $value, $post_id, $field ) {
    $signe = get_field( 'date_signature_electronique', $post_id );

    if ( $signe ) {
        return get_field( 'montant_ht', $post_id );
    }

    return $value;
}
```

Ce filtre renvoie systématiquement l'ancienne valeur si le devis est signé, quel que soit ce que le formulaire tente d'enregistrer, ce qui neutralise toute tentative de contournement du verrouillage visuel.

## Garder les champs internes ouverts

Comme la liste `$champs_commerciaux` ne mentionne jamais `note_interne`, `contrainte_chantier` ou `rappel_planning`, ces champs continuent d'accepter des modifications sans restriction après signature, exactement comme souhaité :

- Le conducteur de travaux peut ajouter une contrainte découverte après signature.
- Le commercial peut noter un rappel de planning sans toucher aux montants.
- Aucun rôle particulier n'est requis pour ces champs, seule la capacité d'édition standard du devis suffit.

> Conseil maison : listez toujours explicitement les champs à verrouiller plutôt que ceux à laisser ouverts. Un nouveau champ ajouté plus tard au groupe commercial doit être verrouillé par défaut, pas l'inverse.

## Ce que cette technique ne traite pas

Elle ne gère pas l'intégration de la signature électronique elle-même, ni la génération du PDF final envoyé au client. Elle part du principe qu'un champ de date de signature existe déjà, renseigné par le service qui traite la signature, qu'il s'agisse d'un module interne ou d'un prestataire externe.

## En résumé

Un devis BTP signé n'a pas besoin d'être figé dans son ensemble : seuls les champs qui engagent contractuellement l'entreprise doivent devenir intouchables, tandis que le suivi opérationnel continue de vivre normalement. Cette granularité, obtenue avec deux filtres ACF et aucune extension supplémentaire, évite autant les erreurs de saisie que les frustrations d'une équipe qui aurait besoin d'ajouter une simple note.
