Dear,

Is it possible to have two dashboard-type sections ?

Thank you !

Nicolas

Like 0

Like

4 comments

Dear Nicolas, 



Unfortunately, there are no OOB tools to create a new section like this. 

It can be done only be means of advanced development and we do not have any examples of such sections created. 



We will register an idea for our R&D team to consider the possibility of adding the functionality which would allow to create sections like this with system tools in future. 



Kind regards, 

Roman

 

Do you have too many tabs? ;)

Julius,

yes that'it !

women's dashboard management

we have two companies and we would like to split the data. one solution might be to use the Creatio homepage which also allows now to create statistics widgets

 

Hi Roman Brown, Any update on creating two dashboards?

 

Show all comments

Hi Community,

 

I've this situation where I need to add a image to a specific section row column, based on the value of other column. Inside my ActivitySectionV2, I added a random dummy column to display the images. These images should appear if the Activity is expired or not. For example, if my activity due date is less than today's date the "Expired Image" should be visible.

 

How can I solve this situation?

 

Thanks in Advance.

 

Best Regards,

Pedro Pinheiro

Like 1

Like

1 comments

Hello Pedro,

 

Here is an article on the Academy that describes creating a field with an image.

I would suggest you create two fields and hide one or the other based on the due date using business rules.

 

Hope this helps!

 

Best regards,

Max.

Show all comments

hi all 

first of all i have 2 sections (Returns - Events) , and i have customized contacts section and by adding detail in it with these specs

"

- Add a new “Returns” tab.

- Add the following elements on the “Returns” tab

- The “Return requests” detail with the list of requests initiated by the current contact.

 - The “Total ticket return amount” metric

"

 

after that  i need to do this next detail 

 - Create a new “Tickets” detail without creating a new section. (done)

- The detail must contain the following fields:

 “Owner” (a contact). (done)

 “Ticket cost”.  (done)

 “Event”. (done)

“Return type”. (done)

 

 - The detail must be displayed on the page of return request and the user must be able to specify tickets from the current request on the detail.

- Set up the detail object: 

-The detail must inherit permissions from the return request.

- The records on the detail must be deleted automatically if the request is deleted

 

the last 4 points i don't know how i do them ? 

Help 

 

thanks

 

Like 1

Like

2 comments
Best reply

Ibrahim, 

If i understood you correctly: 



1. The detail must be displayed on the page of return request and the user must be able to specify tickets from the current request on the detail. 



Add Lookup field "Returns" (in my case it's going to be "Account") to the object of your detail. In [Data Source -> Lookup] select "Returns"



Then, when you're adding the detail to the page please set following settings: 



2.- Set up the detail object: 

-The detail must inherit permissions from the return request. 




After you've added lookup column "Returns", scroll down to "Access Rights" and select "Returns" in the field( see screenshot, in my case the column looks  up Account section, so it's " account")



3.
 - The records on the detail must be deleted automatically if the request is deleted



