@isoftdata/utility-dashboard-backend 2.0.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -17,16 +17,16 @@ This function returns data in the format expected for the `loadReportMetadata` f
17
17
  #### Function signature
18
18
 
19
19
  ```js
20
- async formatReportMetadata(mysqlConnection, { report, chartsInReport })
20
+ async formatReportMetadata(mysqlConnection, { report, chartsInReport, session })
21
21
  ```
22
22
 
23
23
  #### Example Usage (From Pro Web `server/chart-loader.js`)
24
24
 
25
25
  ```js
26
- async function loadReportMetadata({ dashboardReportId, chartId }) {
26
+ async function loadReportMetadata({ dashboardReportId, chartId, session }) {
27
27
  const report = await db.dashboardReport.loadById({ dashboardReportId }) // gets a report by its id
28
28
  const chartsInReport = await db.dashboardChart.loadByReport({ dashboardReportId, chartId }) // gets all charts for a specified report, or if `chartId` is specified, only gets that chart for that report.
29
- return await formatReportMetadata(db.pool, { report, chartsInReport })
29
+ return await formatReportMetadata(db.pool, { report, chartsInReport, session })
30
30
  }
31
31
  ```
32
32
 
@@ -93,6 +93,16 @@ Example:
93
93
  ]
94
94
  ```
95
95
 
96
+ #### session
97
+ Session object from the Auth Module
98
+
99
+ #### site (optional)
100
+ The 'type' of site for the product this is used in. Determines the MySQL table to query for site selection parameters, and used to calculate `siteIdColumn` if that is not specified.
101
+ #### siteIdColumn (optional)
102
+ The name of the column that stores the site id in the site table. Defaults to `${site}id`.
103
+ #### siteNameColumn (optional)
104
+ The store name column.
105
+
96
106
  ### formatChartDataForReport
97
107
 
98
108
  This function returns data in the format expected for the `loadChartDataForReport` function on the dashboard client component, including applying any report-specific chart options overrides and running the chart's query.
@@ -100,18 +110,18 @@ This function returns data in the format expected for the `loadChartDataForRepor
100
110
  #### Function signature
101
111
 
102
112
  ```js
103
- async formatChartDataForReport(mysqlConnection, { reportParameters, chart, reportChart, parameterSelectionList })
113
+ async formatChartDataForReport(mysqlConnection, { reportParameters, chart, reportChart, parameterSelectionList, session })
104
114
  ```
105
115
 
106
116
  #### Example usage: (from Pro Web `server/chart-loader.js`)
107
117
 
