Symptoms

When synchronizing/entering a mobile application section, the following error is displayed:

Type: Terrasoft.SourceCodeException 

Message: Uncaught TypeError: Cannot read property 'ColumnConfigs' of null 

Additional information: 

        Script: file:///android_asset/www/Common/Terrasoft.Mobile.Combined.js%0D%0A%09Line: 19048 

Calls sequence: 

    at Ext.define.showException (file:///android_asset/www/Common/Terrasoft.Mobile.Combined.js:33105:41

    at Ext.define.showUncaughtException (file:///android_asset/www/Common/Terrasoft.Mobile.Combined.js:1965:25

    at window.onerror (file:///android_asset/www/Common/Terrasoft.Mobile.Combined.js:1666:20)

Cause

Schema duplication in the manifest

Solution

#1

In the base MobileApplicationManifest schema of the Mobile package change the following string:

…
Models: {
    …
    Activity: {
        …
        RequiredModels: [
            'Contact', 'ActivityType', 'ActivityStatus',
            'ActivityResult', 'ActivityCategory', 'ActivityPriority', 'Contact', 
            'Account', 'Opportunity', 'Lead', 'ActivityParticipantRole',
            'ActivityParticipant', 'ActivityCategoryResultEntry', 'ActivityCorrespondence', 'Activity'

Remove duplicate "Contact" value

#2

Update mobile app to a more recent version.

Necessary conditions and possible restrictions

BPMonline Version 7.1.0 - 7.5.0

Mobile application version:

Android 7.6.2. - 7.6.3.

iOS 7.6.2

Like 0

Like

Share

0 comments
Show all comments

Symptoms

Type: Terrasoft.ODataSecurityException% 0D% 0A Message: Not enough rights to change the record in the object "Activity"% 0D% 0A Additional information:% 0D% 0A% 09 {"error": {"code": "5", "message": {" lang ":" "," value ":" Not enough rights to change the record in the object \ "Activity \" "}," innererror ": {" message ":" Not enough rights to change the record in the object \ "Activity \" ", "type": "System.Security.SecurityException", "stacktrace": "in Terrasoft.Core.Entities.Entity.UpdateInDB (Boolean validateRequired) \ r \ n in Terrasoft.Core.Entities.Entity.Save (Boolean validateRequired) \ r \ n in Terrasoft.Core.Entities.Services.EntityLazyProxy.SaveChanges () \ r \ n in Terrasoft.Core.Entities.Services.ServiceContext.SaveChanges () \ r \ n in System.Data.Services.DataService`1. HandleNonBatchRequest (RequestDescription description) \ r \ n in System.Data.Services.DataService`1.H andleRequest ()"}}}%0D%0A% 0D%0A

Type: Terrasoft.ODataSecurityException% 0D% 0A Message: Not enough rights to change the record in the object" Activity "% 0D% 0A Additional Information:%0D%0A%09 {" error " : {"code": "5", "message": {"lang": "", "value": "Not enough rights to change the record in the object \" Activity \ ""}, "innererror": {"message" : "Not enough permissions to change the record in the \" Activity \ "", "type": "System.Security.SecurityException", "stacktrace": "in Terrasoft.Core.Entities.Entity.UpdateInDB (Boolean validateRequired) \ r \ n in Terrasoft.Core.Entities.Entity.Save (Boolean validateRequired) \ r \ n in Terrasoft.Core.Entities.Services.EntityLazyProxy.SaveChanges () \ r \ n in Terrasoft.Core.Entities.Services.ServiceContext.SaveChext ) \ r \ n in System.Data.Services.DataService`1.HandleNonBatchRequest (RequestDescription description) \ r \ n System.Data.Services.DataService`1.HandleRequest () "}}}%0D%0A%0D% 0A

Type: Terrasoft.ODataSecurityException% 0D% 0APost: Not enough permissions to change the record in the" Activity "% 0D% 0AAdditional information: % 0D% 0A% 09 {"error": {"code": "5", "message": {"lang": "", "value": "Not enough rights to change the record in the object \" Activity \ "" }, "innererror": {"message": "Not enough rights to change the record in the object \" Activity \ "", "type": "System.Security.SecurityException", "stacktrace": "in Terrasoft.Core.Entities. Entity.UpdateInDB (Boolean validateRequired) \ r \ n in Terrasoft.Core.Entities.Entity.Save (Boolean validateRequired) \ r \ n in Terrasoft.Core.Entities.Services.EntityLazyProxy.SaveChanges () \ r \ n in Terrasoft. Core.Entities.Services.ServiceContext.SaveChanges () \ r \ n in System.Data.Services.DataService`1.HandleNonBatchRequest (R equestDescription description) \ r \ n in System.Data.Services.DataService`1.HandleRequest ()"}}}% 0D%0A% 0D%0A

Cause

The access rights to the objects of the mobile application are not distributed and the organizational structure is not updated.

Solution

1. If the user has not been previously added to the configuration, then go to the “Configuration Management”, “Administration: Access to Objects” menu, detail “Access to default records: Change” and add a user/role;

2. Perform the action “Update the organizational structure”;

3. Distribute access rights to mobile application objects;

4. Re-sync from your mobile device.

Necessary conditions and possible restrictions



Access to the system under a user account with administrator rights.

Like 0

Like

Share

0 comments
Show all comments

Symptoms

The mobile app cannot synchronize in online mode (but syncs fine in offline mode).

Cause

In some configurations of IIS and .NET Framework, ASP.NET avoids special characters while processing the URL. URLs containing the "$" symbol are used when integrating with OData (bpm'online mobile application). This feature can be turned in the web.config file.

Solution

Perform the following steps with system administrator rights.

  1. Go to the folder with the application source files (for example, C:\bpm\7.8.0.1681_SalesEnterprise_Softkey_MSSQL_ENU). The path to the folder is arbitrary, and is usually specified by the system administrator of the application.
  2. Using notepad, open the web.config file found in the root folder.
  3. Find the section (Ctrl + F).
  4. Add the following string to this section - 
  5. Save the changes.

  6. Open the second web.config file, located in the folder with the Terrasoft.WebApp application (for example, "C:\ bpm\7.8.0.1681_SalesEnterprise_Softkey_MSSQL_ENU\Terrasoft.WebApp") and repeat steps 2-5.
  7. Reload the application on IIS and clean Redis.

We recommend creating backups of both web.config files before you start. 

Note: This situation occurs only when using the online mode - https://academy.bpmonline.com/documents/mobile/7-13/onlineoffline-modes

Necessary conditions and possible restrictions

System administrator rights.

 

Like 0

Like

Share

0 comments
Show all comments

Question

The list of orders is not displayed correctly in the mobile app. How should I set up the application to sort the orders by registration date (the latest added order should be at the top)?

Answer

To sort by a specific column, you need to implement additional logic in the mobile app manifest. For example:

Terrasoft.sdk.GridPage.setOrderByColumns("Order", {
    column: "CreatedOn",
    orderType: Terrasoft.OrderTypes.DESC
});

This happens because there was no default sorting mechanism in this mobile application section. Below is an example:

 

- Add the “UsrTestOrderMobile” object with the required columns

- Register the detail in the detail wizard

- Add detail in the mobile application wizard

- Configure the sorting mechanism. Create a new custom schema, e.g., “UsrMobileUsrTestOrderMobileModuleConfig” with the following code:

Terrasoft.sdk.GridPage.setOrderByColumns("UsrTestOrderMobile", {
    column: "UsrName",
    orderType: Terrasoft.OrderTypes.DESC
});

- Save changes

- Connect it to the manifest in the “Models” section of the required “PagesExtensions” detail object

- clear the cache and re-synchronize (to get the most recent settings)

Important:



- make sure all the necessary columns are synchronized in the import settings (ModelDataImportConfig)



- make sure there was a primary column (which is used for sorting) for display in an object or at the code level (below is an example):

Terrasoft.sdk.GridPage.setPrimaryColumn("UsrTestOrderMobile", "UsrName");
Terrasoft.sdk.RecordPage.addColumn("UsrTestOrderMobile", {
        name: "UsrName",
        position: 1
    }, "primaryColumnSet");

 

Like 0

Like

Share

0 comments
Show all comments

Case

Added a custom "Project" field to the activity, which is required. Because of this, I can not now create an activity in the mobile application. Is it possible to fix this by leaving the “Project” field required?

Cause

Setting up fields in the [Mobile Application Wizard] for the Activities / Accounts sections does not work correctly. Fixed in the latest release versions.

Goal

Add a custom field to the Activity section for the mobile application.

Necessary conditions

Access to the system with administrator rights.

Solution

1. Update the system to the latest release version (released after 05/01/2015).

2. In the [Mobile Application Wizard] set up the appropriate columns.

During set up, it is important to:

1. Save the changes on the section page.

2. Save changes for the mobile application as a whole.

Like 0

Like

Share

0 comments
Show all comments

Symptoms

In the sales outlet card, when populating the "Delivery time from" and "Delivery time to" fields from a tablet, the time is converted to a different time zone during synchronization with a desktop application. For example, if you populate the fields with 17:00 and 18:00 respectively, the desktop app will display the time as 14:00 and 15:00. Moreover, once synchronized, the fields on the mobile app will display 14:00 and 15:00 as well.

Cause

Fixed in version 7.8

Solution

The fix (which avoids transferring any server changes from version 7.8) is provided below:

Step 1

Create the UsrSyncExtension ("Module" type) schema in a custom package.

Step 2

Add the following code to the schema:

var sysAdminUnitStore = Ext.create("Ext.data.Store", {model: "SysAdminUnit"});
sysAdminUnitStore.setProxy("odata");
sysAdminUnitStore.load({
    queryConfig: Ext.create("Terrasoft.QueryConfig", {
        modelName: "SysAdminUnit",
        autoSetProxy: false,
        columns: ["TimeZoneId"]
    }),
    filters: Ext.create("Terrasoft.Filter", {
        property: "Contact",
        value: Terrasoft.CurrentUserInfo.contactId
    }),
    callback: function(records, operation, success) {
        if (success === true && records.length > 0) {
            var firstRecord = records[0];
            var timeZoneCode = firstRecord.get("TimeZoneId");
            if (!Ext.isEmpty(timeZoneCode)) {
                var timeZoneStore = Ext.create("Ext.data.Store", {model: "TimeZone"});
                timeZoneStore.setProxy("odata");
                timeZoneStore.load({
                    queryConfig: Ext.create("Terrasoft.QueryConfig", {
                    modelName: "TimeZone",
                    autoSetProxy: false,
                    columns: ["Offset"]
                }),
                filters: Ext.create("Terrasoft.Filter", {
                    property: "Code",
                    value: timeZoneCode
                }),
                callback: function(timeZoneRecords, timeZoneOperation, timeZoneSuccess) {
                    if (timeZoneSuccess === true && timeZoneRecords.length > 0) {
                        var timeZoneRecord = timeZoneRecords[0];
                        var offset = timeZoneRecord.get("Offset");
                        var offsetValue = 0;
                        if (!Ext.isEmpty(offset)) {
                            offset = offset.replace("GMT", "");
                            if (!Ext.isEmpty(offset)) {
                                var sign = (offset.substring(0, 1) === "-") ? 1 : -1;
                                var hours = parseInt(offset.substr(1, 2));
                                var minutes = parseInt(offset.substr(4, 2));
                                offsetValue = sign * (hours * 60 + minutes);
                            }
                        }
                        Terrasoft.Configuration.CurrentUserTimeZoneOffset = offsetValue;
                    }
                },
                scope: this
            });
        }
    }
},
scope: this
});
 
if (!Terrasoft.Configuration.processColumn) {
                Terrasoft.Configuration.processColumn = Terrasoft.OData.ResponseParser.processColumn;
}
 
Terrasoft.OData.ResponseParser.processColumn = function(data, queryConfig, record, columnName) {
                var model = record.self;
                var columnConfig = model.ColumnConfigs.get(columnName);
                var columnValue = data[columnName];
                if ((columnConfig.columnType === Terrasoft.ColumnTypes.date ||
                               columnConfig.columnType === Terrasoft.ColumnTypes.datetime) &&
                               !Ext.isEmpty(Terrasoft.Configuration.CurrentUserTimeZoneOffset)) {
                               if (columnValue.indexOf("/") !== -1) {
                                               var timeZoneOffset = Terrasoft.Configuration.CurrentUserTimeZoneOffset;
                                               columnValue = new Date(parseInt(columnValue.substr(6)));
                                               columnValue = new Date(columnValue.getTime() + timeZoneOffset * 60 * 1000);
                               } else {
                                               columnValue = Terrasoft.util.convertISOStringToDate(columnValue);
                               }
                               record.set(columnName, columnValue);
                } else {
                               Ext.callback(Terrasoft.Configuration.processColumn, Terrasoft.OData.ResponseParser, arguments);
                }
};

Step 3

Add the manifest of the mobile application to the current package (the manifest of the corresponding workplace) and add the UsrSyncExtension schema to it (namely, add it to SyncExtensions and CustomSchemas):

"SyncExtensions": [
                               "UsrSyncExtension"
                ],
                "CustomSchemas": [
                               "UsrSyncExtension"
                ],

The code gets the current user's time zone from SysAdminUnit, and uses the received time zone during synchronization and input.

Like 0

Like

Share

0 comments
Show all comments

Question

It is necessary to open external access to bpm'online only for mobile application services.

Please specify which services the mobile application uses for its operation?

Answer

Integration is carried out through O'Data on the site port.

Services used by the mobile application in version 7.8.2:

http://server/ServiceModel/AuthService.svc

http://server/0/Services/ProfileService.asmx

http://server/0/Mobile/Services/MobileDataService.ashx

http://server/0/Mobile/Services/MobileCodeService.ashx

http://server/0/ServiceModel/EntityDataService.svc

The list of services in subsequent updates of the mobile application may be different.

Like 0

Like

Share

0 comments
Show all comments

Question

How to set up a filter in a mobile application so that the data is loaded only by a certain parameter (for example, only Opportunities at a certain stage)?

Answer

You must configure the following parameters:

LEADS: Only show leads with the LEAD STAGES: Registration and Qualification.

OPPORTUNITIES: Only show opportunities with the OPPS STAGES: Presentation, Proposal, Negotiation and Pending.

Use the following code (for Leads):

Terrasoft.sdk.Module.addFilter("Lead", Ext.create("Terrasoft.Filter", {
    type: Terrasoft.FilterTypes.Group,
    logicalOperation: Terrasoft.FilterLogicalOperations.Or,
    subfilters: [
        {
            property: "QualifyStatus",
            value: "d790a45d-03ff-4ddb-9dea-8087722c582c"
        },
        {
            property: "QualifyStatus",
            value: "14cfc644-e3ed-497e-8279-ed4319bb8093"
        }
    ]
}));

First, we need to create new modules with a filtering code separately for Leads, and separately for Opportunities:

Then, in the configuration, select a workplace (if you have several) to which we will apply the filter, in our case MobileApplicationManifestOn_the_Road

We need to add created modules with filters in those sections that include filters, in this case in Lead and Opportunity in PageExtentions:

Save.

Like 0

Like

Share

2 comments

Code helped me. But If I search with other status(other than statuses mentioned in subfilters) in Lead, records do not list. For by On load this subfilters should work. But if I search with other than status , those also should list upon searching.

Is it possible. Please help me

Sriraksha KS,

If I understood you correctly, you want the subfilters, which described above to be displayed when you click on quick filter option on the section.

Unfortunately, there is no way to transfer the on load filters to the quick filters. If using on load filters, the records will be initially filtered and quick filters would be added to them.

In case I have misunderstood your task, please describe it more detailed, a screenshot would be appreciated.

Regards,

Anastasia

Show all comments

Question

I can't sync my Customer Engagement Center demo site with mobile application. The error I am getting contains - },"requestId":20,"status":200,"statusText":"OK","responseText":"{\"Code\":1,\"Message\":\"Either invalid login or password specified, or your user account is inactive.Verify that you have entered correct data or contact support service.\"

Answer

For bpm'online 7.5 mobile application is available in Sales editions (Team, Commerce, Enterprise, Omnichannel) only.

Like 0

Like

Share

0 comments
Show all comments

Android

Requirements

  • A computer running Windows;
  • Chrome
  • Mobile device running Android

1. Download Vysor chrome extension for Chrome

2. Connect your mobile device to a PC or laptop

3. Launch Vysor

4. In the list of available devices, select your device and click "View"

5. The Vysor app will be installed on your device and a window will open in which the device screen will be displayed.

iOS

Requirements:

A computer running MacOS;

Mobile device running iOS.

1. Connect your mobile device to a computer running MacOS

2. Run QuickTime Player

3. Click "New Movie Recording" 

4. In the window that opens, open the dropdown near the recording icon and select the device that is connected to the computer

 

Like 1

Like

Share

0 comments
Show all comments