Hi community,

 

We have this situation where we need to create a bi-directional connection with our customer platform, using SOAP protocol. We would like to know if its possible to create a SOAP based services in Creatio to be accessed by our customer? If yes, any information on how to implement this?

 

Thanks in Advance.

 

Best Regards,

Pedro Pinheiro

Like 0

Like

10 comments

Hello Pedro,

 

You need to develop a configuration service (either regular or anonymous) using SOAP. Here is the article that describes how to configure web-services and integrate them into the Creatio app.

 

For example:

1) Create a source code for the service contract SPMSUBPServiceContract:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
 
namespace SPMSUBPService
{
    [ServiceContract]
    public interface IService
    {
        [OperationContract]
        SPMClientInfoResponse SPMClientInfo(string Login);
    }
 
    [DataContract]
    public class SPMClientInfoResponse
    {
        bool success = true;
        string errorText = "";
 
        [DataMember]
        public bool Success
        {
            get { return success; }
            set { success = value; }
        }
 
        [DataMember]
        public string ErrorText
        {
            get { return errorText; }
            set { errorText = value; }
        }
    }
}

and the source code of the SPMSUBPService service directly:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
 
namespace SPMSUBPService
{
    public class SPMSUBPService : IService
    {
        public SPMClientInfoResponse SPMClientInfo(string Login)
        {
            return new SPMClientInfoResponse();
        }
    }
}

2) Create a file with SPMSUBPService.svc name in the Terrasoft.WebApp\ServiceModel folder with the following text:

 

<%@ ServiceHost Language="C#" Debug="true" Service="SPMSUBPService.SPMSUBPService" Factory="System.ServiceModel.Activation.ServiceHostFactory" %>

 

3) Add the description of the service to the Terrasoft.WebApp\ServiceModel\http\services.config file:

&lt;services&gt;
    ...
    &lt;service behaviorConfiguration="BaseServiceBehavior" name="SPMSUBPService.SPMSUBPService"&gt;
        &lt;endpoint name="SPMSUBPServiceEndPoint"
            binding="webHttpBinding"
            behaviorConfiguration="RestServiceBehavior"
            bindingNamespace="http://Terrasoft.WebApp.ServiceModel"
            contract="SPMSUBPService.IService" /&gt;
        &lt;endpoint address="soap" binding="basicHttpBinding" contract="SPMSUBPService.IService"/&gt;
        &lt;endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /&gt;
    &lt;/service&gt;
    ...
&lt;/services&gt;

4) Modify the Terrasoft.WebApp\Web.config file:

...
&lt;location path="ServiceModel/SPMSUBPService.svc"&gt;
    &lt;system.web&gt;
      &lt;authorization&gt;
        &lt;allow users="*" /&gt;
      &lt;/authorization&gt;
    &lt;/system.web&gt;
&lt;/location&gt;
...

And everything is ready, the service is accessible via /0/ServiceModel/SPMSUBPService.svc and the WSDL as well /0/ServiceModel/SPMSUBPService.svc?singleWsdl

 

Best regards,

Oscar

Oscar Dylan,

 

Thank you for your response.

 

I've tried to implement the solution you provided above and I'm getting this error when sending a request through both Postman and SoapUI.

Can you please tell me what this error means and how can I fix it?

 

Thanks in Advance.

 

Best Regards,

Pedro Pinheiro

 

Hi Pedro Pinheiro,

Did you got the WSDL file. For me it is showing 404 not found error if I try to access that url.

Also how can we know the what input format to pass parameters to method. Can you share those details here.

 

Thanks in advance.

Regards,

Manideep.

Hi Korni Manideep Reddy,

 

We manage to make this service working, but since it was a long time ago we don't have the specific steps to fix the error.

 

However,  we have the updated steps that we use in order to make the service available. Maybe if you go through these following steps  you could fix your problem.

 

Note: These steps only work for .Net Framework instances.

 

1. Create a new file called “DemoServiceName.svc" in ..\Terrasoft.WebApp\ServiceModel folder, and add this line:

 

<%@ ServiceHost Language="C#" Debug="true" Service="Terrasoft.Configuration.DemoServiceNameSpace.DemoServiceName” Factory="System.ServiceModel.Activation.ServiceHostFactory" %>

 

2. Add the following configuration to the ..\Terrasoft.WebApp\web.config file:

 

