Hello,

I am currently working on Integrating my Custom Object Data on Time Line tab in Contact form page, I have followed this link to accomplish this .


Now I want to show the file attachment preview or a downloadable link in the timeline tab.


This is what I have tried:

  1. In my first try, I tried to save the files in separate object and add that object as lookup field in my custom object.
    1. Result: It shows the name of file only in timeline object
  2. In my second try, I directly introduced  a file datatype field in my custom object,
    1. Result : It shows the raw file content in preview.

Also, How can we change the visibility of this field as I only want to show it if it has any value. I am using an online instance.

Can any one guide me on how to do this?

Thanks in advance for your support!!

Like 0

Like

0 comments
Show all comments

Hi all,

I have a use case to create a salary benchmark report in our Creatio recruitment application, which shows what salary expectations our candidates had in a set period, structured with 

I store the salary expectation min. and max. on the Candidate's record, and I have an object called "Candidate's related fields", which consists of the main field (e.g. Software development), sub-field (e.g. .Net developer), and level of expertise (e.g. senior). One Candidate can have multiple related fields, and his/her salary expectation should be taken into account in all of them.

I was thinking about using the Forecast section to create a report that looks like the example in the following picture. I successfully created the frame (the "Candidate's related fields" being the Forecast object, the "Main field", "Sub-field", and "Level of expertise" being the 1-3 hierarchy levels.

I have issues with setting up the columns; it seems to me that the Forecast functions are not sufficient to fulfill what I want to achieve.

The main issue is, that the values are aggregated as I go upwards on the hierarchy levels, so the "Junior .Net software developer" row will have a sum of every individual row.

My question is, does anyone have any insight on whether this requirement can be met with Forecast? We have a few ideas about using auxiliary tables and business processes instead, but it would be great if it could be done very simply with Forecast.

Thanks in advance!

Like 0

Like

0 comments
Show all comments

Hi everyone,

I have encountered a small usability issue and I am hoping someone might have a suggestion.

When opening a record directly from an email (via a URL link), the page loads fine, but the “Close” button in the top right corner and the back arrow don’t work as expected. It appears that since the record is opened directly via a URL and not through standard navigation, there is no previous page for the app to return to.

While we understand the technical reason behind this, it’s not ideal from a user experience perspective. Users expect to be able to go back to the list or close the record.

Has anyone found a good way to improve or work around this?

Thanks!

Csilla

Like 0

Like

1 comments

I believe this is fixed somewhat in 8.3 as a beta feature that can be enabled (out of the box disabled)

Changed behavior of the Button component whose Action parameter in the Freedom UI Designer setup area is set to "Close page" when the action is executed immediately after the user logs into Creatio. Previously, the redirect behavior was inconsistent and could lead to navigating outside the instance or to an unintended blank state. Now, the user is redirected to the Creatio desktop page if the previous browser page is not a Creatio page. The functionality is managed by the EnableNavigationToDesktopBeforeQuit additional feature. Out of the box, disabled.

Ryan

Show all comments

Dear Creatio team,

i'm trying to improve the ML models results for product recommendations.
For now, in many cases the predictions give no results or not so useful ones.

In the Account object, we have a custom field that contains a code to classify the company by business type. This field could be useful for the collaborative filtering.

how to use it in the ML recommendation model ?


Best regards
Patrice

Like 0

Like

0 comments
Show all comments

How to capture client side validation errors on Creatio formpages and move them to a table or if there is an existing table to read. For example, a user forgets to select the 'House type' and an error comes up. We want these errors logged somewhere.

Like 0

Like

1 comments

Hello,

In Creatio you can set up logging:

The Change Log records changes to business data.

Audit Log records system settings, events, and data. It logs events related to changes in the user role structure, the distribution of access permissions, changes in the system setting values, user authorization in Creatio, etc.

Please refer to these articles:
How to set up Change Log
How to set up Audit Log

Application logs can be setup via Nlog.

Have a great day!

Show all comments

How I can set new version of DCM for all existing records (Lead) automatically

 

New version is v2

 

We have 13000 records, so changing manually will take time

 

Thanks

Leo

Like 2

Like

1 comments

Hello,

At the moment, there is no option to automatically change the case version for all leads using standard system functionality.

We consulted with the R&D team, and there is currently no ready-made solution for this scenario. However, similar cases have already been registered, and your request has also been added to help raise the priority for implementation in future versions.

You can also try to implement the functionality with a business process. Unfortunately, we do not have examples of such implementation.

Show all comments

Just like the title says is it possible to extract data from xlsx or csv file to Creatio through a service class? I know you can do it through freedom UI, but I am wondering if it's possible to do it through code. Do terrasoft libraries provide that support?

Like 1

Like

1 comments

Hi Michal,

we use NPOI library

Kind regards,
Vladimir

Show all comments

Is there an out of the box web service in Creatio that could be used to find all the roles that a user belongs to? Or to check if the user belongs to a particular role?  Where can I find the documentation on all the inbuilt webservices provided by Creatio?

Like 0

Like

14 comments
Best reply

Just verified, this is working for me. This is a sample for the account page to disable the account Type if it is "Customer". 

Add an attribute to the viewModelConfigDiff:

viewModelConfigDiff: /**SCHEMA_VIEW_MODEL_CONFIG_DIFF*/[
    {
        "operation": "merge",
        "path": [
            "attributes"
        ],
        "values": {
            "IsTypeEnabled": {
            	value: true
            }
        }
    }
]/**SCHEMA_VIEW_MODEL_CONFIG_DIFF*/,

Then, I added a change request handler to listen for values in the Type attribute (which also triggers when the page is initially populated, which is when request.silent==true):

handlers: /**SCHEMA_HANDLERS*/[
	{
		request: "crt.HandleViewModelAttributeChangeRequest",
		handler: async (request, next) => {
 
			if (request.attributeName === "Type") {
				request.$context.IsTypeEnabled = (!request.value || request.value.displayValue !== "Customer");
				if (!request.silent) {
					console.log("Type changed", request.oldValue, request.value);
				}
			}
 
			return next?.handle(request);
		}
	}
]/**SCHEMA_HANDLERS*/,

Now, I wire up my attribute to the Type in the viewConfigDiff: 

{
	"operation": "merge",
	"name": "Type",
	"values": {
		"readonly": "$IsTypeEnabled | crt.InvertBooleanValue"
	}
}

Note, i am using a converter to invert the value since my attribute indicates it's enabled, but the property expects the inverse.

With this in place, if I open an Account with Type=Customer, or change the Type to Customer it is disabled/readonly.

One thing to note, many controls have both a readonly and a disabled property, not sure what the difference is, both seem to work for me, but the readonly seems to be the one that gives the control the visual lock icon. The disabled property also disables the control, but you don't get the lock icon for the control.

Ryan

Basically, you'll query SysUserInRole where the current user = the SysUser value. The SysRole lookup column will provide you the roles linked to this user. 

See here: https://customerfx.com/article/determining-if-a-user-has-a-specific-role-in-bpmonline/

For a Freedom UI approach, see https://customerfx.com/article/showing-or-hiding-a-field-if-the-current-user-is-a-member-of-a-role-in-a-creatio-freedom-ui-page/

Ryan

Thanks Ryan.  Is there a way to use a webservice for this requirement? Are there any out-of-the-box Webservices that can be called to check if the current user belongs a particular Role using Freedom UI approach ?

If this will be consumed from within Creatio on a Freedom UI page, it's just as easy to do a model query from the Freedom UI page (as shown in the article) as it is to call a web service. Maybe I am missing what you're trying to do? Calling a web service wouldn't really be any different than doing what is suggested in the article using a model query. You could wrap that up as a server-side C# code and expose as a web service, but ultimately, the Freedom UI page is going to request something, whether the web service or the model query, so you could just skip the web service IMO and use the model query.

Thanks Ryan.  Yes I agree. Its just that I wanted to explore using webservices in Creatio and also resuse this webservice across projects and am in the process of creating a C# webservice to achieve this.

Ryan Farley,

On a related note, this approach works fine for hiding or showing the fields based on a condition. But is there a way to make it readonly (disabled) based on a condition?  I noticed that the "visible" property can be set using a boolean variable like $flag, but this doesnt seem to have any effect with the "readonly" properties of the Text box and Combo box.  Is this a known issue and is there a workaround?

Ajay Varghese,

I believe I've been able to bind the readonly property to an attribute and set it programmatically with success (but don't have a system at the moment to verify)

