I'm trying to set the current package for a freedom application.

However when I do, I get the following error.

"Unable to set the "???" package as the current package of the application. You lack permissions to edit the package."

What permission do I need to update to be able to fix this package?

Like 0

Like

1 comments

Hello,
This error may occur when you attempt to modify a package for which you are not listed as the maintainer. Modifying such packages is not permitted.

Show all comments

Hello 

 

I want to set up a validator in the field when the length is greater than 10 characters, it does not allow saving that record. To achieve this I am basing myself on the following example: https://academy.creatio.com/docs/8.x/dev/development-on-creatio-platfor…

Placing it in the following way but it does not work correctly.

 

validators: /**SCHEMA_VALIDATORS*/{
          /* Implement a custom validator type. */
    "usr.ValidateFieldValue": {
        /* Business logic of the validator. */
        "validator": function (config) {
            return function (control) {
                return control.MaxLength !== config.invalidLength ? null: {
                    "usr.ValidateFieldValue": { message: config.message }
                };
            };
        },
        /* Validator parameters. */
        "params": [
            {
                "name": "invalidLength"
            },
            {
                "name": "message"
            }
        ],
        "async": false
    }
}/**SCHEMA_VALIDATORS*/
 
 
 

 

/**SCHEMA_VIEW_CONFIG_DIFF*/,
		viewModelConfigDiff: /**SCHEMA_VIEW_MODEL_CONFIG_DIFF*/[
			{
				"operation": "merge",
				"path": [
					"attributes"
				],
				"values": {
					"UsrnumerodeserieDS_Name_zb3wye6": {
						"modelConfig": {
							"path": "UsrnumerodeserieDS.Name"
						},
                       /* The property that contains the list of attribute validators. */
                        "validators": {
                            /* Custom validator. */
                            "ValidateFieldValue": {
                                /* Validator type. */
                                "type": "usr.ValidateFieldValue",
                                "params": {
                                    /* The field value that triggers the custom validator. */
                                    "invalidLength": "10",
                                    /* The tooltip that Creatio displays when the field contains the value specified in the “invalidName” property. */
                                    "message": "Invalid name."
                                }
                            }
                        }
					}
				}
			}

 

Also at some point I modify the code and save it but when I re-enter it does not save the changes and removes what I placed

 

Like 0

Like

1 comments

Hello Laura,

The described situation reminds me that you may apply changes to the unauthorized window. If you relogging into the application - you have to close the Code editor page and open it again after each new login, then changes will be applied.

Please try to modify the code according to the given recommendations and reply to my message if the error persists with additional details about the Error you see.

Show all comments

Hi Community,

 

I have to create a concatenated field based on two other fields in the object. Ex. Officer full name from officer first name and officer last name. Is there a way to do it in Creatio? Thanks in advance!

Like 0

Like

3 comments

An easy approach is to create a process that triggers on the record being added or being updated in the officer first name or officer last name fields. Read the record to get the values, then update it with the value concatenated. 

Entity-level calculated fields would be so helpful for these kinds of use cases. Needing to create business processes manually for every calculated field is quite cumbersome and can be the source of issues, and with the aim being less code, having configurable calculated fields at the entity level would surely be a win!

Harvey Adcock,

Completely agree. I would love for these types of values to be completely virtual and simply return the results of a calculation rather than be stored in the database.

Show all comments

Hi Team,

 

Could anyone please help me achieving the things below?

 

I have added two custom attributes in the client module.

 

One of lookup type and the other for text. As soon as the user selects the value in the Title Dropdown, the Description text field should be auto-populated with the corresponding value of description being fetched from a data source of Title.

 

The source lookup is as follows:

 

attributes: {

 "UsrTitle": {
         dataValueType: Terrasoft.DataValueType.LOOKUP,
         type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                  isSimpleLookup: true,

                   referenceSchemaName: "UsrTitle",

                   isRequired: true,
       },

          "UsrDescription": {
         dataValueType: Terrasoft.DataValueType.MAXSIZE_TEXT,
         type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN, 
         value: ""
       }

}

 

    diff: [
                
                {
                    "operation": "insert",
                    "name": "MyMenu",
                    "propertyName": "items",
                    "values": {
                        "generateId": false,
                        "itemType": Terrasoft.ViewItemType.CONTAINER,
                        "items": []
                    }
                },
      
              {
         "operation": "insert",
         "parentName": "MyMenu", // The container where the input box will be added
         "propertyName": "items",
         "name": "UsrTitle",
         "values": {
           "bindTo": "UsrTitle", 
           "labelConfig": {
             "caption": "Title"
           },
         },
           "bindTo": "UsrTitle",
                    
                "enabled": true,
                    
                "contentType": 3
       },
                  
            {
         "operation": "insert",
         "parentName": "MyMenu", 
         "propertyName": "items",
         "name": "UsrDescription",
         "values": {
           "bindTo": "UsrDescription", 
           "labelConfig": {
             "caption": "Description"
           },
            "contentType": 0,
        "layout": {
            "column": 4,
            "row": 5,
            "colSpan": 20,
            "rowSpan": 4
        },
           "controlConfig": {
             "placeholder": "Enter your text here"
           },
           "classes": {
             "wrapClassName": ["custom-input-box-class"]
           }
         }
       },
         {
       "operation": "insert",
       "parentName": "MyMenu",
       "propertyName": "items",
       "name": "MainContactButton",
      
       "values": {
      
           "itemType": Terrasoft.ViewItemType.BUTTON,
         
           "caption":"Create Ticket",
           
           "enabled": true
       }
   },
 ]

 

 

Please note that this is a custom client module which does not belong to a section, hence not able to achieve this using the OOTB business rules. Kindly help!

 

Thanks,

Sarika

Like 0

Like

2 comments
Best reply

First of all, you'll need to have a change event for when the lookup attribute it selected, add something like this to the lookuip attribute: 

"UsrTitle": {
    dataValueType: Terrasoft.DataValueType.LOOKUP,
    type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
    isSimpleLookup: true,
    referenceSchemaName: "UsrTitle",
    isRequired: true,
    onChange: "getTitleDescription"
}

Then, add the getTitleDescription method to the methods. When a value is selected this will get called and you can go retrieve the description via an EntitySchemaQuery to set in the other attribute:

getTitleDescription: function() {
    var title = this.get("UsrTitle");
    // now do an esq to get the description using title.value and then set in the description attribute
}

You could try adding the Description to the lookup attribute's lookupListConfig to avoid the esq, but I am not sure if that works for a virtual lookup attribute. However, doing an esq there would work fine.

Ryan

First of all, you'll need to have a change event for when the lookup attribute it selected, add something like this to the lookuip attribute: 

"UsrTitle": {
    dataValueType: Terrasoft.DataValueType.LOOKUP,
    type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
    isSimpleLookup: true,
    referenceSchemaName: "UsrTitle",
    isRequired: true,
    onChange: "getTitleDescription"
}

Then, add the getTitleDescription method to the methods. When a value is selected this will get called and you can go retrieve the description via an EntitySchemaQuery to set in the other attribute:

getTitleDescription: function() {
    var title = this.get("UsrTitle");
    // now do an esq to get the description using title.value and then set in the description attribute
}

You could try adding the Description to the lookup attribute's lookupListConfig to avoid the esq, but I am not sure if that works for a virtual lookup attribute. However, doing an esq there would work fine.

Ryan

Ryan Farley,

 

Thanks. it worked.

Show all comments

Hi, 

 

I need to set a complex filter for a grid. How do I create a filter in JS and set it to a list in a page in freedom?

 

Best regards, 

 

Javier 

Like 0

Like

1 comments

Have you tried adding a crt.LoadDataRequest handler to dump request.dataSourceName out to the console to see if you can determine the name of the dataSourceName attriubute the list uses - and that it does fire that request? I assume it triggers this request when it get's it's data - similar to how lookups do, see https://customerfx.com/article/dynamically-filtering-a-lookup-on-a-creatio-freedom-ui-page/

Assuming it does and once you know the name of the dataSourceName it uses for the request you could add the conditions.

Alternatively, I believe you can add the filter conditions directly in the datasource in the viewModelConfigDiff, but you'd need to know the attribute name used in that scenario as well. Something like https://academy.creatio.com/docs/8.x/dev/development-on-creatio-platform/front-end-development/freedom-ui/data-sources/data-processing#title-2438-3

Ryan

Show all comments

Hi,

I’m currently working with email campaigns in Creatio and facing a challenge. I need to generate more granular reports on email interactions for my client. Specifically, I’m looking for a way to track the number of clicks and email opens on a daily basis or within a specific time frame during the campaign. For example, if a campaign runs for several months, we need to see how many emails were opened and how many clicks occurred on specific days or within a given month.

 

I’ve been using the [AdCampaign] object that integrates with Google Ads and Meta Ads. It provides a granular view of daily data, such as clicks and impressions, through the [Ad campaign Daily Insights] child object. My client would like a similar capability for email data—being able to filter by specific date ranges to view detailed interaction data (opens, clicks, etc.).

 

Is there an existing table or method in Creatio that allows me to capture and report email interactions in such a granular format? Additionally, would it be possible to combine this email interaction data with the social media data (from Google Ads and Meta Ads) into a unified report that shows all interactions (clicks, opens, etc.) within the same time period?

 

I would appreciate any guidance or suggestions on how to achieve this, ideally within the marketing module of Creatio.

Like 1

Like

1 comments
Best reply

Hello,

 

Unfortunately, at the time, such filtration is not possible through out-of-the-box means.

We will inform our development team about such an idea so that it might be developed in the future.

 

Thank you for being an active part of the Creatio community! 

Hello,

 

Unfortunately, at the time, such filtration is not possible through out-of-the-box means.

We will inform our development team about such an idea so that it might be developed in the future.

 

Thank you for being an active part of the Creatio community! 

Show all comments

Hello,

 

I'm trying to create a rest service using the AFT Repository (2.0.2.4) and everything works as expected until I save the context when I get the error below. 

 

What I am missing?

 

Thanks,

Jose

 

Newtonsoft.Json.JsonSerializationException: Unable to find a constructor to use for type ATF.Repository.Providers.ResponseStatus. A class should either have a default constructor, one constructor with arguments or a constructor marked with the JsonConstructor attribute. Path 'responseStatus.ErrorCode', line 1, position 31.
  at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
  at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
  at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id)
  at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
  at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
  at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
  at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
  at Newtonsoft.Json.JsonSerializer.Deserialize(JsonReader reader, Type objectType)
  at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings)
  at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings)
  at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value)
  at ATF.Repository.Providers.RemoteDataProvider.BatchExecute(List`1 queries)
  at ATF.Repository.AppDataContext.Save()
  at C2C.CreatioDataIntegration.AppealDocumentManagement.Save() in C:\tfs\C2C_QLS\QLS\CreatioDataIntegration\CreatioDataIntegration\AppealDocumentManagement.cs:line 71
  at C2C.CreatioDataIntegration.AppealDocumentManagement.Add(AppealDocumentRequest request) in C:\tfs\C2C_QLS\QLS\CreatioDataIntegration\CreatioDataIntegration\AppealDocumentManagement.cs:line 65
  at Program.<>c.<<$>b__0_2>d.MoveNext() in C:\tfs\C2C_QLS\QLS\CreatioDataIntegration\CreatioDataIntegration\Program.cs:line 61
--- End of stack trace from previous location ---
  at Microsoft.AspNetCore.Http.RequestDelegateFactory.ExecuteTaskResult[T](Task`1 task, HttpContext httpContext)
  at Microsoft.AspNetCore.Http.RequestDelegateFactory.<>c__DisplayClass102_2.<b__2>d.MoveNext()
