Checkware Event Engine

Today it is possible to assign a C# .NET dll to every checklist in Checkware and react on specific Checklist events (e.g. Init of Checklist, Complete etc...) with custom logic. With this functionality it is possible for example to send an email when a checklist is completed by someone.

We are now planning a new "Checkware event engine" based on JavaScript, so that checklist creators can build checklist and associated actions / events with the same programming language.

Event Engine Runtime

The event engine should run on top of NodeJs and the specific checklist event code should be triggered on server side from the core Checkware .NET process. To achieve this we will use EdgeJs which brings both worlds (.NET CLR & NodeJS) together. For some specific actions (see below) it will also be necessary, that the JavaScript Event API will also "call" back to

Here are some requirements for the event engine Runtime:


JavaScript Event API

API object

API object is a core of JavaScript Event API and can be accessed via checkware variable. This object is used to invoke functions and it also contains an additional properties, like type of event that called a current script.


TODO: document 
checkware.userId
checkware.roleId checkware.username checkware.languageSymbol checkware.mandatorId checkware.eventScriptId checkware.evaluationId checkware.checklistId checkware.eventType checkware.sendMail checkware.debug checkware.getValue checkware.setValue checkware.createEvaluation checkware.deleteEvaluation checkware.completeEvaluation checkware.getEvaluations checkware.assignTo checkware.createTask checkware.deleteTask checkware.callConnector checkware.setSetting checkware.setSetting


Events

Events can be used to trigger some specific functionality (e.g. send mail) when something specific happens (e.g. when the checklist has been saved). Event type is specified in checkware.event property as string.

Possible types of event:

Switch statement is a recommended approach to check the type of event. For example:

switch (checkware.event) {
    case 'init':
        // ...
        break;
    case 'save':
        // ...
        break;
    case 'complete':
        // ...
        break;
    case 'delete':
        // ...
        break;
    default:
        // ... 
}

Functions

As mentioned before, API functions can be invoked using a checkware variable. Functions take JSON object or simple primitive value as the only one parameter. Properties in JSON object parameter can be placed in no specific order. Here is an example function call:

var setting = checkware.getSetting('Foo');

All available functions are described below.


Main functions

sendMail()

Can be used to send an email to someone.

{
    recipients: string, // recipients seperated with ';'
    subject: string,
    message: string,
    attachPdf: boolean // optional
}
checkware.sendMail({ recipients: 'JohnDoe@example.com;JaneDoane@example.com', subject: 'ExampleSubject', message: 'ExampleMessage', attachPdf: true });

getValue()

Can be used to get an EvaluationValue. If evaluationId is not specified, the EvaluationValue is retrieved from current Evaluation.

{
    evaluationId: string // optional
    matchcode: string, 
}
var evaluationValue = checkware.getValue('ExampleMatchcode');
var evaluationValue = checkware.getValue({ evaluationId: '11111111-2222-3333-4444-555555555555', matchcode: 'ExampleMatchcode' });

setValue()

Can be used to set an EvaluationValue. If evaluationId is not specified, the EvaluationValue is set to current Evaluation.

{
    evaluationId: string // optional
    matchcode: string,
    value: string || number || boolean
}
checkware.setValue({ matchcode: 'ExampleMatchcode', value: 'ExampleValue' });
checkware.setValue({ evaluationId: '11111111-2222-3333-4444-555555555555', matchcode: 'ExampleMatchcode', value: 'ExampleValue' });


createEvaluation()

Can be used to create a new Evaluation.

{
    folderStructureChecklistId: string,
    parameters: { key: string, value: string }[] // Matchcode-Value
}
checkware.createEvaluation({ folderStructureChecklistId: '11111111-2222-3333-4444-555555555555', parameters: [{ key: 'ExampleMatchcode', value: 'ExampleValue' }] });


deleteEvaluation()

Can be used to delete an Evaluation. If evaluationId is not specified, the current Evaluation is deleted.

checkware.deleteEvaluation();
checkware.deleteEvaluation('11111111-2222-3333-4444-555555555555');


completeEvaluation()

Can be used to complete a current Evaluation. If evaluationId is not specified, the current Evaluation is completed.

checkware.completeEvaluation();
checkware.completeEvaluation('11111111-2222-3333-4444-555555555555');


