Question

How do I hide the "Dashboards" section in the mobile app?

Answer

Create a custom schems (Source Code) (for example, "MobileUtilitiesCustom")

/* Hiding the "Dashboards" section */
 
Terrasoft.ApplicationUtils.initializeSystemData({
    success: function() {
        Terrasoft.ApplicationConfig.moduleGroups.get("sales").modules.splice(0, 1);
    }
});

In the mobile application manifest (for example, "UsrMobileApplicationManifestCustomMobile") specify the custom schema

{
    "CustomSchemas": [
        "MobileUtilitiesCustom"
    ]
}

 

Like 0

Like

Share

0 comments
Show all comments

Question

How can I add a loading mask to the [Connected to] detail of the [Accounts] section (version 7.7.0) in a diagram display mode?

Answer

To add a loading mask to the [Connected to] detail of the [Accounts] section in a diagram display mode, create a replacing client module for the AccountRelationshipDetailV2 schema and insert the following code therein:

define("AccountRelationshipDetailV2", [], function() {
    return {
        methods: {
            loadRelationship: function() {
                this.set("MaskId", Terrasoft.Mask.show({
                    selector: "#RelationshipTabContainer"
                }));
                this.callParent(arguments);
            },
 
            relationshipDiagramServiceCallback: function(response) {
                this.callParent(arguments);
                Terrasoft.Mask.hide(this.get("MaskId"));
            }
        },
 
        diff: /**SCHEMA_DIFF*/ []/**SCHEMA_DIFF*/
    };
});

Save the schema and reload the application page with clearing the cache.

 

Like 0

Like

Share

0 comments
Show all comments

Question

Mobile app. How to add the "Add" button to the lookup field which does not have its own section?

Answer

According to the base logic of the mobile application, you can only add new values in the lookup fields only if there is a section for this field with an edit page (for example, the “Owner” field and the “Contacts” section). In order to implement the "Add" button, you need to add a separate edit page and all necessary columns.

To do this:

Create a page schema with an Edit type for the Usrnomberoflid object (for example, the name of the UsrnomberoflidEditPage schema (page)). Quick page code generation mechanisms are described in the "How to quickly generate a page code for the mobile application" article:

Terrasoft.LastLoadedPageData = {
    controllerName: "Terrasoft.configuration.UsrnomberoflidEditPageController",
    viewXClass: "Terrasoft.configuration.UsrnomberoflidEditPageView"
};
 
Ext.define("Terrasoft.configuration.view.UsrnomberoflidEditPage", {
    extend: "Terrasoft.view.BaseEditPage",
    alternateClassName: "Terrasoft.configuration.UsrnomberoflidEditPageView",
    config: {
        id: "UsrnomberoflidEditPage"
    }
});
 
Ext.define("Terrasoft.configuration.controller.UsrnomberoflidEditPage", {
    extend: "Terrasoft.controller.BaseEditPage",
    alternateClassName: "Terrasoft.configuration.UsrnomberoflidEditPageController",
    statics: {
        Model: Usrnomberoflid
    },
    config: {
        refs: {
            view: "#UsrnomberoflidEditPage"
        }
    }
});

Create a schema and register the columns that we want to display on the page (for example, the name of the UsrMobileUsrnomberoflidModuleConfig schema (setting up columns in a new page)):

Terrasoft.sdk.GridPage.setPrimaryColumn("Usrnomberoflid", "Name");
Terrasoft.sdk.RecordPage.addColumnSet("Usrnomberoflid", 
    {
        name: "primaryColumnSet",
        isPrimary: true
    }, 
    [
        {
            name: "Name"
        }
    ]);
Terrasoft.sdk.RecordPage.addColumn("Usrnomberoflid", {
    name: "CreatedOn"
}, "primaryColumnSet");

Connect these schemas to the manifest. For example, "UsrMobileApplicationManifestOpportunities":

"Usrnomberoflid": {
    "Edit": "UsrnomberoflidEditPage",
    "RequiredModels": [
        "Usrnomberoflid"
    ],
    "PagesExtensions": [
        "UsrMobileUsrnomberoflidModuleConfig"
    ]
},

Now if you click on a record, all its information will be displayed; if you swipe across the field from right to left, you will see a list of available values with a quick filter.

Like 0

Like

Share

0 comments
Show all comments

Question

Due to special characters, or because of the long file name, synchronization does not take place.

It is necessary to change the name of the file so that it is displayed.

Answer

To customize the display of the file name, you need to make the following changes in the manifest (example in the Activities section on the ActivityFile details): set the UseRecordIdAsFileName flag to true for the binary column Data. Thus, file names will be generated based on the record ID.

"SyncOptions": {
    "ModelDataImportConfig": [
        {
            "Name": "ActivityFile",
            "SyncColumns": [
                "Id",
                "Name",
                {
                    "Name": "Data",
                    "UseRecordIdAsFileName": true
                },
                "Activity",
                "Type"
            ]
        }
    ]
},

 

Like 0

Like

Share

