Hi All, I am trying to put in a phone number in email template and I want to make it "Click to Call". I tried hyperlinking the phone number text and selected phone number as shown in screenshot below. But I test this email, it takes me to tracking URL in the browser instead of giving me an option to call. How can I resolve this issue? Thanks

 

 

Like 0

Like

4 comments

Good day, Puneet,

In order to introduce a click-to-call phone number link in your email template, you can use a "tel:" link.

For instance, 

 

1. You may realize it as a part of an HTML block:

HTML block

2. Or as part of a button, where the URL is something like "tel:<phonenumber>":
button

Hope this helps!


 

Alternatively, using the "Link", you can skip the "tel:" tag.
It should work just by specifying a number:

link

Nikita Kudin,

Thanks Nikita, I tried this option on my side but it is still taking me to the tracking URL in the browser. Does this work on your side?

Nikita Kudin,

Even the HTML code is taking me to the tracking URL in the browser

Show all comments

I am trying to filter the list of products shown in the Application page, based on the field Segment. The field segment is part of the object FZVwActiveProduct (it represents a view in db). This object has the following fields:  FZId (GUID), FZOpportunityConditionName (Text),

FZProduct (Lookup -> Product), FZProductCategory(Lookup -> ProductCategory), FZProductType (Lookup -> ProductType), FZSegmentation (Lookup -> Segment). 

The filter used for Products in BaseFinApplicationPage uses the object  VwFinActiveProduct (it represents a view in db), which has the following fields: Name (Text), OpportunityCondition(Lookup -> OpportunityCondition), Product(Lookup -> Product).

 

The original creatio function used for filtering is:

    getActiveProductLookupFilter: function() {
                    var filters = this.Terrasoft.createFilterGroup();
                    var productType = this.get("ProductType");
                    var productCategory = this.get("ProductCategory");
                    if (this.Ext.isObject(productType)) {
                        var productTypeFilter = this.Terrasoft.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.EQUAL,
                            "Product.Type", productType.value);
                        filters.add("TypeFilter", productTypeFilter);
                    }
                    if (this.Ext.isObject(productCategory)) {
                        var productCategoryFilter = this.Terrasoft.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.EQUAL,
                            "Product.Category", productCategory.value);
                        filters.add("CategoryFilter", productCategoryFilter);
                    }
                    var productStatusFilter = this.Terrasoft.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.EQUAL,
                        "Product.ProductStatus", BaseFinanceConstants.ProductStatus.IsActual);
                    filters.add("StatusFilter", productStatusFilter);
                    return filters;
                }

 

I have overriden it to use the foloowing filtering, but it does not provide any filtering and it throws the error:

{
   "errorCode": "ItemNotFoundException",
   "message": "Column by path [FZVwActiveProduct:FZProduct].Id not found in schema VwFinActiveProduct.",
   "errors": []
}

getActiveProductLookupFilter: function() {
             var borrower = this.get("Borrower");
             var filters = this.Ext.create("Terrasoft.FilterGroup");
             // Retrieve the SegmentationId from the borrower
             var segmentationId = borrower.FZSegmentationId;
             var contactFilter = this.Ext.create("Terrasoft.FilterGroup");
              var contactLookupFilter = Terrasoft.createExistsFilter("[FZVwActiveProduct:FZProduct].Id");
             //Application Filter
             contactLookupFilter.subFilters.addItem(Terrasoft.createColumnFilterWithParameter( Terrasoft.ComparisonType.EQUAL, "FZSegmentation", segmentationId));
             contactFilter.addItem(contactLookupFilter);
             return contactFilter;
             // Create EXISTS filter for FZVwActiveProduct
             var existsFilter = Terrasoft.createExistsFilter("[FZVwActiveProduct:FZProduct].Id");
             
             // Filter to match Product in VwFinActiveProduct with FZProduct in FZVwActiveProduct
             existsFilter.subFilters.addItem(
               Terrasoft.createColumnFilterWithParameter(
                 Terrasoft.ComparisonType.EQUAL,
                 "FZProduct",
                 "Product"
                 )
             );
           // Filter to match SegmentationId in FZVwActiveProduct
             
         existsFilter.subFilters.addItem(
           Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "[FZVwActiveProduct:FZProduct].FZSegmentation", segmentationId)
         );
             
       // Add the EXISTS filter to the filter group
       filters.addItem(existsFilter);
       return filters;
}

