business rules/logic

Labels
AJAX(112) App Studio(9) Apple(1) Application Builder(245) Application Factory(207) ASP.NET(95) ASP.NET 3.5(45) ASP.NET Code Generator(72) ASP.NET Membership(28) Azure(18) Barcode(2) Barcodes(3) BLOB(18) Business Rules(1) Business Rules/Logic(140) BYOD(13) Caching(2) Calendar(5) Charts(29) Cloud(14) Cloud On Time(2) Cloud On Time for Windows 7(2) Code Generator(54) Collaboration(11) command line(1) Conflict Detection(1) Content Management System(12) COT Tools for Excel(26) CRUD(1) Custom Actions(1) Data Aquarium Framework(122) Data Sheet(9) Data Sources(22) Database Lookups(50) Deployment(22) Designer(178) Device(1) DotNetNuke(12) EASE(20) Email(6) Features(101) Firebird(1) Form Builder(14) Globalization and Localization(6) How To(1) Hypermedia(2) Inline Editing(1) Installation(5) JavaScript(20) Kiosk(1) Low Code(3) Mac(1) Many-To-Many(4) Maps(6) Master/Detail(36) Microservices(4) Mobile(63) Mode Builder(3) Model Builder(3) MySQL(10) Native Apps(5) News(18) OAuth(9) OAuth Scopes(1) OAuth2(13) Offline(20) Offline Apps(4) Offline Sync(5) Oracle(11) PKCE(2) Postgre SQL(1) PostgreSQL(2) PWA(2) QR codes(2) Rapid Application Development(5) Reading Pane(2) Release Notes(184) Reports(48) REST(29) RESTful(29) RESTful Workshop(15) RFID tags(1) SaaS(7) Security(81) SharePoint(12) SPA(6) SQL Anywhere(3) SQL Server(26) SSO(1) Stored Procedure(4) Teamwork(15) Tips and Tricks(87) Tools for Excel(3) Touch UI(93) Transactions(5) Tutorials(183) Universal Windows Platform(3) User Interface(338) Video Tutorial(37) Web 2.0(100) Web App Generator(101) Web Application Generator(607) Web Form Builder(40) Web.Config(9) Workflow(28)
Archive
Blog
business rules/logic
Wednesday, May 16, 2012PrintSubscribe
Conditional Email Business Rules

If you review the introduction to Email Business Rules, then you will learn that a notification will be sent out when a new customer record has been created. What if you want to trigger a notification for new customers from a certain country? Email notifications are frequently triggered in response to changes in data.  What do you do in that case?

It is time for name calling, blacklisting, and whitelisting (all in a good sense).

Let’s enhance the Northwind sample with an automatic notification that will go out when a product price has increased.

Start Project Designer, activate Controllers tab in Project Explorer, select Products data controller, and create a new SQL business rule with the following properties.

Property Value
Command Name Update
Type SQL
Phase After
Script
if @UnitPrice_Modified = 0 or @UnitPrice_OldValue >= @UnitPrice_NewValue
   set @BusinessRules_Blacklist = 'PriceChanged'

The business rule will blacklist something named PriceChanged if the product unit price has not increased.

Add an Email business rule with these properties.

Property Value
Command Name Update
Name PriceChanged
Type Email
Phase After
Script
Host: smtp.gmail.com
Port: 587
UserName: YOUR_EMAIL_ADDRESS@gmail.com
Password: PASSWORD
EnableSSL: true

From: "Sales Admin" <YOUR_EMAIL_ADDRESS@gmail.com>
To: RECEIPIENT@northwind.com
Subject: Price of "{ProductName}" has been increased

User {@BusinessRules_UserName} has changed the price of "{ProductName}" from {UnitPrice_OldValue, c} to {UnitPrice_NewValue, c}.

Northwind,
Administrator

Make sure to replace the highlighted parameters with your own values.

Notice the data format string “c” next to UnitPrice_OldValue and UnitPrice_NewValue. Use any standard or custom numeric, date, and time span format strings as needed.

