I know the Modified By field shows the last to modify a case.

I'm trying to find out how I can track users who may have modified a case multiple times.

 

If User A modifies a case, the User B modifies the same case, I want to be able to track (either exporting to excel or in a graph/dashboard) and record that User A did modify that case, even if User B was the last to do so.

 

Is this possible? Every combination I can come up with seems to only track the last to modify a case.

Like 0

Like

4 comments

You can set logging up on the object (and specific columns) under 'change log' although I am not sure how easy it is to export from there. Alternatively you could create a detail/section linked to Case (Case Audit) and have a business process that writes specific changes (like modified by) when a record is modified.

Hi Jason,

To track multiple modifications by different users in the "Case" section, enable the change log and add all the columns you need to monitor for modifications.

Rob Watson,

Thank you, I'm working with the logging now.

Goparna Nasina,

Thank you, working with the logging now.

Show all comments

Добрий день. Намагаюсь зробити БП для створення нового Ліда з вхідного повідомлення на електронну адресу, але не можу зрозуміти до якої умови я маю причепитись в об'єкті Email повідомлення? 

Like 0

Like

2 comments

Добрий день!

Ви можете створити бізнес-процес для створення нового ліда на основі тригера — створення нового запису в об'єкті "Emil повідомлення".
 

Ви можете зчитати дані з пов'язаної з ним "Активності", щоб отримати відповідну інформацію, таку як тема, пов'язаний контакт/обліковий запис (якщо такий є), і включити це в процес створення ліда як параметр.

Класичним випадком було б перевіряти, чи є у темі повідомлення ключові слова для створення ліда.

На зображеннях нижче я надав приклади того, як буде виглядати такий тригер.

How to select activity subject

Email trigger

Дякуємо!

 

Andrii Kurta,

Добрий день. Дякую. Необхідний лист через Активність Кому отримую. Далі питання, як я з нього отримаю Тему листа - Хочу зробити її назвою Ліда наприклад. Контакт, хто надіслав створити контакт з його данними.

Потім вичитую дані з листа

 

Show all comments

Hi Team, 
I want to style my dropdown which has element code : "Usrcodedropdowncode" 
Can you please provide your inputs to achieve this?
Thank you, 
Asif

Like 0

Like

1 comments
Best reply

Hello Asif,

I've found an excellent article by Ryan Farley that explains how to add custom CSS style sheets in Creatio. It may help you to understand how styling works.

P.S. Logic in Classic and FreedomUI is quite the same for this task. 

 

Hello Asif,

I've found an excellent article by Ryan Farley that explains how to add custom CSS style sheets in Creatio. It may help you to understand how styling works.

P.S. Logic in Classic and FreedomUI is quite the same for this task. 

 

Show all comments

Hello,

I'm getting  "The system setting ExchangeListenerURI is not populated" error when I add new email account.
I'm using 8.1.1 version and postgre SQL database.

Thanks,

Asif Shaik

Like 0

Like

1 comments

Hey, everyone. 
I've been on this for a while now, but I can't figure it out. 

 

