Guide du développeur Adobe Acrobat Sign pour Salesforce

Dernière mise à jour le 20 févr. 2024

Présentation

Le Guide du développeur Adobe Acrobat Sign pour Salesforce est conçu pour aider les développeurs Salesforce à en savoir plus sur les objets et les paramètres requis pour intégrer votre package Salesforce dans Adobe Acrobat Sign.

Consultez les rubriques de ce document pour en savoir plus :

Attention

les objets Adobe Acrobat Sign pour Salesforce peuvent changer dans une version ultérieure. Si vous créez une solution personnalisée dépendant d’objets qui sont modifiés, vous devrez peut-être mettre à jour votre personnalisation.

Instructions pour les développeurs

  • S’il vous faut savoir quand l’accord est intégralement signé, implémentez un déclencheur Apex sur l’objet echosign_dev1__SIGN_Agreement__c avant ou après la mise à niveau (en fonction des exigences et du cas d’utilisation). Lorsque le champ echosign_dev1__Status__c passe en statut Signé ou Approuvé ou en un autre statut, l’accord est terminé. 
  • S’il vous faut savoir quand chaque PDF signé de façon individuelle est inséré, si par exemple, vous devez obtenir chaque PDF intermédiaire signé, implémentez un déclencheur Apex sur les objets Attachment (Pièce jointe) ou ContentVersion (Version du contenu), après insertion et recherchez un accord parent et un nom qui se termine par « - signed.pdf » ou « - approved.pdf » ou par un autre statut final
  • S’il vous faut savoir quand un destinataire individuel a signé ou a approuvé un document, implémentez un déclencheur Apex sur l’objet echosign_dev1__SIGN_Recipients__c, avant ou après la mise à niveau (en fonction des exigences et du cas d’utilisation). Lorsque le champ echosign_dev1__Status__c passe en Signé ou Approuvé ou en un autre statut, le destinataire est terminé.  
  • S’il vous faut savoir quand un événement particulier faisant partie du processus de signature se produit, tel qu’un accord envoyé pour signature ou un rappel envoyé, un déclencheur peut être créé sur l’objet des événements de l’accord.(echosign_dev1__SIGN_AgreementEvent__c) et peut vérifier le type de l’événement
  • Les noms du statut de l’accord final pour un accord complet sont : « Signé », « Approuvé », « Accepté », « Formulaire-rempli » et « Livré »
  • Les noms du statut de l’accord final pour un accord annulé sont : « Annulé/Refusé » et « Expiré »

Ordre des mises à jour

Dans la version 21, l’ordre des mises à jour a changé. Vous trouverez ci-dessous la séquence dans laquelle l’accord et ses objets associés sont mis à jour :

  1. Pièces jointes 
  2. Destinataires 
  3. Accord (statut et autres attributs)
  4. Événements de l’accord 
  5. Flux Chatter 

Services Apex

Méthode Apex en vigueur

À partir d'Acrobat Sign for Salesforce V 21.0, tous les processus asynchrones (y compris les mises à jour automatiques et les mappages de données) utilisent la méthode Queueable au lieu de la méthode Future, comme recommandé par Salesforce.
Suite à cette modification, toutes les tâches de personnalisation ajoutées à la file d'attente Salesforce pour la mise à jour automatique ou le processus de mappage de données échoueront avec cette erreur : « System.LimitException: Too many queueable jobs added to queue:2. »

L’erreur se produit parce qu’un processus en attente ne peut ajouter qu’un enfant en attente, ce qui est déjà pris en charge par Acrobat Sign. Pour plus d’informations, voir Limitations d’Apex en attente

Lorsque le statut de l’accord ne change pas ou que le mappage de données ne s’exécute pas correctement, cette erreur peut s’afficher : « When chaining jobs, you can add only one job from an executing job with System.enqueueJob, which means that only one child job can exist for each parent queueable job. Starting multiple child jobs from the same queueable job isn’t supported. »

Pour résoudre cette erreur, recherchez le déclencheur concerné, le gestionnaire de processus ou le workflow, puis désactivez-le ou basculez-le pour utiliser un appel synchrone. Vous pouvez également le planifier pour plus tard.

Service de modèle d’accord

