Hi Community,

Scenario : For the approval action in the record page under case flow, it appears/ disappears on mouse hover the "approve", "reject" and "change approver" button

Question: Is there a option to have them fixed in the screen instead of mouse hover, so that the user can know that there is option to approve if they dont understand that they need to mouse hover on the screen to get the option 

Like 1

Like

1 comments

Hello Amritha,

 

The schema name that is to be modified is called ActionsDashboardItemContainer. Unfortunately, I was not able to find any examples of code that can change that functionality,

 

Best regards,

Bogdan

Show all comments

Hi

We are trying to implement CI CD in our Creatio dev project where we have the created project package mapped to the git version control.

When we try to build the exported package alone, before deploying them to another environment, we are getting dependency errors.

Is there a way to build an installable package file from source code of the creatio application without a need for a Creatio instance?

 

Appreciate any help/suggestion on this.

 

Thanks

Abinaya

Like 0

Like

1 comments

Hello,

 

Please check this Marketplace application. It can help you to generate packages from the file system.

 

Please let us know if it helps!

 

Best regards,

Bogdan S.

Show all comments
Email
Email_attachements
Studio_Creatio

Is it possible to auto trigger an email with an attachment? 

Like 0

Like

1 comments

Hello Nicola,

 

Please check this Marketplace solution. I believe it has the exact functionality you are looking for.

 

Best regards,

Bogdan S.

Show all comments
Mobile app
offline
lookup
7.16
Studio_Creatio

Hello,

 

How can cache the lookups to the device in order to view them in offline mode for mobile app?

 

Thank you.

Maher.

Like 0

Like

3 comments

Hello Maher,

 

Once you sync the mobile app with the main app all lookup values are being saved in the cache of the mobile app and will be available for selection in offline mode. In case you've added new lookup values to the main app and need them to appear in the mobile app please sync the mobile app with the main app and new values will appear as needed.

 

Best regards,

Oscar

Oscar Dylan,

Hello Oscar,

 

Thank you for the reply.

I am not able to see the list of values in offline mode for some reason, are there any steps to do or configurations?

I did synchronize before disconnecting from the network.

 

Maher.

maher daher, maybe our steps to reproduce the behavior are different. Can you please specify the value for the system setting with the "MobileApplicationMode" code (try setting the value as "Offline")? Have I understood you right that you perform synchronization, then disconnect your device from the network and then try to edit the record, select the lookup, but you don't have any values there? Is this a custom lookup or some out-of-the-box lookup?

 

Please also make sure that your lookup is present in the SyncOptions property -> SysLookupsImportConfig attribute in the mobile application manifest (as described here). Because your lookup may simply not sync with the mobile application.

 

Best regards,

Oscar

Show all comments
#customization
7.16
Studio_Creatio

HI team,

 

I want to filter the Action option based on 3 conditions and I implemented it on the trial instance, it was working as expected using the below code.

 

But when we moved it to the Local Development environment then we are not getting the desired output 

when I checked we are getting Activerowid only on local development instance

 

var status=selectedOrder.get("UsrPOStatusNew");

              var statusordertype=selectedOrder.get("UsrOrderType");

              var vendorcode=selectedOrder.get("UsrVendorGSTStateCode");

               var statecode=selectedOrder.get("UsrBillToGSTStateCode");

 

these fields return an empty or undefined value 

Someone please suggest a solution or workaround

 

Thanks a lot 

 

 