<configuration>

  ...

  <location path="ServiceModel/DemoServiceName.svc">

    <system.web>

      <authorization>

        <allow users="*" />

      </authorization>

    </system.web>

  </location>

  ...

  <appSettings>

    ...

    <add key="AllowedLocations" value="https://yourwebsitedomain.creatio.com/0/;ServiceModel/DemoServiceName.s…"  />

    ...

  </appSettings>

  ...

</configuration>

 

3. Add the following service to the ..\Terrasoft.WebApp\ServiceModel\https\services.config file:

 

    <service behaviorConfiguration="BaseServiceBehavior" name="Terrasoft.Configuration.DemoServiceNameSpace.DemoServiceName">

        <endpoint name=“DemoServiceNameEndpoint" address="" binding="webHttpBinding" behaviorConfiguration="RestServiceBehavior" bindingNamespace="http://Terrasoft.WebApp.ServiceModel" contract="Terrasoft.Configuration.DemoServiceNameSpace.IDemoServiceNameRest" />

        <endpoint address="soap/demoservicename” binding="basicHttpBinding" contract="Terrasoft.Configuration.DemoServiceNameSpace.IDemoServiceNameSoap"/>

    </service>

 

4. Add the following service to the ..\Terrasoft.WebApp\ServiceModel\http\services.config file:

 

    <service behaviorConfiguration="BaseServiceBehavior" name="Terrasoft.Configuration.DemoServiceNameSpace.DemoServiceName">

 

        <endpoint name="DemoServiceNameEndpoint" address="" binding="webHttpBinding" behaviorConfiguration="RestServiceBehavior" bindingNamespace="http://Terrasoft.WebApp.ServiceModel" contract="Terrasoft.Configuration.DemoServiceNameSpace.IDemoServiceNameRest" />

 

        <endpoint address="soap/demoservicename" binding="basicHttpBinding" contract="Terrasoft.Configuration.DemoServiceNameSpace.IDemoServiceNameSoap"/>

 

    </service>

 

5. In the ..\Terrasoft.WebApp\ServiceModel\https\bindings.config file we need to change the basicHttpBinding to:

 

<basicHttpBinding>

        <binding maxReceivedMessageSize="10485760">

            <readerQuotas maxDepth="32" maxStringContentLength="10485760" maxArrayLength="10485760" maxBytesPerRead="10485760"/>

            <security mode="Transport">

                <transport clientCredentialType="None" />

            </security>

        </binding>

        <binding name="ReportServiceBinding">

            <security mode="Transport">

                <transport clientCredentialType="None" />

            </security>

        </binding>

</basicHttpBinding>

 

 

6. In the ..\Terrasoft.WebApp\ServiceModel\http\bindings.config file we need to change the basicHttpBinding to:

 

<basicHttpBinding>

    <binding maxReceivedMessageSize="10485760">

        <readerQuotas maxDepth="32" maxStringContentLength="10485760" maxArrayLength="10485760" maxBytesPerRead="10485760"/>

        <security mode="Transport">

            <transport clientCredentialType="None" />

        </security>

    </binding>

    <binding name="ReportServiceBinding" />

</basicHttpBinding>

 

After all of this changes are made the application needs to be restarted.

 

About the input format of the method, we used a CustomObject and CustomResponse which we define using the DataContract attribute.

 

        public class DemoServiceName: IDemoServiceNameRest, IDemoServiceNameSoap {
             //This service needs to be anonymous.
             //Implement Methods here. you don't need to define WebInvoke here.
        }
 
        [ServiceContract]
		public interface IDemoServiceNameSoap
		{
           	[OperationContract]
		    CustomResponse MethodNameSoap(CustomObject cobject);  
		}
 
 
		[ServiceContract]
		public interface IDemoServiceNameRest
		{
          	[OperationContract]
			[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare)]
		    CustomResponse MethodNameRest(CustomObject cobject);
		}

 

Hope this helps solving your issue.

 

Best Regards,

Pedro Pinheiro

 

 

 

Hi Pedro Pinheiro,

I have tried above configuration settings But I am still not able to set  soap service. I am getting 500 ServiceActivationException.

 

Rakshith Dheer Reddy,

 

What is the error description you receive when trying to access "http://localhost:83/0/ServiceModel/SoapTestService.svc" through a browser?

 