Like 0

Like

3 comments

Hello Alba,

Such an error usually occurs in the construction of the filter, causing an incorrect database query.Value [FZVwActiveProduct:FZProduct].Id should be defined in another way. Please, debug your code to analyze which value may be passed to existsFilter and contactLookupFilter.

Additionally, I've found a good article that explains how to build the right filter conditions using the usual filters in Creatio.

Anhelina,

The article you mentioned creates the filter in the same way. I think the problem consists on the fact that my object (FZVwActiveProduct), as well as creatio's object (VwFinActiveProduct ) represent  views (not tables).

 

Alba M,

 

Ok, this should be debugged; without debugging, we can only make theories. Also if you can build this kind of filter in some seciton - you can then review the filter's content in the correspondent SelectQuery in the "Network" tab of the browser and then build the very same filter in your code.

Show all comments

Hi Guys, We have checked the free Whatsapp tool by creatio but that is limited to only inbound messages however we want to send outbound messages to our team internally. How is that possible. I saw some other connectors but they are too costly.

Like 1

Like

2 comments

Bump

Hello!

According to the basic logic of WhatsApp chat integration, you can receive chats and write in response to chats within 24 hours of the recipient's last message. However, the integration does not provide the option to send messages from Creatio before people wrote to you or outside the 24 hour window. Also, the integration does not have the ability to create tasks and notifications for the person in charge of the chat.

As a workaround, you can create a business process with the addition of a script to integrate with https://www.twilio.com/ and initialise the chat on your end. After that, responses to such messages should be available in Creatio chat.

You can contact Creatio support to get a package with a ready-made business process for sending WhatsApp messages (using a script for integration). You will then need to customize the integration to work specifically with your twilio number and account. 

We have also registered a request for the R&D team to expand integration capabilities and added your case to the request.

Best regards, 
Antonii.

Show all comments

Hello everyone,

I’m working on a solution that automatically adds 15 minutes to the StartDate and assigns this new value to the DueDate attribute in Creatio. The issue is that although the logs show the correct date (after adding 15 minutes), the DueDate value is not updating on the page, and I still see the old value.

Here’s my code in the handler:

javascript

handlers: [
  {
    request: 'crt.HandleViewModelAttributeChangeRequest',
    handler: async (request, next) => {
      if (request.attributeName === 'StartDate') {
        const startDate = request.$context.StartDate;
        console.log("StartDate before adding minutes: ", startDate);
 
        if (startDate) {
          // Add 15 minutes to StartDate
          const newDueDate = new Date(new Date(startDate).getTime() + 15 * 60 * 		  1000);
          console.log("DueDate after adding 15 minutes: ", newDueDate);
 
          // Assign the new value to DueDate
          request.$context.DueDate = newDueDate;
 
          // I also tried using $set to update the UI
          try {
            if (request.$context.$set) {
              request.$context.$set('DueDate', newDueDate);
            }
          } catch (error) {
            console.log('Error with $set method:', error);
          }
        }
      }
 
      return next?.handle(request);
    }
  }
]
  • The logs show that the date is correctly calculated, and 15 minutes are added 
  • However, on the Creatio interface, I see that DueDate is not updating.
  • Even though I tried using the $set method to update the value, it still does not work.

**Has anyone encountered this issue before? How can I ensure that the DueDate is updated correctly on the interface after modifying StartDate? Any suggestions would be greatly appreciated!

