×

Please give details of the problem

Docs

Find

    Developer Guide

      1. Todo Validation
    1. Release Your User Login
    1. Markdown Template
      1. Backloop
      2. JavaScript Inclusion
      3. Task Reminder Email
      4. Variable Mapping
      5. SubProcess
      6. PDF
    2. Trigger
      1. Lock
      2. Dynamic Variable
      3. List 1000+ Objects
      4. JSONObject Creation
      5. JSONArray Conversion
      6. Number Currency Format
      7. Error Handling
      8. JSONObject Concatenation
      9. Freemarker Container Test
      10. Number Test
      11. Loop
      12. File Visibility
      13. List Hash Sequence
      14. Special Freemarker Characters
      15. Array To List
      16. Salesforce Computation
      17. Metadata
      18. JSONObject Keys Values
    1. Delegation
    2. Access Rights
    3. Dynamic Lanes
    4. Runtime Lanes
    5. Scripted Lanes
    6. Compound Organization Hierarchy
      1. Array From WS
      2. Column Inactivation
      3. Holidays
      4. List Reinitialization
      5. ArrayJSON to JSONArray
      6. Print JSONObject
      7. Invalid Fields
      8. Number Currency Format
      9. Google Tables
      10. Initialization Widget Date
      11. Date
      12. JQuery
      13. Round
      14. Inject JSONObject
      15. Label Modification
      16. Launch Process JQuery
      1. CSS Personalization
      2. CSS Examples
      1. Tags
      2. Retrieving Variables Values
      3. Dialog Window
      4. Autocomplete Widget
      5. JavaScript Report
      6. User Lane Picker
        1. Chart Dashboard Collection
        2. Chart Dashboard
        3. Report Chart
        4. Google Visualization
      7. Collection
      8. Dynamic List
      9. Summing Array
      10. API Listener
      11. File Preview
    1. Performance
      1. Custom Login Page
      2. Redirection ExecutionMode
      3. Mobile Devices
        1. homepage.js
        2. homepage.css
      4. Logout
      5. Header
      6. Menu Bar
      7. Information Tags
      8. Basket
    1. Mobile
    2. Offline
        1. Collections
          1. Process General Tab
            1. Process Step Output Variables
              1. Process Task Email Tab
              2. Process Task SubProcess Tab
              3. Process Task Functional Tab
              4. Process Task Connector Tab
              5. Process Task Manual Tab
              6. Process Task Loop Tab
              7. Process Task Script Tab
            2. Process Step Input Variables
            3. Gate
            4. Process Step Testing Variables
              1. Process Intermediary Event
              2. Process Timer Event
              3. Process Start Event
          2. Process Variables Tab
          3. Process Measures Tab
          4. Process Design
          5. Process Input Tab
          1. Organization
          2. Roles entities
          1. Project Collection Tab
          2. Project Definition Tab
          3. Version
          4. Project Versioned Files Tab
          5. Project Files Tab
          6. Project Description Tab
          7. Project Version Tab
          8. Project Rights Tab
          1. Connectors
          2. Providers
          3. Processes
          1. Composite API Configuration Tab
          2. Composite API Design Tab
        2. Custom Lists
        3. Revision
            1. Image Widget
            2. Spinner Widget
            3. FileUpload Widget
            4. Section Widget
            5. Multi Checkbox Widget
            6. URLInput Widget
            7. RadioButton Widget
            8. Array Widget
            9. Captcha Widget
            10. Checkbox Widget
            11. Report Widget
            12. Geolocation Widget
            13. Button Widget
            14. Custom Widget
            15. TextInput Widget
            16. Tree Widget
            17. List Widget
            18. StaticText Widget
            19. HTML Editor Widget
            20. JavaScript Widget
            21. Tab Widget
            22. HTML Widget
            23. ProgressBar Widget
            24. History Widget
          1. Web Interface Stylesheet Tab
          2. Web Interface Design Tab
          3. Web Interface Analytics Tab
          4. Web Interface Collection Tab
          5. Web Interface API Tab
          6. Web Interface Implementation Tab
          7. Web Interface JS Tab
        1. Scheduled Process
        2. Messages
        1. Configuration
        2. Users
        3. Usage
        1. Connectors
        2. Process Examples
      1. Customer Management
          1. Measuring
          2. Parameters
          3. Execution Path
          4. Runtime Users
        1. Web Interface Reports
        1. Files
        2. Home
        3. My Applications
      1. Collections To Array
      2. Collections BackOffice
      3. Collection JS Freemarker
      4. Collections To List
      1. Composite API Example
      1. Process Reporting API

    Use Process Reporting APIs

    When you submit a webinterface and trigger a process, you create process instances. Those instances are stored within a RunMyProcess internal database, and you can query them by configuring process reports from IDE, or by using the Process Reporting APIs.

    In this tutorial, we will explain step by step how to configure a Composite API to query the Process Reporting API. This will enable you to create charts dashboards, to use the reporting data in a RunMyProcess application or to expose it to a third-party application.

    Technically, configuring a process report by adding columns and filters will build a specific url so you can retrieve the process instances matching criterias. The purpose of this tutorial is to understand how this url is built, how the parameters are passed, so you can retrieve process instances via APIs without using native reports (and inject that information in Webinterfaces for example).

    Basic Use Case

    Let's assume a simple use case for the sole purpose of this tutorial.

    You have developped a car purchase application in which every instance is an order associated to an amount and some car details. If the application is supposed to manage stocks, then you'll need to compare how many cars were available in the first place in a specific country with how many were purchased in that country. Comparing those numbers will give you the remaining ones, available for purchase in this country.

    The goal is to be able to display the number of remaning cars to a end user that is willing to order a new car to prevent him from purchasing non-available cars.

    In that case, the "number of cars purchased for a specific country" can be retrieved using Process Reporting APIs since all the necessary data is already present in process instances.

    Process and report configuration

    After drawing your process, you had configured measures to be used as custom columns or filters in your webinterface and process reports.

    Here's the list of measures in our example process:

    main_process_v1

    Here's a process report displaying process instances:

    main_process_v1

    This process report can have static filters and can also filter on connected user's metadata. You could save it and embed it into your webinterfaces.

    Let's add the filters car_country == "Italy" and car_price < 500000:

    main_process_v1

    Then click on RSS feed icon (1). That should open a new tab in your browser. Url looks like:

    1
    2
    3
    4
    5
    6
    7
    https://live.runmyprocess.com/live/118401407363362072/request?
    nb=20&
    first=0&
    column=name%20status%20measure_1%20measure_1%20measure_3%20measure_4%20measure_5&
    filter=PROJECT%20MODE%20MEASURE_1%20MEASURE_4%20PARENT%20PROCESS
    operator=EE%20EE%20EE%20LT%20IS%20EE&
    value=85524%20TEST%20Italy%20500000%20NULL%20109611&
    

    and xml content looks like:

    main_process_v1

    Every entry node is a process instance. So a process report actually calls the report feed url, then parse the xml feed and render it in a table view.

    Process Reporting API

    Let's have a closer look to the report feed url:

    nb is the number of items to retrieve

    first is the starting index of the query

    column is the list of custom columns (=measures) to be displayed.

    1
    name%20status%20measure_1%20measure_1%20measure_3%20measure_4%20measure_5
    

    name and status are system measures, whereas measure_x are the custom measures you've created:

    main_process_v1

    filter is the list of measures you're filtering on

    1
    2
    3
    4
    5
    6
    PROJECT:    filter on instances that belong to a specific project (by default it's the current project)
    MODE:       filter on execution mode (TEST/ACCEPTANCE/LIVE)
    MEASURE_1:  filter on car_country
    MEASURE_4:  filter on car_price
    PARENT:     filter on instances related to a subprocess (PARENT = ANY) or to father processes only (PARENT = NULL)
    PROCESS:    filter on process id
    

    operator is the list of operators to be applied on filters

    1
    2
    3
    4
    5
    6
    7
    8
    EE  means Equal(=)
    LT  means Lower Than (only for numeric measures)
    GT  means Greater Than (only for numeric measures)
    IS  means Equal (only for system measures)
    CONTAINS means Contains (designed for strings)
    NOT_CONTAINS means Doesn't contain (designed for strings)
    IN means Appears In the following list separated by coma (ex : country IN France,USA
    NOT_IN means opposite of IN
    

    value is the list of values to be applied on related filters & operators

    So basically the query we try to perform is:

    1
    2
    3
    4
    5
    6
    PROJECT     EE  85524
    MODE        EE  TEST
    PARENT      IS  NULL
    PROCESS     IS  109611
    MEASURE_1   EE  Italy
    MEASURE_4   LT  500000
    

    Configure a Composite API to perform queries on process instances

    Let's build a Composite API that will accept as input parameters country and max_price and that will return the list of matching cars as JSON.

    Create the provider.

    Create a new Provider. For the 3 environments, fill in url with https://live.runmyprocess.com/ and Authentication scheme with RunMyProcess Secured Connection.

    bad_design_main_process

    Create the connector

    From the provider, create a new Connector. Connector url is

    1
    2
    3
    4
    5
    6
    7
    live/118401407363362072/request?
    nb=20&
    first=0&
    column=name%20status%20measure_1%20measure_3%20measure_4%20measure_5&
    operator=EE%20EE%20EE%20LT%20IS%20EE&
    value=85524%20TEST%20${country}%20${max_price}%20NULL%20109611&
    filter=PROJECT%20MODE%20MEASURE_1%20MEASURE_4%20PARENT%20PROCESS
    

    Result format is XML, and Accept media type is application/atom+xml.

    Notice MEASURE_1 and MEASURE_4 values have been replaced by ${country} and ${max_price}.

    bad_design_main_process

    You should then be able to test your connector and pass input parameters:

    bad_design_main_process

    Create the Composite API

    Create a Composite API. Configuration tab:

    bad_design_main_process

    In Design tab, plug the connector you've created (1):

    bad_design_main_process

    then go to Output variables (2):

    bad_design_main_process

    Here's the freemarker script to parse raw XML ouput and create cars jsonArray variable:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <#assign entries = P_to_array(P_result.feed,"entry")>
    <#assign cars = []>
    <#list entries as x>
        <#assign categories = P_to_array(x,"category")>
        <#assign car = {}>
        <#list categories as x>
            <#switch x.@term>
                <#case "MEASURE_1">
                    <#assign car = P_json_put(car,"country",x.@label)>
                    <#break>
                <#case "MEASURE_3">
                    <#assign car = P_json_put(car,"id",x.@label)>
                    <#break>
                <#case "MEASURE_4">
                    <#assign car = P_json_put(car,"price",x.@label?number)>
                    <#break>
                <#case "MEASURE_5">
                    <#assign car = P_json_put(car,"purchase_date",get_date(x.@label?number,"yyyy-MM-dd HH:mm:ss z"))>
                    <#break>
            </#switch>
        </#list>
        <#assign cars = cars + [car]>
    </#list>
    ${cars}
    

    Save your Composite API and test it:

    bad_design_main_process

    Congratulations! You've just built a custom webservice relying on a Composite API, to search process instances based on country and max_price, with JSON output format.

    Note: this Composite API can be plugged to a RunMyProcess webinterface to configure an autocomplete widget, or a chart dashboard. You can also call this Composite API from a third party system.

    For more information, you can also consult the following pages