Best Regards,

Pedro Pinheiro

Pedro Pinheiro,

We are getting this error from the browser. 

Hi Pedro Pinheiro,

In Postman, I am getting 500 error with ActionNotSupported.

Hi Kumaran K,

 

Sorry, I forgot to mention that you need to add the service behavior for the metadata. This can be done with the following steps:

 

1. In the ..\Terrasoft.WebApp\ServiceModel\https\behaviors.config file we need to set the httpsGetEnabled to true on both behaviors:

 

&lt;serviceBehaviors&gt;
 
...
 
              &lt;behavior name="BaseServiceBehavior"&gt;
 
                       ...
 
                       &lt;serviceMetadata httpsGetEnabled="true" /&gt;
 
                       ...
 
              &lt;/behavior&gt;
 
             &lt;behavior name="RestServiceBehavior"&gt;
 
                       ...
 
                       &lt;serviceMetadata httpsGetEnabled="true" /&gt;
 
                       ...
 
             &lt;/behavior&gt;
 
...
 
&lt;/serviceBehaviors&gt;

 

2. In the ..\Terrasoft.WebApp\ServiceModel\http\behaviors.config file we need to set the httpGetEnabled to true on both behaviors:

 

&lt;serviceBehaviors&gt;
 
...
 
              &lt;behavior name="BaseServiceBehavior"&gt;
 
                       ...
 
                       &lt;serviceMetadata httpGetEnabled="true" /&gt;
 
                       ...
 
              &lt;/behavior&gt;
 
             &lt;behavior name="RestServiceBehavior"&gt;
 
                       ...
 
                       &lt;serviceMetadata httpGetEnabled="true" /&gt;
 
                       ...
 
             &lt;/behavior&gt;
 
...&lt;/serviceBehaviors&gt;



Hope this helps.

 

Best Regards,

Pedro Pinheiro

Pedro Pinheiro,

Thank you, Pedro.

The soap service is working.

Show all comments

What?

E-mail tab doesn't remember prepared answer when you click on go back in browser or go to another section.

How to fix?

Implementing a script/intelligence that remember your e-mail answer when clicking to a new section like Contacts or Companies.

Why?

To avoid to loose your e-mail (especially e-mails where you typed 10 minutes) and leave frustrations out.

Extra

Example of issue see screenshots

 

Like 0

Like

3 comments

Dear Jonas,



In order to resolve the issue please do the following:

1. Create a replacing client module for the “EmailMessagePublisherPage” schema.

2. Add the following code to the schema:

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

    return {

        

        entitySchemaName : "Activity",

        

        mixins : {},

        

        attributes : {},

        

        methods : {

            

            setRecipientValue : function(data){

                this.callParent(arguments);

                var bodyOfEmail = sessionStorage.getItem("bodyOfEmail");

                this.set("Body", bodyOfEmail);

            },

            

            isNeedToBePublished : function(){

                sessionStorage.setItem("bodyOfEmail", this.get("Body"));

                return Boolean(this.get("Body"));

            }

                

        },

        

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

    }; 

});  

3. Save the changes https://prnt.sc/pp5ejs



Best regards,

Norton

 

Norton Lingard,

Thank you for the feedback.

Norton Lingard,

I have just tried this and it didn't work. I wrote some text in the email body, but the isNeedToBePublished wasn't triggerd by clicking the close button on the Case page. 

 

I instead used an override of destroy

 

destroy: function () {
		sessionStorage.setItem("bodyOfEmail", this.get("Body"));
		this.callParent(arguments);
},

 

Show all comments

 