Thank you in advance!

Like 0

Like

2 comments

First of all, are you sure the attribute for DueDate is really DueDate? I'd start with making sure you're using the correct attribute name as located on the viewModelConfigDiff. 

Second, the change request not only fires when a user changes a value, but also when the page loads the data initially. If you want to only handle the change when a user changes the value, add a check for request.silent=false (silent=true means it was silently loaded on the page, not an actual change occurring). 

Your if statement would look like this to only handle changes made after the page it loaded by the user: 

if (request.attributeName === 'StartDate' &amp;&amp; !request.silent) {
    // code here
}

Ryan

It actually turned out that the attribute had a different name , but in addition I had to leave the ‘await’ 
const startDate = (await request.$context.StartDate);
Now it works, thank you for your help  :) 

Show all comments

Hi everyone!

 

I am stuck with the BP, hope you can help me out.

 

I have a detail with duplicate records in it. These records are automaticaly added after the certain emailing (via webhooks). The issues is there are duplicates and I do need them - I need some of them be deleted and at least one should be staying (see image below). 

 

I cannot understand how to write the deleting part in business process

 

Like 1

Like

1 comments

Hello,

Basically, when a webhook comes to the system, there is no process of searching for duplicates, so that duplicate records could be created. However, you can create a business process in which you can use the Find and merge duplicate process element to search and merge these records.

Best regards,
Antonii.

Show all comments

Hi Community,

 

We are trying to create a filter for this detail, that will use two conditions (one for each column) and a logical operator of “OR”. So basically, we only want the records that have the main record id on one of these columns (Contrato or Contrato Umbrella).

 

 

To achieve this, we first tried to add the filter using the FreedomUI Page Designer. However, the filter does not work with the logical operator “OR”.

 

 

So we needed to add it manually, through code. By following this post https://community.creatio.com/questions/detail-filter-freedom-ui. But that didn’t work.

 

 

An alternative was to add the filter in the viewModelConfigDiff section, but we don’t know how can we make the value dynamic.

 

 

Could you please help us find a solution to this problem?

 

Thank you.

Like 3

Like

1 comments

Hello Pedro,

Please review one of the community questions to find the example of Terrasoft.LogicalOperatorType.OR usage.

Additionally here is an explanation of how filtration on Detail work for FreedomUI. 

Case description:
On Contacts page there is a Job experience detail with listed companies where the person worked. Our goal is to show only those departments in the department field that are specified for chosen employer (Account object). So, for this case, Alpha Business has only 2 departments listed in the Departments detail. We only want to see those 2 departments when choosing a department for this account on Job experience detail on Contact page. 

For filtering we basically need just 2 base handlers to be triggered:

  1. crt.DataGridActivateRowBusinessRulesRequest – triggered when we click on an existing detail row or add a new one.
  2. crt.HandleViewModelAttributeChangeRequest – triggered when we change a value of fields.

We also need to create our own handler which we can name usr.ApplyDepartmentFilter. This one would find the currently active row of our detail to have access to its manipulations. After that, we check if account field is filled in and if yes, we create a filter for the Department field. To apply it, we need to use setValue method by targeting filterAttributeName that can be created using the formula: 
"{detailName}DS_{targetFieldName}_List_BusinessRule_Filter".
After that, it is important to use markAsPristine method to make sure that the attribute is applied silently, without forcing us to save the row.

As for crt.DataGridActivateRowBusinessRulesRequest, here we just need to filter it by request.dataGridViewElementName === "CareerList" to target only the detail needed and then call the execution of usr.ApplyDepartmentFilter request that was added earlier.

