Do you know how to create macros in BPM'online 7.12? I found this guide for 7.13: https://academy.bpmonline.com/documents/technic-sdk/7-13/adding-macro-handler-email-template but in my case the interface IMacrosInvokable could not be found.

Like 0

Like

4 comments

Dear Carlos,

To get the IMacrosInvokable interface, you have to add it first, by adding source code to the schema of your development package. Please, refer to the paragraph 'Creating the class which implements the IMacrosInvokable interface' of the guide. 

Apart from that you can use your own templates that are quite convenient as well. More details are in this article:

https://academy.bpmonline.com/documents/administration/7-13/how-create-…

Regards,

Dean

 

Dean Parrett,

The problem is that the interface IMacrosInvokable can not be found, so my source code doesn't compile.

Dear Carlos,

If you receive the error 'IMacrosInvokable' could not be found' that means that most likely you are not using the Service application. This guide and functionality are developed for Service applications only and the interface IMacrosInvokable' is developed in CaseService package of the IMacrosInvokable schema. It might me the reason for this error. Our R&D team is working on implementation of this functionality in different products, so you may expect it in the upcoming versions of the application.

Best regards,

Dean

Dean Parrett,

Ok, thank you.

Show all comments

I need to add a calculated hyperlink inside the body of a [Send email] process element (for example the link to the page of an account: when the user clicks on the link inside the email, then the browser opens the account page)

I didn't find the way to do it using custom email and email templates as well.

How can I do it?

Like 1

Like

8 comments

Hello.

You can do it with the help of macros. First of all you need to create a template and select a desired macro source and then you can copy a part of the link without the record id like this and add a macro at the end of the link like this: http://test.bpmonline.com/0/Nui/ViewModule.aspx#CardModuleV2/AccountPag…]

That can be done without any additional configuration, you can also create an html link if you want (in order to hide the full link you will have to develop an html template block)

You can read more below:

https://academy.bpmonline.com/documents/administration/7-13/how-create-…

Best regards,

Matt

Thank's Matt, you solved my question

Could you please share the steps , I am unable to open this link . I also want to add a customised url link in my email body. 

 

Thanks

 

Shailey,

Hello,

Here is an example how I did it using "Accounts" section as an example (please refer to this screenshot http://prntscr.com/njtzkv). Please also note that I used account "Our company" as an example, but you can bind this process to a section if needed. Also please note that you need to build separate processes for different objects of the application. And here is my model of this process:

1) Create a "String" parameter in process parameters (you can read about it here https://academy.bpmonline.com/documents/technic-bpms/7-13/process-parameters). This parameter will be used to convert the ID of the record from "Accounts" object to "String" data type.

2) Add "Read data" element that will read all data from the object, from which the process should start (in my example it is "Accounts")

3) Create formula that will set the value of "http://o-drobina:8001/0/Nui/ViewModule.aspx#CardModuleV2/AccountPageV2/edit/"+[#Read data 1.First item of resulting collection.Id#].ToString()" for "Parameter 1" parameter. This value is formed as:

http://o-drobina:8001/0/Nui/ViewModule.aspx#CardModuleV2/AccountPageV2/edit/ ( which is standard link to the edit page of Account section record) + [#Read data 1.First item of resulting collection.Id#].ToString() (which is conversion of UID value read from "Read data" element to string). This conversion is needed, because the link should be text completely. And it will be used in "Send email" element in the next step.

4) In the "Send email" element please specify all needed parameters (To, from, CC etc.) and the email body should look like this http://prntscr.com/njtxoq.

As a result you will receive an email with link which can be used to redirect users to the needed record in the application http://prntscr.com/njtydz and http://prntscr.com/njtynp.

Best regards,

Oscar

Oscar Dylan,

Hi,

I tried doing what you suggested but get the link as a string and not as hyperlink.

How do I make it be a link?

 

I ended up creating a template message and there used the Link to object feature. (There you can also hind the full text and put different parameter for the view)

Hi,

Would still like to know how to get this work through the custom email and not template.

Thanks.

Anyone?

Show all comments

Is it possible to force users to use a certain column layout? I know I can set it up for everyone with a supervisor account but they still can change it afterwards.

Like 0

Like

3 comments

Dear Carlos,

you can use business rule which will fill and lock a certain field on a page if that is what you need. 

Angela Reyes,

I don't think that's it. I'm talking about column layout on details or sections and their sorting order.

Carlos Zaldivar Batista,

As for now there is no such functionality, but I'll submit a request to R&D team about this issue and suggest them to implement it. As a workaround you can inspect "column setup" button on a detail and add access right check or hide it for certain roles. 

Show all comments

Is it possible to create a notification for one "supervisor" type user when one of the processes fails (no matter who started it)? As it is now, failures are shown in the process log but you don't get informed that you should look into it.

Like 0

Like

4 comments

Dear Carlos,



Unfortunately, there are no such pre-configured notifications, however you can install an application from our marketplace that will add a new detail 'Process' to the system, which will be tracking the statuses of your business processes.

