Release Notes

AbstractObject/EndInvokeAsync Bug Fix

posted Oct 18, 2018, 7:36 AM by Eric Patrick

AbstractObject.Async.cs has been updated to fix a bug that can result in IIS crashes. Specifically:

object result = InvokeAsync(operation, parameters);

has been changed to:

object result = await InvokeAsync(operation, parameters);

When called from ImportFile.ashx/Import, synchronous imports run the risk of raising an exception that crashes the application pool. This can be replicated from the Jasmine test specification Import > Import File Queue Engine.

The missing await caused the result object to be an unexecuted task, instead of the expected DataSet, XmlReader, DataReader or null (void).

Exporting from QBO to Excel fix (qbo.Attachment.OpenXml)

posted Sep 28, 2018, 3:11 PM by Cameron Watt   [ updated Sep 28, 2018, 3:12 PM ]

The plugin qbo.Attachment.OpenXml used in Excel exporting functionality has been fixed to scrub input from the database before being sent to the OpenXmlWriter, namely removing invalid Xml characters.

This requires no changes to systems using this plugin, so it is safe to simply update from trunk and use.

qbo.ps1/New-qboInstance now requires IAMRole value; UserData updated

posted Aug 6, 2018, 8:36 AM by Philip Raath   [ updated Aug 6, 2018, 8:53 AM ]


-IAMRole is now a required parameter when calling qbo.ps1/New-qboInstance.

This update was requested in order to restrict build/deploy access to servers across products.

Please consult with Kevin Foley to receive an appropriate IAMRole value for your product.

The current list of available roles is below. Please be sure to use the appropriate role for each environment (DEV/UAT/Stage/Prod) when creating new Instances.

  • SLS_DEV_Deployment
  • SLS_PROD_Deployment
  • SLS_Stage_Deployment
  • SLS_UAT_Deployment

  • MLA_DEV_Deployment
  • MLA_PROD_Deployment
  • MLA_UAT_Deployment

  • QBS_DEV_Deployment
  • QBS_PROD_Deployment
  • QBS_UAT_Deployment

  • SCRA_DEV_Deployment
  • SCRA_PROD_Deployment
  • SCRA_UAT_Deployment

  • QTD_DEV_Deployment
  • QTD_PROD_Deployment
  • QTD_UAT_Deployment

  • QVS_DEV_Deployment
  • QVS_PROD_Deployment
  • QVS_UAT_Deployment

  • ADR_DEV_Deployment
  • ADR_PROD_Deployment
  • ADR_UAT_Deployment

  • SATS_DEV_Deployment
  • SATS_PROD_Deployment
  • SATS_UAT_Deployment


The -userDataRaw parameter previously defaulted to 'machine.ps1'.

This has been superseded by the -userDataFile parameter, which defaults to 'EC2.UseDataDefault.ps1'.

However, if the -userDataRaw parameter is supplied a non-null value when calling New-qboInstance, then the -userDataRaw parameter will be used instead of -userDataFile.

qbo.ps1/New-qboInstance now requires Tag values

posted Jul 23, 2018, 12:07 PM by Philip Raath   [ updated Jul 24, 2018, 8:53 AM ]

This update was requested in order to make tagging of EC2 Instances consistent.

The New-qboInstance function now requires the following parameters:


Department has also been added as an optional parameter.

Project = 'QCC'
Environment = 'PROD' / 'UAT' / 'DEV' / etc
Owner = team/person who created the Instance
Department = 'FL : Dade'

Restructuring of LedgerItem

posted Jul 23, 2018, 11:14 AM by Chad Boyer

We removed CheckBookID and made PayorID and PayeeID foreign keyed to Contact vs. CollectionMember to save on loading time and remove old pointers that are not used among our clients.

Queue Service - Deploying using MS Build

posted Jul 6, 2018, 4:22 PM by Greg Kent   [ updated Jul 27, 2018, 11:44 AM ]

Queue Service and BOT Service deployment is now facilitated using MSBuild and should be deployed whenever a new build is made. 
  • MSI installs have been deprecated
  • MSBuild 2017 is supported
Additional Updates:
  • Queue Statistic logic updated including bug fixes
  • Queue Herd and Logging settings are now controlled using Application Settings

