List of critical changes from version 3.12.0 to 3.12.22 (inclusive)


List of changes in version 3.12.22

The possibility was added to use Enumeration type parameters with the single link type as sql parameters:

select * from TaskBase
where TaskBase.Priority=@OneEnum

The possibility was added to use Enumeration type parameters with the List link type as sql parameters:

select * from TaskBase
where TaskBase.Priority in (@ManyEnum)

When updating, make sure you don't use Enumeration type parameters with the List link type in reports. If you do, change the link type to single and publish the report.

Otherwise, for example, the query from the article https://kb.elma-bpm.com/article-3588.html won't work. The {$TaskPriority}=’High’} condition will always return false, since {$TaskPriority} will return a string representation of its type (if the TaskPriority parameter is an enumeration with the List link type).

Public methods and interfaces

The public overload was added for the method EleWise.ELMA.Model.Types.EnumDescriptor.GetPropertyInitExpression(ClassMetadata classMetadata, bool forList, PropertyMetadata propertyMetadata, bool forFilter = false), which gets the property initialization expression in accordance with the default value.

List of changes in version 3.12.21

Scheduler task result lifecycle setting was added. If a scheduler task result is not updated for more than the specified timeout, it will be considered overdue. After the timeout, the scheduler task is considered outdated and does not lock attempts to run new tasks. By default, the timeout value is 720 minutes. Example of the setting in the settings.config file: <add key="SchedulerJobRunInfo.Timeout" value="720" />.


An overload was added for the method EleWise.ELMA.CRM.Managers.LeadManager.SetStatus(ILead lead, LeadStatus leadStatus, string comment); it allows changing the status and adding a comment to a lead.

List of changes in version 3.12.20

Time Report

The IOvertimeWorkLogExtension interface is marked as Obsolete. The new interface IOvertimeWorkLogExtension2.cs was added instead of IOvertimeWorkLogExtension. Earlier implemented points should be rewritten, although the current implementation still work.

A button for reopening time reports was added to the time report page toolbar. A popup for reopening time report with the possibility to change the approver was added.

Document Management

A new interface ICryptoProvider2 was addedinherited from the ICryptoProvider interface.

A new method string GetFileHash(BinaryFile file, string algorithm) was added to the interface; it allows calculating hash by the specified algorithm.

If you don't need this feature, there is no need to implement it. The current implementation works.

Web Portal

When starting a process for an object (CRM object, document, an object from the objects section, performance matrix), after choosing a process, the process start event form is now loaded.


The IProjectTaskProperties interface is marked as not used.

List of changes in version 3.12.19

To avoid granting superuser permissions when connecting ELMA in PostgreSQL, it is now possible to specify a user with SuperUser permissions in the configuration file, on whose behalf the database will be created/deleted when starting the system.

Configuration file example:

<main.db connectionStringName="MainDB" type="EleWise.ELMA.Extensions.PostgreSQL.PostgreSQLProvider, EleWise.ELMA.Extensions.PostgreSQL, Version=, Culture=neutral, PublicKeyToken=null" backupEnabled="false" sysUser="postgres" sysPassword="MASTERKEY" />
<add name="MainDB" connectionString="Host=;Port=5432;Database=elma3;User Id=user;Password=qwerty;Unicode=true;" />

In this example, the connection string specifies the user account with minimum permissions, while the main.db specifies the postgres superuser.

List of changes in version 3.12.18

Public Methods

