Release Notes

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.

qbo.Security SystemPermission Monitoring

posted Sep 8, 2017, 9:43 AM by Eric Patrick


The SystemPermission class now participates in configuration monitoring, reacting to permission changes in near-real-time. This removes the need for power users to recycle the application when adding new roles or permissions.


The SecurityPermission and QboMembershipUser classes cache a dictionary of permissions when a QBO3 application domain starts. Dictionary entries are structured as:
  • {Permission}: {Role Permission Bit Map}
Typical QBO3 systems have dozens of roles and thousands of permissions, so generating this dictionary is a reasonably expensive operation. To make security verification checks reasonably performant, this dictionary is cached.

It is insufficient to have SystemRole/Save, SystemFunction/Save, or SystemPermission/Save to clear the security map from cache, for two reasons:
  • Bulk inserts would cause repeated clearing of the cache, and
  • A single server in a server farm would not trigger clearing of the cache on other servers
Thus, SystemPermission/Monitor will poll the database for changes to the SystemRoleSystemFunction or SystemPermission tables, and clear the cache.

Summary UI Performace Improvements

posted Sep 6, 2017, 8:11 AM by Eric Patrick   [ updated Sep 6, 2017, 9:04 AM ]


The qbo.Application.Properties.Settings.SummaryDefaultOptions is a new application setting that enables optimizing Summary method performance for UI calls. Note:
  • this setting applies to .ashx handlers calling Summary only; it does not affect application tier calls (from workflow, etc.)
  • the default setting is "" (the empty string), which causes no change in behavior of QBO
  • the recommended setting is "DescendantDepth=0", which causes UI calls to Summary to exclude children


The Summary method is intended to return all information related to an object, so that power users don't need to define custom queries for:
  • Document generation, 
  • Workflow if/then statements, 
  • Parameter substitution,
  • etc.
"All information" includes:
  • The object
  • Ancestors
  • Descendants
  • Siblings (foreign keys)
Thus, the Summary method becomes a useful construct for many use cases, and QBO3 uses Summary to render the basic UI for most objects. Ironically, the UI rarely needs to have decendants included in the Summary output, because descendants are rendered in panels via AJAX calls. Thus, most calls to the Summary method don't use most of the data returned by Summary.

This change allows QBO3 to limit the default behavior of Summary for UI operations by intercepting calls to Summary from .ashx handlers, and appending the SummaryDefaultOptions to the parameters being passed to Summary. Configuring a target system's SummaryDefaultOptions to be "DescendantDepth=0" will thus remove descendants from the Summary web page, lightening the load on the database for typical UI calls.

Note that Summary parameters can be overridden by creating a Summary statement for any given class. If a custom Summary statement exists and includes any of the same parameters included in SummaryDefaultOptions, the custom Summary statement's parameters 'win'.

For example, assume that the Foreclosure.ashx/Summary UI needed to include key tasks from associated workflows in Foreclosure.Summary.xslt. To optimize the system:
  • From Design > Configuration > Modules > Object Status > Settings, configure SummaryDefaultOptions to be "DescendantDepth=0"
  • From Design > Configuration > Modules > Mortgage > Statements, add a Summary statement with a parameter "DescendantDepth=10"

qbo.Mortgage Updates

posted Jul 14, 2017, 8:58 AM by Kevin Cassidy   [ updated Jul 14, 2017, 9:00 AM ]

The qbo.Mortgage project has been updated to include Home and Summary pages for additional mortgage based tables.  In addition, changes to existing tables were made to be more standardized for qbo.

There are breaking changes for the Valuation and BidAtSale tables.  To avoid data loss, the qbo.Db solution has been updated to include pre and post deployment scripts to handle these changes.

High level changes made to the qbo.Mortgage project are:
  • Added Property Home/Summary pages
  • Added missing property based tables to Property/Summary
  • Added missing loan based tables to Loan/Summary
  • Added REO Home/Summary pages
  • Added Offer management to REO Summary page
  • Added DeedInLieu Home/Summary pages
  • Added CashForKeys Home/Summary pages
  • Valuation table is now process based
  • Added PropertyID field to BidAtSale table
  • Removed LoanID and ForeclosureID fields from BidAtSale table

Document Classification

posted Jul 13, 2017, 1:57 PM by Eric Patrick