Select your lookup column (in my case it's Account) and select "Delete objects from current object with this value. 

That way, when the return is deleted, all the tickets associated to that return will also be deleted 





Best Regards,

Yurii. 

Ibrahim, 

If i understood you correctly: 



1. The detail must be displayed on the page of return request and the user must be able to specify tickets from the current request on the detail. 



Add Lookup field "Returns" (in my case it's going to be "Account") to the object of your detail. In [Data Source -> Lookup] select "Returns"



Then, when you're adding the detail to the page please set following settings: 



2.- Set up the detail object: 

-The detail must inherit permissions from the return request. 




After you've added lookup column "Returns", scroll down to "Access Rights" and select "Returns" in the field( see screenshot, in my case the column looks  up Account section, so it's " account")



3.
 - The records on the detail must be deleted automatically if the request is deleted



Select your lookup column (in my case it's Account) and select "Delete objects from current object with this value. 

That way, when the return is deleted, all the tickets associated to that return will also be deleted 





Best Regards,

Yurii. 

Yurii Sokil,

thank you 

Show all comments

Hi Team,

 

I would like to write a custom function/operation on click of different section name from the workspace available in the left panel.

 

I debugged to find out the base module that gets triggered when a Section is clicked in the left panel as depicted in the below image.



Also, if I click on certain section a custom operation has to be implemented (Say., click on Certificate section name). 



 

Substitution Not allowed:

I tried to include the custom logic into the init() function as below,

init: function(callback, scope) {
    this.callParent(arguments);
    var editPages = this.viewModel.get("EditPages");
	editPages.each(function(editPage) {
	var pageSchemaName = editPage.get("SchemaName");
	if(pageSchemaName === "UsrCertificate1Page"){
        this.console.log("Certificate section is clicked");
        this.callMyCustomFunction(); // A custom operation call
    }
	}, this);		
},



When i tried to replace the SectionModuleV2 (Title: Section display module), it throws a warning as substitution is not allowed.



Kindly guide me to achieve this.

 

 

 

 

Regards,

Bhoobalan P.

Like 0

Like

2 comments

Hi Bhoobalan,

 

As for modules substitution - Ryan Farley created an article regarding extending and overriding modules in Creatio and you can find it here https://customerfx.com/article/overriding-modules-in-creatio-formerly-b….

 

As for the functionality required - it's better and easier to call this custom action in the init method of the section page itself. Please use it instead of the init method of the SectionModuleV2.

 

Best regards,

Oscar

Oscar Dylan,

Great, thanks!



Yes, it is reliable to use in the section page itself. 

Thanks again!

Show all comments

Hi Community,

I've this situation where I need to get the value from a section quick filter and use it on another filter. For example, I've two quick filters one for the Accounts and other for Contacts. I want to filter the Contact Filter values based on the Account I've selected.

In other words, if the Account is "Teste1", my Contact Filter should return all the Contacts that belong to the "Teste1" Account.

 

Any sugestion on how to achieve this?

 

Thanks in Advance.

 

Best Regards,

Pedro Pinheiro

Like 2

Like

1 comments

Hi Pedro,

 

The logic of the drop-down list forming in the quick filter is stored in the CustomFilterViewModelV2 model inside the getLookupValueColumnList function. Your question cannot be solved easily since there is a need to override the module method logic completely and it's not recommended to do. I will create a problem for our R&D team so they could develop the logic of filtering the drop-down result of one filter condition based on the value of another filter condition.

 

Thank you for the idea and helping us in making the application better!

 

Best regards,

Oscar

Show all comments

Dear community,

Using "useThousandSeparator": false we can remove comma in section edit page or detail edit page. How do we do it in Section list Page?

 

Thanks

Like 0

Like

4 comments

Hello Shivani,

 

You can change the column format in prepareResponseCollectionItem method.

Here is a sample:

define("SomeSection", [], function() {
    return {
        entitySchemaName: "SomeSectionSchema",
        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
        diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
        methods: {
            prepareResponseCollectionItem: function(item) {
                this.callParent(arguments);
               
                var someColumn = item && item.columns && item.columns.SomeColumn;
                if (someColumn) {
                    someColumn.dataValueType = Terrasoft.DataValueType.TEXT;
                    item.set("SomeColumn", item.values.SomeColumn.toString());
                }
            }
        }
    };
});

 

Best regards,

Bogdan S.

Bogdan Spasibov,

That is fantastic Bogdan. Thanks for sharing this!

Ryan

This works for the section - is there a code for a detail on the contact page? I need to remove the comma from the year field here

Hi Heather, 

 

Please refer this post where this question was explained.

 

https://community.creatio.com/questions/special-character

 

The logic for section differs from page and there is no way to apply the property to the grid.

 

Regards,

 

Bogdan L.

Show all comments

Is there any way to apply multiple sorting rules on section page? 

 

For example, on case page I need to sort the list by priority first if the priority is same then, apply the status rule. 

 

One more thing I want to apply this rule as by Default so every time any user visit case section page, the user by default sees the list in given as above manner. 

 

If anyone has any information regarding the same do let me know.

Like 1

Like

1 comments

Hi Meet,

 

Not sure it's possible in the current Creatio logic since here is the part of DataGrid object declaration from the BaseDataView schema:

"operation": "insert",
                "name": "DataGrid",
                     ...........
                    "sortColumn": {"bindTo": "sortColumn"},
                    "sortColumnDirection": {"bindTo": "GridSortDirection"},
                    "sortColumnIndex": {"bindTo": "SortColumnIndex"},

As we can see there are three main parameters that are responsible for grid sorting: sortColumn, sortColumnDirection and sortColumnIndex. Each of them calls either the sortColumn function or changeSorting function from the GridUtilitiesV2 schema where the value is set for these attributes. And the problem is that these functions can only get one column as an argument.

 

Overriding this logic won't be an easy task since there are two functions and the DataGrid object that should be modified. Our core R&D team has a problem registered on their end to make it possible to sort the grid using several columns and this idea is added to the system functionality improvement roadmap. So it's better to wait until the out-of-the-box solution is deployed and tested.

 

Best regards,

Oscar

Show all comments

Hello Community, 

 

I have requirements to show How much time has passed till case has been registered in the system. 

 

But the real catch is, the information I have to show on Section list like shown as below.

Here I want to add Passed time column near Resolution time. 

Passed time is time passed till registration of Case. 

 

And also, I want to do same on Dashboard’s list view.

Like 0

Like

1 comments

Hello Meet,

 

Here is an example of how I did it on my side:

 

1) Create a button in the CaseSection schema:

{
					"operation": "insert",
					"name": "CustomButtonContainer",
					"parentName": "ActionButtonsContainer",
					"propertyName": "items",
					"values": {
						"itemType": Terrasoft.ViewItemType.CONTAINER,
						"items": []
					}
 
				},
				{
					"operation":"insert",
					"name": "RecalculateTimeSpent",
					"parentName": "CustomButtonContainer",
					"propertyName": "items",
					"values": {
						"itemType": Terrasoft.ViewItemType.BUTTON,
						"caption": {bindTo: "Resources.Strings.RecalculateTimeSpentButtonCaption"},
						"click": {bindTo: "updateCaseTimePassed"},
						"style": Terrasoft.controls.ButtonEnums.style.RED
					}
				}

As a result the button will appear in the section:

Also don't forget to add the localizable value with "RecalculateTimeSpentButtonCaption" caption.

 

2) Create a string column in the "Case" object with "UsrTimePassedFromCreation" code and Text (250 characters) data type. Save and publish the object.

 

