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

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

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

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

Hi Community,

 

We have two different status in a section. One on the section UI (Reservation Status) and other one is DCM status. Our requirement here is, when the DCM status changes it will also change the Reservation Status.

 

To achieve this we have added one attribute and method on the page schema.

Attribute:

attributes: {
	"UsrMarketingPlansStatus": {
		dependencies: [{
			columns: ["UsrMarketingPlansStatus"], //field to trigger change event for
			methodName: "changeHeaderUserStatusBasedOnDCM" //method to execute
		}]
	},
},

Method:

methods: {
			changeHeaderUserStatusBasedOnDCM: function(){
				var DCMStatus = this.get("UsrMarketingPlansStatus").displayValue;
				console.log("DCMStatus: ", DCMStatus);
				if (DCMStatus === "Business Owner Review 1" || DCMStatus === "Business Owner Review 2" || DCMStatus === "Business Owner Review 3"){
					this.set("UsrReservationStatus", {value: "b438b32a-9f74-47fc-9266-69b148a50c21", displayValue: "Submitted"});
				}
				else if (DCMStatus === "Cancelled"){
					this.set("UsrReservationStatus", {value: "164d071e-180d-467b-bfc8-18e3818f4698", displayValue: "Cancelled"});
				}
 
				else if (DCMStatus === "Closed"){
					this.set("UsrReservationStatus", {value: "e6296483-82c1-4ecf-a2af-049fa376438e", displayValue: "Closed"});
					this.set("UsrUserStatus", {value: "6566728f-4157-4bf1-9f8d-61f043181379", displayValue: "Completed"});
				}
 
				else if (DCMStatus === "On Hold"){
					this.set("UsrReservationStatus", {value: "bcc1fc18-05c0-469a-a4bc-d65366c16cf1", displayValue: "More Info Required"});
				}
				else{
					this.set("UsrReservationStatus", {value: this.get("UsrReservationStatus").value, displayValue: this.get("UsrReservationStatus").displayValue});
				}
			},
}

The issue here is, when the user manually changes the DCM status, the Reservation status is getting changed automatically. But when the DCM status changes automatically (after activity completion/approval on DCM stage), the Reservation status is not changing automatically.

Need a suggestion how we can resolve the issue (Not via Business process).

 

Thanks,

Sourav Kumar Samal

Like 0

Like

1 comments
Best reply

Since the automatic changing of the DCM status happens outside of the context of the page, you won't receive any event in the page code for this. The only options are to either use a process or an entity-level subprocess/event. 

Ryan

Since the automatic changing of the DCM status happens outside of the context of the page, you won't receive any event in the page code for this. The only options are to either use a process or an entity-level subprocess/event. 

Ryan

Show all comments

Hi Community,

 

I have created one Process parameter of type "FILE" as follows:

I am trying to assign the value in a script task. The script task contains the following code:

var recordId = Get<Guid>("FileID");
 
IFileFactory fileFactory = UserConnection.GetFileFactory();
var fileLocator = new EntityFileLocator("ContactFile", recordId);
IFile file = fileFactory.Get(fileLocator);
 
Set("FILE",file);
 
return true;

After running the process I am getting the following error,

Request a help here to understand what am I doing wrong.

 

Thanks,

Sourav Kumar Samal

Like 0

Like

4 comments
Best reply

Hi Sourav,

 

The problem here is that this parameter stores not the file itself, but the file locator. If you redesign the code as:

var recordId = Get&lt;Guid&gt;("FileID");
IFileFactory fileFactory = UserConnection.GetFileFactory();
var fileLocator = new EntityFileLocator("ContactFile", recordId);
Set("FILE", fileLocator );
return true;

the process will be executed properly.

 

Best regards,

Oscar

Hi Sourav,

 

The problem here is that this parameter stores not the file itself, but the file locator. If you redesign the code as:

var recordId = Get&lt;Guid&gt;("FileID");
IFileFactory fileFactory = UserConnection.GetFileFactory();
var fileLocator = new EntityFileLocator("ContactFile", recordId);
Set("FILE", fileLocator );
return true;

