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

11 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 

Kareem,

any updates?

Dmitriy Gamora,

 

I'm encountering the same issue with version 8.2.0 deployed on Windows Server 2022. I have already installed and re-installed Microsoft Visual C++ 2010 and 2013, but the issue persists.

 

Is there any solution or additional troubleshooting steps you could suggest?

Resolved:
The issue was fixed after installing the latest version of the Microsoft Visual C++ Redistributable.

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

In "old style" Creatio is possible to create different section pages depending on a lookup field, just like Activities out-of-the-box section (one page for Task, one for Email, one for Call).

In Freedom UI pages I cannot find the way to do the same thing: how can I setup different Freedom UI pages depending on the value of a lookup field of the record?

Thanks

 

Like 3

Like

6 comments

Dear, 



Unfortunately, this feature is really not available in the current release version of the app.

However, our development team is already aware of this need, so this feature may appear in future versions of the app.

Pavlo Sokil,

Hello Pavio ,

Is this feature ready yet ?

developer,

Hello,

 

Unfortunately, this functionality is not yet available. Due to complexity of the task our R&D team need time for testing and further implementation. 



Best regards,

Anastasiia

Anastasiia Zhuravel,

Hello ,

Is there any alternatives please ?

Thanks.

developer,

 

There is no available workaround for now.

Hello,

 

https://academy.creatio.com/docs/8.x/resources/release-notes/81-quantum-release-notes#:~:text=Multiple%20form%20pages%20for%20a%20single%20object.

8.1 Quantum release notes

Multiple form pages for a single object. It is now possible to create multiple form pages for a single object in the Object Designer as well as in the settings of both List and Button components. The app determines the page to open based on a field value. For example, this lets you have completely different pages for different request types.

Show all comments

Dear Community,

 

I wish to create somewhat of a wizard to add a new order in our CRM. Similar to how you would order something online. Step 1 would be to check the adress for service availability, step 2 choose products, step 3 choose subscription type and discounts, step 4 personal info, contact info and payment info.

 

I am playing around with preconfigured pages but these are limited, for example if you wish to calculate prices. You cannot trigger a business flow as far as I know to change a price field based on the amount of products fields.

 

Is there any way to do something like this?

 

Greetings

 

Pascal

Like 0

Like

1 comments

Hello,

 

You can create it by means of preconfigured business processes and creating a new method with the same logic as in the refreshAmount method from BaseOrderPage

 

Best regards,

Yuliya Gritsenko

Show all comments