L’API couvre tout le cycle des approbations : configurer le circuit d’un module, demander l’approbation d’une fiche, répondre aux étapes et suivre les demandes. Les contrôles sont ceux des écrans : ce qu’un écran refuse, l’API le refuse avec le même motif. Les mêmes opérations sont proposées à l’assistant IA de Kafinea et aux assistants connectés à Kafinea.
Toutes utilisent la session de l’API REST. Les identifiants sont ceux de l’API (89x47808) ; un simple numéro est aussi accepté.
| Opération | Méthode | Qui | Effet |
|---|---|---|---|
approval_circuit_read |
GET | administrateur | Les circuits, ou le circuit d’un module avec ses modèles et le format attendu |
approval_circuit_configure |
POST | administrateur | Vérifier, enregistrer, activer, désactiver ou supprimer un circuit |
approval_circuit_simulate |
GET | administrateur | Ce qu’un circuit demanderait pour 1 à 20 fiches, sans rien enregistrer |
approval_inbox |
GET | chacun | Ce qui attend sa réponse, ses demandes, les demandes des autres qu’il peut consulter |
approval_request_read |
GET | chacun | L’approbation d’une fiche, telle que son panneau la montre |
approval_request |
POST | chacun | Demander l’approbation d’une fiche qu’il peut modifier |
approval_answer |
POST | l’approbateur | Sa propre réponse à une étape qui lui est confiée |
approval_cancel |
POST | demandeur ou administrateur | Annuler une demande en attente |
Les opérations des demandes et des réponses sont disponibles quand la fonctionnalité Approbations est active.
1. Configurer un circuit #
approval_circuit_read sans paramètre liste les circuits et les modules qui peuvent en recevoir un. Avec moduleName, il renvoie le circuit du module (circuit, avec sa revision), les modèles de départ (templates) et le format d’un circuit (contract).
curl -G 'https://apps.kafinea.com/YourKafinea/webservice.php' \
--data-urlencode 'operation=approval_circuit_read' \
--data-urlencode 'sessionName=YOUR_SESSION_ID' \
--data-urlencode 'moduleName=Quotes'
Un circuit se décrit en entier :
{
"label": "Devis au-delà de 5 000 € HT",
"active": true,
"condition": [{"fieldname": "pre_tax_total", "operation": "greater than", "value": "5000", "groupid": "0"}],
"finalizeOnApproval": true,
"steps": [{
"label": "Responsable commercial",
"condition": [],
"approver": {"mode": "manager", "managerOf": "requester"},
"dueDays": 2,
"summaryTemplate": "Devis $subject : $pre_tax_total € HT"
}]
}
| Élément | Contenu |
|---|---|
condition |
Les fiches qui doivent être approuvées, au format des conditions des flux de travail ; [] pour toutes. groupid 0 : tous ces critères ; 1 : au moins l’un d’eux |
steps[].approver |
fixed avec ownerId (un utilisateur ou un groupe), manager avec managerOf (requester ou owner), ou field avec expression (par exemple assigned_user_id) |
steps[].condition |
Facultative : une étape dont la condition n’est pas remplie est passée |
steps[].stepId |
À renvoyer tel que lu : les demandes déjà faites continuent de nommer leur étape |
watchedFields |
Les champs dont la modification après l’approbation la rend caduque, en plus de ceux que lisent les conditions (toujours surveillés) ; watchedLabels les liste tous, avec leur libellé |
approval_circuit_configure reçoit moduleName, action et, selon l’action, definition (le circuit en JSON) et revision :
action |
Effet |
|---|---|
validate |
Vérifie definition sans rien enregistrer et renvoie valid et la liste problems (chacun avec path, code et message) |
save |
Enregistre definition en entier ; revision est celle lue, 0 pour créer le circuit d’un module qui n’en a pas |
activate, deactivate |
Active ou désactive le circuit de la revision lue |
delete |
Supprime le circuit ; les demandes déjà faites restent |
curl -X POST 'https://apps.kafinea.com/YourKafinea/webservice.php' \
--data-urlencode 'operation=approval_circuit_configure' \
--data-urlencode 'sessionName=YOUR_SESSION_ID' \
--data-urlencode 'moduleName=Quotes' \
--data-urlencode 'action=save' \
--data-urlencode 'revision=3' \
--data-urlencode 'definition={"label":"Devis au-delà de 5 000 € HT","active":true,…}'
Un circuit actif doit pouvoir être approuvé : chaque étape a un approbateur valable. Un circuit inactif peut rester un brouillon.
Avant d’activer, approval_circuit_simulate montre, pour des fiches enregistrées (recordIds, une liste JSON) et un demandeur (requesterId, l’utilisateur connecté par défaut), si la condition du circuit est remplie et qui serait sollicité à chaque étape, ou pourquoi personne ne pourrait répondre (error). Passez definition pour tester un circuit avant de l’enregistrer. Rien n’est enregistré ni envoyé.
2. Demander, répondre, suivre #
approval_inbox renvoie, selon box : toAnswer (les étapes qui attendent la réponse de l’utilisateur, directement ou par l’un de ses groupes), requested (ses demandes) ou others (les autres demandes en attente qu’il peut consulter). Sans box, les trois. Chaque étape à traiter porte son lineId.
approval_request_read avec recordId renvoie la demande en cours de la fiche, ses étapes (approbateur, réponse, motif, canAnswer pour celle à laquelle l’utilisateur peut répondre) et wouldAsk : ce qu’une nouvelle demande solliciterait.
approval_request avec recordId demande l’approbation au nom de l’utilisateur connecté. Elle est refusée quand rien ne demande d’approbation ou qu’une demande attend déjà.
approval_answer reçoit lineId, answer (approve, refuse ou changes) et reason, obligatoire pour refuser ou demander des modifications :
curl -X POST 'https://apps.kafinea.com/YourKafinea/webservice.php' \
--data-urlencode 'operation=approval_answer' \
--data-urlencode 'sessionName=YOUR_SESSION_ID' \
--data-urlencode 'lineId=194x48180' \
--data-urlencode 'answer=approve'
La réponse est toujours celle de l’utilisateur connecté : aucun paramètre ne désigne un autre utilisateur. Elle est refusée quand l’étape n’est pas confiée à cet utilisateur ou à l’un de ses groupes (administrateurs compris), quand c’est sa propre demande, ou quand un autre membre du groupe a déjà répondu.
approval_cancel avec approvalId annule une demande en attente : son demandeur ou un administrateur.
3. Le statut d’approbation des fiches #
Chaque fiche d’un module qui a un circuit porte le champ en lecture seule mdsapprovalstatus : vide tant qu’aucune approbation n’a été demandée, puis APPROVAL_STATUS_PENDING, APPROVAL_STATUS_APPROVED, APPROVAL_STATUS_REFUSED, APPROVAL_STATUS_CHANGES_REQUESTED, APPROVAL_STATUS_CANCELLED ou APPROVAL_STATUS_OBSOLETE (approbation caduque). Il se lit comme tout champ, avec retrieve ou query :
curl -G 'https://apps.kafinea.com/YourKafinea/webservice.php' \
--data-urlencode 'operation=query' \
--data-urlencode 'sessionName=YOUR_SESSION_ID' \
--data-urlencode "query=SELECT potentialname, amount FROM Potentials WHERE mdsapprovalstatus = 'APPROVAL_STATUS_APPROVED';"
Seules les approbations l’écrivent. Une approbation devient caduque quand un champ surveillé de la fiche change ensuite ; la demande garde alors le motif dans sa description.
4. Refus #
Un refus commence par son code, suivi du motif lisible :
| Code | Signification |
|---|---|
APPROVAL_CIRCUIT_INVALID |
Le circuit n’est pas valable ; chaque problème suit, une ligne par problème, avec son chemin et son code |
APPROVAL_CIRCUIT_REVISION_CHANGED |
Le circuit a changé depuis sa lecture : relisez-le, puis refaites la modification |
APPROVAL_CIRCUIT_NOT_FOUND, APPROVAL_CIRCUIT_EXISTS |
Le module n’a pas de circuit, ou en a déjà un |
APPROVAL_REFUSED |
La demande, la réponse ou l’annulation n’est pas permise ; le motif est celui que l’écran affiche |
APPROVAL_FEATURE_DISABLED |
La fonctionnalité Approbations n’est pas active |
ACCESS_DENIED |
L’opération est réservée aux administrateurs |