When I open the page case (it's customized page) to create a new case, I have this tabs:

When I do "Open Case designer", I don't have the tab Processing.

Note: I don't want the tab Processing.

 

Can you help me?

 

Thank you

Like 0

Like

3 comments

Hello Carolina,

Seems that you have some package that differs from "Custom" package specified as a value of "Current package" system setting and that's why you don't have Processing tab in section wizard.

Anyway to achieve your task please go to configurations and find CasePage from your custom package and add this part:

{

                "operation": "remove",

                "name": "ProcessingTab"

            },

            {

                "operation": "remove",

                "name": "MessageHistoryGroup"

            },

            {

                "operation": "remove",

                "name": "MessageHistoryContainer"

            },

            {

                "operation": "remove",

                "name": "MessageHistory"

            },

            {

                "operation": "remove",

                "name": "ShowSystemMessagesLabel"

            },

            {

                "operation": "remove",

                "name": "HideSystemMessagesLabel"

            }

Please also get sure that you don't have ProcessingTab, MessageHistoryGroup, MessageHistoryContainer, MessageHistory, ShowSystemMessagesLabel and HideSystemMessagesLabel specified anywhere on this page. Once done please save the page and this tab will be removed.

Best regards,

Oscar

Oscar Dylan,

Hi Oscar

I've an issue with processing tab in a custom edit page for the section case.

I need to show the "PROCESSING tabs" in the new edit page.

I tried to add in the DIFF section these items, but the tab not appears.

Can you help me ?

{

                "operation": "insert",

                "name": "MessageHistoryGroup",

                "values": {

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

                    "caption": {

                        "bindTo": "Resources.Strings.MessageHistoryGroupCaption"

                    },

                    "items": [],

                    "tools": [],

                    "isHeaderVisible": {

                        "bindTo": "getIsMessageHistoryV2FeatureDisabled"

                    },

                    "controlConfig": {

                        "collapsed": false,

                        "collapsedchanged": {

                            "bindTo": "onMessageHistoryGroupCollapsedChanged"

                        }

                    },

                    "wrapClass": ["message-history-control-group"]

                },

                "parentName": "ProcessingTab",

                "propertyName": "items",

                "index": 0

            },

            {

                "operation": "insert",

                "name": "ShowSystemMessagesLabel",

                "parentName": "MessageHistoryGroup",

                "propertyName": "tools",

                "values": {

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

                    "caption": {

                        "bindTo": "Resources.Strings.ShowSystemMessagesString"

                    },

                    "labelClass": ["systemMessageVisibilityLabel"],

                    "visible": {

                        "bindTo": "getShowSystemMessagesLabelVisible"

                    },

                    "click": {

                        "bindTo": "showSystemMessages"

                    }

                },

                "index": 0

            },

            {

                "operation": "insert",

                "name": "HideSystemMessagesLabel",

                "parentName": "MessageHistoryGroup",

                "propertyName": "tools",

                "values": {

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

                    "caption": {

                        "bindTo": "Resources.Strings.HideSystemMessagesString"

                    },

                    "labelClass": ["systemMessageVisibilityLabel"],

                    "visible": {

                        "bindTo": "getHideSystemMessagesLabelVisible"

                    },

                    "click": {

                        "bindTo": "hideSystemMessages"

                    }

                },

                "index": 1

            },

            {

                "operation": "insert",

                "parentName": "MessageHistoryGroup",

                "name": "MessageHistoryContainer",

                "values": {

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

                    "items": []

                },

                "propertyName": "items",

                "index": 0

            },

            {

                "operation": "insert",

                "parentName": "MessageHistoryContainer",

                "propertyName": "items",

                "name": "MessageHistory",

                "values": {

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

                    "moduleName": "MessageHistoryModule",

                    "afterrender": {"bindTo": "loadMessage"},

                    "afterrerender": {"bindTo": "loadMessage"}

                }

            },

            {

                "operation": "insert",

                "name": "ProcessingTab",

                "values": {

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

                    "items": []

                },

                "parentName": "Tabs",

                "propertyName": "tabs",

                "index": 0

            },

 

Stefano Bassoli,

 

Hi,

 

This code is not enough unfortunately since there is no declaration of the getHideSystemMessagesLabelVisible or getShowSystemMessagesLabelVisible methods for example or there is no ShowSystemMessages and HideSystemMessages messages declaration in the module and many more other missing things (like subscribing to sandbox events or adding CSS modules to the Case1Page (custom case edit page module) module or adding needed RelationshipsRecordsUtilities mixin). There is an already working code in the CasePage module, review it and copy all the content related for proper "Processing" tab processing.

 

Best regards,

Oscar 

Show all comments
Question

I have added new section pages on customized page.

What is the data binding that has to be added for these section pages so that it can be packaged and installed in other environment.

I have added SysModuleEntity, SysModuleEdit and SysDetail.

 

Thank you :)

Like 0

Like

1 comments

Dear Caroline, 