108
118
  ```js
109
- async function loadChartDataForReport ({ dashboardReportId, chartId, parameterSelectionList }) {
119
+ async function loadChartDataForReport ({ dashboardReportId, chartId, parameterSelectionList, session }) {
110
120
  const report = await db.dashboardReport.loadById({ dashboardReportId }) // get the report object
111
121
  const chart = await db.dashboardChart.loadById({ chartId }) // get the chart object
112
122
  const reportChart = await db.dashboardReportChart.loadByReportAndChartId({ chartId, dashboardReportId }) // get the report chart for the rank/overrides
113
123
  try {
114
- const chartData = await formatChartDataForReport(db.pool, { reportParameters: report.parameters, chart, reportChart, parameterSelectionList })
124
+ const chartData = await formatChartDataForReport(db.pool, { reportParameters: report.parameters, chart, reportChart, parameterSelectionList, session })
115
125
  return chartData
116
126
  } catch (err) {
117
127
  console.error(err)
@@ -132,6 +142,9 @@ The id of a chart row in `wa_dashboard_chart`.
132
142
  #### parameterSelectionList
133
143
  The array of selected parameters sent from the client dashboard.
134
144
 
145
+ #### session
146
+ Session object from the Auth Module
147
+
135
148
  ### loadOutputParameterValues
136
149
 
137
150
  This function outputs the report's parameter values in the format expected by the dashboard client and backend. When sending to the client, including `forClient: true` will not include the properties only needed by the backend.
@@ -0,0 +1,32 @@
1
+ import { Connection, OkPacket, ResultSetHeader, RowDataPacket } from "mysql";
2
+ import { Formatting, GoogleDataTable, MultiSeriesOptions, ProcessedFormatting, Table } from "./types/chart";
3
+ export type QueryFieldsObject = Record<string, string>;
4
+ declare function queryWithFields(connection: Connection, query: {
5
+ sql: string;
6
+ values: unknown[];
7
+ }): Promise<{
8
+ results: RowDataPacket[] | RowDataPacket[][] | OkPacket | OkPacket[] | ResultSetHeader;
9
+ fields: QueryFieldsObject;
10
+ }>;
11
+ interface getMultiSeriesDataInput {
12
+ data: RowDataPacket[];
13
+ seriesOptions: MultiSeriesOptions;
14
+ formatting?: Formatting;
15
+ fields: QueryFieldsObject;
16
+ }
17
+ declare function getMultiSeriesData({ data: queryResult, seriesOptions, formatting, fields }: getMultiSeriesDataInput): {
18
+ data: RowDataPacket[];
19
+ formatting: Formatting;
20
+ fields: Record<string, string>;
21
+ };
22
+ declare function makeNegativeNumbericValuesZero(resultSet: RowDataPacket[]): RowDataPacket[];
23
+ declare function coerceNullColumn(columnProp: string, data: RowDataPacket[], destinationType?: unknown): RowDataPacket[];
24
+ declare function handleFormattingTemplates(formatting?: Formatting): ProcessedFormatting;
25
+ declare function getDataTableFormat(data: RowDataPacket[], fields: {
26
+ [key: string]: string;
27
+ }, multiSeries?: MultiSeriesOptions): GoogleDataTable;
28
+ declare function makeDataCumulative(dataTable: GoogleDataTable, cumulative?: boolean): GoogleDataTable;
29
+ declare function getRactiveTableDataFormat(rows: RowDataPacket[], fields: {
30
+ [key: string]: string;
31
+ }, formatting: ProcessedFormatting, styleTemplates?: {}): Table;
32
+ export { queryWithFields, getMultiSeriesData, makeNegativeNumbericValuesZero, makeNegativeNumbericValuesZero as makeNegativeNumericValuesZero, coerceNullColumn, handleFormattingTemplates, getDataTableFormat, makeDataCumulative, getRactiveTableDataFormat, };
@@ -0,0 +1,240 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getRactiveTableDataFormat = exports.makeDataCumulative = exports.getDataTableFormat = exports.handleFormattingTemplates = exports.coerceNullColumn = exports.makeNegativeNumericValuesZero = exports.makeNegativeNumbericValuesZero = exports.getMultiSeriesData = exports.queryWithFields = void 0;
7
+ const formatting_templates_1 = __importDefault(require("./formatting-templates"));
8
+ const toSnakeCase = require('to-snake-case');
9
+ const mysqlDataTypes = require('mysql/lib/protocol/constants/types');
10
+ const style_templates_1 = __importDefault(require("./style-templates"));
11
+ function mysqlToGoogleChartsDataTypeMap(mysqlDataType) {
12
+ switch (mysqlDataType) {
13
+ case 'VAR_STRING':
14
+ case 'STRING':
15
+ case 'ENUM':
16
+ case 'VARCHAR':
17
+ return 'string';
18
+ case 'DECIMAL':
19
+ case 'NEWDECIMAL':
20
+ case 'BIT':
21
+ case 'TINY':
22
+ case 'SHORT':
23
+ case 'LONG':
24
+ case 'FLOAT':
25
+ case 'DOUBLE':
26
+ case 'LONGLONG':
27
+ case 'INT24':
28
+ case 'YEAR':
29
+ return 'number';
30
+ case 'TIMESTAMP':
31
+ case 'DATETIME':
32
+ case 'TIMESTAMP2':
33
+ case 'DATETIME2':
34
+ return 'datetime';
35
+ case 'DATE':
36
+ case 'NEWDATE':
37
+ return 'date';
38
+ case 'TIME':
39
+ case 'TIME2':
40
+ return 'timeofday';
41
+ default:
42
+ return 'string';
43
+ }
44
+ }
45
+ function makeDataTableCol(key, fields, role = null) {
46
+ return {
47
+ id: toSnakeCase(key).toLowerCase(),
48
+ label: key,
49
+ type: mysqlToGoogleChartsDataTypeMap(fields[key]),
50
+ role,
51
+ };
52
+ }
53
+ function queryWithFields(connection, query) {
54
+ return new Promise((resolve, reject) => {
55
+ connection.query(query, (err, results, fields) => {
56
+ if (err) {
57
+ console.error('Error running query for dashboard chart', err);
58
+ reject(err);
59
+ }
60
+ else {
61
+ resolve({
62
+ results,
63
+ fields: fields?.reduce((sum, field) => {
64
+ return {
65
+ ...sum,
66
+ [field.name]: mysqlDataTypes[field.type] || field.type,
67
+ };
68
+ }, {}) ?? {},
69
+ });
70
+ }
71
+ });
72
+ });
73
+ }
74
+ exports.queryWithFields = queryWithFields;
75
+ function getMultiSeriesData({ data: queryResult, seriesOptions, formatting, fields }) {
76
+ const { groupXAxisBy, series, value, tooltip } = seriesOptions;
77
+ const allOfTheKeysInTheSeries = new Set(queryResult.map(row => row[series]));
78
+ const objectOfAllKeysWithNullValues = {};
79
+ for (const key of allOfTheKeysInTheSeries) {
80
+ objectOfAllKeysWithNullValues[key] = null;
81
+ if (tooltip) {
82
+ objectOfAllKeysWithNullValues[`${tooltip} ${key}`] = null;
83
+ }
84
+ }
85
+ const grouped = {};
86
+ for (const row of queryResult) {
87
+ if (!grouped[row[groupXAxisBy]]) {
88
+ grouped[row[groupXAxisBy]] = { ...objectOfAllKeysWithNullValues };
89
+ }
90
+ grouped[row[groupXAxisBy]][row[series]] = row[value];
91
+ if (tooltip) {
92
+ grouped[row[groupXAxisBy]][`${tooltip} ${row[series]}`] = row[tooltip];
93
+ }
94
+ }
95
+ const seriesFields = { [groupXAxisBy]: fields[groupXAxisBy] };
96
+ const seriesFormatting = {};
97
+ for (const key of allOfTheKeysInTheSeries) {
98
+ seriesFields[key] = fields[value];
99
+ if (tooltip) {
100
+ seriesFields[`${tooltip} ${key}`] = fields[tooltip];
101
+ }
102
+ if (formatting && value in formatting) {
103
+ seriesFormatting[key] = formatting[value];
104
+ }
105
+ }
106
+ const multiSeriesData = [];
107
+ for (const key in grouped) {
108
+ multiSeriesData.push({
109
+ [groupXAxisBy]: key,
110
+ ...grouped[key],
111
+ });
112
+ }
113
+ return {
114
+ data: multiSeriesData,
115
+ formatting: {
116
+ ...formatting,
117
+ ...seriesFormatting,
118
+ },
119
+ fields: seriesFields,
120
+ };
121
+ }
122
+ exports.getMultiSeriesData = getMultiSeriesData;
123
+ function makeNegativeNumbericValuesZero(resultSet) {
124
+ const numberCols = Object.keys(resultSet[0]).filter(key => typeof resultSet[0][key] === 'number');
125
+ return resultSet.map(row => {
126
+ numberCols.forEach(col => {
127
+ if (row[col] < 0) {
128
+ row[col] = 0;
129
+ }
130
+ });
131
+ return row;
132
+ });
133
+ }
134
+ exports.makeNegativeNumbericValuesZero = makeNegativeNumbericValuesZero;
135
+ exports.makeNegativeNumericValuesZero = makeNegativeNumbericValuesZero;
136
+ function coerceNullColumn(columnProp, data, destinationType) {
137
+ const hasNullValue = data.find(row => row[columnProp] === null);
138
+ if (hasNullValue) {
139
+ const rowWithValidValue = data.find(row => row[columnProp] !== null);
140
+ let nullReplacement = '';
141
+ if ((destinationType && destinationType === 'number') || (rowWithValidValue && typeof rowWithValidValue[columnProp] === 'number')) {
142
+ nullReplacement = 0;
143
+ }
144
+ return data.map(row => {
145
+ return {
146
+ ...row,
147
+ [columnProp]: row[columnProp] ?? nullReplacement,
148
+ };
149
+ });
150
+ }
151
+ else {
152
+ return data;
153
+ }
154
+ }
155
+ exports.coerceNullColumn = coerceNullColumn;
156
+ function handleFormattingTemplates(formatting) {
157
+ const formattingOutput = {};
158
+ if (formatting && typeof formatting === 'object') {
159
+ for (const key in formatting) {
160
+ formattingOutput[key] = { type: formatting[key].type, format: null };
161
+ if (typeof formatting[key].format === 'string') {
162
+ if (formatting[key].format in formatting_templates_1.default) {
163
+ formattingOutput[key].format = formatting_templates_1.default[formatting[key].format];
164
+ }
165
+ }
166
+ }
167
+ }
168
+ return formattingOutput;
169
+ }
170
+ exports.handleFormattingTemplates = handleFormattingTemplates;
171
+ function getDataTableFormat(data, fields, multiSeries) {
172
+ let cols = [];
173
+ if (multiSeries) {
174
+ cols = [makeDataTableCol(multiSeries.groupXAxisBy, fields)];
175
+ }
176
+ for (const key in fields) {
177
+ if (!multiSeries || key !== multiSeries.groupXAxisBy) {
178
+ if (multiSeries?.tooltip && key.includes(multiSeries.tooltip)) {
179
+ cols.push(makeDataTableCol(key, fields, 'tooltip'));
180
+ }
181
+ else {
182
+ cols.push(makeDataTableCol(key, fields));
183
+ }
184
+ }
185
+ }
186
+ const rows = data.map(row => {
187
+ const items = [];
188
+ for (const column in row) {
189
+ items.push({ v: row[column] });
190
+ }
191
+ return {
192
+ c: items,
193
+ };
194
+ });
195
+ return { cols, rows };
196
+ }
197
+ exports.getDataTableFormat = getDataTableFormat;
198
+ function makeDataCumulative(dataTable, cumulative = true) {
199
+ dataTable.rows.forEach((row, rowIndex) => {
200
+ if (rowIndex > 0) {
201
+ row.c.forEach((col, colIndex) => {
202
+ if (colIndex > 0 && col.v == null) {
203
+ col.v = Number(dataTable.rows[rowIndex - 1].c[colIndex].v);
204
+ }
205
+ else if (cumulative && colIndex > 0) {
206
+ col.v = Number(col.v) + Number(dataTable.rows[rowIndex - 1].c[colIndex].v);
207
+ }
208
+ });
209
+ }
210
+ });
211
+ return dataTable;
212
+ }
213
+ exports.makeDataCumulative = makeDataCumulative;
214
+ function getRactiveTableDataFormat(rows, fields, formatting, styleTemplates = {}) {
215
+ const columns = Object.keys(fields).map(field => {
216
+ if (formatting?.[field]?.type === 'NumberFormat' && formatting?.[field]?.format?.prefix === '$') {
217
+ return {
218
+ property: `${field}[value]`,
219
+ name: field,
220
+ class: 'text-right border-top-0',
221
+ };
222
+ }
223
+ return {
224
+ property: `${field}[value]`,
225
+ name: field,
226
+ class: 'border-top-0',
227
+ };
228
+ });
229
+ if (styleTemplates) {
230
+ rows = rows.map(row => {
231
+ return (0, style_templates_1.default)(row, styleTemplates);
232
+ });
233
+ }
234
+ return {
235
+ columns,
236
+ rows,
237
+ };
238
+ }
239
+ exports.getRactiveTableDataFormat = getRactiveTableDataFormat;
240
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQtaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NoYXJ0LWhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFJQSxrRkFBdUQ7QUFDdkQsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFBO0FBQzVDLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFBO0FBRXBFLHdFQUE2QztBQUc3QyxTQUFTLDhCQUE4QixDQUFDLGFBQXFCO0lBQzVELFFBQVEsYUFBYSxFQUFFO1FBQ3RCLEtBQUssWUFBWSxDQUFDO1FBQ2xCLEtBQUssUUFBUSxDQUFDO1FBQ2QsS0FBSyxNQUFNLENBQUM7UUFDWixLQUFLLFNBQVM7WUFDYixPQUFPLFFBQVEsQ0FBQTtRQUNoQixLQUFLLFNBQVMsQ0FBQztRQUNmLEtBQUssWUFBWSxDQUFDO1FBQ2xCLEtBQUssS0FBSyxDQUFDO1FBQ1gsS0FBSyxNQUFNLENBQUM7UUFDWixLQUFLLE9BQU8sQ0FBQztRQUNiLEtBQUssTUFBTSxDQUFDO1FBQ1osS0FBSyxPQUFPLENBQUM7UUFDYixLQUFLLFFBQVEsQ0FBQztRQUNkLEtBQUssVUFBVSxDQUFDO1FBQ2hCLEtBQUssT0FBTyxDQUFDO1FBQ2IsS0FBSyxNQUFNO1lBQ1YsT0FBTyxRQUFRLENBQUE7UUFDaEIsS0FBSyxXQUFXLENBQUM7UUFDakIsS0FBSyxVQUFVLENBQUM7UUFDaEIsS0FBSyxZQUFZLENBQUM7UUFDbEIsS0FBSyxXQUFXO1lBQ2YsT0FBTyxVQUFVLENBQUE7UUFDbEIsS0FBSyxNQUFNLENBQUM7UUFDWixLQUFLLFNBQVM7WUFDYixPQUFPLE1BQU0sQ0FBQTtRQUNkLEtBQUssTUFBTSxDQUFDO1FBQ1osS0FBSyxPQUFPO1lBQ1gsT0FBTyxXQUFXLENBQUE7UUFDbkI7WUFDQyxPQUFPLFFBQVEsQ0FBQTtLQUNoQjtBQUNGLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLEdB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
@@ -0,0 +1,3 @@
1
+ import { FormattingTemplates } from "./types/chart";
2
+ declare const formattingTemplates: FormattingTemplates;
3
+ export default formattingTemplates;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const formattingTemplates = {
4
+ "CURRENCY": {
5
+ "prefix": "$",
6
+ "fractionDigits": 2,
7
+ "groupingSymbol": ",",
8
+ },
9
+ "MEDIUMDATE": {
10
+ "format": "medium",
11
+ },
12
+ "LONGDATE": {
13
+ "format": "long",
14
+ },
15
+ };
16
+ exports.default = formattingTemplates;
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0dGluZy10ZW1wbGF0ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZm9ybWF0dGluZy10ZW1wbGF0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQSxNQUFNLG1CQUFtQixHQUF3QjtJQUNoRCxVQUFVLEVBQUU7UUFDWCxRQUFRLEVBQUUsR0FBRztRQUNiLGdCQUFnQixFQUFFLENBQUM7UUFDbkIsZ0JBQWdCLEVBQUUsR0FBRztLQUNyQjtJQUNELFlBQVksRUFBRTtRQUNiLFFBQVEsRUFBRSxRQUFRO0tBQ2xCO0lBQ0QsVUFBVSxFQUFFO1FBQ1gsUUFBUSxFQUFFLE1BQU07S0FDaEI7Q0FDRCxDQUFBO0FBQ0Qsa0JBQWUsbUJBQW1CLENBQUEifQ==
@@ -0,0 +1,73 @@
1
+ import { handleFormattingTemplates } from './chart-helper.js';
2
+ import * as formatterTemplates from './formatting-templates';
3
+ import { DashboardReportParameter } from './types/parameter';
4
+ import { Session, SiteType } from './types/session';
5
+ import { MultiSeriesOptions, Formatting, Chart, Table, GoogleDataTable, ProcessedFormatting } from './types/chart';
6
+ import { Connection } from 'mysql';
7
+ import { Report, ReportInput } from './types/report';
8
+ type LoadDataTableAndProcessedFormattingOptions = {
9
+ query: {
10
+ sql: string;
11
+ values: unknown[];
12
+ };
13
+ multiSeries?: MultiSeriesOptions;
14
+ formatting?: Formatting;
15
+ chartType: string;
16
+ cumulative?: boolean;
17
+ table?: Table;
18
+ };
19
+ declare function loadDataTableAndProcessedFormatting(mysqlConnection: Connection, { query: queryObject, multiSeries, formatting, chartType, cumulative, table }: LoadDataTableAndProcessedFormattingOptions): Promise<{
20
+ dataTable: GoogleDataTable | Table;
21
+ processedFormatting: ProcessedFormatting;
22
+ }>;
23
+ type loadDataTableOptions = {
24
+ query: {
25
+ sql: string;
26
+ values: unknown[];
27
+ };
28
+ multiSeries: MultiSeriesOptions;
29
+ formatting: Formatting;
30
+ chartType: string;
31
+ };
32
+ declare function loadDataTable(mysqlConnection: Connection, { query: queryObject, multiSeries, formatting, chartType }: loadDataTableOptions): Promise<GoogleDataTable>;
33
+ type loadOutputParameterValuesOptions = {
34
+ definitionList: DashboardReportParameter[];
35
+ selectionList?: Array<Partial<DashboardReportParameter> & Pick<DashboardReportParameter, 'name'>>;
36
+ forClient?: boolean;
37
+ session: Session;
38
+ site?: SiteType;
39
+ siteIdColumn?: string;
40
+ siteNameColumn?: string;
41
+ };
42
+ declare function loadOutputParameterValues(mysqlConnection: Connection, { definitionList, selectionList, forClient, session, site, siteIdColumn, siteNameColumn }: loadOutputParameterValuesOptions): Promise<DashboardReportParameter[]>;
43
+ declare const parameterizeQuery: (queryString: string, parameterValues: DashboardReportParameter[]) => {
44
+ sql: string;
45
+ values: unknown[];
46
+ };
47
+ type FormatReportMetadataOptions = {
48
+ report: ReportInput;
49
+ chartsInReport: Chart[];
50
+ session: Session;
51
+ site: SiteType;
52
+ siteIdColumn?: string;
53
+ siteNameColumn?: string;
54
+ };
55
+ declare function formatReportMetadata(mysqlConnection: Connection, { report, chartsInReport, session, site, siteIdColumn, siteNameColumn }: FormatReportMetadataOptions): Promise<Report>;
56
+ type FormatChartDataForReportOptions = {
57
+ reportParameters: DashboardReportParameter[];
58
+ chart: Chart;
59
+ reportChart: {
60
+ chartId: number;
61
+ dashboardReportId: number;
62
+ jsonOverride: Partial<Chart>;
63
+ rank: number;
64
+ reportChartId: number;
65
+ };
66
+ parameterSelectionList: DashboardReportParameter[];
67
+ session: Session;
68
+ site: SiteType;
69
+ siteIdColumn?: string;
70
+ siteNameColumn?: string;
71
+ };
72
+ declare function formatChartDataForReport(mysqlConnection: Connection, { reportParameters, chart, reportChart, parameterSelectionList, session, site, siteIdColumn, siteNameColumn }: FormatChartDataForReportOptions): Promise<Omit<Chart, 'query'>>;
73
+ export { formatReportMetadata, formatChartDataForReport, loadOutputParameterValues, loadDataTable, loadDataTableAndProcessedFormatting, parameterizeQuery, handleFormattingTemplates, formatterTemplates, };