the process will be executed properly.

 

Best regards,

Oscar

Oscar Dylan,

Thanks for the Input, It is working now

Sourav Kumar Samal,

 



How did you add the Using for IFileFactory and GetFileFactory?



Regards,

Solem.

Solem Khan Abdusalam,

 

You can add the using under "Methods" tab of process settings as follows,

 

 

Thanks,

Sourav

Show all comments

Hi Community,

I need to skip the mini-page which comes when we click "complete" on any user task in a DCM.As soon as the complete button is clicked the user task should be marked complete. Is there any way or examples to do so.

Thanks 

Like 0

Like

8 comments

Hello,

 

The method that is being called when clicking the complete button in the user-task is "execute" from the "ActivityDashboardItemViewModel" module. It checks if the item that needs to be completed has the mini-page or if it's an email activity or a process activity and then executes its logic. If none of the conditions are met the "execute" method from the "EntityDashboardItemViewModel" is called (parentMethod for the "execute" method in the "ActivityDashboardItemViewModel"). So in case you need to autocomplete the task you need to override the logic of this "execute" method (and unfortunately we don't have a specific example on this matter).

 

Best regards,

Oscar

Oleg Drobina,

 

It seems we can not create the replacing schema for EntityDashboardItemViewModel or ActivityDashboardItemViewModel. Is there any suggestion where we can override the 'execute' method to add the custom logic?

 

Regards,

Sourav

Sourav Kumar Samal,

 

Actually there is a possibility to override this logic:

 

1) Create the module with UsrActivityDashboardItemViewModel name and the following code (copied the original code from the ActivityDashboardItemViewModel):