Overall you are correct. You would need to add SysModuleEntity, SysModuleEdit and SysModule plus other tables that are used in those pages. To find out what exact data bindings need to be added you can create a new package, create a section in it, for this section create several pages and see what bindings got automatically added to the data bindings of the package (All needed ones would be added automatically).

Best regards,

Dennis  

Show all comments

I add 3 buttons to customized case section.

With this code:

define("CaseSection", [], function() {
    return {
        entitySchemaName: "Case",
        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
        attributes: {},
        methods: {
            getDefaultDataViews: function() {
                var baseDataViews = this.callParent(arguments);
                baseDataViews.GridDataViewMyCases = {
                    name: "GridDataViewMyCases",
                    caption: this.get("Resources.Strings.MyCasesButtonCaption"), // Section header
                    hint: this.get("Resources.Strings.MyCasesButtonCaption"), // Hint for button
                    icon: this.get("Resources.Images.MyCasesDataViewIcon") // Image for button
                };
                baseDataViews.GridDataViewTeamCases = {
                    name: "GridDataViewTeamCases",
                    caption: this.get("Resources.Strings.TeamCasesButtonCaption"), // Section header
                    hint: this.get("Resources.Strings.TeamCasesButtonCaption"), // Hint for button
                    icon: this.get("Resources.Images.TeamCasesDataViewIcon") // Image for button
                };
                baseDataViews.GridDataViewManager = {
                    name: "GridDataViewManager",
                    caption: this.get("Resources.Strings.ManagerButtonCaption"), // Section header
                    hint: this.get("Resources.Strings.ManagerButtonCaption"), // Hint for button
                    icon: this.get("Resources.Images.ManagerDataViewIcon") // Image for button
                };
                return baseDataViews;
            },
            loadActiveViewData: function() {
                var activeViewName = this.getActiveViewName();
                if (activeViewName === "GridDataViewMyCases") {
                    this.loadGridData();
                }
                else if (activeViewName === "GridDataViewTeamCases") {
                    this.loadGridData();
                }
                else if (activeViewName === "GridDataViewManager") {
                    this.loadGridData();
                }
                this.callParent(arguments);
            },
            loadGridDataView: function(loadData) {
                var gridData = this.getGridData();
                if (gridData && loadData) {
                    gridData.clear();
                }
                this.setViewFilter(this.get("ActiveViewName"));
                this.reloadGridColumnsConfig(false);
                this.reloadSummaryModule();
                this.callParent(arguments);
            },
            loadGridDataViewMyCases: function(loadData) { // "load" + DataView.name
                this.loadGridDataView(loadData);
            },
            loadGridDataViewTeamCases: function(loadData) { // "load" + DataView.name
                this.loadGridDataView(loadData);
            },
            loadGridDataViewManager: function(loadData) { // "load" + DataView.name
                this.loadGridDataView(loadData);
            },
            setActiveView: function(activeViewName) {
                this.callParent(arguments);
                if (activeViewName === "GridDataViewMyCases") {
                    this.set("IsGridDataViewVisible", true);
                }
                else if (activeViewName === "GridDataViewTeamCases") {
                    this.set("IsGridDataViewVisible", true);
                }
                else if (activeViewName === "GridDataViewManager") {
                    this.set("IsGridDataViewVisible", true);
                }
            },
            setViewFilter: function(activeViewName) { // Add filter for your "DataView"
                var sectionFilters = this.get("SectionFilters");
                if (activeViewName === "GridDataViewMyCases") {
                    sectionFilters.add("FilterB2BType", this.Terrasoft.createColumnFilterWithParameter(
                        this.Terrasoft.ComparisonType.NOT_EQUAL, "Status.Id", "3E7F420C-F46B-1410-FC9A-0050BA5D6C38"));
                }
                else if (activeViewName === "GridDataViewTeamCases") {
                    sectionFilters.add("FilterB2BType", this.Terrasoft.createColumnFilterWithParameter(
                        this.Terrasoft.ComparisonType.NOT_EQUAL, "UsrStatus", "Closed"));
                }
                else if (activeViewName === "GridDataViewManager") {
                    sectionFilters.add("FilterB2BType", this.Terrasoft.createColumnFilterWithParameter(
                        this.Terrasoft.ComparisonType.NOT_EQUAL, "UsrStatus", "Closed"));
                } else {
                    sectionFilters.removeByKey("FilterB2BType");
                }
            }
        }
    };
});

