Question

We have check-ins and check-outs in our mobile application. After transferring them into the main application, where can I see them?

Answer

Unfortunately, this data is not displayed in the base version of our product. You can find this data in the DB table (CheckInOutResult). Your question requires development skills, which are taught by our company. We store information about the visit locally on the device and then transfer it during synchronization. Data acquisition at check-in (FieldForceMobileUtilitiesV2 schema):

checkInOut: function(activityId, isCheckIn) {
    Terrasoft.Geolocation.getCurrentCoordinates({
        success: function(latitude, longitude) {
            var checkinResultModelName = "CheckInOutResult";
            var saveQueryConfig = Ext.create("Terrasoft.QueryConfig", {
                modelName: checkinResultModelName,
                columns: ["GpsX", "GpsY", "Activity", "IsCheckIn", "ActionTime"]
            });
            var checkInOutRecord = Ext.create("CheckInOutResult", {
                Activity: activityId,
                GpsX: String(latitude),
                GpsY: String(longitude),
                IsCheckIn: isCheckIn,
                ActionTime: new Date()
            });
            checkInOutRecord.save({
                queryConfig: saveQueryConfig,
                success: function() {
                    this.changeActivityStatusByCheckInOut(isCheckIn);
                },
                failure: this.failureHandler
            }, this);
        },
        failure: this.failureHandler,
        scope: this
    });
},

The process of getting current coordinates is described in the “FieldForceMapsModule” schema. Also, the coordinates that bpm'online receives can be controlled. An example of the current implementation of the Terrasoft.Geolocation.getCurrentCoordinates method:

getCurrentCoordinates: function(config) {
   var enableHighAccuracy = !Terrasoft.Connection.isOnline() ||
      Terrasoft.Connection.getType() !== Terrasoft.ConnectionTypes.WiFi;
   var geo = Ext.create("Ext.util.Geolocation", {
      autoUpdate: false,
      allowHighAccuracy: enableHighAccuracy,
      timeout: 60000,
      listeners: {
         scope: this,
         locationupdate: function(geo) {
            Ext.callback(config.success, config.scope, [geo.getLatitude(), geo.getLongitude()]);
         },
         locationerror: function(geo, timeout, permissionDenied, locationUnavailable, message) {}
      }
   });
   geo.updateLocation();
}

If there is no Internet connection or this connection is not WiFi (EDGE, 3G), then “exact” positioning will be used (GPS), otherwise data will be obtained using WiFi, caching, etc., in ways that give inaccurate representations of the location of the device, but are quite sufficient for carrying out business tasks. If you need to receive data using GPS, you can create your own implementation of the action, by analogy with how it is implemented in bpm'online:

getCurrentCoordinates: function(config) {
   var geo = Ext.create("Ext.util.Geolocation", {
      autoUpdate: false,
      allowHighAccuracy: true,
      timeout: 60000,
      listeners: {
         scope: this,
         locationupdate: function(geo) {
            Ext.callback(config.success, config.scope, [geo.getLatitude(), geo.getLongitude()]);
         },
         locationerror: function(geo, timeout, permissionDenied, locationUnavailable, message) {}
      }
   });
   geo.updateLocation();
}

When implementing you need to consider that this method has a number of problems:



- despite the fact that the GPS method is more accurate, the time for obtaining such data can be quite long (up to 10-15 minutes);

- the waiting time for receiving the response should be increased, i.e. the timeout parameter above in the code will need to be set to more than 1 minute (60,000 ms);

- any overlap, interference in the form of any objects may not allow obtaining coordinates;

- the battery is drained faster, which is very critical for Android devices.

Like 0

Like

Share

4 comments

If we don't buy field management product in Creatio, can we access the FieldForceMapsModule schema? Or any other method to get the coordinate of the mobile phone(android & Mac.), 



   Right now , I am learning Creation deveopment training by DMITRIY, is still learning a  lot of things in Creatio.

Jeffrey,

 

This schema is available only in the FieldForce package. 

Bogdan,

Thanks for your reply. 

If I use c# code to write my own pacakge to detect the mobile gps, it shall be done in Creatio, right?

Jeffrey,

Yes, it should be done in Creatio configuration. 

Show all comments

Symptoms

A photo or a file is added to the "Attachments" detail in one of the sections.

The following error occurs after synchronization:

Bpm'online mobile bug report

Type: Terrasoft.ODataException 

