Время создания
Filters
Studio_Creatio
Sales_Creatio
Service_Creatio
Marketing_Creatio
#tab#automation#hidden#Shown
Studio_Creatio
8.0

Hi Everyone,

I’m working with a detail object and want to:

• Sort the Costs and Savings Detail table records statically in a fixed order (not dynamic user sorting)
• Also restrict users from re-sorting by clicking column headers

Has anyone implemented a way to enforce a fixed sequence for detail table data in Creatio (or similar object structure)?

Any guidance or best practices would be appreciated.

Thanks in advance!

Like 1

Like

1 comments

Hi, Ajay.

For first you need to setup sorting by some column at Freedom UI designer and turn off sorting at Appearance, save page. :

appearance

Then restore list settings by default:

restore default settings

Result:

Show all comments

Hi, 

I am working on developing custom handler that will be using Chart.JS (External JS CDN) to perform some action as requirement.

Error:

Handler Method:

{
    request: "usr.GenerateContactChartRequest",  // On Button Click
    handler: async (request, next) => {
 
 
        try {
            // 1. Fetch Context Data
            console.log("Generate Charts Button Clicked");
            const contactId = await request.$context.Id;
            console.log("Contact: ",contactId);
 
            if (!contactId) {
                console.error("No Contact ID found. Cannot generate charts.");
                return next.handle(request);
            }
 
            // --- 2. Define Data Variables (Fetch from Page Context) ---
            // Replace 'PDS_UsrInPerson_...' with your actual attribute codes
            const isPersonValue = await request.$context.PDS_UsrInPerson_64gzj70 ? 100 : 20;
            const consentValue = await request.$context.PDS_UsrDataProtectionConsent_urep1g6 ? 80 : 30; 
 
            // A. Chart Generation Helper
            const createChartImage = async (type, data, options = {}) => {
                return new Promise((resolve) => {
                    const canvas = document.createElement('canvas');
                    canvas.width = 600;
                    canvas.height = 400;
                    const ctx = canvas.getContext('2d');
                
                // 3. Initialize using the extracted class
                new Chart(ctx, {
                    type: type,
                    data: data,
                    options: {
                        animation: false,
                        responsive: false,
                        ...options
                    }
                });
 
                    // Resolve the promise with the Base64 string
                    const base64String = canvas.toDataURL("image/png");
                    resolve(base64String);
                });
            };
 
            // B. Database Save Helper
            const saveChartSnapshot = async (ContactId, ChartType, ImgStr) => {
                return new Promise((resolve) => {
                    // Check if modern Model API is available (Freedom UI Best Practice)
                    if (request.$context && request.$context.getModel) {
                        const runSave = async () => {
                            const model = await request.$context.getModel("UsrChartSnapshot");
                            await model.insert({
                                UsrContact: { value: ContactId },
                                UsrChartType: ChartType,
                                UsrImageData: ImgStr
                            });
                            resolve();
                        };
                        runSave();
                    } else {
                        // Fallback to Classic ExtJS API
                        var insert = Ext.create("Terrasoft.InsertQuery", { rootSchemaName: "UsrChartSnapshot" });
                        insert.setParameterValue("UsrContact", ContactId, Terrasoft.DataValueType.GUID);
                        insert.setParameterValue("UsrChartType", ChartType, Terrasoft.DataValueType.TEXT);
                        insert.setParameterValue("UsrImageData", ImgStr, Terrasoft.DataValueType.TEXT);
                        insert.execute(() => resolve());
                    }
                });
            };
 
            // --- 4. Execute Chart Generation ---
            // A. Generate and Save Pie Chart
            const pieBase64 = await createChartImage('pie', {
                labels: ['In Person', 'Remote'],
                datasets: [{
                    data: [isPersonValue, 100 - isPersonValue],
                    backgroundColor: ['#36a2eb', '#ff6384']
                }]
            });
            await saveChartSnapshot(contactId, "Pie", pieBase64);
            console.log("'Pie Chart' saved.");
        } 
        catch (error) {
            console.error("Error generating or saving charts:", error);
        }
        return next.handle(request);
    }
}
Like 0

Like

0 comments
Show all comments
landingpage
Studio_Creatio_enterprise_edition
8.0

For a customer, we have a custom object <strong>UsrCandidate</strong> which is initially populated from an external system.
At that point, we already know the candidate’s full name and email address.

We want to send the candidate an email with a Marketing Landing Page link, where they can complete additional information (via a web form).

Our challenge is the following:

  • When the candidate submits the landing page, Creatio creates a new <strong>UsrCandidate</strong> record
  • We want the submission to update the existing <strong>UsrCandidate</strong> record instead, so that there is only one record per candidate

Is there a supported way to:

  • Pass the existing Candidate record ID (or another identifier) into the landing page (e.g. via URL parameters), and
  • Configure the landing page so that it updates the existing record instead of creating a new one?

If possible, we would prefer a Creatio-native approach (Marketing landing pages, matching logic, hidden fields, etc.), rather than post-submission merging via a business process.

Any guidance or best practices would be much appreciated.

Thanks in advance!

Like 20

Like

0 comments
Show all comments

Hello. As part of our reporting, we include Comments and Emails that our agents include in Contact and Lead records. For example, if an agent notes in the Feed that they stopped by a client's home and spoke to them, we want to count that as a touchpoint/activity. 

Currently in the activity dashboard we can easily calculate the OOB activity such as calls, appointments, tasks, but we cannot connect to the comments and emails directly for the dashboard. 

Is there a way to do so without a developer stepping in? 

Thanks very much, Susan

PS We are still in Classic UI on v 8.3.1.4498

Like 0

Like

0 comments
Show all comments
Sales_Creatio
8.0

Hi,

I am wanting to send an email as part of an automated process, where a quote is provided. The quote data will come from the Opportunity and the Products within that, but the issue I need to solve is; how can I create an email which will allow multiple dynamic rows to be included in the email body.

Say I have 5 products in the opportunity, I need those 5 products to be displayed in a table form. Is this possible? If not, could I automatically create a printable, which I can then attach as an attachment to the email? Note - I am using the cloud version, which may impact things.

Thanks for any help!

Mark

Like 0

Like

1 comments

One approach is to create your own HTML table in the process by looping through the records. A sample of that approach is outlined here: https://customerfx.com/article/emailing-a-list-of-multiple-records-from-a-process-in-creatio/

Alternatively, you could create it as a printable, which can have tables of related data, and attach that to the email (using Process File element in a process to generate the printable to attach to the email)

Ryan

Show all comments