I defined all strings (MyCasesButtonCaption, MyCasesDataViewIcon, TeamCasesButtonCaption, TeamCasesDataViewIcon, ManagerButtonCaption, ManagerDataViewIcon) on case section structure.

 

But when I select one of them, the button disappears:

 

Can you help me?

Regards

Like 0

Like

2 comments

Probably the size of the image is incorrect. Please download an image from an out-of-the-box data view and create your one with the same size and structure. 

Hello Carolina.. I had the same issue before and what i discovered is that the Image should contain 2 icons as shown in the picture below; one for the icon when it is unselected and the second one is when it is selected (taking into consideration the dimensions of each icon)

Show all comments

Hello,

Is there any way for creating a PDF from a printable? I need something to perform the function since it was pulled from the out of the box features for bpm'onine. Any help would be greatly appreciated.

Like 0

Like

22 comments

Hello Kevin,

Starting from 7.14.2 version the functionality of PDF-convertation was excluded from an out-of-the-box features list. All clients that are updating between versions and already use such a feature in their printables have this feature being available.

Currently our R&D team is working on implementation of this feature in an out-of-the-box version and we hope that it will return back very soon. We are very sorry for any inconveniences caused.

Best regards,

Oscar

Are there any updates on the PDF-printables?

Julius,

 

Unfortuantely there is no update regarding PDF-convertation in Word Printables, but the functionality of PDF-convertation is available in Fast Reports new feature added in 7.15.3 version. You can read more about it here.

 

Best regards,

Oscar

Hi Oscar,

 

Please add this feature quickly.

We have new projects and we can't explain how sucha a basic functionality is not availabe.

And to develop Fast Reports is not the same as a simple Printable.

 

Regards,

Luis

This was a handy feature. Fast Reports are not easy to build.

KrishnaPrasad,

I agree.  There is nothing FAST about Fast Reports.

This feature is really difficult to implement> I cannot make changes in each and every line if there is any new fields need to be added to printable. 

fast Report - Convert into the pdf is not working for me.

 

 

can you provide any other alternative way.

Any feedback on this Oscar:

"Currently our R&D team is working on implementation of this feature in an out-of-the-box version and we hope that it will return back very soon. We are very sorry for any inconveniences caused."?

Thks

Luis

Hi Team,

 

Is there any update in the latest version 7.18.1, still we don't have the option to "Convert to PDF" OOB in the printable section. Is there any alternative other than using Fast Reports?

 

I would like to know if there is a way to force the convertion to PDF in the last versions

Hi Creatio,



2 years into this request, any news regarding this point?

I (and many others in this thread, it seems to be the most popular request in the community) are waiting for a long time for this.

Fast Reports is really a lot of work to setup and to maintain/ introduce minor changes.

Hopefully it is one of the surprise features of the freedom release.

 

Thanks,

Luis

Luis Tinoco Azevedo, Use protected Word files (.docx) in the meantime. It's better than .pdfs in my opinion. But yes. I know, many customers like .pdfs since they're familiar

Hi Team,

Creation has moved to freedom version and still we don't have the option to "Convert to PDF" OOB in the printable section. Is there any alternative other than using Fast Reports? And the previous "Save Printable" business process element also doesn't seem to work for the latest version and document saves as Word doc. ?

Julius,

How do we use protected word files in this case?

Can you please describe the steps in detail?

How to use it in Creatio printables?

Hi Team,

We keep struggling with our customer for an option to convert printables to PDF. Will it ever be possible, as it was in the past? 

 

 

Julius,

Can you please detail?

Hello, some news regarding to generate PDF reports in Creatio, from 2019 we are waiting to can create pdf reports again, some news is this

on the R&D backlog?

Hello,

 

This functionality is implemented in one of the apps in the Creatio Marketplace: Aspose.PDF connector for Creatio

Serhii Parfentiev,