Ajay Varghese,

I'm not sure of an OOTB service for that (roles and user roles). There might be, but it would be a simple service to create. The service would perform the ESQ similar to what is in the articles.

Ajay Varghese,

Additionally, I often wrap that sort of reusable stuff in a client schema class or module so it's easily reusable. Then, whether the class performs a model query or calls a service is irrelevant since it's still abstracted from what is calling it on pages. 

Ryan

Ryan Farley,

Yes, thanks for that direction. I have managed to create the webservices using that approach and it works fine. I am a bit surprised that setting that webservice output flag to the readonly property of a textbox and combobox doesnt have any impact while if I use it on the "visible" property then it works fine.  

Will wait for your response once you get access to your machine.

Just verified, this is working for me. This is a sample for the account page to disable the account Type if it is "Customer". 

Add an attribute to the viewModelConfigDiff:

viewModelConfigDiff: /**SCHEMA_VIEW_MODEL_CONFIG_DIFF*/[
    {
        "operation": "merge",
        "path": [
            "attributes"
        ],
        "values": {
            "IsTypeEnabled": {
            	value: true
            }
        }
    }
]/**SCHEMA_VIEW_MODEL_CONFIG_DIFF*/,

Then, I added a change request handler to listen for values in the Type attribute (which also triggers when the page is initially populated, which is when request.silent==true):