--- End of stack trace from previous location ---
  at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
  at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
  at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
  at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
  at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)

 

File attachments
Like 0

Like

3 comments

Hi, does anyone have information on how best to carry out branching development in Creatio using Git? We've found plenty of pitfalls and issues with doing so that we work around in various ways, but it doesn't feel particularly streamlined and has plenty of trial and error involved, which isn't ideal!

 

Some of the things we encounter are desynchronisation of the database with the config, various errors thrown by the compiler, quite a consumption in time of switching branches, it being a bit easy to lose config changes unless you are very precise about how you change branches etc.

Like 1

Like

2 comments

Hello Harvey,

Based on our experience, most problems occur when switching branches that have different objects (for example, an object exists in one branch but not in another). This issue is not exclusive to Creatio but is common to all projects that use an ORM (Object-Relational Mapping) system to manage the database, such as EntityFramework. Therefore, the advice here is to avoid switching between such branches. If you must do so, remember to remove reverse references between objects (which are created for OData). I do this by executing the following queries in the database:

```sql
DELETE FROM SysSchemaSource WHERE SysSchemaId IN (SELECT Id FROM SysSchema WHERE SysPackageId NOT IN (SELECT Id FROM SysPackage));
DELETE FROM SysSchema WHERE SysPackageId NOT IN (SELECT Id FROM SysPackage);
DELETE FROM SysPackageSchemaData WHERE SysPackageId NOT IN (SELECT Id FROM SysPackage);
DELETE FROM SysSchemaSource WHERE Name LIKE '%backreference%';
```

