• Zuletzt bearbeitet am: 11 August 2022

Erstellen Sie ein Panel

Erfahren Sie, wie Sie Panel-Apps für bestimmte Seiten in Coupa erstellen.

Einleitung

Mit Panel-Apps können Kunden Daten aus externen Quellen innerhalb eines UI-Panels auf einer bestimmten Coupa-Seite anzeigen. Diese Daten können kontextspezifisch sein und automatisch oder manuell aktualisiert werden. Wenn beispielsweise eine Lieferantenseite in Coupa geladen wird, kann eine Panel-App auf dieser Seite automatisch Daten von einer externen Quelle über eine API abrufen, die sich auf diesen bestimmten Lieferanten beziehen, und die Daten in Coupa anzeigen.

Um eine Panel-App zu erstellen, gehen Sie auf Setup > Plattform > IFrames und Panels und klicken Sie auf die Schaltfläche Erstellen und dann auf die Option: Panel. Der Schlüssel zum Erstellen und Konfigurieren einer Panel-App liegt im Descriptor, einem JSON-Format mit Parametern für Ihre App.

Hier ist ein Beispiel für eine Panel-App auf der Coupa-Startseite.

Beispiel einer Panel-App auf der Coupa-Startseite

Sie können eine Panel-App erstellen, indem Sie auf Setup > Plattform > Installierte Apps gehen. Klicken Sie auf die Schaltfläche Erstellen und wählen Sie Neue Panel-App erstellen.

Anforderungen

Ab R29 benötigen Panel-Apps mindestens TLS v1.2, um ausgehende Verbindungen zu APIs von Drittanbietern herzustellen.

Panel-App-Grundlagen

Panel-Apps werden mit einem App-Deskriptor erstellt, der das JSON-Format verwendet. Der Deskriptor besteht aus zwei Haupteigenschaften: Daten und Blöcken. Daten werden mit JQ v1.6 verarbeitet.

Eigenschaft Beschreibung
steckplatz

Legt den Seitentyp fest, auf dem das Panel gerendert wird. Aktuelle Optionen sind:

  • user.home (Coupa Homepage:/und/user/home )
  • suppliers.show (Lieferanten-Detailseite:/suppliers/:id/record )
  • supplier_order_headers.show
  • items.show (Artikeldetailseite:/items/{id} )
  • contractss.show (Vertragsdetailseite:/contracts/show/:id )
  • requisition_headers.edit (Coupa-Warenkorb:/requisition_headers/{id}/edit )
  • invoices.show (Rechnungsdetailseiten, einschließlich der Bearbeitung von Rechnungen auf der Rechnungs-UI der nächsten Generation:/invoices/{id} und/invoices/{id}/show_for_approval )
  • receipts.full_receipt (Detaillierte Belegseite:/receipts/{id}/full_receipt )
  • expenses.index (Spesen Landingpage:/Spesen )
  • projects.show (Projektdetailseite:/projects/{id} )
  • quotes/requests.show (Sourcing-Event-Detailseite:/quotes/requests/{id} )
  • asn/headers.show (ASN-Detailseite:/asn/headers/{id} )
  • asn/supplier_headers.show
  • budget_lines.show (budget lines page:/budget_lines/{id})
{

	 "slot": "user.home"

 }

Pro Panel-App kann nur ein Steckplatz angegeben werden. Damit die App auf mehreren Seiten angezeigt wird, erstellen Sie die App erneut mit dem gewünschten Slot-Wert.

daten

Das DATA-Attribut beschreibt, wie die gewünschten Daten abgerufen werden, die im Bedienfeld gerendert werden.  Ein JSON-Objekt, das beschreibt, welche Daten zum Rendern des Panels abgerufen werden sollen. Die Werte in diesem Objekt sind URLs, an die Coupa eine Anforderung sendet, um Daten abzurufen. Die Antworten aus allen diesen Datenanforderungen werden zu einem Hash zusammengeführt, der unter dem Schlüsselnamen steht, der ihnen in diesem Objekt zugewiesen wurde.

"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"

	}

}
kontext