define("UsrActivityDashboardItemViewModel", ["UsrActivityDashboardItemViewModelResources", "ProcessModuleUtilities",
		"ConfigurationConstants", "EntityDashboardItemViewModel", "MiniPageUtilities"],
	function(resources, ProcessModuleUtilities, ConfigurationConstants) {
		Ext.define("Terrasoft.configuration.UsrActivityDashboardItemViewModel", {
			extend: "Terrasoft.EntityDashboardItemViewModel",
			alternateClassName: "Terrasoft.UsrActivityDashboardItemViewModel",
 
			Ext: null,
			sandbox: null,
			Terrasoft: null,
 
			columns: {
				/**
				 * Process element identifier.
				 */
				"ProcessElementId": {
					type: Terrasoft.ViewModelColumnType.ENTITY_COLUMN,
					dataValueType: Terrasoft.DataValueType.STRING
				},
				/**
				 * Indicates if button "Execute" was clicked.
				 */
				"ExecuteButtonClick": {
					type: Terrasoft.ViewModelColumnType.ENTITY_COLUMN,
					dataValueType: Terrasoft.DataValueType.BOOLEAN
				}
			},
 
			/**
			 * @inheritdoc Terrasoft.BaseDashboardItemViewModel#initIconSrc
			 * @overridden
			 */
			initIconSrc: function() {
				var iconSrc = resources.localizableImages.IconImage;
				this.set("IconSrc", iconSrc);
			},
 
			/**
			 * @inheritdoc Terrasoft.EntityDashboardItemViewModel#addQueryColumns
			 * @overridden
			 */
			addQueryColumns: function(esq) {
				this.callParent(arguments);
				esq.addColumn("Title", "Caption");
				esq.addColumn("Type");
				esq.addColumn("StartDate", "Date");
				esq.addColumn("Owner.Name", "Owner");
				esq.addColumn("ProcessElementId");
			},
 
			/**
			 * @inheritdoc Terrasoft.BaseDashboardItemViewModel#getProcessElementUId
			 * @overridden
			 */
			getProcessElementUId: function() {
				return this.get("ProcessElementId");
			},
 
			/**
			 * @inheritdoc Terrasoft.BaseDashboardItemViewModel#execute
			 * @overridden
			 */
			execute: function(options) {
				console.log("test");
				var schemaName = this.get("EntitySchemaName");
				var hasMiniPage;
				const parentMethodArguments = arguments;
				const parentMethod = this.getParentMethod();
				Terrasoft.chain(
					function(next) {
						this.showBodyMask();
						if (Terrasoft.Features.getIsEnabled("OpenEditPageInDcm")) {
							this.hasMiniPageForMode(schemaName, Terrasoft.ConfigurationEnums.CardOperation.VIEW, next, this);
							return;
						}
						hasMiniPage = this.hasMiniPage(schemaName);
						next(hasMiniPage);
					},
					function(next, hasMiniPage) {
						this.hideBodyMask();
						if (!this._isEmailActivity() &amp;&amp; this.isActivity() &amp;&amp; hasMiniPage) {
							this.showMiniPage(options);
							return;
						}
						var elementUId = this.get("ProcessElementId");
						var recordId = this.get("Id");
						var config = {
							procElUId: elementUId,
							recordId: recordId,
							scope: this,
							parentMethodArguments: parentMethodArguments,
							parentMethod: parentMethod
						};
						if (ProcessModuleUtilities.tryShowProcessCard.call(this, config)) {
							return;
						}
						parentMethod.call(this, parentMethodArguments);
					},
					this
				);
 
 
			},
 
			/**
			 * Returns true if it is task activity entity.
			 * @private
			 * @return {Boolean} True if it is task activity entity.
			 */
			isActivity: function() {
				var executionData = this.get("ExecutionData");
				var schemaName = this.get("EntitySchemaName");
				return this.Ext.isEmpty(executionData) ||
					(executionData &amp;&amp; schemaName === executionData.entitySchemaName);
			},
 
			////TODO #CRM-33987
			/**
			 * Returns if current activity is email.
			 * @returns {Boolean} Returns if current activity is email.
			 */
			_isEmailActivity: function() {
				var activityTypes = ConfigurationConstants.Activity.Type;
				var typeLookup = this.get("Type");
				return typeLookup.value === activityTypes.Email;
			},
 
			/**
			 * @inheritdoc Terrasoft.BaseDashboardItemViewModel#onExecuteButtonClick
			 * @overridden
			 */
			onExecuteButtonClick: function() {
				this.set("ExecuteButtonClick", true);
				this.callParent(arguments);
			},
 
			/**
			 * @inheritdoc Terrasoft.BaseDashboardItemViewModel#onCaptionClick
			 * @overridden
			 */
			onCaptionClick: function() {
				this.set("ExecuteButtonClick", false);
				this.callParent(arguments);
			},
 
			/**
			 * @inheritdoc Terrasoft.MiniPageUtilities#openMiniPage
			 * @overridden
			 */
			openMiniPage: function(config) {
				if (this.get("ExecuteButtonClick")) {
					var status = {
						name: "ActivityMiniPageStatus",
						value: "Done"
					};
					if (config &amp;&amp; this.Ext.isArray(config.valuePairs)) {
						config.valuePairs.push(status);
					} else {
						config.valuePairs = [status];
					}
				}
				this.callParent(arguments);
			}
		});
	});

the only modification was console.log("test") to check the override.

 

2) Create a replacing view module for the SectionActionsDashboard with the following code:

 define("SectionActionsDashboard", ["UsrActivityDashboardItemViewModel"],
	function() {
		return {
			mixins: {},
			methods: {
				initDashboardConfig: function() {
					this.callParent(arguments);
					const dashboardConfig = this.$DashboardConfig;
					const activityItemsConfig = {
						"Activity": {
							viewModelClassName: "Terrasoft.UsrActivityDashboardItemViewModel"
						}
					};
					Ext.merge(dashboardConfig, activityItemsConfig);
					this.$DashboardConfig = dashboardConfig;
				},
			},
			diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
		};
	}
);
 

3) Refresh the page after saving these two modules.

 

As a result you can modify the "execute" method logic in the UsrActivityDashboardItemViewModel module.

Oleg Drobina,

 

