@resolveio/server-lib 20.7.8 → 20.7.9
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/collections/cron-job.collection.js.map +1 -1
- package/collections/email-history.collection.js.map +1 -1
- package/collections/email-verified.collection.js.map +1 -1
- package/collections/file.collection.js.map +1 -1
- package/collections/flag-update.collection.js.map +1 -1
- package/collections/flag.collection.js.map +1 -1
- package/collections/log-method-latency.collection.js.map +1 -1
- package/collections/log-subscription.collection.js.map +1 -1
- package/collections/log.collection.js.map +1 -1
- package/collections/logged-in-users.collection.js.map +1 -1
- package/collections/method-response.collection.js.map +1 -1
- package/collections/monitor-cpu.collection.js.map +1 -1
- package/collections/monitor-function.collection.js.map +1 -1
- package/collections/monitor-memory.collection.js.map +1 -1
- package/collections/monitor-mongo.collection.js.map +1 -1
- package/collections/notification.collection.js.map +1 -1
- package/collections/report-builder-dashboard-builder.collection.js.map +1 -1
- package/collections/report-builder-library.collection.js.map +1 -1
- package/collections/report-builder-report.collection.js.map +1 -1
- package/collections/user-group.collection.js.map +1 -1
- package/collections/user.collection.js.map +1 -1
- package/cron/cron.d.ts +1 -1
- package/cron/cron.js +1 -1
- package/cron/cron.js.map +1 -1
- package/http/auth.js.map +1 -1
- package/http/health.d.ts +1 -1
- package/http/health.js +1 -1
- package/http/health.js.map +1 -1
- package/managers/method.manager.js +1 -1
- package/managers/method.manager.js.map +1 -1
- package/managers/mongo.manager.d.ts +1 -1
- package/managers/mongo.manager.js +1 -1
- package/managers/mongo.manager.js.map +1 -1
- package/managers/monitor.manager.js.map +1 -1
- package/managers/subscription.manager.js.map +1 -1
- package/methods/aws.js.map +1 -1
- package/methods/cron-jobs.js +1 -1
- package/methods/cron-jobs.js.map +1 -1
- package/methods/monitor.js.map +1 -1
- package/methods/support.js.map +1 -1
- package/package.json +1 -1
- package/publications/cron-jobs.js.map +1 -1
- package/publications/files.js.map +1 -1
- package/publications/report-builder-reports.js.map +1 -1
- package/server-app.js +1 -1
- package/server-app.js.map +1 -1
- package/util/schema-report-builder.js.map +1 -1
package/methods/cron-jobs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/methods/cron-jobs.ts"],"names":["Excel","require","moment","simpl_schema_1","XLSX","cron_job_collection_1","file_collection_1","report_builder_report_collection_1","common_1","loadCronJobMethods","methodManager","methods","cronEmailMergedDocsCleanUp","function","Files","find","$and","type","createdAt","$lte","subtract","toDate","files","_a","sent","length","this","callMethod","deleteMany","_id","$in","map","a","stuckCronJob","fiveMin","CronJobs","running","updatedAt","cronJobs","updateMany","$set","reportbuilderCronJob","check","default","data","Object","blackbox","ReportBuilderReports","findById","report","_k","fields_selected","forEach","field","fieldData","fieldPath","replace","split","fieldPathObj","i","_b","groups_row","fieldsObj_1","count_1","collection_name","collection_root","mergeDeep","sortIndex","fields_sort","findIndex","sortObj_1","sortField","startsWith","order","rootOptions","limit","skip","fields","sort","filters_1","fields_filter","filterAnd","ors","filter","includes","endDate","and","and_1","or_1","condition","value","Array","isArray","fieldType","is_rolling","startDate","rolling_interval","startOf","quarter","endOf","Date","setHours","setMinutes","setSeconds","setMilliseconds","push","$gte","_c","_d","highValue","_e","$exists","_f","$ne","_g","_h","$eq","filt","$or","_j","collectionTree","layers","treeLeaves","allLeaves_1","getTreeLeaves","children","filterArrayFields_1","filterArrays_1","and_2","or_2","filterLeaf","fields_custom","fields_total","fields_link","id_date_field","date_interval","group_type","res","results_1","results","reportTotals","totals","show","leafValueType","leafFormatType","id","undefined","result","format","getTime","round","toLocaleString","style","currency","lines_1","group","columnName","header","wb","utils","book_new","tmp","join","treeItem","parseFloat","ws","json_to_sheet","book_append_sheet","wbout","write","bookType","__values","next","email","sendEmail","serverConfig","report_name","filename","content","encoding","modifyDataTypeField","Workbook","ws_1","addWorksheet","views","showGridLines","properties","date1904","calcProperties","fullCalcOnLoad","currentRow_1","row","getRow","getCell","font","name","bold","size","copy","deepCopy","widths_1","tabGroupExcelRecursive","tabGroupExcelWidthRecursive","columns","width","now","xlsx","writeBuffer","buffer","getFullYear","getMonth","getDate","console","log","err_1","datedUniqueDates_1","datedUniqueGroups_1","datedData_1","reportTotalGroups_1","reportTotalDates_1","dataPt","month","tmpData_1","JSON","stringify","keys","key","splice","day","week","year","tmpGroup","tmpDate","date","tz","hour","minute","second","process","env","TZ_CLIENT","dateString","dateLast","toString","concat","b","tmpData","tmpTotalDated","tmpTotalCnt","tmpTotalType","match","totalKey","tmpTotalGroup","filteredData","total","reduce","currentCol_1","currentRow","row_1","toTitleCase","j","groupRow","k","err_2","message","err_4","items","resArray","allowLookups","item","isLeaf","lookup_collection","index","processFieldValue","array","groupKey","subResult","level","fill","fgColor","argb","fill_color","pattern","color","font_color","mergeCells","$col$row","border","top","left","right","fieldIndex","numFmt","bottom","tDataRes","tIndex","resIndex","RegExp","cols","Math","max","exports"],"mappings":"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","file":"cron-jobs.js","sourcesContent":["import * as Excel from 'exceljs';\nimport * as moment from 'moment-timezone';\nimport SimpleSchema from 'simpl-schema';\nimport * as XLSX from 'xlsx';\nimport { CronJobs } from '../collections/cron-job.collection';\nimport { Files } from '../collections/file.collection';\nimport { ReportBuilderReports } from '../collections/report-builder-report.collection';\nimport { MethodManager } from '../managers/method.manager';\nimport { PaginationOptions } from '../models/pagination.model';\nimport { deepCopy, mergeDeep, round, toTitleCase } from '../util/common';\n\nexport function loadCronJobMethods(methodManager: MethodManager) {\n\tmethodManager.methods({\n\t\tcronEmailMergedDocsCleanUp: {\n\t\t\tfunction: async function() {\n\t\t\t\tlet files = await Files.find({$and: [{type: 'Email Merged Docs'}, {createdAt: {$lte: moment().subtract(1, 'day').toDate()}}]});\n\t\t\t\t\n\t\t\t\tif (files.length) {\n\t\t\t\t\tawait this.callMethod('deleteFiles');\n\t\t\t\t\tawait Files.deleteMany({_id: {$in: files.map(a => a._id)}});\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\t\tstuckCronJob: {\n\t\t\tfunction: async function() {\n\t\t\t\tlet fiveMin = moment().subtract(5, 'minutes').toDate();\n\t\t\t\tlet cronJobs = await CronJobs.find({running: true, updatedAt: {$lte: fiveMin}});\n\n\t\t\t\tif (cronJobs.length) {\n\t\t\t\t\tawait CronJobs.updateMany({_id: {$in: cronJobs.map(a => a._id)}}, {$set: {running: false}});\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\t\treportbuilderCronJob: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tdata: {\n\t\t\t\t\ttype: Object,\n\t\t\t\t\tblackbox: true\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: async function(data: Object) {\n\t\t\t\tlet report = await ReportBuilderReports.findById(data['id_report']);\n\n\t\t\t\treport.fields_selected.forEach((field: any) => {\n\t\t\t\t\tlet dotPath = field.fieldPath.replace(/\\.\\$/g, '');\n\t\t\t\t\tlet fieldData = dotPath.split('.');\n\t\t\t\t\tfield.fieldPathObj = null;\n\t\t\t\t\tfor (let i = fieldData.length - 1; i >= 0; i--) {\n\t\t\t\t\t\tif (!field.fieldPathObj) {\n\t\t\t\t\t\t\tfield.fieldPathObj = {[fieldData[i]]: 1};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tfield.fieldPathObj = {[fieldData[i]]: field.fieldPathObj};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif ((report.fields_selected && report.fields_selected.length) || (report.groups_row && report.groups_row.length)) {\n\t\t\t\t\tlet fieldsObj = {};\n\n\t\t\t\t\tlet count = 0;\n\n\t\t\t\t\treport.fields_selected.forEach((field: any) => {\n\t\t\t\t\t\tif (field.collection_name === report.collection_root) {\n\t\t\t\t\t\t\tfieldsObj = mergeDeep(fieldsObj, field.fieldPathObj);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tlet sortIndex = report.fields_sort.findIndex(a => a.field === field['id']);\n\n\t\t\t\t\t\tif (sortIndex >= 0) {\n\t\t\t\t\t\t\treport.fields_sort[sortIndex].field = ('f_' + count);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfield['id'] = 'f_' + count;\n\n\t\t\t\t\t\tcount += 1;\n\t\t\t\t\t});\n\n\t\t\t\t\tlet sortObj = {};\n\t\t\t\t\tif (report.fields_sort.length) {\n\t\t\t\t\t\treport.fields_sort.forEach(sortField => {\n\t\t\t\t\t\t\tif (sortField.field.startsWith('gr_')) {\n\t\t\t\t\t\t\t\tsortObj['_id.' + sortField.field] = (sortField.order === 'asc' ? 1 : -1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tsortObj[sortField.field] = (sortField.order === 'asc' ? 1 : -1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tsortObj = null;\n\t\t\t\t\t}\n\n\t\t\t\t\tlet rootOptions: PaginationOptions = {\n\t\t\t\t\t\tlimit: 0,\n\t\t\t\t\t\tskip: 0,\n\t\t\t\t\t\tfields: fieldsObj,\n\t\t\t\t\t\tsort: sortObj\n\t\t\t\t\t};\n\n\t\t\t\t\tlet filters = [];\n\t\t\t\t\treport.fields_filter.forEach(filterAnd => {\n\t\t\t\t\t\tlet ors = [];\n\t\t\t\t\t\tfilterAnd.ors.filter(a => !a.field.includes('.$.')).forEach(filter => {\n\t\t\t\t\t\t\tif (filter.condition && filter.field && ((filter.value !== null && (!Array.isArray(filter.value) || filter.value.length)) || filter.condition === 'null' || filter.condition === 'nnull')) {\n\t\t\t\t\t\t\t\tif (filter.condition === 'bw') {\n\t\t\t\t\t\t\t\t\tif (filter.fieldType === 'Date' && filter.is_rolling) {\n\t\t\t\t\t\t\t\t\t\tlet startDate = null;\n\t\t\t\t\t\t\t\t\t\tlet endDate = null;\n\n\t\t\t\t\t\t\t\t\t\tif (filter.rolling_interval === 'Q1') {\n\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('year').toDate();\n\t\t\t\t\t\t\t\t\t\t\tendDate = moment().startOf('year').quarter(2).subtract(1, 'days').toDate();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Q2') {\n\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('year').quarter(2).toDate();\n\t\t\t\t\t\t\t\t\t\t\tendDate = moment().startOf('year').quarter(3).subtract(1, 'days').toDate();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Q3') {\n\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('year').quarter(3).toDate();\n\t\t\t\t\t\t\t\t\t\t\tendDate = moment().startOf('year').quarter(4).subtract(1, 'days').toDate();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Q4') {\n\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('year').quarter(4).toDate();\n\t\t\t\t\t\t\t\t\t\t\tendDate = moment().endOf('year').toDate();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Today') {\n\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\tendDate = moment().endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Yesterday') {\n\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().subtract(1, 'days').startOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\tendDate = moment().subtract(1, 'days').endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Week') {\n\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('isoWeek').toDate();\n\t\t\t\t\t\t\t\t\t\t\tendDate = moment().endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Last Week') {\n\t\t\t\t\t\t\t\t\t\t\tendDate = moment().startOf('isoWeek').subtract(1, 'days').toDate();\n\t\t\t\t\t\t\t\t\t\t\tstartDate = moment(endDate).startOf('isoWeek').toDate();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Month') {\n\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('month').toDate();\n\t\t\t\t\t\t\t\t\t\t\tendDate = moment().endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Last Month') {\n\t\t\t\t\t\t\t\t\t\t\tendDate = moment().startOf('month').subtract(1, 'days').endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\tstartDate = moment(endDate).startOf('month').toDate();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Last 30 Days') {\n\t\t\t\t\t\t\t\t\t\t\tendDate = moment().endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().subtract(30, 'days').startOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Quarter') {\n\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('year').quarter(moment().quarter()).toDate();\n\t\t\t\t\t\t\t\t\t\t\tendDate = moment().endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Last Quarter') {\n\t\t\t\t\t\t\t\t\t\t\tendDate = moment().startOf('year').quarter(moment().quarter()).subtract(1, 'days').endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\tstartDate = moment(endDate).startOf('quarter').toDate();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Year') {\n\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('year').toDate();\n\t\t\t\t\t\t\t\t\t\t\tendDate = moment().endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Last Year') {\n\t\t\t\t\t\t\t\t\t\t\tendDate = moment().startOf('year').subtract(1, 'days').endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\tstartDate = moment(endDate).startOf('year').toDate();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'All') {\n\t\t\t\t\t\t\t\t\t\t\tstartDate = new Date(2017, 0, 1, 0, 0, 0, 0);\n\t\t\t\t\t\t\t\t\t\t\tendDate = moment().endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tendDate.setHours(23);\n\t\t\t\t\t\t\t\t\t\tendDate.setMinutes(59);\n\t\t\t\t\t\t\t\t\t\tendDate.setSeconds(59);\n\t\t\t\t\t\t\t\t\t\tendDate.setMilliseconds(999);\n\n\t\t\t\t\t\t\t\t\t\tors.push({$and: [{[filter.field]: {'$gte': startDate}}, {[filter.field]: {'$lte': endDate}}]});\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\tors.push({$and: [{[filter.field]: {'$gte': filter.value}}, {[filter.field]: {'$lte': filter.highValue}}]});\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse if (filter.condition === 'nnull') {\n\t\t\t\t\t\t\t\t\tlet and = [];\n\t\t\t\t\t\t\t\t\tand.push({[filter.field]: {'$exists': true}});\n\t\t\t\t\t\t\t\t\tand.push({[filter.field]: {'$ne': null}});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tif (filter.fieldType === 'String') {\n\t\t\t\t\t\t\t\t\t\tand.push({[filter.field]: {'$ne': ''}});\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tors.push({$and: and});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse if (filter.condition === 'null') {\n\t\t\t\t\t\t\t\t\tors.push({[filter.field]: {'$eq': null}});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tif (Array.isArray(filter.value)) {\n\t\t\t\t\t\t\t\t\t\tif (filter.condition === 'ne') {\n\t\t\t\t\t\t\t\t\t\t\tlet and = [];\n\t\t\t\t\t\t\t\t\t\t\tfilter.value.forEach(filt => {\n\t\t\t\t\t\t\t\t\t\t\t\tand.push({[filter.field]: {['$' + filter.condition]: (Array.isArray(filt) ? filt[0] : filt)}});\n\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\t\tif (and.length > 1) {\n\t\t\t\t\t\t\t\t\t\t\t\tors.push({$and: and});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\tors.push(and[0]);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\tlet or = [];\n\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tfilter.value.forEach(filt => {\n\t\t\t\t\t\t\t\t\t\t\t\tor.push({[filter.field]: {['$' + filter.condition]: (Array.isArray(filt) ? filt[0] : filt)}});\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tif (or.length > 1) {\n\t\t\t\t\t\t\t\t\t\t\t\tors.push({$or: or});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\tors.push(or[0]);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\tors.push({[filter.field]: {['$' + filter.condition]: filter.value}});\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (ors.length) {\n\t\t\t\t\t\t\tfilters.push({$or: ors});\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlet collectionTree = await this.callMethod('reportBuilderBuildTree', report.collection_root);\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (collectionTree) {\n\t\t\t\t\t\t\tcollectionTree.layers = [collectionTree];\n\t\t\t\n\t\t\t\t\t\t\tlet treeLeaves = [];\n\t\t\t\t\t\t\tlet allLeaves = [];\n\t\t\t\t\t\t\tgetTreeLeaves(collectionTree.children, treeLeaves);\n\t\t\t\t\t\t\tgetTreeLeaves(collectionTree.children, allLeaves, true);\n\n\t\t\t\t\t\t\tlet filterArrayFields = [];\n\t\t\t\t\t\t\tlet filterArrays = [];\n\t\t\t\t\t\t\treport.fields_filter.forEach(filterAnd => {\n\t\t\t\t\t\t\t\tlet ors = [];\n\t\t\t\t\t\t\t\tfilterAnd.ors.filter(a => a.field.includes('.$.')).forEach(filter => {\n\t\t\t\t\t\t\t\t\tlet filterLeaf = allLeaves.find(a => a.fieldPath === filter.field);\n\t\t\t\t\t\t\t\t\tif (filterLeaf) {\n\t\t\t\t\t\t\t\t\t\tfilterArrayFields.push(filterLeaf);\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif (filter.condition && filter.field && ((filter.value !== null && (!Array.isArray(filter.value) || filter.value.length)) || filter.condition === 'null' || filter.condition === 'nnull')) {\n\t\t\t\t\t\t\t\t\t\tif (filter.condition === 'bw') {\n\t\t\t\t\t\t\t\t\t\t\tif (filter.fieldType === 'Date' && filter.is_rolling) {\n\t\t\t\t\t\t\t\t\t\t\t\tlet startDate = null;\n\t\t\t\t\t\t\t\t\t\t\t\tlet endDate = null;\n\n\t\t\t\t\t\t\t\t\t\t\t\tif (filter.rolling_interval === 'Q1') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('year').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tendDate = moment().startOf('year').quarter(2).subtract(1, 'days').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Q2') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('year').quarter(2).toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tendDate = moment().startOf('year').quarter(3).subtract(1, 'days').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Q3') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('year').quarter(3).toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tendDate = moment().startOf('year').quarter(4).subtract(1, 'days').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Q4') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('year').quarter(4).toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tendDate = moment().endOf('year').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Today') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tendDate = moment().endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Yesterday') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().subtract(1, 'days').startOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tendDate = moment().subtract(1, 'days').endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Week') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('isoWeek').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tendDate = moment().endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Last Week') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tendDate = moment().startOf('isoWeek').subtract(1, 'days').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tstartDate = moment(endDate).startOf('isoWeek').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Month') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('month').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tendDate = moment().endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Last Month') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tendDate = moment().startOf('month').subtract(1, 'days').endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tstartDate = moment(endDate).startOf('month').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Last 30 Days') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tendDate = moment().endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().subtract(30, 'days').startOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Quarter') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('year').quarter(moment().quarter()).toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tendDate = moment().endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Last Quarter') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tendDate = moment().startOf('year').quarter(moment().quarter()).subtract(1, 'days').endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tstartDate = moment(endDate).startOf('quarter').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Year') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('year').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tendDate = moment().endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Last Year') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tendDate = moment().startOf('year').subtract(1, 'days').endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tstartDate = moment(endDate).startOf('year').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'All') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tstartDate = new Date(2017, 0, 1, 0, 0, 0, 0);\n\t\t\t\t\t\t\t\t\t\t\t\t\tendDate = moment().endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tendDate.setHours(23);\n\t\t\t\t\t\t\t\t\t\t\t\tendDate.setMinutes(59);\n\t\t\t\t\t\t\t\t\t\t\t\tendDate.setSeconds(59);\n\t\t\t\t\t\t\t\t\t\t\t\tendDate.setMilliseconds(999);\n\n\t\t\t\t\t\t\t\t\t\t\t\tors.push({$and: [{[filter.field.replace(/\\.\\$/g, '')]: {'$gte': startDate}}, {[filter.field.replace(/\\.\\$/g, '')]: {'$lte': endDate}}]});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\tfilterArrays.push({$and: [{[filter.field.replace(/\\.\\$/g, '')]: {'$gte': filter.value}}, {[filter.field.replace(/\\.\\$/g, '')]: {'$lte': filter.highValue}}]});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (filter.condition === 'nnull') {\n\t\t\t\t\t\t\t\t\t\t\tlet and = [];\n\t\t\t\t\t\t\t\t\t\t\tand.push({[filter.field.replace(/\\.\\$/g, '')]: {'$exists': true}});\n\t\t\t\t\t\t\t\t\t\t\tand.push({[filter.field.replace(/\\.\\$/g, '')]: {'$ne': null}});\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tif (filter.fieldType === 'String') {\n\t\t\t\t\t\t\t\t\t\t\t\tand.push({[filter.field.replace(/\\.\\$/g, '')]: {'$ne': ''}});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tors.push({$and: and});\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (filter.condition === 'null') {\n\t\t\t\t\t\t\t\t\t\t\tors.push({[filter.field.replace(/\\.\\$/g, '')]: {'$eq': null}});\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\tif (Array.isArray(filter.value)) {\n\t\t\t\t\t\t\t\t\t\t\t\tif (filter.condition === 'ne') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tlet and = [];\n\t\t\t\t\t\t\t\t\t\t\t\t\tfilter.value.forEach(filt => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tand.push({[filter.field.replace(/\\.\\$/g, '')]: {['$' + filter.condition]: (Array.isArray(filt) ? filt[0] : filt)}});\n\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (and.length > 1) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tors.push({$and: and});\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tors.push(and[0]);\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\t\tlet or = [];\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\tfilter.value.forEach(filt => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tor.push({[filter.field.replace(/\\.\\$/g, '')]: {['$' + filter.condition]: (Array.isArray(filt) ? filt[0] : filt)}});\n\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (or.length > 1) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tors.push({$or: or});\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tors.push(or[0]);\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\tors.push({[filter.field.replace(/\\.\\$/g, '')]: {['$' + filter.condition]: filter.value}});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tif (ors.length) {\n\t\t\t\t\t\t\t\t\tfilterArrays.push({$or: ors});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tlet res = await this.callMethod('reportBuilderGetResults', report.type, report.collection_root, rootOptions, filters, filterArrays, filterArrayFields, report.fields_selected, report.fields_custom, report.groups_row, report.fields_total, report.fields_link, report.id_date_field || null, report.date_interval || null, report.group_type);\n\t\t\t\t\t\t\t\tif (res && res[0]) {\n\t\t\t\t\t\t\t\t\tlet results = res[0].results;\n\t\t\t\t\t\t\t\t\tlet reportTotals = res[0].totals;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tif (report.type === 'List') {\n\t\t\t\t\t\t\t\t\t\treport.fields_selected.filter(a => a.show).forEach(field => {\n\t\t\t\t\t\t\t\t\t\t\tif ((field.fieldType === 'Number' || field.leafValueType === 'Count') && field.leafFormatType === 'Number') {\n\t\t\t\t\t\t\t\t\t\t\t\tresults.filter(a => a[field.id] !== null && a[field.id] !== undefined ).forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult[field.id] = result[field.id].toLocaleString();\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\telse if ((field.fieldType === 'Number' || field.leafValueType === 'Count') && field.leafFormatType === 'String') {\n\t\t\t\t\t\t\t\t\t\t\t\tresults.filter(a => a[field.id] !== null && a[field.id] !== undefined).forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult[field.id] = result[field.id].toLocaleString('en-US', { style: 'currency', currency: 'USD' });\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\telse if ((field.fieldType === 'Number' || field.leafValueType === 'Count') && field.leafFormatType === 'Currency') {\n\t\t\t\t\t\t\t\t\t\t\t\tresults.filter(a => a[field.id] !== null && a[field.id] !== undefined).forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult[field.id] = round(result[field.id], 2).toLocaleString('en-US', { style: 'currency', currency: 'USD' });\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\telse if (field.fieldType === 'Boolean' && (!field.leafFormatType || field.leafFormatType === 'Boolean')) {\n\t\t\t\t\t\t\t\t\t\t\t\tresults.filter(a => a[field.id] !== null && a[field.id] !== undefined).forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult[field.id] = result[field.id] === true ? 'True' : 'False';\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\telse if (field.fieldType === 'Boolean' && field.leafFormatType === 'String') {\n\t\t\t\t\t\t\t\t\t\t\t\tresults.filter(a => a[field.id] !== null && a[field.id] !== undefined).forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult[field.id] = result[field.id] === true ? 'Yes' : 'No';\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\telse if (field.fieldType === 'Boolean' && field.leafFormatType === 'Boolean_Number') {\n\t\t\t\t\t\t\t\t\t\t\t\tresults.filter(a => a[field.id] !== null && a[field.id] !== undefined).forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult[field.id] = result[field.id] === true ? 1 : 0;\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\telse if (field.fieldType === 'Date' && (field.leafFormatType === 'Date')) {\n\t\t\t\t\t\t\t\t\t\t\t\tresults.filter(a => a[field.id] !== null && a[field.id] !== undefined).forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult[field.id] = moment(result[field.id]).format('L');\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\telse if (field.fieldType === 'Date' && field.leafFormatType === 'Time') {\n\t\t\t\t\t\t\t\t\t\t\t\tresults.filter(a => a[field.id] !== null && a[field.id] !== undefined).forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult[field.id] = moment(result[field.id]).format('LT');\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\telse if (field.fieldType === 'Date' && field.leafFormatType === 'DateTime') {\n\t\t\t\t\t\t\t\t\t\t\t\tresults.filter(a => a[field.id] !== null && a[field.id] !== undefined).forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult[field.id] = moment(result[field.id]).format('MM/DD/YYYY h:mm A');\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\telse if (field.fieldType === 'Date' && field.leafFormatType === 'Date_long') {\n\t\t\t\t\t\t\t\t\t\t\t\tresults.filter(a => a[field.id] !== null && a[field.id] !== undefined).forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult[field.id] = moment(result[field.id]).format('LL');\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\telse if (field.fieldType === 'Date' && field.leafFormatType === 'DateTime_long') {\n\t\t\t\t\t\t\t\t\t\t\t\tresults.filter(a => a[field.id] !== null && a[field.id] !== undefined).forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult[field.id] = moment(result[field.id]).format('LLL');\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\telse if (field.fieldType === 'Date' && field.leafFormatType === 'Timestamp') {\n\t\t\t\t\t\t\t\t\t\t\t\tresults.filter(a => a[field.id] !== null && a[field.id] !== undefined).forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult[field.id] = moment(result[field.id]).toDate().getTime();\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\tlet lines: any = [];\n\n\t\t\t\t\t\t\t\t\t\tlet tmpHeaders = {};\n\n\t\t\t\t\t\t\t\t\t\treport.groups_row.forEach(group => {\n\t\t\t\t\t\t\t\t\t\t\ttmpHeaders[group.id] = group.columnName;\n\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\treport.fields_selected.filter(a => a.show).forEach(header => {\n\t\t\t\t\t\t\t\t\t\t\ttmpHeaders[header.columnName] = header.columnName;\n\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\tlet wb = XLSX.utils.book_new();\n\n\t\t\t\t\t\t\t\t\t\tresults.forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\tlet tmp = {};\n\t\t\t\t\t\t\t\t\t\t\treport.groups_row.forEach(group => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (Array.isArray(result._id[group.id])) {\n\t\t\t\t\t\t\t\t\t\t\t\t\ttmp[group.columnName] = result._id[group.id].join(',');\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (group.treeItem.fieldType === 'Number') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmp[group.columnName] = result._id[group.id] ? (typeof(result._id[group.id]) === 'string' ? parseFloat(result._id[group.id].replace(/,/g, '').replace(/\\$/g, '')) : result._id[group.id]) : '';\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmp[group.columnName] = result._id[group.id] || '';\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\treport.fields_selected.filter(a => a.show).forEach(header => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (Array.isArray(result[header.id])) {\n\t\t\t\t\t\t\t\t\t\t\t\t\ttmp[header.columnName] = result[header.id].join(',');\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (header.fieldType === 'Number' || header.leafValueType === 'Count') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmp[header.columnName] = result[header.id] ? (typeof(result[header.id]) === 'string' ? parseFloat(result[header.id].replace(/,/g, '').replace(/\\$/g, '')) : result[header.id]) : '';\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmp[header.columnName] = result[header.id] || '';\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tlines.push(tmp);\n\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\tlet ws = XLSX.utils.json_to_sheet(lines);\n\t\t\t\t\t\t\t\t\t\tXLSX.utils.book_append_sheet(wb, ws, 'RB Data');\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tlet wbout = XLSX.write(wb, {bookType: 'xlsx', type: 'base64'});\n\n\t\t\t\t\t\t\t\t\t\tfor (let email of data['emails']) {\n\t\t\t\t\t\t\t\t\t\t\tawait this.sendEmail(email,\n\t\t\t\t\t\t\t\t\t\t\t\tthis.serverConfig['CLIENT_NAME'] + ' Scheduled Report - ' + report.report_name,\n\t\t\t\t\t\t\t\t\t\t\t\t'',\n\t\t\t\t\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t\t\t\t\t<b>` + this.serverConfig['CLIENT_NAME'] + ` Automated Report</b><br>\n\t\t\t\t\t\t\t\t\t\t\t\t<b>Report Name: </b>` + report.report_name + `<br>\n\t\t\t\t\t\t\t\t\t\t\t\t<b>Prepared By: </b>` + data['user'] + `<br><br>\n\t\t\t\t\t\t\t\t\t\t\t\tAttached are the results of this automated report.<br><br>\n\t\t\t\t\t\t\t\t\t\t\t\tResolveIO<br><br>`,\n\t\t\t\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tfilename: report.report_name + '-' + moment().format('MM-DD-YYYY-hh-mm-A') + '.xlsx',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcontent: wbout,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tencoding: 'base64'\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\t\tthis.serverConfig['MAIL_FROM_REPORTS'],\n\t\t\t\t\t\t\t\t\t\t\t\t''\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse if (report.type === 'Group') {\n\t\t\t\t\t\t\t\t\t\treport.fields_selected.filter(a => a.show).forEach(field => {\n\t\t\t\t\t\t\t\t\t\t\tresults.forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\t\tmodifyDataTypeField(report, result, field, 1);\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\tlet wb = new Excel.Workbook();\n\t\t\t\t\t\t\t\t\t\tlet ws = wb.addWorksheet('RB_1', {views: [{showGridLines: false}]});\n\t\t\t\t\t\t\t\t\t\twb.properties.date1904 = false;\n\t\t\t\t\t\t\t\t\t\twb.calcProperties.fullCalcOnLoad = true;\n\n\t\t\t\t\t\t\t\t\t\tlet currentRow = 1;\n\t\t\t\t\t\t\t\t\t\tlet row = ws.getRow(currentRow);\n\n\t\t\t\t\t\t\t\t\t\trow.getCell(2).font = {\n\t\t\t\t\t\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\t\t\t\t\t\tbold: true,\n\t\t\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\trow.getCell(4).font = {\n\t\t\t\t\t\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\trow.getCell(2).value = 'Report Name:';\n\t\t\t\t\t\t\t\t\t\trow.getCell(4).value = report.report_name;\n\n\t\t\t\t\t\t\t\t\t\tcurrentRow += 1;\n\t\t\t\t\t\t\t\t\t\trow = ws.getRow(currentRow);\n\n\t\t\t\t\t\t\t\t\t\trow.getCell(2).font = {\n\t\t\t\t\t\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\t\t\t\t\t\tbold: true,\n\t\t\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\trow.getCell(4).font = {\n\t\t\t\t\t\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\trow.getCell(2).value = 'Run Date:';\n\t\t\t\t\t\t\t\t\t\trow.getCell(4).value = moment().format('LLL');\n\n\t\t\t\t\t\t\t\t\t\tcurrentRow += 2;\n\n\t\t\t\t\t\t\t\t\t\tlet copy = deepCopy(results);\n\t\t\t\t\t\t\t\t\t\tlet widths = [];\n\t\t\t\t\t\t\t\t\t\tcopy.forEach(res => {\n\t\t\t\t\t\t\t\t\t\t\tcurrentRow = tabGroupExcelRecursive(report, ws, currentRow, 1, res);\n\t\t\t\t\t\t\t\t\t\t\ttabGroupExcelWidthRecursive(report, 1, res, widths);\n\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\tfor (let i = 1; i < ws.columns.length; i++) {\n\t\t\t\t\t\t\t\t\t\t\tws.columns[i].width = widths[i - 1];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tlet now = new Date();\n\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tlet buffer = await wb.xlsx.writeBuffer();\n\t\t\t\t\t\t\t\t\t\t\tfor (let email of data['emails']) {\n\t\t\t\t\t\t\t\t\t\t\t\tawait this.sendEmail(email,\n\t\t\t\t\t\t\t\t\t\t\t\t\tthis.serverConfig['CLIENT_NAME'] + ' Scheduled Report - ' + report.report_name,\n\t\t\t\t\t\t\t\t\t\t\t\t\t'',\n\t\t\t\t\t\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t\t\t\t\t\t<b>` + this.serverConfig['CLIENT_NAME'] + ` Automated Report</b><br>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<b>Report Name: </b>` + report.report_name + `<br>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<b>Prepared By: </b>` + data['user'] + `<br><br>\n\t\t\t\t\t\t\t\t\t\t\t\t\tAttached are the results of this automated report.<br><br>\n\t\t\t\t\t\t\t\t\t\t\t\t\tHave a great day!<br><br>\n\t\t\t\t\t\t\t\t\t\t\t\t\tResolveIO<br><br>`,\n\t\t\t\t\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfilename: 'Group_Report_' + report.report_name + '_' + now.getFullYear() + '_' + (now.getMonth() + 1) + '_' + now.getDate() + '.xlsx',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcontent: buffer\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\t\t\tthis.serverConfig['MAIL_FROM_REPORTS'],\n\t\t\t\t\t\t\t\t\t\t\t\t\t''\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tcatch (err) {\n\t\t\t\t\t\t\t\t\t\t\tconsole.log('Error writing excel export', err)\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse if (report.type === 'Dated') {\n\t\t\t\t\t\t\t\t\t\tlet datedUniqueDates = [];\n\t\t\t\t\t\t\t\t\t\tlet datedUniqueGroups = [];\n\t\t\t\t\t\t\t\t\t\tlet datedData = [];\n\t\t\t\t\t\t\t\t\t\tlet reportTotalGroups = [];\n\t\t\t\t\t\t\t\t\t\tlet reportTotalDates = [];\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t// Step 1: Handle quarterly dates if applicable\n\t\t\t\t\t\t\t\t\t\tif (report.date_interval === 'Quarterly') {\n\t\t\t\t\t\t\t\t\t\t\tresults.forEach(dataPt => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (dataPt._id.month < 4) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tdataPt._id.quarter = 1;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (dataPt._id.month < 7) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tdataPt._id.quarter = 2;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (dataPt._id.month < 10) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tdataPt._id.quarter = 3;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\t\tdataPt._id.quarter = 4;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdelete dataPt._id.month;\n\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\t\t// Deduplicate quarterly data\n\t\t\t\t\t\t\t\t\t\t\tfor (let i = results.length - 1; i >= 1; i--) {\n\t\t\t\t\t\t\t\t\t\t\t\tlet dataPt = results[i];\n\t\t\t\t\t\t\t\t\t\t\t\tif (results.filter(a => JSON.stringify(a._id) === JSON.stringify(dataPt._id)).length > 1) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tlet tmpData = results.find(a => JSON.stringify(a._id) === JSON.stringify(dataPt._id));\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tObject.keys(tmpData)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.filter(a => a !== '_id')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.forEach(key => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmpData[key] += dataPt[key];\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\tresults.splice(i, 1); // Remove the duplicate entry\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Step 2: Prepare unique groups\n\t\t\t\t\t\t\t\t\t\tlet tmpResults = deepCopy(results);\n\t\t\t\t\t\t\t\t\t\ttmpResults.forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\tdelete result._id.day;\n\t\t\t\t\t\t\t\t\t\t\tdelete result._id.week;\n\t\t\t\t\t\t\t\t\t\t\tdelete result._id.month;\n\t\t\t\t\t\t\t\t\t\t\tdelete result._id.quarter;\n\t\t\t\t\t\t\t\t\t\t\tdelete result._id.year;\n\n\t\t\t\t\t\t\t\t\t\t\tlet tmpGroup = {};\n\t\t\t\t\t\t\t\t\t\t\tObject.keys(result._id).forEach(key => {\n\t\t\t\t\t\t\t\t\t\t\t\ttmpGroup[key] = result._id[key];\n\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\t\tif (!datedUniqueGroups.find(a => JSON.stringify(a) === JSON.stringify(tmpGroup))) {\n\t\t\t\t\t\t\t\t\t\t\t\tdatedUniqueGroups.push(tmpGroup);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\t// Step 3: Prepare unique dates\n\t\t\t\t\t\t\t\t\t\ttmpResults = deepCopy(results);\n\t\t\t\t\t\t\t\t\t\ttmpResults.forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\tObject.keys(result._id)\n\t\t\t\t\t\t\t\t\t\t\t\t.filter(a => a !== 'second' && a !== 'hour' && a !== 'minute' && a !== 'day' && a !== 'week' && a !== 'month' && a !== 'quarter' && a !== 'year')\n\t\t\t\t\t\t\t\t\t\t\t\t.forEach(key => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tdelete result._id[key];\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\t\tlet tmpDate = {};\n\t\t\t\t\t\t\t\t\t\t\tObject.keys(result._id).forEach(key => {\n\t\t\t\t\t\t\t\t\t\t\t\ttmpDate[key] = result._id[key];\n\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\t\tif (!datedUniqueDates.find(a => JSON.stringify(a) === JSON.stringify(tmpDate))) {\n\t\t\t\t\t\t\t\t\t\t\t\tdatedUniqueDates.push(tmpDate);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\t// Build the date strings\n\t\t\t\t\t\t\t\t\t\t// Ensure moment is using America/Chicago timezone for all date processing\n\t\t\t\t\t\t\t\t\t\tdatedUniqueDates.forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\tif (!result.year) {\n\t\t\t\t\t\t\t\t\t\t\t\tresult.dateString = 'No Date';\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\tif (report.date_interval === 'Seconds') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult.date = moment.tz({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tyear: result.year,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmonth: result.month - 1, // Use `month - 1` since months are zero-indexed in moment as well\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tday: result.day,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\thour: result.hour,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tminute: result.minute,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsecond: result.second\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, (process.env.TZ_CLIENT || 'America/Chicago')).toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult.dateString = moment(result.date).format('MMM DD YYYY HH:mm:ss');\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (report.date_interval === 'Minutes') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult.date = moment.tz({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tyear: result.year,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmonth: result.month - 1,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tday: result.day,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\thour: result.hour,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tminute: result.minute\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, (process.env.TZ_CLIENT || 'America/Chicago')).toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult.dateString = moment(result.date).format('MMM DD YYYY HH:mm');\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (report.date_interval === 'Hours') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult.date = moment.tz({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tyear: result.year,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmonth: result.month - 1,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tday: result.day,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\thour: result.hour\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, (process.env.TZ_CLIENT || 'America/Chicago')).toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult.dateString = moment(result.date).format('MMM DD YYYY HH');\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (report.date_interval === 'Daily') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult.date = moment.tz({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tyear: result.year,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmonth: result.month - 1,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tday: result.day\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, (process.env.TZ_CLIENT || 'America/Chicago')).toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult.dateString = moment(result.date).format('MMM DD YYYY');\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (report.date_interval === 'Weekly') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult.date = moment.tz({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tyear: result.year,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tweek: result.week\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, (process.env.TZ_CLIENT || 'America/Chicago')).day('Monday').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult.dateLast = moment.tz({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tyear: result.year,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tweek: result.week\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, (process.env.TZ_CLIENT || 'America/Chicago')).day('Sunday').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult.dateString = 'Week #' + result.week + ' ' + result.year + ' (' + moment(result.date).format('MM/DD/YY') + ' - ' + moment(result.dateLast).format('MM/DD/YY') + ')';\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (report.date_interval === 'Monthly') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult.date = moment.tz({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tyear: result.year,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmonth: result.month - 1, // Months are zero-indexed in moment\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, (process.env.TZ_CLIENT || 'America/Chicago')).toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult.dateString = moment(result.date).format('MMM YYYY');\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (report.date_interval === 'Quarterly') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult.date = moment.tz({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tyear: result.year\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, (process.env.TZ_CLIENT || 'America/Chicago')).quarter(result.quarter).toDate();;\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult.dateString = 'Q' + result.quarter + ' ' + result.year;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (report.date_interval === 'Yearly') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult.date = moment.tz({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tyear: result.year\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, (process.env.TZ_CLIENT || 'America/Chicago')).toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult.dateString = result.year.toString();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tdatedUniqueDates = datedUniqueDates.filter(a => !a.date)\n\t\t\t\t\t\t\t\t\t\t\t.concat(datedUniqueDates.filter(a => a.date).sort((a, b) => a.date.getTime() - b.date.getTime()));\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t// Step 4: Build datedData and reportTotalGroups\n\t\t\t\t\t\t\t\t\t\tdatedUniqueDates.forEach(date => {\n\t\t\t\t\t\t\t\t\t\t\tlet tmpData = [];\n\t\t\t\t\t\t\t\t\t\t\tlet tmpTotalDated = {};\n\t\t\t\t\t\t\t\t\t\t\tlet tmpTotalCnt = {};\n\t\t\t\t\t\t\t\t\t\t\tlet tmpTotalType = {};\n\n\t\t\t\t\t\t\t\t\t\t\tdatedUniqueGroups.forEach(group => {\n\t\t\t\t\t\t\t\t\t\t\t\tlet result = results.find(a => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tlet match = true;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t// Match the group fields\n\t\t\t\t\t\t\t\t\t\t\t\t\tObject.keys(group).forEach(key => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (a._id[key] !== group[key]) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tmatch = false;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t// Match the date fields\n\t\t\t\t\t\t\t\t\t\t\t\t\tObject.keys(date).filter(key => key !== 'date' && key !== 'dateLast' && key !== 'dateString').forEach(key => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (a._id[key] !== date[key]) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tmatch = false;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn match;\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\tif (result) {\n\t\t\t\t\t\t\t\t\t\t\t\t\ttmpData.push(result);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\tObject.keys(result._id).filter(a => a).forEach(key => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (report.fields_total.filter(a => a.fields.includes(key)).length) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (!tmpTotalDated[key]) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmpTotalDated[key] = result._id[key];\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmpTotalDated[key] += result._id[key];\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (!tmpTotalCnt[key]) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmpTotalCnt[key] = 1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmpTotalCnt[key] += 1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmpTotalType[key] = report.fields_total.find(a => a.fields.includes(key)).type;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\tObject.keys(result).filter(a => a && a !== '_id').forEach(key => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (report.fields_total.filter(a => a.fields.includes(key)).length) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (!tmpTotalDated[key]) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmpTotalDated[key] = result[key];\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmpTotalDated[key] += result[key];\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (!tmpTotalCnt[key]) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmpTotalCnt[key] = 1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmpTotalCnt[key] += 1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmpTotalType[key] = report.fields_total.find(a => a.fields.includes(key)).type;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\t\ttmpData.push(null);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\t\t// Handle averaging for totals\n\t\t\t\t\t\t\t\t\t\t\tObject.keys(tmpTotalType).forEach(totalKey => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (tmpTotalType[totalKey] === 'avg') {\n\t\t\t\t\t\t\t\t\t\t\t\t\ttmpTotalDated[totalKey] = tmpTotalDated[totalKey] / tmpTotalCnt[totalKey];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\ttmpTotalDated[totalKey] = round(tmpTotalDated[totalKey], 2);\n\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\t\treportTotalDates.push(tmpTotalDated);\n\t\t\t\t\t\t\t\t\t\t\tdatedData.push(tmpData);\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t// Calculate group-level totals\n\t\t\t\t\t\t\t\t\t\tdatedUniqueGroups.forEach(group => {\n\t\t\t\t\t\t\t\t\t\t\tlet tmpTotalGroup = {};\n\t\t\t\t\t\t\t\t\t\t\tlet filteredData = results.filter(a => {\n\t\t\t\t\t\t\t\t\t\t\t\tlet match = (!Object.keys(group).length || group._id === null) ? false : true;\n\t\t\t\t\t\t\t\t\t\t\t\tObject.keys(group).filter(a => a !== 'date' && a !== 'dateLast' && a !== 'dateString' && a !== 'second' && a !== 'minute' && a !== 'hour' && a !== 'day' && a !== 'week' && a !== 'month' && a !== 'quarter' && a !== 'year').forEach(key => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (a._id[key] !== group[key]) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmatch = false;\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\treturn match;\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\treport.fields_total.forEach(total => {\n\t\t\t\t\t\t\t\t\t\t\t\ttotal.fields.forEach(field => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (filteredData.length) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmpTotalGroup[field] = filteredData.filter(a => a && a[field])\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.map(a => a[field])\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.reduce((a, b) => a + b, 0);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (total.type === 'avg') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmpTotalGroup[field] = round(tmpTotalGroup[field] / filteredData.length, 2);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmpTotalGroup[field] = 0;\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\t\treportTotalGroups.push(tmpTotalGroup);\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t// Step 5: Proceed with Excel generation using datedData and reportTotalGroups\n\t\t\t\t\t\t\t\t\t\tlet wb = new Excel.Workbook();\n\t\t\t\t\t\t\t\t\t\tlet ws = wb.addWorksheet('Dated_Report', {views: [{showGridLines: true}]});\n\t\t\t\t\t\t\t\t\t\twb.properties.date1904 = false;\n\t\t\t\t\t\t\t\t\t\twb.calcProperties.fullCalcOnLoad = true;\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tlet currentRow = 1;\n\t\t\t\t\t\t\t\t\t\tlet currentCol = 1;\n\t\t\t\t\t\t\t\t\t\tlet row = ws.getRow(currentRow);\n\n\t\t\t\t\t\t\t\t\t\trow.getCell(2).font = {\n\t\t\t\t\t\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\t\t\t\t\t\tbold: true,\n\t\t\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\trow.getCell(4).font = {\n\t\t\t\t\t\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\trow.getCell(2).value = 'Report Name:';\n\t\t\t\t\t\t\t\t\t\trow.getCell(4).value = report.report_name;\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tcurrentRow += 1;\n\t\t\t\t\t\t\t\t\t\trow = ws.getRow(currentRow);\n\n\t\t\t\t\t\t\t\t\t\trow.getCell(2).font = {\n\t\t\t\t\t\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\t\t\t\t\t\tbold: true,\n\t\t\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\trow.getCell(4).font = {\n\t\t\t\t\t\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\trow.getCell(2).value = 'Run Date:';\n\t\t\t\t\t\t\t\t\t\trow.getCell(4).value = moment().format('LLL');\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tcurrentRow += 2;\n\t\t\t\t\t\t\t\t\t\trow = ws.getRow(currentRow);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t// Add group column headers\n\t\t\t\t\t\t\t\t\t\treport.groups_row.forEach(group => {\n\t\t\t\t\t\t\t\t\t\t\trow.getCell(currentCol).value = group.columnName;\n\t\t\t\t\t\t\t\t\t\t\tcurrentCol++;\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t// Add field headers\n\t\t\t\t\t\t\t\t\t\treport.fields_selected.filter(a => a.show).forEach(field => {\n\t\t\t\t\t\t\t\t\t\t\tcurrentCol++;\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t// Add the date interval headers\n\t\t\t\t\t\t\t\t\t\treport.fields_selected.filter(a => a.show).forEach(() => {\n\t\t\t\t\t\t\t\t\t\t\tdatedUniqueDates.forEach(date => {\n\t\t\t\t\t\t\t\t\t\t\t\trow.getCell(currentCol).value = date.dateString;\n\t\t\t\t\t\t\t\t\t\t\t\tcurrentCol++;\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t// Add totals headers\n\t\t\t\t\t\t\t\t\t\treport.fields_total.forEach(total => {\n\t\t\t\t\t\t\t\t\t\t\trow.getCell(currentCol).value = 'Totals - ' + toTitleCase(total.type);\n\t\t\t\t\t\t\t\t\t\t\tcurrentCol++;\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tcurrentCol = 1;\n\t\t\t\t\t\t\t\t\t\tcurrentRow += 1;\n\t\t\t\t\t\t\t\t\t\trow = ws.getRow(currentRow);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t// Populate data for each group and field with date intervals\n\t\t\t\t\t\t\t\t\t\tfor (let i = 0; i < datedUniqueGroups.length; i++) {\n\t\t\t\t\t\t\t\t\t\t\tlet group = datedUniqueGroups[i];\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tfor (let j = 0; j < report.fields_selected.filter(a => a.show).length; j++) {\n\t\t\t\t\t\t\t\t\t\t\t\tlet field = report.fields_selected.filter(a => a.show)[j];\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\tcurrentCol = 1;\n\t\t\t\t\t\t\t\t\t\t\t\trow = ws.getRow(currentRow);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t// Populate group data\n\t\t\t\t\t\t\t\t\t\t\t\treport.groups_row.forEach(groupRow => {\n\t\t\t\t\t\t\t\t\t\t\t\t\trow.getCell(currentCol).value = (j === 0) ? group[groupRow.id] : '';\n\t\t\t\t\t\t\t\t\t\t\t\t\tcurrentCol++;\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t// Populate field data\n\t\t\t\t\t\t\t\t\t\t\t\trow.getCell(currentCol).value = field.columnName;\n\t\t\t\t\t\t\t\t\t\t\t\tcurrentCol++;\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t// Populate date interval data for each field\n\t\t\t\t\t\t\t\t\t\t\t\tfor (let k = 0; k < datedUniqueDates.length; k++) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tlet result = datedData[k];\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (result[i]) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\trow.getCell(currentCol).value = result[i][field.id] ? result[i][field.id] : '';\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\trow.getCell(currentCol).value = '';\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tcurrentCol++;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t// Add totals for each field in the report\n\t\t\t\t\t\t\t\t\t\t\t\tfor (let k = 0; k < report.fields_total.length; k++) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tlet total = report.fields_total[k];\n\t\t\t\t\t\t\t\t\t\t\t\t\trow.getCell(currentCol).value = reportTotalGroups[i][field.id] ? reportTotalGroups[i][field.id] : '';\n\t\t\t\t\t\t\t\t\t\t\t\t\tcurrentCol++;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\tcurrentRow++; // Move to the next row for the next field\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t// Add report totals at the bottom\n\t\t\t\t\t\t\t\t\t\tif (reportTotals) {\n\t\t\t\t\t\t\t\t\t\t\tfor (let i = 0; i < report.fields_total.length; i++) {\n\t\t\t\t\t\t\t\t\t\t\t\tlet total = report.fields_total[i];\n\t\t\t\t\t\t\t\t\t\t\t\trow = ws.getRow(currentRow);\n\t\t\t\t\t\t\t\t\t\t\t\tcurrentCol = 1;\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\trow.getCell(currentCol).value = toTitleCase(total.type) + ' Totals';\n\t\t\t\t\t\t\t\t\t\t\t\tcurrentCol += report.groups_row.length; // Skip group columns\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t// Skip the date columns for the totals row\n\t\t\t\t\t\t\t\t\t\t\t\treport.fields_selected.filter(a => a.show).forEach(() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tcurrentCol += 1;\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\t\t\tdatedUniqueDates.forEach(() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tcurrentCol++;\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t// Set totals in the correct fields\n\t\t\t\t\t\t\t\t\t\t\t\tfor (let j = 0; j < report.fields_selected.filter(a => a.show).length; j++) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tlet field = report.fields_selected.filter(a => a.show)[j];\n\t\t\t\t\t\t\t\t\t\t\t\t\trow.getCell(currentCol).value = reportTotals[total.id + '_' + field.id] || '';\n\t\t\t\t\t\t\t\t\t\t\t\t\tcurrentCol++;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\tcurrentRow++; // Move to the next row for the next total\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\t// Save the Excel file and send it via email\n\t\t\t\t\t\t\t\t\t\t\tlet buffer = await wb.xlsx.writeBuffer();\n\t\t\t\t\t\t\t\t\t\t\tfor (let email of data['emails']) {\n\t\t\t\t\t\t\t\t\t\t\t\tawait this.sendEmail(\n\t\t\t\t\t\t\t\t\t\t\t\t\temail,\n\t\t\t\t\t\t\t\t\t\t\t\t\tthis.serverConfig['CLIENT_NAME'] + ' Scheduled Report - ' + report.report_name,\n\t\t\t\t\t\t\t\t\t\t\t\t\t'',\n\t\t\t\t\t\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t\t\t\t\t\t<b>${this.serverConfig['CLIENT_NAME']} Automated Report</b><br>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<b>Report Name: </b>${report.report_name}<br>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<b>Prepared By: </b>${data['user']}<br><br>\n\t\t\t\t\t\t\t\t\t\t\t\t\tAttached are the results of this automated report.<br><br>\n\t\t\t\t\t\t\t\t\t\t\t\t\tResolveIO<br><br>`,\n\t\t\t\t\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfilename: report.report_name + '-' + moment().format('MM-DD-YYYY-hh-mm-A') + '.xlsx',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcontent: buffer\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\t\t\tthis.serverConfig['MAIL_FROM_REPORTS'],\n\t\t\t\t\t\t\t\t\t\t\t\t\t''\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tcatch (err) {\n\t\t\t\t\t\t\t\t\t\t\tconsole.log('Error writing excel export', err)\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcatch (err) {\n\t\t\t\t\t\t\t\tthrow err;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcatch(err) {\n\t\t\t\t\t\terr.message = `Error in Report Builder Cron Job - Report Builder Build Tree: ${err.message}`;\n\t\t\t\t\t\tthrow err;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction getTreeLeaves(items, resArray, allowLookups = false) {\n\titems.forEach(item => {\n\t\tif (item.isLeaf) {\n\t\t\tresArray.push(item);\n\t\t}\n\t\telse {\n\t\t\tif (!item.lookup_collection || allowLookups) {\n\t\t\t\tgetTreeLeaves(item.children, resArray, allowLookups);\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction modifyDataTypeField(report, result, field, index) {\n\tconst processFieldValue = (value, field) => {\n\t\tif (value === undefined || value === null) {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (field.fieldType === 'Boolean') {\n\t\t\tif (!field.leafFormatType || field.leafFormatType === 'Boolean') {\n\t\t\t\treturn value === true ? 'True' : 'False';\n\t\t\t}\n\t\t\telse if (field.leafFormatType === 'String') {\n\t\t\t\treturn value === true ? 'Yes' : 'No';\n\t\t\t}\n\t\t\telse if (field.leafFormatType === 'Boolean_Number') {\n\t\t\t\treturn value === true ? 1 : 0;\n\t\t\t}\n\t\t}\n\t\telse if (field.fieldType === 'Number' || field.leafValueType === 'Count') {\n\t\t\tif (field.leafFormatType === 'Number') {\n\t\t\t\treturn value.toLocaleString();\n\t\t\t}\n\t\t\telse if (field.leafFormatType === 'String') {\n\t\t\t\treturn value.toString();\n\t\t\t}\n\t\t\telse if (field.leafFormatType === 'Currency') {\n\t\t\t\treturn round(value, 2).toLocaleString('en-US', { style: 'currency', currency: 'USD' });\n\t\t\t}\n\t\t}\n\t\telse if (field.fieldType === 'Date') {\n\t\t\tswitch (field.leafFormatType) {\n\t\t\t\tcase 'Date':\n\t\t\t\t\treturn moment(value).format('L');\n\t\t\t\tcase 'Time':\n\t\t\t\t\treturn moment(value).format('LT');\n\t\t\t\tcase 'DateTime':\n\t\t\t\t\treturn moment(value).format('MM/DD/YYYY h:mm A');\n\t\t\t\tcase 'Date_long':\n\t\t\t\t\treturn moment(value).format('LL');\n\t\t\t\tcase 'DateTime_long':\n\t\t\t\t\treturn moment(value).format('LLL');\n\t\t\t\tcase 'Timestamp':\n\t\t\t\t\treturn moment(value).toDate().getTime();\n\t\t\t\tdefault:\n\t\t\t\t\treturn value;\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t};\n\n\tconst processArrayField = (array, field) => {\n\t\treturn array.map(value => processFieldValue(value, field));\n\t};\n\n\tif (index < report.groups_row.length) {\n\t\t// Handle grouped data\n\t\tconst groupKey = 'gr_' + (index + 1);\n\t\tif (result[groupKey]) {\n\t\t\tresult[groupKey].forEach(subResult => {\n\t\t\t\tmodifyDataTypeField(report, subResult, field, index + 1);\n\t\t\t});\n\t\t}\n\t}\n\telse {\n\t\t// Process final-level fields\n\t\tif (Array.isArray(result[field.id])) {\n\t\t\tresult[field.id] = processArrayField(result[field.id], field);\n\t\t}\n\t\telse {\n\t\t\tresult[field.id] = processFieldValue(result[field.id], field);\n\t\t}\n\t}\n}\n\nfunction tabGroupExcelRecursive(report, ws: Excel.Worksheet, currentRow, level, result) {\n\tlet row = ws.getRow(currentRow);\n\n\tif (level < report.groups_row.length) {\n\t\trow.getCell(2).fill = {\n\t\t\tfgColor: {argb: report.groups_row[level - 1].fill_color ? report.groups_row[level - 1].fill_color.replace('#', '') : 'ffffff'},\n\t\t\ttype: 'pattern',\n\t\t\tpattern: 'solid'\n\t\t};\n\t\trow.getCell(2).font = {\n\t\t\tcolor: {argb: report.groups_row[level - 1].font_color ? report.groups_row[level - 1].font_color.replace('#', '') : '000000'},\n\t\t\tname: 'Arial',\n\t\t\tbold: true,\n\t\t\tsize: 14\n\t\t};\n\n\t\trow.getCell(2).value = report.groups_row[level - 1].columnName + ': ' + result._id['gr_' + level];\n\t\tws.mergeCells(row.getCell(2).$col$row + ':' + row.getCell(report.fields_selected.filter(a => a.show).length + 1).$col$row);\n\t\t\n\t\trow.getCell(2).border = {\n\t\t\ttop: {style:'thick'},\n\t\t\tleft: {style:'thick'},\n\t\t\tright: {style: 'thick'}\n\t\t};\n\n\t\tif (report.fields_total.length) {\n\t\t\treport.fields_total.forEach(total => {\n\t\t\t\tcurrentRow += 1;\n\t\t\t\trow = ws.getRow(currentRow);\n\n\t\t\t\treport.fields_selected.filter(a => a.show).forEach((field, fieldIndex) => {\n\t\t\t\t\tif (total.fields.includes(field.id)) {\n\t\t\t\t\t\trow.getCell(fieldIndex + 2).value = field.columnName;\n\n\t\t\t\t\t\trow.getCell(fieldIndex + 2).font = {\n\t\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\t\tbold: true,\n\t\t\t\t\t\t\tsize: 10\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tif (field.leafFormatType === 'Currency') {\n\t\t\t\t\t\trow.getCell(fieldIndex + 2).numFmt = '\"$\"#,##0.00';\n\t\t\t\t\t}\n\t\t\t\t\telse if (field.leafFormatType === 'Number') {\n\t\t\t\t\t\trow.getCell(fieldIndex + 2).numFmt = '#,##0';\n\t\t\t\t\t}\n\n\t\t\t\t\tif (fieldIndex === 0) {\n\t\t\t\t\t\trow.getCell(fieldIndex + 2).border = {\n\t\t\t\t\t\t\tleft: {style:'thick'}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\telse if (fieldIndex === report.fields_selected.filter(a => a.show).length - 1) {\n\t\t\t\t\t\trow.getCell(fieldIndex + 2).border = {\n\t\t\t\t\t\t\tright: {style:'thick'}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t\t\n\t\t// Totals\n\t\treport.fields_total.forEach(total => {\n\t\t\tcurrentRow += 1;\n\t\t\trow = ws.getRow(currentRow);\n\n\t\t\treport.fields_selected.filter(a => a.show).forEach((field, fieldIndex) => {\n\t\t\t\tif (total.fields.includes(field.id)) {\n\t\t\t\t\trow.getCell(fieldIndex + 2).value = result[total.id + '_' + field.id];\n\n\t\t\t\t\trow.getCell(fieldIndex + 2).font = {\n\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\tbold: true,\n\t\t\t\t\t\tsize: 10\n\t\t\t\t\t};\n\n\t\t\t\t\tif (field.leafFormatType === 'Currency') {\n\t\t\t\t\t\trow.getCell(fieldIndex + 2).numFmt = '\"$\"#,##0.00';\n\t\t\t\t\t}\n\t\t\t\t\telse if (field.leafFormatType === 'Number') {\n\t\t\t\t\t\trow.getCell(fieldIndex + 2).numFmt = '#,##0';\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (fieldIndex === 0) {\n\t\t\t\t\trow.getCell(fieldIndex + 2).border = {\n\t\t\t\t\t\ttop: {style:'thin'},\n\t\t\t\t\t\tleft: {style:'thick'},\n\t\t\t\t\t\tbottom: {style:'thick'}\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse if (fieldIndex === report.fields_selected.filter(a => a.show).length - 1) {\n\t\t\t\t\trow.getCell(fieldIndex + 2).border = {\n\t\t\t\t\t\ttop: {style:'thin'},\n\t\t\t\t\t\tbottom: {style:'thick'},\n\t\t\t\t\t\tright: {style:'thick'}\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\trow.getCell(fieldIndex + 2).border = {\n\t\t\t\t\t\ttop: {style:'thin'},\n\t\t\t\t\t\tbottom: {style:'thick'}\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\t\n\t\tcurrentRow += 1;\n\n\t\tresult = result['gr_' + (level + 1)];\n\t\tresult.forEach((tDataRes, tIndex) => {\n\t\t\tcurrentRow = tabGroupExcelRecursive(report, ws, currentRow, level + 1, tDataRes);\n\t\t});\n\t}\n\telse {\n\t\trow.getCell(2).fill = {\n\t\t\tfgColor: {argb: report.groups_row[level - 1].fill_color ? report.groups_row[level - 1].fill_color.replace('#', '') : 'ffffff'},\n\t\t\ttype: 'pattern',\n\t\t\tpattern: 'solid'\n\t\t};\n\t\trow.getCell(2).font = {\n\t\t\tcolor: {argb: report.groups_row[level - 1].font_color ? report.groups_row[level - 1].font_color.replace('#', '') : '000000'},\n\t\t\tname: 'Arial',\n\t\t\tbold: true,\n\t\t\tsize: 12\n\t\t};\n\n\t\trow.getCell(2).value = report.groups_row[level - 1].columnName + ': ' + result._id['gr_' + level];\n\t\tws.mergeCells(row.getCell(2).$col$row + ':' + row.getCell(report.fields_selected.filter(a => a.show).length + 1).$col$row);\n\n\t\trow.getCell(2).border = {\n\t\t\ttop: {style:'thick'},\n\t\t\tleft: {style:'thick'},\n\t\t\tright: {style: 'thick'}\n\t\t};\n\n\t\tcurrentRow += 1;\n\t\trow = ws.getRow(currentRow);\n\t\t// Headers\n\t\treport.fields_selected.filter(a => a.show).forEach((field, fieldIndex) => {\n\t\t\trow.getCell(fieldIndex + 2).value = field.columnName;\n\t\t\trow.getCell(fieldIndex + 2).font = {\n\t\t\t\tname: 'Arial',\n\t\t\t\tbold: true,\n\t\t\t\tsize: 10\n\t\t\t};\n\n\t\t\tif (field.leafFormatType === 'Currency') {\n\t\t\t\trow.getCell(fieldIndex + 2).numFmt = '\"$\"#,##0.00';\n\t\t\t}\n\t\t\telse if (field.leafFormatType === 'Number') {\n\t\t\t\trow.getCell(fieldIndex + 2).numFmt = '#,##0';\n\t\t\t}\n\n\t\t\tif (fieldIndex === 0) {\n\t\t\t\trow.getCell(fieldIndex + 2).border = {\n\t\t\t\t\tleft: {style:'thick'}\n\t\t\t\t};\n\t\t\t}\n\t\t\telse if (fieldIndex === report.fields_selected.filter(a => a.show).length - 1) {\n\t\t\t\trow.getCell(fieldIndex + 2).border = {\n\t\t\t\t\tright: {style:'thick'}\n\t\t\t\t};\n\t\t\t}\n\t\t});\n\n\t\t// Data\n\t\tresult['f_0'].forEach((res, resIndex) => {\n\t\t\tcurrentRow += 1;\n\t\t\trow = ws.getRow(currentRow);\n\n\t\t\treport.fields_selected.filter(a => a.show).forEach((field, fieldIndex) => {\n\t\t\t\tif (field.fieldType === 'Number' && typeof(result[field.id][resIndex]) === 'string' && result[field.id][resIndex]) {\n\t\t\t\t\trow.getCell(fieldIndex + 2).value = parseFloat(result[field.id][resIndex].replace(new RegExp(/\\,/g), '').replace(new RegExp(/\\$/g), ''));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\trow.getCell(fieldIndex + 2).value = result[field.id][resIndex];\n\t\t\t\t}\n\n\t\t\t\tif (field.leafFormatType === 'Currency') {\n\t\t\t\t\trow.getCell(fieldIndex + 2).numFmt = '\"$\"#,##0.00';\n\t\t\t\t}\n\t\t\t\telse if (field.leafFormatType === 'Number') {\n\t\t\t\t\trow.getCell(fieldIndex + 2).numFmt = '#,##0';\n\t\t\t\t}\n\n\t\t\t\trow.getCell(fieldIndex + 2).font = {\n\t\t\t\t\tname: 'Arial',\n\t\t\t\t\tsize: 10\n\t\t\t\t};\n\n\t\t\t\tif (fieldIndex === 0) {\n\t\t\t\t\trow.getCell(fieldIndex + 2).border = {\n\t\t\t\t\t\tleft: {style:'thick'}\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse if (fieldIndex === report.fields_selected.filter(a => a.show).length - 1) {\n\t\t\t\t\trow.getCell(fieldIndex + 2).border = {\n\t\t\t\t\t\tright: {style:'thick'}\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\t\n\t\t// Totals\n\t\treport.fields_total.forEach(total => {\n\t\t\tcurrentRow += 1;\n\t\t\trow = ws.getRow(currentRow);\n\n\t\t\treport.fields_selected.filter(a => a.show).forEach((field, fieldIndex) => {\n\t\t\t\tif (total.fields.includes(field.id)) {\n\t\t\t\t\trow.getCell(fieldIndex + 2).value = result[total.id + '_' + field.id];\n\n\t\t\t\t\trow.getCell(fieldIndex + 2).font = {\n\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\tbold: true,\n\t\t\t\t\t\tsize: 10\n\t\t\t\t\t};\n\n\t\t\t\t\tif (field.leafFormatType === 'Currency') {\n\t\t\t\t\t\trow.getCell(fieldIndex + 2).numFmt = '\"$\"#,##0.00';\n\t\t\t\t\t}\n\t\t\t\t\telse if (field.leafFormatType === 'Number') {\n\t\t\t\t\t\trow.getCell(fieldIndex + 2).numFmt = '#,##0';\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (fieldIndex === 0) {\n\t\t\t\t\trow.getCell(fieldIndex + 2).border = {\n\t\t\t\t\t\ttop: {style:'thin'},\n\t\t\t\t\t\tleft: {style:'thick'},\n\t\t\t\t\t\tbottom: {style:'thick'}\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse if (fieldIndex === report.fields_selected.filter(a => a.show).length - 1) {\n\t\t\t\t\trow.getCell(fieldIndex + 2).border = {\n\t\t\t\t\t\ttop: {style:'thin'},\n\t\t\t\t\t\tbottom: {style:'thick'},\n\t\t\t\t\t\tright: {style:'thick'}\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\trow.getCell(fieldIndex + 2).border = {\n\t\t\t\t\t\ttop: {style:'thin'},\n\t\t\t\t\t\tbottom: {style:'thick'}\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\treturn currentRow + 1;\n}\n\nfunction tabGroupExcelWidthRecursive(report, level, result, cols) {\n\tif (level < report.groups_row.length) {\n\t\tresult = result['gr_' + (level + 1)];\n\t\tresult.forEach((tDataRes, tIndex) => {\n\t\t\tcols = tabGroupExcelWidthRecursive(report, level + 1, tDataRes, cols);\n\t\t});\n\t}\n\telse {\n\t\treport.fields_selected.filter(a => a.show).forEach((field, fieldIndex) => {\n\t\t\tif (Array.isArray(result[field.id])) {\n\t\t\t\tresult[field.id].forEach(res => {\n\t\t\t\t\tlet length = 10;\n\n\t\t\t\t\tif (res) {\n\t\t\t\t\t\tlength = res.length + 3;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!cols[fieldIndex]) {\n\t\t\t\t\t\tcols[fieldIndex] = Math.max(10, field.columnName.length);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (length > cols[fieldIndex]) {\n\t\t\t\t\t\tcols[fieldIndex] = length;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet res = result[field.id];\n\n\t\t\t\tif (res) {\n\t\t\t\t\tlength = res.length + 3;\n\t\t\t\t}\n\n\t\t\t\tif (!cols[fieldIndex]) {\n\t\t\t\t\tcols[fieldIndex] = Math.max(10, field.columnName.length);\n\t\t\t\t}\n\n\t\t\t\tif (length > cols[fieldIndex]) {\n\t\t\t\t\tcols[fieldIndex] = length;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\treturn cols;\n}"]}
|
|
1
|
+
{"version":3,"sources":["../../src/methods/cron-jobs.ts"],"names":["Excel","require","moment","simpl_schema_1","XLSX","cron_job_collection_1","file_collection_1","report_builder_report_collection_1","common_1","loadCronJobMethods","methodManager","methods","cronEmailMergedDocsCleanUp","function","Files","find","$and","type","createdAt","$lte","subtract","toDate","files","_a","sent","length","this","callMethod","deleteMany","_id","$in","map","a","stuckCronJob","fiveMin","CronJobs","running","updatedAt","cronJobs","updateMany","$set","reportbuilderCronJob","check","default","data","Object","blackbox","ReportBuilderReports","findById","report","_k","fields_selected","forEach","field","fieldData","fieldPath","replace","split","fieldPathObj","i","_b","groups_row","fieldsObj_1","count_1","collection_name","collection_root","mergeDeep","sortIndex","fields_sort","findIndex","sortObj_1","sortField","startsWith","order","rootOptions","limit","skip","fields","sort","filters_1","fields_filter","filterAnd","ors","filter","includes","endDate","and","and_1","or_1","condition","value","Array","isArray","fieldType","is_rolling","startDate","rolling_interval","startOf","quarter","endOf","Date","setHours","setMinutes","setSeconds","setMilliseconds","push","$gte","_c","_d","highValue","_e","$exists","_f","$ne","_g","_h","$eq","filt","$or","_j","collectionTree","layers","treeLeaves","allLeaves_1","getTreeLeaves","children","filterArrayFields_1","filterArrays_1","and_2","or_2","filterLeaf","fields_custom","fields_total","fields_link","id_date_field","date_interval","group_type","res","results_1","results","reportTotals","totals","show","leafValueType","leafFormatType","id","undefined","result","format","getTime","round","toLocaleString","style","currency","lines_1","group","columnName","header","wb","utils","book_new","tmp","join","treeItem","parseFloat","ws","json_to_sheet","book_append_sheet","wbout","write","bookType","__values","next","email","sendEmail","serverConfig","report_name","filename","content","encoding","modifyDataTypeField","Workbook","ws_1","addWorksheet","views","showGridLines","properties","date1904","calcProperties","fullCalcOnLoad","currentRow_1","row","getRow","getCell","font","name","bold","size","copy","deepCopy","widths_1","tabGroupExcelRecursive","tabGroupExcelWidthRecursive","columns","width","now","xlsx","writeBuffer","buffer","getFullYear","getMonth","getDate","console","log","err_1","datedUniqueDates_1","datedUniqueGroups_1","datedData_1","reportTotalGroups_1","reportTotalDates_1","dataPt","month","tmpData_1","JSON","stringify","keys","key","splice","day","week","year","tmpGroup","tmpDate","date","tz","hour","minute","second","process","env","TZ_CLIENT","dateString","dateLast","toString","concat","b","tmpData","tmpTotalDated","tmpTotalCnt","tmpTotalType","match","totalKey","tmpTotalGroup","filteredData","total","reduce","currentCol_1","currentRow","row_1","toTitleCase","j","groupRow","k","err_2","message","err_4","items","resArray","allowLookups","item","isLeaf","lookup_collection","index","processFieldValue","array","groupKey","subResult","level","fill","fgColor","argb","fill_color","pattern","color","font_color","mergeCells","$col$row","border","top","left","right","fieldIndex","numFmt","bottom","tDataRes","resIndex","RegExp","cols","Math","max","exports"],"mappings":"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","file":"cron-jobs.js","sourcesContent":["import * as Excel from 'exceljs';\nimport * as moment from 'moment-timezone';\nimport SimpleSchema from 'simpl-schema';\nimport * as XLSX from 'xlsx';\nimport { CronJobs } from '../collections/cron-job.collection';\nimport { Files } from '../collections/file.collection';\nimport { ReportBuilderReports } from '../collections/report-builder-report.collection';\nimport { MethodManager } from '../managers/method.manager';\nimport { PaginationOptions } from '../models/pagination.model';\nimport { deepCopy, mergeDeep, round, toTitleCase } from '../util/common';\n\nexport function loadCronJobMethods(methodManager: MethodManager) {\n\tmethodManager.methods({\n\t\tcronEmailMergedDocsCleanUp: {\n\t\t\tfunction: async function() {\n\t\t\t\tlet files = await Files.find({$and: [{type: 'Email Merged Docs'}, {createdAt: {$lte: moment().subtract(1, 'day').toDate()}}]});\n\t\t\t\t\n\t\t\t\tif (files.length) {\n\t\t\t\t\tawait this.callMethod('deleteFiles');\n\t\t\t\t\tawait Files.deleteMany({_id: {$in: files.map(a => a._id)}});\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\t\tstuckCronJob: {\n\t\t\tfunction: async function() {\n\t\t\t\tlet fiveMin = moment().subtract(5, 'minutes').toDate();\n\t\t\t\tlet cronJobs = await CronJobs.find({running: true, updatedAt: {$lte: fiveMin}});\n\n\t\t\t\tif (cronJobs.length) {\n\t\t\t\t\tawait CronJobs.updateMany({_id: {$in: cronJobs.map(a => a._id)}}, {$set: {running: false}});\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\t\treportbuilderCronJob: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tdata: {\n\t\t\t\t\ttype: Object,\n\t\t\t\t\tblackbox: true\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: async function(data: Object) {\n\t\t\t\tlet report = await ReportBuilderReports.findById(data['id_report']);\n\n\t\t\t\treport.fields_selected.forEach((field: any) => {\n\t\t\t\t\tlet dotPath = field.fieldPath.replace(/\\.\\$/g, '');\n\t\t\t\t\tlet fieldData = dotPath.split('.');\n\t\t\t\t\tfield.fieldPathObj = null;\n\t\t\t\t\tfor (let i = fieldData.length - 1; i >= 0; i--) {\n\t\t\t\t\t\tif (!field.fieldPathObj) {\n\t\t\t\t\t\t\tfield.fieldPathObj = {[fieldData[i]]: 1};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tfield.fieldPathObj = {[fieldData[i]]: field.fieldPathObj};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif ((report.fields_selected && report.fields_selected.length) || (report.groups_row && report.groups_row.length)) {\n\t\t\t\t\tlet fieldsObj = {};\n\n\t\t\t\t\tlet count = 0;\n\n\t\t\t\t\treport.fields_selected.forEach((field: any) => {\n\t\t\t\t\t\tif (field.collection_name === report.collection_root) {\n\t\t\t\t\t\t\tfieldsObj = mergeDeep(fieldsObj, field.fieldPathObj);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tlet sortIndex = report.fields_sort.findIndex(a => a.field === field['id']);\n\n\t\t\t\t\t\tif (sortIndex >= 0) {\n\t\t\t\t\t\t\treport.fields_sort[sortIndex].field = ('f_' + count);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfield['id'] = 'f_' + count;\n\n\t\t\t\t\t\tcount += 1;\n\t\t\t\t\t});\n\n\t\t\t\t\tlet sortObj = {};\n\t\t\t\t\tif (report.fields_sort.length) {\n\t\t\t\t\t\treport.fields_sort.forEach(sortField => {\n\t\t\t\t\t\t\tif (sortField.field.startsWith('gr_')) {\n\t\t\t\t\t\t\t\tsortObj['_id.' + sortField.field] = (sortField.order === 'asc' ? 1 : -1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tsortObj[sortField.field] = (sortField.order === 'asc' ? 1 : -1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tsortObj = null;\n\t\t\t\t\t}\n\n\t\t\t\t\tlet rootOptions: PaginationOptions = {\n\t\t\t\t\t\tlimit: 0,\n\t\t\t\t\t\tskip: 0,\n\t\t\t\t\t\tfields: fieldsObj,\n\t\t\t\t\t\tsort: sortObj\n\t\t\t\t\t};\n\n\t\t\t\t\tlet filters = [];\n\t\t\t\t\treport.fields_filter.forEach(filterAnd => {\n\t\t\t\t\t\tlet ors = [];\n\t\t\t\t\t\tfilterAnd.ors.filter(a => !a.field.includes('.$.')).forEach(filter => {\n\t\t\t\t\t\t\tif (filter.condition && filter.field && ((filter.value !== null && (!Array.isArray(filter.value) || filter.value.length)) || filter.condition === 'null' || filter.condition === 'nnull')) {\n\t\t\t\t\t\t\t\tif (filter.condition === 'bw') {\n\t\t\t\t\t\t\t\t\tif (filter.fieldType === 'Date' && filter.is_rolling) {\n\t\t\t\t\t\t\t\t\t\tlet startDate = null;\n\t\t\t\t\t\t\t\t\t\tlet endDate = null;\n\n\t\t\t\t\t\t\t\t\t\tif (filter.rolling_interval === 'Q1') {\n\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('year').toDate();\n\t\t\t\t\t\t\t\t\t\t\tendDate = moment().startOf('year').quarter(2).subtract(1, 'days').toDate();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Q2') {\n\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('year').quarter(2).toDate();\n\t\t\t\t\t\t\t\t\t\t\tendDate = moment().startOf('year').quarter(3).subtract(1, 'days').toDate();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Q3') {\n\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('year').quarter(3).toDate();\n\t\t\t\t\t\t\t\t\t\t\tendDate = moment().startOf('year').quarter(4).subtract(1, 'days').toDate();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Q4') {\n\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('year').quarter(4).toDate();\n\t\t\t\t\t\t\t\t\t\t\tendDate = moment().endOf('year').toDate();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Today') {\n\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\tendDate = moment().endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Yesterday') {\n\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().subtract(1, 'days').startOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\tendDate = moment().subtract(1, 'days').endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Week') {\n\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('isoWeek').toDate();\n\t\t\t\t\t\t\t\t\t\t\tendDate = moment().endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Last Week') {\n\t\t\t\t\t\t\t\t\t\t\tendDate = moment().startOf('isoWeek').subtract(1, 'days').toDate();\n\t\t\t\t\t\t\t\t\t\t\tstartDate = moment(endDate).startOf('isoWeek').toDate();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Month') {\n\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('month').toDate();\n\t\t\t\t\t\t\t\t\t\t\tendDate = moment().endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Last Month') {\n\t\t\t\t\t\t\t\t\t\t\tendDate = moment().startOf('month').subtract(1, 'days').endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\tstartDate = moment(endDate).startOf('month').toDate();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Last 30 Days') {\n\t\t\t\t\t\t\t\t\t\t\tendDate = moment().endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().subtract(30, 'days').startOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Quarter') {\n\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('year').quarter(moment().quarter()).toDate();\n\t\t\t\t\t\t\t\t\t\t\tendDate = moment().endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Last Quarter') {\n\t\t\t\t\t\t\t\t\t\t\tendDate = moment().startOf('year').quarter(moment().quarter()).subtract(1, 'days').endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\tstartDate = moment(endDate).startOf('quarter').toDate();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Year') {\n\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('year').toDate();\n\t\t\t\t\t\t\t\t\t\t\tendDate = moment().endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Last Year') {\n\t\t\t\t\t\t\t\t\t\t\tendDate = moment().startOf('year').subtract(1, 'days').endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\tstartDate = moment(endDate).startOf('year').toDate();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'All') {\n\t\t\t\t\t\t\t\t\t\t\tstartDate = new Date(2017, 0, 1, 0, 0, 0, 0);\n\t\t\t\t\t\t\t\t\t\t\tendDate = moment().endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tendDate.setHours(23);\n\t\t\t\t\t\t\t\t\t\tendDate.setMinutes(59);\n\t\t\t\t\t\t\t\t\t\tendDate.setSeconds(59);\n\t\t\t\t\t\t\t\t\t\tendDate.setMilliseconds(999);\n\n\t\t\t\t\t\t\t\t\t\tors.push({$and: [{[filter.field]: {'$gte': startDate}}, {[filter.field]: {'$lte': endDate}}]});\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\tors.push({$and: [{[filter.field]: {'$gte': filter.value}}, {[filter.field]: {'$lte': filter.highValue}}]});\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse if (filter.condition === 'nnull') {\n\t\t\t\t\t\t\t\t\tlet and = [];\n\t\t\t\t\t\t\t\t\tand.push({[filter.field]: {'$exists': true}});\n\t\t\t\t\t\t\t\t\tand.push({[filter.field]: {'$ne': null}});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tif (filter.fieldType === 'String') {\n\t\t\t\t\t\t\t\t\t\tand.push({[filter.field]: {'$ne': ''}});\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tors.push({$and: and});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse if (filter.condition === 'null') {\n\t\t\t\t\t\t\t\t\tors.push({[filter.field]: {'$eq': null}});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tif (Array.isArray(filter.value)) {\n\t\t\t\t\t\t\t\t\t\tif (filter.condition === 'ne') {\n\t\t\t\t\t\t\t\t\t\t\tlet and = [];\n\t\t\t\t\t\t\t\t\t\t\tfilter.value.forEach(filt => {\n\t\t\t\t\t\t\t\t\t\t\t\tand.push({[filter.field]: {['$' + filter.condition]: (Array.isArray(filt) ? filt[0] : filt)}});\n\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\t\tif (and.length > 1) {\n\t\t\t\t\t\t\t\t\t\t\t\tors.push({$and: and});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\tors.push(and[0]);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\tlet or = [];\n\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tfilter.value.forEach(filt => {\n\t\t\t\t\t\t\t\t\t\t\t\tor.push({[filter.field]: {['$' + filter.condition]: (Array.isArray(filt) ? filt[0] : filt)}});\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tif (or.length > 1) {\n\t\t\t\t\t\t\t\t\t\t\t\tors.push({$or: or});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\tors.push(or[0]);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\tors.push({[filter.field]: {['$' + filter.condition]: filter.value}});\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (ors.length) {\n\t\t\t\t\t\t\tfilters.push({$or: ors});\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlet collectionTree = await this.callMethod('reportBuilderBuildTree', report.collection_root);\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (collectionTree) {\n\t\t\t\t\t\t\tcollectionTree.layers = [collectionTree];\n\t\t\t\n\t\t\t\t\t\t\tlet treeLeaves = [];\n\t\t\t\t\t\t\tlet allLeaves = [];\n\t\t\t\t\t\t\tgetTreeLeaves(collectionTree.children, treeLeaves);\n\t\t\t\t\t\t\tgetTreeLeaves(collectionTree.children, allLeaves, true);\n\n\t\t\t\t\t\t\tlet filterArrayFields = [];\n\t\t\t\t\t\t\tlet filterArrays = [];\n\t\t\t\t\t\t\treport.fields_filter.forEach(filterAnd => {\n\t\t\t\t\t\t\t\tlet ors = [];\n\t\t\t\t\t\t\t\tfilterAnd.ors.filter(a => a.field.includes('.$.')).forEach(filter => {\n\t\t\t\t\t\t\t\t\tlet filterLeaf = allLeaves.find(a => a.fieldPath === filter.field);\n\t\t\t\t\t\t\t\t\tif (filterLeaf) {\n\t\t\t\t\t\t\t\t\t\tfilterArrayFields.push(filterLeaf);\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif (filter.condition && filter.field && ((filter.value !== null && (!Array.isArray(filter.value) || filter.value.length)) || filter.condition === 'null' || filter.condition === 'nnull')) {\n\t\t\t\t\t\t\t\t\t\tif (filter.condition === 'bw') {\n\t\t\t\t\t\t\t\t\t\t\tif (filter.fieldType === 'Date' && filter.is_rolling) {\n\t\t\t\t\t\t\t\t\t\t\t\tlet startDate = null;\n\t\t\t\t\t\t\t\t\t\t\t\tlet endDate = null;\n\n\t\t\t\t\t\t\t\t\t\t\t\tif (filter.rolling_interval === 'Q1') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('year').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tendDate = moment().startOf('year').quarter(2).subtract(1, 'days').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Q2') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('year').quarter(2).toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tendDate = moment().startOf('year').quarter(3).subtract(1, 'days').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Q3') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('year').quarter(3).toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tendDate = moment().startOf('year').quarter(4).subtract(1, 'days').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Q4') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('year').quarter(4).toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tendDate = moment().endOf('year').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Today') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tendDate = moment().endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Yesterday') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().subtract(1, 'days').startOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tendDate = moment().subtract(1, 'days').endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Week') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('isoWeek').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tendDate = moment().endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Last Week') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tendDate = moment().startOf('isoWeek').subtract(1, 'days').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tstartDate = moment(endDate).startOf('isoWeek').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Month') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('month').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tendDate = moment().endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Last Month') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tendDate = moment().startOf('month').subtract(1, 'days').endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tstartDate = moment(endDate).startOf('month').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Last 30 Days') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tendDate = moment().endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().subtract(30, 'days').startOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Quarter') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('year').quarter(moment().quarter()).toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tendDate = moment().endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Last Quarter') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tendDate = moment().startOf('year').quarter(moment().quarter()).subtract(1, 'days').endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tstartDate = moment(endDate).startOf('quarter').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Year') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tstartDate = moment().startOf('year').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tendDate = moment().endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'Last Year') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tendDate = moment().startOf('year').subtract(1, 'days').endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tstartDate = moment(endDate).startOf('year').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (filter.rolling_interval === 'All') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tstartDate = new Date(2017, 0, 1, 0, 0, 0, 0);\n\t\t\t\t\t\t\t\t\t\t\t\t\tendDate = moment().endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tendDate.setHours(23);\n\t\t\t\t\t\t\t\t\t\t\t\tendDate.setMinutes(59);\n\t\t\t\t\t\t\t\t\t\t\t\tendDate.setSeconds(59);\n\t\t\t\t\t\t\t\t\t\t\t\tendDate.setMilliseconds(999);\n\n\t\t\t\t\t\t\t\t\t\t\t\tors.push({$and: [{[filter.field.replace(/\\.\\$/g, '')]: {'$gte': startDate}}, {[filter.field.replace(/\\.\\$/g, '')]: {'$lte': endDate}}]});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\tfilterArrays.push({$and: [{[filter.field.replace(/\\.\\$/g, '')]: {'$gte': filter.value}}, {[filter.field.replace(/\\.\\$/g, '')]: {'$lte': filter.highValue}}]});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (filter.condition === 'nnull') {\n\t\t\t\t\t\t\t\t\t\t\tlet and = [];\n\t\t\t\t\t\t\t\t\t\t\tand.push({[filter.field.replace(/\\.\\$/g, '')]: {'$exists': true}});\n\t\t\t\t\t\t\t\t\t\t\tand.push({[filter.field.replace(/\\.\\$/g, '')]: {'$ne': null}});\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tif (filter.fieldType === 'String') {\n\t\t\t\t\t\t\t\t\t\t\t\tand.push({[filter.field.replace(/\\.\\$/g, '')]: {'$ne': ''}});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tors.push({$and: and});\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (filter.condition === 'null') {\n\t\t\t\t\t\t\t\t\t\t\tors.push({[filter.field.replace(/\\.\\$/g, '')]: {'$eq': null}});\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\tif (Array.isArray(filter.value)) {\n\t\t\t\t\t\t\t\t\t\t\t\tif (filter.condition === 'ne') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tlet and = [];\n\t\t\t\t\t\t\t\t\t\t\t\t\tfilter.value.forEach(filt => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tand.push({[filter.field.replace(/\\.\\$/g, '')]: {['$' + filter.condition]: (Array.isArray(filt) ? filt[0] : filt)}});\n\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (and.length > 1) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tors.push({$and: and});\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tors.push(and[0]);\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\t\tlet or = [];\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\tfilter.value.forEach(filt => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tor.push({[filter.field.replace(/\\.\\$/g, '')]: {['$' + filter.condition]: (Array.isArray(filt) ? filt[0] : filt)}});\n\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (or.length > 1) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tors.push({$or: or});\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tors.push(or[0]);\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\tors.push({[filter.field.replace(/\\.\\$/g, '')]: {['$' + filter.condition]: filter.value}});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tif (ors.length) {\n\t\t\t\t\t\t\t\t\tfilterArrays.push({$or: ors});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tlet res = await this.callMethod('reportBuilderGetResults', report.type, report.collection_root, rootOptions, filters, filterArrays, filterArrayFields, report.fields_selected, report.fields_custom, report.groups_row, report.fields_total, report.fields_link, report.id_date_field || null, report.date_interval || null, report.group_type);\n\t\t\t\t\t\t\t\tif (res && res[0]) {\n\t\t\t\t\t\t\t\t\tlet results = res[0].results;\n\t\t\t\t\t\t\t\t\tlet reportTotals = res[0].totals;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tif (report.type === 'List') {\n\t\t\t\t\t\t\t\t\t\treport.fields_selected.filter(a => a.show).forEach(field => {\n\t\t\t\t\t\t\t\t\t\t\tif ((field.fieldType === 'Number' || field.leafValueType === 'Count') && field.leafFormatType === 'Number') {\n\t\t\t\t\t\t\t\t\t\t\t\tresults.filter(a => a[field.id] !== null && a[field.id] !== undefined ).forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult[field.id] = result[field.id].toLocaleString();\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\telse if ((field.fieldType === 'Number' || field.leafValueType === 'Count') && field.leafFormatType === 'String') {\n\t\t\t\t\t\t\t\t\t\t\t\tresults.filter(a => a[field.id] !== null && a[field.id] !== undefined).forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult[field.id] = result[field.id].toLocaleString('en-US', { style: 'currency', currency: 'USD' });\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\telse if ((field.fieldType === 'Number' || field.leafValueType === 'Count') && field.leafFormatType === 'Currency') {\n\t\t\t\t\t\t\t\t\t\t\t\tresults.filter(a => a[field.id] !== null && a[field.id] !== undefined).forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult[field.id] = round(result[field.id], 2).toLocaleString('en-US', { style: 'currency', currency: 'USD' });\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\telse if (field.fieldType === 'Boolean' && (!field.leafFormatType || field.leafFormatType === 'Boolean')) {\n\t\t\t\t\t\t\t\t\t\t\t\tresults.filter(a => a[field.id] !== null && a[field.id] !== undefined).forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult[field.id] = result[field.id] === true ? 'True' : 'False';\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\telse if (field.fieldType === 'Boolean' && field.leafFormatType === 'String') {\n\t\t\t\t\t\t\t\t\t\t\t\tresults.filter(a => a[field.id] !== null && a[field.id] !== undefined).forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult[field.id] = result[field.id] === true ? 'Yes' : 'No';\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\telse if (field.fieldType === 'Boolean' && field.leafFormatType === 'Boolean_Number') {\n\t\t\t\t\t\t\t\t\t\t\t\tresults.filter(a => a[field.id] !== null && a[field.id] !== undefined).forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult[field.id] = result[field.id] === true ? 1 : 0;\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\telse if (field.fieldType === 'Date' && (field.leafFormatType === 'Date')) {\n\t\t\t\t\t\t\t\t\t\t\t\tresults.filter(a => a[field.id] !== null && a[field.id] !== undefined).forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult[field.id] = moment(result[field.id]).format('L');\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\telse if (field.fieldType === 'Date' && field.leafFormatType === 'Time') {\n\t\t\t\t\t\t\t\t\t\t\t\tresults.filter(a => a[field.id] !== null && a[field.id] !== undefined).forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult[field.id] = moment(result[field.id]).format('LT');\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\telse if (field.fieldType === 'Date' && field.leafFormatType === 'DateTime') {\n\t\t\t\t\t\t\t\t\t\t\t\tresults.filter(a => a[field.id] !== null && a[field.id] !== undefined).forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult[field.id] = moment(result[field.id]).format('MM/DD/YYYY h:mm A');\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\telse if (field.fieldType === 'Date' && field.leafFormatType === 'Date_long') {\n\t\t\t\t\t\t\t\t\t\t\t\tresults.filter(a => a[field.id] !== null && a[field.id] !== undefined).forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult[field.id] = moment(result[field.id]).format('LL');\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\telse if (field.fieldType === 'Date' && field.leafFormatType === 'DateTime_long') {\n\t\t\t\t\t\t\t\t\t\t\t\tresults.filter(a => a[field.id] !== null && a[field.id] !== undefined).forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult[field.id] = moment(result[field.id]).format('LLL');\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\telse if (field.fieldType === 'Date' && field.leafFormatType === 'Timestamp') {\n\t\t\t\t\t\t\t\t\t\t\t\tresults.filter(a => a[field.id] !== null && a[field.id] !== undefined).forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult[field.id] = moment(result[field.id]).toDate().getTime();\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\tlet lines: any = [];\n\n\t\t\t\t\t\t\t\t\t\tlet tmpHeaders = {};\n\n\t\t\t\t\t\t\t\t\t\treport.groups_row.forEach(group => {\n\t\t\t\t\t\t\t\t\t\t\ttmpHeaders[group.id] = group.columnName;\n\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\treport.fields_selected.filter(a => a.show).forEach(header => {\n\t\t\t\t\t\t\t\t\t\t\ttmpHeaders[header.columnName] = header.columnName;\n\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\tlet wb = XLSX.utils.book_new();\n\n\t\t\t\t\t\t\t\t\t\tresults.forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\tlet tmp = {};\n\t\t\t\t\t\t\t\t\t\t\treport.groups_row.forEach(group => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (Array.isArray(result._id[group.id])) {\n\t\t\t\t\t\t\t\t\t\t\t\t\ttmp[group.columnName] = result._id[group.id].join(',');\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (group.treeItem.fieldType === 'Number') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmp[group.columnName] = result._id[group.id] ? (typeof(result._id[group.id]) === 'string' ? parseFloat(result._id[group.id].replace(/,/g, '').replace(/\\$/g, '')) : result._id[group.id]) : '';\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmp[group.columnName] = result._id[group.id] || '';\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\treport.fields_selected.filter(a => a.show).forEach(header => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (Array.isArray(result[header.id])) {\n\t\t\t\t\t\t\t\t\t\t\t\t\ttmp[header.columnName] = result[header.id].join(',');\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (header.fieldType === 'Number' || header.leafValueType === 'Count') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmp[header.columnName] = result[header.id] ? (typeof(result[header.id]) === 'string' ? parseFloat(result[header.id].replace(/,/g, '').replace(/\\$/g, '')) : result[header.id]) : '';\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmp[header.columnName] = result[header.id] || '';\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tlines.push(tmp);\n\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\tlet ws = XLSX.utils.json_to_sheet(lines);\n\t\t\t\t\t\t\t\t\t\tXLSX.utils.book_append_sheet(wb, ws, 'RB Data');\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tlet wbout = XLSX.write(wb, {bookType: 'xlsx', type: 'base64'});\n\n\t\t\t\t\t\t\t\t\t\tfor (let email of data['emails']) {\n\t\t\t\t\t\t\t\t\t\t\tawait this.sendEmail(email,\n\t\t\t\t\t\t\t\t\t\t\t\tthis.serverConfig['CLIENT_NAME'] + ' Scheduled Report - ' + report.report_name,\n\t\t\t\t\t\t\t\t\t\t\t\t'',\n\t\t\t\t\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t\t\t\t\t<b>` + this.serverConfig['CLIENT_NAME'] + ` Automated Report</b><br>\n\t\t\t\t\t\t\t\t\t\t\t\t<b>Report Name: </b>` + report.report_name + `<br>\n\t\t\t\t\t\t\t\t\t\t\t\t<b>Prepared By: </b>` + data['user'] + `<br><br>\n\t\t\t\t\t\t\t\t\t\t\t\tAttached are the results of this automated report.<br><br>\n\t\t\t\t\t\t\t\t\t\t\t\tResolveIO<br><br>`,\n\t\t\t\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tfilename: report.report_name + '-' + moment().format('MM-DD-YYYY-hh-mm-A') + '.xlsx',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcontent: wbout,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tencoding: 'base64'\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\t\tthis.serverConfig['MAIL_FROM_REPORTS'],\n\t\t\t\t\t\t\t\t\t\t\t\t''\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse if (report.type === 'Group') {\n\t\t\t\t\t\t\t\t\t\treport.fields_selected.filter(a => a.show).forEach(field => {\n\t\t\t\t\t\t\t\t\t\t\tresults.forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\t\tmodifyDataTypeField(report, result, field, 1);\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\tlet wb = new Excel.Workbook();\n\t\t\t\t\t\t\t\t\t\tlet ws = wb.addWorksheet('RB_1', {views: [{showGridLines: false}]});\n\t\t\t\t\t\t\t\t\t\twb.properties.date1904 = false;\n\t\t\t\t\t\t\t\t\t\twb.calcProperties.fullCalcOnLoad = true;\n\n\t\t\t\t\t\t\t\t\t\tlet currentRow = 1;\n\t\t\t\t\t\t\t\t\t\tlet row = ws.getRow(currentRow);\n\n\t\t\t\t\t\t\t\t\t\trow.getCell(2).font = {\n\t\t\t\t\t\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\t\t\t\t\t\tbold: true,\n\t\t\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\trow.getCell(4).font = {\n\t\t\t\t\t\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\trow.getCell(2).value = 'Report Name:';\n\t\t\t\t\t\t\t\t\t\trow.getCell(4).value = report.report_name;\n\n\t\t\t\t\t\t\t\t\t\tcurrentRow += 1;\n\t\t\t\t\t\t\t\t\t\trow = ws.getRow(currentRow);\n\n\t\t\t\t\t\t\t\t\t\trow.getCell(2).font = {\n\t\t\t\t\t\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\t\t\t\t\t\tbold: true,\n\t\t\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\trow.getCell(4).font = {\n\t\t\t\t\t\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\trow.getCell(2).value = 'Run Date:';\n\t\t\t\t\t\t\t\t\t\trow.getCell(4).value = moment().format('LLL');\n\n\t\t\t\t\t\t\t\t\t\tcurrentRow += 2;\n\n\t\t\t\t\t\t\t\t\t\tlet copy = deepCopy(results);\n\t\t\t\t\t\t\t\t\t\tlet widths = [];\n\t\t\t\t\t\t\t\t\t\tcopy.forEach(res => {\n\t\t\t\t\t\t\t\t\t\t\tcurrentRow = tabGroupExcelRecursive(report, ws, currentRow, 1, res);\n\t\t\t\t\t\t\t\t\t\t\ttabGroupExcelWidthRecursive(report, 1, res, widths);\n\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\tfor (let i = 1; i < ws.columns.length; i++) {\n\t\t\t\t\t\t\t\t\t\t\tws.columns[i].width = widths[i - 1];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tlet now = new Date();\n\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tlet buffer = await wb.xlsx.writeBuffer();\n\t\t\t\t\t\t\t\t\t\t\tfor (let email of data['emails']) {\n\t\t\t\t\t\t\t\t\t\t\t\tawait this.sendEmail(email,\n\t\t\t\t\t\t\t\t\t\t\t\t\tthis.serverConfig['CLIENT_NAME'] + ' Scheduled Report - ' + report.report_name,\n\t\t\t\t\t\t\t\t\t\t\t\t\t'',\n\t\t\t\t\t\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t\t\t\t\t\t<b>` + this.serverConfig['CLIENT_NAME'] + ` Automated Report</b><br>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<b>Report Name: </b>` + report.report_name + `<br>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<b>Prepared By: </b>` + data['user'] + `<br><br>\n\t\t\t\t\t\t\t\t\t\t\t\t\tAttached are the results of this automated report.<br><br>\n\t\t\t\t\t\t\t\t\t\t\t\t\tHave a great day!<br><br>\n\t\t\t\t\t\t\t\t\t\t\t\t\tResolveIO<br><br>`,\n\t\t\t\t\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfilename: 'Group_Report_' + report.report_name + '_' + now.getFullYear() + '_' + (now.getMonth() + 1) + '_' + now.getDate() + '.xlsx',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcontent: buffer\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\t\t\tthis.serverConfig['MAIL_FROM_REPORTS'],\n\t\t\t\t\t\t\t\t\t\t\t\t\t''\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tcatch (err) {\n\t\t\t\t\t\t\t\t\t\t\tconsole.log('Error writing excel export', err)\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse if (report.type === 'Dated') {\n\t\t\t\t\t\t\t\t\t\tlet datedUniqueDates = [];\n\t\t\t\t\t\t\t\t\t\tlet datedUniqueGroups = [];\n\t\t\t\t\t\t\t\t\t\tlet datedData = [];\n\t\t\t\t\t\t\t\t\t\tlet reportTotalGroups = [];\n\t\t\t\t\t\t\t\t\t\tlet reportTotalDates = [];\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t// Step 1: Handle quarterly dates if applicable\n\t\t\t\t\t\t\t\t\t\tif (report.date_interval === 'Quarterly') {\n\t\t\t\t\t\t\t\t\t\t\tresults.forEach(dataPt => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (dataPt._id.month < 4) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tdataPt._id.quarter = 1;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (dataPt._id.month < 7) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tdataPt._id.quarter = 2;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (dataPt._id.month < 10) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tdataPt._id.quarter = 3;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\t\tdataPt._id.quarter = 4;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdelete dataPt._id.month;\n\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\t\t// Deduplicate quarterly data\n\t\t\t\t\t\t\t\t\t\t\tfor (let i = results.length - 1; i >= 1; i--) {\n\t\t\t\t\t\t\t\t\t\t\t\tlet dataPt = results[i];\n\t\t\t\t\t\t\t\t\t\t\t\tif (results.filter(a => JSON.stringify(a._id) === JSON.stringify(dataPt._id)).length > 1) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tlet tmpData = results.find(a => JSON.stringify(a._id) === JSON.stringify(dataPt._id));\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tObject.keys(tmpData)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.filter(a => a !== '_id')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.forEach(key => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmpData[key] += dataPt[key];\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\tresults.splice(i, 1); // Remove the duplicate entry\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Step 2: Prepare unique groups\n\t\t\t\t\t\t\t\t\t\tlet tmpResults = deepCopy(results);\n\t\t\t\t\t\t\t\t\t\ttmpResults.forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\tdelete result._id.day;\n\t\t\t\t\t\t\t\t\t\t\tdelete result._id.week;\n\t\t\t\t\t\t\t\t\t\t\tdelete result._id.month;\n\t\t\t\t\t\t\t\t\t\t\tdelete result._id.quarter;\n\t\t\t\t\t\t\t\t\t\t\tdelete result._id.year;\n\n\t\t\t\t\t\t\t\t\t\t\tlet tmpGroup = {};\n\t\t\t\t\t\t\t\t\t\t\tObject.keys(result._id).forEach(key => {\n\t\t\t\t\t\t\t\t\t\t\t\ttmpGroup[key] = result._id[key];\n\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\t\tif (!datedUniqueGroups.find(a => JSON.stringify(a) === JSON.stringify(tmpGroup))) {\n\t\t\t\t\t\t\t\t\t\t\t\tdatedUniqueGroups.push(tmpGroup);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\t// Step 3: Prepare unique dates\n\t\t\t\t\t\t\t\t\t\ttmpResults = deepCopy(results);\n\t\t\t\t\t\t\t\t\t\ttmpResults.forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\tObject.keys(result._id)\n\t\t\t\t\t\t\t\t\t\t\t\t.filter(a => a !== 'second' && a !== 'hour' && a !== 'minute' && a !== 'day' && a !== 'week' && a !== 'month' && a !== 'quarter' && a !== 'year')\n\t\t\t\t\t\t\t\t\t\t\t\t.forEach(key => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tdelete result._id[key];\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\t\tlet tmpDate = {};\n\t\t\t\t\t\t\t\t\t\t\tObject.keys(result._id).forEach(key => {\n\t\t\t\t\t\t\t\t\t\t\t\ttmpDate[key] = result._id[key];\n\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\t\tif (!datedUniqueDates.find(a => JSON.stringify(a) === JSON.stringify(tmpDate))) {\n\t\t\t\t\t\t\t\t\t\t\t\tdatedUniqueDates.push(tmpDate);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\t// Build the date strings\n\t\t\t\t\t\t\t\t\t\t// Ensure moment is using America/Chicago timezone for all date processing\n\t\t\t\t\t\t\t\t\t\tdatedUniqueDates.forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\tif (!result.year) {\n\t\t\t\t\t\t\t\t\t\t\t\tresult.dateString = 'No Date';\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\tif (report.date_interval === 'Seconds') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult.date = moment.tz({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tyear: result.year,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmonth: result.month - 1, // Use `month - 1` since months are zero-indexed in moment as well\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tday: result.day,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\thour: result.hour,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tminute: result.minute,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsecond: result.second\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, (process.env.TZ_CLIENT || 'America/Chicago')).toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult.dateString = moment(result.date).format('MMM DD YYYY HH:mm:ss');\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (report.date_interval === 'Minutes') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult.date = moment.tz({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tyear: result.year,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmonth: result.month - 1,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tday: result.day,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\thour: result.hour,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tminute: result.minute\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, (process.env.TZ_CLIENT || 'America/Chicago')).toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult.dateString = moment(result.date).format('MMM DD YYYY HH:mm');\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (report.date_interval === 'Hours') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult.date = moment.tz({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tyear: result.year,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmonth: result.month - 1,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tday: result.day,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\thour: result.hour\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, (process.env.TZ_CLIENT || 'America/Chicago')).toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult.dateString = moment(result.date).format('MMM DD YYYY HH');\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (report.date_interval === 'Daily') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult.date = moment.tz({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tyear: result.year,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmonth: result.month - 1,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tday: result.day\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, (process.env.TZ_CLIENT || 'America/Chicago')).toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult.dateString = moment(result.date).format('MMM DD YYYY');\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (report.date_interval === 'Weekly') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult.date = moment.tz({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tyear: result.year,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tweek: result.week\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, (process.env.TZ_CLIENT || 'America/Chicago')).day('Monday').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult.dateLast = moment.tz({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tyear: result.year,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tweek: result.week\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, (process.env.TZ_CLIENT || 'America/Chicago')).day('Sunday').toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult.dateString = 'Week #' + result.week + ' ' + result.year + ' (' + moment(result.date).format('MM/DD/YY') + ' - ' + moment(result.dateLast).format('MM/DD/YY') + ')';\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (report.date_interval === 'Monthly') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult.date = moment.tz({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tyear: result.year,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmonth: result.month - 1, // Months are zero-indexed in moment\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, (process.env.TZ_CLIENT || 'America/Chicago')).toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult.dateString = moment(result.date).format('MMM YYYY');\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (report.date_interval === 'Quarterly') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult.date = moment.tz({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tyear: result.year\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, (process.env.TZ_CLIENT || 'America/Chicago')).quarter(result.quarter).toDate();;\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult.dateString = 'Q' + result.quarter + ' ' + result.year;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse if (report.date_interval === 'Yearly') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult.date = moment.tz({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tyear: result.year\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, (process.env.TZ_CLIENT || 'America/Chicago')).toDate();\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult.dateString = result.year.toString();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tdatedUniqueDates = datedUniqueDates.filter(a => !a.date)\n\t\t\t\t\t\t\t\t\t\t\t.concat(datedUniqueDates.filter(a => a.date).sort((a, b) => a.date.getTime() - b.date.getTime()));\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t// Step 4: Build datedData and reportTotalGroups\n\t\t\t\t\t\t\t\t\t\tdatedUniqueDates.forEach(date => {\n\t\t\t\t\t\t\t\t\t\t\tlet tmpData = [];\n\t\t\t\t\t\t\t\t\t\t\tlet tmpTotalDated = {};\n\t\t\t\t\t\t\t\t\t\t\tlet tmpTotalCnt = {};\n\t\t\t\t\t\t\t\t\t\t\tlet tmpTotalType = {};\n\n\t\t\t\t\t\t\t\t\t\t\tdatedUniqueGroups.forEach(group => {\n\t\t\t\t\t\t\t\t\t\t\t\tlet result = results.find(a => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tlet match = true;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t// Match the group fields\n\t\t\t\t\t\t\t\t\t\t\t\t\tObject.keys(group).forEach(key => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (a._id[key] !== group[key]) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tmatch = false;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t// Match the date fields\n\t\t\t\t\t\t\t\t\t\t\t\t\tObject.keys(date).filter(key => key !== 'date' && key !== 'dateLast' && key !== 'dateString').forEach(key => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (a._id[key] !== date[key]) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tmatch = false;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn match;\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\tif (result) {\n\t\t\t\t\t\t\t\t\t\t\t\t\ttmpData.push(result);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\tObject.keys(result._id).filter(a => a).forEach(key => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (report.fields_total.filter(a => a.fields.includes(key)).length) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (!tmpTotalDated[key]) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmpTotalDated[key] = result._id[key];\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmpTotalDated[key] += result._id[key];\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (!tmpTotalCnt[key]) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmpTotalCnt[key] = 1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmpTotalCnt[key] += 1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmpTotalType[key] = report.fields_total.find(a => a.fields.includes(key)).type;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\tObject.keys(result).filter(a => a && a !== '_id').forEach(key => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (report.fields_total.filter(a => a.fields.includes(key)).length) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (!tmpTotalDated[key]) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmpTotalDated[key] = result[key];\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmpTotalDated[key] += result[key];\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (!tmpTotalCnt[key]) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmpTotalCnt[key] = 1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmpTotalCnt[key] += 1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmpTotalType[key] = report.fields_total.find(a => a.fields.includes(key)).type;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\t\ttmpData.push(null);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\t\t// Handle averaging for totals\n\t\t\t\t\t\t\t\t\t\t\tObject.keys(tmpTotalType).forEach(totalKey => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (tmpTotalType[totalKey] === 'avg') {\n\t\t\t\t\t\t\t\t\t\t\t\t\ttmpTotalDated[totalKey] = tmpTotalDated[totalKey] / tmpTotalCnt[totalKey];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\ttmpTotalDated[totalKey] = round(tmpTotalDated[totalKey], 2);\n\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\t\treportTotalDates.push(tmpTotalDated);\n\t\t\t\t\t\t\t\t\t\t\tdatedData.push(tmpData);\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t// Calculate group-level totals\n\t\t\t\t\t\t\t\t\t\tdatedUniqueGroups.forEach(group => {\n\t\t\t\t\t\t\t\t\t\t\tlet tmpTotalGroup = {};\n\t\t\t\t\t\t\t\t\t\t\tlet filteredData = results.filter(a => {\n\t\t\t\t\t\t\t\t\t\t\t\tlet match = (!Object.keys(group).length || group._id === null) ? false : true;\n\t\t\t\t\t\t\t\t\t\t\t\tObject.keys(group).filter(a => a !== 'date' && a !== 'dateLast' && a !== 'dateString' && a !== 'second' && a !== 'minute' && a !== 'hour' && a !== 'day' && a !== 'week' && a !== 'month' && a !== 'quarter' && a !== 'year').forEach(key => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (a._id[key] !== group[key]) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmatch = false;\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\treturn match;\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\treport.fields_total.forEach(total => {\n\t\t\t\t\t\t\t\t\t\t\t\ttotal.fields.forEach(field => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (filteredData.length) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmpTotalGroup[field] = filteredData.filter(a => a && a[field])\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.map(a => a[field])\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.reduce((a, b) => a + b, 0);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (total.type === 'avg') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmpTotalGroup[field] = round(tmpTotalGroup[field] / filteredData.length, 2);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttmpTotalGroup[field] = 0;\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\t\treportTotalGroups.push(tmpTotalGroup);\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t// Step 5: Proceed with Excel generation using datedData and reportTotalGroups\n\t\t\t\t\t\t\t\t\t\tlet wb = new Excel.Workbook();\n\t\t\t\t\t\t\t\t\t\tlet ws = wb.addWorksheet('Dated_Report', {views: [{showGridLines: true}]});\n\t\t\t\t\t\t\t\t\t\twb.properties.date1904 = false;\n\t\t\t\t\t\t\t\t\t\twb.calcProperties.fullCalcOnLoad = true;\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tlet currentRow = 1;\n\t\t\t\t\t\t\t\t\t\tlet currentCol = 1;\n\t\t\t\t\t\t\t\t\t\tlet row = ws.getRow(currentRow);\n\n\t\t\t\t\t\t\t\t\t\trow.getCell(2).font = {\n\t\t\t\t\t\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\t\t\t\t\t\tbold: true,\n\t\t\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\trow.getCell(4).font = {\n\t\t\t\t\t\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\trow.getCell(2).value = 'Report Name:';\n\t\t\t\t\t\t\t\t\t\trow.getCell(4).value = report.report_name;\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tcurrentRow += 1;\n\t\t\t\t\t\t\t\t\t\trow = ws.getRow(currentRow);\n\n\t\t\t\t\t\t\t\t\t\trow.getCell(2).font = {\n\t\t\t\t\t\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\t\t\t\t\t\tbold: true,\n\t\t\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\trow.getCell(4).font = {\n\t\t\t\t\t\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\trow.getCell(2).value = 'Run Date:';\n\t\t\t\t\t\t\t\t\t\trow.getCell(4).value = moment().format('LLL');\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tcurrentRow += 2;\n\t\t\t\t\t\t\t\t\t\trow = ws.getRow(currentRow);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t// Add group column headers\n\t\t\t\t\t\t\t\t\t\treport.groups_row.forEach(group => {\n\t\t\t\t\t\t\t\t\t\t\trow.getCell(currentCol).value = group.columnName;\n\t\t\t\t\t\t\t\t\t\t\tcurrentCol++;\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t// Add field headers\n\t\t\t\t\t\t\t\t\t\tcurrentCol += report.fields_selected.filter(a => a.show).length;\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t// Add the date interval headers\n\t\t\t\t\t\t\t\t\t\treport.fields_selected.filter(a => a.show).forEach(() => {\n\t\t\t\t\t\t\t\t\t\t\tdatedUniqueDates.forEach(date => {\n\t\t\t\t\t\t\t\t\t\t\t\trow.getCell(currentCol).value = date.dateString;\n\t\t\t\t\t\t\t\t\t\t\t\tcurrentCol++;\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t// Add totals headers\n\t\t\t\t\t\t\t\t\t\treport.fields_total.forEach(total => {\n\t\t\t\t\t\t\t\t\t\t\trow.getCell(currentCol).value = 'Totals - ' + toTitleCase(total.type);\n\t\t\t\t\t\t\t\t\t\t\tcurrentCol++;\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tcurrentCol = 1;\n\t\t\t\t\t\t\t\t\t\tcurrentRow += 1;\n\t\t\t\t\t\t\t\t\t\trow = ws.getRow(currentRow);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t// Populate data for each group and field with date intervals\n\t\t\t\t\t\t\t\t\t\tfor (let i = 0; i < datedUniqueGroups.length; i++) {\n\t\t\t\t\t\t\t\t\t\t\tlet group = datedUniqueGroups[i];\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tfor (let j = 0; j < report.fields_selected.filter(a => a.show).length; j++) {\n\t\t\t\t\t\t\t\t\t\t\t\tlet field = report.fields_selected.filter(a => a.show)[j];\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\tcurrentCol = 1;\n\t\t\t\t\t\t\t\t\t\t\t\trow = ws.getRow(currentRow);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t// Populate group data\n\t\t\t\t\t\t\t\t\t\t\t\treport.groups_row.forEach(groupRow => {\n\t\t\t\t\t\t\t\t\t\t\t\t\trow.getCell(currentCol).value = (j === 0) ? group[groupRow.id] : '';\n\t\t\t\t\t\t\t\t\t\t\t\t\tcurrentCol++;\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t// Populate field data\n\t\t\t\t\t\t\t\t\t\t\t\trow.getCell(currentCol).value = field.columnName;\n\t\t\t\t\t\t\t\t\t\t\t\tcurrentCol++;\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t// Populate date interval data for each field\n\t\t\t\t\t\t\t\t\t\t\t\tfor (let k = 0; k < datedUniqueDates.length; k++) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tlet result = datedData[k];\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (result[i]) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\trow.getCell(currentCol).value = result[i][field.id] ? result[i][field.id] : '';\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\trow.getCell(currentCol).value = '';\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tcurrentCol++;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t// Add totals for each field in the report\n\t\t\t\t\t\t\t\t\t\t\t\tfor (let k = 0; k < report.fields_total.length; k++) {\n\t\t\t\t\t\t\t\t\t\t\t\t\trow.getCell(currentCol).value = reportTotalGroups[i][field.id] ? reportTotalGroups[i][field.id] : '';\n\t\t\t\t\t\t\t\t\t\t\t\t\tcurrentCol++;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\tcurrentRow++; // Move to the next row for the next field\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t// Add report totals at the bottom\n\t\t\t\t\t\t\t\t\t\tif (reportTotals) {\n\t\t\t\t\t\t\t\t\t\t\tfor (let i = 0; i < report.fields_total.length; i++) {\n\t\t\t\t\t\t\t\t\t\t\t\tlet total = report.fields_total[i];\n\t\t\t\t\t\t\t\t\t\t\t\trow = ws.getRow(currentRow);\n\t\t\t\t\t\t\t\t\t\t\t\tcurrentCol = 1;\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\trow.getCell(currentCol).value = toTitleCase(total.type) + ' Totals';\n\t\t\t\t\t\t\t\t\t\t\t\tcurrentCol += report.groups_row.length; // Skip group columns\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t// Skip the date columns for the totals row\n\t\t\t\t\t\t\t\t\t\t\t\treport.fields_selected.filter(a => a.show).forEach(() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tcurrentCol += 1;\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\t\t\tdatedUniqueDates.forEach(() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tcurrentCol++;\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t// Set totals in the correct fields\n\t\t\t\t\t\t\t\t\t\t\t\tfor (let j = 0; j < report.fields_selected.filter(a => a.show).length; j++) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tlet field = report.fields_selected.filter(a => a.show)[j];\n\t\t\t\t\t\t\t\t\t\t\t\t\trow.getCell(currentCol).value = reportTotals[total.id + '_' + field.id] || '';\n\t\t\t\t\t\t\t\t\t\t\t\t\tcurrentCol++;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\tcurrentRow++; // Move to the next row for the next total\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\t// Save the Excel file and send it via email\n\t\t\t\t\t\t\t\t\t\t\tlet buffer = await wb.xlsx.writeBuffer();\n\t\t\t\t\t\t\t\t\t\t\tfor (let email of data['emails']) {\n\t\t\t\t\t\t\t\t\t\t\t\tawait this.sendEmail(\n\t\t\t\t\t\t\t\t\t\t\t\t\temail,\n\t\t\t\t\t\t\t\t\t\t\t\t\tthis.serverConfig['CLIENT_NAME'] + ' Scheduled Report - ' + report.report_name,\n\t\t\t\t\t\t\t\t\t\t\t\t\t'',\n\t\t\t\t\t\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t\t\t\t\t\t<b>${this.serverConfig['CLIENT_NAME']} Automated Report</b><br>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<b>Report Name: </b>${report.report_name}<br>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<b>Prepared By: </b>${data['user']}<br><br>\n\t\t\t\t\t\t\t\t\t\t\t\t\tAttached are the results of this automated report.<br><br>\n\t\t\t\t\t\t\t\t\t\t\t\t\tResolveIO<br><br>`,\n\t\t\t\t\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfilename: report.report_name + '-' + moment().format('MM-DD-YYYY-hh-mm-A') + '.xlsx',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcontent: buffer\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\t\t\tthis.serverConfig['MAIL_FROM_REPORTS'],\n\t\t\t\t\t\t\t\t\t\t\t\t\t''\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tcatch (err) {\n\t\t\t\t\t\t\t\t\t\t\tconsole.log('Error writing excel export', err)\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcatch (err) {\n\t\t\t\t\t\t\t\tthrow err;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcatch(err) {\n\t\t\t\t\t\terr.message = `Error in Report Builder Cron Job - Report Builder Build Tree: ${err.message}`;\n\t\t\t\t\t\tthrow err;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction getTreeLeaves(items, resArray, allowLookups = false) {\n\titems.forEach(item => {\n\t\tif (item.isLeaf) {\n\t\t\tresArray.push(item);\n\t\t}\n\t\telse {\n\t\t\tif (!item.lookup_collection || allowLookups) {\n\t\t\t\tgetTreeLeaves(item.children, resArray, allowLookups);\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction modifyDataTypeField(report, result, field, index) {\n\tconst processFieldValue = (value, field) => {\n\t\tif (value === undefined || value === null) {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (field.fieldType === 'Boolean') {\n\t\t\tif (!field.leafFormatType || field.leafFormatType === 'Boolean') {\n\t\t\t\treturn value === true ? 'True' : 'False';\n\t\t\t}\n\t\t\telse if (field.leafFormatType === 'String') {\n\t\t\t\treturn value === true ? 'Yes' : 'No';\n\t\t\t}\n\t\t\telse if (field.leafFormatType === 'Boolean_Number') {\n\t\t\t\treturn value === true ? 1 : 0;\n\t\t\t}\n\t\t}\n\t\telse if (field.fieldType === 'Number' || field.leafValueType === 'Count') {\n\t\t\tif (field.leafFormatType === 'Number') {\n\t\t\t\treturn value.toLocaleString();\n\t\t\t}\n\t\t\telse if (field.leafFormatType === 'String') {\n\t\t\t\treturn value.toString();\n\t\t\t}\n\t\t\telse if (field.leafFormatType === 'Currency') {\n\t\t\t\treturn round(value, 2).toLocaleString('en-US', { style: 'currency', currency: 'USD' });\n\t\t\t}\n\t\t}\n\t\telse if (field.fieldType === 'Date') {\n\t\t\tswitch (field.leafFormatType) {\n\t\t\t\tcase 'Date':\n\t\t\t\t\treturn moment(value).format('L');\n\t\t\t\tcase 'Time':\n\t\t\t\t\treturn moment(value).format('LT');\n\t\t\t\tcase 'DateTime':\n\t\t\t\t\treturn moment(value).format('MM/DD/YYYY h:mm A');\n\t\t\t\tcase 'Date_long':\n\t\t\t\t\treturn moment(value).format('LL');\n\t\t\t\tcase 'DateTime_long':\n\t\t\t\t\treturn moment(value).format('LLL');\n\t\t\t\tcase 'Timestamp':\n\t\t\t\t\treturn moment(value).toDate().getTime();\n\t\t\t\tdefault:\n\t\t\t\t\treturn value;\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t};\n\n\tconst processArrayField = (array, field) => {\n\t\treturn array.map(value => processFieldValue(value, field));\n\t};\n\n\tif (index < report.groups_row.length) {\n\t\t// Handle grouped data\n\t\tconst groupKey = 'gr_' + (index + 1);\n\t\tif (result[groupKey]) {\n\t\t\tresult[groupKey].forEach(subResult => {\n\t\t\t\tmodifyDataTypeField(report, subResult, field, index + 1);\n\t\t\t});\n\t\t}\n\t}\n\telse {\n\t\t// Process final-level fields\n\t\tif (Array.isArray(result[field.id])) {\n\t\t\tresult[field.id] = processArrayField(result[field.id], field);\n\t\t}\n\t\telse {\n\t\t\tresult[field.id] = processFieldValue(result[field.id], field);\n\t\t}\n\t}\n}\n\nfunction tabGroupExcelRecursive(report, ws: Excel.Worksheet, currentRow, level, result) {\n\tlet row = ws.getRow(currentRow);\n\n\tif (level < report.groups_row.length) {\n\t\trow.getCell(2).fill = {\n\t\t\tfgColor: {argb: report.groups_row[level - 1].fill_color ? report.groups_row[level - 1].fill_color.replace('#', '') : 'ffffff'},\n\t\t\ttype: 'pattern',\n\t\t\tpattern: 'solid'\n\t\t};\n\t\trow.getCell(2).font = {\n\t\t\tcolor: {argb: report.groups_row[level - 1].font_color ? report.groups_row[level - 1].font_color.replace('#', '') : '000000'},\n\t\t\tname: 'Arial',\n\t\t\tbold: true,\n\t\t\tsize: 14\n\t\t};\n\n\t\trow.getCell(2).value = report.groups_row[level - 1].columnName + ': ' + result._id['gr_' + level];\n\t\tws.mergeCells(row.getCell(2).$col$row + ':' + row.getCell(report.fields_selected.filter(a => a.show).length + 1).$col$row);\n\t\t\n\t\trow.getCell(2).border = {\n\t\t\ttop: {style:'thick'},\n\t\t\tleft: {style:'thick'},\n\t\t\tright: {style: 'thick'}\n\t\t};\n\n\t\tif (report.fields_total.length) {\n\t\t\treport.fields_total.forEach(total => {\n\t\t\t\tcurrentRow += 1;\n\t\t\t\trow = ws.getRow(currentRow);\n\n\t\t\t\treport.fields_selected.filter(a => a.show).forEach((field, fieldIndex) => {\n\t\t\t\t\tif (total.fields.includes(field.id)) {\n\t\t\t\t\t\trow.getCell(fieldIndex + 2).value = field.columnName;\n\n\t\t\t\t\t\trow.getCell(fieldIndex + 2).font = {\n\t\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\t\tbold: true,\n\t\t\t\t\t\t\tsize: 10\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tif (field.leafFormatType === 'Currency') {\n\t\t\t\t\t\trow.getCell(fieldIndex + 2).numFmt = '\"$\"#,##0.00';\n\t\t\t\t\t}\n\t\t\t\t\telse if (field.leafFormatType === 'Number') {\n\t\t\t\t\t\trow.getCell(fieldIndex + 2).numFmt = '#,##0';\n\t\t\t\t\t}\n\n\t\t\t\t\tif (fieldIndex === 0) {\n\t\t\t\t\t\trow.getCell(fieldIndex + 2).border = {\n\t\t\t\t\t\t\tleft: {style:'thick'}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\telse if (fieldIndex === report.fields_selected.filter(a => a.show).length - 1) {\n\t\t\t\t\t\trow.getCell(fieldIndex + 2).border = {\n\t\t\t\t\t\t\tright: {style:'thick'}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t\t\n\t\t// Totals\n\t\treport.fields_total.forEach(total => {\n\t\t\tcurrentRow += 1;\n\t\t\trow = ws.getRow(currentRow);\n\n\t\t\treport.fields_selected.filter(a => a.show).forEach((field, fieldIndex) => {\n\t\t\t\tif (total.fields.includes(field.id)) {\n\t\t\t\t\trow.getCell(fieldIndex + 2).value = result[total.id + '_' + field.id];\n\n\t\t\t\t\trow.getCell(fieldIndex + 2).font = {\n\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\tbold: true,\n\t\t\t\t\t\tsize: 10\n\t\t\t\t\t};\n\n\t\t\t\t\tif (field.leafFormatType === 'Currency') {\n\t\t\t\t\t\trow.getCell(fieldIndex + 2).numFmt = '\"$\"#,##0.00';\n\t\t\t\t\t}\n\t\t\t\t\telse if (field.leafFormatType === 'Number') {\n\t\t\t\t\t\trow.getCell(fieldIndex + 2).numFmt = '#,##0';\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (fieldIndex === 0) {\n\t\t\t\t\trow.getCell(fieldIndex + 2).border = {\n\t\t\t\t\t\ttop: {style:'thin'},\n\t\t\t\t\t\tleft: {style:'thick'},\n\t\t\t\t\t\tbottom: {style:'thick'}\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse if (fieldIndex === report.fields_selected.filter(a => a.show).length - 1) {\n\t\t\t\t\trow.getCell(fieldIndex + 2).border = {\n\t\t\t\t\t\ttop: {style:'thin'},\n\t\t\t\t\t\tbottom: {style:'thick'},\n\t\t\t\t\t\tright: {style:'thick'}\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\trow.getCell(fieldIndex + 2).border = {\n\t\t\t\t\t\ttop: {style:'thin'},\n\t\t\t\t\t\tbottom: {style:'thick'}\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\t\n\t\tcurrentRow += 1;\n\n\t\tresult = result['gr_' + (level + 1)];\n\t\tresult.forEach(tDataRes => {\n\t\t\tcurrentRow = tabGroupExcelRecursive(report, ws, currentRow, level + 1, tDataRes);\n\t\t});\n\t}\n\telse {\n\t\trow.getCell(2).fill = {\n\t\t\tfgColor: {argb: report.groups_row[level - 1].fill_color ? report.groups_row[level - 1].fill_color.replace('#', '') : 'ffffff'},\n\t\t\ttype: 'pattern',\n\t\t\tpattern: 'solid'\n\t\t};\n\t\trow.getCell(2).font = {\n\t\t\tcolor: {argb: report.groups_row[level - 1].font_color ? report.groups_row[level - 1].font_color.replace('#', '') : '000000'},\n\t\t\tname: 'Arial',\n\t\t\tbold: true,\n\t\t\tsize: 12\n\t\t};\n\n\t\trow.getCell(2).value = report.groups_row[level - 1].columnName + ': ' + result._id['gr_' + level];\n\t\tws.mergeCells(row.getCell(2).$col$row + ':' + row.getCell(report.fields_selected.filter(a => a.show).length + 1).$col$row);\n\n\t\trow.getCell(2).border = {\n\t\t\ttop: {style:'thick'},\n\t\t\tleft: {style:'thick'},\n\t\t\tright: {style: 'thick'}\n\t\t};\n\n\t\tcurrentRow += 1;\n\t\trow = ws.getRow(currentRow);\n\t\t// Headers\n\t\treport.fields_selected.filter(a => a.show).forEach((field, fieldIndex) => {\n\t\t\trow.getCell(fieldIndex + 2).value = field.columnName;\n\t\t\trow.getCell(fieldIndex + 2).font = {\n\t\t\t\tname: 'Arial',\n\t\t\t\tbold: true,\n\t\t\t\tsize: 10\n\t\t\t};\n\n\t\t\tif (field.leafFormatType === 'Currency') {\n\t\t\t\trow.getCell(fieldIndex + 2).numFmt = '\"$\"#,##0.00';\n\t\t\t}\n\t\t\telse if (field.leafFormatType === 'Number') {\n\t\t\t\trow.getCell(fieldIndex + 2).numFmt = '#,##0';\n\t\t\t}\n\n\t\t\tif (fieldIndex === 0) {\n\t\t\t\trow.getCell(fieldIndex + 2).border = {\n\t\t\t\t\tleft: {style:'thick'}\n\t\t\t\t};\n\t\t\t}\n\t\t\telse if (fieldIndex === report.fields_selected.filter(a => a.show).length - 1) {\n\t\t\t\trow.getCell(fieldIndex + 2).border = {\n\t\t\t\t\tright: {style:'thick'}\n\t\t\t\t};\n\t\t\t}\n\t\t});\n\n\t\t// Data\n\t\tresult['f_0'].forEach((res, resIndex) => {\n\t\t\tcurrentRow += 1;\n\t\t\trow = ws.getRow(currentRow);\n\n\t\t\treport.fields_selected.filter(a => a.show).forEach((field, fieldIndex) => {\n\t\t\t\tif (field.fieldType === 'Number' && typeof(result[field.id][resIndex]) === 'string' && result[field.id][resIndex]) {\n\t\t\t\t\trow.getCell(fieldIndex + 2).value = parseFloat(result[field.id][resIndex].replace(new RegExp(/\\,/g), '').replace(new RegExp(/\\$/g), ''));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\trow.getCell(fieldIndex + 2).value = result[field.id][resIndex];\n\t\t\t\t}\n\n\t\t\t\tif (field.leafFormatType === 'Currency') {\n\t\t\t\t\trow.getCell(fieldIndex + 2).numFmt = '\"$\"#,##0.00';\n\t\t\t\t}\n\t\t\t\telse if (field.leafFormatType === 'Number') {\n\t\t\t\t\trow.getCell(fieldIndex + 2).numFmt = '#,##0';\n\t\t\t\t}\n\n\t\t\t\trow.getCell(fieldIndex + 2).font = {\n\t\t\t\t\tname: 'Arial',\n\t\t\t\t\tsize: 10\n\t\t\t\t};\n\n\t\t\t\tif (fieldIndex === 0) {\n\t\t\t\t\trow.getCell(fieldIndex + 2).border = {\n\t\t\t\t\t\tleft: {style:'thick'}\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse if (fieldIndex === report.fields_selected.filter(a => a.show).length - 1) {\n\t\t\t\t\trow.getCell(fieldIndex + 2).border = {\n\t\t\t\t\t\tright: {style:'thick'}\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\t\n\t\t// Totals\n\t\treport.fields_total.forEach(total => {\n\t\t\tcurrentRow += 1;\n\t\t\trow = ws.getRow(currentRow);\n\n\t\t\treport.fields_selected.filter(a => a.show).forEach((field, fieldIndex) => {\n\t\t\t\tif (total.fields.includes(field.id)) {\n\t\t\t\t\trow.getCell(fieldIndex + 2).value = result[total.id + '_' + field.id];\n\n\t\t\t\t\trow.getCell(fieldIndex + 2).font = {\n\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\tbold: true,\n\t\t\t\t\t\tsize: 10\n\t\t\t\t\t};\n\n\t\t\t\t\tif (field.leafFormatType === 'Currency') {\n\t\t\t\t\t\trow.getCell(fieldIndex + 2).numFmt = '\"$\"#,##0.00';\n\t\t\t\t\t}\n\t\t\t\t\telse if (field.leafFormatType === 'Number') {\n\t\t\t\t\t\trow.getCell(fieldIndex + 2).numFmt = '#,##0';\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (fieldIndex === 0) {\n\t\t\t\t\trow.getCell(fieldIndex + 2).border = {\n\t\t\t\t\t\ttop: {style:'thin'},\n\t\t\t\t\t\tleft: {style:'thick'},\n\t\t\t\t\t\tbottom: {style:'thick'}\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse if (fieldIndex === report.fields_selected.filter(a => a.show).length - 1) {\n\t\t\t\t\trow.getCell(fieldIndex + 2).border = {\n\t\t\t\t\t\ttop: {style:'thin'},\n\t\t\t\t\t\tbottom: {style:'thick'},\n\t\t\t\t\t\tright: {style:'thick'}\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\trow.getCell(fieldIndex + 2).border = {\n\t\t\t\t\t\ttop: {style:'thin'},\n\t\t\t\t\t\tbottom: {style:'thick'}\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\treturn currentRow + 1;\n}\n\nfunction tabGroupExcelWidthRecursive(report, level, result, cols) {\n\tif (level < report.groups_row.length) {\n\t\tresult = result['gr_' + (level + 1)];\n\t\tresult.forEach(tDataRes => {\n\t\t\tcols = tabGroupExcelWidthRecursive(report, level + 1, tDataRes, cols);\n\t\t});\n\t}\n\telse {\n\t\treport.fields_selected.filter(a => a.show).forEach((field, fieldIndex) => {\n\t\t\tif (Array.isArray(result[field.id])) {\n\t\t\t\tresult[field.id].forEach(res => {\n\t\t\t\t\tlet length = 10;\n\n\t\t\t\t\tif (res) {\n\t\t\t\t\t\tlength = res.length + 3;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!cols[fieldIndex]) {\n\t\t\t\t\t\tcols[fieldIndex] = Math.max(10, field.columnName.length);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (length > cols[fieldIndex]) {\n\t\t\t\t\t\tcols[fieldIndex] = length;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet res = result[field.id];\n\n\t\t\t\tif (res) {\n\t\t\t\t\tlength = res.length + 3;\n\t\t\t\t}\n\n\t\t\t\tif (!cols[fieldIndex]) {\n\t\t\t\t\tcols[fieldIndex] = Math.max(10, field.columnName.length);\n\t\t\t\t}\n\n\t\t\t\tif (length > cols[fieldIndex]) {\n\t\t\t\t\tcols[fieldIndex] = length;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\treturn cols;\n}"]}
|