Hello, community

 

The question regarding campaings running context: when a particular user starts a campaign, will it be executed in his|her role (rights) context, or it will be executed in the context of a some kind of system account (with full set of rights)?

 

I'm interesting in could the following situation appear: user had set up filter for the campaign audience, but after starting of the campaign more contacts were added in it (even those who are unavailable for the user)  due to extended rights of an account in which context the  campaign was started. 

Like 0

Like

1 comments

Hello,

 

In Creatio, campaigns are executed with the same permissions and access rights as the user who started them. This means that only the contacts the user has access to will be included in the campaign. The situation you described, where more contacts are added to the campaign audience, should not occur. 

Show all comments

Hi Community,

I encountered an error while trying to change the Default Page in an object.

 

 

Does anyone know what might be causing this issue or how to resolve it? Any insights would be greatly appreciated.

Thank you in advance!

Like 0

Like

1 comments

Hello,

The issue can occur if you have two add-ons with different names referring to the same object. This typically happens when the object was renamed, and a new add-on was generated as a result. Or if duplicate add-ons were created for the same object in one package.

I'm also adding an example of how the addon will look in the system:

 

In order to solve this problem, it is necessary:
1. Identify and Remove the Conflicting Add-On
2. After removing the conflicting add-on, regenerate and compile the system to ensure all settings are correctly applied.

This should resolve the issue and ensure consistent behavior for your Default Page settings.

Show all comments

I have the following script task in a bpm.
This is responsible for taking the results of this api and inserting the records into a Creatio object.