Added the possibility to get values by the filter for the registration offices in the controlled:

  • optional parameters were added to the method EleWise.ELMA.Documents.Docflow.Web.Controllers.RegistrationPlaceController.GetRegistrationPlace(long? accountingYear, string text = null, string filterProviderUid = null, string filterProviderData = null), which returns registration offices by year and filter;
  • optional parameters were added to the method EleWise.ELMA.Documents.Docflow.Web.Controllers.RegistrationPlaceController.PopupEntity(string inputId, [JsonBinder]ICollection<SelectListItem> selected, bool multiselect, long? accountingYear, string filterProviderUid = null, string filterProviderData = null), which returns a popup for selecting entity values.
  • The visibility area of public methods was changed to internal in the manager EleWise.ELMA.Security.Managers.UserSecurityProfileManager:
    • CreateProfile
    • FailedLogon
    • DisallowLogon
    • AllowLogon
    • ResetCountFailedLogon
    • ResetCountFailedLogonWithCheck
    • ResetCountFailedLogonAllUsers
    • SetForcedChangePasswordWithCheck
    • SetForcedChangePassword
    • ResetForcedChangePassword


  • The properties of the entity EleWise.ELMA.Security.Models.UserSecurityProfile are changed periodically by direct queries to the database. Due to this, tracking such changes with IEntityEventsListener is impossible. For this purpose, use the extension point EleWise.ELMA.Security.Extensions IUserSecurityProfileEventHandler

List of changes in version 3.12.17


The update to 3.12.17 may take a while, because full database conversion is performed.


Lock manager optimization:

1. Database locks were changed (used by default in a cluster, if distributed cache is configured).

A lock used to be added to a corresponding entry of the DbLock table via FOR UPDATE. The lock was on the table entry throughout the critical section time, which negatively affected statistics, because locks were on the DbLock table a significant amount of time.

Now a lock is added by inserting an entry to DbLock. The lock is removed by deleting the entry. If there is an entry, it means that the lock is held by someone. Locks will appear in the DbLock table only if concurrent transactions attempt to insert/delete the same entries in the DbLock table at the same time.

2. Locks were implemented in Redis. This lock service must be enabled explicitly (configuration.config)



The lock logic is the same as in the database: if there is a key in Redis, lock is held by someone, no key - no lock. To work with Redis, you need at least three independent nodes (just three server instances, not a cluster or a sentinel) for failover safety. A lock is applied if it is added in at least half of the nodes. Redis lock provider is configured in configuration.config, by specifying connections with nodes (in the format, used for configuring Redis cache). The redlock algorithm is used, recommended by the official documentation.

3. Memory locks were implemented. This service applies locks only in the memory. It is enabled by default, if distributed cache is not configured, i.e. one ELMA node is used.

LockManager was reworked:

1. It is inherited from the ILockManager interface, therefore it is recommended to inject ILockManager in modules instead of using LockManager

2. The following LockManager's methods were marked as Obsolete: TryObtainLock, ObtainLock and ReleaseLock. Instead, use ILockManager interface methods Lock, TryLock, which return an IDisposable lock.

Web Portal

ZeroClipboard module was updated. Flash content was deleted from the system. The functionality was substituted with js scripts.

Process monitor

XSS vulnerability in the Process Monitor section was eliminated. The possibility to sort by the Context and Values columns was disabled in the Process Monitor section.


  • When archiving the messages, favorite messages are ignored;
  • Earlier archived messages are automatically moved to messages at the first system start after updating.

List of changes in version 3.12.16

Possibility to specify different translations for one source key

To specify several translations for one source key, use the following template:

Msgstr "[[Location11,Location12,Location13]]Translation1[[Location21,Location22,Location23]]Translation2"

Where Location - is the location where the resource is used. You can find the location from the comments:

1. 25cab08fff420add/Applications/BPM/EleWise.ELMA.BPM.Web/Modules/EleWise.ELMA.CRM.Web/Views/Lead/SelectTypes.cshtml:15 Lead_SelectTypes (For .cshtml files - from the Views folder down, replacing "/" with "_")

2. 25cab08fff420add/Applications/BPM/EleWise.ELMA.BPM.Web/Modules/EleWise.ELMA.Workflow.Processes.Web/Views/WorkflowInstance/ChangeTimer.cshtml:15 WorkflowInstance_ChangeTimer

3. 25cab08fff420add/SDK/EleWise.ELMA.SDK.Design/BPMApps/Views/BPMAppsRibbonPanelView.Designer.cs:118 Designer (For .cs - the file name)

Process monitor

Exporting the current process tasks column to Excel is now supported.