3) Display this created string column in the "Cases" section.

 

4) Add these methods to the CaseSection schema:

updateCaseTimePassed: function(){
				const today = new Date();
				for (let i = 0; i<this.get("GridData").collection.items.length;i++){
					let recordId = this.get("GridData").collection.items[i].values.Id;
    				let result = (today - this.get("GridData").get(recordId).get("CreatedOn")).toString(); //ms
					let diffDays = Math.floor(result / 86400000); //days
					let diffHrs = Math.floor((result % 86400000) / 3600000); // hours
					let diffMins = Math.round(((result % 86400000) % 3600000) / 60000); // minutes
					let resultMessage = diffDays + " days " + diffHrs + " hours " + diffMins + " minutes";
					let updateQuery = Ext.create("Terrasoft.UpdateQuery", {
							rootSchemaName: "Case"
						});
						let filters = updateQuery.filters;
						let caseIdFilter = updateQuery.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
								"Id", recordId);
						filters.add("caseIdFilter", caseIdFilter);
						updateQuery.setParameterValue("UsrTimePassedFromCreation", resultMessage, Terrasoft.DataValueType.TEXT);
						updateQuery.execute();
				}
				this.sleep(2000);
				this.updateSection();
			},
			sleep: function(milliseconds) {
  				const date = Date.now();
  				let currentDate = null;
  					do {
    					currentDate = Date.now();
  					} while (currentDate - date < milliseconds);
			}

5) Refresh the page and check the result - the values should populate for all records in the grid upon clicking the added button:

So you will periodically need to click the button to update information on the case time spent. Also you can add additional check for the case status so not to update records that are in "Resolved" or "Closed" status or you can build a filter with cases that are in the "In progress" status and use the button on them only.

 

Also please note that since the data is updated in the database directly you will see the same data in any dashboard representing cases.

 

Best regards,

Oscar

Show all comments

Hello all,

 

I am trying to create a process that can add a selection of contacts to a participants detail by picking select all and then clicking on the action in the actions drop down. I've gotten the process to start but it only grabs 30 records at once. 

 

I know that this is due to Creatio only loading so many records at once as a way to not stress the system too much. However, I need a way to collect more than 30 records. I'm trying to figure out a way to get Creatio to load the records once I've triggered the process.

 

It's fine if there's a delay while Creatio loads the records, I can always put up a message about how it may take some time. I just need to get the records.

Like 0

Like

0 comments
Show all comments

Hello

I'm deploying Creatio Exchange Listener for my developing environment. 

I'm following this academy guide:

https://academy.creatio.com/documents/administration/7-16/deploying-synchronization-service-docker?document=administration#CSH_4

I got this error message when I created the listener container:

PS C:\Users\medouederni-pc> docker run -p 8808:80 --env ExchangeListenerRedisHost=172.17.0.2 --env ExchangeListenerRedisDatabase=0 --env PodName=CreatioExchangeListener  --name CreatioExchangeListener bpmonline/exchangelistener:0.5.0                                                                                                                               Unable to find image 'bpmonline/exchangelistener:0.5.0' locally
0.5.0: Pulling from bpmonline/exchangelistener
804555ee0376: Pull complete                                                                                                                                                         970251047358: Pull complete                                                                                                                                                         f3d4c41a4fd1: Pull complete                                                                                                                                                         1cccda79a5f9: Pull complete                                                                                                                                                         a02b6037fa5e: Pull complete                                                                                                                                                         5a51c6fa0bad: Pull complete                                                                                                                                                         Digest: sha256:bb4e356161faade8783fbb86a820f96b837222a11dce7311617b4236777c49c4
Status: Downloaded newer image for bpmonline/exchangelistener:0.5.0
log4net:ERROR Could not create Appender [ExchangeListenerGelfAmqpAppender] of type [Gelf4Net.Appender.GelfAmqpAppender, Gelf4Net.AmqpAppender]. Reported error follows.
RabbitMQ.Client.Exceptions.BrokerUnreachableException: None of the specified endpoints were reachable ---> RabbitMQ.Client.Exceptions.ConnectFailureException: Connection failed ---> System.Net.Internals.SocketExceptionFactory+ExtendedSocketException: No such device or address
   at System.Net.Dns.InternalGetHostByName(String hostName)
   at System.Net.Dns.ResolveCallback(Object context)
--- End of stack trace from previous location where exception was thrown ---
   at System.Net.Dns.HostResolutionEndHelper(IAsyncResult asyncResult)
   at System.Net.Dns.EndGetHostAddresses(IAsyncResult asyncResult)
   at System.Net.Dns.<>c.<GetHostAddressesAsync>b__25_1(IAsyncResult asyncResult)
   at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
--- End of stack trace from previous location where exception was thrown ---
   at RabbitMQ.Client.TcpClientAdapter.ConnectAsync(String host, Int32 port)
   at RabbitMQ.Client.Impl.TaskExtensions.TimeoutAfter(Task task, Int32 millisecondsTimeout)
   at RabbitMQ.Client.Impl.SocketFrameHandler.Connect(ITcpClient socket, AmqpTcpEndpoint endpoint, Int32 timeout)
   --- End of inner exception stack trace ---
   at RabbitMQ.Client.EndpointResolverExtensions.SelectOne[T](IEndpointResolver resolver, Func`2 selector)
   at RabbitMQ.Client.Framing.Impl.AutorecoveringConnection.Init(IEndpointResolver endpoints)
   at RabbitMQ.Client.ConnectionFactory.CreateConnection(IEndpointResolver endpointResolver, String clientProvidedName)
   --- End of inner exception stack trace ---
   at RabbitMQ.Client.ConnectionFactory.CreateConnection(IEndpointResolver endpointResolver, String clientProvidedName)
   at Gelf4Net.Appender.GelfAmqpAppender.InitializeConnectionFactory()
   at log4net.Repository.Hierarchy.XmlHierarchyConfigurator.ParseAppender(XmlElement appenderElement)
log4net:ERROR Appender named [ExchangeListenerGelfAmqpAppender] not found.
Hosting environment: Production
Content root path: /app
Now listening on: http://[::]:80
Application started. Press Ctrl+C to shut down.

 

I tested the service and its working:

{
  "ServiceStatus": "Started",
  "version": "0.5.0",
  "connections": {}
}

I made the creatio configuration side:

https://academy.creatio.com/documents/administration/7-16/set-exchange-listener-service-side-creatio?document=administration#CSH_5 

Now, I can send emails but when I try to sync the mailbox I got this error:

[ExchangeListener.Subscription.ServiceFactory] 2020-06-16 11:57:47,885 [39] INFO : [18e30f9f-a1e7-4718-9cd1-e16577924fa2] End processing EmailMessage with id '31'.
[ExchangeListener.DataSend.EventDataSender] 2020-06-16 11:57:47,886 [39] DEBUG:  EventDataSender sending request to http://localhost:7700/0/ServiceModel/ExchangeListenerService.svc/ProcessFullEmail
[ExchangeListener.Email.Events.EmailEventProcessor] 2020-06-16 11:57:47,890 [42] ERROR: [18e30f9f-a1e7-4718-9cd1-e16577924fa2] [06/16/2020 11:57:47] Mailbox creatio123456789@gmail.com: error sending emails ['<71fe88dc-0198-4eca-8cc9-a8771976b3ab@gmail.com>' in folder ,'<71fe88dc-0198-4eca-8cc9-a8771976b3ab@gmail.com>' in folder ] to http://localhost:7700/0/ServiceModel/ExchangeListenerService.svc/NewEmail.
System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.Net.Http.CurlException: Couldn't connect to server
   at System.Net.Http.CurlHandler.ThrowIfCURLEError(CURLcode error)
   at System.Net.Http.CurlHandler.MultiAgent.FinishRequest(StrongToWeakReference`1 easyWrapper, CURLcode messageResult)
   --- End of inner exception stack trace ---
   at System.Net.Http.HttpClient.FinishSendAsyncBuffered(Task`1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts)
   at ExchangeListener.DataSend.EventClient.PostAsync(String requestUri, HttpContent content) in /src/src/ExchangeListener/DataSend/EventClient.cs:line 42
   at ExchangeListener.DataSend.EventDataSender.Send(String url, Object data) in /src/src/ExchangeListener/DataSend/EventDataSender.cs:line 85
   at ExchangeListener.DataSend.EventDataSender.SendEmail(Object data, SynchronizationCredentials credentials) in /src/src/ExchangeListener/DataSend/EventDataSender.cs:line 95
   at ExchangeListener.Email.Events.BaseEventProcessor.SendRequestObject(Object requstDtoObject, SynchronizationCredentials credentials) in /src/src/ExchangeListener/Email/Events/BaseEventProcessor.cs:line 149
   at ExchangeListener.Email.Events.EmailEventProcessor.SendEmailMessagesToBpm(List`1 messages, SynchronizationCredentials credentials) in /src/src/ExchangeListener/Email/Events/EmailEventProcessor.cs:line 66