The qbo.Attachment.Quandis plugins now includes a Classification IService plugin to field document classification. This combines OCR, text parsing via a score, and a matrix to classify documents.  From our website:

QBO includes an interface for Optical Character Recognition (OCR), which will extract text from common document formats (including Word, PDF, TIFF, JPEG, and more), making the text searchable. Rather than invent our own technology, we leverage third party software that excels at OCR; our default plugin leverages Google’s OCR engine. If you have an existing OCR provider that provides an API, Quandis’ Document module can leverage a plugin to use it instead of Google.

Once the text of a document is available in the QBO database, power users can extract data from the text using a simple Text Parsing plugin. Examples of values that can be extracted include:
  • Money: extract a loan amount from a text pattern like:
    “I promise to pay U.S. ${Value} (this amount is called ‘Principle’)”
  • Percentages: extract an interest rate from a text pattern like:
    “I will pay interest at a yearly rate of {Value}%.”
  • Dates: extract dates from a text pattern like:
    “Payments start on {Value}, with late charges starting”
  • Strings: extract names from a text pattern like:
    “Mortgage is issued to {Value}, known as the mortgagor.”
Next, documents can be classified with the combination of OCR, the text parsing engine, and a set of rules (matrix) to set the document type, template, status, or other values. For example, in the image below, a simple text parsing model looks for text specific to loan modifications, subprime mortgage, and mortgage notes, and then leverages a weighted rule set to determine the document type.

This enables you to purchase a portfolio of loans, drop the collateral documents into QBO, and having a workflow OCR, parses, and classify each document received. Processors would be assigned to review only documents classified as ‘unknown’, instead of putting eyeballs on each and every document, and loans missing key documents can automatically be flagged for follow-up.

Check out the demo video on our website as well.

Excel Imports: Hidden Rows

posted Jul 12, 2017, 4:14 AM by Eric Patrick

Frequently, power users observe that Excel-based imports result in more rows that present in Excel. This is generally a result of explicit or implicit ranges being created in Excel, which in turn are exposed to the OldDb drives provided by Microsoft. This is a problem Quandis cannot fix; the workaround is to save the spreadsheet as a CSV file, and the re-save it as an Excel spreadsheet.

For some of these use cases, issuing a SELECT DISTINCT * FROM {Sheet} will ignore the extra rows.

The ExcelEngine and OldDbEngine classes have been modified to optionally do this, and the default behavior is set to True. This means that if you intentionally want to import duplicate rows, you must explicitly tell the Import File Template to ignore this option:


Breaking Change: Async methods moved

posted Jun 22, 2017, 8:17 AM by Eric Patrick

qbo.Core has been updated with a large footprint change:
  • qbo.Application has been refactored to contain *.Async classes for all async methods instead of using extension classes
  • qbo.Decision has been extended to contain async methods to process workflows and all extensibility has now been ported to async
  • qbo.Import has been extended to contain async methods to process imports
  • Web projects for the above classes .ashx files have been ported to async
To deploy you must recompile ALL dlls that reference qbo.Application

Any cs files that reference:

using qbo.Application.AsyncExtensions;

should remove this reference as it's now obsolete. All core/web projects have been modified, and most plug-ins, have been modified in SVN.

Queue Service - qbo.QueueService.3.2.0 to the Installation folder and must be used for this build.

Bug Fix: Importing Configuration Data

posted May 24, 2017, 12:53 PM by Eric Patrick

A configuration change to Abstract.config has been made to fix a bug that occurs when importing configuration data generated by exporting template data from QBO.

The bug occurred when exporting template data such as Decision Templates, Attachment Templates, and other modules that include method signatures. When method signatures are encountered, if the method invokes a customized statement, the custom statement is included in the export:

  <AttachmentTemplate>My Custom Document</AttachmentTemplate>

When encountering the ConfigurationEntryCollection, AbstractObject/ImportXml does not parse the node correctly, remaining in an infinite loop on the closing tag.

The fix for this is to define ConfigurationEntryCollection as a child class for all objects, by modifying Abstract.config:

  <Child Name="ConfigurationEntryCollection" Type="qbo.Application.ConfigurationEntryObject, qbo.Application"/>

Deploying the updated Abstract.config addresses this bug.

1-10 of 28