Global settings for adding a header to the message body for SMS and email notifications were implemented.

List of changes in version 3.12.15

Public methods

1. Method Init(List<IDocument> documents, bool fillVersions = true), was moved from EleWise.ELMA.Documents.Docflow.Web.Models.ApprovementInfo and EleWise.ELMA.Documents.Docflow.Web.Models. AcquaintanceInfo to

EleWise.ELMA.Documents.Docflow.Web.Models.DocumentTaskBaseInfo<T>. Overload of this method was added Init(Dictionary<IDocument, IDocumentVersion> documentsAndVersions, bool fillVersions = true).

List of changes in version 3.12.14

Validation of object attributes when publishing was added. If an attribute is invalid, the publication is interrupted with an error window.

Public methods and interfaces

  1. Interface EleWise.ELMA.Model.Types.IValidatableTypeDescriptor was added, which allows validating a type.
  2. Validation was added for the class EleWise.ELMA.Model.Types.RefTypeDescriptor<T, SettingsT>.
  3. Validation was added for the class EleWise.ELMA.Model.Metadata.EntityPropertyMetadata.

List of changes in version 3.12.13

General Improvements

The list of registration variants in the Records Management section was replaced with a drop-down list.

List of changes in version 3.12.12

User interface

If the task start date is earlier than the current date, a notification is shown, informing that a task cannot be rescheduled to an earlier date. If you need to change the task end date, the start date must remain unchanged.

List of changes in version 3.12.11

No changes.

List of changes in version 3.12.10

Code API. Public methods and interfaces

1. Method bool EleWise.ELMA.Documents.Web.FullTextSearch.Extensions.HasUserFields (IDocumentFilter filter) is marked as obsolete, instead use the method void EleWise.ELMA.Documents.Web.FullTextSearch.Extensions.HasUserFields(IDocumentFilter filter, CheckFullTextSearchModel checkResult).

User interface

A notification is added to the document search page, which is displayed when indexation is enabled. If the search conditions do not allow the system to use the full-text search (hierarchical search, advanced search, less than 3 characters in the search string) then you will see a notification, that the full-text search was not used and a list of reasons why.

List of changes in version 3.12.7

Changes in the Scheduler

If a task start date is a business day, and the number of specified business days is greater than it is, then the last business day will be the result.

Under business days, the counting number of the business day in a month is implied!

Time zones

ELMA Designer now features the Ignore time zones setting for properties of the Date/Time type. It allows storing and viewing this property without a time zone shift. For example, if the specified value is 01.01.2018 01:00:00 and the time zone is UTC +3, and the user who views it is in the UTC +1 time zone, the value will remain the same. However, if the Time box is not checked in a Date/Time property settings, it also will not be shifted in time zone

Public methods

The following methods were added:

  • EleWise.ELMA.Model.Metadata.EntityMetadata.GetAllTableParts(), which returns the list of all the blocks, pertaining to metadata (including all the nested blocks);
  • EleWise.ELMA.Model.Metadata.EntityMetadata.GetAllProperties(), which returns the list of all the properties, pertaining to metadata (including properties of all the nested blocks);
  • EleWise.ELMA.Model.Metadata.EntityMetadata.GetAllPropertiesAndTableParts(), which returns the list of all the properties and blocks, pertaining to metadata (including properties and blocks of all the nested blocks).

Changes in the Reports module

To update system reports, you do not need to additionally edit the file ReportsDbStructure.xml.

List of changes in version 3.12.6

Changes in the Reports module

Recycle Bin group was added to the list of reports in the Designer, to which deleted reports and sub-reports are placed. To restore a report, right click on it and select Restore. If this operation is successful, the report will appear in the Common Reports group.


List of changes in version 3.12.5


When creating a new KPI script, the assembly EleWise.ELMA.KPI and namespaces EleWise.ELMA.Model.CommonEleWise.ELMA.KPI.ExtensionsEleWise.ELMA.KPI.SecurityEleWise.ELMA.KPI.Managers are added by default.