Message: An error occurred while processing this request. 

The message contains: It is impossible to get the value of the Data column because it was not loaded

Cause

The following code is found in the ScriptFileSaving script of the File scehma:

var data = Entity.GetColumnValue("Data") as byte[];

If you update the data in this schema (via OData) and do not specify the Data column, the system displays an error message saying it was not loaded.

This situation can occur if there is a cyclic connection in the file table (ActivityFile, OpportunityFile, etc.).

For example, an Activity column exists in the ActivityFile table, and refers to the Activity table, in which, there is the UsrActivityFile reference column, which refers to the ActivityFile table.

The mobile app tracks that and splits a single query

INSERT INTO ActivityFile (Id, Name, Data, Activity) VALUES (1, 2, 3, 4)

Into two queries:

INSERT INTO ActivityFile (Id, Name, Data) VALUES (1, 2, 3)
UPDATE ActivityFile SET Activity = 4 WHERE Id = 1

The second request does not work.

Solution

There is a workaround. Add the IgnoreSplitLogActions flag to the manifest of the nexessary table:

{
   "SyncOptions": {
      "ModelDataExportConfig": [
         {
            "Name": "ActivityFile",
            "IgnoreSplitLogActions": true
         }
      ],

As a result, the file insertion will not be split into two requests.

Necessary conditions and possible restrictions

For UIV1, it is necessary to additionally "calibrate" the schema:

if (!Terrasoft.SysSettingsValue.getBooleanValue("UseMobileUIV2")) {
    /* * Moved from UIV2 */
    Ext.define("Terrasoft.Sync.LogManager.override", {
        override: "Terrasoft.Sync.LogManager",
        /** * @private */
        ignoreSplitLogActions: function(logAction) {
            var modelName = logAction.get("ModelName");
            var manifest = Terrasoft.ApplicationConfig.manifest;
            var ignore = false;
            if (manifest.SyncOptions) {
                var modelDataExportConfig = manifest.SyncOptions.ModelDataExportConfig || [];
                for (var i = 0, ln = modelDataExportConfig.length; i < ln; i++) {
                    var modelConfig = modelDataExportConfig[i];
                    if (Ext.isObject(modelConfig) && modelConfig.Name === modelName) {
                        ignore = modelConfig.IgnoreSplitLogActions;
                        break;
                    }
                }
            }
            return ignore === true;
        },
        /** * @private */
        splitLogActions: function() {
            var firstTierActions = this.firstTierActions = [];
            var secondTierActions = this.secondTierActions = [];
            for (var i = 0, ln = this.mergedLogActions.length; i < ln; i++) {
                var logAction = this.mergedLogActions[i];
                if (this.isCreateAction(logAction) && !this.ignoreSplitLogActions(logAction)) {
                    firstTierActions.push(logAction);
                    this.splitLogActionWithLoopColumns(logAction);
                    this.splitLogActionWithBinaryColumns(logAction);
                } else {
                    secondTierActions.push(logAction);
                    if (this.isUpdateAction(logAction)) {
                        this.splitLogActionWithBinaryColumns(logAction);
                    }
                }
            }
        }
    });
}

 

Like 1

Like

Share

0 comments
Show all comments

Case description:

We need to configure editable grid in section for quick record editing (editable grid like in details).

Algorithm of realization:

  1. Create replacing client schema of your section. For example ContactSectionV2.
  2. Add following dependencies into array of dependecies:

    define("ActivitySectionV2", ["ConfigurationGrid", "ConfigurationGridGenerator", "ConfigurationGridUtilities"],
        function() {

     

  3. Add ConfigurationGridUtilites into "mixins" section:

    mixins: {
        ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities"
    },

     

  4. Add boolean virtual column into "attributes":

    attributes: {
        IsEditable: {
            dataValueType: Terrasoft.DataValueType.BOOLEAN,
            type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
            value: true
        }
    },

     

  5. Add overriding for following methods:

    edit: function() {
        var procElId = this.getActiveRow().get("ProcessElementId");
        var recordId = this.get("ActiveRow");
        if (procElId && !this.Terrasoft.isEmptyGUID(procElId)) {
            this.sandbox.publish("ProcessExecDataChanged", {
                procElUId: procElId,
                recordId: recordId,
                scope: this,
                parentMethodArguments: null,
                parentMethod: function() {
                    return false;
                }
            });
            return true;
        }
        this.editRecord(recordId);
    },
    editRecord: function(primaryColumnValue) {
        this.Terrasoft.chain(
            function(next) {
                var activeRow = this.findActiveRow();
                this.saveRowChanges(activeRow, next);
            },
            function() {
                var activeRow = this.getActiveRow();
                var typeColumnValue = this.getTypeColumnValue(activeRow);
                var schemaName = this.getEditPageSchemaName(typeColumnValue);
     
                var config = {
                    schemaName: schemaName,
                    id: primaryColumnValue,
                    operation: Terrasoft.ConfigurationEnums.CardOperation.EDIT,
                    moduleId: this.getChainCardModuleSandboxId(typeColumnValue)
                };
     
                this.sandbox.publish("PushHistoryState", {
                    hash: Ext.String.format("{0}/{1}/{2}/{3}",
                        "CardModuleV2", schemaName, Terrasoft.ConfigurationEnums.CardOperation.EDIT, primaryColumnValue),
                    silent: true
                });
                this.openCardInChain(config);
            }, this);
    },
    addRecord: function(typeColumnValue) {
        if (!typeColumnValue) {
            if (this.get("EditPages").getCount() > 1) {
                return false;
            }
            var tag = this.get("AddRecordButtonTag");
            typeColumnValue = tag || this.Terrasoft.GUID_EMPTY;
        }
        this.addRow(typeColumnValue);
    },
    copyRecord: function(primaryColumnValue) {
        this.copyRow(primaryColumnValue);
    },
    getGridRowViewModelConfig: function() {
        var gridRowViewModelConfig =
            this.mixins.GridUtilities.getGridRowViewModelConfig.apply(this, arguments);
        Ext.apply(gridRowViewModelConfig, {entitySchema: this.entitySchema});
        var editPages = this.get("EditPages");
        this.Ext.apply(gridRowViewModelConfig.values, {HasEditPages: editPages && !editPages.isEmpty()});
        return gridRowViewModelConfig;
    },
    getGridRowViewModelClassName: function() {
        return this.mixins.GridUtilities.getGridRowViewModelClassName.apply(this, arguments);
    },
    onRender: function() {
        this.callParent(arguments);
        if (!this.get("Restored")) {
            this.reloadGridColumnsConfig(true);
        }
    },
    getDefaultGridColumns: function() {
        var systemColumns = this.systemColumns;
        var allowedDataValueTypes = this.get("AllowedDataValueTypes");
        var entitySchema = this.entitySchema;
        var entitySchemaColumns = [];
        Terrasoft.each(entitySchema.columns, function(column, columnName) {
            if (Ext.Array.contains(systemColumns, columnName) ||
                !Ext.Array.contains(allowedDataValueTypes, column.dataValueType)) {
                return;
            }
            entitySchemaColumns.push(column);
        }, this);
        var primaryDisplayColumnName = entitySchema.primaryDisplayColumnName;
        entitySchemaColumns.sort(function(a, b) {
            if (a.name === primaryDisplayColumnName) {
                return -1;
            }
            if (b.name === primaryDisplayColumnName) {
                return 1;
            }
            return 0;
        }, this);
        return (entitySchemaColumns.length > 4) ? entitySchemaColumns.slice(0, 4) : entitySchemaColumns;
    },
    onActiveRowAction: function() {
        this.mixins.ConfigurationGridUtilities.onActiveRowAction.apply(this, arguments);
        this.callParent(arguments);
    },
    onActiveRowAction: function(buttonTag, primaryColumnValue) {
        switch (buttonTag) {
            case "card":
                this.edit();
                break;
            case "copy":
                this.copyRecord(primaryColumnValue);
                break;
            case "remove":
                this.deleteRecords();
                break;
            case "cancel":
                this.discardChanges(primaryColumnValue);
                break;
            case "save":
                this.onActiveRowSave(primaryColumnValue);
                break;
        }
    }

     

  6. Add following elements into "diff" array:

    {
        "operation": "merge",
        "name": "DataGrid",
        "values": {
            "className": "Terrasoft.ConfigurationGrid",
            "generator": "ConfigurationGridGenerator.generatePartial",
            "generateControlsConfig": {"bindTo": "generatActiveRowControlsConfig"},
            "changeRow": {"bindTo": "changeRow"},
            "unSelectRow": {"bindTo": "unSelectRow"},
            "onGridClick": {"bindTo": "onGridClick"},
            "initActiveRowKeyMap": {"bindTo": "initActiveRowKeyMap"},
            "activeRowAction": {"bindTo": "onActiveRowAction"},
            "multiSelect": {"bindTo": "MultiSelect"}
        }
    },
    {
        "operation": "insert",
        "name": "activeRowActionSave",
        "parentName": "DataGrid",
        "propertyName": "activeRowActions",
        "values": {
            "className": "Terrasoft.Button",
            "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
            "tag": "save",
            "markerValue": "save",
            "imageConfig": {"bindTo": "Resources.Images.SaveIcon"}
        }
    },
    {
        "operation": "insert",
        "name": "activeRowActionCopy",
        "parentName": "DataGrid",
        "propertyName": "activeRowActions",
        "values": {
            "className": "Terrasoft.Button",
            "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
            "tag": "copy",
            "markerValue": "copy",
            "imageConfig": {"bindTo": "Resources.Images.CopyIcon"}
        }
    },
    {
        "operation": "insert",
        "name": "activeRowActionCard",
        "parentName": "DataGrid",
        "propertyName": "activeRowActions",
        "values": {
            "className": "Terrasoft.Button",
            "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
            "tag": "card",
            "markerValue": "card",
            "visible": {"bindTo": "HasEditPages"},
            "imageConfig": {"bindTo": "Resources.Images.CardIcon"}
        }
    },
    {
        "operation": "insert",
        "name": "activeRowActionCancel",
        "parentName": "DataGrid",
        "propertyName": "activeRowActions",
        "values": {
            "className": "Terrasoft.Button",
            "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
            "tag": "cancel",
            "markerValue": "cancel",
            "imageConfig": {"bindTo": "Resources.Images.CancelIcon"}
        }
    },
    {
        "operation": "insert",
        "name": "activeRowActionRemove",
        "parentName": "DataGrid",
        "propertyName": "activeRowActions",
        "values": {
            "className": "Terrasoft.Button",
            "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
            "tag": "remove",
            "markerValue": "remove",
            "imageConfig": {"bindTo": "Resources.Images.RemoveIcon"}
        }
    },
    {
        "operation": "remove",
        "name": "DataGridActiveRowOpenAction"
    },
    {
        "operation": "remove",
        "name": "DataGridActiveRowCopyAction"
    },
    {
        "operation": "remove",
        "name": "DataGridActiveRowDeleteAction"
    },
    {
        "operation": "remove",
        "name": "ProcessEntryPointGridRowButton"
    }

     

  7. Full code of example:

     

    define("ContactSectionV2", ["ConfigurationGrid", "ConfigurationGridGenerator", "ConfigurationGridUtilities"],
        function() {
            return {
                entitySchemaName: "Contact",
                messages: {},
                mixins: {
                    ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities"
                },
                attributes: {
                    IsEditable: {
                        dataValueType: Terrasoft.DataValueType.BOOLEAN,
                        type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                        value: true
                    }
                },
                methods: {
                    edit: function() {
                        var procElId = this.getActiveRow().get("ProcessElementId");
                        var recordId = this.get("ActiveRow");
                        if (procElId && !this.Terrasoft.isEmptyGUID(procElId)) {
                            this.sandbox.publish("ProcessExecDataChanged", {
                                procElUId: procElId,
                                recordId: recordId,
                                scope: this,
                                parentMethodArguments: null,
                                parentMethod: function() {
                                    return false;
                                }
                            });
                            return true;
                        }
                        this.editRecord(recordId);
                    },
                    editRecord: function(primaryColumnValue) {
                        this.Terrasoft.chain(
                            function(next) {
                                var activeRow = this.findActiveRow();
                                this.saveRowChanges(activeRow, next);
                            },
                            function() {
                                var activeRow = this.getActiveRow();
                                var typeColumnValue = this.getTypeColumnValue(activeRow);
                                var schemaName = this.getEditPageSchemaName(typeColumnValue);
     
                                var config = {
                                    schemaName: schemaName,
                                    id: primaryColumnValue,
                                    operation: Terrasoft.ConfigurationEnums.CardOperation.EDIT,
                                    moduleId: this.getChainCardModuleSandboxId(typeColumnValue)
                                };
     
                                this.sandbox.publish("PushHistoryState", {
                                    hash: Ext.String.format("{0}/{1}/{2}/{3}",
                                        "CardModuleV2", schemaName, Terrasoft.ConfigurationEnums.CardOperation.EDIT, primaryColumnValue),
                                    silent: true
                                });
                            this.openCardInChain(config);
                        }, this);
                    },
                    addRecord: function(typeColumnValue) {
                        if (!typeColumnValue) {
                            if (this.get("EditPages").getCount() > 1) {
                                return false;
                            }
                            var tag = this.get("AddRecordButtonTag");
                            typeColumnValue = tag || this.Terrasoft.GUID_EMPTY;
                        }
                        this.addRow(typeColumnValue);
                    },
                    copyRecord: function(primaryColumnValue) {
                        this.copyRow(primaryColumnValue);
                    },
                    getGridRowViewModelConfig: function() {
                        var gridRowViewModelConfig =
                            this.mixins.GridUtilities.getGridRowViewModelConfig.apply(this, arguments);
                        Ext.apply(gridRowViewModelConfig, {entitySchema: this.entitySchema});
                        var editPages = this.get("EditPages");
                        this.Ext.apply(gridRowViewModelConfig.values, {HasEditPages: editPages && !editPages.isEmpty()});
                        return gridRowViewModelConfig;
                    },
                    getGridRowViewModelClassName: function() {
                        return this.mixins.GridUtilities.getGridRowViewModelClassName.apply(this, arguments);
                    },
                    onRender: function() {
                        this.callParent(arguments);
                        if (!this.get("Restored")) {
                            this.reloadGridColumnsConfig(true);
                        }
                    },
                    getDefaultGridColumns: function() {
                        var systemColumns = this.systemColumns;
                        var allowedDataValueTypes = this.get("AllowedDataValueTypes");
                        var entitySchema = this.entitySchema;
                        var entitySchemaColumns = [];
                        Terrasoft.each(entitySchema.columns, function(column, columnName) {
                            if (Ext.Array.contains(systemColumns, columnName) ||
                                !Ext.Array.contains(allowedDataValueTypes, column.dataValueType)) {
                                return;
                            }
                            entitySchemaColumns.push(column);
                        }, this);
                        var primaryDisplayColumnName = entitySchema.primaryDisplayColumnName;
                        entitySchemaColumns.sort(function(a, b) {
                            if (a.name === primaryDisplayColumnName) {
                                return -1;
                            }
                            if (b.name === primaryDisplayColumnName) {
                                return 1;
                            }
                            return 0;
                        }, this);
                        return (entitySchemaColumns.length > 4) ? entitySchemaColumns.slice(0, 4) : entitySchemaColumns;
                    },
                    onActiveRowAction: function() {
                        this.mixins.ConfigurationGridUtilities.onActiveRowAction.apply(this, arguments);
                        this.callParent(arguments);
                    },
                    onActiveRowAction: function(buttonTag, primaryColumnValue) {
                        switch (buttonTag) {
                            case "card":
                                this.edit();
                                break;
                            case "copy":
                                this.copyRecord(primaryColumnValue);
                                break;
                            case "remove":
                                this.deleteRecords();
                                break;
                            case "cancel":
                                this.discardChanges(primaryColumnValue);
                                break;
                            case "save":
                                this.onActiveRowSave(primaryColumnValue);
                                break;
                        }
                    }
                },
                diff: /**SCHEMA_DIFF*/[
                    {
                        "operation": "merge",
                        "name": "DataGrid",
                        "values": {
                            "className": "Terrasoft.ConfigurationGrid",
                            "generator": "ConfigurationGridGenerator.generatePartial",
                            "generateControlsConfig": {"bindTo": "generatActiveRowControlsConfig"},
                            "changeRow": {"bindTo": "changeRow"},
                            "unSelectRow": {"bindTo": "unSelectRow"},
                            "onGridClick": {"bindTo": "onGridClick"},
                            "initActiveRowKeyMap": {"bindTo": "initActiveRowKeyMap"},
                            "activeRowAction": {"bindTo": "onActiveRowAction"},
                            "multiSelect": {"bindTo": "MultiSelect"}
                        }
                    },
                    {
                        "operation": "insert",
                        "name": "activeRowActionSave",
                        "parentName": "DataGrid",
                        "propertyName": "activeRowActions",
                        "values": {
                            "className": "Terrasoft.Button",
                            "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                            "tag": "save",
                            "markerValue": "save",
                            "imageConfig": {"bindTo": "Resources.Images.SaveIcon"}
                        }
                    },
                    {
                        "operation": "insert",
                        "name": "activeRowActionCopy",
                        "parentName": "DataGrid",
                        "propertyName": "activeRowActions",
                        "values": {
                            "className": "Terrasoft.Button",
                            "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                            "tag": "copy",
                            "markerValue": "copy",
                            "imageConfig": {"bindTo": "Resources.Images.CopyIcon"}
                        }
                    },
                    {
                        "operation": "insert",
                        "name": "activeRowActionCard",
                        "parentName": "DataGrid",
                        "propertyName": "activeRowActions",
                        "values": {
                            "className": "Terrasoft.Button",
                            "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                            "tag": "card",
                            "markerValue": "card",
                            "visible": {"bindTo": "HasEditPages"},
                            "imageConfig": {"bindTo": "Resources.Images.CardIcon"}
                        }
                    },
                    {
                        "operation": "insert",
                        "name": "activeRowActionCancel",
                        "parentName": "DataGrid",
                        "propertyName": "activeRowActions",
                        "values": {
                            "className": "Terrasoft.Button",
                            "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                            "tag": "cancel",
                            "markerValue": "cancel",
                            "imageConfig": {"bindTo": "Resources.Images.CancelIcon"}
                        }
                    },
                    {
                        "operation": "insert",
                        "name": "activeRowActionRemove",
                        "parentName": "DataGrid",
                        "propertyName": "activeRowActions",
                        "values": {
                            "className": "Terrasoft.Button",
                            "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                            "tag": "remove",
                            "markerValue": "remove",
                            "imageConfig": {"bindTo": "Resources.Images.RemoveIcon"}
                        }
                    },
                    {
                        "operation": "remove",
                        "name": "DataGridActiveRowOpenAction"
                    },
                    {
                        "operation": "remove",
                        "name": "DataGridActiveRowCopyAction"
                    },
                    {
                        "operation": "remove",
                        "name": "DataGridActiveRowDeleteAction"
                    },
                    {
                        "operation": "remove",
                        "name": "ProcessEntryPointGridRowButton"
                    }
                ]/**SCHEMA_DIFF*/
            };
        }
    );

     

  8. IMPORTANT!!! 

    1. If you want use this for activity section you should comment "activeRowActionCopy" inside "diff" array, because functionality of copying doesn`t work at activity section. 

    2. If you want use this for Lead section you should add following code into values property of "DataGrid" element inside "diff" array:

      "applyControlConfig": Terrasoft.EmptyFn

       

 

Like 1

Like

Share

1 comments

Marko Maricic,

 

Hello,

 

This approach works only with the list view. Please remove the code, select the list view in the columns setup and add the code back. Once done refresh the page and the editable grid will be displayed.

 

Best regards,

Oscar

Show all comments

SysEntitySchemaOperationRight - Access to object operation rights

SysEntitySchemaRecordDefRight - Access to object record default rights setup

EntitySchemaRecRightOperation - Record right operation access level (Read, Edit, Delete)

SysEntitySchemaColumnRight - Access to object column rights

 

SysSettings - System settings

SysSettingsValue - Value of system setting

 

SysAdminOperation – Operation itself

SysAdminOperationGrantee – List of users who have access to execute operation

 

SysWorkplace – List of workplaces

SysAdminUnitInWorkplace - Users (groups) who have access to workplace

SysModuleInWorkplace - Sections in Workplace

 

SysProfileData - Columns setup (bind data by key, ContactId and Culture)

 

SysAdminUnit – Users and user roles (functional and organizational)

SysUserInRole – List of user’s roles

 

SysPackage - list of packages installed in configuration

 

Lookup – list of lookups

Like 4

Like

Share

0 comments
Show all comments

Question

Activities of the "Call" type are not displayed in the history

Answer

Starting from version 7.7.0, the [Activities] detail on the [History] tab has been upgraded with adding filtering of the displayed records by types. As a result, the activities with the "E-mail" and "Call" types that were added in previous versions are not displayed any longer. This is connected with providing separate sections and details for these entities.

To display the earlier created activities with the "Call" type on the [History] tab of the [Activities] detail, create a replacing client modue for the ActivityDetailV2 schema and override the getFilters() method therein as follows (having deleted filtering by calls):

getFilters: function() {
    var filters = this.callParent(arguments);
    filters.removeByKey("NotCallFilter");
    return filters;
}

 

Like 0

Like

Share

0 comments
Show all comments

Symptoms

The synchronization does not work on iOS, while the Android version syncs normally.

Cause

The problem is connected with the peculiarity of mobile applications (more precisely with authentication). If the Basic Authentication method is enabled, the synchronization will end with an error.

Solution

1. Make sure the method is disabled in IIS. In the IIS structure, select a site, go to the Authentication menu. Only Anonymous and Forms Authentications are enabled.

2. Make sure that the .Net Framework version matches the values in the table. You can determine the version by referring to the following article - https://msdn.microsoft.com/en-us/library/hh925568%28v=vs.110%29.aspx

3. Restart the website.

Requirements

Access to IIS, access to the list.

Like 0

Like

Share

0 comments
Show all comments

Case

When you enter the Dashboards section, the sales funnel opens by default, you can switch to activity, but the window does not close.

Purpose

Correct work of the "Close" button.

Necessary conditions

Understanding how to work with the mobile application.

Solution

This behavior is observed if the user clicks on the arrow to the right of the field with a drop-down list. If you open the “Section” window by clicking on the center of the field, the “Close” button works correctly.

Like 0

Like

Share

0 comments
Show all comments

'Bpm'online mobile bug report Type: Terrasoft.ODataItemNotFoundException Message: The Contact element is not found 

Type: Terrasoft.ODataItemNotFoundException 

Message: The Contact element is not found 

Addtional information: 

{"error":{"code":"1","message":{"lang":"","value":"Элемент Contact не найден"},"innererror":{"message":"The Contact element is not found","type":"Terrasoft.Common.ItemNotFoundException","stacktrace":"   at Terrasoft.Core.Entities.Services.EntityLazyProxy.<>c__DisplayClass7.b__6()\r\n   at Terrasoft.Core.Entities.Services.EntityLazyProxy.<>c__DisplayClass2.<.ctor>b__0()\r\n   at System.Lazy`1.CreateValue()\r\n   at System.Lazy`1.LazyInitValue()\r\n   at Terrasoft.Core.Entities.Services.EntityLazyProxy.SaveChanges()\r\n   at Terrasoft.Core.Entities.Services.ServiceContext.SaveChanges()\r\n   at System.Data.Services.DataService`1.HandleNonBatchRequest(RequestDescription description)\r\n   at System.Data.Services.DataService`1.HandleRequest()"}}}

Cause

An attempt to open a record that has been deleted in the desktop application in a mobile app. 

Solution

To resolve the synchronization issue:

1. Start the synchronization and make sure that the correct date/time of the last synchronization (current date and time) appears in the settings.

2. Clear the cache of the mobile app (click the “Clear cache” button in the settings). If you can't find the button, use the demo login feature first (the demo login button can be found on the authorization screen), and then try clearing the cache again.

3. Start the synchronization again.

Additionally, check if all acess rights are distributed correctly.

Like 0

Like

Share

0 comments
Show all comments

Question

Test email cannot be sent. Even if there are marketing active contacts/ marketing campaigns licenses provided to the Supervisor user.

Whe I try to send an email, the following error occurs: "Method not allowed. Please see the service help page for constructing valid requests to the service".

Cause

The "UnsubscribeApplicationUrl" system setting is missing.

Solution

Execute the following script:

INSERT INTO SysSettingsValue (Id, SysSettingsId, SysAdminUnitId, IsDef)
SELECT N'6A96A15A-34BD-4932-A924-56CC013E3312', Id, N'A29A3BA5-4B0D-DE11-9A51-005056C00008', 1
    FROM SysSettings WHERE Code = 'UnsubscribeApplicationUrl'

 

Like 0

Like

Share

0 comments
Show all comments

Question

How to create a linked column in the mobile app? For example, the "Account" column in the "Contacts" section?

Answer

By default, custom columns (columns created through the mobile application wizard) that have the “Lookup” type in the mobile application are not linked (i.e., it is not possible to access the edit page by clicking on them). For example, the "Cases" section in the mobile app is not included in the base version. To implement this, you need to add a linked field to the mobile application module for the section.

An example implementation can be found in MobileContactModuleConfig ("Contacts" section):

Terrasoft.sdk.RecordPage.configureColumn("Contact", "primaryColumnSet", "Account", {
    viewType: Terrasoft.ViewTypes.Preview
});

 

Like 0

Like

Share

0 comments
Show all comments