• Dernière modification le: 11 August 2022

Créer un panneau

Découvrez comment créer des applications de panneau pour des pages spécifiques dans Coupa.

Introduction

Les applications de panneau 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 de fournisseur se charge dans Coupa, une application de panneau sur cette page peut automatiquement obtenir des données d'une source externe via une API qui se rapporte à ce fournisseur particulier et afficher les données dans Coupa.

Créez une application de panneau en allant dans Configurer les > IFrames et les panneaux de la > plate-forme , puis cliquez sur le bouton Créer , puis sur l'option : Panel. La clé de la création et de la configuration d'une application Panel se trouve dans son descripteur, un ensemble de paramètres au format JSON pour votre application.

Voici un exemple d'application de panneau sur la page d'accueil Coupa.

Exemple d'application de panneau sur la page d'accueil Coupa

Vous pouvez créer une application de panneau en allant dans Configurer les applications > installées de > la plate-forme. Cliquez sur le bouton Créer et sélectionnez Créer une application de panneau.

Conditions exigées

À partir de R29, les applications Panel nécessitent au moins TLS v1.2 pour établir des connexions sortantes vers des API tierces.

Notions de base sur l'application Panel

Les applications Panel sont construites à 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 à l'aide de JQ v1.6.

Propriété Description
slot