Possibility to pre-process a file before saving it with a new extension point IPreUploadFile was added. Components of this extension point are compiled with the FileSystemFileStoreProvider class constructor (a provider for working with files).

Changes in the Reports module

  1. All the report parameters are passed in a POST-request.
  2. The EleWise.ELMA.Reports.Managers.ReportCacheManager class, intended for storing report parameters and settings in the cache is deleted.
  3. The system report "Report on schedule compliance (3.1)" is updated.

Changes in working with report parameters

Changing report parameters on the Razor report layout is forbidden. For this, use the custom controller code.

Classes and views of the Reports module moved

  1. Class EleWise.ELMA.Reports.Web.ReportPagerSettings was moved to EleWise.ELMA.BPM.Web.Reports.Components.ReportPagerSettings
  2. Class EleWise.ELMA.Reports.Web.ReportPagerSettingsBinder was moved to EleWise.ELMA.BPM.Web.Reports.Components.ReportPagerSettingsBinder
  3. Class EleWise.ELMA.Reports.Code.ReportParametersBinder was moved to EleWise.ELMA.BPM.Web.Reports.Components.ReportParametersBinder
  4. View \Modules\EleWise.ELMA.BPM.Web.Reports\Page\Report.aspx was moved to \Modules\EleWise.ELMA.BPM.Web.Reports\FastReportPage\Report.aspx
  5. Class EleWise.ELMA.Reports.Web.Report was moved to EleWise.ELMA.BPM.Web.Reports.FastReportPage.Report.

Public methods

  1. Constructor with parameter EleWise.ELMA.Reports.Models.CustomPagerParameters.CustomPagerParameters(bool isActive) is marked as obsolete (use the constructor without parameters). 
  2. The following methods are now virtual:
  • Telerik.Web.Mvc.UI.Html.GridPagerNumericSectionBuilderCustom.Create 
  • Telerik.Web.Mvc.UI.Html.GridPagerPagingSectionsBuilder.CreateSections
  • Telerik.Web.Mvc.UI.Html.GridPagerPagingSectionsBuilder.AppendNumericSection


A new global permission Project Administration was added, which grants access to configuring project types in the administration section. By default, this permission is assigned to the users of the system groups Administrators and Project Administration.

Document management

An additional field ExecutorOriginal, which stores the first (original) task executor, was added for the document management tasks (EleWise.ELMA.Documents.Models.Tasks.IDocumentTask).

When creating new approval/acquaintance tasks, the approval/acquaintance sheet will display the original executor in parentheses (if the original executor is not the same user as the current executor). 

For earlier created tasks, the approval/acquaintance sheet remains the same (i.e. "substituted by user" is shown).

New function

A function for extending the standard jQuery- settimeout capabilities was added.

The function is elmaTimeout.waitUntilValidatorReady, which is a timeout for the form validator generation.


List of changes in version 3.12.4

Code API. Public methods and interfaces

Full-text search

Properties with the One-to-Many link type are no longer supported by the full-text search. If there is a property with the One-to-Many link type in the filter or in the information shown on the page, the data to display are loaded from the ELMA database.

Possibility to disable CSRF protection

Possibility to partially disable the CSRF protection for a controller or a method was added. To do so, you need to specify an attribute on the respective controller or method as follows:


As the result, protection from CSRF attacks will be disabled for the methods and controllers with this attribute.


Docflow section:

Added method:

DocumentApprovementTask PublicAPI.Docflow.Tasks.CreateTask(CreateTaskParams params)

Processes section:

Obsolete methods:

Void PublicAPI.Processes.WorkflowTaskBase.ReAssignToReplacement(TaskBase task) (no longer used)


List of changes in version 3.12.3

ISubTaskSettingsRenderer extension point

The following method was removed from the interface of this server extension point:

MvcHtmlString Render(HtmlHelper html, ICreateSubtaskActionModel settings, PropertyMetadata property);

Instead of it, an extension point for ISubtaskSettingsWebRenderer was created.

ISubtaskSettingsWebRenderer extension point

