Release Notes

Visual Studio 2017 and MSBuild Deployments

posted by Eric Patrick

For a machine with Visual Studio 2017 only, see qbo.Sample.2017.proj for changes needed to make CI deployments work.

To sum up:
  • Download and install the Build Tools for Visual Studio 2017
  • Ensure your project file targets VS version 15 (2017), instead of 14 (2015):
    • <VS Condition=" '$(VS)'=='' ">15.0</VS>
  • Run the 2017 build:
    • & 'C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\amd64\MSBuild' .\qbo3.Sample.proj 

IService Permission Update - Breaking Change

posted Jan 17, 2018, 3:50 PM by Greg Kent   [ updated Jan 17, 2018, 4:22 PM ]

IService permission verification has been updated to match functionality of statement verification. Specifically:
  • VerifyPermission now verify pattern {ClassName}{ServiceName}. It previously used pattern {ServiceName}. This is a breaking change
  • VerifyPermission now supports allowing inheritance which is set within each Service. Note if Service.AllowInheritance is null, it cascades to value set for qbo.Application.Properties.Settings.Default.AllowInheritance

Fix Service Permissions

SystemFunction contains a new method ListInvalidServiceFunctions that will:
  • Identify any SystemFunctions that match the old naming pattern for each ServiceName {ServiceName}
  • Insert new SystemFunction {ClassName}{ServiceName} if it does not exist
  • Copy all SystemPermissions tied to original SystemFunction under new SystemFunction
It also supports a preview method. Usage:

  • /Security/SystemFunction.ashx/ListInvalidServiceFunctions?Output=Xml - will display a preview of the old SystemFunction, new SystemFunction and count of SystemPermissions that are associated with old SystemFunction. No inserts occur.
  • /Security/SystemFunction.ashx/ListInvalidServiceFunctions?Output=Xml&Update=true - will Insert new SystemFunctions and SystemPermissions with above logic
  • Contact module has a Service registered labeled AccurintSearch which has permissions tied to SystemRole User.  There is a corresponding SystemFunction labeled AccurintSearch
  • After the update, there will be a new SystemRole record ContactAccurintSearch with a SystemPermission record pointing to SystemRole User
Note with class inheritance, classes such as Organization,Court, Person and other classes that inherit from Contact will show Services registered under their classes. ListInvalidServiceFunctions will also insert SystemFunctions for:

  • OrganizationAccurintSearch
  • CourtAccurintSearch
  • PersonAccurintSearch
  • etc.
and copy SystemPermissions for each.

Import Engine Async Implementation

posted Dec 28, 2017, 6:18 AM by Eric Patrick

All QBO Import Engines contained in qbo.Import have been converted to support asynchronous processing.  The net result is:
  • All IImportEngine methods now support asynchronous processing
  • Import Engines now favor an asynchronous code path and invoke QBO methods signatures using AbstractObject/InvokeAsync. If necessary this will cascade to synchronous operations when asynchronous is not implemented.
See qbo.Import.Tests for unit tests on all QBO Import Engines.

Datasets reset Readonly flag

posted Dec 12, 2017, 4:01 PM by Chad Boyer   [ updated Dec 12, 2017, 5:53 PM by Eric Patrick ]

The introduction of AbstractObject.ExecuteDataSetAsync uses Database.ExecuteReaderAsync, loading the DataReader into a DataSet, since SqlDatabase does not have a native ExecuteDataSetAsync method. This has an unintended side effect: each column in the DataSet is marked as read-only (DataColumn.ReadOnly = true). This side effect is only an issue when the application tier attempts to modify the data set in memory, such as is done with USPSCertified mailing plugin.

To address this issue, the ObjectConfiguration.NormalizeDataSet static method has been extended to explicitly mark columns as writable. AbsractObject.ExecuteDataSetAsync calls NormalizeDataSet before returning a data set, effectively making the result backward compatible with ExecuteDataSet.

Setting DataColumn.ReadOnly = false is now the default behavior; this can be feature-switched with the application setting qbo.Application.Properties.Settings.Default.DataSetColumnsWritable (default is true).


posted Dec 5, 2017, 4:52 PM by Philip Raath   [ updated Dec 5, 2017, 4:57 PM ]

Revision: 35679

New-qboImage function is available in qbo.ps1.

There are two required parameters: 
  • Name - name of the image to be created
  • InstanceId - reference to source instance

QBO 3 Excel Generation Updates

posted Nov 15, 2017, 2:41 PM by Greg Kent   [ updated Nov 15, 2017, 2:43 PM ]