After that, I perform a compilation.

Additionally, frontend schemas also have connections through the configuration (for example, the `SysModuleEdit` table), and if the schemas are missing, you might end up with a non-working UI.

In different branches, schemas can also be moved between packages, and the relationships in the configuration can break because of this.

This is precisely why only SVN is officially supported, and using Git comes with limitations similar to those when using SVN.

You should also consider that Git only deletes files, but folders may remain empty. While this is not an issue for Git, it is very important for Creatio. All empty folders are perceived as packages, and if a folder is empty, it will be populated when exporting code to the file system.

Also, deleting a package through Git will not remove the package in the configuration because Creatio reacts only to code changes, and if there are none, no changes will occur.

Our team has a whole list of such nuances, but we have written PowerShell scripts to solve most of them (for example, deleting all empty folders or removing a SQL script that remains when renaming it through the configuration and a new one is created with a new name).

I can describe our other rules as well, but that would take more time.

 

P.S. The Creatio system is well-designed if you follow its development features and keep it clean (for example, developers often delete schemas without removing resources, or they move schemas between packages through the file system to save time instead of doing it through the configurator). If you establish rules, adhere to them, and use helper scripts, development won't cause unpleasant issues.

Dear Harvey,

Unfortunately, there is no universal recommendation that could completely resolve your issue. However, here are a few key points to consider:
 

    1) All packages in the configuration should be tied to a single Git repository, since they depend on each other and need to be saved as part of a single commit. (It's not recommended to store each package in a separate repository.)


    2) Automatically generated folders in independent packages should be added to the .gitignore file.


    3) The obj folders in independent packages should also be added to the .gitignore.


    4) Only your custom packages should be added to the repository. For vendor packages (from Creatio) and Marketplace packages, use the standard methods (application installation, upgrading to a new version).


    5) Never modify vendor packages (from Creatio). To extend functionality, use inheritance and entity substitution.


    6) Schema metadata is difficult to merge and understand, so it is recommended that only one developer works on extending objects or modifying a specific schema.

    7) If a developer makes changes in one environment and commits them to the repository, and others pull these changes, there should be no database and configuration desynchronization issues.

    8) You can create scripts to quickly set up the environment and pull the necessary branch from the repository. This will help avoid issues with leftover data from a different branch.