An extension point for web modules ISubtaskSettingsWebRenderer was created, which only generated the markup of user interface elements in the pop-up window for creating sub-tasks. Properties and methods:

/// <summary>
/// Sub-task creation interface element type, implemented by the component
/// </summary>
CreateSubtaskSettingTypes SettingType { get; }
/// <summary>
/// Will the component be able to generate markup by the specified field?
/// </summary>
/// <param name="settings">Sub-task creation settings</param>
/// <param name="property">Settings field</param>
/// <returns>true, if the component can return the markup for the specified field, otherwise - false</returns>
bool CanRender(ICreateSubtaskActionModel settings, PropertyMetadata property);
/// <summary>
/// Generate markup for the interface element
/// </summary>
/// <param name="html">Html helper</param>
/// <param name="settings">Sub-task creation settings</param>
/// <param name="property">Settings field</param>
/// <returns>Html markup</returns>
MvcHtmlString Render(HtmlHelper html, ICreateSubtaskActionModel settings, PropertyMetadata property);

Public methods and interfaces

A new entity UserSecurityProfile was added.

User password for signing in to the system:

  • The Password property of the User entity was moved to UserSecurityProfile:
    • The Password property of the User entity was marked as obsolete
    • The Password property was added to the new entity UserSecurityProfile
  • Additional code was added to the User entity:
    • When attempting to get the value of User.Password the method return UserSecurityProfileManager.Instance.Load(this).Password is called
    • When attempting to set a value to User.Password the method UserSecurityProfileManager.Instance.PasswordReset(this, value) is called
  • The old code: 
var user = UserManager.Instance.Create();
user.Password = password;   // a password

will not set a password until the user entity is saved (i.e. first you save it, then set a password).

It is recommended that you use:  

1. var user = UserManager.Instance.Create();

UserSecurityProfileManager.Instance.CreateProfile(user, password); 

2. Or save a user with one of the overloads for the Save method of UserManager, including the password parameter, or SaveUserWithGroups([NotNull] Models.IUser obj, string password, IEnumerable<long> newGroups, Func<IUserGroup, bool> oldGroupsCondition = null)

1. Method EleWise.ELMA.Security.Managers.UserManager. SaveUserWithGroups([NotNull] Models.IUser obj, IEnumerable<long> newGroups, Func<IUserGroup, bool> oldGroupsCondition = null) is marked as obsolete, instead use method EleWise.ELMA.Security.Managers.UserManager.SaveUserWithGroups([NotNull] Models.IUser obj, string password, IEnumerable<long> newGroups, Func<IUserGroup, bool> oldGroupsCondition = null)

2. Method EleWise.ELMA.Security.Managers.UserManager.Save([NotNull] Models.IUser obj, bool saveAsBlocked) is marked as obsolete, instead use method EleWise.ELMA.Security.Managers.UserManager.Save([NotNull] Models.IUser obj, string password, bool saveAsBlocked)

User interface

Security settings were changed

How it was:


How it is now:

Authentication Type Settings and Encryption Provider Settings panels

The buttons Change password at the next sign in / Cancel forced password change were added to the Security unit in the user profile:

User profile now shows a notification that signing in to the system is locked due to reaching the limit of failed attempts:

New form for forced changing the password when signing in.

User interface

1. Errors are now displayed when saving on a form object-properties that implement EntityCollection:  

2. The setting Number of Displayed Messages was removed from the public channel messages portlet. The Number of Displayed Comments setting is taken from the portlet settings:

List of change in version 3.12.2

Creating a document

When creating a document (object, process) with a required Attachment field, the file uploader text in the web part is highlighted with bold font and a red asterisk.


Document approval

The Comment field can be removed from document approval, acquaintance and signing tasks. The possibility to make a comment required became nested.


List of changes in version 3.12.1

Connecting via proxy server

Continue when headers are passed to the server:

With default settings, this box should be left unchecked; the connection will be established successfully.

Web part, Document management, Tasks, Business processes

Capabilities of creating sub-tasks have been extended.

How it was:

It was possible to create sub-tasks for user tasks, SMART-sub-tasks for SMART-tasks, project sub-tasks, but impossible to create acquaintance or approval sub-tasks.

How it is now:

"Parent task" -> "possible sub-task types":

Parent task Possible sub-task type
Regular approval Approval, Acquaintance, Tasks (all sub-tasks are regular)
Process approval Approval, Acquaintance, Tasks (all sub-tasks are regular)
Regular acquaintance Acquaintance, Task (all sub-tasks are regular)
Process acquaintance Acquiantance, Task (all sub-tasks are regular)
Regular consideration User task (the existing capability of creating decision-based tasks remains)
Process consideration User task (the existing capability of creating decision-based tasks remains)
User task User task
Process task User task

The existing capabilities of creating sub-tasks also remain.

Nesting of sub-tasks is unlimited.

All the task types, for which sub-tasks can be created, feature the Create Sub-task item in the Actions button.

When clicking it, a dialog box opens, where you can select a sub-task type and other parameters. When you create acquaintance or approval sub-tasks, the dialog box may feature the Require Digital Signature option.

The presence of the Require Digital Signature option depends on the global digital signature settings (Administration - Document Management Settings - Digital Signature Settings).

There are separate switches for the acquaintance and approval tasks. Selecting "Yes" removes the Require Digital Signature option from the dialog box for selecting a sub-task type, and the new sub-tasks are affected by the module global setting, or by the diagram element setting.

After creating at least one sub-task, the Sub-tasks tab is added to the parent task form. This tab contains a table with sub-tasks, but the sub-tasks of these sub-tasks are not displayed.

When creating acquaintance or approval sub-tasks, the created sub-tasks are included in the current sheet to avoid creating tasks of another executor.

New approval sub-tasks are automatically included in the parent sheet, the system does not suggest selecting a new or an existing sheet when creating sub-tasks. The sub-task creation form does not allow selecting the approval type.

The approval sheet form changed - the Executor column features indenting for visualizing the sub-task hierarchy.

The approval sheet result is affected only by the top level tasks. The results of their sub-tasks have no effect and only support the author's decision making.

When you try to complete a task, which has active sub-tasks, the system will point that out. If you choose to continue, active sub-tasks will remain in the system, except for approval sub-tasks. The active approval tasks will be closed by the author.

The possibility to cancel acquaintance and approval sub-tasks was added. To do so, the sub-task author or their manager must open the task page, click Actions and select Cancel Task.

Next, it is required to enter a comment and confirm canceling.

If a task is canceled, the current task executor receives a notification that the task has been canceled by the author. If there were active sub-tasks in the canceled tasks, these tasks would be displayed in the notification along with a suggestion to make a decision: keep them or cancel.


Marked as Obsolete:

  • Method EleWise.ELMA.Security.Managers.UserCertificateManager.CheckSignature  - "Obsolete. Use EleWise.ELMA.Security.Services.AuthCryptoProviderService.CheckSignature".

Document Management

Marked as Obsolete:

  • method VerifyData у EleWise.ELMA.Documents.Extensions.ICryptoProvider, "Obsolete. Use CryptoProviderBase.Verify";
  • manager EleWise.ELMA.Documents.DigitalSignature.CryptoProviderManager "Obsolete. Use EleWise.ELMA.Documents.Services.SignCryptoProviderService";
  • method EleWise.ELMA.Documents.Managers.AcquaintanceTaskManager.SignValid, instead use EleWise.ELMA.Documents.Services.SignCryptoProviderService;
  • method EleWise.ELMA.Documents.Managers.ApprovementTaskManager.SignValid, instead use EleWise.ELMA.Documents.Services.SignCryptoProviderService;
  • method EleWise.ELMA.Documents.Managers.DocumentVersionExtManager.SignValid, instead use EleWise.ELMA.Documents.Services.SignCryptoProviderService;
  • structure EleWise.ELMA.Documents.Models.DigitalSignature.Signer is obsolete, use EleWise.ELMA.Security.Models.Crypto.Signer;
  • structure EleWise.ELMA.Documents.Models.DigitalSignature.VerifyDataStruct is obsolete, use EleWise.ELMA.Security.Models.Crypto.VerifyResult;
  • method EleWise.ELMA.Documents.Docflow.Web.Extensions.ICertificateSelectionOnMultipleSigningWeb.RenderMultipleSignCheckBox is obsolete and no longer used.

