Unter „Aktionen” kannst du beliebig viele Aktionen anlegen, die dann entweder als Eintrag im Kontext- oder Drei Punkte-Menü erscheinen, automatisch ausgeführt werden oder dem Benutzer auf der Oberfläche angezeigt werden.
Die Logik, die beim Auslösen der Aktion in Elements durchlaufen werden muss, befindet sich ausschließlich im Sage Application Server. Bitte wende dich an deinen ERP-Partner, damit er diese Logik in den Sage Application Server einbinden kann.
HINWEIS
Elements greift unter bestimmten Bedingungen auf bereits implementierte Entwicklungen (DCMs) der Sage 100 zu. Das erleichtert dir die Implementierung und Anpassung, wenn du unabhängig vom genutzten Tool die gleichen Regeln und Prozesse in der Sage 100 anwenden möchtest.
Elements nutzt die nachfolgend aufgelisteten DCMs erst nach der Übergabe der Bestellung / des Angebots aus Elements an die Sage 100. Während der Bearbeitung einer Bestellung oder eines Angebots in Elements werden keine DCMs genutzt.
HINWEIS
Folgende DCMs der Sage 100 werden im Rahmen der Kundenanlage auch von Elements genutzt:
Im Rahmen der Beleganlage (Bestellung, Angebot) werden folgende DCMs genutzt:
Wird ein Beleg in einen anderen Beleg übernommen (Angebot in Bestellung, Bestellung in Stornobeleg, etc.) so werden diese DCMs genutzt:
Aktuell werden grundsätzlich keine Proxy-DCMs und MS Access-CMs unterstützt.
HINWEIS
Folgende Angaben musst du bei allen Aktionen vornehmen:
Sobald du eine Aktion aktivierst, wird diese in Elements sichtbar.
Benenne die Aktion so, dass der Benutzer weiß, welchen Schritt er damit auslöst. Dies ist insbesondere wichtig, wenn er über ein Kontext- oder Drei Punkte-Menü darauf zugreifen kann. Mit Hilfe einer eindeutigen und selbsterklärenden Bezeichnung weiß der Benutzer, welches Ergebnis er durch das Anklicken des Eintrags erwarten kann.
Nenne deine Aktion lieber „Rücklieferschein erstellen” als „Rücklieferschein”.
TIPP
Du kannst eine Aktion genau einem Aktionstyp zuordnen. Der Aktionstyp legt fest, welche Einstiegspunkte für die automatische Ausführung zur Verfügung stehen und ob die Aktion auch im Kontext- oder Drei Punkte-Menü der Entität zur Verfügung steht.
Nach dem Speichern kannst du den Aktionstyp nicht mehr ändern.
HINWEIS
Je nach Aktion kannst du auswählen, in welcher Entität diese aktiviert wird. Möchtest du eine Aktion in verschiedenen Entitäten mit einer anderen Logik versehen, so kannst du diese einfach ein weiteres Mal anlegen und die Aktionen jeweils anderen Entitäten zuordnen.
Lege den Endpunkttyp der Aktion fest. Aktuell kann lediglich eine Aktion auf dem Sage Appserver ausgelöst werden. Eine Erweiterung auf andere Aktionstypen ist angedacht.
Für den Endpunkttyp Sage Appserver sind zwei weitere Felder Pflicht:
Aktion
Gib hier bitte den Namen der Klasse ein, die die Implementierung der Aktion beinhaltet, inklusive kompletten Namespace. (z.B. „Custom.Action.TestAction“)
DLL_Datei
Trage bitte den Namen der dll-Datei ein, die auf dem von Elements genutzten Application Server im Shared-Verzeichnis der Sage100 liegt. (z.B. „Custom.Action.dll“)
Einschränkung der Aktionen auf Benutzer- oder Business-Login-Gruppen
Du kannst bei jeder Aktion festlegen, ob diese allen Benutzer- oder Business-Login-Gruppen zur Verfügung steht oder nicht. Selbstverständlich kannst du das auch auf Gruppen eingrenzen. Wenn du in einer der Karten „Gültig für“ den Eintrag „Alle Benutzergruppen“ oder „Alle Business-Login-Gruppen“ aktivierst, haben alle Benutzer und Business-Logins Zugriff auf die Aktion. Das bedeutet, dass sie alle die Aktion manuell ausführen können oder diese automatisch ausgeführt wird.
Deaktivierst du die Funktion, so wird dir eine Tabelle angezeigt. Dort kannst du dann individuell entscheiden, welche Benutzer- oder Business-Login-Gruppe diese Aktion manuell ausführen darf bzw. diese automatisch ausgeführt wird.
Wenn du eine Aktion anlegst, so wird diese automatisch allen Benutzergruppen freigegeben. Für Business-Login-Gruppen musst du die Freigabe bitte selbst vornehmen. Hier wird standardisiert keine Freigabe erteilt.
Ist ein Benutzer oder ein Business-Login Mitglied in mehreren Gruppen, so musst du allen Gruppen die Berechtigung entziehen, in denen der Benutzer oder ein Business-Login Mitglied ist.
HINWEIS
Die unter der Aktion angegebene Klasse muss eine Methode mit folgender Signatur aufweisen:
public Dictionary<string,object> Execute(Dictionary<string, object> parameter)
Alle Parameter für die Aktion werden im Methoden-Parameter übergeben. Folgende Parameter stehen immer zur Verfügung:
Key | Datentyp | Value |
---|---|---|
Client | Sagede.OfficeLine.Engine.Mandant | das Mandanten-Objekt |
CultureId | string | die ID der beim Elements-Benutzer hinterlegten Lokalisierung / Oberflächensprache |
LocationKey | string | der technische Schlüssel des Standortes, den der Elements-Benutzer aktuell verwendet |
ManuallyTriggeredEntity | Dictionary<string, object> | der EntityIdentifier für die auslösende SubEntität |
TriggeredBy | string | der Trigger, welcher die Aktion ausgelöst hat |
User | Dictionary<string, object> | die Benutzerdaten des angemeldeten Benutzers (crm) oder Business-Logins (reseller) |
Der EntityIdentifier wiederum beinhaltet folgende Elemente:
Key | Datentyp | Value |
---|---|---|
EntityType | string | der Typ der auslösenden Sub-Entität, z. B. Position |
EntityKey | string | der Elements-Key für diesen Datensatz |
Diese Daten werden für den angemeldeten Benutzer oder Business-Login übergeben:
Key | Datentyp | Value | Hinweis |
---|---|---|---|
Name | string | der Name | |
FirstName | string | der Vorname | |
UserAccountType | string | der Kontotyp (crm | reseller) | |
string | die E-Mailadresse | ||
CustomerNumber | string | die Kundennummer des zugehörigen Kunden | nur bei Business-Logins (reseller) |
UserGroups | string[] | ein Array der technischen Schlüssel der zugeordneten Benutzergruppen (bei Benutzern) oder der zugeordneten Business-Login-Gruppen (bei Business-Logins) | |
ErpRepresentative | string | der technische Schlüssel des hinterlegten ERP Vertreters | nur bei Benutzern (crm) |
ErpUser | string | der Name des hinterlegten ERP-Benutzers | nur bei Benutzern (crm) |
In einigen Aktionen stehen auch Positionsdaten zur Verfügung. Das sind immer folgende Daten:
Key | Datentyp | Value |
---|---|---|
EntityKey | string | der Elements-Key für diesen Datensatz |
ItemNumber | string | die Artikelnummer |
VariationId | int | die interne Variantennummer (AuspraegungID) |
Quantity | decimal | die Menge |
QuantityType | short | die Mengenart |
QuantityUnit | string | die Mengeneinheit |
UnitPrice | decimal | der Einzelpreis |
DiscountValue | decimal | der Rabattsatz (in Prozent) |
IsManualPrice | bool | das Kennzeichen, ob der Einzelpreis manuell verändert worden ist (EinzelpreisManuell) |
Wenn in einer Aktion zusätzliche Daten übergeben werden, ist das in der Aktion selbst beschrieben.
HINWEIS
Folgende Parameter stehen nur in ausgewählten Entitäten zur Verfügung:
Key | Datentyp | Value |
---|---|---|
ExternalEntityReference | string | Die Elements-Referenznummer für diese Entität Das Format ist abhängig von der Konfiguration in den Elements-Einstellungen (z.B. DFFC4C71-63E5-4625-83DC-FD937DB3F7C1) Die Elements-Referenz zur Position, bei ans ERP übergebenen Positionen die BelPosId |
Custom | Dictionary<string,object> | Das Custom-Feld einer Entität Als Key dient der Sage-Identifier des Feldes (Klassenname.Datenbankspalte) (z.B. VKBeleg.USER_Zahlungsreferenz) Das Custom-Feld einer Position in einer Entität (z.B. VKBelegPositionen.USER_extern) |
Files | Dictionary<string,object>[] | das Array von Datei-Definitionen mit der Möglichkeit zum Downloaden via URL |
Das können die Inhalte der Files sein:
Key | Datentyp | Value |
---|---|---|
FileName | string | der Dateiname zur Anzeige und zur Ermittlung des Dateityps |
PermanentUrl | string | URL zum Download der Datei, die beim externen Aufruf eine Autorisierung benötigt und permanent gültig ist Wir empfehlen diese, wenn ein Benutzer oder Business-Login im Browser die Datei herunterladen möchte. |
TemporaryUrl | string | URL zum Download der Datei, die keine Autorisierung benötigt und ab Start der Aktion für 15 Minuten gültig ist Wir empfehlen diese zum Abruf einer Datei im Rahmen einer Aktion. |
Dateibeispiel
public Dictionary<string, object> Execute(Dictionary<string, object> parameter)
{
return new Dictionary<string, object>()
{
{
"Files",
new [] {
new Dictionary<string, object>
{
{"FileName", "datei1.jpg" },
{"PermanentUrl", "https://url-to-elements.cloud/PermanentUrl" },
{"TemporaryUrl", "https://url-to-elements.cloud/TemporaryUrl" }
},
new Dictionary<string, object>
{
{"FileName", "datei2.pdf" },
{"PermanentUrl", "https://url-to-elements.cloud/PermanentUrl" },
{"TemporaryUrl", "https://url-to-elements.cloud/TemporaryUrl" }
},
}
}
};
}
Diese Entitäten enthalten die oben genannten Parameter:
In Elements werden folgende Klassennamen für die Übergabe der Custom-Felder genutzt:
Entität | Klassenname | Datenbank-Tabelle |
---|---|---|
Angebot | VKBeleg | KHKVKBelege |
Angebotsposition | VKBelegPosition | KHKVKBelegePositionen |
Artikel | Artikel | KHKArtikel |
Bestellung | VKBeleg | KHKVKBelege |
Bestellposition | VKBelegPosition | KHKVKBelegePositionen |
Kunde | Adresse | KHKAdressen |
Kunde | Kontokorrent | KHKKontokorrent |
Warenkorb | VKBeleg | KHKVKBelege |
Warenkorbpositionen | VKBelegPosition | KHKVKBelegePositionen |
Folgende Ausgabeparameter werden immer interpretiert:
Key | Datentyp | Value |
---|---|---|
Message | string, string[] | die anzuzeigende Meldung bzw. Meldungen für mehrere Zeilen |
MessageType | string | der Typ der Meldung. Dieser wird ignoriert, wenn der Parameter Message nicht angegeben ist. Folgende Werte werden unterstützt: – Information: Meldung wird als Information dargestellt – Warning: Meldung wird als Warnung dargestellt – Error: Meldung wird als Fehler dargestellt Ist kein Wert oder ein ungültiger Wert angegeben, so wird Information verwendet. |
MessageCaption | string | eine Überschrift für die Message |
Html | Dictionary<string,object> | enthält die Daten für das Anzeigen einer HTML-Meldung als Modalen Dialog |
Files | Dictionary<string,object>[] | ein Array von Datei-Definitionen |
Das können die Inhalte der HTML-Meldung sein:
Key | Datentyp | Value |
---|---|---|
Content | string | die HTML Meldung |
Height (optional) | int | die Höhe des Bereichs, in welchem die Meldung angezeigt wird |
Width (optional) | int | die Weite des Bereichs, in welchem die Meldung angezeigt wird |
Das können die Inhalte der Dateien sein:
Key | Datentyp | Value |
---|---|---|
FileName | string | der Dateiname zur Anzeige und zur Ermittlung des Dateityps |
Content | string | der Base64 kodierte Dateiinhalt |
Zudem hast du die Möglichkeit, einen Dialog zu öffnen, das der Benutzer dann bearbeiten kann. Dazu musst du keine eigene HTML-Seite hosten. (s. Individuelle Dialog-Formulare)
Damit deine HTML-Meldung sich der Optik von Elements angleicht, kannst du auf eine öffentlich zur Verfügung stehende CSS zugreifen. Du findest diese unter https://elements.4sellers.cloud/api/asset/{{client-id}}/style.css. Die interne {{client-id}} kannst du von deinem Ansprechpartner bei 4SELLERS erfahren.
HINWEIS
Alle zusätzlichen Einträge im Ergebnis werden ignoriert.
Folgende Ausgabeparameter stehen nur in spezifischen Entität/Aktionen zur Verfügung:
Key | Datentyp | Value | Einschränkungen |
---|---|---|---|
Custom | Dictionary<string,object> | Das Custom-Feld (einer Position) einer Entität Als Key dient der Sage-Identifier des Feldes (Klassenname.Datenbankspalte) (z.B. VKBeleg.USER_Zahlungsreferenz) | Potentiell unterstützt werden alle Entitäten, welche Custom-Felder als Eingabeparameter unterstützen. Aktuell wird nicht jeder Auslöser unterstützt, da reine Lese-Zugriffe keine Daten manipulieren und somit eine Rückgabe nicht gespeichert wird. z.B. Auslöser dynamicColumnInitialization oder manually |
using System.Collections.Generic;
namespace Custom.TestAssembly
{
public class ExampleAction
{
public Dictionary<string,object> Execute(Dictionary<string, object> parameter)
{
var client = parameter.TryGetValue("Client", out var clientObj) ? clientObj as Mandant : null;
var documentId = parameter.TryGetValue("DocumentId", out var documentIdObj) && int.TryParse(documentIdObj?.ToString(), out var documentIdParsed) ? documentIdParsed : (int?)null;
var automatic = parameter.TryGetValue("Automatic", out var automaticObj) && automaticObj != null ? (bool)automaticObj : false;
var cultureId = parameter.TryGetValue("CultureId", out var cultureIdObj) && cultureIdObj != null ? cultureIdObj?.ToString() : "de-DE (Fallback)";
var erpUser = parameter.TryGetValue("ErpUser", out var erpUserObj) ? erpUserObj as string : null;
var locationKey = parameter.TryGetValue("LocationKey", out var locationKeyObj) ? locationKeyObj as string : null;
var result = new Dictionary<string, object>();
result.Add("Message", new string[] {
$"Standort: {locationKey}",
$"Automatisch: {automatic}",
$"Lokalisierung: {cultureId}",
$"ERP-Benutzer: {erpUser}"
});
result.Add("MessageType", "Information");
result.Add("PrintDocumentId", documentId);
return result;
}
}
}
Bei jeder Aktion kannst du in der Karte „Ausführung bei“ Optionen wählen, die als Auslöser für die Aktion zur Verfügung stehen.
Folgende Werte können über den Eingabeparameter „TriggeredBy“ übergeben werden.
Nicht jede Aktion unterstützt jeden Auslöser. Welche Auslöser unterstützt werden, ist bei der jeweiligen Aktion vermerkt.
TriggeredBy Identifizierer | Ausführung bei | Genutzt in Aktion(en) |
---|---|---|
accountChange | Ändern des Kunden | Kunde ändern |
addingPosition | Hinzufügen einer Position | Position-Hinzufügen |
addressChange | Adressänderung | Adressprüfung |
afterCommit | nach Übergabe an das ERP | Einfache Belegaktion |
applicationStart | Start der Anwendung | Benutzer |
beforeCommit | vor Übergabe an das ERP | Beleg speichern Bezahlung Inkassoart-Prüfung Position-Hinzufügen |
customerSave | Speichern eines Kunden | Kunde speichern |
deliveryCountryChange | Änderung des Lieferlandes | Position-Hinzufügen |
documentSave | Speichern eines Belegs | Beleg speichern |
dynamicColumnInitialization | automatisch in dynamischer Spalte (= Schnellansicht) | Artikel-Aktion Beleg-Aktion Kunden-Aktion Warenkorb-Aktion |
fieldChange | Änderung eines Feldwertes | Besteuerungsart Erweiterte Position-Neuberechnung Kunde ändern Position-Hinzufügen Position-Neuberechnung Warenkorb-Aktion |
manually | manuelle Bestätigung über ein Kontextmenü, Drei Punkte-Menü oder einen Button | Artikel-Aktion Beleg-Aktion Einfache Belegaktion Erweiterte Position-Neuberechnung Kunden-Aktion Position-Neuberechnung Warenkorb-Aktion |
priceCalculation | Ermittlung von Preisen | Erweiterte Position-Neuberechnung Position-Neuberechnung |
taxationCalculation | Ermittlung der Besteuerungsart | Besteuerungsart |
transformationAfterConfirm | Weiterverarbeitung, nach Bestätigung | Warenkorb-Aktion |
transformationBeforeConfirm | Weiterverarbeitung, vor Bestätigung | Warenkorb-Aktion |
webhook | Aufruf eines Webhooks | Bezahlung |
Jede Aktion enthält den Eingabeparameter „SourceEvent“. Daraus kannst du entnehmen, welcher Auslöser bzw. welche Feldänderung die Aktion ausgelöst hat.
Der Wert der Eigenschaft setzt sich wie folgt zusammen:
{Auslöser} | Event in Elements |
---|---|
accountGroupChanged | Kundengruppe ändern |
AccountChanged | Kunde auswählen oder ändern |
additionDeleted | Zuschlag löschen |
additionModified | Zuschlagsbetrag ändern |
additionTypeChanged | Zuschlagsart ändern |
countryCodeChanged | Land der (Liefer-)Anschrift ändern |
currencyCodeChanged | Währung ändern |
customerCardStatusChanged | Kundenkartenguthaben aktivieren oder deaktivieren |
discountListChanged | Rabattliste auswählen oder ändern |
discountValueChanged | Rabatt ändern |
dispatchChanged | Versandart ändern |
documentDateChanged | Belegdatum ändern |
documentDisocuntModified | Rabatt bearbeiten & löschen |
grossIndicatorChanged | Bruttopreise aktivieren oder deaktivieren |
itemAlternativeChanged | Kennzeichen „Alternative“ ändern |
lineAdded | Artikel hinzufügen |
lineDeleted | Artikel löschen |
manualPriceReset | Kenzeichen „manuell geändert“ zurücksetzen |
newEntityCreated | Neue Entität anlegen |
paymentConditionChanged | Zahlart ändern |
priceListChanged | Preisliste auswählen oder ändern |
quantityChanged | Menge ändern |
quantityTypeChanged | Mengenart ändern |
resetManualTaxation | Besteuerungsart zurücksetzen |
taxationChanged | Besteuerungsart ändern |
unitPriceChanged | Einzelpreis ändern |
voucherModified | Gutschein hinzufügen / löschen |
zipCodeChanged | PLZ der (Liefer-)Anschrift ändern |
Diese Events gibt es ausschließlich im Warenkorb:
{Auslöser} | Event in Elements |
---|---|
recalculateAll | übernehmen / neu berechnen |
useCurrentConditions | Aktuelle Konditionen verwenden |
Elements bietet mit den Prompts die Möglichkeit für bestimmte, manuell ausgelöste Aktionen weitere Parameter per Dialog von einer Benutzerin oder einem Benutzer für die Ausführung der Aktion zu erfragen.
Diese Parameter werden dann mit in die Aktionsausführung gegeben und können dort verarbeitet werden.
Möchtest du Parameter von einer Benutzerin oder einem Benutzer abfragen, so gib an einer beliebigen Stelle im Code einen Response mit einem Prompt-Ausgabeparameter (siehe unten) zurück. In diesem Prompt wird unter anderem die HTML-Darstellung des anzuzeigenden Dialogs in einem JSON-Objekt mit den gewünschten Parametern definiert.
Elements reagiert auf den Prompt-Ausgabeparameter und zeigt einen Dialog an und sendet zum Abschluss an eine window.postMessage. Die Aktion wird daraufhin erneut aufgerufen, jedoch werden die Daten des Prompts als Eingabeparameter mit übergeben.
Mit den übergebenen Prompt-Daten ist es nun möglich, in der Aktionsausführung die Stelle zu überspringen, die zuvor die Daten per Ausgabeparameter angefordert hat. Dazu dient der Name des Prompt, der hier zur Identifizierung genutzt werden kann. Im weiteren Aktionsverlauf können die Parameter dann genutzt und verarbeitet werden.
So lassen sich auch beliebig viele Dialoge auf Wizard-Art dynamisch hintereinander anzeigen.
Folgende, funktions-spezifische Eingabeparameter werden übergeben:
Key | Datentyp | Value |
---|---|---|
Prompt | Dictionary<string,object> | enthält die Daten eines HTML-Dialogs, der weitere Parameter anhand der Eingabe des Benutzers abgeholt hat |
PreviousPrompts | Dictionary<string, object>[] | Enthält die Daten von vorherigen HTML-Dialogen dieser Aktion |
Diese Inhalte sind jeweils im Dictionary enthalten:
Key | Datentyp | Value |
---|---|---|
Name | string | der Name des Prompts |
Data | Dictionary<string, object> | die Daten des HTML-Dialogs |
Nachfolgende, funktions-spezifische Ausgabeparameter werden in Elements verarbeitet:
Key | Datentyp | Value |
---|---|---|
Prompt | Dictionary<string,object> | enthält die Daten für einen HTML-Dialog, der angezeigt werden soll, um weitere Parameter abzufragen |
Diese Inhalte werden im Dictionary erwartet:
Key | Datentyp | Value |
---|---|---|
Html | string | der HTML-Code, der im iFrame angezeigt wird |
Name | string | der Name des Prompts |
BEISPIELusing System.Collections.Generic; namespace Custom.TestAssembly { public class ExampleAction { public Dictionary<string,object> Execute(Dictionary<string, object> parameter) { var client = parameter.TryGetValue("Client", out var clientObj) ? clientObj as Mandant : null; var documentId = parameter.TryGetValue("DocumentId", out var documentIdObj) && int.TryParse(documentIdObj?.ToString(), out var documentIdParsed) ? documentIdParsed : (int?)null; var cultureId = parameter.TryGetValue("CultureId", out var cultureIdObj) && cultureIdObj != null ? cultureIdObj?.ToString() : "de-DE (Fallback)"; var erpUser = parameter.TryGetValue("ErpUser", out var erpUserObj) ? erpUserObj as string : null; var locationKey = parameter.TryGetValue("LocationKey", out var locationKeyObj) ? locationKeyObj as string : null; var result = new Dictionary<string, object>(); result.Add("Message", new string[] { $"Standort: {locationKey}", $"Lokalisierung: {cultureId}", $"ERP-Benutzer: {erpUser}" }); result.Add("MessageType", "Information"); result.Add("PrintDocumentId", documentId); return result; } } }
BEISPIEL für Prompt-Aktionen mit einem Promptusing System.Collections.Generic; using System.Linq; namespace Custom.TestAssembly.HtmlPromptAction { internal class Example { private const string PreviousPrompts = "PreviousPrompts"; public Dictionary<string, object> Execute(Dictionary<string, object> parameter) { if (!parameter.ContainsKey(PreviousPrompts) || (parameter[PreviousPrompts] is List<Dictionary<string, object>> previousPrompts && (previousPrompts == null || !previousPrompts.Any(prompt => prompt["Name"].ToString() == "HtmlPromptAction")))) { return new Dictionary<string, object> { { "Prompt", new Dictionary<string, object>() { {"Name", "HtmlPromptAction"}, {"Html", @"<!DOCTYPE html> <html> <head> <link rel='stylesheet' href='https://edev.4sellers.de/api/asset/64331/style.css' /> </head> <body> <script> function onClickHandler() { var firstName = document.getElementById('fname').value; var lastName = document.getElementById('lname').value; window.parent.postMessage({message: 'entityActionPromptData', value: { fname: firstName, lname: lastName } }, '*'); } </script> <h2>HTML Forms</h2> <form> <div class='form-group'> <label for='fname'>First name:</label><br> <input class='form-control' type='text' id='fname' name='fname' value='John'><br> </div> <div class='form-group'> <label for='lname'>Last name:</label><br> <input class='form-control' type='text' id='lname' name='lname' value='Doe'><br><br> </div> <input class='btn-primary' type='submit' value='Submit' onclick='onClickHandler()'> </form> </body> </html>" } } } }; } var promptData = (Dictionary<string, object>) parameter["Prompt"]; var message = new List<string>(); if(promptData != null) { message.Add("Hello World"); message.Add($"Name: {promptData["Name"]}"); var data = (Dictionary<string, object>) promptData["Data"]; if(data != null) { foreach(var kvp in data) { message.Add($"{kvp.Key}: {kvp.Value}"); } } } return new Dictionary<string, object> { { "Message", message.ToArray() }, { "MessageType", "Information" }, }; } } }
BEISPIEL für Prompt-Aktionen mit mehr als einem Promptusing Custom.TestAssembly.Extensions; using System.Collections.Generic; using System.Linq; namespace Custom.TestAssembly.HtmlPromptAction { internal class Example { private const string PreviousPrompts = "PreviousPrompts"; public Dictionary<string, object> Execute(Dictionary<string, object> parameter) { if (!parameter.ContainsKey(PreviousPrompts) || (parameter[PreviousPrompts] is List<Dictionary<string, object>> previousPrompts && (previousPrompts == null || !previousPrompts.Any(prompt => prompt["Name"].ToString() == "HtmlPromptAction")))) { return new Dictionary<string, object> { { "Prompt", new Dictionary<string, object>() { {"Name", "HtmlPromptAction"}, {"Html", @"<!DOCTYPE html> <html> <head> <link rel='stylesheet' href='https://edev.4sellers.de/api/asset/64331/style.css' /> </head> <body> <script> function onClickHandler() { var firstName = document.getElementById('fname').value; var lastName = document.getElementById('lname').value; window.parent.postMessage({message: 'entityActionPromptData', value: { fname: firstName, lname: lastName } }, '*'); } </script> <h2>HTML Forms</h2> <form> <div class='form-group'> <label for='fname'>First name:</label><br> <input class='form-control' type='text' id='fname' name='fname' value='John'><br> </div> <div class='form-group'> <label for='lname'>Last name:</label><br> <input class='form-control' type='text' id='lname' name='lname' value='Doe'><br><br> </div> <input class='btn-primary' type='submit' value='Submit' onclick='onClickHandler()'> </form> </body> </html>" } } } }; } if (!parameter.ContainsKey(PreviousPrompts) || (parameter[PreviousPrompts] is Dictionary<string, object>[] previousPrompts1 && (previousPrompts1 == null || !previousPrompts1.Any(prompt => prompt["Name"].ToString() == "HtmlPromptAction-Mail")))) { return new Dictionary<string, object> { { "Prompt", new Dictionary<string, object>() { {"Name", "HtmlPromptAction-Mail"}, {"Html", @"<!DOCTYPE html> <html> <head> <link rel='stylesheet' href='https://edev.4sellers.de/api/asset/64331/style.css' /> </head> <body> <script> function onClickHandler() { var birthdate = document.getElementById('birthdate').value; var mail = document.getElementById('mail').value; window.parent.postMessage({message: 'entityActionPromptData', value: { 'birthdate': birthdate, 'mail': mail } }, '*'); } </script> <h2>HTML Forms</h2> <form> <div class='form-group'> <label for='birthdate'>Birthdate</label><br> <input type='date' id='birthdate' name='birthdate' value='01011994'><br> </div> <div class='form-group'> <label for='mail'>Mail</label><br> <input type='text' id='mail' name='mail' value='random@mail.address'><br><br> </div> <input class='btn btn-primary' type='submit' value='Submit' onclick='onClickHandler()'> </form> </body> </html>" } } } }; } var prompts = (Dictionary<string, object>[]) parameter["PreviousPrompts"]; var message = new List<string>(); if (prompts != null) { message.Add("Hello World"); foreach (var prompt in prompts) { message.Add($"Name: {prompt["Name"]}"); var data = (Dictionary<string, object>)prompt["Data"]; if (data != null) { foreach (var kvp in data) { message.Add($"{kvp.Key}: {kvp.Value}"); } } } } return new Dictionary<string, object> { { "Message", message.ToArray() }, { "MessageType", "Information" }, }.ProcessDevTags(parameter); } } }
Diese Aktion ermöglicht es, bei jeder Änderung einer Adresse eine externe Adressvalidierung durchzuführen und dem Benutzer ggf. eine Korrektur vorzuschlagen. Das ist bei der Adresse im Kundenstamm sowie bei der Adresse oder der abweichenden Lieferadresse in Angeboten oder in Bestellungen möglich.
Folgende Angaben musst du – abweichend von den allgemeinen Angaben – vornehmen:
Wähle bitte den Aktionstyp „Adressprüfung“ aus.
In der Karte „Ausführung bei“ kannst du festlegen, wann die Adressprüfung ausgelöst wird. Hierbei steht dir nur die Option „Adressänderung“ zur Verfügung.
Wenn du „Adressänderung“ (TriggeredBy = „addressChange“) aktivierst, wird die Aktion immer ausgeführt, wenn der Benutzer
Die Aktion wird zudem für Adressen in Deutschland nicht angestoßen, wenn die Leitcodierung für Deutschland in Elements aktiviert ist.
Die Aktion kann in diesen Entitäten ausgelöst werden:
Neben den allgemeinen werden zusätzlich diese Daten übergeben.
Key | Datentyp | Value |
---|---|---|
StreetAndHouseNumber | string | Straße und Hausnummer |
ZipCode | string | Postleitzahl |
City | string | Stadt/Ort |
CountryCode | string | Ländercode, z.B. DE |
Es werden keine Positionsdaten übergeben.
Die Aktion erwartet entweder keine Rückmeldung (bei korrekter Adresse), eine Meldung mit Hinweis, Warnung oder Fehler (durch Fehler bei Adressvalidierung) oder die korrigierte Adresse.
Die Rückgabe von Dateien wird nicht unterstützt.
HINWEIS
Sobald die Prüfung innerhalb der Aktion eine korrigierte Adresse ermittelt, wird diese dem Benutzer in einer Lightbox mit der geprüften Adresse angezeigt. Der Benutzer kann dann entscheiden, ob er die korrigierte Adresse übernehmen oder ignorieren möchte.
Das sollten die übermittelten Werte sein:
Key | Datentyp | Value |
---|---|---|
StreetAndHouseNumber | string | Straße und Hausnummer |
ZipCode | string | Postleitzahl |
City | string | Stadt/Ort |
CountryCode | string | Ländercode, z.B. DE |
Unvollständig zurückgegebene Adressen werden für die Anzeige um die Eingabeparameter ergänzt, so dass sichergestellt ist, dass vollständige Adressen verglichen werden.
Tritt ein Fehler auf, weil beispielsweise die API nicht erreichbar ist, dann sollten keine Adressdaten zurückgegeben werden. Message und MessageType werden dann analog zu den anderen Aktionen verarbeitet bzw. dargestellt.
HINWEIS
Diese Aktion kannst du in Abhängigkeit eines Artikels bzw. einer Position einsetzen. Sie lässt sich entweder über das Kontextmenü des Artikels/der Position aufrufen oder wird automatisch in den Details der Warenkorbposition oder in der Artikelübersicht eines Artikels angezeigt, der in der Artikelliste aktiviert ist.
Immer, wenn der Benutzer einen Artikel ansieht – sei es in der Artikelliste oder im Warenkorb – soll ein Preisvergleich eingeblendet werden. Dabei werden aktuelle Marktdaten über eine von der Aktion angefragten Schnittstelle im HTML-Format eingeblendet.
BEISPIEL
Immer, wenn der Benutzer einen Artikel ansieht – sei es in der Artikelliste oder im Warenkorb – sollen ihm alternative Artikel angezeigt werden, die er stattdessen anbieten kann. Dazu kannst du gemäß deiner eigenen Logik Artikel ermitteln, die du innerhalb der Aktion als Liste übergibst. Der Benutzer sieht dann die „alternativen“ Artikel und kann diese direkt in den Warenkorb übernehmen.
BEISPIEL
Wenn der Benutzer einen Artikel in einer Bestellung oder einem Angebot hinzufügt, möchte er wissen, ob und welchen preislichen Spielraum er noch hat. Diese Informationen stellst Du ihm anhand einer von dir hinterlegten Logik zur Verfügung. Er muss nur das Kontextmenü des Artikels auswählen und ihm werden die Informationen in einer Box im HTML-Format angezeigt.
BEISPIEL
Wähle bitte den Aktionstyp „Artikel-Aktion“ aus.
In der Karte „Ausführung bei“ kannst du festlegen, wann die Artikel-Aktion ausgelöst wird.
Wenn du „Manuelle Ausführung“ (TriggeredBy = „manually“) aktivierst, kann die Aktion vom Benutzer über das Kontextmenü angestoßen werden.
Aktivierst du „Automatisch in dynamischer Spalte“ (TriggeredBy = „dynamicColumnInitialization“) aktivierst, so wird die Aktion immer ausgeführt, wenn die Artikelübersicht in einer Artikelliste oder die Artikeldetails im Warenkorb angezeigt werden.
Beide Auslöser können in folgenden Entitäten angewendet werden:
In diesen Entitäten kann nur der Auslöser „Manuelle Ausführung“ angewendet werden, da die Infoleiste nicht zur Verfügung steht:
Neben den allgemeinen werden zusätzlich diese Paramater übergeben:
Key | Datentyp | Value |
---|---|---|
PriceListId | int | die ID der Preisliste, die aktuell zugewiesen ist |
DiscountListId | int | die ID der Rabattliste, die aktuell zugewiesen ist |
CurrencyCode | string | die Währung, die aktuell zugewiesen ist |
CurrencyCodeExchangeRate | decimal | der aktuell verwendete Umrechnungsfaktor |
HasGrossPrices | bool | das Preiskennzeichen (brutto/netto) |
AccountId | string | die Kundennummer (KHKKontokorrent.Kto) |
DocumentDate | datetime | das Belegdatum |
Position | Dictionary<string,object> | Position / Artikel |
Es werden die allgemeinen Positionsdaten übergeben.
Es werden die allgemeinen Rückmeldungen erwartet.
Zudem kannst du dem Benutzer bei der automatischen Ausführung in der dynamischen Spalte auch eine Liste an Artikeln anzeigen. Diese wird im Stil der anderen, mit dem Artikel in Beziehung stehenden Artikel angezeigt.
Und das sind die Inhalte, die du dafür mitgeben musst:
Key | Datentyp | Value |
---|---|---|
PositionGroups | Dictionary<string,object>[] | eine Liste von Positionsgruppen |
Das sind die Ausgabeparameter pro Positionsgruppe:
Key | Datentyp | Value |
---|---|---|
Caption | string | eine Überschrift für die Liste der Positionen |
Positions | Dictionary<string,object>[] | Positionen |
Das sind die Ausgabeparameter pro Position:
Key | Datentyp | Value |
---|---|---|
ItemNumber | string | die Artikelnummer |
VariationId | int | die interne Variantennummer (AuspraegungID) |
Message | string | eine Meldung pro Position |
SortOrder | int | Sortierung der Position |
Bei der Darstellung wird je nach Kontext unterschieden wie mit den Rückgabewerten umgegangen wird:
(a) Bei manueller Ausführung werden die zurückgegebenen Positionen verworfen und ausschließlich Messages angezeigt.
(b) Bei Einbettung in der dynamischen Spalte werden HTML Messages in einem iFrame dargestellt und nicht als Dialog.
HINWEIS
Es kann sein, dass es im Rahmen einer Bestellung zu Besonderheiten kommt, über die der Benutzer möglichst prominent informiert werden sollte, wenn er die Bestellung aufruft. Oder es gibt Informationen zum Kunden, die ein Benutzer unbedingt erhalten muss, sobald er eine Bestellung oder einen Kunden aufruft. Dafür kannst du die Beleg-Aktion in Elements nutzen.
Ein Kunde ruft an und ist ungehalten, da er noch auf Ware aus einer Bestellung wartet. Der Benutzer sucht nach der Bestellung und sieht sofort in der Schnellansicht der Bestellung, dass der Hauptlieferant aktuell Lieferschwierigkeiten hat. Diese Information wurde zentral für alle betreffenden Artikel zur Verfügung gestellt und wird dem Benutzer nun angezeigt.
BEISPIEL
Wähle bitte den Aktionstyp „Beleg-Aktion“ aus.
In der Karte „Ausführung bei“ kannst du festlegen, wann die Aktion ausgelöst wird.
Wenn du „Automatisch in dynamischer Spalte“ (TriggeredBy = „dynamicColumnInitialization“) aktivierst, wird die Aktion immer ausgeführt, wenn der Benutzer eine Bestellung oder ein Angebot aufruft und sich dessen Schnellansicht ansieht.
Zudem kannst du es den Benutzern ermöglichen, die Aktion selbst auszulösen, indem du „Manuelle Ausführung“ (TriggeredBy = „manually“) aktivierst. Dann kann der Benutzer die Aktion im Kontext- oder Dreipunktemenü auswählen.
Die Aktion kann in diesen Entitäten ausgelöst werden:
Neben den allgemeinen werden zusätzlich diese Daten übergeben:
Key | Datentyp | Value |
---|---|---|
DocumentId | string | die interne ID des Belegs |
Files | Dictionary<string, object>[] | das Array von Datei-Definitionen (s. Entity-Spezifische Eingabeparameter) |
Es werden die allgemeinen Rückmeldungen erwartet.
Bei der Darstellung wird je nach Kontext unterschieden wie mit den Rückgabewerten umgegangen wird:
(a) Bei manueller Ausführung werden die zurückgegebenen Positionen verworfen und ausschließlich Messages angezeigt.
(b) Bei Einbettung in der dynamischen Spalte werden HTML Messages in einem iFrame dargestellt und nicht als Dialog.
HINWEIS
Mit Hilfe dieser Aktion kann in den Speicherprozess eines Angebots oder einer Bestellung – egal ob bei Neuanlage oder Bearbeitung eines bestehenden Belegs – eingegriffen werden.
Unter bestimmten Bedingungen möchtest du, dass beim Speichern einer neuen Bestellung in Elements anstelle einer „Auftragsbestätigung“ eine „Bestellanfrage“ angelegt wird. Diesen Beleg hast du individuell in deinem ERP-System angelegt, um Bestellungen der Kundengruppe „B2B-Kunden“ separat freizugeben. Du kannst nun vor dem Speichern der Bestellung anhand der Kundengruppe diesen speziellen Belegtyp an Elements übergeben. Somit wird eine „Bestellanfrage“ im ERP-System angelegt.
BEISPIEL
Du möchtest sicherstellen, dass die angelegten Bestellungen immer Angaben enthalten, die in deinem ERP-System aber nicht als Pflichtfelder definiert werden können. Sobald der Benutzer nun eine Bestellung an das ERP-System übergibt, prüfst du die entsprechenden Felder auf den Inhalt. Ist dieser nicht oder falsch angegeben korrigierst du ihn entweder automatisiert oder weist den Benutzer mit Hilfe einer Meldung darauf hin, dass dieses Feld einen Inhalt benötigt.
BEISPIEL
Mit Hilfe dieser Aktion kannst du nun also anhand der Belegdaten beim Speichern eines Belegs eine Reaktion basierend auf individuellen Regelwerken anstoßen.
Wähle bitte den Aktionstyp „Beleg speichern“ aus.
In der Karte „Ausführung bei“ kannst du festlegen, wann die Aktion ausgelöst wird.
Wenn du „vor Übergabe an das ERP“ (TriggeredBy = „documentSave“) aktivierst, wird die Aktion immer ausgeführt, wenn der Benutzer eine in der Aktion hinterlegte Entität an das ERP-System übergeben möchte.
Die Aktion kann in diesen Entitäten ausgelöst werden:
Die Aktion wird auch ausgeführt, wenn eine bereits im ERP-System angelegte Bestellung (oder Angebot) nochmals verbindlich bestätigt wird.
HINWEIS
Neben den allgemeinen werden zusätzlich diese Daten übergeben:
Key | Datentyp | Value |
---|---|---|
SageBeleg | Sagede.OfficeLine.Wawi.BelegEngine.Beleg | das Sage-Objekt, welches gespeichert werden soll |
Custom | Dictionary<string, object> | die Custom-Felder, die für den Beleg definiert sind |
Files | Dictionary<string, object>[] | das Array von Datei-Definitionen (s. Entity-Spezifische Eingabeparameter) |
Es werden die allgemeinen Rückmeldungen erwartet.
Key | Datentyp | Value |
---|---|---|
SageBeleg | Sagede.OfficeLine.Wawi.BelegEngine.Beleg | das Sage-Objekt, welches gespeichert werden soll |
CancelSave | bool | das Kennzeichen. ob das Speichern abgebrochen werden soll |
Custom | Dictionary<string, object> | die Custom-Felder, die für den Beleg definiert sind (s. Entity-Spezifische Ausgabeparameter) |
Der Aufbau der Custom-Felder entspricht folgendem Schema:
{
"order/offer": {
"Tabellename.Spaltenname": "Wert"
}
"orderLine/offerLine": {
"orderLineId1/offerLineId1": {
"Tabellenname.Spaltenname": "Wert"
}
}
}
Meldet sich ein Benutzer oder ein Kunde in Elements an, kann es hilfreich sein, ihm individuelle Informationen anzuzeigen.
Ein Kunde meldet sich im B2B-Portal an. Im ERP-System ist definiert, dass dieser Kunde aktuell eine Liefersperre hat. Das wird dem Kunden anhand einer Meldung unmittelbar nach seiner Anmeldung angezeigt.
BEISPIEL
Wähle bitte den Aktionstyp „Benutzer“ aus.
In der Karte „Ausführung bei“ kannst du festlegen, wann die Aktion ausgelöst wird.
Wenn du „Anmeldung“ (TriggeredBy = „applicationStart“) aktivierst, wird die Aktion immer ausgeführt, wenn sich ein Benutzer in Elements anmeldet. Sie wird auch ausgelöst, wenn der Benutzer Elements in einem Browser-Tab neu startet oder aktualisiert.
In dieser Aktion kannst du keine Entität auswählen. Ist diese Aktion aktiviert, wird sie bei jeder Anmeldung ausgeführt und die Rückgabe entscheidet darüber, ob der Benutzer oder Kunde eine Meldung erhält oder nicht.
HINWEIS
Es werden die für den angemeldeten Benutzer oder Business-Login vorhanden Daten übergeben (s. Allgemeine Eingabeparameter).
Es werden die allgemeinen Rückmeldungen erwartet.
Die Rückgabe von Dateien wird nicht unterstützt.
HINWEIS
In Elements wird die Besteuerung in Angebote, Bestellungen und Warenkörben automatisiert ermittelt. Alternativ kann der Benutzer – außer im Warenkorb – die Besteuerungsart manuell festlegen. Es kann aber auch notwendig sein, die Besteuerungsart aufgrund individueller Vorgaben festzulegen.
Für Lieferungen nach Großbritannien hat die Buchhaltung eine eigene Besteuerungsart angelegt, die im Rechnungswesen genutzt wird. Wird eine Bestellung nach Großbritannien geliefert, so muss zwingend diese Besteuerungsart hinterlegt werden. Egal, was der Anwender macht, die Besteuerungsart wird immer überschrieben.
BEISPIEL
Wähle bitte den Aktionstyp „Besteuerungsart“ aus.
In der Karte „Ausführung bei“ kannst du festlegen, wann die Aktion ausgelöst wird.
Wenn du „Ermittlung der Besteuerungsart“ (TriggeredBy = „taxationCalculation“) aktivierst, wird die Aktion immer ausgeführt, wenn in einem Angebot, einer Bestellung oder einem Warenkorb eine dieser Kriterien zutrifft:
Zudem kannst du den Auslöser „Änderung Feldinhalt“ (TriggeredBy = „fieldChange“) aktivieren. Die Aktion wird dann ausgeführt, wenn Änderungen an den in der aufgeführten Tabelle hinterlegten Feldern festgestellt werden.
Die Aktion kann in diesen Entitäten ausgelöst werden:
Neben den allgemeinen werden zusätzlich diese Daten übergeben:
Key | Datentyp | Value |
---|---|---|
HasGrossPrices | bool | das Preiskennzeichen (brutto/netto) |
AccountId | string | die Kundennummer (KHKKontokorrent.Kto) |
InvoiceAddressName1 | string | der Name1 der Rechnungsadresse |
InvoiceAddressName2 | string | der Name2 der Rechnungsadresse |
InvoiceAddressAddition | string | der Adresszusatz der Rechnungsadresse |
InvoiceAddressStreetAndHouseNumber | string | die Straße und Hausnummer der Rechnungsadresse |
InvoiceAddressZipCode | string | die Postleitzahl der Rechnungsadresse |
InvoiceAddressDeliveryAddressCity | string | die Stadt/Ort der Rechnungsadresse |
InvoiceAddressCountryCode | string | der Ländercode der Rechnungsadresse, z.B. DE |
IsManualTaxation | bool | das Kennzeichen für manuelle Besteuerung (ja/nein) |
DeliveryAddressName1 | string | der Name1 der Lieferadresse |
DeliveryAddressName2 | string | der Name2 der Lieferadresse |
DeliveryAddressAddition | string | der Adresszusatz der Lieferadresse |
DeliveryAddressStreetAndHouseNumber | string | die Straße und Hausnummer der Lieferadresse |
DeliveryAddressZipCode | string | die Postleitzahl der Lieferadresse |
DeliveryAddressDeliveryAddressCity | string | die Stadt/Ort der Lieferadresse |
DeliveryAddressCountryCode | string | der Ländercode der Lieferadresse, z.B. DE |
DocumentDate | datetime | das Belegdatum |
TaxClassId | short | die Besteuerungsart |
IsManualTaxation | bool | das Kennzeichen für manuelle Besteuerung (ja/nein) |
Es werden die allgemeinen Rückmeldungen erwartet.
Key | Datentyp | Value |
---|---|---|
TaxClassId | short | die Besteuerungsart, die auf den Beleg übernommen wird (fehlt der Eintrag bzw. wird NULL übergeben, so wird die Besteuerungsart beibehalten) |
Wird der Wert NULL übergeben oder ist der Ausgabeparameter nicht enthalten, so bleibt die Besteuerungsart unverändert.
HINWEIS
Wird die Besteuerungsart überschrieben, so wird diese nicht als „manuell gesetzt“ markiert. So kann bei jedem Auslöseprozess entweder die selbst ermittelte Besteuerungsart gesetzt oder auf die von Elements ermittelte Besteuerungsart zurückgegriffen werden.
HINWEIS
Diese Aktion ermöglicht es, basierend auf der ausgewählten Zahlungsart in einem Angebot oder einer Bestellung eine externe Zahlungsabwicklung anzufragen und das Ergebnis der Anfrage zu verarbeiten. Während der Verarbeitung kann der Benutzer nicht in Elements arbeiten. Vielmehr muss er auf das Ergebnis der Aktion warten.
Der Benutzer wählt die Elements-Zahlungsart „Kreditkarte“ aus. Bei der Übergabe an das ERP-System wird in einem neuen Browser-Tab die Kreditkartenabwicklung aufgerufen. Diese muss der Benutzer durchlaufen. Sobald er dies erfolgreich gemacht hat, wird die Bestellung im ERP-System angelegt und die Transaktionsnummer wird in einem Feld in der Bestellung hinterlegt.
BEISPIEL
Wähle bitte den Aktionstyp „Bezahlung“ aus.
In der Karte „Ausführung bei“ kannst du festlegen, wann die Aktion ausgelöst wird.
Wenn du „vor Übergabe an das ERP“ aktivierst, wird die Aktion immer ausgeführt, wenn der Benutzer eine in der Aktion hinterlegte Entität an das ERP-System übergeben möchte (TriggeredBy = „beforeCommit“). Dann wird auch das Kennzeichen für die automatische Ausführung übergeben.
Die Aktion kann in diesen Entitäten ausgelöst werden:
Die Aktion wird nur ausgeführt, wenn eine Bestellung oder ein Angebot neu in Elements angelegt wird. Zudem wird sie ausschließlich für konfigurierte Elements-Zahlarten (s. Administration / Zuordnungen / Bezahlung) ausgeführt.
HINWEIS
Die Aktion wird in zwei Schritten durchlaufen. Dabei werden jeweils Daten übergeben und Rückmeldungen verarbeitet.
In einem ersten Schritt wird der Bezahlvorgang eingeleitet.
Neben den allgemeinen werden zusätzlich diese Daten übergeben:
Key | Datentyp | Value |
---|---|---|
WebhookUrl | string | für diesen Prozess frisch generierte Rücksprung-URL für Zahlungsanbieter |
ExternalEntityReference | string | die Elements Referenznummer des Belegs |
PaymentProcessStatus | string | der Status des Prozesses (new | inProcess | finished | canceled | failed) |
CurrencyCode | string | die Währung |
GrossAmount | decimal | der Gesamtbetrag der Entität |
Es werden keine Positionsdaten übergeben.
Neben einem Sperrkennzeichen zum Abbruch des Prozesses, wird ein Token für den Folgeaufruf sowie eine URL zum Aufruf der Seite des Zahlungsanbieters für die Abwicklung der Bezahlung erwartet.
Key | Datentyp | Value |
---|---|---|
PreventsCommit | bool | das Kennzeichen, ob die Übergabe an das ERP abgebrochen werden soll |
PaymentProcessToken | string | der Token für Folgeaufruf (falls vorhanden) |
PaymentProcessProviderUrl | string | die URL zum Aufruf der Seite des Zahlungsanbieters für die Abwicklung der Bezahlung |
Im zweiten Schritt wird der Bezahlvorgang abgeschlossen. Der Schritt wird durch einen Webhook-Aufruf ausgelöst.
Neben den allgemeinen werden zusätzlich diese Daten übergeben:
Key | Datentyp | Value |
---|---|---|
PaymentProcessToken | string | der Token aus Initialaufruf (falls vorhanden) |
PaymentProcessStatus | string | der Status des Prozesses (new | inProcess | finished | canceled | failed) |
PaymentProcessWebhookResult_HttpHeader | Dictionary<string,string> | HttpHeader des Webhook-Aufrufs |
PaymentProcessWebhookResult_HttpQuery | Dictionary<string,string> | HttpQuery-Parameter des Webhook-Aufrufs |
HttpBody | string | der serialisierte Body des Webhook-Aufrufs |
Es werden die allgemeinen Rückmeldungen erwartet.
Die Rückgabe von Dateien wird nicht unterstützt.
HINWEIS
Key | Datentyp | Value |
---|---|---|
PreventsCommit | bool | das Kennzeichen, ob die Übergabe an das ERP abgebrochen werden soll |
ExternalPaymentReference | string | die Externe Zahlungsreferenz / TransactionID des Zahlungsanbieters (falls vorhanden) |
Der Benutzer hat die Zahlungsart „Rechnung“ ausgewählt. Es muss keine externe Abwicklung durchlaufen werden.
BEISPIEL
Neben den allgemeinen Rückmeldungen kannst du die externe Zahlungsreferenz übergeben. Diese kann dann weiterverarbeitet werden, damit zum Beispiel die Buchhaltung neben der Elements Referenznummer die Referenznummer des Zahlungsanbieters einsehen kann.
Alternativ kannst du auch ein Sperrkennzeichen mitgeben. Sobald die Aktion feststellt, dass die Bestellung oder das Angebot nicht weiterverarbeitet werden kann, kann ein Sperrkennzeichen mitgeschickt werden. Dann ist es dem Benutzer nicht mehr möglich, die Bestellung oder das Angebot im ERP-System zu speichern.
Der Benutzer hat die Zahlungsart „Kreditkarte“ ausgewählt und die Abwicklung durchlaufen. Dabei ist es zu einem Problem gekommen. Die Bestellung kann somit auch nicht an das ERP-System übergeben werden. Es wird eine Fehlermeldung eingeblendet.
BEISPIEL
Schicke bei einer Sperrung bitte auch immer eine Fehlermeldung mit, damit der Benutzer auch reagieren und die Bestellung oder das Angebot anpassen kann.
TIPP
Mit dieser Aktion bist du in der Lage Ihre Angebote, Bestellungen oder andere darin enthaltene Belege in andere Belege zu transformieren oder basierend auf einem Angebot oder einer Bestellung dem Benutzer weiterführende Informationen anzuzeigen.
Du möchtest, dass unter bestimmten Bedingungen eine Sofortrechnung – also die Kombination aus Lieferschein und Rechnung – aus Elements heraus erstellt werden kann, da ihr ein Ladengeschäft habt. Der Benutzer wählt im Kontextmenü der Bestellung einfach den Eintrag „Mitnahmedokumente erstellen” und es wird eine Sofortrechnung erzeugt und in Elements als Druckvorschau angezeigt.
BEISPIEL
Wähle bitte den Aktionstyp „Einfache Belegaktion“ aus.
In der Karte „Ausführung bei“ kannst du festlegen, wann die Aktion ausgelöst wird.
Wenn du „nach Übergabe an das ERP“ (TriggeredBy = „afterCommit“) aktivierst, wird die Aktion immer ausgeführt, wenn der Benutzer eine in der Aktion hinterlegte Entität an das ERP-System übergeben möchte. Dann wird auch das Kennzeichen für die automatische Ausführung übergeben.
Bei gewissen Konstellationen soll geprüft werden, ob ein Lieferdokument erzeugt werden kann. Das ist aber von verschiedenen Faktoren abhängig und diese Faktoren wiederum wirken sich darauf aus, ob und welcher Beleg erzeugt werden muss. Der Benutzer soll diese Prüfung aber nicht jedes Mal manuell über das Kontext- oder Drei Punkte-Menü anstoßen, sondern von dieser Prüfung nur das Ergebnis erhalten. Die Aktion wird also jedes Mal, wenn eine Bestellung an das ERP-System übergeben wird, durchlaufen. Der Benutzer bekommt davon entweder gar nichts mit, da kein Faktor für die Erstellung eines Lieferdokuments spricht. Alternativ wird dem Benutzer eine Fehlermeldung angezeigt, wenn zur Erstellung des Lieferdokuments mindestens ein Faktor nicht erfüllt ist. Im Idealfall wird dem Benutzer in der Druckvorschau das erstellte Lieferdokument angezeigt.
BEISPIEL
Diese Aktion kann wirklich nur ausgelöst werden, wenn der Benutzer den Beleg an das ERP-System übergibt, indem er auf die entsprechende Schaltfläche klickt. Solltest du die automatische Beleganlage über den Warenkorb aktiviert haben, so wird die Aktion nicht ausgelöst.
HINWEIS
Wenn du möchtest, dass der Benutzer diese Aktion manuell mittels des Kontext- oder Drei Punkte-Menüs in der Entität ausführen kann, aktiviere die „Manuelle Ausführung“ (TriggeredBy = „manually“).
Die Aktion kann in diesen Entitäten ausgelöst werden:
Zusätzlich zu den allgemeinen Daten wird die interne Belegnummer übergeben.
Key | Datentyp | Value |
---|---|---|
DocumentId | int | die interne ID des Belegs |
Es werden keine Positionsdaten übergeben.
Es werden die allgemeinen Rückmeldungen erwartet.
Key | Datentyp | Value |
---|---|---|
PrintDocumentId | int | die ID des Beleges, der in Elements ausgedruckt werden soll; es öffnet sich die in Elements bekannte PDF-Vorschau |
Du lässt bei jeder Übergabe einer Bestellung an das ERP-System prüfen, ob eine Sofortrechnung erstellt werden soll. Das ist bei einer Versandart, die eine Lieferung mit sich bringt, aber gar nicht notwendig. Dann wird die Funktion durchlaufen, gibt aber kein Ergebnis an Elements zurück.
BEISPIEL
Du lässt bei jeder Übergabe einer Bestellung an das ERP-System prüfen, ob eine Sofortrechnung erstellt werden soll. Die Ware soll zwar mitgenommen werden, allerdings soll diese bar bezahlt werden und es gibt aber noch keinen Zahlungseingang auf die Bestellung. Dann wird der Benutzer darüber informiert, dass noch kein Zahlungseingang vorhanden ist und daher die Sofortrechnung nicht erstellt werden kann.
BEISPIEL
Du lässt bei jeder Übergabe einer Bestellung an das ERP-System prüfen, ob eine Sofortrechnung erstellt werden soll. Die Ware soll mitgenommen und bar bezahlt werden. Bei der Prüfung ist ein Zahlungseingang auf die Bestellung festgestellt worden und die Ware ist am Standort verfügbar. Daher wurde die Sofortrechnung erstellt und die Druckvorschau wird dem Benutzer angezeigt.
BEISPIEL
Diese Aktion ermöglicht es, bei der Berechnung einer Position im Angebot, in der Bestellung oder im Warenkorb individuelle Konditionen in die Preisermittlung einfließen zu lassen.
Du möchtest, dass Kunden nur Artikel mit einer Mindestbestellmenge bestellen können. Sobald ein Kunde eine zu geringe Menge eingibt, wird diese auf die Mindestbestellmenge korrigiert und an der Position wird ein Hinweis angezeigt.
BEISPIEL
Wähle bitte den Aktionstyp „Erweiterte Position-Neuberechnung“ aus.
In der Karte „Ausführung bei“ kannst du festlegen, wann die Aktion ausgelöst wird.
Wenn Du „Ermittlung von Preisen“ (TriggeredBy = „priceCalculation“) aktivierst, wird die Aktion immer ausgeführt, wenn eine Änderung innerhalb der Entität zur Neuberechnung von Preisen führt. Welche Änderungen diese Neuberechnung veranlassen können, kannst du in der Hilfe unter <Bestellungen/Angebote > Bestellung/Angebot bearbeiten> einsehen.
Zudem kannst du es den Benutzern ermöglichen, die Aktion selbst auszulösen, indem du „Manuelle Ausführung“ (TriggeredBy = „manually“) aktivierst. Dann kann der Benutzer die Aktion im Kontext- oder Dreipunktemenü der übergeordneten Entität auswählen.
Auch aus dem Kontext- oder Dreipunktmenü einer Position kannst du die Aktion auslösen, indem du „Manuelle Ausführung bei Position“ (TriggeredBy = „manually“) aktivierst.
Du kannst auch den Auslöser „Änderung Feldinhalt“ (TriggeredBy = „fieldChange“) aktivieren. Die Aktion wird dann ausgeführt, wenn Änderungen an den in der aufgeführten Tabelle hinterlegten Feldern festgestellt werden.
Die Aktion kann in diesen Entitäten ausgelöst werden:
Neben den allgemeinen werden zusätzlich diese Daten übergeben:
Key | Datentyp | Value |
---|---|---|
PriceListId | int | die ID der Preisliste, die aktuell zugewiesen ist |
DiscountListId | int | die ID der Rabattliste, die aktuell zugewiesen ist |
CurrencyCode | string | die Währung, die aktuell zugewiesen ist |
CurrencyCodeExchangeRate | decimal | der aktuell verwendete Umrechnungsfaktor |
HasGrossPrices | bool | das Preiskennzeichen (brutto/netto) |
AccountId | string | die Kundennummer (KHKKontokorrent.Kto) |
DocumentDate | datetime | das Belegdatum |
UserAccountType | string | der Typ des angemeldeten Benutzers AccountType „crm“ (Benutzer) AccountType „reseller“ (Business-Login) |
UserAccountMail | string | die E-Mail-Adresse des angemeldeten Benutzers |
TaxClassId | short | die Besteuerungsart |
ShoppingCartType | string | der Typ des Warenkorbes (nur im Falle eines Warenkorbs – andernfalls ist der Parameter leer) |
Positions | Dictionary<string,object>[] | Position / Artikel |
Neben den allgemeinen Positionsdaten werden zusätzlich diese Daten übergeben:
Key | Datentyp | Value |
---|---|---|
LineType | string | der Positionstyp (wird nicht im Warenkorb unterstützt) |
Description1 | string | die Bezeichnung1 der Position |
Description2 | string | die Bezeichnung2 der Position |
LongText | string | der Langtext der Position |
DimensionText | string | der Dimensionstext der Position |
AccessoryText | string | der Zubehörtext der Position |
ExternalEntityReference | string | die Elements-Referenz für die Position |
Custom | Dictionary<string, object> | die Custom-Felder, die für die Position definiert sind (s. Entity-Spezifische Eingabeparameter) |
Das Kennzeichen, ob der Einzelpreis manuell verändert worden ist, kann genutzt werden, um Positionen mit einem individuellen Preis/Rabatt von der Neuberechnung auszuschließen.
TIPP
Als Positionstyp erwartet die Aktion folgende Daten:
Key | Value |
---|---|
pageBreak | Seitenumbruch |
group | Start einer Gruppe |
item | Artikel-Position |
subTotal | Zwischensummen-Zeile (beendet die Gruppe) |
text | Textposition |
alternative | Alternativ-Artikel |
Es werden die allgemeinen Rückmeldungen erwartet, allerdings pro Position:
Key | Datentyp | Value |
---|---|---|
Positions | Dictionary<string,object>[] | die Positionsdaten |
Das sind die Ausgabeparameter der Position:
Key | Datentyp | Value |
---|---|---|
EntityKey | string | der Elements-Key für diesen Datensatz |
UnitPrice | decimal | der Einzelpreis |
DiscountValue | decimal | der Rabattsatz (in Prozent) |
IsManualPrice | bool | das Kennzeichen, ob der Einzelpreis manuell verändert worden ist (EinzelpreisManuell) |
Quantity | decimal | die Menge |
QuantityUnit | string | die Mengeneinheit |
LineType | string | der Positionstyp (Werte siehe oben) |
Description1 | string | die Bezeichnung1 der Position |
Description2 | string | die Bezeichnung2 der Position |
LongText | string | der Langtext der Position |
DimensionText | string | der Dimensionstext der Position |
AccessoryText | string | der Zubehörtext der Position |
Anhand der übergebenen Mengeneinheit wird die Mengenart ermittelt. Dabei wird wie folgt priorisiert: Verpackungseinheit vor Verkaufseinheit vor Basismengeneinheit.
HINWEIS
Sobald die Aktion also eine Änderung an den Positionskonditionen feststellt, kannst du diese an Elements übermitteln.
Das Kennzeichen, ob der Einzelpreis manuell verändert worden ist, kann genutzt werden, um Positionen von einer späteren Neuberechnung aufgrund einer Änderung an der Entität auszuschließen.
TIPP
Der Benutzer ändert die Menge eines Artikels. Da der Artikel nur in 5er-Schritten bestellt werden kann, wird die Menge automatisch auf den nächsten Schritt angepasst.
BEISPIEL
Diese Aktion ermöglicht es, basierend auf der ausgewählten Zahlungsart in einem Angebot oder einer Bestellung eine Prüfung zu initiieren und dem Benutzer eine Information anzuzeigen. Mit Hilfe des Ergebnisses der Aktion kann die Übergabe eines Angebots oder einer Bestellung an das ERP-System unterbunden werden.
Der Benutzer wählt die Elements-Zahlungsart „Rechnung“ aus. Diese ist wiederum mit der Inkassoart „Kunde“ verknüpft und im Hintergrund wird eine Bonitätsprüfung ausgeführt. Diese meldet, dass anhand der vorliegenden Kriterien die Zahlung auf Rechnung nicht möglich ist. Der Benutzer bekommt einen Hinweis angezeigt und muss eine andere Zahlungsart auswählen.
BEISPIEL
Kunden, die seit zwei Jahren nicht mehr bestellt haben, dürfen nur bis zu einem Auftragswert von 100,- EUR auf Rechnung zahlen. Sobald der Auftragswert darüber liegt, wird dem Benutzer eine Warnung angezeigt und er kann die Bestellung nicht mehr an das ERP-System übergeben.
BEISPIEL
Jeder Zahlungsart in Elements ist eine Zahlungskondition im ERP-System zugewiesen. Idealerweise ist diese wiederum einer Inkassoart zugewiesen. Wenn nun der Benutzer eine Zahlungsart auswählt, sollte somit eine Inkassoart mit der Zahlungsart verknüpft sein. Diese Inkassoart kann die Aktion auslösen.
TIPP
Wähle bitte den Aktionstyp „Inkassoart-Prüfung“ aus.
In der Karte „Ausführung bei“ kannst du festlegen, wann die Aktion ausgelöst wird.
Wenn du „vor Übergabe an das ERP“ aktivierst, wird die Aktion immer ausgeführt, wenn der Benutzer eine in der Aktion hinterlegte Entität an das ERP-System übergeben möchte (TriggeredBy = „beforeCommit“). Dann wird auch das Kennzeichen für die automatische Ausführung übergeben.
Die Aktion kann in diesen Entitäten ausgelöst werden:
Die Aktion wird nur ausgeführt, wenn eine Bestellung oder ein Angebot neu in Elements angelegt wird. Zudem wird sie nur ausgeführt, wenn die angegebenen Inkassoarten über eine ERP-Zahlungskondition mit einer Elements-Zahlungsart (s. Administration / Zuordnungen / Bezahlung) verknüpft sind.
HINWEIS
Neben den allgemeinen werden zusätzlich diese Daten übergeben.
Es wird immer die Rechnungsadresse übergeben. Bei einem abweichenden Rechnungsempfänger wird dessen Rechnungsadresse übergeben.
HINWEIS
Key | Datentyp | Value |
---|---|---|
Name1 | string | der Name 1 |
Name2 | string | der Name 2 |
Addition | string | der Zusatz |
StreetAndHouseNumber | string | die Straße und Hausnummer |
ZipCode | string | die Postleitzahl |
City | string | die Stadt / der Ort |
CountryCode | string | der Ländercode, z.B. DE |
NetAmount | decimal | der Nettobetrag |
GrossAmount | decimal | der Bruttobetrag |
CurrencyCode | string | die Währung |
Es werden keine Positionsdaten übergeben.
Es werden die allgemeinen Rückmeldungen erwartet.
Die Rückgabe von Dateien wird nicht unterstützt.
HINWEIS
Key | Datentyp | Value |
---|---|---|
PreventsCommit | bool | das Kennzeichen, ob die Übergabe an das ERP abgebrochen werden soll |
Der Benutzer hat die Zahlungsart „Rechnung“ ausgewählt und der Kunde hat die benötigte Bonität. Es wird keine Rückmeldung angezeigt.
BEISPIEL
Neben den allgemeinen Rückmeldungen kannst du auch ein Sperrkennzeichen mitgeben. Sobald die Aktion feststellt, dass die Bestellung oder das Angebot nicht weiterverarbeitet werden kann, kann ein Sperrkennzeichen mitgeschickt werden. Dann ist es dem Benutzer nicht mehr möglich, die Bestellung oder das Angebot im ERP-System zu speichern.
Der Benutzer hat die Zahlungsart „Rechnung“ ausgewählt und der Kunde hat nicht die benötigte Bonität. Die Bestellung kann somit auch nicht an das ERP-System übergeben werden. Es wird eine Fehlermeldung eingeblendet.
BEISPIEL
Schicke bei einer Sperrung bitte auch immer eine Fehlermeldung mit, damit der Benutzer auch reagieren und die Bestellung oder das Angebot anpassen kann.
TIPP
Diese Aktion ist am besten an zwei Beispiel beschrieben.
Ein Benutzer fügt einer Bestellungen einen Kunden hinzu, der allerdings eine Amazon-E-Mail-Adresse in den Kundendaten hat. Auf diesen Kunden darf allerdings keine Bestellung in Elements angelegt werden. Sobald der Benutzer nun also den Kunden per Suche hinzufügt, wird die Kundennummer entfernt und dem Benutzer wird ein Hinweis angezeigt, dass er den Kunden bitte neu anlegen soll, da er auf diesen Kunden keine Bestellung anlegen kann.
BEISPIEL
Ein Benutzer fügt einen Kunden zu einem Angebot hinzu. Allerdings gab es bei diesem Kunden eine Umstrukturierung und alle neuen Belege sollen auf eine andere Kundennummer ausgestellt werden. Sobald der Benutzer nun also die „alte“ Kundennummer hinzufügt, wird automatisch die „neue“ Kundennummer hinzugefügt und dem Benutzer wird ein Hinweis mit einer Erklärung angezeigt.
BEISPIEL
Mit Hilfe dieser Aktion kannst du – basierend auf Kunden- aber auch auf Belegdaten – beim Hinzufügen eines Kunden eine Reaktion anhand individueller Regelwerke anstoßen.
Wähle bitte den Aktionstyp „Kunde ändern“ aus.
In der Karte „Ausführung bei“ kannst du festlegen, wann die Aktion ausgelöst wird.
Wenn du „Ändern des Kunden“ (TriggeredBy = „accountChange“) aktivierst, wird die Aktion immer ausgeführt, wenn in einem Angebot, einer Bestellung oder einem Warenkorb ein Kunden aus den ERP-Daten hinzugefügt wird.
Zudem kannst du den Auslöser „Änderung Feldinhalt“ (TriggeredBy = „fieldChange“) aktivieren. Die Aktion wird dann ausgeführt, wenn Änderungen an den in der aufgeführten Tabelle hinterlegten Feldern festgestellt werden.
Die Aktion kann in diesen Entitäten ausgelöst werden:
Neben den allgemeinen werden zusätzlich diese Daten übergeben:
Key | Datentyp | Value |
---|---|---|
PriceListId | int | die ID der Preisliste, die aktuell zugewiesen ist |
DiscountListId | int | die ID der Rabattliste, die aktuell zugewiesen ist |
CurrencyCode | string | die Währung, die aktuell zugewiesen ist |
CurrencyCodeExchangeRate | decimal | der aktuell verwendete Umrechungsfaktor |
HasGrossPrices | bool | das Preiskennzeichen (brutto/netto) |
AccountId | string | die Kundennummer nach der Änderung (KHKKontokorrent.Kto) |
DocumentDate | datetime | das Belegdatum |
Neben den allgemeinen Positionsdaten werden zusätzlich diese Daten übergeben:
Key | Datentyp | Value |
---|---|---|
Custom | Dictionary<string, object> | die Custom-Felder, die für die Position definiert sind (s. Entity-Spezifische Eingabeparameter) |
Es werden die allgemeinen Rückmeldungen erwartet.
Key | Datentyp | Value |
---|---|---|
AccountId | string | die Kundennummer, die übernommen wird (KHKKontokorrent.Kto) |
Wird der Wert NULL übergeben so wird der Kunde entfernt.
Ist der Wert leer, so bleibt die Kundennummer unverändert in der Bestellung, im Angebot oder Warenkorb enthalten.
HINWEIS
Mit Hilfe dieser Aktion kann in den Speicherprozess des Kunden – egal ob bei Neuanlage oder Bearbeitung eines bestehenden Kunden – eingegriffen werden.
Ein Benutzer legt einen Kunden an und vergisst die Angabe eines wichtigen Wertes. Beim Speichern wird das festgestellt und das Speichern wird verhindert. Zudem wird dem Benutzer angezeigt, welche Angabe er noch vornehmen muss.
BEISPIEL
Ein Benutzer bearbeitet einen Kunden und ändert einen Wert. Beim Speichern wird festgestellt, dass genau dieser Wert abhängig von anderen Angaben in den Kundendaten einen anderen als den vom Benutzer eingegebenen Wert haben muss. Der Wert wird automatisch korrigiert und dem Benutzer wird eine Information angezeigt.
BEISPIEL
Mit Hilfe dieser Aktion kannst du nun also anhand von Kunden- aber auch Belegdaten beim Hinzufügen eines Kunden eine Reaktion basierend auf individuellen Regelwerken anstoßen.
Wähle bitte den Aktionstyp „Kunde speichern“ aus.
In der Karte „Ausführung bei“ kannst du festlegen, wann die Aktion ausgelöst wird.
Wenn du „Speichern eines Kunden“ (TriggeredBy = „customerSave“) aktivierst, wird die Aktion immer ausgeführt, wenn ein Kundendatensatz im ERP-System gespeichert wird.
Der Kunde wird auch gespeichert, wenn ein Angebot oder eine Bestellung an das ERP-System übergeben wird.
HINWEIS
Neben den allgemeinen werden zusätzlich diese Daten übergeben:
Key | Datentyp | Value |
---|---|---|
SageAdressenItem | Sagede.OfficeLine.Data.Entities.Main.AdressenItem | das Sage-Objekt (Adresse), die gespeichert werden soll |
SageKontokorrentItem | Sagede.OfficeLine.Data.Entities.Main.KontokorrentItem | das Sage-Objekt (Kunde), die gespeichert werden soll |
Custom | Dictionary<string, object> | die Custom-Felder, die für den Kunden definiert sind (s. Entity-Spezifische Eingabeparameter) |
Wird ein Kunde neu angelegt, ist noch keine ID (AdressenItem.Adresse, KontokorrentItem.Kto) oder eine entsprechende Referenz (AdressenItem.Adresse) gesetzt.
HINWEIS
Es werden die allgemeinen Rückmeldungen erwartet.
Key | Datentyp | Value |
---|---|---|
SageAdressenItem | Sagede.OfficeLine.Data.Entities.Main.AdressenItem | das Sage-Objekt (Adresse), die gespeichert werden soll |
SageKontokorrentItem | Sagede.OfficeLine.Data.Entities.Main.KontokorrentItem | das Sage-Objekt (Kunde), die gespeichert werden soll |
CancelSave | bool | das Kennzeichen, ob das Speichern abgebrochen werden soll |
Custom | Dictionary<string, object> | die Custom-Felder, die für den Kunden definiert sind (s. Entity-Spezifische Ausgabeparameter) |
Der Aufbau der Custom-Felder entspricht folgendem Schema:
{
"customer": {
"Tabellenname.Spaltenname": "Wert"
}
}
Nicht immer ist es möglich, alle Informationen zu einem Kunden im ERP-System vorzuhalten oder zu verwalten. Dann behilft man sich mit externen Tools, z. B. CRM-Systemen. Oder es gibt Informationen, die ein Benutzer unbedingt erhalten muss, wenn er einen Kunden aufruft. Dann ist die Kunden-Aktion in Elements genau die richtige Option.
Im Unternehmen wird ein externes CRM-System genutzt, um die Kommunikation mit den Kunden zu dokumentieren. Ruft ein Benutzer nun den Kunden auf, so soll er wichtige Informationen aus dem CRM-System sehen können. Diese werden ihm in der Schnellansicht des Kunden angezeigt, sobald er diesen aufgerufen hat.
BEISPIEL
Der Kundenservice muss häufig mit Kunden kommunizieren, die über eBay bestellt haben. Sobald der Benutzer nun einen Kunden aufruft, kann er mit einem Klick auf die Option „Streitfallmanagement“ im Kontext- oder Dreipunktmenü des Kunden prüfen, ob es aktuell einen offenen Streitfall auf eBay gibt. Ist dies nicht der Fall, so erhält er die Meldung „alles in Ordnung“, andernfalls werden ihm Details zum Streitfall angezeigt.
BEISPIEL
Wähle bitte den Aktionstyp „Kunden-Aktion“ aus.
In der Karte „Ausführung bei“ kannst du festlegen, wann die Aktion ausgelöst wird.
Wenn du „Automatisch in dynamischer Spalte“ (TriggeredBy = „dynamicColumnInitialization“) aktivierst, wird die Aktion immer ausgeführt, wenn der Benutzer einen Kunden aufruft und sich dessen Schnellansicht ansieht.
Zudem kannst du es den Benutzern ermöglichen, die Aktion selbst auszulösen, indem du „Manuelle Ausführung“ (TriggeredBy = „manually“) aktivierst. Dann kann der Benutzer die Aktion im Kontext- oder Dreipunktemenü auswählen.
Die Aktion kann in der Entität Kunde (customer) ausgelöst werden.
Neben den allgemeinen werden zusätzlich diese Daten übergeben:
Key | Datentyp | Value |
---|---|---|
AccountId | string | die Kundennummer (KHKKontokorrent.Kto) |
Es werden die allgemeinen Rückmeldungen erwartet.
Diese Aktion ermöglicht es, nach dem Hinzufügen einer Position oder dem Ändern des Lieferlandes im Angebot, in der Bestellung oder im Warenkorb Hinweise oder Fehlermeldungen in Elements anzeigen zu lassen. Damit kann sogar verhindert werden, dass ein Angebot oder eine Bestellung an das ERP-System übergeben wird.
Bestimmte Artikel können aufgrund behördlicher Regelungen nicht in ein Land geliefert werden. Sobald der Benutzer das Land als Lieferland angibt und einer der betreffenden Artikel in der Bestellung enthalten ist, wird der Benutzer darüber informiert und kann die Bestellung nicht mehr an das ERP-System übergeben.
BEISPIEL
Wähle bitte den Aktionstyp „Position-Hinzufügen“ aus.
Wenn du in der Karte „Ausführung bei“ die Option „Hinzufügen einer Position“ (TriggeredBy = „addingPosition“) aktivierst, wird immer beim Hinzufügen einer neuen Position die Aktion angestoßen.
Aktivierst du „Änderung des Lieferlandes“ (TriggeredBy = „deliveryCountryChange“), so wird immer bei der Änderung des Lieferlandes die Aktion angestoßen. Das kann passieren, wenn das Land in der Anschrift oder der abweichenden Lieferadresse geändert oder ein neuer Kunde hinzugefügt wird und sich dadurch das Land ändert.
Wenn du „vor Übergabe an das ERP“ (TriggeredBy = „beforeCommit“) aktivierst, wird die Aktion immer ausgeführt, wenn der Benutzer eine in der Aktion hinterlegte Entität an das ERP-System übergeben möchte. In diesem Fall ist das „Bestellung verbindlich bestätigen“ oder „Angebot verbindlich bestätigen“. Dann wird auch das Kennzeichen für die automatische Ausführung übergeben.
Zudem kannst du den Auslöser „Änderung Feldinhalt“ (TriggeredBy = „fieldChange“) aktivieren. Die Aktion wird dann ausgeführt, wenn Änderungen an den in der aufgeführten Tabelle hinterlegten Feldern festgestellt werden.
Die Aktion kann in diesen Entitäten ausgelöst werden:
Neben den allgemeinen werden zusätzlich diese Daten übergeben:
Key | Datentyp | Value |
---|---|---|
EntityType | string | der Typ der Entität, z.B. order für Bestellung |
DeliveryAddressCountryCode | string | der Ländercode des Lieferlandes (z.B. DE) |
AccountId | string | die Kundennummer (KHKKontokorrent.Kto), falls diese bereits in der Entität gesetzt ist |
Positions | Dictionary<string,object>[] | die Positionsdaten |
Neben den allgemeinen Positionsdaten werden zusätzlich diese Daten übergeben:
Key | Datentyp | Value |
---|---|---|
ExternalEntityReference | string | die Elements-Referenz für die Position |
Custom | Dictionary<string, object> | die Custom-Felder, die für die Position definiert sind (s. Entity-Spezifische Eingabeparameter) |
Bitte beachte, dass hier nicht der Elements-Versandtyp berücksichtigt wird. Es kann also nicht zwischen einer Lieferung und einer Mitnahme oder Abholung unterschieden werden.
HINWEIS
Es werden die allgemeinen Rückmeldungen erwartet, allerdings für die entsprechend hinzugefügte Position:
Key | Datentyp | Value |
---|---|---|
PreventsCommit | bool | das Kennzeichen, ob die Übergabe an das ERP abgebrochen werden soll |
Positions | Dictionary<string,object>[] | die Positionsdaten |
Das sind die Ausgabeparameter der Position:
Key | Datentyp | Value |
---|---|---|
EntityKey | string | der Elements-Key für diesen Datensatz |
Message | string | eine Meldung pro Position (nur wenn diese nicht verkaufsfähig ist) |
IsSaleable | bool | das Kennzeichen für die Verkaufsfähigkeit des Artikels |
Der Benutzer fügt der Bestellung eine Position hinzu. Die Aktion wird durchlaufen und stellt keine Kriterien fest, die diese Änderung beanstanden.
BEISPIEL
Der Benutzer fügt einer Bestellung, die in die Schweiz geliefert werden soll, eine Position hinzu. Dieser Artikel soll allerdings nur unter bestimmten Bedingungen in die Schweiz geliefert werden. Also erhält der Benutzer einen Hinweis an der Position, dass er den Kunden auf eine Besonderheit hinweisen soll. Die Bestellung kann dennoch an das ERP-System übergeben werden.
BEISPIEL
Neben den allgemeinen Rückmeldungen kannst du auch ein Sperrkennzeichen mitgeben. Sobald die Aktion feststellt, dass die Bestellung oder das Angebot nicht weiterverarbeitet werden kann, kann ein Sperrkennzeichen mitgeschickt werden. Dann ist es dem Benutzer nicht mehr möglich, die Bestellung oder das Angebot im ERP-System zu speichern.
Der Benutzer fügt einer Bestellung, die in die Schweiz geliefert werden soll, eine Position hinzu. Dieser Artikel darf allerdings nicht in die Schweiz geliefert werden. Also erhält der Benutzer eine Fehlermeldung an der Position, die ihn darauf hinweist, dass dieser Artikel nicht in die Schweiz geliefert werden kann. Er kann die Bestellung somit auch nicht an das ERP-System übergeben.
BEISPIEL
Schicke bei einer Sperrung bitte auch immer eine Fehlermeldung mit, damit der Benutzer auch reagieren und die Bestellung oder das Angebot anpassen kann.
TIPP
Diese Aktion ermöglicht es, bei der Berechnung einer Position im Angebot, in der Bestellung oder im Warenkorb individuelle Konditionen in die Preisermittlung einfließen zu lassen.
Du möchtest, dass alle Artikel derselben Artikelgruppe einen Rabatt von 5 % erhalten, sobald drei Artikel dieser Artikelgruppe in einer Bestellung enthalten sind. Sobald einer dieser Artikel wieder entfernt wird, wird der Rabatt ebenfalls entfernt.
BEISPIEL
Wähle bitte den Aktionstyp „Position-Neuberechnung“ aus.
In der Karte „Ausführung bei“ kannst du festlegen, wann die Aktion ausgelöst wird.
Wenn Du „Ermittlung von Preisen“ (TriggeredBy = „priceCalculation“) aktivierst, wird die Aktion immer ausgeführt, wenn eine Änderung innerhalb der Entität zur Neuberechnung von Preisen führt. Welche Änderungen diese Neuberechnung veranlassen können, kannst du in der Hilfe unter <Bestellungen/Angebote > Bestellung/Angebot bearbeiten> einsehen.
Zudem kannst du es den Benutzern ermöglichen, die Aktion selbst auszulösen, indem du „Manuelle Ausführung“ (TriggeredBy = „manually“) aktivierst. Dann kann der Benutzer die Aktion im Kontext- oder Dreipunktemenü der übergeordneten Entität auswählen.
Du kannst auch den Auslöser „Änderung Feldinhalt“ (TriggeredBy = „fieldChange“) aktivieren. Die Aktion wird dann ausgeführt, wenn Änderungen an den in der aufgeführten Tabelle hinterlegten Feldern festgestellt werden.
Die Aktion kann in diesen Entitäten ausgelöst werden:
Neben den allgemeinen werden zusätzlich diese Daten übergeben:
Key | Datentyp | Value |
---|---|---|
PriceListId | int | die ID der Preisliste, die aktuell zugewiesen ist |
DiscountListId | int | die ID der Rabattliste, die aktuell zugewiesen ist |
CurrencyCode | string | die Währung, die aktuell zugewiesen ist |
CurrencyCodeExchangeRate | decimal | der aktuell verwendete Umrechnungsfaktor |
HasGrossPrices | bool | das Preiskennzeichen (brutto/netto) |
AccountId | string | die Kundennummer (KHKKontokorrent.Kto) |
DocumentDate | datetime | das Belegdatum |
TaxClassId | short | die Besteuerungsart |
Positions | Dictionary<string,object>[] | Position / Artikel |
Neben den allgemeinen Positionsdaten werden zusätzlich diese Daten übergeben:
Key | Datentyp | Value |
---|---|---|
ExternalEntityReference | string | die Elements-Referenz für die Position |
Custom | Dictionary<string, object> | die Custom-Felder, die für die Position definiert sind (s. Entity-Spezifische Eingabeparameter) |
Das Kennzeichen, ob der Einzelpreis manuell verändert worden ist, kann genutzt werden, um Positionen mit einem individuellen Preis/Rabatt von der Neuberechnung auszuschließen.
TIPP
Es werden die allgemeinen Rückmeldungen erwartet, allerdings pro Position:
Key | Datentyp | Value |
---|---|---|
Positions | Dictionary<string,object>[] | die Positionsdaten |
Das sind die Ausgabeparameter der Position:
Key | Datentyp | Value |
---|---|---|
EntityKey | string | der Elements-Key für diesen Datensatz |
UnitPrice | decimal | der Einzelpreis |
DiscountValue | decimal | der Rabattsatz (in Prozent) |
IsManualPrice | bool | das Kennzeichen, ob der Einzelpreis manuell verändert worden ist (EinzelpreisManuell) |
Sobald die Aktion also eine Änderung an den Positionskonditionen feststellt, kannst du diese an Elements übermitteln.
Das Kennzeichen, ob der Einzelpreis manuell verändert worden ist, kann genutzt werden, um Positionen von einer späteren Neuberechnung aufgrund einer Änderung an der Entität auszuschließen.
TIPP
Der Benutzer ändert den Preis eines Artikels. Diese Änderung wird durch die Aktion überprüft und stellt keine Bedingung für eine Änderung der Preise dar.
BEISPIEL
Der Benutzer ändert einen Preis und dieser ist zu gering. Der Benutzer bekommt eine Fehlermeldung angezeigt und muss den Preis wieder korrigieren. Alternativ kann die Aktion auch den korrekten Preis übergeben.
BEISPIEL
Diese Aktion kannst du nutzen, um im Kontext des Warenkorbs Prüfungen durchzuführen oder auch dem Benutzer Informationen anzuzeigen. Dabei kannst du auch verhindern, dass ein Warenkorb übergeben wird.
Der Benutzer hat einen Warenkorb befüllt, aber der Wert des Warenkorbs überschreitet einen gewissen Betrag. Die Aktion wird beim Klick auf „Bestellung“ ausgeführt und stellt fest, dass der Warenkorb nicht übergeben werden kann. Dem Benutzer wird eine Meldung im HTML-Format eingeblendet, die ihn auf den Grund hinweist.
BEISPIEL
Der Benutzer möchte weitere Informationen zum Warenkorb hinterlegen. Dazu kann er im Menü des Warenkorbs die entsprechende Aktion aufrufen. Ihm wird ein Webformular angezeigt, in dem er die fehlenden Daten eintragen kann. Diese werden mit der internen Referenznummer von Elements verknüpft.
BEISPIEL
Wähle hier bitte den Aktionstyp „Warenkorb-Aktion“ aus.
In der Karte „Ausführung bei“ kannst du festlegen, wann die Aktion ausgelöst wird.
Wenn du „Manuelle Ausführung“ (TriggeredBy = „manually“) aktivierst, kann die Aktion über das Drei Punkte-Menü des Warenkorbs angestoßen werden.
Aktivierst du „Weiterverarbeitung, vor Bestätigung“ (TriggeredBy = „transformationBeforeConfirm“) so kannst du automatisch die Aktion ausführen, wenn der Benutzer im Warenkorb auf die Schaltfläche „Preisanfrage“ oder „Bestellung“ klickt. Die Aktion wird also ausgeführt, bevor der Benutzer die Zusammenfassung der Preisanfrage oder Bestellung sieht.
Aktivierst du „Weiterverarbeitung, nach Bestätigung“ (TriggeredBy = „transformationAfterConfirm“) so kannst du automatisch die Aktion ausführen, wenn der Benutzer die Übergabe des Warenkorbs als Preisanfrage oder Bestellung abschließt. Die Aktion wird ausgeführt nachdem der Benutzer die Zusammenfassung der Preisanfrage oder Bestellung gesehen und diese bestätigt hat.
Bitte beachte, dass in einem Warenkorb oder Webshop-Warenkorb lediglich der Auslöser „Weiterverarbeitung, nach Bestätigung“ funktioniert, da dort keine Bestätigung vorgesehen ist.
Richte für diese Warenkörbe bitte lediglich eine Aktion für d Auslöser ein, wenn du dies benötigst.
HINWEIS
Zudem kannst du das Ergebnis der Aktion im Detailbereich des Warenkorbes automatisch anzeigen, wenn du „automatisch in dynamischer Spalte“ (TriggeredBy = „dynamicColumnInitialization“) aktivierst.
Du kannst auch den Auslöser „Änderung Feldinhalt“ (TriggeredBy = „fieldChange“) aktivieren. Die Aktion wird dann ausgeführt, wenn Änderungen an den in der aufgeführten Tabelle hinterlegten Feldern festgestellt werden.
Die Aktion kann in diesen Entitäten ausgelöst werden:
Neben den allgemeinen Daten werden zusätzlich folgende Daten übergeben:
Key | Datentyp | Value |
---|---|---|
TargetType | string | das Ziel der Entität • Warenkorbtyp (s. Auslöser) • Bestellung (order) • Angebot (offer) |
ShoppingCartType | string | der Warenkorbtyp |
PriceListId | int | die ID der Preisliste, die aktuell zugewiesen ist |
DiscountListId | int | die ID der Rabattliste, die aktuell zugewiesen ist |
CurrencyCode | string | die Währung, die aktuell zugewiesen ist |
CurrencyCodeExchangeRate | decimal | der aktuell verwendete Umrechnungsfaktor |
HasGrossPrices | bool | das Preiskennzeichen (brutto/netto) |
AccountId | string | die Kundennummer (KHKKontokorrent.Kto) |
DocumentDate | datetime | das Belegdatum |
Files | Dictionary<string, object>[] | das Array von Datei-Definitionen (Details s. Entity-Spezifische Eingabeparameter) |
Positions | Dictionary<string,object>[] | Position / Artikel |
Neben den allgemeinen Positionsdaten werden zusätzlich diese Daten übergeben:
Key | Datentyp | Value |
---|---|---|
ExternalEntityReference | string | die Elements-Referenz für die Position |
Custom | Dictionary<string, object> | die Custom-Felder, die für die Position definiert sind (s. Entity-Spezifische Eingabeparameter) |
Neben den allgemeinen Rückmeldungen kannst du auch ein Sperrkennzeichen mitgeben. Sobald die Aktion feststellt, dass der Warenkorb nicht weiterverarbeitet werden kann, kann ein Sperrkennzeichen mitgeschickt werden. Dann ist es dem Benutzer nicht mehr möglich, den Warenkorb zu übergeben.
Key | Datentyp | Value |
---|---|---|
PreventsTransform | bool | das Kennzeichen, ob die Transformation des Warenkorbs in den TargetType abgebrochen werden soll |
Schicke bei einer Sperrung bitte auch immer eine Fehlermeldung mit, damit der Benutzer auch reagieren und den Warenkorb anpassen kann.
TIPP
Bei der Darstellung wird – je nach Kontext – unterschieden, wie mit der Rückgabe umgegangen wird.
(a) Bei manueller Ausführung wird das PreventsTransform-Kennzeichen verworfen und ausschließlich Messages angezeigt.
(b) Bei der Weiterverarbeitung werden Messages wie gewohnt in einer Lightbox dargestellt, die Weiterverarbeitung allerdings abhängig vom PreventsTransform-Kennzeichen abgebrochen.
HINWEIS
Die vom ausführenden Elements-Benutzer ausgewählte Oberflächensprache ist immer in den Parametern der Aktion enthalten („CultureId“). Mögliche Werte sind momentan:
Die Assembly der Aktion benötigt eine Ressourcen-Datei (resx-Format) für die zu übersetzenden Texte. Hier wird eine Datei (z. B. „Resources.resx“) angelegt, die sprach-unabhängige Texte enthält. Diese wird als Fallback für nicht gefundene sprach-spezifische Dateien verwendet. Für jede gewünschte Sprache kann dann eine eigene Datei angelegt werden, z. B. „Resources.fr-fr.resx“. Darin sind dann die Texte in der jeweiligen Sprache übersetzt. Weitere Informationen zu Ressourcen-Dateien findet man im Internet.
Im Quellcode kann dann über eine statische Klasse (z. B. „Resources“, je nach Dateiname) auf die einzelnen Texte zugegriffen werden. Damit die Texte in der korrekten Sprache ermittelt werden, muss zunächst die Sprache für die Texte festgelegt werden.
var cultureId = parameter.TryGetValue("CultureId", out var cultureIdObj) && cultureIdObj != null ? cultureIdObj?.ToString() : "de-DE";
Resources.Culture = new CultureInfo(cultureId);
var result = new Dictionary<string, object>();
result.Add("Message", Resources.MyTextKey);
return result;
Bei der Installation der Assembly ist zu beachten, dass zusätzlich sprach-abhängige Assemblies erstellt werden. Diese finden sich im Build-Ausgabeverzeichnis in Ordnern mit dem jeweiligen Sprachkürzel:
Diese Ordner müssen bei der Installation mit in das Shared-Verzeichnis der Safe 100 (Office-Line) kopiert werden, ansonsten fehlen die Übersetzungen und man erhält lediglich die Fallback-Texte.
„*“ zeigt erforderliche Felder an
„*“ zeigt erforderliche Felder an
„*“ zeigt erforderliche Felder an