Hello,

 

I have a page with the progress bar (cases) on Studio 8.1.0.6827. To simplify the explanation, let's say there are two stages based on a status field: New Request and Completed and I have business rules stating that the request description is required if the status is Completed. 



If the 'Save record on stage change' is off, when I click on the Completed bar, the description field becomes require and I cannot save without entering. But of 'Save record on stage change' is on the record is saved and the status changes to Completed even if the description was not entered. 



Any ideas on how to make it work where the 'Save record on stage change' is on but the business rules are applied, and the record is not saved if the required fields for that status are missing?



Thanks,

Jose

 

Like 1

Like

1 comments

Hello!

 

To provide you with an answer, we need to investigate it deeper. Please contact the Support Team directly via support@creatio.com and provide all these details.

 

Best regards, Mariia

Show all comments

Is it possible to restrict the "Owner" filter for Timeline components to only show Contacts which match a specific filter condition? We are currently seeing every Contact as an option, but for us this should be restricted to only Contacts which have a User record associated with them, and ideally we'd want to add some more customisation to the filter options beyond this.

Like 0

Like

9 comments
Best reply

I've discovered that it's possible to add this using code. To do so, you need to override the crt.LoadDataRequest handler and use the following code:

{
	request: "crt.LoadDataRequest",
	handler: async (request, next) => {
		// Filter Timeline's Owner filter to just Contacts with a User record
		if(request.dataSourceName === "ByOwnerQuickFilterInTimeline_xi3lpgm_ComboBox_List_DS") {
			const filter = new sdk.FilterGroup();
			await filter.addExistsFilter("[SysAdminUnit:Contact:Id].Id");
 
			// workaround for filters
			const newFilter = Object.assign({}, filter);
			newFilter.items = filter.items;
 
			request.parameters.push({
				type: "filter",
				value: newFilter
			});
		}
 
		return await next?.handle(request);
	}
},

You have to replace the name of the Timeline component in the above code from Timeline_xi3lpgm to whatever the component is called on your page.

Hello Harvey,



There is no such option for now, however, we've registered it in our R&D team backlog for consideration and implementation in future application releases.

 

Thank you for helping us to improve our product. 

Thanks Bogdan, it's definitely a feature that's needed - having every Contact show up in the Owner filter with no way to change this on a CRM platform isn't ideal.

I've discovered that it's possible to add this using code. To do so, you need to override the crt.LoadDataRequest handler and use the following code:

{
	request: "crt.LoadDataRequest",
	handler: async (request, next) => {
		// Filter Timeline's Owner filter to just Contacts with a User record
		if(request.dataSourceName === "ByOwnerQuickFilterInTimeline_xi3lpgm_ComboBox_List_DS") {
			const filter = new sdk.FilterGroup();
			await filter.addExistsFilter("[SysAdminUnit:Contact:Id].Id");
 
			// workaround for filters
			const newFilter = Object.assign({}, filter);
			newFilter.items = filter.items;
 
			request.parameters.push({
				type: "filter",
				value: newFilter
			});
		}
 
		return await next?.handle(request);
	}
},

You have to replace the name of the Timeline component in the above code from Timeline_xi3lpgm to whatever the component is called on your page.

Harvey Adcock,

good find, thanks!

You should mark your own answer as solution ;)

Harvey Adcock,

Well done! Thanks for sharing this Harvey. 

Also, if you've moved to 8.1.1 you no longer need the filters workaround - it's finally working properly in 8.1.1, just thought I'd mention.

Ryan

Ryan Farley,

Ahh great to hear, thanks for the info Ryan - and thanks for spreading the info about that workaround in the first place!

I'd like to share my solution on lookup filtering.

We wanted to have only contacts from our company and in certain functional role.

{
	request: "crt.LoadDataRequest",
	handler: async (request, next) => {
		if (request.dataSourceName !== "FbContact_List_DS") {
			return await next?.handle(request);
		}
 
		const ourCompanyFilter = new sdk.CompareFilter(
			sdk.ComparisonType.Equal, 
			new sdk.ColumnExpression({
				columnPath: "Account.Type"
			}), 
			new sdk.ParameterExpression({
				value: Constants.AccountType.OurCompany
			})
		);
 
		const funcRoleFilter = new sdk.CompareFilter(
			sdk.ComparisonType.Equal, 
			new sdk.ColumnExpression({
				columnPath: "[SysAdminUnit:Contact:Id].[SysUserInRole:SysUser:Id].SysRole.Id"
			}), 
			new sdk.ParameterExpression({
				value: Constants.FunctionalRole.MyCustomFunctionalRole
			})
		);
 
		request.parameters.push({
			type: sdk.ModelParameterType.Filter,
			value: ourCompanyFilter
		});
 
		request.parameters.push({
			type: sdk.ModelParameterType.Filter,
			value: funcRoleFilter
		});
 
		return await next?.handle(request);
	}
}

 