Jeder Slot bietet kontextbezogene Details über die Seite, auf der er angezeigt wird. Zum Beispiel hat eine Panel-App, die auf einer Lieferanten-Show-Seite angezeigt wird, Zugriff auf Kontextdaten zu diesem bestimmten Lieferanten. Sie können diese Kontextinformationen in Ihren Datenobjekten verwenden, jedoch nicht in Blöcken. Wenn also eine Panel-App auf der Show-Seite für "ACME Supplier" gerendert wird, kann der API-Aufruf basierend auf dem Namen des Lieferanten, der Coupa-ID, den benutzerdefinierten Feldwerten und anderen Eigenschaften dieses Lieferanten angepasst werden.

Ein API-Aufruf zur NY Times-Artikelsuche nach aktuellen Artikeln über einen Lieferanten würde wie folgt aussehen:

"data": {

		"nyt_data": {

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

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

	}

}			

Wenden Sie sich an Coupa, um eine aktualisierte Liste der für jeden Steckplatz verfügbaren Kontextdaten zu erhalten.

API-Aufrufe parametrieren (Eigenschaften)

Ein Array von Eigenschaften, die ein Benutzer/Administrator nach der Aktivierung Ihrer Panel-App bereitstellen muss. Wenn Ihre App/API für jeden Coupa-Kunden, der sie aktiviert, einen eindeutigen API-Schlüssel oder ein Login/Passwort benötigt, stellen Sie diese Option folgendermaßen bereit.

Ein Beispielblock wäre:

"properties": {

		"username": {

			"type": "Zeichenfolge"

		},

		"password": {

			"type": "Zeichenfolge"

		}

	}

Sie verweisen dann in den Datenblöcken wie folgt auf Ihre Eigenschaften:

"data": {

		"my_data": {

			"method": "Posten",

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

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

			password={{ properties.password }}"

		}

	}

Wenn ein Coupa-Administrator eine neue Panel-App aktiviert, wird er aufgefordert, alle in Ihrem App-Deskriptor angegebenen „Eigenschaften“ -Felder auszufüllen.

starten