Script task:

 var baseUrl = "https://angelbaraldo.creatio.com";
    var authUrl = baseUrl + "/ServiceModel/AuthService.svc/Login";
    var apiUrl = baseUrl + "/0/rest/CustomStockService/GetNoConciliadosData";
    var username = "MyUser";
    var password = "MyPassword";
 
    // Cuerpo de autenticación
    var authBody = new
    {
        UserName = username,
        UserPassword = password
    };
 
    var authBodyJson = Newtonsoft.Json.JsonConvert.SerializeObject(authBody);
 
    // Solicitud de autenticación
    var authRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(authUrl);
    authRequest.Method = "POST";
    authRequest.ContentType = "application/json; charset=utf-8";
 
    using (var streamWriter = new System.IO.StreamWriter(authRequest.GetRequestStream()))
    {
        streamWriter.Write(authBodyJson);
    }
 
    string authCookies = null;
    string bpmcsrf = null;
 
    // Obtener la respuesta de autenticación
    using (var authResponse = (System.Net.HttpWebResponse)authRequest.GetResponse())
    {
        authCookies = authResponse.Headers["Set-Cookie"];
 
        // Buscar el token BPMCSRF en las cookies
        var cookies = authResponse.Headers.GetValues("Set-Cookie");
        if (cookies != null)
        {
            foreach (var cookie in cookies)
            {
                if (cookie.Contains("BPMCSRF"))
                {
                    bpmcsrf = cookie.Split('=')[1].Split(';')[0];
                }
            }
        }
 
        if (string.IsNullOrEmpty(authCookies) || string.IsNullOrEmpty(bpmcsrf))
        {
            throw new Exception("Autenticación fallida: no se obtuvieron cookies o token BPMCSRF.");
        }
    }
 
    // Solicitud autenticada a la API
    var apiRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(apiUrl);
    apiRequest.Method = "GET";
    apiRequest.ContentType = "application/json";
    apiRequest.Headers["ForceUseSession"] = "true";
    apiRequest.Headers["Cookie"] = authCookies;
    apiRequest.Headers["BPMCSRF"] = bpmcsrf;
 
    // Obtener respuesta de la API
    string apiResponseContent;
    using (var apiResponse = (System.Net.HttpWebResponse)apiRequest.GetResponse())
    {
        using (var streamReader = new System.IO.StreamReader(apiResponse.GetResponseStream()))
        {
            apiResponseContent = streamReader.ReadToEnd();
        }
    }
 
    // Parsear los datos de la API
    var jsonRecords = Newtonsoft.Json.JsonConvert.DeserializeObject<System.Collections.Generic.List<System.Collections.Generic.Dictionary<string, object>>>(apiResponseContent);
    // Procesar los registros (como en tu código original)
    var cantidadInsertados = 0;
 
    foreach (var record in jsonRecords)
    {
        var tipo = record.ContainsKey("Tipo") ? record["Tipo"]?.ToString() : null;
        var letter = record.ContainsKey("Letter") ? record["Letter"]?.ToString() : null;
        var cardCode = record.ContainsKey("CardCode") ? record["CardCode"]?.ToString() : null;
        var nroComprobante = record.ContainsKey("Nro Comprobante") ? record["Nro Comprobante"]?.ToString() : null;
        var nroOv = record.ContainsKey("Nro OV") ? record["Nro OV"]?.ToString() : null;
        var pymentGroup = record.ContainsKey("PymntGroup") ? record["PymntGroup"]?.ToString() : null;
        var docDate = record.ContainsKey("DocDate") ? record["DocDate"]?.ToString() : null;
        var vencimiento = record.ContainsKey("Vencimiento") ? record["Vencimiento"]?.ToString() : null;
        var docCur = record.ContainsKey("DocCur") ? record["DocCur"]?.ToString() : null;
        var docRate = record.ContainsKey("DocRate") ? record["DocRate"] : null;
        var debe = record.ContainsKey("Debe") ? record["Debe"] : null;
        var haber = record.ContainsKey("Haber") ? record["Haber"] : null;
        var debeUsd = record.ContainsKey("Debe USD") ? record["Debe USD"] : null;
        var haberUsd = record.ContainsKey("Haber USD") ? record["Haber USD"] : null;
 
        // Verificar si el registro ya existe
        var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "AgbCuentaCteSocioNegocios");
        var idColumn = esq.AddColumn("Id");
        esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal, "AgbCuemtaCteNumeroComprobante", nroComprobante));
        var entityCollection = esq.GetEntityCollection(UserConnection);
 
        // Consultar la cuenta relacionada
        var esq2 = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Account");
        var accountIdColumn = esq2.AddColumn("Id");
        esq2.Filters.Add(esq2.CreateFilterWithParameters(FilterComparisonType.Equal, "AgbCodigoSocioDeNegocios", cardCode));
        var accountCollection = esq2.GetEntityCollection(UserConnection);
 
        Guid? accountId = accountCollection.Count == 1 ? accountCollection[0].GetTypedColumnValue<Guid>(accountIdColumn.Name) : (Guid?)null;
 
        // Insertar el registro si no existe
        if (entityCollection.Count == 0 && !string.IsNullOrEmpty(nroComprobante))
        {
            var newEntity = UserConnection.EntitySchemaManager.GetInstanceByName("AgbCuentaCteSocioNegocios").CreateEntity(UserConnection);
 
            newEntity.SetDefColumnValues();
 
            newEntity.SetColumnValue("AgbCuemtaCteNumeroComprobante", nroComprobante);
            newEntity.SetColumnValue("AgbCuentaCteCodigoSn", cardCode);
            newEntity.SetColumnValue("AgbCuentaCteCondicionPago", pymentGroup);
            newEntity.SetColumnValue("AgbCuentaCteCuentas", accountId);
            newEntity.SetColumnValue("AgbCuentaCteDebe", debe);
            newEntity.SetColumnValue("AgbCuentaCteDebeUsd", debeUsd);
            newEntity.SetColumnValue("AgbCuentaCteFechaDocumento", docDate);
            newEntity.SetColumnValue("AgbCuentaCteFechaVencimiento", vencimiento);
            newEntity.SetColumnValue("AgbCuentaCteHaber", haber);
            newEntity.SetColumnValue("AgbCuentaCteHaberUsd", haberUsd);
            newEntity.SetColumnValue("AgbCuentaCteLetra", letter);
            newEntity.SetColumnValue("AgbCuentaCteMoneda", docCur);
            newEntity.SetColumnValue("AgbCuentaCteNumeroOv", nroOv);
            newEntity.SetColumnValue("AgbCuentaCteTipoCambio", docRate);
            newEntity.SetColumnValue("AgbCuentaCteTipoDocumento", tipo);
 
            newEntity.Save();
 
            // Incrementar el contador de registros insertados
            cantidadInsertados++;
        }
    }
 
    // Establecer el valor de registros insertados en la variable del proceso
    Set<int>("CantidadInsertados", cantidadInsertados);
 
    return true;

 

But when I run the bpm I get this error

Error:

System.Net.WebException: The remote server returned an error: (401) Unauthorized.
   at System.Net.HttpWebRequest.GetResponse()
   at Terrasoft.Core.Process.AgbProcess_93e521fAngelBaraldo1MethodsWrapper.ScriptTask1Execute(ProcessExecutingContext context)
   at Terrasoft.Core.Process.ProcessScriptTask.InternalExecute(ProcessExecutingContext context)
   at Terrasoft.Core.Process.ProcessFlowElement.CallInternalExecute(ProcessExecutingContext context)
   at Terrasoft.Core.Process.ProcessFlowElement.ExecuteItem(ProcessExecutingContext context)
   at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

 

Like 1

Like

2 comments

Are you trying to send requests from Creatio to the same Creatio environment? 

