Hi community!

I want to move object from custom package to another package, let's call it X package. The problem is that when I set X package as default package my process do not see one field I want to use from that object. The object is added to both packages X and custom. The field I need is added to the object in custom package. I tried to move the object from custom to X package, but got error that X package already has that object. Any suggestions?

Like 0

Like

2 comments

Hey, there are two possible solutions that I can think of off the top of my head:

 

1. Create the field manually using code in the desired package and later delete the schemas from the Custom package. (This is less recommended).

 

2. Create a 3rd package, let's call it Y package, navigate to the dependencies of the X package and add a dependency to the Y package, move the files from the Custom package to Y package.

 

This should solve the issue for you as the field will be available in the Y package, and because X depends on it, it'll also be available there and thus it should work.

 

I hope this helps!

Edo Sagron,

thanks, will try!

Show all comments

Hi Community,

 

Do you have any example how to use asyncValidate during save and EntitySchemaQuery in freedom UI form page. I couldn't find more topics when it comes to client side coding in freedom UI.

 

 

Like 1

Like

6 comments

Hello Fulgen,

 

For creating the field validator - you need to use validators as described in the Academy article here. As for the ESQ in the Freedom UI page - unfrotunately we currently don't have any documentation on it, but we've created a task for our core R&D team to write the specification for ESQ usage in the Freedom UI page.

Hello Oleg,



Whether the document for the specification for ESQ usage in the Freedom UI page is prepared or when we can expect the documentation on the same.

Sivaranjani,

 

After verifying all the necessary information regarding specification for ESQ usage, I want to inform you that this task has been created and accepted. The process of writing such documentation may take some time, so for the moment you need to wait a while.



Thank you for your patience and understanding in this matter.

 

Sorry to jump in. Any update on the documentation?

Jahnavi,

Unfortunately the documentation is not ready yet. However, I have added your inquiry to the registered idea as to increase its priority and speed up the process.

Mira Dmitruk,

 

Any update on doing async validation in Freedom UI using validators? We need to use them, but don't have any examples in the academy as far as I can tell.

Show all comments

Hi Community,

 

Currently we are using Studio Enterprise, we've added new section from existing "Activity" object. Activity section is created having List and Dashboard view by default. How we can add the Calendar view here?

 

 

Like 0

Like

1 comments

Hello,

 

You can find the example oh how to add a Calendar view to a section in this Community post.

Show all comments

Dear Community,

 

I retrieve the following from an API:

 

                        "AdresseerbaarObjectGeometrie Punt Coordinates": [

                            "0,00",

                            "0,00",

                            "0,00"

                        ],

 

This is a fixed array of 3 objects with X, Y, Z coordinates. I wish to use this array in my business process and simply use formula to set a variable to

 

x = coordinates[0]

y = coordinates[1]

 

However I am unable to use this notation or any other, I do not want to create a sub process to loop through these 3 objects.

 

 

Can you help me?

 

Like 0

Like

4 comments
Best reply

Hi Pascal,

Here's how I would do it. First, assuming the JSON looks something like this: 

{
    "_embedded": 
    {
        "adressen": [
            {
                "adresseerbaarObjectGeometrie": {
                    "punt": {
                        "coordinates": [
                            "0.00",
                            "0.01",
                            "0.02"
                        ]
                    }
                }
            }
        ]
    }
}

Second, when added to the web service, I've added 3 different body parameters inside of adressen. Be sure to make sure that the "is array" is not checked so you're treating each of these as text: 

  • adresseerbaarObjectGeometrie.punt.coordinates[0]
  • adresseerbaarObjectGeometrie.punt.coordinates[1]
  • adresseerbaarObjectGeometrie.punt.coordinates[2]

So at this point, it's as if there are three separate properties, instead of it being an array. You can now map each of these values as separate properties to the subprocess. 

Ryan

Hello Pascal,

Yes, you should be able to use the index of the elements in the array to access each. If you provide the full JSON response here I could help you with the expressions. Also, a useful tool to test the path expressions is https://jsonpath.com - you can paste in the JSON response and test getting the values you're after. 

Ryan

 

This is the full json path to X: $._embedded.adressen[:].adresseerbaarObjectGeometrie.punt.coordinates[0]

 

In Creatio I already seperated the object into adressen, so that will have to be a 'for loop' with a subprocess. So the eventual path would be: adresseerbaarObjectGeometrie.punt.coordinates[0] I believe.