Interfaces of the following encryption providers are updated:

  • In the server part of the Security assembly, an encryption provider base interface is allocated (Uid - ProviderUid, Name - DisplayName, Settings - Settings, signature verification method - Verify, hash calculation method - GetFileHash) EleWise.ELMA.Security.Extensions.ICryptoProviderBase;
  • in the web part ICryptoProviderWebBase (Uid - ProviderUid, js scripts registration method - RegisterScripts, add certificate script preparation method - PrepareAttachCertificate);
  • authentication and sign encryption providers are separated in the server part EleWise.ELMA.Security.Extensions.IAuthCryptoProvider (new) and EleWise.ELMA.Documents.Extensions.ICryptoProvider (this interface is now inherited from EleWise.ELMA.Security.Extensions.ICryptoProviderBase);
  • in the web part EleWise.ELMA.BPM.Web.Security.ExtensionPoints.IAuthCryptoProviderWeb (new) and EleWise.ELMA.Documents.Docflow.Web.Extensions.ICryptoProviderWeb (it is now inherited from ICryptoProviderWebBase);
  • Thus, when updating the implementation of a custom EP in document management:
    • in the server part, re-define method Verify of AbstractCryptoProvider, since VerifyData is outdated; the implementation is identical;
    • in the web part, define the methods/properties Provider, RegisterScripts, PrepareAttachCertificate.

List of changes in version 3.12.0

1. When importing a project plan you can merge it with the plan you are importing to;

2. Possibility to display a report as a table.

To display the result as a table, a Razor markup template can be generated (the Template –> Table Template button in the toolbar on the report layout tab). The result is displayed as a standard table with sorting, grouping, paging, column settings, and Excel export. Table settings are saved for each user individually (column display, sorting, paging). If the report is changed, all the custom table settings are reset.

* Sorting/grouping by columns of the String type is unavailable for Oracle DBMS

Limitations on data source queries when using the table mod:

  • A query must start with select
  • Do not sort the selection results in the query - it is done by means of the table (do not use order by in the query)
  • Limited alias name, depending on DBMS

              SQL Server –  128 characters

              Firebird 2.5 – 255 characters

              PostgreSQL – 63 characters

              Oracle – 30 characters, for version 12.2 and higher – 128 characters

  • Do not limit the selection result in quantity (offset of the first result and the number of results) - it is also done by means of the table. Depending on the DBMS, different keywords are used.

              Firebird –  FIRST,SKIP

              PostgreSQL – OFFSET,LIMIT

              SQL Server – OFFSET,FETCH NEXT

  • To be able to sort/group the displayed table by column for HQL data sources, you must specify its alias.

Using service columns to customize the result of the selection from SQL sources

For HQL sources, data in the table are shown using the standard display templates. To customize the data display for SQL sources, you can use service columns.

  • Column for displaying in the table - postfix _$view.
  • Column for using when exporting to Excel - postfix _$export.

To use service columns, you need to add to the source selection a column, whose name consists of the name of the customized column and a postfix. Sorting/grouping will be performed according to the data from the source column, not from the service one.

An example of a data source query (MS SQL Server)

Generating a Razor markup for the report layout

Report layout wizard in the table mod

Generated Razor markup for displaying the report in the table mod

The report display in the web part

Public methods and interfaces

  1. Class EleWise.ELMA.Projects.Models.MSProject.ResourceMergedView was deleted;
  2. Class EleWise.ELMA.Projects.Models.MSProject.TaskMergedView was deleted;
  3. Method GetEngineVersion was added to the interface EleWise.ELMA.Runtime.Db.Migrator.Framework.ITransformationProvider, which returns the DBMS server version number.