Hi All,

 

Is there any ready-made solution to handle snapshots of sales transaction (like Opportunities and related product data) which should be "freezed" (eg. on demand or recurrently) in case to analyze/compare them in the future ?

 

Regards,

Marcin Kott

Like 0

Like

1 comments

Hello Marcin, 

 

Unfortunately, there is no basic option to "freeze" the information in the CRM system for further comparison. 

 

We recommend using the Change Log functionality to view the changes made to your website's data. 

 

Best regards, 

Olga. 

Show all comments

The documentation shows how to create a multiline field in the List view in mobile app, is it possible to do similar in a detail in mobile?  Is there documentation for Terrasoft.sdk.RecordPage like there is for GridPage?

Like 0

Like

9 comments
Best reply

Glenn Smith,

 

Yes, it is an expected behavior of the application.

 

Best regards,

Norton

Dear Glenn,

 

Unfortunately, there is no documentation for Terrasoft.sdk.RecordPage. However, it is possible to create a multiline text field in a mobile application in the same way as it was shown in Terrasoft.sdk.GridPage documentation.

 

Please find an example of how to add the multiline “Name” field to an edit-page below:

 

Terrasoft.sdk.RecordPage.addColumn('Contact', {

    name: 'Name',

    position: 0,

    isMultiline: true,

    label: 'CustomContactRecordPage_primaryColumnset_Name_label'

});

 

Best regards,

Norton

Norton Lingard,

 

That seems the same as what I tried in a modified version of the mobile detail example, which did not work for me.

 

Terrasoft.sdk.GridPage.setPrimaryColumn("ContactCareer", "Description");

// Adding the [description] column to the primary column collection.

Terrasoft.sdk.RecordPage.addColumn("ContactCareer", {

        name: "Description",

        isMultiline: true,

        position: 1

    }, "primaryColumnSet");

// Delete the [Contact] previous primary column  from the primary column collection.

Terrasoft.sdk.RecordPage.removeColumn("ContactCareer", "Contact", "primaryColumnSet");

Norton Lingard,

Additional update.  It shows about 45 characters on one line followed by ...   If I click again on that text it shows the full multiline text.  Is that expected behavior?

Glenn Smith,

 

Please see a multiline text field on Account edit page, it is the “Name” field. This field is configured in the “MobileAccountModuleConfig” module from the “Mobile” package.

 

Best regards,

Norton

Norton Lingard,

attached are 3 screenshots.  first is the list view with Job Experience detail at the bottom.  Next is after clicking Job Experience detail.  Note that it only shows one line of text.  Third is after I click on the single line text, it shows full multi-line text

Norton Lingard,

second image

Norton Lingard,

third image

Glenn Smith,

 

Yes, it is an expected behavior of the application.

 

Best regards,

Norton

Thanks

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

When I send the following JSON via DataService it fails:

{"Filters":{"rootSchemaName":"AccountCommunication","logicalOperation":0,"filterType":6,"items":{"filter1":{"LeftExpression":{"ColumnPath":"CommunicationType","ExpressionType":"SchemaColumn"},"ComparisonType":3,"FilterType":4,"RightExpressions":[{"Parameter":{"DataValueType":"Lookup","Value":"2b387201-67cc-df11-9b2a-001d60e938c6"},"ExpressionType":"Parameter"},{"Parameter":{"DataValueType":"Lookup","Value":"6a3fb10c-67cc-df11-9b2a-001d60e938c6"},"ExpressionType":"Parameter"},{"Parameter":{"DataValueType":"Lookup","Value":"9a7ab41b-67cc-df11-9b2a-001d60e938c6"},"ExpressionType":"Parameter"},{"Parameter":{"DataValueType":"Lookup","Value":"ee1c85c3-cfcb-df11-9b2a-001d60e938c6"},"ExpressionType":"Parameter"}]}}},"columns":{"items":{"Account":{"expression":{"columnPath":"Account","expressionType":"0"}},"Number":{"expression":{"columnPath":"Number","expressionType":"0"}},"Id":{"expression":{"columnPath":"Id","expressionType":"0"}}}},"RootSchemaName":"AccountCommunication","OperationType":"0","AllColumns":"false"}

Server returned HTTP response code: 500 for URL: https://esp.bpmonline.com/0/dataservice/json/SyncReply/SelectQuery

This JSON should simply read all AccountCommunication options of types Email, Fax, Phone, AltPhone.

When I remove even just one of the filter expressions (no matter which: Email, Fax, Phone or AltPhone) from the JSON, it runs fine:

{"Filters":{"rootSchemaName":"AccountCommunication","logicalOperation":0,"filterType":6,"items":{"filter1":{"LeftExpression":{"ColumnPath":"CommunicationType","ExpressionType":"SchemaColumn"},"ComparisonType":3,"FilterType":4,"RightExpressions":[{"Parameter":{"DataValueType":"Lookup","Value":"2b387201-67cc-df11-9b2a-001d60e938c6"},"ExpressionType":"Parameter"},{"Parameter":{"DataValueType":"Lookup","Value":"6a3fb10c-67cc-df11-9b2a-001d60e938c6"},"ExpressionType":"Parameter"},{"Parameter":{"DataValueType":"Lookup","Value":"ee1c85c3-cfcb-df11-9b2a-001d60e938c6"},"ExpressionType":"Parameter"}]}}},"columns":{"items":{"Account":{"expression":{"columnPath":"Account","expressionType":"0"}},"Number":{"expression":{"columnPath":"Number","expressionType":"0"}},"Id":{"expression":{"columnPath":"Id","expressionType":"0"}}}},"RootSchemaName":"AccountCommunication","OperationType":"0","AllColumns":"false"}

This doesn't make sense to me.

The error code started to appear about 2 weeks ago. Previously it worked fine.

Like 0

Like

2 comments

Dear Yuriy, 

 

The 500 exception simply means that something is wrong. If you need to see the exact exception message, please open google chrome developers console (Ctr+Shift+I), go to the "Network" tab, catch the request and read a message in the "Response" and "Preview" tabs. 

Please send the text of an error from the  "Response" or "Preview" tabs.

 

Best regards, 

Dennis  

Dennis Hudson,

Thank you for pointing this, however, I don't use a browser for sending the requests, they are sent programmatically. Anyway, I researched the 500 error and it is... 

Maximum number of 20000 records exceeded while loading "AccountCommunication"! How could I not have known! It's obvious by the symptoms. Solved

Show all comments

Is there a version if FastReport Designer for MacOs ? If not, how is it possible to work with Reports on MacOs ?

Like 0

Like

3 comments

Hello Ricardo, 



Unfortunately, as it is stated in this academy article: https://academy.creatio.com/documents/technic-sdk/7-16/setting-reports-creatio

The following components are required:

  1. Windows OS.
  2. 64-bit Microsoft .Net Framework 4.7.2.

However, we will notify the responsible team so they will check the possibilities of adding or replacing this functionality in further releases so it will became available to work with on iOS. 



Kind regards,

Roman

Roman Brown,

 Would be nice as well some alternative for linux :)

Show all comments

Hello,

 

I want to enable a "Completed & Follow" status en activities, in the process to treat this activity status I want to enable the possibility to create a Zoom meeting in case of, but on the Activity table i didn't found the "Create Zoom Meeting" field, how can I did it?

 

I found a "Zoom Meeting" but have no idea how to complete it, and didn't found how to relate with Activity table.

 

Thanks in advance

Like 0

Like

4 comments
Best reply

Hello Julio,



We recommend you to log out and log back in the application after you add the 'ZoomIntegration' package to the dependencies.



The 'Create Zoom Meeting' field should become available for the 'Activity' table in the 'Add data' process element after you do this. 

 

Hope this helps.

Hi Julio, 

 

Are you trying to configure your business process in the "Custom" package or any other? 

Hello S.Kobizka,

 

In another Package, I add the ZoomIntegration package to the dependencies, see at http://prntscr.com/t0snjq

Hello Julio,



We recommend you to log out and log back in the application after you add the 'ZoomIntegration' package to the dependencies.



The 'Create Zoom Meeting' field should become available for the 'Activity' table in the 'Add data' process element after you do this. 

 

Hope this helps.

S.Kobizka,

Thanks, now works, I'm sure I will logout & login and also clear the cache, but today I did it again and have the field, thank you very much!

Show all comments

I'm using this app https://marketplace.creatio.com/app/field-surveys-creatio

I've created a questionnaire https://prnt.sc/sffjnq and I've added this step to Field visit rule https://prnt.sc/sffkeq

On mobile app I see this extra step, new records appear in section Surveys, but in mobile app (iOS) screens with questions don't pop up like on this screenshot https://prnt.sc/sfflkh 

Any suggestions?

Like 0

Like

2 comments

Hi Alex,

 

please specify a version of the Creatio mobile app to reproduce the issue.

After I reinstalled the package on the other instance it works fine. Thanks

Show all comments

Hi Creatio Community!

We are looking for an add on for capturing MSM texts with our customers. We don't need to send out Mass Text messages. We would just like to be able to easily log the text messages as an activity in Creatio. I have looked through some add ons already and you have to pay per message. Is there an easier way to do this? Or what add ons have you used?

Like 0

Like

1 comments

Hello,

Here is the SMS extension that usually used for sending single SMS messages:

https://marketplace.creatio.com/app/infobip-connector

It also has the option to record the sending instances on the activity detail.

 

Regards,

Dean

Show all comments

Creatio CRM has the feature of exporting data by filtering some records. Then we can export the data using the export to excel option.

However, for customers(end user) it may be confusing to apply multiple filters.

 

In this case lets suppose I only want to apply filter to only 2 fields.

So I want to create a process which will ask user to input values for those 2 filters. After that process will automatically generate a excel file which have all the records filtered according to the 2 filters input values.

 

Is this possible to do so?

I tried to create process but how to export data I can not figure out.

 

Like 0

Like

4 comments

Hello Ramnath,

 

It is better to use a standard scenario of specifying the filter and exporting records using the "Export to excel" action in the section. If you could create a script-task that could trigger the "ReportService" service and "GetExportToExcelKey" method inside this service based on the filtering parameters than this process could be executed. But we have no examples of this logic implementations so you need to look through the "GetExportToExcelKey" method and test it on your side.

 

Best regards,

Oscar

Hey Oscar,

 

I have very less development experience on Creatio Platform so I can't think I can develop scripts right now.

 

Rather I came up with another solution - Dynamic folder with access rights. So user will have access to the dynamic folder where they can filter record according to two fields. But I am unsure if giving them edit access may result in modifying the filter parameters. 

 

For example I want to find all the records that were created in between a period - I can create a dynamic folder with two fields -

(Created on > date_1 and Created on <date_2)

 

But having access to edit dynamic folder, the customer can also modify Created on parameter to modified on. 

RAMNATH SHARMA,

 

They cannot modify the Created On value of the record (since we are discussing the Created On column for records not for the folder itself (by the way they cannot modify Created On for folders as well)).

 

Yes, the client can modify the parameter itself (replace Created On with Modified On), but the client needs to understand that he/she shouldn't do it. By the way the client can create such a filter on their own (the possibility of advanced filters was developed for such proposes). Why there should be a process that should do this? It is easier to do it manually than via a process.

 

Also you can remove edit access rights for all users in the system using the "Change access rights" process element. As a result the client will see the folder, but won't be able to modify it.

 

Best regards,

Oscar

Oscar,

I thought of making the the process of exporting data easily with one click. That's why I wanted to see if it's possible with process.

Show all comments

Dear Team,

The below code is in script task .Using "Terrasoft.OrderDirection.DESC" in the below code i getting errors.Please tell me how to get the order by column desc. 

 

var fileId = Get("FileId");

var toaddress= Get("toAddress");

        Stream FileA = null;

        string Fname = "";

        var entitySchemaManager = UserConnection.EntitySchemaManager;

        var entitySchemaQuery = new EntitySchemaQuery(entitySchemaManager, "UsrOfferManagerFile");

        var fileDataColumnName = entitySchemaQuery.AddColumn("Data").Name;

        var fileName = entitySchemaQuery.AddColumn("Name").Name;

        entitySchemaQuery.Filters.Add(entitySchemaQuery.CreateFilterWithParameters(FilterComparisonType.Equal,"UsrOfferManager", fileId));

        var collection = entitySchemaQuery.GetEntityCollection(UserConnection);

        foreach(var ent in collection) {

                   FileA = ent.GetStreamValue("Data");

                Fname = ent.GetTypedColumnValue("Name");

                break;

                }

    try {

                MailMessage mail = new MailMessage();

                mail.From = new MailAddress("rpocomm@tmie2e.com");

                mail.To.Add(new MailAddress(toaddress));

                mail.Bcc.Add(new MailAddress("chandanak@tmie2e.com"));

                mail.Subject = "Offer Letter";

                //mail.Body = body;

                mail.IsBodyHtml = true;                

                SmtpClient client = new SmtpClient();

                client.Host = "210.18.64.237";

                client.Port = 6676;

                 if (FileA != null)

                 {

                    mail.Attachments.Add(new System.Net.Mail.Attachment(FileA, Fname));

                 }

                client.EnableSsl = false;

                client.Credentials = new NetworkCredential("rpocomm","rpocomm#2018");

                client.DeliveryMethod = SmtpDeliveryMethod.Network;

                client.Send(mail);

                mail.Dispose();

            } 

            catch(Exception e) {

                throw new Exception("Mail.Send: " + e.Message);

            }

return true;

 

Regards,

Sekhar.

Like 0

Like

1 comments

Terrasoft.OrderDirection.DESC is used for ordering records only in the client esq. The issue occurs because in script task the server esq is used. Please find the example of ordering records in the server esq in the article by the link below:

https://community.creatio.com/articles/how-sort-records-date-modification-entityschemaquery

Show all comments