[ExchangeListener.Imap.Subscription.ResentEmailsSynchronization] 2020-06-16 11:57:47,892 [39] INFO : [18e30f9f-a1e7-4718-9cd1-e16577924fa2] Email ids sended to bpm.
[ExchangeListener.Imap.Subscription.ResentEmailsSynchronization] 2020-06-16 11:57:47,892 [39] INFO : [18e30f9f-a1e7-4718-9cd1-e16577924fa2] Synchronization session for creatio123456789@gmail.com ended.

 

Thank you

Mohamed

Like 1

Like

4 comments

Hello Mohamed,

 

This is strange that your Exchange service returns this:

{
  "ServiceStatus": "Started",
  "version": "0.5.0",
  "connections": {}
}

even after the mailbox was used for emails sending. Please go to the mailbox settings and apply any changes there and see if you see something similar to this after that:

So you see the record about your mailbox there. Or try re-adding your mailbox to the app from scratch.

 

The error message you receive states that ExcahgneListener services couldn't establish the connection to the mail server. Please use this command:

 

ping mail_server_ip_address

 

from the ExchangeListener server so to test the connectivity. Also please check if the "The URL of the Exchange event processing service in Creatio" system setting has the value of https://mycreatio.com/0/ServiceModel/ExchangeListenerService.svc/NewEmail.

 

I've deployed the service on my end using the Academy instructions and everything is working properly so it should work as expected on your end and the problem can be in the connection between the email server and the ExchagneListener service.

 

Best regards,

Oscar

Dear Oscar Dylan,

 

Problem solved! It was a networking issue in Docker for Windows.

 

For everyone who may have this issue, you have to use host.docker.internal variable as your host IP address.

More information: https://docs.docker.com/docker-for-windows/networking/

Hi Mohamed,

 

I am running into the same issue for an on-prem dev image.  You indicated the issue was resolved via "For everyone who may have this issue, you have to use host.docker.internal variable as your host IP address."  Could you elaborate on that?  I read the article on docker for windows networking but wasn't clear on how you implemented the resolution.  Thanks so much :)

 

Update - never mind. Figured it out.  Using host.docker.internal in place of localhost in all cases. This resolves everything and ExchangeListener is working for both syncing and sending.  Thanks!!  :)

Hi Mohamed,

Can you help me with following questions:

Did you use OS setup file or pull request for installing Redis?

How did you set up redis host address?

Where exactly we use "host.docker.internal" variable. The link you shared doesnt seem to work.

 

Thank you

Gokul

Show all comments