After that you can make up a dashboard that will reflect the status of your business process by connecting it with that detail. Another option - you can create a new business process that will track this detail by 'failed' status.

For example, once your business process is failed you will receive an email notification. 

Here is the link to the application: 

https://marketplace.bpmonline.com/app/processes-log-view-bpmonline

Best regards,

Dean

The idea of creating a process that checks process log periodically seems ok, but it would mean that users are not notified about errors immediately. I tried to create a process that waits for SysProcessLog record creation or change of statuses to Error but it hasn't worked. It seems that inserts or updates to SysProcessLog table don't produce signals. Is there a workaround for that?

Dear Carlos,

Unfortunately, as for now the SysProcessLog table doesn't give the signal. The only option is to use the MarketPlace application a solution. Our system logic is still being developed and improved and most likely this functionality will be implemented in the upcoming system updates.

Best regards,

Dean

Dean Parrett,

Ok, thank you for the info.

Show all comments

we tried the below code for file conversion, after execution we get to see the below error message in script task.

please find the code below

//var fileId = new Guid(aspPage.CustomData["ReportFileId"].ToString());

var fileId=Get("fileId");

var userConnection=Get("UserConnection");   

           

var entitySchemaManager = userConnection.EntitySchemaManager;

var entitySchemaQuery = new EntitySchemaQuery(entitySchemaManager, "UsrCandidateEntryFile");

var fileDataColumnName = entitySchemaQuery.AddColumn("Data").Name;

var fileNameColumnName = entitySchemaQuery.AddColumn("Name").Name;

entitySchemaQuery.Filters.Add(entitySchemaQuery.CreateFilterWithParameters(FilterComparisonType.Equal,

    entitySchemaQuery.RootSchema.GetPrimaryColumnName(), fileId));

var collection = entitySchemaQuery.GetEntityCollection(userConnection);

var currentRow = collection[0];

var data = currentRow.GetBytesValue(fileDataColumnName) as byte[];

var base64 = Convert.ToBase64String(data);

Set("Base64String",base64);   

if (collection.Count == 0) {

    return true;

}

return true;

Like 0

Like

1 comments

Hi everyone.

I need to track or get if an email sent from bpm to an account, is opened, to fill a field in bpm (The filled will be the date that was opened).

The email is sent by a step in a stage.

(the receiver may not have an user in the system).

I would like to know if there is a way to do it?. And if you could give an example or explain how.

Like 0

Like

1 comments

Dear Ezequiel,

This is quite complex development process. First of all you have to add a tracking links to your emails that will trigger and give the response once an email is opened.

Secondly, you will need to develop a web-service that will aggregate a response and record it with a timestamp in bpmonline. As far as I know there is no ready solution for it and it has to be implemented.

As a workaround for it,we can offer you to use the the marketing module of the application that has quite similar functionality available out of the box and there are no major adjustments required.

Best regards,

Dean

Show all comments

Is it possible to reload data on an edit page without reloading the whole page? Let's say I have a button that calls a back-end method that calculates something and updates one of object's field. I would like to see the new value without having to refresh the page.

Like 0

Like

2 comments

Dear Carlos, 

Thank you for your question.



Since the logic is executed on the back-end, the page has to  be reload for changes to display. However, there is an option to reload the data on the page automatically by adding a method 'this.reloadEntity();'  to your custom button handler method. As a result the page will be reloaded automatically by the system and changes will appear. 

Best regards, 

Dean

Dean Parrett,

Ok, thank you. I think that's what I was looking for.

Show all comments

I have a pre-configured page that is logically connected with an object and I would like to display there a feed just as it appears on its edit page. Is it possible?

Like 0

Like

3 comments

Dear Carlos,

If a page you are displaying contains Feed it will be displayed on pre-configured element. 

Angela Reyes,

How to add that on a new page though?

Carlos Zaldivar Batista,

Feed tab can be inspected in BaseModulePageV2 from ESN package. To add Feed you'll need to transfer in you page schema diff: http://prntscr.com/lei5bx, add LocalizableStrings: http://prntscr.com/lei5ip and add all methods responsible for Feed tab functionality, like loadESNFeed, getSocialFeedSandboxId, initTabs, messages (http://prntscr.com/lei64z

) and ect. 

Show all comments

Hi Team,

I have added a button to create child custom section record from an opportunity. After saving the child record it is navigating back to Opportunity but I want to Stay back in the child since I have to do other actions in the child. Below is the button code. Please suggest if you have any idea on how to achieve my goal.

Thanks,

Venkat.

Button Code:

================================