Hi Pascal,

Here's how I would do it. First, assuming the JSON looks something like this: 

{
    "_embedded": 
    {
        "adressen": [
            {
                "adresseerbaarObjectGeometrie": {
                    "punt": {
                        "coordinates": [
                            "0.00",
                            "0.01",
                            "0.02"
                        ]
                    }
                }
            }
        ]
    }
}

Second, when added to the web service, I've added 3 different body parameters inside of adressen. Be sure to make sure that the "is array" is not checked so you're treating each of these as text: 

  • adresseerbaarObjectGeometrie.punt.coordinates[0]
  • adresseerbaarObjectGeometrie.punt.coordinates[1]
  • adresseerbaarObjectGeometrie.punt.coordinates[2]

So at this point, it's as if there are three separate properties, instead of it being an array. You can now map each of these values as separate properties to the subprocess. 

Ryan

You are amazing! Thanks! I did not think of using the response parameters to fill it in.

Show all comments

Hi community

on my local dev environment I've configured the exchange listeners, but when I run the diagnostic tools I receive the two following errors 

  1. SERVICE AVAILABILTY VERIFICATION: Creatio make a rest call to the uri "http://dexchlist:10000/api/listeners/exists" that returns the text exists, but creatio expect a json response
  2. CREATIO AVAILABILITY VERIFICATION: Creatio try to call the uri http://dexchlist:10000/api/availability/app" with data https://democreatio.xxx.com/aic806/0/ServiceModel/ExchangeListenerServi… and the end point return null

Can you help me ?

Like 1

Like

7 comments

hi Stefano Bassoli,



Have you configured the system setting path for the exchange listener URI?



BR,

Bhoobalan Palanivelu.

Bhoobalan Palanivelu,

Yes, I did

Stefano Bassoli,

an update, I updated the EmailListener to version 1.0.10 (bpmonline/emaillistener Tags | Docker Hub.)  and the second error is solved.

 

The first issue is related to a bug on the  method ExchangeListenerStatusResponse it uses the value ExchangeListenerActions.Exists, but the correct  value is ExchangeListenerActions.Status for the EmailListener 1.0.10

private ExchangeListenerStatusResponse GetExchangeListenerStatusRequestResult() {

            string serviceUri = ExchangeListenerActions.GetActionUrl(UserConnection, ExchangeListenerActions.Exists);

            WebRequest request = _requestFactory.Create(serviceUri);

            request.ContentType = "application/json; charset=utf-8";

            request.Timeout = 5 * 60 * 1000;

            WebResponse webResponse = request.GetResponse();

            using (Stream dataStream = webResponse.GetResponseStream()) {

                StreamReader reader = new StreamReader(dataStream);

                return Json.Deserialize<ExchangeListenerStatusResponse>(reader.ReadToEnd());

            }

        }

 

 

Stefano,

 

it seems like the service is not available for your site.

As for now, it is quite difficult to find the root cause as there might be a lot of different reasons for this.

We recommend checking the availability of the service from the server where you are using Creatio and backwards as well. You are frre to use some simple commend such as ping or curl.

 

Here are some examples:

 

http://microservice_address/api/listeners/status - just put it in the browser as link;

 

ping [listener_address]

telnet [listener_address] [port] (Windows)

 

Then, you should enter the container where Listener is set and run the following commands:



curl smtps://smtp.site.com:465 -v --user "login:pass" --login-options AUTH=PLAIN

 

Also, you can try running these commands:



curl --insecure --trace-ascii --ntlm -u [mailbox login] [mailserver_address]/ews/exchange.asmx -v



"curl [mailserver_name]"- here you can put either the mail server or the application server.



Additionally, you need to check the application server availability from the listener side:



curl http://creatio_site/0/ServiceModel/ExchangeListenerService.svc/ProcessFullEmail

curl creatio_site/ServiceModel/ExchangeListenerService.svc/

 

Regards,

Gleb.

Gleb,

the listener works perfectly.

The ExchangeListenerStatusResponse.GetExchangeListenerStatusRequestResult() function calls the end-point http://microservice_address/api/listeners/exists, not http://microservice_address/api/listeners/status.

 

Stefano Bassoli,



Thanks for sharing the details!

Hi team, with the newest version of the exhange listener 1.0.11 the calendar is not synching, email synchronization works perfectly, calendar does not synch correctly and produces the following error log:

 