I've got this workflow from my print, and it has the following function: 

  • Get the information from a newly created entry on the object "Class"
  • Reading the information from "Class level" (it has the quantity of classes said level needs and what's the starting "Class number" that it must have),
  • Create "classroom" entries based on the "starting date" (it's a property from "Class") and "days of the week with time" (I've made it so that my object "Class" had a boolean for each day and a "time" for each day too ).

 

Does anyone knows how to construct a "Scripted task" (I belive that it is the ONLY way I can make it work) to do that? 

 

 

Business process:

 

Class table information, regarding how I've constructed the Day of the week + hour;

Like 0

Like

2 comments

Hello,

 

There is no need to use a script task here. A simple sub-process call with mass creation of records using the "Add data" element will also work as expected. 

 

If you want to use the code:

https://academy.creatio.com/docs/8.x/dev/development-on-creatio-platform/back-end-development/data-operations-back-end/orm/examples/manage-the-database-entities

 

See example 6

EntitySchema contactSchema = UserConnection.EntitySchemaManager.GetInstanceByName("Contact");
Entity contactEntity = contactSchema.CreateEntity(UserConnection);
contactEntity.SetDefColumnValues();
contactEntity.SetColumnValue("Name", "User01");
contactEntity.Save();
 

 

The things to change here are the entity name and the column values (and column names).

Hey, Kalymbet! 
Many thanks for the response. 
I'll try it and come back here later today to coment! 

Show all comments

Hi. 

 

I'm trying to deploy de Identity Service to be able to use the external Outh 2.0 authorization and im using the docker deploy option but when i run the container, i got the error "It was not possible to connect to the redis server(s). Error connecting right now."

 

I also tried to  modify the redis connectio string with my value in the ConnectionString.config file of my main creatio application but dosen't work.

 

I was following this documentation https://academy.creatio.com/docs/8.x/setup-and-administration/on-site-deployment/deployment-additional-setup/identity-service/set-up-the-identity-service-instruction#title-2002-6

 

the documentation for docker deploy dont show anything about redis.

 

Would apprecite your help. 

Like 0

Like

1 comments

Hello!

 

For Identity service, is there no need to use Redis. Please remove any mention of Redis in the Identity service setup.

Show all comments

I added virtual Detail and after filling the object it displays all records. On not Virtual details recoreds are displayed with amount of 10 and after clicking "Show More" it shows another 10. Bassicaly I want the same  logic for my Virtual Detail. I tried to set "RowCount" to 10 but it did not work.

Is it possible to add record limitation as it works in  not virtual detail with rowcount 10

 define("UsrFinancialAccountsVirtualDetail", ['ContactPageV2' ], function(ContactPageV2) {
	return {
		entitySchemaName: "UsrFinancialAccountsVirtualObject",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
			{
                "operation": "insert",
                "name": "LoadGridButton",
                "parentName": "Detail",
                "propertyName": "tools",
                "values": {
                    "itemType": Terrasoft.ViewItemType.BUTTON,
                    "caption": {"bindTo": "Resources.Strings.LoadGridButtonCaption"},
                    "click": {"bindTo": "onLoadGridButtonClick"},
                    "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT
                },
 
			},
 
		]/**SCHEMA_DIFF*/,
		attributes: {
			IsGridEmpty: {
                    dataValueType: this.Terrasoft.DataValueType.BOOLEAN,
                    value: true
			}
		},
		methods: {
     		sortColumn: this.Terrasoft.emptyFn,
            loadGridData: this.Terrasoft.emptyFn,
			      getRowCount: function() {
					return 10;
				  },
 
            init: function() {
                this.callParent(arguments);
                this.set("IsGridEmpty", true);
                this.set("IsGridDataLoaded", true);
 
            },
			onLoadGridButtonClick: function() {
				var _branchVirtualObject = this;
				this.set("MaskId", Terrasoft.Mask.show({timeout: 0}));
				var baseSecret = Terrasoft.SysSettings.cachedSettings.baseSecret;
    			var baseUrl = Terrasoft.SysSettings.cachedSettings.baseUrl;
 
				jQuery.ajax({
                        type: "GET",
 
                        url: `**************************************`,
                        headers: {
                            "Content-Type": "application/json",
                            "Accept-Language": "ru-RU"
                        },
                        dataType: "json",
                        success: function(getAccountsResponse) {
							if(getAccountsResponse.status.code == 1 && getAccountsResponse.data.accounts){
								let accountsData = getAccountsResponse.data.accounts
								 _branchVirtualObject.parseDataToDetail(accountsData)
								 _branchVirtualObject.showInformationDialog(getAccountsResponse.status.message)
								Terrasoft.Mask.hide(_branchVirtualObject.get("MaskId"));							
 
							}else{
								_branchVirtualObject.fallbackOnError(getAccountsResponse.status.message)
								Terrasoft.Mask.hide(_branchVirtualObject.get("MaskId"));
							}										
                        },
                        error: function(getCardsResponse) {
                           Terrasoft.Mask.hide(_branchVirtualObject.get("MaskId"));
							_branchVirtualObject.fallbackOnError("Error")   						
                        },                      
                    });				
			},
				fallbackOnError: function(message, response) {
				this.hideBodyMask();
				this.showInformationDialog(message, null, { style: Terrasoft.MessageBoxStyles.RED });
				console.log(message);
			},
			parseDataToDetail:function(cardsData){				 
				var data =[];				
				cardsData.map(x => {
					const tempObj = {
						UsrAccountId: x.accountId,
						UsrIndex: x.index,
						UsrBalance: x.balance,
						UsrStatus: x.status,
						UsrCurrency: x.currency,
						UsrType: x.type,
						UsrBankAccountNumber: x.UsrBankAccountNumber,						
					}	;					
					data.push(tempObj)
				})				
				var newCollection = Ext.create("Terrasoft.Collection");
				Terrasoft.each(data, function(item, key) {
					var model = Ext.create("Terrasoft.BaseViewModel", {
						rowConfig: {
							UsrId: {
								columnPath: "UsrId",
								dataValueType: Terrasoft.DataValueType.GUID
							},					
							UsrAccountId: {
								columnPath: "UsrAccountId",
								dataValueType: Terrasoft.DataValueType.TEXT
							},
							UsrIndex: {
								columnPath: "UsrIndex",
								dataValueType: Terrasoft.DataValueType.GUID
							},
							UsrBalance: {
								columnPath: "UsrBalance",
								dataValueType: Terrasoft.DataValueType.TEXT
							},
							UsrStatus: {
								columnPath: "UsrStatus",
								dataValueType: Terrasoft.DataValueType.TEXT
							},	
							UsrCurrency: {
								columnPath: "UsrCurrency",
								dataValueType: Terrasoft.DataValueType.TEXT
							},
							UsrType: {
								columnPath: "UsrType",
								dataValueType: Terrasoft.DataValueType.TEXT
							},
							UsrBankAccountNumber: {
								columnPath: "UsrBankAccountNumber",
								dataValueType: Terrasoft.DataValueType.BOOLEAN
							},
 
 
 
						},
						values: {
							UsrId: Terrasoft.generateGUID(),
							UsrAccountId: item.UsrAccountId,
							UsrIndex: item.UsrIndex,
							UsrBalance: item.UsrBalance,
							UsrStatus: item.UsrStatus,
							UsrCurrency: item.UsrCurrency,
							UsrType: item.UsrType,
							UsrBankAccountNumber: item.UsrBankAccountNumber,
						}
					}, this);
					newCollection.add(model.get("Id"), model);
				});
				var response = {
					collection: newCollection,
					success: true,
					errorInfo: undefined,
				};
 
				this.set("IsGridLoading", false);
                 this.set("IsGridDataLoaded", true);
				 this.set("IsGridEmpty", false);
				this.set("IsDetailCollapsed", false);
				this.set("RowCount", 10);
				this.updateLoadedGridData(response, this.onGridDataLoaded, this);
 
 
			},
 
		}
 
	};
}); 
Like 0

