Hi Team,

 

I am attaching the screenshot of dashboard which I need to download in excel or pdf format.

The problem  I am facing is that when I take the screenshot the report (Top 10 passenger detail by spend) becomes blank. 

 

Please help me with this! 

 

Thanks & Regards.

 

Like 0

Like

1 comments

Hi Ankit,

 

Pivot tables were developed using angular in our system and connected to the app as custom element and use shadow dom for styles encapsulation. And the screenshot cannot be done because of the shadow dom. Screenshot is performed using html2canvas library and it has an issue on GitHub https://github.com/niklasvh/html2canvas/issues/430. We tried updating the html2canvas library to the latest version but the error still reproduces and we are now working on developing our own rendering. So as for now there is no workaround for this problem, but using third-party screenshot tools.

 

Best regards,

Oscar

Show all comments

I am building a scenario for CTI integration using Avaya. I need to extend the functionality of the Terrasoft Messaging Service, for example, redirect phone calls based on organisational role, etc. Is there a way of doing it on Creatio? I believe the TMS is a windows service that is provided as a connector by  Creatio. Is there a way to extend the functionality of this connector by customer/partner? If not, is the TMS source code open sourced for extension? If yes, please do share the link of the source code.

 

Thanks in advance...

Like 0

Like

4 comments

Hello Amanthena,

 

Unfortunately, there is no such possibility to configure calls redirection based on organizational roles or functional roles via standard tools for the Creatio application in the Terrasoft Messaging Service (TMS). You can set redirect on the ATS side (based on phone numbers which are assigned to specific contacts/users). Another way is to involve the project development team and to create specific extensions for TMS, but for that we suggest you to contact your manager and discuss the possibility of the implementation of the additional functionality.

 

On the Creatio application side, you can configure which users will be able to use the telephony functionality and which not. Also by enabling the Avaya connector you will have more convenient way to analyze calls.

 

Best regards,

Roman

 

 

Thanks for the reply, Roman! Below are the use cases that I am looking at.

 

1) Redirection based on organisational roles.

2) Redirection based on user status like "on vacation", etc to a user substitute configured on Creatio

3) Notification to customer service agent on voicemail and the ability to access, read and listen to them.

4) Support for the "Busy" agent status on Creatio-Avaya.

 

Please let me know if this is something that in your view can be entirely handled through configurations and customizations on the Avaya Server, as I believe this is not currently supported via extensions on Creatio/TMS.

 

Also when you say "project development team" and "manager", are you referring to the Creatio Professional Services/Product team and partner account manager?

 

Thanks again for all the help...

 

Hello Amanthena,

 

  1. About the call redirection based on different roles: this functionality can not be set by using the available system configuration. This question is better to clarify with the Creatio Professional Services/Product team or/and Partner Account manager, as far as it will require further development.
  2. Redirection based on the user status like "on vacation" or other custom statuses is possible to configurate on the ATS side (depending on which statuses are available for the specific ATS). Also, ATS configurations allow you to set automatic change of the operator's status accordingly to the operator availability and a lot of other kinds of functionality (like IVR, etc.).
  3. After the phone integration has been set up, you will be able to manage calls in Creatio: make and receive calls, put calls on hold, transfer calls, make video calls and record conversations. Anyway, the range of available features directly connected to the phone system which you will use for integration with Creatio application. In case of using Avaya telephony you can't replay the recorded call. Here you can find more information about feature comparison for different phone systems. When your busniess tasks require to use few different phone integrations with Creatio it's also possible to do: https://community.creatio.com/articles/multiple-call-center-integration
  4.  The Avaya connector supports "ready", "not available" or "busy" statuses. For more details about the add-on you can request live demonstration on the Marketplace site.

Best regards,

Roman

 

 

Roman Rak,

Thanks for all the help!

Show all comments

Hello, 

 

Would anyone have an example of how they are sending PATCH requests to Creatio?

 

Apparently this does not work, I get the error "{"Message":"There was an error processing the request.","StackTrace":"","ExceptionType":""}"

 