Thank you!

Show all comments

Hello,

 

I'm following the clio tutorial to install Creatio from CLI, but I'm getting the error below. Any ideas on what I'm missing?
 

Thanks,

Jose 
 

clio version '6.1.0.37'


[ERR] - The requested service 'Clio.Command.CreatioInstallCommand.InstallerCommand' has not been registered. To avoid this exception, either register a component to provide the service, check for service registration using IsRegistered(), or use the ResolveOptional() method to resolve an optional dependency.
 

Like 0

Like

1 comments

Hello,
 

The clio application is supported directly by the application developers on the github page.

We encourage you to consult our comprehensive documentation and engage with our GitHub community for assistance.


You can also ask your question and describe the error using this link.

 

https://github.com/Advance-Technologies-Foundation/clio/issues?q=is%3Ai…
 

Thank you.

Show all comments

Hello. Is there a way to fill the field values ​​from the master window in which you opened the lookup (lookup field) and clicked the "New" button? Something similar to how adding a record in a datagrid detail works. When you click add a record, a window with fields opens and these fields can automatically pull values ​​from the master page.

Like 0

Like

1 comments

Hello,
As far as I know, there are no methods to transfer data from the master record to a one created via a lookup window. But, the sandbox messaging should help you resolve this task. More on it here https://academy.creatio.com/docs/8.x/dev/development-on-creatio-platfor…

Show all comments