Trying to create new Reminding with link to Call or Contact collection objectby oData4 request. Is it possible?
With Action collection everything fine. But with Call (or Contact) collection Id request only red point appears near bell symbol, but list of remindings is empty.

Like 0

Like

2 comments

Hello!

 

If you mean create remindings with link to specific record. You actually can manage something like this with the business process by adding notifications with an edit page element. And then trigger this process by odata.

Kyrylo Atamanenko,

Thank you, Kyrylo

I mean, which collection UId from the list of {{BaseURI}}/0/odata/SysSchema should be specified in the "SysEntitySchemaId" field in the POST request  {{BaseURI}}/0/odata/Reminding in order to create a notification not bound to an Action, but Contact or Call? Is it possible to create this kind of notification without changing the default configuration of Creatio?

Show all comments

Hi, I have a problem when I first start the Creatio application. I followed the instructions shown in the training and after logging in to the application (the login window appears correctly) I get a blank page and in the logs (Temp/Creatio/D1Dev/Log//Error.log) I see an error:


2025-02-18 09:51:32,298 [1] ERROR IIS APPPOOL\D1Dev Terrasoft.Core.SchemaManagerProvider InitializeConfigurationFromDI - Could not initialize manager provider configuration from DI
System.ArgumentNullException: Value cannot be null.
Parameter name: provider
  at System.ThrowHelper.Throw(String paramName)
  at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetServices[T](IServiceProvider provider)
  at Terrasoft.Core.SchemaManagerProvider.InitializeConfigurationFromDI()
2025-02-18 09:51:32,698 [1] ERROR IIS APPPOOL\D1Dev Terrasoft.Core.SchemaManagerProvider InitializeConfigurationFromDI - Could not initialize manager provider configuration from DI
System.ArgumentNullException: Value cannot be null.
Parameter name: provider
  at System.ThrowHelper.Throw(String paramName)
  at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetServices[T](IServiceProvider provider)
  at Terrasoft.Core.SchemaManagerProvider.InitializeConfigurationFromDI()

 

These are screenshot of the blan page with the console and network tabs logs

Like 0

Like

1 comments

Hello,

We have received the results of the research from our development team:

The error “Terrasoft.Core.SchemaManagerProvider InitializeConfigurationFromDI” occurs only at the start of the application, because at this point the DI provider (which is a fairly new functionality in Creatio for back-end engines) is not initialized. This exception is caught, recorded only in the log file, and does not affect the program's operation. You can ignore this message.

Our developers have also opened an issue to fix this behavior in future releases of Creatio.

​​​​​​​Please advise, does the problem recur all the time or is this your first time logging in?

When installing an application, by default the first login always takes a long time to load, as the site needs to fetch all the data. Upon further logins to the site, it loads faster.

 

Show all comments

Hello everyone,

I'm working on a custom duration validator in Creatio, but I'm running into an issue where the function returns invalidMessage before the validation logic completes.

Here’s a simplified version of my function:

durationValidator: function(){
                var invalidMessage="";
                var name=this.get("UsrNameLookup").value ?? null;
                var currentDuration=this.get("UsrDurationMinute");
                if(!name){
                    return;
                }
                var esqDuration = this.Ext.create("Terrasoft.EntitySchemaQuery", {
               rootSchemaName: "UsrPerformances"
           });
                esqDuration.addColumn("UsrDurationMinute");
                // var groupFilters = this.Ext.create("Terrasoft.FilterGroup");
                
                var totalDuration = 0;
                if(this.isAddMode()){
                    var nameFilter = this.Terrasoft.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.EQUAL, "UsrNameLookup", name);
                // groupFilters.addItem(filterId);
                esqDuration.filters.add("esqFirstFilter",nameFilter);
                    esqDuration.getEntityCollection(function(result) {
                   if (!result.success) {
                       this.showInformationDialog("Request error");
                       return;
                   } else {
                       result.collection.each(function(item) {
                               totalDuration += item.get("UsrDurationMinute");
                           }
                       );
 
                   }
                   totalDuration += currentDuration;
                        console.log(totalDuration);
                   this.Terrasoft.SysSettings.querySysSettingsItem("UsrMaximumDuration", function(maxDuration) {
                       // console.log("td"+totalDuration);
                       if (totalDuration > maxDuration) {
                            this.set("Numbervalue", false);
                           this.showInformationDialog("No more than " + maxDuration + " total performances duration is allowed.");
                            invalidMessage= "No more than " + maxDuration + " total performances duration is allowed.";
                            return{
                                invalidMessage: invalidMessage
                            };
                       } 
                        else {
                            this.set("Numbervalue", true);
                            invalidMessage="";
                            return{
                                invalidMessage: invalidMessage
                            };
                       }
                   }, this);
 
               }, this);
                }else{
                    console.log("else");
                    var nameFilter = this.Terrasoft.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.EQUAL, "UsrNameLookup", name);
                
                
                    var idFilter = this.Terrasoft.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.NOT_EQUAL, "Id", this.get("Id"));
                    esqDuration.filters.logicalOperation = Terrasoft.LogicalOperatorType.AND;
                    esqDuration.filters.add("esqFirstFilter",nameFilter);
                    esqDuration.filters.add("esqSecondFilter", idFilter);
                    esqDuration.getEntityCollection(function(result) {
                   if (!result.success) {
                       this.showInformationDialog("Request error");
                       return;
                   } else {
                       result.collection.each(function(item) {
                               totalDuration += item.get("UsrDurationMinute");
                           }
                       );
                       // console.log("i am running");
                       // let prevduration=this.get("UsrprevDuration");
                       // console.log("previous duration"+ prevduration);
                       totalDuration += currentDuration;
 
                   }
                    console.log(totalDuration);
                   this.Terrasoft.SysSettings.querySysSettingsItem("UsrMaximumDuration", function(maxDuration) {
                       // console.log("td"+totalDuration);
                       if (totalDuration > maxDuration) {
                            this.set("Numbervalue", false);
                           this.showInformationDialog("No more than " + maxDuration + " total performances duration is allowed minutes.");
                            invalidMessage="No more than " + maxDuration + " total performances duration is allowed.";
                            return{
                                invalidMessage: invalidMessage
                            };
                       } else {
                           this.set("Numbervalue", true);
                            invalidMessage="";
                            return{
                                invalidMessage: invalidMessage
                            };
                       }
                   }, this);
 
               }, this);
            
                    
            }
                console.log(invalidMessage);
                return{
                                invalidMessage: invalidMessage
                            };
                },
 
 