Not usefull, before 2019 is was available free, aspose connector requires pay a license/service :-(

 

Creatio proimise here it was working on it to get it available again, see the comment of @Oleg Drobinaon oct 2019 in this post: "

Hello Kevin,

Starting from 7.14.2 version the functionality of PDF-convertation was excluded from an out-of-the-box features list. All clients that are updating between versions and already use such a feature in their printables have this feature being available.

Currently our R&D team is working on implementation of this feature in an out-of-the-box version and we hope that it will return back very soon. We are very sorry for any inconveniences caused.

Best regards,"

Serhii Parfentiev,

This answer is not acceptable. It's not a nice to have. Is something every small app contains. As Creatio use too... come on... 5 years???

Yep, time to get this back, and soon.



PDF exports + also the ability to schedule emails reports with attached excel & pdf (not Word), in an easy way for end users (not with business process, which is already advanced for most business users) , helps are clients to respond to their management's requests. 



Today these features that exist in most of the other tools are inexistent as OOTB features (not an addon or with code) .... which should nowadays be a hygiene factor.

Show all comments

Similar to excel, is it possible to sort multiple columns in the list view of bpm? For example, we would like to be able to sort cases by registration date first, then we would like to sort by priority and within the records in the same priority, the records should still be sorted with the most recent registration dates at the top. 

Like 0

Like

2 comments

The only way to do it is to create another column with the sort order you want that is updated by scripting or process, then sort on it.

https://community.bpmonline.com/ideas/sort-sections-based-multiple-columns

Dear Mitch,

This idea has been already accepted by our R&D team and will be available in the future application versions.

Best regards,

Dean

Show all comments

I want to use Auto Increment Numbering in ContactMiniPage. I have earlier implemented for Contact edit page but, for Adding a contact I have a Contact Mini Page so I tried below same code in that:

 

onEntityInitialized: function() {

                this.showInformationDialog("on Entity initialization");

                // onEntityInitialized method parent realization is called.

                this.callParent(arguments);

                // The code is generated only in case we create a new element or a copy of the existing element.

                if (this.isAddMode()) {

                    this.showInformationDialog("inside add or copy");

                    //  Call of the Terrasoft.BasePageV2.getIncrementCode base method, that generates the number 

                    // according to the previously set mask. 

                    this.getIncrementCode(function(response) {

                        // The generated number is stored in [Code] column.

                        this.set("UsrPatientID", response);

                    });

                }

            }

 

 

But, I am getting an error like:   this.getIncrementCode is not a function.

 

Please advise.

Like 0

Like

1 comments

The getIncrementCode method does not exist in the mini page. You can try to add it on your own. I would do that in the following way. 

define("AccountMiniPage", ["AccountMiniPageResources", "AddressHelperV2"],

    function() {

        return {

            entitySchemaName: "Account",

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

            messages: {},

            mixins: {},

            methods: {

                getIncrementCode: function(callback, scope) {

                    var data = {

                        sysSettingName: this.entitySchemaName + this.getIncrementNumberSuffix(),

                        sysSettingMaskName: this.entitySchemaName + this.getIncrementMaskSuffix()

                    };

                    var config = {

                        serviceName: "SysSettingsService",

                        methodName: "GetIncrementValueVsMask",

                        data: data

                    };

                    this.callService(config, function(response) {

                        callback.call(this, response.GetIncrementValueVsMaskResult);

                    }, scope || this);

                },

                getIncrementNumberSuffix: function() {

                    return "LastNumber";

                },

                getIncrementMaskSuffix: function() {

                    return "CodeMask";

                },

                testMethod: function(){

                    debugger;

                    this.getIncrementCode(function(response) {

                        debugger;

                    });

                },

                onEntityInitialized: function() {

                    this.callParent(arguments);

                    this.testMethod();

                }

            },

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

        };

    });

Show all comments

We created a virtual object, that is loaded with an external service. We add a button “Open” to the list rows that should open a new link page with more detailed information related to the selected row, do you have an example with that?

Like 0

Like

7 comments

Dear Marcelo,

You can create a modal window, which will be displaying the needed data. General properties and behavior of modal windows are specified in the ModalBox and ModalBoxSchemaModulemodules of the NUI package. 

We do not have a exactly fitting example, though you can use and modify the following.

The algorithm of adding modal windows is:

1. Create a page for modal window. Use Base modal box page schema as a parent object:

 define("UsrMyModalPage", [], function() {
	return {
		attributes: {
			"TestText": {
				dataValueType: Terrasoft.DataValueType.TEXT,
				type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				value: "Test value for modal"
			}
		},
		messages: {
		},
		methods: {
			init: function(callback, scope) {
				this.callParent(arguments);
			},
			getHeader: function() {
				return this.get("Resources.Strings.PageCaption");
			},
			onRender: function() {
				this.callParent(arguments);
				var moduleInfo = this.get("moduleInfo");
				var boxSizes = moduleInfo.modalBoxSize;
				var width = boxSizes.width;
				var height = boxSizes.height;
				this.updateSize(width, height);
			}
		},
		//Insert already existed Iframe
		diff: [
			{
				"operation": "insert",
				"parentName": "CardContentContainer",
				"propertyName": "items",
				"name": "MyGridContainer",
				"values": {
					"itemType": Terrasoft.ViewItemType.GRID_LAYOUT,
					"items": []
				}
			},
			{
				"operation": "insert",
				"parentName": "MyGridContainer",
				"propertyName": "items",
				"name": "TestText",
				"values": {
					"bindTo": "TestText",
					"caption": "Test text",
					"layout": {"column": 0, "row": 0, "colSpan": 10}
				}
			}
		]
	};
});

2. Insert modal box as a dependency to the page where it should be called and bind button click to modal window open function:

define("ContactPageV2", [ "MaskHelper"],
	function(MaskHelper) {
	return {
		entitySchemaName: "Contact",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		modules: /**SCHEMA_MODULES*/{}/**SCHEMA_MODULES*/,
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"name": "DonateButton",
				"values": {
					"itemType": Terrasoft.ViewItemType.BUTTON,
					"style": Terrasoft.controls.ButtonEnums.style.RED,
					"caption": "test",
					"click": {
						"bindTo": "donateButtonClick"
					}
				},
				"parentName": "RightContainer",
				"propertyName": "items",
				"index": 1
			}
		]/**SCHEMA_DIFF*/,
		messages: 
			{
				"GetModuleInfo": {
					direction: Terrasoft.MessageDirectionType.SUBSCRIBE,
					mode: Terrasoft.MessageMode.PTP
			}
		},
		attributes: {},
		mixins: {},
		methods: {
			subscribeSandboxEvents: function() {
				this.callParent(arguments);
				this.sandbox.subscribe("GetModuleInfo", this.getDonateModalBoxConfig, this,
					[this.getDonateModalBoxId()]);
			},
			donateButtonClick: function() {
				this.sandbox.loadModule("ModalBoxSchemaModule", {
					id: this.getDonateModalBoxId()
				});
			},
			getDonateModalBoxConfig: function() {
				return {
					"schemaName": "UsrMyModalPage",
					"modalBoxSize": {
						"width": "680px",
						"height": "400px"
					}
				};
			},
			getDonateModalBoxId: function() {
				return this.sandbox.id + "_DonateModalBox";
			}
		}
	};
});