public static void UpdateThingInCreatio(string section, Guid object, Guid idofyetanotherobject, string text1, string text2)
        {
            string data = " somedata";
 
            string requestUri = serverUri + "ActivityCollection(guid'" + objectUID + "')";
            Encoding encoding = Encoding.Default;
            var request = WebRequest.Create(requestUri) as HttpWebRequest;
            request.Method = "PATCH";
            request.ContentType = "application/json; charset=utf-8";
            request.Credentials = new NetworkCredential(username, password);
            byte[] buffer = encoding.GetBytes(data);
            Stream dataStream = request.GetRequestStream();
            dataStream.Write(buffer, 0, buffer.Length);
            dataStream.Close();
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            string result = "";
            using (StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.Default))
            {
                result = reader.ReadToEnd();
            }
            MessageBox.Show(dataStream.ToString());

Have looked here: https://documenter.getpostman.com/view/10204500/SztHX5Qb?version=latest#78ea2d20-a8a5-4293-8aa5-0fa694d14d33

 

here:https://community.creatio.com/taxonomy/term/5162

 

and here: https://academy.creatio.com/documents/technic-sdk/7-16/integrations-and-external-api

 

with no luck.

 

Any suggestions or code snipit's are welcome!

Like 0

Like

2 comments

Solved it doing something along the lines of this:



 

using (var httpClient = new HttpClient())
            {
                httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(//Auth here);
 
            using (var request = new HttpRequestMessage(new HttpMethod("PATCH"), requestUri))
                {
                    request.Headers.TryAddWithoutValidation("Accept", "application/json; odata=verbose");
                    request.Headers.TryAddWithoutValidation("ForceUseSession", "true");
                    request.Headers.TryAddWithoutValidation("BPMCSRF", "value");                    
                    request.Content = new StringContent("data");
                    request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json; odata=verbose");
 
                    var response = await httpClient.SendAsync(request);
                }
            }

If there are any other examples the community would like to share please do here!

Dear Philip,

 

Please find the example of the code below:

 

ExternalRequest.cs

using System;
using System.Net;
using System.IO;
using System.Collections.Generic;
 
namespace ThirdPartyIntegration
{
    class ExternalRequest
    {
        #region Fields: Private
 
        private readonly string appUrl = "http://localhost:3030/";
        private readonly string authServiceUrl = "ServiceModel/AuthService.svc/Login";
        private readonly string OData3ServiceUrl = "0/ServiceModel/EntityDataService.svc/";
 
        private CookieContainer authCookie = new CookieContainer();
 
        #endregion
 
        #region Methods: Private
 
        private HttpWebRequest CreateRequest(string url, string methodType, string requestData = null)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.ContentType = "application/json;";
            request.Method = methodType;
            request.Accept = "application/json;";
            //request.KeepAlive = true;
            if (!string.IsNullOrEmpty(requestData))
            {
                using (var requestStream = request.GetRequestStream())
                {
                    using (var writer = new StreamWriter(requestStream))
                    {
                        writer.Write(requestData);
                    }
                }
            }
            return request;
        }
 
        // Method realizes protection from CSRF attacks: copies cookie, which contents CSRF-token 
        // and pass it to the header of the next request.
        private void AddCsrfToken(HttpWebRequest request)
        {
            var cookie = request.CookieContainer.GetCookies(new Uri(appUrl))["BPMCSRF"];
            if (cookie != null)
            {
                request.Headers.Add("BPMCSRF", cookie.Value);
            }
        }
 
        private string GenerateRequestData(IDictionary<string, string> columnValuesPairs)
        {
            List<string> data = new List<string>();
            foreach (var pairs in columnValuesPairs)
            {
                data.Add($"\"{pairs.Key}\": \"{pairs.Value}\"");
            }
 
            var massData = data.ToArray();
            return "{ " + string.Join(", ", massData) + " }";
        }
 
        #endregion
 
        #region Methods: Public
 
        public void TryLogin(string userName, string userPassword)
        {
            var authData = "{ " + $"\"UserName\": \"{userName}\", \"UserPassword\": \"{userPassword}\"" + " }";
            var request = CreateRequest(appUrl + authServiceUrl, "POST", authData);
            request.CookieContainer = authCookie;
            // Upon successful authentication, we save authentication cookies for
            // further use in requests to Creatio. In case of failure
            // authentication application console displays a message about the reason
            // of the mistake.
            using (var response = (HttpWebResponse)request.GetResponse())
            {
                using (var reader = new StreamReader(response.GetResponseStream()))
                {
                    var responseMessage = reader.ReadToEnd();
                    if (response.StatusCode == HttpStatusCode.OK)
                    {
                        Console.WriteLine(responseMessage);
                        if (responseMessage.Contains("\"Code\":1"))
                        {
                            throw new UnauthorizedAccessException($"Unauthorized {userName} for {appUrl}");
                        }
 
                        string authName = ".ASPXAUTH";
                        string authCookieValue = response.Cookies[authName].Value;
                        authCookie.Add(new Uri(appUrl), new Cookie(authName, authCookieValue));
                        Console.WriteLine(responseMessage);
                    }
                    else
                    {
                        Console.WriteLine(response.StatusCode + responseMessage);
                    }
                }
            }
        }
 
        public void PatchRequestCreatio(string objectName, Guid objectId, IDictionary<string, string> columnValuesPairs)
        {
            string requestData = GenerateRequestData(columnValuesPairs);
            string finalUrl = appUrl + OData3ServiceUrl + objectName + "Collection(guid'" + objectId + "')";
            var request = CreateRequest(finalUrl, "PATCH", requestData);
 
            request.ContentType += " odata=verbose";
            request.Accept += " odata=verbose";
            request.Headers.Add("ForceUseSession", "true");
 
            request.CookieContainer = authCookie;
            AddCsrfToken(request);
 
            using (var response = (HttpWebResponse)request.GetResponse())
            {
                using (var reader = new StreamReader(response.GetResponseStream()))
                {
                    var responseMessage = reader.ReadToEnd();
                }
 
            }
 
        }
 
        #endregion
    }
}

 

 

