Dear Community,

Our business case requires us to prevent editting details and fields or adding new detail records after the opportunity has been closed (won or lost). We have some ways of doing it - run a business process that prevents write access, hide + button on details, disable save button, etc. 

 

But this use case sounds  a bit too common to us, as ideally, any opportunity must not be modified upon closure. 

 

We were wondering if there are any out of the box features that can handle this or any best practice that you all can suggest.

 

Thanks!

Like 1

Like

2 comments

Hi Shivani,

 

For section records, you can following this academy to block all fields based on lookup: https://academy.creatio.com/documents/technic-sdk/7-15/how-block-fields-edit-page

 

With this academy, it will hide all edit, add, delete action for detail also. But user can modifies by open detail edit page via double click action. If you want to prevent modifies details you can create process to update status to detail records and do the same with the academy above.

 

Regards,

Phuong Nguyen

 

The link provided by Phuong is a good route to go and the way I would do it. However, you can also do this in a process as well that triggers on a signal of opportunity modified where the stage is closed. You could just remove edit permissions for all access rights as well. Just thought I would mention this in case you wanted another approach. Note, if you go this route, you'll want to make sure any details on the opportunity inherit their permissions from the opportunity as well.

 

Ryan

Show all comments

We have Creatio in the cloud, the server has 6 or 7 hours difference from my local time. I don't know if switching to summer/winter time in my country affects the difference. To get the current time, I should calculate it. Or I have to go to Process Log and look upon the latest processes time. Is there a way to easily get the current server time?

 

Like 0

Like

1 comments

Hello Yuriy, 



The current DB and server time is set to UTC+0 no matter where the website is located. 

Please note, that you can always change a timezone displayed for your system user profile. 



Kind regards,

Roman

 

Show all comments

How can I get bigger font for name in custom section.

Here is the pic of Contact section (in-buily) with Name shown in big fonts in tile view.

Now I have built my custom Contact section but with few changes. It is not replaced or inherited with actual Contact section.

Now in the section after removing caption of the field the font size of name is still small.

 

How can I get bigger font like in in-built/out of the box contact Section.

I want to apply it to other sections also. So there is no point to use out of the box Contact section by replacing object which already has big fonts.

Like 0

Like

3 comments

Hi Ramnath.

 

You can change the font size by adding a custom css style to the schema you need and in such a way override the system font-size. Please refer to this article on our community: https://community.bpmonline.com/questions/how-add-custom-style-control-page-based-condition

I recommend you change a font-size first for any page in the system to check if it looks fine as we do not guarantee that all objects, labels, and containers will be displayed correctly. 



Thank you.

Bohdan Zdor,

 

I have tried this before but I could only make it work on the page of arecord. I need to edit the page where all the records are shown. I could not find the module which has the code for the list of records.

 

Ramnath

RAMNATH SHARMA,

 

 

Unfortunately, there is no option to change the section list font size in the current version of the system. I have registered your suggestion, though. It was passed to our R&D team to be considered for further releases.

 

Thank you. 

Show all comments

I have created 3 new sections using section wizard and changed name of the UsrName field in all of them because I wanted different names.

But now whenever I publish any new object or compile items, I get this error. Is there any way to sort it out.

I am using demo environment.

Thank you

Like 0

Like

6 comments

Creatio does not like it when the UsrName is changed. You will need to change it back. You can change the title, but you cannot change the Name. You can, however, not use it. If you create a new String, you can change the Displayed Value in the Advanced Settings for the object to the new String you made. This changes the blue links to the new string instead of the UsrName.

 

Reid Burger,

 

Thanks for clarification.

I also would like to know if I can change the Required - At application level to No for UsrName.

RAMNATH SHARMA,

 

It is fine to change properties like required at application level to no. If the field is being used as the display value (like the name field) then having it blank would mean nothing would show in a lookup (if its used as a lookup somewhere). 

 

BTW it's usually a good idea to not rename column or object names and only change the titles once they're created. 

 

Ryan

Ryan Farley,