This is the new look of Products data controller hierarchy in Project Explorer.

Named email business rule 'PriceChanged' is blacklisted by preceding SQL business rule if the price of the product has not increased

SQL and Email business rules are evaluated and executed in the order of their appearance in the data controller. An SQL business rule can prevent any other business rules from being executed by “blacklisting” the rule name in the parameter @BusinessRules_Blacklist. If the rule’s name is on the list, then it will not be executed. Rules without names are not effected.

Generate the application and modify a product without making any changes to the price – there will no be notifications.

Increase a price of any product and you will get a notification that may look like this.

A conditional email notification in Gmail is informing about product price increase

You can have multiple “named” email business rules and implement a single SQL business rule to control their execution with the help of “blacklist”.

If you need to reorder the business rules then click on Business Rules node, select an individual rule and move it up and down.

There is also a better sounding alternative – the “whitelist”. The idea behind the whitelist is very simple. If a named business rule is not on the whitelist, they it is not allowed to execute.

This is the “whitelist” version of the SQL business rule from above.

set @BusinessRules_Whitelist = 'Nothing'
if @UnitPrice_Modified = 1 and @UnitPrice_OldValue < @UnitPrice_NewValue
   set @BusinessRules_Whitelist = 'PriceChanged'

Note that both, blacklist and whitelist, can contain multiple names separated by “comma”, or “semicolon”. For example,

PriceChanged,LowStock

Use of whitelist and blacklist depends on your personal preferences. Generally, whitelist is a more natural method of expressing notification triggers since a condition must be “positive” for a notification to go out.

Use a combination of both lists when needed.

Wednesday, May 16, 2012PrintSubscribe
Introducing Email Business Rules

Email is a lifeblood of operations in any organization. If the emails are not flowing smoothly, then things are not getting done, customers are unhappy, nobody knows what is going on. Line-of-business web applications are the backbone of operations. Integrated email notifications are an absolute necessity.

Code On Time web applications have a built-in support for Email Business Rules. The application framework processes this type of business rules by sending email notifications in response to user actions or events in the lifecycle of data controllers.

Imagine that you are running a mail order company called Northwind and would like to be notified when a new customer is registered in the database.

Start Project Designer and right-click Customers / Business Rules node on Controllers tab of Project Explorer.

Adding a new business rule to a data controller in a web app created with Code On Time application generator

Enter the following properties and click OK button to save the new email business rule.

Property Value
Command Name Insert
Type Email
Phase After
Script
Host: smtp.gmail.com
Port: 587
UserName: YOUR_EMAIL_ADDRESS@gmail.com
Password: PASSWORD
EnableSSL: true

From: "Sales Admin" <YOUR_EMAIL_ADDRESS@gmail.com>
To: RECEIPIENT@northwind.com
Subject: We have a new customer "{CompanyName}"!

<html>
<body>
<i>Customer Information</i>
<br />
<br />
<table>
  <tr>
    <td>Company:</td>
    <td><b>{CompanyName}</b></td>
  </tr>
  <tr>
    <td>Contact:</td>
    <td>{ContactName}, {ContactTitle}</td>
  </tr>
  <tr>
    <td valign="top">Address:</td>
    <td>
        {Address}<br />
        {City}, {Region} {PostalCode}
    </td>
  </tr>
  <tr>
    <td>Country:</td><td>{Country}</td>
  </tr>
  <tr>
    <td>Phone:</td><td>{Phone}</td>
  </tr>
  <tr>
  <td>Fax:</td><td>{Fax}</td>
  </tr>
  </table>
<br />
<br />
Northwind,
Administrator
</body>
</html>

Make sure to replace the highlighted email addresses and Host with your own email addresses and host information. The host parameter in the script points to Gmail smtp server. If you have an existing account at Hotmail or Microsoft Live, then replace the Host with smtp.live.com address.

This is how the business rule will look in the hierarchy of Customers data controller.

An email business rule in the hierarchy of Customers data controller

The bottom portion the business rule script is the email body. It uses HTML tags and references to the field names of the data controller. The field references are placed in curly brackets.