Spécifie le type de page où le panneau sera rendu. Les options actuelles sont :

  • user.home (page d'accueil Coupa :/et/user/home )
  • suppliers.show (page de détails du fournisseur :/suppliers/:id/record )
  • supplier_order_headers.show
  • itemss.show (page des détails de l'article :/items/{id} )
  • contracts.show (page des détails du contrat :/contracts/show/:id )
  • réquisition_en-têtes.edit (panier Coupa :/réquisition_en-têtes/{id}/modifier )
  • iNVOICES.Show (pages de détails des factures, y compris la modification des factures sur l'interface de facturation de génération suivante :/INVOICES/{id} et/INVOICES/{id}/show_for_approval )
  • receipts.full_receipt (Page de reçu détaillée :/receipt/{id}/full_receipt )
  • expenses.index (Page de destination des dépenses :/dépenses )
  • projects.show (page de détails du projet :/projects/{id} )
  • quotes/requests.show (page de détails de l'événement de sourcing :/quotes/requests/{id} )
  • asn/headers.show (page de détails ASN :/asn/headers/{id} )
  • asn/supplier_headers.show
  • budget_lines.show (page des lignes budgétaires :/budget_lines/{id})
{

	 "slot" : "user.home"

 }

Seul un emplacement peut être spécifié par application de panneau. Pour que l'application apparaisse sur plusieurs pages, créez à nouveau l'application avec la valeur d'emplacement souhaitée.

données

L'attribut data décrit comment récupérer les données souhaitées qui sont rendues dans le panneau.  Objet JSON qui décrit les données à récupérer pour rendre le panneau. Les valeurs de cet objet seront des URL auxquelles Coupa enverra une demande afin de récupérer les données. Les réponses de toutes ces demandes de données seront fusionnées en un hachage, alias sous le nom de clé qui leur est donné dans cet objet.

"data" : {

		"study_queue" : "https://www.wanikani.com/api/user/{user_ID}/study-queue",

		"level_progression" : "https://www.wanikani.com/api/user/{user_ID}/level-progression"

	}

}
contexte


Chaque emplacement fournit des détails contextuels sur la page sur laquelle il est affiché. Par exemple, une application de panneau affichée sur une page de présentation de fournisseur aura accès à des données contextuelles sur ce fournisseur spécifique. Vous pouvez utiliser ces informations contextuelles dans vos objets de données, mais pas dans des blocs. Ainsi, lorsqu'une application de panneau effectue un rendu sur la page d'affichage pour « ACME Supplier », l'appel API peut être personnalisé en fonction du nom du fournisseur, de l'ID coupa, des valeurs des champs personnalisés et d'autres propriétés de ce fournisseur.

Un appel API à la recherche d'articles du NY Times pour des articles récents sur un fournisseur ressemblerait à ceci :

"data" : {

		"nyt_data" : {

			"URI" : "https://api.nytimes.com/svc/search/v2/articlesearch.json?

			q={context.supplier.name}&api-key={properties.api_key}"

	}

}			

Contactez Coupa pour obtenir une liste mise à jour des données contextuelles disponibles pour chaque créneau.

Paramétrer les appels API (propriétés)

Un tableau de propriétés qu'un utilisateur/administrateur doit fournir après avoir activé votre application de panneau. 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 fournissez cette option.

Un exemple de bloc serait :

"properties" : {

		"nom d'utilisateur" : {

			"type" : "string"

		},

		"password" : {

			"type" : "string"

		}

	}

Vous référencez ensuite vos propriétés dans les blocs de données comme ceci :

"data" : {

		"my_data" : {

			"method" : "publication",

			"URI" : "https://someurl.com/EVToken",

			"body" : "grant_type=password&username={{ properties.username }}&

			password={{ properties.password }}"

		}

	}

Lorsqu'un administrateur Coupa active une nouvelle application de panneau, il est invité à remplir tous les champs « propriétés » spécifiés dans le descripteur de votre application.

lancement

Ajoute un bouton de lancement qui peut être utilisé lorsqu'une application de panneau n'a pas besoin d'être affichée immédiatement. Plutôt que de communiquer automatiquement avec le tiers et de rendre les données, l'application Panel ne communique que si l'utilisateur final clique manuellement sur le bouton de lancement.

    Cet objet JSON comprend description, button_text et help_text. Par exemple :

    "launch" : {
    
    		"description" : "PretendCo Tax Calculator Service",
    
    		"button_text" : "Lancer la calculatrice",
    
    		"help_text" : "Tax Calculator s'intègre à Coupa pour vous aider à calculer les taxes internationales 
    
    		taxes, directement dans le panier. »
    
    	}

    Comment utiliser le lancement :

    • À utiliser si les données de l'application Panel ne sont pertinentes que pour des analyses de rentabilisation spécifiques de la page
    • Ajouter au même niveau que l'emplacement, les données, etc., mais pas dans les blocs
    allow_refresh

    Ajoute un bouton d'actualisation qui peut être utilisé lorsque les données de la page changent et affectent les données rendues dans l'application Panel. Ceci est pratique pour votre application 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 Panneau.

    Cette option booléenne est utilisée pour afficher un bouton d'actualisation sur l'application Panel dans le descripteur de l'application :

    "allow_refresh" : true
    
    

    Comment utiliser allow_ refresh :

    • À utiliser si les données requises par l'application peuvent être mises à jour par l'utilisateur et que l'application a besoin des nouvelles données

    Lorsque vous cliquez dessus, le bouton actualise le contenu de cette application. Ce champ doit être ajouté au même niveau que « slot », « data », « launch », etc., mais pas dans des blocs. Le bouton d'actualisation est affiché en haut de l'application du panneau.

    blocs

    L'attribut blocks 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 séparée. Les blocs ont accès aux données qui ont été précédemment envoyées et les utilisent pour créer des visualisations.

    error_blocks L'attribut blocs d'erreur fonctionne de la même manière que l'attribut blocs, mais est utilisé pour créer des messages d'erreur en cas de problème d'obtention ou de rendu des données.

    Extraction de données

    Nous autoriserons les applications à passer jusqu'à 5 appels HTTP distincts afin de récupérer des données pour l'application. Celles-ci 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 d'applications Panel

    Panel App restitue ces données sur une page Coupa existante à l'aide de différents types d'éléments d'interface utilisateur appelés blocs. Coupa prend en charge les types de blocs suivants :

    • Texte enrichi (y compris les images)
    • Champs (essentiellement des paires clé-valeur)
    • Nombre
    • Argent
    • Diagramme circulaire
    • Graphique ligne/barre/colonne
    • Lancer
    • Actualiser
    • Ligne
    • Tableau dynamique

    Configuration de l'application

    Attributs Description

    type

    Identifie le type de bloc. Par exemple, des champs, du texte ou des barres. Cela déterminera comment le bloc est rendu dans le panneau de l'interface utilisateur, ainsi que le format requis pour les données.

    données

    Cet objet JSON aura des propriétés différentes en fonction de la stratégie.

    JQ

    • type doit être égal à "jq"

    • jq est une chaîne qui contient un script JQ. Le script JQ est alimenté par la structure de données fusionnée à partir de l'attribut data en tant qu'entrée et doit produire une structure JSON qui correspond au format requis pour le type de bloc.

    Traitement des données avec JQ

    Par exemple, le script JQ suivant peut être utilisé pour extraire plusieurs éléments de données spécifiques et les reconditionner dans un autre objet JSON :

    {
    
    	 "nom d'utilisateur" : ".study_queue.user_information.username",
    
    	 "radicaux" : ".level_progression.requested_information.radicals_progress",
    
    	 "kanji" : ".level_progression.requested_information.kanji_progress"
    
    }

    Cela entraînerait la production de l'objet JSON suivant :

    {
    
    	 "username" : "exemple_utilisateur",
    
    	 "radicaux" : 0,
    
    	 "kanji" : 0
    
    }

    Plus d'informations :

    autre propriété

    Différents types de blocs peuvent avoir d'autres propriétés spécifiques à ce type de bloc.

    Types de blocs d'applications Panel

    Bloc de texte

    Attributs Description

    type

    Doit être égal au texte

    modèle

    Le type de bloc de texte utilise un modèle Liquid Markdown. Le modèle est d'abord analysé en tant que liquide pour interpoler les données renvoyées par les demandes. Ensuite, le modèle est à nouveau analysé en tant que 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.

    Markdown permet les en-têtes, la mise en évidence en ligne, les listes, les images, les liens et les guillemets. Coupa prend également en charge la mise en évidence de la syntaxe et les tableaux.

    Pour plus d'informations sur l'utilisation de Liquid et Markdown, voir Langage du modèle Liquid et Mastering Markdown.

    données

    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.

    {
    
    	 "foo" : "bar",
    
    	 "fizz" : {
    
    			"buzz" : "buzz"
    
    	 }
    
    }
    Conseil

    Actuellement, un bloc de texte est le meilleur/le seul moyen d'afficher des données dans un tableau en utilisant le format de tableau kramdown.

    Bloc de champs

    Propriété Description

    type

    Doit correspondre au champ

    données

    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.

    [
    
    	 {
    
    			"label" : "Foobar",
    
    			"value" : "fizzbuzz"
    
    	 },
    
    	 {
    
    			"label" : "Lorem Ipsum",
    
    			"value" : 42
    
    	 }
    
    ]
    titre Un titre facultatif qui apparaîtra au-dessus de la liste des champs.

    Bloc barre/ligne

    Propriété Description

    type

    Doit être égal à la barre ou à la ligne

    données

    La stratégie de données doit produire un tableau de tableaux. Contrairement au bloc de tableau, les données pour les graphiques à barres/lignes seront orientées colonnes.

    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, puis les éléments restants sont les points de la série.

    [{
    
    		"name" : "Année 1800",
    
    		"données" : [107, 31, 635, 203, 2]
    
     }, {
    
    		"nom" : "Année 1900",
    
    		"données" : [133, 156, 947, 408, 6]
    
     }, {
    
    		"nom" : "Année 2000",
    
    		"data" : [814, 841, 3714, 727, 31]
    
     }, {
    
    		"nom" : "Année 2016",
    
    		"data" : [1216, 1001, 4436, 738, 40]
    
    }]
    axe Permet de configurer les étiquettes sur les axes x et y.
    titre Un titre facultatif qui apparaîtra sous le graphique.
    description Une description des options qui apparaîtra sous le graphique dans un texte plus petit.

    Bloc à tarte

    Propriété Description

    type

    Doit être égal à la tarte

    données

    La stratégie de données doit produire un tableau de tableaux orienté colonne tel que décrit dans la section Bloc de barres/lignes.

    [{
    
    		nom : 'Chrome',
    
    		y : 20.41,
    
    		tranché : vrai,
    
    		sélectionné : vrai
    
    	}, {
    
    		nom : 'Internet Explorer',
    
    		y : 11.84
    
    	}, {
    
    		nom : 'Firefox',
    
    		y : 10.85
    
    	}, {
    
    		nom : 'Bord',
    
    		y : 4.67
    
    	}, {
    
    		nom : 'Safari',
    
    		y : 4.18
    
    	}, {
    
    		nom : 'Sogou Explorer',
    
    		y : 1.64
    
    	}, {
    
    		nom : 'Opéra',
    
    		y : 2.8
    
    	}, {
    
    		nom : 'Autre',
    
    		y : 2.61
    
    }]
    titre Un titre facultatif qui apparaîtra au-dessus du graphique.
    description Une description des options qui apparaîtra sous le graphique dans un texte plus petit.

    Money block

    Propriété Description

    type

    Doit être égal à l'argent

    données La stratégie de données doit produire un objet JSON avec la structure suivante :
    • Montant d'un flottant JSON pour déterminer le montant de la devise.
    • Devise une chaîne contenant le code devise ISO 4217 de la devise.
    {
    
    	"amount" : 42,0,
    
    	"devise" : "USD"
    
    }
    Titre Un titre facultatif qui apparaîtra au-dessus du numéro.
    Description Une description facultative qui apparaîtra sous le numéro dans un texte plus petit.

    Bloc de numéros

    Propriété Description

    Type

    Doit être égal à nombres

    Données

    La stratégie de données doit produire un seul entier JSON ou Flottant.

    42,0
    Décimal Le nombre de décimales à afficher après la virgule. La valeur par défaut est 0.
    Titre Un titre facultatif qui apparaîtra au-dessus du numéro.
    Description Une description facultative qui apparaîtra sous le numéro dans un texte plus petit.Exemple d'applications Panel

    Champs personnalisés

    L'accès aux champs personnalisés sur un objet en contexte suit ce format général :
    context.<object>.custom_fields.<field_name>

    Où se <field_name> trouve l'invite Nom de champ lors de la création d'un champ personnalisé :

    cf_fields.png

    Puisque nous examinons l'objet Fournisseur et que nous avons un champ, Numéro de téléphone, vous le référenceriez comme suit :
    context.supplier.custom_fields.phone_number

    Fente Accessoire - Champ personnalisé
    contracts.show context.contract.custom_fields.<field_name>
    projects.show context.project.custom_fields.<field_name>
    devis/requests.show context.quote_request.custom_fields.<field_name>
    réquisition_en-têtes.edit context.requisition_header.custom_fields.<field_name>
    suppliers.show context.supplier.custom_fields.<field_name>

    Les champs personnalisés ne sont pas applicables pour les emplacements qui ne font pas référence à un objet spécifique, comme :

    • user.home
    • expenses.index

    Détails de l'API

    Authentification

    Coupa prend en charge les types d'authentification suivants :

    Méthode Exemple
    Clé API standard
    "data" : {
    
    		"nyt_data" : {
    
    			"URI" : "https://api.nytimes.com/svc/search/v2/articlesearch.json?q={context.supplier.name}
    
    						&api-key={properties.api_key}"
    
    		}
    
    	}
    Authentification de base
    "data" : {
    
    		"trip_data" : {
    
    			"URI" : "https://someurl.net/trips",
    
    			"en-têtes" : {"Autorisation" :"base YOUR_BASE64_ENCODED_TOKEN_HERE"}
    
    		}
    
    	}
    Demande de jeton de courte durée à l'aide de la demande « before_data »
    "before_data" : {
    
    		"auth" : {
    
    			"method" : "publication",
    
    			"URI" : "https://someurl.com/MYToken",
    
    			"body" : "grant_type=password&username={{ properties.username }}&password={{ properties.password }}"
    
    		}
    
    	},
    
    	"data" : {
    
    		"risk_data" : {
    
    			"URI" : "https://someurl.com/MYData?integration_id=%22ID{context.supplier.id}%22",
    
    			"en-têtes" : {
    
    				"Autorisation" : "porteur {{ before_data.auth.access_token }}"
    
    			}
    
    		}
    
    	}

    URL de l'API

    • Les URL doivent être HTTPS
    • Les URL doivent être accessibles par les serveurs Coupa (c'est-à-dire qu'une requête HEAD doit réussir)
    • Les URL doivent être analysées avec succès en tant que modèles liquides valides. Cela permet l'interpolation

    Détails de la demande d'API

    • Lors de l'interpolation des 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 réponse doit être application/json ou application/xml

    Boutons

    Vous pouvez configurer un bouton de lancement ( launch)et un bouton d'actualisation (allow_refresh) pour vos applications de panneau. 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 section Bases de l'application Panel de cet article. pour plus d'informations.

    Contexte de l'application Panel

    Vous pouvez créer des applications de panneau pour les pages suivantes :

    • Page d'accueil :/et/utilisateur/accueil
    • Page fournisseurs :/suppliers/:id/record
    • Page des contrats :/contracts/show/:id
    • Panier :/requisition_headers/{id}/edit
    • Page d'accueil des projets : projects.show
    • Page Paramètres de l'événement de sourcing : devis/requests.show

    Chaque type d'application Panel a sa propre charge utile contextuelle. Vous trouverez ci-dessous les champs qui seront fournis dans la charge utile de l'API Panel Apps, qui sont utilisés comme contexte pour faire correspondre et trouver des données.

    Page Champs disponibles
    Toutes les applications du panneau user_instance (c.-à-d. [nom de domaine].coupahost.com) est inclus dans la charge utile.
    Page d'accueil id, e-mail, nom complet, connexion, Employee_NUMBER
    Afficher/modifier la facture

    invoice_id, invoice_date, invoice_number, supplier_name, supplier_number, supplier_id

    Page fournisseur

    id, nom, display_name, duns, numéro, tax_id, site web, statut

    custom_fields : object.supplier.custom_field_values_hash

    Page contrat id, parent_contract_id, nom, numéro, version, supplier_id, start_date, statut
    Panier La charge utile de l'application Panier contiendra les mêmes champs que la charge utile de l'API d'en-tête de la demande
    Projets Tous les champs du système de projet et les champs personnalisés
    Événement d'approvisionnement

    id, event_name, event_commodity, project_id, supplier_id, et tous les champs et balises personnalisés

    Exemples d'applications Panel

    Recherche d'article dans le New York Times

    Cette application ajoute les dernières nouvelles sur le fournisseur du New York Times sur la page du fournisseur. Vous devrez obtenir une clé API NYT pour que celle-ci fonctionne.

    nyt-article-search.png

    Il s'agit du code qui anime l'application.

    {
    
    	"properties" : {
    
    		"api_key" : {
    
    			"type" : "string"
    
    		}
    
    	},
    
    	"slot" : "fournisseurs.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" : "texte",
    
    			"data" : {
    
    				"type" : "jq",
    
    				"jq" : "{ \"docs\": .nyt_data | .response | .docs }"
    
    			},
    
    			"text" : "![logo nyt](http://www.transervice.com/wp-content/uploads/2018/06/the-new-york-times-4.png){:height=\"100px\"}"
    
    		},
    
    		{
    
    			"type" : "texte",
    
    			"data" : {
    
    				"type" : "jq",
    
    				"jq" : "{ \"docs\": .nyt_data | .response | .docs }"
    
    			},
    
    			"texte" : "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 Weather Panel

    Cet exemple d'application montre la représentation graphique des aspects de température d'un emplacement. Vous devez obtenir une clé API pour que celle-ci fonctionne.

    weather-app-example.png

    Il s'agit du code qui anime l'application.

    {
    
    	"properties" : {},
    
    	"slot" : "fournisseurs.show",
    
    	"data" : {
    
    		"chicago_data" : {
    
    			"method" : "obtenir",
    
    			"URI" : "https://api.openweathermap.org/data/2.5/weather ?q=Chicago&appid=155057bc8e3dde82a6482e76bddf9c10&units=imperial"
    
    		}
    
    	},
    
    	"blocks" : [
    
    		{
    
    			"type" : "bar",
    
    			"titre" : "Voici la météo à Chicago",
    
    			"data" : {
    
    				"type" : "jq",
    
    				"jq" : "[{name : \"Temp\", data : [.chicago_data.main.temp]}, {name : \" Vitesse du vent\", data : [.chicago_data.wind.speed]}, {name : \"Humidité\", data : [.chicago_data.main.humidity]}]"
    
    			},
    
    			"axes" : {
    
    				"xAxis" : {
    
    					"labels" : {
    
    						"enabled" : false
    
    					}
    
    				},
    
    				"yAxis" : {
    
    					"title" : {
    
    						"text" : ""
    
    					},
    
    					"max" : 100
    
    				}
    
    			}
    
    		},
    
    		{
    
    			"type" : "ligne",
    
    			"titre" : "Voici la météo à 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",
    
    						"Fév",
    
    						"Mars",
    
    						"TAP",
    
    						"Mai",
    
    						"Juin"
    
    					]
    
    				},
    
    				"yAxis" : {
    
    					"title" : {
    
    						"text" : ""
    
    					},
    
    					"max" : 200
    
    				}
    
    			}
    
    		}
    
    	]
    
    }

    Exemple d'API d'application Panel

    Vous trouverez ci-dessous le descripteur d'application utilisé pour un test automatisé. Nous éliminons la réponse de l'API pour renvoyer exactement ceci :

    [	
    
    	{	
    
    		"data_title" :"Titre",
    
    		"data_number" :42,
    
    		"second_score" :88
    
    	}
    
    ]
    
     
    
    {
    
    	# Voici l'endroit où vous configureriez les champs spécifiques au client. Comme login/mot de passe. Le client serait invité à remplir
    
    	# ces valeurs une fois, lors de l'activation de l'application
    
    	"properties" : {},
    
    	# Il s'agit de la page où l'application est affichée. Voir la propriété "slot" pour les valeurs possibles.	
    
    	"slot" : "fournisseurs.show",	 
    
    	# Certaines API nécessitent un jeton porteur, ou un processus en 2 étapes, c'est là que vous gérez cela.
    
    	"before_data" : {}, 
    
    	"data" : {
    
    		"coupa_data" : {
    
    			# Vous pouvez ajouter des valeurs spécifiques au contexte à cet appel d'API, {{context.contract.supplier_name}} par exemple
    
    			"URI" : "http://fake.test", 
    
    			# Cela fonctionne intuitivement, il suffit de spécifier vos en-têtes API ici, jeton porteur, paramètres, etc.
    
    			"en-têtes" : {} 
    
    		}
    
    	},
    
    	"blocks" : [
    
    		{
    
    			"type" : "numéro",
    
    			# This is hard-coded title for this block, cannot use api data, or contextual data here	
    
    			"titre" : "Titre pour le bloc de numéros",
    
    			# "coupa_data" était la réponse de l'API ci-dessus, .[0] renvoie le contenu dans le {}, ".data_number" obtient la valeur, 
    
    			# dans ce cas "42"
    
    			"data" : {
    
    				"type" : "jq",
    
    				"jq" : ".coupa_data | .[0] | .data_number"	
    
    			}
    
    		}, 
    
    			# Donc, ce bloc rend un bloc de nombre spécialement formaté, avec le nombre "42" en grande police en gras, 
    
    			# et un libellé/titre de « Title for number block »
    
    		{
    
    			# Fields block has some of the strictest requirements for data, It displays all data in key -> value pairs
    
    			"type" : "champs",
    
    			"data" : {
    
    				"type" : "jq",
    
    				"jq" : ".coupa_data | .[] | to_entries | map({ label : .key, value : .value })" 
    
    			}
    
    		},
    
    		{
    
    			# Pour ce bloc, nous allons simplement extraire le hachage du [] et utiliser les valeurs qu'il contient
    
    			"type" : "texte",
    
    			"data" : {
    
    				"type" : "jq",
    
    				"jq" : " .coupa_data | .[0]"
    
    			},
    
    			# Les blocs de texte vous donnent beaucoup de flexibilité pour afficher les données de la réponse de l'API dans le contexte.
    
    			# Le texte peut être formaté tout comme le balisage, de sorte que vous pouvez créer des liens, des tableaux, rendre/redimensionner des images, etc.	 
    
    			"text" : "{{ data_number }}	est le data_number" 
    
    		},
    
    		{
    
    			# La configuration du graphique à barres est assez délicate, peut-être que vous pouvez travailler avec nous si vous voulez suivre cette voie.
    
    			# Mais cet exemple crée un graphique à barres avec des valeurs/étiquettes de tailles de barres basées sur les valeurs de la réponse API
    
    			"type" : "bar",
    
    			"titre" : "Graphique à barres avec de fausses données",
    
    			"data" : {
    
    				"type" : "jq",
    
    				"jq" : "[{name : \"Score global\", data : [.coupa_data | .[0].data_number]}, 
    
    								{name : \"Score d'environnement\", data : [.coupa_data | .[0].second_score]}]" 
    
    			},
    
    			"axes" : {"xAxis" : {"labels" : { "enabled" : false}}, "yAxis" : {"title" : { "text" : ""}, "max" : 100} }
    
    		}
    
    	]
    
    }

    Test dans l'instance du partenaire

    Pour tester cela dans Coupa, vous devrez être sur la version R25.0 ou supérieure.  En fin de compte, votre application fera partie de l'annuaire des applications et ne sera pas une application de panneau personnalisée, mais en utilisant ces étapes, vous pouvez la tester vous-même avant que Coupa n'ajoute officiellement l'application à l'annuaire des applications.

    1. Aller à la configuration
    2. Sous Plateforme, cliquez sur « Applications installées »
    3. Cliquer sur le bouton 'Créer', puis sélectionner 'Créer une nouvelle application de panneau'
    4. Créez l'application
    5. Ajouter un nom
    6. Dans la section du descripteur, incluez le code indiqué ci-dessus

    Une fois terminé, si aucune erreur ne se produit, une application de panneau sera affichée sur chaque page du fournisseur.

    Téléchargez une application sur Coupa App Marketplace

    Visitez Coupa App Marketplace pour télécharger un panneau et suivez les instructions d'installation fournies. Pour plus d'informations sur l'affichage des applications installées, consultez l'App Marketplace de Coupa