Fügt eine Startschaltfläche hinzu, die verwendet werden kann, wenn eine Panel-App nicht sofort angezeigt werden muss. Anstatt dass sich die Panel-App automatisch an den Drittanbieter wendet und die Daten rendert, wendet sie sich nur, wenn der Endbenutzer manuell auf die Schaltfläche Starten klickt.

    Dieses JSON-Objekt enthält description, button_text und help_text. Beispiel:

    "launch": {
    
    		"Beschreibung": "PretendCo Steuerrechner-Service",
    
    		"button_text": "Taschenrechner starten",
    
    		"help_text": "Der Steuerrechner lässt sich in Coupa integrieren, um Ihnen bei der Berechnung internationaler 
    
    		steuern, direkt im Einkaufswagen."
    
    	}

    Verwendung von Launch:

    • Verwenden, wenn die Daten in der Panel-App nur für bestimmte Geschäftsfälle innerhalb der Seite relevant sind
    • Auf der gleichen Ebene wie Steckplatz, Daten usw. hinzufügen, aber nicht in Blöcken
    allow_refresh

    Fügt eine Aktualisierungsschaltfläche hinzu, die verwendet werden kann, wenn sich die Daten auf der Seite ändern und sich auf die in der Panel-App gerenderten Daten auswirken. Dies ist praktisch für Ihre Warenkorb-Panel-App, wenn eine Anforderungszeile aktualisiert wird. Der Benutzer kann auf die Schaltfläche Aktualisieren klicken, um die Daten in der Panel-App zu aktualisieren.

    Diese boolesche Option wird verwendet, um eine Aktualisierungsschaltfläche in der Panel-App im App-Deskriptor anzuzeigen:

    "allow_refresh": wahr
    
    

    Verwendung von allow_ refresh:

    • Verwenden, wenn die von der App benötigten Daten vom Benutzer aktualisiert werden können und die App die neuen Daten benötigt

    Wenn Sie darauf klicken, aktualisiert die Schaltfläche den Inhalt dieser App. Dieses Feld sollte auf der gleichen Ebene wie "Steckplatz", "Daten", "Start" usw. hinzugefügt werden, jedoch nicht in Blöcken. Die Schaltfläche „Aktualisieren“ wird oben in der Panel-Anwendung angezeigt.

    blöcke

    Das Attribut blocks beschreibt, wie Daten im Panel gerendert werden. Es handelt sich um ein Array von JSON-Objekten („Blöcken“) verschiedener Typen, die jeweils eine separate Visualisierung beschreiben. Blöcke haben Zugriff auf die zuvor gesendeten Daten und verwenden diese, um Visualisierungen zu erstellen.

    error_blocks Das Attribut error blocks funktioniert ähnlich wie das Attribut blocks, wird aber verwendet, um Fehlermeldungen zu erstellen, wenn es ein Problem beim Abrufen oder Rendern der Daten gibt.

    Daten werden abgerufen

    Wir erlauben Apps, bis zu 5 separate HTTP-Aufrufe zu tätigen, um Daten für die App abzurufen. Diese werden über das Attribut data im Deskriptor spezifiziert. API-Aufrufe sollten entweder json (bevorzugt) oder XML zurückgeben.

    Panel-App-Blocktypen

    Die Panel-App rendert diese Daten auf einer vorhandenen Coupa-Seite mithilfe verschiedener Arten von UI-Elementen, die als Blöcke bezeichnet werden. Coupa unterstützt die folgenden Blocktypen:

    • Rich-Text (einschließlich Bilder)
    • Felder (im Wesentlichen Schlüssel-Wert-Paare)
    • Nummer
    • Geldbetrag
    • Kreisdiagramm
    • Linien-/Balken-/Säulendiagramm
    • Starten
    • Neu laden
    • Zeile
    • Dynamische Tabelle

    App-Konfiguration

    Attribut Beschreibung

    typ

    Identifiziert den Blocktyp. Zum Beispiel Felder , Text oder Balken. Dadurch wird bestimmt, wie der Block im Bedienfeld auf der Benutzeroberfläche gerendert wird, und auch das erforderliche Format für die Daten.

    daten

    Dieses JSON-Objekt hat je nach Strategie unterschiedliche Eigenschaften.

    JQ

    • typ muss gleich "jq" sein

    • jq ist eine Zeichenfolge, die ein JQ-Skript enthält. Das JQ-Skript erhält die zusammengeführte Datenstruktur aus dem Datenattribut als Eingabe und muss eine JSON-Struktur erzeugen, die zum gewünschten Format für den Blocktyp passt.

    Verarbeitung von Daten mit JQ

    Beispielsweise könnte das folgende JQ-Skript verwendet werden, um mehrere spezifische Datenelemente zu extrahieren und in einem anderen JSON-Objekt neu zu verpacken:

    {
    
    	 "username": ".study_queue.user_information.username",
    
    	 "radicals": ".level_progression.requested_information.radicals_progress",
    
    	 "kanji": ".level_progression.requested_information.kanji_progress"
    
    }

    Dies würde dazu führen, dass das folgende JSON-Objekt erzeugt wird:

    {
    
    	 "username": "example_user",
    
    	 „Radikale“: 0,
    
    	 "kanji": 0
    
    }

    Mehr Informationen:

    andere Eigenschaften

    Verschiedene Blocktypen können andere Eigenschaften aufweisen, die für diesen Blocktyp spezifisch sind.

    Panel-App-Blocktypen

    Textsperre

    Attribut Beschreibung

    typ

    Muss gleicher Text sein

    vorlage

    Der Textblocktyp verwendet eine Liquid Markdown-Vorlage. Die Vorlage wird zunächst als Liquid geparst, um die Daten zu interpolieren, die von den Anforderungen zurückgegeben werden. Anschließend wird die Vorlage erneut als Markdown geparst, um das HTML zu generieren.

    Markdown bietet eine sichere Methode zum Generieren von HTML, und aus Sicherheitsgründen blockiert Coupa Inline-HTML in der Vorlage. Es gibt kein Zeichenlimit außer dem maximalen Limit der Datenspalte, in der die Konfiguration des Blocks gespeichert ist.

    Markdown ermöglicht Kopfzeilen, Inline-Hervorhebungsformatierungen, Listen, Bilder, Links und Blockzitate. Coupa unterstützt auch Syntaxhervorhebung und Tabellen.

    Ausführliche Informationen zur Arbeit mit Liquid und Markdown finden Sie unter Liquid-Vorlagensprache und Mastering Markdown.

    daten

    Die Datenstrategie muss ein einzelnes JSON-Objekt erzeugen. Alle Schlüssel im Objekt stehen der Liquid-Vorlage als Variablen zur Verfügung

    {
    
    	 "foo": "Bar",
    
    	 "fizz": {
    
    			"Buzz": "Buzz"
    
    	 }
    
    }
    Tipp

    Derzeit ist ein Textblock die beste/einzige Möglichkeit, Daten in einer Tabelle im Kramdown-Tabellenformat anzuzeigen.

    Feldblock

    Eigenschaft Beschreibung

    typ

    Muss gleich sein Feld

    daten

    Die Datenstrategie muss ein Array von JSON-Objekten mit Label- und Value-Attributen erzeugen. Beim Rendern wird die Bezeichnung als Feldbezeichnung und der Wert als Feldwert verwendet.

    [
    
    	 {
    
    			"label": "Foobar",
    
    			"value": "Fizzbuzz"
    
    	 },
    
    	 {
    
    			"label": "Lorem Ipsum",
    
    			"value": 42
    
    	 }
    
    ]
    titel Ein optionaler Titel, der über der Liste der Felder angezeigt wird.

    Stangen-/Linienblock

    Eigenschaft Beschreibung

    typ

    Muss gleich Balken oder Linie sein

    daten

    Die Datenstrategie muss ein Array von Arrays erzeugen. Im Gegensatz zum Tabellenblock sind die Daten für Balken-/Liniendiagramme spaltenorientiert.

    Jedes Array stellt eine einzelne Reihe von Daten dar, die angezeigt werden. Das erste Element ist der Name der Reihe, dann sind die verbleibenden Elemente die Punkte in der Reihe.

    [{
    
    		"Name": "Jahr 1800",
    
    		"data": [107, 31, 635, 203, 2]
    
     }, {
    
    		"name": "Jahr 1900",
    
    		"data": [133, 156, 947, 408, 6]
    
     }, {
    
    		"name": "Jahr 2000",
    
    		"data": [814, 841, 3714, 727, 31]
    
     }, {
    
    		"name": "Jahr 2016",
    
    		"data": [1216, 1001, 4436, 738, 40]
    
    }]
    achse Ermöglicht die Konfiguration der Beschriftungen auf der x- und y-Achse.
    titel Optionaler Titel, der über dem Diagramm angezeigt wird.
    beschreibung Eine Optionsbeschreibung, die unterhalb des Diagramms in kleinerem Text angezeigt wird.

    Tortendiagramm

    Eigenschaft Beschreibung

    typ

    Muss gleich Kuchen sein

    daten

    Die Datenstrategie muss ein spaltenorientiertes Array von Arrays erzeugen, wie im Abschnitt Balken/Linienblock beschrieben.

    [{
    
    		name: 'Chrome',
    
    		jahr: 20,41,
    
    		geschnitten: wahr,
    
    		ausgewählt: wahr
    
    	}, {
    
    		name: 'Internet Explorer',
    
    		jahr: 11.84
    
    	}, {
    
    		name: 'Firefox',
    
    		jahr: 10.85
    
    	}, {
    
    		name: 'Edge',
    
    		jahr: 4.67
    
    	}, {
    
    		name: 'Safari',
    
    		jahr: 4.18
    
    	}, {
    
    		name: 'Sogou Explorer',
    
    		jahr: 1.64
    
    	}, {
    
    		name: 'Oper',
    
    		jahr: 2.8
    
    	}, {
    
    		name: 'Andere',
    
    		jahr: 2.61
    
    }]
    titel Optionaler Titel, der über dem Diagramm angezeigt wird.
    beschreibung Eine Optionsbeschreibung, die unterhalb des Diagramms in kleinerem Text angezeigt wird.

    Geldsperre

    Eigenschaft Beschreibung

    typ

    Muss gleich Geld sein

    daten Die Datenstrategie muss ein JSON-Objekt mit der folgenden Struktur erzeugen:
    • Betrag eines JSON-Floats, um den Betrag der Währung zu bestimmen.
    • Die Währung ist eine Zeichenfolge, die den ISO 4217-Code der Währung enthält.
    {
    
    	"Betrag": 42,0,
    
    	"currency": "USD"
    
    }
    Titel Ein optionaler Titel, der über der Nummer angezeigt wird.
    Beschreibung Eine optionale Beschreibung, die unterhalb der Zahl in kleinerem Text angezeigt wird.

    Nummernblock

    Eigenschaft Beschreibung

    Typ

    Muss gleiche Zahlen sein

    Daten

    Die Datenstrategie muss eine einzelne json Integer oder Float erzeugen.

    42,0
    Dezimaltrennzeichen Anzahl der nach dem Dezimalpunkt anzuzeigenden Dezimalstellen. Die Standardeinstellung ist 0.
    Titel Ein optionaler Titel, der über der Nummer angezeigt wird.
    Beschreibung Eine optionale Beschreibung, die unter der Nummer in kleinerem Text angezeigt wird.Beispiel Panel-Apps

    Benutzerdefinierte Felder

    Der Zugriff auf benutzerdefinierte Felder für ein kontextbezogenes Objekt folgt diesem allgemeinen Format:
    context.<object>.custom_fields.<field_name>

    Wo <field_name> befindet sich die Eingabeaufforderung für den Feldnamen beim Erstellen eines benutzerdefinierten Felds:

    cf_fields.png

    Da wir uns das Lieferantenobjekt ansehen und ein Feld, Telefonnummer, haben, würden Sie es wie folgt referenzieren:
    context.supplier.custom_fields.phone_number

    Slot Benutzerdefinierter Feldzugriff
    contractss.show context.contract.custom_fields.<field_name>
    projects.show context.project.custom_fields.<field_name>
    angebote/Anfragen.show context.quote_request.custom_fields.<field_name>
    requisition_headers.edit context.requisition_header.custom_fields.<field_name>
    suppliers.show context.supplier.custom_fields.<field_name>

    Benutzerdefinierte Felder gelten nicht für Steckplätze, die nicht auf ein bestimmtes Objekt verweisen, z. B.:

    • user.home
    • expenses.index

    API-Details

    Authentifizierung

    Coupa unterstützt die folgenden Authentifizierungstypen:

    Methode Beispiel
    Standard-API-Schlüssel
    "data": {
    
    		"nyt_data": {
    
    			"URI": "https://api.nytimes.com/svc/search/v2/articlesearch.json?q={context.supplier.name}
    
    						&api-key={properties.api_key}"
    
    		}
    
    	}
    Standard-Authentifizierung
    "data": {
    
    		"trip_data": {
    
    			"URI": "https://someurl.net/trips",
    
    			"headers": {"Autorisierung":"basic YOUR_BASE64_ENCODED_TOKEN_HERE"}
    
    		}
    
    	}
    Anforderung für kurzlebiges Token mit "before_data" -Anforderung
    "before_data": {
    
    		"auth": {
    
    			"method": "Posten",
    
    			"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",
    
    			"headers": {
    
    				"Authorization": "Inhaber {{ before_data.auth.access_token }}"
    
    			}
    
    		}
    
    	}

    API-URLs

    • URLs müssen https sein
    • URLs müssen für Coupa-Server zugänglich sein (d. h. eine HEAD-ANFRAGE muss erfolgreich sein)
    • URLs müssen erfolgreich als gültige Liquid-Vorlagen analysiert werden. Dies soll die Interpolation ermöglichen

    API-Anforderungsdetails

    • Bei der Interpolation von Daten in die URLs mit Liquid muss das Ergebnis eine gültige URL sein
    • Antwortcode muss 200 oder 204 sein
    • Der Remote-Server muss innerhalb einer Zeitüberschreitung von 5 Sekunden antworten
    • Der Antwortinhaltstyp muss entweder application/json oder application/xml sein

    Tasten

    Sie können eine Schaltfläche zum Starten (Launch)und eine Schaltfläche zum Aktualisieren (allow_refresh) für Ihre Panel-Apps konfigurieren. Während die Funktionalität wie ein Block aussieht und sich anfühlt, sind Schaltflächen technisch gesehen keine Blöcke. Weitere Informationen zu Schaltflächen finden Sie im Abschnitt Grundlagen der Panel-App in diesem Artikel. für weitere Informationen.

    Panel-App-Kontext

    Sie können Panel-Apps für die folgenden Seiten erstellen:

    • Startseite:/und/user/home
    • Lieferantenseite:/suppliers/:id/record
    • Vertragsseite:/contracts/show/:id
    • Warenkorb:/requisition_headers/{id}/edit
    • Projekt-Startseite: projects.show
    • Seite Sourcing-Event-Einstellungen: quotes/requests.show

    Jeder Panel-App-Typ hat seine eigene Kontextnutzlast. Nachfolgend finden Sie die Felder, die in der Panel-Apps-API-Nutzlast bereitgestellt werden, die als Kontext zum Abgleichen und Suchen von Daten verwendet werden.

    Seite Verfügbare Felder
    Alle Panel-Apps user_instance (d. h. [Domainname].coupahost.com) ist in der Nutzlast enthalten.
    Startseite id, email, fullname, login, employee_number
    Rechnung anzeigen/bearbeiten

    invoice_id, invoice_date, invoice_number, supplier_name, supplier_number, supplier_id

    Supplier page

    id, name, display_name, duns, number, tax_id, website, status

    custom_fields: object.supplier.custom_field_values_hash

    Vertragsseite id, parent_contract_id, name, number, version, supplier_id, start_date, status
    Einkaufswagen Die Warenkorb-Panel-App-Nutzlast enthält dieselben Felder wie die Anforderungskopf-API-Nutzlast
    Projekte Alle Felder des Projektsystems und benutzerdefinierte Felder
    Beschaffungsereignis

    id, event_name, event_commodity, project_id, supplier_id und alle benutzerdefinierten Felder und Tags

    Panel-App-Beispiele

    New York Times Artikelsuche

    Diese App fügt die neuesten Nachrichten über den Lieferanten von der New York Times auf der Seite des Lieferanten hinzu. Sie benötigen einen NYT-API-Schlüssel, damit dieser funktioniert.

    nyt-article-search.png

    Dies ist der Code, der die App antreibt.

    {
    
    	"properties": {
    
    		"api_key": {
    
    			"type": "Zeichenfolge"
    
    		}
    
    	},
    
    	"slot": "lieferanten.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"
    
    		}
    
    	]
    
    }

    Wetter-Panel-App

    Diese Beispiel-App zeigt die grafische Darstellung von Temperaturaspekten eines Standorts. Sie benötigen einen API-Schlüssel, damit dieser funktioniert.

    weather-app-example.png

    Dies ist der Code, der die App antreibt.

    {
    
    	"properties": {},
    
    	"slot": "lieferanten.show",
    
    	"data": {
    
    		"chicago_data": {
    
    			"method": "abrufen",
    
    			"uri": "https://api.openweathermap.org/data/2.5/weather?q=Chicago&appid=155057bc8e3dde82a6482e76bddf9c10&units=imperial"
    
    		}
    
    	},
    
    	"blocks": [
    
    		{
    
    			"type": "Bar",
    
    			"Titel": "Hier ist das Wetter in Chicago",
    
    			"data": {
    
    				"type": "jq",
    
    				"jq": "[{name: \"Temp\", data: [.chicago_data.main.temp]}, {name: \"Windgeschwindigkeit\", data: [.chicago_data.wind.speed]}, {name: \"Luftfeuchtigkeit\", data: [.chicago_data.main.humidity]}]"
    
    			},
    
    			"axes": {
    
    				"xAxis": {
    
    					"labels": {
    
    						"enabled": false
    
    					}
    
    				},
    
    				"yAxis": {
    
    					"title": {
    
    						"text": ""
    
    					},
    
    					"max": 100
    
    				}
    
    			}
    
    		},
    
    		{
    
    			"type": "Zeile",
    
    			"Titel": "Hier ist das Wetter 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",
    
    						"März",
    
    						"Apr",
    
    						"Mai",
    
    						"Juni"
    
    					]
    
    				},
    
    				"yAxis": {
    
    					"title": {
    
    						"text": ""
    
    					},
    
    					"max": 200
    
    				}
    
    			}
    
    		}
    
    	]
    
    }

    Beispiel für eine Panel-App-API

    Unten finden Sie den App-Deskriptor, der für einen automatisierten Test verwendet wird. Wir streichen die API-Antwort aus, um genau dies zurückzugeben:

    [	
    
    	{	
    
    		"data_title":"Titel",
    
    		"DATA_number":42,
    
    		"second_score":88
    
    	}
    
    ]
    
     
    
    {
    
    	# Hier würden Sie kundenspezifische Felder einrichten. Wie Login/Passwort. Der Kunde wird aufgefordert,
    
    	# diese Werte einmal beim Aktivieren der Anwendung
    
    	"properties": {},
    
    	# Dies ist die Seite, auf der die App angezeigt wird. Mögliche Werte finden Sie in der Eigenschaft "slot".	
    
    	"slot": "lieferanten.show",	 
    
    	# Für einige APIs ist ein Bearer-Token oder ein 2-Schritt-Prozess erforderlich. Hier können Sie damit umgehen.
    
    	"before_data": {}, 
    
    	"data": {
    
    		"coupa_data": {
    
    			# Sie können diesem API-Aufruf kontextspezifische Werte hinzufügen, z. B. {{context.contract.supplier_name}}
    
    			"URI": "http://fake.test", 
    
    			# Dies funktioniert intuitiv, geben Sie hier einfach Ihre API-Header, Bearer-Token, Parameter usw. an.
    
    			"headers": {} 
    
    		}
    
    	},
    
    	"blocks": [
    
    		{
    
    			"type": "Nummer",
    
    			# Dies ist ein fest codierter Titel für diesen Block, kann hier keine API-Daten oder Kontextdaten verwenden	
    
    			"Titel": "Titel für Nummernblock",
    
    			# "coupa_data" war die API-Antwort oben, .[0] gibt den Inhalt in {} zurück, ".data_number" erhält den Wert, 
    
    			# in diesem Fall "42"
    
    			"data": {
    
    				"type": "jq",
    
    				"jq": ".coupa_data | .[0] | .data_number"	
    
    			}
    
    		}, 
    
    			# Dieser Block gibt also einen speziell formatierten Zahlenblock mit der Nummer "42" in großer fetter Schrift wieder, 
    
    			# und eine Textbeschriftung/Titel von "Titel für Nummernblock"
    
    		{
    
    			# Fields block has some of the strictest requirements for data, It displays all data in key -> value pairs
    
    			"type": "Felder",
    
    			"data": {
    
    				"type": "jq",
    
    				"jq": ".coupa_data | .[] | to_entries | map({ label: .key, value: .value })" 
    
    			}
    
    		},
    
    		{
    
    			# Für diesen Block ziehen wir einfach den Hash aus dem [] und verwenden die darin enthaltenen Werte
    
    			"type": "Text",
    
    			"data": {
    
    				"type": "jq",
    
    				"jq": " .coupa_data | .[0]"
    
    			},
    
    			# Textblöcke bietet Ihnen viel Flexibilität für die Anzeige von Daten aus der API-Antwort im Kontext.
    
    			# Der Text kann wie Markup formatiert werden, so dass Sie Links, Tabellen, Rendering/Größenänderung von Bildern usw. erstellen können.	 
    
    			"text": "{{ data_number }}	ist die DATA_number" 
    
    		},
    
    		{
    
    			# Das Einrichten des Balkendiagramms ist ziemlich schwierig, vielleicht arbeiten Sie mit uns zusammen, wenn Sie diesen Weg gehen möchten.
    
    			# In diesem Beispiel wird jedoch ein Balkendiagramm mit Werten/Etikettengrößen basierend auf den Werten in der API-Antwort erstellt
    
    			"type": "bar",
    
    			"Titel": "Balkendiagramm mit gefälschten Daten",
    
    			"data": {
    
    				"type": "jq",
    
    				"jq": "[{name: \"Gesamtpunktzahl\", Daten: [.coupa_data | .[0].data_number]}, 
    
    								{name: \"Umwelt-Score\", Daten: [.coupa_data | .[0].second_score]}]" 
    
    			},
    
    			"axes": {"xAxis": {"labels": { "enabled": false}}, "yAxis": {"title": { "text": ""}, "max": 100} }
    
    		}
    
    	]
    
    }

    Test in der Instanz des Partners

    Um dies in Coupa zu testen, müssen Sie Version R25.0 oder höher verwenden.  Am Ende wird Ihre App ein Teil des App-Verzeichnisses und keine benutzerdefinierte Panel-App sein. Mit diesen Schritten können Sie sie jedoch selbst testen, bevor Coupa die App offiziell dem App-Verzeichnis hinzufügt.

    1. Wählen Sie Konfiguration
    2. Klicken Sie unter Plattform auf „Installierte Apps“
    3. Klicken Sie auf die Schaltfläche „Erstellen“ und wählen Sie dann „Neue Panel-App erstellen“
    4. Die App erstellen
    5. Namen hinzufügen
    6. Geben Sie im Abschnitt Deskriptor den oben aufgeführten Code ein

    Wenn keine Fehler aufgetreten sind, wird auf jeder Lieferantenseite eine Panel-App angezeigt.

    Laden Sie eine App vom Coupa App-Marktplatz herunter

    Besuchen Sie den Coupa App Marketplace, um ein Panel herunterzuladen und die bereitgestellten Installationsanweisungen zu befolgen. Weitere Informationen zum Anzeigen installierter Apps finden Sie im App Marketplace von Coupa