2023-02-27 12:08:42,439 [144] ERROR NT AUTHORITY\SYSTEM LogError - [mmp9T6J1TEi6FTi60xYm5Q.import] [ExchangeCalendarClient] Invoke service action is failed for [Calendar settings =&gt; "a2b11d40-2201-4304-a3d8-9be0994d6678" "owa.errevi.com" "Login"].
Microsoft.Exchange.WebServices.Data.ServiceRequestException: The request failed. Connessione sottostante chiusa: Una connessione che doveva restare attiva è stata chiusa dal server in modo imprevisto.. ---&gt; System.Net.WebException: Connessione sottostante chiusa: Una connessione che doveva restare attiva è stata chiusa dal server in modo imprevisto..
   in System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
   in System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
--- Fine traccia dello stack da posizione precedente dove è stata generata l'eccezione ---
   in System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   in System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   in System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   in Microsoft.Exchange.WebServices.Data.EwsHttpWebRequest.&lt;Microsoft-Exchange-WebServices-Data-IEwsHttpWebRequest-GetResponse&gt;d__4.MoveNext()
--- Fine traccia dello stack da posizione precedente dove è stata generata l'eccezione ---
   in System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   in System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   in System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
   in Microsoft.Exchange.WebServices.Data.ServiceRequestBase.&lt;GetEwsHttpWebResponse&gt;d__45.MoveNext()
   --- Fine della traccia dello stack dell'eccezione interna ---
   in Microsoft.Exchange.WebServices.Data.ServiceRequestBase.&lt;GetEwsHttpWebResponse&gt;d__45.MoveNext()
--- Fine traccia dello stack da posizione precedente dove è stata generata l'eccezione ---
   in System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   in System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   in System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
   in Microsoft.Exchange.WebServices.Data.ServiceRequestBase.&lt;ValidateAndEmitRequest&gt;d__43.MoveNext()
--- Fine traccia dello stack da posizione precedente dove è stata generata l'eccezione ---
   in System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   in System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   in System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
   in Microsoft.Exchange.WebServices.Data.SimpleServiceRequestBase.&lt;InternalExecuteAsync&gt;d__1.MoveNext()
--- Fine traccia dello stack da posizione precedente dove è stata generata l'eccezione ---
   in System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   in System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   in System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
   in Microsoft.Exchange.WebServices.Data.MultiResponseServiceRequest`1.&lt;ExecuteAsync&gt;d__6.MoveNext()
--- Fine traccia dello stack da posizione precedente dove è stata generata l'eccezione ---
   in System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   in System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   in System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   in Microsoft.Exchange.WebServices.Data.ExchangeService.&lt;BindToFolder&gt;d__27.MoveNext()
--- Fine traccia dello stack da posizione precedente dove è stata generata l'eccezione ---
   in System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   in System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   in System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   in Microsoft.Exchange.WebServices.Data.ExchangeService.&lt;BindToFolder&gt;d__28`1.MoveNext()

 

Show all comments

Hi Community,

 

In Studio Enterprise, is there any ready made template for "Activities" module, just like for "Account and Contacts" there is "Customer 360"?

 

 

 

Like 0

Like

4 comments

Hello,

 

Please refer to this Academy article to know more about all the current possibilities of switching between Freedom UI and old designer.

Hi,



Thank you for your response, but I am not asking about freedom UI. In Studio Enterprise, there is "CUSTOMER 360" template which will give you ready made modules for "Account" and "Contact". How about for "Activities" module, is there any ready made template?

I believe rest of core will be updated in 8.1. Customer 360 is a 1st app to demonstrate future capabilities of the rest of the core update to freedom ui. Not sure if this will translate in templates.

Hello,

 

Please note that the Activities and other similar modules will become available in future releases, but there is no such template yet.

Show all comments

Hi all,

 

There is a requirement in which I have to make printable visible on the basis of selected lookup. I followed this article https://customerfx.com/article/showing-or-hiding-printables-based-on-a-value-for-the-selected-record-in-creatio/

 

It is working fine on the edit page and only showing printable which is matching with the condition, but the same is not reflecting on the section and showing the complete list of printable.

Method which I have added on section and edit page is : 