define("UsrCondition631066a3Section", ["ProcessModuleUtilities"], function(ProcessModuleUtilities) {

    return {

        entitySchemaName: "UsrCondition",

        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,

        diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,

        methods: {

          

           isRunning: function(activeRowId) {

                // Getting the section list view data collection. 

                var gridData = this.get("GridData");

             var selectedOrder = gridData.get(activeRowId);

                // Getting the selected order model accroding to the indicated primary column value. 

                var status=selectedOrder.get("UsrPOStatusNew");

              var statusordertype=selectedOrder.get("UsrOrderType");

              var vendorcode=selectedOrder.get("UsrVendorGSTStateCode");

               var statecode=selectedOrder.get("UsrBillToGSTStateCode");

             //this.showInformationDialog(status.displayValue);

             //this.showInformationDialog(statecode);

             this.showInformationDialog(status.displayValue);

             if(status.displayValue === "Approved" && statusordertype.displayValue==="Purchase Order" && vendorcode===statecode)

               {

                 return true;

               }

             else

               

                return false;

            },

          

           isRunning1: function(activeRowId) {

                // Getting the section list view data collection. 

                var gridData = this.get("GridData");

             var selectedOrder = gridData.get(activeRowId);

                // Getting the selected order model accroding to the indicated primary column value. 

                var status=selectedOrder.get("UsrPOStatusNew");

              var statusordertype=selectedOrder.get("UsrOrderType");

              var vendorcode=selectedOrder.get("UsrVendorGSTStateCode");

               var statecode=selectedOrder.get("UsrBillToGSTStateCode");

             //this.showInformationDialog(status.displayValue);

             //this.showInformationDialog(statecode);

             if(status.displayValue === "Approved" && statusordertype.displayValue==="Purchase Order" && vendorcode!==statecode)

               {

                 return true;

               }

             else

               

                return false;

            },

          isRunning2: function(activeRowId) {

                // Getting the section list view data collection. 

                var gridData = this.get("GridData");

             var selectedOrder = gridData.get(activeRowId);

                // Getting the selected order model accroding to the indicated primary column value. 

                var status=selectedOrder.get("UsrPOStatusNew");

              var statusordertype=selectedOrder.get("UsrOrderType");

              var vendorcode=selectedOrder.get("UsrVendorGSTStateCode");

               var statecode=selectedOrder.get("UsrBillToGSTStateCode");

             //this.showInformationDialog(status.displayValue);

             //this.showInformationDialog(statecode);

             if(status.displayValue === "Approved" && statusordertype.displayValue==="Work Order" && vendorcode!==statecode)

               {

                 return true;

               }

             else

               

                return false;

            },

          isRunning3: function(activeRowId) {

                // Getting the section list view data collection. 

                var gridData = this.get("GridData");

             var selectedOrder = gridData.get(activeRowId);

                // Getting the selected order model accroding to the indicated primary column value. 

                var status=selectedOrder.get("UsrPOStatusNew");

              var statusordertype=selectedOrder.get("UsrOrderType");

              var vendorcode=selectedOrder.get("UsrVendorGSTStateCode");

               var statecode=selectedOrder.get("UsrBillToGSTStateCode");

             //this.showInformationDialog(status.displayValue);

             //this.showInformationDialog(statecode);

             if(status.displayValue === "Approved" && statusordertype.displayValue==="Work Order" && vendorcode===statecode)

               {

                 return true;

               }

             else

               

                return false;

            },

          

            // Determines if the menu option is enabled. 

            isCustomActionEnabled: function() {

                // Attempt of getting the active (list selected) record identifier. 

                var activeRowId = this.get("ActiveRow");

              

                // If the identifier is determined and the order status is 

                // [In Progress], it gets true, otherwise - it gets false.

                return activeRowId ? this.isRunning(activeRowId) : false;

            },

             isCustomActionEnabled1: function() {

                // Attempt of getting the active (list selected) record identifier. 

                var activeRowId = this.get("ActiveRow");

              

                // If the identifier is determined and the order status is 

                // [In Progress], it gets true, otherwise - it gets false.

                return activeRowId ? this.isRunning1(activeRowId) : false;

            },

          isCustomActionEnabled2: function() {

                // Attempt of getting the active (list selected) record identifier. 

                var activeRowId = this.get("ActiveRow");

              

                // If the identifier is determined and the order status is 

                // [In Progress], it gets true, otherwise - it gets false.

                return activeRowId ? this.isRunning2(activeRowId) : false;

            },

          isCustomActionEnabled3: function() {

                // Attempt of getting the active (list selected) record identifier. 

                var activeRowId = this.get("ActiveRow");

              

                // If the identifier is determined and the order status is 

                // [In Progress], it gets true, otherwise - it gets false.

                return activeRowId ? this.isRunning3(activeRowId) : false;

            },

            // Action handler method. Displays the order creation date in the message window. 

            showOrderInfo: function() {

                var activeRowId = this.get("ActiveRow");

                var gridData = this.get("GridData");

                // Getting the order creation date. The column must be added to the list. 

               // var dueDate = gridData.get(activeRowId).get("Date");

                // Message window display.

                //this.showInformationDialog("hello");

              

                var args = {

        // Name of the process that should be run.

                 sysProcessName: "UsrProcess_44f0ffe",

                parameters:

                {

                  ProcessSchemaParameter1 : activeRowId

                 }

        // Object with the value of ContractParameter input parameter for CustomProcess parameter.

               };

              //this.showInformationDialog("hello1");

        // Running of user business process.

             ProcessModuleUtilities.executeProcess(args);

              //this.showInformationDialog("hello2");

              

              

            },

            // Overriding the base virtual method that gets the section action collection. 

            getSectionActions: function() {

                // Calling of the method parent implementation for getting the 

                //  initiated action collection of the section. 

                var actionMenuItems = this.callParent(arguments);

                // Adding a separator line.

                actionMenuItems.addItem(this.getButtonMenuItem({

                    Type: "Terrasoft.MenuSeparator",

                    Caption: ""

                }));

                // Adding a menu option to the section action list. 

                actionMenuItems.addItem(this.getButtonMenuItem({

                    // Linking the menu option title to the schema localized string.

                    "Caption": {bindTo: "Resources.Strings.purchaseActionCaptionIGST"},

                    // Action handler method linking. 

                    "Click": {bindTo: "showOrderInfo"},

                    // Linking of the menu option enabling property to the value that gets the isCustomActionEnabled method.

                    "Enabled": {bindTo: "isCustomActionEnabled"},

                   "Visible": {bindTo: "isCustomActionEnabled"}

                }));

               actionMenuItems.addItem(this.getButtonMenuItem({

                    // Linking the menu option title to the schema localized string.

                    "Caption": {bindTo: "Resources.Strings.purchaseActionCaptionCGSTSGST"},

                    // Action handler method linking. 

                    "Click": {bindTo: "showOrderInfo"},

                    // Linking of the menu option enabling property to the value that gets the isCustomActionEnabled method.

                    "Enabled": {bindTo: "isCustomActionEnabled1"},

                 "Visible": {bindTo: "isCustomActionEnabled1"}

                }));

               actionMenuItems.addItem(this.getButtonMenuItem({

                    // Linking the menu option title to the schema localized string.

                    "Caption": {bindTo: "Resources.Strings.WorkActionCaptionCGSTSGST"},

                    // Action handler method linking. 

                    "Click": {bindTo: "showOrderInfo"},

                    // Linking of the menu option enabling property to the value that gets the isCustomActionEnabled method.

                    "Enabled": {bindTo: "isCustomActionEnabled2"},

                 "Visible": {bindTo: "isCustomActionEnabled2"}

                }));

               actionMenuItems.addItem(this.getButtonMenuItem({

                    // Linking the menu option title to the schema localized string.

                    "Caption": {bindTo: "Resources.Strings.WorkActionCaptionIGST"},

                    // Action handler method linking. 

                    "Click": {bindTo: "showOrderInfo"},

                    // Linking of the menu option enabling property to the value that gets the isCustomActionEnabled method.

                    "Enabled": {bindTo: "isCustomActionEnabled3"},

                     "Visible": {bindTo: "isCustomActionEnabled3"}

                }));

                // Getting the appended section action collection.

                return actionMenuItems;

            }

          

        }

    };

});

 