Program.cs

using System;
using System.Collections.Generic;
 
namespace ThirdPartyIntegration
{
    class Program
    {
        static void Main(string[] args)
        {
            ExternalRequest request = new ExternalRequest();
            request.TryLogin("UserName", "UserPassword");
 
            string @object = "Account";
            Guid objectId = new Guid("405947D0-2FFB-4DED-8675-0475F19F5A81");
            Dictionary<string, string> keyValuePairs = new Dictionary<string, string>();
            keyValuePairs.Add("Fax", "Test");
            keyValuePairs.Add("Code", "111");
 
            request.PatchRequestCreatio(@object, objectId, keyValuePairs);
        }
    }
}

 

Best regards,

Norton



 

Show all comments

Hello Community!

 

I have a mask in a interger field, but I need to apply that on the page inizialate because I have record inserted directly to the database.

 

 

Like 0

Like

1 comments

Dear Federico,

 

An input mask helps users with the input by ensuring a predefined format. If you have record inserted directly to the database, you won’t be able to apply the input mask for this record. In order to validate this record, please consider creating a trigger in the database that should be triggered before inserting the record. Please find more information about triggers in the article by the link below:

 

https://www.essentialsql.com/what-is-a-database-trigger/

 

Best regards,

Norton

Show all comments

Hello

 

When typing some string on a lookup field, at the bottom of the field there is this option to add the value as a new value to the lookup if it doesn't exsitis in the lookup table.

 

I understand that this option can be blocked via permissions but how can I remove this option completely from a lookup field.

Remove it in a manner that the user will not see this option to add new.

 

 

 

 

Like 1

Like

2 comments
Best reply

Hi Oren,



Thank you for contacting us!



Sure, there is an option to block such functionality. However, please note that the development process should be applied.



1. Firstly, you need to create a replacing client module schema for BasePageV2 client module. Please find the information about it in the article by the link below:



https://academy.creatio.com/documents/technic-sdk/7-16/creating-custom-client-module-schema



2. In a new replacing client schema, please insert the code below:

 

define("BasePageV2", [], function() {
return {
methods: {
/**
* @inheritdoc Terrasoft.model.BaseViewModel#onLookupDataLoaded
* @override
*/
onLookupDataLoaded: function(config) {
config.isLookupEdit = false;
this.callParent(arguments);
},
}
};
});



