# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
This site has an agentic ask interface you may use to query the documentation dynamically by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://developer.ultimo.net/index.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

---

# Welcome

Ultimo offers seamless integration with other applications. Thanks to a modern integration platform, certified standard interfaces and ready-to-use connectors, you receive and send the right data at the right time, and with the right quality. Integration is easy to realise and is robust and maintainable. With smart integration, you reduce manual input, guaranteeing the integrity of data and ensuring that your decisions are based on current information.

![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MZmRVbbu75Ds8MiWx_F%2F-MjDXTnjeeMulHi9Ayy5%2F-MjDXWc39Y-4_-iGLOgM%2Fpartners-2.png?alt=media\&token=3a29f446-d9f7-44e9-9722-3d82d72e8b61)

We have extensive experience of realising and maintaining interfaces ranging from Enterprise Resource Planning (ERP) and Geographical Information System (GIS) to external data sources, IoT platforms and Augmented Reality. For more inspiration, have a look at our [partner page](https://www.ultimo.com/partners?order_by=newest\&page=1) or ask one of our experts to recommend the best solution for you.

In our editions, we offer various [integration options](/getting-started/software-editions).


# Introduction

Ultimo Business Integration provides APIs to Ultimo for third-party applications. The APIs offer the following functions:

* Retrieve data
* Insert data
* Update data
* Delete data

Ultimo Business Integration can be described as:

* A default integration platform
* Offering import & export functionalities
* Based on XML, CSV or JSON
* Accessible via webservices

Ultimo Business Integration offers:

* Support for standards like REST
* Various default integrations
* Additional interfaces created by (partner) consultants
* Integration with files or webservice requests
* Possibilities for XSL transformation
* Default logging and rollback mechanisms

Ultimo is able to process the received data using the built-in business logic. The following types of communications are supported to access the API:

{% content-ref url="/pages/-MZmRmSqZJm8Yn2dUARj" %}
[REST](/api-guide/rest)
{% endcontent-ref %}

{% content-ref url="/pages/-MZmRmSvkkuZXaUvv6Nm" %}
[HTTP POST](/api-guide/http-post)
{% endcontent-ref %}

{% content-ref url="/pages/-MZmRmT-0oBF9NhPVpYb" %}
[SOAP](/api-guide/soap)
{% endcontent-ref %}


# Software editions

In our editions, we offer various integration options. Ultimo Professional, as well as all other versions, offers default integrated email communication and the possibility to utilize various default integrations, including customer-specific ones.

If you need more complex interfaces, for example to trigger customer-specific actions, Ultimo Premium has everything you need. Ultimo Premium and Enterprise enable the configuration of more specific workflows for integrations. This makes it possible to trigger actions in Ultimo using REST API or to trigger interfaces after executing an action in Ultimo. It is also possible to realise more specific batch import and export interfaces with other parties through the available Ultimo Business Integration connectors.

## Technique

<table><thead><tr><th width="161">Description</th><th width="169" align="center">Professional</th><th width="150" align="center">Premium</th><th align="center">Enterprise</th></tr></thead><tbody><tr><td><a href="/api-guide/rest">REST</a></td><td align="center"><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span> </td><td align="center"><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td align="center"><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td></tr><tr><td><a href="/api-guide/http-post">HTTP POST</a></td><td align="center"><span data-gb-custom-inline data-tag="emoji" data-code="1f6ab">🚫</span></td><td align="center"><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td align="center"><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td></tr><tr><td><a href="/api-guide/soap">SOAP</a></td><td align="center"><span data-gb-custom-inline data-tag="emoji" data-code="1f6ab">🚫</span></td><td align="center"><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td align="center"><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td></tr></tbody></table>

## Connectors

<table><thead><tr><th width="161">Description</th><th width="170" align="center">Professional</th><th width="150" align="center">Premium</th><th align="center">Enterprise</th></tr></thead><tbody><tr><td><a href="/connectors/bi-platform/connection">BI platform</a></td><td align="center"><span data-gb-custom-inline data-tag="emoji" data-code="1f6ab">🚫</span></td><td align="center"><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td align="center"><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td></tr><tr><td><a href="/connectors/exchange-online">Exchange Online</a></td><td align="center"><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td align="center"><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td align="center"><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td></tr><tr><td><a href="/connectors/ldap">LDAP</a></td><td align="center"><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td align="center"><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td align="center"><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td></tr><tr><td><a href="/connectors/scim">SCIM</a></td><td align="center"><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td align="center"><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td align="center"><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td></tr><tr><td><a href="/connectors/oci">OCI</a></td><td align="center"><span data-gb-custom-inline data-tag="emoji" data-code="1f6ab">🚫</span></td><td align="center"><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td align="center"><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td></tr><tr><td><a href="/connectors/universal-print">Universal Print</a></td><td align="center"><span data-gb-custom-inline data-tag="emoji" data-code="1f6ab">🚫</span></td><td align="center"><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td align="center"><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td></tr></tbody></table>


# REST

:white\_check\_mark:Professional :white\_check\_mark:Premium :white\_check\_mark:Enterprise

![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MZmRVbbu75Ds8MiWx_F%2F-MZmSSEIxU4aznMfSsPm%2F-MZmVLcs_LosVPwh_FAw%2Frestapi.png?alt=media\&token=b2811df4-6e97-49fb-9e28-922b2f4f0ac8)

As of Ultimo version 18.04 (2018R2), the possibility to retrieve data through a REST API has been added. For cloud customers on Azure, additional functionality to insert and update data (in batch) is now also available.

## How to set up

To connect to the REST API, a specific API key has to be created for a client. API keys can be defined in the Ultimo Configuration Tool. An API key contains a definition of available objects (entities) and/or workflows and generates an API key secret to authorise requests. To set up a new API key quickly, it is possible to use an [API key template](/api-key-templates/introduction).

{% hint style="info" %}
Note: For more information on how to configure API keys please contact your Ultimo consultant.&#x20;
{% endhint %}

## How to connect

The basic URL for requesting entities has the following format:

![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MZmRVbbu75Ds8MiWx_F%2F-MZmSSEIxU4aznMfSsPm%2F-MZmVLcjEEafYb58rYFc%2Faccolades_rest_api.png?alt=media\&token=bc239d0a-c88b-4a47-96df-e639410adb5b)

The service root is the same for every request or query. It contains the environment name, which is the URL to your Ultimo environment. The resource path refers to the specific information you request. The query options determine which parts of this information are presented and how.

## Authentication

When sending a request to the REST API, an API key secret should be provided in the header of the request. The API key secret can be generated in the API key manager in the Ultimo Configuration Tool.

## Headers

The following (Ultimo specific) headers can/must be used when sending a request:

* The API key secret (required) must be specified in the following format:  `ApiKey: {API KEY SECRET}`&#x20;
* You can optionally specify in which language you receive the response. If not specified the default user language is returned. The language is returned in the header of the response. You can specify the language in the following format: &#x20;
  * `Accept-Language: NL`
  * `Accept-Language: en-US`
* You can optionally specify for which company you want to make a request. This header is only required when the API key in Ultimo is configured to work with multiple companies. If only one company is available, that company will always be used no matter the API configuration or the header. The company can be specified in the following format:&#x20;
  * `Ultimo-Company: 000001`&#x20;

## Record authorisation

Record authorisation is taken from the system user which is linked to the API key.&#x20;

When record authorisation is applied on a table, for example the Department table, it is only possible to retrieve, update, or delete records that refer to the authorised department(s) or records from tables that are not related to the Department table.

To insert records that refer to the authorised department(s), the desired department needs to be specified in the request body. If the ‘Department’ property is not added to the request body, the default value will automatically be used.&#x20;

{% hint style="info" %}
Note: For more information on how to configure record authorisation please contact your Ultimo consultant.&#x20;
{% endhint %}

## Response format

Ultimo REST API always returns a JSON response.


# Requesting data

With the GET request method, API clients can retrieve information from Ultimo.

*Example request*

`GET https://customer.ultimo.net/api/v1/object/Equipment('00001')`

*Example response*

```json
{
  "Id": "00001",
  "Code": null,
  "Context": 1,
  "Description": "Heftruck 1 type 35 ",
  "InstallDate": "2016-06-20",
  "ManufactureYear": 2013,
  "NextPmMaintenanceDate": "2022-12-25",
  "Status": 2,
  "SerialNumber": "2344-323AA",
  "CostCenter": "05",
  "Department": "05",
  "EquipmentType": "0025",
  "PartOfEquipment": null,
  "ProcessFunction": null,
}
```

## Resource paths

The next examples explain the different uses of resource paths:

* Retrieve a list of entities by using an entity set:     `GET https://customer.ultimo.net/api/v1/object/Equipment/` &#x20;
* Retrieve a list of custom entities:    `GET https://customer.ultimo.net/api/V1/Object/_Entity/` &#x20;
* Retrieve a single entity by using an entity key:    `GET https://customer.ultimo.net/api/v1/object/Equipment('00001')` &#x20;
* Retrieve a single entity with a composite key by using multiple key properties:    `GET https://customer.ultimo.net/api/v1/object/EquipmentSparePart(Equipment='00001',Article='0191')`&#x20;
* The resource path can be nested so it is possible to retrieve a single entity by following a navigation property from a single entity to another single entity:    `GET https://customer.ultimo.net/api/v1/object/Equipment('00001')/Department` &#x20;
* Or by following a navigation property from a single entity to a collection of entities:    `GET https://customer.ultimo.net/api/v1/object/Department('01')/Jobs` &#x20;
* The path segments can be composed recursively:    `GET https://customer.ultimo.net/api/v1/object/Department('01')/Jobs('0000002')/Equipments`&#x20;
* When retrieving an entity with multiple key properties that includes a navigation property of the related entity the key properties can be omitted:    `GET https://customer.ultimo.net/api/v1/object/Building('0001')/BuildingParts(Building='0001',Id='001')/BuildingFloors`  &#x20;
* The previous example can be shortened to:    `GET https://customer.ultimo.net/api/v1/object/Building('0001')/BuildingParts('001')/BuildingFloors`

## Pagination

Loading large datasets can be slow. Pagination is used when retrieving entity lists, to load the data incrementally which improves the response times and the user experience. Ultimo REST API uses Server-Side Pagination, meaning that the server returns the first page of results. If the total number of results is greater than the page size, the server returns the first page along with a `nextPageLink` that can be used to fetch the next page of results.

*Example with nextPageLink in the response body*

```json
{
  "nextPageLink": "https://customer.ultimo.net/api/v1/object/Equipment?skip=1000",
  "items": [
    {
      "Id": "00001",
      "Context": 1,
      "Description": "Heftruck 1 type 35 ",
      "Status": 2
    }
    [...]
  ]
}
```

When requesting large datasets, make sure to always use the provided `nextPageLink` to retrieve all records until the `nextPageLink` is no longer provided. The default number of results per page may change over time.

## External identifiers

It is possible to retrieve data using an external identifier in the resource path. The external identifier of a resource should be stored in the Ultimo ExternalId property. It is not required to add ExternalId as a property to the API key resources to retrieve data with an external identifier. The combination of ExternalId and DataProvider is unique in Ultimo. Based on this, the record will be identified. Note: when a specific DataProvider is set on the API key definition in Ultimo, the record will only be found if the same DataProvider is set on the record.

The next examples explain the different uses of resource paths using the external identifier:&#x20;

* Retrieve a single entity: `GET https://customer.ultimo.net/api/v1/object/Equipment(ExternalId='00001')`&#x20;
* Retrieve a single entity with a composite key: `GET https://customer.ultimo.net/api/v1/object/EquipmentSparePart(ExternalId='0191')` &#x20;
* The resource path can be nested so it is possible to retrieve a single entity by following a navigation property from a single entity to another single entity: `GET https://customer.ultimo.net/api/v1/object/Equipment(ExternalId='00001')/Department` &#x20;
* Or by following a navigation property from a single entity to a collection of entities: `GET https://customer.ultimo.net/api/v1/object/Department(ExternalId='01')/Jobs` &#x20;
* When retrieving an entity with multiple key properties that includes a navigation property of the related entity the key properties can be omitted: `GET https://customer.ultimo.net/api/v1/object/Invoice(ExternalId='001')/Lines` &#x20;

It is **NOT** possible to use the external identifier when the URL contains a nested path with at least two ExternalId usages, or with a combination of the Ultimo Id and an external Id. Examples of bad requests:

{% hint style="danger" %}
GET <https://customer.ultimo.net/api/v1/object/Department(ExternalId='01')/Jobs(ExternalId='002')/Equipments\\>
GET <https://customer.ultimo.net/api/v1/object/Department(ExternalId='01')/Jobs('0002')/Equipments>
{% endhint %}

## Multi-lingual output

It is possible to configure an API key to give multi-lingual output. When this is set, all the available languages will be returned. In this case, the Accept-language header is redundant.&#x20;

*Example of a response with a multi-lingual property:*&#x20;

```json
{ 
    "Id": "01", 
    "Description": { 
        "NL": "NL value", 
        "EN": "EN value", 
        "DE": "DE value", 
        "FR": "FR value", 
        "PL": "PL value", 
        "ES": "ES value", 
        "IT": "IT value", 
        "TR": "TR value" 
    } 
}
```

## Stripping HTML from responses

Some responses contain HTML-formatted content in HTML columns. If your application requires plain text instead, you can ask the API to remove all HTML markup.

Include the following header in your request:

`Prefer: strip-html`

With this header enabled, the API strips all HTML tags from HTML column values before returning the response.


# Inserting data

For cloud customers on Azure, the possibility to insert and update data with the REST API is now available. PUT, PATCH and POST methods have been added to support this.

<table><thead><tr><th width="150">Method</th><th width="598.4285714285713">Description</th></tr></thead><tbody><tr><td>PUT</td><td>Insert or update a specific resource by specifying the identifier</td></tr><tr><td>POST</td><td>Insert a new record without specifying the identifier (only available for resources that use an autokey value for the identifier)</td></tr><tr><td>PATCH</td><td>Update a single property of a specific resource by specifying the identifier</td></tr></tbody></table>

## Request body&#x20;

The body of a request contains the properties that need to be inserted *or* updated. The request body must be in a JSON format with at least one property.

The API key must be authorized for all the properties specified in the body.&#x20;

1. For properties that are defined in the API key but not specified in the body the update will be done with default or null values for the PUT method. These properties will NOT be affected by the PATCH method.&#x20;
2. The properties that are NOT defined in the API key will not be affected by the request.
3. The response body will always return all properties that are linked to the API Key, no matter what method is used.

Properties that are mandatory in the request body for PUT and POST methods:&#x20;

* Context&#x20;
* Status&#x20;

Properties that can be set for an insert but cannot be updated:&#x20;

* Context&#x20;
* Currency: If this is not specified in the request, then the currency of the API key’s company will be set. &#x20;

Properties that are not allowed in the request body:&#x20;

* Identifier: this should be used in the resource path for the PUT method.&#x20;
* SystemCompany: this is set in the API key and cannot be manually updated.&#x20;
* Read-only properties: these kinds of properties are calculated or generated from the database, and cannot be changed by the end user.&#x20;

*Example of a PUT request*

`PUT https://customer.ultimo.net/api/v1/object/Equipment(`'`00001`'`)`

```json
{
  "Context": 1,
  "Description": "Asset",
  "InstallDate": "2022-04-07",
  "NextPmMaintenanceDate": "2023-04-07",
  "Status": 2,
  "CostCenter": "01",
  "Department": "01",
}
```

*Example of a PUT response*

```json
{
  "Id": "00001",
  "Context": 1,
  "Description": "Asset",
  "InstallDate": "2022-04-07",
  "NextPmMaintenanceDate": "2023-04-07",
  "Status": 2,
  "CostCenter": "01",
  "Department": "01",
}
```

*Example of a POST request*

`POST https://customer.ultimo.net/api/v1/object/Equipment`&#x20;

```json
{
  "Context": 1,
  "Description": "Asset",
  "InstallDate": "2022-04-07",
  "NextPmMaintenanceDate": "2023-04-07",
  "Status": 2,
  "CostCenter": "01",
  "Department": "01",
}
```

*Example of a POST response*

```json
{
  "Id": "39938",
  "Context": 1,
  "Description": "Asset",
  "InstallDate": "2022-04-07",
  "NextPmMaintenanceDate": "2023-04-07",
  "Status": 2,
  "CostCenter": "01",
  "Department": "01",
}
```

*Example of a PATCH request*

`PATCH https://customer.ultimo.net/api/v1/object/Equipment(`'`00001`'`)`

```json
{
  "Description": "Installation",
}
```

*Example of a PATCH response*

```javascript
{
  "Id": "00001",
  "Context": 1,
  "Description": "Installation",
  "InstallDate": "2022-04-07",
  "NextPmMaintenanceDate": "2023-04-07",
  "Status": 2,
  "CostCenter": "01",
  "Department": "01",
}
```

## Resource paths&#x20;

The next examples explain the different uses of resource paths for the PUT, PATCH and POST methods:&#x20;

* Request for a single entity:&#x20;

  `PUT https://customer.ultimo.net/api/v1/object/Equipment(`'`00001`'`)`&#x20;

  `PATCH https://customer.ultimo.net/api/v1/object/Equipment(`'`00001`'`)`&#x20;

  `POST https://customer.ultimo.net/api/v1/object/Equipment`&#x20;
* Request for single custom entity:&#x20;

  `PUT https://customer.ultimo.net/apa i/v1/object/_Entity('01')`&#x20;

  `PATCH https://customer.ultimo.net/api/v1/object/_Entity('01')`&#x20;

  `POST https://customer.ultimo.net/api/v1/object/_Entity`&#x20;
* Request for single entity with a composite key by using multiple key properties:&#x20;

  `PUT https://customer.ultimo.net/api/v1/object/BuildingFloor(Building='0001',BuildingPart='001',Id='CODE01')`&#x20;

  `PATCH https://customer.ultimo.net/api/v1/object/BuildingFloor(Building='0001',BuildingPart='001',Id='1-0')`&#x20;
* Request for single entity with multiple key properties that includes a navigation property of the related entity the key properties can be omitted:&#x20;

  `PUT https://customer.ultimo.net/api/v1/object/Building('0001')/BuildingParts(Building='0001',Id='001')/BuildingFloors(Building='0001',BuildingPart='001',Id='CODE01')`

  `PATCH https://customer.ultimo.net/api/v1/object/Building('0001')/BuildingParts(Building='0001',Id='001')/BuildingFloors(Building='0001',BuildingPart='001',Id='1-0')`
* The previous example can be shortened to:&#x20;

  `PUT https://customer.ultimo.net/api/v1/object/Building('0001')/BuildingParts('001')/BuildingFloors('CODE01')`

  `PATCH https://customer.ultimo.net/api/v1/object/Building('0001')/BuildingParts('001')/BuildingFloors('1-0')`

  `POST https://customer.ultimo.net/api/v1/object/Invoice(`'`00001`'`)/Lines`&#x20;

## Navigation properties

‌It is possible to insert an entity by following a navigation property from a single entity to a collection of entities. This is only available for the POST method. Example: &#x20;

{% hint style="success" %}
POST <https://customer.ultimo.net/api/v1/object/Department('01')/Jobs>
{% endhint %}

It is **NOT** possible to insert or update an entity by following a navigation property from a single entity to another single entity. Examples:

{% hint style="danger" %}
PUT <https://customer.ultimo.net/api/v1/object/Equipment('00001')/Department('01>')

POST <https://customer.ultimo.net/api/v1/object/Equipment('00001')/Department&#x20>;

PATCH <https://customer.ultimo.net/api/v1/object/Equipment('00001')/Department('01')&#x20>;
{% endhint %}

It is also **NOT** possible to insert or update an entity by following a navigation property from a single entity to a collection of entities using the PUT method. Examples:

{% hint style="danger" %}
PUT <https://customer.ultimo.net/api/v1/object/Department('01')/Jobs('001')&#x20>;
{% endhint %}

## External identifiers

It is possible to insert or update data using an external identifier in the resource path. The external identifier of a resource will be stored in the Ultimo ExternalId property. The combination of ExternalId and DataProvider is unique in Ultimo. Based on this, the record will be identified. When inserting data using REST, the DataProvider is set with the value “Rest” by default, unless stated otherwise on the API key definition in Ultimo.&#x20;

The next examples explain the different uses of resource paths for the PUT, PATCH, and POST methods using the external identifier:&#x20;

* Request for a single entity:  \
  `PUT https://customer.ultimo.net/api/v1/object/Equipment(ExternalId=`'`00001`'`) PATCH https://customer.ultimo.net/api/v1/object/Equipment(ExternalId=`'`00001`'`)` &#x20;
* Request for single entity with a composite key: \
  `PUT (UPDATE ONLY) https://customer.ultimo.net/api/v1/object/InvoiceLine(ExternalId='01')  PATCH https://customer.ultimo.net/api/v1/object/InvoiceLine(ExternalId='01')` &#x20;

It is **NOT** possible to use the external identifier when the URL contains a nested path with at least two ExternalId usages or with a combination of the Ultimo Id and an external Id. Examples of bad requests:

{% hint style="danger" %}
PUT <https://customer.ultimo.net/api/v1/object/Department(ExternalId='01')/Jobs(ExternalId='002')/Equipments\\>
PUT <https://customer.ultimo.net/api/v1/object/Department(ExternalId='01')/Jobs('0002')/Equipments>
{% endhint %}

It is **NOT** possible to insert a resource with a composite key using only the external identifier:

{% hint style="danger" %}
PUT <https://customer.ultimo.net/api/v1/object/InvoiceLine(ExternalId='01>')
{% endhint %}

When external identifiers have been used to insert records, it is possible to refer to these records using ExternalId in the request body when inserting and updating other entities.

*Example of a request body using ExternalId for reference properties:*

```json
{ 
    "Context": 1, 
    "Status": 1, 
    "Description": "Asset", 
    "Vendor.ExternalId": "ExtVendorCode" 
} 
```

It is **NOT** possible to use both the Ultimo Id and ExternalId in the request body for the same property.

{% hint style="danger" %}

```json
{ 
    "Vendor.Id": "0001", 
    "Vendor.ExternalId": "ExtVendorCode" 
} 
```

{% endhint %}

It is **NOT** possible to use ExternalId in the request body with reference properties more than one level deep:

{% hint style="danger" %}

```json
{ 
    "Department.Site.ExternalId": "ExtSiteCode" 
} 
```

{% endhint %}

## Multi-lingual properties

When the API key is set to use multi-lingual properties, it is possible to update all languages (available in the environment) within a request. The languages that are not specified in the request will not be modified.&#x20;

*Example of a request body with a multi-lingual properties:*&#x20;

```json
{ 
    "Description": { 
        "NL": "NL value", 
        "EN": "EN value", 
        "DE": "DE value", 
        "FR": "FR value", 
        "IT": "IT value", 
        "ES": "ES value", 
        "PL": "PL value", 
        "TR": "TR value" 
    } 
} 
```

When the API key is **NOT** set to use multi-lingual properties, then it is *only* possible to update a single language of a multi-lingual property. To do so, it is mandatory to specify for which language the update should be made. You can specify the language using the ‘Content-Language’ request header (case sensitive) in the following format:&#x20;

* Content-Language: NL&#x20;
* Content-Language: en-US&#x20;

*Example of a request body without multi-lingual properties:*&#x20;

```json
{ 
    "Description": "NL value" 
} 
```


# Inserting data in batch

For cloud customers on Azure, it is possible to insert and update data in bulk with the REST API. A specific BATCH endpoint is available to support these requests.

## BATCH operations&#x20;

With the batch operation, it is possible for API clients to perform multiple actions, like inserts and updates, for multiple resources within a single request.&#x20;

### Batch size

Batch API use is subject to the standard API usage limits. Each HTTP request counts as one call when calculating usage limits. Next to that, a batch can contain a maximum of 100 records per request.

### Headers&#x20;

The main request headers are applied for all the requests from the batch action. It is not possible to set the headers for each individual request.&#x20;

### Request body&#x20;

A JSON batch request body consists of a single JSON object that MUST contain the name/value pair requests.&#x20;

The value of requests is an array of request objects, each representing an individual request. All requests which have no atomicity group set will be processed in separate transactions. Note: an individual request MUST NOT itself be a batch request.&#x20;

A request object MUST contain the name/value pairs id, method, and url, and it MAY contain the name/value pairs atomicityGroup, dependsOn, and body. The table below explains more about these name/value pairs.

<table><thead><tr><th width="181.60160323533896">Name/Value</th><th width="150">Required</th><th width="411.92169176386557">Explanation</th></tr></thead><tbody><tr><td>id</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td><p>The value of this property is a string containing the request identifier of the individual request. It allows only alphanumerical, dashes, dot, and underscore characters. </p><p></p><p>It MUST NOT be identical to the value of any other request identifier nor any atomicityGroup within the batch request. </p></td></tr><tr><td>method</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>The value of this property is a string that MUST contain one of the literals DELETE, PATCH, POST, or PUT. These literals are case-insensitive. </td></tr><tr><td>url</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td><p>The value of this property is a string containing the individual request URL. The URL MUST be an absolute path which is appended to scheme, host, and port of the batch request URL. It should not start with a slash. </p><p></p><p>Note: only Object is supported, it is not possible to execute multiple REST workflows in batch.</p></td></tr><tr><td>body</td><td><span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td><td><p>The value of this property can be null, which is equivalent to not specifying the body name/value pair. </p><p></p><p>More information about the request body of a single request can be found <a href="https://developer.ultimo.net/api-guide/rest/inserting-data#request-body">here</a>. </p></td></tr><tr><td>atomicityGroup </td><td><span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td><td><p>The value of this property is a string whose content MUST NOT be identical to any value of id within the batch request. It allows only alphanumerical, dashes, dot, and underscore characters. </p><p></p><p>All request objects with the same value for atomicityGroup MUST be adjacent in the requests array. </p><p></p><p>These requests are processed as an atomic operation and in a SINGLE transaction and MUST either all succeed, or all fail. If one of the requests fails, then all the other requests from that atomicity group will have a response with status code 424 - Failed Dependency. </p></td></tr><tr><td>dependsOn</td><td><span data-gb-custom-inline data-tag="emoji" data-code="274c">❌</span></td><td><p>The value of this property is an array of strings whose values MUST be id-values of preceding request objects; forward references are not allowed. </p><p></p><p>dependsOn property can be used only for requests without an atomicity group or for requests with the same atomicity group. </p><p></p><p>It is possible to reference the request which it depends on to get the correct entity and identifier combination. The syntax for this is $[dependsOn_id]. </p><p></p><p>If one of the requests it depends on has failed, the dependent request is not executed and a response with status code of 424 - Failed Dependency is returned for it as part of the batch response. </p></td></tr></tbody></table>

*Example of a BATCH request*&#x20;

`POST https://customer.ultimo.net/api/v1/batch`&#x20;

```json
{ 
    "requests": [{ 
            "id": "1", 
            "method": "PUT", 
            "url": "Object/Equipment('00001')", 
            "body": { 
                "Context": 1, 
                "Description": "Asset", 
                "InstallDate": "2022-04-07", 
                "NextPmMaintenanceDate": "2023-04-07", 
                "Status": 2, 
                "CostCenter": "01", 
                "Department": "01" 
            } 
        }, { 
            "id": "2", 
            "method": "POST", 
            "url": "Object/Equipment", 
            "body": { 
                "Context": 1, 
                "Description": "Asset", 
                "InstallDate": "2022-04-07", 
                "NextPmMaintenanceDate": "2023-04-07", 
                "Status": 2, 
                "CostCenter": "01", 
                "Department": "01" 
            } 
        }, { 
            "id": "3", 
            "method": "PATCH", 
            "url": "Object/Equipment('00001')", 
            "body": { 
                "Description": "Installation" 
            } 
        }, { 
            "id": "4", 
            "method": "DELETE", 
            "url": "Object/Equipment('00001')" 
        } 
    ] 
} 
```

&#x20;*Example of a BATCH response*&#x20;

```json
{ 
    "responses": [{ 
            "id": "1", 
            "status": 201, 
            "body": { 
                "Id": "00001", 
                "Context": 1, 
                "Description": "Asset", 
                "InstallDate": "2022-04-07", 
                "NextPmMaintenanceDate": "2023-04-07", 
                "Status": 2, 
                "CostCenter": "01", 
                "Department": "01" 
            } 
        }, { 
            "id": "2", 
            "status": 201, 
            "body": { 
                "Id": "39939", 
                "Context": 1, 
                "Description": "Asset", 
                "InstallDate": "2022-04-07", 
                "NextPmMaintenanceDate": "2023-04-07", 
                "Status": 2, 
                "CostCenter": "01", 
                "Department": "01" 
            } 
        }, { 
            "id": "3", 
            "status": 200, 
            "body": { 
                "Id": "00001", 
                "Context": 1, 
                "Description": "Installation", 
                "InstallDate": "2022-04-07", 
                "NextPmMaintenanceDate": "2023-04-07", 
                "Status": 2, 
                "CostCenter": "01", 
                "Department": "01" 
            } 
        }, { 
            "id": "4", 
            "status": 204 
        } 
    ] 
} 
```

*Example of a BATCH request with atomicityGroup and dependsOn*

`POST https://customer.ultimo.net/api/v1/batch`&#x20;

```json
{ 
    "requests": [{ 
            "id": "1", 
            "method": "PUT", 
            "url": "Object/Department('01')", 
            "body": { 
                "Context": 1, 
                "Description": "Department", 
                "Status": 0 
            } 
        }, { 
            "id": "2", 
            "method": "PUT", 
            "dependsOn": ["1"], 
            "url": "Object/Employee('000001')", 
            "body": { 
                "Context": 1, 
                "Description": "John Doe", 
                "Status": 0, 
                "Department": "01" 
            } 
        }, { 
            "id": "a1", 
            "method": "POST", 
            "atomicityGroup": "group1", 
            "url": "Object/Invoice", 
            "body": { 
                "Context": 2, 
                "Status": 1, 
                "Description": "Invoice", 
                "Vendor": "2513", 
                "Site": "23" 
            } 
        }, { 
            "id": "a2", 
            "method": "POST", 
            "atomicityGroup": "group1", 
            "dependsOn": ["a1"], 
            "url": "Object/$a1/Lines", 
            "body": { 
                "Context": 2, 
                "Status": 1, 
                "Description": "Invoice line 1" 
            } 
        }, { 
            "id": "a3", 
            "method": "POST", 
            "atomicityGroup": "group1", 
            "dependsOn": ["a1", "a2"], 
            "url": "Object/$a1/Lines", 
            "body": { 
                "Context": 2, 
                "Status": 1, 
                "Description": "Invoice line 2" 
            } 
        } 
    ] 
}
```

*Example of a BATCH response with atomicityGroup and dependsOn*

```json
{ 
    "responses": [{ 
            "id": "1", 
            "status": 200, 
            "body": { 
                "Id": "01", 
                "Context": 1, 
                "Description": "Department", 
                "Status": 0 
            } 
        }, { 
            "id": "2", 
            "status": 200, 
            "body": { 
                "Id": "000001", 
                "Context": 1, 
                "Description": "John Doe", 
                "Status": 0, 
                "Department": "01" 
            } 
        }, { 
            "id": "a1", 
            "status": 201, 
            "body": { 
                "Id": "001", 
                "Context": 2, 
                "Description": "Invoice", 
                "Status": 1, 
                "Site": "23", 
                "Vendor": "2513" 
            } 
        }, { 
            "id": "a2", 
            "status": 201, 
            "body": { 
                "Id": { 
                    "Invoice": "001", 
                    "LineId": "0001" 
                }, 
                "Context": 2, 
                "Description": "Invoice line 1", 
                "Status": 1 
            } 
        }, { 
            "id": "a3", 
            "status": 201, 
            "body": { 
                "Id": { 
                    "Invoice": "001", 
                    "LineId": "0002" 
                }, 
                "Context": 2, 
                "Description": "Invoice line 2", 
                "Status": 1 
            } 
        } 
    ] 
} 
```


# File uploads

The Ultimo REST API is able to receive file uploads. There are two ways to send files:

* Sending multipart/form-data content
* Using Base64 encoded strings in the request body

For both options, it is required to create a specific workflow in Ultimo by a consultant to process these requests correctly.&#x20;

It is recommended to send files using multipart/form-data format. Using Base64 encoding increases the file size by approximately 33%, resulting in larger payloads and additional processing time. Additionally, multipart/form-data supports transmitting larger files (see Limits and Quotas).

*Example of a multipart/form-data request*

```
curl --location "https://customer.ultimo.net/api/v1/action/_REST_UploadFile" ^
--header "applicationelementid: 99999999-9999-9999-9999-999999999999" ^
--header "apikey: 99999999999999999999999999999999" ^
--form "File=@C:/temp/Manual.pdf" ^
--form "JobId=123456789"
```

An example of how to use base64 in requests can be found [here](/api-key-templates/jobs/attach-or-change-images).


# Query options

The query options are based on the 'OData version 4' standard query options.

## Filters

The 'filter' query option can be used to filter the collection of entities. The following operators can be used to filter:

{% hint style="info" %}
The spaces around the operators used in the following examples must be percent-encoded as %20 when used in a real URL.
{% endhint %}

* Equals:    `GET https://customer.ultimo.net/api/v1/object/Article?filter=Description eq 'Luchtfilter'`    The 'eq' operator returns true if the left operand is equal to the right operand, otherwise it returns false. &#x20;
* Not Equals:    `GET https://customer.ultimo.net/api/1/object/Article?filter=Description ne 'Luchtfilter'`    The 'ne' operator returns true if the left operand is not equal to the right operand, otherwise it returns false.&#x20;
* Greater Than:    `GET https://customer.ultimo.net/api/V1/object/Article?filter=PurchasePrice gt 500.0`    The 'gt' operator returns true if the left operand is greater than the right operand, otherwise it returns false. &#x20;
* Greater Than or Equal:    `GET https://customer.ultimo.net/api/v1/object/Article?filter=PurchasePrice ge 500.0`    The 'ge' operator returns true if the left operand is greater than or equal to the right operand, otherwise it returns false. &#x20;
* Less Than:    `GET https://customer.ultimo.net/api/v1/object/Article?filter=PurchasePrice lt 1.0`  The   'lt' operator returns true if the left operand is less than the right operand, otherwise it returns false. &#x20;
* Less Than or Equal:    `GET https://customer.ultimo.net/api/v1/object/Article?filter=PurchasePrice le 1.0`    The 'le' operator returns true if the left operand is less than or equal to the right operand, otherwise it returns false. &#x20;
* Like:    `GET https://customer.ultimo.net/api/v1/object/Article?filter=Description like 'Lucht%'`    The 'like' operator returns true if the left operand matches the pattern of the right operand, otherwise it returns false. The % wildcard matches any string of zero or more characters. The \_ wildcard matches any single character.&#x20;
* IN:    `GET https://customer.ultimo.net/api/1/object/Article?filter=Id in ('0001', '0002')`    The 'in' operator returns true if the left operand is equal to one of the values in the right operand, otherwise it returns false. &#x20;
* And:   `GET https://customer.ultimo.net/api/v1/object/Article?filter=PurchasePrice gt 1000.0 and PurchasePrice lt 1500.0`    The 'and' operator returns true if both the left and right operands evaluate to true, otherwise it returns false. &#x20;
* Or:    `GET https://customer.ultimo.net/api/v1/object/Article?filter=Description like 'PC%' or Description like 'Laptop%'`    The 'or' operator returns false if both the left and right operands both evaluate to false, otherwise it returns true. &#x20;
* Not:    `GET https://customer.ultimo.net/api/v1/object/Article?filter=not Description like '%filter'`    The 'not' operator returns true if the operand returns false, otherwise it returns false. &#x20;
* The open and close parenthesis 'and' can be used to control the order of evaluation of a filter expression:    `GET https://customer.ultimo.net/api/v1/object/Article?filter=(Description like 'PC%' or Description like 'Laptop%') and not (PurchasePrice gt 1000.0 and PurchasePrice lt 1500.0)`
* To filter on a relation, it is required to add /Id as an attribute:`GET https://customer.ultimo.net/api/v1/object/Article?filter=ArticleGroup/Id eq '0001'`

The following values can be used as operands in a filter expression:

<table><thead><tr><th width="172.3598146309169">Operand</th><th>Example value</th></tr></thead><tbody><tr><td>Null</td><td><p>null</p><p>Note:</p><ul><li>The null value can only be used with the 'eq' and 'ne' operators</li></ul></td></tr><tr><td>Boolean</td><td><p>true</p><p>false</p></td></tr><tr><td>Integer</td><td>-17</td></tr><tr><td>Decimal</td><td>1.234</td></tr><tr><td>String</td><td>'Hello world'</td></tr><tr><td>Date</td><td>2018-03-09</td></tr><tr><td>DateTimeOffset</td><td><p>2018-03-09T15:33:51.1355081Z</p><p>2018-03-09T16:33:51.1355081+01:00</p><p>Notes:</p><ul><li>The seconds and fractions are optional</li><li>The plus character must be percent-encoded when used in a real URL</li></ul></td></tr><tr><td>TimeOfDay</td><td><p>16:33:51.1355081</p><p>16:33</p><p>Note:</p><ul><li>The seconds and fractions are optional</li></ul></td></tr></tbody></table>

## Order by

The 'orderby' query option can be used to specify the order in which a collection is returned. It must contain a comma-separated list of property paths which end on a primitive property. The path can include an 'asc' suffix for ascending order or a 'desc' suffix for descending order. If no suffix is specified the results are returned in ascending order. The results are first ordered on the value of the first property path, then by the second property path and so on.

* Return all articles ordered on ascending description:    `GET https://customer.ultimo.net/api/v1/object/Article?orderby=Description asc` &#x20;
* Return all articles order on descending description:    `GET https://customer.ultimo.net/api/v1/object/Article?orderby=Description desc` &#x20;
* Return all articles order by descending description and the by ascending Id    `GET https://customer.ultimo.net/api/v1/object/Article?orderby=Description desc,Id`&#x20;

## Expand

The 'expand' query option can be used to specify related entities to include in the response. It must contain a comma-separated list of navigation properties. Each navigation property can be followed by a forward slash and another navigation property to expand a nested relationship. The maximum level of nested relationships that can be expanded is 3.

* For each equipment include all related spareparts and the vendor entity:    `GET https://customer.ultimo.net/api/v1/object/Equipment?expand=SpareParts,Vendor` &#x20;
* For each building include all related buildingparts and for each buildingpart include all related buildingfloors:    `GET https://customer.ultimo.net/api/v1/object/Equipment?expand=BuildingParts/BuildingFloors`

## Select

The 'select' query option can be used to specify a subset of properties to include in the response. It must contain a comma-separated list of properties or navigation properties.

* For each equipment return only the description and typenumber:    `GET https://customer.ultimo.net/api/v1/object/Equipment?select=Description,TypeNumber`

The select query option can be combined with the expand query option to include a subset of properties of an expanded entity. The expanded entity must be included in the select query option.

* For each equipment the description is returned and for the expanded vendor only the name is returned:    `GET https://customer.ultimo.net/api/v1/object/Equipment?select=Description,Vendor/Name&expand=Vendor`

## Top

The 'top' query option can be used to request the number of items in the collection to be included in the result.

* Return the first 10 articles of the collection:    `GET https://customer.ultimo.net/api/v1/object/Article?top=10`

## Skip

The 'skip' query option can be used to specify the number of items that are skipped and not included in the result.

* Return the articles starting from the 6th article of the collection:    `GET` `https://customer.ultimo.net/api/v1/object/Article?skip=5` &#x20;
* Return 10 articles starting from the 21st article from the collection when sorted by description:    `GET` `https://customer.ultimo.net/api/v1/object/Article?top=10&skip=20&orderby=Description`

## Count

The 'count' query option can be used to include the count of the matching items of a collection to be included in the result.

* Include the total number of articles in the result:    `GET https://customer.ultimo.net/api/v1/object/Article?count=true` &#x20;
* Return the first 10 articles which have a purchase price greater than 500 and include a count of the total number of articles which have a purchase price greater than 500:    `GET https://customer.ultimo.net/api/v1/object/Article?filter=PurchasePrice gt 500.0&count=true&top=10`


# Special characters

Some special characters can't be directly used in requests. This paragraph explains all limitations and how to work around them.

You can't use a forward slashes for the Id in the route, because it will be interpreted as a path separator:

{% hint style="danger" %}
`GET https://customer.ultimo.net/api/v1/object/Building('01/02')`
{% endhint %}

Using URL encoding also won't work because WebAPI will URL decode it first and it will result in the same URL:

{% hint style="danger" %}
`GET https://customer.ultimo.net/api/v1/object/Building('01%2f02')`
{% endhint %}

It is possible to use a forward slash in the Id when using a filter:

{% hint style="success" %}
`GET https://customer.ultimo.net/api/v1/object/Building?filter=Id eq '01/02'`
{% endhint %}

The following special characters also can't be used in the Id, because ASP.NET will give a warning about a potentially dangerous request path value: `< > * % & : \ ?`

The detection of these special characters can be disabled but that might be a potential security issue. It is possible to use these special characters in a filter when properly URL encoded:

{% hint style="danger" %}
`GET https://customer.ultimo.net/api/v1/object/Building?filter=Id eq '<>*%&:\?'`
{% endhint %}

{% hint style="success" %}
`GET https://customer.ultimo.net/api/v1/object/Building?filter=Id+eq+'%3C%3E*%25%26%3A%3F'`
{% endhint %}

Other special characters can be used in the Id when properly URL encoded:

{% hint style="danger" %}
``GET https://customer.ultimo.net/api/v1/object/Building('$+,;=@ "{}!^~[]`')``
{% endhint %}

{% hint style="success" %}
`GET https://customer.ultimo.net/api/v1/object/Building('$+,;=@%20%22%7B%7D!%5E~%5B%5D%60')`
{% endhint %}

Single quotes inside strings used in a filter expression need to be escaped using two single quotes:

`GET https://customer.ultimo.net/api/v1/object/Building?filter=Description eq 'single''quote'`


# Testing REST

Besides the above described general instructions for requesting data, Ultimo is able to generate key specific [Swagger](https://swagger.io/) documentation. Swagger documentation contains all commands that can be executed in the API connection, including options to try it out. It is specific to the key, as it generates content based on the configuration of the API key. Another possibility to test the REST API is by using [Postman](https://www.postman.com/).

| ![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MZmRVbbu75Ds8MiWx_F%2F-MZmSSEIxU4aznMfSsPm%2F-MZmVLctx-q5bOQrYm7v%2Fswagger_logo.svg?alt=media\&token=d2e703e9-5383-4ec1-ae44-a31aac30629d) | ![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MZmRVbbu75Ds8MiWx_F%2F-MZmSSEIxU4aznMfSsPm%2F-MZmVLcrEBqS_VPcjPh4%2Fpostman.svg?alt=media\&token=8b6846a6-2b0f-4ac1-a5cf-88c5436bb95e) |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |


# Additional security

For cloud customers on Azure, additional security is available for the REST API. Without additional security measures, anyone in possession of the API key secret is able to connect to the API endpoint.

## IP filtering

It is possible to add IP address range validations per API key. Use '-' to allow everything in between and ';' to use multiple ranges. Keep in mind: this is a whitelist. All IP addresses not on the whitelist will not be able to connect.

Support for both IPv4 and IPv6 address range validation is available. When only one of them is filled, the other is completely blocked. Example: when IPv4 is filled, no one can connect with a IPv6 address.

Note: IP filtering on API keys have no relation with IP filtering options for logging on to the Ultimo application.

## Client certificates

It is possible to specify a certificate thumbprint per API key. The client connecting to the API endpoint should always send the certificate that meets the certificate thumbprint on the API key when sending a request.

When a certificate thumbprint is used on an API key, the URL of the API endpoint is different than without a client certificate. Instead of using the standard URL:

> <https://customer.ultimo.net/api/v1/>

Use the following URL:

> https\://**api-**&#x63;ustomer.ultimo.net/api/v1/

A cUrl command example of sending a request with a client certificate:

```
curl --cert C:\temp\client.crt --key c:\temp\client.key -X GET "https://api-customer.ultimo.net/api/v1/object/Article" -H "accept: application/json" -H "ApiKey: [ApiKey]"
```


# Limits and Quotas

This page describes the limits and quotas on REST API requests. We put limits and quotas on API requests to protect the system from receiving more data than it can handle, and to ensure an equitable distribution of the system resources. The limits and quotas are subject to change.

### General quota limits <a href="#general_quota_limits" id="general_quota_limits"></a>

The following quotas apply to the REST API:

* 10,000 requests per day (all API keys combined, cannot be increased)
* 100 requests per 10 seconds (all API keys combined, cannot be increased)
* 100 records batch size per batch request (cannot be increased)
* A maximum payload size of 1MB per single/batch request (cannot be increased)
* A maximum payload size of 20MB per workflow request (cannot be increased)
* A maximum file upload size of 500MB when using Content-Type *multipart/form-data* (cannot be increased)

### Exceeding quota limits <a href="#exceeding" id="exceeding"></a>

If the quota of requesting the REST API is exceeded, the API returns an error code `429` or `413` and a message that the account has exceeded the quota. If the batch size is exceeded, error code `400` will be returned.

### Distributing quotas

It is possible to set a daily request quota per API key. This allows for distributing quotas between several parties, to make sure important interfaces always have the required resources available.&#x20;


# HTTP POST

:no\_entry\_sign:Professional :white\_check\_mark:Premium :white\_check\_mark:Enterprise

It’s possible to communicate to the HTTP handler through an HTTP POST request. Within the HTTP POST specific data using key-value pairs are required in the message and send an XML string as a single parameter that includes all the objects structured in XML format.

The receiving client should parse the HTTP POST response data and extract the XML that was constructed by Ultimo Business Integration containing all the object data.

## How to set up

To connect to the HTTP handler, a connector has to be created for a client. Connectors can be defined in the Ultimo Configuration Tool. A connector contains a definition of entities and properties that are available in the POST body.

{% hint style="info" %}
Note: For more information on how to configure connectors please contact your Ultimo consultant.&#x20;
{% endhint %}

## How to connect

The url to send the request to:

`https://customer.ultimo.net/WebServices/Connector.ashx`

* `https://customer.ultimo.net`

  represents the domain name where the Ultimo software is available.
* `/WebServices/Connector.ashx` represents a relative path, if the Ultimo software is installed in a different directory.

*Example:*

Ultimo Software is located at:\
`https://yourdomain.ultimo.net/`

Then the path should be:\
`https://yourdomain.ultimo.net/Webservices/Connector.ashx`

## Authentication

When sending a request using HTTP POST, authentication should be added as username & password parameters to the connection string. Therefor it is strongly recommended to use a HTTPS connection when using HTTP Post.

## Limitation

When sending a request using HTTP POST, a maximum payload size of 20MB per request is accepted.


# Overview of a POST request

The following example explains the raw POST request as it is sent to Connector.ashx:

```javascript
POST  /WebServices/Connector.ashx HTTP/1.1
Host: <>
Content-type: application/x-www-form-urlencoded
Content-length: <<length_of_data>>
Connection: close
```

Several parameter should be added to the request to make it more specific. Which parameters to use depend on the desired action.

| Parameter  | Value                                                                                        |
| ---------- | -------------------------------------------------------------------------------------------- |
| Username   | An existing user in Ultimo (Id) with authorisation to execute connectors                     |
| Password   | Password of the above user                                                                   |
| Action     | <p>'export' when retrieving data from Ultimo</p><p>'import' when changing data in Ultimo</p> |
| ExportName | Required when action is 'export'. Id of the export connector.                                |
| ImportName | Required when action is 'import'. Id of the import connector.                                |


# Requesting data

It is possible to retrieve data by sending a request to one of the activated export connectors. Without sending a body, all data from the connector will be returned.

*Parameter example:*

username=user\&password=password\&action=export\&exportName=exportconnector

It is possible to add filters to a request to retrieve specific information from the connector. Filters can be added by sending them in the body of the request.

*Example body*

```javascript
<?xml version="1.0" encoding="utf-8"?>
<Data>
    <Object Type="EntityName" Action="InsertOrUpdate">
        <Property Name="Id" Value="CODE01" />
        <Property Name="Description" Value="Object 1" />
    </Object>       

    <Object Type="EntityName" Action="InsertOrSkip">
        <Property Name="Id" Value="CODE02" />
        <Property Name="Description" Value="Object 2" />

        <Object Type="EntityName" Action="InsertOrSkip">
            <Property Name="Id.Parent.Id" Value="${Parent.Id}" Evaluate="true" />
            <Property Name="Id.Child" Value="CODE03" />
            <Property Name="Description" Value="Nested object" />
        </Object>
    </Object>             
</Data>
```

*Example response*

Returns the full request or an exception

```javascript
<?xml version="1.0" encoding="utf-16"?>
<Data>
    <Object Type="EntityName" Action="Insert">
        <Property Name="Id" Value="CODE01" />
    </Object>
    <Object Type="EntityName" Action="Insert">
        <Property Name="Id" Value="CODE02" />
    </Object>
    <Object Type="EntityName" Action="Insert">
        <Property Name="Id" Value="CODE03" />
    </Object>
</Data>
```

The request and response are expected and returned in a fixed Ultimo format. With XSL transformations, it is possible to transform the request (to the Ultimo format) and response (to the desired custom format) when using XML as an output result. This is optional and can only be done by our consultants. Output can also be returned in a default CSV or JSON format.


# Inserting data

It is possible to change data by sending a request to one of the activated import connectors.

*Parameter example:*

`username=user&password=password&action=import&importName=importconnector`

Each object to import should be bundled in a single \<object> node. All attributes of an object should be added as properties. The name of a property represents a database field in Ultimo. It is possible to send multiple objects at once. The action to execute per object should be determined when creating an interface.

It is also possible to nest objects, to create a parent/child construction. When nested objects are used, the ${Parent.Id} syntax can be used to refer to the parent. To make sure Ultimo tries to get the value of the parent, attribute Evaluation should be added.

*Example body including a nested object*

```javascript
<?xml version="1.0" encoding="UTF-8"?>
<Data>
    <Object Type="EntityName" Action="InsertOrUpdate">
        <Property Name="Id" Value="CODE01"/>
        <Property Name="Description" Value="Object 1"/>
    </Object>
    <Object Type="EntityName" Action="InsertOrSkip">
        <Property Name="Id" Value="CODE02"/>
        <Property Name="Description" Value="Object 2"/>
        <Object Type="EntityName" Action="InsertOrSkip">
            <Property Name="Id.Parent.Id" Value="${Parent.Id}" Evaluate="true"/>
            <Property Name="Id.Child" Value="CODE03"/>
            <Property Name="Description" Value="Nested object"/>
        </Object>
    </Object>
</Data>
```

*Example response (returns the full request with the executed action per obejct or an exception)*

```javascript
<?xml version="1.0" encoding="utf-8"?>
<Data>
    <Object Type="Equipment" Action="Insert">
        <Property Name="Id" Value="CODE01" />
    </Object>
    <Object Type="Equipment" Action="Insert">
        <Property Name="Id" Value="CODE02" />
    </Object>
    <Object Type="Equipment" Action="Insert">
        <Property Name="Id" Value="CODE03" />
    </Object>
</Data>
```


# Testing HTTP POST

There are several ways to test HTTP Post requests, depending on the available tools, expertise and preference of the user. Postman for example could be used if a tool with a graphical user interface is preferred. Another option is to use cURL. cURL is a command line tool and is available for almost every operating system. Curl can be downloaded from <http://curl.haxx.se/dlwiz/?type=bin>.

In the example below the file request.xml contains the optional request body and the response will be written to the file response.xml. To send a request without the optional request body, remove arguments --data-binary @C:\request.xml.

```javascript
curl --data-binary @c:\request.xml -o c:\response.xml -H "Content-type: text/xml;charset=utf-8" 
     "https://customer.ultimo.net/Webservices/Connector.ashx?username=<<username>>&password=<<password>>&action=export&exportName=<<exportconnectorname>>"
```

To import data the action should be changed to import:

```javascript
curl --data-binary @c:\request.xml -o c:\response.xml -H "Content-type: text/xml;charset=utf-8" 
     "https://customer.ultimo.net/Webservices/Connector.ashx?username=<<username>>&password=<<password>>&action=import&importName=<<importconnectorname>>"
```


# Additional security

For cloud customers on Azure, additional security is available for import and export connectors. Without additional security measures, anyone in possession of a valid and authorised username/password combination is able to connect to the API endpoint.

## IP filtering

It is possible to add IP range validations per import or export connector. Use '-' to allow everything in between and ';' to use multiple ranges. Keep in mind: this is a whitelist. All IP addresses not on the whitelist will not be able to connect.

Support for both IPv4 and IPv6 address range validation is available. When only one of them is filled, the other is completely blocked. Example: when IPv4 is filled, no one can connect with a IPv6 address.

Note: IP filtering on import or export connectors have no relation with IP filtering options for logging on to the Ultimo application.

## Client certificates

It is possible to specify a certificate thumbprint per connector. The client connecting to the connector endpoint should always send the certificate that meets the certificate thumbprint on the connector when sending a request.

When a certificate thumbprint is used on a connector, the URL of the connector endpoint is different than without a client certificate. Instead of using the standard URL:

> <https://customer.ultimo.net/webservices/connector.ashx>

Use the following URL:

> https\://**api-**&#x63;ustomer.ultimo.net/webservices/connector.ashx

A cUrl command example of sending a request with a client certificate:

```
curl --cert C:\temp\ssl\client.crt --key c:\temp\ssl\client.key "https://api-customer.ultimo.net/webservices/connector.ashx?username=[username]&password=[password]&action=export&exportname=[exportconnectorname]"
```

**Note:** client certificates are only used when clients connect to the Ultimo connector. If the Ultimo connector calls a third-party webservice, client certificates are not applicable.


# SOAP

:no\_entry\_sign:Professional :white\_check\_mark:Premium :white\_check\_mark:Enterprise

This section explains how to setup a connection to the WCF / SOAP service.

## How to set up

To connect to the WCF / SOAP service, a connector has to be created for a client. Connectors can be defined in the Ultimo Configuration Tool. A connector contains a definition of entities and properties that are available in the SOAP body.

{% hint style="info" %}
Note: For more information on how to configure connectors please contact your Ultimo consultant.&#x20;
{% endhint %}

## How to connect

The url to send the request to:

`https://customer.ultimo.net/WebServices/SoapConnector.svc`

* `https://customer.ultimo.net/`

  is the domain name where the Ultimo software is available.
* `/WebServices/SoapConnector.svc`

  is a relative path, if the Ultimo software is installed in a different directory.

*Example:*

Ultimo Software is located at:\
`https://yourdomain.ultimo.net/`

Then the path should be:\
`https://yourdomain.ultimo.net/Webservices/SoapConnector.svc`

## WSDL

Available functionality within the SOAP web service can be found inside the WSDL description.

`https://customer.ultimo.net/WebServices/SoapConnector.svc?wsdl`

## Authentication

When sending a request to the SOAP web service, authentication should be added to the SOAP body.

## Limitation

When sending a request using SOAP, a maximum payload size of 20MB per request is accepted.


# Overview of a POST request

The following example explains the raw POST request as it is sent to SoapConnector.svc:

```javascript
POST /WebServices/SoapConnector.svc HTTP/1.1
Host: <>
Content-Type: text/xml;charset=UTF-8
SOAPAction: "http://tempuri.org/SoapConnector/ExportData"
Content-Length: <<length_of_data>>
Connection: close
```

Several nodes should be added to the SOAP body to make it more specific. Which parameters to use depend on the desired action.

| Parameter  | Value                                                                    |
| ---------- | ------------------------------------------------------------------------ |
| userName   | An existing user in Ultimo (Id) with authorisation to execute connectors |
| password   | Password of the above user                                               |
| exportName | Required when action is 'export'. Id of the export connector.            |
| importName | Required when action is 'import'. Id of the import connector.            |


# Requesting data

It is possible to retrieve data by sending a request to one of the activated export connectors. Without sending requestData, all data from the connector will be returned. It is possible to add filters to a request to retrieve specific information from the connector. Filters can be applied by adding them in the requestData node within a CDATA block.

*Example request*

```javascript
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
    <soapenv:Header/>
    <soapenv:Body>
        <tem:ExportData>
            <tem:exportName>exportconnector</tem:exportName>
            <tem:userName>user</tem:userName>
            <tem:password>password</tem:password>
            <tem:requestData>
                <![CDATA[<Data>
                <RequestInfo>
                    <Property Name="Code" Value="[FilterValue]" />
                </RequestInfo>
            </Data>]]>
            </tem:requestData>
        </tem:ExportData>
    </soapenv:Body>
</soapenv:Envelope>
```

*Example response*

Returns the full request or an exception

```javascript
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body>
        <ExportDataResponse xmlns="http://tempuri.org/">
            <ExportDataResult>
                <![CDATA[<Data>
                    <Object Type="EntityName" Action="InsertOrUpdate">
                        <Property Name="Id" Value="[FilterValue]" />
                        <Property Name="Description" Value="Object 1" />
                    </Object>
                </Data>]]>
            </ExportDataResult>
        </ExportDataResponse>
    </s:Body>
</s:Envelope>
```

The request and response are expected and returned in a fixed Ultimo format. With XSL transformations, it is possible to transform the request (to the Ultimo format) and response (to the desired custom format) when using XML as an output result. This is optional and can only be done by our consultants. Output can also be returned in a default CSV or JSON format.


# Inserting data

It is possible to change data by sending a request to one of the activated import connectors.

Each object to import should be bundled in a single \<object> node. All attributes of an object should be added as properties. The name of a property represents a database field in Ultimo. It is possible to send multiple objects at once. The action to execute per object should be determined when creating an interface.

It is also possible to nest objects, to create a parent/child construction. When nested objects are used, the ${Parent.Id} syntax can be used to refer to the parent. To make sure Ultimo tries to get the value of the parent, attribute Evaluation should be added.

*Example request including a nested object*

```javascript
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
   <soapenv:Header/>
   <soapenv:Body>
      <tem:ImportData>
         <tem:importName>importconnector</tem:importName>
         <tem:userName>user</tem:userName>
         <tem:password>password</tem:password>
         <tem:importData><![CDATA[<Data>
        <Object Type="EntityName" Action="InsertOrUpdate">
                <Property Name="Id" Value="CODE01" />
                <Property Name="Description" Value="Object 1" />
        </Object>      

        <Object Type="EntityName" Action="InsertOrSkip">
                <Property Name="Id" Value="CODE02" />
                <Property Name="Description" Value="Object 2" />

                <Object Type="EntityName" Action="InsertOrSkip">
                        <Property Name="Id.Parent.Id" Value="${Parent.Id}" Evaluate="true" />
                        <Property Name="Id.Child" Value="CODE03" />
                        <Property Name="Description" Value="Nested object" />
                </Object>
        </Object>            
</Data>]]></tem:importData>
      </tem:ImportData>
   </soapenv:Body>
</soapenv:Envelope>
```

*Example response (returns the full request with the executed action per obejct or an exception)*

```javascript
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body>
        <ImportDataResponse xmlns="http://tempuri.org/">
            <ImportDataResult>
                <![CDATA[<?xml version="1.0" encoding="utf-16"?>
                <Data>
                    <Object Type="Equipment" Action="Insert">
                        <Property Name="Id" Value="CODE01" />
                    </Object>
                    <Object Type="Equipment" Action="Insert">
                        <Property Name="Id" Value="CODE02" />
                    </Object>
                    <Object Type="Equipment" Action="Insert">
                        <Property Name="Id" Value="CODE03" />
                    </Object>
                </Data>]]>
            </ImportDataResult>
        </ImportDataResponse>
    </s:Body>
</s:Envelope>
```


# Testing SOAP

There are several ways to test SOAP requests, depending on the available tools, expertise and preference of the user. SoapUI for example could be used if a tool with a graphical user interface is preferred. Another option is to use cURL. cURL is a command line tool and is available for almost every operating system. Curl can be downloaded from <http://curl.haxx.se/dlwiz/?type=bin>.

In the example below the file soaprequest.xml contains the soap call to export data and the response will be written to the file soapresponse.xml

```javascript
curl --data-binary @soaprequest.xml -o soapresponse.xml -H "SOAPACTION: http://tempuri.org/SoapConnector/ExportData" -H "Content-type: text/xml;charset=utf-8" 
       https://customer.ultimo.net/Webservices/SoapConnector.svc
```

To import data the SOAPACTION should be changed to ImportData.

```javascript
curl --data-binary @soaprequest.xml -o soapresponse.xml -H "SOAPACTION: http://tempuri.org/SoapConnector/ImportData" -H "Content-type: text/xml;charset=utf-8" 
       https://customer.ultimo.net/Webservices/SoapConnector.svc
```

| ![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MZmRVbbu75Ds8MiWx_F%2F-MZmSSEIxU4aznMfSsPm%2F-MZmVLcmn9WrKA925ZsA%2Fcurl-logo.svg?alt=media\&token=2a4ee398-3c70-4533-8caa-ff7205dc81ee) |   |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | - |


# Additional security

For cloud customers on Azure, additional security is available for import and export connectors. Without additional security measures, anyone in possession of a valid and authorised username/password combination is able to connect to the API endpoint.

## IP filtering

It is possible to add IP range validations per import or export connector. Use '-' to allow everything in between and ';' to use multiple ranges. Keep in mind: this is a whitelist. All IP addresses not on the whitelist will not be able to connect.

Support for both IPv4 and IPv6 address range validation is available. When only one of them is filled, the other is completely blocked. Example: when IPv4 is filled, no one can connect with a IPv6 address.

Note: IP filtering on import or export connectors have no relation with IP filtering options for logging on to the Ultimo application.

## Client certificates

It is possible to specify a certificate thumbprint per connector. The client connecting to the connector endpoint should always send the certificate that meets the certificate thumbprint on the connector when sending a request.

When a certificate thumbprint is used on a connector, the URL of the connector endpoint is different than without a client certificate. Instead of using the standard URL:

> <https://customer.ultimo.net/webservices/soapconnector.svc>

Use the following URL:

> https\://**api-**&#x63;ustomer.ultimo.net/webservices/soapconnector.svc

A cUrl command example of sending a request with a client certificate:

```
curl --cert C:\temp\ssl\client.crt --key c:\temp\ssl\client.key "https://api-customer.ultimo.net/webservices/soapconnector.svc?username=[username]&password=[password]&action=export&exportname=[exportconnectorname]"
```

**Note:** client certificates are only used when clients connect to the Ultimo connector. If the Ultimo connector calls a third-party webservice, client certificates are not applicable.


# Third party integration

:no\_entry\_sign:Professional :white\_check\_mark:Premium :white\_check\_mark:Enterprise

## Connecting to third party web services

Ultimo Business Integration is able to connect with third party web services. Both import and export connectors offer the possibility to send requests to a webservice url. By default, the request will be sent in a fixed Ultimo format. It is however possible to send data in a specified custom (xml or json) file format. This can be configured by our consultants.

Ultimo Business Integration is also able to connect with web services that require a Expect: 100-continue header in the initial request.

### Authentication options

The following authentication types are supported when connecting to third party web services:

* Basic authentication
  * Ultimo only supports pre-emptive authentication; the Authorization header is directly send with the first request
* [OAuth2.0](https://oauth.net/2/)
  * Ultimo offers support for grant types Authorization code, Password and Client credentials


# Error handling

:white\_check\_mark:Professional :white\_check\_mark:Premium :white\_check\_mark:Enterprise

Sending a request to Ultimo Business Integration will return an HTTP response status code. A list of all status codes can be found [here](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes). One important thing to remember: a 200 OK response does not mean that the request was successfully handled by Ultimo. It only means that the request was received successfully by the API. Whenever a request is successfully received, it will be processed separately afterwards. Details of possible errors will be returned in the response body.

## Common HTTP response status codes

* `200 OK`, Ultimo has received the web request successfully and tried to process it. Details of the processing results are returned in the response body.
* `400 Bad Request`, Ultimo is not able to process the request due to an apparent client error. This usually means there is a malformed request syntax.
* `401 Unauthorized`, Ultimo is not able to match the specified authentication parameters
* `404 Not found`, the used endpoint is probably incorrect
* `500 Internal Server Error`, a generic error that can be caused by many different problems. Depending on the failure, the response body might contain detailed information.

## Error message example

When processing of a request fails, the response body will contain detailed information on what went wrong. These error messages are returned in a fixed format and cannot be customised.


# BI Platform

Creating a database user and connecting to the IFS Ultimo cloud database.

It is possible to use Ultimo data in your data warehouse solution. By connecting to your Ultimo cloud database, you got access to a failover database, which is a real-time copy of your production data.&#x20;

When you've bought this module, Ultimo needs some information to prepare the connection. This page describes how you can collect this information, create a database user and how you can connect to your cloud database.


# Create database user

It is now possible for application managers in the Ultimo customer portal to create, adjust and add their own database user for their BI Platform whenever it is included in the license.

## Collection information

When setting up your database connection, you will need your external IP address(es). This can easily be retrieved by following the next steps:&#x20;

1. Open your browser and enter the following URL: <https://www.whatismyip.com/>&#x20;
2. &#x20;After opening the website, you immediately see your external IP (my public IPv4) address.

![Example of an IP address](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MZmRVbbu75Ds8MiWx_F%2F-MlJy-h4zoRx8ETyYb6u%2F-MlK0R9dK_Sh3RuxwcaN%2Fimage.png?alt=media\&token=77b8d8a6-603b-4d64-9d23-0816f8f21a08)

We strongly advise to limit the amount of IP addresses. Use your data warehouse tool to give users access instead of giving a lot of users access directly to all your data in the Ultimo database.

## Create a BI Platform database account.

1. Go to the Ultimo Customer Portal. (<https://portal.ultimo.net>)
2. On your Dashboard, you will find a tile labeled ‘BI Platform’; click on this tile.

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2Ff0Drj9OOuBOwH3Oi7wX9%2FPicture1.png?alt=media&amp;token=0e6eed5a-ab42-420d-a19c-75d2cd32189f" alt=""><figcaption></figcaption></figure>

3. A new dashboard will be opened. Click on the tile labeled ‘Add PowerBI account’.

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FlUAaPyWq6Xgm8gj17IWI%2FPicture2.png?alt=media&amp;token=9d602c48-9f08-49c1-b3c3-b93f88f9ebc3" alt=""><figcaption></figcaption></figure>

4. Select the account/company for which you want to create a database account. For most users, only one option will be available. Click on ‘OK.’

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FOM1tv4HIRd2LlGFf9iVu%2FPicture3.png?alt=media&amp;token=97391a7a-9ceb-423d-9360-52140d398740" alt=""><figcaption></figcaption></figure>

5. The Customer Portal will now verify whether you have an active ‘BI Platform’ module in your contract. If not, you will receive a message notifying you.

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FLxDugiMDgKeut37t5Wjm%2FPicture4.png?alt=media&amp;token=245b732a-aeef-455b-b919-f75e59a2b203" alt=""><figcaption></figcaption></figure>

6. In the next pop-up you must select the database you want to create an account for and the username. This username must be unique for that specific database. \
   (You can use the same username for every environment you have.)

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FQUKlVkdLOtqsTULCS29F%2FPicture5.png?alt=media&amp;token=e1fb84ee-50ba-4a5b-b25a-1bdde3b8b189" alt=""><figcaption></figcaption></figure>

7. When you click on ‘OK’ you will be forwarded to a new screen where you have to fill in some extra information for the database account.

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FNqykjJy0gVN9eDO8xlGR%2FPicture6.png?alt=media&amp;token=7249cf0d-3fdf-40b7-88f1-4cf70e3fcc67" alt=""><figcaption></figcaption></figure>

8. First you have to fill in the ‘E-mail contact person’ field, this e-mail address will be used for multiple things like notifying you when you successfully created a database account or when your password is about to expire.
9. Now add an IP address/range, click on the button ‘Add IP’. You will now get a question if you want an IP range or a single IP address. In case you want to add a range, please click ‘Yes’. If you want to add a single IP address, please click ‘No’.

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FKgQSSJCXWKofXBCLmcfK%2FPicture7.png?alt=media&amp;token=a64dae95-d1e0-441e-a154-7bd83002a8f5" alt=""><figcaption></figcaption></figure>

10. If you click on ‘Yes’ for a range, you first must fill in the starting IP address. The first 3 octets of the IP address will be the same of the ending IP address. So, you can only set a range based on the last octet of an IP address. This means you need to add multiple IP ranges in case you also have multiple ranges based on the third octet.

IP Range:

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2Fe1wQZTrGTBjZkiC6Adfl%2FPicture8.png?alt=media&amp;token=0fdac215-0df9-4502-b564-6b5638881708" alt=""><figcaption></figcaption></figure>

Single IP:

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2F0urm4xmDgq5QgpvxXYHx%2FPicture9.png?alt=media&amp;token=12fee253-86f3-458f-b817-f4a85eb28da6" alt=""><figcaption></figcaption></figure>

11. After you successfully added a IP address/range, you will see these address(es) in the grid under the button.&#x20;

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FF063pH7EKGhC9AfUbTcN%2FPicture10.png?alt=media&amp;token=fdacc7dd-e433-4419-9700-2ba2373b8893" alt=""><figcaption></figcaption></figure>

12. When you added all the IP addresses you want to enable access for, you can click on the button ‘**Create database user**’ to create the database account. If this is successful, you will get a pop-up with your password. This password is randomly generated and is not saved in the Customer Portal. This means you really need to write this down; otherwise you have to reset the password in case you forget this.

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FguS3uxNSvWfpymUOTmvn%2FPicture11.png?alt=media&amp;token=728cb72b-0719-4aae-a5bf-726eb88dd8db" alt=""><figcaption></figcaption></figure>

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2Fti3tW4cbZ9csPlbJvD6y%2FPicture12.png?alt=media&amp;token=5487ce76-8c2e-4dce-9eda-08913f999e3b" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
**Please note:** This password expires one year after creation. You will receive a notification one month prior to reset your password, please see page [Expiring passwords](/connectors/bi-platform/expiring-passwords).
{% endhint %}

13\.  You will receive an e-mail once your database account has successfully been created. You can connect to the database by using the URL that is shown in the field ‘Server’, the database name from the field ‘Database’, the username from the field ‘Database user’ and the password you got from the pop-up on step 12.

&#x20;

## Extra information

### *Update Database User*

The ‘Update database user’ button lets you update the IP address/range you configured for this database account. And it also allows you to update the e-mail of the contact person.

### *Reset Password*

The ‘Reset password’ button allows you to reset the password of the database account. Your new password will be shown in the pop-up. Please write this down because it’s only shown once. This means you need to do a new reset of your password in case you forget your new password. Please wait 5 minutes for the reset password action to be processed on the database. After resetting your password on the failover database, please follow the guide on how to [connect to the database](/connectors/bi-platform/connection).&#x20;

### *Delete Database User*

The ‘Delete database user’ button allows you to remove the database account from the database. You will have to specify the reason for removal, which will be registered in case there are any questions in the future about the removal of this database account. You can always reactivate the database account by pressing the ‘Reactivate database user’ button.

&#x20;&#x20;

If you have any questions or face an issue when creating a database account, please create a service request and specify your question or issue.


# Connect to the database

Connecting to your Ultimo cloud database

## Testing the database connection

After creating the database user with use of the [previous manual](https://developer.ultimo.net/connectors/bi-platform/create-database-user),  an email with the connection information, consisting of the server name, database name, and username, is sent to the email address you used in the creation of the database user.&#x20;

{% hint style="info" %}
Please make sure that when connecting to production environments, you are connecting to the failover server. A failover server is used to relieve the load of the actual production server. The data is still real time! Testing can be done with for example SSMS or ODBC.<br>

IFS Ultimo reserves the right to disable the database user if it is connected to the production server and our initial request to change it to the failover remains unanswered. Please ensure timely responses to avoid any interruptions in your server connections.\
Thank you for understanding
{% endhint %}

### SSMS

Open a new connection by clicking on connect in the Object Explorer.

![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MZmRVbbu75Ds8MiWx_F%2F-MlJy-h4zoRx8ETyYb6u%2F-MlK5iMTot6OUfYEmRMp%2Fimage.png?alt=media\&token=4768bdbe-e9a1-4398-9015-6ee92f788da3)

Fill in the server, login and password when you received an SQL Server account.

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FdXmKtcW1hZrvL7MvgAWr%2Fimage.png?alt=media&amp;token=ac5ca47e-728a-40a0-87cf-82801ac98c39" alt=""><figcaption></figcaption></figure>

Or when you received an account with AD fill in the server name and user name:

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2Fe5iTiJFsiKE2klZsOVeZ%2Fimage.png?alt=media&amp;token=9e47eed8-1211-448c-8a60-5680dbb691a3" alt=""><figcaption></figcaption></figure>

Before connecting, click on the Options >> button and fill in the database.

![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MZmRVbbu75Ds8MiWx_F%2F-MlJy-h4zoRx8ETyYb6u%2F-MlK5pSwBxoVqUiIuqd_%2Fimage.png?alt=media\&token=81ba677e-7421-4fb6-a6bc-62b3ad4477e5)

Now click on Connect and see if the connection can be made.

### ODBC

Go to the System DSN tab and click on Add…

![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MZmRVbbu75Ds8MiWx_F%2F-MlJy-h4zoRx8ETyYb6u%2F-MlK6-LNWp1TaNoQ2TlD%2Fimage.png?alt=media\&token=c64ee2a7-ba44-48fa-bb1f-b08279ee4784)

Select the ODBC Driver 17 for SQL Server and Finish

![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MZmRVbbu75Ds8MiWx_F%2F-MlJy-h4zoRx8ETyYb6u%2F-MlK61ZMD9xhiWpOzP9z%2Fimage.png?alt=media\&token=45199f75-0cc7-4131-8d21-b702d7404187)

Fill in a name and the provided server name:

![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MZmRVbbu75Ds8MiWx_F%2F-MlJy-h4zoRx8ETyYb6u%2F-MlK631GnNeULT5PnMp7%2Fimage.png?alt=media\&token=acda56a3-a96b-44e1-b848-baeee3de8c06)

Select SQL Server Authentication and fill in the username and password.

![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MZmRVbbu75Ds8MiWx_F%2F-MlJy-h4zoRx8ETyYb6u%2F-MlK64nGnscs5wSckYsk%2Fimage.png?alt=media\&token=b6d0c19f-a1e6-4d40-a849-4a3c390d4235)

Check the Change the default database to box and fill in the database name in the next screen.

![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MZmRVbbu75Ds8MiWx_F%2F-MlJy-h4zoRx8ETyYb6u%2F-MlK68001oxbFhl_1fpM%2Fimage.png?alt=media\&token=8b841302-c1d6-4db1-9da9-80bc35edc963)

Continue by clicking Next and Finish. Test the database source and you are good to go!

![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MZmRVbbu75Ds8MiWx_F%2F-MlJy-h4zoRx8ETyYb6u%2F-MlK69Vr_a4HvasybjgS%2Fimage.png?alt=media\&token=38ef15ad-458f-4a3b-8bc1-a9c09c9bdfc9)

### **Firewall**

In some environments, the firewall on your network needs to be configured too. In the BI connection to your Azure database, a static IP address is not possible. See <https://docs.microsoft.com/en-us/azure/azure-sql/database/connectivity-architecture>

The best way is to allow (whitelist) the IP addresses and ranges for your region as described below.

<h4 align="center"><em><strong>Development, Test and/or Acceptance environments</strong></em></h4>

<table data-header-hidden><thead><tr><th width="130">Region</th><th width="460">Server</th><th width="170">IP Addresses</th></tr></thead><tbody><tr><td><strong>Australia</strong></td><td>UltimoProductionAUS.Database.Windows.Net</td><td><p>13.70.112.32/29</p><p>20.53.46.128/27</p><p>40.79.160.32/29</p><p>40.79.168.32/29</p></td></tr><tr><td><strong>Europe</strong></td><td><p>UltimoProductionCloud.Database.Windows.Net</p><p>UltimoProductionEurope.Database.Windows.Net</p><p>UltimoProduction2Europe.Database.Windows.Net</p></td><td><p>13.69.112.168/29</p><p>20.61.99.192/27</p><p>52.236.184.32/29</p><p>104.40.169.32/29</p></td></tr><tr><td><strong>Germany</strong></td><td>UltimoProductionGermany.Database.Windows.Net</td><td><p>51.116.149.32/27</p><p>51.116.152.32/29</p><p>51.116.240.32/29</p><p>51.116.248.32/29</p></td></tr><tr><td><strong>India</strong></td><td>UltimoProductionIndia.Database.Windows.Net</td><td><p>40.78.192.32/29</p><p>40.78.193.32/29</p><p>52.172.113.96/27</p></td></tr><tr><td><strong>Sweden</strong></td><td>UltimoProductionSweden.Database.Windows.Net</td><td><p>51.12.46.32/27</p><p>51.12.96.32/29</p><p>51.12.224.32/29</p><p>51.12.232.32/29</p></td></tr><tr><td><strong>United Kingdom</strong></td><td>UltimoProductionUK.Database.Windows.Net</td><td><p>51.105.64.32/29</p><p>51.105.72.32/29</p><p>51.140.144.32/29</p><p>51.143.209.224/27</p></td></tr><tr><td><strong>USA</strong></td><td>UltimoProductionEastUS.Database.Windows.Net</td><td><p>20.42.65.64/29</p><p>20.42.73.0/29</p><p>20.62.132.160/27</p><p>52.168.116.64/29</p></td></tr></tbody></table>

&#x20;

<h4 align="center"><em><strong>Production environment</strong></em> </h4>

<table data-header-hidden><thead><tr><th width="130">Region</th><th width="480">Server</th><th width="170">IP Addresses</th></tr></thead><tbody><tr><td><strong>Australia</strong></td><td>UltimoProductionAUSFailover.Database.Windows.Net</td><td><p>4.199.88.48/29</p><p>13.77.49.32/29</p><p>48.215.144.48/29</p><p>104.46.179.160/27</p></td></tr><tr><td><strong>Europe</strong></td><td><p>UltimoProductionCloudFailover.Database.Windows.Net</p><p>UltimoProductionEuropeFailover.Database.Windows.Net</p><p>UltimoProduction2EuropeFailover.Database.Windows.Net</p></td><td><p>13.69.233.136/29</p><p>13.74.105.192/29</p><p>52.138.229.72/29</p><p>52.146.133.128/27</p></td></tr><tr><td><strong>Germany</strong></td><td>UltimoProductionGermanyFailover.Database.Windows.Net</td><td><p>51.116.54.96/27</p><p>51.116.57.32/29</p></td></tr><tr><td><strong>India</strong></td><td>UltimoProductionIndiaFailover.Database.Windows.Net</td><td><p>20.192.43.160/27</p><p>20.192.96.32/29</p><p>40.80.48.32/29</p><p>104.211.86.32/29</p></td></tr><tr><td><strong>Sweden</strong></td><td>UltimoProductionSwedenFailover.Database.Windows.Net</td><td><p>51.12.198.32/27</p><p>51.12.200.32/29</p><p>51.12.201.32/29</p></td></tr><tr><td><strong>United Kingdom</strong></td><td>UltimoProductionUKFailover.Database.Windows.Net</td><td><p>20.58.66.128/27</p><p>51.140.208.96/29</p><p>51.140.209.32/29</p></td></tr><tr><td><strong>USA</strong></td><td>UltimoProductionEastUSFailover.Database.Windows.Net</td><td><p>13.86.217.224/29</p><p>20.66.3.64/27</p><p>20.168.163.192/29</p></td></tr></tbody></table>

### Security

Port 1433 needs to be allowed for all environments. If you want to use DAC, ports 1434 and 14000 – 14999 need to be allowed too. For more information on DAC, read [this page](https://learn.microsoft.com/en-us/sql/database-engine/configure-windows/diagnostic-connection-for-database-administrators?view=sql-server-ver16#connecting-with-dac).

If for some reason IP adresses and ranges are a problem, the alternative is to allow the DNS name(s) instead.

Ultimo uses for the connection TLS (Transport Layer Security) 1.2, the highest available level under Azure. For more information regarding TLS you can read <https://en.wikipedia.org/wiki/Transport_Layer_Security>


# How to connect Power BI to the Ultimo database

## Add BI IP addresses to the whitelist

Add the Power BI IP address(es) to the whitelist of your Ultimo database if you want the reports to be published to app.powerbi.com. The official IP ranges of Power BI can be found here:&#x20;

{% embed url="<https://www.microsoft.com/en-us/download/details.aspx?id=56519>" %}

The official ranges are huge and therefor have a negative impact on the security. In daily practice we use a more pragmatic approach, because it is our experience that Microsoft only uses a handful of IP ranges for a particular environment. Based on this experience we have the following steps:&#x20;

1. Configure the database refresh after uploading the report / semantic model (\*).&#x20;
2. Power BI will provide you an IP address that is not allowed to make a connection. &#x20;
3. Find the corresponding IP address range in the link above.&#x20;
4. Add the found IP range in the Ultimo Portal to your IP whitelist. See our '[create database user](/connectors/bi-platform/create-database-user)' page. Do not forget to press the button "*Update Database User*" to push your changes into the system.
5. Repeat this process from step two on until the connection is made.&#x20;

After 2 to 5 ranges the whitelist is correctly extended.&#x20;

## Connect Power BI

Open Power BI Desktop and at the popup window select Get data

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2F2YoombfhwhnNEqvRTvqK%2Fimage.png?alt=media&amp;token=a6afb09e-b0c1-4050-8996-80b2954b5c78" alt="" width="355"><figcaption></figcaption></figure>

Select Database and SQL Server database.

![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FUuLaEHdX1qphboSkGnVr%2Fimage.png?alt=media\&token=124fb088-6878-4730-add2-ea47999a0db6)

Press Connect.

![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2F9JeTD0xSWEaTMAr0dEjM%2Fimage.png?alt=media\&token=fe2fa928-c299-4039-847c-cba14a39771a)

Fill in the server and database as provided in the Ultimo portal. Press Ok.

![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FDUrgvp7nRW2mG9KU083A%2Fimage.png?alt=media\&token=cc392b49-c619-464b-9cc1-52b5ff32dff1)

Select the Database tab. Fill in the provided user name and password.&#x20;

Select at *Select which level to apply these settings to* the second option containing the server and database name. Press Connec&#x74;*.*

![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2F9blz2wJi47igBfpdGyKK%2Fimage.png?alt=media\&token=dcdf0895-7654-4a6d-a469-9724e9aa2f97)

The navigator is opened and you can start creating reports.

## Ultimo database tips

* If your organization has not much experience with the Ultimo data dictionary check the database views starting with applv\_bi\_fact. They contain all the data is a easy to read format.
* In the Ultimo Configuration Tool (UCT) > Documentation > Entity overview, you can find all entities containing the database columns and foreign key links to other entities


# Expiring passwords

Instructions on how to reset expiring database passwords

In line with our security policy, passwords linked to the BI Platform database accounts will expire one year after creation. You will receive a notification one month prior to reset your password.

## Steps to renew password

1. In the email you received, you find the username and database for the password that will expire.

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2Fgh62O33bQ9sTLZe1DVFM%2Fimage.png?alt=media&amp;token=71954396-e2bb-45a4-af9f-582ef0443436" alt=""><figcaption></figcaption></figure>

2. Log into the Ultimo portal: <https://portal.ultimo.net> and click on the BI Platform tile.

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FBXGp2ZN2D8mx9ml2IiHj%2Fimage.png?alt=media&amp;token=03ca1945-1d8a-43bc-bd1a-cb02bdb74b3c" alt=""><figcaption></figcaption></figure>

3. A new dashboard page is opened. The grid on the left will show you all your current database users. Find the correct username and database from the email and click on the magnifying glass to open that specific user.

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FJIiMGPXz1jhnCzgEg049%2Fimage.png?alt=media&amp;token=c2467372-d699-406e-9d7f-a082b2ef6666" alt=""><figcaption></figcaption></figure>

4. Press the ''Reset password'- button on the right hand side.\
   A pop-up is shown with your password. This password is randomly generated and is not saved in the Customer Portal. This means you really need to write this down; otherwise you have to reset the password in case you forget this.

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FRK3rK5UBNkIt4jy6xeOl%2Fimage.png?alt=media&amp;token=1ae98d96-e681-4e13-8369-855c0fe0f060" alt=""><figcaption></figcaption></figure>

5. Change password in your BI Platform\
   Please wait 5 minutes for the reset password action to be processed on the database. After resetting your password on the failover database, please follow the guide on how to [connect to the database](https://developer.ultimo.net/connectors/bi-platform/connection).


# Exchange Online

:white\_check\_mark:Professional :white\_check\_mark:Premium :white\_check\_mark:Enterprise

Ultimo offers integration with Exchange Online (as part of Office 365) for specific functionalities:

* Email import
* Custom SMTP

#### Technique

The Microsoft Graph REST API is used to access user mailboxes or authenticating with the SMTP service. To authorise a connection between Ultimo and Exchange Online, OAuth2.0 is used as the authentication method. To make sure that Ultimo is given sufficient access rights, the following pages can be used.

**Ultimo version**

The documentation on this page is applicable to the Rolling Release version of Ultimo (Azure cloud). If you are using an LTS version, contact customer support for documentation related to that version.


# Email import

The Microsoft Graph REST API can be used to access a user’s **mailbox in the cloud** on Exchange Online as part of Office 365.

**Applicable Ultimo version**: Rolling Release (Azure cloud)

### Implementation steps <a href="#implementation-steps" id="implementation-steps"></a>

To use OAuth to access a user’s mailbox using the Microsoft Graph API the Ultimo application must be registered with Microsoft Entra ID.

#### 1. Register Ultimo application with Microsoft Entra ID <a href="#id-1.-register-application-with-azure-active-directory" id="id-1.-register-application-with-azure-active-directory"></a>

1. Go to the [Azure portal](https://portal.azure.com/) and sign in. This account must be in the same directory as the account that will be used to access Exchange.
2. Select **Microsoft Entra ID** and then select **Manage** > **App Registrations** in the left side menu.
3. Click on **New Registration** and use the following values:
   1. Enter a **Name** for the application
   2. For **Supported account types** choose **Accounts in this organizational directory only**
   3. For **Redirect URI** choose **Web** and enter `https://{customer}.ultimo.net/OAuth2Callback` where `{customer}` should be replaced with the actual customer environment
4. Click **Register**. Then copy the value of the **Application (client) ID** and the **Directory (tenant) ID** and save it. This will be needed later.
5. Select **Certificates & secrets** in the left side menu and click **New client secret**. Enter a description and click **Add**.
6. Copy the **Value** of the added client secret and save it.

#### 2. Grant permissions <a href="#id-1.-register-application-with-azure-active-directory" id="id-1.-register-application-with-azure-active-directory"></a>

Two types of permissions can be used:&#x20;

* Application permissions
* Delegated permission

**Application permissions**

Note: the steps below will grant Ultimo access to all mailboxes in your organisation. To limit this, create an [application access policy](https://learn.microsoft.com/en-us/graph/auth-limit-mailbox-access).

1. Go to API permissions
2. Choose Microsoft Graph, select Application permissions and then add the following permissions: Mail.ReadWrite

**Delegated permissions**

When using delegated permissions, the signed-in user must have access to mailboxes that are used for email import.

1. Go to API permissions&#x20;
2. Choose Microsoft Graph, select Delegated permissions and then add the following permissions: Mail.ReadWrite

#### 3. Create credential in Ultimo <a href="#id-2.-create-credential-in-ultimo" id="id-2.-create-credential-in-ultimo"></a>

The application that was registered in the previous steps can be used to create a credential in Ultimo.

1. Go to the UCTool and select **Credentials** under **Authorisation**.
2. Click on the plus icon to create a new credential and use the following values:
   1. Enter an **Id** and **Description** for the credential
   2. When using application permissions, choose **Client credentials** as Grant type&#x20;

      When using delegated permissions, choose **Authorization code** as Grant type
   3. When using delegated permissions, for **Authorization URL** enter `https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/authorize?prompt=select_account` where `{tenant-id}` should be replaced with the **Directory (tenant) ID** that was copied in the previous steps
   4. For **Access token URL** enter `https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token` where `{tenant-id}` should be replaced with the **Directory (tenant) ID** that was copied in the previous steps
   5. For **Client Id** enter the value of the **Application (client) ID** that was copied in the previous steps&#x20;
   6. For **Client secret** enter the value of the added client secret that was copied in the previous steps&#x20;
   7. When using application permissions, enter `https://graph.microsoft.com/.default` as **Scope**

      When using delegated permissions, enter `Mail.ReadWrite offline_access` as **Scope**
3. Click on the save icon.
4. Click on the key icon in the toolbar to get an access token.
5. You will be redirected to the Microsoft login screen. Sign in with the account that will be used to access the mailbox(es).
6. You will be redirected back to Ultimo.

The credential with the access token can now be used to authenticate with the Microsoft Graph API to access a mailbox. Apply the credential on the Email server accounts that have been set up in Ultimo.

#### &#x20;<a href="#id-2.-create-credential-in-ultimo" id="id-2.-create-credential-in-ultimo"></a>


# Custom SMTP

To use OAuth2.0 authentication to access the SMTP server using the Microsoft Graph API, the Ultimo application must be registered with Microsoft Entra ID and granted specific permissions.

**Applicable Ultimo version**: Rolling Release (Azure cloud)

### Implementation steps <a href="#implementation-steps" id="implementation-steps"></a>

#### 1. Register application with Microsoft Entra ID <a href="#id-1.-register-application-with-azure-active-directory" id="id-1.-register-application-with-azure-active-directory"></a>

1. Go to the [Azure portal](https://portal.azure.com/) and sign in. This account must be in the same directory as the account that will be used to access Exchange Online.
2. Select **Microsoft Entra ID** and then select **Manage** > **App Registrations** in the left side menu.
3. Click on **New Registration** and use the following values:
   1. Enter a **Name** for the application
   2. For **Supported account types** choose **Accounts in this organizational directory only**
   3. For **Redirect URI** choose **Web** and enter the following value based on your situation (note: the URI is case sensitive):

      `{UltimoEnvironment}/OAuth2Callback` where `{UltimoEnvironment}` is the domain where Ultimo is hosted.\
      Example: `https://customer.ultimo.net/OAuth2Callback`
4. Click **Register**. Then copy the value of the **Application (client) ID** and the **Directory (tenant) ID** and save it. This will be needed later.
5. Select **Certificates & secrets** in the left side menu and click **New client secret**. Enter a description and click **Add**.
6. Copy the value of the added client secret and save it.
7. Select **API permissions** in the left menu and select **Add permission**.
   1. select **Microsoft Graph**.&#x20;
   2. Select **Delegated permissions** and then choose **SMTP.Send** under **SMTP**.
   3. Select **Add permissions**.

#### 2. Create credential in Ultimo <a href="#id-2.-create-credential-in-ultimo" id="id-2.-create-credential-in-ultimo"></a>

The application that was registered in the previous steps can be used to create a credential in Ultimo.

1. Go to the UCTool and select **Credentials** under **Authorisation**.
2. Click on the plus icon to create a new credential and use the following values:
   1. Enter an **Id** and **Description** for the credential
   2. For **Grant type** choose **Authorization Code**
   3. For **Authorization URL** enter\
      `https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/authorize?prompt=select_account`\
      where `{tenant-id}` should be replaced with the **Directory (tenant) ID** that was copied in the previous steps
   4. For **Access token URL** enter\
      `https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token`\
      where `{tenant-id}` should be replaced with the **Directory (tenant) ID** that was copied in the previous steps
   5. For **Client Id** enter the value of the **Application (client) ID** that was copied in the previous steps
   6. For **Client secret** enter the value of the added client secret that was copied in the previous steps
   7. For **Scope** enter the following value:

      `https://outlook.office.com/SMTP.Send offline_access`
3. Click on the save icon.
4. Click on the key icon in the toolbar to get an access token.
5. You will be redirected to the Microsoft login screen. Sign in with the account that will be used to authenticate with Exchange Online.
6. You will be redirected back to Ultimo.


# LDAP

✅Professional ✅Premium ✅Enterprise

Lightweight Directory Access Protocol (LDAP) is an industry standard application protocol for accessing and maintaining distributed directory information services over an internet protocol network.

A common use of LDAP is to provide a central place to store usernames and passwords. This allows many different applications and services, like Ultimo, to connect to the LDAP server to import and validate users.

## Active Directory <a href="#activedirectory-ldap-id-activedirectory" id="activedirectory-ldap-id-activedirectory"></a>

Active Directory (AD) is an implementation of Microsoft of a directory service that uses the LDAP protocol. Active Directory allows administrators to state policies (rights and institutions) in the network of an entire company to manage. Active Directory stores settings in relation to an object in a central database. An AD network can vary from a network of a few hundred to millions of objects.

## Ultimo implementation

Ultimo is able to connect with directory services using the LDAP protocol, like Active Directory. With our LDAP integration it is possible to create and maintain users (login accounts) and employees in an Ultimo environment. The integration is configured using [LDAP connectors](/connectors/ldap/ldap-connector).

Implementation of the LDAP integration depends on [how Ultimo is hosted](/connectors/ldap/cloud-vs-on-premises). Running Ultimo in the cloud requires a different approach than running Ultimo on premises, as the directory services are most of the time unreachable from outside the customers network.

{% hint style="info" %}
The LDAP integration was designed to connect with an on-premises AD server. For new implementations, we recommend to use [SCIM](/connectors/scim) instead. Contrary to LDAP, SCIM is able to connect with Azure AD.
{% endhint %}


# LDAP connector

LDAP connectors allow for creating and maintaining users (login accounts) and employees in Ultimo. On a LDAP connector, it is possible to specify specific details for the accounts that should be retrieved from the directory service but also how users and employees should be created in Ultimo. From Ultimo Premium, it is possible to add multiple LDAP connectors to be able to set specific defaults for a group of accounts.

## Connection properties

⚠ Not all connection properties apply when running Ultimo is hosted in the cloud. See the [Cloud vs On Premises](/connectors/ldap/cloud-vs-on-premises) page for a further explanation.

| Parameter           | Description                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Server              | LDAP server address. If this value is not filled and the environment is ran On Premises, Ultimo will automatically search for a LDAP server in the domain. This could affect performance if the server is located at the other end of the world or is connected with a slow VPN connection. Also it could be possible that no server can be found automatically.                                                                            |
| User name           | User name of the user that will be used to connect to the directory service. When empty, anonymous authentication will be tried.                                                                                                                                                                                                                                                                                                            |
| Password            | Password of the user that will be used to connect to the directory service.                                                                                                                                                                                                                                                                                                                                                                 |
| Distinguished names | Distinguished Names is a string that uniquely identifies an entry in the DIT. The connector allows for multiple Distinguished Names, by separating them by a semicolon.                                                                                                                                                                                                                                                                     |
| Filter              | Filter objects that are retrieved from the LDAP server, for example only active users.                                                                                                                                                                                                                                                                                                                                                      |
| Page size           | Applies when there is a policy on the LDAP server that prevents to retrieve more than 1000 records for example. By setting the page size lower than the maximum result set of the LDAP server and higher as zero, all the results are given. it is recommended to set this property as high as possible, as too many individual queries will decrease performance.                                                                          |
| Use fast bind       | Specifies that ADSI will not attempt to query the Active Directory Domain Services objectClass property. Therefore, only the base interfaces that are supported by all ADSI objects will be exposed.                                                                                                                                                                                                                                        |
| Use server bind     | If your ADsPath includes a server name, specify this flag when using the LDAP provider. Do not use this flag for paths that include a domain name or for serverless paths. Specifying a server name without also specifying this flag results in unnecessary network traffic.                                                                                                                                                               |
| Use secure          | <p>Requests secure authentication. When this flag is set, the WinNT provider uses NTLM to authenticate the client. Active Directory Domain Services uses Kerberos, and possibly NTLM, to authenticate the client. Additional options when Use secure is checked:</p><ul><li>Use sealing: encrypts data using Kerberos.</li><li>Use signing: verifies data integrity to ensure that the data received is the same as the data sent</li></ul> |
| Use SSL             | Attaches a cryptographic signature to the message that both identifies the sender and ensures that the message has not been modified in transit. Active Directory Domain Services requires the Certificate Server be installed to support Secure Sockets Layer (SSL) encryption.                                                                                                                                                            |

## User properties

It is possible to specify some default properties for the users that will be created on the LDAP connector. From Ultimo Premium, it is possible to get and process additional user properties.

| Parameter       | Description                                                                                                                               |
| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
| Initial company | The company in Ultimo the user will be assigned to when creating a new user. Only applies for the initial creation, will never update.    |
| Initial group   | The user group in Ultimo the user will be assigned to when creating a new user. Only applies for the initial creation, will never update. |
| Domain          | Used as a prefix for the external account name of a user.                                                                                 |

## Employee properties

The following employee properties are taken by default from the directory service. From Ultimo Premium, it is possible to get and process additional employee properties.

| Parameter       | Ultimo property |
| --------------- | --------------- |
| givenname       | FirstName       |
| sn              | Surname         |
| initials        | Initials        |
| displayname     | Description     |
| telephonenumber | PhoneInternal   |
| mobile          | MobilePhone     |
| mail            | EmailAddress    |


# Cloud vs On Premises

Implementation of the LDAP integration depends on how Ultimo is hosted. Ultimo in the cloud requires a different approach than Ultimo on premises.

## On Premises

When Ultimo is hosted on premises, Ultimo will try to make a direct connection with the directory service. The directory service is supposed to run in the same network, so Ultimo is able to make a connection. To setup a successful connection, configure the needed [connection settings](/connectors/ldap/ldap-connector#connection-properties) on the LDAP connector.

## Cloud

When Ultimo is hosted in the Cloud, it is usually not possible to make a direct connection with the directory service, as the directory service is unreachable from outside a customers network. To make the integration work in a cloud environment, a webservice and powershell script have to be used.

### Powershell

When hosted on Azure, it is possible to download a Powershell script in the LDAP connector manager. This script contains all information necessary (taken from the settings on the LDAP connector) to retrieve data from the directory service and sending the results back to an Ultimo webservice. The Powershell script can be put on the server where the directory service runs or a location from where the directory service can be reached. To periodically send results to Ultimo, make sure the script is scheduled and ran with authorised credentials to connect to the directory service.

### Webservices

To receive data from the directory service in Ultimo, a webservice (import connector) is available. The webservice request is send automatically from the Powershell script. The webservice will pass the input to the LDAP connector and execute the standard business logic to create and maintain users and employees.

### LDAP connector differences

As setting up a connection with the directory service is not initiated from Ultimo when hosted in the Cloud, not all [connection properties](/connectors/ldap/ldap-connector#connection-properties) apply on the LDAP connector.

| Parameter           | Applies to Cloud |
| ------------------- | ---------------- |
| Server              | ✅                |
| User name           | 🚫               |
| Password            | 🚫               |
| Distinguished names | ✅                |
| Filter              | ✅                |
| Page size           | ✅                |
| Use fast bind       | 🚫               |
| Use server bind     | 🚫               |
| Use secure          | 🚫               |
| Use SSL             | 🚫               |


# SCIM

SCIM (System for Cross-domain Identity Management) is an open standard that simplifies cloud identity management via user provisioning. In this way, you can manage users from a central place. &#x20;

SCIM communicates identity data between an IDP (Identity Provider) and an SP (Service Provider).

Benefits are the ease of use to maintain this information and, the security of data. When people are leaving an organization, access to systems should be revoked. Another benefit of user provisioning is that the SP has an accurate list of all employees and users available which is very useful within those systems. SCIM can be seen as the replacement for LDAP when working in the cloud.

## How it works

Provisioning between the IDP (for example Microsoft Entra ID or Okta) and the SP (IFS Ultimo) is achieved using a REST and JSON based protocol. IFS Ultimo uses a subset of the available information. When the source object changes/is added/is deleted, this is automatically synchronized with IFS Ultimo.  The IDP can read objects from IFS Ultimo to check if an update is needed.

## Implementing SCIM

See more at: <https://developer.ultimo.net/azure-documentation/azure-ad-scim-provisioning>

&#x20;

&#x20;


# OCI

:no\_entry\_sign:Professional :white\_check\_mark:Premium :white\_check\_mark:Enterprise

Open Catalog Interface (OCI) is one of the standard formats used when connecting to external punch-out catalogs. The OCI format is used to define the field mapping between the supplier's catalog and Ultimo, to ensure that the data is transferred accurately and completely between source and receiver. Note that only the content of the shopping card is exchanged, the interface does not include online ordering or article synchronisation.

With the OCI connecter in Ultimo it is possible to define the field mapping and configure what should happen with the received content of the shopping cart. For example: creating order request lines or a draft order. It is also possible to trigger additional (custom) business logic.

Ultimo does not offer standard OCI connectors, only generic tooling to configure these interfaces is available. Each OCI interface has to be configured specifically by a consultant.

## Technical details

Specific documentation for a supplier's catalog should be available through the supplier. Ultimo is able to connect to any webshop compliant to the OCI 5.0 standard. Sending an HTTP request can be done using either a GET or POST method.


# Universal Print

Introduction

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FZbjGiav39m1EIlhNo7Da%2Fimage.png?alt=media&amp;token=379e4ee9-6722-4609-ae94-a72d81f1e05e" alt=""><figcaption></figcaption></figure>

Universal Print is a modern print solution that organizations can use to manage their print infrastructure through cloud services from Microsoft. Universal Print runs entirely on Microsoft Azure. When it's deployed with Universal Print–compatible printers, it doesn't require any on-premises infrastructure. Universal Print can be deployed with non-compatible printers by using Universal Print connector software. To learn more about Universal Print, click [here](https://learn.microsoft.com/en-us/universal-print/fundamentals/universal-print-whatis).

Ultimo offers integration with Universal Print as an addition to our 'direct printing' functionality, making it possible to send print jobs from Ultimo directly to a specific printer.

Note: Universal Print was released as a product several years ago, but is still evolving to meet the needs of customers. To read more about current prerequisites and limitations, go to the next page.


# Prerequisites & limitations

This article presents some important prerequisites and limitations you should consider before using Universal Print (in Ultimo). For all prerequisites on Universal Print in general, visit [this](https://learn.microsoft.com/en-us/universal-print/fundamentals/universal-print-getting-started#prerequisites) page.

## Licensing

A specific Universal Print license is required before it can be used. Ultimo cannot offer this license, this has to be arranged by your own organisation. Universal Print is included in several Microsoft 365 subscriptions, but can also be purchased as a standalone subscription.

#### Print limits

Universal Print comes with a monthly pool of print jobs shared by all licensed users in your organisation. Each eligible license adds jobs to the pool: Microsoft 365 E3, E5 and Business Premium licenses add 100 jobs per month, while most other eligible licenses add 5. The pool refreshes at the start of each month and unused jobs do not carry over.

A print job is counted per document, regardless of the number of pages or copies. If your organisation exceeds its monthly pool, users can keep printing, but your IT administrator is notified and additional capacity must be purchased to stay compliant.

#### Region support

Universal Print is deployed in Azure data centers within specific regions. For the best experience, users of the service should reside near one of these regions.

To learn more about the Universal Print license, click [here](https://learn.microsoft.com/en-us/universal-print/fundamentals/universal-print-license).

## Known issues and limitations <a href="#known-issues-and-limitations" id="known-issues-and-limitations"></a>

As Universal Print is still evolving, several known issues and limitations should be taken into account. The most notable issues and limitations for using Universal Print in Ultimo can be found below.

#### Supported paper sizes

Universal Print currently supports page printers only. In Ultimo, this means we can successfully print any A3, A4 or Letter sized paper.

#### Label printing

Label printers are officially not supported by Universal Print. However, Microsoft has introduced a workaround that allows for label printing with Universal Print, and this solution is compatible with Ultimo.

With our recommended Zebra ZD421C test printer, we have been able to successfully set up and test the workaround provided by Microsoft. Carefully review the following page for detailed instructions on setting up label printing support in Universal Print:

{% embed url="<https://learn.microsoft.com/en-us/universal-print/fundamentals/universal-print-label-printing>" %}

Before applying this workaround, note that:

* The connector setting affects all printers on that connector. Install label printers on a separate connector from your regular document printers.
* Scaling is not supported for label printing. The page scaling advice below does not apply to label printers.

Note: Ultimo does not provide assistance in implementing this workaround. The responsibility for setting up this solution lies with your IT department.

#### Page scaling (margins)

In earlier testing, pages printed through Universal Print had larger margins than pages printed manually with page scale 'default'. Scaling options for Universal Print can be set in the printer defaults in the Azure portal. Based on our test results, 'Auto' gives the best result. The best setting may differ per printer.

![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FYQl2VXfTp5JRiMqpEAgy%2Fimage.png?alt=media\&token=0e6ab8d3-b086-4635-aba7-382d70af09d0)

To find more answers to commonly asked questions about concepts and scenarios related to Universal Print, visit the official [Frequently Asked Questions](https://learn.microsoft.com/en-us/universal-print/fundamentals/universal-print-faqs) page.


# How to setup

## Onboarding

Before Universal Print can be used in Ultimo, it has to be onboarded in your organisation first. Use the official [onboarding](https://learn.microsoft.com/en-us/universal-print/fundamentals/universal-print-getting-started#step-1-register-universal-print-ready-printers) page to set up Universal Print and make printers available.&#x20;

## Implementation steps

To make sure that Ultimo is able to connect to the shared printers in Universal Print using the Microsoft Graph API, the Ultimo application must be registered in Microsoft Entra ID and granted specific permissions.

To set up the app registration and assign these permissions, use the following implementation steps.

#### 1. Register application with Microsoft Entra ID <a href="#id-1.-register-application-with-azure-active-directory" id="id-1.-register-application-with-azure-active-directory"></a>

1. Go to the [Microsoft Entra admin center](https://entra.microsoft.com/) (or the [Azure portal](https://portal.azure.com/)) and sign in. This account must be in the same directory as the account that will be used to access Universal Print.
2. Select **Microsoft Entra ID** and then select **Manage** > **App Registrations** in the left side menu.
3. Click on **New Registration** and use the following values:
   1. Enter a **Name** for the application
   2. For **Supported account types** choose **Accounts in this organizational directory only**
   3. For **Redirect URI** choose **Web** and enter the following value based on your situation (note: the URI is case sensitive):

      `{UltimoEnvironment}/OAuth2Callback` where `{UltimoEnvironment}` is the domain where Ultimo is hosted.\
      Example: `https://customer.ultimo.net/OAuth2Callback`
4. Click **Register**. Then copy the value of the **Application (client) ID** and the **Directory (tenant) ID** and save it. This will be needed later.
5. Select **Certificates & secrets** in the left side menu and click **New client secret**. Enter a description and click **Add**.
6. Copy the **Value** of the added client secret and save it.\
   **Important:** Client secrets expire (Microsoft recommends 180 days; the maximum is 24 months). When the secret expires, printing from Ultimo will stop. Note the expiry date, and before it passes, create a new secret and update the **Client secret** in the Ultimo credential.
7. Select **API permissions** in the left menu and select **Add permission**.
   1. select **Microsoft Graph**.&#x20;
   2. Select **Delegated permissions** and then add the following permissions: PrinterShare.ReadBasic.All, PrintJob.Create, PrintJob.ReadWrite
   3. Select **Add permissions**.\
      If your organisation requires admin consent for these permissions, click **Grant admin consent for \[your organisation]**.

#### 2. Create credential in Ultimo <a href="#id-2.-create-credential-in-ultimo" id="id-2.-create-credential-in-ultimo"></a>

The application that was registered in the previous steps can be used to create a credential in Ultimo.

1. Go to the UCTool and select **Credentials** under **Authorisation**.
2. Click on the plus icon to create a new credential and use the following values:
   1. Enter an **Id** and **Description** for the credential
   2. For **Grant type** choose **Authorization Code**
   3. For **Authorization URL** enter\
      `https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/authorize?prompt=select_account`\
      where `{tenant-id}` should be replaced with the **Directory (tenant) ID** that was copied in the previous steps
   4. For **Access token URL** enter\
      `https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token`\
      where `{tenant-id}` should be replaced with the **Directory (tenant) ID** that was copied in the previous steps
   5. For **Client Id** enter the value of the **Application (client) ID** that was copied in the previous steps
   6. For **Client secret** enter the **Value** of the added client secret that was copied in the previous steps
   7. For **Scope** enter the following value:

      `https://graph.microsoft.com/.default offline_access`
3. Click on the save icon.
4. Click on the key icon in the toolbar to get an access token.
5. You will be redirected to the Microsoft login screen. Sign in with an account that has access to the shared printers.
6. You will be redirected back to Ultimo.

#### 3. Add printers in Ultimo <a href="#id-2.-create-credential-in-ultimo" id="id-2.-create-credential-in-ultimo"></a>

The printers that have been shared in Universal Print can now be added as printers in Ultimo.

1. Go to the UCTool and select **Printers** under **Settings**.
2. Click on the plus icon to add a new printer and use the following values:
   1. Enter an **Id** and **Description** for the printer
   2. For **Type** choose **Universal Print**
   3. For **Share Id** enter the printer share Id. The Share Id can be found on the Universal Print page in the Azure Portal. Go to Printer shares, click on the printer you are adding to Ultimo and copy the **Share Id** property.
   4. For **Credentials** select the credential that was created in the previous steps
3. Click on the save icon.


# Introduction

:white\_check\_mark:Professional :white\_check\_mark:Premium :white\_check\_mark:Enterprise

### Functional details

Ultimo REST connector allows third parties to request information from or send information to Ultimo. Through Ultimo's user interface, it is possible to create custom APIs. These APIs can be used to import, export, update and delete data. More details on how to use the REST API can be found in the [REST API guide](/api-guide/rest).

The most commonly used entities (tables in the database) in Ultimo, such as assets, suppliers, work activities, etc., can be added to an API. Properties, which are columns within the entity's table, can then be added to each entity. On top of that, filters can be defined per property.

**Context**\
A default filter that is applied when adding an entity, if more than one is present, is a filter by 'context'. Ultimo uses contexts to differentiate information in database tables. In Ultimo, every type of asset is part of the database table 'Equipment', but this is specified further for Technical Asset, Medical Asset or Fleet Asset, on the basis of a context. So a context is mandatory to import data into a table with multiple contexts.&#x20;

**Templates**\
An API can be set up with multiple entities. Multiple entities are also required for an expand of other entities. Ultimo has many different entities and properties. Therefore, we offer several templates to get a quick start with realising a new custom API.

These predefined templates contain the most relevant entities, properties and filters. On the following pages, you can find more information concerning the contents of the different templates. Additional entities, properties and filters can then be added, which may be missing from the template but are necessary for your process. All entities can be found through the 'Entity overview' in the configuration tool of Ultimo.

Each template is issued with read-only privileges, but can be easily modified to a different authorisation level to allow inserts and updates on entities.

### Playground

{% hint style="info" %}
It is possible to test the connector on this page, use the parameters below to try it out! Please note, this is an example. Not all entities and properties are available in this playground.&#x20;
{% endhint %}

| Parameter | Description                                                                                     |
| --------- | ----------------------------------------------------------------------------------------------- |
| URL       | <https://devdocs.ultimo.net/docs/index.html?version=v1&apiKey=58BADAA39C9C44BA939FD5AF916E351B> |
| ApiKey    | BED9194293084F68807042B9451B36D0                                                                |

###


# Master data

In IFS Ultimo, you manage data used in multiple places in different modules in one central location. We call these master data. The predefined templates for Master data can help you create an API for master data. A template contains all relevant entities for that specific master data entity.

* Cost centers
* Departments
* Employees
* Service contracts
* Suppliers (Vendor)

All relations from another entity have minimum read access to the 'Description'. This way, you can quickly receive the correct information.&#x20;


# Cost centers

This template can help you create an API for Cost center information. The template contains all relevant entities and properties of a cost center.&#x20;

All relations from 'Cost center' to another entity have minimum read access to the 'Description'. This way you can easily receive the right information. Below is an overview of all entities, properties and filters of this template.

Additional entities, properties and filters can be added, which may be missing from the template but are necessary for your process. All entities can be found through the 'Entity overview' in the customisation tool of IFS Ultimo (consult application administrator or consultant).

### Entities and properties

| Entity     | Property                                                                                                              |
| ---------- | --------------------------------------------------------------------------------------------------------------------- |
| CostCenter | <p>Id</p><p>Description<br><br>Context<br>Status<br>PartOfCostCenter<br>Employee</p><p>Dataprovider<br>ExternalID</p> |
| Employee   | Description                                                                                                           |

### Filters

| Entity     | Filter property | Operator | Value |
| ---------- | --------------- | :------: | ----- |
| Costcenter | Status          |     =    | 2     |
| Costcenter | Context         |     =    | 1     |
| Employee   | Status          |    >=    | 0     |
| Employee   | Context         |     =    | 1     |


# Departments

This template can help you create an API for Departments information. The template contains all relevant entities and properties of a department.&#x20;

All relations from 'Department' to another entity have minimum read access to the 'Description'. This way you can easily receive the right information. Below is an overview of all entities, properties and filters of this template.

Additional entities, properties and filters can be added, which may be missing from the template but are necessary for your process. All entities can be found through the 'Entity overview' in the customisation tool of IFS Ultimo (consult application administrator or consultant).

### Entities and properties

| Entity     | Property                                                                                                                                                                                      |
| ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Department | <p>Id<br>Description<br><br>Context<br>Status<br>Location<br>Site<br>PartOfDepartment<br>AddressLine1<br>Zipcode<br>City<br>ProvinceStateRegion<br>Employee<br>DataProvider<br>ExternalId</p> |
| Employee   | Description                                                                                                                                                                                   |
| Site       | Description                                                                                                                                                                                   |

### Filters

| Entity     | Filter property | Operator | Value |
| ---------- | --------------- | :------: | ----- |
| Department | Status          |    >=    | 0     |
| Department | Context         |     =    | 1     |
| Site       | Context         |     =    | 1     |
| Site       | Status          |    >=    | 0     |
| Employee   | Status          |    >=    | 0     |
| Employee   | Context         |     =    | 1     |


# Employees

This template can help you create an API for Employee information. The template contains all relevant entities and properties of an Employee.&#x20;

All relations from 'Employee' to another entity have minimum read access to the 'Description'. This way you can easily receive the right information. Below is an overview of all entities, properties and filters of this template.

Additional entities, properties and filters can be added, which may be missing from the template but are necessary for your process. All entities can be found through the 'Entity overview' in the customisation tool of IFS Ultimo (consult application administrator or consultant).

### Entities and properties

| Entity     | Property                                                                                                                                                                                                        |
| ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Employee   | <p>Id<br>Description<br><br>Context<br>Status<br>FirstName<br>SurName<br>Initials<br>EmailAdress<br>Phone<br>PhoneInternal<br>MobilePhone<br>ExternalId<br>Site<br>Department<br>CostCenter<br>DataProvider</p> |
| Department | Description                                                                                                                                                                                                     |
| CostCenter | Description                                                                                                                                                                                                     |
| Site       | Description                                                                                                                                                                                                     |

### Filters

| Entity     | Filter property | Operator | Value    |
| ---------- | --------------- | :------: | -------- |
| Employee   | Context         |    IN    | 1,2,4,16 |
| Employee   | Status          |    >=    | 0        |
| Site       | Context         |     =    | 1        |
| Site       | Status          |    >=    | 0        |
| Department | Context         |     =    | 1        |
| Department | Status          |    >=    | 0        |
| Costcenter | Context         |     =    | 1        |
| Costcenter | Status          |    >=    | 2        |


# Service contracts

This template can help you create an API for Service contract information. The template contains all relevant entities and properties of a Service contract.&#x20;

All relations from 'ServiceContract' to another entity have minimum read access to the 'Description'. This way you can easily receive the right information. Below is an overview of all entities, properties and filters of this template.

Additional entities, properties and filters can be added, which may be missing from the template but are necessary for your process. All entities can be found through the 'Entity overview' in the customisation tool of IFS Ultimo (consult application administrator or consultant).

### Entities and properties

| Entity          | Property                                                                                                                                                                                                                                   |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| ServiceContract | <p>Id<br>Description<br><br>Context<br>Status<br>Vendor<br>Department<br>CostCenter<br>ContractType<br>ContractForm<br>Startdate<br>Expires<br>FileNumber<br>Site<br>Manager<br>Owner<br>FinalNoticeTerm<br>ExternalId<br>Dataprovider</p> |
| Employee        | Description                                                                                                                                                                                                                                |
| CostCenter      | Description                                                                                                                                                                                                                                |
| Vendor          | Description                                                                                                                                                                                                                                |
| ContractType    | Description                                                                                                                                                                                                                                |
| ContractForm    | Description                                                                                                                                                                                                                                |

### Filter

<table><thead><tr><th width="252">Entity</th><th width="149">Filter property</th><th width="125" align="center">Operator</th><th>Value</th></tr></thead><tbody><tr><td>Servicecontract</td><td>Context</td><td align="center">=</td><td>1</td></tr><tr><td>ServiceContract</td><td>Status</td><td align="center">IN</td><td>2,8,32,128</td></tr><tr><td>Costcenter</td><td>Context</td><td align="center">=</td><td>1</td></tr><tr><td>Costcenter</td><td>Status</td><td align="center">=</td><td>2</td></tr><tr><td>Vendor</td><td>Context</td><td align="center">=</td><td>1</td></tr><tr><td>Vendor</td><td>Status</td><td align="center">>=</td><td>0</td></tr><tr><td>ServiceContractType</td><td>Context</td><td align="center">IN</td><td>1,2,4,8,16,32,64,32768</td></tr><tr><td>ServiceContractType</td><td>Status</td><td align="center">>=</td><td>0</td></tr><tr><td>ServiceContractform</td><td>Context</td><td align="center">IN</td><td>1,2,4,8,16,32,64,32768</td></tr><tr><td>ServiceContractform</td><td>Status</td><td align="center">>=</td><td>0</td></tr></tbody></table>


# Suppliers

This template can help you create an API for Supplier information (entity Vendor). The template contains all relevant entities and properties of a supplier.&#x20;

All relations from 'Vendor' to another entity have minimum read access to the 'Description'. This way you can easily receive the right information. Below is an overview of all entities, properties and filters of this template.

Additional entities, properties and filters can be added, which may be missing from the template but are necessary for your process. All entities can be found through the 'Entity overview' in the customisation tool of IFS Ultimo (consult application administrator or consultant).

### Entities and properties

| Entity        | Property                                                                                                                                                                                                                                                                                                                                                                                             |
| ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Vendor        | <p>Id<br>Description<br><br>Context</p><p>Status </p><p>AddressLine1 </p><p>AddressLine2 </p><p>ZipCode </p><p>City </p><p>ProvinceStateRegion</p><p>Country </p><p>POBox </p><p>POBoxZipCode </p><p>POBoxCity </p><p>POBoxProvinceStateRegion </p><p>POBoxCountry </p><p>CreditNumber </p><p>Phone </p><p>FailurePhone </p><p>Website </p><p>EmailAddress </p><p>ExternalId </p><p>DataProvider</p> |
| Country       | Description                                                                                                                                                                                                                                                                                                                                                                                          |
| Employee      | <p>Id<br>Description<br><br>Context</p><p>FirstName </p><p>Surname </p><p>EmailAdress </p><p>Phone </p><p>Vendor </p><p>Dataprovider </p><p>ExternalId</p>                                                                                                                                                                                                                                           |
| ObjectContact | <p>Description<br><br>Status<br>Employee<br>Vendor<br>ExternalId<br>DataProvider</p>                                                                                                                                                                                                                                                                                                                 |

### Filters

| Entity        | Filter property | Operator | Value |
| ------------- | --------------- | :------: | ----- |
| Vendor        | Context         |     =    | 1     |
| Vendor        | Status          |    >=    | 0     |
| Country       | Context         |     =    | 0     |
| Country       | Status          |    >=    | 0     |
| Employee      | Context         |     =    | 4     |
| Employee      | Status          |    >=    | 0     |
| Objectcontact | Context         |     =    | 1     |
| Objectcontact | Status          |    >=    | 0     |


# Assets

The predefined templates for Assets can help you create an API for Asset information. A template contains all relevant entities and properties of an Asset (table 'Equipment'). The Asset templates are based on a specific process within IFS Ultimo (context);

* Technical Service
* Medical Assets
* Fleet objects
* Infra objects
* IT Configuration-items

All relations from 'Equipment' to another entity have minimum read access to the 'Description'. This way, you can easily receive the right information.&#x20;

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FZLkgPiNX42pPyjamvb4d%2FiStock-949530362.jpg?alt=media&amp;token=08296500-1a67-45a6-801c-a2efdb1fc96d" alt=""><figcaption></figcaption></figure>


# Technical Service

This template can help you create an API for Technical Asset information. The template contains all relevant entities and properties of an technical asset asset (**context 1 in table 'Equipment'**).&#x20;

All relations from 'Equipment' to another entity have minimum read access to the 'Description'. This way you can easily receive the right information. Below is an overview of all entities, properties and filters of this template.

Additional entities, properties and filters can be added, which may be missing from the template but are necessary for your process. All entities can be found through the 'Entity overview' in the customisation tool of IFS Ultimo (consult application administrator or consultant).

### Entities and properties

<table><thead><tr><th width="367">Entity</th><th>Properties</th></tr></thead><tbody><tr><td>Equipment</td><td><p>Id</p><p>Description</p><p> </p><p>CostCenter</p><p>Department</p><p>Dataprovider</p><p>ExternalId</p><p>EquipmentType</p><p>InstallDate</p><p>Manufacturer</p><p>ManufacturerYear</p><p>NextPmMaintenanceDate</p><p>OwnerEmployee</p><p>Parts</p><p>ProcessFunction</p><p>ProgressStatus</p><p>PartOfEquipment</p><p>Serialnumber</p><p>Space</p><p>ServiceContract</p><p>Site</p><p>Space</p><p>Status</p><p>Type</p><p>TypeNumber</p><p>Text1</p><p>TrackAndTrace</p><p>TrackAndTraceLocation</p><p>TrackAndTraceLastSynchronisation</p><p>Vendor</p></td></tr><tr><td>ProcessFunction</td><td><p>Id</p><p>Description</p><p> </p><p>Context</p><p>CostCenter</p><p>Department</p><p>Equipments</p><p>InstallDate</p><p>Manufacturer</p><p>ManufacturerYear</p><p>Model</p><p>PartofProcessFunction</p><p>SerialNumber</p><p>Site</p><p>Space</p><p>Status</p><p>Text1</p><p>Vendor</p><p>ExternalId</p><p>DataProvider</p></td></tr><tr><td>Site</td><td>Description</td></tr><tr><td>Department</td><td>Description</td></tr><tr><td>CostCenter</td><td>Description</td></tr><tr><td>Vendor</td><td>Description</td></tr><tr><td>ProgressStatus</td><td>Description</td></tr><tr><td>Space</td><td><p>Description</p><p>Roomnumber</p></td></tr><tr><td>EquipmentType</td><td>Description</td></tr><tr><td>Employee</td><td>Description</td></tr></tbody></table>

### Filters

&#x20;

<table><thead><tr><th width="195">Entity</th><th width="212">Filter property</th><th>Operator</th><th>Value</th></tr></thead><tbody><tr><td>Equipment</td><td>Context</td><td>IN</td><td>1,2</td></tr><tr><td>Equipment</td><td>Status</td><td>=</td><td>2</td></tr><tr><td>Processfunction</td><td>Context</td><td>=</td><td>1</td></tr><tr><td>Processfuntion</td><td>Status</td><td>=</td><td>1</td></tr><tr><td>Site</td><td>Context</td><td>=</td><td>1</td></tr><tr><td>Site</td><td>Status</td><td>>=</td><td>0</td></tr><tr><td>Department</td><td>Context</td><td>=</td><td>1</td></tr><tr><td>Department</td><td>Status</td><td>>=</td><td>0</td></tr><tr><td>Costcenter</td><td>Context</td><td>=</td><td>1</td></tr><tr><td>Costcenter</td><td>Status</td><td>=</td><td>2</td></tr><tr><td>Vendor</td><td>Context</td><td>=</td><td>1</td></tr><tr><td>Vendor</td><td>Status</td><td>>=</td><td>0</td></tr><tr><td>ProgressStatus</td><td>Context</td><td>IN</td><td>7,9</td></tr><tr><td>ProgressStatus</td><td>Status</td><td>>=</td><td>0</td></tr><tr><td>Space</td><td>Context</td><td>=</td><td>1</td></tr><tr><td>Space</td><td>Status</td><td>>=</td><td>0</td></tr><tr><td>EquipmentType</td><td>Context</td><td>=</td><td>1</td></tr><tr><td>EquipmentType</td><td>Status</td><td>>=</td><td>0</td></tr><tr><td>Employee</td><td>Context</td><td>=</td><td>1</td></tr><tr><td>Employee</td><td>Status</td><td>>=</td><td>0</td></tr></tbody></table>


# Medical Assets

This template can help you create an API for Medical Asset information. The template contains all relevant entities and properties of an medical asset asset (**context 512 in table 'Equipment'**).&#x20;

All relations from 'Equipment' to another entity have minimum read access to the 'Description'. This way you can easily receive the right information. Below is an overview of all entities, properties and filters of this template.

Additional entities, properties and filters can be added, which may be missing from the template but are necessary for your process. All entities can be found through the 'Entity overview' in the customisation tool of IFS Ultimo (consult application administrator or consultant).

### Entities and properties

| Entity                    | Properties                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Equipment                 | <p>Id</p><p>Description</p><p> </p><p>AOC</p><p>CostCenter</p><p>Department</p><p>Dataprovider</p><p>ExternalId</p><p>EquipmentType</p><p>InstallDate</p><p>MaintenanceClassification</p><p>Model</p><p>Manufacturer</p><p>ManufacturerYear</p><p>NextPmMaintenanceDate</p><p>OwnerEmployee</p><p>OriginalVendor</p><p>OutOfService</p><p>Parts</p><p>ProcessFunction</p><p>ProgressStatus</p><p>PartOfEquipment</p><p>Serialnumber</p><p>SkillCategory</p><p>Space</p><p>ServiceContract</p><p>Site</p><p>Space</p><p>Status</p><p>Type</p><p>TypeNumber</p><p>Text1</p><p>TrackAndTrace</p><p>TrackAndTraceLocation</p><p>TrackAndTraceLastSynchronisation</p><p>UDI</p><p>Vendor</p> |
| Site                      | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| MaintenanceClassification | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| AOC                       | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| Department                | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| CostCenter                | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| Vendor                    | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| ProgressStatus            | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| Space                     | <p>Description</p><p>Roomnumber</p>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| EquipmentType             | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| Employee                  | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| Skillcategory             | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |

### Filters

<table><thead><tr><th width="331">Entity</th><th>Filter property</th><th width="105">Operator</th><th>Value</th></tr></thead><tbody><tr><td>Equipment</td><td>Context</td><td>=</td><td>512</td></tr><tr><td>Equipment</td><td>Status</td><td>IN</td><td>1,2</td></tr><tr><td>Site</td><td>Context</td><td>=</td><td>1</td></tr><tr><td>Site</td><td>Status</td><td>>=</td><td>0</td></tr><tr><td>Department</td><td>Context</td><td>=</td><td>1</td></tr><tr><td>Department</td><td>Status</td><td>>=</td><td>0</td></tr><tr><td>Costcenter</td><td>Context</td><td>=</td><td>1</td></tr><tr><td>Costcenter</td><td>Status</td><td>=</td><td>2</td></tr><tr><td>Vendor</td><td>Context</td><td>=</td><td>1</td></tr><tr><td>Vendor</td><td>Status</td><td>>=</td><td>0</td></tr><tr><td>ProgressStatus</td><td>Context</td><td>=</td><td>11</td></tr><tr><td>ProgressStatus</td><td>Status</td><td>>=</td><td>0</td></tr><tr><td>Space</td><td>Context</td><td>=</td><td>1</td></tr><tr><td>Space</td><td>Status</td><td>>=</td><td>0</td></tr><tr><td>EquipmentType</td><td>Context</td><td>=</td><td>4</td></tr><tr><td>EquipmentType</td><td>Status</td><td>>=</td><td>0</td></tr><tr><td>Employee</td><td>Context</td><td>=</td><td>1</td></tr><tr><td>Employee</td><td>Status</td><td>>=</td><td>0</td></tr><tr><td>MaintenanceClassification</td><td>Context</td><td>=</td><td>2</td></tr><tr><td>MaintenanceClassification</td><td>Status</td><td>=</td><td>2</td></tr><tr><td>SkillCategory</td><td>Context</td><td>=</td><td>1</td></tr><tr><td>SkillCategory</td><td>Status</td><td>>=</td><td>0</td></tr><tr><td>AOC</td><td>Context</td><td>=</td><td>0</td></tr><tr><td>AOC</td><td>Status</td><td>=</td><td>2</td></tr></tbody></table>


# Fleet objects

This template can help you create an API for Fleet object information. The template contains all relevant entities and properties of an medical asset asset (**context 8 in table 'Equipment'**).&#x20;

All relations from 'Equipment' to another entity have minimum read access to the 'Description'. This way you can easily receive the right information. Below is an overview of all entities, properties and filters of this template.

Additional entities, properties and filters can be added, which may be missing from the template but are necessary for your process. All entities can be found through the 'Entity overview' in the customisation tool of IFS Ultimo (consult application administrator or consultant).

### Entities and properties

| Entity          | Property                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Equipment       | <p>Id</p><p>Description</p><p></p><p>Bodywork</p><p>Colour</p><p>Context</p><p>Department</p><p>EquipmentType</p><p>Fuel</p><p>Gearing</p><p>InstallDate</p><p>ManufacturerYear</p><p>Manufacturer</p><p>Model</p><p>NextPmMaintenanceDate</p><p>OwnerEmployee</p><p>PartOfEquipment</p><p>Parts</p><p>ProcessFunction</p><p>ProgressStatus</p><p>SerialNumber</p><p>ServiceContract</p><p>Site</p><p>Space</p><p>SpareParts</p><p>Status</p><p>TypeNumber</p><p>Text1</p><p>Vendor</p><p>TrackAndTrace</p><p>TrackAndTraceLocation</p><p>TrackAndTraceLastSynchronisation</p><p>ExternalId</p><p>Dataprovider</p> |
| ProcessFunction | <p>Code</p><p>Context</p><p>CostCenter</p><p>Department</p><p>Description</p><p>Equipments</p><p>InstallDate</p><p>Manufacturer</p><p>ManufacturerYear</p><p>Model</p><p>PartofProcessFunction</p><p>SerialNumber</p><p>Site</p><p>Space</p><p>SpareParts</p><p>Status</p><p>Text1</p><p>Vendor</p><p>ExternalIdDataProvider</p>                                                                                                                                                                                                                                                                                   |
| Site            | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| Department      | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| CostCenter      | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| Vendor          | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| Customer        | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| ProgressStatus  | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| EquipmentType   | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| Employee        | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| Space           | Roomnumber, Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |

### Filters

<table><thead><tr><th width="277">Entity</th><th>Filter property</th><th>Operator</th><th>Value</th></tr></thead><tbody><tr><td>Equipment</td><td>Context</td><td>=</td><td>8</td></tr><tr><td>Equipment</td><td>Status</td><td>=</td><td>2</td></tr><tr><td>Processfunction</td><td>Context</td><td>=</td><td>4</td></tr><tr><td>Processfunction</td><td>Status</td><td>=</td><td>1</td></tr><tr><td>Site</td><td>Context</td><td>=</td><td>1</td></tr><tr><td>Site</td><td>Status</td><td>>=</td><td>0</td></tr><tr><td>Department</td><td>Context</td><td>=</td><td>1</td></tr><tr><td>Department</td><td>Status</td><td>>=</td><td>0</td></tr><tr><td>Costcenter</td><td>Context</td><td>=</td><td>1</td></tr><tr><td>Costcenter</td><td>Status</td><td>=</td><td>2</td></tr><tr><td>Vendor</td><td>Context</td><td>=</td><td>1</td></tr><tr><td>Vendor</td><td>Status</td><td>>=</td><td>0</td></tr><tr><td>ProgressStatus</td><td>Context</td><td>=</td><td>13</td></tr><tr><td>ProgressStatus</td><td>Status</td><td>>=</td><td>0</td></tr><tr><td>Space</td><td>Context</td><td>=</td><td>1</td></tr><tr><td>Space</td><td>Status</td><td>>=</td><td>0</td></tr><tr><td>EquipmentType</td><td>Context</td><td>=</td><td>16</td></tr><tr><td>EquipmentType</td><td>Status</td><td>>=</td><td>0</td></tr><tr><td>Employee</td><td>Context</td><td>=</td><td>1</td></tr><tr><td>Employee</td><td>Status</td><td>>=</td><td>0</td></tr><tr><td>Customer</td><td>Status</td><td>=</td><td>0</td></tr><tr><td>Customer</td><td>Context</td><td>=</td><td>1</td></tr></tbody></table>


# Infra objects

This template can help you create an API for Infra Asset information. The template contains all relevant entities and properties of an medical asset asset (**context 65536 in table 'Equipment'**).&#x20;

All relations from 'Equipment' to another entity have minimum read access to the 'Description'. This way you can easily receive the right information. Below is an overview of all entities, properties and filters of this template.

Additional entities, properties and filters can be added, which may be missing from the template but are necessary for your process. All entities can be found through the 'Entity overview' in the customisation tool of IFS Ultimo (consult application administrator or consultant).

### Entities and properties

| Equipment       | <p>Id</p><p>Description</p><p></p><p>Context</p><p>CurrentmaintenanceStateDate</p><p>Description</p><p>EquipmentType</p><p>InstallDate</p><p>MaintenanceState</p><p>ManufacturerYear</p><p>Manufacturer</p><p>PartOfEquipment</p><p>ProcessFunction</p><p>ProgressStatus</p><p>RiskScore</p><p>Site</p><p>Status</p><p>Text1</p><p>Vendor</p><p>ExternalId</p><p>DataProvider</p>                                                                              |
| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ProcessFunction | <p>AddressLine1</p><p>AddressLine2</p><p>City</p><p>Code</p><p>Context</p><p>Country</p><p>CostCenter</p><p>Decomposition</p><p>Department</p><p>Description</p><p>Equipments</p><p>FromGeocodeX</p><p>GromGeocodeY</p><p>GeocodeX</p><p>GeocodeY</p><p>ManagerVendor</p><p>Manufacturer</p><p>ManufacturerYear</p><p>PartofProcessFunction</p><p>ProvinceStateRegion</p><p>Site</p><p>Status</p><p>Text1</p><p>Vendor</p><p>ExternalId</p><p>DataProvider</p> |
| Site            | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| Decomposition   | <p>Description</p><p>PartofDecomposition</p><p>Site</p>                                                                                                                                                                                                                                                                                                                                                                                                        |
| Department      | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| CostCenter      | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| Vendor          | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| EquipmentType   | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| ProgressStatus  | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                    |

### Filters

| Enity           | Property filter | Operator | Value       |
| --------------- | --------------- | -------- | ----------- |
| Equipment       | Context         | IN       | 32768,65536 |
| Equipment       | Status          | =        | 2           |
| Processfunction | Context         | =        | 32768       |
| Processfunction | Status          | =        | 1           |
| Site            | Context         | =        | 1           |
| Site            | Status          | >=       | 0           |
| Department      | Context         | =        | 1           |
| Department      | Status          | >=       | 0           |
| Costcenter      | Context         | =        | 1           |
| Costcenter      | Status          | =        | 2           |
| Vendor          | Context         | =        | 1           |
| Vendor          | Status          | >=       | 0           |
| ProgressStatus  | Context         | =        | 12          |
| ProgressStatus  | Status          | >=       | 0           |
| EquipmentType   | Context         | =        | 262144      |
| EquipmentType   | Status          | >=       | 0           |
| Decomposition   | Context         | =        | 32768       |
| Decomposition   | Status          | >=       | 0           |


# IT Configuration-Items

This template can help you create an API for IT Configuration-item information. The template contains all relevant entities and properties of an medical asset asset (**context 32 in table 'Equipment'**).&#x20;

All relations from 'Equipment' to another entity have minimum read access to the 'Description'. This way you can easily receive the right information. Below is an overview of all entities, properties and filters of this template.

Additional entities, properties and filters can be added, which may be missing from the template but are necessary for your process. All entities can be found through the 'Entity overview' in the customisation tool of IFS Ultimo (consult application administrator or consultant).

### Entities and properties

| Entity         | Properties                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Equipment      | <p>Id</p><p>Description</p><p> </p><p>AOC</p><p>CostCenter</p><p>Department</p><p>Dataprovider</p><p>ExternalId</p><p>EquipmentType</p><p>InstallDate</p><p>MaintenanceClassification</p><p>Model</p><p>Manufacturer</p><p>ManufacturerYear</p><p>NextPmMaintenanceDate</p><p>OwnerEmployee</p><p>OriginalVendor</p><p>OutOfService</p><p>Parts</p><p>ProcessFunction</p><p>ProgressStatus</p><p>PartOfEquipment</p><p>Serialnumber</p><p>SkillCategory</p><p>Space</p><p>ServiceContract</p><p>Site</p><p>Space</p><p>Status</p><p>Type</p><p>TypeNumber</p><p>Text1</p><p>TrackAndTrace</p><p>TrackAndTraceLocation</p><p>TrackAndTraceLastSynchronisation</p><p>UDI</p><p>Vendor</p> |
| Site           | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| Department     | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| CostCenter     | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| Vendor         | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| ProgressStatus | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| Space          | <p>Description</p><p>Roomnumber</p>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| EquipmentType  | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| Employee       | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |

### Filters

| Entity          | Filter property | Operator | Value |
| --------------- | --------------- | -------- | ----- |
| Equipment       | Context         | =        | 32    |
| Equipment       | Status          | =        | 2     |
| Processfunction | Context         | =        | 2     |
| Processfunction | Status          | =        | 1     |
| Site            | Context         | =        | 1     |
| Site            | Status          | >=       | 0     |
| Department      | Context         | =        | 1     |
| Department      | Status          | >=       | 0     |
| Costcenter      | Context         | =        | 1     |
| Costcenter      | Status          | =        | 2     |
| Vendor          | Context         | =        | 1     |
| Vendor          | Status          | >=       | 0     |
| ProgressStatus  | Context         | IN       | 10,14 |
| ProgressStatus  | Status          | >=       | 0     |
| Space           | Context         | =        | 1     |
| Space           | Status          | >=       | 0     |
| EquipmentType   | Context         | IN       | 2,128 |
| EquipmentType   | Status          | =        | 0     |
| Employee        | Context         | =        | 1     |
| Employee        | Status          | >=       | 0     |


# Jobs

:white\_check\_mark:Professional :white\_check\_mark:Premium :white\_check\_mark:Enterprise

### Introduction

The predefined templates for Jobs can help you create an API to integrate jobs. A template contains all relevant entities and properties of a workorder (table 'Job'). The Job templates are based on a specific process within IFS Ultimo (context);

* Technical Service
* Medical&#x20;
* Fleet&#x20;
* Infra
* IT&#x20;

All relations from 'Job' to another entity have minimum read access to the 'Description'. This way, you can easily receive the right information.&#x20;

### Playground

{% hint style="info" %}
Swagger documentation for this connector is available on our playground environment. It is also possible to test the connector on this page, use the parameters below to try it out!\
\
Please note, this is an example. Not all entities and properties are available in this playground.&#x20;
{% endhint %}

| Parameter         | Description                                                                                     |
| ----------------- | ----------------------------------------------------------------------------------------------- |
| URL               | <https://devdocs.ultimo.net/docs/index.html?version=v1&apiKey=E98A60772F574264BEF845115A32D388> |
| ApiKey            | 2F69E490E2EC46E7B6031774439FB6B0                                                                |
| Context           | Use value 1                                                                                     |
| EquipmentId       | Leave empty or use value '00001'                                                                |
| ProcessFunctionId | Leave empty or use value 'N.PRO.02'                                                             |
| SiteId            | Leave empty or use value '01'                                                                   |
| SpaceId           | Leave empty or use value '003.0.10'                                                             |
| WorkOrderTypeId   | Leave empty or use value '062'                                                                  |

###


# Technical Service jobs

This template can help you create an API to integrate Technical Service jobs. The template contains all relevant entities and properties of a technical service job (**context 1 in table 'Job'**).&#x20;

All relations from 'Job' to another entity have minimum read access to the 'Description'. This way you can easily receive the right information. Below is an overview of all entities, properties and filters of this template.

Additional entities, properties and filters can be added, which may be missing from the template but are necessary for your process. All entities can be found through the 'Entity overview' in the customisation tool of IFS Ultimo (consult application administrator or consultant).

## Entities and properties

<table><thead><tr><th width="305">Entity</th><th>Properties</th></tr></thead><tbody><tr><td>Job</td><td><p>Id</p><p>Description</p><p> </p><p>Context</p><p>CostCenter</p><p>Department</p><p>Employee</p><p>Equipment</p><p>EquipmentType</p><p>Failtype</p><p>Feedbacktext</p><p>Priority</p><p>Processfunction</p><p>ProgressStatus</p><p>ReportForeignKeyEmployee</p><p>ReportText</p><p>ScheduledStartDate</p><p>ServiceContract</p><p>ServiceContractTargetFinishedDate</p><p>ServiceContractTargetResponseDate</p><p>Site</p><p>SkillCategory</p><p>Space</p><p>Status</p><p>StatusActiveDate</p><p>StatusCreateReportDate</p><p>StatusFinishDate</p><p>TargetDate</p><p>Text</p><p>Vendor</p><p>WorkorderType</p><p></p><p>ExternalId</p><p>DataProvider</p></td></tr><tr><td>CostCenter</td><td>Description</td></tr><tr><td>Department</td><td>Description</td></tr><tr><td>Employee</td><td>Description</td></tr><tr><td>Equipment</td><td><p>Description</p><p>EquipmentType</p><p>ExternalId</p><p>SerialNumber</p><p>Site</p></td></tr><tr><td>EquipmentType</td><td>Description</td></tr><tr><td>Failtype</td><td>Description</td></tr><tr><td>Priority</td><td>Description</td></tr><tr><td>ProcessFunction</td><td>Despription</td></tr><tr><td>ProgressStatus</td><td>Description</td></tr><tr><td>ServiceContract</td><td>Description</td></tr><tr><td>Site</td><td>Description</td></tr><tr><td>SkillCategory</td><td>Description</td></tr><tr><td>Space</td><td>Description</td></tr><tr><td>Vendor</td><td>Description</td></tr><tr><td>WorkorderType</td><td>Description</td></tr></tbody></table>

### Filters

<table><thead><tr><th>Entity</th><th width="225">Filter property name</th><th width="118" align="center">Operator</th><th align="center">Value</th></tr></thead><tbody><tr><td>Job</td><td>Context</td><td align="center">=</td><td align="center">1</td></tr><tr><td>Job</td><td>Status</td><td align="center">IN</td><td align="center">1,2,4,16</td></tr><tr><td>Costcenter</td><td>Context</td><td align="center">=</td><td align="center">1</td></tr><tr><td>Costcenter</td><td>Status</td><td align="center">=</td><td align="center">2</td></tr><tr><td>Department</td><td>Context</td><td align="center">=</td><td align="center">1</td></tr><tr><td>Department</td><td>Status</td><td align="center">>=</td><td align="center">0</td></tr><tr><td>Employee</td><td>Context</td><td align="center">=</td><td align="center">1</td></tr><tr><td>Employee</td><td>Status</td><td align="center">>=</td><td align="center">0</td></tr><tr><td>Equipment</td><td>Context</td><td align="center">IN</td><td align="center">1,2</td></tr><tr><td>Equipment</td><td>Status</td><td align="center">=</td><td align="center">2</td></tr><tr><td>EquipmentType</td><td>Context</td><td align="center">IN</td><td align="center">1,8</td></tr><tr><td>EquipmentType</td><td>Status</td><td align="center">>=</td><td align="center">0</td></tr><tr><td>Failtype</td><td>Context</td><td align="center">=</td><td align="center">1</td></tr><tr><td>Failtype</td><td>Status</td><td align="center">>=</td><td align="center">0</td></tr><tr><td>Priority</td><td>Context</td><td align="center">=</td><td align="center">1</td></tr><tr><td>Priority</td><td>Status</td><td align="center">>=</td><td align="center">0</td></tr><tr><td>ProcessFunction</td><td>Context</td><td align="center">=</td><td align="center">1</td></tr><tr><td>ProcessFunction</td><td>Status</td><td align="center">=</td><td align="center">1</td></tr><tr><td>ProgressStatus</td><td>Context</td><td align="center">=</td><td align="center">16</td></tr><tr><td>ProgressStatus</td><td>Status</td><td align="center">>=</td><td align="center">0</td></tr><tr><td>ServiceContract</td><td>Context</td><td align="center">=</td><td align="center">1</td></tr><tr><td>ServiceContract</td><td>Status</td><td align="center">>=</td><td align="center">0</td></tr><tr><td>Site</td><td>Context</td><td align="center">=</td><td align="center">1</td></tr><tr><td>Site</td><td>Status</td><td align="center">>=</td><td align="center">0</td></tr><tr><td>Skillcategory</td><td>Context</td><td align="center">=</td><td align="center">1</td></tr><tr><td>Skillcategory</td><td>Status</td><td align="center">>=</td><td align="center">0</td></tr><tr><td>Space</td><td>Context</td><td align="center">=</td><td align="center">1</td></tr><tr><td>Space</td><td>Status</td><td align="center">>=</td><td align="center">0</td></tr><tr><td>Vendor</td><td>Context</td><td align="center">=</td><td align="center">1</td></tr><tr><td>Vendor</td><td>Status</td><td align="center">>=</td><td align="center">0</td></tr><tr><td>Workordertype</td><td>Context</td><td align="center">=</td><td align="center">1</td></tr><tr><td>Workordertype</td><td>Status</td><td align="center">>=</td><td align="center">0</td></tr></tbody></table>

## Change job status

For changing a job status we provide a 'POST' action that triggers a workflow in Ultimo. Below is an overview of all properties of this workflow. It's by default only possible to change jobs that comply with filters of entity 'Job', as described above. When those filters changed, this also applied to this workflow.&#x20;

| **Property**                  | **Accessor** |
| ----------------------------- | ------------ |
| JobId                         | Optional     |
| ExternalId                    | Optional     |
| ProgressStatus                | Required     |
| Date                          | Required     |
| Employee                      | Required     |
| Text                          | Optional     |
| Hours                         | Optional     |
| Hourcode                      | Optional     |
| HourTariffCategory            | Optional     |
| EquipmentProgressStatus       | Optional     |
| EquipmentProgressStatusRemark | Optional     |


# Medical jobs

This template can help you create an API to integrate Medical asset management jobs. The template contains all relevant entities and properties of a medical asset management job (**context 512 in table 'Job'**).&#x20;

All relations from 'Job' to another entity have minimum read access to the 'Description'. This way you can easily receive the right information. Below is an overview of all entities, properties and filters of this template.

Additional entities, properties and filters can be added, which may be missing from the template but are necessary for your process. All entities can be found through the 'Entity overview' in the customisation tool of IFS Ultimo (consult application administrator or consultant).

## Entities and properties

<table><thead><tr><th width="367">Entity</th><th>Properties</th></tr></thead><tbody><tr><td>Job</td><td><p>Id</p><p>Description</p><p> </p><p>Context</p><p>CostCenter</p><p>Department</p><p>Employee</p><p>Equipment</p><p>EquipmentType</p><p>Failtype</p><p>Feedbacktext</p><p>Priority</p><p>ProgressStatus</p><p>ReportForeignKeyEmployee</p><p>ReportText</p><p>ScheduledStartDate</p><p>ServiceContract</p><p>ServiceContractTargetFinishedDate</p><p>ServiceContractTargetResponseDate</p><p>Site</p><p>SkillCategory</p><p>Space</p><p>Status</p><p>StatusActiveDate</p><p>StatusCreateReportDate</p><p>StatusFinishDate</p><p>TargetDate</p><p>Text</p><p>Vendor</p><p>WorkorderType</p><p></p><p>ExternalId</p><p>DataProvider</p></td></tr><tr><td>AOC</td><td>Description</td></tr><tr><td>CostCenter</td><td>Description</td></tr><tr><td>Department</td><td>Description</td></tr><tr><td>Employee</td><td>Description</td></tr><tr><td>Equipment</td><td><p>Description</p><p>Site</p><p>EquipmentType</p><p>Serialnumber</p><p>AOC</p><p>UDI</p><p>ExternalId</p></td></tr><tr><td>EquipmentType</td><td>Description</td></tr><tr><td>Failtype</td><td>Description</td></tr><tr><td>Priority</td><td>Description</td></tr><tr><td>ProgressStatus</td><td>Description</td></tr><tr><td>ServiceContract</td><td>Description</td></tr><tr><td>Site</td><td>Description</td></tr><tr><td>SkillCategory</td><td>Description</td></tr><tr><td>Space</td><td>Description<br>RoomNumber</td></tr><tr><td>Vendor</td><td>Description</td></tr><tr><td>WorkorderType</td><td>Description</td></tr></tbody></table>

### Filters

| Entity          | Filter property name | Operator |   Value  |
| --------------- | -------------------- | :------: | :------: |
| Job             | Context              |     =    |    512   |
| Job             | Status               |    IN    | 1,2,4,16 |
| AOC             | Context              |     =    |     0    |
| AOC             | Status               |    >=    |     0    |
| Costcenter      | Context              |     =    |     1    |
| Costcenter      | Status               |     =    |     2    |
| Department      | Context              |     =    |     1    |
| Department      | Status               |    >=    |     0    |
| Employee        | Context              |     =    |     1    |
| Employee        | Status               |    >=    |     0    |
| Equipment       | Context              |     =    |    512   |
| Equipment       | Status               |    IN    |    2,4   |
| EquipmentType   | Context              |     =    |     4    |
| EquipmentType   | Status               |    >=    |     0    |
| Failtype        | Context              |     =    |    32    |
| Failtype        | Status               |    >=    |     0    |
| Priority        | Context              |     =    |     8    |
| Priority        | Status               |    >=    |     0    |
| ProgressStatus  | Context              |     =    |     4    |
| ProgressStatus  | Status               |    >=    |     0    |
| ServiceContract | Context              |     =    |    64    |
| ServiceContract | Status               |    >=    |     0    |
| Site            | Context              |     =    |     1    |
| Site            | Status               |    >=    |     0    |
| Skillcategory   | Context              |     =    |     1    |
| Skillcategory   | Status               |    >=    |     0    |
| Space           | Context              |     =    |     1    |
| Space           | Status               |    >=    |     0    |
| Vendor          | Context              |     =    |     1    |
| Vendor          | Status               |    >=    |     0    |
| Workordertype   | Context              |     =    |    32    |
| Workordertype   | Status               |    >=    |     0    |

## Change job status

For changing a job status we provide a 'POST' action that triggers a workflow in Ultimo. Below is an overview of all properties of this workflow. It's by default only possible to change jobs that comply with filters of entity 'Job', as described above. When those filters changed, this also applied to this workflow.&#x20;

| **Property**                  | **Accessor** |
| ----------------------------- | ------------ |
| JobId                         | Optional     |
| ExternalId                    | Optional     |
| ProgressStatus                | Required     |
| Date                          | Required     |
| Employee                      | Required     |
| Hours                         | Optional     |
| Hourcode                      | Optional     |
| HourTariffCategory            | Optional     |
| EquipmentProgressStatus       | Optional     |
| EquipmentProgressStatusRemark | Optional     |


# Fleet jobs

This template can help you create an API to integrate Fleet jobs. The template contains all relevant entities and properties of a fleet job (**context 16384 in table 'Job'**).&#x20;

All relations from 'Job' to another entity have minimum read access to the 'Description'. This way you can easily receive the right information. Below is an overview of all entities, properties and filters of this template.

Additional entities, properties and filters can be added, which may be missing from the template but are necessary for your process. All entities can be found through the 'Entity overview' in the customisation tool of IFS Ultimo (consult application administrator or consultant).

## Entities and properties

<table><thead><tr><th width="367">Entity</th><th>Properties</th></tr></thead><tbody><tr><td>Job</td><td><p>Id</p><p>Description</p><p> </p><p>Context</p><p>CostCenter<br>Customer</p><p>Department</p><p>Equipment</p><p>Employee</p><p>EquipmentType</p><p>Failtype</p><p>Feedbacktext</p><p>Incident</p><p>Priority</p><p>Processfunction</p><p>ProgressStatus</p><p>ReportForeignKeyEmployee</p><p>ReportText</p><p>ScheduledStartDate</p><p>ServiceContract</p><p>ServiceContractTargetFinishedDate</p><p>ServiceContractTargetResponseDate</p><p>Site</p><p>SkillCategory</p><p>Space</p><p>Status</p><p>StatusActiveDate</p><p>StatusCreateReportDate</p><p>StatusFinishDate</p><p>TargetDate</p><p>Text</p><p>Vendor</p><p>WorkorderType</p><p></p><p>ExternalId</p><p>DataProvider</p></td></tr><tr><td>CostCenter</td><td>Description</td></tr><tr><td>Customer</td><td>Description</td></tr><tr><td>Department</td><td>Description</td></tr><tr><td>Employee</td><td>Description</td></tr><tr><td>Equipment</td><td><p>Description</p><p>Site</p><p>EquipmentType</p><p>Serialnumber</p><p>ExternalId</p></td></tr><tr><td>EquipmentType</td><td>Description</td></tr><tr><td>Failtype</td><td>Description</td></tr><tr><td>Incident</td><td>Description</td></tr><tr><td>Priority</td><td>Description</td></tr><tr><td>ProcessFunction</td><td>Description<br>Site</td></tr><tr><td>ProgressStatus</td><td>Description</td></tr><tr><td>ServiceContract</td><td>Description</td></tr><tr><td>Site</td><td>Description</td></tr><tr><td>SkillCategory</td><td>Description</td></tr><tr><td>Space</td><td>Description<br>RoomNumber</td></tr><tr><td>Vendor</td><td>Description</td></tr><tr><td>WorkorderType</td><td>Description</td></tr></tbody></table>

### Filters

| Entity          | Filter property name | Operator |   Value  |
| --------------- | -------------------- | :------: | :------: |
| Job             | Context              |     =    |   16384  |
| Job             | Status               |    IN    | 1,2,4,16 |
| Costcenter      | Context              |     =    |     1    |
| Costcenter      | Status               |     =    |     2    |
| Customer        | Context              |     =    |     1    |
| Customer        | Status               |    >=    |     0    |
| Department      | Context              |     =    |     1    |
| Department      | Status               |    >=    |     0    |
| Employee        | Context              |     =    |     1    |
| Employee        | Status               |    >=    |     0    |
| Equipment       | Context              |     =    |     8    |
| Equipment       | Status               |     =    |     2    |
| EquipmentType   | Context              |     =    |    16    |
| EquipmentType   | Status               |    >=    |     0    |
| Failtype        | Context              |     =    |    64    |
| Failtype        | Status               |    >=    |     0    |
| Incident        | Context              |     =    |     1    |
| Incident        | Status               |    >=    |     0    |
| Priority        | Context              |     =    |     1    |
| Priority        | Status               |    >=    |     0    |
| ProcessFunction | Context              |     =    |     4    |
| ProcessFunction | Status               |     =    |     1    |
| ProgressStatus  | Context              |     =    |     8    |
| ProgressStatus  | Status               |    >=    |     0    |
| ServiceContract | Context              |     =    |    128   |
| ServiceContract | Status               |    >=    |     0    |
| Site            | Context              |     =    |     1    |
| Site            | Status               |    >=    |     0    |
| Skillcategory   | Context              |     =    |     1    |
| Skillcategory   | Status               |    >=    |     0    |
| Space           | Context              |     =    |     1    |
| Space           | Status               |    >=    |     0    |
| Vendor          | Context              |     =    |     1    |
| Vendor          | Status               |    >=    |     0    |
| Workordertype   | Context              |     =    |    64    |
| Workordertype   | Status               |    >=    |     0    |

## Change job status

For changing a job status we provide a 'POST' action that triggers a workflow in Ultimo. Below is an overview of all properties of this workflow. It's by default only possible to change jobs that comply with filters of entity 'Job', as described above. When those filters changed, this also applied to this workflow.&#x20;

| **Property**                  | **Accessor** |
| ----------------------------- | ------------ |
| JobId                         | Optional     |
| ExternalId                    | Optional     |
| ProgressStatus                | Required     |
| Date                          | Required     |
| Employee                      | Required     |
| Text                          | Optional     |
| Hours                         | Optional     |
| Hourcode                      | Optional     |
| HourTariffCategory            | Optional     |
| EquipmentProgressStatus       | Optional     |
| EquipmentProgressStatusRemark | Optional     |


# Infra jobs

This template can help you create an API to integrate Infra jobs. The template contains all relevant entities and properties of a Infra job (**context 32768 in table 'Job'**).&#x20;

All relations from 'Job' to another entity have minimum read access to the 'Description'. This way you can easily receive the right information. Below is an overview of all entities, properties and filters of this template.

Additional entities, properties and filters can be added, which may be missing from the template but are necessary for your process. All entities can be found through the 'Entity overview' in the customisation tool of IFS Ultimo (consult application administrator or consultant).

## Entities and properties

<table><thead><tr><th width="367">Entity</th><th>Properties</th></tr></thead><tbody><tr><td>Job</td><td><p>Id</p><p>Description</p><p> </p><p>Context</p><p>Department</p><p>Employee</p><p>Equipment</p><p>EquipmentType</p><p>Failtype</p><p>Feedbacktext</p><p>Priority</p><p>Processfunction</p><p>ProgressStatus</p><p>ReportForeignKeyEmployee</p><p>ReportText</p><p>ScheduledStartDate</p><p>ServiceContract</p><p>ServiceContractTargetFinishedDate</p><p>ServiceContractTargetResponseDate</p><p>Site</p><p>SkillCategory</p><p>Status</p><p>StatusActiveDate</p><p>StatusCreateReportDate</p><p>StatusFinishDate</p><p>TargetDate</p><p>Text</p><p>Vendor</p><p>WorkorderType</p><p></p><p>ExternalId</p><p>DataProvider</p></td></tr><tr><td>Department</td><td>Description</td></tr><tr><td>Employee</td><td>Description</td></tr><tr><td>Equipment</td><td><p>Description</p><p>Site</p><p>EquipmentType</p><p>Serialnumber</p><p>ExternalId</p></td></tr><tr><td>EquipmentType</td><td>Description</td></tr><tr><td>Failtype</td><td>Description</td></tr><tr><td>Priority</td><td>Description</td></tr><tr><td>ProcessFunction</td><td>Despription</td></tr><tr><td>ProgressStatus</td><td>Description</td></tr><tr><td>ServiceContract</td><td>Description</td></tr><tr><td>Site</td><td>Description</td></tr><tr><td>SkillCategory</td><td>Description</td></tr><tr><td>Vendor</td><td>Description</td></tr><tr><td>WorkorderType</td><td>Description</td></tr></tbody></table>

### Filters

| Entity          | Filter property name | Operator |   Value  |
| --------------- | -------------------- | :------: | :------: |
| Job             | Context              |     =    |   32768  |
| Job             | Status               |    IN    | 1,2,4,16 |
| Department      | Context              |     =    |     1    |
| Department      | Status               |    >=    |     0    |
| Employee        | Context              |     =    |     1    |
| Employee        | Status               |    >=    |     0    |
| Equipment       | Context              |     =    |   65536  |
| Equipment       | Status               |     =    |     2    |
| EquipmentType   | Context              |     =    |  262144  |
| EquipmentType   | Status               |    >=    |     0    |
| Failtype        | Context              |     =    |   32768  |
| Failtype        | Status               |    >=    |     0    |
| Priority        | Context              |     =    |     1    |
| Priority        | Status               |    >=    |     0    |
| Processfunction | Context              |     =    |   32768  |
| Processfunction | Status               |     =    |     1    |
| ProgressStatus  | Context              |     =    |   32768  |
| ProgressStatus  | Status               |    >=    |     0    |
| ServiceContract | Context              |     =    |   32768  |
| ServiceContract | Status               |    >=    |     0    |
| Site            | Context              |     =    |     1    |
| Site            | Status               |    >=    |     0    |
| Skillcategory   | Context              |     =    |     1    |
| Skillcategory   | Status               |    >=    |     0    |
| Vendor          | Context              |     =    |     1    |
| Vendor          | Status               |    >=    |     0    |
| Workordertype   | Context              |     =    |   32768  |
| Workordertype   | Status               |    >=    |     0    |

## Change job status

For changing a job status we provide a 'POST' action that triggers a workflow in Ultimo. Below is an overview of all properties of this workflow. It's by default only possible to change jobs that comply with filters of entity 'Job', as described above. When those filters changed, this also applied to this workflow.&#x20;

| **Property**                  | **Accessor** |
| ----------------------------- | ------------ |
| JobId                         | Optional     |
| ExternalId                    | Optional     |
| ProgressStatus                | Required     |
| Date                          | Required     |
| Employee                      | Required     |
| Text                          | Optional     |
| Hours                         | Optional     |
| Hourcode                      | Optional     |
| HourTariffCategory            | Optional     |
| EquipmentProgressStatus       | Optional     |
| EquipmentProgressStatusRemark | Optional     |


# IT-incidents

This template can help you create an API to integrate IT-incidents. The template contains all relevant entities and properties of an incident (**context 128 in table 'Job'**).&#x20;

All relations from 'Job' to another entity have minimum read access to the 'Description'. This way you can easily receive the right information. Below is an overview of all entities, properties and filters of this template.

Additional entities, properties and filters can be added, which may be missing from the template but are necessary for your process. All entities can be found through the 'Entity overview' in the customisation tool of IFS Ultimo (consult application administrator or consultant).

## Entities and properties

<table><thead><tr><th width="367">Entity</th><th>Properties</th></tr></thead><tbody><tr><td>Job</td><td><p>Id</p><p>Description</p><p> </p><p>Context</p><p>CostCenter</p><p>CommunicationMedium</p><p>Department</p><p>Employee</p><p>Equipment</p><p>EquipmentType</p><p>Failtype</p><p>Feedbacktext</p><p>Priority</p><p>Processfunction</p><p>ProgressStatus</p><p>ReportForeignKeyEmployee</p><p>ReportText</p><p>ScheduledStartDate</p><p>ServiceContract</p><p>ServiceContractTargetFinishedDate</p><p>ServiceContractTargetResponseDate</p><p>Site</p><p>SkillCategory</p><p>Space</p><p>Status</p><p>StatusActiveDate</p><p>StatusCreateReportDate</p><p>StatusFinishDate</p><p>TargetDate</p><p>Text</p><p>Vendor</p><p>WorkorderType</p><p></p><p>ExternalId</p><p>DataProvider</p></td></tr><tr><td>CostCenter</td><td>Description</td></tr><tr><td>CommunicationMedium</td><td>Description</td></tr><tr><td>Department</td><td>Description</td></tr><tr><td>Employee</td><td>Description</td></tr><tr><td>Equipment</td><td><p>Description</p><p>OwnerEmployee</p><p>Site</p><p>Space</p></td></tr><tr><td>EquipmentType</td><td>Description</td></tr><tr><td>Failtype</td><td>Description</td></tr><tr><td>Priority</td><td>Description</td></tr><tr><td>ProcessFunction</td><td>Description</td></tr><tr><td>ProgressStatus</td><td>Description</td></tr><tr><td>ServiceContract</td><td>Description</td></tr><tr><td>Site</td><td>Description</td></tr><tr><td>SkillCategory</td><td>Description</td></tr><tr><td>Space</td><td>Description<br>RoomNumber</td></tr><tr><td>Vendor</td><td>Description</td></tr><tr><td>WorkorderType</td><td>Description</td></tr></tbody></table>

### Filters

<table><thead><tr><th width="234">Entity</th><th width="189">Filter property name</th><th align="center">Operator</th><th align="center">Value</th></tr></thead><tbody><tr><td>Job</td><td>Context</td><td align="center">=</td><td align="center">128</td></tr><tr><td>Job</td><td>Status</td><td align="center">IN</td><td align="center">1,2,4,16</td></tr><tr><td>CommunicationMedium</td><td>Context</td><td align="center">=</td><td align="center">0</td></tr><tr><td>CommunicationMedium</td><td>Status</td><td align="center">=</td><td align="center">0</td></tr><tr><td>Costcenter</td><td>Context</td><td align="center">=</td><td align="center">1</td></tr><tr><td>Costcenter</td><td>Status</td><td align="center">=</td><td align="center">2</td></tr><tr><td>Department</td><td>Context</td><td align="center">=</td><td align="center">1</td></tr><tr><td>Department</td><td>Status</td><td align="center">>=</td><td align="center">0</td></tr><tr><td>Employee</td><td>Context</td><td align="center">=</td><td align="center">1</td></tr><tr><td>Employee</td><td>Status</td><td align="center">>=</td><td align="center">0</td></tr><tr><td>Equipment</td><td>Context</td><td align="center">=</td><td align="center">32</td></tr><tr><td>Equipment</td><td>Status</td><td align="center">=</td><td align="center">2</td></tr><tr><td>EquipmentType</td><td>Context</td><td align="center">IN</td><td align="center">2, 128</td></tr><tr><td>EquipmentType</td><td>Status</td><td align="center">>=</td><td align="center">0</td></tr><tr><td>Failtype</td><td>Context</td><td align="center">=</td><td align="center">2</td></tr><tr><td>Failtype</td><td>Status</td><td align="center">>=</td><td align="center">0</td></tr><tr><td>Priority</td><td>Context</td><td align="center">=</td><td align="center">2</td></tr><tr><td>Priority</td><td>Status</td><td align="center">>=</td><td align="center">0</td></tr><tr><td>Processfunction</td><td>Context</td><td align="center">=</td><td align="center">2</td></tr><tr><td>Processfunction</td><td>Status</td><td align="center">=</td><td align="center">1</td></tr><tr><td>ProgressStatus</td><td>Context</td><td align="center">=</td><td align="center">1</td></tr><tr><td>ProgressStatus</td><td>Status</td><td align="center">>=</td><td align="center">0</td></tr><tr><td>ServiceContract</td><td>Context</td><td align="center">=</td><td align="center">8</td></tr><tr><td>ServiceContract</td><td>Status</td><td align="center">>=</td><td align="center">0</td></tr><tr><td>Site</td><td>Context</td><td align="center">=</td><td align="center">1</td></tr><tr><td>Site</td><td>Status</td><td align="center">>=</td><td align="center">0</td></tr><tr><td>Skillcategory</td><td>Context</td><td align="center">=</td><td align="center">1</td></tr><tr><td>Skillcategory</td><td>Status</td><td align="center">>=</td><td align="center">0</td></tr><tr><td>Space</td><td>Context</td><td align="center">=</td><td align="center">1</td></tr><tr><td>Space</td><td>Status</td><td align="center">>=</td><td align="center">0</td></tr><tr><td>Vendor</td><td>Context</td><td align="center">=</td><td align="center">1</td></tr><tr><td>Vendor</td><td>Status</td><td align="center">>=</td><td align="center">0</td></tr><tr><td>Workordertype</td><td>Context</td><td align="center">=</td><td align="center">2</td></tr><tr><td>Workordertype</td><td>Status</td><td align="center">>=</td><td align="center">0</td></tr></tbody></table>

## Change job status

For changing a job status we provide a 'POST' action that triggers a workflow in Ultimo. Below is an overview of all properties of this workflow. It's by default only possible to change jobs that comply with filters of entity 'Job', as described above. When those filters changed, this also applied to this workflow.&#x20;

| **Property**                  | **Accessor** |
| ----------------------------- | ------------ |
| JobId                         | Optional     |
| ExternalId                    | Optional     |
| ProgressStatus                | Required     |
| Date                          | Required     |
| Employee                      | Required     |
| Text                          | Optional     |
| Hours                         | Optional     |
| Hourcode                      | Optional     |
| HourTariffCategory            | Optional     |
| EquipmentProgressStatus       | Optional     |
| EquipmentProgressStatusRemark | Optional     |


# Attach or change images

Workflow: REST\_AttachImageToJob

### Functional details

This workflow allows third parties to add or change images of an existing job in Ultimo. Images can be provided as files or in Base64 format.

The following parameters are used in the request.

| JobId                    | The internal Id of an existing job in Ultimo.                                                                                                             |
| ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ImageFile                | Image related to the job.                                                                                                                                 |
| ImageFile2               | Image related to the job.                                                                                                                                 |
| ImageFile3               | Image related to the job.                                                                                                                                 |
| ImageFile4               | Image related to the job.                                                                                                                                 |
| ImageFileBase64          | Use this parameter for Base64 encoding.                                                                                                                   |
| ImageFile2Base64         | Use this parameter for Base64 encoding.                                                                                                                   |
| ImageFile3Base64         | Use this parameter for Base64 encoding.                                                                                                                   |
| ImageFile4Base64         | Use this parameter for Base64 encoding.                                                                                                                   |
| ImageFileBase64Extension | This parameter can be used for Base64 encoded images. The default value is ".jpg". This parameter should be provided when the image is not in JPG format. |

When these parameters are properly filled in, Ultimo will give a HTTP 200 response with the following properties:

| Parameter | Description                                   |
| --------- | --------------------------------------------- |
| JobId     | The internal Id of the created job in Ultimo. |

## Technical details

### Basic URL (POST):

`https://customer.ultimo.com/api/V1/Action/REST_AttachImageToJob`

Header data:&#x20;

| Parameter            | Description                                               |
| -------------------- | --------------------------------------------------------- |
| ApiKey               | Request an API key at (application manager or consultant) |
| ApplicationElementId | Fixed value “d1fb01d5-77c2-48df-b95a-2ada578578df”        |

### Body (example):

```csharp
{
  "JobId": "1001179",
  "ImageFile": "",
  "ImageFile2": "",
  "ImageFile2Base64": "",
  "ImageFile3": "",
  "ImageFile3Base64": "",
  "ImageFile4": "",
  "ImageFile4Base64": "",
  "ImageFileBase64": "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MicqKyr/2wBDAQcICAoJChQLCxQqHBgcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKir/wAARCAI4AlgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD6RooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiuB+IfxEuvBeoWltaWE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",
  "ImageFileBase64Extension": ""
}
```

### Normal response:

{% hint style="success" %}
Status: 200 OK
{% endhint %}

### Response when the action is not allowed:

{% hint style="danger" %}
Status: 400 Bad Request
{% endhint %}

```csharp
{
    "message": "Job 1001179 is not found.",
    "type": 3,
    "code": "1112"
```

### Response when the API-key is invalid:

{% hint style="danger" %}
Status: 401 Unauthorized
{% endhint %}

```
{
    "message": "Missing API key",
    "code": "MissingApikey"
}
```


# Article

:white\_check\_mark:Professional :white\_check\_mark:Premium :white\_check\_mark:Enterprise

### Playground

{% hint style="info" %}
Swagger documentation for this connector is available on our playground environment. It is also possible to test the connector on this page, use the parameters below to try it out!
{% endhint %}

| Parameter | Description                                                                                     |
| --------- | ----------------------------------------------------------------------------------------------- |
| URL       | <https://devdocs.ultimo.net/docs/index.html?version=v1&apiKey=58BADAA39C9C44BA939FD5AF916E351B> |
| ApiKey    | Not available yet.                                                                              |

### Functional details

This REST connector allows third parties to create and update warehouse articles in Ultimo. Ultimo acts as a server in this connector. It's also possible to retrieve article information from Ultimo.&#x20;

## **Workflows:**

{% content-ref url="/pages/LWmQLpSHXhiIv2VFoZQd" %}
[Create articles](/api-key-templates/article/create-articles)
{% endcontent-ref %}

{% content-ref url="/pages/FxSHQg5daZQtjER8RLT5" %}
[Create article supplier](/api-key-templates/article/create-article-supplier)
{% endcontent-ref %}


# Create articles

Workflow: REST\_Article\_Import

This workflow allows third parties to create and update articles in Ultimo.&#x20;

The following parameters are used in the request.

| Parameter                 | Description                                                                                                      |
| ------------------------- | ---------------------------------------------------------------------------------------------------------------- |
| Id                        | Id of the article. This parameter is optional.                                                                   |
| ExternalId                | The external identification number. This parameter is optional.                                                  |
| ArticleGroupId            | Id of entity ArticleGroup                                                                                        |
| ChargeRaiseExternalId     | Id of entity ChargeRaiseExternal.                                                                                |
| ChargeRaiseInternalId     | Id of entity ChargeRaiseExternal.                                                                                |
| DataProvider              | DataProvider for article and pricemutation.                                                                      |
| Description               | Description for article.                                                                                         |
| ManufacturerId            | Id of entity Vendor. This parameter is optional.                                                                 |
| MaximumStock              | Maximum stock of the article. This property is optional.                                                         |
| Purchase                  | Purchase (True/False) of the article. This indicates if the article can be purchased. The default value is True. |
| PurchaseLevel             | Purchase level of the article. This parameter is optional.                                                       |
| PurchasePrice             | Purchase price of the article. This parameter is optional.                                                       |
| PurchaseText              | Text for order specifications. This parameter is optional.                                                       |
| RaiseId                   | Id of entity Raise. This parameter is optional.                                                                  |
| RegisterStock             | Register stock (True/False) of the article. Default value is True.                                               |
| ServingOutUnitDescription | Unit description of the article. This parameter is optional.                                                     |
| ShowInWebShop             | Show (True/False). This indicates if the article is available in the webshop.                                    |
| SiteId                    | Id of entity Site. This parameter is optional.                                                                   |
| Text                      | Text for article specifications. This parameter property is optional.                                            |
| VatId                     | Id of entity VAT. This property is optional.                                                                     |

### Functional details

The article workflow can be used to create and update articles. The properties Id and ExternalId are both optional. If left empty then articles will be created using the autokey functionality.

For updating the workflow will search on Id and ExternalId, first on Id and then on ExternalId. If the article is not found a new one will be created.

Price mutations will be created when the provided purchase price differs from the current one.&#x20;

## Technical details

### Basic URL (POST):

`https://customer.ultimo.com/api/V1/Action/REST_Article_Import`

Header data:

| Parameter            | Description                                               |
| -------------------- | --------------------------------------------------------- |
| ApiKey               | Request an API key at (application manager or consultant) |
| ApplicationElementId | Fixed value “363b35dc-309a-4947-919b-b5e1bd2b5c47"        |

### Body (example):

```csharp
{
   "ExternalId":"0403",
   "ArticleGroupId":"014",
   "ChargeRaiseExternalId":null,
   "ChargeRaiseInternalId":null,
   "DataProvider":null,
   "Description":"Toner copier",
   "Id":"",
   "ManufacturerId":null,
   "MaximumStock":20.00,
   "Purchase":true,
   "PurchaseLevel":10.00,
   "PurchasePrice":104.86000,
   "PurchaseText":null,
   "RaiseId":null,
   "RegisterStock":true,
   "ServingOutUnitDescription":"Box",
   "ShowInWebShop":true,
   "SiteId":"01",
   "Text":null,
   "VatId":"1"
}
```

### Normal response:

{% hint style="success" %}
Status: 200 OK
{% endhint %}

```csharp
{
    "properties": {}
}
```

### Response when the action is not allowed:

{% hint style="danger" %}
Status: 400 Bad Request
{% endhint %}

```csharp
{
   "message":"The article could not be created or updated.\nCause: ExternalId is not provided.",
   "type":3,
   "code":"9900"
}
```

### Response when the API-key is invalid:

{% hint style="danger" %}
Status: 401 Unauthorized
{% endhint %}

```csharp
{
    "message": "Missing API key",
    "code": "MissingApikey"
}
```


# Create article supplier

Workflow: REST\_ArticleVendor\_Import

This workflow allows third parties to add or update supplier information related to articles in Ultimo. Records will be created in the entity ArticleVendor.&#x20;

The following parameters are used in the request.

| ArticleId                       | The Id of the article. This parameter is required.                                                                       |
| ------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
| VendorId                        | The Id of the entity Vendor. This parameter is required.                                                                 |
| ArticleUnitPrice                | Purchase price. Default value is 0. This parameter is optional.                                                          |
| DataProvider                    | The data provider of the record. E.g. the name of a ERP system. This parameter is optional.                              |
| Discount                        | Discount of the article. Default value is 0. This parameter is optional.                                                 |
| ExternalId                      | The external identification of the articlevendor record. This parameter is required.                                     |
| LeadTime                        | Delivery time in days based on supplier calendar. Default value is 0. This parameter is optional.                        |
| MinimumPurchaseQuantity         | Minimum ordered quantity. Default value is 1. This parameter is optional.                                                |
| Preference                      | Set vendor as preferred supplier. Allowed values: True or False. This parameter is optional. The default value is False. |
| PurchaseQuantityCeilSignificant | Order quantity per unit. Default value is 1. This parameter is optional.                                                 |
| QuantityPurchaseUnit            | Ordered quantity sliding scale. Default value is 0. This parameter is optional.                                          |
| UnitDescription                 | Description of the Unit. This parameter is optional.                                                                     |
| PurchaseCode                    | Article order number for the supplier. This parameter is optional.                                                       |

## Technical details

### Basic URL (POST):

`https://customer.ultimo.com/api/V1/Action/REST_ArticleVendor_Import`

Header data:

| Parameter            | Description                                               |
| -------------------- | --------------------------------------------------------- |
| ApiKey               | Request an API key at (application manager or consultant) |
| ApplicationElementId | Fixed value “09655272-a56b-457b-ae3d-3fbaf1ebd9c5”        |

### Body (example):

```csharp
{
   "ArticleId":"0001",
   "VendorId":"2011",
   "ArticleUnitPrice":8.00000,
   "DataProvider":"ERP",
   "Discount":5.00,
   "ExternalId":null,
   "LeadTime":14,
   "MinimumPurchaseQuantity":1.00,
   "Preference":false,
   "PurchaseQuantityCeilSignificant":10.00,
   "QuantityPurchaseUnit":1.00,
   "UnitDescription":"Box",
   "PurchaseCode":"8001",
}
```

### Normal response:

{% hint style="success" %}
Status: 200 OK
{% endhint %}

```csharp
{
    "properties": {}
}
```

### Response when the action is not allowed:

{% hint style="danger" %}
Status: 400 Bad Request
{% endhint %}

```csharp
{
    "message": "Item supplier cannot be created or updated.\r\nCause: Article and/or vendor is not provided.",
    "type": 3,
    "code": "3399"
}
```

### Response when the API-key is invalid:

{% hint style="danger" %}
Status: 401 Unauthorized
{% endhint %}

```csharp
{
    "message": "Missing API key",
    "code": "MissingApikey"
}
```


# IoT

:white\_check\_mark:Professional :white\_check\_mark:Premium :white\_check\_mark:Enterprise

The Ultimo IoT connector enables third parties to provide measurements (i.e. based on sensor data) to Ultimo. There are three different ways to connect to Ultimo:

1. [REST](/api-key-templates/iot/rest)
2. [HTTP POST](/api-key-templates/iot/http-post-xml) \*
3. [SOAP](/api-key-templates/iot/soap-xml) \*

*\* Not available in Professional*

After importing a measurement, various validations and business rules will be executed in Ultimo.

Ultimo is not suitable for *raw sensor data*, so it is not allowed to directly connect sensors to Ultimo or send unfiltered sensor data to Ultimo. The Ultimo IoT connector is intended to connect with a server or platform that collects and filters / aggregates data from sensors.

![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MZmRVbbu75Ds8MiWx_F%2F-MZmVU2bTM66TBOVmmoR%2F-MZmWkeM3bKhAvZX1PPv%2Fiot.png?alt=media\&token=d259c8b8-4f72-4ce6-9423-4d35328501e5)

To avoid an overload of sensor data, there is a maximum limit of measurements. When processing measured values, Ultimo will check if there are no more than 3 days with more than 25 measured values in the past 10 days.

It is also possible to create new measurement points with the REST interface.

## Functional details

Objects or meters can have measurement points. These can be stored on an equipment or a process function. Each measurement should refer to an existing measurement point (for an equipment or process function).

![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MZmRVbbu75Ds8MiWx_F%2F-MZmVU2bTM66TBOVmmoR%2F-MZmWqwAjhlCWcigEM_U%2Fiot-flow.png?alt=media\&token=a5537a0e-0ec7-4601-b014-7781983d776d)

A measurement contains:

| Parameter                        | Description                                                                                                                                                                                                                                                                                                                                                                                                            |
| -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| EquipmentId or ProcessFunctionId | <p>Use an <em>EquipmentId</em> or <em>ProcessFunctionId</em> depending on where the object is stored (internal Ultimo ID).</p><p>It is recommended to use a Meter, which is an Equipment. This property is required.</p>                                                                                                                                                                                               |
| MeasurementPointId               | The code of the measurement point (int. Ultimo ID).                                                                                                                                                                                                                                                                                                                                                                    |
| Date                             | <p>The date and time of the measurement. This property is required. Allowed formats:</p><ul><li>yyyy-MM-dd hh:mm:ss (i.e. 2018-08-21 15:21:59)</li><li>UTC: yyyy-MM-ddThh:mm:ssZ (i.e. 2018-08-20T15:17:59Z)</li></ul>                                                                                                                                                                                                 |
| Value or Delta                   | <p>Use <em>Value</em> when the measured value should be interpreted as an absolute value. Examples: a temperature or the total running hours of a machine.</p><p>Use <em>Delta</em> when the measured value is a difference relative to the previous measurement and it is desired to be cumulated in Ultimo. Example: the running hours since the last measurement.<br>Note: Delta is only available in REST-API.</p> |
| Text                             | Additional information or remarks for the measurement.                                                                                                                                                                                                                                                                                                                                                                 |

With the REST interface it is possible to create a new measurement point. When the new measurement point is the first measurement point for an equipment or process function, this will be the default measurement point.

A measurement point contains:

| Parameter                        | Description                                                                                                                                                                                   |
| -------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| EquipmentId or ProcessFunctionId | Use an *EquipmentId* or *ProcessFunctionId* depending on where the object is stored (internal Ultimo ID). It is recommended to use a Meter, which is an Equipment. This property is required. |
| MeasurementPointId               | The new code of the measurement point (internal Ultimo ID). This property is required.                                                                                                        |
| Description                      | Additional description for the measurement point. This property is required.                                                                                                                  |


# REST

### Playground

{% hint style="info" %}
Swagger documentation for this connector is available on our playground environment. It is also possible to test the connector on this page, use the parameters below to try it out!
{% endhint %}

| Parameter          | Description                                                                                     |
| ------------------ | ----------------------------------------------------------------------------------------------- |
| URL                | <https://devdocs.ultimo.net/docs/index.html?version=v1&apiKey=A655245BECB74A7285B52FB26A9C2ACC> |
| ApiKey             | 0DBFC5A3067F4E7F97CD2808B1C54A1B                                                                |
| EquipmentId        | Use value '00001'                                                                               |
| ProcessFunctionId  | Use value 'N.PRO.02'                                                                            |
| MeasurementPointId | Use value 'DEFAULT' or create one first                                                         |

### Basic URL (POST):

`https://customer.ultimo.com/api/V1/Action/REST_CreateEquipmentMeasurementPoint`

### Header data:

| Parameter            | Description                                               |
| -------------------- | --------------------------------------------------------- |
| ApiKey               | Request an API key at (application manager or consultant) |
| ApplicationElementId | Fixed value “a90b326b-ff33-421a-a3a8-7d674e37ae22”        |

Body (example) with measurement point for equipment:

```csharp
{
 "EquipmentId": "00001",
 "MeasurementPointId": "TEMP",
 "Description": "Description for measurement point"
}
```

## Process function

Create measurement points for a process function

### Basic URL (POST):

`https://customer.ultimo.com/api/V1/Action/REST_CreateProcessFunctionMeasurementPoint`

### Header data:

| Parameter            | Description                                               |
| -------------------- | --------------------------------------------------------- |
| ApiKey               | Request an API key at (application manager or consultant) |
| ApplicationElementId | Fixed value “59275fff-2bcb-425c-a933-90513542c212”        |

Body (example) with measurement point for process function:

```csharp
{
 "ProcessFunctionId": "00001",
 "MeasurementPointId": "TEMP",
 "Description": "Description for measurement point"
}
```

## Equipment measurement point

Measurements for an equipment measurement point

### Basic URL (POST):

`https://customer.ultimo.com/api/V1/Action/REST_EquipmentMeasurementPointValue_Import`

### Header data:

| Parameter            | Description                                               |
| -------------------- | --------------------------------------------------------- |
| ApiKey               | Request an API key at (application manager or consultant) |
| ApplicationElementId | Fixed value “e57ecb14-6c6f-46ff-fbf7-e65c22a3df61”        |

### Body (example) with absolute value:

```csharp
{
    "EquipmentId": "00001",
    "MeasurementPointId": "TEMP",
    "Date": "2018-08-20 15:57:59",
    "Value": "22",
    "Text": "Some remarks for measurement"
}
```

### Body (example) with delta:

```csharp
{
    "EquipmentId": "00001",
    "MeasurementPointId": "RUNHOURS",
    "Date": "2018-08-21 15:17:59",
    "Delta": "5",
    "Text": "Some remarks for measurement"
}
```

## Process function measurement point

Measurements for a process function measurement point

### Basic URL (POST):

`https://customer.ultimo.com/api/V1/Action/REST_ProcessFunctionMeasurementPointValue_Import`

### Header data:

| Parameter            | Description                                               |
| -------------------- | --------------------------------------------------------- |
| ApiKey               | Request an API key at (application manager or consultant) |
| ApplicationElementId | Fixed value “7dc5815c-1cce-470f-9656-02113d13e635”        |

### Body (example) with absolute value:

```csharp
{
    "ProcessFunctionId": "0001",
    "MeasurementPointId": "RUNHOURS",
    "Date": "2018-08-21 15:17:59",
    "Value": "25482",
    "Text": "Some remarks for measurement"
}
```

### Body (example) with delta:

```csharp
{
    "ProcessFunctionId": "0001",
    "MeasurementPointId": "RUNHOURS",
    "Date": "2018-08-21 15:17:59",
    "Delta": "5",
    "Text": "Some remarks for measurement"
}
```

### Responses

When the measurement or measurement point is accepted:

{% hint style="success" %}
Status: 200 OK
{% endhint %}

```csharp
{
    "properties": {} 
}
```

### When the measurement is rejected:

{% hint style="danger" %}
Status: 400 Bad Request
{% endhint %}

```csharp
{
    "message": "Value 5 measured on 21-8-2018 15:17 cannot be processed.\r\nCause: measurement point '000011222 - DEFAULT' was not found.",
    "type": 3, 
    "code": "3095" 
}
```

### When the measurement point is rejected:

{% hint style="danger" %}
Status: 400 Bad Request
{% endhint %}

```csharp
{
 "message": "Measurement point cannot be added.\r\nCause:equipment '000011222' was not found.",
 "type": 3,
 "code": "3395"
}
```

```csharp
{
 "message": "Measurement point TEMP cannot be added.\r\nCause: equipment 00001 has already been linked to the selected measurement point.",
 "type": 3,
 "code": "0687"
}
```

### When the API-key is invalid (for a measurement or a measurement point):

{% hint style="danger" %}
Status: 401 Unauthorized
{% endhint %}

```csharp
{
    "message": "The API key is invalid",
    "code": "InvalidApiKey"
}
```

### Other:

{% hint style="danger" %}
Status: 500 Internal Server Error
{% endhint %}

```csharp
{
    "message": "An error has occured", 
    "exceptionType": "System.FormatException", 
    "detailMessage": "Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xx)",  
    "type": 1, 
    "stackTrace": " at System.Guid.TryParseGuidMithDashes (....)”,
    "code": "InternalServerError" 
}
```


# HTTP POST

## Basic URL (POST):

`https://customer.ultimo.com/webservices/connector.ashx`

## Parameters:

| Parameter  | Description                                           |
| ---------- | ----------------------------------------------------- |
| username   | Username that has the rights to use the IoT-connector |
| password   | Password of the user                                  |
| action     | Fixed value “import”                                  |
| importName | Fixed value “IOT-MEASUREMENT”                         |

Note: escape a character when using special characters in the URL.

## Example:

`https://customer.ultimo.com/webservices/connector.ashx?userName=user1&password=Passw0rd%21&action=import&importName=IOT-MEASUREMENT`

The body can contain multiple measurements:

```csharp
<?xml version="1.0" encoding="utf-8"?>
<Measurements>
    <Measurement>
        <EquipmentId>00001</EquipmentId>
        <MeasurementPointId>TEMP</MeasurementPointId>
        <Value>22</Value>
        <Date>2018-08-20T15:17:59Z</Date>
        <Text>Some remarks for measurement</Text>
    </Measurement>
    <Measurement>
        <ProcessFunctionId>0001</ProcessFunctionId>
        <MeasurementPointId>RUNHOURS</MeasurementPointId>
        <Value>22</Value>
        <Date>2018-08-21 15:17:59</Date>
        <Text>Some remarks for measurement</Text>
    </Measurement>
</Measurements>
```

The response will contain the imported measurements in the internal Ultimo data structure, including the generated IDs. When a measurement is imported successfully, the attribute *Action* is “Insert”. Example response:

{% hint style="success" %}
Status: 200 OK
{% endhint %}

```cpp
<?xml version="1.0" encoding="utf-8"?>
<Data>
    <Object Type="EquipmentMeasurementPointValue" Action="Insert">
        <Property Name="Id.EquipmentMeasurementPoint.Id.Equipment.Id" Value="00001" />
        <Property Name="Id.EquipmentMeasurementPoint.Id.Id" Value="TEMP" />
        <Property Name="Id.LineId" Value="00000000000001" />
    </Object>
    <Object Type="ProcessFunctionMeasurementPointValue" Action="Insert">
        <Property Name="Id.ProcessFunctionMeasurementPoint.Id.Id" Value="RUNHOURS" />
        <Property Name="Id.ProcessFunctionMeasurementPoint.Id.ProcessFunction.Id" Value="0001" />
        <Property Name="Id.LineId" Value="00000000000001" />
    </Object>
</Data>
```

When the measurement is not accepted by the Ultimo business rules or an error occurs during the processing of the measurement, the *Action* attribute will have the value “Error”. Example of a response that contains errors:

{% hint style="success" %}
Status: 200 OK
{% endhint %}

```csharp
<?xml version="1.0" encoding="utf-8"?>
<Data>
    <Object Type="EquipmentMeasurementPointValue" Action="Error">
        <Property Name="ErrorMessage" Value="Cannot import entity 'EquipmentMeasurementPointValue' 'ExternalId': '00001-DEFAULT-2018-08-20T15:17:59Z-232' 'Id.EquipmentMeasurementPoint.Id.Equipment.Id': '00001' 'Id.EquipmentMeasurementPoint.Id.Id': 'DEFAULT' 'Date': '2018-08-20T15:17:59Z' 'Value': '232' 'Text': 'Some remarks for measurement' 'Status': 'EquipmentMeasurementPointValueStatus.ToProcess' . Error while executing workflow 'EquipmentMeasurementPointValue_PostImport'. Message: EquipmentMeasurementPointValue_CheckIfAnotherValueExistsForDateTime Measurement value for measurementpoint DEFAULT of equipment Heftruck 1 type 35  cannot be processed.&#xD;&#xA; Cause: measurement value '(22)' has already been specified for 08/21/2018 03:17." />
        <Property Name="ShortErrorMessage" Value="Error while executing workflow 'EquipmentMeasurementPointValue_PostImport'. Message: EquipmentMeasurementPointValue_CheckIfAnotherValueExistsForDateTime Measurement value for measurementpoint DEFAULT of equipment Heftruck 1 type 35  cannot be processed.&#xD;&#xA;Cause: measurement value '(22)' has already been specified for 08/21/2018 03:17." />
    </Object>
</Data>
```

When the connector cannot be reached at all (i.e. when username or password is incorrect), the format of the error message will be as follows:

{% hint style="danger" %}
Status: 500 Internal Server Error
{% endhint %}

```markup
Ultimo.Framework.Core.Tools.GeneralException: Username or password not correct, login failed. 
    at Ultimo.Web.Core.Authentication.ConnectorLogOn(String userName, String password) 
    at Ultimo.Web.SiteRoot.WebServices.Connector.System.Web.IHttpNandler.ProcessRequest(HttpContext context)
```


# SOAP

## WSDL:

`https://customer.ultimo.com/webservices/soapconnector.svc?wsdl`

## The body contains the following information:

| Parameter  | Description                                           |
| ---------- | ----------------------------------------------------- |
| importName | Fixed value “IOT-MEASUREMENT”                         |
| username   | Username that has the rights to use the IoT-connector |
| password   | Password of the user                                  |
| importData | The measurements XML in a \<!\[CDATA\[ ..]]> block    |

## Example:

```markup
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/ xmlns:tem=“http://tempuri.org/>
        <soapenv:Header/>
                <soapenv:Body>
                        <tem:ImportData>

                        <tem:importName>IOT-MEASUREMENT</tem:importName>

                        <tem:userName>userl</tem:userName> 

                        <tem:password>PasswOrd!</tem:password>
                        <tem:importData>
                                <![CDATA[<Measurements>
                                    <Measurement>
                                            <EquipmentId>00001</EquipmentId>
                                            <MeasurementPointId>TEMP</MeasurementPointId>
                                            <Value>22</Value>
                                            <Date>2018-08-20715:18:59Z</Date>
                                            <Text>Some remarks for measurement</Text>
                                    </Measurement>
                                    <Measurement>
                                            <ProcessFunctionId>0001</ProcessFunctionId>
                                            <MeasurementPointId>RUNHOURS</MeasurementPointId>
                                            <Value>22</Value>
                                            <Date>2018-08-21 15:19:59</Date>
                                            <Text>Some remarks for measurement</Text>
                                    </Measurement>
                                </Measurements>]]> 
            </tem:importData>
        </tem:ImportData>
    </soapenv:Body>
</soapenv:Envelope>
```

The response will contain the imported measurements in the internal Ultimo data structure, including the generated IDs. When a measurement is imported successfully, the attribute *Action* is “Insert”. Example response:

{% hint style="success" %}
Status: 200 OK
{% endhint %}

```markup
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body>
        <ImportDataResponse xmlns="http://tempuri.org/">
            <ImportDataResult>
                <![CDATA[<?xml version="1.0" encoding="utf-16"?> 
                    <Data> 
                        <Object Type="EquipmentMeasurementPointValue" Action="Insert"> 
                            <Property Name="Id.EquipmentMeasurementPoint.Id.Equipment.Id" Value="00001" /> 
                            <Property Name="Id.EquipmentMeasurementPoint.Id.Id" Value="TEMP" /> 
                            <Property Name="Id.LineId" Value="00000000000003" /> 
                        </Object> 
                        <Object Type="ProcessFunctionMeasurementPointValue" Action="Insert"> 
                            <Property Name="Id.ProcessFunctionMeasurementPoint.Id.Id" Value="RUNHOURS" /> 
                            <Property Name="Id.ProcessFunctionMeasurementPoint.Id.ProcessFunction.Id" Value="0001" /> 
                            <Property Name="Id.LineId" Value="00000000000002" /> 
                        </Object> 
                    </Data>]]>
            </ImportDataResult>
        </ImportDataResponse>
    </s:Body>
</s:Envelope>
```

When the measurement is not accepted by the Ultimo business rules or an error occurs during the processing of the measurement, the *Action* attribute will have the value “Error”. Example of a response that contains errors:

{% hint style="success" %}
Status: 200 OK
{% endhint %}

```markup
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body>
        <ImportDataResponse xmlns="http://tempuri.org/">
            <ImportDataResult>
                <![CDATA[<?xml version="1.0" encoding="utf-16"?> 
                    <Data> 
                        <Object Type="EquipmentMeasurementPointValue" Action="Error">
                            <Property Name="ErrorMessage" Value="Cannot import entity 'EquipmentMeasurementPointValue' 'ExternalId': '00001-DEFAULT-2018-08-20T15:17:59Z-232' 'Id.EquipmentMeasurementPoint.Id.Equipment.Id': '00001' 'Id.EquipmentMeasurementPoint.Id.Id': 'DEFAULT' 'Date': '2018-08-20T15:17:59Z' 'Value': '232' 'Text': 'Some remarks for measurement' 'Status': 'EquipmentMeasurementPointValueStatus.ToProcess' . Error wile executing workflow 'EquipmentMeasurementPointValue_PostImport'. Message: EquipmentMeasurementPointValue_CheckIfAnotherValueExistsForDateTime Measurement value for measurementpoint DEFAULT of equipment Heftruck 1 type 35  cannot be processed.&#xD;&#xA; Cause: measurement value '(22)' has already been specified for 08/21/2018 03:17." />
                            <Property Name="ShortErrorMessage" Value="Error wile executing workflow 'EquipmentMeasurementPointValue_PostImport'. Message: EquipmentMeasurementPointValue_CheckIfAnotherValueExistsForDateTime Measurement value for measurementpoint DEFAULT of equipment Heftruck 1 type 35  cannot be processed.&#xD;&#xA;Cause: measurement value '(22)' has already been specified for 08/21/2018 03:17." />
                        </Object>
                    </Data>]]>
            </ImportDataResult>
        </ImportDataResponse>
    </s:Body>
</s:Envelope>
```

When the connector cannot be reached at all (i.e. when username or password is incorrect), the format of the error message will be as follows:

{% hint style="danger" %}
Status: 500 Internal Server Error
{% endhint %}

```markup
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/enveloper>
    <s:Body>
            <s:Fault>
            <faultcode>s:ImportData</faultcode>
            <faultstring xml:lang="nl-NL">Username or password incorrect, login failed.</faultstring>
            <detail>
                <ConnectorErrorMessage xmlns="http://schemas.datacontract.org/(...)>
                <Message>Username or password incorrect, login failed.</Message>
                </ConnectorErrorMessage>
            </detail>
        </s:Fault>
    </s:Body>
</s:Envelope>
```


# Reservations

:white\_check\_mark:Professional :white\_check\_mark:Premium :white\_check\_mark:Enterprise

### Playground

{% hint style="info" %}
Swagger documentation for this connector is available on our playground environment. It is also possible to test the connector on this page, use the parameters below to try it out!
{% endhint %}

| Parameter   | Description                                                                                       |
| ----------- | ------------------------------------------------------------------------------------------------- |
| URL         | <https://devdocs.ultimo.net/docs/index.html?version=v1&apiKey=F663C63420D14A4886D0A7951805B6EC>   |
| ApiKey      | FC1555BA3F5C4C329155B5ADAC2E8AB0                                                                  |
| ApplicantId | Use value 'ULTIMO'                                                                                |
| ExternalId  | Leave empty                                                                                       |
| SpaceId     | Use value '003.0.10'                                                                              |
| UltimoId    | Create a new reservation or get current reservations for space '003.0.10' to retrieve an UltimoId |

### Functional details

There are basically two flows in the connector. One flow sends data to Ultimo and one flow gets data from UltimoThere are basically two flows in the connector. One flow sends data to Ultimo and one flow gets data from Ultimo. Ultimo always acts as a server in this regard. The flows are depicted below:

![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MZmRVbbu75Ds8MiWx_F%2F-MZmX39I3Nj1SdzwsFVL%2F-MZmXQAGPWJZo-JjRkmV%2FRest_res.png?alt=media\&token=42cc0701-2caa-4947-8ee2-0fdcc0b3d0e7)

## **Reservation (RESTInterfaceReservations) with workflows:**

{% content-ref url="/pages/-MZmRmTCn3EXXys-D-Ff" %}
[Create reservation](/api-key-templates/reservations/create-reservation)
{% endcontent-ref %}

{% content-ref url="/pages/-MZmRmTDT2afXz-c65Kd" %}
[Update reservation](/api-key-templates/reservations/update-reservation)
{% endcontent-ref %}

{% content-ref url="/pages/-MZmRmTExO50jdNxqNfz" %}
[Cancel reservation](/api-key-templates/reservations/cancel-reservation)
{% endcontent-ref %}

{% content-ref url="/pages/-MZmRmTFKnL4k6AOF6sU" %}
[Get reservations](/api-key-templates/reservations/get-reservations)
{% endcontent-ref %}


# Create reservation

This workflow allows third parties to send a new reservation for a specific room with specified times.

The following parameters are used in the request. These are all required.

| **Parameter** | **Description**                                                                                                                                                                                        |
| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| ExternalId    | This is the Id used for the reservation in the system of the third party.                                                                                                                              |
| Description   | The description of the reservation for the room.                                                                                                                                                       |
| SpaceId       | This is the internal Ultimo Id of a room/space (entity).                                                                                                                                               |
| StartTime     | <p>The start time (datetime) of reservation.</p><p>Allowed formats:</p><ul><li>yyyy-MM-dd hh:mm:ss (i.e. 2018-08-21 15:21:59)</li><li>UTC: yyyy-MM-ddThh:mm:ssZ (i.e. 2018-08- 20T15:17:59Z)</li></ul> |
| EndTime       | <p>The end time (datetime) of reservation.</p><p>Allowed formats:</p><ul><li>yyyy-MM-dd hh:mm:ss (i.e. 2018-08-21 15:21:59)</li><li>UTC: yyyy-MM-ddThh:mm:ssZ (i.e. 2018-08- 20T15:17:59Z)</li></ul>   |
| ApplicantId   | The Id from the applicant of the reservation (entity employee in Ultimo).                                                                                                                              |

When these parameters are properly filled in, Ultimo will give a HTTP 200 response with the following properties:

| Parameter | Description                                                                |
| --------- | -------------------------------------------------------------------------- |
| UltimoId  | The internal Ultimo Id of a reservation for the room (ReservationLine Id). |

## Technical details

Basic URL (POST):

`https://customer.ultimo.com/api/V1/Action/REST_CreateReservation`

Header data:

| Parameter            | Description                                               |
| -------------------- | --------------------------------------------------------- |
| ApiKey               | Request an API key at (application manager or consultant) |
| ApplicationElementId | Fixed value “0167a94a-5dae-4efe-bf13-029a47728b97”        |

Body (example):

```csharp
{
    "ExternalId": "DEMO01",
    "Description": "Team meeting Front office",
    "SpaceId": "C-25",
    "StartTime": "2021-06-14 12:00:00",
    "EndTime": "2021-06-14 13:00:00",
    "Applicant": "ULTIMO"
}
```

### Normal response:

{% hint style="success" %}
Status: 200 OK
{% endhint %}

```csharp
{
    "Properties": {
        "UltimoId": "00000006712",
    }
}
```

### Response when the action is not allowed:

{% hint style="danger" %}
Status: 400 Bad Request
{% endhint %}

```csharp
{
    "message": "Room reservation cannot be requested or processed.\r\nCause: meeting room is not available.",
    "type": "3",
    "code": "1015"
}
```

In this case it is not allowed to make a reservation for a room that already has a reservation at the specified time. Ultimo will not process this action.

### Response when the API-key is invalid:

{% hint style="danger" %}
Status: 401 Unauthorized
{% endhint %}

```csharp
{
    "message": "Missing API key",
    "code": "MissingApiKey"
}
```


# Update reservation

This workflow allows third parties to update an existing reservation for a specific room with specified times.

The following parameters are used in the request. These are all required.

| Parameter | Description                                                                                                                                                                                            |
| --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| UltimoId  | The internal Ultimo Id of a reservation for the room (ReservationLine Id).                                                                                                                             |
| StartTime | <p>The start time (datetime) of reservation.</p><p>Allowed formats:</p><ul><li>yyyy-MM-dd hh:mm:ss (i.e. 2018-08-21 15:21:59)</li><li>UTC: yyyy-MM-ddThh:mm:ssZ (i.e. 2018-08- 20T15:17:59Z)</li></ul> |
| EndTime   | <p>The end time (datetime) of reservation.</p><p>Allowed formats:</p><ul><li>yyyy-MM-dd hh:mm:ss (i.e. 2018-08-21 15:21:59)</li><li>UTC: yyyy-MM-ddThh:mm:ssZ (i.e. 2018-08- 20T15:17:59Z)</li></ul>   |

## Technical details

Basic URL (POST):

`https://customer.ultimo.com/api/V1/Action/REST_UpdateReservation`

Header data:

| Parameter            | Description                                              |
| -------------------- | -------------------------------------------------------- |
| ApiKey               | Request an API key at (application manager or consultant |
| ApplicationElementId | Fixed value “3736d834-fa5e-4edc-9abd-f38962ff8afd”       |

Body (example):

```csharp
{
    "UltimoId": "00000006712",
    "StartTime": "2021-06-14 12:00:00",
    "EndTime": "2021-06-14 13:00:00"
}
```

### Normal response:

{% hint style="success" %}
Status: 200 OK
{% endhint %}

```csharp
{
    "properties": {}
}
```

### Responses when the action is not allowed:

{% hint style="danger" %}
Status: 400 Bad Request
{% endhint %}

```csharp
{
    "message": "Room reservation cannot be requested or processed.\r\nCause: Meeting room 2 is not available.",
    "type": "3",
    "code": "1015"
}
```

In this case it is not allowed to make a reservation for a room that already has a reservation at the specified time. Ultimo will not process this action.

{% hint style="danger" %}
Status: 400 Bad Request
{% endhint %}

```csharp
{
    "message": "Room reservation cannot be modified.\r\nCause: Room reservation is in the past.",
    "type": "3",
    "code": "1166"
}
```

In this case it is not allowed to modify a room reservation that lies in the past. Ultimo will not process this action.

### Response when the API-key is invalid:

{% hint style="danger" %}
Status: 401 Unauthorized
{% endhint %}

```csharp
{
    "message": "Missing API key",
    "code": "MissingApiKey"
}
```


# Cancel reservation

This workflow allows third parties to cancel an existing reservation for a specific room with specified times.

The following required parameter is used in the request.

| Parameter | Description                                           |
| --------- | ----------------------------------------------------- |
| UltimoId  | The internal Ultimo Id of a reservation for the room. |

## Technical details

Basic URL (POST):

`https://customer.ultimo.com/api/V1/Action/REST_CancelReservation`

Header data:

| ApiKey               | Description                                               |
| -------------------- | --------------------------------------------------------- |
| ApiKey               | Request an API key at (application manager or consultant) |
| ApplicationElementId | Fixed value “5d5a10ee-7b14-4dd4-8683-33822ea56f12”        |

Body (example):

```csharp
{
    "UltimoId": "00000006712"
}
```

### Normal response:

{% hint style="success" %}
Status: 200 OK
{% endhint %}

```csharp
{
    "properties": {}
}
```

### Response when the API-key is invalid:

{% hint style="danger" %}
Status: 401 Unauthorized
{% endhint %}

```csharp
{
    "message": "Missing API key",
    "code": "MissingApiKey"
}
```


# Get reservations

This workflow allows third parties to get reservations for a specific room during a specified timespan from Ultimo.

The following parameters are used in the request. These are all required.

| Parameter | Description                                                                                                                                                                                                      |
| --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| SpaceId   | This is the internal Ultimo Id of a room/space (entity).                                                                                                                                                         |
| From      | <p>The start time (datetime) of the specified timespan.</p><p>Allowed formats:</p><ul><li>yyyy-MM-dd hh:mm:ss (i.e. 2018-08-21 15:21:59)</li><li>UTC: yyyy-MM-ddThh:mm:ssZ (i.e. 2018-08-20T15:17:59Z)</li></ul> |
| Till      | The end time (datetime) of the specified timespan. The allowed formats are the same as the ones specified above.                                                                                                 |

When these parameters are properly filled in, Ultimo will give a HTTP 200 response with the following properties:

| Parameter                         | Description                                                                |
| --------------------------------- | -------------------------------------------------------------------------- |
| UltimoId                          | The internal Ultimo Id of a reservation for the room (ReservationLine Id). |
| Description                       | The description of the reservation for the room.                           |
| ApplicantId                       | The Id from the applicant of the reservation.                              |
| ApplicantName                     | The name of the applicant of the reservation.                              |
| StartTime                         | The start time of the reservation for the room.                            |
| EndTime                           | The end time of the reservation for the room.                              |
| StartTimeIncludingPreparationTime | The start time including the preparation time for the room.                |
| EndTimeIncludingCleanupTime       | The end time including the cleanup time for the room.                      |
| Status                            | The status of the reservation.                                             |

## Technical details

Basic URL (POST):

<https://customer.ultimo.com/api/V1/Action/REST_GetReservationsForSpace>

Header data:

| Parameter            | Description                                               |
| -------------------- | --------------------------------------------------------- |
| ApiKey               | Request an API key at (application manager or consultant) |
| ApplicationElementId | Fixed value “860ea091-4d76-47d9-a733-c3bb18440dde”        |

Body (example):

```csharp
{
    "From": "2021-06-13 12:00:00",
    "Till": "2021-06-14 13:00:00",
    "SpaceId": "C-25"
}
```

### Normal response:

{% hint style="success" %}
Status: 200 OK
{% endhint %}

```csharp
{
    "properties": {
        "Output": {
            "collection": [
                {
                    "UltimoId": "00000006710",
                    "Description": "Team meeting Front office",
                    "ApplicantId": "ULTIMO",
                    "ApplicantName": "Fasse, J.",
                    "StartTime": "2021-04-20T08:00:00.000000+12:00",
                    "EndTime": "2021-04-20T09:00:00.000000+12:00",
                    "StartTimeIncludingPreparationTime": "2021-04-20T08:00:00.000000+12:00",
                    "EndTimeIncludingCleanupTime": "2021-04-20T09:00:00.000000+12:00",
                    "Status": "Processed"
                }
            ]
        }
    }
}
```

### Response when the API-key is invalid:

{% hint style="danger" %}
Status: 401 Unauthorized
{% endhint %}

```csharp
{
    "message": "Missing API key",
    "code": "MissingApiKey"
}
```


# Track & Trace

:white\_check\_mark:Professional :white\_check\_mark:Premium :white\_check\_mark:Enterprise

{% hint style="info" %}
Swagger documentation for this connector is available on our playground environment. It is also possible to test the connector on this page, use the parameters below to try it out.
{% endhint %}

| Parameter       | Description                                                                                          |
| --------------- | ---------------------------------------------------------------------------------------------------- |
| URL             | <https://devdocs.ultimo.net/docs/index.html?version=v1&apiKey=7359c7be836f4a899b3f48b9e5240faf>      |
| ApiKey          | FC1555BA3F5C4C329155B5ADAC2E8AB0                                                                     |
| DynamicLocation | This can be a string value. Example: "Zone -  0001"                                                  |
| EquipmentId     | The Id of equipment. It is possible to use Equipment from every context (e.g., Medical Instruments). |
| ExternalId      | The external identification number of the entity Equipment. The API needs ExternalId or EquipmentId. |
| SpaceId         | This is the internal Ultimo Id of a room/space (entity).                                             |

## Functional details

The main goal of the connector is to receive and update information about the location of an asset. Other connectors can be used to create jobs or retrieve asset information. Three fields are added to the equipment table; Enable track and trace, Location and Last synchronisation date. The first one is a checkbox that indicates if the asset is being tracked. The connector will only update assets of which track and trace is enabled.

Ultimo is not suitable for *raw sensor data*, so it is not allowed to directly connect sensors to Ultimo or send unfiltered sensor data to Ultimo. The Track & Trace connector is intended to connect with a server or platform that collects and filters data from sensors. We expect the server or platform to only send relevant location data changes to Ultimo. In addition, the general limits and quotas of the Ultimo API must be respected.

#### Update location or space field in Ultimo <a href="#track-and-trace-id-updatelocationorspacefieldinultimo" id="track-and-trace-id-updatelocationorspacefieldinultimo"></a>

The external application can update the location in Ultimo. It's up to the external application when the synchronisation will take place and which field will be updated. The connector can be used by the external application. The REST API can also be used to update the space field.

#### Last synchronisation date <a href="#track-and-trace-id-lastsynchronisationdate" id="track-and-trace-id-lastsynchronisationdate"></a>

This field will be updated by Ultimo when the connector is used to update an asset.

#### Open Track & Trace application <a href="#track-and-trace-id-opentrack-and-traceapplication" id="track-and-trace-id-opentrack-and-traceapplication"></a>

It's possible to open the external application. The button 'Open external application' is available on the equipment screens. The URL can be set in the AET settings. In PerformanceFlow it can be used to point the location on a map.

## Technical details

### Basic URL (POST):

`https://customer.ultimo.com/api/V1/Action/REST_Equipment_UpdateTrackAndTraceLocation`

Header data:

| Parameter            | Description                                               |
| -------------------- | --------------------------------------------------------- |
| ApiKey               | Request an API key at (application manager or consultant) |
| ApplicationElementId | Fixed value: “32909ddd-068d-4a76-9f31-ba69bf7cf3ec”       |

### Body (example response)

```json
{
  "DynamicLocation": "Zone-00001",
  "EquipmentId": "00001",
  "SpaceId": "C-38"
}
```

{% hint style="success" %}
Status: 200 OK
{% endhint %}

```csharp
{
    "properties": {}
}
```

### Response when the action is not allowed:

{% hint style="danger" %}
Status: 400 Bad Request
{% endhint %}

```javascript
{
    "message": "The import of data cannot be executed. \r\nCause: Equipment record with Id '00001' cannot be found.",
    "type": 3,
    "code": "3524"
}
```

```javascript
{   "message": "The import of data cannot be executed. \r\nCause: Space record with Id '00001' cannot be found.",
    "type": 3,
    "code": "3524"
}
```

### Response when the API-key is missing:

{% hint style="danger" %}
Status: 401 Unauthorized
{% endhint %}

```csharp
{
    "message": "Missing API key",
    "code": "MissingApiKey"
}
```

### Response when the API-key is invalid:

{% hint style="danger" %}
Status: 401 Unauthorized
{% endhint %}

```csharp
{
    "message": "The API key is invalid",
    "code": "InvalidApiKey"
}
```


# BI overview

### BI Views and functions <a href="#toc132789780" id="toc132789780"></a>

For our Default Ultimo dashboards powered by Power BI we use special views and functions to get a relevant subset of the ultimo data needed for reporting.

These views and functions can also be used for your company specific BI when using the BI platform

### BI Functions <a href="#toc132789781" id="toc132789781"></a>

Within the views these bi related functions are used to transform data for specific purposes

### BI Views <a href="#toc132789806" id="toc132789806"></a>

The BI views have been divided into four categories: Facts, dimensions, filters and Row level security. Some views for fact, dimensions and filters will contain references to Site, Department or Skill category for Row level security purposes


# BI functions

## Introduction <a href="#toc132789781" id="toc132789781"></a>

Within the views these bi related functions are used to transform data for specific purposes

## applfn\_ConvertToBITimeZone <a href="#toc132789782" id="toc132789782"></a>

Purpose

Support time zones for date fields

#### Settings <a href="#toc132789784" id="toc132789784"></a>

The date will be converted to the timezone set in the application setting “BI Time Zone” (UmmBusinessIntelligenceTimeZoneMapping). When empty date is changed to value without offset.

#### Arguments <a href="#toc135647578" id="toc135647578"></a>

| **Parameter** | **Description**                           |
| ------------- | ----------------------------------------- |
| @cDate        | DateTimeOffSet that needs to be converted |

#### Syntaxis <a href="#toc135647579" id="toc135647579"></a>

Select dba.applfn\_ ConvertToBITimeZone(@cDate)

#### **Example**

Select dba.applfn\_ConvertToBITimeZone(JobSchStartDate) from dba.job

#### Example result <a href="#toc132789785" id="toc132789785"></a>

| **Date**                           | **Result**                         |
| ---------------------------------- | ---------------------------------- |
| 2022-08-08 12:05:00.0000000 +01:00 | 2022-08-08 11:05:00.0000000 +00:00 |

#### Remarks <a href="#toc135647581" id="toc135647581"></a>

* Before RR (2023.05.05) known as applfn\_ConvertToPowerBITimeZone

#### Status <a href="#toc132789786" id="toc132789786"></a>

Available since 2020.R1

## applfn\_GetBIColumnTranslation <a href="#toc135647583" id="toc135647583"></a>

Purpose

Support multilingual fields.

#### Settings <a href="#toc132789790" id="toc132789790"></a>

The description (when multilingual) will be in the language set in the application setting “BI Language” (UmmBusinessIntelligenceLanguage). When empty the application configuration language is used.

#### Arguments <a href="#toc135647586" id="toc135647586"></a>

| **Parameter** | **Description**                                       |
| ------------- | ----------------------------------------------------- |
| @TableName    | Table with te possibly multilingual field             |
| @ColumnName   | Column with te possibly multilingual field            |
| @ColumnValue  | Value that is the result for select column from table |

#### Syntaxis <a href="#toc135647587" id="toc135647587"></a>

Select dba.applfn\_GetBIDescriptionWithId(@TableName, @ColumnName, @ColumnValue)

**Example**

Select dba.applfn\_GetBIDescriptionWithId(N'Equipment', N'EqmDescr', EqmDescr) from dba.equipment

#### Remarks <a href="#toc135647588" id="toc135647588"></a>

* Before RR (2023.05.05) known as applfn\_GetPowerBIColumnTranslation

#### Status <a href="#toc132789791" id="toc132789791"></a>

Available since 2020.R1

## applfn\_GetBIDescriptionWithId <a href="#toc132789792" id="toc132789792"></a>

Purpose

Show the description with additional information to improve filtering and grouping.

* Filtering, make sure it can be filtered on id and description within the same field.
* Grouping, prevent grouping based on description, which some BI tools do automatically.

#### Arguments <a href="#toc135647592" id="toc135647592"></a>

| **Parameter** | **Description**                                       |
| ------------- | ----------------------------------------------------- |
| @TableName    | Table with te possibly multilingual field             |
| @ColumnName   | Column with te possibly multilingual field            |
| @ColumnValue  | Value that is the result for select column from table |
| @Id           | Record id                                             |
| @nStatus      | Record status                                         |

#### Syntaxis <a href="#toc135647593" id="toc135647593"></a>

Select dba.applfn\_ GetBIDescriptionWithId(@TableName, @ColumnName, @ColumnValue, @Id, @nStatus)

**Example**

Select dba.applfn\_GetBIDescriptionWithId(N'Site', N'SitDescr', SitDescr, SitId, SitRecStatus) from dba.Site

#### Example results <a href="#toc135647594" id="toc135647594"></a>

| **Description** | **Id** | **Trashed** | **Result**   |
| --------------- | ------ | ----------- | ------------ |
| Office          | 01     | 0           | Office (01)  |
| Factory         | 02     | 1           | Factory (\*) |

#### Remarks <a href="#toc132789795" id="toc132789795"></a>

* Uses [applfn\_GetBIColumnTranslation](#_toc135647583) for the description in order to support mulitilingual.
* When record is trashed an asterisk \* will be used i.o. the id.
* Before RR (2023.05.05) known as applfn\_GetPowerBIDescriptionWithId

#### Status <a href="#toc132789796" id="toc132789796"></a>

Available since 2020.R2

## applfn\_GetBIFilterId <a href="#toc132789797" id="toc132789797"></a>

Purpose

Combine all trashed items to one item (per company)

#### Arguments <a href="#toc135647599" id="toc135647599"></a>

| **Parameter** | **Description** |
| ------------- | --------------- |
| @nStatus      | Record status   |
| @Id           | Record id       |
| @CompanyId    | Company         |

#### Syntaxis <a href="#toc135647600" id="toc135647600"></a>

Select dba.applfn\_GetBIFilterId(@nStatus, @Id, @CompanyId, @Id, @nStatus)

**Example**

Select dba.applfn\_GetBIFilterId(PrfRecStatus, PrfId, PrfCompId) from dba.ProcessFunction

#### Example results <a href="#toc135647601" id="toc135647601"></a>

| **Id** | **Company** | **Trashed** | **Result**           |
| ------ | ----------- | ----------- | -------------------- |
| 001    | 000001      | 0           | 001                  |
| 001    | NULL        | 0           | 001                  |
| 002    | 000002      | 1           | BIRWC-Trashed-000002 |
| 002    | NULL        | 1           | BIR-Trashed          |

#### Remarks <a href="#toc132789800" id="toc132789800"></a>

* Uses [applfn\_GetBIIdWithCompany](#_toc132789802) to get an company specific id when not trashed
* Explanation for prefix trashed items
  * BIRWC -> BusinessIntelligence-Replacement-WithCompany
  * BIR -> BusinessIntelligence-Replacement
* Before RR (2023.05.05) known as applfn\_GetPowerBIFilterId
  * Also working was different

#### Status <a href="#toc132789801" id="toc132789801"></a>

Available since 2020.R2

## applfn\_GetBIIdWithCompany <a href="#toc132789802" id="toc132789802"></a>

Purpose

Handle empty foreign keys with multi company filtering

#### Arguments <a href="#toc135647606" id="toc135647606"></a>

| **Parameter** | **Description** |
| ------------- | --------------- |
| @Id           | Record id       |
| @CompanyId    | Company         |

#### Syntaxis <a href="#toc135647607" id="toc135647607"></a>

Select dba.applfn\_ GetBIIdWithCompany(@Id, @CompanyId, @Id)

**Example**

Select dba.applfn\_GetBIIdWithCompany(PmwDepId, PmwCompId) from dba.PmWorkorder

#### Example results <a href="#toc135647608" id="toc135647608"></a>

| **Id** | **Company** | **Result**         |
| ------ | ----------- | ------------------ |
| 001    | 000001      | 001                |
| 001    | NULL        | 001                |
| NULL   | 000002      | BIRWC-Blank-000002 |

#### Remarks <a href="#toc135647609" id="toc135647609"></a>

* Explanation for prefix blank items
  * BIRWC -> BusinessIntelligence-Replacement-WithCompany
* Before RR (2023.05.05) known as applfn\_GetPowerBIIdWithCompany
  * Also working was different

#### Status <a href="#toc132789805" id="toc132789805"></a>

Available since 2020.R2


# BI views

## Introduction <a href="#toc132789806" id="toc132789806"></a>

The BI views have been divided into five categories: [Facts](#toc132789807), [dimensions](#toc132789814), [filters](#toc132789829), [Row level security](#toc132789832) and [Helpers](#helpers). Some views for fact, dimensions and filters will contain references to Site, Department or Skill category for [Row level security ](#toc132789832)purposes

## Facts <a href="#toc132789807" id="toc132789807"></a>

Used to provide data for the decisionmaking process or kpi’s. Prefix: applv\_bi\_fact.

### applv\_bi\_factBITarget <a href="#toc132789808" id="toc132789808"></a>

#### **Purpose**

Get target percentages set for BI

#### **Source**

BITarget

#### **Filter**

BiTRecStatus >= 0

#### **Fields**

| **Field**            | **Example** | **Remark**                         |
| -------------------- | ----------- | ---------------------------------- |
| PPC target           | 0.800000    | Percentage Preventive corrective.  |
| PMC target           | 0.900000    | Preventive Maintenance compliance. |
| Emergency job target | 0.100000    | Rush jobs.                         |

#### **Status**

Available since 2020.R2

#### **Remarks**

* Percentage shown as decimal 0.8 -> 80%<br>

### applv\_bi\_factBudget <a href="#toc132789809" id="toc132789809"></a>

#### **Purpose**

Approved monthly budgets including approved mutations and the amount it’s being used

**Source**

Budgetperiod

**Filter**

BdgpContext = 4\
AND BdgpRecStatus = 8\
AND BdgpStartDate >= UmmgStartDateFinanceYear – 5

**Fields**

| **Field**       | **Example**        | **Remark**                                                                             |
| --------------- | ------------------ | -------------------------------------------------------------------------------------- |
| Year            | 2018               |                                                                                        |
| Period          | 2018-m04           |                                                                                        |
| Date            | 1-4-2018           |                                                                                        |
| Total budget    | 750.000.000        |                                                                                        |
| Budget          | 550.000.000        |                                                                                        |
| Cost            | 875.000            |                                                                                        |
| Difference      | 749.125.000        |                                                                                        |
| Budget left%    | 0.9988333333333333 |                                                                                        |
| Percentage used | 0.12               |                                                                                        |
| Mutation        | 200.000.000        |                                                                                        |
| BdgpCompId      | 000001             |                                                                                        |
| BdgpCcrId       | 01                 | [applfn\_GetBIIdWithCompany](/database/bi-overview/bi-functions#_toc132789802) used    |
| Status          | Approved           | [applv\_bi\_helperUsedStatusDescriptions](#applv_bi_helperusedstatusdescriptions) used |

**Status**

Available since 2020.R2

**Remarks**

* Percentage shown as decimal 0.8 -> 80%
* Amounts are shown in company currency

### applv\_bi\_factCompany <a href="#toc132789810" id="toc132789810"></a>

**Purpose**

Companies and their currency

**Source**

Company

**Filter**

**None**

**Fields**

| **Field** | **Example** | **Remark** |
| --------- | ----------- | ---------- |
| CompId    | 000001      |            |
| Currency  | EUR         |            |

**Status**

Available since 2020.R2

### applv\_bi\_factCost <a href="#toc132789811" id="toc132789811"></a>

**Purpose**

Incurred costs, categorised by period, object type, category, costs centre, cost type and department

**Source**

applvw\_CcrPrint (Cost)

**Filter**

CstRecStatus = 2 AND CstBookDate >= UmmgStartDateFinanceYear – 5

**Fields**

<table data-header-hidden><thead><tr><th width="182.33333333333331"></th><th width="177"></th><th></th></tr></thead><tbody><tr><td><strong>Field</strong></td><td><strong>Example</strong></td><td><strong>Remark</strong></td></tr><tr><td>Costs</td><td>835.00000</td><td></td></tr><tr><td>CstContext</td><td>8</td><td></td></tr><tr><td>Cost category</td><td>Miscellaneous items</td><td><a href="#applv_bi_helperusedcontextdescriptions">applv_bi_helperUsedContextDescriptions</a> used</td></tr><tr><td>Book date</td><td>2023-09-26</td><td></td></tr><tr><td>CstEqmId</td><td>FL019</td><td><a href="/database/bi-overview/bi-functions#_toc132789802">applfn_GetBIIdWithCompany</a> used</td></tr><tr><td>CstPrfId</td><td>00013</td><td><a href="/database/bi-overview/bi-functions#_toc132789802">applfn_GetBIIdWithCompany</a> used</td></tr><tr><td>CstSitId</td><td>05</td><td><p><a href="/database/bi-overview/bi-functions#_toc132789802">applfn_GetBIIdWithCompany</a> used,</p><p>for <a href="#_toc132789832">Row level security</a></p></td></tr><tr><td>CstCcrId</td><td>06</td><td><a href="/database/bi-overview/bi-functions#_toc132789802">applfn_GetBIIdWithCompany</a> used</td></tr><tr><td>CstCsttId</td><td>FL08</td><td></td></tr><tr><td>CstDepId</td><td>06</td><td><p><a href="/database/bi-overview/bi-functions#_toc132789802">applfn_GetBIIdWithCompany</a> used,</p><p>for <a href="#_toc132789832">Row level security</a></p></td></tr><tr><td>EqmtId</td><td>FL003</td><td>From Equipment or Processfunction</td></tr><tr><td>CstCompId</td><td>000001</td><td></td></tr><tr><td>CstSkcId</td><td>015</td><td><p><a href="/database/bi-overview/bi-functions#_toc132789802">applfn_GetBIIdWithCompany</a> used,</p><p>for <a href="#_toc132789832">Row level security</a></p></td></tr></tbody></table>

**Status**

Available since 2020.R2

**Remarks**

* Amounts are shown in company currency

### applv\_bi\_factJob <a href="#toc135647617" id="toc135647617"></a>

**Purpose**

Reported jobs with dimensions and are they fininished in time

**Source**

Job

**Filter**

JobRecStatus >= 0 AND ‘Date reported’ >= UmmgStartDateFinanceYear – 5

**Fields**

<table data-header-hidden><thead><tr><th width="212.33333333333331"></th><th></th><th></th></tr></thead><tbody><tr><td><strong>Field</strong></td><td><strong>Example</strong></td><td><strong>Remark</strong></td></tr><tr><td>JobId</td><td>1001598</td><td></td></tr><tr><td>JobDepId</td><td>07</td><td><p><a href="/database/bi-overview/bi-functions#_toc132789802">applfn_GetBIIdWithCompany </a>used,</p><p>for <a href="#_toc132789832">Row level security</a></p></td></tr><tr><td>Date reported</td><td>2023-03-02 00:00:00.0000000 +00:00</td><td><p>When JobPmId is not null then COALESCE(job.JobOriginalSchStartDate, job.JobRecCreateDate)</p><p>else COALESCE(job.JobReportDate, job.JobRecCreateDate)</p><p><a href="/database/bi-overview/bi-functions#_toc132789782">applfn_ConvertToBITimeZone</a>  used</p></td></tr><tr><td>Scheduled start date</td><td>2023-03-02 07:00:00.0000000 +00:00</td><td><a href="/database/bi-overview/bi-functions#_toc132789782">applfn_ConvertToBITimeZone</a> used</td></tr><tr><td>Target date</td><td>2023-03-02 16:00:00.0000000 +00:00</td><td><a href="/database/bi-overview/bi-functions#_toc132789782">applfn_ConvertToBITimeZone</a> used</td></tr><tr><td>Date finished</td><td>NULL</td><td><a href="/database/bi-overview/bi-functions#_toc132789782">applfn_ConvertToBITimeZone</a> used</td></tr><tr><td>JobCompId</td><td>000001</td><td></td></tr><tr><td>JobWotId</td><td>005</td><td></td></tr><tr><td>JobPriId</td><td>M</td><td></td></tr><tr><td>JobFalId</td><td>NULL</td><td></td></tr><tr><td>JobSitId</td><td>06</td><td><p><a href="/database/bi-overview/bi-functions#_toc132789802">applfn_GetBIIdWithCompany </a>used,</p><p>for <a href="#_toc132789832">Row level security</a></p></td></tr><tr><td>JobPrfId</td><td>000001</td><td><a href="/database/bi-overview/bi-functions#_toc132789802">applfn_GetBIIdWithCompany </a>used</td></tr><tr><td>JobEqmId</td><td>39704</td><td><a href="/database/bi-overview/bi-functions#_toc132789802">applfn_GetBIIdWithCompany </a>used</td></tr><tr><td>JobEqmtId</td><td>007</td><td></td></tr><tr><td>JobSkcId</td><td>015</td><td><p><a href="/database/bi-overview/bi-functions#_toc132789802">applfn_GetBIIdWithCompany </a>used,</p><p>for <a href="#_toc132789832">Row level security</a></p></td></tr><tr><td>JobCcrId</td><td>07</td><td><a href="/database/bi-overview/bi-functions#_toc132789802">applfn_GetBIIdWithCompany </a>used</td></tr><tr><td>JobPrsId</td><td>064</td><td></td></tr><tr><td>JobContext</td><td>1</td><td></td></tr><tr><td>Description</td><td>Maintenance photocopier</td><td></td></tr><tr><td>JobExecutionDays</td><td>73</td><td></td></tr><tr><td>Final finish date</td><td>2023-05-13 00:00:00.0000000 +00:00</td><td><a href="/database/bi-overview/bi-functions#_toc132789782">applfn_ConvertToBITimeZone</a> used</td></tr><tr><td>Finished on time</td><td>0</td><td>Only when ‘Final finish date’ has value</td></tr><tr><td>Overdue</td><td>0</td><td>Only when ‘Final finish date’ has value</td></tr><tr><td>Days overdue</td><td>NULL</td><td>Only when ‘Final finish date’ has value</td></tr><tr><td>Exceedance</td><td>NULL</td><td>Only when ‘Final finish date’ has value</td></tr><tr><td>Preventive</td><td>1</td><td>based on WotCategory = 'P’</td></tr><tr><td>Emergency job</td><td>0</td><td>based on PriEmergency</td></tr><tr><td>Non Emergency job</td><td>1</td><td>based on PriEmergency</td></tr><tr><td>PM model</td><td>00407</td><td></td></tr><tr><td>JobReportDate</td><td>2023-02-28 11:03:00.0000000 +00:00</td><td><a href="/database/bi-overview/bi-functions#_toc132789782">applfn_ConvertToBITimeZone</a> used</td></tr></tbody></table>

**Status**

Available since 2020.R2

### applv\_bi\_factJobReportedAndFinished <a href="#toc135647618" id="toc135647618"></a>

**Purpose**

Compare date reported and finished for jobs

**Source**

Job

**Filter**

JobRecStatus >= 0 AND ‘Date reported / finished’ >= UmmgStartDateFinanceYear – 5

**Fields**

<table data-header-hidden><thead><tr><th></th><th width="227.33333333333331"></th><th></th></tr></thead><tbody><tr><td><strong>Field</strong></td><td><strong>Example</strong></td><td><strong>Remark</strong></td></tr><tr><td>JobId</td><td>1000012</td><td></td></tr><tr><td>JobCompId</td><td>000001</td><td></td></tr><tr><td>JobSitId</td><td>01</td><td><p><a href="/database/bi-overview/bi-functions#_toc132789802">applfn_GetBIIdWithCompany </a>used,</p><p>for <a href="#_toc132789832">Row level security</a></p></td></tr><tr><td>JobDepId</td><td>07</td><td><p><a href="/database/bi-overview/bi-functions#_toc132789802">applfn_GetBIIdWithCompany </a>used,</p><p>for <a href="#_toc132789832">Row level security</a></p></td></tr><tr><td>JobSkcId</td><td>015</td><td><p><a href="/database/bi-overview/bi-functions#_toc132789802">applfn_GetBIIdWithCompany </a>used,</p><p>for <a href="#_toc132789832">Row level security</a></p></td></tr><tr><td>Date</td><td>2022-12-06 10:18:00.0000000 +00:00</td><td><a href="/database/bi-overview/bi-functions#_toc132789782">applfn_ConvertToBITimeZone</a> used</td></tr><tr><td>JobAction</td><td>Reported</td><td>Reported or Finished</td></tr></tbody></table>

**Status**

Available since 2020.R2

### applv\_bi\_factJobWeekLab <a href="#toc135647619" id="toc135647619"></a>

**Purpose**

Compare preventive and corrective hours spend on jobs

**Source**

Job

**Filter**

JobRecStatus >= 0\
AND COALESCE(JobReportDate, JobRecCreateDate) >= UmmgStartDateFinanceYear – 5

**Fields**

| **Field**                   | **Example** | **Remark**                                                                                                                                                       |
| --------------------------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| JobwlJobId                  | 1000047     |                                                                                                                                                                  |
| JobwlCompId                 | 000001      |                                                                                                                                                                  |
| JobwlDepId                  | 07          | <p><a href="/database/bi-overview/bi-functions#_toc132789802">applfn\_GetBIIdWithCompany </a>used,</p><p>for <a href="#_toc132789832">Row level security</a></p> |
| JobwlSkcId                  | 015         | <p><a href="/database/bi-overview/bi-functions#_toc132789802">applfn\_GetBIIdWithCompany </a>used,</p><p>for <a href="#_toc132789832">Row level security</a></p> |
| Total hours corrective      | 0.00        | WotCategory = 'C’                                                                                                                                                |
| Total hours preventive      | 2.75        | WotCategory = 'P’                                                                                                                                                |
| Total hours maintenance     | 2.75        | WotCategory in (‘C’, 'P’)                                                                                                                                        |
| Total hours non maintenance | 0.00        | WotCategory not in (‘C’, 'P’)                                                                                                                                    |
| Total hours unknown         | 0.00        | WotCategory is null                                                                                                                                              |
| Total hours                 | 2.75        |                                                                                                                                                                  |

**Status**

Available since 2020.R2

**Remarks**

* Grouped by jobid, wotcategory, compid, depid, skcid

### applv\_bi\_factObjectDowntime <a href="#toc135647620" id="toc135647620"></a>

**Purpose**

Mean Time to Repair (MTTR), Mean Time Between Failures (MTBF) and Mean Time To Failure (MTTF)

**Source**

ObjectDowntime

**Filter**

JobRecStatus >= 0\
AND ObjDwtContext = 2\
AND ObjDwtEndDate IS NOT NULL\
AND ObjDwtStartDate >= UmmgStartDateFinanceYear – 5

**Fields**

<table data-header-hidden><thead><tr><th width="215.33333333333331"></th><th></th><th></th></tr></thead><tbody><tr><td><strong>Field</strong></td><td><strong>Example</strong></td><td><strong>Remark</strong></td></tr><tr><td>Downtime</td><td>3.000000</td><td></td></tr><tr><td>Duration in minutes</td><td>180</td><td></td></tr><tr><td>Production loss</td><td>119.999999</td><td></td></tr><tr><td>MTBF</td><td>168</td><td></td></tr><tr><td>MTTF</td><td>165</td><td></td></tr><tr><td>ObjDwtCompId</td><td>000001</td><td></td></tr><tr><td>ObjDwtAssetFkId</td><td>N.EXP.01P</td><td><p>Equipment ->  <a href="https://app.gitbook.com/o/-MTFzUh_rAZv8SUsiLpY/s/-MZmRVbbu75Ds8MiWx_F/~/changes/119/database/bi-overview/bi-functions#_toc132789802">applfn_GetBIIdWithCompany</a> + 'E'</p><p>Processfunction -> <a href="https://app.gitbook.com/o/-MTFzUh_rAZv8SUsiLpY/s/-MZmRVbbu75Ds8MiWx_F/~/changes/119/database/bi-overview/bi-functions#_toc132789802">applfn_GetBIIdWithCompany</a> + 'P'</p></td></tr><tr><td>ObjDwtDepId</td><td>05</td><td><p><a href="/database/bi-overview/bi-functions#_toc132789802">applfn_GetBIIdWithCompany </a>used,</p><p>for <a href="#_toc132789832">Row level security</a></p></td></tr><tr><td>ObjDwtCcrId</td><td>05</td><td><a href="/database/bi-overview/bi-functions#_toc132789802">applfn_GetBIIdWithCompany </a>used</td></tr><tr><td>ObjDwtSitId</td><td>02</td><td><p><a href="/database/bi-overview/bi-functions#_toc132789802">applfn_GetBIIdWithCompany </a>used,</p><p>for <a href="#_toc132789832">Row level security</a></p></td></tr><tr><td>Start date</td><td>2022-05-01 09:00:00.0000000 +00:00</td><td><a href="/database/bi-overview/bi-functions#_toc132789782">applfn_ConvertToBITimeZone </a>used</td></tr><tr><td>JobFalId</td><td>US005</td><td></td></tr><tr><td>JobEqmtId</td><td>0020</td><td></td></tr><tr><td>Repair costs</td><td>135.00000</td><td></td></tr><tr><td>JobAssetFkId</td><td>N.EXP.01P</td><td><p>Equipment -> <a href="https://app.gitbook.com/o/-MTFzUh_rAZv8SUsiLpY/s/-MZmRVbbu75Ds8MiWx_F/~/changes/119/database/bi-overview/bi-functions#_toc132789802">applfn_GetBIIdWithCompany</a> + 'E'</p><p>Processfunction -> <a href="https://app.gitbook.com/o/-MTFzUh_rAZv8SUsiLpY/s/-MZmRVbbu75Ds8MiWx_F/~/changes/119/database/bi-overview/bi-functions#_toc132789802">applfn_GetBIIdWithCompany</a> + 'P'</p></td></tr><tr><td>Total costs</td><td>254.999999</td><td></td></tr></tbody></table>

**Status**

Available since 21.01.03

**Remarks**

* Amounts are shown in company currency

### applv\_bi\_factPmWorkOrder <a href="#toc135647621" id="toc135647621"></a>

**Purpose**

Determine the end date for periodical maintenance

**Source**

PmWorkOrder

**Filter**

PmwRecStatus >= 0

**Fields**

| **Field**       | **Example** | **Remark**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| --------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| PmwId           | 00542       |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| Execution days  | 37          |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| PmwRecordStatus | 2           |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| PmwDepId        | 29          | <p><a href="/database/bi-overview/bi-functions#_toc132789802">applfn\_GetBIIdWithCompany </a>used,</p><p>for <a href="#_toc132789832">Row level security</a></p>                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| PmwSitId        | 24          | <p><a href="/database/bi-overview/bi-functions#_toc132789802">applfn\_GetBIIdWithCompany </a>used,</p><p>for <a href="#_toc132789832">Row level security</a></p>                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| PmwSkcId        | 015         | <p><a href="/database/bi-overview/bi-functions#_toc132789802">applfn\_GetBIIdWithCompany </a>used,</p><p>for <a href="#_toc132789832">Row level security</a></p>                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| PmwCompId       | 000001      |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| PmwContext      | 1024        |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| Context         | 64          | <p>For Pmwcontext 1024 (PeriodicActivityChild) the context is based on backoffice for corresponding Maintenanceclassification.</p><ul><li>When bofJobContext = 1 -> 1 --TS</li><li>When bofJobContext = 512 -> 2 --Instrument</li><li>When bofJobContext = 2048 -> 16 --Building</li><li>When bofJobContext = 16384 -> 64 --Fleet</li><li>When bofJobContext = 32768 -> 32768 --Infra</li><li>When bofJobContext = 64 -> 131072 -- ITKnownError -> IT</li><li>When bofJobContext = 128 -> 131072 --ITIncident -> IT</li><li>When bofJobContext = 256 -> 131072 --ITProblem -> IT</li><li>Else PmwContext</li></ul> |

**Status**

Available since RR (2021.05.11)

### applv\_bi\_factShiftLogLine <a href="#toc135647622" id="toc135647622"></a>

**Purpose**

'Autonomous maintenance performance', the processing performance of maintenance tasks

**Source**

ShiftLogLine

**Filter**

ShllContext = 2\
AND ShllShlId IS NOT NULL\
AND ShllRecCreateDate >= UmmgStartDateFinanceYear – 5

**Fields**

| **Field**                            | **Example**                        | **Remark**                                                                          |
| ------------------------------------ | ---------------------------------- | ----------------------------------------------------------------------------------- |
| ShllOriginShllId                     | 0000000000044                      | [applfn\_GetBIIdWithCompany used](/database/bi-overview/bi-functions#_toc132789802) |
| ShllShlbId                           | 01                                 | [applfn\_GetBIIdWithCompany used](/database/bi-overview/bi-functions#_toc132789802) |
| ShllCompId                           | 000001                             |                                                                                     |
| ShllSrId                             | NULL                               |                                                                                     |
| ShllPrfId                            | N.PRO.02.008                       | [applfn\_GetBIIdWithCompany used](/database/bi-overview/bi-functions#_toc132789802) |
| ShllEqmId                            | 39861                              | [applfn\_GetBIIdWithCompany used](/database/bi-overview/bi-functions#_toc132789802) |
| Date                                 | 2022-12-27 10:22:55.0000000 +00:00 | [pplfn\_ConvertToBITimeZone used](/database/bi-overview/bi-functions#_toc132789782) |
| Finished on time                     | 1                                  |                                                                                     |
| Finished too late                    | 0                                  |                                                                                     |
| Skipped                              | 0                                  |                                                                                     |
| Applicable for performance dashboard | 1                                  | ShllRecStatus = 128 OR ShllRecStatus = 256                                          |

**Status**

Available since RR (2022.04.29)

## Dimensions <a href="#toc132789814" id="toc132789814"></a>

Used to describe the objects in facts. Prefix: applv\_bi\_dim.

#### Remarks <a href="#toc135647624" id="toc135647624"></a>

* To be able to only show dimension relevant for a specific company extra item(s) will be added to the dimensions with a company.
  * A ‘blank’ (null) dimension item will be added per company.
    * Example: ‘BIRWC-Blank-000001’ (Id) for ‘blank’ and company “000001

### applv\_bi\_dimAsset <a href="#toc135647625" id="toc135647625"></a>

**Purpose**

Assets for applv\_bi\_factPmWorkOrder

**Source**

Equipment / processfunction

**Fields**

| **Field**      | **Example**                  | **Remark**                                                                                                                                                                                                                                  |
| -------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| AssetId        | 00003E                       | <p>Equipment -> <a href="/database/bi-overview/bi-functions#_toc132789802">applfn\_GetBIIdWithCompany</a> + 'E'</p><p>Processfunction -> <a href="/database/bi-overview/bi-functions#_toc132789802">applfn\_GetBIIdWithCompany</a>+ 'P'</p> |
| Asset          | Crate washer machine (00003) | [Aplfn\_GetBIDescriptionWithId](/database/bi-overview/bi-functions#_toc132789792) used                                                                                                                                                      |
| AssetRecStatus | 2                            |                                                                                                                                                                                                                                             |
| AssetCompId    | 000001                       |                                                                                                                                                                                                                                             |
| AssetSitId     | 02                           | <p><a href="/database/bi-overview/bi-functions#_toc132789802">applfn\_GetBIIdWithCompany </a>used,</p><p>for <a href="#_toc132789832">Row level security</a></p>                                                                            |
| AssetDepId     | 05                           | <p><a href="/database/bi-overview/bi-functions#_toc132789802">applfn\_GetBIIdWithCompany </a>used,</p><p>for <a href="#_toc132789832">Row level security</a></p>                                                                            |
| FilterAssetId  | 00003E                       | [applfn\_GetBIFilterId](/database/bi-overview/bi-functions#_toc132789797) used                                                                                                                                                              |

**Status**

Available since 21.01.03

### applv\_bi\_dimCostCenter <a href="#toc135647626" id="toc135647626"></a>

**Source**

Costcenter

**Fields**

| **Field**    | **Example**  | **Remark**                                                                              |
| ------------ | ------------ | --------------------------------------------------------------------------------------- |
| CcrId        | 001          | [applfn\_GetBIIdWithCompany](/database/bi-overview/bi-functions#_toc132789802) used     |
| Cost centre  | Office (001) | [applfn\_GetBIDescriptionWithId](/database/bi-overview/bi-functions#_toc132789792) used |
| CcrRecStatus | 2            |                                                                                         |
| CcrCompId    | 000001       |                                                                                         |
| FilterCcrId  | 001          | [applfn\_GetBIFilterId](/database/bi-overview/bi-functions#_toc132789797) used          |

**Status**

Available since 2020 R2

### applv\_bi\_dimCostType <a href="#toc132789817" id="toc132789817"></a>

**Source**

CostType

**Fields**

| **Field**     | **Example**  | **Remark**                                                                              |
| ------------- | ------------ | --------------------------------------------------------------------------------------- |
| CsttId        | 001          |                                                                                         |
| Cost type     | Office (001) | [applfn\_GetBIDescriptionWithId](/database/bi-overview/bi-functions#_toc132789792) used |
| CsttRecStatus | 0            |                                                                                         |
| FilterCsttId  | 001          | [applfn\_GetBIFilterId](/database/bi-overview/bi-functions#_toc132789797) used used     |

**Status**

Available since 2020 R2

### applv\_bi\_dimDepartment <a href="#toc132789818" id="toc132789818"></a>

**Source**

Department

**Fields**

| **Field**    | **Example**         | **Remark**                                                                              |
| ------------ | ------------------- | --------------------------------------------------------------------------------------- |
| DepId        | 01                  | [applfn\_GetBIIdWithCompany](/database/bi-overview/bi-functions#_toc132789802) used     |
| Department   | Administration (01) | [applfn\_GetBIDescriptionWithId](/database/bi-overview/bi-functions#_toc132789792) used |
| DepRecStatus | 0                   |                                                                                         |
| DepCompId    | 000001              |                                                                                         |
| FilterDepId  | 001                 | [applfn\_GetBIFilterId](/database/bi-overview/bi-functions#_toc132789797) used          |
| IsEmpty      | 0                   |                                                                                         |

**Status**

Available since 2020 R1

### applv\_bi\_dimEqmType <a href="#toc132789819" id="toc132789819"></a>

**Source**

EqmType

**Fields**

| **Field**      | **Example**          | **Remark**                                                                              |
| -------------- | -------------------- | --------------------------------------------------------------------------------------- |
| EqmtId         | 001                  |                                                                                         |
| Equipment type | Accessories (000001) | [applfn\_GetBIDescriptionWithId](/database/bi-overview/bi-functions#_toc132789792) used |
| EqmtRecStatus  | 0                    |                                                                                         |
| FilterEqmtId   | 001                  | [applfn\_GetBIFilterId](/database/bi-overview/bi-functions#_toc132789797) used          |

**Status**

Available since 2020 R2

### applv\_bi\_dimFailType <a href="#toc135647630" id="toc135647630"></a>

**Source**

FailType

**Fields**

| **Field**     | **Example**              | **Remark**                                                                                 |
| ------------- | ------------------------ | ------------------------------------------------------------------------------------------ |
| FalId         | 016                      |                                                                                            |
| Failure cause | Faulty maintenance (016) | [applfn\_GetBIDescriptionWithId](/database/bi-overview/bi-functions#_toc132789792) is used |
| FalRecStatus  | 0                        |                                                                                            |
| FilterFalId   | 016                      | [applfn\_GetBIFilterId](/database/bi-overview/bi-functions#_toc132789797) used             |

**Status**

Available since 2020 R1

### applv\_bi\_dimOriginalShiftLogLine <a href="#toc132789821" id="toc132789821"></a>

**Source**

ShiftLogLine

**Fields**

| **Field**        | **Example**                             | **Remark**                                                                          |
| ---------------- | --------------------------------------- | ----------------------------------------------------------------------------------- |
| ShllId           | 0000000000050                           | [applfn\_GetBIIdWithCompany](/database/bi-overview/bi-functions#_toc132789802) used |
| ShllCompId       | 000001                                  |                                                                                     |
| Maintenance task | Lubricate conveyor belt of Packing line |                                                                                     |
| ShllRecStatus    | 128                                     |                                                                                     |
| FilterShllId     | 0000000000050                           | [applfn\_GetBIFilterId](/database/bi-overview/bi-functions#_toc132789797) used      |

**Status**

Available since 21.01.03

### applv\_bi\_dimPriority <a href="#toc135647632" id="toc135647632"></a>

**Source**

Priority

**Fields**

| **Field**          | **Example** | **Remark**                                                                              |
| ------------------ | ----------- | --------------------------------------------------------------------------------------- |
| PriId              | 01          |                                                                                         |
| Priority           | High (01)   | [applfn\_GetBIDescriptionWithId](/database/bi-overview/bi-functions#_toc132789792) used |
| PriRecStatus       | 0           |                                                                                         |
| Priority emergency | 1           |                                                                                         |

**Status**

Available since 2020 R1

### applv\_bi\_dimProgressStatus <a href="#toc132789823" id="toc132789823"></a>

**Source**

ProgressStatus

**Fields**

| **Field**       | **Example**      | **Remark**                                                                              |
| --------------- | ---------------- | --------------------------------------------------------------------------------------- |
| PrsId           | 026              |                                                                                         |
| Progress status | Registered (026) | [applfn\_GetBIDescriptionWithId](/database/bi-overview/bi-functions#_toc132789792) used |
| PrsRecStatus    | 0                |                                                                                         |

**Status**

Available since 2020 R1

### applv\_bi\_dimShiftLogbook <a href="#toc135647634" id="toc135647634"></a>

**Source**

ShiftLogbook

**Fields**

| **Field**     | **Example**                      | **Remark**                                                                                                                                                       |
| ------------- | -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ShlbId        | 02                               | [applfn\_GetBIIdWithCompany](/database/bi-overview/bi-functions#_toc132789802) used                                                                              |
| Logbook       | Logbook - Purifying installation |                                                                                                                                                                  |
| ShlbRecStatus | 0                                |                                                                                                                                                                  |
| ShlbDepId     | 000001                           | <p><a href="/database/bi-overview/bi-functions#_toc132789802">applfn\_GetBIIdWithCompany </a>used,</p><p>for <a href="#_toc132789832">Row level security</a></p> |
| ShlbSitId     | 07                               | <p><a href="/database/bi-overview/bi-functions#_toc132789802">applfn\_GetBIIdWithCompany </a>used,</p><p>for <a href="#_toc132789832">Row level security</a></p> |
| ShlbCompId    | 000001                           |                                                                                                                                                                  |
| FilterShlbId  | 02                               | [applfn\_GetBIFilterId](/database/bi-overview/bi-functions#_toc132789797) used                                                                                   |
| IsEmpty       | 0                                |                                                                                                                                                                  |

**Status**

Available since 21.01.03

### applv\_bi\_dimSite <a href="#toc132789825" id="toc132789825"></a>

**Source**

Site

**Fields**

| **Field**    | **Example** | **Remark**                                                                         |
| ------------ | ----------- | ---------------------------------------------------------------------------------- |
| SitId        | 01          | [applfn\_GetBIIdWithCompany](/database/bi-overview/bi-functions#_toc132789802)     |
| Site         | Office (01) | [applfn\_GetBIDescriptionWithId](/database/bi-overview/bi-functions#_toc132789792) |
| Country      | Netherlands |                                                                                    |
| SitRecstatus | 0           |                                                                                    |
| SitCompId    | 000001      |                                                                                    |
| FilterSitId  | 01          | [applfn\_GetBIFilterId](/database/bi-overview/bi-functions#_toc132789797) used     |

**Status**

Available since 2020.R1

### applv\_bi\_dimSkillCat <a href="#toc135647636" id="toc135647636"></a>

**Source**

SkillCat

**Fields**

| **Field**    | **Example**    | **Remark**                                                                              |
| ------------ | -------------- | --------------------------------------------------------------------------------------- |
| SkcId        | 011            | [applfn\_GetBIIdWithCompany](/database/bi-overview/bi-functions#_toc132789802) used     |
| Team         | Other (011) \* | [applfn\_GetBIDescriptionWithId](/database/bi-overview/bi-functions#_toc132789792) used |
| SkcRecstatus | -2147483648    |                                                                                         |
| SkcCompId    | 000001         |                                                                                         |

**Status**

Available since 2020.R1

### applv\_bi\_dimSkipReason <a href="#toc132789827" id="toc132789827"></a>

**Source**

Site

**Fields**

| **Field**      | **Example**              | **Remark**                                                                        |
| -------------- | ------------------------ | --------------------------------------------------------------------------------- |
| SrId           | US01                     |                                                                                   |
| Reason to skip | Insufficient time (US01) | [applfn\_GetBIDescriptionWithId](/database/bi-overview/bi-functions#toc132789792) |
| FilterSrId     | US01                     | [applfn\_GetBIFilterId](/database/bi-overview/bi-functions#_toc132789797)         |
| SrRecStatus    | 0                        |                                                                                   |

**Status**

Available since RR (2022.04.29)

### applv\_bi\_dimWorkOrderType <a href="#toc135647638" id="toc135647638"></a>

**Source**

Site

**Fields**

| **Field**           | **Example**                  | **Remark**                                                                                                                                                               |
| ------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| WotId               | 003                          |                                                                                                                                                                          |
| Job type            | Inspection/Calibration (003) | [applfn\_GetBIDescriptionWithId](/database/bi-overview/bi-functions#_toc132789792)                                                                                       |
| WotCategory         | P                            |                                                                                                                                                                          |
| Category (job type) | Preventive                   | <p>WHEN WotCategory = 'P' THEN 'Preventive'</p><p>WHEN WotCategory = 'C' THEN 'Corrective'</p><p>WHEN WotCategory NOT IN('P', 'C') THEN 'Other'</p><p>ELSE 'Unknown'</p> |
| WotRecstatus        | 0                            |                                                                                                                                                                          |
| FilterWotId         | 003                          | [applfn\_GetBIFilterId](/database/bi-overview/bi-functions#_toc132789797) used                                                                                           |

**Status**

Available since 2020.R1

## Filters <a href="#toc132789829" id="toc132789829"></a>

Filter facts / dimension. Prefix: applv\_bi\_filter.

#### Remarks <a href="#toc132789830" id="toc132789830"></a>

* To provide extra filtering possibilities extra/replacement items will be added to the filters.
  * For filters with a company a ‘blank’ (null) filter item will be added per company.
    * Example: ‘BIRWC-Blank-000001’ (Id) for ‘blank’ and company “000001
  * When trashed items exist all trashed items will be replaced with one trashed filter item (per company) and the description will be ‘\* (Trashed)’
    * Example: ‘ ‘BIRWC-Trashed-000001’ (Id) for ‘trashed’ and company “000001
    * Example: ‘ ‘BIR-Trashed’ (Id) for ‘trashed’ without company
* Most filters are a representation of their dimension, look at the dimension for extra information (source, used functions, remarks, etc.)

### applv\_bi\_filterAsset <a href="#toc135647641" id="toc135647641"></a>

**Purpose**

Assets for applv\_bi\_factPmWorkOrder

**Source**

applv\_bi\_dimAsset

**Fields**

| **Field**     | **Example**           |
| ------------- | --------------------- |
| FilterAssetId | BIRWC-Trashed-000001E |
| Asset         | \* (Trashed)          |
| IsTrashed     | 1                     |
| AssetCompId   | 000001                |

**Remarks**

Could contain two trashed items per company. One for equipment and one for processfunction

**Status**

Available since 21.01.03

### applv\_bi\_filterCostCenter <a href="#toc135647642" id="toc135647642"></a>

**Source**

applv\_bi\_dimCostCenter

**Fields**

| **Field**   | **Example**              |
| ----------- | ------------------------ |
| FilterCcrId | 06                       |
| Cost centre | Dispatch department (06) |
| IsTrashed   | 0                        |
| CcrCompId   | 000001                   |

**Status**

Available since 2020R2

### applv\_bi\_filterCostType <a href="#toc135647643" id="toc135647643"></a>

**Source**

applv\_bi\_dimCostType

**Fields**

| **Field**    | **Example**          |
| ------------ | -------------------- |
| FilterCsttId | 010                  |
| Cost type    | Hardware costs (010) |
| IsTrashed    | 0                    |

**Status**

Available since 2020R2

### applv\_bi\_filterDepartment <a href="#toc135647644" id="toc135647644"></a>

**Source**

applv\_bi\_dimDepartment

**Fields**

| **Field**   | **Example**               |
| ----------- | ------------------------- |
| FilterDepId | 05                        |
| Department  | Dispatch & Logistics (05) |
| IsTrashed   | 0                         |
| DepCompId   | 000001                    |
| IsEmpty     | 0                         |

**Status**

Available since 2020R2

### applv\_bi\_filterEqmType <a href="#toc135647645" id="toc135647645"></a>

**Source**

applv\_bi\_dimEqmType

**Fields**

| **Field**      | **Example**                 |
| -------------- | --------------------------- |
| FilterEqmtId   | 0009                        |
| Equipment type | Hydraulic Generators (0009) |
| IsTrashed      | 0                           |

**Status**

Available since 2020R2

### applv\_bi\_filterEquipment <a href="#toc135647646" id="toc135647646"></a>

**Source**

Equipment (joined with equipment via EqmTopOfEqmId)

**Fields**

| **Field**     | **Example**                | **Remark**                                                                                        |
| ------------- | -------------------------- | ------------------------------------------------------------------------------------------------- |
| EqmId         | 00001                      | [applfn\_GetBIIdWithCompany](/database/bi-overview/bi-functions#_toc132789802) used               |
| Equipment     | Forklift 1 type 35 (00001) | [applfn\_GetBIDescriptionWithId](/database/bi-overview/bi-functions#_toc132789792) used           |
| EqmRecStatus  | 2                          | <p>WHEN EqmRecStatus < 0 THEN EqmRecStatus</p><p>ELSE topeqm.EqmRecStatus (via EqmTopOfEqmId)</p> |
| EqmTopOfEqmId | 00001                      | if equals EqmId then it's a top eqm                                                               |
| EqmCompId     | 000001                     |                                                                                                   |
| FilterEqmId   | 00001                      | [applfn\_GetBIFilterId](/database/bi-overview/bi-functions#_toc132789797) used                    |
| IsEmpty       | 0                          |                                                                                                   |
| EqmContext    | 1                          |                                                                                                   |

**Remarks**

Best practice is to use applv\_bi\_filterTopOfEquipment

**Status**

Available since 2020R1

### applv\_bi\_filterEquipmentContext <a href="#toc135647647" id="toc135647647"></a>

**Source**

[applv\_bi\_helperUsedContextDescriptions ](#applv_bi_helperusedcontextdescriptions)

**Fields**

| **Field**         | **Example**   |
| ----------------- | ------------- |
| EqmContext        | 1             |
| Equipment context | Equipment (1) |

**Status**

Available since RR (2021.12.16)

### applv\_bi\_filterFailType <a href="#toc135647648" id="toc135647648"></a>

**Source**

applv\_bi\_dimFailType

**Fields**

| **Field**     | **Example**              |
| ------------- | ------------------------ |
| FilterFalId   | 016                      |
| Failure cause | Faulty maintenance (016) |
| IsTrashed     | 0                        |

**Status**

#### Available since 2020R2 <a href="#toc135647649" id="toc135647649"></a>

### applv\_bi\_filterProcessFunction <a href="#toc135647650" id="toc135647650"></a>

**Source**

ProcessFunction (joined with equipment via PrfTopOfPrfId)

**Fields**

| **Field**        | **Example**                | **Remark**                                                                                        |
| ---------------- | -------------------------- | ------------------------------------------------------------------------------------------------- |
| PrfId            | 0.24                       | [applfn\_GetBIIdWithCompany](/database/bi-overview/bi-functions#_toc132789802)used                |
| Process function | Buildings and Sites (0.24) | [applfn\_GetBIDescriptionWithId](/database/bi-overview/bi-functions#_toc132789792)used            |
| PrfRecStatus     | 1                          | <p>WHEN PrfRecStatus < 0 THEN PrfRecStatus</p><p>ELSE topPrf.PrfRecStatus (via PrfTopOfPrfId)</p> |
| PrfTopOfPrfId    | 002                        | if equals PrfId then it's a top Prf                                                               |
| PrfCompId        | 000001                     |                                                                                                   |
| FilterPrfId      | 002                        | [applfn\_GetBIFilterId](/database/bi-overview/bi-functions#_toc132789797) used used               |
| IsEmpty          | 0                          |                                                                                                   |

**Remarks**

Best practice is to use applv\_bi\_filterTopOfProcessFunction

**Status**

Available since 2020R1

### applv\_bi\_filterShiftLogbook <a href="#toc135647651" id="toc135647651"></a>

applv\_bi\_dimShiftLogBook

**Fields**

| **Field**    | **Example** |
| ------------ | ----------- |
| FilterShlbId | 01          |
| Logbook      | Cake line 2 |
| IsTrashed    | 0           |
| ShlbCompId   | 000001      |

**Status**

Available since 21.01.03

### applv\_bi\_filterShiftLogLine <a href="#toc135647652" id="toc135647652"></a>

applv\_bi\_dimShiftLogLine

**Fields**

| **Field**        | **Example**                                 |
| ---------------- | ------------------------------------------- |
| FilterShllId     | 0000000000038                               |
| Maintenance task | Measure noise level near crate washing line |
| IsTrashed        | 0                                           |
| ShllCompId       | 000001                                      |

**Status**

Available since 21.01.03

### applv\_bi\_filterSite <a href="#toc135647653" id="toc135647653"></a>

**Source**

applv\_bi\_dimSite

**Fields**

| **Field**   | **Example** |
| ----------- | ----------- |
| FilterSitId | 01          |
| Site        | Office (01) |
| IsTrashed   | 0           |
| SitCompId   | 000001      |

**Status**

Available since 2020R2

### applv\_bi\_filterSkipReason <a href="#toc135647654" id="toc135647654"></a>

**Source**

applv\_bi\_dimSkipReason

**Fields**

| **Field**      | **Example**              |
| -------------- | ------------------------ |
| FilterSrId     | US01                     |
| Reason to skip | Insufficient time (US01) |
| IsTrashed      | 0                        |

**Status**

Available since 21.01.03

### applv\_bi\_filterTopOfEquipment <a href="#toc135647655" id="toc135647655"></a>

**Source**

applv\_bi\_dimEquipment

**Filter**

EqmRecStatus >= 0 AND eqmid = EqmTopOfEqmId

**Fields**

| **Field**   | **Example**                |
| ----------- | -------------------------- |
| FilterEqmId | 00001                      |
| Equipment   | Forklift 1 type 35 (00001) |
| IsTrashed   | 0                          |
| EqmCompId   | 000001                     |
| IsEmpty     | 0                          |

**Status**

Available since 2020R1

### applv\_bi\_filterTopOfProcessFunction <a href="#toc135647656" id="toc135647656"></a>

**Source**

applv\_bi\_dimProcessFunction

**Filter**

PrfRecStatus >= 0 AND Prfid = PrfTopOfPrfId

**Fields**

| **Field**       | **Example**                 |
| --------------- | --------------------------- |
| FilterPrfId     | 00001                       |
| ProcessFunction | Reception workplace (00001) |
| IsTrashed       | 0                           |
| PrfCompId       | 000001                      |
| IsEmpty         | 0                           |

**Status**

Available since 2020R1

### applv\_bi\_filterWorkOrderType <a href="#toc135647657" id="toc135647657"></a>

**Source**

applv\_bi\_dimWorkOrderType

**Fields**

| **Field**   | **Example**          |
| ----------- | -------------------- |
| FilterWotId | 001                  |
| Job type    | Administration (001) |
| IsTrashed   | 0                    |

**Status**

Available since 2020R2

## Row level security <a href="#toc132789832" id="toc132789832"></a>

Used to limit access to data like our record authorization would. Prefix: applv\_bi\_RLS.\
Contains all data (dimensions) per user for which he is authorized via record authorization.

### Remarks <a href="#toc132789833" id="toc132789833"></a>

* When no record for a user, no record authorization applies, and all data is visible to the user.
* Data will always show all records that can be seen by the user even when only a subset is used when logging in.
* Configurational changes to record authorization via workflows will not be shown as they are not in the standard database
* Only most used dimensions have a view at this moment

### applv\_bi\_RLSDepartment <a href="#toc135647660" id="toc135647660"></a>

**Source**

Standard record authorization settings for user or group (SuserRecordAuthSetting, SuserRecordAuthorization, SgroupRecordAuthSetting and SgroupRecordAuthorization)

**Filter**

DepRecStatus >= 0

**Fields**

| **Field** | **Example** |
| --------- | ----------- |
| User      | Manager     |
| SiteId    | 01          |

**Status**

Available since 2020R1

### applv\_bi\_RLSSite <a href="#toc135647661" id="toc135647661"></a>

**Source**

Standard record authorization settings for user or group (SuserRecordAuthSetting, SuserRecordAuthorization, SgroupRecordAuthSetting and SgroupRecordAuthorization)

**Filter**

SitRecStatus >= 0

**Fields**

| **Field** | **Example** |
| --------- | ----------- |
| User      | JohnW       |
| DepId     | 02          |

**Status**

Available since 2020R1

### applv\_bi\_RLSSkillCat <a href="#toc135647662" id="toc135647662"></a>

**Source**

Standard record authorization settings for user or group (SuserRecordAuthSetting, SuserRecordAuthorization, SgroupRecordAuthSetting and SgroupRecordAuthorization)

**Filter**

SkcRecStatus >= 0

**Fields**

| Field | Example  |
| ----- | -------- |
| User  | Purchase |
| SkcId | 001      |

**Status**

Available since 2020R1

## Helpers

Used to help show data in the bi views that cannot (completely) be found in the database

### **applv\_bi\_helperUsedContextDescriptions**

**Purpose**

Show English context descriptions for contexts that are used in views for filtering or displaying categories

**Source**

Standard Context descriptions (as copy from datafile) and custom context descriptions from SRECORDCONTEXTCOUNTRY for tables Equipment and Cost (EN)

**Filter**

SRECXREC IN ('COST', 'EQUIPMENT' AND SrecxRecStatus >= 0 AND (SRECCCCOU IS NULL OR SRECCCCOU = 'EN')

**Fields**

| Field       | Example    |
| ----------- | ---------- |
| TableName   | Equipment  |
| Context     | 512        |
| Description | Instrument |

**Status**

Available since 24.02.21

### **applv\_bi\_helperUsedStatusDescriptions**

**Purpose**

Show English status descriptions for contexts that are used in views for displaying categories

**Source**

Standard status descriptions (as copy from datafile) and custom status descriptions from SRECORDSTATUSCOUNTRY for table BUDGETPERIOD (EN)

**Filter**

SRESTRECORD = 'BUDGETPERIOD' AND (SRECSCCOU IS NULL OR SRECSCCOU = 'EN')

**Fields**

| Field       | Example      |
| ----------- | ------------ |
| TableName   | BudgetPeriod |
| Status      | 1            |
| Description | Created      |

&#x20;**Status**

Available since 24.03.14


# Terms & Conditions

Every developer, consultant, application manager, partner etc. using Ultimo's API, BI integration or creating Add-Ons agrees to these terms and conditions.

### General

You shall not modify, adapt, copy, reverse engineer, spread, decompile, or create derivative works based upon the Ultimo solutions or parts of the solution.

Only ‘trusted parties’ are allowed to access the Ultimo API and BI environment. It is not allowed to share access rights with end-users.

Ultimo reserves the right to review the created APIs, BI integrations and Add-Ons. It is recommended to reach out to Ultimo at an early stage of development and request a review. You can reach Ultimo by creating a ticket at the Ultimo Helpdesk.

### Security

Every developer is responsible for applying a good security strategy. Ultimo is not responsible for consequences regarding insecure use.<br>

| Secure API Key usage                                                                                                                                                                                                                                    | Insecure API Key usage                                                                                                                                                                                                                                                             |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FhKwQRF3qBMIiYHhHRK35%2Fimage.png?alt=media\&token=dd6f1cbe-77ac-43e6-9543-ebd7ee68fcdd)                                     | ![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FJOlXNFBNehrQScTMuFAk%2Fimage.png?alt=media\&token=5ee407aa-f0dd-440f-a45c-c164ea530d17)                                                                |
| The client application authenticates against the application server. The authentication server applies authorization and uses the API key to communicate with Ultimo. This is a secure solution, since the application server is a trusted environment. | The client application (web app/mobile app/...) uses the API key directly to communicate with Ultimo. This is considered insecure, since we do not control the client. The API key can be misused, extracted from the application and authorization is not enforced on any server. |

### API - Specific

**Use**

Ultimo has a fair use policy regarding using the API. This means that we expect the developer to respect the server capacity of the Ultimo environment. For example, only send data that has been changed. Don't call the API too often.

Ultimo reserves the right to throttle the number of API requests you send. If this is the case, you will be notified first.

It is not allowed to use the API to perform actions that need a named user account in Ultimo. Ultimo reserves the right to extend the API by supplying mandatory credentials.

**Support**

Changes to the API definition and end-of-life of APIs will be communicated 6 months in advance.

**Risk and liabilities**

The use of the API is entirely at your own risk. Ultimo does not offer guarantees; the API is supplied 'as is'.

Ultimo reserves the right to adjust the pricing of the API use at any time. If this is the case, you will be notified first.

Ultimo cannot be held responsible for any damage or financial loss concerning you or third parties resulting from using the API. The developer indemnifies Ultimo for any of these liabilities. Ultimo cannot be held liable for any damage or financial loss that occurs when Ultimo ends the API support.

### Add-On - Specific

An Add-On is an application with a user interface that uses and/or mutates information inside the Ultimo environment. These applications should communicate with Ultimo through the Ultimo API. Hence the API terms and conditions also apply.

The use of the API should be mentioned in the developed application, easily accessible for the end-users, by stating '\<Application X> is developed using the Ultimo API'.

### BI Integration - Specific

**Use**

Ultimo has a fair use policy regarding accessing the BI database. This means that we expect the developer to respect the server capacity of the Ultimo BI database. BI Integration intends to provide information for management purposes, not real-time OLTP information.

The current refresh rate of the database is provided in near real-time. Ultimo reserves the right to scale this refresh rate down. Keep this in mind when developing solutions.

Ultimo reserves the right to throttle the number of database requests you send. If this is the case, you will be notified first.

**Database schema changes**

Due to the continuous delivery that Ultimo applies to its software database, schema changes appear regularly. If it is expected to break solutions created by developers, Ultimo will communicate the changes upfront based on commercially reasonable effort.

**Risk and liabilities**

The use of the BI Integration is entirely at your own risk. Ultimo does not offer guarantees; the BI Integration is supplied ‘as is’.

Ultimo cannot be held responsible for any form of damage or financial loss concerning you or third parties resulting from the use of the BI Integration. The developer indemnifies Ultimo for any of these liabilities. Ultimo cannot be held liable for any damage or financial loss that occurs when Ultimo ends the BI Integration support.

&#x20; \ <br>


# Azure migration

Impact on interfaces when migrating to Azure

When an Ultimo environment is migrated to the Azure cloud, this will have an impact on existing interfaces. What the impact is on each interface depends on how the interface technically works. If communication with another system is done through webservices, the only change will be a different endpoint when the system connects to Ultimo. If there is no direct communication between systems, the interface will most likely exchange data through files. These so-called file-based interfaces are no longer possible on Azure. Ultimo environments running on Azure do not have direct access to any FTP server or local network share. These file-based interfaces therefor have to be reconfigured.

Modern applications offer webservices to transfer data between systems. Migrating to webservices is the recommended option for existing file-based interfaces. There is no general guide for this action, each interface has to be reconfigured specifically. Note that activities to reconfigure the Ultimo part of the interface will require additional consultancy. These activities are not part of the migration project. Activities will also be required to change the other side of the interface. This can possibly be handled by your IT department, but third parties may also be involved.

If migration to direct communication with webservices is not possible, some alternatives can be considered, as described on the following pages. Using one of these alternatives requires action from both the Ultimo migration team and your IT department, as described on those pages.


# Export alternatives

## 1. Alternative for exporting data to a network share using an export connector

### Export data periodically

If data is exported to a network share periodically, the alternative is to retrieve data from the existing export connector directly through a webservice call and save the result as a file. You can either use your own middleware tooling to get the data from the Ultimo export connector or use a cUrl command.

Actions:

* Create a (powershell) script to get and save data from the export connector.
* Add a scheduled task to run this script periodically, according to the current schedule on the export connector.

Note: make sure the IT infrastructure allows connection to the Ultimo webservices.

cUrl example:

```
curl -o [OutputDirectory\FileName] -H "Content-type: text/xml;charset=utf-8" "[Export connector Url]"
curl -o C:\temp\outputdata.csv -H "Content-type: text/xml;charset=utf-8" "https://customer.ultimo.net/Webservices/Connector.ashx?username=US0000003&password=xxx&action=export&exportName=_CSVEXPORT"
```

To use this cUrl command in a powershell script:

```
curl.exe '-o', 'C:\temp\outputdata.csv',
 '-H', 'Content-type: text/xml;charset=utf-8',
 'https://customer.ultimo.net/Webservices/Connector.ashx?username=US0000003&password=xxx&action=export&exportName=_CSVEXPORT'
```

### Export after a specific action in Ultimo

If data is exported to a network share after an event in Ultimo has occurred, for example activating a record, an alternative is to send these files to a mailbox and configure the mailbox to save received files on the network share.

Actions:

* Configure a specific mailbox to receive these emails
* Configure the mailbox to save attachments of received emails to the network share

## 2. Alternative for exporting data/files to a network share using a scheduled workflow

If files are exported to a network share periodically with the workflow scheduler, the alternative is to change the workflow so that files are send as an email attachment as described in the previous chapter.

Actions:

* Configure a specific mailbox to receive these emails
* Configure the mailbox to save attachments of received emails to the network share


# Import alternatives

## 1. Alternative for importing data from a network share using an import connector

If data is imported from a network share, the alternative is to send the data to the existing import connector directly through a webservice call. You can either use your own middleware tooling to send data to the Ultimo import connector or use a cUrl command.

Actions:

* Create a (powershell) script to send data to the import connector.
* Execute the script immediately each time a file is added to the network share or add a scheduled task to run this script periodically, according to the current schedule on the import connector.

Note: make sure the IT infrastructure allows connection to the Ultimo webservices.

cUrl example:

```
curl --data-binary @[FileName] -H "Content-type: text/xml;charset=utf-8" "[Import connector Url]"
curl --data-binary @C:\temp\importdata.csv -H "Content-type: text/xml;charset=utf-8" "https://customer.ultimo.net/Webservices/Connector.ashx?username=US0000003&password=xxx&action=import&importName=_CSVIMPORT"
```

To use this cUrl command in a powershell script:

```
curl.exe '--data-binary', '@C:\temp\importdata.csv',
 '-H', 'Content-type: text/xml;charset=utf-8',
 'https://customer.ultimo.net/Webservices/Connector.ashx?username=US0000003&password=xxx&action=import&importName=_CSVIMPORT'
```

## 2. Alternative for importing data/files from a network share using a scheduled workflow

If files are imported from a network share periodically with the workflow scheduler, the alternative is to send these files to the Ultimo REST API instead. The REST API can save these files in the Ultimo directory that is imported by the workflow.

Actions:

* Create a (powershell) script to send data to the REST API.
* Execute the script immediately each time a file is added to the network share or add a scheduled task to run this script periodically

Note: make sure the IT infrastructure allows connection to the Ultimo webservices.

cUrl example:

```
curl -F "File=@[FileName]" -F "FileSystemPath=[FileServiceData directory to save files]" -H "Apikey: [API Key]" -H "Applicationelementid: [Workflow GUID]" "[REST API Url]"
curl -F "File=@C:\temp\Document.docx" -F "FileSystemPath=ImportDirectory" -H "Apikey: xxx" -H "Applicationelementid: E7870B3EFDD5416BD7BE2C8AA660DDB8" "https://customer.ultimo.net/api/v1/action/_REST_UploadFile"
```

To use this cUrl command in a powershell script:

```
curl.exe '-F', 'File=@C:\temp\Document.docx',
 '-F', 'FileSystemPath=ImportDirectory',
 '-H', 'Apikey: xxx',
 '-H', 'Applicationelementid: E7870B3EFDD5416BD7BE2C8AA660DDB8',
 'https://customer.ultimo.net/api/v1/action/_REST_UploadFile'
```


# LDAP

If LDAP integration is active on an on premises environment and there is a direct connection setup between Ultimo and a directory service, like Active Directory, the LDAP implementation should be reconfigured when migrating to the cloud. For more details, see the [LDAP Cloud vs On Premises](/connectors/ldap/cloud-vs-on-premises) page.


# Setup standard MS Entra ID authentication

This page provides instructions for enabling the default SSO implementation and outlines important considerations for user management. This content applies only to the default SSO implementation.

## Enable standard SSO with MS Entra ID

In the environment, open the **Ultimo Configuration Tool** and, from the left-hand menu, navigate to **AET** at the **Application** level. On the right side of the screen, you will see several tabs, including **Basic**, **Groups**, and **Settings**. Select the **Settings** tab, search for **"Microsoft"**, and click **Edit**. Then enable the "**Allow Microsoft Authentication"** setting.

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2Fk1CeFPi8KZsr6WWHnHQB%2Fimage.png?alt=media&amp;token=51c2a22e-d41b-4e18-81f7-4310d4140187" alt=""><figcaption><p>Example of enabled setting</p></figcaption></figure>

![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FH9pyAKZl46lsgSGJm92i%2Fimage.png?alt=media\&token=a4e1da91-294d-478f-8ee6-6c2920095066)

When enabled, on the login page a new button will appear to login with Microsoft.

{% hint style="info" %}
Only active user accounts that receive an activation link can actually login using this new button
{% endhint %}

## Add new users

In Ultimo in the UCT>User manager you can add new users. Fill in the mandatory field. You can ignore the password and authentication fields. When the user receives the activation email, based on what is allowed in the Ultimo application, they decide for themselves how to log in and which fields to fill in. After you add the user, activate the account. Automatically, the user will receive an activation email with the required information.

## Reset existing users and invite them

All existing users log in with a different method. Either 'forms' or 'custom SSO'. To let them login with this new method you can reset the login method in the user manager. This can be done per user or via multiple select in a batch. Use optional filtering to determine the correct selection.

{% hint style="info" %}
Important to have the employees' e-mail address filled in at the employee record. Make sure it is only 1 (valid) e-mail address per record.
{% endhint %}

All activated users will receive an activation link. It is possible to reset inactive users but they wont receive an activation link.

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FCp9iRzZg9klIPbxBHrSI%2Fimage.png?alt=media&amp;token=54a3a9e4-687d-4086-b931-1be6906b3f64" alt=""><figcaption><p>Example of the user manager with the reset button pressed</p></figcaption></figure>

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FfqudIhxpErttYUTMlWaR%2Fimage.png?alt=media&amp;token=4416b9f5-837c-42e1-bb72-fc4c05882cf1" alt=""><figcaption><p>Example of the activation email</p></figcaption></figure>

If the link has expired, you can send a new invite by clicking the envelope icon in the user manager.

## Activation link

The user shares the account information with the Ultimo app when using the activation link, as shown in the dialog below. Our app is verified by Microsoft and is a trusted app.

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FqsQOYhnySumuW90s8PEu%2Fimage.png?alt=media&amp;token=a328348d-0274-4669-be9f-21674c8a80f8" alt=""><figcaption><p>Premission requested by IFS Ultimo app</p></figcaption></figure>

{% hint style="info" %}
In some organisations, the app needs to be approved by the IT department. Based on the settings in Entra Id, a user can request permission from IT via a dialog when they use the app or contact their IT department manually.&#x20;
{% endhint %}

Once the user links his organisation account with Ultimo, the activation step is finished, and from now on, the user can log in using the login button on the login page.

{% hint style="info" %}
Authentication is done at your organisation's identity provider. When enabled, multi-factor authentication is applied.
{% endhint %}

## Provisioning

Our standard SSO method is only applicable when using MS Entra ID. It is pure authentication. Although it is possible to maintain users manually, we advise [SCIM](/connectors/scim) to have user provisioning in place.


# Custom Microsoft Entra ID Authentication

## Creating new enterprise application

{% hint style="info" %}
**If you want to separate ultimo production and ultimo test, then we recommend to create two enterprise applications.**
{% endhint %}

Go to your Microsoft Entra ID and search for enterprise applications

![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MZmRVbbu75Ds8MiWx_F%2F-MamkxyiDBVlncSCyGjl%2F-Mamlg62M7aBk2KXrD3I%2Fimage001.png?alt=media\&token=4e9578f4-e6c0-4870-8306-0046d178e2a3)

Click on new application

![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MZmRVbbu75Ds8MiWx_F%2F-MamkxyiDBVlncSCyGjl%2F-Mamlg64Bc_4wdxRbG_1%2Fimage002.png?alt=media\&token=60b6ee94-7be3-4252-963f-47794f87ab44)

Click on create your own application

![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MZmRVbbu75Ds8MiWx_F%2F-MamkxyiDBVlncSCyGjl%2F-Mamlg65PB6yHmpoJMyM%2Fimage003.png?alt=media\&token=fca22ee4-1ba3-423f-877e-8c0665ae70af)

Create the application with the name Ultimo and the setting integrate any other application you don't find in the gallery (Non-gallery) and click on the bottom side on create.

![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MZmRVbbu75Ds8MiWx_F%2F-MamkxyiDBVlncSCyGjl%2F-Mamlg66ddovt1Ka-a_W%2Fimage004.png?alt=media\&token=4ca1a4d7-8079-44e6-bce5-468cbce72cda)

## Setup single sign on (SAML2)

Click on set-up single sign on

![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MZmRVbbu75Ds8MiWx_F%2F-MamkxyiDBVlncSCyGjl%2F-Mamlg675_vgSYjE3iYM%2Fimage005.png?alt=media\&token=b6235c8b-f8b0-4a5f-8b92-a24f6a6045db)

Click on SAML

![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MZmRVbbu75Ds8MiWx_F%2F-MamkxyiDBVlncSCyGjl%2F-Mamlg68w2-EFBTCekr5%2Fimage006.png?alt=media\&token=9ab63176-6d19-48fc-8f1f-9b8eff7e4bc2)

Click on Upload metadata file.

![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MZmRVbbu75Ds8MiWx_F%2F-MamkxyiDBVlncSCyGjl%2F-Mamlg69-saXtjwCRSZE%2Fimage007.png?alt=media\&token=8e3b1342-ddf4-4304-b134-a5ec94f46011)

Get the xml file by pasting /Saml2 behind the complete URL in an internet browser, taking the S-capitalization in mind:\
&#x20;`https://<customerurl>.ultimo.net/Saml2`

![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MZmRVbbu75Ds8MiWx_F%2F-MamkxyiDBVlncSCyGjl%2F-Mamlg6AWJ-EWOenWyNw%2Fimage008.png?alt=media\&token=0a8a68a5-e930-467d-bdc3-ad3f45c1f6ec)

Check if the input is correct and click on save.

\
&#x20;Identifier production: `https://<customerurl>.ultimo.net/Saml2`\
&#x20;Reply URL production: `https://<customerurl>.ultimo.net/Saml2/Acs`\
&#x20;Identifier test: `https://<customerurl>-test.ultimo.net/Saml2`\
&#x20;Reply URL test: `https://<customerurl>-test.ultimo.net/Saml2/Acs`

Check image below for details:

![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MZmRVbbu75Ds8MiWx_F%2F-MamkxyiDBVlncSCyGjl%2F-Mamlg6Bu7RK1RY9_Hgd%2Fimage009.png?alt=media\&token=4b86fb50-6202-4053-955a-93efac6a7e57)

## User assignment

Click on Users and groups

![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MZmRVbbu75Ds8MiWx_F%2F-MamkxyiDBVlncSCyGjl%2F-Mamlg6C427Zwskk3UFv%2Fimage010.png?alt=media\&token=7d4c0c74-3405-4b92-8135-f74caccc1a75)

Click on add user/group

![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MZmRVbbu75Ds8MiWx_F%2F-MamkxyiDBVlncSCyGjl%2F-Mamlg6Deabn9TDK9fPh%2Fimage011.png?alt=media\&token=651e8228-c7b6-4eca-ac75-d04779e101fc)

\- Click on none selected and invite users in case u want to invite users to the application, otherwise click on select a role and add the security group within Microsoft Entra ID to grant access.

{% hint style="info" %}
**If you don’t want to provide a domain account to Ultimo, please invite the consultant so he can use his Ultimo e-mail to test the SSO during implementation.**
{% endhint %}

![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MZmRVbbu75Ds8MiWx_F%2F-MamkxyiDBVlncSCyGjl%2F-Mamlg6ESOgvAHL-9vSn%2Fimage012.png?alt=media\&token=045a542c-689d-4b06-b172-6edfa07bd401)

If you invite users, then they have to accept the mail to gain access.

![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MZmRVbbu75Ds8MiWx_F%2F-MamkxyiDBVlncSCyGjl%2F-Mamlg6Fj06LW-tWdsTt%2Fimage013.png?alt=media\&token=03a69010-0b33-402f-8a9c-183101544ecd)

Send the following information to Ultimo so they can start the implementation:

App Federation Metadata Url\
Federation Metadata XML (Download XML and add as attachment)\
Domain account e-mail or **invitation to Ultimo app in previous step.**\
Domain account password or **invitation to Ultimo app in previous step.**<br>

![](https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MZmRVbbu75Ds8MiWx_F%2F-MamkxyiDBVlncSCyGjl%2F-Mamlg6GjlbwRYeXp917%2Fimage014.png?alt=media\&token=b01ffe25-45d8-4e85-bc82-4be06d1e5fb2)

## OpenID Connect (OIDC)

Select **Microsoft Entra ID** and then select **Manage** > **App Registrations** in the left side menu.

&#x20;

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FOboHkstqX0h4EFYlow5i%2Fimage.png?alt=media&amp;token=a660ec4a-80ac-4698-93a3-03c096b5e5ad" alt="" width="437"><figcaption></figcaption></figure>

&#x20;Click on New Registration and use the following values:

a.       Enter a **Name** for the application

b.       For **Supported account types** choose **Accounts in this organizational directory only**

c.       For **Redirect URI** choose **Web** and enter the URL of the environment, followed by '*signin-oidc'*. For example `https://customer.ultimo.net/signin-oidc`

d.       Press register

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FWCC3X1Ll9yaOSWlIc0EL%2Fimage.png?alt=media&amp;token=019d5229-f42b-4890-8cf1-5aba967877d4" alt=""><figcaption></figcaption></figure>

Go to **Authentication** on the left side menu, and check boolean '*ID tokens (used for implicit and hybrid flows)*'. Press save.

{% hint style="info" %}
**Based upon the customers’ preferences, it is also possible to use other methods of authenticating, including using ‘secrets’.**
{% endhint %}

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FVzJxGDXsfI7VCii7iwVG%2Fimage.png?alt=media&amp;token=2e517589-16b5-4da9-8f6e-e8b0c83282dd" alt=""><figcaption></figcaption></figure>

Go back to **Overview** from the left side menu, and copy the value of '*Directory (tenant) ID*'.&#x20;

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FD24vm6jeM9GAPvpTP3bI%2Fimage.png?alt=media&amp;token=d649ede3-828e-4c58-a42c-102e83596d73" alt=""><figcaption></figcaption></figure>

Click **Endpoints** on the top of the overview page and copy the value of '*OpenID Connect metadata document*'.

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FPUBOo4P6UtToFlgXobsd%2Fimage.png?alt=media&amp;token=83d2f860-b0c8-40d0-af04-568c0c02e3fa" alt=""><figcaption></figcaption></figure>


# Azure IP addresses

The following table describes regional static IP addresses:

| Region         | Inbound                                               | Outbound                                           |
| -------------- | ----------------------------------------------------- | -------------------------------------------------- |
| Australia      | 4.200.110.141                                         | 40.82.222.113                                      |
| Germany        | 20.79.64.32                                           | 20.79.214.248                                      |
| India          | 20.235.35.150                                         | 20.41.255.143                                      |
| Sweden         | 20.240.33.156                                         | 20.240.37.146                                      |
| United Kingdom | 4.158.57.205                                          | 4.158.0.208                                        |
| USA (East)     | 20.232.243.140                                        | 20.241.187.144                                     |
| West Europe    | <p>52.143.1.140<br>20.126.178.198<br>20.8.138.162</p> | <p>20.76.184.28<br>20.82.12.212<br>20.31.175.4</p> |

**SSL Certificate Revocation List**

To check the revocation status of the SSL certificate signed by Verisign that Ultimo uses, white-list the below entries (port 80) on your firewall policies and/or access control devices to ensure seamless access to the CRL services:

* \*.sectigo.com
* \*.comodoca.com
* \*.usertrust.com

More details can be found [here](https://support.sectigo.com/PS_KnowledgeDetailPage?Id=kA01N000000brkT).


# Microsoft Entra ID SCIM provisioning

Currently, Ultimo supports SCIM 2.0 to integrate Ultimo with an IDP like Microsoft Entra ID or Okta.

## Creating new enterprise application

This step is already described in <https://developer.ultimo.net/azure-documentation/azure-authentication#creating-new-enterprise-application>. In case you already registered one for SSO, you can use that one.

## Setup provisioning

Under *Enterprise Application* created at the above step, click on *Provisioning:*

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FuMHPtRQE2gQsfOKUtoRn%2Fimage.png?alt=media&amp;token=2e8ec982-91a4-4163-a52d-10f1c31f73dd" alt=""><figcaption></figcaption></figure>

On the *Provisioning* page click *Get started*.

Under *Provisioning Mode*, select *Automatic*.

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FrJJEkhX8x4ouj0Ba0aSO%2Fimage.png?alt=media&amp;token=253fab1e-a35c-4a02-8a59-8bdbd0d8a93a" alt=""><figcaption></figcaption></figure>

Under *Admin Credentials* use "*Bearer Authentication*" enter *Tenant Url* and *Secret token*.

Tenant Url: \<customurl>.ultimo.net/scim

Secret token: Taken from *Ultimo Configuration Tool*

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FJZL6bQ3E9e6R0wsmJcYy%2Fimage.png?alt=media&amp;token=7c1010e5-c344-4a38-b0fc-6772193b9f50" alt=""><figcaption></figcaption></figure>

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FOjvjQ34p151Z80CxpymX%2Fimage.png?alt=media&amp;token=2dab6323-1b1c-4209-934c-b7783de8bd45" alt=""><figcaption></figcaption></figure>

Under *Mappings*, click on *Provision Azure Active Directory Groups.* This opens the *Attribute Mapping* dialog for groups.

Disable Provision Azure AD for groups. This is not supported by Ultimo.

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FHSlyDa2LkpIr9kZctAOa%2Fimage.png?alt=media&amp;token=a9171ee3-f6e3-45b7-8df7-e01a931786db" alt=""><figcaption></figcaption></figure>

Under *Mappings*, click on *Provision Azure Active Directory Users.* This opens the *Attribute Mapping* dialog for users.

Enable Provision Azure AD for users.

Under *Target Object Actions* check *Create*, *Update* and *Delete*

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FcUXTRdIjdBVivPhBqhvC%2Fimage.png?alt=media&amp;token=363586d0-af65-49b4-87ee-732814ff1b50" alt=""><figcaption></figcaption></figure>

In Attribute Mappings, map the *customappsso Attributes* to the *Microsoft Entra ID Attributes* as follows (you should check the *Attribute mappings* sub-chapter for more details on the attributes supported by Ultimo SCIM provisioning):

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2F9Bi718hryTRFPJeg6EP6%2Fimage.png?alt=media&amp;token=72c23632-5cb6-443d-9095-28dddf01f7fe" alt=""><figcaption></figcaption></figure>

This is an important step, please carefully look at the mapping. Compare a user in Microsoft Entra ID to see what attributes are in use and how this is linked to Ultimo otherwise, SCIM might not work as intended.&#x20;

Click *Save.*

Optional: Under *Settings* > *Scope* section select *Sync only assigned users and groups*. This setting is advised. The alternative is to *sync all users and groups* but this might lead to the creation of many accounts.

Optional: Go to Source Object Scope (default all records) and add a filter to limit the dataset. In that way, only objects that meet the criteria will be synchronized.

Set the *Provisioning Status* to *On.*<br>

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FRbk6hDBjNhv49hgNOO62%2Fimage.png?alt=media&amp;token=e035190d-a64b-4ad0-aa42-ac9f47539236" alt=""><figcaption></figcaption></figure>

Click *Save*.

Under the *Overview* page make sure provisioning is started.<br>

<figure><img src="https://4033746893-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZmRVbbu75Ds8MiWx_F%2Fuploads%2FWLhyBYJfTGc40VLs1zCL%2Fimage.png?alt=media&amp;token=43777073-2469-4ef6-b97a-e1bad7a93e07" alt=""><figcaption></figcaption></figure>

In the menu option ‘Users and groups’, specific users or groups can be added which is important when the scope is set to: *Sync only assigned users and groups.*

Microsoft Entra ID runs a SCIM synchronization every 40 minutes. Changes in Microsoft Entra ID are not reflected immediately in Ultimo.

## Attribute-mappings

Under Mappings you can edit the user attributes that are supported by target application. For now, Ultimo supports user accounts provisioning and in order to function as expected the following attributes should be configured: &#x20;

* **username** attribute in Ultimo is populated with the userPrincipalName value of the Microsoft Entra ID user. In Ultimo this value is used as user's identifier. (*This value should be consistent and unique over time because it won't be updated after insertion. Think about reusing accounts.*)
* **active** attribute is a boolean value indicating the users's administrative status. To set the value is recommended to use expression 'Switch(\[IsSoftDeleted], , "False", "True", "True", "False")'. In Ultimo the user is activated(when value is true)/deactivated(when value is false).
* **displayName** attribute should be the full name of the user being described and direct mapped to the displayName of  Microsoft Entra ID user. In Ultimo this value is used as user's description.
* **title** represents the user's title and should be mapped to the jobTitle of  Microsoft Entra ID user. In Ultimo this represents the user's profession.
* **emails\[type eq "work"].value**: email values with attribute's function of type work. In Ultimo only the preferred attribute (primary = true) email of type work is stored as user's email address.
* **name.givenName**: represents the first name of the User. It's recommended to be populated with the givenName value of Microsoft Entra ID user.
* **name.familyName** represents the family name of the user. It is recommended to be populated with the surname value of Microsoft Entra ID user.
* **phoneNumbers\[type eq "work"].value**: phoneNumber values with attribute's function of type work. In case of multiple values it is selected the one with the preferred attribute true (primary = true). If there is only one value then that one is selected. In Ultimo user's phone will be populated with this value.
* **phoneNumbers\[type eq "mobile"].value**: phoneNumber values with attribute's function of type mobile. In case of multiple values it is selected the one with the preferred attribute true (primary = true). If there is only one value then that one is selected. In Ultimo user's mobile phone will be populated with this value.
* **employeeNumber**: represents a string identifier assigned to a user. In Ultimo this is used to set the employee code.
* **department**: represents the name of department. When provided and the value is valid, user's department is updated in Ultimo.
* **organization**: represents the office location of Microsoft Entra ID user. When provided and the value is valid, user's company is updated in Ultimo.
* User's **site** can be updated in Ultimo. There is no default Microsoft Entra ID property mapped for this, feel free to choose the AD property which represents the site in Ultimo.

## Remarks

New users are added to a default group which can be set in the application.

When the source attribute is updated in the (IDP) to an empty value, the SP (IFS Ultimo) won't be notified.&#x20;

## Additional information:

* [How provisioning works in Azure Active Directory](https://learn.microsoft.com/en-us/azure/active-directory/app-provisioning/how-provisioning-works)
* [System for Cross-domain Identity Management: Protocol](https://datatracker.ietf.org/doc/html/rfc7644)
* [System for Cross-domain Identity Management: Core Schema](https://datatracker.ietf.org/doc/html/rfc7643)


# Crystal Reports

This page outlines our journey to modernize our reporting stack and strategically phase out Crystal Reports. Over the years, Crystal Reports has served as a critical component of our reporting landscape. However, evolving business needs, scalability requirements, integration capabilities, and user expectations now require a more flexible, maintainable, and future-ready solution.

The following links may be useful for you:

[Reporting strategy](/reporting/crystal-reports/reoporting-strategy)

[Alternatives](/reporting/crystal-reports/alternatives)

[List of removed reports](/reporting/crystal-reports/list-of-removed-reports)


# Reoporting strategy

We are evolving our reporting strategy to provide a more modern and scalable reporting experience. By transitioning away from legacy technologies and investing in a new reporting technique, we can offer improved performance, a cloud-ready architecture, and enhanced support for specific functionalities within our product.


# Alternatives

This page provides an overview of the available alternatives to Crystal Reports within our modern reporting stack. It outlines the recommended tools, their intended use cases, and guidance on when to choose each option.


# List of removed reports

This page provides an overview of the standard reports that have been removed as part of our reporting modernization initiative. For each report, you will find information about available alternatives and recommended replacement solutions, where applicable. Our goal is to ensure transparency and help you quickly identify the best path forward.