Le service de modèle d’accord est proposé comme service Apex global par le package géré. Cela permet au code Apex, en dehors du package géré, de charger des accords en fonction des modèles d’accord existants. La classe et l’ensemble des méthodes affichées sont déclarées comme global pour permettre l’accès à celles-ci.

Le service Apex est affiché via cette classe d’appel : echosign_dev1.AgreementTemplateService.

Méthodes

global

static Id load()

Charge un accord en utilisant un modèle d’accord par défaut qui ne contient pas de type d’objet principal.

global

static Id load(String templateId)

Charge un accord avec l’ID de modèle d’accord spécifié qui ne contient pas de type d’objet principal.

 

global

static Id load(String templateId, String masterId)

Charge un accord avec l’ID de modèle d’accord et l’ID d’enregistrement principal spécifiés, dont le type doit correspondre au type d’objet principal configuré dans le modèle d’accord spécifié.

global

static Id load(String templateId, String masterId, Map<String,AgreementTemplateVariable> agreementTemplateVariables)

Charge un accord avec l’ID de modèle d’accord et l’ID d’enregistrement principal spécifiés, dont le type doit correspondre au type d’objet principal configuré dans le modèle d’accord spécifié. Fournit également les variables d‘exécution spécifiées comme paires nom/valeur.

 

global

static List<AgreementTemplateService.AgreementTemplateBasicInfo> getAgreementTemplateList(AgreementTemplateListOptions options)

Obtenez la liste des modèles d’accord en fonction des options de filtrage. Renvoie une liste vide si aucun modèle d’accord n’est trouvé avec les options de filtrage.

global

static AgreementTemplateService.AgreementTemplateDetails getAgreementTemplateDetails(String templateId)

Obtenez les détails du modèle d’accord portant l’identifiant indiqué.

Renvoie un objet vide si aucun modèle d’accord n’est trouvé.

global

static String getAgreementTemplateUrl(String templateId)

Obtenez l’URL pour modifier le modèle d’accord portant l’identifiant indiqué.

global

static String getNewAgreementTemplateUrl()

Obtenez l’URL pour créer un nouveau modèle d’accord dans Adobe Sign.

 Constructeurs

Accès

Signature

global

AgreementTemplateListOptions()

global

AgreementTemplateListOptions(String masterObjectType, Boolean isActive, Boolean hasAttachment, Boolean hasRecipient, Boolean autoSend)

Propriétés de la classe globale

Classe globale : AgreementTemplateService.AgreementTemplateListOptions

Accès

Nom

global

masterObjectType

global

isActive

global

hasAttachment

global

hasRecipient

global

autoSend

Annotation

aucun filtre n’est appliqué sur le champ correspondant en cas de demande de modèles d’accord si la valeur d’un des champs susmentionnés est nulle.

CLASSE GLOBALE : AGREEMENTTEMPLATESERVICE.AGREEMENTTEMPLATEBASICINFO

Accès

Nom

global

Nom

global

recordId

global

url

global

isDefault

global

daysUntilExpiration

global

langue

CLASSE GLOBALE : AGREEMENTTEMPLATESERVICE.AGREEMENTTEMPLATEDETAILS

Accès

Nom

global

message

global

ccList

global

dataMappingName

global

mergeMappingName

global

url

global

destinataires

CLASSE GLOBALE : AGREEMENTTEMPLATESERVICE.RECIPIENTINFO

Accès

Nom

global

recipientRole

global

recipientType

global

recipientName

global

signOrder

Variables d’exécution

La classe globale echosign_dev1.AgreementTemplateVariable possède les deux champs globaux suivants :

  • name : nom de la variable, qui doit correspondre à une variable d’exécution configurée dans le modèle d’accord.
  • value : valeur de la variable utilisée pendant le chargement du modèle. La valeur dépend de l’emplacement où la variable a été utilisée. Par exemple, pour un destinataire, ce peut être l’ID d’enregistrement ou l’adresse e-mail d’un contact, d’un prospect ou d’un utilisateur. Pour une variable de document, cela doit être l’ID d’enregistrement d’une pièce jointe.

Résultat

Chaque méthode retourne soit l’ID de l’enregistrement d’accord nouvellement créé, soit une exception avec un message d’erreur détaillé si un problème survient au cours du chargement.

Services API