If that's so, it's really strange implementation. I think it's much better to call the service logic directly rather then  send an HTTP request to the endpoint and parse the response json. 

the mock code would look like this 

var service = new CustomStockServiceHelper(userConnection); 
var response = service.GetNoConciliadosData();

I assumed that you use a CustomStockServiceHelper in CustomStockService to retrieve the data. 

 

DM me if you need more help. 

Best regards, 
Yurii

 

Yuri Sokil,

Yuri thanks for you response.

Show all comments

Hi Team,

 

We have a requirement for filtering the mobile application records in the freedom UI but we doesn't have the filter icon to filter the records. 
Please help us to solve the issues.

 

Note: We are using the updated mobile application version



Like 0

Like

2 comments

Hi Team,

Please help us solve the requirement.
 

Thanks,

Prem

 

Hello,
 

Unfortunately, fast filtering options on mobile devices are currently only available in Classic UI. We realize the importance of this feature and are actively working on implementing it in Freedom UI in future application releases.


Best regards,
Malika

Show all comments

Hi

I am trying to follow the example of building a custom components using remote module from this page: 

https://academy.creatio.com/docs/8.x/dev/development-on-creatio-platform/front-end-development/freedom-ui/remote-module/implement-a-remote-module/overview

But when I reach the part of building the project on VS code using "npm run build" I always get the following error:

 