Like 1

Like

2 comments
Best reply

The difference between your trial and your local instance (and why it isn't working in your local instance) is likely because of a difference in the section list layout (the columns added to the list). In order for a field you're using to be available as a part of GridData, it needs to exist in the ESQ behind the list, meaning it needs to be in the column layout - or you need to add the column to the list ESQ. For example, you're using the column "UsrPOStatusNew" from the GridData. If the UsrPOStatusNew column doesn't exist in the list ESQ (which it only will if it's in the column layout for the list), it won't be available. You can add this column and any other column you'll need to access in the section code by adding it to the list ESQ like this:

initQueryColumns: function(esq) {
    this.callParent(arguments);
 
    if (!esq.columns.contains("UsrPOStatusNew")) {
        esq.addColumn("UsrPOStatusNew");
    }
}

Now, when you need to access the UsrPOStatusNew column, it will be available in the GridData. I picked UsrPOStatusNew out of your code as an example, add any other fields you'll need to access in the section code using the same as above.

Ryan

The difference between your trial and your local instance (and why it isn't working in your local instance) is likely because of a difference in the section list layout (the columns added to the list). In order for a field you're using to be available as a part of GridData, it needs to exist in the ESQ behind the list, meaning it needs to be in the column layout - or you need to add the column to the list ESQ. For example, you're using the column "UsrPOStatusNew" from the GridData. If the UsrPOStatusNew column doesn't exist in the list ESQ (which it only will if it's in the column layout for the list), it won't be available. You can add this column and any other column you'll need to access in the section code by adding it to the list ESQ like this:

initQueryColumns: function(esq) {
    this.callParent(arguments);
 
    if (!esq.columns.contains("UsrPOStatusNew")) {
        esq.addColumn("UsrPOStatusNew");
    }
}

Now, when you need to access the UsrPOStatusNew column, it will be available in the GridData. I picked UsrPOStatusNew out of your code as an example, add any other fields you'll need to access in the section code using the same as above.

Ryan

Ryan Farley,

 

Thank You very Much ?

Show all comments
.net_core
ldap
7.17
Studio_Creatio

Please shed some light on LDAP integration with .NET core. We plan to use .NET core on a Linux box. Does it work OOTB seamlessly as it does with the .NET framework versions? Are there any architectural implications/extra components that need to be deployed?

 

Please explain the below phrase that has been picked from the .NET Core Creatio documentation.

 

"LDAP Integration - Current Implementation - A separate .NET Core instance is used for the synchronization of Windows-based applications. "

Like 0

Like

3 comments

Hello,

 

There is no possibility to establish LDAP integration with Creatio that is fully deployed on .Net Core platform because of .Net restrictions. This kind of integration is planned after the implementation of corresponding functionality on .NET 5.

Speaking of the "LDAP Integration - Current Implementation - A separate .NET Core instance is used for the synchronization of Windows-based application". This means that you can deploy a web-farm that will have several nodes and one of them should be on Windows. Then this Windows-based node should be used for LDAP integration.

 

Best regards,

Bogdan

Bogdan Spasibov,



A quick clarification on LDAP integration with web farm setup.



Say, I have 2 nodes running in the .Net framework, Do I need to perform the LDAP setup in both nodes and update the required web.config files in both nodes?



Regards,

Bhoobalan Palanivelu.

 

Bhoobalan Palanivelu,



Hi.



That's correct. Please apply the changes on both nodes. 



Yurii.

 

Show all comments
7.16
Studio_Creatio

Hi,

I created a new operation permission named "CanRunXXX"

When a user runs a specific process, I need to check if the user has the permission  to use it.

In the market place exists an addon specific for this feature https://marketplace.creatio.com/template/check-permission-operation

If I wanted to build it from scratch how can I do it?

Like 0

Like

7 comments

Hi Stefano,

 

Please install this marketplace app and analyze the content of the custom user task. It should contain some script inside it that receives the collection of allowed users that are stored in the operation permission users list. And this script can be used as an analogue to create your own user task if needed.

 

Best regards,

Oscar 

Oscar Dylan,

Thank you

Stefano Bassoli,

Hi

I tried to install the addon but it doesn't work

Any other suggestions ?

Stefano Bassoli,

I've installed the marketplace app and the following process worked perfectly on my end:

Basically the logic that checks if the current user has operation permissions rights is stored in the labCheckUserOperPermission class of the UserTask of the marketplace app:

protected override bool InternalExecute(ProcessExecutingContext context) {
			Success = (bool)UserConnection.DBSecurityEngine.GetCanExecuteOperation(OperationPermissionCode, UserConnection.CurrentUser.Id);
			return true;
		}

And returns either "true" or "false" for the "Success" parameter and the parameter itself determines if the process should be executed further or not. The full code of the UserTask can be found below:

namespace Terrasoft.Core.Process.Configuration
{
 
	using Newtonsoft.Json;
	using Newtonsoft.Json.Linq;
	using System;
	using System.Collections.Generic;
	using System.Collections.ObjectModel;
	using System.Globalization;
	using Terrasoft.Common;
	using Terrasoft.Core;
	using Terrasoft.Core.Configuration;
	using Terrasoft.Core.DB;
	using Terrasoft.Core.Entities;
	using Terrasoft.Core.Process;
	using Terrasoft.UI.WebControls.Controls;
 
	#region Class: labCheckUserOperPermission
 
	/// <exclude/>
	public partial class labCheckUserOperPermission
	{
 
		#region Methods: Protected
 
		protected override bool InternalExecute(ProcessExecutingContext context) {
			Success = (bool)UserConnection.DBSecurityEngine.GetCanExecuteOperation(OperationPermissionCode, UserConnection.CurrentUser.Id);
			return true;
		}
 
		#endregion
 
		#region Methods: Public
 
		public override bool CompleteExecuting(params object[] parameters) {
			return base.CompleteExecuting(parameters);
		}
 
		public override void CancelExecuting(params object[] parameters) {
			base.CancelExecuting(parameters);
		}
 
		public override string GetExecutionData() {
			return string.Empty;
		}
 
		public override ProcessElementNotification GetNotificationData() {
			return base.GetNotificationData();
		}
 
		#endregion
 
	}
 
	#endregion
 
}

So you can use something similar on your end as well.

 

Best regards,

Oscar

Hi Oscar 

In my environment doesnt appare in the user task list the new action 

Stefano Bassoli,

 

then you need to either re-install the marketplace app or check that your app is greater than 7.12 version and uses .NET Framework or use the code above to create your own user task to check operation permissions.

 

Best regards,

Oscar

Thank you very much

 

Show all comments
7.16
Studio_Creatio

Hi,

I need to convert a detail to a section because my customer need to export on excel all details created.

Which is the best way to do this?

 

Like 0

Like

2 comments

Hello Stefano,

 

Hope you're doing well.

 

To perform your business task please refer to this community question regarding registering a custom section for an existing object: 

https://community.bpmonline.com/articles/register-custom-section-existi….

 

In your case, the needed detail is an object and you need to create a section from it. After that, the required data should be available in the newly added section.

 

Best regards,

Roman

Roman Rak,

Hi Roman,

thank you for your support.

I used the feature available in section wizard and some query derived from the post you suggest me, to get my goal.

Show all comments
phone_integration
7.16
Studio_Creatio

Hi Community,

 

Any idea or have you tried it before to integrate Cisco PBX specifically model model CP-7811 / CP-8851? How the setup/configuration goes?

 

Thanks

Like 0

Like

1 comments

Hello Fulgen,

 

Thank you for your question but Creatio application integrates only with the telephone server and not with the hardphones directly.

The models that you specified can be connected to the Cisco or any other telephone server and the server will be then connected to your Creatio instance.

 

Best regards,

Bogdan S.

Show all comments
Activity
partcipants
group
7.16
Studio_Creatio

Hi Community,

 

Currently in activity, you can add participant individually. What our client wants instead of individual participant, user can add a group/groups. Any suggestion  for the best approach to do this please.

Like 0

Like

3 comments

Hello Fulgen,

 

Do you see that as adding an Organizational / Functional role or like adding more than one user at once into the Activity participant list?

Thank you for the clarification!

 

Best regards,

Bogdan S.

Bogdan Spasibov,

 

Hi Bogdan, Thank you so much. Its like adding Organizational / Functional role. Once group is added all contacts under this group will be added as activity participant.



What i am thinking is to create a custom section(Activity Group) where user can create group/s. Under custom section there is a detail where user can add contacts.



In activity, user can select an Activity Group. Then I will trigger a business process that will select all contacts from Activity Group and insert in in Activity Participant.



Is there any other best way aside from this? 

Fulgen Ninofranco,

 

Yes, actually the implementation that involves BP usage here is the best option.

Please let us know if you need any further assistance with this.

 

Thank you!

 

Best regards,

Bogdan S.

Show all comments