Le service de modèle d’API de signature électronique Adobe est proposé comme service Apex global par le package géré. Cela permet au code Apex, y compris en dehors du package géré, d’invoquer un ensemble d’API de signature électronique Adobe par le biais de ces enveloppes. Les enveloppes simplifient considérablement l’appel des API. En effet, les consommateurs n’ont pas besoin de créer de modèle de données de requête et de réponse. Ceux-ci n’ont pas non plus à gérer la transformation des données Salesforce en modèles de données de signature électronique. Pour le consommateur, tout est simplifié. Par exemple, pour envoyer un accord, il suffit au consommateur de fournir l’ID d’enregistrement d’accord. Le service prend en charge la requête : il extrait les données pertinentes, les renseigne dans l’API et analyse le résultat.

La classe et l’ensemble des méthodes affichées sont déclarées comme global pour permettre l’accès à celles-ci.

  • La version 17 et les versions antérieures invoquent les API SOAP.
  • La version 18 et les versions supérieures invoquent les API REST.

Le service Apex est affiché via la classe d’appel : echosign_dev1.EchoSignApiService.

Amélioration de l’API Apex pour les autres destinataires

Depuis la version 24.14, l’API Apex mise à jour vous permet de remplacer ou d’ajouter d’autres destinataires. Elle est accessible dans la classe globale « EchoSignApiService ». Deux nouveaux éléments ont été introduits :

  • Une fonction globale :

    /**

    * Input params:

    * toBeChangedRecipientId: SIGN_Recipient__c Id

    * newRecipientStr: JSON string of SIGN_Recipient__c of a new recipient for recipient replacement or alternate

    * changeType: REPLACE or ALTERNATE

    */

    global static void changeRecipient(Id toBeChangedRecipientId, String newRecipientStr, RECIPIENT_CHANGE_TYPE changeType )

  • Une énumération globale : RECIPIENT_CHANGE_TYPE {REPLACE, ALTERNATE}

Exemple de code pour appeler cette API pour les destinataires (type de destinataire : adresse e-mail)

// first query all the recipients associated with the agreement

List<SIGN_Recipients__c> recipients = [SELECT Id, echosign_dev1__Agreement__c, echosign_dev1__Email_Address__c, echosign_dev1__ParticipantSet__c, echosign_dev1__Recipient_Type__c, echosign_dev1__Order_Number__c FROM echosign_dev1__SIGN_Recipients__c where echosign_dev1__Agreement__c = 'a0P7X000008Cc1GUAS'];

SIGN_Recipients__c newRecipient = null;

SIGN_Recipients__c replacedRecipient = null;

// find the recipient that needs to be replaced or an alternate

// in this case, find the recipient by its email.

// More conditions can be added to find the recipient that is to be replaced or needs an alternate.

for(SIGN_Recipients__c recipient: recipients) {

    if (rep.echosign_dev1__Email_Address__c == 'someUser@example.com') {

         newRecipient = recipient.clone(false, true, false, false);

         replacedRecipient = recipient;

    }

}

// update emal address for new recipient

newRecipient.echosign_dev1__Email_Address__c = ''someNewUser@abc.com';

// serialize it to json string

String newRecipientStr = JSON.serialize(newRecipient);

Try {

    echosign_dev1.EchoSignApiService.changeRecipient(replacedRecipient.Id, newRecipientStr, EchoSignApiService.RECIPIENT_CHANGE_TYPE.REPLACE);

} catch (Exception ex) {

    // handle the exception and rethrow if needed

}

Méthodes

global

static void cancelDocument(Id agreementId)

Annule l’accord correspondant à l’ID d’accord spécifié.

global

static echosign_dev1.EchoSignApiService.DocumentInfo getDocumentInfo(Id agreementId)

Récupère des informations détaillées pour l’ID d’accord spécifié.

global

static List<EchoSignApiService.SigningUrl>

getSigningUrls(Id agreementId) 

Récupère l’ensemble des URL de signature pour l’ID d’accord spécifié.

global

static void removeDocument(Id agreementId)

Annule l’accord correspondant à l’ID d’accord spécifié et supprime l’enregistrement de l’accord dans Salesforce (l’accord n’est pas supprimé du compte de signature électronique Adobe).

global static void replaceSigner(Id replacementRecipientId)
Obsolète avec V 24.14. Les versions de package antérieures à v24.14 peuvent toujours les utiliser car elles s'appuient sur les API V5.
global static void replaceSigner(Id replacementRecipientId, String message)
Obsolète avec V 24.14. Les versions de package antérieures à v24.14 peuvent toujours les utiliser car elles s'appuient sur les API V5.