You can add styles as well.

Hope you will find it helpful.

Regards,

Anastasia

Anastasia Botezat,

Hi Anastasia,

Thanks for the answer.  I tried to replicate what you reported, but my modal opens empty. Do you have any idea what it might be? Thanks.

Marcelo,

I have improved the code, so now it is only two schemas. Please check my first edited answer.

Regards,

Anastasia

Marcelo,

Hi Anastasia,

It worked! Now I need to know how to send my list values to Modal and add a close button in Modal. Thank you very much!

Marcelo,

Since you do not have data in the database, you can fetch it as you do it for the section. On the other hand, you can pass current context with its scope along to the modal while clicking on the button. Pick which approach you prefer more.

Regards,

Anastasia

Anastasia Botezat,

Do you have an example of how I can pass the context to modal? Thanks! 

Marcelo,

Check the article on sandbox messages. Draw your attention to the second parameter of the message, which can pass arguments.

https://academy.bpmonline.com/documents/technic-sdk/7-13/sandbox-module-message-exchange

Show all comments
Question

I created a page to inherit from "FileDetailV2" and I need to open the linkpage I created from "LinkPageV2". Double clicking on the grid is called the original page and not the one I created. Thanks!

Like 0

Like

1 comments

Dear Marcelo,

Firstly, there is no such function in the FileDetailV2 as "merge". The function you want to override is "init".

If you intend to change parent schema method realization you need to create a replacing schema and in its methods block you write the function with its original name, since otherwise how would JS engine know you want to override exactly this function. If you intend to modify the basic code, you copy the whole basic code from the function and modify just the needed part, leaving other as it is.

Secondly, "merge" operation is legit only for the diff section of the schema.

Regards,

Anastasia

Show all comments