This section describes the necessary parameters and data types for REST connector calls.
Simplifier Academy
Courses & Documentation
PDF generated April 30, 2019
The Documentation refers to the latest version of the Simplifier. If you have an On-Premise installation and need help with an older version, please contact us via support@itizzimo.com, we are glad to support you.
Business objects can now also be executed directly on the browser or on the respective mobile device. They are created centrally and can therefore be reused several times. Read more »
Each connector/business object, widget and data type can now be tagged. For example, project-related configuration objects can be given a project name, which makes them easier to find again.
Every click on the “Deploy” button automatically updates the preview in the browser.
Within a business object, the most common functions can be accessed using a uniform API and auto-completion. Read more »
Via the Logs & Monitoring you can now see who did the last changes in a connector or business object.
Errors in the Simplifier Mobile Client can now be evaluated centrally.
You can now check how much programming effort is avoid through the low-code approach, the degree of configuration is now displayed in percent in the application overview. Read more »
The documentation of the Simplifier REST API is now directly accessible via an HTML page and can be tested directly.
For the detection of counter readings we now support the technology of our partner Pixolus via configuration.
The background mode can be activated for notifications / push messages so that the user is informed even without active use of the Simplifier Mobile Client.
When importing Simplifier transports, the user will be made aware of potential conflicts in the future. This creates transparency for shared connectors, data types or business objects. Read more »
For efficient management of dependencies between applications and data from backend systems, we now offer an overview that shows which data is used by which application or which interfaces are integrated in which applications.
We have expanded the configuration options in the Process Designer:
Read more on Process Designer and the following pages.
The authorizations have been refined so that the application or interface can only be read, created or changed for each user. Read more »
Brute force attacks can now be prevented via the security policies.
Simplifier Jobs can now be started automatically in several variants (daily, weekly, monthly). Read more »
Widgets that are no longer required can be marked as deprecated and are no longer available for use in the UI Designer. Read more »
We have reworked our Simplifier Universal Client for Android to include the same features as in the iOS Universal Client. In addition to the function that you can work offline with the Simplifier client or the autostart function for already installed business applications, we now also support the fingerprint sensor for login with Android. Furthermore, the Android client now appears in a new layout in the native Android material design.
Moreover, we offer an optimized menu navigation on data glasses, depending on the hardware complete with voice control. Support information is also automatically transmitted to the server on request.
And for the developers, we now offer a developer mode that displays errors from the console directly on the device.
_______________________________________________
Using state-of-the-art technologies, we accelerate your application creation. We have designed and built our platform in terms of logic and usability to accommodate the modern, agile development processes within companies. Due to the low-code approach, applications no longer need to be elaborately programmed but can be easily configured and integrated into any system. Thus, applications can be mapped process-oriented.
Basically, creating an application with our Simplifier can be divided into the following 5 steps:
In the future, for each application, access the data that is needed contextually to make the process more efficient. Standardized connectors enable you to quickly connect to any back-end system and various data sources.
Easily, quickly and intuitively create the user-friendly interface for all your applications. Use the pre-designed elements designed for this purpose and create a uniform look and feel for an improved user experience.
Configure the process logic and processes of each application using the Process Designer. Based on individual user stories, reusable processes are defined within the Process Dashboard. Each user story can be stored individually, so that you can work with several people on different stories at the same time and thus be able to map a process logic quickly and collaboratively. When the application is deployed, all stories were merged into one.
Test your application at any time in the Simplifier Mobile client or in the browser. Intermediate testing allows for faster detection and elimination at any point in time. The Simplifier Mobile Client supports the testing process by ensuring that applications can be used across devices and that the correct display of the application on each end device can be ensured.
The Simplifier transport system allows you to transfer the application to your productive system quickly and easily. And all without compilation or complex deployment processes. Quickly create a transport file of the finished application – all the components contained in it are fully integrated into the file – download them and import them directly into your production instance. Finished! The application is now available to any authorized user.
_______________________________________________
The Simplifier is a low code platform for mapping business processes in integrated business and IoT applications and to interconnect internal and external IT infrastructures. Applications only need to be configured once to be available on any mobile device and operating system.
_______________________________________________
The Dashboard is the place for you to start. It gives you a clear overview about your Simplifier instance. Here you find information about:
_______________________________________________
The Simplifier Freemium (free + premium) account contains a test environment where you can see and test selected features. The Freemium account comes with predefined application templates and example applications for different use cases.
Apply for an account by filling out the registration form on simplifier.io
You can test the Simplifier extensively and completely free of charge for 90 days. After 90 days the Simplifier is of course still for free use, only the server hosting has to be paid for.
You have the possibilities to create as many applications as you like and create and configure connectors to integrate all your systems.
Besides that, you have full administration access including user administration and monitoring and you have unlimited permissions to Simplifier items like widgets, libraries, data types, plugins, jobs and business objects.
_______________________________________________
[vc_row row_type=”row” stretch_row_type=”no”][vc_column][vc_column_text]
[/vc_column_text][/vc_column][/vc_row]
_______________________________________________
See the full featured list of supported operating systems:
Browser | Android > 4.4+ | iOS > 10.x+ | Windows 10 | Hololens | |
Capture/Play Audio/Video |
◦ |
• |
• |
• |
◦ |
This plugin provides access to the device’s audio, image, and video capture capabilities. | |||||
Get Device Information |
◦ |
• |
• |
• |
◦ |
This plugin defines a global device object, which describes the device’s hardware and software. Although the object is in the global scope, it is not available until after the deviceready event. | |||||
Access Accelerometer |
◦ |
• |
• |
• |
◦ |
This plugin provides access to the device’s accelerometer. The accelerometer is a motion sensor that detects the change (delta) in movement relative to the current device orientation, in three dimensions along the x, y, and z axis. | |||||
Access Device Orientation |
• |
•5.0+ |
• |
• |
◦ |
Provides information about the physical orientation and motion of the device. | |||||
Access Compass |
• |
• |
• |
• |
• |
This plugin provides access to the device’s compass. The compass is a sensor that detects the direction or heading that the device is pointed, typically from the top of the device. It measures the heading in degrees from 0 to 359.99, where 0 is north. | |||||
Access file system |
• |
• |
• |
• |
• |
This plugin implements a File API allowing read/write access to files residing on the device. | |||||
Up-/Download Content |
• |
• |
• |
• |
◦ |
This plugin allows you to upload and download files. | |||||
Access GPS |
• |
• |
• |
• |
◦ |
This plugin provides information about the device’s location, such as latitude and longitude. | |||||
Get Network Information |
• |
• |
• |
• |
◦ |
This plugin provides an implementation of an old version of the Network Information API. It provides information about the device’s cellular and wifi connection, and whether the device has an internet connection. | |||||
Native Dialogues |
• |
• |
• |
• |
• |
This plugin provides access to some native dialog UI elements | |||||
Trigger / Handle Notifications |
◦ |
• |
• |
• |
◦ |
The essential purpose of local notifications is to enable an application to inform its users that it has something for them — for example, a message or an upcoming appointment — when the application isn’t running in the foreground. | |||||
Access/Configure Statusbar |
◦ |
• |
• |
◦ |
◦ |
This plugin enables the user to make changes to the status bar of a mobile device | |||||
Access Device Vibrator | Chrome Firefox |
• |
•Ignores the specified time and vibrates for a pre-set amount of time. |
•Max time is 5000ms (5s) and min time is 1ms |
◦ |
This plugin provides a way to vibrate the device. | |||||
Scan Barcodes |
• |
• |
• |
• |
◦ |
Scan many different kinds of barcodes. | |||||
Beacon Scanning |
◦ |
• |
• |
◦ |
◦ |
This plugin provides the functionality to use beacons with the iBeacon protocol. | |||||
Augmented Reality |
◦ |
• |
• |
◦ |
◦ |
This plugin provides augmented reality functionality by Wikitude. | |||||
Bluetooth |
◦ |
• |
• |
• |
◦ |
This plugin enables communication between a phone and Bluetooth Low Energy (BLE) peripherals. | |||||
PDF Viewer |
• |
• |
• |
• |
◦ |
View PDF files. | |||||
Toggle Flash |
• |
• |
• |
◦ |
◦ |
Toggle the flash light of the device. | |||||
Text to Speech |
• |
• |
• |
• |
◦ |
Text to Speech functionality. | |||||
Speech recognition |
◦ |
• |
• |
◦ |
◦ |
Speech to text. | |||||
Share with |
◦ |
• |
• |
• |
◦ |
This plugin allows you to use the native sharing window of your mobile device. | |||||
SQLite |
◦ |
• |
• |
• |
◦ |
Native interface to sqlite. | |||||
Fullscreen |
◦ |
• |
• |
◦ |
◦ |
Set your app fullscreen. | |||||
Battery Status |
◦ |
• |
• |
• |
◦ |
Get battery status and information. | |||||
Offline Work |
◦ |
• |
• |
◦ |
◦ |
Login and run your applications offline. | |||||
Remote Call |
• |
• |
• |
◦ |
•separate application required. |
Audio/Video communication. |
_______________________________________________
You can debug your applications on the Simplifier in real time on mobile devices.
Enter chrome://inspect into your Chrome browser.
Connect your mobile device via USB and enable “USB Debugging” within the device settings. Chrome will autodiscovering your mobile device and integrating it within the developer tools options.
When connected, you can begin screencasting by clicking the appropriate button in the developer tools window. Then your mobile device can be supplied directly with input from your desktop screen. Any changes are instantly displayed on your mobile device.
By the way, the “Port forwarding” button above provides some flexibility for those who don’t have their screen and developer machine on the same network. In this scenario, you can create a TCP port on your mobile device and assign it to a specific TCP port on your development machine. All forwarded traffic is transferred via USB, bypassing the mobile device’s network configuration.
By clicking the “Toggle device toolbar” button, the current page is reduced to the imitated screen parameters according to the set properties. This imitated display can be operated with the mouse in the same way as with the finger on a physical device.
In this view, you can simulate pinch zooming, finger scrolling and even multi-touch events.
_______________________________________________
Barcode Type
|
Android
|
iOS
|
Windows
|
---|---|---|---|
QR_CODE | ✔ | ✔ | ✔ |
DATA_MATRIX | ✔ | ✔ | ✔ |
UPC_A | ✔ | ✔ | ✔ |
UPC_E | ✔ | ✔ | ✔ |
EAN_8 | ✔ | ✔ | ✔ |
EAN_13 | ✔ | ✔ | ✔ |
CODE_39 | ✔ | ✔ | ✔ |
CODE_93 | ✔ | ✖ | ✔ |
CODE_128 | ✔ | ✔ | ✔ |
CODABAR | ✔ | ✖ | ✔ |
ITF | ✔ | ✔ | ✔ |
RSS14 | ✔ | ✖ | ✔ |
PDF417 | ✔ | ✖ | ✔ |
RSS_EXPANDED | ✔ | ✖ | ✖ |
MSI | ✖ | ✖ | ✔ |
AZTEC | ✖ | ✖ | ✔ |
_______________________________________________
Download the Simplifier Mobile Client in the appropriate stores, depending on your mobile device.
Descriptions of how the Simplifier Mobile Client works can be found in the subpages.
_______________________________________________
Below is a description of the Simplifier Mobile Client for iOS. After you have downloaded the Simplifier Mobile Client from the App Store, start it on your mobile device.
First you have to authenticate yourself on the login screen with your Simplifier username and password. Enter the instance you want to access. If the device has a fingerprint reader, you can choose to restore your password with it. You can save your login so you don’t have to re-enter it every time.
Since it is uncomfortably to type the instance, you can also use the QR code login. Read here how to create a corresponding QR code in the Simplifier.
Once you have successfully authenticated yourself, you are in the overview of installed applications. At the beginning, this overview is empty. At any time, you can log out by clicking on the logout button in the top left corner. At the top right, on the Simplifier icon, various information will be displayed.
To now use apps on your mobile device, switch to the screen Browse Apps. You now see an overview of all applications that are on the specified instance. To install apps, simply click on them. When the apps are downloaded, Installed will display a notification with the number of newly installed apps. You can delete installed application by swiping to the left.
If an app, that you have already installed, has been newly deployed on the instance, you will be informed about updates of the application.
At the bottom right, you will find an overview of all settings.
_______________________________________________
If the Cordova Simplifier client and -server are running in a closed network, and the SSL certificates are self-signed, it is necessary to install a special version of the Simplifier mobile client on Windows. This version contains certain permissions that are not compatible with the Windows Store.
You need 2 files for the installation:
There are 2 ways to install the client. In either case, the “developer mode” must be enabled in Windows to allow applications to be “cross-loaded”. This process is equal to Android and the menu item “Unknown origin”.
If a “certificate error” is displayed in one of the steps, please refer to the section “Installing the certificate” below.
It is mandatory to be in the local domain. This requires at least Windows 10 Pro or Enterprise!
Please follow these steps:
At first, the developer certificate must be installed:
A wizard opens where you should follow the steps below:
The following app must be installed on the Windows 10 computer: https://www.microsoft.com/en-us/store/p/app-installer/9nblggh4nns1 Store link.
This will associate .appxbundle files and you can start the installation process with a double-click on the file.
This screen will also check the required app permissions. The keyword is “Access to home or workplace networks” to head to the local Simplifier instance and “Use company domain credentials”, which is required for the certificate to the instance.
Switch with the Powershell to the folder with the Simplifier-Files (.appxbundle, .cer). Please note that this is a local location. Network addresses will fail.
Enter the command “Add-AppxPackage <filename> .appxbundle”. The file name may vary.
Example:
The installation process is started.
In the end, the Simplifier app can be started from the Start menu or the Tile menu.
If you are interested in the official Microsoft explanation click on the links below for more information.
In our Mobile Client, we use the following capability scenarios:
_______________________________________________
You have the possibility to launch your business application via URL.
Schema:
simplifierclient:///<action>/<value>?<param>=<value>[&<paramN>=<valueN>]
For explanation:
simplifierclient:// – The url type, on that the simplifier client is registered. All uris with this link opens the client by default. If parameters or path components are missing, at least the client is always started.
/<action> – The action to take. For now only “appDirect” is available.
/<value> – The value for the action.
?<param>=<value> – The URL arguments are beeing passed to webview so business app can access them. So on the client the local href would be something like file:///some_very_long_ios_path/www/businessapps/Simplifier_Explored?foo=1&bar=2
Example:
simplifierclient:///appDirect/Simplifier_Explored?foo=1&bar=2
The example above launches the simplifier client if installed and runs app “Simplifier_Explored”.
Restrictions:
_______________________________________________
Below is a description of the Simplifier Mobile Client for Android. After you have downloaded the Simplifier Mobile Client from the Play Store, start it on your mobile device.
First you have to authenticate yourself on the login screen with your Simplifier username and password. Enter the instance you want to access. If the device has a fingerprint reader, you can choose to restore your password with it. You can save your login so you don’t have to re-enter it every time.
Since it is uncomfortably to type the instance, you can also use the QR code login. Read here how to create a corresponding QR code in the Simplifier.
Once you have successfully authenticated yourself, you are in the overview of installed applications. At the beginning, this overview is empty. At any time, you can log out by clicking on the logout button in the top left corner. At the top right, on the Simplifier icon, various information will be displayed.
To now use apps on your mobile device, switch to the screen Browse Apps. You now see an overview of all applications that are on the specified instance. To install apps, simply click on them. When the apps are downloaded, Installed will display a notification with the number of newly installed apps. You can delete installed application by swiping to the left.
If an app, that you have already installed, has been newly deployed on the instance, you will be informed about updates of the application.
At the top right, you will find an overview of all settings.
_______________________________________________
To address Business Objects in your application, you do not have to call them in JavaScript code any longer. Simply use the activity “Data Objects” in the Process Designer. For more information, take a look at the documentation of the activity Business Object.
_______________________________________________
You can access all connectors you’ve previously assigned to your business object inside your script template.
Simplifier.Connector.<ConnectorName>(payload?: string|object): object
Example:
var connectorResult = Simplifier.Connector.MySoap({bindingName: "Binding", "operationName": "MyOp", "soap": {"foo": "bar"}});
Each call to a connector in a script template follows this convention:
Simplifier.Connector.<ConnectorName>.<CallName>(payload?: string|object): object
Example:
var connectorCallResult = Simplifier.Connector.MySoap.myCall({"Foo": "bar"});
_______________________________________________
You can call any other Business Objects in your current one in a similar way than calling a connector, using the following syntax:
Simplifier.BusinessObject.<BOName>.<MethodName>(payload?: string|object, parametrized?: boolean = true): object Simplifier.CurrentBusinessObject.<MethodName>(payload?: string|object, parametrized?: boolean = true): object
The payload has to be a stringified JSON object. The result of the business object method is a string and therefore it has to be parsed.
Example:
var otherMethodResult = Simplifier.BusinessObject.OtherBO.someMethod({"foo": "bar"}); var unparamtetrizedResult = Simplifier.BusinessObject.OtherBO.someMethod("{\"foo\": \"baz\"}", false); var sameBoResult = Simplifier.CurrentBusinessObject.someMethodOnSameBO({"baz": "baz"}); var noArgsResult = Simplifier.CurrentBusinessObject.methodWithoutArgs();
_______________________________________________
Call a plugin from your business object using this syntax:
Simplifier.Plugin.<PluginName>.<SlotName>(payload?: string|object): object
Example:
var repos = Simplifier.Plugin.contentRepoPlugin.listRepos(); var newRepo = Simplifier.Plugin.contentRepoPlugin.createRepo({name: "MyRepo"}); Simplifier.Plugin.contentRepoPlugin.updateRepo("{\"id\": 15}");
_______________________________________________
Currently the Action shape is divided into Navigation, UI Action, Mobile Action and Server Action.
_______________________________________________
The Simplifier can sync users of Active Directories, like users from other LDAP sources.
Property | Description |
Name | The name of the authentication mechanism |
Mechanism | Active Directory |
Priority | Priority in which the authentication system will be executed (descending) |
Hose name | The address of the domain controller |
Port | The port of the domain controller (default 389) |
Base DN | Base distinguished name, the entry point (i.E. OU=area51,DC=simplifier,DC=io) |
Firstname attribute | The attribute in the user object for the first name |
Lastname attribute | The attribute in the user object for the last name |
Email attribute | The attribute in the user object for the email |
Mobile attribute | The attribute in the user object for the mobile number |
_______________________________________________
A connector call represents one (sub)-operation of a connector, for example a soap wsdl has one or many operations – here you can customize each one as a call.
Attention To use a connector within an app, you have to configure a specific connector call and assign data types within the configuration! Otherwise the connector will not be visible in the Process Designer. |
Choose a connector from the overview and click the call icon. In the call overview add a new call for each connector operation.
For SOAP and SQL connectors, you have the possibility to use the Connector Wizard. It helps you to create your connector calls much easier and faster. If you click on it, you can choose the ones that you need.
Otherwise click on the plus icon in the upper right and enter a unique call name that describes the operation (e.g. read, write, update, delete, search, …).
Connector Call name
Unique name without spaces to describe the operation.
Description
Description of the operation.
For configuring a connector call, you have to specify input and output parameters in the following tables:
Each connector call has its own specific parameters.
Validate
You can validate the Input and Output parameter in the backend. It validates:
If the validation is not successful, the client is notified of all failed validations and it’s written to the Connector log or System log at the same time.
For every new Connector Call, this flag is set by default. Already existing Connector Calls do not have this checkbox flagged to guarantee the compatibility.
Parametername
The technical path or name within a rest api definition or web service description language or csv header column.
Alias
A meaningful non-technical description for the technical parameter. This wording is used in the edit mode for a user story (Process Designer) for mapping data with ui elements.
Description
Optional description of the parameter.
Constant Value
A constant value like SAP Client or company code that can’t be overwritten by any business apps. The value will be validated, so that it’s not possible to use a constant value with a wrong base type in Connector Calls and Buisness Objects.
Data Type
Assigned Simplifier data type for validating data before it gets back or from a backend system.
After finishing the parameters, you can save the connector call settings.
_______________________________________________
To add a new library click on the “+” in the right corner.
Now you can fill in the following parameter:
Parameter | Description | |
Name & Description | Name | The name of the library. NOTE: The combination of name and version number must be unique! |
Version | The version of the library. | |
Vendor | The vendor of the library. | |
Comment | A description of the library, or e.g. licence information. | |
Compatability | UI5 compatible | Controls the assignment to UI5 Apps. |
Angular JS compatible | Controls the assignment to Angular JS Apps. | |
Angular 2 compatible | Controls the assignment to Angular 2 Apps. | |
Default for UI5 | Assigns the library automatically when creating UI5 Apps. | |
Default for Angular JS | Assigns the library automatically when creating Angular JS Apps. | |
Default for Angular 2 | Assigns the library automatically when creating Angular 2 Apps. | |
Content | ZIP file | The ZIP file, that contains the library. |
JS code to include | Code snippet to integrate the library into Apps. | |
Dependencies | Dependencies | Dependencies to other libraries. |
If you mark a library as “Angular 2 compatible”, you have to fill in additional configuration data in the Content Area (you don’t need a file upload for Angular 2 libraries anymore).
In this additional configuration data field, you can configure npm dependencies of your Managed Library and import custom components. With this high level configuration it is possible to include any Angular 2 specific npm package and configure vanilla Angular 2 apps.
_______________________________________________
To add a template, you need the following parameter:
URL | /client/1.0/PLUGIN/pdfPlugin/adminTemplateAdd | |
Input-Parameter | Name | Template name |
Data | Template content (Base64-coded) | |
Stylesheet | Content of the LESS Stylesheets (Base64-coded, optional) | |
PreviewJson | Content of the sample data in JSON format (Base64-coded, optional) | |
Output-Parameter | None |
Example for a call:
{
"name"
:
"templatename"
,
"data"
: "SGFsbG8gV2VsdA==\",
"stylesheet: "
SGFsbG8gV2VsdA==\",
"previewJson"
: "SGFsbG8gV2VsdA==\"
}
Output example:
{
"success"
:
true
}
_______________________________________________
If you want to set an icon to a Widget, use the following syntax:
sap-icon://iconName
You can find all possible Icons with the OpenUI5 Icon Explorer.
_______________________________________________
With this Action Button in the Release Overview, you will be redirected to the metadata dialog.
Here you can insert additional information like requirements, compatible devices or add screenshots of the application.
The metadata will be displayed in the Marketplace, if you upload the app. You can maintain the metadata in German or English.
Data | Description | |
Release Metadata | Name | The Name of the App (will be set by the Simplifier). |
Version | The Version of the Release (will be set by the Simplifier). | |
Release Date | The Release Date (will be set by the Simplifier). | |
Languages | Languages defined in the App (will be set by the Simplifier). | |
Manufacturer | The Manufacturer. | |
Compatible Simplifier Versions | The Version of the Simplifier on which the App is running. | |
Compatible Devices | Compatibility to Desktop/Mobile/Wearables. | |
Internationalized Marketplace Descriptions | Marketplace Title | The Title of the App that will be displayed in the Marketplace. |
Coverage | The scope of the App. | |
Requirements | The System Requirements (like OPC/UA System). | |
Description | The App Description. | |
Icon | The Application Icon which will be displayed in the Marketplace. | |
Screenshots | App Screenshots (will be displayed at the bottom). | |
Demo-Link | Optional Demo Link to the App. | |
Media-Link | Optional Media Link (for example an embedded YouTube link). | |
Additional Settings | Limited visibility | Triggers if the App is visible in the Marketplace or only available by a secret link. |
Template |
_______________________________________________
To fill your screen with UI elements like text fields, charts or action buttons, you can search and choose them from the widget panel on the left side:
First, search for a specific widget using the name or just browse the the list, then add the widget to the screen. The widget will appear in your content area.
_______________________________________________
Oracle as a DB backend for the Simplifier requires some additional server settings, which are listed below. The Simplifier is currently running with MySQL 5.7 and Oracle 11g.
Database Settings within the Oracle Database:
Parameter | Recommended Value |
OPEN_CURSORS | 3000 |
Supported Oracle version:
Oracle Database 11g Release 11.2 – 64bit
Desired/recommended instance names (Productive and Test):
simplifierp and simplified
Required tablespaces:
simplifier 5G, Temp 1G, Undo 512 MB, Users 5MB
Oracle user and required roles and permissions:
simplifier, simplifier_np (in Prod and Test) permissions to run DDL
Database Characterset:
AL32UTF8
National Characterset:
UTF8
Default language:
German, Germany
Processes and Sessions:
Value to 1000
_______________________________________________
Templates are HTML Templates which for example can be used to send emails. With Templates you can build patterns that you can use consistently.
In our example we use one Template for an e-mail that will be sent to a new user to get a password. We use another Template in case a user has forgotten his password, so that he has the opportunity to reset the password. The Templates are arranged in the Namespace ‘system’.
Namespaces are logical groupings of Templates.
Function | Description |
Add Button | The Add Button allows you to create new empty Namespaces. |
Delete Button | The Delete Button will delete the Namespace and all underlying Templates. |
You can create and customize the Templates in HTML. With the mustache notation you can add data dynamically at runtime.
(For information about how to send the Templates go to: Business Object Script Template – Send Email).
Function | Description |
Add Button | Navigates to the detail page for Templates in order to create a new Template. |
Edit Button | Navigates to the detail page for Templates in order to edit a Template. |
Delete Button | Deletes the Template. |
The Preview Section shows live updates while editing a Template or provides a quick view when selecting a Template.
_______________________________________________
If you want to access plugins, you can work with anonymous users. Therefore the PluginAPI works with AnonymousAppProfile.
So only the assigned role to your Application needs the permission to use the Plugin.
Read more about roles.
_______________________________________________
The App “SAP_Material_Academy” shows exemplarily how to search for SAP Material Numbers and display the Material Name and Stock Data. You can reduce the stock through “Goods Withdrawal” or reduce the quantity through “Goods Receipt”.
_______________________________________________
The App “SAP_TechnischerPlatz_Academy” enables you to search for SAP Technical Location and display Header Data with the structure of the Technical Location. You can install and remove structural Items of the Technical Location.
_______________________________________________
The App “Simplifier_Explored_Academy” is a feature-based mobile App, showing the native capabilities of the Simplifier running on mobile devices.
It is subdivided into individual User Stories:
Context Features | As a user I want to access context sensitive features of my mobile phone. |
Communication Features | As a user I want to establish realtime audio and video communication. |
Device Features | As a user I want to be able to see details of my mobile device on a screen within this app. |
Data Aggregation | As a user I want to be able to load multiple data results from a Backend and display them in a table. |
Device Controls | As a user I want to be able to access native functionality of my mobile device. Taking Pictures, Playing and Recording Audio and Video, Changing the device orientation, Toggle Light. |
Media Features | As a user I want to take pictures, play and record audio, show PDF files etc.. |
Connector Features | As a user I want to read data from backend Systems and display it in my App. |
Multi Device Features | As a user I want to use my app on different devices and I want to show different screens based on the device I am using. |
_______________________________________________
The Simplifier transforms your business process into a configured business application for
We use the abbreviation “Apps” for all applications regardless of the device and user. An app should run on any device category because it is generated on common open standard technology.
By clicking on the Applications tile, you will be lead to the overview. There you will see a table with all created applications. Within this table you’ll get several information like the name of the apps, the author, default language, the version number, customization ratio, framework, and several actions.
App | It’s the name of the application. |
Author | The name of the author who have created the application. |
Default Language | American English or German. |
Version | It’s the version number of the releases. |
Customization Ratio |
After deploying an app, a code metric is available in the overview. It shows the generated lines of code and a comparision to the lines of code written by the customizer in events and script activities. |
Framework | OpenUI5 or Angular2. |
Actions | Edit Application, Copy Application, Show Releases, Edit meta resources, Preview and Delete Application. |
Read how to create a new application.
_______________________________________________
To upload files like documents, images, videos, 3D models or office documents to your application, click on the assets button.
You can choose between three different options:
To upload an image, choose it from your client via the upload button – a preview will be generated after uploading and also the path for referencing it later into an parameter of an image widget. In our screenshot the path is img/Wine.jpg.
By clicking on the red cross on the right side, you can delete the asset file.
To insert the assets into your user interface add, an image widget and write the path in the source field (src) in the Edit Area on the right.
_______________________________________________
Roles control who receives the messages. Any user who has the corresponding role and uses the Simplifier client at the time of sending a message will receive the message.
Enter the required roles in JSON notation as follows:
{ "roles": [ "<Role-1>", "<Role-2>", ... "<Role-n>" ] }
_______________________________________________
You can assign libraries to your application in the “UI Designer”.
Click on “Libraries” in the upper menu bar to see an overview of all the libraries that are currently used in your app.
If you click “+” you can add a library.
The icon left-handed computes all dependend libraries (of the App itself and its Widgets as well as all transitive dependend libraries).
_______________________________________________
You can configure asynchronous connectors in the Process Designer. The configuration works as same as with the synchronous connector.
When setting a connector to asynchronous, the assistant only offers connectors with asynchronous interfaces (Push, MQTT and OPC/UA).
The activity has two inputs “subscribe” and “unsubscribe” and one output.
subscribe | can be triggered with any output |
unsubscribe | can be triggered with any output |
output | will be triggerd on any async. message the Data Object receives |
_______________________________________________
This section contains the required request data Jsons for different connectors and the description of each individual field.
The following Connectors are described with an example:
_______________________________________________
The Authentication settings allow you to establish a connection to a LDAP or SAP system in order to sync external user to the Simplifier.
_______________________________________________
Every instance is backed up daily in the Simplifier Cloud.
Both files and a logical database backup (dump) are stored directly on the machine. These are held locally for 4 weeks. This is very useful when restoring a single Simplifier instance.
Furthermore, the Simplifier Cloud is image-based backed up every day. These backups are held for 14 days.
Should the system fail completely, we can initiate a complete restore at any time.
Type of backup | Backup interval | How long are the backups stored? |
tarball of files and a logical database backup | daily | 4 weeks |
image-based backup of the whole Simplifier Cloud | daily | 2 weeks |
_______________________________________________
Call for BROWSE operations (The name TIA_BROWSE_ALL_VARIABLES is the arbitrary chosen name for this call)
For the Browse Connector Call, you need to configure the “operationType ” and the “nodeId” (consisting of 2 parameter: identifier and namespaceIndex). Furthermore you need to define the operationTarget, a returnSet and filterSettings (optional).
operationType: Defines which operation you want to execute, in this case “BROWSE”.
Parameter Name: operations/arrayItem[0]/operationType
Constant Value: BROWSE
Data Type: String
nodeID: Defines the identification of the OPC/UA node. It is split in 2 Parameter:
operationTarget: You can browse references forward, backward or in both directions. Choose between the basic attributes (simple) or further ones, depending on the class (extended).
Parameter Name: operations/arrayItem[0]/operationTarget
Data Type: String
Constant Value: Choose between
returnSet:
Parameter Name: operations/arrayItem[0]/returnSet
Data Type: String
Constant Value: LIST
filterSettings (optional):
NOTE: The specific commands are NOT defined here!
Output parameters
You can return all Output Parameter like this:
Parameter Name: /
Data Type: String
If you want to get only selected Output Parameter, use the following syntax:
Parameter Name: operationsResult/[0]/browseResult/children/nodes/
Data Type: depends on the Parameter you want to be returned.
For now only the complete unformatted JSON will be returned.
_______________________________________________
To generate a PDF and manage templates, the role “pdfPlugin” has to be assigned to your User.
You can build a PDF Template by using HTML, CSS and Mustache. A live preview is provided, so you can see changes in real time.
The rendering is executed with wkhtmltopdf, therfore every html format and feature that supports the QT Webkit render engine is working.
With every Template, a stylesheet in LESS format is generated and will be embedded automatically. You can maintain this stylesheet via the same interface as the HTML template.
The inclusion of graphics (<img src=”…”>) and additional stylesheets (<link rel=”stylesheet” href=”…”>) is also supported.
These external asserts are retrieved via the “assets” slot of the AppServer (they should be uploaded there in advance). You can refer to them in the template with a relative filename (no “http://” prefix, no path, etc.!).
Example: <img src=”image.jpg”> (if the file was uploaded as “image.jpg”).
Furthermore, you can add expressions in mustache format. These “variables” are later replaced by values from the update file to a session.
The dynamic data is retrieved as a JSON string in the key-value-store with the key: “sessiondata/$session“.
($session = the session ID that is specified for the generation)
You can combine your PDF document with other PDFs or images from the key-value store.
For this purpose you can call the list of all ressouces you want to merge with the key “merge/$session” in the key-value store. The list should correspond to a JSON-Array, where the entries of the JSON-Array are the keys of the resources to be merged. For example: [“dokument1.pdf”, “document2.pdf”, “bild.jpg”].
The binary data of the corresponding documents should be filed in the key-value store under the keys “dokument1.pdf”, “document2.pdf” and “bild.jpg”.
If the list of merge resources is not found for a session or if the list is empty, the merge is skipped.
After a PDF has been successfully generated, the binary data is stored in the Key-Value Store under the key “pdf/$jobid.pdf“. ($jobid = the job ID, that will be returned after the generation has started)
If the generation can not be executed successfully due to an error, a fault reporting is stored under the key “pdf/$jobid.log” in the key-value store.
_______________________________________________
The input and output mapping of Business Objects works equivalent to the mapping of Connector Calls.
After selecting the right Business Object and the predefined script template, you can map the input and output parameters.
Function | Description |
Client-side | You can choose between client-side and server-side business objects. Read more about client-side business objects. |
Value Helper | By opening the value helper, an assistant opens that takes you to your Business Object. |
Show Busy Indicator | You have the possibility to configure if the UI is blocked by the busy indicator, or can configure which element on your screen should be blocked by it. |
Input Mapping | You can map variables, autofields, widget properties, and constants to the input parameter of your Business Object. |
Output Mapping | You can map the output parameter of your Business Object to variables and widget properties. |
The assistant offers all configured Business Objects that includes methods. You can search for the name of the Business Object. When selecting a Business Object, all methods are listed on the right-hand side.
_______________________________________________
You can use this Template to send emails within Business Objects.
The Tools mapper interface:
TOOLS.sendTemplateMail(json : String);
Parameter:
Parameter | Description | Type |
templateNamespace | The namespace of the Template | String |
templateName | The name of the Template | String |
emailCharset | Charset of the email to send | String |
receiver | The receiver email | String |
receiverCC | Optional, multiple cc emails | Array[String] |
subject | The subject of the email | |
data | Optional, any data | JSON-Object |
try
{
var
message = TOOLS.sendTemplateMail(
JSON.stringify(
{
templateNamespace:
"test"
,
templateName :
"demo"
,
emailCharset :
"UTF-8"
,
emailMime:
"text/html"
,
receiver : input.Receiver,
//receiverCC : ["", ""],
subject :
"Release 51 Demo"
,
data : {
Release :
"51"
// any data you want to use in the mustache template
}
}
)
);
output.message =
"Mail sent"
;
}
catch
(e) {
output.message = e.message;
output.success =
false
;
}
_______________________________________________
this.callBusinessObject(businessObjectName, method, payload, callback, showBusyIndicator, failOnError, failCallback, parametrized)
businessObjectName | the name of the Business Object |
method | name of the script template to be called |
payload | JSON object with parameters as required by the called script |
callback | function, which is called after the successful execution of the connector |
showBusyIndicator | boolean value that indicates whether the screen has to be blocked by a loading bar (true) or not (false) |
failOnError | boolean value that indicates whether the connector should be called in case of an error of the function passed via “failCallback” (false) or not (true) |
failCallback | function, which is called in case of an error in the connector, if false “failOnError” is passed |
parametrized | boolean value that indicates whether the called parameters in the payload according to the rules in the script template are to be verified (true) or not (false) |
_______________________________________________
The Simplifier allows you to create complex integrated applications up to a high degree solely through configuration. Nevertheless, at some point in time, advanced business logic might be required, which can’t be implemented merely by configuration. This is when Business Objects come into play.
Business Objects are implemented via Javascript. This way they integrate seamlessly into Simplifier applications. They enable you to write arbitrary business logic and interact with other Simplifier artifacts like connectors, plugins or other Business Objects. They can also be shared among different applications. Although written in Javascript, Business Objects execute on the server side, keeping possibly complex and time-consuming operations away from the client.
_______________________________________________
Our cloud infrastructure provider, T-Systems operates data networks for customers worldwide and processes data in its own data centers – data protection and data security have absolute priority. The ICT provider, therefore, has its services regularly audited by independent institutions and has itself certified that it complies with global standards and norms, for example through ISO certifications.
Here you will find an overview of the current certificates:
Certificate Description | Download |
Quality management according to DIN EN ISO 9001 | ISO 9001 |
Information security management according to ISO/IEC 27001 | ISO/IEC 27001 |
Business continuity management according to ISO 22301 | ISO 22301 |
Environmental management according to ISO 14001 | ISO 14001 |
Occupational health and safety management according to OHSAS 18001 | OHSAS 18001 |
Information security measures for cloud services according to ISO/IEC 27017 | ISO/IEC 27017 |
Protection of personal data in public clouds according to ISO/IEC 27018 | ISO/IEC 27018 |
Trusted cloud privacy profile for cloud services (TCDP) | Open Telekom Cloud |
Security of cloud service providers according to CSA CLOUD CONTROL MATRIX | CSA STAR |
Cloud service according to TÜV trust it requirements catalogue | Trusted Cloud Service |
Zero outage as a certified service process | Zero Outage |
Compliance management systems (CMS) according to IDW PS 980 | auditor’s certificate |
_______________________________________________
For security reasons, it is always a good idea to update your password regularly.
In order to change your password, you have to switch to the ‘Users‘ tile in the Simplifier dashboard. After that, search for the user whose password you want to change and click on the edit icon underneath ‚Actions‘.
You will be lead to the user details of the selected user. Now click on the ‘Send Password Link‘. You will receive an email with a link to change your password.
If you need help, please contact an admin.
If you’re an admin and want to change someone’s password, click on the ‚Password‘ tab in the upper left corner. Now all you have to do is enter the new password, confirm it and finally click on ‚Change Password‘.
_______________________________________________
Here you will find a checklist for all On Premise installations. You can check off the points when you’ve finished them. During this time, please do not reload this page.
Have a FQDN (Fully-Qualified Domain Name) for each instance of the D (Development) Q (QA /Test System) P (Productive) System | |
Set the 3 DNS entries for the 3 FQDN
|
|
Make sure that the Simplifier server reaches the Internet and make sure that the clients have access to the required ports of the Simplifier: 80 (TCP), 443 (TCP), 8090 (TCP) | |
Install the latest version of docker engine | |
Create or specify the Simplifier workspace, set the environment variables, and ensure that enough space is available. Also for future updates. We recommend at least 60 GB Storage. | |
Use the image from the Docker Hub “docker pull itizzimo/simplifier” or use the image provided by our Infrastructure Team | |
Provide the SSL Certificate and Intermediate Certificate. Best practice is a globally valid certificate issued by a trusted certification authority. | |
Start the Simplifier Docker by “docker run…” with the Simplifier Docker Image
$ docker run -v $SIMPLIFIER_DIR:/opt/simplifier/data \ -p 80:80 -p 443:443 -p 8090:8090 \ -d ––name simplifier docker.itizzimo.com/simplifier-onpremise Alternatively start the Simplifier Docker by “docker run…” with the Docker Hub command $ docker run -v $SIMPLIFIER_DIR:/opt/simplifier/data \ -p 80:80 -p 443:443 -p 8090:8090 \ -d ––name simplifier itizzimo/simplifier:latest |
|
Use the internal reverse proxy or your own external proxy. Take a look at the requirements | |
Contact your project manager or our sales team to get a license | |
To get Simplifier support the following requirements should be fulfilled:
|
|
Finally, the web socket should be checked on port 443 |
_______________________________________________
login/accept_sso2_ticket | 1 |
login/create_sso2_ticket | 2 (without certificate) |
icm/host_name_full |
(e.g. hostname.example.com) |
Every user needs the following permission object:
S_SERVICE
Attributes | Values |
SRV_NAME | Name of Webservice |
SRV_TYPE | Type of Webservice (HS) |
The following section documents the most common errors with possible solutions.
Q: What should I do when HTTPS/SSL is not available?
A: If you have problems with the connection set it from SSL to None
Q: What if the WSDL Consumer has problems parsing the WSDL?
A: Manually replace the string ws_policy in the WSDL with standard
Q: How can I monitor the error log of SAP Web services?
A: The error log can be viewed with transaction “srt_util”.
Q: How can I change the SAP web service login language?
A: The standard login language is also via SAP Webservices in English. Thus, all data determinations according to e.g.: Status texts, material text ect. always return in English language.
To be able to change it to German, the following prefix must be appended to the SOAP Webservice operation URL: “?sap-language=DE”
This does NOT mean the WSDL URL!
Q: How can I call the web service from another SAP client?
A: The web service operation call must be done with the parameter?sap-client=[client] so that the system can recognize the client.
Q: What if the Simplifier does not have access to the SAP system?
A: Check the following points:
Please make sure that there is a physical connection between the Simplifer (host) instance and the system. Firewall/Ports may need to be enabled to allow communication in both directions.
The Simplifier Docker or host system must be maintained with the correct network settings for on premise installations. This includes, for example, the setting for DNS servers.
_______________________________________________
The Data Type of default properties in application items can now be overwritten, but only domain types with the same basic type can be used.
You can find the settings in the Property Panel of the UI Designer. The button will open a popover, which lets you define the Data Type and the validation event. If the validation is enabled (checkbox), an indicator will be displayed. You can change the valueState and valueStateText as result.
In this example, we wanted to make sure, that the Input field will be filled with the correct data, a ZIP Code. Therefore we added the validation for the predefined Datatype “ZIP” (a String with exactly 5 numbers) on the change Event.
Now, if you open the application in the preview and type in anything else than 5 numbers, the valueState of the Input field would change to “ERROR” and the valueState text “Wrong Input” would be displayed.
_______________________________________________
You can access any methods of the Simplifier by using the Simplifier Object.
Simplifier.Connector.<ConnectorName>(payload: object, successCallback: function, busyFlag?: boolean, failOnError?: boolean, errorCallback?: function): void Simplifier.Connector.<ConnectorName>.<CallName>(payload: object, successCallback: function, busyFlag?: boolean, failOnError?: boolean, errorCallback?: function): void
var payload = {bindingName: "Binding", operationName: "MyOp", soap: {foo: "bar"}}; function onSuccess (data) { resolve(data); }; Simplifier.Connector.MySoap(payload, onSuccess, true, true); Simplifier.Connector.MySoap.myCall(payload, onSuccess, true, false, function () { console.log("something went wrong"); });
Simplifier.BusinessObject.<BOName>.<MethodName>(payload: object, successCallback: function, busyFlag?: boolean, failOnError?: boolean, errorCallback?: function, parametrized?: boolean = true): void
var payload = {leftOperand: 3, "operation": "add", rightOperand: 4}; function onSuccess (data) { resolve(data); }; Simplifier.BusinessObject.OtherBO.someMethod(payload, onSuccess, true, false, function () { console.log("something went wrong"); }, true);
Simplifier.ClientsideBusinessObject.<CSBOName>.<FunctionName>(payload: object, successCallback: function, busyFlag?: boolean, failOnError?: boolean, errorCallback?: function): void Simplifier.CurrentClientsideBusinessObject.<FunctionName>(payload: object, successCallback: function, busyFlag?: boolean, failOnError?: boolean, errorCallback?: function): void
var payload = {leftOperand: 3, "operation": "add", rightOperand: 4}; function onSuccess (data) { resolve(data); }; Simplifier.ClientsideBusinessObject.OtherBO.someMethod(payload, onSuccess, true, false, function () { console.log("something went wrong"); }); Simplifier.CurrentClientsideBusinessObject.someMethod(null, onSuccess, true, false, function () { console.log("something went wrong"); });
Simplifier.Plugin.<PluginName>.<SlotName>(payload: object, successCallback: function, busyFlag?: boolean, failOnError?: boolean, errorCallback?: function): void
var payload = {name: ""}; function onSuccess (data) { resolve(data); }; Simplifier.Plugin.contentRepoPlugin.listRepos(null, onSuccess); Simplifier.Plugin.contentRepoPlugin.createRepo(payload, onSuccess);
var sMySecretKey = "secret"; var oCrypted = CryptoJS.AES.encrypt("dontStealMyData", sMySecretKey); output.result = CryptoJS.AES.decrypt(oCrypted, sMySecretKey).toString(CryptoJS.enc.Utf8)
Take also a look at crypto-js.
_______________________________________________
The Code Designer is a web based development environment that can be used to write source code like in a normal IDE. Entered Code will be highlighted according to the programming language used (e.g. Javascript, HTML or CSS).
On the left side there is a Document tree view where all the files of an application are displayed in a structured hierarchy. New files can be created, uploaded or moved within the tree view.
All opened files are displayed in tabs and can thus be edited easily by switching tabs. The search function is used to search through code by keyword. Also change can be undone or redone with the Undo / Redo Buttons.
If you add or change code here, it can not be displayed in the edit mode of a user story (Process Designer). The connection is only unidirectional. Click on the “Download App” button to get the code file.
_______________________________________________
Collections represents multiple results of Structs. For example a databank request may deliver a list of addresses from numerous people.
To create a new Collection Type click on the “+” button.
You can define a unique collection name and a description.
By clicking on “Parenttype” a new pop up opens, where you can choose the parenttype from.
NOTE: A Collection can only reference to a Struct or single Domain Types.
After you have clicked on apply, the parenttype will be used.
_______________________________________________
A Simplifier application usually contains the following configurable components:
Component |
Part of Application |
Description |
Widget |
User Interface |
A widget represents a specific element in the User Interface like a checkbox or login screen. |
Screens |
User Interface |
A screen collects several widgets in a specific order to represent a certain process step or task. |
CSS Editor |
User Interface |
The CSS editor can be used to create a unique corporate design for your business application. |
Assets |
User Interface |
Assets can be used to add static content to your apps like images, videos or documents. |
Process Dashboard |
Process Logic |
Visual Workflow Builder to define the process workflow and business logic. |
Code Designer |
Code |
Add specific program code in multi-user WebIDE. |
_______________________________________________
Conditions give you the possibility to make the process flow dependent on the evaluation of certain expressions.
In such an expression, you can compare Autofields, Variables, an actual value of a widget or a given constant with each other and decide upon the result, if the process continues one way or the other. Or you might decide to continue the process only, if one condition holds and omit the alternative, which in turn results in a process stop at this stage.
If you double click on the shape, it will add a new condition. Alternatively you can click on the plus icon on the right.
The process pane contains a condition, that’s executed after the login button got pressed. The condition compares a widget value (value property of widget InputUsername) with the fixed constant value “admin”. This means, that the expression evaluates to true, if the input value of field username equals “admin”. In this case, the process flow leads to a navigation to screen “BusinessScreen”. If the username does not equal “admin”, the user will be navigated to the Screen “PrivateScreen”.
Selecting a widget for comparison is guided via a three-step dialog. It asks you to select the screen in the first step, then one of the widgets on this screen and finally the property of the widget that you like to read for the comparison:
Defining a constant value for comparison is even easier: you specify the data type via a selection in a dropdown box and set the value in the field below.
If you want to compare a Variable, every existing one in the Data Workbench will be shown within the list. You can switch between the tabs Base Types, Domain Types, Structs an Collections.
And you can select every generated Autofield for comparision as well.
_______________________________________________
A typical example for a Data Object is a previously defined connector call. An assistant offers all configured connectors that owns connector calls. You can search for the connector name or even the connector type. If you select a connector, all calls are listed on the right side.
Choose the required Connector and the Call you want to execute.
You have the possibility to configure if the UI is blocked by the busy indicator, or can configure which element on your screen should be blocked by it.
If you want to assign a connector call to a Data Object, you have to define the sources for the connector input (the request) and the destination for its output (the response). This is called the “Input Mapping” and “Output Mapping”:
Clicking one of these two buttons opens a new popup which allows you to connect widgets with the input or output attributes of a connector call. Independent of whether you’re defining the input or output mapping, you’ll always find the mapping sources in the left pane and the destinations on the right. If you define the input mapping, for example, you’ll find the list of widgets in the left pane and the available connector call request parameters on the right. Within the output mapping dialog, the widgets are on the right pane, as they are the destination of the received data. Below is an example for the input mapping screen:
In this example, the request of the selected connector call provides only a single input parameter, an ID field named “TechnischerPlatzId”. This input parameter is connected with the value of the widget “CustomerType”. This means, that once the Data Object is triggered, e.g. through a button press event, the connector will be called with the actual value of the widget “CustomerType” as request parameter.
You can choose the exact source that you want to use for the input parameter by double-clicking on the widget. It opens a list of all properties so you can choose the one you need as input.
_______________________________________________
The user interface for configuring a connector call is generic, thus it looks the same for all kinds of underlying types of connectors. Having the same interface for all kinds of connector calls is very convenient. But one drawback of this approach is, that some connectors require fixed parameters to be set, in order to work properly. This section tells you more about these details.
You can declare parameters of Connectors as optional.
When declaring a parameter as non optional, the validation of the call will fail if the parameter is not provided.
If you click on the data type field, a selector opens.
Number | Description |
1 | The currently selected data type. |
2 | In this filtering list of all data types, you can find manually and automatically built data types. Custom data types are only manual data types. When the dialog opens in an automatically generated connector call, the data types of the connector can also be selected. |
3 | Prefilter of base and domain types, structs and collections. |
4 | You can always step deeper in the structure to select a data type. |
_______________________________________________
In order to execute a connector call please use this code snippet:
this.callConnectorCall(connectorName, connectorCallName, payload, callback, showBusyIndicator, failOnError, failCallback)
connectorName | the name of the connector |
connectorCallName | the name of the connector call name |
payload | a JSON object with the required parameters for the call |
callback | function, which is called after the successful execution of the connector call |
showBusyIndicator | boolean value that indicates whether the screen has to be blocked by a loading bar during the call (true) or not (false) |
failOnError | boolean value that indicates whether the connector call should be called in case of an error of the function passed via “failCallback” (false) or not (true) |
failCallback | function, which is called in case of an error in the connector call, if false for “failOnError” is passed |
_______________________________________________
In the Connector Call overview you can find the assistant in the top right corner.
The assistant will open and helps you to create the Connector Call.
*Note: At the moment the Wizard is only available for SOAP and SQL Connectors.
In the first step you can select the operation you want to execute.
In the second step you can edit the name and description of the Connector Call.
With the SQL Wizard it’s easy to configure new Connector Calls based on SQL Connectors for MySQL and Oracle.
When opening the Wizard, all tables available for the schema are displayed.
You can search for your Table, and then select under “Actions” whether you want to select all columns (right icon) or only certain ones (left icon).
If you only want to select certain ones, click on the left icon. A new popup opens in which you can select the desired columns. Then click OK.
After you have selected the desired tables and, if necessary, their columns, you can edit the connector calls by clicking on “Edit Connector Calls”.
When you have edited the calls, click on “Create connectorcalls”.
_______________________________________________
Connectors define the connection (entry point) to an external system. Given such a connection, you might send several different requests to the connected system. We call one such concrete pair of request / response a “connector call”. In order to use a connector call in the edit mode of a user story (Process Designer), you must create at least one connector call for each connector.
_______________________________________________
In step three, you can add data to your Connector.
Each Connector has specific details that depend on the properties of the communication protocol.
_______________________________________________
You can choose between different Connector Types. A Connector Type represents the technical protocol.
Connector Type |
Description |
Push Notification | Sends Push Notifications over Websockets directly to Simplifier Clients or Simplifier Browser Apps without using Google or Apple’s Cloud services to support data privacy and protection. |
oData | oData Proxy for using oData v2 Services . Open Data Protocol (OData) is an open protocol which allows the creation and consumption of queryable and interoperable RESTful APIs in a simple and standard way. |
SOAP | Simple Object Access Protocol based on HTTP and XML Format. |
CSV | Read and/or write comma separated files on a local file store. |
MQTT Client |
Message Queue Telemetry Transport (MQTT) is a lightweight messaging protocol for small sensors and mobile devices, optimized for high-latency or unreliable networks. This Connector acts as a client and can publish or subscribe messages from a mqtt broker. |
Logging Write | This Connector can transfer the Simplifier application logs to a central monitoring tool / logwatch server. |
REST | Connector for HTTP REST Services. Representational State Transfer (REST) architecture uses standardized operations (GET, PUT, POST, DELETE) on web services. |
SQL | Database Connector for executing SQL Statements on a database schema. |
Email Connector for sending Emails over SMTPS (Simple Mail Transfer Protocol) with or without SSL Encryption. | |
OPC-UA | Open Platform Communication – Unified Architecture Connector, it connects to an OPC-UA server and performs READ/WRITE/SUBSCRIBE operations. For now READ/WRITE operations are supported through connector calls, here and Live-Value Monitoring through websockets, here. |
SAP RFC | Connector based on standard JCO SAP RFC Connector to call remote function blocks |
_______________________________________________
this.callConnector(connectorName, payload, callback, showBusyIndicator, failOnError, failCallback)
connectorName | the name of the connector |
payload | a JSON object with the required parameters of the call |
callback | function, which is called after the successful execution of the connector |
showBusyIndicator | boolean value that indicates whether the screen has to be blocked by a loading bar during the call (true) or not (false) |
failOnError | boolean value that indicates whether the connector should be called in case of an error of the function passed via “failCallback” (false) or not (true) |
failCallback | function, which is called in case of an error in the connector, if false “failOnError” is passed |
_______________________________________________
Connectors are used to retrieve data from backend systems and third-party sources and write back changed data into them. They can be used by a unique name within configured business applications or business objects. It represents the systems part of the simplifier.
Connector | Adresses a specific backend systems like SAP, Salesforce or a Database |
Connector Call | Brings a specific connector into action. It contains input and output parameters |
_______________________________________________
You can use this template to convert XML to/from JSON.
Simplifier.Util.xml2json(xml: string): string
Parses an XML string, converts it to JSON and returns the representing JSON string.
try{ var convertedJson = Simplifier.Util.xml2json("<xml></xml>"); output.json = convertedJson; output.message = "Convertion successful"; output.success = true; } catch (e) { output.message = e.message; output.success = false; }
Simplifier.Util.json2xml(json: string): string
Parses a JSON string, converts it to XML and returns the representing XML string.
try{ var convertedXML = Simplifier.Util.json2xml(JSON.stringify({attribute: "value"})); output.xml = convertedXML; output.message = "Convertion successful"; output.success = true; } catch (e) { output.message = e.message; output.success = false; }
_______________________________________________
To copy a Business Object, just click in the Overview of Business Objects on the ‘Copy Business Object’ Button.
After you have clicked on it, a pop-up appears in which you can specify the new name of the Business Object. Then click on ‘Save’.
Now the Business Object has been copied. All included Connectors, Plugins and other Business Objects as well as the Script Templates are available in the copy.
_______________________________________________
You can copy a connector call within a connector in the connector call overview by clicking the appropriate copy button.
By clicking the button a new pop up opens in which you can specify the name of the copied connector call. The default value is the name of the copied connector call added _copy.
Once you have assigned a name, click on the save button. Your connector call has been copied with all input and output parameters.
_______________________________________________
You can copy any Data Type of the Simplifier. The copy will have all attributes/fields and any tags given to the copied template.
Click on the copy icon and a new pop-up will appear.
By default, “_Copy” is added to the current Data Type Name. However, you can also assign a new name. Click ‘Save’ and the copy has been created.
_______________________________________________
You can copy Widgets and insert them on a different Screen or even another Application.
_______________________________________________
Please set up the following checkpoints before you create an app:
To create a new application, click on the Applications module. Then click on the “+” button on the top right to create a new business app:
The following dialog will appear:
Fill out the necessary fields analog to the table below:
App-Type |
Choose your Technology for your business app:
For more information, see the chapter Technology |
App-Name |
Unique app name like “SmartMaintenance” |
App-Description |
A short description of your app |
Author |
The Simplifier username of the app author |
Default Language |
Your default language for configuration – you can translate this language later via the language translation feature |
App-Transport-Name |
The name of the transport for transferring your configuration to another simplifier instance like a quality assurance system |
After the app creation you can configure it with the following tabs:
![]() |
Configure the User-Interface and mark all necessary events to design your workflow. |
|
![]() |
Define your workflow with simple visual events and actions. |
|
![]() |
Add additional javascript files to your app and extend it in web-based integrated development environment. |
_______________________________________________
Enter tile “Transports” on the Simplifier Dashboard and click on Transportcollection to define a new Transport or edit an existing one. This leads you to the overview page, which lists all existing Transports:
To create a new Transport, or edit an existing one, make sure you’ve got the “Transport Creation” permission associated to one of your roles. Click on “+” on in the upper right corner to create a new Transport from scratch or press the edit button beside one of your existing one to edit it. This leads you to a new page which allows you to define all Transport artifacts:
The upper part of the screen allows you to enter a name for your Transport.
The lower part of the screen is dedicated to the selection of the artifacts which shall be part of your Transport. The left pane lists all available features (Apps, Connectors, Roles, Business Objects, Datatypes, Widgets & Libraries) and allows you to search for specific ones. Ideally, the features of your app have an identical name part, so you can easily find all belonging features through the search bar. You can filter the list by clicking on “Name” or “Feature” and select e.g. only Widgets.
Select an artifact by checking the checkbox beside it. After clicking the right arrow, all selected artifacts are immediately listed in the right pane. (Attention: The “Application” feature represents only the cover of your app and its standard Widgets, not all your used features like e.g. customized Widgets, Business Objects or Connectors!
When you’re done, press the “Save” button in the upper right corner or “Cancel”, if you want to omit your changes.
_______________________________________________
If you choose to create a new OpenUi5 Widget, you have to take a look at the constructor details in its API reference.
Here you can find the OpenUi5 API of all Widgets and a description when to use them.
Let’s create a mobile version of a Panel. For starters search new sap.m.Panel in the API reference.
You will see the supported settings, in this case: Properties, Aggregations and Events.
For the first step name your Widget, write a short description and choose a category in the Widget tab.
In addition you’ve got now the possibility to add custom tags to the widget. You can search and filter for widget tags in the search field of the widget overview list and in the widget search field of the UI designer.
Click on the OpenUI5 tab to fill out the specific parameters.
The Widget Type has to be the same as the UI5 control name. In this case: sap.m.Panel
Fill in the template for the Widget. It represents a blueprint of the Widget which can be used by the Simplifier.
The OpenUI5 templates are written in JSON with Mustache placeholder syntax.
The Simplifier supports three different types:
The placeholderName will be used to declare properties, events, etc.. It is advisable to use the OpenUI5 names.
For SAP Controls (e.g. sap.m.BackgroundDesign) you can use the „String“ Data Type.
All attributes that are declared with a mustache value in the template, have to be declared in the properties / events / etc. area below as well, so you can work with them in the UI Designer later in the process. You can use constant values instead of mustache e.g. if you don‘t want a property to be editable.
If all properties are listed, you can set the Default Binding-Property which is the prioritized widget property used in the edit mode of a user story (Process Designer).
After hitting the “Save” button, you’ve successfully created a Panel Widget for your application.
_______________________________________________
There are two different options to create a Transport:
_______________________________________________
To create a new connector, click on the plus icon on the upper right corner. It opens a new pop up where you can enter the required and optional information.
Name | The connector needs a unique name. |
Connector Type | Set the technical protocol of the interface – see chapter Connector Types. |
Description | Add a description. |
Active | Set the connector active. You can see within the overview which connector is active. |
Timeout time (in seconds) | Set the time in seconds until the connector request will run. After the set timeout, the request will be discontinued. |
Result Type | Type of result from the connector request. It can either be a single result or multiple results (e.g. Array). |
Tags | You can add tags to your connector (e.g. the name of a project). |
You can add or select the login method for the specific backend systems. To select an existing login method, click on the corresponding field. It opens a drop down where you can select it.
If you want to create a new one, you can choose between using UserCredentials and SingleSignOn.
If you’d like to get an overview on your existing login methods and manage them, click on the “Logins” tab in the connector overview.
On the right side you can add data to your connector. Each connector has specific details that depend on the properties of the communication protocol. Read more on the following pages.
You can also copy an existing Connector. The complete configuration of the Connector, including its Connector Calls, is copied and created with the duplicate.
You can see which applications are using the Connector. For that click on the appropriate icon within the Connector overview underneath ‘Actions’.
It opens a new popup that displays all applications that uses the connector:
_______________________________________________
Business Objects are managed under the module “Business Objects”. The main screen lists all existing Business Objects in table form. On the top left you can switch between server-side and client-side Business Objects.
Press “+” in the upper right corner to create a new one from scratch. This fires up the following screen:
First, choose a name for your client-side Business Object, e.g. “MyNewBusinessObject” and set a description (optional). Add some tags, so you can search in the overviews and the UI Dsigner by the tags.
You may then select any Connector, Plugin, Server-side Business Object, Client-side Business Object or managed libraries on the left side. It opens a dialog where you can select it. Each selected item appears in the list below, from where you might also remove it again by clicking the delete icon underneath ‘Actions’.
When you’re done, leave the screen by hitting the “Save” button and return to the overview page. Your new Business Object appears in the table.
You can see which applications or interfaces are using the Business Object. For that click on the appropriate icon within the Business Object overview underneath ‘Actions’.
It opens a new popup that displays all used applications:
You can access your input parameters via oPayload.<myInputParameter>.
To use the output parameters you have to return an object that has your parameters as properties. E.g.
return { myOutputParameter : myOutputValue }
_______________________________________________
Business Objects are managed under the module “Business Objects”. The main screen lists all existing Business Objects in table form. On the top left you can switch between server-side and client-side Business Objects.
Press “+” in the upper right corner to create a new one from scratch. This fires up the following screen:
First, choose a name for your Business Object, e.g. “MyNewBusinessObject” and set a description (optional). Add some tags, so you can search in the overviews and the UI Dsigner by the tags.
You may then select any Connector, Plugin or other Business Object you want to refer on the left side. It opens a dialog where you can select it. Each selected item appears in the list below, from where you might also remove it again by clicking the delete icon underneath ‚Actions‘.
When you’re done, leave the screen by hitting the “Save” button and return to the overview page. Your new Business Object appears in the table.
You can see which applications or interfaces are using the Business Object. For that click on the appropriate icon within the Business Object overview underneath ‘Actions’.
It opens a new popup that displays all used applications:
_______________________________________________
To design your application, you can use CSS for styling with standard web cascading style sheets.
If you would like to learn more about CSS, take a look at the tutorials of the w3 schools.
After changing css properties you have to reload your application in the preview tab
To Do so please use the following shortcuts
Browser | Keyboard Shortcut |
Chrome on Windows | Ctrl and press F5 |
Chrome on Mac | ⌘ Cmd and ⇧ Shift and then press R. |
Firefox on Windows | Ctrl and press F5 |
Firefox on Mac | ⌘ Cmd and ⇧ Shift and then press R |
_______________________________________________
Go to CSV Connector Details for more information about the CSV Connector.
A CSV Connector can be configured in 3 different modes:
* READ: The connector can only read from the specified CSV file path, no write operations are permitted.
* WRITE: The connector can only write to the CSV file, but not read from it.
* READ/WRITE: The connector can read from the file and also write to it.
Currently, only the READ operation is implemented!
The CSV Connector Call for a READ operation requires 2 Input parameters: “action” and “resultmode“.
To execute a read operation, call the Connector with the parameter “action” and the constant value “read“.
Reading Connectors get the result as JSON array of arrays by default. There can be definied two “resultmode“parameter:
The Connector returns everything if you use “/” as Output parameter.
_______________________________________________
Path
Filepath and Filename to local .CSV File that should be written, relative to the current working directory of the application server. It is recommended to give an absolute path, so it doesn’t matter which directory is set as “Current Working Directory” from the appserver start script.
Delimiter
Delimiter of the columns that separates the values like comma or semicolon. This must be exactly one character, more than one character is not supported by the library.
**In order to use the tabulator character, the expression ‘\t’ can be used in the Admin UI.** If more than one character is specified, all but the first character will be discarded.
Charset
Character encoding used to read/write the file. If a charset is used that is unknown to the application server JVM, all read/write operations will fail.
Mode
Operation Mode of the Connector, either READ, WRITE or READ/WRITE – the CSV Connector can currently only read the referenced csv file.
Attention! Please make sure that the Simplifier application Server has the right permissions to access and read the file on the operating system level. |
Header
Activate the checkbox if the CSV File has a header in the first row.
Quote all Items
Activate the checkbox if all items should be quoted in terms of strings (“). Otherwise only values which contain the delimiter are put in quotes. This setting is irgnored when reading.
Go to CSV Connector Calls to configure the corresponding Calls.
_______________________________________________
It’s also possible to extend our interface with implicit enhancements
This feature is official documented on the sap wiki.
The second option is to use BADIS to enhance our Namespace.
To install the Simplifier SAP Connector, your SAP system should meet at least the following requirements:
_______________________________________________
The Simplifier Cloud is hosted in data centers of T-Systems Germany.
The locations of the twin-core data centers are:
Lübecker Str. 2 39124 Magdeburg Germany |
Am Schiens 10-11 39221 Bördeland/Biere Germany |
[vc_gmaps link=”#E-8_JTNDaWZyYW1lJTIwc3JjJTNEJTIyaHR0cHMlM0ElMkYlMkZ3d3cuZ29vZ2xlLmNvbSUyRm1hcHMlMkZkJTJGdSUyRjAlMkZlbWJlZCUzRm1pZCUzRDEwYWxiVVlCVTh1S0szRUhYa3lDb1JyeXltZDNXenRtdiUyMiUyMHdpZHRoJTNEJTIyMzgwJTIyJTIwaGVpZ2h0JTNEJTIyNDgwJTIyJTNFJTNDJTJGaWZyYW1lJTNF”]
_______________________________________________
Data Objects represent data sources and destinations, which can be triggered for execution. You can choose either a predefined Connector (you can activate it to asychronous) or Business Object.
Function | Description |
Asynchronous | If you select this option, the value helper assistant only offers asynchronous connectors. |
Value Helper | If you open the value helper, an assistant opens that guide you to your connector. |
Show Busy Indicator | You have the possibility to configure if the UI is blocked by the busy indicator, or can configure which element on your screen should be blocked by it. |
Input Mapping | You can map variables, autofields, widget properties and constants to the input parameter of your connector. |
Output Mapping | You can map the output parameter of your connector to variables and properties. |
All configured parameters has an indicator if it’s mandatory.
If you haven’t map all input parameters of a data object that has been marked as mandatory, the following warning will appear:
_______________________________________________
The module “Data Types” is the central way to define different types of data, structures and collection of Data Types and their validation rules.
Data Types are a way to ensure data are sent and received in the right type format to and from the backend systems.
With this feature, you can define data definitions to validate your data with client and server-side validation to prevent security issues and backend saving problems due to wrong data formats or hacker attacks.
Data Types can be assigned to widgets and connector calls to validate input and output data.
There are six Base Data Types defined in the Simplifier:
Date |
Date Format |
String |
Characters, numbers and any other symbols from the Unicode Character Set |
Boolean |
True or False |
Integer |
Positive and negative numbers like -2, -1, 0, 1, 2 … |
Float |
Numbers with precisions like 2,503 |
Any |
Accept all kind of Data Types even heterogeneous Arrays. |
With the “Data Types” tile, you are able to enhance the Base Types and define your own logic.
The new Data Types are split into three different types:
You can assign tags to Data Types to find them easily in the searchbar. Already existing tags are suggested including tags of widgets.
_______________________________________________
Within the Data Workbench, you can administer global Events, Variables and Auto Fields that you want to use cross-functional in the User Stories.
*PLEASE NOTE*
The Data Workbench is no longer available for applications using AngularJS.
If you build your application with Angular 2, there are no limitations.
_______________________________________________
To delete a template, you need the following parameter:
URL | /client/1.0/PLUGIN/pdfPlugin/adminTemplateDelete | |
Input-Parameter | Name | Template name |
Output-Parameter | None |
Example input::
{
"name"
:
"templatename"
}
Example output:
{
"success"
:
true
}
_______________________________________________
A Simplifier application can be deployed in different ways. You can deploy to your local machine for development and testing, you can deploy to the Simplifier cloud, Cloud Foundry-based platforms, Azure, AWS, SAP Cloud, or a server you configured yourself.
![]() |
||
![]() |
![]() |
![]() |
Cloud installations are hosted and maintained by iTiZZiMO. Each instance is reachable via a unique DNS name:
https://<instance-name>.simplifier.io
On-premise installations are hosted by our customers, on their own infrastructure. This scheme is especially useful if the Simplifier shall be integrated into a closed network infrastructure.
For Installation of the Simplifier, the following persons and things are required:
Use the following checkpoints for an successful installation
Checkpoint | Description |
![]() |
System-Requirements are clear |
![]() |
Domain-Name for Development, QA and Productive Systems are clear |
![]() |
SSL Certifcates for all 3 Instances is available |
![]() |
Firewallports 443 and 587 are open |
![]() |
Backendsystem is reachable via Supported Protocols |
_______________________________________________
The Simplifier is able to recognize the device type that is using the application, so you can assign different functionalities to it, e.g. different designed login screens for mobile or wearable devices.
At first you need to create a new autofield type with the autofield type “Device” and the characteristic “Device Type”. How to create autofields, you can see here.
Within the Process Designer, you can refer to this autofield using a condition. Select the corresponding auto field and assign it to a constant (string).
Choose between:
Please pay attention to lower case!
_______________________________________________
The Simplifier is also available on Docker Hub.
Create the directory which will host all external user-specific data:
$ mkdir -p /home/simplifier/data
$ export SIMPLIFIER_DIR=”/home/simplifier/data”
Install SSL certificates:
$ mkdir -p $SIMPLIFIER_DIR/certs
$ cp <certificate.pem> SIMPLIFIER_DIR/certs/default.crt
$ cp <keyfile.pem> SIMPLIFIER_DIR/certs/default.key
Run docker:
Alternative 1: with SSL/Certificates
$ docker run -d -v $SIMPLIFIER_DIR:/opt/simplifier/data \
-p 80:80 -p 443:443 -p 8090:8090 \
––name=simplifier itizzimo/simplifier
Alternative 2: without SSL/Certificates
$ docker run -d -v $SIMPLIFIER_DIR:/opt/simplifier/data \
-p 80:8080 -p 8090:8091 \
––name=simplifier itizzimo/simplifier
_______________________________________________
Referenced to the official Docker instructions.
Note: This installation instructions is based on the example of the operating system Ubuntu 16.04 LTS.
$ sudo apt-get update
$ sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Verify that you now have the key with the fingerprint 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88, by searching for the last 8 characters of the fingerprint.
$ sudo apt-key fingerprint 0EBFCD88 pub 4096R/0EBFCD88 2017-02-22 Key fingerprint = 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 uid Docker Release (CE deb) <docker@docker.com> sub 4096R/F273FCD8 2017-02-22
Use the following command to set up the stable repository. You always need the stable repository, even if you want to install builds from the edge or test repositories as well. To add the edge or test repository, add the word edge or test (or both) after the word stable in the commands below.
Note: The lsb_release -cs sub-command below returns the name of your Ubuntu distribution, such as xenial. Sometimes, in a distribution like Linux Mint, you might have to change $(lsb_release -cs) to your parent Ubuntu distribution. For example, if you are using Linux Mint Rafaela, you could use trusty.
$ sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable"
$ sudo apt-get update
$ sudo apt-get install docker-ce
_______________________________________________
Docker for Mac is the Community Edition (CE) of Docker for MacOS. To download Docker for Mac, head to Docker Store.
README FIRST for Docker Toolbox and Docker Machine users
If you are already running Docker on your machine, first read Docker for Mac vs. Docker Toolbox to understand the impact of this installation on your existing setup, how to set your environment for Docker for Mac, and how the two products can coexist.
default
machine (if one exists) to the new Docker for Mac HyperKitVM. When you are running Docker for Mac, you do not need Docker Machine nodes running at all locally (or anywhere else). With Docker for Mac, you have a new, native virtualization system running (HyperKit) which takes the place of the VirtualBox system. To learn more, see Docker for Mac vs. Docker Toolbox.
sysctl kern.hv_support
Note: If your system does not satisfy these requirements, you can install Docker Toolbox, which uses Oracle VirtualBox instead of HyperKit.
Docker.dmg
to open the installer, then drag Moby the whale to the Applications folder.Docker.app
in the Applications folder to start Docker. (In the example below, the Applications folder is in “grid” view mode.)Docker.app
with your system password after you launch it. Privileged access is needed to install networking components and links to the Docker apps.The whale in the top status bar indicates that Docker is running, and accessible from a terminal.Congratulations! You are up and running with Docker for Mac.
_______________________________________________
Referenced to the official Docker instructions.
Note: This installation instructions is based on the example of the operating system Ubuntu 16.04 LTS.
$ sudo apt-get update
$ sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Verify that you now have the key with the fingerprint 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88, by searching for the last 8 characters of the fingerprint.
$ sudo apt-key fingerprint 0EBFCD88 pub 4096R/0EBFCD88 2017-02-22 Key fingerprint = 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 uid Docker Release (CE deb) <docker@docker.com> sub 4096R/F273FCD8 2017-02-22
Use the following command to set up the stable repository. You always need the stable repository, even if you want to install builds from the edge or test repositories as well. To add the edge or test repository, add the word edge or test (or both) after the word stable in the commands below.
Note: The lsb_release -cs sub-command below returns the name of your Ubuntu distribution, such as xenial. Sometimes, in a distribution like Linux Mint, you might have to change $(lsb_release -cs) to your parent Ubuntu distribution. For example, if you are using Linux Mint Rafaela, you could use trusty.
$ sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable"
$ sudo apt-get update
$ sudo apt-get install docker-ce
_______________________________________________
Docker for Windows is the Community Edition (CE) of Docker for Microsoft Windows. To download Docker for Windows, head to Docker Store.
If your system does not meet the requirements to run Docker for Windows, you can install Docker Toolbox, which uses Oracle Virtual Box instead of Hyper-V.
docker-machine
(including the default
one typically created during Toolbox install) no longer start. These VMs cannot be used side-by-side with Docker for Windows. However, you can still use docker-machine
to manage remote VMs.Looking for information on using Windows containers?
Docker for Windows Installer.exe
), you can get it from download.docker.com. It typically downloads to your Downloads folder
, or you can run it from the recent downloads bar at the bottom of your web browser.Docker.app
with your system password during the install process. Privileged access is needed to install networking components, links to the Docker apps, and manage the Hyper-V VMs.Docker does not start automatically after installation. To start it, search for Docker, select Docker for Windows in the search results, and click it (or hit Enter).
When the whale in the status bar stays steady, Docker is up-and-running, and accessible from any terminal window.
If the whale is hidden in the Notifications area, click the up arrow on the taskbar to show it. To learn more, see Docker Settings.
If you just installed the app, you also get a popup success message with suggested next steps, and a link to this documentation.
When initialization is complete, select About Docker from the notification area icon to verify that you have the latest version.
Congratulations! You are up and running with Docker for Windows.
_______________________________________________
A Domain type represents a single Data Type that inherits from a Base Type like String, Integer, Float, Date etc. and can include different properties.
For example a ZIP Code is an inherited type of string with the property of a maximum of 5 chars length.
To create a new Domain Type click on the “+” button.
Enter a unique Name for the Domain Type and an optional Description.
Also select a Parenttype to inherit from by clicking on the appropriate field.
In the area below you can set the properties of your Data Type:
Min
Minimum length of a String, minimum number of a range, earliest date of a date range.
Max
Maximum length of a String, maximum number range, latest date of a date range.
RegEx
Regular expression to validate this Domain Type – for more information see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp.
Possible Values
Simple JSON Array of Strings repesenting literals of chosen Base Type.
Nullable
If activated, this value can be empty (null).
_______________________________________________
The options „Don’t overwrite“ and „Overwrite“ are going to import the data to your system.
By choosing “Don’t overwrite”, only new features are uploaded. Every feature with the same name like an existing one is skipped.
_______________________________________________
This section offers various Downloads as examples on how to use different features of the Simplifier.
If you have a problem building your App, you can import a fitting Transport to your Simplifier instance and reproduce the steps.
_______________________________________________
For each step in the development and update process of the Simplifier, an independent instance should be used.
Here we would like to give you an example for deploying a DQP system on three virtual machines.
_______________________________________________
A “Dry run” analyzes the content of the file and displays a list of all features.
It does not import the data so you can simply test how the transport would work out.
_______________________________________________
To edit a PDF template, you need the following parameter:
URL | /client/1.0/PLUGIN/pdfPlugin/adminTemplateEdit | |
---|---|---|
Input-Parameter | Name | template name |
Data | New template content (Base64-coded) | |
Stylesheet | Content of the LESS Stylesheets (Base64-coded, optional) | |
PreviewJson | Content of the sample data in JSON format (Base64-coded, optional) | |
Output-Parameter | None |
{
"name"
:
"templatename"
,
"data"
: "SGFsbG8gV2VsdA==\",
"stylesheet: "
SGFsbG8gV2VsdA==\",
"previewJson"
: "SGFsbG8gV2VsdA==\"
}
{
"success"
: true
}
_______________________________________________
The Email Connector Call requires 3 input parameters to be defined:
receiver | The email address of the receiver. |
subject | The subject of your message. |
msg | The message itself. |
All Data Types should be set as String.
There are 3 optional parameters that can be configured as well:
receiverCC | The email address of the copy receiver. | String |
receiverBCC | The email address of the blind copy receiver. | String |
attachments | A list of all attachements. | List[ |
_______________________________________________
SMTP host
Hostname of SMTP Server
SMPT port
Port of SMTP server
SMTP authentication
If enabled, the client attempt to authenticate the user using the AUTH command. Default to false.
SMTP StartTLS
If activated, it enables the use of the STARTTLS command (if supported by the server) to switch the connection to a TLS-protected connection before issuing any login commands. Note that an appropriate trust store must configured, so that the client will trust the server’s certificate. Default to false.
_______________________________________________
Encodes a string to a base64 string.
Simplifier.Util.encodeBase64(string: string): string
Example:
try{ var encoded = Simplifier.Util.encodeBase64("String to encode"); output.b64 = encodedD64; output.message = "Encoding successful"; output.success = true; } catch (e) { output.message = e.message; output.success = false; }
Decodes a base64 string.
Simplifier.Util.decodeBase64(json: string): string
Example:
try{ var decoded = Simplifier.Util.decodeBase64(encoded); output.b64 = decodedBase64; output.message = "Decoding successful"; output.success = true; } catch (e) { output.message = e.message; output.success = false; }
_______________________________________________
You can maintain enumeration for Widget properties. Enumerated properties can only hold the defined values and will be displayed as selection in the UI Designer.
In order to define the enumerations you have to add them in an Array notation to the default value of the property. It is not necessary to set the values in quotes.
There are different predefined types of buttons in OpenUI5. The properties can be maintained as a list in the widget mask. In our example, we look at all different button types in the OpenUi5 API Reference and transfer them into the widget edit mask with the appropriate syntax: [typ1, typ2].
_______________________________________________
Each workflow in the Process Designer starts with an event. Click on the Event element under “Activities” on the left pane and drag & drop it into the drawing area.
If you double click on the shape of the activity, the event selection assistant opens. You can also open it by clicking right underneath “Subscribe event” / “Publish event”, an Event selection assistant will be open. It guides you to your required Event. When subscribing an Event, you can select Events from three categories: Screens (Widget Events/Screen Events), Custom Events and System Events. Each category is sorted and searchable.
If you want to use your Event in the User Story you are currently working in, select one of the Events under the tab “Subscribe Events”.
The assistant considers every Event managed by the application.
It is only possible to publish Custom Events. The Assistant is aware of this and only displays this category when you define your publishing activity.
If you want to make an Event usable in another Stories, create a new Custom Event under the tab “Publish Event”. Then you can subscribe to it in another User Story. A shorcut for creating Custom Events can be found in the top right-hand corner.
You have a process in User Story 1 that contains a condition to check if an Input field is filled out after clicking on a “Login” Button. Afterwards, the User should be navigated forward to the next Screen.
Imagine you have an extra User Story exclusively for the whole Navigation of your App. So naturally you want the end of the Event from User Story 1 (the Navigation) displayed in User Story 2.
Therefore we published the new custom Event “LoginButton” in User Story 1 and subscribed to it in User Story 2.
User Story 1:
User Story 2:
Published Events can be maintained in the Data Workbench.
_______________________________________________
As an example, we would like to show a pdf document as a native mobile action after clicking on a button in a business application.
Add a button to your screen in the UI Designer.
Edit your user story and add the activity “Event” and “Script” to your working area. Assign your button (press) to the Event and click on “Script” to edit the JavaScript code.
To view a pdf document, you need the Cordova Plugin “File Transfer” and “Document Viewer“. Open their documentation and head down to “3. Using the Plugin”. Here you can find the necessary JavaScript Code. Add it to your Script.
In this example:
var options = { title: "Title", documentView : { closeLabel : "close" }, navigationView : { closeLabel : "close" }, email : { enabled : false }, print : { enabled : false }, openWith : { enabled : false }, bookmarks : { enabled : false }, search : { enabled : false }, autoClose: { onPause : false } } function onPossible(){ window.console.log('document can be shown'); //e.g. track document usage } function onMissingApp(appId, installer) { if(confirm("Do you want to install the free PDF Viewer App " + appId + " for Android?")) { installer(); } } function onImpossible(){ window.console.log('document cannot be shown'); //e.g. track document usage } function onError(error){ window.console.log(error); alert("Sorry! Cannot show document."); } function onShow(){ window.console.log('document shown'); //e.g. track document usage //reset baseurl document.getElementsByTagName('base')[0].href = temp; } function onClose(){ window.console.log('document closed'); //e.g. remove temp files } function onMissingApp(id, installer) { if(confirm("Do you want to install the free PDF Viewer App " + appId + " for Android?")) { console.log("trigger installer"); } } var fileTransfer = new FileTransfer(); var uri = encodeURI("https://projects.simplifier.io/appDirect/Xenon_OPC_UA_Consolidated/data/Parametrierung_Dosiereinheit.pdf"); var fileURL = cordova.file.cacheDirectory + "asdf.pdf" //save current base var temp = document.getElementsByTagName('base')[0].href; //download file fileTransfer.download( uri, fileURL, function(entry) { console.log("download complete: " + entry.toURL()); //set base to local to make it work console.log("resetting base"); document.getElementsByTagName('base')[0].href = ""; cordova.plugins.SitewaertsDocumentViewer.canViewDocument( entry.toURL(), 'application/pdf', options, onPossible, onMissingApp, onImpossible, onError); cordova.plugins.SitewaertsDocumentViewer.viewDocument( entry.toURL(), 'application/pdf', options, onShow, onClose, onMissingApp, onError); }, function(error) { console.log("download error source " + error.source); console.log("download error target " + error.target); console.log("download error code" + error.code); }, false );
Save and deploy the app.
_______________________________________________
You can use the execution log to trace the execution of e.g. connectors.
The following type of entries are logged:
Type | Description |
Open App | When the direct path to an app is opened (appDirect). |
Download App | When downloading the app to the client (user context is provided). |
Connector Execution | When using a connector directly, the execution and payload will be logged. |
Connector Call Execution | When a connector call is invoked. All parameters, even the constant parameters are logged. |
Business Object Execution | When using a business object, the payload and parameters are logged. |
Plugins | Plugins which are called by the old akka interface. |
Asynchronous Connectors | When subscribing and unsubscribing a connector. |
Job Execution | Every execution of the job. |
Any above | Any exception by executing an artefact above. |
_______________________________________________
To fetch a PDF template, you need the following parameter:
URL | /client/1.0/PLUGIN/pdfPlugin/adminTemplateFetch | ||
---|---|---|---|
Input-Parameter | Name | Template name | |
Output-Parameter | Value | Template | HTML Template Content (Base64-coded) |
Stylesheet | Content of the LESS Stylesheets ((Base64-coded, optional) | ||
PreviewJson | Content of the sample data in JSON format (Base64-coded, optional) |
{
"name"
:
"templatename"
}
{
"success"
:
true,
"value": { "template": "SGFsbG8gV2VsdA==\", "stylesheet:"
SGFsbG8gV2VsdA==\"
"previewJson": "SGFsbG8gV2VsdA==\" } }
_______________________________________________
The Logs & Monitoring Tile uses all search features of the backend (i.e. pagination or filtering).
On the left-hand side you can set filters.
You can choose between the following filters.
Filter | Function |
User | Filter for specific user actions. |
Log Level |
Filters based on the severity of the message: INFO, WARNING, ERROR. |
Category |
The Categories as shown in the tabs: Customize, User, Execution, System, Mobile, Transport, File. |
From | From Date. |
Until | Until Date. |
In the logs on the right-hand side you can click a detail button, which will open further information.
_______________________________________________
A fully qualified domain name (FQDN) is sometimes also referred to as an absolute domain name.
Development | dev-yourcompany.simplifier.io |
Quality Assurance | qa-yourcompany.simplifier.io |
Productive | yourcompany.simplifier.io |
Development | dev-simplifier.yourcompany.com |
Quality Assurance | qa-simplifier.yourcompany.com |
Productive | simplifier.yourcompany.com |
_______________________________________________
This Transport provides all components you need to do the Frontend Exercise course.
It contains:
_______________________________________________
Here you will find general instructions about Simplifier deployment:
_______________________________________________
We support you with on-premise installations of the Simplifier on one of his own instances. To do that, we deliver a prepared Docker image to you. The image comes pre-configured and contains all the required components, including the Simplifier server in its most recent version.
The target instance must fulfill the following requirements:
The Simplifier MacOS Deployment is not recommend for production use, because of the limited support for container |
The Simplifier Windows Deployment is not recommend for production use, because of the limited support for container |
Depending on what kind of maintenance service level has been defined, we might need access to your machine in order to install updates or analyze logs. In this case, the target machine should fulfill the following additional requirements:
_______________________________________________
Auto Fields are automatically computed / filled fields. You can use them e.g. if you want to greet the user who is logged in with his/ her actual name or load the version number.
You can declare Autofields from five categories
Category | Charactersistic | Description | Parameters |
Application | Name | The name of the Application. | – |
Version | The current version of the Application. If the App is not yet released, it is stated as “n/a” |
– | |
User | Name | The currently logged in user name. | – |
URL | Query Parameter | A freely definable URL Query Parameter which will be provided in the App. | Name of the Parameter |
Host | The domain/hostname can be read out in a configuration. | – | |
Device | Online | Holds the current connection state. | – |
Mobile Client | Tells you if your Application is running on the Cordova Client. | – | |
Screen orientation | The screen orientation is set. | – | |
Device Type | The Autofield can hold this values: desktop, phone, tablet, watch and smartglass. | – |
You can use Auto Fields within a Data Object. In this example, we created an Auto Field that automatically gets your user name. Then we mapped it with the Input Parameter “userName” of a preconfigured Business Object.
We configured some more Auto Fields like “applicationVersion” or 2 URL Parameter. The result is shown below:
At first, you can see the former way of typing in the information by hand. On the second Screen, we used the Auto Fields and you get the information automatically, simply by clicking on the button.
_______________________________________________
Global Events can be imagined as tunnels which connect different User Stories or processes. If you publish an Event, you open the entrance to the tunnel and by subscribing to this particular Event, you create the exit of the tunnel. This enables you to jump between the Stories and helps you to have a clearly laid out working space.
Go to Events for an example use of global Events.
_______________________________________________
You can use global Variables as a container to buffer data. E.g. if a Connector returns a lot of data and you would like to use some of it later in your work process, you can save the parameter as Variables and map them later.
You can reference Variables in Data Objects as In- or Output parameter. To do so, drag a Variable (that you’ve created previously in the Data Workbench) from the toolbar in the mapping dialog.
_______________________________________________
Here you will find general and Simplifier specific abbreviations, technical terms and their meaning.
_______________________________________________
A group contains several users and could be used for workflow logic in business apps like informing a team via email or push notification about a certain event or task.
Details View of a Group
To create a new group you have to specify a unique name and an optional description e.g. for a team or special task force group.
To add users, click into the “Add User to Group” Field and search for specific usernames. Mark several users and click OK to add them.
_______________________________________________
Start the Simplifier container:
$ docker start simplifier
Stop the Simplifier container:
$ docker stop simplifier
Restart the Simplifier container:
$ docker restart simplifier
Create a backup of the complete Simplifier data directory, e.g.
$ docker stop simplifier $ tar cvzf simplifier_backup.tar.gz /home/simplifier
In case of updates, we will prepare a new docker image for you, preserving your personal settings. Please download the image to a temporary directory of your choice (e.g. /tmp) and change into the directory. Finally unpack and load it, as described in steps 3-4 in the installation instruction.
To perform the update, proceed as follows:
Take care NOT to remove your data directory /home/simplifier/data !
$ docker stop simplifier $ docker rm simplifier $ docker run ––name simplifier {additional options as in step 6 before}
_______________________________________________
OEM | Hardware Description | H/W Revision | Connector Type |
HARTING | HARTING IIC MICA (Modular Industry Computing Architecture) makes it possible to temporarily save, evaluate and process data in the immediate vicinity of machinery and equipment. With its modular open platform, the HARTING IIC MICA can be customised with custom hardware, software and interfaces – to suit your individual requirements for Integrated Industry. | All Revisions | MQTT Client |
Sartorius | Cubis Individual Balance | All Revisions | HTTP REST |
_______________________________________________
You can design your screens individually for different devices, e.g. a login screen that is optimized for mobile phones and one for smartwatches.
Simply select as screen property the devices you want to address and e.g. create a second screen for the alternatives.
Now you can filter your screens and work precisely on one at a time.
_______________________________________________
To rename screens, select it and change the ID within the properties section.
Use the Description field to comment and annotate the screen. This helps to identify the purpose of the screen later on.
_______________________________________________
In the follwing sub-sites, you can get some information on how to use Widgets in the UI Designer, e.g. adding an Icon or changing the order of the Widgets.
_______________________________________________
The logic of a Business Object is implemented via Script Templates. Each Business Object can hold as many Script Templates as wanted. Click on the “Script” Icon to add some Templates.
Creating a Script Template involves writing a method via JavaScript and editing parameters. In the Script Editor you can code logic that can be called in the edit mode of a user story (Process Designer).
The content corresponds to the inner body of a Javascript function. In other words: your main code block must not be wrapped into a separate function definition, but rests on the top level context. It’s nevertheless possible to define sub-functions on top of your main code block.
It’s best practice to wrap your main code block in a try-catch-block to handle possible errors.
In the toolbar above you have several possibilities: undo, redo, search, search and replace, format code and settings.
This example reads a name which is provided to the Business Object as an input parameter, compiles it into a greeting message and writes the result to the output.
Take a look at the try-catch-block surrounding the main code section:
If no error occurs, the upper part of the code inside the “try”-section will execute and return the greeting message and output.success = true. However, if any error occurs, the function will jump down into the “catch” section and return output.success = false and assign any details of the failure to attribute output.error.
In order to use the Script Template correctly, you have to add the same Input and Output parameters you used in the payload. Those parameters will be shown in the mapping dialogs in the edit mode of a user story (Process Designer). Please note the correspondent handling of in- and output through the (JSON) objects “input” and “output”. Both of them may carry arbitrary attributes.
In this example the object “input” carries the attribute:
The “output” object carries the attributes:
Validate
You can validate the Input and Output parameter in the backend. It validates:
If the validation is not successful, the client is notified of all failed validations and it’s written to the Business Object log or System log at the same time.
For every new Business Object, this flag is set by default. Already existing Business Objects do not have this checkbox flagged to guarantee the compatibility.
*NOTE* You have the possibility to declare parameters as optional. When declaring a parameter as non optional, the validation will fail if the parameter is not provided.
_______________________________________________
To import a file to your Simplifier instance click on the “Import Transport” tile. You will be forwarded to an import overview page.
Choose your file you want to import. If you select ‘Dry Run’, it simulates the import.
If the transport works correctly, you can import it with the option ‘Overwrite’. When certain artifacts already exist and you do not select ‘Overwrite’, only the new artifacts are transported.
_______________________________________________
To use the pdf Plugin, you have to configure it first.
Copy the file “settings.conf.dist” from the directory “plugins/pdfPlugin/src/main/resources”, save it as “settings.conf” and adjust it as follows:
In order to start the conversion, you need to install the program wkhtmltopdf on your operation system. The path to the wkhtmltopdf executable must be stated in the “settings.conf” file. Furthermore you need two folders, one to file your template and the other for the temporary data during the conversion. You can either use relative or absolute paths for the folders.
For example:
pdfPlugin { storageDir = "templates" tempDir = "tmp" wkhtmltopdf = "C:/Program Files/wkhtmltopdf/bin/wkhtmltopdf.exe" } ....
NOTE:
If you use wkhtmltopdf on a Linux without the X11 Server, the error “wkhtmltopdf: cannot connect to X server” may occur.
In this case you need to install the program “xvfb” via the package manager to simulate the X11 server.
Create a wrapper (e.g. /usr/local/bin/wkhtmltopdf-xvfb) for the “wkhtmltopdf” program and write the path in the PdfPlugin Config.
<#!/bin/bash> xvfb-run --server-args="-screen 0, 1024x768x24"/usr/bin/wkhtmltopdf$*
The Plugin is located in the directory: plugins/pdfPlugins. It can be activated with the SBT/Activator via a “run” command. The STDIN command “stop” ends the Plugin execution.
You can adapt the logback-configuration file “plugins/pdfPlugin/src/main/resources/logback.xml” to configure the log output or display it in another file.
_______________________________________________
We always prepare an all-in-one Docker image for our customers which contains all required components.
Given a target machine that matches the requirements described in the previous chapter, the installation is quite easy:
1. Create the directory which will host all external user-specific data:
$ mkdir -p /opt/simplifier/data $ export SIMPLIFIER_DIR="/opt/simplifier/data"
2. Copy the downloaded file with ending .tar.gz to a temporary directory on the target machine, e.g. /tmp and cd to this directory.
$ wget -O <filename>.tar.gz
3. Unpack the file in place:
$ tar xzvf <filename>.tar.gz
You will get two files: one readme.txt and the docker image with the ending .tar.
4. Inside the directory which contains the unpacked file, run the following commands as root- (super-) user:
$ docker load -i <imagefile.tar>
5. Install SSL certificates:
$ mkdir -p $SIMPLIFIER_DIR/certs $ cp <certificate.crt> $SIMPLIFIER_DIR/certs/default.crt $ cp <keyfile.key> $SIMPLIFIER_DIR/certs/default.key
6. Run docker image:
Alternative 1: with SSL/Certificates
$ docker run ––name simplifier -v $SIMPLIFIER_DIR:/opt/simplifier/data \ -p 80:80 -p 443:443 -p 8090:8090 \ -d docker.itizzimo.com/simplifier-onpremise
Alternative 2: without SSL/Certificates
$ docker run ––name simplifier -v $SIMPLIFIER_DIR:/opt/simplifier/data \ -p 80:8080 -p 8090:8091 \ -d docker.itizzimo.com/simplifier-onpremise
7. In case you want to install from DockerHub, use itizzimo/simplifier as image suffix. The docker engine automatically downloads the image from DockerHub and you can skip step 2., 3. and 4.
Example without SSL/Certificates:
$ docker run ––name simplifier -v $SIMPLIFIER_DIR:/opt/simplifier/data \ -p 80:8080 -p 8090:8091 \ -d itizzimo/simplifier
8. Open your browser
Now use your browser at your Client Computer to access http(s)://<IP> or <FQDN>/UserInterface. The Simplifier will prompt a license dialog. After pasting that license
you can start configuring Apps in the AdminUI.
_______________________________________________
Sometimes it is necessary to add an extra library to your app, e.g. if you want to display some special charts. You can upload and manage those external libraries under the “Libraries” tab in the Application tile.
If you want to know how to implement them into your application, go to “Assigning Libraries To Apps”
In the list overview you get information about:
The Simplifier provides the following libraries by default:
App Technology | Library | Version | Type |
UI5 | OpenUI5 | 1.38.2 | Direct |
AngularJS | AngularJS | 1.4.7 | Direct |
Angular | Angular Material | 1.0.0-rc4 | Direct |
Angular | Angular-Fittext | 3.3.3 | Direct |
Angular | Angular-PDF-Viewer | 0.2.0 | Direct |
Angular | Angular-NVD3 | 1.0.4 | Direct |
Angular | jQuery | 1.11.1 | Dependency |
Angular | PDF.js | 1.0.925 | Dependency |
Angular | NVD3 | 1.8.1 | Dependency |
Angular 2 | Angular2 | 4.1.3 | Direct |
Angular 2 | Ionic | 3.4.2 | Dependency |
_______________________________________________
Parameter | Type | Description |
Handler | Function | Callback function, which is called after all scripts have been loaded completely. |
_______________________________________________
Parameter | Type | Description |
Handler | Function | Callback function, which is called immediately before the loading of the script begins. |
_______________________________________________
To integrate the library with a js code snippet, use the following parameter:
Parameter | Type | Description |
ScriptPath | String | Relative path in the uploaded ZIP structure to the .js file you want to include (e.g. src/js/includedScript.js). |
Name | String | Name of the library you can use to access the .js file (e.g. includedScript). By using “includedScript” in your script code you can now use all methods of your integrated library. |
Dependencies | Array<String> | Dependent scripts (refers to the parameter “name” of “addScript”.) It guarantees, that all dependencies are loaded beforehand. Use this if your library needs other libraries to work properly. |
It is important to ensure that all scripts specified under “dependencies” are either integrated into the same library, or a dependency is set on the library in which the script is integrated.
_______________________________________________
To integrate the library with a js code snippet, use the following parameter:
Parameter | Type | Description |
StyleURL | String | Relative path to the uploaded ZIP structure of the library. |
Name | String | Style name (optional). |
_______________________________________________
An iterator is an object that sequentially passes data structures. It respectively returns the following element and determines if there are another elements following.
With the Iterator Activity you iterate over a variable. It has two output ports: each and after.
Port | Description |
each | For every Iteration the following process will be executed. |
after | After all Iterations ended the following process will be executed. |
The Iterator selection helper can be accessed by opening the mapping dialog. The mapping dialog can also be opened by double clicking on the shape.
You can drag and drop the parameter in the drawing area in the middle. By double clicking on the parameter you can select the collection you want to iterate.
The mapping dialog is aware of its type and offers only collection variables that are defined in the app.
By opening the Mapping Dialog you can drag and drop the element on the left and on the right in the middle. By double clicking on it, you find all paramter/variables that can be mapped listed in a pop up.
_______________________________________________
Jobs are server side executed and recurring tasks which use Business Objects as logic. They can be found by clicking on the “Jobs” tile on the Dashboard.
They are used to automate Business Objects. Commands can be defined and will be executed by the Simplifier on a periodic basis. You may schedule the jobs in order to trigger them without further user intervention.
The red and green icons within the overview indicate whether the job is active. The red icons signify that it’s inactive and the green icons signify that it’s active.
To create a new job, you have to name it and set an interval after which the job is called in repeatedly. Selecting the Business Object and the function provides the job with functionality. Furthermore you can choose the user who should execute the job (in case he has all permissions required). The active time zone on the server applies to all dates and time settings. You can choose between the 5 following intervals:
Interval
It’s an recurring interval at which the job is executed in the format <hh>:<mm>:<ss>. If the new execution overlaps with a previous run, it’s only started after it has been completed and after a further interval.
One Time
With this you can set an actual date <dd>.<MM>.<yyyy> and time <hh>:<mm>:<ss>.
If the selected time is in the past, the job will not be executed!
Daily
You can set a daily time in the format: <hour>:<minute>:<second>
Weekly
If you select this interval, it will be repeated every week. Set it in <hour>:<minute>:<second> and the appropriate day(s).
Monthly
Set this interval if you want that it’s repeated monthly. Set it in <hour>:<minute>:<second> and the day(s) within this month.
If the selected day doesn’t occur in this month, e.g. the 30th February, the job will not be executed in this month.
_______________________________________________
Applications can be localized easily by adding language files (.po-format) to the application. A fallback language has to be defined. At default the language will be set according to user’s environment, browser or device language.
For the translation of the individual applications, .po files are used in the Simplifier. Those can be viewed, downloaded and uploaded via the Language tab in the UI Designer.
To create a new translation file, you can download a template from this overview by clicking on the corresponding button.
The downloaded file can be edited in the text editor of your choice (e.g. Notepad ++).
Important: translatable values must be flagged within a widget in order for them to appear in the default language file!
In this template, all values marked as translatable in the widgets used are listed and can be translated into the target language.
This file can then be added via the Plus icon. You have to select the target language and the file you want to edit.
If the desired language is not available, please contact your administrator, as these are maintained in the server settings.
To change the language at runtime, the following script must be inserted in the Process Designer: sap.ui.getCore().getConfiguration().setLanguage(“en”), where “en” can be replaced by the desired abbreviation.
To start an application with a specific language, the URL of the following query parameters can be added:
?sap-language=en
_______________________________________________
Name | Defines the name of the authentication |
Mechanism | LDAP |
Priority | This defines the order in which the authentication mechanisms are processed |
Host name | This defines the IP/ Host of the authentication service |
Port | This defines the authentication port |
Base DN | This defines the Domain name of the entry point |
You can test the connection by inserting a Username and Password.
_______________________________________________
You can assign different libraries to your application and get an overview on their dependencies.
Go to “Integration of external Libraries” for more details.
_______________________________________________
The Simplifier comes with the following plugins:
Plugin Name | Description |
keyValueStorePlugin | Offers a Key/Value Store Database based on Java MapDB |
pdfPlugin | Offers a PDF Template Designer and Generator based on wkthmltopdf |
contentRepoPlugin | Offers a Content Repository for saving and sharing documents in a folder hierarchy with own permission objects |
jsonStore | Offers a Database Plugin to save and read back customer information (and application data) from apps in json format. |
sessionPlugin | Offers a User-Session Plugin to save and manage User Session |
stepByStepGuidancePlugin | Offers a generator (like a wizard) to build simple apps consisting of one information (image, text, video) per screen and one of the predefined functions. |
captcha | Server-Side Generation of Captcha Images for the UI5 Captcha Widget |
You can find more plugins on the Marketplace.
_______________________________________________
To list your templates, you need the following parameter:
URL | /client/1.0/PLUGIN/pdfPlugin/adminTemplateList | |
Input-Parameter | None | |
Output-Parameter | Value | JSON-Array with all template names |
Example output:
{
"success"
:
true
,
"value"
: [
"templatename1"
,
"templatename2"
,
"templatename3"
]
}
_______________________________________________
You can install the Docker engine on your local machine and start the Simplifier Docker for development and testing.
The Docker Engine runs on
To see how to start the Simplifier, click here.
_______________________________________________
Choose the Connector Path:
You can choose between READ and WRITE.
{
"connectorName"
:
"WriteLoggingConnectorHandler"
,
"json"
: {
"msg"
:
"Test Log Konnektor umgeschrieben"
,
"logLvl"
:
"debug"
,
"logGroup"
:
"pickIt"
,
"deviceMac"
:
""
,
"timestamp"
: 1425293416
}
}
{
"connectorName"
:
"ReadLoggingConnectorHandler"
,
"json"
: {
"logGroup"
:
"pickIt"
,
"logLvl"
:
"debug"
}
}
_______________________________________________
Currently the Logic shape is divided into Condition, Iterator and Script.
_______________________________________________
The error log is the central logging and monitoring area where all data-streams and errors are logged and saved.
You can display all data of a specific User by using the search bar.
_______________________________________________
Each process step can be configured as a screen. A screen represents one single user interface page and can contain several widgets.
In the screen section you can do the following actions:
![]() |
Copy Screen |
Copy a screen and paste it into the actual or a different application. |
![]() |
Paste Screen |
Paste the previously copied screen into the current or a different application. |
![]() |
Edit Screen |
Activate the edit mode to change screen order or delete screens. |
![]() |
Add Screen |
Add a new screen to the actual application. |
_______________________________________________
Collections represent multiple results of Structs. For example a databank request may deliver a list of addresses from numerous people and you can map them to the equivalent Widget within a Data Object.
Unfortunately, the input mapping of collections is not yet possible. Nevertheless, you can use the “Script” tile and map your data via code.
There is a general pattern you can follow and adapt it to your specific data. To map data to your table, you must have a predefined Connector with at least one Connector Call.
Now click on the Script tile and edit the code.
Build an object.
Add payload to your object. If the input parameter of your Connector Call are filled in with an “Alias”, you can add them as keys to your object.
Otherwise, you need an escape function. Example:
payload[escape("soap/_-ITIZ_-OBJ_BUS2012_UPDATE/IT_PO_ITEMS(1)/QUANTITY")] = "X"
Add a global function call with the following Parameters:
The output mapping of a Data Object to table, a list or a select Widget can be easily done in the Process Designer.
Click on “Output Mapping” and add the output parameter (on the left) and your table widget (on the right) to the screen. Double click on each to select the items.
Now map the equivalent items together via drag & drop.
_______________________________________________
Structs describe a package of Domain Types. For example the Struct “address” contains different Domain Types like Name, Street, City, ZIP Code, etc.
You can map Structs as Input and Output parameter within your Data Object or when using a UI Action.
Example:
In the example below, we want to use a Business Object that needs the information first name, last name, street and city as Input parameter. Prior to our work in the edit mode of the user story (Process Designer), we have created the Struct Data Type “Person” that contains several Domain Types like “Firstname” and another Struct which is called “Address”.
Within the Input Mapping of our Business Object, we can assign the Input fields with the equivalent data to the Struct “Person” that the Business Object needs.
By double-clicking on the Struct you can choose exactly which parameter you want to select.
Navigate higher or deeper in the Struct by clicking on the arrows (e.g. to select the Domain Type “Street” within the Struct “Address”).
_______________________________________________
You can mark widgets as deprecated to prevent them from being displayed within the UI Designer.
For that you have to go back to the application overview and switch to the widgets tab. Search for the appropriate widget and edit it. All you have to do now is to activate the toggle ‘Deprecated’ of the widget and click on save.
If deprecated is active, the Widget will no longer be available on the left side of the UI Designer.
Deprecated widgets that were used before they were marked as deprecated, will still be shown within the application content. The application will also still be saved and deployed without issues or warnings and runs as before.
_______________________________________________
The marketplace module is central to the Simplifier Experience and Workflow. It does not only provide a variety of applications ready to import to your own account, but also any other type of module content such as Connectors, Virtual Connector packages, Business Objects, custom widgets and more.
To add any type of content to your own account, browse the marketplace and click “request” to send us an e-mail with all the information we need so we can provide the content to you.
In the future, this feature will be automated, so you can add content with one click.
_______________________________________________
The Mobile Action Element enables you to use mobile features within the application.
Drag and drop the activity “Mobile Action” underneath “Action” into the drawing area.
Currently, there are 14 different actions implemented in the Simplifier. Use the Input/Output Mapping to define the source for the input (request) and the destination for its output (response).
Determine how many pictures should be taken.
Set the format of the code you want to scan, the orientation of the camera and write a text in the prompt property.
Define how many miliseconds the mobile device should vibrate.
Parameter | DataType | Valid Values |
Meter appearance | String | See the table below |
Number of counters | Integer | 1, 2 (from dropdown) |
Integer digits | Integer/String | AUTO, 1-n |
Fraction digits | Integer/String | AUTO, 1-n |
Key | Value |
mechanical_black | White text on black rollers |
mechanical_white | Black text on white rollers |
lcd | LCD Display |
lcd_edl21 | EDL21 and similar meters with LCD 7 (three-digit OBIS code to the left) |
For the output mapping you can use the following parameter:
Paramter | DataType | Description |
image | string | Image of the scanning process as data url |
line1 | string | Result of scanning the first counter (always set) |
line2 | string | Result of scanning the second counter (only set if 2 counters were scanned) |
line1ObisCode | string | Result of scanning the first counter’s OBIS code (only set if meter appearance was set to lcd_edl21) |
line2ObisCode | string | Result of scanning the second counter’s OBIS code (only set meter appearance was set to lcd_edl21 and 2 counters were scanned) |
By providing the mobile action a path to a video, it will play the video in a full screen mode.
*NOTE: Please use this mobile action with caution. Some devices don’t support this feature.
The mobile action Play Audio just needs an audio file path.
This mobile action will trigger a native notification.
So the Notification will be displayed on your mobile device.
With this mobile action you can specify a text to be read out, as well as the output language. You can choose between English (US) and German (DE).
The mobile action GPS need to be initialized at first. It’s recommend to do this in a screen onInit function.
When it’s initialized, you can access the longitude and latitude by the Auto Field type Geolocation. For that you need to open the mapping dialog of the UI Action. Then you can drag the auto field in the middle and by double clicking on it you can select the longitude/latitude/. Then connect it with the appropriate widget.
This mobile action will show a native toast, with a constant or by using the input mapping. You can specify the duration how long the toast should be displayed (Short or Long) and the position (Top, Center or Bottom).
You can set and lock the screen orientation of the mobile device. Possible values are Landscape, Portrait, Landscape (Primary), Landscape (Secondary), Portrait (Primary), Portrait (Secondary) and Unlock.
The current screen orientation can be accessed by a new characteristic of the Device Auto Field.
With this mobile action, your mobile device can toggle light.
If the background mode is enabled, JavaScript will be executed even if the app is running in the background or the display is locked.
Read the subpages to use other mobile actions.
_______________________________________________
Plugin to provide WebRTC P2P functionality via Intel’s WebRTC SDK.
Intel WebRTC SDK Version: 3.4
Platforms:
Cordova: 6+
When the local user connects to a remote user, this plugin overlays the cordova webview to show local and/or remote media streams.
{
"action": "<action>", //see "Possible Actions"
"message": "<String>", //some message depending on action and success
}
Actions triggered by local user
Actions triggered by server/remote user/network
Initializes view, connects to server.
runTimeSuccessCallback
/ runTimeErrorCallback
: is being used to provide a callback interface during plugin runtime
If the plugin has already been initialized, the plugin just attaches the runtime callbacks to regain context.
IntelWebRTC.init(config, runTimeSuccessCallback, runTimeErrorCallback);
if connected to peer it closes the connector, disconnects from Server, removes view components
IntelWebRTC.logout();
connect to desired peer
IntelWebRTC.invite("peerid", scopedSuccessCB, scopedErrorCB);
publishes audio/video to connected peer (is automatically called when peerconnection is established)
IntelWebRTC.publish(scopedSuccessCB, scopedErrorCB);
stops sending audio/video to connected peer
IntelWebRTC.unpublish(scopedSuccessCB, scopedErrorCB);
disconnects from currently connected peer
IntelWebRTC.hangup(scopedSuccessCB, scopedErrorCB);
cycles through cameras
IntelWebRTC.switchCamera(scopedSuccessCB, scopedErrorCB);
sends a string to connected peer
IntelWebRTC.sendData("",scopedSuccessCB, scopedErrorCB);
scales and aligns view to given parameters
IntelWebRTC.scaleView(0.5, "top_left", scopedSuccessCB, scopedErrorCB);
sets callUI to fullscreen
IntelWebRTC.fullscreen(scopedSuccessCB, scopedErrorCB);
starts screen sharing
IntelWebRTC.startShareScreen(scopedSuccessCB, scopedErrorCB);
stops screen sharing
IntelWebRTC.stopShareScreen(scopedSuccessCB, scopedErrorCB);
var config = {
"connectionConfig": {
"username": "paul",
"server": "https://simplifier-dev.itizzimo.com:8090"
},
"iceConfig": [
{
"url": "stun:turn.itizzimo.com:3478"
},
{
"url": "stun:turn.itizzimo.com:3479"
},
{
"url": "stun:turn.itizzimo.com:5349"
},
{
"url": "stun:turn.itizzimo.com:5350"
},
{
"url": "turn:turn.itizzimo.com:3478?transport=tcp",
"username": "admin",
"password": "admin"
},
{
"url": "turn:turn.itizzimo.com:3478?transport=udp",
"username": "admin",
"password": "admin"
},
{
"url": "turn:turn.itizzimo.com:3479?transport=tcp",
"username": "admin",
"password": "admin"
},
{
"url": "turn:turn.itizzimo.com:3479?transport=udp",
"username": "admin",
"password": "admin"
},
{
"url": "turn:turn.itizzimo.com:5349?transport=tcp",
"username": "admin",
"password": "admin"
},
{
"url": "turn:turn.itizzimo.com:5349?transport=udp",
"username": "admin",
"password": "admin"
},
{
"url": "turn:turn.itizzimo.com:5350?transport=tcp",
"username": "admin",
"password": "admin"
},
{
"url": "turn:turn.itizzimo.com:5350?transport=udp",
"username": "admin",
"password": "admin"
}
],
"viewConfig": {
"scalingFactor": 0.3,
"gravity": "bottom_right"
},
"mediaConfig": {
"maxWidth": 640,
"maxHeight": 480,
"cameraDialog": true,
"preferFrontCamera": false,
"maxFps": 30,
"maxVideoBandwidth": 5000,
"maxAudioBandwidth": 200,
"videoCodec": "H264"
},
"debug": {
"local": {
"fps": false,
"bitrate": false,
"audiolevels": false
},
"remote": {
"fps": false,
"bitrate": false,
"audiolevels": false
}
}
};
var runtimeSuccessCallback = function(event){
console.log("Success: " + event);
}
var runtimeErrorCallback = function(event){
console.warn("Error: " + event);
}
//initialize plugin
IntelWebRTC.init(config, runtimeSuccessCallback, runtimeErrorCallback);
Success: successCallback -> {"action":"INIT","message":"initialized"}
Success : successCallback -> {"action":"LOGIN","message":"stresstest2"}
//socket could not connect
Error : errorCallback -> {"action":"LOGIN","message":"com.intel.webrtc.base.WoogeenException: io.socket.engineio.client.EngineIOException: websocket error","success":false}
//socket rejected (e. g. user not valid) - Logout needs to be called to reinitialize connection with new credentials
Error: errorCallback -> {"action":"LOGIN","message":"com.intel.webrtc.p2p.WoogeenP2PException: Socket.IO reports connect to signaling server failed.","success":false}
//initialized twice
Error: errorCallback -> {"action":"INIT","message":"already initialized","success":false}
Invite some user which is also connected to peerserver
IntelWebRTC.invite('<username>');
Success: {"action":"INVITE","message":"stresstest4"}
Success: {"action":"ONACCEPTED","message":"stresstest4"}
Success: {"action":"ONCHATSTARTED","message":"stresstest4"}
Error: {"action":"INVITE","message":"com.intel.webrtc.p2p.WoogeenP2PException: Target user is unreachable.","success":false}
IntelWebRTC.logout(function(success){console.log(success)}, function(error){console.log(error)});
Initiator: IntelWebRTC::init
Success : successCallback -> {"message":"connected","action":"LOGIN"}
Error : errorCallback: -> {"message":"connected","success":false,"action":"LOGIN"}
Initiator: Device is offline / Connection to server lost Triggers on each connection retry (every ~5 Seconds)
Error: errorCallback: -> {"action":"ONDISCONNECTED","message":""}
When connection is established again:
Success: successCallback -> {"action":"LOGIN","message":"stresstest2"}
//login initialized
IntelWebRTC.init(config, runtimeSuccessCallback, runtimeErrorCallback);
//initialization success
Success: {"action":"INIT","message":"initialized"}
//initial view parameters added to layout
Success: {"action":"SCALE_VIEW","message":""}
//login success
Success: {"action":"LOGIN","message":"stresstest2"}
//remote invited local user
Success: {"action":"ONINVITED","message":"stresstest3"}
//local user accepted
Success: {"action":"ONCHATSTARTED","message":"stresstest3"}
//local user published stream (happends auto on ONCHATSTARTED)
Success: {"action":"PUBLISH","message":"stresstest3"}
//remote user published stream
Success: {"action":"ONSTREAMADDED","message":"stresstest3"}
//local user hung up
Success: {"action":"HANGUP","message":"stresstest3"}
//connection to remote user closed
Success: {"action":"ONCHATSTOPPED","message":"stresstest3"}
//tablet set to airplane-mode -> device now offline
Error: {"action":"LOGIN","message":"com.intel.webrtc.base.WoogeenException: io.socket.engineio.client.EngineIOException: websocket error"}
//user got successfully disconnected
Success: {"action":"ONDISCONNECTED","message":""}
//6 reconnection errors
(6)Error: {"action":"LOGIN","message":"com.intel.webrtc.p2p.WoogeenP2PException: Socket.IO reports connect to signaling server failed."}
//airplane-mode turned off, wifi connected, connected to server again
Success: {"action":"LOGIN","message":"stresstest2"}
//local user invites remote user
IntelWebRTC.invite("stresstest3")
//successfully invited remote user
Success: {"action":"INVITE","message":"stresstest3"}
//remote user accepted invitation
Success: {"action":"ONACCEPTED","message":"stresstest3"}
//connection to remote user established
Success: {"action":"ONCHATSTARTED","message":"stresstest3"}
//local user published stream
Success: {"action":"PUBLISH","message":"stresstest3"}
//remote user published stream
Success: {"action":"ONSTREAMADDED","message":"stresstest3"}
//view scaling while in call
IntelWebRTC.scaleView(0.2,"top_right")
//scaling succeeded
Success: {"action":"SCALE_VIEW","message":""}
//remote user disconnected
Success: {"action":"ONCHATSTOPPED","message":"stresstest3"}
Intel WebRTC SDK: https://software.intel.com/en-us/webrtc-sdk
_______________________________________________
Broker Name | The name of the broker. This is used by the Call to select the correct broker. |
Broker Hostname | Hostname of the broker IPv4 OR hostname! |
Port | The port, the broker is running on (1883 is standard for TCP and 8883 is standard for SSL). |
TLS | TLS Encryption. Not yet available! |
Keep-Alive | The number of seconds the client should be kept alive if no activity takes place. |
Clean-Session | Determines whether the session is cleaned after a reconnection. |
Last will topic | The topic for which a message is sent if the client dies (testament). |
Last will payload | The message for the testament. |
Last will retained | Flag to decide whether the message should be retained by the broker. |
Last will QoS (Quality of Service) |
Flag to decide how often the message will be sent. |
Allow multiple executions in reordering | If you send the “order” list to rearrange the given operations, you can decide with the flag whether operations should be executed several times. |
Continue after an exception | Flag to decide whether the next operation should be executed after an error or whether the execution completely stops. |
You can choose between 2 operations: PUBLISH and SUBSCRIBE.
Build the payload like this:
Parameter | Description |
---|---|
operationType | Type of the operation, PUBLISH or SUBSCRIBE. |
brokerName | The name of the broker, as it is specified in the Connector Details. If no name is given, the default broker is selected. |
returnSet (for SUBSCRIBE operations) | Option which information the incoming messages contain. “STANDARD”: Only the payload and the topic are displayed. “WITH_QUALITY_INFORMATION”: Equivalent to the “STANDARD” but additionally with information whether the message is duplicated / withheld and QoS. “VERBOSE”: As before but with Client ID as well as message ID. |
Parameter for the Object “clientInformation” |
|
clientId | The ID of the client. Since no two clients can connect with identical ID on the same broker, caution is advised. Dropping this parameter causes a random ID to be generated by the program. |
forceReconnection | Setting whether the client should reconnect. |
Parameter for the Object “messages” |
|
qos | The Quality of Service settings: “AT_LEAST_ONCE”, the message is sent at least once. “ONCE”, the message is sent exactly once. “AT_MOST_ONCE”, the message is sent 0 or 1 time. |
topic | The topic for which the message is published. |
retain | Setting whether to keep the message in the broker. |
payloadInformation | Meta information for the payload. ***Is not being used at the moment.*** |
payload | The payload as a String. |
If you want to publish 1 message:
"operations"
: [
{
"operationType"
:
"PUBLISH"
,
"brokerName"
:
"testBroker"
,
"clientInformation"
: {
"clientId"
:
"client1"
,
"forceReconnection"
:
"true"
},
"messages"
: [
{
"qos"
:
"AT_LEAST_ONCE"
,
"topic"
:
"myTopic"
,
"retain"
:
"true"
,
"payloadInformation"
:
"JustMetaInformation"
,
"payload"
:
"PayloadA"
}
]
}
]
If you want to publish n messages:
"operations"
: [
{
"operationType"
:
"PUBLISH"
,
"brokerName"
:
"testBroker"
,
"clientInformation"
: {
"clientId"
:
"client1"
,
"forceReconnection"
:
"true"
},
"messages"
: [
{
"qos"
:
"AT_LEAST_ONCE"
,
"topic"
:
"myTopic"
,
"retain"
:
"true"
,
"payloadInformation"
:
"JustMetaInformation"
,
"payload"
:
"PayloadA"
},
{
"qos"
:
"AT_LEAST_ONCE"
,
"topic"
:
"myTopic2"
,
"retain"
:
"true"
,
"payloadInformation"
:
"JustMetaInformation2"
,
"payload"
:
"PayloadB"
}
]
},
]
"operations"
: [
{
"operationType"
:
"PUBLISH"
,
"brokerName"
:
"testBroker"
,
"clientInformation"
: {
"clientId"
:
"client1"
,
"forceReconnection"
:
"true"
},
"messages"
: [
{
"qos"
:
" AT_LEAST_ONCE "
,
"topic"
:
"myTopic"
,
"retain"
:
"true"
,
"payloadInformation"
:
"JustMetaInformation"
,
"payload"
:
"PayloadA"
}
]
},
{
"operationType"
:
"PUBLISH"
,
"brokerName"
:
"testBroker"
,
"clientInformation"
: {
"clientId"
:
"client1"
,
"forceReconnection"
:
"true"
},
"messages"
: [
{
"qos"
:
"AT_LEAST_ONCE"
,
"topic"
:
"myTopic"
,
"retain"
:
"true"
,
"payloadInformation"
:
"JustMetaInformation"
,
"payload"
:
"PayloadA"
},
{
"qos"
:
"AT_LEAST_ONCE"
,
"topic"
:
"myTopic2"
,
"retain"
:
"true"
,
"payloadInformation"
:
"JustMetaInformation2"
,
"payload"
:
"PayloadB"
}
]
}
]
If you want to subscribe for n topics:
{
"operationType"
:
"SUBSCRIBE"
,
"returnSet"
:
"VERBOSE"
,
"brokerName"
:
"testBroker"
,
"clientInformation"
: {
"clientId"
:
"clientSubscribe"
,
"forceReconnection"
:
"true"
},
"topics"
: [
"test"
,
"myFancyTopic"
]
}
_______________________________________________
To use other native mobile actions you need to implement Code via Script.
With the Simplifier, you can build your application using web technologies like JavaScript.
If you want to use native functionalities, you need a bridge between those technologies. Therefore you can use pre-installed Cordova Plugins in the Simplifier Client and integrate different predefined APIs.
Here is a list of Plugins to use and a link to their documentation on github:
_______________________________________________
The Navigation Element is used to trigger a navigation from one screen to another. By dragging it to the main screen and selecting it with a click a list of screens to navigate to will appear in the right pane.
You can set that the navigation should navigate back, or choose between several transitions: Slide, Fade, Flip or None.
Example: In most cases a navigation will be used when clicking on a button, so by combining a click Event element with a navigation element this can easily be achieved.
_______________________________________________
OData (Open Data Protocol) enables the creation of REST-based data services that allows resources identified by Uniform Resource Identifiers (URIs) and defined in a data model to be published and edited through the use of HTTP messages by Web clients.
It allows flexible access to the databases and to create, read, update and delete (CRUD) valid data on the web. OData is able to provide consistent semantics for data exchange in client-server communication.
Contrary to the other connectors, OData does not require any connector calls because the metadata is updated automatically.
Create a new connector and select OData as connector type. Within the specific data on the right, define the endpoint. Optionally, you can also define request headers to pass through and response headers to pass through.
_______________________________________________
You can react on losing connection of your application/device in the Process Designer.
There are two default events added in every application.
Event | Function |
onDeviceGoesOnline | Will be triggered when the device has established a connection to the Wi-Fi or LTE. |
onDeviceGoesOffline | Will be triggered when the device has lost the connection to Wi-Fi or LTE. |
The autofield type “Device” holds the current connection state – characteristic: online. How to create a new autofield, you can see here.
It can be used in every Mapping and also in Conditions.
_______________________________________________
On Premise means that as a customer you run the Simplifier on your own servers. Whether this is a dedicated root server, a virtual machine in VM Ware or a cloud computing instance at a cloud provider like Amazon does not matter in this case.
You are responsible for the installation, operation, maintenance, updates of the Simplifier instance and guaranteed availability.
To learn how to deploy the Simplifier on-premises, look at our checklist.
_______________________________________________
This section contains examples for the triggering of all three call variants.
READ Call
this.callConnectorCall("TIA_Connector", "TIA_READ" , payload, function(data)
{
console.log(JSON.stringify(data, null, 4));
WRITE Call
this.callConnectorCall("TIA_Connector", "TIA_WRITE", payload, function(data)
{
console.log(JSON.stringify(data, null, 4));
READWRITE Call
this.callConnectorCall("TIA_Connector", "TIA_READWRITE", payload, function(data)
{
console.log(JSON.stringify(data, null, 4));
_______________________________________________
This section describes the necessary parameters and data types for OPC-UA connector calls. There are 3 different kind of calls
NOTE: Please refer for the necessary data types here.
_______________________________________________
This section describes the nescessary collections as well as their meaning, required to use OPC-UA READ/WRITE connector calls.
Collections
_______________________________________________
After sending the subscription, the OPC-UA Connector will subscribe the given nodes for monitoring requests. Every change will be sent through the websocket to the client and can be received by the onMessage function, which has been described here,
Request JSON
var requestData = {
"operation": String,
"nodes": Array of String,
"namespaceIndices": Array of String,
"publishingInterval": Float,
"clientHandlingID": Integer,
"samplingInterval": Float,
"queueSize": Integer,
"discardOldestItem": Boolean,
"monitoringMode": String,
"returnedTimestamps": String
}
operation
The operation, which should be done by the asynchronous OPC-UA connector. Only the following options are valid at the moment.
nodes
The names of the nodes, which should be subscribed. The name is one of two parts, which defines a node Id.
NOTE: If more than one item should be subscribed with one request, then the amount of nodes must be the same as the amount of namespaceIndices.
namespaceIndices
The namespace indices where the nodes resides
NOTE: If more than one item should be subscribed with one request, then the amount of namespaceIndices must be the same as the amount of nodes.
publishingInterval
The interval, in which the OPC-UA server will publish the changes in the subscribed nodes. According to the queueSize all changes, which are still stored in the queue will be published. The used timeunit are milliseconds.
clientHandlingID
An internal unique handling key for the OPC-UA server to distinguish the monitoring subscriptions.
NOTE: Each request must have an unique clientHandlingID or else only message from the latest subscription will be returned.
samplingInterval
The interval in which the OPC-UA server will sample the subscribed nodes for changes. This parameter will be only used if SAMPLING is the chosen monitoringMode. The used timeunit are milliseconds.
queueSize
The size of the queue that logs all changes of the subscribed nodes. Each node has an own queue. If the queue is full and new changes occurs, then the oldest changes are discarded automatically.
discardOldestItem
If this option is selected, then the oldest entry in the queue of each subscribed node will be discarded regardless whether the queue is not full or not.
monitoringMode
The monitoring mode. The following two modes are available:
returnedTimestamps
This option decides what timestamps are returned in each message. The application server timestamp will be returned every time. For now the following options are allowed:
_______________________________________________
This section contains examples for the OPC-UA Monitoring Request Subscriptions
Attention The status code of a frame might return either “Good” or “Bad” if later case occurs, then also the OPC-UA Error Message will be returned! |
Request with Reporting Both Timestamps
var requestData = {
"operation": "MONITORING_SUBSCRIBE",
"nodes": ["myNode","myOtherNode"],
"namespaceIndices": [2,2],
"publishingInterval":1000.0,
"clientHandlingID": 1,
"samplingInterval": 1000.0,
"queueSize": 2,
"discardOldestItem": true,
"monitoringMode": "Reporting",
"returnedTimestamps": "Both"
}
This request subscribes the nodes “myNode” and “myOtherNode” that resides in namespace 2 to the OPC-UA server, which will report the latest 2 changes after 1 second. The returning message frame contains the application server, OPC-UA server and source timestamps. The oldest item will be dropped.
Returning Message Frames
{
“frameType”:”data”,
“subscriptionKey”:”bb827118-f1b0-2170-9937-f8c7e1620107″,
“content”:{“data”:{
“nodeName”:”myNode”,
“namespaceIndex”:2,
“value”:”448828049″,
“appServerTime”:”Wed Oct 19 19:37:42 CEST 2016″,
“OPCUAServerTime”:”Mon Jan 01 01:00:00 CET 1601″,
“OPCUASourceTime”:”Mon Jan 01 01:00:00 CET 1601″,
“statusCode”:”Good”},
“success”:true}
}
{
“frameType”:”data”,
“subscriptionKey”:”bb827118-f1b0-2170-9937-f8c7e1620107″,
“content”:{“data”:{
“nodeName”:”myOtherNode”,
“namespaceIndex”:2,
“value”:”22223423″,
“appServerTime”:”Wed Oct 19 19:37:43 CEST 2016″,
“OPCUAServerTime”:”Mon Jan 01 01:00:00 CET 1601″,
“OPCUASourceTime”:”Mon Jan 01 01:00:00 CET 1601″,
“statusCode”:”Good”},
“success”:true}
}
Request with Reporting Source Timestamp
var requestData = {
"operation": "MONITORING_SUBSCRIBE",
"nodes": ["myNode","myOtherNode"],
"namespaceIndices": [2,2],
"publishingInterval":500.0,
"clientHandlingID": 1,
"samplingInterval": 1000.0,
"queueSize": 1,
"discardOldestItem": true,
"monitoringMode": "Reporting",
"returnedTimestamps": "Source"
}
This request subscribes the nodes “myNode” and “myOtherNode” that resides in namespace 2 to the OPC-UA server, which will report the last change after 500 milliseconds. The returning message frame contains the application server and source timestamps. The oldest item will be dropped but it does not matter, as the queue can contain only one element.
Returning Message Frames
{
“frameType”:”data”,
“subscriptionKey”:”aa827118-f1b0-2170-9937-f8c7e1620107″,
“content”:{“data”:{
“nodeName”:”myNode”,
“namespaceIndex”:2,
“value”:”324234″,
“appServerTime”:”Wed Oct 19 19:37:42 CEST 2016″,
“OPCUASourceTime”:”Mon Jan 01 01:00:00 CET 1601″,
“statusCode”:”Good”},
“success”:true}
}
{
“frameType”:”data”,
“subscriptionKey”:”aa827118-f1b0-2170-9937-f8c7e1620107″,
“content”:{“data”:{
“nodeName”:”myOtherNode”,
“namespaceIndex”:2,
“value”:”2333543″,
“appServerTime”:”Wed Oct 19 19:37:43 CEST 2016″,
“OPCUASourceTime”:”Mon Jan 01 01:00:00 CET 1601″,
“statusCode”:”Good”},
“success”:true}
}
Request with Reporting Server Timestamp
var requestData = {
"operation": "MONITORING_SUBSCRIBE",
"nodes": ["myNode","myOtherNode"],
"namespaceIndices": [2,2],
"publishingInterval":2000.0,
"clientHandlingID": 1,
"samplingInterval": 1000.0,
"queueSize": 20,
"discardOldestItem": false,
"monitoringMode": "Reporting",
"returnedTimestamps": "Server"
}
This request subscribes the nodes “myNode” and “myOtherNode” that resides in namespace 2 to the OPC-UA server, which will report the last 20 changes after 2 seconds. The returning message frame contains the application server and OPC-UA server timestamps. The oldest item will not be dropped.
Returning Message Frame
{
“frameType”:”data”,
“subscriptionKey”:”cc827118-f1b0-2170-9937-f8c7e1620107″,
“content”:{“data”:{
“nodeName”:”myNode”,
“namespaceIndex”:2,
“value”:”4488280898″,
“appServerTime”:”Wed Oct 19 19:37:42 CEST 2016″,
“OPCUAServerTime”:”Mon Jan 01 01:00:00 CET 1601″,
“statusCode”:”Good”},
“success”:true}
}
{
“frameType”:”data”,
“subscriptionKey”:”cc827118-f1b0-2170-9937-f8c7e1620107″,
“content”:{“data”:{
“nodeName”:”myOtherNode”,
“namespaceIndex”:2,
“value”:”22223425″,
“appServerTime”:”Wed Oct 19 19:37:43 CEST 2016″,
“OPCUAServerTime”:”Mon Jan 01 01:00:00 CET 1601″,
“statusCode”:”Good”},
“success”:true}
}
Request with Reporting Neither Timestamps
var requestData = {
"operation": "MONITORING_SUBSCRIBE",
"nodes": ["myNode","myOtherNode"],
"namespaceIndices": [2,2],
"publishingInterval":100.0,
"clientHandlingID": 1,
"samplingInterval": 1000.0,
"queueSize": 5,
"discardOldestItem": true,
"monitoringMode": "Reporting",
"returnedTimestamps": "Neither"
}
This request subscribes the nodes “myNode” and “myOtherNode” that resides in namespace 2 to the OPC-UA server, which will report the last 5 changes after 100 millieconds. The returning message frame contains only the application server timestamp. The oldest item will be dropped.
Returning Message Frames
{
“frameType”:”data”,
“subscriptionKey”:”dd827118-f1b0-2170-9937-f8c7e1620107″,
“content”:{“data”:{
“nodeName”:”myNode”,
“namespaceIndex”:2,
“value”:”448828042″,
“appServerTime”:”Wed Oct 19 19:37:42 CEST 2016″,
“statusCode”:”Good”},
“success”:true}
}
{
“frameType”:”data”,
“subscriptionKey”:”dd827118-f1b0-2170-9937-f8c7e1620107″,
“content”:{“data”:{
“nodeName”:”myOtherNode”,
“namespaceIndex”:2,
“value”:”22223421″,
“appServerTime”:”Wed Oct 19 19:37:43 CEST 2016″,
“statusCode”:”Good”},
“success”:true}
}
Request with Sampling
var requestData = {
"operation": "MONITORING_SUBSCRIBE",
"nodes": ["myNode"],
"namespaceIndices": [2],
"publishingInterval":1000.0,
"clientHandlingID": 1,
"samplingInterval": 100.0,
"queueSize": 10,
"discardOldestItem": true,
"monitoringMode": "Sampling",
"returnedTimestamps": "Neither"
}
This request subscribes the nodes “myNode” that resides in namespace 2 to the OPC-UA server, which will sample the node every 100 milliseconds and return the last 10 changes after 1 seconds. The returning message frame contains only the application server timestamp. The oldest item will be dropped.
Returning Message Frame
{
“frameType”:”data”,
“subscriptionKey”:”ff827118-f1b0-2170-9937-f8c7e1620107″,
“content”:{“data”:{
“nodeName”:”myNode”,
“namespaceIndex”:2,
“value”:”448828043″,
“appServerTime”:”Wed Oct 19 19:37:42 CEST 2016″,
“statusCode”:”Good”},
“success”:true}
}
_______________________________________________
This section contains examples for the payload of all three call variants.
NOTE: If multiple commands are issued, all fields must contain the same amount of elements i.e. nodes, namespaceInidces, values, actions and order must have the same length.
READ Call
payload = {
"operation":"READ",
"nodes":["myNodeName"],
"namespaceIndices":[3]
}
This call will read the value from the node with the name “myNodeName”, which resides in the namespace 3.
payload = {
"operation":"READ",
"nodes": ["myNodeName","myOtherNodeName"],
"namespaceIndices": [3,2]
}
This call will read the value from the node with the name “myNodeName” which resides in the namespace 3 followed by “myOtherNodeName” residing in namespace 2.
READ Call with order
payload = {
"operation":"READ",
"nodes": ["myNodeName","myOtherNodeName"],
"namespaceIndices": [3,2],
"order": [1,0]
}
This call will read the value from the node with the name “myOtherNodeName”, which resides in namespace 2 followed by “myNodeName”, which resides in the namespace 3.
payload = {
"operation":"READ",
"nodes": ["myNodeName","myOtherNodeName"],
"namespaceIndices": [3,2],
"order": [1,1]
}
This call will read the value from the node with the name “myOtherNodeName”, which resides in namespace 2 followed by “myOtherNodeName” residing in the namespace 3.
WRITE Call
payload = {
"operation":"WRITE",
"nodes":["myIntNode"],
"namespaceIndices":[3],
"values":[12]
}
This call will write the value 12 into the node with the name “myIntNode”, which resides in the namespace 3.
payload = {
"operation":"WRITE",
"nodes": ["myIntNode","myStringNode"],
"namespaceIndices": [3,3],
"values": [12,"No"]
}
This call will write the value 12 into the node with the name “myIntNode” which resides in the namespace 3 followed by writing the value “No” into the node with the name “myStringNode” residing in the namespace 3.
WRITE Call with order
payload = {
"operation":"WRITE",
"nodes": ["myIntNode","myStringNode"],
"namespaceIndices": [3,3],
"values": [12,"No"],
"order": [1,0]
}
This call will write the value “No” into the node with the name “myStringNode” which resides in the namespace 3 followed by writing the value 12 into the node with the name “myIntNode” residing in the namespace 3.
payload = {
"operation":"WRITE",
"nodes": ["myIntNode","myStringNode"],
"namespaceIndices": [3,3],
"values": [12,"No"],
"order": [1,1]
}
This call will write the value “No” into the node with the name “myStringNode” which resides in the namespace 3 followed by writing the value “No” into the node with the name “myStringNode” residing in the namespace 3.
READWRITE Call
payload = {
"operation":READWRITE",
"nodes": ["myIntNode","myOtherNodeName"],
"namespaceIndices": [3,3],
"actions":["WRITE","READ"],
"values":[12,""]
}
This call will write the value 12 into the node with the name “myIntNode” which resides in the namespace 3 followed by reading the value of the node with the name “myOtherNodeName” residing in the namespace 3.
NOTE: Please note that values for reading operations will be ignored.
READWRITE Call with order
payload = {
"operation":READWRITE",
"nodes": ["myIntNode","myOtherNodeName"],
"namespaceIndices": [3,3],
"actions":["WRITE","READ"],
"values":[12,""],
"order":[1,0]
}
This call will read the value of the node with the name “myOtherNodeName” which resides in the namespace 3 followed by writing the value 12 into the node with the name “myIntNode” residing in the namespace 3.
payload = {
"operation":READWRITE",
"nodes": ["myIntNode","myOtherNodeName"],
"namespaceIndices": [3,3],
"actions":["WRITE","READ"],
"values":[12,""],
"order":[1,1]
}
This call will read the value of the node with the name “myOtherNodeName” which resides in the namespace 3 followed by reading the value of the node with the name “myOtherNodeName” residing in the namespace 3.
NOTE: Please note that values for reading operations will be ignored.
_______________________________________________
Endpoint Address
Endpoint Port
The port of the OPC-UA server, this server should connect.
Timeout Time
Timeout Unit
Security Mode
Security Policy
Multiple Executions
If you reorder the operations in your code and want the possibility to do multiple executions, activate the switch.
Exceptions depending on status
Not implemented yet!
Permissions
_______________________________________________
To set OAuth as authentication, make sure you have administrator rights.
After you have logged in as usual in the login mask with your user credentials, click on your name in the upper right corner and then on the settings.
Switch to the Authentication tab in the upper toolbar and click the add icon on the right.
Authentication Settings
First, fill out the following fields:
Name | Specify any name. |
Priority | 0 – The priority can be ignored in this case. |
Mechanism | Select OAuth. |
Mechanism Type | Windows Live – At the moment there is only Windows Live as mechanism type. |
OAuth Settings
You need to fill out the Client Id and the Client Secret. To do this, switch to Windows Live in your browser.
https://apps.dev.microsoft.com
First, you need to log in to Windows Live with your credentials.
After you have successfully logged in, click the “Add an App” button on the right.
A new window opens in which you have to assign a name for the application. In this case, it’s “Simplifier”.
After you have assigned a name, click on “Create”.
In the next step, copy the application Id and paste it into the Simplifier at Client Id.
Click the “Generate New Password” button. A new pop-up opens, in which you can copy the password and paste it into the Simplifier at Client Secret.
Next, click on the “Add Platform” button under the “Platforms” top item and select “Web”.
After you have selected”Web”, insert the redirect url from the simplifier, which was generated automatically.
Click on “Save” at the bottom left.
Your screen should now look like this:
Do not forget to click on “Save” in the Simplifier as well.
If you now want to log in to Simplifier, the corresponding button becomes clickable.
Click on the “Windows Live” button in the login mask. For the first time you will be redirected to the Microsoft login screen, where you have to log in with your email and password.
You must authorize the Simplifier by clicking on “Yes”. If you do not grant the permissions, a login in Simplifier via OAuth is not possible.
After clicking “Yes”, you will be redirected to the Simplifier. A user with minimal rights is automatically created by the first login. This user must be assigned the corresponding and required rights by an admin.
_______________________________________________
By providing the Simplifier Image on Docker Hub, we enable deployment on various public clouds and structures, e.g. Container as a Service (CaaS) on Google Container Engine (GKE), Amazon Web Services (AWS), Azure and SAP Cloud.
_______________________________________________
To see the active Plugins, click on the Plugin tile.
Every Plugin can be an own configuration app, that is visible in the upper menu bar.
You can see the following information in the table above:
PluginName
Technical name of the Plugin.
Connection URL
On what server runs the plugin and which tcp port does it use.
Configuration
If this plugin offers you a configuration user interface, the checkbox is activated and you can see them as tabs in the upper bar.
_______________________________________________
Be careful if you choose to overwrite the existing data. If you changed e.g. the properties of the widget “Button” and import a transport which contains the “old” button widget, your new changes will be overwritten. To avoid this, delete your existing application on the system and import your transport with the option “Don’t overwrite”!
_______________________________________________
The PDF Plugin can be used to generate files with a fix layout but dynamic values.
The sub-articles describe how to use it.
_______________________________________________
The ownership concept provides that a user only can use artifacts, that were created by himself.
You have the possibility to share your own artifacts with other users. The permissions a user receives for a shared artifact has to be set by the admin.
_______________________________________________
Open developer plugin-Doc in new tab
_______________________________________________
Plugins extend the Simplifier core features in all manners. They are standalone programs that can contain
In short: Every time you are not able to configure logic, interfaces or ui elements within the Simplifier, you can do it with your own plugin.
Plugins are coded JAR Files that can be developed in the classic way like Eclipse, Netbeans or another Java IDE. The Plugins can be ran standalone and remotely and communicate with the Simplifier via akka message bus system over tcp. Every Plugin has its own port number and, if necessary, also its own ip addresses.
Plugins can be coded in any programming language, it’s only necessary that an HTTP interface will be provided.
_______________________________________________
this.callPlugin(pluginName, slot, payload, callback, showBusyIndicator, failonError, failCallback)
pluginName | the name of the plugin |
slot | slot (function, interface) within the plugin |
payload | a JSON object with the required parameters for the plugin |
callback | function, which is called after the successful execution of the plugin |
showBusyIndicator | boolean value that indicates whether the screen has to be blocked by a loading bar (true) or not (false) |
failonError | boolean value that indicates whether the plugin should be called in case of an error of the function passed via “failCallback” (false) or not (true) |
failCallback | function, which is called in case of an error in the plugin, is false for “failOnError” is passed |
_______________________________________________
Applications can be deployed rapidly and previewed within a standard web browser and on the mobile device using the Simplifier Mobile Client.
If you click on preview, it opens a new tab. Everytime you will deploy your application, the tab will be reloaded automatically.
You can simulate your preview for different mobile devices with the Chrome Developer Tools or use it for debugging.
To access the DevTools, open your app preview in Google Chrome. Either:
Via the toggle device toolbar, you can choose different devices like Galaxy S5, Iphone 6 or Ipad to preview your application.
(We used the short-code Ctrl+Shift+I to access the DevTools.)
_______________________________________________
The Process Designer allows to define process flows as the result of an event in an intuitive, graphical way. The Process Designer tab is located next to the UI Designer. By that, it follows the classic workflow of creating an app: First, you design the screens of your app, followed by the definition of the workflow between these elements in the Process Dashboard.
The Process Dashboard is divided into different User Stories which you can save individually, so it’s possible to work on it simultaneously with several people. After saving the entire app in the UI Designer or deploying it in the Process Designer, all stories will be merged into one. If you save an user story in the Process Designer, the changes won’t be displayed in the preview as long as it’s not deployed.
You can add a new story by dragging “Story” on the left into the middle. A pop-up will appear to set a name, an external link and the link text for it and a story description. You can open multiple user stories at the same time. To switch between the user stories, simply switch between the tabs.
To edit or delete an existing one, click on the equivalent icons. The stories will be orderd alphabetically (or by number if you use them). It is possible to sort the user stories in ascending or descending order. You can do this on the right.
By double clicking on the whole tile, you will be forwarded to the Process Designer where you can work on your story.
If you leave a user story and have unsaved changes, the following pop up appears:
The main view of the Process Designer is split into three main sections:
You have the possibility to search within the Process Dashboard for occurrences of elements.
Therefore, the user can now switch between the live search for story names (frontend search) and the search for widget names (backend search) in the Process Designer. While the search for story names continues to apply a live filter to the list of tiles, the search for widget names must be explicitly confirmed by pressing the search button or entering the search field. So there are two different UIs.
As a result all activities using widgets whose names match the search term are highlighted in green.
The toolbar within the Process Designer gives you the control of appearance of your process.
Number | Function | Description |
1 | Grid resolution | This slider changes the size of the grid in combination with the “snap to grid” function (2), you have full control to properly align your process. |
2 | Snap to grid | When deactivating (click on the icon), you can freely move all activities. |
3 | Zoom | You can zoom out (left icon), zoom in (right icon) and reset the zoom with the icon in the middle. |
4 | Connection settings | You can choose between three types of connections:
|
5 | Delete | With this icon, the currently selected activities and connections will be deleted. |
You can cut, copy, paste and delte shapes within the Process Designer. Therefor you have to click on the appropriate icons on the top right of the canvas.
With the left icon you can cut your selected shapes from the canvas. So the shapes including connections and mappings of the configured shapes were copied and dropped.
With the second icon from the left you can copy the selected shapes including the connections and mappings from the canvas.
With the third icon from the left you can paste your copied (or cut) shapes including all connections and mappings. They appear slightly offset from the copied or cut shapes.
With the right icon you can delete your selected shapes. You can also do this with the delete key on your keyboard.
If you have any errors in your process, you will receive a feedback about that. Every error will be displayed within the process. The corresponding activity will be highlighted in red and a tooltip will be shown by hovering over it.
The Process Designer is no longer available for applications using AngularJS.
If you build your application with Angular 2, there are no limitations.
_______________________________________________
With the Push Notification Connector, you can send a notification to all logged in users who have the selected role on the Simplifier instance.
Select the roles to which you want to send a message in the connector configuration mask. Unfortunately, a multi-select is not yet possible and you have to select several roles in succession.
To create the connector calls for this connector, take a look at Push Notification Connector Calls.
How to use a Push Connector in a REST-Client (e.g. the Advanced Rest-Client)
Step 1: You need a Token
Request Type: POST Content Type: application/json Payload: {"user":"<username>", "pass": "<password>"}
Returns: { "result": "someprettylongtoken", "success": true }
Step 2: Make a Connector request with this Token
XHR Type: POST Content Type: application/json Header: SimplifierToken Payload: { "connectorName" : "<connector_name>", "json": { "msg" : "<some_string>" } }
{ "connectorName" : "Push", "json": { "msg" : "test" } }
XHR Type: POST Content Type: application/json Header: SimplifierToken Payload: { "connectorName" : "<connector_name>", "json": { "msg": "{"order_id":"<NotificationMessage> <header> <message_id>1234567890</message_id><created>date_time</created> <request> <site>9999</site> // Asset Nr.<resource>Station_1</resource> // Ressource/ Workplace<order>variant_123</order> // Order-/ SFC Nr.<variant>variant_123</variant> // Variant Nr.<assy>assembly_123</assy> // Assembly Group Nr. <time>180</time> // Time allowance </request> </header> </NotificationMessage>"}" } }
_______________________________________________
The Push Notifiaction Connector Call requires only one input parameter to be defined:
Parameter Name | Data Type |
msg | String |
Parameter Name | Data Type |
msg | String |
_______________________________________________
The QR Login-Generator lets you generate your individual QR-Code for login purposes especially for wearable devices without keyboard. You don’t need to type in your credentials anymore, just scan the QR-Code and you are logged in on your instance. Especially when using smart glasses, this feature is comfortable as it takes just a quick scan to enter Server URL, username and password without typing.
To generate such a QR code, go to the tile Users on the Simplifier dashboard and switch then to the tab QR Generator in the user overview.
You have to enter the required user with password and the Server URL. By default, this is already filled in. Generate the Login Code and now you can log in to other devices easily and quickly by scanning the QR Code.
_______________________________________________
Call for READ operations (The name TIA_READ is the arbitrary chosen name for this call)
For the READ Connector Call, you need to configure the “operationType ” and the “nodeId” (consisting of 2 parameter: identifier and namespaceIndex). Furthermore you can define the Identifier Type (optional) and the order of the operations in the code (optional).
operationType: Defines which operation you want to execute, in this case “READ”.
Parameter Name: operations/arrayItem[0]/operationType
Constant Value: READ
Data Type: String
nodeID: Defines the identification of the OPC/UA node. It is split in 2 Parameter:
identifierType (optional): Searches for the Identifier with a fixes Data Type.
Parameter Name: operations/arrayItem[0]/identifierType
Constant Value: String or Numeric
order (optional): Order in which the actions should be performed.
This parameter changes the execution order of the specified READ commands e.g. if we have three READ commands. Command 1 reads from node x, command 2 reads from node y and command 3 from node z, the normal execution order would be: x, y, z.
By specifying the read order with numbers starting from 0 to the last command number subtracted by one (e.g. for three commands it would be 2), the execution will be changed according to the defined number.
For example by adding “order”:[2,1,0] to your code, you switched the operations, so the read commands would be executed the following way. z, x, y.
NOTE: The specific commands are NOT defined here!
You can return all Output Parameter like this:
Parameter Name: /
Data Type: String
If you want to get only selected Output Parameter, use the following syntax:
Parameter Name: operationsResult/[0]/dataType/name (exemplary)
Data Type: depends on the Parameter you want to be returned.
For now, only the complete unformatted JSON will be returned.
_______________________________________________
To receive messages via the Process Dashboard, you need to perform the following steps:
Continue with script:
var lv_msg = data.data.msg;
data.data.msg must eventually be adapted to the output parameter specified in the connector call. lv_msg is the received message (type String, can be e.g. a JSON string, then parse to get object:
JSON.parse(data.data.msg)
It returns the object:
{propertyOne: 'abc', propertyTwo: 5}
Continue without script:
Use the output mapping to map received messages, e. g. to a widget or to save it in a variable.
_______________________________________________
Besides the creation of individual transports, there is a second approach to export your data to another system. By releasing your app after you finished your project or along the way for testing purpose.
Everytime you create a new application, a transport file will be generated automatically with your app’s name. It is advisable to update this Transport during your working process (add every feature you use).
For releasing the app, your Transport has to be approved by an Admin in advance. If the approval was given, click on the “Release” button in the UI Designer to export your app. Next, you can add a release note.
If your release was successful, you can see the current version of your app in the Application Overview. Click on the “Show Releases” Icon for an overview of the metadata and a direct download option.
_______________________________________________
This section contains a description of all possible websocket requests for an asynchronous connector (For now only the subscription and unsubscription are documented).
Subscription Request
This request subscribes the websocket to an asynchronous connector and will receive messages from it.
var request = null;
request = {
"frameType": "subscribe",
"subscriptionKey":[requestUUID],
"json": [requestData]
};
Unsubscription Request
This request unsubscribes the websocket from an asynchronous connector and will not receive messages from it any more. Whether the connector stops working or not depends on the connector implementation.
var request = null;
request = {
"frameType": "unsubscribe",
"subscriptionKey": [requestUUID]
};
[requestUUID]
A unique String, which acts as the identification key.
An example key might be “bb827118-f1b0-2170-9937-f8c7e1620107”.
[requestData]
A Json object, which will be send to the respective connector. Examples can be found here and here.
_______________________________________________
In the following sections you will find instructions how to create datatypes, that are required for certain connector calls.
_______________________________________________
(On-Premise Installation)
Remote Service applications demand some additional requirements, especially on the network side. To successfully establish a connection between two clients, e.g. the Remote Service Portal, running in the browser on a Desktop machine and the Remote Service Client running on a Smart Glass, they must either reside in the same network, or a STUN-/TURN-server must be used.
The minimum requirements for using a remote service application are:
_______________________________________________
This section describes the necessary parameters and data types for REST connector calls.
When the connector is executed, it will only return as JSON as a result, if the content-type of the http result is “application/json”. In all other cases, the connector will return a json object with the following keys:
_______________________________________________
Endpoint
The URL of the Rest Service without specific paths.
Verb
The Operation that is supported by this REST Service. You can set the path and query parameters as well as the response format (XML or JSON) for each operation.
_______________________________________________
The URL defines the REST endpoint.
_______________________________________________
The Simplifier Server needs a typcial Reverse Proxy as standard setup.
The Reverse Proxy should provide the following services for a secure setup
Forwarded Ports:
Cross-Origin Resource Sharing (CORS) is a mechanism that uses additional HTTP headers to allow a user agent to access selected resources from a server located on a different origin (domain) than the currently used Web site. A user agent makes a cross-origin HTTP request when requesting a resource from another domain, protocol, or port than the one from which the current document originates.
The CORS mechanism supports secure cross-domain queries and data transfers between browsers and web servers. Modern browsers use CORS in an API container such as XMLHttpRequest or Fetch to minimize the risks of cross-origin HTTP requests.
Header name | Header value |
Access-Control-Allow-Origin | * |
Access-Control-Allow-Credentials | true |
Access-Control-Allow-Methods | GET, POST, PUT, DELETE, OPTIONS |
Access-Control-Allow-Headers | DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,SimplifierToken |
Header name | Header value |
Access-Control-Max-Age | 1728000 |
Response name | Response code |
Empty Content | 204, No proxy call required |
Location / Path | Description |
“^/genToken/$” | The Simplifier Authentification Service based on Tokens |
“^/assets/(.*)$” | The static assets like images , pdf files etc for an Application |
“^/client/(.*)$” | The Client REST API to access business objects, connector or plugins |
“^/library-managed/(.*)$” | Third Party Javascript Libraries that need for the HTML5 Applications |
“^/library-static/(.*)$” | Third Party Javascript Libraries that need for the HTML5 Applications |
“^/appDirect/(.*)$” | Hosting Path for the created HTML5 Applications |
“^/UserInterface/(.*)$” | Admin Backend Interface Application (should only accessible in a secure environment, internal network) |
“^/authentication/(.*)$” | External Authentication Provider for e.g. oAuth |
“^/passwordExpired/(.*)$” | Password Reset Page for Admin Interface |
“^/marketplace/(.*)$” | Simplifier Marketplace |
“^/develop/(.*)$” | Plugin Interface |
_______________________________________________
To use the RFC Connector Call with the operation EXECUTE, you have to configure the following input parameter in the Simplifier:
The second one is optional.
In this case: EXECUTE
Defines which parameters you pass – you can transfer imports, changings and tables and then fire the function.
Defines the return parameter.
The value is a list of the following values, but only one of them can be used at the same time.
Returns additional changing parameter to see if the tables have changed somehow when executing the function block (point of time is depending on the returnSet).
The value is a list of the following values, but only one of them can be used at the same time.
If you’ve set INPUT as returnInformation, the changing parameter before the function has been executed will be displayed.
If you’ve set OUTPUT as returnInformation, the changing parameter after the function has been executed will be displayed.
_______________________________________________
To use the RFC Connector Call with the operation GET, you have to configure the following input parameter in the Simplifier:
In this case: GET
Defines the exact information you want to return from the function block. Choose between:
With the following values (but the value may only appear once in the list, e.g. [import, template];[export])
Lists the complete structure (with SAP metadata) of the function block. Choose between:
Enter the value as a list. [STRUCTURE, METADATA]
Structure is the default.
_______________________________________________
This section describes the necessary parameters and data types for RFC connector calls. There are two different kind of calls
_______________________________________________
The section Role Overview defines permissions for your users. Here you can configure roles that you can then apply to your users in order to permit or restrict certain actions, like administering applications and users or allow the use of special applications and restrict the use of others. Usually, there is one administrator-role that is allowed to use all features and functions of the Simplifier.
To create a new role , click on the plus icon to enter the create dialog. To add permission, use the selection helper on the right and choose the needed permission category. To enable or disable a single permission, click on the checkbox in the corresponding column. Finally, assign the role to existing users. Hit the save button to finish the role creation or the update.
Within the right tab you can add a user to the role. Use the Selector for this.
_______________________________________________
Create the directory which will host all external user-specific data
For Linux and Mac
$ mkdir -p /home/simplifier/data
$ export SIMPLIFIER_DIR=”/home/simplifier/data”
For Windows, please replace “SIMPLIFIER_DIR” with an absulute path.
Example: “C:\Docker\Simplifer\Data”
Install SSL certificates:
$ mkdir -p SIMPLIFIER_DIR/certs
$ cp <certificate.pem> SIMPLIFIER_DIR/certs/default.crt
$ cp <keyfile.pem> SIMPLIFIER_DIR/certs/default.key
Run docker:
Alternative 1: with SSL/Certificates
$ docker run -d -v $SIMPLIFIER_DIR:/opt/simplifier/data \
-p 80:80 -p 443:443 -p 8090:8090 \
––name=simplifier itizzimo/simplifier
Alternative 2: without SSL/Certificates
$ docker run -d -v $SIMPLIFIER_DIR:/opt/simplifier/data \
-p 80:8080 -p 8090:8091 \
––name=simplifier itizzimo/simplifier
Browse the Simplifier:
Now you can open the Simplifier in your browser.
http(s)://localhost/UserInterface
To avoid certificate errors, you can create a local host entry for your domain stored in the certificate for the HTTPS connection.
e.g. https://simplifier.<yourcompany>/UserInterface
_______________________________________________
With the Simplifier we offer several connectors/options to interface with SAP:
In the following sub-sites you can see the BAPIs we offer, that can be accessed through above mentioned Interfaces within our own SAP Namespace ITIZ.
_______________________________________________
Method | SAP Transaction | Description |
READ | SE38 – RSSCD200 | Load a change document usign the using the object key. |
SEARCH_BY_DATA | SE38 – RSSCD200 | Search for a change document |
SEARCH_BY_DATE | SE38 – RSSCD200 | Search for a change document via date range. |
_______________________________________________
Method | SAP Transaction | Description |
CREATE | BP | Create Business Partner master data. |
READ | BP | Load a Business Partner. |
UPDATE | BP | Update Business Partner master data. |
DELETE | BP | Delete Business Partner. |
CREATE_BANK_DATA | BP | Create bank data. |
CREATE_TAX_DATA | BP | Create tax data. |
CREATE_INDUSTRY_SECTOR | BP | Create industry sector. |
_______________________________________________
Method | SAP Transaction | Description |
CREATE | CV01N | Create document object master data. |
READ | CV03N | Load a document using the document object key. |
UPDATE | CV02N | Update document object master data. |
DELETE | CV02N | Mark document for deletion. |
CREATE_ORIGINAL_FILE | CV02N | Create a file from raw content, including original. |
READ_ORIGINAL_FILE | CV03N | Read a file’s contents with document number and file ID. |
UPDATE_ORIGINAL_FILE | CV02N | Update file details. |
DELETE_ORIGINAL_FILE | CV02N | Delete file from document, including original. |
_______________________________________________
Method | SAP Transaction | Description |
CREATE | MM01 | Create material master data. |
READ | MM03 | Load material using the material number. |
UPDATE | MM02 | Update material master data. |
DELETE | MM02 | Mark material for deletion. |
READ_ADDITIONAL_DATA | mm03 | Read additional material master data. |
READ_MATERIAL_AVAILABILITY | ATP information. |
_______________________________________________
Method | SAP Transaction | Description |
READ | Various (e.g. QM03) | Read an object status based on the object numbers. |
READ_HISTORY | Read system / user status change documents. | |
SET_STATUS_OF_OBJ | Set system / user status of an object. | |
RESET_STATUS_OF_OBJ | Removing the system / user status with no reference number to object X. |
_______________________________________________
Method | SAP Transaction | Description |
READ | BS03 | Load an status profile based on the object numbers. |
SEARCH | BS03 | Search a status scheme. |
_______________________________________________
Method | SAP Transaction | Description |
READ | SU01D | Read a SAP User. |
_______________________________________________
Method | SAP Transaction | Description |
CREATE | PA61 | Load contemporary document master data using the contemporary document object key. |
READ | PA61 | Read contemporary document object master data. |
UPDATE | PA61 | Updatecontemporary document object master data. |
DELETE | PA61 | Delete a contemporary document. |
READ_TIME_STATEMENT | PT40 | Read remaining leave. |
_______________________________________________
Method | SAP Transaction | Description |
CREATE | BP | Create ISU Business Partner master data. |
READ | BP | Load a ISU Business Partner. |
UPDATE | BP | Update ISU Business Partner master data. |
DELETE | BP | Mark a ISU Business Partner for deletion. |
SEARCH | BP | Search for a ISU Business Partner. |
CREATE_FLAT | BP | Simplified creation of ISU Business Partner. |
_______________________________________________
Method | SAP Transaction | Description |
CREATE | ES55 | Create connection object master data. |
READ | EBAA | Loading a connection object based on the connection object number. |
UPDATE | ES64 | Update connection object master data. |
DELETE | N/A | Deletion of a connection object is not possible. |
SEARCH | EBAA | Search for a connection object. |
READ_HIERARCHY | EBAA | Read the hierarchy of a connection object. |
_______________________________________________
Method | SAP Transaction | Description |
CREATE | ES65 | Create device location master data. |
READ | ES67 | Load a device location using the device location object number. |
INSTALL | IE02 | Installation of a device location. |
DISMANTLE | IE02 | Dismantling of a device location. |
_______________________________________________
Method | SAP Transaction | Description |
CREATE | ES60 | Create premise master data. |
READ | ES62 | Load a premise using the premise object number. |
UPDATE | ES61 | Update premise master data. |
DELETE | ES61 | Mark a premise for deletion. |
SEARCH | ES62 | Search for a premise. |
_______________________________________________
Method | SAP Transaction | Description |
CREATE | ES30 | Create Utility Installation object master data. |
READ | ES32 | Load a Utility Installation based on the Utility Installation object number. |
_______________________________________________
Method | SAP Transaction | Description |
READ | SE16n | Read a database table. |
READ_FIELDS | SE16n | Read the available fields to a database table. |
_______________________________________________
Method | SAP Transaction | Description |
READ | SE16n | Load data from the SAP database, which can be used as a key value. |
READ_DATA_ELEM | SE11 | Read ABAP domain fixed values of data element X. |
_______________________________________________
Method | SAP Transaction | Description |
CREATE | ML81 | Create a MM Entry Sheet. |
READ | ML82 | Load a MM Entry Sheet using the Entry Sheet number. |
DELETE | ML81 | Mark a MM Entry Sheet for deletion. |
_______________________________________________
Method | SAP Transaction | Description |
CREATE | MIGO | Create a goods movement. |
READ | MIGO | Load a goods movement using the object key. |
CANCEL | MBST | Cancel a goods movement. |
_______________________________________________
Method | SAP Transaction | Description |
CREATE | ME21N | Create Purchase Order master data. |
READ | ME23N | Load a Purchase Order using the Purchase Order object number. |
UPDATE | ME22N | Update Purchase Order master data. |
DELETE | ME22N | Mark a Purchase Order for deletion. |
SEARCH | ME23N | Search for purchase orders by vendor ID / purchase organization / factory / group / order type / status. |
_______________________________________________
Method | SAP Transaction | Description |
CREATE | AC01 | Create MM Service Master. |
READ | AC03 | Load a MM Service Master based on the Service Master number. |
UPDATE | AC02 | Update MM Service Master. |
DELETE | AC02 | Mark MM Service Master for deletion. |
_______________________________________________
Method | SAP Transaction | Description |
CREATE | IE01 | Create equipment master data. |
READ | IE03 | Load an equipment using the equipment number. |
UPDATE | IE02 | Update equipment master data. |
DELETE | IE02 | Mark an equipment for deletion. |
SEARCH | IE03 | Search for an equipment. |
READ_CLASSES | IE03 | Read the class characteristics of an quipment. |
READ_STATUS | IE03 | Read the user and system status of an equipment. |
CHANGE_CLASSES | IE02 | Update the equipment class charactersitics. |
CREATE_BY_REFERENCE | IE01 | Create an equipment according to a model X. |
LOAD_BY_BAPI_GETLIST | Search for the point of use via BAPI_EQUI_GETLIST. | |
INSTALL | IE02 | Installation of an equuipment. |
DISMANTLE | IE02 | Dismantle an equipment. |
_______________________________________________
Method | SAP Transaction | Description |
CREATE | IL01 | Create functional location master data. |
READ | IL03 | Load a functional location. |
UPDATE | IL02 | Update a functional location. |
DELETE | IL02 | Delete a functional location. |
READ_HIER | IL03 | Read the hierarchy of a functional location. |
CONV_EXT_2_INT | SE37 | Converts the primary key from the external format to the internal format. |
READ_CLASS | IL02 | Read class characteristics of a functional location. |
_______________________________________________
Method | SAP Transaction | Description |
CREATE | IQS1 | Create a maintenance notification. |
READ | IQS3 | Load a maintenance notification. |
UPDATE | IQS2 | Update a maintenance notification. |
DELETE | IQS2 | Delete a maintenance notification. |
SEARCH | IQS3 | Search for maintenance notification. |
_______________________________________________
Method | SAP Transaction | Description |
CREATE | IW41 | Create a maintenance order confirmation. |
READ | IW43 | Load a maintenance order confirmation using the object key. |
_______________________________________________
Method | SAP Transaction | Description |
CREATE | IW54 | Create a service notification using the object key. |
READ | IW53 | Load a service notification using the object key. |
UPDATE | IW52 | Update a service notification. |
DELETE | IW54 | Delete a service notification. |
ADD_DATA | IQS2 | Add data to the service notification. |
SEARCH_NOTF_LIST | IW53 | Search for a service notification with the notification list. |
_______________________________________________
Method | SAP Transaction | Description |
CREATE | IW31 | Create a service order using the object key. |
READ | IW33 | Load a service order using the object key. |
UPDATE | IW32 | Update a service order. |
_______________________________________________
Method | SAP Transaction | Description |
READ | CO03 | Loading an MM service master using the primary key. |
CREATE | CO01 | Create MM service master. |
READ_DOCUMENTS | CO03 | Read the document overview of a production order. |
RELEASE | CO02 | Release of a production order. |
_______________________________________________
Method | SAP Transaction | Description |
READ | QM03 | Read a quality notification with a primary key. |
_______________________________________________
SAP System Mandatory Information
The following parameters are mandatory:
Parameter | Description | Example | Mandatory |
System ID | Unique ID of SAP System | ID4 | Yes |
Client Number | Number of SAP Client | 100 | Yes |
System Number | SAP System Instance Numeber | 80 | Yes |
Language | Default Language for SAP Logon | de | Yes |
SAP System Optional Information
The following parameters are optional:
Parameter | Description | Example | Mandatory |
Username Alias | Alias of Username | RFCTEST | No |
SAP System Group | Groupname of SAP Systems | GRP | No |
R3 System Number | Number of R3 System | 80 | No |
SAP Client Type |
Not defined (Default) R2 System R3 System External System |
Not defined | No |
SAP System Host-Information
Please fill out either Application Server or Gateway Server Hostname to define the endpoint to the SAP Backendsystem
Parameter | Description | Example | Mandatory |
Application Server Hostname | IP Address of SAP System | 10.110.25.7 | No |
Gateway Server Hostname | IP Address or Hostname of Gateway Server | 10.100.26.0 | No |
Message Server Hostname | Message Server IPv4 address or hostname | 10.110.29.0 | No |
Gateway Host Hostname | IP Address or Hostname of the Gateway Host Server | 10.110.29.9 | No |
Use External System (Optional)
Settings
Permissions
SAP Router (Optional)
_______________________________________________
Method | SAP Transaction | Description |
CREATE | VF01 | Create a Billing Document. |
READ | VF03 | Load a Billing Document based on the Billing Document Number. |
DELETE | VF02 | Mark a Billing Document for deletion. |
_______________________________________________
Method | SAP Transaction | Description |
CREATE | XD01 | Create customer object master data. |
READ | XD03 | Load a customer object based on the customer object number. |
UPDATE | XD02 | Update of customer object master data. |
DELETE | XD06 | Mark a customer for deletion. |
SEARCH | XD03 | Search for customer. |
CREATE_BY_REFERENCE | XD01 | Create a customer modelled on customer X. |
SEARCH_BY_ADRC | XD03 | Search for a customer based on the address. |
_______________________________________________
Method | SAP Transaction | Description |
CREATE | VA21 | Create Quotation object master data. |
READ | VA23 | Loading a Quotation object using the offer object number. |
UPDATE | VA22 | Update Quotation object master data. |
DELETE | VA22 | Mark the Quotation for deletion. |
DELETE_POSITION_BY_NO | VA22 | Delete a Quotation item. |
CREATE_POSITION_BY_NO | VA22 | Create a Quotation item. |
REJECT | VA22 | Select a reason for rejecting the Quotation. |
REJECT_BY_POS | VA22 | Select a reason for rejecting the Quotation by position. |
_______________________________________________
Method | SAP Transaction | Description |
READ | VA03 | Loading a sales order object based on the customer order object number. |
CREATE | VA01 | Create sales order object master data. |
UPDATE | VA02 | Update sales order object master data. |
DELETE | VA02 | Mark a sales order for deletion. |
SEARCH | VA03 | Search a sales order. |
READ_ORD_STATUS | VA03 | Read sales order status. |
CREATE_BY_CUSTOMER_QUOTATION | VA01 | Create a sales order with reference to the customer quotation. |
REJECT | VA02 | Reject a sales order. |
REJECT_POS_NO | VA02 | Reject sales order individually. |
_______________________________________________
Method | SAP Transaction | Description |
CREATE | XK01 | Create a SD Vendor. |
READ | XK03 | Load a SD Vendor. |
UPDATE | XK02 | Update SD Vendor. |
DELETE | XK02 | Mark a SD Vendor for deletion. |
_______________________________________________
Furthermore you can use the mechanism type RFC. It works on the same principle as SOAP. You can log on to the Simplifier via SAP and start connector calls with the SSO2 Token.
Name | Defines the name of the authentication |
Mechanism | SAP SSO |
Mechanism Type | RFC |
Priority | This defines the order in which the authentication mechanisms are processed |
SAP Server Type | The type of the SAP Server: Application Server, Gateway Service, Gateway Host, Message Server, Message Server Port |
Host name | This defines the IP/ Host of the authentication service |
SAP System ID | This defines the ID of the SAP System |
SAP System Number | This defines the number of the SAP System |
SAP System Language | This defines the language of the SAP System |
SAP Client Number | This defines the number of the SAP Client |
SAP Router Hostname | This defines the hostname of the SAP Router |
SAP Router Port | This defines the authentication port of the SAP Router |
Create profile regardless of received SSO-Token | If this switch is on, then the Simplifier will try to extract the profile. The used authentication method will be only: {Basic-Authentication}. If the username or password consists of non-alphanumerical symbols, then the authentication required for retrieving the user details might fail. |
Enforce default values for the profile extraction | If this switch is on, then all missing information in the profile will be replaced by default values. This will even happen when critical information, required for further extraction steps is missing. If this switch is off, then the extraction process will be terminated and an error will be returned. |
SAP Client Type | The type of the SAP Client: Not defined, R2, R3 or External |
|
You can assign an alias |
SAP R3 System Number | This defines the number of the SAP R3 System |
SAP System Group | This defines the group of the SAP System |
You can test the profile extraction and token retrieval as well as the whole chain seperately.
_______________________________________________
Using SAP SSO
You can use the SOAP service to authenticate via a SAP system and get a SSO2 Token for SAP SOAP webservices. The user synchronization is done by the iTiZZiMO own SAP RFC Module -ITIZ-_USER_READ or with a different SOAP-Webservice, which calls the standard SAP-Module BAPI_GET_USER_DETAIL.
Name | Defines the name of the authentication |
Mechanism | SAP SSO |
Mechanism Type | SOAP |
Priority | This defines the order in which the authentication mechanisms are processed |
Host name | This defines the IP/ Host of the authentication service |
Port | This defines the authentication port |
URI Type | This defines the URI Type (HTTP or HTTPS) |
WSDL Endpoint | This is composed of Host name, Port, URI Type and Client Number |
Client Number | This defines the SAP Client Number |
Ignore Invalid SSL Certificates | You can ignore invalid SSL Certificates |
|
You can set a timeout |
Operation Name | This defines the Operation name |
Binding Name | This defines the Binding name |
You can test the connection by inserting a Username and Password.
_______________________________________________
Method | SAP Transaction | Description |
CREATE | LT01 | Create a Transfer Order with a single position. |
READ | LT21 | Load a Transfer Order using the stock number and the Transfer Order number. |
DELETE | LT15 | Cancel a Transfer Order. |
CONFIRM | LT12 | Confirm a Transfer Order. |
_______________________________________________
To read data from backend systems through a simplifier connector or execute logic you can use screen events.
You need to check the box in order to work with the event of this widget in the edit mode of your user story (Process Designer) later.
_______________________________________________
The Script element allows you to integrate a custom JavaScript snippet. It is activated by the previous event. Drag the activity “Script” underneath “Logic” in the drawing area.
The activity “Script” shows a preview of the JavaScript full screen and its (optional) description on the right side. You can also enter code in this section, the changes were saved and also transferred in the full screen. The full screen will be opened by double clicking on the shape or by clicking on the appropriate icon.
You can prettify JavaScript code with just one click. Therefore you have to have the script activity on full screen. By clicking on the appropriate icon, your code will be simply prettified.
_______________________________________________
You can assign roles to apps, which is the first step in order to have anonymous logins.
All assigned roles to the app are imported and exported by the transport system. By default it is not allowed for anonymous users to execute data operations in the app.
Allowing anonymous users must be allowed with a conscious consent. For this you have to tick the checkbox besides “Allow anonymous users”. After that, the plus icon is available to assign a role.
You can also remove roles. All you have to do is click on the corresponding icon.
When disallowing anonymous users, all assigned roles will be removed.
When you navigate to an application, an authentication of the app for accessing an application token is triggered. All roles assigned to the app are linked to the application token. This feature allows anonymous users to e.g. execute connectors.
As a further security aspect, the app needs to provide a security functionality in order to obtain an application token.
_______________________________________________
The following tables refer to the OWASP Top 10 Security Measures 2017 and explain the security measurements and relevant settings to avoid security flaws within the Simplifier platform.
A1: Injection |
Simplifier Prevention |
User supplied data is not validated, filtered or santizied by the application. | Double validation against data type definition (client and backend validation). |
Hostile data is used directly with dynamic queries or non-parameterized calls for the interpreter without context-aware escaping. | All connector calls are parameterized, including SQL queries. |
Hostile data is directly used or concatenated, so that the SQL or command contains both structure and hostile data in dynamic queries, commands, or in stored procedures. | All connector calls are parameterized, including SQL queries. |
A2: Broken Authentication |
Simplifier Prevention |
You may have authentication weakness if your application… | The Simplifier uses a token authentication. This token expires after x seconds (depends on the server security settings). |
Permits credential stuffing, where the attacker has a list of valid usernames and passwords. | The permission object view own user details prevents the application to access all user data. |
Permits brute force or other automated attacks. |
We secure the authentication by deactivating the account after x times of failed logins. |
Permits default, weak or well-known passwords. |
The admin can secure the password by setting password rules in the Simplifier password settings. |
Uses weak or ineffectual credential recovery and forgot password processes, such as “knowledge-based answers”, which cannot be made safe. | Actual we provide an one-time link to reset the password via email, but no other security questions. |
Using plain text, encrypted, or weakly hashed passwords permits the rapid recovery of passwords using GPU crackers or brute force tools. | Our password does not exist in the database. We are using encrypted hashes via bcrypt algorithm. |
Has missing or ineffective multi-factor authentication. | We provide multi-factor authentication through OAuth 2.0 authentication method. |
A3: Sensitive Data Exposure |
Simplifier Prevention |
Data of a site is transmitted in clear text, internally or externally. | The Simplfier runs behind web proxy and all data is encrypted via HTTPS based on TLS 1.2 |
Sensitive data is stored in clear text, including backups. | The Simplfier doesn’t save personal data or sensitive data on its own database – we are using existing backend systems for that. |
Old or weak cryptographic algorithms are used either by default or in older code. | We rely on bcrypt. |
Default crypto keys are in use, weak crypto keys are generated or re-used, or proper key management or rotation is missing. | We rely on bcrypt. |
Encryption is not enforced, e.g. security policies or headers are missing. | If you use our provided reverse proxy template, this can not happen. |
A4: XML External Entities (XXE) |
Simplifier Prevention |
Your application accepts XML directly or XML uploads, especially from untrusted sources, or inserts untrusted data into XML documents, which is then parsed by an XML processor. | We only support XML formats with REST and SOAP connectors from trusted backend sources and no direct upload or data processing within an application. |
Any of the XML processors in the application or SOAP based web services has document type definitions (DTDs) enabled. | Yes, we parse WSDL and consider DTD if available and generate corresponding data type definitions within the Simplifier itself. |
If your application uses SOAP prior to version 1.2, it is likely susceptible to XXE attacks if XML entities are being passed to the SOAP framework. | We support SOAP version 1.2 |
SAST tools can help detect XXE in source code, although manual code review is the best alternative in large, complex apps with many integrations. | We only support XML formats with REST and SOAP connector from trusted backend sources and no direct upload or data processing within an application. |
Being vulnerable to XXE attacks likely means that you are vulnerable to other billion laughs denial-of-service attacks. | We only support XML formats with REST and SOAP connectors from trusted backend sources and no direct upload or data processing within an application. |
A5: Broken Access Control |
Simplifier Prevention |
Bypassing access control checks by modifying the URL, internal app state, or the HTML page, or simply using a custom API attack tool. | This can not happen because every API is secured by permission objects independent from the user interface itself. |
Allowing the primary key to be changed to another’s users record, such as viewing or editing someone else’s account. | This can not be happen because every API is secured by permission objects independent from the user interface itself. |
Elevation of privilege. Acting as a user without being logged in, or acting as an admin when logged in as a user. | The Simplifier authentication token is assigned to the client fingerprint that contains a lot of unique attributes like system configuration, browser version, screen resolution, browser plugins etc. If you use a foreign authentification token to gain privileges, you have to be on the same client system and using the same browser and user credentials – so it is very unlikely to misuse a foreign token. |
Metadata manipulation, such as replaying or tampering with a JWT access control token or a cookie or hidden field manipulated to elevate privileges. | The Simplifier authentication token is not stored in a cookie and is encrypted on the client with the client fingerprint. |
CORS misconfiguration allows unauthorized API access. | If you use our recommend reverse proxy example you will be safe in terms of CORS misconfiguration. |
Force browsing to authenticated pages as an unauthenticated user, or to privileged pages as a standard user or API not enforcing access controls for POST, PUT and DELETE. | All APIs are secured by permission objects. |
A6: Security Misconfiguration |
Simplifier Prevention |
Unnecessary features are enabled or installed. | Features are enabled via permission objects. |
Default accounts and their passwords are still enabled and unchanged. | Every single installation will get an automatically generated complex administrator password. We are not using default passwords. |
Does your error handling reveal stack traces or other overly informative error messages to users? | The logging and monitoring feature clears backend passwords out of the logs, so we will not include security related information within the logs. |
Old configurations are used with updated software which may not be backward compatible. | All configuration objects are automatically migrated to the newest release versions. |
Security settings in application servers, application frameworks, libraries, databases, etc. are not set to secure values. | In our cloud environment we are using very strong passwords. |
The server doesn’t send security directives to client agents or they are not set to secure values for web applications. | HSTS headers are set in the web reverse proxy. |
Any of your software is out of date. | Every customer is forced to upgrade once a year – older versions are supported via long term support that includes also security patches. |
A7: Cross-Site Scripting (XSS) |
Simplifier Prevention |
Reflected XSS: Your app or API includes unvalidated and unescaped user input as part of HTML output or there is no content security policy header. | We use the content security header. |
Stored XSS: Your app or API stores unsanitized user input that is viewed at a later time by another user or an administrator. | All API fields are validated against data type defintions to prevent unsanitised data. |
DOM XSS: JavaScript frameworks, single page apps, and APIs that dynamically include attacker-controllable data to a page are vulnerable to DOM XSS. | We provide encoding function also for JavaScript for HTML, URL, CSS and JavaScript. |
A8: Insecure Deserialization |
Simplifier Prevention |
The serialization mechanism allows for the creation of arbitrary data types, AND | We transform every data to JSON format with sanitize options. |
There are classes available to the application that can be chained together to change application behavior during or after deserialization, or unintended content can be used to influence application behavior, AND | We only accept valid JSON data. Each data object will be checked against API data definition by default. |
The application or API accepts and deserializes hostile objects supplied by an attacker, or an application uses serialized opaque client side state without appropriate tamper resistant controls. OR | We only accept valid JSON data. Each data object will be checked against API data definition by default. |
Security state sent to an untrusted client without some form of integrity control is likely vulnerable to deserialization. | Every client has to be authenticated to check if the client is trusted. |
A9: Using Components with Known Vulnerabilities |
Simplifier Prevention |
You don’t know the versions of all components you use (both client-side and server-side). This includes components you directly use as well as nested dependencies. | All depending libraries are checked against security exploits with VersionEye Service. |
Your software is out of date. This includes the OS, Web/App Server, DBMS, applications, APIs and all components, runtime environments and libraries. | All components are checked against update with VersionEye. |
You don’t know if they are vulnerable. Either if you don’t research for this information or if you don’t scan them for vulnerabilities on a regular base. | All components are checked against update with VersionEye. |
You don’t fix nor upgrade the underlying platform, frameworks and dependencies in a timely fashion. | We provide security hotfixes for the last 2 major releases (1 year). |
You don’t secure the components’ configurations. | We secured the complete configuration. |
A10: Insufficient Logging & Monitoring |
Simplifier Prevention |
Auditable events, such as logins, failed logins, and high value transactions are not logged. | Failed login attempts and valid logins are logged as such as every business object or connector call. No matter what kind of value this transaction is. |
Logs of applications and APIs are not monitored for suspicious activity. | All applications are monitored. |
Alerting thresholds and response escalation according to the risk of the data held by the application is not in place or effective. | Actual it is not possbile to alert security response teams or administrator via email after certain security events – this will be available in further releases. |
_______________________________________________
To send messages via the Process Dashboard, you need to take the following steps:
_______________________________________________
An object can be passed as a message by converting it into a JSON string:
JSON.stringify({propertyOne: 'abc', propertyTwo: 5}) var lo_payload = { 'msg:'<requested message>' }; function successCallback(po_result) { //Enter any code that will be executed in case of success } function errorCallback(po_result) { //Enter any code that will be executed in case of error } this.callConnector("<connector-name>", lo_payload, successCallback, true, true, errorCallback);
_______________________________________________
The Server Action enables you to configure the login or logout for an application.
After mapping the according parameters you can decide which port you’d like to connect.
Port | Description |
success | The process will be executed after a successful login or logout. |
error | The process will be executed after a failed login or logout. |
already logged in | The process will be executed if the user is already logged in. |
The Server Action needs two parameter as input, if you want the user of the application to fill in his username and password.
You can map the widgets in which the user fills in the information with the equivalent input parameter. (By double clicking on the Widget, you can choose the exact property that you need).
The Login screen of your application might look like this:
You can use a Single Sign-on if you want to allow a user to use a single set of login credentials to access multiple applications. In difference to the first login method you have to map an additional parameter, the authentication.
Therefore you have to add this authentication method to the Simplifier in advance (this will be an admin task – take a look at “Settings for Admins“).
The name that was given to the authenciation is the one that is needed as an input parameter.
The Login screen of your application might look like this:
For the Server Action Logout you don’t have to configure anything additionally.
_______________________________________________
You can access any methods, like Logging, Utils/Tools, Email, Connectors, Business Objects, Plugins, Users, Permissions, Groups and Roles of the Simplifier by using the Simplifier Object.
Simplifier.Log.info(message: string): void Simplifier.Log.info(message: string, details: string|object): void Simplifier.Log.warn(message: string): void Simplifier.Log.warn(message: string, details: string|object): void Simplifier.Log.error(message: string): void Simplifier.Log.error(message: string, details: string|object): void Simplifier.Log.debug(message: string): void Simplifier.Log.debug(message: string, details: string|object): void
Simplifier.Log.warn("Test log entry"); Simplifier.Log.info("Test log entry with Details", "Details String"); Simplifier.Log.error("Test log entry with Details", {'key': 'value'});
Simplifier.Util.xml2json(xml: string): string Simplifier.Util.json2xml(json: string): string Simplifier.Util.encodeBase64(string: string): string Simplifier.Util.decodeBase64(json: string): string
var encoded = Simplifier.Util.encodeBase64("String to encode"); var decoded = Simplifier.Util.decodeBase64(encoded);
Simplifier.Email.sendTemplateMail(payload: string|object): void
Simplifier.Email.sendTemplateMail({ templateNamespace: "MyNamespace", templateName: "MyTemplate", emailCharset: "UTF_8", emailMime: "text/html", receiver: "test@test.de", receiverCC: ["cc@test.de"], subject: "My Mail", "data": {"Var1": "Replacement1"} });
Simplifier.Connector.<ConnectorName>(payload?: string|object): object Simplifier.Connector.<ConnectorName>.<CallName>(payload?: string|object): object
var connectorResult = Simplifier.Connector.MySoap({bindingName: "Binding", "operationName": "MyOp", "soap": {"foo": "bar"}}); var connectorCallResult = Simplifier.Connector.MySoap.myCall({"Foo": "bar"});
Simplifier.BusinessObject.<BOName>.<MethodName>(payload?: string|object, parametrized?: boolean = true): object Simplifier.CurrentBusinessObject.<MethodName>(payload?: string|object, parametrized?: boolean = true): object (--> BOName = Currently executed Business Object)
var otherMethodResult = Simplifier.BusinessObject.OtherBO.someMethod({"foo": "bar"}); var unparamtetrizedResult = Simplifier.BusinessObject.OtherBO.someMethod("{\"foo\": \"baz\"}", false); var sameBoResult = Simplifier.CurrentBusinessObject.someMethodOnSameBO({"baz": "baz"}); var noArgsResult = Simplifier.CurrentBusinessObject.methodWithoutArgs();
Simplifier.Plugin.<PluginName>.<SlotName>(payload?: string|object): object
var repos = Simplifier.Plugin.contentRepoPlugin.listRepos(); var newRepo = Simplifier.Plugin.contentRepoPlugin.createRepo({name: "MyRepo"}); Simplifier.Plugin.contentRepoPlugin.updateRepo("{\"id\": 15}");
Simplifier.User.getAll(): Array<object> Simplifier.User.getById(id: number): object|null Simplifier.User.getByName(loginName: string): object|null Simplifier.User.getCurrentUser(): object|null Simplifier.User.create(data: object|string): object Simplifier.User.update(id: number, data: object|string): object Simplifier.User.update(loginName: string, data: object|string): object Simplifier.User.delete(id: number): void Simplifier.User.checkLogin(login: string, password: string): boolean Simplifier.User.assignRole(loginName: string, roleId: string): void Simplifier.User.assignRole(id: number, roleId: string): void Simplifier.User.unassignRole(loginName: string, roleId: string): void Simplifier.User.unassignRole(id: number, roleId: string): void Simplifier.User.assignGroup(loginName: string, roleId: string): void Simplifier.User.assignGroup(id: number, roleId: string): void Simplifier.User.unassignGroup(loginName: string, groupId: number): void Simplifier.User.unassignGroup(id: number, groupId: number): void Simplifier.User.getAttributes(id: number): Array<object> Simplifier.User.getAttributes(loginName: string): Array<object> Simplifier.User.getAttribute(id: number, name: string, category: string): string|null Simplifier.User.getAttribute(loginName: string, name: string, category: string): string|null Simplifier.User.setAttribute(id: number, name: string, category: string, value?: string|null = null): void Simplifier.User.setAttribute(loginName: string, name: string, category: string, value?: string|null = null): void Simplifier.User.resetPasswordWithEmailTemplate(id: number, emailData: object|string): void Simplifier.User.resetPasswordWithEmailTemplate(loginName: string, emailData: object|string): void Simplifier.User.setPassword(oneTimeHash: string, newPassword: string): void
Simplifier.Permission.checkPermission(permissionName: string, characteristic: string): boolean Simplifier.Permission.checkPermissionCharacteristic(permissionName: string, characteristic: string, characteristicValue: string): boolean
Simplifier.Group.getAll(): Array<object> Simplifier.Group.getById(id: number): object|null Simplifier.Group.create(data: object|string): object Simplifier.Group.update(id: number, data: object|string): object Simplifier.Group.delete(id: number): void Simplifier.Group.getUsersByGroup(id: number): Array<object>
Simplifier.Role.getAll(): Array<object> Simplifier.Role.getById(id: string): object|null Simplifier.Role.create(data: object|string): object Simplifier.Role.update(id: string, data: object|string): object Simplifier.Role.delete(id: string): void Simplifier.Role.getUsersByRole(id: string): Array<object>
_______________________________________________
As a user that is defined as an admin by the corresponding role, you can hit the settings button by clicking on your user profile name on the top right corner.
Within the settings panel, you can define several settings.
The Server settings control your session. At the subtitle Authentication token you can set the lifetime of the authentication token and its checking interval.
If you set the authentication token to active, the checking interval to 10 seconds and the maximum lifetime of authentication token to 3600 seconds, that means that every 10 seconds it will be checked if you are inactive. If you are inactive for about 3600 seconds, you will be automatically logged out.
Within the SMTP Settings, you can define the email settings.
Send E-Mails | |
SMTP Host | Here you define the outgoing mail server, for example smtp.gmail.com |
SMTP Port | Specify the port of the outgoing mail server, for example 587 |
Authentication required | If activated, a user/password authentication from the outgoing mail server is required. |
Encrypted with TLS | If activated, the transmission is encrypted by TLS. |
Sender E-Mail | Enter the sender’s email address, for example no-reply@simplifier.io |
Sender | Specify the name of the sender to be displayed. |
Password | Select a secure password. |
You can switch on Experimental Features. It’s not guaranteed that these features work propery.
At the subtitle Support you can also activate guided tours and the chat function. If you want to raise statistics, you can also activate it.
The Password settings specify the password policy for your users.
Minlength | Minlength defines the minimum length of a password. Set a higher number for added security |
Count lowercase characters | This defines the minimum count of lowercase characters in passwords. For example, setting it to 4 means that a password has to be “abcdEFG” (at least four lowercase characters) |
Count uppercase characters | This defines the minimum count of uppercase characters in passwords. For example, setting it to 4 means that a password has to be “ABCDefg” (at least four uppercase characters) |
Count numbers | This defines the minimum count of numbers in passwords. For example, setting it to 4 means that a password has to be “1234abc” (at least four numerical characters) |
Block user after specified number of failed attempts | This prevents Brute Force Attacks. You can specify a limit for failing logins. If the user exceeds the limit he will be blocked. To unlock the user, the admin has to do this via the user management or the user can reset his password to unlock himself. |
Force symbols | This forces the user to use at least one symbol, such as $%&# |
Prohibit parts of the username | This option prohibits users from using their username or parts of it for their password. For example, the user “John” cannot use a password like “John123” |
The License settings offer information about the current license you use. If your license expires, you can update it here.
The Message settings allow you to store system messages, which are transmitted to all logged in users, e.g. if you want to inform them about maintenance work.
With corresponding rights (assigned Role “System Messages”), you can add a validity date. The messages can be written in HTML.
As soon as a message is stored, it is pushed to all user. User who log in later receive the message as well. The message is displayed as an overlay and must be closed manually.
_______________________________________________
All external programs, business applications and the mobile client access the Simplifier via the Simplifier Client API.
The Simplifier Client API is documented by Swagger and can be accessed by opening the URL:
https://<pcmr.simplifier.io>/client/2.0/api-docs/
A detailed documentation of the client API is displayed and you can try out the API using the tools built into Swagger. All changes in the API are automatically transferred to the documentation.
GET | /appDeps/{appName} | Get dependencies for application |
GET | /apps/{appName} | Download application ZIP |
GET | /appDeps/{appName} | Get dependencies for application |
GET | /libs | List all libraries |
POST | /business-object/{businessObject}/{method} | Execute Business Object Method |
POST | /business-object/{businessObject}/{method} | Execute Business Object Method |
POST | /connector/{connector} | Execute Connector |
POST | /connector/{connector}/{call} | Execute Connector Call |
POST | /pluginSlot/{plugin}/{slot} | Execute Plugin Slot |
POST | /connector/{connector} | Execute Connector |
POST | /connector/{connector}/{call} | Execute Connector Call |
GET | /apps/{appName} | Download application ZIP |
GET | /libs/{libId} | Download library ZIP |
GET | /libs | List all libraries |
POST | /log/MobileClient | Post general message to simplifier logger |
POST | /log/WebView | Post WebView message to simplifier logger |
GET | /ping | Get default ping/pong message |
POST | /ping | Get custom ping/pong message |
POST | /pluginSlot/{plugin}/{slot} | Execute Plugin Slot |
GET | /version | Get version of the currently running Simplifier app server |
_______________________________________________
The Simplifier Cloud is the default deployment option when you get started with the Simplifier. As an integrated solution, the Simplifier Cloud includes automatic backups, monitoring, high availability, and more. The availability is at least 99.95 %.
The Simplifier Cloud will be deployed in Deutsche Telekom’s data centers OTC. Data protection and data security are a matter of trust.
The protection and security of your data has the highest priority. The Open Telekom Cloud is operated and data is secured in our own, highly secure twin-core data centers in Germany. Data processing is subject to the strict requirements of the European Data Protection Ordinance (DSGVO).
In addition, the Open Telekom Cloud is certified according to the Trusted Cloud Data Protection Profile (TCDP) 1.0. This certifies that the Open Telekom Cloud – currently one of the few cloud offerings on the market – offers companies the technical requirements necessary to meet the basic European data protection requirements (DSGVO).
Further information can be found here.
_______________________________________________
_______________________________________________
SOAP is a network protocol. You can either stick to the standard when using the protocol like SAP or use it manually like Microsoft. The way the protocol is used decides on how you have to build your Connector Call.
In this case, the SOAP Connector Call requires two input parameters to be defined:
bindingName | The name attribute of your wsdl:binding attribute in your WSDL file |
operationName | The name of the wsdl:operation attribute in your WSDL file for the operation that you want to call in your connector call |
Example:
Parameters, that are required by the called SOAP operation, take the following form:
soap/<operationName>/<parameterName>, e.g. soap/_-ITIZ_-BU_OBJ_EQUI/index
In this case, the SOAP Connector Call requires two additional input parameters to be defined:
bindingName | The name attribute of your wsdl:binding attribute in your WSDL file. |
operationName | The name of the wsdl:operation attribute in your WSDL file for the operation that you want to call in your connector call. |
strict | If you don’t use the standards, you have to set this parameter. The Data Type is “boolean”. Set the value to “false”. |
endpoint | By adding this as parameter, you can choose the endpoint manually. If the endpoint is not set, the endpoint which is defined in the WSDL file will be used. |
Example:
All possible nodes (even if marked as optional) have to be defined in the Connector Call. They take the same form as in the standard use of the protocol:
soap/<operationName>/<parameterName>, e.g. soap/Query/index
Inline attributes are characterized like this:
soap/<xml-node>/@attribute, e.g. soap/RequestServerVersion/@Version
_______________________________________________
WSDL URL
The URL to the Web Service Description Language Document (WSDL) of the SOAP Service. Please don’t mix up with the SOAP Service Endpoint.
_______________________________________________
Widgets can also be nested in a structured hierarchy – representing the positions within the document structure. For example, a table must have columns and rows – so the columns and rows have to be added nested underneath the table element. So in the first step, add the table to the existing screen. After that, select the table and then add columns.
The column widget is now nested under the table widget.2
_______________________________________________
A SQL Connector Call requires the two parameter “mode” and “request“.
You can choose between 3 different modes:
The “Simple Call” corresponds to an unparameterized SQL Call.
The SQL request is defined by a “String” without variable substitution.
In order to be able to process the output of the SQL request, it must be defined in the Output Parameter of the Connector Call.
Currently, you can still map the entire Json result to a single parameter.
This is possible by specifying a “/” as the parameter name and the Data Type “String” in the Output Parameters.
The “Query Call” is used to transfer the result from a SQL statement to the Simplifier.
(Usually, SELECT statements have a result)
The SQL request of the “Query Call” is parameterized (in contrary to the “Simple Call”).
The Input value of the request parameter is represented by a name and a Simplifier Data Type. In our example, we used the name “mail” and the Data Type “String”.
A parameter definition is initiated and ended with a colon. Between the colons is a pair of values, separated by a colon as well, which represents the name and the type of the parameter.
In a parameterized SQL request: select * from USER_Data where email like :mail:String:
If you use more values in a SQL statement you have to use a syntax separated by comma, e.g. VALUES (:id:String:,:mail:String:).
In order to use the parameter that has been defined in the SQL request via the Connector Call interface, a new Connector Call parameter must now be inserted, which corresponds to the parameter definiton of the SQL request.
All Connector Call parameters that refer to a SQL request have the prefix “/params/”.
In the example above, a new parameter name “/params/mail” with the Simplifier Data Type “String” has been created.
The parameter expressions “alias”, “description” and “constant value” are equivalent to the usual connector calls.
The result of a “Query Call” can be assigned via the Output Parameters equivalent to the “Simple Call”.
The “Execute Call” is quite similar to the “Query Call”. But with the “Execute Call”, no result is sent back to the Simplifier.
Typically SQL INSERTs, UPDATEs, or DELETEs are displayed in that way.
_______________________________________________
Datasource
The JDBC Driver of the supported Database: MySQL, Sybase, Oracle, PostgreSQL, SQLite, HANA and Microsoft SQL
Host
Hostname of the database server
Port
TCP Port of the database server
Database Schema
Name of the Database
If you have created an SQL connector with the SQLite datasource, files are created for a special directory for SQLite data files. The Connector creates an SQLite database on the Simplifier Server in the Connector Properties if it’s not available. When changing the connector, a backup of the file is created.
Attention: Deleting the connector also deletes the data file.
_______________________________________________
URL | /client/1.0/PLUGIN/pdfPlugin/generatePdf | |
---|---|---|
Input-Parameter | Template | Template name |
Session | Session ID (to retrieve transaction data) | |
Config | PDF parameter for the generation as JSON String (optional) | |
Output-Parameter | Value | JSON Object with the parameter “jobId” (contains the generated JobID) |
Example for a call:
{
"template"
:
"templatename"
,
"session"
:
"12345678910"
,
"config"
:
"{\"orientation\" : \"Portrait\",\"page-size\" : \"A4\",\"margin-top\" : \"1in\",\"margin-bottom\" : \"1in\",\"margin-left\" : \"1in\",\"margin-right\" : \"1in\",\"footer-center\" : \"[page] / [toPage]\"}\"}"
}
{
"value"
: {
"jobId"
:
"a1ef6b46-1671-425a-947c-d9e552d4e755"
},
"success"
:
true
}
The specified parameters for the config correspond to the parameters for wkhtmltopdf or the PdfConfig class of the wrapper. This can be used to control page formats, margins, headers, footers, etc.
_______________________________________________
The Step-By-Step Guidance Plugin allows you to build simple apps consisting of one information (text, image, video) per screen and one of the predefined screen actions. The Plugin is useful if you want to create a qick Apps for maintenance, strictly defined processes or quality assurance.
By clicking on the Button “Deploy App on Appserver”, you can open the App with the UI Designer and customize it further.
_______________________________________________
Structs describe a package of Domain Types. For example the Struct “address” contains different Domain Types like Name, Street, City, ZIP Code, Mobile Number etc.
To create a new Struct Type click on the “+” button.
Click into the appropriate field to select the type.
Click e.g. on Domain Types on the top and search for the domain type in the searchbar.
After clicking on apply, the type will be applied.
In the fields table can you add the following Data Types:
Name
Name of the field in the structure.
Optional
With this setting it isn’t necessary to provide all fields in Connector or Business Object Calls.
Type
Base or Domain Type or even another structure or collection.
Description
Description of the field.
_______________________________________________
This area covers all information related to specific Backend Connectors for existing Systems (e.g. SAP, Salesforce, etc.)
_______________________________________________
You can manage your templates or start a new creation via REST.
All calls are started via a POST request, which may contain parameters in JSON format in the body.
The return is always in JSON format. It includes the result parameter “success” to indicate whether the call was successful.
If the call is not successful, an error code (as a return parameter “code”) and an error message (as a return parameter “message”) are returned.
The following errors are possible:
Error Code | Message | At Request |
1 | template name invalid | adminTemplateFetch, adminTemplateEdit, adminTemplateDelete, generatePdf, adminTemplateAdd |
2 | template not existing | adminTemplateFetch, adminTemplateEdit, adminTemplateDelete, generatePdf |
3 | template name already in use | adminTemplateAdd |
400 | bad request | All |
500 | internal error | All |
(Errors 400 and 500 correspond to the HTTP status codes and indicate errors when parsing the parameter or processing errors)
The sub-sites describe the merging and saving of PDFs as well as the different requests to manage your templates.
_______________________________________________
The Simplifier uses the following standard web-technology for creating applications:
|
SAPUI5 and its open-source variant OpenUI5 help you build enterprise-ready Web apps that are responsive to all devices. The JavaScript UI library and development toolkit contains many feature-rich controls and implements the award-winning SAP Fiori user experience. It helps developers ease and speed up the development of full-blown HTML5 Web applications. |
![]() |
We implemented the Update to Angular 2 in the Simplifier. Now you can configure the UI and logic of your Angular app the same way as with UI5. Angular 2 allows the creation of extremely versatile, fast, powerful and functional web applications. These applications run in the browser and thus bring the very reactive and therefore great user experience of mobile apps to the desktop or browser. With the integrated Ionic framework, you can build highly interactive native and progressive web apps. |
_______________________________________________
In the new Tile you can create, edit and delete Namespaces and Templates.
_______________________________________________
As an admin, you can test your connector call by clicking on the “Call” icon in the connector call overview.
The input validation in the test UI only takes place if “Validate” is active for input parameters. The test parameters are always passed as strings.
There is also a “Save & Test” button within the configuration of the connector call itself. The same dialog is opened as above.
_______________________________________________
As an Admin, you can test your Script Template equivalent to the test of a Connector Call. Click on the “Test” icon in theScript Template Overview.
_______________________________________________
Testing WebSocket Connections through Reverse Proxy
The WSS Protocol is used for realtime data communication and server to client push mechanism.
To test a sucessfull connection , following the steps below
If not, please check the Reverse Proxy Requirements
_______________________________________________
You can upload a particular theme to give your app a specific look corresponding to your Corporate Design. To do this, you need a third party less compiler as an external tool.
When the less compiler has run through, you have to put all CSS files in a ZIP file. Then upload it in the UI Designer under Theming.
You have the possibility to download your already uploaded theme again. The icon for this is located to the left of the delete icon.
The directory structure of the theme must be structured exactly like this and is analogous to the OpenUI5 directory structure:
sap / library name / themes / theme name / library.css
Open UI5 offers multiple library options. You can insert all libraries in one file. The paths you can use are:
Here you can see details of the Belize Theme.
_______________________________________________
A token is required for a secure communictation with the application server. You can generate a token with the following AJAX-Request
var token = null;
$.ajax("http://localhost:8080/genToken/client/1.0", {
method: 'GET',
headers: {'Authorization': '[Authorization]' // [userName] : [userPassword]},
success: function(data) {
if (!data.result) {
alert("Error retrieving token: " + data.message);
return;
}
token = data.result;
}});
[userName]
The name of the user as String.
[userPassword]
The passsword of the respective user as String.
[Authorization]
The authorization data required for identification. Consisting of the authorization method here the String Basic and the [userName]:[userPassword] as a Base64 encoded String.
_______________________________________________
This section contains a detailed code example for generating a token and establishing a websocket with a connector, then a complete subscription followed by a complete unsubscription example. The arbitrary chosen connector is the “TIA_Connector”
Token Generation Example
var token = null;
$.ajax("http://localhost:8080/genToken/client/1.0", {
method: 'GET',
headers: {'Authorization': 'Basic YWRtaW46YWRtaW4=' // admin : admin},
success: function(data) {
if (!data.result) {
alert("Error retrieving token: " + data.message);
return;
}
token = data.result;
}});
Attention Using the admin as user might be a security risk. In productive systems the admin should be changed into an authorized user with the respective permissions. |
Websocket Connection Example
var webSocket = null
;
webSocket = new WebSocket("ws://localhost:8080/client/1.0/connectorAsync/" + "TIA_Connector" + "?SimplifierToken=" + token)
Complete Subscription Example
var requestSubscribeData = {
"operation": "MONITORING_SUBSCRIBE",
"nodes": ["myNode","myOtherNode"],
"namespaceIndices": [2,2],
"publishingInterval":1000.0,
"clientHandlingID": 1,
"samplingInterval": 1000.0,
"queueSize": 2,
"discardOldestItem": true,
"monitoringMode": "Reporting",
"returnedTimestamps": "Both"
}
var requestSubscribe = null;
request = {
"frameType": "unsubscribe",
"subscriptionKey":"bb827118-f1b0-2170-9937-f8c7e1620107"
};
var requestSubscribe = null;
requestSubscribe = {
"frameType": "subscribe",
"subscriptionKey":"bb827118-f1b0-2170-9937-f8c7e1620107",
"json": requestData
};
webSocket.send(requestSubscribe);
Complete Subscription Example
var requestUnsubscribe = null;
requestUnsubscribe = {
"frameType": "unsubscribe",
"subscriptionKey":"bb827118-f1b0-2170-9937-f8c7e1620107"
};
webSocket.send(requestUnsubscribe);
_______________________________________________
Before a transport is available for downloading, it has to be approved by an Admin. With the right permissions, you will find the “Approve” button next to the “Save” and “Cancel” options in the Transport.
Attention: Save the Transport in advance, else your changes won’t appear in the Transport file!
If the approval process was successful, a download icon appears in the Export column and your transport is now ready for downloading. By clicking on the icon, some metadata about the creator, approver and dates are provided.
The downloaded file can be used to import the data on a different system.
_______________________________________________
Imagine you’ve build a fancy application for one of your customers on a Simplifier instance that you’ve reserved exclusively for development tasks. Now that it’s ready to roll out, you’re faced with the question on how to bring this application finally to the customer’s Simplifier instance? How can you export and import it, preserving all its dependencies, like connectors and associated roles?
That’s when Transports come into play. They allow you to define all of your app’s artifacts and let the Simplifier collect them to create a bundle.
Clicking on the “Transports” tile forwards you to an intermediate page where you can choose between the Transportcollection and importing Transports.
_______________________________________________
_______________________________________________
With the UI Action element you can map different Widgets, Variables and Auto Fields to another.
Lets say we have a very simple login screen. There is an input field for your name and a button to submit.
We want the button not to be responsive, as long as the login field is empty. This can be achieved with the UI Action in the Process Dashboard.
At first, we assign the input field “InputUsername” to the Event.
Next, we need a condition. Check, if the value of the input field equals an empty string.
If the condition is true and there is nothing written in the input field, the button should not be responsive. Add an UI Action in Step 3 and choose within the mapping dialog the constant (boolean, false) on the left side (source) and map it to the equivalent widget on the right side (target). Select the screen, widget and property (in this case “enabled”).
For the other scenario, when there actually is an input written, you can connect the condition to a second UI Action and set the boolean via the constant on true.
In this example we have an application that writes the value of the first Widget to the second Input field and writes the value of the Auto Field (username) to the third Widget after clicking on the corresponding buttons.
Now in the Process Designer, we use 2 Events and 2 UI Actions for this.
We’ve already added the press Event on the first Button and now we have to add the UI Action. By clicking on the “mapping dialog”, we can open the editor.
We connect the value of the Widget Input1 with the Widget Input2. We can select the property that we’d like to connect by double clicking on the Widget.
To connect the Auto Field with the third Input field, we add the Auto Field and select the one we need, also by double clicking on it.
This is the result of our mapping:
_______________________________________________
With the UI Designer you can create and design the user interfaces of your applications. The interface is divided into four sections: On the left side, you can browse the widgets available for your UI. The center presents the content structure as well as an overview about the different screens. On the editing area to the right side, you can change parameter of the widget that is currently selected in the content structure.
You have several options in the upper menu bar to navigate to specific features:
![]() |
Preview | Preview your App in your browser – be aware that there are no mobile features like camera available. To preview your mobile apps, use the Simplifier Mobile Client. |
![]() |
Assets | You can upload assets like documents, images, CAD models or many other file types. |
![]() |
CSS Editor | Use the CSS Editor to change the layout of your app. |
![]() |
Language | Translate your App into different languages and set the fallback language if the client uses a language that is not available. |
![]() |
Libraries | Add Libraries to your app and get an overview about their dependencies. |
![]() |
Theming | Upload a particular theme to give your app a specific look according to your corporate design guidelines. |
![]() |
Release | If you have tested your app successfully, you can release a new version with release notes. |
![]() |
Deploy | Saves and deployes the current app configuration. It’s necessary to deploy your application before starting the preview. |
![]() |
Save | Save the current app configuration. |
![]() |
Exit | Exit the current app configuration. |
_______________________________________________
The User Management module lets you define many different parameters for users and the roles they take.
The QR-Code generator for easy accessing, especially with smart glasses, is also located here.
The following table explains the different User Management functions and their meanings:
User |
User Master data |
Master data for a user account like Email, Username,Expire Date, Address Data |
Roles |
Collection of permissions |
A Role represent an amount of permissions and can be assigned to specific user |
Permission |
Permissions |
Permissions are an authorization like granting access to a specific connector or business app |
Groups |
Collection of users |
A user group contains several users and could be used for workflow logic in business apps like informing a team via email or push notification about a certain event or task |
_______________________________________________
The user overview presents you all users of your own Simplifier instance. Aside from first name and last name you also can see the username and the expiry date of the user. Four icons on the right side allow you to see details of the user, edit or delete the user (only when your role has the permissions) and see if the user has been blocked.
To add a new User click on the “+” icon on the right above the User Table. Within Detail View fill out all required User Information and assign a Role or Group for the User
After creating a user, a one-time-link via email will be sent to the created user. After email activation via the link, a new password can be set.
You can also assign different attributes to a user.
Example Use Case:
Let’s say we have a utility company.
They use an application to administrate their commissioners. They can add a new commissioner within the app and assign different attributes to him, e.g. a ZIP code or in which division he is working (gas, water, electricity or district heating). Now every commissioner is created as an own user in the Simplifier and you can manage the attributes directly in the user management.
_______________________________________________
User-Log logs the Login and Logout actvities from the users.
_______________________________________________
As for now, OPC-UA connector calls can only be called programmatically in the javascript code. In order to do this, please open the code designer, as described here.
We have defined the basic OPC-UA connector calls with the following names after the colon.
READ Call: TIA_READ
WRITE Call: TIA_WRITE
READWRITE Call: TIA_READWRITE
For each call, it will be described how to fill the nescessary paramters and how to use the call.
_______________________________________________
This section contains a description for the websocket methods. As for now this API is considered incomplete.
onOpen
The function, which will be executed, when the websocket is opend. The code block can be found below:
webSocket.onopen = function(message) {[FunctionLogic]};
onClose
The function, which will be executed, when the websocket is beign closed. The code block can be found below:
webSocket.onclose = function(message) {[FunctionLogic]};
onError
The function, which will be exceuted, when the websocket throws an error. The code block can be found below:
webSocket.onerror = function(message) {[FunctionLogic]};
onMessage
The function, which will be executed, when the websocket returns a message. The code block can be found below:
webSocket.onmessage = function(message) {[FunctionLogic]};
close
This function closes the websocket.
webSocket.close();
send
A specific request will be send to the websocket and interpreted by the other side of the connection. In this case a connector:
webSocket.send([request]);
[FunctionLogic]
This parameter contains the function, which will be executed.
[request]
This parameter is a JSON object send to the respective function. The requests for the Connector can be found here.
_______________________________________________
The following sections contain information about how to use asynchronous connector subscriptions and unsubscriptions. For now, the subscription and unsubscription process can be initialized only programmatically and solely with the OPC/UA Connector.
_______________________________________________
After receiving a token, as described here, a websocket connection can be established with the application server with the following code:
var webSocket = null
webSocket = new WebSocket("ws://localhost:8080/client/1.0/connectorAsync/" + [ConnectorName] + "?SimplifierToken=" + [Token]);
[ConnectorName]
This parameter represents the connector, that the websocket connection will be established to.
[Token]
The generated token object.
_______________________________________________
An assistant is provided for maintaining OpenUI5 widgets. If you enter any UI5 control type in the Widget Customizer on the OpenUI5 tab and click the magic wand button, the template, properties, events, and aggregation is filled with the information of the control and all its ancestors.
_______________________________________________
A Widget represents a specific element in the user interface (e.g. checkbox, button or login screen).
To customize a Widget, click on the “Applications” tile and choose the Widgets tab. Press the “+” button to add a new one.
We added a feature, so you are able to copy an existing Widget as well. Click on the icon and give it a unique name.
If you want to create a new Widget, you will be forwarded to the Widget Customizer. There you’ll have 4 different tabs:
The first one describes all global settings of the Widget which are independent from UI5 or Angular (e.g. category).
The OpenUI5, Angular and Angular 2 tabs contain the specific parameters and settings for each framework.
Later on, the Simplifier will choose the right parameters depending on your application type.
_______________________________________________
Call for WRITE operations (The name TIA_WRITE is the arbitrary chosen name for this call)
For the WRITE Connector Call, you need to configure the “operationType ” and the “nodeId” (consisting of 2 parameter: identifier and namespaceIndex). Furthermore you need to define the operationTarget and the value.
operationType: Defines which operation you want to execute, in this case “WRITE”.
Parameter Name: operations/arrayItem[0]/operationType
Constant Value: WRITE
Data Type: String
nodeID: Defines the identification of the OPC/UA node. It is split in 2 Parameter:
operationTarget:
Parameter Name: operations/arrayItem[0]/operationTarget
Constant Value: Choose between
values The values, which are going to be written into the nodes.
Parameter Name: operations/arrayItem[0]/value
Data Type: String
The position of the values will equal the position of the node. For example if node a is on the first position and node b on the second, whereas value x is on the first and value y on the second position then value x will be written into node a and value y into node b.
NOTE: The specific commands are NOT defined here!
Output parameters
You can return all Output Parameter like this:
Parameter Name: /
Data Type: String
If you want to get only selected Output Parameter, use the following syntax:
Parameter Name: operationsResult/[0]/newValue/value (exemplary)
Data Type: depends on the Parameter you want to be returned.
For now only the complete unformatted JSON will be returned.
_______________________________________________
Simplifier Academy
Courses & Documentation
PDF generated April 30, 2019 at 8:38 AM