handlers: /**SCHEMA_HANDLERS*/[
	{
		request: "crt.HandleViewModelAttributeChangeRequest",
		handler: async (request, next) => {
 
			if (request.attributeName === "Type") {
				request.$context.IsTypeEnabled = (!request.value || request.value.displayValue !== "Customer");
				if (!request.silent) {
					console.log("Type changed", request.oldValue, request.value);
				}
			}
 
			return next?.handle(request);
		}
	}
]/**SCHEMA_HANDLERS*/,

Now, I wire up my attribute to the Type in the viewConfigDiff: 

{
	"operation": "merge",
	"name": "Type",
	"values": {
		"readonly": "$IsTypeEnabled | crt.InvertBooleanValue"
	}
}

Note, i am using a converter to invert the value since my attribute indicates it's enabled, but the property expects the inverse.

With this in place, if I open an Account with Type=Customer, or change the Type to Customer it is disabled/readonly.

One thing to note, many controls have both a readonly and a disabled property, not sure what the difference is, both seem to work for me, but the readonly seems to be the one that gives the control the visual lock icon. The disabled property also disables the control, but you don't get the lock icon for the control.

Ryan

Ryan Farley,

Thanks Ryan, this worked fine for me. I guess I defined the flag outside of the ViewModelConfigDiff section and hence for some reason whike it worked with the visible property but it consistently failed with the readonly property.  

Ryan Farley,

Just a clarification, does HandleViewModelAttributeChangeRequest trigger on both inital page load as well, in addition to any changes to the page?

Ajay Varghese,

Yes it does. When the page initially loads the data for the record, the change event is triggered at that time for each attribute loaded. Meaning, when the data is loaded and bound it will trigger this change (since it is changing the attributes from empty/nothing to a value). It also triggers this request when the user changes values on the page. The request has a silent property. When true (meaning it was a silent change), that means the change was triggered by the system loading the value and NOT by some action performed by the user. If silent=false, that means the user caused the change. If you only want to trigger on a change made by the user, include !request.silent, for example: 

if (request.attributeName === "Type" && !request.silent) {
    // Type was changed by the user
}

Ryan

Got it.  Thank you.

Show all comments

I'm trying to find the database table where all the column config is stored that you can view through the Object Designer UI (EntitySchemaDesigner), but I don't appear to be able to find it. I have seen some of this data appears to be stored for Lookup columns in the SysEntitySchemaReference table, but for general columns I can't see it.

 