3. Save the changes and hard-reload the page.



Regards,

Anastasiia

Hi Oren,



Thank you for contacting us!



Sure, there is an option to block such functionality. However, please note that the development process should be applied.



1. Firstly, you need to create a replacing client module schema for BasePageV2 client module. Please find the information about it in the article by the link below:



https://academy.creatio.com/documents/technic-sdk/7-16/creating-custom-client-module-schema



2. In a new replacing client schema, please insert the code below:

 

define("BasePageV2", [], function() {
return {
methods: {
/**
* @inheritdoc Terrasoft.model.BaseViewModel#onLookupDataLoaded
* @override
*/
onLookupDataLoaded: function(config) {
config.isLookupEdit = false;
this.callParent(arguments);
},
}
};
});



3. Save the changes and hard-reload the page.



Regards,

Anastasiia

Anastasiia Markina,

Thanks Anastasiia

Show all comments

Hello Community,

 

We have the following requirement:

there are VIP contacts, which may only be edited/deleted by a certain organizational role. The contacts are considered VIP contacts if they have a certain record in a related detail table. To achieve this, I can’t use object permissions (because I can't set conditions there), but I think it will work with a business process, triggered by the creation of the detail record and removing and granting permissions on the contact with the “change access rights” process element.

But we also have the requirement, that only the mentioned role can see sensitive data like the mobile phone number. How can I achieve this?

 

Thanks,

Robert

Like 0

Like

7 comments

Hi again,

I slved the first part (revoking edit/delete permissions for VIP contacts) but still struggling with the second part (revoking read access to sensitive fields).

 

Any help on this would be highly appreciated!

Thanks,

Robert

Hello Robert,

 

If I understand right, you can refer to this guide: https://academy.creatio.com/documents/administration/7-16/managing-colu…

 

Regards,

Akira Nguyen

Phuong Akira,

Hello Akira,

thanks for the reply, but this is not solving the issue. The reason is that I have to conditionally restrict access to the field.

Only when the contact is a VIP contact (that is, if it has a certain detail record), the sensitive fields should get accessible only by a certain role.

If I use column permissions, the field (eg the mobile number) will be restricted on every contact, not just VIP contacts.

 

Thanks,

Robert

Hello Robert,

 

To solve your issue, I think you can combine some coding + business rule

1. You can code method: if usr with specific role open page, set 1 usrfield = true; else = false

2. Business rule: customer = VIP AND usrfield = true; hide mobile phone field

Sorry, I am not a coder so I cannot guide you on how to code it.



Regards,

Akira Nguyen

If the protections on data are to comply with legal regulations, then client-side hiding or editing restrictions are not enough. I don't know what Robert's requirements for this are, but suggesting client-side logic to hide sensitive data without knowing why its access needs to be restricted is dangerous.

Harvey Adcock,

Hello Harvey,

you are absolutely right and I do not want a solution to hide the data via the UI.

The requirement is not based on legal regulations, but nevertheless, I want a robust solution where the user can't access the data no matter what he/she tries (the user could add the sensitive field in the list for example).

Unfortunately, I haven't found such a solution that is doable with the means of creatio permissions.

 

Do you have an idea?

 

Thanks,

Robert

Robert Pordes,

 

It would be a nice feature, given that Creatio has the ability to do row level security on a per-user basis, but it isn't possible currently.

 

The closest thing I could think of would be to have an extension table holding the sensitive data, which has its row level security applied by the Business Process you mentioned, but from what I can tell Creatio doesn't support extension tables either, so it would be a very code-intensive process of building that functionality in Creatio first...

 

Sorry I can't be of more help, hopefully others have some better ideas.

Show all comments

Hello Community!

 

I would like to ask if somebody knows how to start a process when the access rights of a case is changed but there is not any modification on the case, just the SysCaseRight is changing.

 

Any ideas?

 

Regards,

 

 

Like 0

Like

1 comments

Hello Federico,

 

Unfortunately, there is no opportunity to create such kind of start signal via standard tools, because SysCaseRight is related to the system database tables, but not to the specific available object. And as far as the Business Process can work only with objects and their fields, at the moment it's impossible to connect the auto-triggered signal with data straight from system DB.

 

As a workaround for your request, you can create View Object which will represent the needed data (SysCaseRight). View Object is a virtual table that is not populated with own data but populated with data from other (existing) tables, in your case, it will be data from SysCaseRight table (for example, this new table will consist of RightLevel, SysAdminUnitId, RecordId columns). After creating the View Object any changes which will be implemented in the SysCaseRight table, the same changes will be displayed in the View Object. Later it can be used for triggering the business process depending on changes for Case access rights.

 

You can find more information on how to create the View Object in the following link:

 

https://community.creatio.com/questions/how-create-view-object-bpm-online

 

Best regards,

 

Roman

Show all comments

Hi all,

     I found the default setting for numeric in Terrasoft.core.enums.SysValue (file sys-values.js). But I can't find the way to update one of them, i.e: CURRENT_MONEY_DISPLAY_PRECISION.

     Because, the control MoneyEdit.js uses it to format its value. If I want to show money value without decimal precision (my currency is Vietnam đồng), I have to update (set decimalPrecision = 0) one by one in every page I need, it takes many time. And, I can't apply it in the section (displayed money value in column's section).