getEvaluations()

Can be used to get an Evaluation list. Comparison operator can be set in filter object through operator property. If operator is not specified for filter object, operator from comparisonOperator parameter is used. If comparisonOperator parameter is not specified, the AND operator is used.

{
    filter: { matchcode: string, value: string, operator: string /* 'or' || 'and', optional */ }[],
    checklistIds: string[], // optional
    comparisonOperator: string // 'or' || 'and', optional
}
Array<{
    EvaluationId: string,
    ChecklistId: string,
    ComplateDate: Date,
    InsertDate: Date,
    InsertBy: string,
    ClosedByUserId: string,
    UpdateDate: Date,
    UpdateBy: string,
    EvaluationValues: { Matchcode: string, Value: string || number || boolean }[]
}>
var evaluations = checkware.getEvaluations([{ matchcode: 'ExampleMatchcode', value: 'ExampleValue' }]);
var evaluations = checkware.getEvaluations([{ matchcode: 'ExampleMatchcode1', value: 'ExampleValue1' }, {matchcode: 'ExampleMatchcode2', value: 'ExampleValue2', operator: 'or' }]);
var evaluations = checkware.getEvaluations({ filter: [{ matchcode: 'ExampleMatchcode', value: 'ExampleValue' }], checklistIds: ['11111111-2222-3333-4444-555555555555'] });
var evaluations = checkware.getEvaluations({ filter: [{ matchcode: 'ExampleMatchcode', value: 'ExampleValue' }], checklistIds: ['11111111-2222-3333-4444-555555555555'], comparisonOperator: 'or' });


assignTo()

Can be used to assign a Evaluation to another User. If evaluationId is not specified, the User is assigned to current Evaluation.

{
    evaluationId: string // optional
roleId: string // optional username: string, }
checkware.assignTo('ExampleUser');
checkware.assignTo({ evaluationId: '11111111-2222-3333-4444-555555555555', username: 'ExampleUser' });
checkware.assignTo({ roleId: '11111111-2222-3333-4444-555555555555' });
==> If a Role is alrady assigned to a avaluation, then they will no longer overwritten.

createTask()

Creates a new Task.

{
    folderStructureChecklistId: string, // optional
    taskType: number, // 0: all users must return; 1: one user must return
    startDate: string, // 20101220101233   yyyyMMddHHmmss
    endDate: string, // 20101220101233   yyyyMMddHHmmss
    description: string
    recipients: string[] // array of usernames
}
checkware.createTask({ 
    folderStructureChecklistId: '11111111-2222-3333-4444-555555555555',
    taskType: 1, 
    startDate: '20180601120000',   
    endDate: '20180610120000',  
    description: 'Example description',
    recipients: ['ExampleUser1',  'ExampleUser2']    
});

deleteTask()

Deletes a Task which is assigned to a Evaluation. If evaluationId is not specified, Task from current Evaluation is deleted.

checkware.deleteTask();
checkware.deleteTask('11111111-2222-3333-4444-555555555555');

callConnector()

Calls connector method.

{
    connectorKey: string,    
    method: string,
    parameter: string // JSON object
}
{
    Success: boolean, 
    Message: string, 
    Result: object
}
var result = checkware.callConnector({ connectorKey: 'Demo1', method: 'Add', parameter: '{ Number1: 10, Number2: 5 }' });
checkware.callConnector({connectorKey: 'Sql', method: 'action', parameter: JSON.stringify({
                                    ProcedureName: "ChangeZWertOnConfigurationItem",
                                    Parameters: [{Name: "@zWert", DataType: "string", Value: zWert},
                                                 {Name: "@configurationItemId", DataType: "guid", Value: configurationItemId}]
                                })});

Utility functions

debug()

Creates a log entry for the event execution. This is useful for debugging purposes, e.g. when user wants to know, if a specific line of code was executed.

{
    message: string,
    level: string   
}
checkware.debug({ message: 'ExampleMessage', level: 'warning' });

-> URL: #checkware/eventscriptlog


getSetting()

Gets a system setting from the database.

var setting = checkware.getSetting('Foo');

setSetting()

Sets a system setting in the database.

{
    setting: string,   
    value: string
}
checkware.setSetting({ setting: 'Foo', value: 'ExampleValue' });