Like

2 comments

You can use my code as an example to implement your logic:

define("UsrSchema27d9d5e6Detail", [], function() {
	return {
		entitySchemaName: "UsrTestDetail",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
			{
                "operation": "insert",
                "name": "LoadGridButton",
                "parentName": "Detail",
                "propertyName": "tools",
                "values": {
                    "itemType": Terrasoft.ViewItemType.BUTTON,
                    "caption": {"bindTo": "Resources.Strings.LoadGridButtonCaption"},
                    "click": {"bindTo": "onLoadGridButtonClick"},
					"enabled": {"bindTo": "isLoadGridButtonEnabled"},
                    "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT
                }
			},
			{
                "operation": "insert",
                "name": "LoadNextRecords",
                "parentName": "Detail",
                "propertyName": "tools",
                "values": {
                    "itemType": Terrasoft.ViewItemType.BUTTON,
                    "caption": {"bindTo": "Resources.Strings.LoadNextRecords"},
                    "click": {"bindTo": "onLoadNextRecordsButtonClick"},
					"enabled": {"bindTo": "isLoadNextRecordsButtonEnabled"},
                    "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT
                }
			},
			{
                "operation": "insert",
                "name": "ClearGridData",
                "parentName": "Detail",
                "propertyName": "tools",
                "values": {
                    "itemType": Terrasoft.ViewItemType.BUTTON,
                    "caption": {"bindTo": "Resources.Strings.ClearGridData"},
                    "click": {"bindTo": "onClearGridDataButtonClick"},
					"enabled": {"bindTo": "isClearGridDataButtonEnabled"},
                    "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT
                }
			}
		]/**SCHEMA_DIFF*/,
		attributes: {
 
			IsGridEmpty: {
                    dataValueType: this.Terrasoft.DataValueType.BOOLEAN,
                    value: true
			},
 
			NumberOfClicks: {
				dataValueType: this.Terrasoft.DataValueType.INTEGER,
				value: 0
			},
 
			NumberOfRecordsToDisplay: {
				dataValueType: this.Terrasoft.DataValueType.INTEGER,
				value: 10
			},
 
			CanLoadGridData: {
				dataValueType: this.Terrasoft.DataValueType.BOOLEAN,
				value: true
			},
 
			ObjectsCollection: {
				dataValueType: this.Terrasoft.DataValueType.COLLECTION,
				value: [
					{
						UsrName: "1111",
						UsrIntColumn: 1
					},
					{
						UsrName: "Test2",
						UsrIntColumn: 24
					},
					{
						UsrName: "Test3",
						UsrIntColumn: 34
					},
					{
						UsrName: "Test4",
						UsrIntColumn: 44
					},
					{
						UsrName: "Test5",
						UsrIntColumn: 54
					},
					{
						UsrName: "Test6",
						UsrIntColumn: 64
					},
					{
						UsrName: "Test7",
						UsrIntColumn: 74
					},
					{
						UsrName: "Test8",
						UsrIntColumn: 84
					},
					{
						UsrName: "Test9",
						UsrIntColumn: 94
					},
					{
						UsrName: "Test10",
						UsrIntColumn: 104
					},
					{
						UsrName: "Test11",
						UsrIntColumn: 114
					},
					{
						UsrName: "Test12",
						UsrIntColumn: 124
					},
					{
						UsrName: "Test13",
						UsrIntColumn: 124
					},
					{
						UsrName: "Test14",
						UsrIntColumn: 124
					},
					{
						UsrName: "Test15",
						UsrIntColumn: 124
					},
					{
						UsrName: "Test16",
						UsrIntColumn: 124
					},
					{
						UsrName: "Test17",
						UsrIntColumn: 124
					}
				]
			}
		},
		methods: {
 
			isClearGridDataButtonEnabled: function() {
				var numberOfClicks = this.get("NumberOfClicks");
				var canLoadMoreData = this.get("CanLoadGridData");
				return numberOfClicks != 0 && !canLoadMoreData;
			},
 
			isLoadGridButtonEnabled: function() {
				var numberOfClicks = this.get("NumberOfClicks");
				var canLoadMoreData = this.get("CanLoadGridData");
				return numberOfClicks == 0;
			},
 
			isLoadNextRecordsButtonEnabled: function() {
				var numberOfClicks = this.get("NumberOfClicks");
				var canLoadMoreData = this.get("CanLoadGridData");
				return numberOfClicks != 0 && canLoadMoreData;
			},
 
			processObjectsCollection: function(collection, numberOfRecordsToLoad, skipRecordsNumber) {
				var newCollection = Ext.create("Terrasoft.Collection");
				Terrasoft.each(collection, function(item, key) {
					if (key < numberOfRecordsToLoad && key >= skipRecordsNumber) {
						var model = Ext.create("Terrasoft.BaseViewModel", {
						rowConfig: {
							Id: {
								columnPath: "Id",
								dataValueType: Terrasoft.DataValueType.GUID
							},
							UsrName: {
								columnPath: "UsrName",
								dataValueType: Terrasoft.DataValueType.TEXT
							},
							UsrIntColumn: {
								columnPath: "UsrIntColumn",
								dataValueType: Terrasoft.DataValueType.INTEGER
							}
						},
						values: {
							Id: Terrasoft.generateGUID(),
							UsrName: item.UsrName,
							UsrIntColumn: item.UsrIntColumn,
						}
					}, this);
						newCollection.add(model.get("Id"), model);
					}
				});
				return newCollection;
			},
 
			processNumberOfClicks: function() {
				var numberOfClicks = this.get("NumberOfClicks");
				var numberOfRecordsToDisplay = this.get("NumberOfRecordsToDisplay");
				var numberOfRecordsToLoad = (numberOfClicks + 1) * numberOfRecordsToDisplay;
				var numberOfRecordsToSkip = numberOfClicks * numberOfRecordsToDisplay;
				this.set("NumberOfClicks", numberOfClicks + 1);
				var result = {
					NumberOfRecordsToLoad: numberOfRecordsToLoad,
					NumberOfRecordsToSkip: numberOfRecordsToSkip
				};
				return result;
			},
 
			processDataLoadRequest: function() {
				var offsetFetchValue = this.processNumberOfClicks();
				var numberOfRecordsToLoad = offsetFetchValue.NumberOfRecordsToLoad;
				var skipRecordsNumber = offsetFetchValue.NumberOfRecordsToSkip;
				var object = this.get("ObjectsCollection");
				var processedCollection = this.processObjectsCollection(object, numberOfRecordsToLoad, skipRecordsNumber);
				var processedCollectionLength = processedCollection?.length;
				var response = {
					collection: processedCollection,
					success: true,
					errorInfo: undefined
				};
				this.updateLoadedGridData(response, this.onGridDataLoaded, this);
				return processedCollectionLength != 10;
			},
 
			onClearGridDataButtonClick: function() {
				const gridData = this.getGridData();
				gridData.clear();
				this.set("NumberOfClicks", 0);
				this.set("CanLoadGridData", true);
			},
 
			onLoadGridButtonClick: function() {
				this.processDataLoadRequest();
				this.set("CanLoadMoreData", false);
			},
 
			onLoadNextRecordsButtonClick: function() {
				var result = this.processDataLoadRequest();
				if (result) {
					this.set("CanLoadGridData", false);
				}
			}
		}
	};
});