global

static echosign_dev1.EchoSignApiService.

SendDocumentResult sendDocument(Id agreementId)

Envoie l’accord avec l’ID d’accord spécifié et renvoie le résultat avec la clé et les URL du document.

global

static void sendReminder(Id agreementId)

Envoie un rappel au signataire actuel pour l’ID d’accord spécifié.

global static void updateAgreement(Id agreementId)  Met à jour l’accord correspondant à l’ID d’accord spécifié.
global static EchoSignApiService.AgreementViewUrl getViewAgreementUrl(Id agreementId)
Récupère la page d'affichage/de gestion de Sign pour l'ID d'accord spécifié, qui a une propriété d'affichage.
Remarque : Pour des raisons de sécurité, l'URL de contrat générée n'a qu'une durée de vie temporaire ; elle génère donc un appel REST-HTTPS pour obtenir une URL actualisée à partir des services Adobe Sign.
global static void changeRecipient(Id toBeChangedRecipientId, String newRecipientStr, EchoSignApiService.RECIPIENT_CHANGE_TYPE changeType ) Disponible depuis la version 24.14, cette API modifie les destinataires des accords.

Classes internes

  • Classe globale : DocumentHistoryEvent
PROPRIÉTÉS (2)

Accès

Nom

global

String eventType

global

String participantEmail

CONSTRUCTEURS (1)

Accès

Signature

global

DocumentHistoryEvent()

  • Classe globale : DocumentInfo
PROPRIÉTÉS (5)

Accès

Nom

global

Map<string,list> historyByEmail

global

Map<String,EchoSignApiService.ParticipantInfo>
participantsByEmail

global

Map<String,EchoSignApiService.ParticipantInfo>
participantsByName

global

String senderEmail

global

String status

CONSTRUCTEURS (1)

Accès

Signature

global

DocumentInfo()

  • Classe globale : ParticipantInfo
PROPRIÉTÉS (5)

Accès

Nom

global

String company

global

String email

global

String name

global

String status

global

String title

CONSTRUCTEURS (1)

Accès

Signature

global

ParticipantInfo()

  • Classe globale : SendDocumentResult
PROPRIÉTÉS (3)

Accès

Nom

global

String documentKey

global

Exception error

global

String url

CONSTRUCTEURS (1)

Accès

Signature

global

SendDocumentResult()

  • Classe globale : SigningUrl
PROPRIÉTÉS (3)

Accès

Nom

global

String email

global

String esignUrl

global

String simpleEsignUrl

CONSTRUCTEURS (1)

Accès

Signature

Global

 

Services Apex par lot

Expose les principales actions des accords de signature électronique à un niveau global, ce qui permet d’effectuer une même opération sur un ensemble d’accords. Cette classe implémente l’interface Salesforce Database.Batchable. Elle peut traiter tous les enregistrements, quel que soit le nombre. Ceux-ci sont rassemblés par lots de cinq et ces lots sont traités comme une transaction individuelle, ce qui permet de respecter les limitations du gouverneur.

Le service Apex par lot est affiché via la classe d’appel : echosign_dev1.EchoSignActionBatch.

Paramètres

Vous devez spécifier les paramètres suivants pour initialiser une opération par lot :

  • Liste des ID d’enregistrement d’accord sur lesquels effectuer l’action indiquée : l’action peut être définie sur l’une des valeurs prises en charge suivantes : Rappeler, Envoyer, Annuler, Supprimer ou Mettre à jour.
  • ID de session utilisateur actuel : obligatoire uniquement pour le type d’action de mise à jour.
  • Enregistrement utilisateur de l’émetteur : utilisé pour avertir l’utilisateur par e-mail une fois le traitement global terminé.

Exemple d’utilisation

User submitterUser = UserInfo.getUserId();

EchoSignActionBatch batch = new EchoSignActionBatch( agreementIds, 'Remind', UserInfo.getSessionId(), submitterUser); Id syncProcessId = Database.executeBatch(batch, 5);

Lot de modèles d’accord