Alex Zaslavsky,

Interesting, it hadn't occurred to me to push multiple filters to the parameters. I've always added the multiple filters to a FilterGroup and then added the group to the parameters. I guess it's an array for a reason :) Nice to know it works that way as well.

Ryan

Hello , 

Can we set a current user as a default in timeline quickfilter ? 

Show all comments

I would like to have the ability to IFrame, use HTML, and/or Markdown language within the knowledge base section. This will greatly increase our ability to provide more detailed walkthroughs for our agents, with a central location for other assets like images.

1 comments

Hello,



We've registered your idea in our R&D team backlog for consideration and implementation in future application releases. The task number: PR-31945.



Thank you for helping us to improve our product.

Show all comments

when we tried to create a report it worked normally when the user language was English, however

when a user language Arabic the BP shows the below error



System.NotSupportedException: Unsupported report type '0'

   at Terrasoft.Configuration.ReportEngine.Generate(ReportSettings settings)

   at Terrasoft.Core.Process.Configuration.ReportFileProcessingUserTask.InternalExecute(ProcessExecutingContext context)

   at Terrasoft.Core.Process.ProcessActivity.RunInCultureScope[T](Func`1 action)

   at Terrasoft.Core.Process.ProcessActivity.ExecuteElement(ProcessExecutingContext context)

   at Terrasoft.Core.Process.ProcessActivity.ExecuteItem(ProcessExecutingContext context)

   at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context

Like 0

Like

1 comments

Dear Sayed!

 

We can see that you have already submitted a case for our support team and this case is currently in progress. We will update you in that request. 

 

Have a great day!

Show all comments

We were trying to expose the automatically-created Change Log entities created by Creatio when change tracking is turned on for entities, which generally take the form of SysLog but don't actually get navigable entities created in the package. Is there any way to expose these, for example in a detail on a page in Freedom UI? We wanted to be able to specify our own sorting and filtering logic on the OOTB section, as it's quite frustrating to use - for example, every time you drill into a record, it resets the date range for that record to the current day. You also can't search for specific record IDs that you want to see modifications to unless the record never had a Name filled in which makes trying to see what happened to deleted records you know must have existed very difficult!

 

I tried manually creating an entity over the table name (specifying it as a database view so Creatio didn't try to create or update the actual table) but then adding the change log entity's columns wasn't possible due to them having to have the prefix before the names, which the automatically-created columns of the change log table didn't have (e.g. Id, ChangeTypeId etc). Any way of working around this or a way of adding a change log entity as List in the UI somehow?

Like 1

Like

5 comments
Best reply

You can avoid needing the prefix by clearing the prefix system setting. Then no prefix will be needed.

However, I'm not sure creating the object would be a good idea, perhaps? Seems risky. What I would do is create a database view wrapping the data and then expose that as an object instead. That seems like the best route to me.

Ryan

Any ideas on how this might be possible?

You can avoid needing the prefix by clearing the prefix system setting. Then no prefix will be needed.

However, I'm not sure creating the object would be a good idea, perhaps? Seems risky. What I would do is create a database view wrapping the data and then expose that as an object instead. That seems like the best route to me.

Ryan

Thanks Ryan, sounds like a great idea - then the view over the top of the change log table can have its columns renamed where the prefix isn't present to start with the prefix, which will avoid the need to turn prefix off and on when adding new columns to the change log view entity.

Harvey,

 

Can I ask, what tables the change log is saved to if you know?  Or if there is a view to read the change log?  There is an API I note but I have a scenario where a SQL query is the better option.

Hi Gareth, the name of the tables created for the change log is Sys[object name]Log, so for example for the Account entity, it would be SysAccountLog. Hope this helps!

Show all comments

In the academy documentation, there is limited information about using the ESQ/ORM server-side methods to delete data, with only 2 or 3 toy examples. We need to efficiently delete large volumes of data using server-side ESQ in one of our processes, but we can't see anything about bulk deleting while still firing off any event-based triggers on the entity or generating change log records for it. Obviously the direct Terrasoft.Core.DB delete statement would be very efficient, but would skip the Creatio logic where needed.

 

We've been able to delete records by iterating over a collection of entities matching the required filtering condition retrieved by using GetEntityCollection and then for each entity in the collection, running a FetchFromDB on its Id before deleting it, but this seems like quite a few steps more than should be required and doesn't do it in a batched way.

 

Any help would be greatly appreciated.

Like 0

Like

2 comments

Hello Harvey,

 

You can use out-of-the-box examples of bulk deletion logic. For example we can take the BulkEmailTargetArchiver class and the DeleteArchiveLevel method in it:

private void DeleteArchiveLevel(string sourceSchemaName, string targetSchemaName) {
			int processedRecords;
			do {
				var deleteQuery = new Delete(_userConnection).From(sourceSchemaName)
					.Where("Id").In(new Select(_userConnection)
						.Top(_batchSize)
						.Column("s", "Id")
						.From(sourceSchemaName).As("s")
						.Where().Exists(new Select(_userConnection)
							.Column(Column.Parameter(1))
							.From(targetSchemaName)
							.Where(targetSchemaName, "Id")
							.IsEqual("s", "Id")));
				processedRecords = deleteQuery.Execute(_dbExecutor);
			} while (processedRecords != 0);
		}

This is just one example of the logic. You can use:

 

select * from SysSchemaSource

where Source like '%DeleteQuery%'

 

to get other schemas in the application configuration with delete queries examples and build your own one using all examples you may find in the system.

Hi Oleg,

 

using these Delete classes bypasses Creatio’s internal logic though, right? So change logs will be inaccurate and any BPs that should be triggered on delete would not be triggered etc. This seems risky to me as important processes could hang off this, and I don’t know what other internal aspects of Creatio might be relying on logic that Creatio manages at an application level.

 

Is there any way to bulk delete while respecting that?

Show all comments

If you save message template blocks in either user templates and/or bulk messages, and you need to change a saved block, the changes do not automatically cascade down the templates that use that block. You have to manually open each item and drag and drop the new block into place and delete the old one. This can get extensive when you have 100s of templated messages in use. There should be a save and save as option, where save overwrites the existing block and cascades the changes to any template that currently uses it. 

1 comments

That would save soooo much time ! (= massive added value)

Show all comments

I would like the ability to use a formula to set a field value. An example might be to generate a web-link with a hard-coded base URL with an appended page parameter Id. In the classic UI I could create a CTA that pushed the user back to an internal page that had a hard-coded URL with an appended page record value. That isn't easily done with the new low-code tools for buttons.

 

Another Item might be to transform a field from a date value to months, days, or years instead.

1 comments

I believe a formula editor in business rules is potentially planned for the 8.2 roadmap 🙂 . Could that help ?

Show all comments

Hello,

Is it possible to add an attachment to an email within a campaign?

I know it's possible to do it within a business process, but I want to utilize the marketing campaign features.

Have any of you accomplished this in Creatio?

Thanks.

Like 0

Like

2 comments
Best reply

Hello,

 

Bulk/trigger emails are not supposed to have files attached to them since the email provider can reject sending this email. The only way to have a file (for example pdf file) being attached to an email if it is a trigger/bulk email - is to put this file as a link to the body of an email. Your file should be stored in some public storage that can be accessed by anyone and the link to it will be like this https://test_storage_system/$File/TestSheet.pdf.

 

But if you put this link to the body of an email - recipients will get an error when opening it. So you need to use the OpenElement parameter at the end and make the link look like this

https://test_storage_system/$File/TestSheet.pdf?OpenElement. As a result, users will see opened pdf documents (which they can download after that) that can be accessed from your bulk/trigger email.

Hello,

 

Bulk/trigger emails are not supposed to have files attached to them since the email provider can reject sending this email. The only way to have a file (for example pdf file) being attached to an email if it is a trigger/bulk email - is to put this file as a link to the body of an email. Your file should be stored in some public storage that can be accessed by anyone and the link to it will be like this https://test_storage_system/$File/TestSheet.pdf.

 

But if you put this link to the body of an email - recipients will get an error when opening it. So you need to use the OpenElement parameter at the end and make the link look like this

https://test_storage_system/$File/TestSheet.pdf?OpenElement. As a result, users will see opened pdf documents (which they can download after that) that can be accessed from your bulk/trigger email.

Bogdan,

Hello thank you for your reply. I'll find a way to generate a link of my file and use it within a bulk email

Show all comments

I tried returning false and not calling next?.handle(request), but the record still seems to get saved. In Classic UI it was possible to prevent saving by not calling the this.callParent method, which I believe is somewhat analogous to the next?.handle(request), but I guess not perfectly? Maybe I'm missing something.

Like 1

Like

1 comments
Best reply

Hello Harvey,

It is possible, and you do it in the right way as I can see from the description. To prevent saving you have to declare this handler in the scheme and simply do not call next?.handle(request). 

Hello Harvey,

It is possible, and you do it in the right way as I can see from the description. To prevent saving you have to declare this handler in the scheme and simply do not call next?.handle(request). 

Show all comments