Generating browser application bundles (phase: setup)...C:\Users\Lenovo\Downloads\example4\node_modules\webpack\lib\container\ModuleFederationPlugin.js:58
                       throw new TypeError(
                             ^
TypeError: The 'compilation' argument must be an instance of Compilation
   at ModuleFederationPlugin.getCompilationHooks (C:\Users\Lenovo\Downloads\example4\node_modules\webpack\lib\container\ModuleFederationPlugin.js:58:10)
   at C:\Users\Lenovo\Downloads\example4\node_modules\webpack\lib\container\HoistContainerReferencesPlugin.js:36:33
   at Hook.eval [as call] (eval at create (C:\Users\Lenovo\Downloads\example4\node_modules\tapable\lib\HookCodeFactory.js:19:10), <anonymous>:88:1)
   at Hook.CALL_DELEGATE [as _call] (C:\Users\Lenovo\Downloads\example4\node_modules\tapable\lib\Hook.js:14:14)
   at Compiler.newCompilation (C:\Users\Lenovo\Downloads\example4\node_modules\@angular-devkit\build-angular\node_modules\webpack\lib\Compiler.js:1121:30)
   at C:\Users\Lenovo\Downloads\example4\node_modules\@angular-devkit\build-angular\node_modules\webpack\lib\Compiler.js:1166:29
   at eval (eval at create (C:\Users\Lenovo\Downloads\example4\node_modules\tapable\lib\HookCodeFactory.js:33:10), <anonymous>:31:1)

   

Any help for this?

Like 0

Like

1 comments

Hello,
I do not believe this issue has something to do with the article you provided or the Creatio system. Try to look for this error in other sources for example here.

Show all comments

If we want to add few more colors to the Dashboards, Is it possible? 

Like 0

Like

1 comments

Hello,
 

Unfortunately, at the moment it is impossible to customize colors in Dashboards.
 

However, we understand that this is not ideal for your specific needs.
 

We want to assure you that we have created a request for our development team to implement this functionality in future versions of our application. We understand the importance of providing our clients with the best possible experience and will work hard to implement the changes you have suggested.
 

Thank you again for bringing this to our attention, and please do not hesitate to reach out if you have any further questions or concerns.

Show all comments

Hey Everyone,


I am trying to change the order of the address in full address field in Accounts section of Customer360 creatio. Instead of Zip + Country + State + City + Address I want it as Address + City + State + ZipCode + Country.

 

I tried overriding the BaseAddressEventListener with my custom event listener but it didn't worked

 

Can someone please guide me on how to do it?

Like 1

Like

2 comments

Hello Ansh,
 

I have contacted our R&D team regarding this question. First of all, this logic is implemented on the backend side, which means that even if it is possible, it would likely be extremely challenging to achieve.
 

To conclude, I believe it is not feasible at the moment. However, I will register this as a potential improvement, and hopefully, this feature will be implemented in the future.
 

Best regards

Yevhenii Grytsiuk,

Thank you
The issue is fixed now, As I added a CustomAddressEventListener to override the BaseAddressEventListener in the source code of my custom package.

Show all comments

I am currently customizing the Account module in the Freedom UI and encountering an issue with the PDS_UsrBillToNumber_volqoyn field. This field is an integer field bound to PDS.UsrBillToNumber in the model configuration.

My goal is to remove the comma separator from this field, but the solutions I have tried so far have not worked. These include:

  1. Using useThousandSeparators: false in controlConfig.
  2. Setting useGrouping: false in the numberFormat object within controlConfig.
  3. Modifying configurations in the format object for field values.
  4. Implementing custom methods for formatting.

Unfortunately, none of these approaches have yielded the desired result. Could you kindly guide me on the correct implementation or suggest an alternative solution?

Like 2

Like

0 comments
Show all comments

Hi,

 

I am trying to create a business rule that 'hides elements' based upon the 'current user account' as below. I interpreted this variable as the account that the current user's 'Contact' is assigned to. Is this correct? I can't seem to get it to work as intended.

 

 

I have added myself as a contact to an account as below.

 

Is there any way to set up a business rule to show/hide or set read/write permissions based upon whether the current user is assigned to an account?

 

Thanks in advance,

Brendon

 

Like 3

Like

3 comments

Bump.

Greetings!
 

If you want to hide the element for certain users and display it for others based on selected data, you need to hide the element by default first. Then, configure it to allow visibility under specific conditions.


If the element is displayed by default and you try to configure it to show for specific roles, it will not work as expected because the element is already visible to everyone by default. In such cases, you should configure it for hiding instead.


Additionally, please note that business rules should not conflict with each other. If they do, the business rules will not function correctly.


More information can be found in our documentation: 

https://academy.creatio.com/docs/8.x/no-code-customization/8.1/customization-tools/ui-and-business-logic-customization/freedom-ui-business-rules

Best Regards, 
Orkhan

Thanks Orkhan. Super helpful, much appreciated!

Show all comments

{
 "operation": "insert",
 "name": "ComboBox_asw7mde",
 "values": {
   "layoutConfig": {
     "column": 1,
     "row": 2,
     "colSpan": 1,
     "rowSpan": 1
   },
   "type": "crt.MultiSelectComboBox", or crt.ComboBox
   "label": "$Resources.Strings.PDS_GenContactRoles_vm2smp6", 
   "labelPosition": "auto",
   "control": "$PDS_GenContactRoles_vm2smp6",  
   "listActions": [],
   "showValueAsLink": true,
   "controlActions": [],
   "visible": true,
   "readonly": false,
   "placeholder": "Виберіть ролі", 
   "tooltip": "Вибір ролей контакту"
 },
 "parentName": "GridContainer_035sekm",
 "propertyName": "items",
 "index": 2
}

 

and my filter is: handlers: /**SCHEMA_HANDLERS*/[
 {
   "request": "usr.OpenLookupRequest",
   "handler": async (request, next) => {
     devkit.HandlerChainService.instance.process({
       type: "crt.OpenLookupPageRequest", // Відкриваємо сторінку пошуку
       scopes: [...request.scopes],
       $context: request.$context,
       entitySchemaName: "Contact", // Вибір контактів
       schemaName: 'DefaultLookupPage', // Загальнодоступна сторінка для вибору контактів
       itemAttributeName: 'ComboBox_asw7mde', // Вказуємо атрибут ComboBox для запису вибраних значень
       afterClosed: (result) => {
         if (result && result.selectedRows) {
           // Отримуємо всі вибрані значення
           const selectedValues = result.selectedRows.map(row => row.displayValue); // Вибираємо displayValue кожного елемента
           alert(`Вибрані значення: ${selectedValues.join(', ')}`); // Виводимо всі вибрані значення
         }
       },
       filtersConfig: {
         filterAttributes: [
           {
             name: 'MyFilter',
             loadOnChange: false
           }
         ],
         attributesConfig: {
           MyFilter: {
             value: {
               "items": {
                 "29e16d42-36f1-4e04-9029-4321cbb2494d": {
                   "filterType": 1,
                   "comparisonType": 11,
                   "isEnabled": true,
                   "trimDateTimeParameterToDate": false,
                   "leftExpression": {
                     "expressionType": 0,
                     "columnPath": "Name"
                   },
                   "isAggregative": false,
                   "dataValueType": 1,
                   "rightExpression": {
                     "expressionType": 2,
                     "parameter": {
                       "dataValueType": 1,
                       "value": "Super"
                     }
                   }
                 }
               },
               "logicalOperation": 0,
               "isEnabled": true,
               "filterType": 6,
               "rootSchemaName": "Contact"
             }
           }
         }
       }
     });
     return next?.handle(request);
   }
 }
]/**SCHEMA_HANDLERS*/,
 

Like 0

Like

1 comments

Hello,
I do not quite understand what you are trying to achieve, if you want to implement a multi-select, then this option will be fully available in version 8.2.1.

Show all comments