Excel generation is QBO 3 has been modified. Details:
  • OutputMethod Excel has been deprecated. For example {SiteName}/Mortgage/Foreclosure.ashx/Search?Output=Excel is no longer supported
  • Excel Generation is supported and performed using a dedicated ExcelGenerator plug-in
    • Excel export from the browser is still supported but must be routed through a dedicated Excel handler which is installed by the plug-in
    • Excel generation using Document Templates is supported using the plug-in
    • Report Module now uses IGenerator interface to generate Excel files which invokes ExcelGenerator plug-in


posted Nov 13, 2017, 12:50 PM by Philip Raath

SVN Revision 35416

qbo.Depend.js has received upgrades.

  • In addition to comparing the value of an input field to a static value provided by the user, i.e. 'Question1 = Yes':
    • Input field values can now be compared to other input field values
      • Ex: 'Question1 = Question2'
    • Date comparisons can now be performed on input field values
      • Ex: 'ActualCompletionDate = 10/27/2017'
    • Whereas Input field comparisons previously only considered equality and negation, '>' and '<' are now supported.
  • qbo.3\qbo.core\web tier\qbo.applicationweb\templates\specs\behaviors\spec.depend.xslt
  • qbo.3\qbo.core\web tier\qbo.applicationweb\scripts\specs\behaviors\spec.depend.js

qboDB solution *History table changes, deprecated field type changes and related items

posted Oct 12, 2017, 10:20 AM by Kevin Foley

SVN revision 35145 

Almost every table in every project in the qboDB solution has been modified.

*History table changes.
The CreatedDate and CreatedPersonID fields have been re-added to the *History tables 
*History table structures now match their source such as Loan and LoanHistory
Not only were fields added or removed, type mismatches were also corrected.
Such as 
CollectionTemplateHistory.CustomerStatusList BIT vs VARCHAR(50)
ContractHistory.ContractID BIGINT vs INT

Since *History tables now match their source, some fields are being removed.
!! Please review these changes to make sure you do not lost historical data required by your applications.

*HistoryInsert trigger changes
Most if not all *HistoryInsert triggers were changed to address three issues
1) addition of CreatedDate and CreatedPersonID
2) addition of fields missing from their source due to base changes not carried over
3) the addition of the Except clause to exclude non changing row updates from overpopulating the *History tables
This may break some systems that rely on *History table RevisionDates to track row touches, regardless of any data being updated.

Deprecated fields NTEXT and IMAGE have been converted to VARCHAR(MAX)

Change deprecated types: NTEXT to VARCHAR(MAX) on fields
Terms, SourceXml and MetaXML

Change deprecated types: NTEXT to VARCHAR(MAX) on fields

Change deprecated types: IMAGE to VARCHAR(MAX) on fields

The change to Attachment will cause a table rebuild.

SQL create table syntax change

Table file group specifier is now only included on the clustered indexes.
A file group was normally provided with the table creation and on the clustered index.
This is no longer the SQL pattern ince the clustered index file group location overrides the table location.

-- New
CREATE TABLE [dbo].[Attachment] (


-- Old
CREATE TABLE [dbo].[Attachment] (
) ON [FGData] TEXTIMAGE_ON [FGBlobData];

Tables losing fields

BusinessRuleHistory ( multiple fields )



No deletions

No deletions

No deletions

Before you deploy...

The above documents most of the changes, possible that a few may have been missed.
As such please review the modifications to your target database by doing a schema compare with Visual Studio or Redgate

Before deploying an update from trunk via Visual Studio, 
  • please make sure you have installed SSDT 17.2 for VS2015.
  • configure the advanced settings in your deployment profile to ignore column order

If you are not using VS2015, please review the notes from the Microsoft link above for the proper SSDT version that supports ignoring column order.

Configuration Monitoring Filter Bug

posted Oct 6, 2017, 9:32 AM by Eric Patrick

The configuration monitoring infrastructure has been updated to handle the rare use case where filtered configuration conflicts with non-filtered configuration. The resolution is to sort configuration entry queries by filter.

For example, given a QBO3 site with Filter = "Release 2017.10.01"
  • Add a statement called ConfigurationTest, applied to the filter "Release 2017.10.01"
  • Add a statement called ConfigurationTest, applied to the entire database
The expected behavior is that the first version of the statement (filter = "Release 2017.10.01") will "win". Until this fix, the results were essentially random.

Javascript Hotfix for Chrome version 61

posted Sep 13, 2017, 8:48 AM by Eric Patrick

A recent update to Google Chrome resulted in intermittant javascript errors occuring when loading the standard QBO3 javascript library. An update to qbo.ApplicationWeb > Scripts > mootools.js fixes this bug.

The mootools.js file contained a byte order mark at the beginning of the file that resulted in an occasional "unexpected end of input" error message when loading the library in Chrome (version 61.0.3163.79).  Using a "hard refresh" (Ctrl-F5) 1-3 times would generally cause Chrome to load the javascript correctly, so the error was intermittant.

This error does not occur on Microsoft's Edge browser.

1-10 of 35