Queue Service Details

  • Queue Service solution (<root>/QueueService/QueueService.sln) has been refactored and simplified. All BOT projects have been removed.
  • qbo3.QueueServiceTargets supports the deployment and registration of Queue Service on the target machine. Targets:
    • QueueService - stops and unregisters (if existing), deploys and registers QueueService. It will NOT automatically start Queue Service. 
    • qsStart - Starts Queue Service
    • qsStop - Stops Queue Service
    • qsDeploy - Deploys content of Queue Service
    • qsCreate - Registers Queue Service
    • qsDelete - UnRegisters Queue Service
  • QueueService now deploys to <WebsiteRoot>/bin vs. MSI install location of C:\Program Files\Quandis\Queue Service. This allows QueueService to utilize the same dlls as the application.
  • QueueService.exe.config
    • Now deploys to <WebsiteRoot>/bin
    • Config File Autodetect - Auto detection of application's web.config file is now supported. If Queue Service is installed in <WebsiteRoot>/bin there is no need to specify a path for the QueueSource.ConfigFile. Instead the value "autodetect" is specified. This is the recommended pattern.
    • This file is usable "as-is". If the pre-existing QueueService.exe.config file has a custom Herd specified, please take note of Herd value and implement using the pattern specified in section Queue Herd Updates below. Note all Queue Service settings can be configured using SystemDefaults. 
      • If customization is required beyond standard settings, the suggested pattern is to create a copy of QueueService.exe.config in the respective theme project at same level as web.config and set "Copy To Output Director" = "Copy if newer", Build Action = "None"
  • To Build and Deploy:
    • Save existing QueueService.exe.config file in MSI install location of C:\Program Files\Quandis\Queue Service. Compare to QueueServiceDeploy/QueueService.exe.config to see if there is any customization.
    • Uninstall Queue Service from add/remove programs
    • From main proj file, CallTarget "QueueService". See qbo3.Sample.2017 for usage.
      • SiteFolder must be specified as a parameter if SiteFolder is other than C:\inetpub\wwwroot (specified in qbo3.Powershell.Targets)

Queue Statistic Logging Update

Queue Statistics are now logged using the application instead of the queue service. This simplifies configuration and allows more control over settings. The following settings control statistics logging behavior:

  • qbo.Application
    • QueueServiceLogIntervalMS - Sets logging interval of statistics to Cloudwatch. Suggested setting is 60000. (60 seconds). If set to 0 logging is disabled. Default value is 0.
    • QueueServiceQueueStatisticsList - List of queues or Queue Statistics Group to log statistics on. Names are separated by comma. Eg "DefaultQueue,QCCBots"
    • QueueServiceLogExecutionTime - Records execution times of processed items as a separate metric. Default value is False which disables this feature.
    • QueueServiceSourceName - Sets namespace of metrics in CloudWatch
  • QueueService.exe.config
    • qbo.QueueService.StatisticIntervalMS - sets the timer intveral in Queue Service to poll for logging statistics. Suggested setting is 10000. (10 seconds)
For statistics logging to function, the following above settings must be defined:
  • QueueServiceLogIntervalMS must be > 0
  • QueueServiceQueueStatisticsList must contain at least one queue name or Queue Statistics Group
  • qbo.QueueService.StatisticIntervalMS must be > 0
Note Statistics logging only functions on queues that are part of active Herds.

The following settings/updates must also occur:
  • Web.config update
    • loggingConfiguration > listeners > AmazonCloudWatchQueueStatistics (must be present)
    • loggingConfiguration > formatters > Queue Metric Formatter (must be present)
    • loggingConfiguration > categorySources > QueueStatistics (must be present)
See qbo.Core > ApplicationWeb > Web.config

  • Application Setting name update. Two settings have been renamed for easier identification:
    • qbo.Application.Properties.Settings.QueueSourceName has been renamed to qbo.Application.Properties.Settings.QueueServiceSourceName
    • qbo.Application.Properties.Settings.QueueStatisticLogIntervalMS has been renamed to qbo.Application.Properties.Settings.QueueServiceLogIntervalMS
If these are seeded as SystemDefaults, a simple update can adjust the names:

Update SystemDefault SET SystemDefault = 'qbo.Application.Properties.Settings.QueueServiceSourceName' , UpdatedDate = GETDATE()
WHERE SystemDefault = 'qbo.Application.Properties.Settings.QueueSourceName'

     Update SystemDefault SET SystemDefault = 'qbo.Application.Properties.Settings.QueueServiceLogIntervalMS', UpdatedDate = GETDATE()
where SystemDefault = 'qbo.Application.Properties.Settings.QueueStatisticLogIntervalMS'

Queue Herd Updates

Queue Service Herds are now managed using Application Settings. To manage queue herds, Application Settings can leverage the standard QBO Configuration Filter Pattern to target specific machines for custom herds. The following Application Setting sets the Herd(s):
  • QueueServiceHerd - sets Queue Herd(s) to process. Default value is Default as all Queues are part of the Default herd unless specified. Multiple Herds can be separated with a comma. Eg. System,Default
To configure a custom herd:
  1. Seed a custom setting: "QueueServiceHerd" with Filter "DocGenerators" with value Docgeneration. Eg.
  1. For each queue to be processed by custom herd, set the Queue.Herd to Docgeneration
  2. In web.config on herd machines, ensure setting exists:
<setting name="ConfigurationFilter" serializeAs="String">