0 comments
Show all comments

Question

We need to add a "LinkedIn" communication option type to the  [Communication options] detail.

I mean, we do not need to add a new "Web" communication option and paste a link to the LinkedIn contact profile, but to add a link which would have the "LinkedIn" name.

Answer

1. In the [Communication option types] lookup, add a new communication option and name it, e.g., "LinkedIn", the Communication type - Web

2. On the LinkedIn record, click "Edit" and find the recordId.

3. In configuration, replace the CommunicationUtils schema by copying the code from the original schema. Add ConfigurationConstants in the dependency as it is in the original.

4. In the replaced schema, update the isWebType() method by adding a recordId (see above) verification block and return true.

function isWebType(communicationType) {
    if (!communicationType) {
        return false;
    }
 
    if (communicationType === "5e4025d7-84cf-43ce-9a90-64a966c34853") {
        return true; /*LinkedIn*/
    }
 
    communicationType = communicationType.value || communicationType;
    return ConfigurationConstants.CommunicationTypes.Web.indexOf(communicationType) !== -1;
}

5. Save the changes, clear the cache, reset the site. As a result, the new LinkedIn communication option will look and will be processed as a link.

Like 0

Like

Share

0 comments
Show all comments

Question

Required "Organization"  field is affixed to the contact object "at the application level"

In the mobile app:



- Create a new contact

- Fill in the "Organization" field (created earlier in the web app)

- Save

- Synchronize

- An error occurs

Call Stack:

Contact (9d6652ba-5062-45d2-a7f2-1fb6c3ba1978) at Wed May 16 2018 11:13:07 GMT + 0300 (MSK). Error text: Type: Terrasoft.ODataRequiredColumnsEmptyValuesException

Message: The Organization field is a required field.

AdditionalInfo: {"position": 0, "error": {"code": "3", "message": {"value": "The Organization field is required"}, "innererror": {"message": "Organization field is required", "type": "Terrasoft.Core.Entities.RequiredColumnsEmptyValuesException", "stacktrace": "in Terrasoft.Core.Entities.Entity.ValidateRequiredColumns () \ r \ n in Terrasoft.Core.Entities .Entity.InternalSave (Boolean validateRequired, Boolean setColumnDefValue) \ r \ n in Terrasoft.Core.Entities.Entity.Save (Boolean validateRequired, Boolean setColumnDefValue) \ r \ n in Terrasoft.Core.Entti.SerathiraADe.V. \ r \ n in Terrasoft.Core.Entities.Services.ServiceContext.SaveChanges () "," internalexception ": null}}}

Everything works correctly if the field is not required.

Answer

Contact and Account objects are bound by cyclic links (for example, in a mobile application, both a contact and an account (as well as the connection between them) can be added).

Therefore, when synchronizing records, requests are split for correct storage: 

First, creating a contact record, then creating an account, then the lookup fields of the connections between them are updated with the necessary values of the newly created data. Thus, the binding will not work.

As a workaround, we can propose making it required at the card level using business rules:

Terrasoft.sdk.Model.addBusinessRule('Contact', {
    ruleType: Terrasoft.RuleTypes.Requirement,
    triggeredByColumns: ['Name']
});

Then add the required module to the manifest in the ModelExtensions section.

An example implementation can be found in the "MobileActivityModelConfig" schema.

Like 0

Like

Share

0 comments
Show all comments



Hi

We need to be able to use project tasks and support tasks to track time better than seems possible out of the box.

For example, within service desk, we create a case and perform a number of individual tasks; Send reply email to customer (15 minutes spent), Have remote desktop support session (1 hour 30 mins), following up call (15 minutes).

Currently it is not possible to track this time and on the case overall have a value that states a total time spent providing support was 2 hours (in above example).

For projects this is even worse, as the Project task has a start date/time and end date/time, which for me is the period of time we have to complete the task and not how much time was actually spent on the task. While some tasks I can put a value in here and it determine that 1 hour 15 mins was spent, on many tasks I may dip in and out of them over the course of a period of time, say 24 hours, but actually only spend 45 minutes doing something for that task.

Here I want to be able to track the 45 mins and not the 24 hours for the start/end time frame, as that is not how I can bill my customer.

Does anyone have any insight on this - am I doing something wrong, is there something I can configure/build into BPM?

Many thanks for any reply.

Mark

Like 1

Like

6 comments

Dear Mark,

Both [Projects] and [Cases] have the details set up [Activities]. Basically, the detail displays the Activities (tasks) created and linked to the particular Case/Opportunity.

You can find the detail  in the [History] tab in [Projects] section and in [Case information] in [Cases] section. Taking your example you will see 3 tasks on the case detail:

1. Send reply email to customer (15 minutes spent),

2. Have remote desktop support session (1 hour 30 mins),

3. Following up call (15 minutes).

Moreover, this is exactly how tracking and managing is performed as you can check what was done and how much time it took for the specific case/project.

With best regards,

Oliver Wingston

Thanks for your reply.