Navigate to Customers page and start entering a new customer.

Adding a new customer in the Northwind sample created with Code On Time web application generator

Click OK button when finished. If everything is correct, then the new customer record will be selected in the view mode on Customers page. If there were any mistakes during email delivery, then you will see an error message at the top of the page.

Check the inbox of the notification email recipient. This is how the message may look in Gmail.

An email notification send by Email Business Rule when a new customer record is created in the database

Email Business Rules are defined in data controllers. Developers can use data controller virtualization to inspect the user identity and dynamically attach notifications to the data controllers. The definitions of notifications can be stored elsewhere in the database.

Tuesday, May 15, 2012PrintSubscribe
Modifying Membership Manager

Code On Time web applications designed for Internet access have an option to include a built-in Membership Manager. This tool works on top of Microsoft ASP.NET Membership to simplify user and role management in generated apps. It uses exactly the same data controller architecture as the rest of data controllers in a project.

Data controllers aspnet_Membership and aspnet_Roles are automatically created in a web application if the membership feature is enabled.

This is a typical view of Membership Manager presented if you sign in as admin and navigate to Membership page.

Standard Membership Manager in a web app created with Code On Time application generator

The data controller files can be changed in Visual Studio but the changes will be overwritten by the application generator.

Instead, consider the data controller virtualization when you need to modify the membership manager.

Select the project name on the start page of the generator and choose Develop option. Visual Studio will load the project for editing. Create a new code file Class1.cs(vb) under ~/App_Code/Security folder of your project.

The extension class file for MembershipBusinessRules class displayed in Solution Explorer of Visual Studio

Enter the following definition of the partial class MembershipBusinessRules to virtualize the data controller definition at runtime.

C#:

using System;
using MyCompany.Data;

namespace MyCompany.Security
{
    public partial class MembershipBusinessRules
    {
        public override bool SupportsVirtualization(string controllerName)
        {
            return true;
        }

        protected override void VirtualizeController(string controllerName)
        {
            // remove lookup capability from the field "UserId"
            NodeSet().SelectField("UserId")
                    .SetItemsStyle(null)
                    .SetItemsController(null)
                    .SetItemsNewView(null);
            // select "grid1" view 
            NodeSet().SelectView("grid1")
                // add data field "UserId"
                .CreateDataField("UserId")
                    .SetReadOnly(true)
                // delete data field "Comment"
                .SelectDataField("Comment")
                    .Delete();
            // select "grid1" view
            NodeSet().SelectView("grid1")
                // re-arrange the data fields
                .ArrangeDataFields("UserUserName", "Email", "UserId");
        }
    }
}

Visual Basic:

Imports MyCompany.Data
Imports System

Namespace MyCompany.Security

    Partial Public Class MembershipBusinessRules
        Public Overrides Function SupportsVirtualization(controllerName As String) As Boolean
            Return True
        End Function

        Protected Overrides Sub VirtualizeController(controllerName As String)
            ' remove lookup capability from the field "UserId"
            NodeSet().SelectField("UserId") _
                .SetItemsStyle(Nothing) _
                .SetItemsController(Nothing) _
                .SetItemsNewView(Nothing)

            ' select "grid1" view, add data field "UserId", and delete data field "Comment"
            NodeSet().SelectView("grid1") _
                .CreateDataField("UserId") _
                    .SetReadOnly(True) _
                .SelectDataField("Comment") _
                    .Delete()
            ' select "grid1" view and re-arrange the data fields
            NodeSet().SelectView("grid1") _
                .ArrangeDataFields("UserUserName", "Email", "UserId")
        End Sub
    End Class

End Namespace

The new partial class complements the standard class MembershipBusinessRulesBase included in the application framework. It is possible to override any standard methods such as SignUpUser or UpdateUser. The implementation above overrides the data controller virtualization methods only.

Save the code file and navigate to Membership Manager.

You will see the global unique ID of each user. The data field Comment is not visible anymore. The remaining data fields are re-arranged.

Virtualized data controller aspnet_Membership in action