The code is simple to read, and everything should be clear. The number of records to load per LoadNextRecords button click is controlled in the NumberOfRecordsToDisplay attribute. The idea was to add 3 buttons:

 

1) LoadGridButton performs the initial data load. Becomes disabled once it's clicked.

2) LoadNextRecords loads the next 10 records from the ObjectsCollection attribute. It becomes disabled once all records are displayed.

3) ClearGridData performs data grid clear, and data loading can start from the beginning. It is enabled only when all records are loaded into the grid.

Oleg Drobina,

Thanks Oleg, it works.

Show all comments

Hi, 
I've been stuck quite sometime on this particular error while installing/configuring Creatio for On-Site development. 
Inside the ConnectionString.config file, I changed a couple of parameters in "db" section to be able to connect MSSQL server via SQL Authentication by replacing Integrated Security=SSPI to User Id and Password. however, to no avail I am still getting this error (Image attached), which i couldn't find mentioned anywhere else in this forum.

Any help would be appreciated. Thanks

ConnectionString.config "db" string:

Like 0

Like

4 comments

Hello,

 

Please specify if you are trying to deploy an existing site's database based on binary files? Or are you deploying a new environment from scratch?

Mira Dmitruk,

Hello,

I'm deploying a new environment from scratch, I have the Creatio binary files (zip) version 8.1.2.3941 included a database file to restore.