The console.log(invalidMessage); statement always prints an empty string.
  • The function returns <strong>invalidMessage</strong> before the asynchronous operations (getEntityCollection and querySysSettingsItem) complete.
  • As a result, validation messages do not appear correctly.
Like 0

Like

1 comments

Greetings!

 

Have noticed that field BlindCopyRecipient in Activity is not being populated when receving an email, that was send using bcc field and specifying an email address that is configured for synchronization.  However email is synchronized and showing correctly in communication panel. Is it a bug or feature?

 

Like 1

Like

0 comments
Show all comments

Hi,

 

I am using '8.2.1.5446_Studio_Softkey_MSSQL_ENU' build package for local Creatio development. I can login and use only a few App buttons (precisely speaking Creatio AI dashboards, Creatio AI setup, Studio homepage and UI management). But, for other App buttons (like Lookup, Webhooks, Users, System Settings, etc.), an empty page loads. I am attaching a screenshot for reference. Can you please help me to resolve this issue?

 

When I do 'Inspect', I see a bunch of errors like -

Failed to load resource: the server responded with a status of 404 (Not Found)Understand this error -configuration/2ccc1a4cd18a5baa438a5dda5d9c513aen-US/SectionModuleV2.js:1
 
Refused to execute script from 'http://localhost/KP_App/0/configuration/2ccc1a4cd18a5baa438a5dda5d9c513aen-US/SectionModuleV2.js' because its MIME type ('text/html') is not executable, and strict MIME type checking is enabled.
 
user: Supervisor/7f3b869f-34f3-4f20-ab4d-7480a5fdf647
 file: http://localhost/KP_App/0/Shell/8096.22ae89967ffcf264.js
 line: 97
 column: 16846
 message: Uncaught Error: Script error for "SectionModuleV2"
http://requirejs.org/docs/errors.html#scripterror 
 date: Fri Feb 14 2025 16:55:22 GMT+0000 (Coordinated Universal Time)
 stack: Error: Script error for "SectionModuleV2"