methods: {

initQueryColumns: function(esq) {

    this.callParent(arguments);

 

    if (!esq.columns.contains("UsrDocumentRepositorySubtype")) {

        esq.addColumn("UsrDocumentRepositorySubtype");

    }

},

initCardPrintForms: function() {

    this.callParent(arguments);

 

    var printMenuItems = this.get(this.moduleCardPrintFormsCollectionName);

    if (Ext.isEmpty(printMenuItems)) return;

 

    printMenuItems.each(function(item) {

        item.set("Visible", {bindTo: "getPrintMenuItemVisible"});

    }, this);

},

getPrintMenuItemVisible: function(reportId) {

    if (Ext.isEmpty(this.get("ActiveRow"))) return true;

 

    var type = this.get("GridData").get(this.get("ActiveRow")).get("UsrDocumentRepositorySubtype") || { displayName: "" },

        printMenuItems = this.get(this.moduleCardPrintFormsCollectionName),

        item = printMenuItems.find(reportId);

 

    if (Ext.isEmpty(item)) return;

 

    switch (item.get("Caption")) {

         case "Mining and Quarrying Questionnaire":

            return type.displayValue === "Mining and Quarrying Questionnaire";

case "Alcohol Questionnaire":

            return type.displayValue === "Alcohol Questionnaire";

        default:

            return true;

    }

}

}

 

Output (Edit Page)

 

Output (Section)

 

Is there something which I am missing or any other workaround ?

 

Like 0

Like

5 comments

Hello,

 

In the section you need to use the approach like below:

			rowSelected: function(primaryColumnValue) {
				this.callParent(arguments);
				var row = this.getGridData().get(primaryColumnValue);
				var reportCollection = this.get(this.moduleSectionPrintFormsCollectionName);
				var usrDocumentRepositorySubType = row.get("UsrDocumentRepositorySubtype");
				var isUsrDocumentRepositorySubTypeEmpty = Ext.isEmpty(usrDocumentRepositorySubType);
				Terrasoft.each(reportCollection, function(report) {
					if (!isUsrDocumentRepositorySubTypeEmpty &amp;&amp; usrDocumentRepositorySubType.displayValue == "Mining and Quarrying Questionnaire" &amp;&amp; report.get("Caption") == "Mining and Quarrying Questionnaire") {
						report.set("Visible", true);
					}
					else {
						report.set("Visible", false);
					}
				}, this);
			}

This is an example for only "Mining and Quarrying Questionnaire", additional check should be also applied for the "Alcohol Questionnaire". Using this approach after refreshing the page correct reports started to show on the section list.

Hi Oleg,

 

Thank you for the response. Now it is working fine for the section and while creating record.

But, when I open any saved record, it is showing complete list of printable.

 

Method which I have added on Edit Page Schema is :

 

initCardPrintForms: function() {

    this.callParent(arguments);

               

    var printMenuItems = this.get(this.moduleCardPrintFormsCollectionName);

    if (Ext.isEmpty(printMenuItems)) return;

 

    printMenuItems.each(function(item) {

        item.set("Visible", {bindTo: "getPrintMenuItemVisible"});

    }, this);

},



getPrintMenuItemVisible: function(reportId) {

    var type = this.get("UsrDocumentRepositorySubtype") || { displayValue: "" },

        printMenuItems = this.get(this.moduleCardPrintFormsCollectionName),

        item = printMenuItems.find(reportId);

               

    if (Ext.isEmpty(item)) return;

                 

    switch (item.get("Caption")) {

        case "Mining and Quarrying Questionnaire":

            return type.displayValue === "Mining and Quarrying Questionnaire";

       case "Gliding Questionnaire":

            return type.displayValue === "Gliding Questionnaire";

        

        default:

            return true;

    }

 

Please help.

Prashant Jha,

Hi Prashant

 

Did you ever resolve this issue as I have the same problem

 

regards

Rob Watson,

Hi Rob, 

Did you find any solution to resolve this. Even I face the same issue

Thanks in advance

Hello all,

 

The example from my previous post should be modified to make it work when opening the page from the section. This time I performed the test using ContractSectionV2 with 2 reports: Contract approval and Contract draft:

The logic will be: if status of a contract is "Approval" - show only "Contract approval" report, if status is "Draft" - show only "Contract draft" report, otherwise show nothing (but for the record that is being created - show everything).

 

This can be achieved using this method added to the ContractSectionV2 schema:

rowSelected: function(primaryColumnValue) {
				this.callParent(arguments);
				var row = this.getGridData().get(primaryColumnValue);
				var getSelectedRowState = row.get("State");
				var selectedRowState = getSelectedRowState.displayValue;
				var selectedRowStateForCheck = selectedRowState?.toLowerCase();
				var reportCollection = this.get(this.moduleSectionPrintFormsCollectionName);
				var cardReportCollection = this.get(this.moduleCardPrintFormsCollectionName);
				var isStateEmpty = Ext.isEmpty(getSelectedRowState);
				Terrasoft.each(reportCollection, function(report) {
					if (!isStateEmpty &amp;&amp; selectedRowStateForCheck &amp;&amp; report.get("Caption").includes(selectedRowStateForCheck)) {
						report.set("Visible", true);
					}
					else {
						report.set("Visible", false);
					}
				}, this);
				Terrasoft.each(cardReportCollection, function(report) {
					if (!isStateEmpty &amp;&amp; selectedRowStateForCheck &amp;&amp; report.get("Caption").includes(selectedRowStateForCheck)) {
						report.set("Visible", true);
					}
					else {
						report.set("Visible", false);
					}
				}, this);
			}

The "State" column should be displayed in the section list and this is the code for the "Status" column of the contract. As a result:

 

1) Filtration in the section:

2) Filtration on the page opened from the section (for filtration on the page when refreshing the opened Contract page you need to do everything that is specified by Ryan here (part about ContactPageV2) (it happens because of the combined mode)):

3) For records in other statuses nothing will be shown in the list of the "Print" button (both in the section and on the page).

 

All you need to do is study this code and change the column to the one you will use on your page and don't forget to display this column in the section list.

Show all comments

Im running Creatio studio with postgresql on Windows Server 2019 using wsl + ubuntu for the redis server

 

Exception Details: System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.

Source Error: An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

 

 

Like 3

Like

8 comments
Best reply

Selva,

Hi, Yes I managed to fix it in the end by reinstalling Microsoft Visual C++ 2010.

 

https://www.microsoft.com/en-us/download/details.aspx?id=26999

Good day,

 

It seems that this issue could be solved faster if you contact Creatio support.

Please send them an email at support@creatio.com

 

Thank you.

This isnt something they cover

Oliver Crowe,

 

Can you post the complete screenshot of the error?

Also, make sure to install all the required .NET components .



BR,

Bhoobalan Palanivelu.

 

If anyone can help id appreciate it, ive tried using Windows Server 2022 instead and ran into the error again.

Oliver Crowe,

I am getting the same error.  Did you get this fixed ?

 

Thanks,

Selva

Selva,

Hi, Yes I managed to fix it in the end by reinstalling Microsoft Visual C++ 2010.

 

https://www.microsoft.com/en-us/download/details.aspx?id=26999

Thank you Oliver!

For Creatio version 8.0.10 and later please use Microsoft Visual C++ 2013 component:

https://www.microsoft.com/en-US/download/details.aspx?id=40784

Hi, I have the same error and try to install MS visual studio C++ 2013 but the same error exist , what should I do 



thanks 

Show all comments

I created a business process that starts when an attachment is added to a section (start singnal configured on "record added" to the section attachments).

The business process starts before the end of the file upload then it's not able to read all file content in a script task.

Is there a way to start my business process after the upload has completed?

 

Like 0

Like

2 comments

Hi,

 

You can add a script component in you process and use a Sleep Method (1000 is one second)

System.Threading.Thread.Sleep(1000);

 

Jerome BERGES,

I tried uploading a file of 50MB and it takes 40 seconds to be uploaded:  1 second wouldn't be enough.

The time to wait depends on the speed of the connection and on the file size.

In my test I saw that the file size property increases while the upload proceed, then I used a workaround in my business process: before reading the file a make a loop with a wait of 2 seconds if the current file size is bigger than the one read in the preceding loop. The BP proceed to the file read procedure if the file size doesn't change in 2 seconds. It seems to work but it's really a workaround: is there something more currect and secure to wait for the file to be fully uploaded?

Thanks

Show all comments

I am trying to import large amount of data, around 7 million lines. I noticed that using an excel this is almost impossible. What are the alternatives?

 

Comparing this to inserting it in an SQL, I usually bulk insert batches of 5000-8000 and it will be done in 5 minutes. 

Like 0

Like

0 comments
Show all comments