Hi team,

 

I have made some fields read-only when I am creating the fields on the edit page. When I use the Open Edit Page element and try to add some values to other fields, the read-only fields also change as editable fields. I wanted to keep my read-only fields always not editable. How to resolve this issue.

 

Currency is Read-Only field as shown below

Its editable in Open-Edit-Page

Like 0

Like

1 comments

Hello,



Normally, Section wizard reflects the content from all the schemas up to the package indicated in the "Current package" setting.

However, UI reflects the content and logic from all the schemas of all the packages.

"Custom" package is dependent on all packages of the application (and should be the last one in the hierarchy), all columns are the same and are visible both on UI and in Section wizard once it's set as the current package.



I would suggest you check the "Current package" setting and parameters of column "Currency" on the pages in each package in the hierarchy.



Kind regards,

Alona

Show all comments
Studio_Creatio
7.18

Greetings Community,

I need the options to Approve, Reject and Change Approver in the Approval tab only to be enabled for the assigned approver and not for any one else currently all users are able to approve or reject the approval.

PFA Screen shot for reference



 

Like 0

Like

4 comments

Hello,

 

To solve your business task you can set up Approvals for the section.

The following instructions can help you to achieve the result you are looking for: https://academy.creatio.com/docs/user/platform_basics/communications/approvals_shortcut/approvals

 

Approvals can be managed (approved or rejected):

  • By a specific employee, for example, a department manager.

  • By an employee of the specific role (user group), such as “Finance department,” “Administration,” etc.

Kalymbet Anastasia,

Hi,

I have already configured the approvals as mentioned in the article but the issue is currently all the users in the system  are able to approve/reject the approval.

I need  the approval to be rejected/approved only by the user assigned as approver.

Janhavi Tanna,

You can create a specific role, and allow users of this role to change records of this object.

So, only specific users will be able to edit approvals, while the other users will be able only to read those records.

Best regards, Alex.

Greetings,



Such setup can be achieved by creating a functional role for the desired actions in your system.

You can find more on our Academy page here:

https://academy.creatio.com/docs/user/setup_and_administration/user_and…

Show all comments
Studio_Creatio
7.18

Hi,

I designed a business process that sends an email and creates a task.

Many outgoing emails appear on the communication panel to be processed.

Is it possible to mark all these emails as processed automatically ?

Like 0

Like

4 comments

Hello Stefano,

 

Thank you for your question!

 

The process on the screenshot will mark all emails in your system as processed once it is started:



Image.png



You can add more filter conditions in order to mark only specific emails as processed.



Else, you can achieve the same result with the SQL query if you have access to the SQL console or the database.

You will need to change the value of the IsNeedProcess column of the EmailMessage table:

 

update "EmailMessageData" set "IsNeedProcess" = false 

update "Activity" set "IsNeedProcess" = false where "TypeId" = 'e2831dec-cfc0-df11-b00f-001d60e938c6' --Type Id stands for Email

 

Best regards,

Anastasiia

Hi Anastasiia

thank you for your response.

I can see the screenshot you have attached

Stefano Bassoli,

 

Just in case - attaching the screenshot once again.

 

Stefano Bassoli,

Ah, ok

thank you very much

Show all comments
web service
json
jsonpath
API
Studio_Creatio
7.18

Good day community,

 

I'm having trouble with adding the correct JSON path for my request body.

 

I have to send a POST request with the following JSON below:

{
  "members": [
    {
      "@odata.type": "--TYPE HERE--",
      "user@odata.bind": "--USER 1 HERE--"
    },
    {
      "@odata.type": "--TYPE HERE--",
      "user@odata.bind": "--USER 2 HERE--"
    }
  ]
}

This is how my parameter structure looks:

Generated JSON here:

{
	"chatType": "oneOnOne",
	"members": [
		{
			"@odata": {
				"type": "--TYPE HERE--"
			},
			"user@odata": {
				"bind": "--USER 1 HERE--"
			}
		}
	]
}

The problem with this structure is that it generates a nested key for type under @odata, and for bind as well. I don't wan't this to happen if possible.

 

Is there any way to get this to work using parameters in web service? Or would my only resort be to generate the request body via script?

Like 0

Like

2 comments

Hello,

 

The body of the webservice seems to be generated properly since "members" is the array of objects "@odata" and "user@odata". The request was properly parsed and that's why you saw the result as on the screenshot. If this structure won't work in your business case then a separate script task should be created to sent the request.

 

Best regards,

Oscar 

Hi Oscar,

 

Thank you for you response.

 

In forming the json path, I would have made it as $.[members]["@odata.dataType"] or $.[members]["user@odata.bind"], but I'm guessing that this is not possible using the built-in function (nesting parameters) in Creatio?

 