http://requirejs.org/docs/errors.html#scripterror
    at makeError (http://localhost/KP_App/core/hash/requirejs/require.js?v=482289676:168:17)
    at HTMLScriptElement.onScriptError (http://localhost/KP_App/core/hash/requirejs/require.js?v=482289676:1742:36)
    at xt.invokeTask (http://localhost/KP_App/0/Shell/8096.22ae89967ffcf264.js:97:7571)
    at mt.runTask (http://localhost/KP_App/0/Shell/8096.22ae89967ffcf264.js:97:2530)
    at zt.invokeTask [as invoke] (http://localhost/KP_App/0/Shell/8096.22ae89967ffcf264.js:97:8718)
    at qe (http://localhost/KP_App/0/Shell/8096.22ae89967ffcf264.js:97:16333)
    at bt (http://localhost/KP_App/0/Shell/8096.22ae89967ffcf264.js:97:16678)
    at HTMLScriptElement.ct (http://localhost/KP_App/0/Shell/8096.22ae89967ffcf264.js:97:16980)
Like 2

Like

0 comments
Show all comments

I need to convert a decimal field into words for a report template. Can this be done with a formula or does it have to be a script?

Like 0

Like

1 comments

You need an script task

Show all comments

I have created a script to turn integers into words and it keeps compiling with errors.

 

heres the script:

 

using System;
using System.Text;
using Terrasoft.Core;
using Terrasoft.Core.Entities;
using Terrasoft.Core.Process;

public class ConvertCurrencyToTextTask : ProcessUserTask
{
   // ✅ Constructor
   public ConvertCurrencyToTextTask(ProcessExecutingContext context) : base(context) { }

   // ✅ Main execution method (Runs when the Script Task is triggered)
   public override bool CompleteExecuting(UserConnection userConnection)
   {
       try
       {
           // ✅ Retrieve the requested amount from the process parameter
           decimal requestedAmount = Get("DfcReqAmt");

           // ✅ Retrieve the dynamically fetched record ID
           Guid recordId = Get("Id");

           // ✅ Convert the numeric amount to words
           string convertedText = ConvertToWords(requestedAmount);

           // ✅ Store the result in the output parameter
           Set("DfcRequestedAmountText", convertedText);

           // ✅ Update the record in the FinApplication object
           UpdateRecord(userConnection, recordId, convertedText);
       }
       catch (Exception ex)
       {
           throw new Exception("Error in ConvertCurrencyToTextTask: " + ex.Message);
       }

       
   }

   // ✅ Converts numbers to words (DYNAMIC)
   private string ConvertToWords(long number)
   {
       if (number == 0)
           return "Zero";

       if (number < 0)
           return "Negative " + ConvertToWords(Math.Abs(number));

       string words = "";
       int thousandIndex = 0;

       while (number > 0)
       {
           if (number % 1000 != 0)
           {
               words = ConvertHundreds(number % 1000) + Thousands[thousandIndex] + " " + words;
           }
           number /= 1000;
           thousandIndex++;
       }

       return words.Trim();
   }

   // ✅ Converts hundreds, tens, and ones
   private string ConvertHundreds(long number)
   {
       string words = "";

       if (number >= 100)
       {
           words += Ones[number / 100] + " Hundred ";
           number %= 100;
       }

       if (number >= 10 && number <= 19)
       {
           words += Teens[number - 10] + " ";  // ✅ Corrected indexing for Teens
       }
       else
       {
           words += Tens[number / 10] + " ";
           words += Ones[number % 10] + " ";
       }

       return words.Trim();
   }

   // ✅ Updates the record with the converted text
   private void UpdateRecord(UserConnection userConnection, Guid recordId, string convertedText)
   {
       if (recordId == Guid.Empty) // ✅ Ensures ID is valid before updating
           throw new Exception("Record ID is empty, cannot update record.");

       var entitySchema = userConnection.EntitySchemaManager.GetInstanceByName("FinApplication");
       var entity = entitySchema.CreateEntity(userConnection);

       if (entity.FetchFromDB(recordId))
       {
           entity.SetColumnValue("DfcRequestedAmountText", convertedText);
           entity.Save();
       }
   }

   // ✅ Number arrays (DYNAMIC)
   private readonly string[] Ones = { "", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine" };
   private readonly string[] Teens = { "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen" };
   private readonly string[] Tens = { "", "", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety" };
   private readonly string[] Thousands = { "", "Thousand", "Million", "Billion", "Trillion" };
} // ✅ Class correctly closed

 

 

return true; // ✅ Ensures method completes properly
 

 

 

 

these are the errors I am getting:

 

DfcProcess_25a93f1.DfcLoans.cs    Identifier expected    CS1001    34
DfcProcess_25a93f1.DfcLoans.cs    Identifier expected    CS1001    33
DfcProcess_25a93f1.DfcLoans.cs    Identifier expected    CS1001    35
DfcProcess_25a93f1.DfcLoans.cs    Type or namespace definition, or end-of-file expected    CS1022    151
DfcProcess_25a93f1.DfcLoans.cs    } expected    CS1513    36
DfcProcess_25a93f1.DfcLoans.cs    Identifier expected    CS1001    32
DfcProcess_25a93f1.DfcLoans.cs    Identifier expected    CS1001    36

 

Not sure what is missing as far as syntax goes, all bracket appear to be in place.

 

Appreciate the help in advance.

 

 

 

 

Like 1

Like

4 comments

Hi,

 

The error is related to the business proceess DfcProcess_25a93f1. Can you share a source code for the business process, not the user task you shared? You can get the source code of the business process here:

There was no source code?

Hello,
 

In this case, do you perform development on a local environment?

If so, could you search for the schema in the {rootAppFolder}\Terrasoft.WebApp\Terrasoft.Configuration\Pkg\DfcLoans\Autogenerated\Src\DfcProcess_25a93f1.DfcLoans.cs directory?

You can also find the location of the file that causes compilation errors if you look at the application logs (Build.log) for the day of compilation and errors.

Show all comments

Hello,

 

I'm wanting to setup a business process so that when a user is mentioned in the feed they receive an email notification. Also, there may be instances where more than 1 user is mentioned in a single comment and I'd want each person to get an email notification in that case.

 

I've tried creating this business process and am stuck as it sends the notification to the person who created the comment in the feed, not the user mentioned in the comment. Any tips on this are greatly appreciated!

 

Thank you,

 

Eric

Like 0

Like

4 comments
Best reply

Hi Eric,

try to use such signal on the object 'User mention' and send notification to Contact:

Hi Eric,

try to use such signal on the object 'User mention' and send notification to Contact:

Thank you! That did it. What's the best method to provide a link to the record via an email? I tried following the steps here - https://community.creatio.com/questions/link-based-feed-notification but it appears to break when there are replies to an existing comment.

 

Eric Curran,

We have such formula (it is for Classic UI, but you can change it for Freedom UI):

"<a href=\""+[#System setting.Website URL#]+"/0/Nui/ViewModule.aspx#CardModuleV2/"+[#Page name#]+"/edit/"+[#Object Id#]+"\">"+[#Record title#]+"</a>"

Eric Curran,

We have implemented this way for replies:

Show all comments

Hello!
I created a new Functional role with oData operations permission and add it to User. 
Using Postman can GET data from "Contact" collection with this User credentials. It also can create new Contact using POST method.
PATCH returns:  403 - Forbidden: Access is denied
DELETE returns:  405 - HTTP verb used to access this page is not allowed

What permissions I have to grant to this Functionsl role and how?

This instruction
https://academy.creatio.com/docs/developer/integrations_and_api/data_se…
say for 405
"The response should contain the Allow header with the list of request methods the resource supports."
Postman returns:
 405 - HTTP verb used to access this page is not allowed

 The page you are looking for cannot be displayed because an invalid method (HTTP verb) was used to attempt access.

 

Can you help?

Like 0

Like

1 comments

Greetings! 

 

For the user to work through OData, you need to grant them access using the CanUseODataService code in the Operation permissions section. 

Show all comments

Hi,

 

I want to make a validator that endDate cannot be erlier than leave startDate, in endDate field in viewModelConfigDiff,

Expectation:

 

My Code:

 

"PDS_UsrLeaveEndDate_quo1xia": {
	"modelConfig": {
		"path": "PDS.UsrLeaveEndDate"
	},
	"validators": {
		"MySuperValidator2": {
			"type": "usr.FutureDateValidator2",
			"params": {
				"message": "#ResourceString(EndDateWarning)#",
				"startDate": "PDS_UsrLeaveStartDate_apq3vdm"
			}
		}
	}
}

 

   "usr.FutureDateValidator2": {
                validator: function (config) {
                    return function (control) {
                        let value = control.value;
                       let startDate =  config.startDate;
                        let valueIsCorrect = value > startDate;
                        var result;
                        if (valueIsCorrect) {
                            result = null;
                        } else {
                         console.log(startDate);
                         console.log(value);
                            result = {
                                "usr.FutureDateValidator2": { 
                                    message: config.message
                                }
                            };
                        }
                        return result;
                    };
                },
                params: [
                    {
                        name: "message"
                    },
                 {
                        name: "startDate"
                    }
                ],
                async: false
            },

 

But, value of startDate from the params is a String, how to get the actual value?

 

Thank you

Like 0

Like

0 comments
Show all comments