In crt.HandleViewModelAttributeChangeRequest handler we need to cover the situation when the Employer (Account) field is changed to update the filtration for Department field. First of all, we check if request.attributeName === "CareerList". After that we select the active row and get control over Account field. We check if it’s changed by using account?.dirty property and also if it has value with account?.value?.value, because we would want to filter Department field only in case the Employer is filled in. If those 2 conditions are met, we use markAsPristine method for the account field attribute. We use this one here because it will allow us to handle the subsequent changes of the Employer field. Without it, the field will remain dirty until we save the row. Eventually, we need to set value of the Department field to null using: row?.getAttributeControl(attributeName + "DS_Department").setValue(null, {silent: true});
After that, the usr.ApplyDepartmentFilter handler can be executed to apply the filtration of Department field by Employer.

Show all comments

Hello creatio community,

 

I am trying to apply a filter into cases mini page which is developed using freedom ui screens. Code as below:

{
	request: "crt.LoadDataRequest",
	handler: async (request, next) => {
 
		if(request.dataSourceName == "CaseDS_OPCaseType_4943d10_List_DS") {
			const caseType = await request.$context.CaseDS_OPCaseType_4943d10;
 
			var moduleTypesIds = await OPPermissionFunctionsSsp.getModuleTypes();
 
			const filter = new sdk.FilterGroup();
			if(moduleTypesIds.length > 0){
				filter.logicalOperation = sdk.LogicalOperatorType.Or;		
				for (let i = 0; i < moduleTypesIds.length; i++) {
					await filter.addSchemaColumnFilterWithParameter(sdk.ComparisonType.Equal, "Id", moduleTypesIds[i].value);
				}
			}
			else{
				await filter.addSchemaColumnFilterWithParameter(sdk.ComparisonType.Equal, "OPCode", '');
			}
 
			const newFilter = Object.assign({}, filter);
			newFilter.items = filter.items;
 
			request.parameters.push({
				type: "filter",
				value: newFilter
			});
		}
		return await next?.handle(request);
	}
}

 

The filter newFilter shows the right filter condition. I also used sql profiler and it returned the correct values. The issue here is that the CaseDS_OPCaseType_4943d10_List_DS lookup its not showing any value and does not apply the developed filter.

 

This issue happens only in the mini page. I have used this approach in freedom ui form pages and it works fine. Is there something I'm missing?

 

Kind regards

Like 0

Like

2 comments

I assume this is a dropdown lookup and not a lookup that opens the Select dialog? 

I just double-checked and I do have similar code to filter a dropdown on a Freedom UI mini page/dialog and it is working. I don't see anything that looks incorrect in the code you posted - just wanted to confirm that it does work on mini pages (at least in my case it is)

Show all comments

Hey Guys, we are using Creatio marketing to send newsletters but when we send campaign or test emails, all the links are not working meanwhile in builder when we click on them they work fine. Is it due to tracking or something else? How to fix this?

Like 0

Like

1 comments

When you send the emails the links are changed to go through the tracking links. In the Domain setup in Creatio it has you create a CNAME DNS entry for "tracking" and links in the email are changed to go through "tracking.thedomain.com" - have you set up that CNAME DNS entry?

Ryan

Show all comments

Hello 
It 's possible to add business process buton on Mobile App Freedom Ui in section , or section page.

 

Thank you 

Like 0

Like

1 comments

Hello Safa,

Unfortunately, there is no no-code way to add the custom button. We've already registered the suggestion for the R&D team.

 

Meanwhile, this article explains how to create a custom button. Please follow the release updates to find out when SDK for Mobile will be implemented.

Show all comments

Hello,

 

In the development version (on-site deployment), is it possible to configure webhooks to receive information from Microsoft Power Automate?

Like 3

Like

1 comments

Hello,

 

There are several limitations in working with webhooks: 

  • Only POST request method is supported.
  • Only JSON and FormData request header types are supported.
  • Any webhook sending frequency is supported.

 

As long as Microsoft Power Automate can fit into these limitations, it is possible to configure webhooks to receive information from it.

 

Here is the article that might be useful for you: https://academy.creatio.com/docs/8.x/no-code-customization/base-integra…

Show all comments