I think I'll instead be resorting to creating a script task for this.

 

Thank you!

 

Lyle

Show all comments

Hi Creatio Community

I am trying to access a detail inside of a detail on Customer Portal, but I am getting the attached errors in Console. I am neither able to create a new record nor open an existing record.

 

I have added the detail object in the "List of objects available for portal users" lookup but still unable to get inside that detail on Customer Portal.

 

Thanks.

Like 0

Like

1 comments

Hello Nisarg,

 

Thank you for your question. I am afraid it is not possible to investigate this issue without direct access. Please create a request by writing to support@creatio.com and provide us with external access. We will be glad to help you as soon as we are able to inspect the issue within the recreation and check the whole system, as there might be several breakpoints that might be the reason for this behaviour. 

Will be looking forward to your soonest request! 

 

Best Regards,

Dan

Show all comments
Studio_Creatio
7.18

Greetings!

I want to show only the contacts that are assigned to a specific role in a contact lookup field for selection.

Like 0

Like

2 comments

Hello,

Such functionality cannot be achieved with a help of basic system tools, but will require development. 

We do not have specific ready to use examples of such implementation from our side but you can refer to the below article on our academy:

https://academy.creatio.com/documents/technic-sdk/7-13/using-filtration…

Also, I would like to suggest to check similar questions on the Community, such as the below posts:

https://community.creatio.com/questions/how-filter-contact-lookup-show-…

https://community.creatio.com/questions/role-base-filtration-contacts-l…

https://community.creatio.com/questions/role-based-filtration

Best regards,

Anastasiia

Hello Janhavi,

I have an article on this exact topic. See

https://customerfx.com/article/filtering-a-contact-lookup-to-only-displ…

Ryan

Show all comments
Studio_Creatio
7.18

Hi Team,

 

Currently in Creatio in Order to create the system user with correct roles there is two step process : 

1. Create the Contact

2. Create the System user and assign the role

 

Is there any possibility that we can make it a one step process because for our customers the system is new and they want it to be a one step process.

 

Is it possible to make it a one step process ? Any custom solution ? Does LDAP Synchronization provide any help in this matter? 

 

Regards !

 

 

 

Like 0

Like

1 comments

Hello, 



Due to system logic there is no tool which would allow to simplify the user creation inside of Creatio. 

However, you can import and sync your users with LDAP:

https://academy.creatio.com/docs/user/setup_and_administration/user_and…

Or if you use SSO, you can set up JIT provisioning:

https://academy.creatio.com/docs/user/setup_and_administration/user_and…



If none of the proposed options are suitable for you you still can import contacts with an excel and create system users after that in order to simplify task a bit. 



Kind regards,

Roman

Show all comments
#Printable
Studio_Creatio
7.18

Hi Team,

 

I was implementing a print report on a section. Now, I want to download the report in (ColumnName).docx in which ColumnName varies for each record based on the data stored in that column. By default, it is giving the same name as the printable name for all the records. Please help

Like 1

Like

1 comments

Hello, 

 

As for now there is no option to change the file name dynamically or assign some particular name. We have this task registered in our backlog and waiting for this option to be available in future application versions.

 

I will assign your case to this project in order to increase its priority.

Best regards,

Anastasiia

Show all comments
Validation
Studio_Creatio
7.18

Hello Community,

 

I have a requirement, when a user changes the DCM status manually validation should trigger. To achieve this I am using asynValidate function and the validation is working fine.

But the issue here is status is not restoring back automatically and also both Save and Cancel button is showing as a result when I am trying to create a record in the connected detail the validation is triggering again. I have to manually click on Cancel before I can do any changes in the details. Please refer the screenshot below.

Before validation:

After validation:

 

Is there anyway after validation it should reset back to Close like in the 1st image?

 

Thanks,

Sourav Kumar Samal

Like 0

Like

4 comments
Best reply

Anastasiia Zhuravel,

 

I have resolved the issue. To acheive the desired output I have added a small line after the error message as follows:

			MandatoryValidation: function(callback, scope){
				var DCMstatus = this.get("MarketingPlansStatus").displayValue;
				if(DCMstatus === "Business Owner Review"){
					// Some query
                                        callback.call(scope || this, {
						success: false,
                                                message: "Error message"
					});
                                        this.reloadEntity();
				}else{
					callback.call(scope || this, {
						success: true
					});
				}
			},

Note: If the asynValidate is being used in this.NewMode(), avoid adding this.reloadEntity() as this may clear all the fields.

 

Thanks,

Sourav Kumar Samal

Hello, 

 

Could you please clarify how exactly the manually validation functionality has been achieved? Was it done by code?

 

Thank you in advance!

Best regards,

Anastasiia

Anastasiia Zhuravel,

 