Accepte une requête SOQL et un ID d’enregistrement de modèle d’accord. La requête est exécutée de façon à récupérer un ensemble d’enregistrements d’objet principal. Ceux-ci sont ensuite exécutés dans le modèle d’accord fourni, pour générer un enregistrement d’accord. Cette classe implémente l’interface Salesforce Database.Batchable. Elle peut traiter tous les enregistrements, quel que soit le nombre. Ceux-ci sont rassemblés par lots de cinq et ces lots sont traités comme une transaction individuelle, ce qui permet de respecter les limitations du gouverneur.

Les types d’enregistrements renvoyés par la requête SOQL doivent correspondre au type d’objet principal du modèle d’accord fourni. Le service de modèle d’accord est invoqué pour chaque enregistrement.

Le service Apex par lot est affiché via la classe d’appel :

echosign_dev1.AgreementTemplateBatch

Paramètres

Vous devez spécifier les paramètres suivants pour initialiser une opération par lot :

  • Requête de SOQL à exécuter : doit inclure l’ID d’enregistrement comme champ sélectionné. Les autres champs sont facultatifs.
  • ID d’enregistrement de modèle d’accord : utilisé avec l’ID d’enregistrement principal pour charger un accord.

Exemple d’utilisation

String agreementTemplateId = [SELECT Id from echosign_dev1__Agreement_Template__c where Name = 'Default Template']; String soqlQuery = 'SELECT Id from Contact where Account.IsActive = true';

AgreementTemplateBatch batch = new AgreementTemplateBatch(soqlQuery, agreementTemplateId); Id syncProcessId = Database.executeBatch(batch, 5);

Service de modèle d’accord par lot

Accepte une liste d’ID d’enregistrement d’objet principal et le type d’objet principal. L’ensemble est ensuite interrogé et exécuté dans le modèle d’accord fourni, pour générer un enregistrement d’accord. Cette classe implémente l’interface Salesforce Database.Batchable. Elle peut traiter tous les enregistrements, quel que soit le nombre. Ceux-ci sont rassemblés par lots de cinq et ces lots sont traités comme une transaction individuelle, ce qui permet de respecter les limitations du gouverneur.

Le type d’objet principal donné doit correspondre au type d’objet principal du modèle d’accord fourni. Le service de modèle d’accord est invoqué pour chaque enregistrement.

Le service Apex par lot est affiché via la classe d’appel :

echosign_dev1.AgreementTemplateServiceBatch

Paramètres

Vous devez spécifier les paramètres suivants pour initialiser une opération par lot :

  • La liste des ID d’enregistrements principaux
  • L’ID d’enregistrement de modèle d’accord : utilisé avec les enregistrements principaux pour charger un accord
  • Le nom de l’objet principal pour pouvoir formuler une requête pour les enregistrements principaux

Exemple d’utilisation

String agreementTemplateId = [SELECT Id from echosign_dev1__Agreement_Template__c where Name = 'Default Template'];

AgreementTemplateBatch batch = new AgreementTemplateServiceBatch(new List<Id>{'01p50000000HoMB'}, agreementTemplateId, 'Contact');
Id syncProcessId = Database.executeBatch(batch, 5);

Services REST

Service de modèle d’accord

Le service de modèle d’accord est proposé comme service web REST de Salesforce par le package géré. Cela permet aux systèmes externes, en dehors de l’organisation Salesforce, de charger des accords en fonction des modèles d’accord existants. Consultez Création d’API REST avec Apex REST (en anglais) pour plus d’informations sur l’accès et l’invocation des services Apex REST personnalisés depuis Salesforce. Les appels doivent fournir un ID de session valide pour le processus d’authentification et d’autorisation.

Le service web est disponible à l’adresse suivante :

https://<nom_instance>.salesforce.com/services/apexrest/echosign_dev1/template/load/<template_id>?masterId=<master_id>&varName1=varValue1&varName2=varValue2

Annotation
  • Le nom d’instance change en fonction de l’instance de votre organisation.
  • https://_<instance_name>_.salesforce.com/services/apexrest/echosign_dev1/template/load/<template_id> est une méthode HTTP POST pour les versions de package 20.0 et postérieures.
    • Les versions avant la version v20 utilisent une méthode GET.

ID de modèle

La dernière partie de l’URL est l’ID de l’enregistrement de modèle d’accord de l’organisation Salesforce actuelle devant être utilisé pour charger l’accord. Cette partie de l’URL est facultative. Si cette partie est omise, c’est le modèle d’accord par défaut qui est chargé. Si l’ID de modèle est omis et qu’aucun modèle d’accord n’est désigné par défaut, un message d’erreur apparaît.