On the ticket situation, when using the shortcuts at the top i.e. call in/out or to do, it will require double input, i.e. use that function, then navigate to Activities to then edit that record to update to the correct timer values. This is not particularly efficient and is prone to error as you are relying on operative to go through that process. For example, a support rep takes an inbound call. Enters the outcome of that call in the Log Call area. Unless they then edit that  activitiy it will be recorded with a start and end time the same, which in the reporting will be 0 minutes.

For Project the Duration value is of little value, but I understand its purpose. The issue in Projects is that the tasks under structure are the entities I should be recording time spent. It does not make sense to create a project structure and then record the time spent and actions in a separate Activities area, which are items separate to the project tasks. Within tasks the start and end are based on whole days, so the minimum time, which is an auto calculated field and locked shows 8 hours.

With each task having a time spent value, this can then be calculated up to total time spent on the project as a whole. Critical information..

Am I missing something?

 

Mark

Dear Mark,

Within tasks the start and end are based on whole days, so the minimum time, which is an auto calculated field and locked shows 8 hours

Please send a screenshot that shows activities based on whole days. On our side it's possible to change the activities time.

http://prntscr.com/iuqwxl

Unless they then edit that  activitiy it will be recorded with a start and end time the same, which in the reporting will be 0 minutes.

Please attach a small video that shows this. Do you mean that the system calculates call time as 0?

As for now, please specify the activities time manually.

 

Hi Eugene,

The following screenshot shows the detail from a Project Task (NOT Activity), so to get here I have clicked on Structure.

You will see the start and end date value determines the duration value. This I understand, we are recording the amount of time across the start and end time of the task. However, what I need to capture, and what I would expect the majority of users of Project to need, is for the actual time spent on the task to be recorded. Therefore I would like to have a method to record that separate time value.

I have recorded the video showing the issue with recording time in tickets using the quick in put at the top of the overview page.

https://streamable.com/bmc7u

Dear Mark, 

The mentioned "Activity" is actually the child project. You don't need to create a lot of them. The child projects are like parts of the main project. 

Please find how to calculate the project time on the video by the link below.

https://www.useloom.com/share/703e2558252e46ae935e4717ca4addb6

Oleh Chudiiovych writes:

Dear Mark,

Both [Projects] and [Cases] have the details set up [Activities]. Basically, the detail displays the Activities (tasks) created and...MoreLess

Show all comments

Symptoms

An error occurs during synchronization:

The element with the "90a3e9f6-........................-7c4aadb41f28" identifier is not found.

Cause

The SysLookup table is not used in desktop versions 7.5 and 7.6, but is used in the mobile application below version 7.7.1.

In the SysLookup table, there are records that refer to nonexistent schemas, for example:

90A3E9F6-12D4-45B5-9122-7C4AADB41F28

A85932A3-30A5-49D7-9627-7F749A055AB7

CCF7D813-FC83-47AD-BE61-8F3B3B98A54F

E0AA5FA2-0910-478D-943B-E9C2579AD7B4

Solution

Run script:

UPDATE [SysLookup]
SET IsSimple = 0
WHERE IsSimple = 1
AND NOT EXISTS (select 1 from SysSchema ss WHERE ss.[UId] = SysEntitySchemaUId)

 

Like 0

Like

Share

0 comments
Show all comments

Symptoms

An error occurs during synchronization: The element with the identifier "90a3e9f6 -........................- 7c4aadb41f28" was not foundю

Cause

The SysLookup table is not used in desktop versions 7.5 and 7.6, but is used in the mobile application below version 7.7.1.

There are records in the SysLookup table that refer to nonexistent schemas, e.g., with such UIDs:

90A3E9F6-12D4-45B5-9122-7C4AADB41F28

A85932A3-30A5-49D7-9627-7F749A055AB7

CCF7D813-FC83-47AD-BE61-8F3B3B98A54F

E0AA5FA2-0910-478D-943B-E9C2579AD7B4

Solution

Run the following script:

UPDATE [SysLookup]
SET IsSimple = 0
WHERE IsSimple = 1
AND NOT EXISTS (select 1 from SysSchema ss WHERE ss.[UId] = SysEntitySchemaUId)

Necessary conditions and possible restrictions

Some versions of BPMonline 7.6

Mobile app version is lower than 7.7.0

Like 0

Like

Share

0 comments
Show all comments

Question

The field with image does not work for a detail (see instruction at https://academy.bpmonline.com/documents/technic-sdk/7-13/how-add-field-…).

Answer

This instruction is relevant for page schemas; for details, add the following method:

getSchemaImageUrl: function(primaryImageColumnValue) {
        if (!primaryImageColumnValue) {
            return null;
        }
        var imageConfig = {
            source: Terrasoft.ImageSources.SYS_IMAGE,
            params: {
                primaryColumnValue: primaryImageColumnValue.value
            }
        };
        return Terrasoft.ImageUrlBuilder.getUrl(imageConfig);
},

 

Like 0

Like

Share

0 comments
Show all comments