...
For every domain hosted on Emakin, a separate XML database is created. This database is reserved for only special use cases and Emakin does not store any data by default.
General usage examples are as follows:
- Storing settings for processes
- Storing scripts that can be used in processes
- Saving important process parameters
- Keeping pre-formatted statistics to later display in dashboards
Since this database is reserved for custom usage, there is no default root node so you have to define a unique and describing root name when saving your data.
See below for an XML example of a custom settings data. In this example, settings data:for the Leave Request process gets stored in domain database and its data is enclosed between <LRDictionary> tags as an arbitrary choice. It includes leave type definitions, their localization data and leave allowance calculation script as javascript code. A settings screen designed in this process loads this XML data and lets users to modify it depending on their needs, which makes this process considerably dynamic and flexible.
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
<LRDictionary> <Definitions> <HRGroup Caption="Designer Specialist">439c9457-297e-47b4-b002-0e82ae1c94d0</HRGroup> <HRManager Caption="None"/> <LeaveTypes> <LeaveType> <Name>Annual</Name> <Code>A</Code> <SubLeaveTypes/> <Name_tr>Yıllık</Name_tr> <IncludeOnCalculation>True</IncludeOnCalculation> <HasSubTypes>false</HasSubTypes> </LeaveType> <LeaveType> <Name>Excuse</Name> <Code>E</Code> <SubLeaveTypes> <SubLeaveType> <Id>ac9572db-7045-4a37-a170-1781d56483d3</Id> <Name>Sickness</Name> <Name_tr>Hastalık</Name_tr> </SubLeaveType> <SubLeaveType> <Id>b2caff73-f308-4b01-979c-321dcb123056</Id> <Name>Paternity</Name> <Name_tr>Babalık</Name_tr> </SubLeaveType> <SubLeaveType> <Id>23cc603f-d037-4acc-90c9-8dc26aefb05a</Id> <Name>Death</Name> <Name_tr>Vefat</Name_tr> </SubLeaveType> <SubLeaveType> <Id>bc1f4fbc-1b81-4e92-9daa-b91ca39af77a</Id> <Name>Other</Name> <Name_tr>Diğer</Name_tr> </SubLeaveType> </SubLeaveTypes> <Name_tr>Mazeret</Name_tr> <IncludeOnCalculation/> <HasSubTypes>true</HasSubTypes> </LeaveType> </LeaveTypes> <Calculation>var today; $Calendar2.GetToday('', function(newDate) { today = newDate; }); var results = $Database.Get({ Parameters: { TargetSchema: 'HR', TargetTable: 'Employee' }, Columns: [{ Name: 'Id' }, { Name: 'StartDate' }, { Name: 'LastAllowanceCalcDate' }, { Name: 'RegistryNumber' } ], Where: { Criteria: [{ Name: 'LastAllowanceCalcDate', Value: today, Comparison: 'LessThanOrEqualTo', Condition: 'Or' }, { Name: 'LastAllowanceCalcDate', Value: null, Comparison: 'Equals' } ] } }); var tempDate = DateTimeOffset.parse('2007.01.01'); console.warn('Script Calculation Started'); results.Each(function() { if ((this.RegistryNumber != null) && (this.StartDate != null)) { var tickerDate; if (this.LastAllowanceCalcDate == null) { this.LastAllowanceCalcDate = this.StartDate; console.warn("LastAllowanceCalcDate not found, using StartDate"); } console.warn('Calculation started for ' + this.RegistryNumber + " - " + this.LastAllowanceCalcDate ); console.warn('Last Calculation Date is ' + this.LastAllowanceCalcDate.getFullYear() + '.' + this.LastAllowanceCalcDate.getMonth() + '.' + this.LastAllowanceCalcDate.getDate()); tickerDate = this.LastAllowanceCalcDate; while (tickerDate < today) { console.warn('Ticker Date is ' + tickerDate.getFullYear() + '.' + tickerDate.getMonth() + '.' + tickerDate.getDate()); var allowance = 0; if (this.StartDate.getMonth() == tickerDate.getMonth()) { var diff = tickerDate.getFullYear() - this.StartDate.getFullYear(); if (this.RegistryNumber == '151917') { allowance = 29; } else { if (this.StartDate < tempDate) { if (diff >= 0 && diff <= 5) { allowance = 17; } else if (diff > 5 && diff <= 10) { allowance = 22; } else if (diff > 10) { allowance = 27; } } else { if (diff >= 0 && diff <= 5) { allowance = 17; } else if (diff > 5 && diff <= 14) { allowance = 22; } else if (diff > 14) { allowance = 26; } } } if (allowance >= 0) { var strDate = tickerDate.getFullYear() + '.' + tickerDate.getMonth() + '.' + this.StartDate.getDate(); var allowedDate = DateTimeOffset.parse(tickerDate.getFullYear() + '.' + tickerDate.getMonth() + '.' + this.StartDate.getDate()); var allowanceForCurrentYear = allowance - Math.round((allowance * (allowedDate.getMonth() / 12))); InsertNewAllowance(this.Id, allowance, strDate, allowanceForCurrentYear); } } $Calendar2.GetStandardCalendar().AddMonths(tickerDate, 1, function(newDate) { tickerDate = newDate; }); } this.LastAllowanceCalcDate = today; console.warn('Calculation ended for ' + this.RegistryNumber); }else{ console.warn("RegistryNumber Number or Employee Start Date not found"); } }); console.log('Script Calculation Ended'); results.Save(); function InsertNewAllowance(employeeId, daysGained, strAllowedDate, daysGainedForCurrentYear) { var allowedDate = DateTimeOffset.parse(strAllowedDate); var leaveResults = $Database.Get({ Parameters: { TargetSchema: 'HR', TargetTable: 'LeaveAllowance' }, Columns: [{ Name: 'Id' } ], Where: { Criteria: [{ Name: 'AllowedDate', Value: allowedDate, Comparison: 'Equals' }, { Name: 'Employee', Value: employeeId, Comparison: 'Equals' } ] } }); if(leaveResults.RowCount() <= 0) { console.warn('New allowance detected for date : ' + strAllowedDate); var table = $Database.Empty({ Parameters: { TargetSchema: 'HR', TargetTable: 'LeaveAllowance' } }); table.Add({ Id: Script.NewId(), Employee: employeeId, AllowedDate: allowedDate, DaysGained: daysGained, WorkItemId: $WorkItem.Id, FormNo: $Instance.Number, DaysGainedForCurrentYear : daysGainedForCurrentYear }); table.Save(); } }</Calculation> <Manager2Approval/> <SecondManagerApprovalExcluded/> <DayCountForWeek>5</DayCountForWeek> </Definitions> </LRDictionary> |
...