BOT Service Details

  • BOTService.sln has been created and only contains BOT Service projects and has been decoupled from Queue Service
  • BOT Service deployment follows same pattern as Queue Service:
  • qbo3.BOT ServiceTargets supports the deployment and registration of BOT Service on the target machine. Targets:
    • BotService - stops and unregisters (if existing), deploys and registers BOT Service. It will NOT automatically start BOT Service. 
    • bsStart - Starts BOT Service
    • bsStop - Stops BOT Service
    • bsDeploy - Deploys content of BOT Service
    • bsCreate - Registers BOT Service
    • bsDelete - UnRegisters BOT Service
  • BOTService.exe.config
    • Now deploys to <WebsiteRoot>/bin
    • Updated to support auto detection of  QueueService.exe.config.  Set BOTSource.ConfigFile  = "autodetect". This is the recommended pattern.
    • EC2 Autoscale and UserData dynamic config file copies, change:
      • $targetFolder = <WebsiteRoot>\bin. eg. C:\inetpub\wwwroot\bin
      • Any reference to "QBO BOT Service" to "qbo BOT Service". Note case sensitivity
  • To Build and Deploy:
    • Uninstall BOT Service from add/remove programs
    • From main proj file, CallTarget "BOTService"
      • SiteFolder must be specified as a parameter if SiteFolder is other than C:\inetpub\wwwroot (specified in qbo3.Powershell.Targets)

Caching: Sliding Expiration Policy

posted Jun 27, 2018, 11:13 AM by Travis Croxford   [ updated Jul 5, 2018, 1:18 PM by Eric Patrick ]

Potential breaking change; If you have a private plugin/project (not included in the qbo.Core solution), and it leverages caching, you will need to add a new reference to System.Runtime.Caching.

MemoryCache can now have a policy applied to it when an object is being added.

Code example:

CacheItemPolicy policy = new CacheItemPolicy { SlidingExpiration = TimeSpan.FromHours(2) };
qbo.Application.Caching.MemoryCache pacerCache = new qbo.Application.Caching.MemoryCache(new Application.Configuration.Cache());
pacerCache.Set(credentialKey, pacerCreds, policy);

This allows for a cached item to remain in cache for 2 hours, until it's accessed again then the 2 hour timer starts over. After 2 hours without being accessed the item will fall out of cache.

Note that qbo.Application.Tests/CacheManagerTests.cs has been added to qbo.Application.Tests, which validates the behavior of CacheManager_SlidingExpiration().

Matrix: update from a spreadsheet

posted Apr 20, 2018, 3:43 PM by Chad Boyer   [ updated Apr 21, 2018, 10:10 AM by Eric Patrick ]

The QBO Matrix View panel supports updating a matrix from a spreadsheet (CSV file).  One can:
  • Export a matrix view via Options-> Export to CSV
  • Update the matrix data in Excel (or another spreadsheet editor)
  • Drop the revised spreadsheet on the Matrix View header to update the matrix
In order for this to work, navigate to Design > Configuration > Modules, choose the Matrix modules, and from the Settings tab, ensure the MatrixViewImport setting is set to true. (The underlying application setting is qbo.Application.Properties.Settings.MatrixViewImport.)

Additionally, one can:
  • Copy an existing matrix to a new matrix: from the Matrix Summary's Edit menu, choose Copy.  
  • Export a Matrix: from the Matrix Summary's Edit menu, choose Export.
  • Import a Matrix: from Home > Import Data, choose the QBO XML engine, and drop an exported matrix onto the import panel.
Technical notes:
  • Updating a matrix from a spreadsheet requires each column have a matching Input our Output column
  • CSV files need to have its columns wrapped in quotes for each field

qbo.MethodElement.js extended to respond to Events

posted Apr 16, 2018, 4:11 PM by Philip Raath

qbo.MethodElement can now trigger an API call in response to an Event.

To configure, assign the Event to the renderOnEvent property of the MethodElement options.

Code example:
<div name="EventTests">
          <input type="button" id="testButton" value="Click Me!"/>
          <div id="Question3" data-behavior="MethodElement" data-methodelement-options="{{'className': 'SLSLoan', 'operation': 'Search', 'parameters':                                                                                               'DisplaySize=1', 'renderOnEvent': ''}}"></div>
          <input type="hidden" id="PIConstant" data-methodelement-value="Question3.PIConstant"/>

GUI Example:

Tests: Theme.ashx/Specs?Library=Behaviors\Spec.MethodElement.js

qbo.Depend extended to respond to Button clicks

posted Apr 6, 2018, 5:16 PM by Philip Raath   [ updated Apr 6, 2018, 5:18 PM ]

qbo.Depend can now toggle the 'disabled' class on the basis of a button click.

To assign this dependency, use the pattern: {buttonId} = click as the 'depends' parameter.

<div id="buttonTestsDiv">
    <label for ="buttonTest1">Button Test 1</label>
    <div class="controls">
      <input type="button" id="testButton" value="Click me!"/>
      <input type="text" id="buttonTest1" data-behavior="Depend" data-depend-options="{{'depends': 'testButton = click', 'condition': 'and',                         'disabledClass': 'disabled'}}"/>

Tests: Theme.ashx/Specs?Library=Behaviors\Spec.Depend.js

1-10 of 47