methods: {

            onNewQuoteClick: function() {

                    var now = new Date();

                    now.setMonth(now.getMonth() + 1);

                    this.openCardInChain({

                        schemaName: "UsrChildPage",

                        operation: Terrasoft.ConfigurationEnums.CardOperation.ADD,

                        moduleId: this.sandbox.id + "_CardModule",

                        defaultValues: [{

                            name: ["UsrOppLookup"],

                            value: [this.get("Id")]

                        },

                        {

                            name: ["UsrName"],

                            value: ["Child For " + this.get("Title")]

                        },

                        {

                            name: ["UsrAccount"],

                            value: [this.get("UsrQuoteAccount").value]

                        },

                        {

                            name: ["UsrExpiredate"],

                            value: [now]

                        }

                        ]

                        

                    });

                    this.save({ isSilent: true });

                }

        }

 

Like 0

Like

4 comments
Best reply

Tetiana Markova,

Thanks a lot. That worked like a gem.. Thanks Again..

Hello,

I suppose, the same issue was discussed in this topic - https://community.bpmonline.com/questions/how-stop-redirection-new-orde…

You need to override 'onSaveButtonClick' method and set 'isSilent' parameter in order to stay on the page after save:

onSaveButtonClick: function() {

   if (this.get("IsProcessMode")) {

      this.save({ isSilent: true });

   } else {

      this.save();

   }

}

Tetiana Markova,

Hi Tetiana,

Thanks for the response. I have override the Save button in my child page as shown below but not successful. Can you please check and let me know what mistake I am doing?

Thanks,

Venkat.

 

Code:

==================================

{

                "operation": "insert",

                "name": "Save",

                "values": {

                    "itemType": 5,

                    "style": "green",

                    "caption": {

                        "bindTo": "Save"

                    },

                    "click": {

                        "bindTo": "onSaveButtonClick"

                    },

                    "enabled": {

                        "bindTo": "canEntityBeOperated"

                    },

                    "classes": {

                        "textClass": [

                            "actions-button-margin-right"

                        ]

                    }

                },

                "parentName": "LeftContainer",

                "propertyName": "items",

                "index": 5

            }

==============================

onSaveButtonClick: function() {

                 if (this.get("IsProcessMode")) {

                     this.save({ isSilent: true });

                 }

                 else{

                     this.save();

                 }

            }

Let's try another approach by overriding save() method for your child edit page:

  methods: {

            save: function(config) {

                if (config) {

                    config.isSilent = true;

                }

                else {

                    config = {

                        isSilent: true

                    };

                }

                this.callParent([config]);

            }

        },

Tetiana Markova,

Thanks a lot. That worked like a gem.. Thanks Again..

Show all comments

I'm creating a process that reads data and then needs to update a text column on that data by appending some new text to the existing string. I can read the data fine but the script task throws a null reference exception. Here is the simplified version of my script:

var programs = Get("ReadDataUserTask1.ResultEntityCollection");

foreach(var program in programs) {
    program.SetColumnValue("Campaign Flags", "Test");
}

return true;

The programs is null when I run the process.

Like 0

Like

7 comments

Dear Scott,

Try another approach to overcome the issue. Please read the collection of the Read Data in the following way: 

 var entities = Get<ICompositeObjectList<ICompositeObject>>("ReadDataUserTask1.ResultCompositeObjectList");

Afterwards proceed further with collection result.

Regards,

Anastasia

Anastasia Botezat,

using trying the above script, when I convert the list to string by doing:

entities.ToString());

I get  - Terrasoft.Common.CompositeObjectList`1[Terrasoft.Common.CompositeObject] (looks like the type and not the value)

Can you help?

Chani Karel,

 

There is no need to cast object to string since you can get the value from some column of the object using GetCompositeObjectColumnValue (in my case I was reading the "Full name" column value from the collection of contacts):

 

string name = GetCompositeObjectColumnValue&lt;string&gt;(contacts, "Name");

and then process the value according to your needs.

 

Best regards,

Oscar

Hi Chani Karel,

I think there are 2 things in your scripts:

1. You ReadDataUserTask1 result could be empty.

var programs = Get&lt;EntityCollection&gt;("ReadDataUserTask1.ResultEntityCollection");

Therefore, before the "foreach Loop", you really need to check if the programs is null or not. Otherwise, you might get the exception as you mentioned.

 

2. Please use the column code instead of column title to set value.

For example, in Contact there is column with code "JobTitle" and title "Full job title". If you need to set the value, you need to use the code "JobTitle".

 

regards,

 

Cheng Gong

Oscar Dylan,

using the tostring method was just to understand why I don't get the values as needed. 

What I need to do is this:

I get a list of 'contact in opportunity' by the read collection of records element. I need to get the contact as lookup  value and not as string (the Id and not name) in order to set parameters with the contacts and send email to them.

How do I do it?

Thank you.

Cheng Gong,

using the tostring method was just to understand why I don't get the values as needed. 

What I need to do is this:

I get a list of 'contact in opportunity' by the read collection of records element. I need to get the contact as lookup  value and not as string (the Id and not name) in order to set parameters with the contacts and send email to them.

How do I do it?

Thank you.

Chani Karel,

How did you end up solving this?

 

Kind regards,

Yosef

Show all comments