Yanuar Adinagoro Vishnu Saputro,

 

Hello!

This error indicates that you are trying to install version 8.1.2 when the Database is still on version 8.1.1. 

Please correct the settings using our documentation: 

https://academy.creatio.com/docs/8.x/setup-and-administration/category/on-site-deployment

Have a nice day! 

Hanna Skalko,

Hello,

I see, I should use the newest database included with version 8.1.2, right? I wasn't aware of that at first. 
Thank you all, it works now.

Show all comments

Hi

Does any one know how to make bold "new feed notification"  or mark as Unread? 

Like 0

Like

3 comments

Hello,

 

Could you please provide more details and/or screenshots of what you would like to achieve?

 

Best regards,
Yuliya

Hi Yuliya,

 

what Sergio is asking is to only mark feed notification as read when they are clicked (similar behaviour to monday and other applications). 

Otherwise every time a user opens the tab, all notifications are marked as read, independent of if the user has read it or not.
 

I also noticed that unlike the instructions (https://academy.creatio.com/docs/8.x/creatio-apps/creatio-basics/commun…) the notifications counter is not showing and the new notifictions do not appear as grey. Can this have something to do with the browser that is used?

 

Rgds,

Luis

 

Luis Tinoco Azevedo,

 

Hi!

 

Unfortunately, so far, there is no possibility of marking notifications unread / marking them as read only after they are clicked. 
We have registered your suggestion on this topic, and our R&D team will consider implementing it in future releases.

 

As for the Academy article, there is an inaccuracy. The logic with the counter is currently applied only to the Classic UI shell. And the highlighting of the new notification has not been implemented so far.
We apologize for this inconsistency. We have already informed the Academy team about it, and they will correct the article. Also, a separate suggestion was registered for the R&D team on implementing the counter for Freedom UI and adding highlighting.

 

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

 

Best regards,

Natalia

Show all comments

Hi guys,

 

Is there a way to sort a detail by a specific field in Freedom Mobile? I'm using this approach that works in Classic, but it does not seem to work when I switch to the Freedom version:

 

Terrasoft.sdk.GridPage.setOrderByColumns("Account", {
    column: "CreatedOn",
    orderType: Terrasoft.OrderTypes.DESC
});

 

Thanks!

Like 0

Like

1 comments

Hello,

 

This approach won't work in Freedom UI, this one is for classic UI. Here is the example of the code for ActivityDetailV2EmbeddedDetail out-of-the-box

"ActivityDetailV2EmbeddedDetail": {
                "properties": {"readonly": true},
                "modelConfig": {
                    "path": "ActivityDetailV2EmbeddedDetailDS",
                    "cacheConfig": {},
                    "sortingConfig": {
                        "default": [{
                            "columnName": "CreatedOn",
                            "direction": "asc"
                        }],
                        "name": "Attribute_ActivityDetailV2EmbeddedDetail_SortingConfig"
                    },
                    "name": "Attribute_ActivityDetailV2EmbeddedDetail_ModelConfig"
                },
                "name": "Attribute_ActivityDetailV2EmbeddedDetail"
            },

added to the MobileCaseRecordPageSettings (edit page of the case section in mobile). The code for your detail should be found in the same schema and modified.

Show all comments