Yes it has been achieved by using 'asyncValidate' function. The validation will only trigger when DCM status changed to "Business Owner Review".

 

Thanks,

Sourav

Anastasiia Zhuravel,

			asyncValidate: function(callback, scope) {
				if (this.isEditMode()){
					this.callParent([function(response) {
						if (!this.validateResponse(response)) {
							return;
						}
						Terrasoft.chain(
							function(next) {
								this.MandatoryValidation(function(response) {
									if (this.validateResponse(response)) {
										next();
									}
								}, this);
							},
							function(next) {
								callback.call(scope, response);
								next();
							}, this);
					}, this]);
				}else {
					this.callParent(arguments);
				}
			},
			MandatoryValidation: function(callback, scope){
				var DCMstatus = this.get("MarketingPlansStatus").displayValue;
				if(DCMstatus === "Business Owner Review"){
					// Some query
                                        callback.call(scope || this, {
						success: false,
                                                message: "Error message"
					});
				}else{
					callback.call(scope || this, {
						success: true
					});
				}
			},

 

Anastasiia Zhuravel,

 

I have resolved the issue. To acheive the desired output I have added a small line after the error message as follows:

			MandatoryValidation: function(callback, scope){
				var DCMstatus = this.get("MarketingPlansStatus").displayValue;
				if(DCMstatus === "Business Owner Review"){
					// Some query
                                        callback.call(scope || this, {
						success: false,
                                                message: "Error message"
					});
                                        this.reloadEntity();
				}else{
					callback.call(scope || this, {
						success: true
					});
				}
			},

Note: If the asynValidate is being used in this.NewMode(), avoid adding this.reloadEntity() as this may clear all the fields.

 

Thanks,

Sourav Kumar Samal

Show all comments
web service
Business Process
Studio_Creatio
7.18

Hello Creatio community !

I would like to call the Creatio Webservice ..../0/rest/FinAppSpecService/InheritSpecificationsForFinApp  which automatically populates the Product Terms in Application, inside a Business Process. I can not call it in a c# class because the the constructor of FinAppSpecService class does not accept UserConnection as e parameter. Which is the proper way to solve this problem ?

Like 1

Like

11 comments
Best reply

Hello Petrika,

 

It's possible if you create a webservice record where the POST method complete address will be {siteURL}/0/rest/FinAppSpecService/InheritSpecificationsForFinApp and in the request parameters specify the following header parameters:

 

BPMCSRF

ForceUseSession (default value set to true)

Connection (default value set to true)

 

and the following cookies parameters:

 

BPMSESSIONID

UserName

BPMLOADER

BPMCSRF

.ASPXAUTH

 

in the webservice settings (since the FinAppSpecService service is not anonymous). The most difficult part here is setting cookies parameters. I could only recommend the following scenario here:

 

1) Create a separate authentication service webservice request (to {siteURL}/ServiceModel/AuthService.svc/Login)

2) Specify UserName and UserPassword request body parameters:

3) Add the Set-Cookie response header parameter:

4) Validate the response by performing a test call. It should return the Set-Cookie header that will be then used in the process:

5) Create a separate business process and configure it to run once per hour or once per half a day (depending on the value of the "UserSessionTimeout" system setting). The set-Cookie response header should be parsed to extract values for the

 

BPMSESSIONID

UserName

BPMLOADER

BPMCSRF

.ASPXAUTH

 

headers. It can be done by means of the script-task. Extracted values should be set as values for the system settings created separately (one per each header).

 

6) In your process where you need to call the FinAppSpecService in the "Call webservice" element set the values for the cookie parameters as values from the system settings from step 5. And also specify the value for the BPMCSRF header parameter.

 

7) Add all other request body parameters and call the service.

 

This approach should work since we simulate the Postman call of the same service, but set cookie parameters and header parameters via the separate business process and system settings.

 

Best regards,

Oscar

Hello Petrika,

 

It's possible if you create a webservice record where the POST method complete address will be {siteURL}/0/rest/FinAppSpecService/InheritSpecificationsForFinApp and in the request parameters specify the following header parameters:

 

BPMCSRF

ForceUseSession (default value set to true)

Connection (default value set to true)

 

and the following cookies parameters:

 

BPMSESSIONID

UserName

BPMLOADER

BPMCSRF

.ASPXAUTH

 

in the webservice settings (since the FinAppSpecService service is not anonymous). The most difficult part here is setting cookies parameters. I could only recommend the following scenario here:

 

1) Create a separate authentication service webservice request (to {siteURL}/ServiceModel/AuthService.svc/Login)

2) Specify UserName and UserPassword request body parameters:

3) Add the Set-Cookie response header parameter:

4) Validate the response by performing a test call. It should return the Set-Cookie header that will be then used in the process:

5) Create a separate business process and configure it to run once per hour or once per half a day (depending on the value of the "UserSessionTimeout" system setting). The set-Cookie response header should be parsed to extract values for the

 

BPMSESSIONID

UserName

BPMLOADER

BPMCSRF

.ASPXAUTH

 

headers. It can be done by means of the script-task. Extracted values should be set as values for the system settings created separately (one per each header).

 

6) In your process where you need to call the FinAppSpecService in the "Call webservice" element set the values for the cookie parameters as values from the system settings from step 5. And also specify the value for the BPMCSRF header parameter.

 

7) Add all other request body parameters and call the service.

 

This approach should work since we simulate the Postman call of the same service, but set cookie parameters and header parameters via the separate business process and system settings.

 

Best regards,

Oscar

Thank you very much for you response Oscar. It was very helpful.

Is there any article or example in the academy regarding point 5, parsing set-Cookie response header to extract values (inside a script task) ?

Petrika,

 

This is the task that should be covered by the C# code, using substring method for example. It's something as if you had a task to substring the "test" word from the "Hello test wordl!" string. Please find the way using the topics as the following:

 

https://stackoverflow.com/questions/9505400/extract-part-of-a-string-be…

 

Please also notice that the cookies values length is always constant and all of them start with the cookie name and the "=" character and end with the ";" symbol. This shouldn't be a difficult task.

 

Once string parts are extracted you can set them as parameter values (here is the Academy article that may be useful) and use these parameters in formulas to set parameter values to correspondent system settings.

 

Best regards,

Oscar

Oscar Dylan,

BPMSESSIONID is generated in the set-Cookie response header, because it seems that it's not found there ? I managed to extract everything else as required

Petrika,

 

Sorry, made a little mistake. BPMSESSIONID cookie is not returned as a response to the /AuthService.svc/Login call, but as a result of the first call to any other working endpoint like /0/odata/Account after authentication. Just try it in Postman and check the response headers in the next request that goes after AuthService request.

 

Best regards,

Oscar

Oscar ,

When i make a request from postman to another web-service the BPMSessionId is generated, I tested it.

Are you suggesting that i put the BPMSESSIONID as a reponse parameter to the InheritSpecificationsForFinApp, not as a request parameter ?

If i understand correctly.

 

Petrika,

If you're calling a configuration service, there's no need to actually use it as a service. It's simply a C# class that you can use directly.

For example, something like this: 

var svc = new Terrasoft.Configuration.FinAppSpecService();
svc.InheritSpecificationsForFinApp()

Depending on how the configuration service is implemented, you might need to also pass a UserConnection to it, which means you'd need to modify the service to allow this to be passed in.

You had mentioned: "I can not call it in a c# class because the the constructor of FinAppSpecService class does not accept UserConnection as e parameter. Which is the proper way to solve this problem?"

Why not just add two constructors to the class? One that is the default constructor and one that accepts a UserConnection? In the class you could add a method that either returns your private UserConnection variable (passed in by code consuming the class directly) or the one from the session (or BaseService) if being used as a service. I do it this way often and it is far more easy to consume the class directly than to call as a service when it's not needed to be used as a service (not to mention the extra overhead of using it as a service rather than consuming it directly)

Ryan

Ryan Farley,

 

FinAppSpecService() class constructor doesnt allow UserConnection as an argument. I can not modify the FinAppSpecService class because its part of the configuration. 

 

Ryan Farley,

Are you suggesting that i copy the 

FinAppSpecService  class to my package and make proper modifications to it ?

Petrika,

I was assuming this was your class, that you could modify, not a configuration one that was uneditable by you. 

I assume that FinAppSpecService inherits BaseService? If so, it has a UserConnection property that is protected (that does have a setter) as well as a protected constructor that accepts a UserConnection. Since they are protected you should be able to access them if your class is derived from it. 

it might work to just make a new class that inherits from the FinAppSpecService that allows a UserConnection to be passed? I've not tried that but it might work - just to throw out some ideas.

Something like this: 

public class UsrFinAppSpecServiceWrapper : FinAppSpecService
{
    public void SetUserConnection(UserConnection)
    {
        this.UserConnection = UserConnection;
    }
}

Then to use it:

var svc = new Terrasoft.Configuration.UsrFinAppSpecServiceWrapper();
svc.SetUserConnection(UserConnection);
svc.InheritSpecificationsForFinApp();

Again, I've not tested/tried that before, but I would assume something like this could work? If it does, still far easier route than calling it as a service IMO.

Ryan

Ryan Farley,

Ryan the response i get from the back-end 

is the same as the reponse i get from the front-end 

Still When i call this web-service from the back-end my goal isnt achieved. As you can see the detail of product terms isnt automaticalluy generated

Dont know if am missing something here

Thank you Petrika

Show all comments