Service_Creatio_enterprise_edition
8.0

Hello community,

 

Can portal users import files?

 

In operation permissions, in 'CanImportFromExcel' where we define the users who can import files, it is possible to add the organizational role 'all portal users,' but users still can't import.

 

 

Is it possible for them to import files?

 

Thank you!

 

Best regards,

Andreia

Like 0

Like

2 comments

Hello,



According to the application logic, the portal user cannot import data. Because the portal functionality is limited, and import is available only for administrators by default.



We will register an idea for our developers to consider the possibility of importing for portal users. Currently, this can only be done by internal users.

Malika,

Thank you, Malika, for the reply.

Show all comments
user_role
page
Service_Creatio_enterprise_edition
7.18

Hi Community,

 

We are using the case section with 4 different pages based on the case types. We are required to disable the creation permission for different page types based on the user roles.

The OOTB Operation permission functionality in the object permission allows the Restriction at the object level. However, according to the requirement, we require this permission at the page level. Is there any workaround for us to achieve this?

 

I also tried the code attached below to achieve this requirement. But seems like I am missing something and the code is not working as expected.

 

initEditPages: function () {
    var roleName = "System administrators";
    
    var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
        rootSchemaName: "SysUserInRole"
    });
    esq.addColumn("SysRole");
    
    esq.filters.add("UserFilter", Terrasoft.createColumnFilterWithParameter(
        Terrasoft.ComparisonType.EQUAL, "SysUser", Terrasoft.SysValue.CURRENT_USER.value
    ));
    
    esq.filters.add("RoleFilter", Terrasoft.createColumnFilterWithParameter(
        Terrasoft.ComparisonType.EQUAL, "SysRole.Name", roleName
    ));
    
    esq.getEntityCollection(function(result) {
        if (!result.success || result.collection.getItems().length === 0) {
            // the user is *not* in the role 
            // do something here if needed
        }
        else {
            // the user *is* in the role
            var scope = this;
            var Ext = this.Ext;
            var Terrasoft = this.Terrasoft;
            var collection = Ext.create("Terrasoft.BaseViewModelCollection");
            var entityStructure = this.getEntityStructure(this.entitySchemaName);
            if (entityStructure) {
                Terrasoft.each(entityStructure.pages, function(editPage) {
                    var typeUId = editPage.UId || Terrasoft.GUID_EMPTY;
                    if (editPage.cardSchema === "BEACRCase2Page") {
                        collection.add(typeUId, Ext.create("Terrasoft.BaseViewModel", {
                            values: {
                                Id: typeUId,
                                Caption: editPage.caption,
                                Click: {bindTo: "addRecord"},
                                Tag: typeUId,
                                SchemaName: editPage.cardSchema
                            }
                        }));
                    }
                    else if (editPage.cardSchema === "BEACRCase1Page") {
                        collection.add(typeUId, Ext.create("Terrasoft.BaseViewModel", {
                            values: {
                                Id: typeUId,
                                Caption: editPage.caption,
                                //Click: {bindTo: "addRecord"},
                                Tag: typeUId,
                                SchemaName: editPage.cardSchema
                            }
                        }));
                    } else if (editPage.cardSchema === "BEACCCase1Page") {
                        collection.add(typeUId, Ext.create("Terrasoft.BaseViewModel", {
                            values: {
                                Id: typeUId,
                                Caption: editPage.caption,
                                //Click: {bindTo: "addRecord"},
                                Tag: typeUId,
                                SchemaName: editPage.cardSchema
                            }
                        }));
                    } else if (editPage.cardSchema === "BEAKRCase1Page") {
                        collection.add(typeUId, Ext.create("Terrasoft.BaseViewModel", {
                            values: {
                                Id: typeUId,
                                Caption: editPage.caption,
                                //Click: {bindTo: "addRecord"},
                                Tag: typeUId,
                                SchemaName: editPage.cardSchema
                            }
                        }));
                    }
                }, scope);
            }
            this.set("EditPages", collection);
        }
    }, this);
},

 

Kindly assist me in resolving this issue, please.

Like 0

Like

4 comments

Hello,

 

1) If you need to check roles and grant them access to some functionality it's much better to do via operations permissions check.

2) Because of point 1 you need to create several operation permissions and check all of them using RightUtilities.checkCanExecuteOperation method.

3) Based on the check result from point 2 - remove edit pages from the collection of edit pages. To do that:

 

3.1) Override SeparateModeAddRecordButton in the section schema

3.2) Add the check like the following:

{
				"operation": "merge",
				"name": "SeparateModeAddRecordButton",
				"parentName": "SeparateModeActionButtonsLeftContainer",
				"propertyName": "items",
				"values": {
					"controlConfig": {
						"menu": {
							"items": {
								"bindTo": "EditPages",
								"bindConfig": {
									"converter": function(editPages) {
										if (editPages.getCount() > 1) {
											RightUtilities.checkCanExecuteOperation({operation: "CanCreateCustomerContact"}, function(result) {
												if (result) {
													editPages.collection.items = editPages.collection.items.filter(item => item.values.Caption.includes("Customer"));
													return editPages;
												}
												
											});
										} else {
											return null;
										}
									}
								}
							}
						}
					}
				}
			}

It will also check if the role of the current user is in the operation permission and you don't need to call ESQ to get the list of roles, you can control it directly via the "Operation permissions" section.

 

In the example above all edit pages but "Customer" will be removed from the list if the user has access to the "CanCreateCustomerContact" operation (for all other users the "New" button in the Contacts section won't do anything).

 

So you need to test this approach and apply it to your business task.

Hi Oleg,

 

I appreciate your support. Please see the steps below, that were executed. I seem to be missing something and cannot see the expected result.

 

1. Step 01:

Created a new operation permission with the code - "CanCreatePendingDocumentCase" and added the relevant user roles who can create the particular type of case (Pending Document)

 

2. Step 02:

Added the below code snippet in the replacing section schema in the diff array

{
                "operation": "merge",
                "name": "SeparateModeAddRecordButton",
                "parentName": "SeparateModeActionButtonsLeftContainer",
                "propertyName": "items",
                "values": {
                    "controlConfig": {
                        "menu": {
                            "items": {
                                "bindTo": "EditPages",
                                "bindConfig": {
                                    "converter": function(editPages) {
                                        if (editPages.getCount() > 1) {
                                            RightUtilities.checkCanExecuteOperation({operation: "CanCreatePendingDocumentCase"}, function(result) {
                                                if (result) {
                                                    editPages.collection.items = editPages.collection.items.filter(item => item.values.Caption.includes("Pending Document"));
                                                    return editPages;
                                                }
                                            });
                                        } else {
                                            return null;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

 

Step 03:

Cleared the cache and checked whether only pending document case is available in the new button drop-down of the section.

 

But the dropdown is showing all the case types in the new button regardless of the user role.

Geeviniy Vazavan,



1) Is the Edit page called "Pending Document" (with this uppercase in P and D)? Includes method is case sensitive in JS.

 

2) which result is passed to the result of checkCanExecuteOperation method execution?

 

3) Have you added the button to the correct schema (for example it should be in ContactSectionV2, not in the ContactPageV2)?

 

4) Is the converted code triggered in the debugger?

Hi Oleg,

 

Please see the answers below.

 

1. Yes. The edit page "Pending Document" is in upper case P and D.

2. Result is "true"

3. It is added to the "CaseSection" schema

4. Yes. It is triggered.

Show all comments
Service_Creatio_enterprise_edition
8.0

Hi Creatio Community,



The documentation says we can add up to 3 custom sections on the Creatio Portal. Does this refer to only the new objects that I setup (as sections) from scratch or in other words objects that are not available as Out of the Box section, or does it refer to even from the Base set of Sections (For example: Product, Contracts & Invoices) that I might choose to add to the portal?



Additionally, if I create a custom object from scratch and define it as a detail (instead of creating it as a standalone section) within a portal section can I bypass this limitation of the portal license?

Like 0

Like

4 comments
Best reply

Vishal,

Yes, this is what I was told by support, and also confirmed by attempting to add other base sections in the portal (they didn't show up at all). 

For customer portal, you can only expose the base sections: Applications (only applies to FinServ Creatio), Documents, KB, Cases, and 3 custom sections.

Yes, you can expose these as details on a section that is exposed in the portal. They just can't be "sections" - meaning cannot be on the nav workspace and have list page etc.

Ryan

A custom section is a section you've made from scratch using the section wizard. Not an existing section that you've exposed as a section in the portal (such as Product, Contracts, Invoices, etc). Additionally, many ootb sections are not allowed to be exposed in the portal. See the table in this academy article, if it's not listed in the list of allowed sections it can't be exposed in the portal https://academy.creatio.com/docs/user/more_apps/portal/overview/portal_…

However, a lot of this changes with the switch to "external users" from "portal users" with the new composable pricing/model.

Ryan

Ryan Farley,

 

This is very helpful Ryan, however in the link you pasted, I can only find one table (and not the list the possible sections?) and it says the Customer Portal only offers the following:

 

"Customer portal[ Portal cases ],

[ Portal knowledge base ],

[ Applications ] (for Financial Services Creatio, Customer Journey edition),

[ Documents ] (if available in the main Creatio application)"

 

Does this mean I cannot add the any more Base Sections to the Customer portal and additionally, if I these 'custom' objects were set up as sections, can I overcome the portal limitation by just listing them as details?



 

Vishal,

Yes, this is what I was told by support, and also confirmed by attempting to add other base sections in the portal (they didn't show up at all). 

For customer portal, you can only expose the base sections: Applications (only applies to FinServ Creatio), Documents, KB, Cases, and 3 custom sections.

Yes, you can expose these as details on a section that is exposed in the portal. They just can't be "sections" - meaning cannot be on the nav workspace and have list page etc.

Ryan

This is what I thought as well. Thanks Ryan! 

Show all comments
Installation
Problem
IIS
Service_Creatio_enterprise_edition
8.0

Hi,

I have 2 VMs for Creatio v8.0.8.4807:

1 on Windows Server 2016 wirh iis where located all Creatio files

2 on Ubuntu 20 with Postgres 12 + Redis

So after all installation steps i face with a problem 

Config Error   The configuration section 'terrasoft' cannot be read because it is missing a section declaration

Config File   \\?\C:\inetpub\wwwroot\8.0.8.4807_ServiceEnterprise_Softkey_PostgreSQL_ENU\Terrasoft.WebApp\web.config

I have checked web.config and ConnectionString and all seems fine

Also attached the error screen and in rar format web.config + ConnectionString



Thanks in advance

 

File attachments
Like 0

Like

3 comments

Hi @Babyshark! How are you? I strongly recommend to double check the necessary windows componentes: https://academy.creatio.com/docs/7-18/user/on_site_deployment/applicati…

Regards.

Uriel Nusenbaum,

Hi, Uriel

I have checked everything and all seems installed. Unfortunately still have the same problem. No idea how to solve the issue.



Thanks for trying to help me.

You are welcome! If you want you could share a print with the result of this command. Please see the image below:

 

Thank you

Regards.

Show all comments
custom configuration service
replacing client module
Service_Creatio_enterprise_edition
8.0

Hi community,

I'm following the available documentation to achieve this but when I try to create the Replacing view model module the system doesn't find any existing "Parent object" with the code OperatorSingleWindowPage.

I already created a custom package called "Test", as you may notice in the previous screenshots and I can't find anymore information about this problem.

I don't know if the more recent versions of Creatio doesn't support this anymore. I would like to know if I'm doing something wrong and if there is any other way to hide that panel.

The version of the environment I'm using is 8.0.8.4807

Thanks in advance for your help! 

Like 0

Like

2 comments
Best reply

Ryan Farley,

It worked, thank you very much!

Show all comments
Service_Creatio_enterprise_edition
8.0

Is there a way to deploy the security configuration for Organizational & Functional Roles from Development to Production?

Is some kind of binding needed?

Like 0

Like

2 comments
Best reply

Hello,

Thank you for your question. 

Please, note that it's not recommended to bind users, organizational structure, roles, licenses, and other administrative things to a package. It will be very hard to handle that if you decide to install that package after the moment when the client adjusts that administrative things according to his or her needs directly on the production.

Unfortunately, there is no script we could provide you with but in case you decide to bind this data and transfer it to another environment we suggest checking all changes on the copies before delivering it to the production websites. The organizational structure is in the "SysAdminUnit" and "SysAdminUnitInRole" tables and you are right, it's possible to bind it to the package via SQL scripts only.

Best regards,

Hello,

Thank you for your question. 

Please, note that it's not recommended to bind users, organizational structure, roles, licenses, and other administrative things to a package. It will be very hard to handle that if you decide to install that package after the moment when the client adjusts that administrative things according to his or her needs directly on the production.

Unfortunately, there is no script we could provide you with but in case you decide to bind this data and transfer it to another environment we suggest checking all changes on the copies before delivering it to the production websites. The organizational structure is in the "SysAdminUnit" and "SysAdminUnitInRole" tables and you are right, it's possible to bind it to the package via SQL scripts only.

Best regards,

Mykhailo Zeleniuk,

Thank you Mykhailo for the quick response.  Appreciate the callout of the risks.  Based on this, I see makes sense to stick with managing security configuration directly in Production.

Show all comments
client code
client_module
JS
Javascript
Service_Creatio_enterprise_edition

Hi Team,

We have an issue when installing packages in the production environment some js files (Client module) and business Rules are not updated with new fields.

we make an overwrite page and section file properly in the custom package but the issue is only in production can't see new fields and business Rules in page and in js file



also we perform a compile all & Generate for all schemas but still same issue

Like 1

Like

2 comments

Hello,



Could you please elaborate on the issue? 



Are transferring modifications between environments by packages? 

Is it working properly on the website where it was developed?

Bogdan,

Hi  Bogdan, Thanks for reply 

Yes transferring modifications between environments by packages and it is work successfully on my development environment

Show all comments
Service_Creatio_enterprise_edition
8.0

Hi all,

 

In Freedom UI (and possibly 7.x), you are unable to use the "open new record"  button from a record page of an object where the user only has read only access. To me this doesn't really make sense and I'm hopeful there is a way around it? 

 

For example, the user has read only access to "Account", but the user has write access to "Contact". On the Account page there is a list of contacts (detail) with the button to add new. 

 

The user has the permissions to add this contact, but the system says permissions do not exist to edit object "Account" - even though the user is not editing the object account - it is simply trying to open the new record page for Contact. 

 

Am I missing something here? 



Thanks!

Like 0

Like

2 comments

Hi Harry,

 

I wasn't able to reproduce the issue on the 8.0.7 version, therefore we recommend updating your application to the latest version.

Thanks Bogdan, yes it looks like it was a bug which is now fixed. 

Show all comments
Service_Creatio_enterprise_edition
8.0

Hi community,

 

How can I automatically change the status of a case after a customer response? 

Out of the box, when a customer responds to a case, the status is changed to Reopened. I want to move the case to my custom status. How can I achieve this?

 

BR Paulina

Like 0

Like

1 comments
Best reply

Good day,

 

Currently, there is some hardcoded logic in the processes that make the case reopen itself. If you are absolutely sure that you are comfortable with a little bit of code rewriting you can absolutely change reopen stage to a custom one.

 

I will leave a link to an article that mentions the processes that you will have to alter here.

Alternatively, you could just rename the stage and build upon it.

 

Thank you,

Good day,

 

Currently, there is some hardcoded logic in the processes that make the case reopen itself. If you are absolutely sure that you are comfortable with a little bit of code rewriting you can absolutely change reopen stage to a custom one.

 

I will leave a link to an article that mentions the processes that you will have to alter here.

Alternatively, you could just rename the stage and build upon it.

 

Thank you,

Show all comments
c#
backend
Service_Creatio_enterprise_edition
8.0

Hi guys,

I am working on a custom "ContactFieldConverter" [the thing that splits the Contact's FullName imported by excel/ webserveces etc] in order to split new contact's names into "GivenName" and "Surname", and preventing the OOTB function from filling in the "MiddleName" column.

In order to do so, I created a custom ContactGsFieldConverter in my package and inserted the value of the Separator and Converter in the Lookup "ShowNamesBy" and sysSetting "ContactFieldConverter".

[myContactGsFieldConverter code:]

 

 namespace Terrasoft.Configuration {
	using System;
	using System.Linq;
	using System.Text;
	using Terrasoft.Common;
	using Terrasoft.Configuration;
	 
	#region Class: myContactGsFieldConverter

	/// 
	/// Contact "Full name" field converter class.
	/// Separates "Full name" string using "Given name Surname" rule.
	/// 
	public class myContactGsFieldConverter : IContactFieldConverter
	{

		#region Properties: Public

		/// 
		/// Contact "Full name" separator characters array.
		/// 
		private char[] _separator = { ' ' };
		public char[] Separator {
			get {
				return _separator;
			}
			set {
				_separator = value;
			}
		}

		#endregion

		#region Methdos: Public

		/// 
		/// 
		/// 
		/// 
		/// After splitting  first element will be used as ,
		/// Everything else as .
		/// 
		ContactSgm IContactFieldConverter.GetContactSgm(string name) {
			var sgm = new ContactSgm();
			if (string.IsNullOrEmpty(name)) {
				return sgm;
			}
			
			var array = name.Split(Separator, StringSplitOptions.RemoveEmptyEntries);
			switch (array.Length) {
				case 0:
					return sgm;
				case 1:
					sgm.GivenName = array[0];
					break;
				case 2:
					sgm.GivenName = array[0];
					sgm.Surname = array[1];
					break;
				default:
					sgm.GivenName = array[0];
					StringBuilder sb = new StringBuilder();
					for (var i = 1; i <= array.Length - 1; i++) {
						sb.AppendFormat("{0} ", array[i]);
					}
					sgm.Surname = sb.ToString().Trim();
					break;
			}
			return sgm;
		}

		/// 
		/// 
		/// 
		/// 
		/// "Full name" string will be created using "Given name [Middle name] Surname" rule.
		/// 
		public string GetContactName(ContactSgm sgm) {
			var concatChar = Separator.FirstOrDefault();
			return new[] { sgm.GivenName, sgm.MiddleName, sgm.Surname }.ConcatIfNotEmpty(concatChar.ToString());
		}
		#endregion
	}
	#endregion	
}

The converter is not working. I tried to debug and noticed that my contact converter is returned as null to [this is a method in the Contact c# object]: 

public virtual void SetSgm(Contact contact) {
			if (contact == null) {
				return;
			}
			contact.FillSgmFields(GetContactConverter());
		}

Do you know if I need to do something specific in case of separate-assembly package?

ie: Using a different namespace for the converter/ setting the converter path in a different way within the system setting/ recreate the method on the Contact Object in my custom package.





Thank you in advance!

Like 1

Like

5 comments

Hello Federica,

 

I just completed the test - convertor works in the assembly package as well. The code (since we don't need middle name) was:

namespace Terrasoft.Configuration {
    using System;
    using System.Linq;
    using System.Text;
    using Terrasoft.Common;
    #region Class: UsrCustomContactFieldConverter
    /// <summary>
    /// Contact "Full name" field converter class.
    /// Separates "Full name" string using "Surname Given name" rule.
    /// </summary>
    public class UsrCustomContactFieldConverter : IContactFieldConverter
    {
        #region Properties: Public
        /// <summary>
        /// Contact "Full name" separator characters array.
        /// </summary>
        private char[] _separator = { ' ' };
        public char[] Separator {
            get {
                return _separator;
            }
            set {
                _separator = value;
            }
        }
        #endregion
        #region Methdos: Public
        /// <summary>
        /// <see cref="IContactFieldConverter.GetContactSgm"/>
        /// </summary>
        /// <remarks>
        /// After splitting <paramref name="name"/> first element will be used as <see cref="ContactSgm.Surname"/>,
        /// second element as <see cref="ContactSgm.GivenName"/>
        /// </remarks>
        ContactSgm IContactFieldConverter.GetContactSgm(string name) {
			var sgm = new ContactSgm();
			if (string.IsNullOrEmpty(name)) {
				return sgm;
			}
			var array = name.Split(Separator, StringSplitOptions.RemoveEmptyEntries);
			switch (array.Length) {
				case 0:
					return sgm;
				case 1:
					sgm.GivenName = array[0];
					break;
				default:
					sgm.GivenName = array[0];
					sgm.Surname = array[1];
					break;
			}
			return sgm;
		}
        /// <summary>
        /// <see cref="IContactFieldConverter.GetContactName"/>
        /// </summary>
        /// <remarks>
        /// "Full name" string will be created using "Surname Given name" rule.
        /// </remarks>
        public string GetContactName(ContactSgm sgm) {
            var concatChar = Separator.FirstOrDefault();
            return new[] { sgm.Surname, sgm.GivenName }.ConcatIfNotEmpty(concatChar.ToString());
        }
        #endregion
    }
    #endregion
     
}

and then this convertor was registered in the database (ShowNamesBy table). As a result newly created contacts where full name is Test 1 2 had the first (Test) and last (1) name only while middle name was skipped.

Hi Oleg Drobina,

Could you share with me the record registered in the database table ShowNamesBy for a separate assembly pkg?

Hence, in case the site receives a Contact "Name": "Federica Rose Cattani" I don't want to "lose" the "MiddleName" but I want it to be concat to the "Surname". That's what I did in the converter shared. 

Federica,

 

Hi,

 

Sorry, I guess I was wrong with the package. Tested the same approach today and it didn't work until I unchecked the "Compile into separate assembly" checkbox in the package settings. So in your case you need to also do the same to make the converter work.

 

The insert was:

INSERT INTO ShowNamesBy (Name, Separator, Converter) VALUES (N'UsrCustomContactFieldConverter', N' .,;', N'Terrasoft.Configuration.UsrCustomContactFieldConverter');

 

Oleg Drobina,

Ok! In my case I can't "undo" the separate assembly since it contains customer's implementation and separate assembly it's way faster to compile.

The actual possible workaround would be to implement a second package without separate assembly containing only the custom ContactGsFieldConverter, am I correct?

Hello, some conclusion regarding this, in Spain we have the same problem with names than in Italy

Show all comments