Créer une application de panneau intégré
Découvrez comment créer des applications Panel pour des pages spécifiques dans Coupa.
Introduction
Les applications Panel permettent aux clients d'afficher des données provenant de sources externes dans un panneau d'interface utilisateur sur une page Coupa donnée. Ces données peuvent être spécifiques au contexte et peuvent être actualisées automatiquement ou manuellement. Par exemple, lorsqu'une page Fournisseur se charge dans Coupa, une application Panel de cette page peut automatiquement obtenir des données d'une source externe via l'API qui concerne ce fournisseur particulier et afficher les données dans Coupa.
Créez une application Panel en accédant à Configuration > Plateforme > Applications installées et cliquez sur Créer puis l'option : Créer une nouvelle application de panneau , La clé pour créer et configurer une application Panel se trouve dans son Descriptor, un ensemble de paramètres au format JSON pour votre application.
Voici un exemple d'application Panel sur la page d'accueil Coupa.
Vous pouvez créer une application Panel en accédant à Configuration > Plateforme > Applications installées , Cliquez sur le bouton Créer et sélectionnez Créer une nouvelle application de panneau ,
Conditions exigées
À partir de la version R29, les applications Panel nécessitent au moins TLS v1.2 pour établir des connexions sortantes avec des API tierces.
Notions de base des applications Panel
Les applications Panel sont créées à l'aide d'un descripteur d'application qui utilise le format JSON. Le descripteur se compose de deux propriétés principales : les données et les blocs. Les données sont traitées via JQ v1.6 ,
Propriété | Description |
---|---|
slot
|
Spécifie le type de page dans lequel le panneau sera affiché. Les options actuelles sont :
Un seul emplacement peut être spécifié par application de panneau. Pour que l'application apparaisse sur plusieurs pages, créez-la à nouveau avec le nom souhaité
|
|
L'attribut data décrit comment récupérer les données souhaitées qui sont affichées dans le panneau. Objet JSON qui décrit les données à récupérer pour le rendu du panneau. Les valeurs de cet objet seront des URL auxquelles Coupa enverra une demande afin de récupérer des données. Les réponses de toutes ces demandes de données seront fusionnées en un seul hachage, avec un alias sous le nom de clé qui leur est donné dans cet objet.
|
context
|
Un appel API à la recherche d'articles du New York Times pour des articles récents sur un fournisseur ressemblerait à ceci :
Contactez Coupa pour obtenir une liste actualisée des données contextuelles disponibles pour chaque emplacement. |
Paramétrer les appels api (propriétés) |
Tableau de propriétés qu'un utilisateur/administrateur doit fournir après avoir activé votre application Panel. Si votre application/API nécessite une clé API unique ou un identifiant/mot de passe pour chaque client Coupa qui l'active, voici comment vous pouvez fournir cette option. Voici un exemple de bloc :
Vous référencez ensuite vos propriétés dans les blocs de données comme suit :
Lorsqu'un administrateur Coupa active une nouvelle application de panneau, il est invité à remplir tous les champs de « propriétés » spécifiés dans votre descripteur d'application. |
launch
|
Ajoute un bouton de lancement qui peut être utilisé lorsqu'une application Panel n'a pas besoin d'être affichée immédiatement. Plutôt que d'être transmise automatiquement à un tiers et de restituer les données, l'application ne le fait que si l'utilisateur clique manuellement sur le bouton Lancer.
Cet objet JSON inclut
Comment utiliser
|
allow_refresh
|
Ajoute un bouton Actualiser qui peut être utilisé lorsque les données de la page changent et affecte les données affichées dans l'application Panel. Ceci est pratique pour votre application de panneau de panier lorsqu'une ligne de demande est mise à jour. L'utilisateur peut cliquer sur le bouton Actualiser pour mettre à jour les données dans l'application Panel. Cette option booléenne est utilisée pour afficher un bouton d'actualisation sur l'application Panel dans le descripteur d'application : "allow_refresh": true
Comment utiliser
Lorsque vous cliquez dessus, le bouton actualise le contenu de cette application. Ce champ doit être ajouté au même niveau que « slot », « data », « lancement », etc., mais pas en blocs. Le bouton Actualiser apparaît en haut de l'application du panneau.
|
blocks
|
L'attribut blocs décrit comment afficher les données dans le panneau. Il s'agit d'un tableau d'objets JSON ("blocs") de différents types qui décrivent chacun une visualisation distincte. Les blocs ont accès aux données précédemment envoyées et les utilisent pour créer des visualisations. |
error_blocks
|
L'attribut des blocs d'erreur fonctionne de la même manière que l'attribut des blocs, mais il est utilisé pour créer des messages d'erreur lorsqu'il y a un problème pour obtenir ou restituer les données. |
Récupération des données
Nous autoriserons les applications à effectuer jusqu'à 5 appels HTTP distincts afin de récupérer les données de l'application. Elles seront spécifiées à l'aide de l'attribut de données dans le descripteur. Les appels API doivent renvoyer JSON (préféré) ou XML.
Types de blocs des applications Panel
Panel App affiche ces données sur une page Coupa existante en utilisant différents types d'éléments d'interface utilisateur connus sous le nom de blocs , Coupa prend en charge les types de blocs suivants :
- Texte riche (y compris les images)
- Champs (paires clé-valeur essentiellement)
- Numéro
- Argent
- Graphique à secteurs
- Graphique ligne/barre/colonne
- Lancer
- Actualiser
Configuration des applications
Attribut | Description |
---|---|
|
Identifie le type de bloc. Par exemple,
|
|
Cet objet JSON aura des propriétés différentes selon la stratégie. JQ
Traitement des données avec JQ Par exemple, le script JQ suivant peut être utilisé pour extraire plusieurs données spécifiques et les reconditionner dans un autre objet JSON :
L'objet JSON suivant est ainsi créé :
Plus d'informations : |
|
Différents types de blocs peuvent avoir d'autres propriétés spécifiques à ce type de bloc. |
Types de blocs des applications Panel
Bloc de texte
Attribut | Description |
---|---|
|
Doit être égal à
|
template
|
Le type de bloc de texte utilise un modèle de marquage liquide. Le modèle est d'abord analysé en tant que Liquide pour interpoler les données qui sont retournées par les demandes. Ensuite, le modèle est analysé à nouveau sous Markdown pour générer le code HTML. Markdown fournit une méthode sûre pour générer du HTML et, pour des raisons de sécurité, Coupa bloque le HTML en ligne dans le modèle. Il n'y a pas de limite de caractères autre que la limite maximale de la colonne de données qui stocke la configuration du bloc. Le balisage permet de mettre en en-têtes, de mettre en évidence les en-têtes, listes, images, liens et citations. Coupa prend également en charge la coloration syntaxique et les tableaux. Pour plus d'informations sur l'utilisation de Liquid et Markdown, consultez Langue du modèle liquide et Maîtriser le Markdown , |
data
|
La stratégie de données doit produire un seul objet JSON. Toutes les clés de l'objet seront disponibles pour le modèle Liquide en tant que variables.
|
Actuellement, un bloc de texte est le meilleur/le seul moyen d'afficher des données dans un tableau en utilisant kramdown format de tableau.
Bloc de champs
Propriété | Description |
---|---|
|
Doit être égal à
|
data
|
La stratégie de données doit produire un tableau d'objets JSON avec des attributs d'étiquette et de valeur. Lors du rendu, l'étiquette sera utilisée comme étiquette de champ et la valeur sera utilisée comme valeur de champ.
|
title
|
Titre facultatif qui apparaîtra au-dessus de la liste des champs. |
Bloc de barre/ligne
Propriété | Description |
---|---|
|
Doit être égal à
|
data
|
La stratégie de données doit produire un tableau de tableaux. Contrairement au bloc de tableau, les données des graphiques à barres/courbes seront orientées colonne. Chaque tableau représente une seule série de données qui seront affichées. Le premier élément est le nom de la série, les autres éléments sont les points de la série.
|
axis
|
Permet de configurer les étiquettes sur les axes x et y. |
title
|
Titre facultatif qui apparaîtra au-dessus du graphique. |
description
|
Description des options qui apparaîtra sous le graphique en texte plus petit. |
Bloc de secteur
Propriété | Description |
---|---|
|
Doit être égal à tarte |
data
|
La stratégie de données doit produire un tableau de tableaux orienté colonne, comme décrit dans la section Bloc de barres/lignes.
|
title
|
Un titre facultatif qui apparaîtra au-dessus du graphique. |
description
|
Description des options qui apparaîtra sous le graphique en texte plus petit. |
Bloc monétaire
Propriété | Description |
---|---|
|
Doit être égal à argent |
data
|
La stratégie de données doit produire un objet JSON avec la structure suivante :
|
Title
|
Titre facultatif qui apparaîtra au-dessus du nombre. |
Description
|
Description facultative qui apparaîtra sous le nombre en texte plus petit. |
Bloc de nombres
Propriété | Description |
---|---|
|
Doit être égal à nombres |
Data
|
La stratégie de données doit produire un entier JSON unique ou un nombre à virgule flottante.
|
Decimal
|
Le nombre de décimales à afficher après la virgule. Valeur par défaut 0. |
Title
|
Titre facultatif qui apparaîtra au-dessus du nombre. |
Description
|
Description facultative qui apparaîtra sous le nombre en texte plus petit.Exemple d'applications de panneau |
Champs personnalisés
L'accès aux champs personnalisés d'un objet contextuel suit ce format général :
context.<object>.custom_fields.<field_name>
Où
<field_name>
est le
Nom de champ
invite lors de la création d'un champ personnalisé :
Puisque nous examinons l'objet Fournisseur et que nous avons un champ, Numéro de téléphone, vous pouvez le référencer comme suit :
context.supplier.custom_fields.phone_number
Emplacement | Accesseur de champ personnalisé |
---|---|
contrats.afficher |
context.contract.custom_fields. |
projets.afficher |
context.project.custom_fields. |
quotes/requests.show |
context.quote_request.custom_fields. |
requisition_headers.modifier |
context.requisition_header.custom_fields. |
fournisseurs.afficher |
context.supplier.custom_fields. |
Les champs personnalisés ne sont pas applicables aux emplacements qui ne font pas référence à un objet spécifique, comme :
-
user.home
-
expenses.index
Détails API
Authentification
Coupa prend en charge les types d’authentification suivants :
Méthode | Exemple |
---|---|
Clé API standard |
|
Authentification de base |
|
Demande de jeton à durée de vie courte utilisant la demande « before_data » |
|
URL API
- Les URL doivent être HTTPS
- Les URL doivent être accessibles par les serveurs Coupa (une demande HEAD doit réussir)
- Les URL doivent être analysées comme modèles liquides valides. Ceci permet d'activer l'interpolation
Détails de demande API
- Lors de l'interpolation de données dans les URL à l'aide de Liquid, le résultat doit être une URL valide
- Le code de réponse doit être 200 ou 204
- Le serveur distant doit répondre dans un délai de 5 secondes
-
Le type de contenu de la réponse doit être
application/json
ouapplication/xml
Boutons
Vous pouvez configurer un
Bouton de lancement
(
launch
) et une
Bouton Actualiser (
allow_refresh
)
pour vos applications Panel. Bien que la fonctionnalité ressemble à un bloc, techniquement, les boutons ne sont pas des blocs. Vous trouverez des détails sur les boutons dans la
Notions de base des applications Panel
de cet article. pour plus d'informations.
Contexte d'application Panel
Vous pouvez créer des applications Panel pour les pages suivantes :
-
Page d'accueil :
/
et/user/home
-
Page Fournisseurs :
/suppliers/:id/record
-
Page Contrats :
/contracts/show/:id
-
Panier :
/requisition_headers/{id}/edit
-
Page d'accueil des projets :
projects.show
-
Page Paramètres de l'appel d'offres :
quotes/requests.show
Chaque type d'application Panel possède sa propre charge utile de contexte. Vous trouverez ci-dessous les champs qui seront fournis dans la charge utile API Panel Apps, qui sont utilisés comme contexte pour faire correspondre et rechercher des données.
Page | Champs disponibles |
---|---|
Toutes les applications du panneau |
user_instance
(i.e. [nom de domaine].coupahost.com) est inclus dans la charge utile.
|
Page d'accueil |
id
,
email
,
fullname
,
login
,
employee_number
|
Afficher/modifier la facture |
|
Page du fournisseur |
champs_personnalisés :
|
Page Contrat |
id
,
parent_contract_id
,
name
,
number
,
version
,
supplier_id
,
start_date
,
status
|
Panier | La charge utile de l'application Panel du panier contiendra les mêmes champs que la charge utile de l'API d'en-tête de demande |
Projets | Tous les champs système et personnalisés du projet |
Appel d'offres |
|
Exemples d'applications Panel
Recherche d'article dans le New York Times
Cette application ajoute les informations récentes sur le fournisseur du New York Times sur la page du fournisseur. Vous devez obtenir un numéro d'identification Clé API NYT pour que celle-ci fonctionne.
Il s'agit du code qui pilote l'application.
{
"properties": {
"api_key": {
"type": "string"
}
},
"slot": "suppliers.show",
"before_data": {},
"data": {
"nyt_data": {
"uri": "https://api.nytimes.com/svc/search/v2/articlesearch.json?q={context.supplier.name}&api-key={properties.api_key}"
}
},
"blocks": [
{
"type": "text",
"data": {
"type": "jq",
"jq": "{ \"docs\": .nyt_data | .response | .docs }"
},
"text": "![nyt logo](http://www.transervice.com/wp-content/uploads/2018/06/the-new-york-times-4.png){:height=\"100px\"}"
},
{
"type": "text",
"data": {
"type": "jq",
"jq": "{ \"docs\": .nyt_data | .response | .docs }"
},
"text": "1. [{{ docs[0].headline.main }}]({{ docs[0].web_url }}) \n2. [{{ docs[1].headline.main }}]({{ docs[1].web_url }})\n3. [{{ docs[2].headline.main }}]({{ docs[2].web_url }})\n4. [{{ docs[3].headline.main }}]({{ docs[2].web_url }})\n5. [{{ docs[2].headline.main }}]({{ docs[4].web_url }})\n"
}
]
}
Application Panneau Météo
Cet exemple d'application montre la représentation graphique des aspects de température d'un emplacement. Vous devez obtenir un numéro d'identification Clé API pour que celle-ci fonctionne.
Il s'agit du code qui pilote l'application.
{
"properties": {},
"slot": "suppliers.show",
"data": {
"chicago_data": {
"method": "get",
"uri": "https://api.openweathermap.org/data/2.5/weather?q=Chicago&appid=155057bc8e3dde82a6482e76bddf9c10&units=imperial"
}
},
"blocks": [
{
"type": "bar",
"title": "Here's the weather in Chicago",
"data": {
"type": "jq",
"jq": "[{name: \"Temp\", data: [.chicago_data.main.temp]}, {name: \"Wind Speed\", data: [.chicago_data.wind.speed]}, {name: \"Humidity\", data: [.chicago_data.main.humidity]}]"
},
"axes": {
"xAxis": {
"labels": {
"enabled": false
}
},
"yAxis": {
"title": {
"text": ""
},
"max": 100
}
}
},
{
"type": "line",
"title": "Here's the weather in Chicago",
"data": {
"type": "jq",
"jq": "[{name: \"Minimum, Current, max temp for Chicago\", data: [[.chicago_data.main.temp_min], [.chicago_data.main.temp], [.chicago_data.main.temp_max]] }, {name: \"Fake data not from API\", data: [44, 52, 130, 87, 74, 88] }]"
},
"axes": {
"xAxis": {
"labels": {
"enabled": true
},
"categories": [
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"June"
]
},
"yAxis": {
"title": {
"text": ""
},
"max": 200
}
}
}
]
}
Exemple d'API Panel App
Vous trouverez ci-dessous le descripteur d'application utilisé pour un test automatisé. Nous avons découpé la réponse API pour renvoyer exactement ceci :
[
{
"data_title":"Title",
"data_number":42,
"second_score":88
}
]
{
# Here is where you'd setup client specific fields. Like login/password. The customer would be prompted to fill in
# those values once, when activating the application
"properties": {},
# This is the page where the app gets displayed. See the "slot" property for possible values.
"slot": "suppliers.show",
# Some APIs require a bearer token, or a 2-step process, this is where you handle that.
"before_data": {},
"data": {
"coupa_data": {
# You can add context specific values to this API call, {{context.contract.supplier_name}} for example
"uri": "http://fake.test",
# This works intuitively, just specify your API headers here, Bearer token, params, etc.
"headers": {}
}
},
"blocks": [
{
"type": "number",
# This is hard-coded title for this block, cant use api data, or contextual data here
"title": "Title for number block",
# "coupa_data" was the API response above, .[0] returns the stuff in the {}, ".data_number" gets the value,
# in this case "42"
"data": {
"type": "jq",
"jq": ".coupa_data | .[0] | .data_number"
}
},
# So this block renders a specially formatted number block, with the number "42" in large bold font,
# and a text label/title of "Title for number block"
{
# Fields block has some of the strictest requirements for data, It displays all data in key -> value pairs
"type": "fields",
"data": {
"type": "jq",
"jq": ".coupa_data | .[] | to_entries | map({ label: .key, value: .value })"
}
},
{
# For this block, we are just going to pull the hash out from the [] and use the values inside it
"type": "text",
"data": {
"type": "jq",
"jq": " .coupa_data | .[0]"
},
# Text blocks gives you a lot of flexibility for displaying data from the API response in context.
# The text can be formatted just like markup, so you can create links, tables, render/resize images, etc.
"text": "{{ data_number }} is the data_number"
},
{
# Setting up the bar graph is pretty tricky, maybe work with us if you want to go this route.
# But this example creates a bar graph with values/labels bar sizes based on the values in the API response
"type": "bar",
"title": "Bar graph with fake data",
"data": {
"type": "jq",
"jq": "[{name: \"Overall Score\", data: [.coupa_data | .[0].data_number]},
{name: \"Environment score\", data: [.coupa_data | .[0].second_score]}]"
},
"axes": {"xAxis": {"labels": { "enabled": false}}, "yAxis": {"title": { "text": ""}, "max": 100} }
}
]
}
Test dans l'instance du partenaire
Pour tester cette fonctionnalité dans Coupa, vous devez disposer de la version R25.0 ou supérieure. En fin de compte, votre application fera partie du répertoire App et non d'une application Panel personnalisée, mais en utilisant ces étapes, vous pouvez tester vous-même avant que Coupa ajoute officiellement l'application au répertoire App.
- Accéder à la configuration
- Sous Plateforme, cliquez sur « Applications installées »
- Cliquez sur le bouton « Créer », puis sélectionnez « Créer une nouvelle application Panel »
- Créer l'application
- Ajouter un nom
- Dans la section du descripteur, incluez le code indiqué ci-dessus
Une fois terminé, si aucune erreur ne se produit, une application Panel sera affichée sur chaque page Fournisseur.
Une partie ou la totalité de cette page peut avoir été traduite par machine. Toutes nos excuses pour les inexactitudes.