Un ID de modèle comprend 15 ou 18 caractères.

ID principal

Le paramètre masterId définit l’enregistrement principal devant être utilisé pour charger l’accord depuis un modèle d’accord spécifique. Ce paramètre est facultatif, mais il doit être défini pour tout modèle d’accord spécifiant un type d’objet principal dont il est fait référence dans le modèle.

Un ID principal comprend 15 ou 18 caractères.

Variables d’exécution

Tous les paramètres supplémentaires sont utilisés en tant que variables d’exécution, comme paires nom-valeur, pour alimenter les variables d’exécution spécifiées dans le modèle d’accord.

Résultat

Le service web REST renvoie un objet LoadResult qui contient les champs suivants :

  • agreementId : lorsque le chargement de l’accord est réussi, contient l’ID de l’enregistrement de l’accord créé.
  • error : en cas d’erreur lors du chargement de l’accord, contient un message d’erreur détaillé.

Service d’arrière-plan

Le service d’arrière-plan permet aux utilisateurs de package d’invoquer plusieurs actions pour un objet d’accord, en mettant à jour la valeur correspondante dans le champ Action d’arrière-plan (echosign_dev1 Background_Actions c). Une fois la valeur vide ou la valeur contenue dans le champ remplacée par l’une des valeurs suivantes, l’action est activée par un déclencheur inclus dans le package géré de signature électronique.

  • Remind
  • Send
  • Cancel
  • Delete
  • Update

L’ensemble des actions s’exécute en mode futur asynchrone. Par conséquent, l’état est stocké dans le champ Erreur de l’accord.

Modifications de la rétrocompatibilité

  • Le statut de l’accord est désormais mis à jour une fois les documents et les destinataires mis à jour
    • Avant la version 21, le statut était défini avant.
  • L’objet Accord signé (contenant les URLs des images) n’est maintenant plus du tout inséré.
    • Avant la version 21, il était inséré une fois toutes les autres mises à jour terminées.
  • La taille maximale d’une requête ou d’une réponse d’appel est limitée à 12 Mo pour l’Apex asynchrone selon les limitations du gouverneur Salesforce : https://developer.salesforce.com/docs/atlas.en-us.210.0.apexcode.meta/apexcode/apex_gov_limits.htm
    • Les documents dont la taille excède 12 Mo ne peuvent pas être récupérés d’Adobe Sign en raison de la limite ci-dessus.
  • Les descriptions des événements de l’accord ont changé. Elles correspondent désormais à la description renvoyée par l’API Sign avec les rapports d’audit.
  • Le processus de mise à jour s’exécute désormais comme un processus par lots Apex natif (qui est un processus asynchrone) dans Salesforce.
    • Avant, il s’agissait d’une mise à jour effectuée à l’aide d’appels API provenant de l’extérieur de Salesforce.
    • Il n’est désormais plus possible de déclencher ces mises à jour de statut qui lançaient les processus asynchrones, car Salesforce limite l’appel à un autre processus asynchrone à partir d’un processus asynchrone en cours d’exécution.
  • Avant la version 21, les mises à jour des attributs de l’accord étaient divisées entre des appels distincts de mises à jour. Désormais, l’objet de l’accord est entièrement mis à jour lors d’une seule transaction.
  • Avant la version 21, les accords qui avaient échoué ne pouvaient être récupérés qu’en effectuant une mise à jour manuelle de Salesforce
    • Désormais, les mises à jour sont plus fiables puisque le back-end Sign récupère automatiquement les événements ayant échoué selon un nombre de fois spécifié.
  • Les mises à jour manuelles mettent désormais à jour tous les aspects des accords, y compris les objets associés.
  • Les accords Push s’exécutent désormais en mode asynchrone, comme les mises à jour régulières et les attributs supplémentaires sont mis à jour également de la même façon que les mises à jour régulières.
  • De nouveaux paramètres ont été introduits pour activer la désactivation des mises à jour de différents aspects de l’accord.
  • Lorsqu’un fichier PDF signé est archivé dans Salesforce, aucun descripteur (-signé ou -approuvé) n’est désormais ajouté à la fin du nom du fichier PDF.