I changed back the names to UsrName using section wizard (which I later realized shouldn't have changed them back). Then I compiled the current workspace from Advanced settings to see if still any error occurs. 

Here are some screenshots

Now The errors are because I changed back the name to UsrName, it says that the old Name - UsrClaimant don't exist.

I also opened the source code where these errors were pointing to - 

 

 

But I can not edit the source code in Cloud demo instance.

Is there any way to change the source code or any process to correct these source codes?

 

Ramnath

Hi Ramnath,



As Reid mentioned, we do not recommend to change the name after the section being created.



If such an issue appears you can simply generate source code for all objects that are mentioned in compilation errors and compile modified items. If all necessary items were not removed this should fix the issue



Thank you.

Bohdan Zdor,

Thanks. I will definitely try this out.

Show all comments

When one of our contacts becomes unsubscribed, we would like to notify our manager about it.

How is it possible? With a business process? But I couldn't catch the unsubscribed event. Is there another way?

Like 0

Like

1 comments
Best reply

Yuriy,

 

You won't be able to catch the response on the bulk email using the signal process element (since this data is added to the database directly) however you can create a process with the timer that will review the "Response in Email" object and check if a new "Unsubscribe" response was added. You can create a time parameter and use it as a filtration condition (in the "Created On" field). So you can run this process once per hour, read the collection of records in the process (from the "Response in Email" object) and use this data.

Yuriy,

 

You won't be able to catch the response on the bulk email using the signal process element (since this data is added to the database directly) however you can create a process with the timer that will review the "Response in Email" object and check if a new "Unsubscribe" response was added. You can create a time parameter and use it as a filtration condition (in the "Created On" field). So you can run this process once per hour, read the collection of records in the process (from the "Response in Email" object) and use this data.

Show all comments

In order to delete an address on Account page, I need to click Actions first, then press the Delete button.

 

I would like to use a hotkey for this. How could I do it? I've seen this question, but don't know how to adapt it to my needs. Should I modify the code of AccountPageV2 for this? How to get the selected address row?

Or maybe this improvement is already planned in Creatio's next releases?

Like 0

Like

1 comments
Best reply

Hello Yuriy, 



In order to implement the requested functionality please create a replacing module for "AccountAddressDetailV2" and override "onGridDataLoaded" method in it ( It's being called after rendering). 

In this method you can retrieve a detail's grid and get the DOM element from it. You can assign your own handler on it's keydown event whcih will call  "this.deleteRecords()" after pressing the needed button. 



Here is the example for the "Delete" button in "AccountAddressDetailV2":



define("AccountAddressDetailV2", [], function() {

    return {

        entitySchemaName: "AccountAddress",

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

        methods: {

            onGridDataLoaded: function() {

                this.callParent(arguments);

                var grid = this.getCurrentGrid();

                var wrapEl = grid.getWrapEl();

                wrapEl.on("keydown", this.onKeyDown, this);

            },

            onKeyDown: function(event) {

                if (event.keyCode === event.DELETE) {

                    this.deleteRecords();

                }

            }

        }

    };

});



Kind regards,

Roman 

Hello Yuriy, 



In order to implement the requested functionality please create a replacing module for "AccountAddressDetailV2" and override "onGridDataLoaded" method in it ( It's being called after rendering). 

In this method you can retrieve a detail's grid and get the DOM element from it. You can assign your own handler on it's keydown event whcih will call  "this.deleteRecords()" after pressing the needed button. 



Here is the example for the "Delete" button in "AccountAddressDetailV2":



define("AccountAddressDetailV2", [], function() {

    return {

        entitySchemaName: "AccountAddress",

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

        methods: {

            onGridDataLoaded: function() {

                this.callParent(arguments);

                var grid = this.getCurrentGrid();

                var wrapEl = grid.getWrapEl();

                wrapEl.on("keydown", this.onKeyDown, this);

            },

            onKeyDown: function(event) {

                if (event.keyCode === event.DELETE) {

                    this.deleteRecords();

                }

            }

        }

    };

});



Kind regards,

Roman 

Show all comments

I have 2 environments of Creatio CRM full bundle.

I have created my package in environment 1 which has version 7.16.0. I have committed to SVN server. 

Now I have another environment environment 2 in which I want to install package from SVN repository but it has downgraded version 7.15.4.

 

The package has all custom objects. All the objects have very simple connections and it only depends on ProductCore package.

 

I want to know if it is possible to install this package to another Env 2 which has a downgraded version.

Like 0

Like

2 comments

Dear Ramnath, 



We recommend to transfer packages between environments deployed on the same version of Creatio in order to avoid unexpected issues after or during the process. 

You can follow this update guide where updating process is described:

https://academy.creatio.com/documents/update-guide



Please update your second website to the same version as the first one before transferring any packages between them. 



Kind regards,

Roman

Hi Roman,

These both environments are demo environments. 

It is not possible to upgrade.

Show all comments

Hi, 

 

Hope someone can help me with replicating OrdersProducts in Quotes Section. I have tried that and while click on + icon products are not displaying.

 

Thank you.

Like 0

Like

7 comments

Dear Sushma,

The logic of the Product detail is implemented in OrderPage so if you page ss inherited from the BaseModulePage base page it will not work. You can investigate order page schema code to copy it to your new section or try the following example (the page should be modified according to the settings of your detail, otherwise it will not work):

define("UsrOrder3Page", ["EntityProductCountMixin"], function() {

    return {

        entitySchemaName: "Order",

        messages: {

            "GetOrderProductSummary": {

                mode: Terrasoft.MessageMode.PTP,

                direction: Terrasoft.MessageDirectionType.SUBSCRIBE

            },

            "UpdateOrderProductSummary": {

                mode: Terrasoft.MessageMode.PTP,

                direction: Terrasoft.MessageDirectionType.PUBLISH

            },

        },

        mixins: {

            EntityProductCountMixin: "Terrasoft.EntityProductCountMixin"

        },

        attributes: {

            "Currency": {

                dataValueType: Terrasoft.DataValueType.ENUM,

                lookupListConfig: {

                    columns: ["Division", "ShortName", "Symbol"]

                }

            },

            "AmountAndCurrency": {

                dependencies: [

                    {

                        columns: ["Amount", "Currency"],

                        methodName: "updateOrderProductSummary"

                    }

                ]

            },

            "IsPaymentAmountLargerThanAmount": {

                dataValueType: this.Terrasoft.DataValueType.BOOLEAN,

                type: this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,

                value: false,

                dependencies: [

                    {

                        columns: ["PaymentAmount", "Amount"],

                        methodName: "setIsPaymentAmountLargerThanAmount"

                    }

                ]

            }

        },

        modules: /**SCHEMA_MODULES*/{}/**SCHEMA_MODULES*/,

        details: /**SCHEMA_DETAILS*/{

            ProductInProductsTab: {

                schemaName: "OrderProductDetailV2",

                entitySchemaName: "OrderProduct",

                filter: {

                    masterColumn: "Id",

                    detailColumn: "Order"

                },

                subscriber: {methodName: "refreshAmount"},

                defaultValues: {

                    Currency: {masterColumn: "Currency"},

                    CurrencyRate: {masterColumn: "CurrencyRate"}

                }

            }

        }/**SCHEMA_DETAILS*/,

        businessRules: /**SCHEMA_BUSINESS_RULES*/{}/**SCHEMA_BUSINESS_RULES*/,

        methods: {

            refreshAmount: function() {

                this.updateAmount(function() {

                    this.updateOrderProductSummary();

                }, this);

            },

            subscribeSandboxEvents: function() {

                this.callParent(arguments);

                this.sandbox.subscribe("GetOrderProductSummary", this.getProductSummaryConfig, this,

                    [this.getDetailId("ProductInProductsTab")]);

            },

            updateOrderProductSummary: function() {

                this.sandbox.publish("UpdateOrderProductSummary", null,

                    [this.getDetailId("ProductInProductsTab"), this.getDetailId("ProductInResultsTab")]);

            },

            getProductSummaryConfig: function() {

                var currency = this.get("Currency") || {};

                return {

                    count: this.get("ProductCount"),

                    currency: currency.Symbol,

                    amount: this.get("Amount")

                };

            },

            setIsPaymentAmountLargerThanAmount: function() {

                var paymentAmount = this.get("PaymentAmount");

                var amount = this.get("Amount");

                var isLarger =

                    this.isNotEmpty(paymentAmount) &&

                    this.isNotEmpty(amount) &&

                    (paymentAmount > amount);

                this.set("IsPaymentAmountLargerThanAmount", isLarger);

            },

            onSaved: function() {

                this.callParent(arguments);

                var config = arguments[arguments.length - 1];

                if (config && config.isSilent) {

                    return;

                }

                this.updateAmountAfterSave("ProductInProductsTab",

                    function() {

                        this.updateDetail({detail: "ProductInResultsTab"});

                        this.updateOrderProductSummary();

                    },

                    this

                );

            },

            loadEntity: function(primaryColumnValue, callback, scope) {

                scope = scope || this;

                this.callParent([primaryColumnValue, function() {

                    this.setIsPaymentAmountLargerThanAmount();

                    this.setProductCount(primaryColumnValue, callback, scope);

                }, scope]);

            },

            getProductCountInEntityColumnName: function() {

                return "ProductCount";

            },

            setColumnValues: function(entity) {

                this.callParent(arguments);

                this.updateProductsCount(entity);

            },



            modifyAmountESQ: function(esq) {

                this.mixins.ProductEntryPageUtils.modifyAmountESQ.apply(this, arguments);

                this.addProductsCountColumn(esq);

            },

            updateAmountColumnValues: function(entity) {

                this.mixins.ProductEntryPageUtils.updateAmountColumnValues.apply(this, arguments);

                this.updateProductsCount(entity);

            },

            addProductsCountColumn: function(esq) {

                esq.addAggregationSchemaColumn("[OrderProduct:Order].Id",

                        this.Terrasoft.AggregationType.COUNT, "ProductCount");

            },

            updateProductsCount: function(entity) {

                var countColumn = "ProductCount";

                this.setColumnValue(countColumn, entity.get(countColumn), {preventValidation: true});

            }

        },

        dataModels: /**SCHEMA_DATA_MODELS*/{}/**SCHEMA_DATA_MODELS*/,

        diff: /**SCHEMA_DIFF*/[

            {

                "operation": "insert",

                "name": "ProductInProductsTab",

                "values": {

                    "itemType": 2,

                    "markerValue": "added-detail"

                },

                "parentName": "Tab0686e409TabLabel", //detail placement

                "propertyName": "items",

                "index": 0

            }

        ]/**SCHEMA_DIFF*/

    };

});

Angela Reyes,

Thank you for your help.  I successfully replicated that functionality. But Currency is not updating in ProductsSection when currency is changed in maing page.

sushma,

Can you please specify how it is not updated? Do you mean the currency that is specified in the price list? 

Angela Reyes,

There is multicurrency amount field in Quote page wich is sum of amounts of all products of detail and is not working as expected. when changing currency of amount field in quote page and click on save getting error as shown in attachment.

sushma,

It is hard to find the reason of this error as it is a custom object and there is no information in the pop-up. Try to debug (

https://academy.creatio.com/documents/technic-sdk/7-15/client-code-debugging) the application using developer tools to locate what causes this error. 

when trying to debug when i change 

 "Currency": {

                dataValueType: Terrasoft.DataValueType.ENUM,

                lookupListConfig: {

                    columns: ["Division", "ShortName", "Symbol"]

                }

            },

to  "Currency": {

                dataValueType: Terrasoft.DataValueType.LOOKUP,

                lookupListConfig: {

                    columns: ["Division", "ShortName", "Symbol"]

                }

            },

Error is not coming as it says when updating there is mismatch with datatype of currency. But still detail is not updating when currency is changed and total amount is not updating based on sum of amounts of all products

sushma,

why are you trying to change currency to lookup type? It should remain ENUM

Show all comments

For instance, I have a column Account.UsrFlagTemp.

I don't need it anymore and I want to delete it.

But I want to search through all the processes to find out if any process still uses it.

Is there a way to do it automatically?

This is the cloud version.

Like 0

Like

1 comments

Hello Yuriy,

 

We do not recommend to delete columns in general, if you do not need this column you can set its usage mode to "none". If any process in your system reads all columns from the Account object this process will stop working after the column is removed even if the column itself is not used. 



This is why it is better to change usage mode in the column setup in the configuration. 

 

Best regards,

Angela

Show all comments

I have read this article regarding adding multiple value to a detail.

Link - https://academy.creatio.com/documents/technic-sdk/7-15/adding-multiple-records-detail

 

 

But I do not understand these variable values. The opportunity and contact are the sections that are already created in the system. I want to know what values should I put in custom detail schema.

 

Details of Objects (every object is custom) -

  1. Client section with a detail of Partners
  2. Partners detail is made from Partner section

I want to change the Partner detail in Client to add multiple records. But I do not understand what should be the values of rootEntitySchemaName, rootColumnName, relatedEntitySchemaName, relatedColumnName.

 

Can anyone please help in this matter?

 

Thanks 

Ram

Like 0

Like

4 comments
Best reply

Hello Ramnath,

 

rootEntitySchemaName is the name of the parent object. This is likely the object for the page where the detail is located, so if the detail is on the Account page, this would be Account

 

rootColumnName is the name of the column on the detail object that relates it to the parent object. In the example of being on the Account page, this would be the name of the column on the detail object that is the account lookup, such as UsrAccount

 

relatedEntitySchemaName is the name of the object you're looking up to add to the detail. So, if the lookup is looking up contacts, this would be Contact

 

relatedColumnName is the name of the column on the detail object that the result from the lookup is stored in. So in the example of looking up contacts, this would be a contact lookup on the detail object, such as UsrContact.

 

Maybe this article will help? https://customerfx.com/article/adding-to-a-detail-from-a-lookup-in-crea…

 

Ryan

Hello Ramnath,

 

rootEntitySchemaName is the name of the parent object. This is likely the object for the page where the detail is located, so if the detail is on the Account page, this would be Account

 

rootColumnName is the name of the column on the detail object that relates it to the parent object. In the example of being on the Account page, this would be the name of the column on the detail object that is the account lookup, such as UsrAccount

 

relatedEntitySchemaName is the name of the object you're looking up to add to the detail. So, if the lookup is looking up contacts, this would be Contact

 

relatedColumnName is the name of the column on the detail object that the result from the lookup is stored in. So in the example of looking up contacts, this would be a contact lookup on the detail object, such as UsrContact.

 

Maybe this article will help? https://customerfx.com/article/adding-to-a-detail-from-a-lookup-in-crea…

 

Ryan

Ryan,

 

Thanks for helping me out.

 

Please guide me in this situation more.

Overview of whole scenario

I created a custom detail in a custom section.  I have created a Section Contacts (neither base object nor replacing object, It is custom made) and Clients Section. Clients section has a detail Contacts. The detail's object name is the Contacts section.

 

Section Page - UsrClients

Detail object - UsrContacts (has lookup of UsrClient for connecting record to UsrClients with other inherited columns present in UsrContacts)

 

Now the name will be

rootEntitySchemaName - UsrClients (section page object name)

rootColumnName - UsrClient  (the referencing lookup present in UsrContacts)

relatedEntitySchemaName - UsrContacts (Section page from where records will be read)

relatedColumnName - UsrContact (lookup present in detail)

 

Now the problem is how can I create a lookup pointing to the same object on which detail is build.

Lookup points to UsrContacts and detail is also created on UsrContacts.

 

RAMNATH SHARMA,

 

The detail should be a separate object. Like in the example on the academy, OpportunityContact object on which the detail is built on contains Opportunity and Contact columns. In your case, you would need to create a separate object for the detail that would contain UsrClients and UscrContacts columns, and build the detail on this object. 

Dennis Hudson,

 

Yes, you are right. I have created a new object with 2 looks fields to add this functionality. And it works.

Thanks

Show all comments