Is this data only stored in the MetaData column of SysSchema? Or am I just missing the table it's stored in column by column?

 

I need this data in order to create a SQL procedure for archiving records, as some columns which have since been removed from the Object still exist on the DB table, so I am trying to exclude such columns from the archiving process. Everything else works about the archiving procedure, the only error is when the source DB table has a column that doesn't exist in the Object's config. Any help appreciated.

Like 0

Like

1 comments

Alternatively, how can I get Creatio to drop columns removed through the EntitySchemaDesigner from the database safely? i.e. a cleanup of the DB tables based on what exists in the actual Creatio config.

Show all comments

Hi everyone,

 

I´m currently working on a project using documents in Freedom UI, and i was wondering if anyone has successfully implemented PDF generation directly from Creatio using a library in source code without relying on paid marketplace add-ons.

I came across this POST wich outlines an approach that seemed this method may no longer be applicable in the most recent versions of Creatio.

Any insights or shared experiences would be appreciated.

 

Regards,

Like 2

Like

6 comments
Best reply

Can't really do it without a 3rd party DLL or service. Some of the newer marketplace addons use the Free Spire.Doc .NET library, which is pretty easy to work with and would be easy to implement. There is a paid version of Spire.Doc, but the free version would likely suffice for most purposes (and can be used for commercial purposes)

Can't really do it without a 3rd party DLL or service. Some of the newer marketplace addons use the Free Spire.Doc .NET library, which is pretty easy to work with and would be easy to implement. There is a paid version of Spire.Doc, but the free version would likely suffice for most purposes (and can be used for commercial purposes)

Ryan Farley,

thank you for your response and for the recommendation,

I actually downloaded the free version of Spire.Doc and started exploring it — it does look quite promising. However, since I’m working entirely within Creatio Cloud, I believe there might be a limitation when it comes to using third-party DLLs directly, though I’m not completely sure.

Do you think it would be viable to integrate Spire.Doc by hosting the functionality externally (for example, as a microservice or an Azure Function) and calling it from Creatio via a REST API? I’d love to hear your thoughts on whether that approach makes sense or if you’ve seen it work in similar cases.

Thanks again for your help and insights.

Paulo Chacoff Leiton,

As Ryan said, we use the paid version of Spire.Doc in our marketplace app: https://marketplace.creatio.com/app/experceo-word-pdf-converter-creatio

It allows you to generate an unlimited number of PDF documents with unlimited pages (the Free version is limited to 3 pages).

Thank you
Mohamed
 

Still amazes me how conversion to pdf is not an Out of the Box feature of Creatio

(actually was and disappeared a couple of years ago)

We have used aspose connector in the past but there are a lot of errors in communication and quality is not acceptable.
we are also considering using the Spire.Doc library for future developments

Ryan Farley,

Do you happen to have a reference of how to invoke functionality from external libraries or assembly reference? i´ve trying to use Spire.doc in a source code file and script task but i always get a "missing assembly reference"

Just to illustrate the attempt, here´s a basic example a tried to convert word document to PDF with source code file:

 

Any guidance on how to properly reference and use third party libraries like this in Creatio would be appreciated.

 

using Spire.Doc;
using Spire.Doc.Documents;
using System.IO;
 
namespace JJ
{
    public class DocService
    {
        public byte[] GenerateDocx() {
            var doc = new Document();
            doc.AddSection().AddParagraph().AppendText("Hola desde Creatio!");
            using (var ms = new MemoryStream()) {
                doc.SaveToStream(ms, FileFormat.Docx);
                return ms.ToArray();
            }
        }
        public byte[] ConvertToPdf(byte[] docxBytes) {
            var document = new Document();
            using (var ms = new MemoryStream(docxBytes)) {
                 document.LoadFromStream(ms, FileFormat.Docx);
            }
            using (var outMs = new MemoryStream()) {
                 document.SaveToStream(outMs, FileFormat.PDF);
                 return outMs.ToArray();
            }
        }
    }
}
Show all comments