I have tried the exact same steps, but getting the below error,

 

 

 

Is there anything I missed?

 

Regards,

Sourav Kumar Samal

Sourav Kumar Samal,

 

the same approach on my side doesn't return an error. You need to double-check all the code and that it has the same content as mine shared above.

Oleg Drobina,

 

I tried in a different instance, the error didn't come. But when I click on "Complete", it refers to the ActivityDashboardItemViewModel in stead of SKSActivityDashboardItemViewModel.

 

 

Also, I can see initDashboardConfig referencing to the correct schema, but still execute method is not,

 

 

Regards,

Sourav

Sourav Kumar Samal,

 

Hi, did you mange to solve this issue? 

Thanks in advance for your reply.

Kind regards,

Marijana

Oleg Drobina,

How can I do this in FreedomUI?

Show all comments

Hi community

 

I tried to customize the edit page actions following this article Add an action to the record page | Creatio Academy.

t the bindTo for caption, enable and tag property doesn't work

What Am I doing wrong ?

 

Like 0

Like

2 comments

Hi Stefano,

 

Most probably, the issue happens because you d didn’t add the code to this schema that checks if these actions are enabled. 

 

There are actually two places you need to add this. Once to the section page and once to the edit page for the section. An edit page can be seen in two different modes, (1) edit mode (where you're only displaying the edit page, this is what you're getting when you refresh the page while in edit mode) and (2) combined mode, this is actually the section page, where it displays the context of the section list you were on with the edit page on the side. 

With this in mind, you need to add the action menu in both the edit page and the section page for it to appear in both modes.



Best regards,

Bogdan

Thank you Bogdan,

I solved with your help.

Show all comments

Hello, how can i hide these two inputs in the minipage?

Like 0

Like

2 comments

Hello,

 

The method you've used is correct and in case the column is not removed from the minipage using this code after the page was refreshed it means that either these columns have a different name or the incorrect parent module was selected when replacing the module.

 

Best regards,

Oscar

Hi,

 

there is a syntax error: there should not be a comma at the end of the row with the "name" property (lines 9 and 13)

 

BR,

Robert

Show all comments

Hi Community,

I have a requirement that when I change the case manually from New to PO Issued, it need to check whether the amount in Include Tax from Amount details and the sum of all the Amount from RR Allocation Table is Equal or not. If not equal then a Pop-up will come and the stage change back to previous one.

Can anyone help me how to configure the requirement in the backend ?

 

 

Regards,

Jagan

Like 0

Like

3 comments

Hello Jagan,

 

I am afraid there is no ready OOTB logic to perform checks when changing the stage, as well as there, are no OOTB pop-up windows, but there is a work-around:

 

To have a pop-up windows element in business processes you will need the following marketplace solution: 

https://marketplace.creatio.com/template/popup-element-business-process…

 

You will need to create a Business Process that will be triggered as the stage is changed and check whether the values are equal. In case they are not - show the pop-up window and return the case to the previous stage. Should the values be fine - the Business Process won't change anything.

 

I hope our recommendation helps you to solve this task.

 

Best Regards,

Dan

Denis Bidukha,

Hello Dan,

I have created a business process for the requirement but sometimes the pop-up window is coming and sometimes it is not coming. So I want to achieve it through code in the backend.

 

Thanks,

Jagan

Jagan Nayak,

 

Alternatively, you can add an asyncValidate method to your page and it will be called on the save of the page. 

Basically, you need to create a validation method, that returns 

result = {
success : true
 } 

if the validation was successful, otherwise it should return 

result = { 
success : false 
 }

Inside the validation method, if the validation is not passed, you can call 

Terrasoft.showInformation(message); 

for example: 

Terrasoft.showInformation('Amount A is not equal to Amount B '); 

and then call your validation method  inside asyncValidate method. 

 

You can read more about the validation here : 

https://academy.creatio.com/docs/developer/getting_started/develop_appl…

and more on asyncValidate here :

https://community.creatio.com/questions/lead-status-validation-0



Best regards,

Yurii. 

Show all comments