Thanks

Toàn Mai

Like 0

Like

1 comments

Dear Toan,

 

Unfortunately, it is impossible to change the default precision for “money” type field, since this setting is saved in one of the core application schema.

 

Please note that we have notified the development team about your request.

 

Best regards,

Norton

Show all comments

Hello all,

 

I am working on modifying the Search contact and accounts page to add a cancel button to the top of the page so that the user can exit the page and properly terminate the business process that opens it.

However, I've added the script for inserting a button but it won't show up on the page. Here is my script below. Is there something I could be doing wrong?

Like 0

Like

3 comments

Dear Kevin,

 

Could you please provide us with the information about how this page was created and how this page is called in a business process?

 

If this page is a pre-configured page, so you can easily add a button using page wizard and bind the “click” attribute to the appropriate method through a development.

 

 Best regards,

Norton

Norton Lingard,

It is the "Search page - Contacts and Accoutns" page that is used in the Identify contact by incoming call process. 

 

It is called like a pre-configured page in the process but when I try to modify it, it only opens right to the schema code instead of opening the page wizard. 

Dear Kevin,

 

I created the replacing client module for the “SearchAccountAndContactPage” schema and added the following code:

 

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

    return {

        entitySchemaName: "Case",

        methods: {

            onCloseContactButton: function() {

                // business logic;

                alert("onCloseContactButton.click()");

            }

        },

        diff: [

                    {

                        "operation": "insert",

                        "parentName": "LeftContainer",

                        "propertyName": "items",

                        "name": "ClosePageButton",

                        "values": {

                            "itemType": this.Terrasoft.ViewItemType.BUTTON,

                            "caption": {"bindTo": "Resources.Strings.ClosePageButtonCaption"},

                            "click": {"bindTo": "onCloseContactButton"},

                            "style": "red"

                        }

                    }            

            ]

    };    

});

 

 

As a result, the button has successfully appeared in the page. Please see the screenshot below:

 

 

Please check you entered the correct value for the “caption” property. Since if this property has the wrong value, the button won’t be visible in the page.

 

Best regards,

Norton

Show all comments

I've had a look at this documentation, which talks about creating Organizations and Divisions, but I cannot find anything on there or elsewhere which explains what the differences between these are in Creatio - as far as I can see they behave in the same way. Does anybody know what the differences are?

Like 0

Like

2 comments

Im not sure about this. But what I understand is that if you have created an organisation role, then you can still create an organisation role under that. But if you have created a division, then you can create further divisions under that and not organisation.

Hello Harvey, 



In general, an answer provided by Krishna in the comment above is correct. 

Difference between these two types for the system is only in possibility of creating hierarchy from organizational role including other organizations. 

It was implemented for cases, when you have a few separate offices which have different structure so you could correctly configure each role and rights for it. 



In this case you could have 2 separate organizational roles for each office for which different divisions are configured. 



Kind regards,

Roman

Show all comments