@resolveio/server-lib 20.4.76 → 20.4.78
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/worker-task-request.collection.js +1 -1
- package/collections/worker-task-request.collection.js.map +1 -1
- package/collections/worker-task-response.collection.js +1 -1
- package/collections/worker-task-response.collection.js.map +1 -1
- package/managers/websocket.manager.js +1 -1
- package/managers/websocket.manager.js.map +1 -1
- package/methods/accounts.js +1 -1
- package/methods/accounts.js.map +1 -1
- package/methods/cron-jobs.js +1 -1
- package/methods/cron-jobs.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.WorkerTaskRequests=void 0;var index_1=require("../index"),mongo_manager_1=require("../managers/mongo.manager"),simpl_schema_1=require("simpl-schema"),schema={_id:{type:String,optional:!0},__v:{type:Number,optional:!0},updatedAt:{type:Date,optional:!0},createdAt:{type:Date,optional:!0},method:{type:String},params:{type:Array},"params.$":{type:simpl_schema_1.default.oneOf(Object,String,Number,Boolean,Date),blackbox:!0},status:{type:String},id_user:{type:String},user:{type:String},id_ws:{type:String}};function initializeCollection(){var e;index_1.ResolveIOServer&&index_1.ResolveIOServer.getMainDB()?(e=new mongo_manager_1.MongoManagerModel({collectionName:"worker-task-requests",schema:schema,useVersionCollection:!1,useReportBuilder:!1,reportBuilderLookupTables:[],timestamps:!0,createLogs:!1,checkSchema:!1,collectionOptions:null}),exports.WorkerTaskRequests=e.collection_main,exports.WorkerTaskRequests.createIndex({createdAt:1},{expireAfterSeconds:
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.WorkerTaskRequests=void 0;var index_1=require("../index"),mongo_manager_1=require("../managers/mongo.manager"),simpl_schema_1=require("simpl-schema"),schema={_id:{type:String,optional:!0},__v:{type:Number,optional:!0},updatedAt:{type:Date,optional:!0},createdAt:{type:Date,optional:!0},method:{type:String},params:{type:Array},"params.$":{type:simpl_schema_1.default.oneOf(Object,String,Number,Boolean,Date),blackbox:!0},status:{type:String},id_user:{type:String},user:{type:String},id_ws:{type:String}};function initializeCollection(){var e;index_1.ResolveIOServer&&index_1.ResolveIOServer.getMainDB()?(e=new mongo_manager_1.MongoManagerModel({collectionName:"worker-task-requests",schema:schema,useVersionCollection:!1,useReportBuilder:!1,reportBuilderLookupTables:[],timestamps:!0,createLogs:!1,checkSchema:!1,collectionOptions:null}),exports.WorkerTaskRequests=e.collection_main,exports.WorkerTaskRequests.createIndex({createdAt:1},{expireAfterSeconds:1296e3}),exports.WorkerTaskRequests.createIndex({status:1,createdAt:1}),exports.WorkerTaskRequests.createIndex({_id:1,status:1}),exports.WorkerTaskRequests.createIndex({user:1,createdAt:-1})):setTimeout(function(){initializeCollection()},0)}exports.WorkerTaskRequests=null,initializeCollection();
|
|
2
2
|
//# sourceMappingURL=worker-task-request.collection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/collections/worker-task-request.collection.ts"],"names":["index_1","require","mongo_manager_1","simpl_schema_1","schema","_id","type","String","optional","__v","Number","updatedAt","Date","createdAt","method","params","Array","params.$","default","oneOf","Object","Boolean","blackbox","status","id_user","user","id_ws","initializeCollection","model","ResolveIOServer","getMainDB","MongoManagerModel","collectionName","useVersionCollection","useReportBuilder","reportBuilderLookupTables","timestamps","createLogs","checkSchema","collectionOptions","exports","WorkerTaskRequests","collection_main","createIndex","expireAfterSeconds","setTimeout"],"mappings":"sGACA,IAAAA,QAAAC,QAAA,UAAA,EACAC,gBAAAD,QAAA,2BAAA,EACAE,eAAAF,QAAA,cAAA,EAEIG,OAAc,CACjBC,IAAK,CACJC,KAAMC,OACNC,SAAU,CAAA,C,EAEXC,IAAK,CACJH,KAAMI,OACNF,SAAU,CAAA,C,EAEXG,UAAW,CACVL,KAAMM,KACNJ,SAAU,CAAA,C,EAEXK,UAAW,CACVP,KAAMM,KACNJ,SAAU,CAAA,C,EAEXM,OAAQ,CACPR,KAAMC,M,EAEPQ,OAAQ,CACPT,KAAMU,K,EAEPC,WAAY,CACXX,KAAMH,eAAAe,QAAaC,MAAMC,OAAQb,OAAQG,OAAQW,QAAST,IAAI,EAC9DU,SAAU,CAAA,C,EAEXC,OAAQ,CACPjB,KAAMC,M,EAEPiB,QAAS,CACRlB,KAAMC,M,EAEPkB,KAAM,CACLnB,KAAMC,M,EAEPmB,MAAO,CACNpB,KAAMC,M,GAQR,SAASoB,uBACR,IACOC,EADH5B,QAAA6B,iBAAmB7B,QAAA6B,gBAAgBC,UAAS,GACzCF,EAAQ,IAAI1B,gBAAA6B,kBAA0C,CAC3DC,eAAgB,uBAChB5B,OAAQA,OACR6B,qBAAsB,CAAA,EACtBC,iBAAkB,CAAA,EAClBC,0BAA2B,GAC3BC,WAAY,CAAA,EACZC,WAAY,CAAA,EACZC,YAAa,CAAA,EACbC,kBAAmB,I,CACnB,EACDC,QAAAC,mBAAqBb,EAAMc,gBAC3BF,QAAAC,mBAAmBE,YAAY,CAAC9B,UAAW,CAAC,EAAG,CAAC+B,mBAAoB,MAAiB,CAAC,EACtFJ,QAAAC,mBAAmBE,YAAY,CAACpB,OAAQ,EAAGV,UAAW,CAAC,CAAC,EACxD2B,QAAAC,mBAAmBE,YAAY,CAACtC,IAAK,EAAGkB,OAAQ,CAAC,CAAC,EAClDiB,QAAAC,mBAAmBE,YAAY,CAAClB,KAAM,EAAGZ,UAAW,CAAC,CAAC,CAAC,GAGvDgC,WAAW,WACVlB,qBAAoB,CACrB,EAAG,CAAC,CAEN,CA5BWa,QAAAC,mBAAqE,KAEhFd,qBAAoB","file":"worker-task-request.collection.js","sourcesContent":["import { WorkerTaskRequestModel } from '../models/worker-task-request.model';\nimport { ResolveIOServer } from '../index';\nimport { MongoManagerCollection, MongoManagerModel } from '../managers/mongo.manager';\nimport SimpleSchema from 'simpl-schema';\n\nlet schema: any = {\n\t_id: {\n\t\ttype: String,\n\t\toptional: true\n\t},\n\t__v: {\n\t\ttype: Number,\n\t\toptional: true\n\t},\n\tupdatedAt: {\n\t\ttype: Date,\n\t\toptional: true\n\t},\n\tcreatedAt: {\n\t\ttype: Date,\n\t\toptional: true\n\t},\n\tmethod: {\n\t\ttype: String\n\t},\n\tparams: {\n\t\ttype: Array, // Declaring params as an array\n\t},\n\t'params.$': {\n\t\ttype: SimpleSchema.oneOf(Object, String, Number, Boolean, Date), // Allowing multiple types\n\t\tblackbox: true // Blackbox for the object type\n\t},\n\tstatus: {\n\t\ttype: String\n\t},\n\tid_user: {\n\t\ttype: String\n\t},\n\tuser: {\n\t\ttype: String\n\t},\n\tid_ws: {\n\t\ttype: String\n\t}\n};\n\nexport let WorkerTaskRequests: MongoManagerCollection<WorkerTaskRequestModel> = null;\n\ninitializeCollection();\n\nfunction initializeCollection() {\n\tif (ResolveIOServer && ResolveIOServer.getMainDB()) {\n\t\tconst model = new MongoManagerModel<WorkerTaskRequestModel>({\n\t\t\tcollectionName: 'worker-task-requests',\n\t\t\tschema: schema,\n\t\t\tuseVersionCollection: false,\n\t\t\tuseReportBuilder: false,\n\t\t\treportBuilderLookupTables: [],\n\t\t\ttimestamps: true,\n\t\t\tcreateLogs: false,\n\t\t\tcheckSchema: false,\n\t\t\tcollectionOptions: null\n\t\t});\n\t\tWorkerTaskRequests = model.collection_main;\n\t\tWorkerTaskRequests.createIndex({createdAt: 1}, {expireAfterSeconds: 60 * 60 * 24 *
|
|
1
|
+
{"version":3,"sources":["../../src/collections/worker-task-request.collection.ts"],"names":["index_1","require","mongo_manager_1","simpl_schema_1","schema","_id","type","String","optional","__v","Number","updatedAt","Date","createdAt","method","params","Array","params.$","default","oneOf","Object","Boolean","blackbox","status","id_user","user","id_ws","initializeCollection","model","ResolveIOServer","getMainDB","MongoManagerModel","collectionName","useVersionCollection","useReportBuilder","reportBuilderLookupTables","timestamps","createLogs","checkSchema","collectionOptions","exports","WorkerTaskRequests","collection_main","createIndex","expireAfterSeconds","setTimeout"],"mappings":"sGACA,IAAAA,QAAAC,QAAA,UAAA,EACAC,gBAAAD,QAAA,2BAAA,EACAE,eAAAF,QAAA,cAAA,EAEIG,OAAc,CACjBC,IAAK,CACJC,KAAMC,OACNC,SAAU,CAAA,C,EAEXC,IAAK,CACJH,KAAMI,OACNF,SAAU,CAAA,C,EAEXG,UAAW,CACVL,KAAMM,KACNJ,SAAU,CAAA,C,EAEXK,UAAW,CACVP,KAAMM,KACNJ,SAAU,CAAA,C,EAEXM,OAAQ,CACPR,KAAMC,M,EAEPQ,OAAQ,CACPT,KAAMU,K,EAEPC,WAAY,CACXX,KAAMH,eAAAe,QAAaC,MAAMC,OAAQb,OAAQG,OAAQW,QAAST,IAAI,EAC9DU,SAAU,CAAA,C,EAEXC,OAAQ,CACPjB,KAAMC,M,EAEPiB,QAAS,CACRlB,KAAMC,M,EAEPkB,KAAM,CACLnB,KAAMC,M,EAEPmB,MAAO,CACNpB,KAAMC,M,GAQR,SAASoB,uBACR,IACOC,EADH5B,QAAA6B,iBAAmB7B,QAAA6B,gBAAgBC,UAAS,GACzCF,EAAQ,IAAI1B,gBAAA6B,kBAA0C,CAC3DC,eAAgB,uBAChB5B,OAAQA,OACR6B,qBAAsB,CAAA,EACtBC,iBAAkB,CAAA,EAClBC,0BAA2B,GAC3BC,WAAY,CAAA,EACZC,WAAY,CAAA,EACZC,YAAa,CAAA,EACbC,kBAAmB,I,CACnB,EACDC,QAAAC,mBAAqBb,EAAMc,gBAC3BF,QAAAC,mBAAmBE,YAAY,CAAC9B,UAAW,CAAC,EAAG,CAAC+B,mBAAoB,MAAiB,CAAC,EACtFJ,QAAAC,mBAAmBE,YAAY,CAACpB,OAAQ,EAAGV,UAAW,CAAC,CAAC,EACxD2B,QAAAC,mBAAmBE,YAAY,CAACtC,IAAK,EAAGkB,OAAQ,CAAC,CAAC,EAClDiB,QAAAC,mBAAmBE,YAAY,CAAClB,KAAM,EAAGZ,UAAW,CAAC,CAAC,CAAC,GAGvDgC,WAAW,WACVlB,qBAAoB,CACrB,EAAG,CAAC,CAEN,CA5BWa,QAAAC,mBAAqE,KAEhFd,qBAAoB","file":"worker-task-request.collection.js","sourcesContent":["import { WorkerTaskRequestModel } from '../models/worker-task-request.model';\nimport { ResolveIOServer } from '../index';\nimport { MongoManagerCollection, MongoManagerModel } from '../managers/mongo.manager';\nimport SimpleSchema from 'simpl-schema';\n\nlet schema: any = {\n\t_id: {\n\t\ttype: String,\n\t\toptional: true\n\t},\n\t__v: {\n\t\ttype: Number,\n\t\toptional: true\n\t},\n\tupdatedAt: {\n\t\ttype: Date,\n\t\toptional: true\n\t},\n\tcreatedAt: {\n\t\ttype: Date,\n\t\toptional: true\n\t},\n\tmethod: {\n\t\ttype: String\n\t},\n\tparams: {\n\t\ttype: Array, // Declaring params as an array\n\t},\n\t'params.$': {\n\t\ttype: SimpleSchema.oneOf(Object, String, Number, Boolean, Date), // Allowing multiple types\n\t\tblackbox: true // Blackbox for the object type\n\t},\n\tstatus: {\n\t\ttype: String\n\t},\n\tid_user: {\n\t\ttype: String\n\t},\n\tuser: {\n\t\ttype: String\n\t},\n\tid_ws: {\n\t\ttype: String\n\t}\n};\n\nexport let WorkerTaskRequests: MongoManagerCollection<WorkerTaskRequestModel> = null;\n\ninitializeCollection();\n\nfunction initializeCollection() {\n\tif (ResolveIOServer && ResolveIOServer.getMainDB()) {\n\t\tconst model = new MongoManagerModel<WorkerTaskRequestModel>({\n\t\t\tcollectionName: 'worker-task-requests',\n\t\t\tschema: schema,\n\t\t\tuseVersionCollection: false,\n\t\t\tuseReportBuilder: false,\n\t\t\treportBuilderLookupTables: [],\n\t\t\ttimestamps: true,\n\t\t\tcreateLogs: false,\n\t\t\tcheckSchema: false,\n\t\t\tcollectionOptions: null\n\t\t});\n\t\tWorkerTaskRequests = model.collection_main;\n\t\tWorkerTaskRequests.createIndex({createdAt: 1}, {expireAfterSeconds: 60 * 60 * 24 * 15});\n\t\tWorkerTaskRequests.createIndex({status: 1, createdAt: 1});\n\t\tWorkerTaskRequests.createIndex({_id: 1, status: 1});\n\t\tWorkerTaskRequests.createIndex({user: 1, createdAt: -1});\n\t}\n\telse {\n\t\tsetTimeout(() => {\n\t\t\tinitializeCollection();\n\t\t}, 0);\n\t}\n}"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.WorkerTaskResponses=void 0;var index_1=require("../index"),mongo_manager_1=require("../managers/mongo.manager"),simpl_schema_1=require("simpl-schema"),schema={_id:{type:String,optional:!0},__v:{type:Number,optional:!0},updatedAt:{type:Date,optional:!0},createdAt:{type:Date,optional:!0},id_request:{type:String},data:{type:Array},"data.$":{type:simpl_schema_1.default.oneOf(Object,String,Number,Boolean,Date),blackbox:!0},id_user:{type:String},user:{type:String},id_ws:{type:String}};function initializeCollection(){var e;index_1.ResolveIOServer&&index_1.ResolveIOServer.getMainDB()?(e=new mongo_manager_1.MongoManagerModel({collectionName:"worker-task-responses",schema:schema,useVersionCollection:!1,useReportBuilder:!1,reportBuilderLookupTables:[],timestamps:!0,createLogs:!1,checkSchema:!1,collectionOptions:null}),exports.WorkerTaskResponses=e.collection_main,exports.WorkerTaskResponses.createIndex({createdAt:1},{expireAfterSeconds:
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.WorkerTaskResponses=void 0;var index_1=require("../index"),mongo_manager_1=require("../managers/mongo.manager"),simpl_schema_1=require("simpl-schema"),schema={_id:{type:String,optional:!0},__v:{type:Number,optional:!0},updatedAt:{type:Date,optional:!0},createdAt:{type:Date,optional:!0},id_request:{type:String},data:{type:Array},"data.$":{type:simpl_schema_1.default.oneOf(Object,String,Number,Boolean,Date),blackbox:!0},id_user:{type:String},user:{type:String},id_ws:{type:String}};function initializeCollection(){var e;index_1.ResolveIOServer&&index_1.ResolveIOServer.getMainDB()?(e=new mongo_manager_1.MongoManagerModel({collectionName:"worker-task-responses",schema:schema,useVersionCollection:!1,useReportBuilder:!1,reportBuilderLookupTables:[],timestamps:!0,createLogs:!1,checkSchema:!1,collectionOptions:null}),exports.WorkerTaskResponses=e.collection_main,exports.WorkerTaskResponses.createIndex({createdAt:1},{expireAfterSeconds:1296e3}),exports.WorkerTaskResponses.createIndex({id_request:1})):setTimeout(function(){initializeCollection()},0)}exports.WorkerTaskResponses=null,initializeCollection();
|
|
2
2
|
//# sourceMappingURL=worker-task-response.collection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/collections/worker-task-response.collection.ts"],"names":["index_1","require","mongo_manager_1","simpl_schema_1","schema","_id","type","String","optional","__v","Number","updatedAt","Date","createdAt","id_request","data","Array","data.$","default","oneOf","Object","Boolean","blackbox","id_user","user","id_ws","initializeCollection","model","ResolveIOServer","getMainDB","MongoManagerModel","collectionName","useVersionCollection","useReportBuilder","reportBuilderLookupTables","timestamps","createLogs","checkSchema","collectionOptions","exports","WorkerTaskResponses","collection_main","createIndex","expireAfterSeconds","setTimeout"],"mappings":"uGACA,IAAAA,QAAAC,QAAA,UAAA,EACAC,gBAAAD,QAAA,2BAAA,EACAE,eAAAF,QAAA,cAAA,EAEIG,OAAc,CACjBC,IAAK,CACJC,KAAMC,OACNC,SAAU,CAAA,C,EAEXC,IAAK,CACJH,KAAMI,OACNF,SAAU,CAAA,C,EAEXG,UAAW,CACVL,KAAMM,KACNJ,SAAU,CAAA,C,EAEXK,UAAW,CACVP,KAAMM,KACNJ,SAAU,CAAA,C,EAEXM,WAAY,CACXR,KAAMC,M,EAEPQ,KAAM,CACLT,KAAMU,K,EAEPC,SAAU,CACTX,KAAMH,eAAAe,QAAaC,MAAMC,OAAQb,OAAQG,OAAQW,QAAST,IAAI,EAC9DU,SAAU,CAAA,C,EAEXC,QAAS,CACRjB,KAAMC,M,EAEPiB,KAAM,CACLlB,KAAMC,M,EAEPkB,MAAO,CACNnB,KAAMC,M,GAQR,SAASmB,uBACR,IACOC,EADH3B,QAAA4B,iBAAmB5B,QAAA4B,gBAAgBC,UAAS,GACzCF,EAAQ,IAAIzB,gBAAA4B,kBAA2C,CAC5DC,eAAgB,wBAChB3B,OAAQA,OACR4B,qBAAsB,CAAA,EACtBC,iBAAkB,CAAA,EAClBC,0BAA2B,GAC3BC,WAAY,CAAA,EACZC,WAAY,CAAA,EACZC,YAAa,CAAA,EACbC,kBAAmB,I,CACnB,EACDC,QAAAC,oBAAsBb,EAAMc,gBAC5BF,QAAAC,oBAAoBE,YAAY,CAAC7B,UAAW,CAAC,EAAG,CAAC8B,mBAAoB,MAAiB,CAAC,EACvFJ,QAAAC,oBAAoBE,YAAY,CAAC5B,WAAY,CAAC,CAAC,GAG/C8B,WAAW,WACVlB,qBAAoB,CACrB,EAAG,CAAC,CAEN,CA1BWa,QAAAC,oBAAuE,KAElFd,qBAAoB","file":"worker-task-response.collection.js","sourcesContent":["import { WorkerTaskResponseModel } from '../models/worker-task-response.model';\nimport { ResolveIOServer } from '../index';\nimport { MongoManagerCollection, MongoManagerModel } from '../managers/mongo.manager';\nimport SimpleSchema from 'simpl-schema';\n\nlet schema: any = {\n\t_id: {\n\t\ttype: String,\n\t\toptional: true\n\t},\n\t__v: {\n\t\ttype: Number,\n\t\toptional: true\n\t},\n\tupdatedAt: {\n\t\ttype: Date,\n\t\toptional: true\n\t},\n\tcreatedAt: {\n\t\ttype: Date,\n\t\toptional: true\n\t},\n\tid_request: {\n\t\ttype: String\n\t},\n\tdata: {\n\t\ttype: Array, // Declaring params as an array\n\t},\n\t'data.$': {\n\t\ttype: SimpleSchema.oneOf(Object, String, Number, Boolean, Date), // Allowing multiple types\n\t\tblackbox: true // Blackbox for the object type\n\t},\n\tid_user: {\n\t\ttype: String\n\t},\n\tuser: {\n\t\ttype: String\n\t},\n\tid_ws: {\n\t\ttype: String\n\t}\n};\n\nexport let WorkerTaskResponses: MongoManagerCollection<WorkerTaskResponseModel> = null;\n\ninitializeCollection();\n\nfunction initializeCollection() {\n\tif (ResolveIOServer && ResolveIOServer.getMainDB()) {\n\t\tconst model = new MongoManagerModel<WorkerTaskResponseModel>({\n\t\t\tcollectionName: 'worker-task-responses',\n\t\t\tschema: schema,\n\t\t\tuseVersionCollection: false,\n\t\t\tuseReportBuilder: false,\n\t\t\treportBuilderLookupTables: [],\n\t\t\ttimestamps: true,\n\t\t\tcreateLogs: false,\n\t\t\tcheckSchema: false,\n\t\t\tcollectionOptions: null\n\t\t});\n\t\tWorkerTaskResponses = model.collection_main;\n\t\tWorkerTaskResponses.createIndex({createdAt: 1}, {expireAfterSeconds: 60 * 60 * 24 *
|
|
1
|
+
{"version":3,"sources":["../../src/collections/worker-task-response.collection.ts"],"names":["index_1","require","mongo_manager_1","simpl_schema_1","schema","_id","type","String","optional","__v","Number","updatedAt","Date","createdAt","id_request","data","Array","data.$","default","oneOf","Object","Boolean","blackbox","id_user","user","id_ws","initializeCollection","model","ResolveIOServer","getMainDB","MongoManagerModel","collectionName","useVersionCollection","useReportBuilder","reportBuilderLookupTables","timestamps","createLogs","checkSchema","collectionOptions","exports","WorkerTaskResponses","collection_main","createIndex","expireAfterSeconds","setTimeout"],"mappings":"uGACA,IAAAA,QAAAC,QAAA,UAAA,EACAC,gBAAAD,QAAA,2BAAA,EACAE,eAAAF,QAAA,cAAA,EAEIG,OAAc,CACjBC,IAAK,CACJC,KAAMC,OACNC,SAAU,CAAA,C,EAEXC,IAAK,CACJH,KAAMI,OACNF,SAAU,CAAA,C,EAEXG,UAAW,CACVL,KAAMM,KACNJ,SAAU,CAAA,C,EAEXK,UAAW,CACVP,KAAMM,KACNJ,SAAU,CAAA,C,EAEXM,WAAY,CACXR,KAAMC,M,EAEPQ,KAAM,CACLT,KAAMU,K,EAEPC,SAAU,CACTX,KAAMH,eAAAe,QAAaC,MAAMC,OAAQb,OAAQG,OAAQW,QAAST,IAAI,EAC9DU,SAAU,CAAA,C,EAEXC,QAAS,CACRjB,KAAMC,M,EAEPiB,KAAM,CACLlB,KAAMC,M,EAEPkB,MAAO,CACNnB,KAAMC,M,GAQR,SAASmB,uBACR,IACOC,EADH3B,QAAA4B,iBAAmB5B,QAAA4B,gBAAgBC,UAAS,GACzCF,EAAQ,IAAIzB,gBAAA4B,kBAA2C,CAC5DC,eAAgB,wBAChB3B,OAAQA,OACR4B,qBAAsB,CAAA,EACtBC,iBAAkB,CAAA,EAClBC,0BAA2B,GAC3BC,WAAY,CAAA,EACZC,WAAY,CAAA,EACZC,YAAa,CAAA,EACbC,kBAAmB,I,CACnB,EACDC,QAAAC,oBAAsBb,EAAMc,gBAC5BF,QAAAC,oBAAoBE,YAAY,CAAC7B,UAAW,CAAC,EAAG,CAAC8B,mBAAoB,MAAiB,CAAC,EACvFJ,QAAAC,oBAAoBE,YAAY,CAAC5B,WAAY,CAAC,CAAC,GAG/C8B,WAAW,WACVlB,qBAAoB,CACrB,EAAG,CAAC,CAEN,CA1BWa,QAAAC,oBAAuE,KAElFd,qBAAoB","file":"worker-task-response.collection.js","sourcesContent":["import { WorkerTaskResponseModel } from '../models/worker-task-response.model';\nimport { ResolveIOServer } from '../index';\nimport { MongoManagerCollection, MongoManagerModel } from '../managers/mongo.manager';\nimport SimpleSchema from 'simpl-schema';\n\nlet schema: any = {\n\t_id: {\n\t\ttype: String,\n\t\toptional: true\n\t},\n\t__v: {\n\t\ttype: Number,\n\t\toptional: true\n\t},\n\tupdatedAt: {\n\t\ttype: Date,\n\t\toptional: true\n\t},\n\tcreatedAt: {\n\t\ttype: Date,\n\t\toptional: true\n\t},\n\tid_request: {\n\t\ttype: String\n\t},\n\tdata: {\n\t\ttype: Array, // Declaring params as an array\n\t},\n\t'data.$': {\n\t\ttype: SimpleSchema.oneOf(Object, String, Number, Boolean, Date), // Allowing multiple types\n\t\tblackbox: true // Blackbox for the object type\n\t},\n\tid_user: {\n\t\ttype: String\n\t},\n\tuser: {\n\t\ttype: String\n\t},\n\tid_ws: {\n\t\ttype: String\n\t}\n};\n\nexport let WorkerTaskResponses: MongoManagerCollection<WorkerTaskResponseModel> = null;\n\ninitializeCollection();\n\nfunction initializeCollection() {\n\tif (ResolveIOServer && ResolveIOServer.getMainDB()) {\n\t\tconst model = new MongoManagerModel<WorkerTaskResponseModel>({\n\t\t\tcollectionName: 'worker-task-responses',\n\t\t\tschema: schema,\n\t\t\tuseVersionCollection: false,\n\t\t\tuseReportBuilder: false,\n\t\t\treportBuilderLookupTables: [],\n\t\t\ttimestamps: true,\n\t\t\tcreateLogs: false,\n\t\t\tcheckSchema: false,\n\t\t\tcollectionOptions: null\n\t\t});\n\t\tWorkerTaskResponses = model.collection_main;\n\t\tWorkerTaskResponses.createIndex({createdAt: 1}, {expireAfterSeconds: 60 * 60 * 24 * 15});\n\t\tWorkerTaskResponses.createIndex({id_request: 1});\n\t}\n\telse {\n\t\tsetTimeout(() => {\n\t\t\tinitializeCollection();\n\t\t}, 0);\n\t}\n}"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var __values=this&&this.__values||function(e){var t="function"==typeof Symbol&&Symbol.iterator,s=t&&e[t],n=0;if(s)return s.call(e);if(e&&"number"==typeof e.length)return{next:function(){return{value:(e=e&&n>=e.length?void 0:e)&&e[n++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")},WebSocketManager=(Object.defineProperty(exports,"__esModule",{value:!0}),exports.WebSocketManager=void 0,function(){function WebSocketManager(e,t,s){void 0===t&&(t=20480),void 0===s&&(s=25),this._messageBuffers=new Map,this._batchingTimers=new Map,this._webSockets=new Map,this._mainServer=e,this._maxMessageSize=t,this._messageDelay=s}return WebSocketManager.prototype.addWebSocket=function(e){var t=e.id_socket;this._webSockets.set(t,e)},WebSocketManager.prototype.removeWebSocket=function(e){var t=e.id_socket;this._webSockets.delete(t),this.closeConnection(e)},WebSocketManager.prototype.getWebSocket=function(e){return this._webSockets.get(e)},WebSocketManager.prototype.send=function(e,t){var s=this,n=e.id_socket;this._messageBuffers.has(n)||this._messageBuffers.set(n,[]),"string"==typeof t?this._messageBuffers.get(n).push({messageId:null,hasError:!1,data:t}):this._messageBuffers.get(n).push(t),this._batchingTimers.has(n)||(t=setTimeout(function(){s.flushMessages(e)},this._messageDelay),this._batchingTimers.set(n,t))},WebSocketManager.prototype.flushMessages=function(t){var e,s=this,n=t.id_socket,r=this._messageBuffers.get(n);r&&0<r.length&&(e=JSON.stringify(r),Buffer.byteLength(e,"utf8")>this._maxMessageSize?this.sendMessagesInChunks(t,r):t.send(e,function(e){e&&s.handleSendError(t,e)}),this._messageBuffers.delete(n),clearTimeout(this._batchingTimers.get(n)),this._batchingTimers.delete(n))},WebSocketManager.prototype.sendMessagesInChunks=function(t,e){var s,n,r=this,i=[],
|
|
1
|
+
"use strict";var __values=this&&this.__values||function(e){var t="function"==typeof Symbol&&Symbol.iterator,s=t&&e[t],n=0;if(s)return s.call(e);if(e&&"number"==typeof e.length)return{next:function(){return{value:(e=e&&n>=e.length?void 0:e)&&e[n++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")},WebSocketManager=(Object.defineProperty(exports,"__esModule",{value:!0}),exports.WebSocketManager=void 0,function(){function WebSocketManager(e,t,s){void 0===t&&(t=20480),void 0===s&&(s=25),this._messageBuffers=new Map,this._batchingTimers=new Map,this._webSockets=new Map,this._mainServer=e,this._maxMessageSize=t,this._messageDelay=s}return WebSocketManager.prototype.addWebSocket=function(e){var t=e.id_socket;this._webSockets.set(t,e)},WebSocketManager.prototype.removeWebSocket=function(e){var t=e.id_socket;this._webSockets.delete(t),this.closeConnection(e)},WebSocketManager.prototype.getWebSocket=function(e){return this._webSockets.get(e)},WebSocketManager.prototype.send=function(e,t){var s=this,n=e.id_socket;this._messageBuffers.has(n)||this._messageBuffers.set(n,[]),"string"==typeof t?this._messageBuffers.get(n).push({messageId:null,hasError:!1,data:t}):this._messageBuffers.get(n).push(t),this._batchingTimers.has(n)||(t=setTimeout(function(){s.flushMessages(e)},this._messageDelay),this._batchingTimers.set(n,t))},WebSocketManager.prototype.flushMessages=function(t){var e,s=this,n=t.id_socket,r=this._messageBuffers.get(n);r&&0<r.length&&(e=JSON.stringify(r),Buffer.byteLength(e,"utf8")>this._maxMessageSize?this.sendMessagesInChunks(t,r):t.send(e,function(e){e&&s.handleSendError(t,e)}),this._messageBuffers.delete(n),clearTimeout(this._batchingTimers.get(n)),this._batchingTimers.delete(n))},WebSocketManager.prototype.sendMessagesInChunks=function(t,e){var s,n,r=this,i=[],a=0;try{for(var o=__values(e),c=o.next();!c.done;c=o.next()){var h=c.value,g=JSON.stringify([h]),u=Buffer.byteLength(g,"utf8");a+u>this._maxMessageSize?(t.send(JSON.stringify(i),function(e){e&&r.handleSendError(t,e)}),i=[h],a=u):(i.push(h),a+=u)}}catch(e){s={error:e}}finally{try{c&&!c.done&&(n=o.return)&&n.call(o)}finally{if(s)throw s.error}}0<i.length&&t.send(JSON.stringify(i),function(e){e&&r.handleSendError(t,e)})},WebSocketManager.prototype.handleSendError=function(e,t){this._mainServer.getSubscriptionManager()&&(this._mainServer.getSubscriptionManager().getEnableDebug()&&console.log(new Date,"WebSocketManager","Unsub WS",e.user,e.id_socket,t),this._mainServer.getSubscriptionManager().unsubscribeAll(e),this.removeWebSocket(e))},WebSocketManager.prototype.closeConnection=function(e){e.close();var t=e.id_socket;this._messageBuffers.delete(t),this._batchingTimers.has(t)&&(clearTimeout(this._batchingTimers.get(t)),this._batchingTimers.delete(t)),process.nextTick(function(){[e.OPEN,e.CLOSING].includes(e.readyState)&&e.terminate()})},WebSocketManager}());exports.WebSocketManager=WebSocketManager;
|
|
2
2
|
//# sourceMappingURL=websocket.manager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/managers/websocket.manager.ts"],"names":["WebSocketManager","mainServer","maxMessageSize","messageDelay","this","_messageBuffers","Map","_batchingTimers","_webSockets","_mainServer","_maxMessageSize","_messageDelay","prototype","addWebSocket","ws","wsId","set","removeWebSocket","delete","closeConnection","getWebSocket","id_socket","get","send","data","_this","has","push","messageId","hasError","timer","setTimeout","flushMessages","combinedData","messages","length","JSON","stringify","Buffer","byteLength","sendMessagesInChunks","error","handleSendError","clearTimeout","chunk","chunkSize","messages_1","__values","messages_1_1","next","done","message","value","messageData","messageSize","getSubscriptionManager","getEnableDebug","console","log","Date","unsubscribeAll","close","process","nextTick","OPEN","CLOSING","includes","readyState","terminate","exports"],"mappings":"uVAUAA,kB,uFAAA,WAQC,SAAAA,iBAAYC,EAAiCC,EAAgCC,GAAhC,KAAA,IAAAD,IAAAA,EAAA,OAAgC,KAAA,IAAAC,IAAAA,EAAA,IANrEC,KAAAC,gBAAsD,IAAIC,IAC1DF,KAAAG,gBAA+C,IAAID,IAGnDF,KAAAI,YAAsC,IAAIF,IAGjDF,KAAKK,YAAcR,EACnBG,KAAKM,gBAAkBR,EACvBE,KAAKO,cAAgBR,CACtB,
|
|
1
|
+
{"version":3,"sources":["../../src/managers/websocket.manager.ts"],"names":["WebSocketManager","mainServer","maxMessageSize","messageDelay","this","_messageBuffers","Map","_batchingTimers","_webSockets","_mainServer","_maxMessageSize","_messageDelay","prototype","addWebSocket","ws","wsId","set","removeWebSocket","delete","closeConnection","getWebSocket","id_socket","get","send","data","_this","has","push","messageId","hasError","timer","setTimeout","flushMessages","combinedData","messages","length","JSON","stringify","Buffer","byteLength","sendMessagesInChunks","error","handleSendError","clearTimeout","chunk","chunkSize","messages_1","__values","messages_1_1","next","done","message","value","messageData","messageSize","getSubscriptionManager","getEnableDebug","console","log","Date","unsubscribeAll","close","process","nextTick","OPEN","CLOSING","includes","readyState","terminate","exports"],"mappings":"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","file":"websocket.manager.js","sourcesContent":["import { WebSocket } from 'ws';\nimport { ResolveIOServer } from '../index';\nimport ResolveIOMainServer from '../server-app';\n\ninterface ServerResponseModel {\n\tmessageId: number;\n\thasError: boolean;\n\tdata: any;\n}\n\nexport class WebSocketManager {\n\tprivate _mainServer: ResolveIOMainServer;\n\tprivate _messageBuffers: Map<string, ServerResponseModel[]> = new Map();\n\tprivate _batchingTimers: Map<string, NodeJS.Timeout> = new Map();\n\tprivate _maxMessageSize: number;\n\tprivate _messageDelay: number;\n\tprivate _webSockets: Map<string, WebSocket> = new Map();\n\n\tconstructor(mainServer: ResolveIOMainServer, maxMessageSize: number = 20480, messageDelay: number = 25) {\n\t\tthis._mainServer = mainServer;\n\t\tthis._maxMessageSize = maxMessageSize;\n\t\tthis._messageDelay = messageDelay;\n\t}\n\n\tpublic addWebSocket(ws: WebSocket): void {\n\t\tconst wsId = ws['id_socket'];\n\t\tthis._webSockets.set(wsId, ws);\n\t}\n\n\tpublic removeWebSocket(ws: WebSocket): void {\n\t\tconst wsId = ws['id_socket'];\n\t\tthis._webSockets.delete(wsId);\n\t\tthis.closeConnection(ws);\n\t}\n\n\tpublic getWebSocket(id_socket: string): WebSocket | undefined {\n\t\treturn this._webSockets.get(id_socket);\n\t}\n\n\tpublic send(ws: WebSocket, data: ServerResponseModel | string): void {\n\t\tconst wsId = ws['id_socket'];\n\n\t\tif (!this._messageBuffers.has(wsId)) {\n\t\t\tthis._messageBuffers.set(wsId, []);\n\t\t}\n\n\t\tif (typeof data === 'string') {\n\t\t\t// Handle string messages like 'ping' or 'pong'\n\t\t\tthis._messageBuffers.get(wsId).push({ messageId: null, hasError: false, data: data });\n\t\t}\n\t\telse {\n\t\t\tthis._messageBuffers.get(wsId).push(data);\n\t\t}\n\n\t\tif (!this._batchingTimers.has(wsId)) {\n\t\t\t// Set a timer to send the batch after a short delay\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tthis.flushMessages(ws);\n\t\t\t}, this._messageDelay);\n\t\t\tthis._batchingTimers.set(wsId, timer);\n\t\t}\n\t}\n\n\tprivate flushMessages(ws: WebSocket): void {\n\t\tconst wsId = ws['id_socket'];\n\t\tconst messages = this._messageBuffers.get(wsId);\n\n\t\tif (messages && messages.length > 0) {\n\t\t\t// Combine messages into one payload\n\t\t\tconst combinedData = JSON.stringify(messages);\n\t\t\tconst dataSize = Buffer.byteLength(combinedData, 'utf8');\n\n\t\t\tif (dataSize > this._maxMessageSize) {\n\t\t\t\t// Split messages to ensure each does not exceed max size\n\t\t\t\tthis.sendMessagesInChunks(ws, messages);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tws.send(combinedData, (error) => {\n\t\t\t\t\tif (error) {\n\t\t\t\t\t\tthis.handleSendError(ws, error);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Clear the buffer and timer\n\t\t\tthis._messageBuffers.delete(wsId);\n\t\t\tclearTimeout(this._batchingTimers.get(wsId));\n\t\t\tthis._batchingTimers.delete(wsId);\n\t\t}\n\t}\n\n\tprivate sendMessagesInChunks(ws: WebSocket, messages: ServerResponseModel[]): void {\n\t\tlet chunk: ServerResponseModel[] = [];\n\t\tlet chunkSize = 0;\n\n\t\tfor (const message of messages) {\n\t\t\tconst messageData = JSON.stringify([message]); // Wrap message in array for consistency\n\t\t\tconst messageSize = Buffer.byteLength(messageData, 'utf8');\n\n\t\t\tif (chunkSize + messageSize > this._maxMessageSize) {\n\t\t\t\t// Send current chunk\n\t\t\t\tws.send(JSON.stringify(chunk), (error) => {\n\t\t\t\t\tif (error) {\n\t\t\t\t\t\tthis.handleSendError(ws, error);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t// Start new chunk\n\t\t\t\tchunk = [message];\n\t\t\t\tchunkSize = messageSize;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tchunk.push(message);\n\t\t\t\tchunkSize += messageSize;\n\t\t\t}\n\t\t}\n\n\t\t// Send any remaining messages\n\t\tif (chunk.length > 0) {\n\t\t\tws.send(JSON.stringify(chunk), (error) => {\n\t\t\t\tif (error) {\n\t\t\t\t\tthis.handleSendError(ws, error);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate handleSendError(ws: WebSocket, error: Error): void {\n\t\tif (this._mainServer.getSubscriptionManager()) {\n\t\t\t// Handle send error, e.g., unsubscribe, close connection\n\t\t\tif (this._mainServer.getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'WebSocketManager', 'Unsub WS', ws['user'], ws['id_socket'], error);\n\t\t\t}\n\t\t\tthis._mainServer.getSubscriptionManager().unsubscribeAll(ws);\n\t\t\tthis.removeWebSocket(ws);\n\t\t}\n\t}\n\n\tpublic closeConnection(ws: WebSocket): void {\n\t\tws.close();\n\t\tconst wsId = ws['id_socket'];\n\t\t// Clean up buffers and timers\n\t\tthis._messageBuffers.delete(wsId);\n\t\tif (this._batchingTimers.has(wsId)) {\n\t\t\tclearTimeout(this._batchingTimers.get(wsId));\n\t\t\tthis._batchingTimers.delete(wsId);\n\t\t}\n \n process.nextTick(() => {\n if ([ws.OPEN, ws.CLOSING].includes(<any>ws.readyState)) {\n // Socket still hangs, hard close\n ws.terminate();\n }\n });\n\t}\n}"]}
|
package/methods/accounts.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var __awaiter=this&&this.__awaiter||function(e,t,i,s){return new(i=i||Promise)(function(n,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){var r;e.done?n(e.value):((r=e.value)instanceof i?r:new i(function(e){e(r)})).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())})},__generator=this&&this.__generator||function(t,i){var s,o,a,
|
|
1
|
+
"use strict";var __awaiter=this&&this.__awaiter||function(e,t,i,s){return new(i=i||Promise)(function(n,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){var r;e.done?n(e.value):((r=e.value)instanceof i?r:new i(function(e){e(r)})).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())})},__generator=this&&this.__generator||function(t,i){var s,o,a,l={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},c={next:verb(0),throw:verb(1),return:verb(2)};return"function"==typeof Symbol&&(c[Symbol.iterator]=function(){return this}),c;function verb(n){return function(e){var r=[n,e];if(s)throw new TypeError("Generator is already executing.");for(;l=c&&r[c=0]?0:l;)try{if(s=1,o&&(a=2&r[0]?o.return:r[0]?o.throw||((a=o.return)&&a.call(o),0):o.next)&&!(a=a.call(o,r[1])).done)return a;switch(o=0,(r=a?[2&r[0],a.value]:r)[0]){case 0:case 1:a=r;break;case 4:return l.label++,{value:r[1],done:!1};case 5:l.label++,o=r[1],r=[0];continue;case 7:r=l.ops.pop(),l.trys.pop();continue;default:if(!(a=0<(a=l.trys).length&&a[a.length-1])&&(6===r[0]||2===r[0])){l=0;continue}if(3===r[0]&&(!a||r[1]>a[0]&&r[1]<a[3]))l.label=r[1];else if(6===r[0]&&l.label<a[1])l.label=a[1],a=r;else{if(!(a&&l.label<a[2])){a[2]&&l.ops.pop(),l.trys.pop();continue}l.label=a[2],l.ops.push(r)}}r=i.call(t,l)}catch(e){r=[6,e],o=0}finally{s=a=0}if(5&r[0])throw r[1];return{value:r[0]?r[1]:void 0,done:!0}}}},simpl_schema_1=(Object.defineProperty(exports,"__esModule",{value:!0}),exports.loadAccountMethods=void 0,require("simpl-schema")),user_collection_1=require("../collections/user.collection"),handlebars=require("handlebars"),jwt=require("jsonwebtoken"),index_1=require("../index"),mongo_manager_1=require("../managers/mongo.manager");function loadAccountMethods(e){e.methods({incorrectUser:{check:new simpl_schema_1.default({old_user:{type:Object,blackbox:!0},new_user:{type:Object,blackbox:!0},client_subs:{type:Array},"client_subs.$":{type:Object,blackbox:!0}}),function:function(t,i,s){var r=this;return new Promise(function(n,e){return __awaiter(r,void 0,void 0,function(){var r;return __generator(this,function(e){return index_1.ResolveIOServer.getMainServer()&&(r=index_1.ResolveIOServer.getMainServer().getWebSocketManager().getWebSocket(this.id_ws),this.sendEmail("dev@resolveio.com","SERVER - WRONG USER Detected - "+this.serverConfig.CLIENT_NAME,"Wrong User Sent!\nWS: "+JSON.stringify(r,null,2)+"\nUserMethod: "+this.user+"\nIdUserMethod: "+this.id_user+"\nSubManagerActiveSubs: "+JSON.stringify(index_1.ResolveIOServer.getMainServer().getSubscriptionManager().getActiveSubscriptions(),null,2)+"\nOldUser: "+JSON.stringify(t,null,2)+"\nNewUser: "+JSON.stringify(i,null,2)+"\nClientSubs: "+JSON.stringify(s,null,2))),n(!0),[2]})})})}},reloadWS:{check:new simpl_schema_1.default({id_ws:String}),function:function(i){var e=this;return new Promise(function(n,t){return __awaiter(e,void 0,void 0,function(){var r;return __generator(this,function(e){return(r=index_1.ResolveIOServer.getMainServer().getWebSocketManager().getWebSocket(i))?(index_1.ResolveIOServer.getMainServer().unsubscribeWS(r),n(!0)):t("No WS"),[2]})})})}},reconnectWS:{check:new simpl_schema_1.default({id_ws:String}),function:function(i){var e=this;return new Promise(function(n,t){return __awaiter(e,void 0,void 0,function(){var r;return __generator(this,function(e){return(r=index_1.ResolveIOServer.getMainServer().getWebSocketManager().getWebSocket(i))?(index_1.ResolveIOServer.getMainServer().unsubscribeWS(r),n(!0)):t("No WS"),[2]})})})}},disconnectWS:{check:new simpl_schema_1.default({id_ws:String}),function:function(i){var e=this;return new Promise(function(n,t){return __awaiter(e,void 0,void 0,function(){var r;return __generator(this,function(e){return(r=index_1.ResolveIOServer.getMainServer().getWebSocketManager().getWebSocket(i))?(index_1.ResolveIOServer.getMainServer().unsubscribeWS(r),n(!0)):t("No WS"),[2]})})})}},createUserAndEmailEnrollment:{check:new simpl_schema_1.default({newUser:{type:user_collection_1.Users.simplschema},sendEnrollmentEmail:{type:Boolean,optional:!0}}),function:function(s,o){var e=this;return void 0===o&&(o=!0),new Promise(function(t,i){return __awaiter(e,void 0,void 0,function(){var r,n=this;return __generator(this,function(e){switch(e.label){case 0:return"admin"!==s.username.toLocaleLowerCase()?[3,1]:(i("Username can not be admin"),[2]);case 1:return[4,user_collection_1.Users.findOne({$or:[{username:s.username.toLocaleLowerCase()},{email:s.email.toLocaleLowerCase()}]})];case 2:if(e.sent())return i("Username/Email is already used"),[2];e.label=3;case 3:return s._id=(0,mongo_manager_1.objectIdHexString)(),s.services={enrollment:jwt.sign({id_user:s._id},this.serverConfig.JWT_SECRET,{expiresIn:2592e5})},s.is_customer=!1,[4,user_collection_1.Users.insertOne(s)];case 4:return e.sent(),o&&(r={fullname:s.fullname,user:this.user,url:this.serverConfig.ROOT_URL+"/enroll-account?"+encodeURIComponent(this.serverConfig.SERVER_URL)+"&"+s.services.enrollment},this.readFile("email-templates/enrollment.html").then(function(e){e=handlebars.compile(e);handlebars.registerHelper("equals",function(e,r){return e===r}),n.sendEmail(s.email,"ResolveIO ("+index_1.ResolveIOServer.getClientName()+") - Enrollment Email","",e(r),null,null,""),t(s)},function(e){return i(e)})),[2]}})})})}},resetUserPassword:{check:new simpl_schema_1.default({userId:{type:String}}),function:function(o){var e=this;return new Promise(function(i,s){return __awaiter(e,void 0,void 0,function(){var r,n,t=this;return __generator(this,function(e){switch(e.label){case 0:return[4,user_collection_1.Users.findOne({_id:o})];case 1:return(r=e.sent())&&(r.services||(r.services={}),r.services.forgot_password=jwt.sign({id_user:o},this.serverConfig.JWT_SECRET),n={userToChangePassword:r.fullname,userWhoResetPassword:this.user,url:this.serverConfig.ROOT_URL+"/forgot-password?"+encodeURIComponent(this.serverConfig.SERVER_URL)+"&"+r.services.forgot_password},user_collection_1.Users.updateOne({_id:r._id},{$set:{services:r.services,attempts:0}}).then(function(){t.readFile("email-templates/forgot-password.html").then(function(e){e=handlebars.compile(e);handlebars.registerHelper("equals",function(e,r){return e===r}),t.sendEmail(r.email,"ResolveIO ("+index_1.ResolveIOServer.getClientName()+") - Forgot Password","",e(n),null,null,""),i(!0)},function(e){return s(e)})},function(){})),[2]}})})})}},setUserPassword:{check:new simpl_schema_1.default({userId:{type:String},password:{type:String}}),function:function(i,s){var e=this;return new Promise(function(n,t){return __awaiter(e,void 0,void 0,function(){var r;return __generator(this,function(e){switch(e.label){case 0:return[4,user_collection_1.Users.findOne({_id:i})];case 1:return!(r=e.sent())||r.roles.super_admin?[3,3]:[4,user_collection_1.Users.setPassword(r,s)];case 2:return e.sent(),n(!0),[3,4];case 3:t("Invalid User"),e.label=4;case 4:return[2]}})})})}}})}exports.loadAccountMethods=loadAccountMethods;
|
|
2
2
|
//# sourceMappingURL=accounts.js.map
|
package/methods/accounts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/methods/accounts.ts"],"names":["simpl_schema_1","require","user_collection_1","handlebars","jwt","index_1","mongo_manager_1","loadAccountMethods","methodManager","methods","incorrectUser","check","default","old_user","type","Object","blackbox","new_user","client_subs","Array","client_subs.$","function","_this","this","Promise","resolve","reject","__awaiter","ws","ResolveIOServer","getMainServer","getWebSocketManager","getWebSocket","id_ws","sendEmail","serverConfig","JSON","stringify","user","id_user","getSubscriptionManager","getActiveSubscriptions","reloadWS","String","unsubscribeWS","reconnectWS","disconnectWS","createUserAndEmailEnrollment","newUser","Users","sendEnrollmentEmail","Boolean","optional","username","toLocaleLowerCase","findOne","$or","email","_a","sent","_id","objectIdHexString","services","enrollment","sign","expiresIn","is_customer","insertOne","emailData_1","fullname","url","encodeURIComponent","readFile","then","html","template","compile","registerHelper","a","b","getClientName","errEmail","resetUserPassword","userId","emailData_2","userToChangePassword","userWhoResetPassword","updateOne","$set","attempts","setUserPassword","password","roles","super_admin","setPassword","exports"],"mappings":"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","file":"accounts.js","sourcesContent":["import SimpleSchema from 'simpl-schema';\nimport { Users } from '../collections/user.collection';\nimport * as handlebars from 'handlebars';\nimport * as jwt from 'jsonwebtoken';\nimport { MethodManager } from '../managers/method.manager';\nimport { ResolveIOServer } from '../index';\nimport { UserModel } from '../models/user.model';\nimport { objectIdHexString } from '../managers/mongo.manager';\n\nexport function loadAccountMethods(methodManager: MethodManager) {\n\tmethodManager.methods({\n\t\tincorrectUser: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\told_user: {\n\t\t\t\t\ttype: Object,\n\t\t\t\t\tblackbox: true\n\t\t\t\t},\n\t\t\t\tnew_user: {\n\t\t\t\t\ttype: Object,\n\t\t\t\t\tblackbox: true\n\t\t\t\t},\n\t\t\t\tclient_subs: {\n\t\t\t\t\ttype: Array\n\t\t\t\t},\n\t\t\t\t'client_subs.$': {\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: function(old_user, new_user, client_subs) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\t\tlet ws = ResolveIOServer.getMainServer().getWebSocketManager().getWebSocket(this.id_ws);\n\n\t\t\t\t\tthis.sendEmail('dev@resolveio.com', 'SERVER - WRONG USER Detected - ' + this.serverConfig['CLIENT_NAME'], 'Wrong User Sent!\\nWS: ' + JSON.stringify(ws, null, 2) + '\\nUserMethod: ' + this.user + '\\nIdUserMethod: ' + this.id_user + '\\nSubManagerActiveSubs: ' + JSON.stringify(ResolveIOServer.getMainServer().getSubscriptionManager().getActiveSubscriptions(), null, 2) + '\\nOldUser: ' + JSON.stringify(old_user, null, 2) + '\\nNewUser: ' + JSON.stringify(new_user, null, 2) + '\\nClientSubs: ' + JSON.stringify(client_subs, null, 2));\n\n\t\t\t\t\tresolve(true);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\treloadWS: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tid_ws: String\n\t\t\t}),\n\t\t\tfunction: function(id_ws) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\t\tlet ws = ResolveIOServer.getMainServer().getWebSocketManager().getWebSocket(id_ws);\n\n\t\t\t\t\tif (ws) {\n\t\t\t\t\t\tResolveIOServer.getMainServer().unsubscribeWS(ws);\n\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject('No WS');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\treconnectWS: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tid_ws: String\n\t\t\t}),\n\t\t\tfunction: function(id_ws) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\t\tlet ws = ResolveIOServer.getMainServer().getWebSocketManager().getWebSocket(id_ws);\n\n\t\t\t\t\tif (ws) {\n\t\t\t\t\t\tResolveIOServer.getMainServer().unsubscribeWS(ws);\n\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject('No WS');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tdisconnectWS: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tid_ws: String\n\t\t\t}),\n\t\t\tfunction: function(id_ws) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\t\tlet ws = ResolveIOServer.getMainServer().getWebSocketManager().getWebSocket(id_ws);\n\n\t\t\t\t\tif (ws) {\n\t\t\t\t\t\tResolveIOServer.getMainServer().unsubscribeWS(ws);\n\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject('No WS');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tcreateUserAndEmailEnrollment: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tnewUser: {\n\t\t\t\t\ttype: Users['simplschema']\n\t\t\t\t},\n\t\t\t\tsendEnrollmentEmail: {\n\t\t\t\t\ttype: Boolean,\n\t\t\t\t\toptional: true\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: function(newUser: UserModel, sendEnrollmentEmail = true) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\t\tif (newUser.username.toLocaleLowerCase() === 'admin') {\n\t\t\t\t\t\treject('Username can not be admin');\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tlet otherUser = await Users.findOne({\n\t\t\t\t\t\t\t$or: [\n\t\t\t\t\t\t\t\t{username: newUser.username.toLocaleLowerCase()},\n\t\t\t\t\t\t\t\t{email: newUser.email.toLocaleLowerCase()}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (otherUser) {\n\t\t\t\t\t\t\treject('Username/Email is already used');\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tnewUser._id = objectIdHexString();\n\n\t\t\t\t\tnewUser.services = {\n\t\t\t\t\t\tenrollment: jwt.sign({id_user: newUser._id}, this.serverConfig['JWT_SECRET'], {\n\t\t\t\t\t\t\texpiresIn : 3 * 24 * 60 * 60 * 1000 // 3 days\n\t\t\t\t\t\t})\n\t\t\t\t\t};\n\n\t\t\t\t\tnewUser.is_customer = false;\n\t\t\t\t\t\n\t\t\t\t\tawait Users.insertOne(newUser);\n\n\t\t\t\t\tif (sendEnrollmentEmail) {\n\t\t\t\t\t\tlet emailData = {\n\t\t\t\t\t\t\tfullname: newUser.fullname,\n\t\t\t\t\t\t\tuser: this.user,\n\t\t\t\t\t\t\turl: (this.serverConfig['ROOT_URL'] + '/enroll-account?' + encodeURIComponent(this.serverConfig['SERVER_URL']) + '&' + newUser.services['enrollment'])\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tthis.readFile('email-templates/enrollment.html').then(html => {\n\t\t\t\t\t\t\tlet template = handlebars.compile(html);\n\t\t\t\t\t\t\thandlebars.registerHelper('equals', (a, b) => {\n\t\t\t\t\t\t\t\treturn a === b;\n\t\t\t\t\t\t\t});\n\t\t\n\t\t\t\t\t\t\tthis.sendEmail(newUser.email, 'ResolveIO (' + ResolveIOServer.getClientName() + ') - Enrollment Email', '', template(emailData), null, null, '');\n\t\t\n\t\t\t\t\t\t\tresolve(newUser);\n\t\t\t\t\t\t}, errEmail => reject(errEmail));\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tresetUserPassword: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tuserId: {\n\t\t\t\t\ttype: String\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: function(userId: string) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\t\t\t\t\n\t\t\t\t\tlet user = await Users.findOne({_id: userId});\n\t\t\n\t\t\t\t\tif (user) {\n\t\t\t\t\t\tif (!user.services) {\n\t\t\t\t\t\t\tuser.services = {};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tuser.services['forgot_password'] = jwt.sign({id_user: userId}, this.serverConfig['JWT_SECRET']);\n\n\t\t\t\t\t\tlet emailData = {\n\t\t\t\t\t\t\tuserToChangePassword: user.fullname,\n\t\t\t\t\t\t\tuserWhoResetPassword: this.user,\n\t\t\t\t\t\t\turl: (this.serverConfig['ROOT_URL'] + '/forgot-password?' + encodeURIComponent(this.serverConfig['SERVER_URL']) + '&' + user.services['forgot_password'])\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tUsers.updateOne({_id: user._id}, {$set: {services: user.services, attempts: 0}}).then(() => {\n\t\t\t\t\t\t\tthis.readFile('email-templates/forgot-password.html').then(html => {\n\t\t\t\t\t\t\t\tlet template = handlebars.compile(html);\n\t\t\t\t\t\t\t\thandlebars.registerHelper('equals', (a, b) => {\n\t\t\t\t\t\t\t\t\treturn a === b;\n\t\t\t\t\t\t\t\t});\n\t\t\t\n\t\t\t\t\t\t\t\tthis.sendEmail(user.email, 'ResolveIO (' + ResolveIOServer.getClientName() + ') - Forgot Password', '', template(emailData), null, null, '');\n\t\t\t\n\t\t\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t\t\t}, errEmail => reject(errEmail));\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\tsetUserPassword: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tuserId: {\n\t\t\t\t\ttype: String\n\t\t\t\t},\n\t\t\t\tpassword: {\n\t\t\t\t\ttype: String\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: function(userId: string, password: string) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\t\t\t\t\n\t\t\t\t\tlet user = await Users.findOne({_id: userId});\n\t\t\n\t\t\t\t\tif (user && !user.roles.super_admin) {\n\t\t\t\t\t\tawait Users.setPassword(user, password);\n\n\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject('Invalid User');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t});\n}"]}
|
|
1
|
+
{"version":3,"sources":["../../src/methods/accounts.ts"],"names":["simpl_schema_1","require","user_collection_1","handlebars","jwt","index_1","mongo_manager_1","loadAccountMethods","methodManager","methods","incorrectUser","check","default","old_user","type","Object","blackbox","new_user","client_subs","Array","client_subs.$","function","_this","this","Promise","resolve","reject","__awaiter","ResolveIOServer","getMainServer","ws","getWebSocketManager","getWebSocket","id_ws","sendEmail","serverConfig","JSON","stringify","user","id_user","getSubscriptionManager","getActiveSubscriptions","reloadWS","String","unsubscribeWS","reconnectWS","disconnectWS","createUserAndEmailEnrollment","newUser","Users","sendEnrollmentEmail","Boolean","optional","username","toLocaleLowerCase","findOne","$or","email","_a","sent","_id","objectIdHexString","services","enrollment","sign","expiresIn","is_customer","insertOne","emailData_1","fullname","url","encodeURIComponent","readFile","then","html","template","compile","registerHelper","a","b","getClientName","errEmail","resetUserPassword","userId","emailData_2","userToChangePassword","userWhoResetPassword","updateOne","$set","attempts","setUserPassword","password","roles","super_admin","setPassword","exports"],"mappings":"k8CAAAA,gB,yFAAAC,QAAA,cAAA,GACAC,kBAAAD,QAAA,gCAAA,EACAE,WAAAF,QAAA,YAAA,EACAG,IAAAH,QAAA,cAAA,EAEAI,QAAAJ,QAAA,UAAA,EAEAK,gBAAAL,QAAA,2BAAA,EAEA,SAAgBM,mBAAmBC,GAClCA,EAAcC,QAAQ,CACrBC,cAAe,CACdC,MAAO,IAAIX,eAAAY,QAAa,CACvBC,SAAU,CACTC,KAAMC,OACNC,SAAU,CAAA,C,EAEXC,SAAU,CACTH,KAAMC,OACNC,SAAU,CAAA,C,EAEXE,YAAa,CACZJ,KAAMK,K,EAEPC,gBAAiB,CAChBN,KAAMC,OACNC,SAAU,CAAA,C,EAEX,EACDK,SAAU,SAASR,EAAUI,EAAUC,GAA7B,IAAAI,EAAAC,KACT,OAAO,IAAIC,QAAQ,SAAOC,EAASC,GAAM,OAAAC,UAAAL,EAAA,KAAA,EAAA,KAAA,EAAA,W,iDACpCjB,QAAAuB,gBAAgBC,cAAa,IAC5BC,EAAKzB,QAAAuB,gBAAgBC,cAAa,EAAGE,oBAAmB,EAAGC,aAAaT,KAAKU,KAAK,EAEtFV,KAAKW,UAAU,oBAAqB,kCAAoCX,KAAKY,aAA0B,YAAG,yBAA2BC,KAAKC,UAAUP,EAAI,KAAM,CAAC,EAAI,iBAAmBP,KAAKe,KAAO,mBAAqBf,KAAKgB,QAAU,2BAA6BH,KAAKC,UAAUhC,QAAAuB,gBAAgBC,cAAa,EAAGW,uBAAsB,EAAGC,uBAAsB,EAAI,KAAM,CAAC,EAAI,cAAgBL,KAAKC,UAAUxB,EAAU,KAAM,CAAC,EAAI,cAAgBuB,KAAKC,UAAUpB,EAAU,KAAM,CAAC,EAAI,iBAAmBmB,KAAKC,UAAUnB,EAAa,KAAM,CAAC,CAAC,GAGhhBO,EAAQ,CAAA,CAAI,E,QACZ,CACF,C,EAEDiB,SAAU,CACT/B,MAAO,IAAIX,eAAAY,QAAa,CACvBqB,MAAOU,M,CACP,EACDtB,SAAU,SAASY,GAAT,IAAAX,EAAAC,KACT,OAAO,IAAIC,QAAQ,SAAOC,EAASC,GAAM,OAAAC,UAAAL,EAAA,KAAA,EAAA,KAAA,EAAA,W,iDACpCQ,EAAKzB,QAAAuB,gBAAgBC,cAAa,EAAGE,oBAAmB,EAAGC,aAAaC,CAAK,IAGhF5B,QAAAuB,gBAAgBC,cAAa,EAAGe,cAAcd,CAAE,EAChDL,EAAQ,CAAA,CAAI,GAGZC,EAAO,OAAO,E,QAEf,CACF,C,EAEDmB,YAAa,CACZlC,MAAO,IAAIX,eAAAY,QAAa,CACvBqB,MAAOU,M,CACP,EACDtB,SAAU,SAASY,GAAT,IAAAX,EAAAC,KACT,OAAO,IAAIC,QAAQ,SAAOC,EAASC,GAAM,OAAAC,UAAAL,EAAA,KAAA,EAAA,KAAA,EAAA,W,iDACpCQ,EAAKzB,QAAAuB,gBAAgBC,cAAa,EAAGE,oBAAmB,EAAGC,aAAaC,CAAK,IAGhF5B,QAAAuB,gBAAgBC,cAAa,EAAGe,cAAcd,CAAE,EAChDL,EAAQ,CAAA,CAAI,GAGZC,EAAO,OAAO,E,QAEf,CACF,C,EAEDoB,aAAc,CACbnC,MAAO,IAAIX,eAAAY,QAAa,CACvBqB,MAAOU,M,CACP,EACDtB,SAAU,SAASY,GAAT,IAAAX,EAAAC,KACT,OAAO,IAAIC,QAAQ,SAAOC,EAASC,GAAM,OAAAC,UAAAL,EAAA,KAAA,EAAA,KAAA,EAAA,W,iDACpCQ,EAAKzB,QAAAuB,gBAAgBC,cAAa,EAAGE,oBAAmB,EAAGC,aAAaC,CAAK,IAGhF5B,QAAAuB,gBAAgBC,cAAa,EAAGe,cAAcd,CAAE,EAChDL,EAAQ,CAAA,CAAI,GAGZC,EAAO,OAAO,E,QAEf,CACF,C,EAEDqB,6BAA8B,CAC7BpC,MAAO,IAAIX,eAAAY,QAAa,CACvBoC,QAAS,CACRlC,KAAMZ,kBAAA+C,MAAmB,W,EAE1BC,oBAAqB,CACpBpC,KAAMqC,QACNC,SAAU,CAAA,C,EAEX,EACD/B,SAAU,SAAS2B,EAAoBE,GAA7B,IAAA5B,EAAAC,KACT,OADsC,KAAA,IAAA2B,IAAAA,EAAA,CAAA,GAC/B,IAAI1B,QAAQ,SAAOC,EAASC,GAAM,OAAAC,UAAAL,EAAA,KAAA,EAAA,KAAA,EAAA,W,8EACK,UAAzC0B,EAAQK,SAASC,kBAAiB,EAAlC,CAAA,EAAA,IACH5B,EAAO,2BAA2B,EAClC,CAAA,I,OAGgB,MAAA,CAAA,EAAMxB,kBAAA+C,MAAMM,QAAQ,CACnCC,IAAK,CACJ,CAACH,SAAUL,EAAQK,SAASC,kBAAiB,CAAE,EAC/C,CAACG,MAAOT,EAAQS,MAAMH,kBAAiB,CAAE,E,CAE1C,G,OAED,GAPgBI,EAAAC,KAAA,EASf,OADAjC,EAAO,gCAAgC,EACvC,CAAA,G,iBAcF,OAVAsB,EAAQY,KAAM,EAAAtD,gBAAAuD,mBAAiB,EAE/Bb,EAAQc,SAAW,CAClBC,WAAY3D,IAAI4D,KAAK,CAACzB,QAASS,EAAQY,GAAG,EAAGrC,KAAKY,aAAyB,WAAG,CAC7E8B,UAAY,M,CACZ,C,EAGFjB,EAAQkB,YAAc,CAAA,EAEtB,CAAA,EAAMhE,kBAAA+C,MAAMkB,UAAUnB,CAAO,G,cAA7BU,EAAAC,KAAA,EAEIT,IACCkB,EAAY,CACfC,SAAUrB,EAAQqB,SAClB/B,KAAMf,KAAKe,KACXgC,IAAM/C,KAAKY,aAAuB,SAAI,mBAAqBoC,mBAAmBhD,KAAKY,aAAyB,UAAC,EAAI,IAAMa,EAAQc,SAAqB,U,EAGrJvC,KAAKiD,SAAS,iCAAiC,EAAEC,KAAK,SAAAC,GACjDC,EAAWxE,WAAWyE,QAAQF,CAAI,EACtCvE,WAAW0E,eAAe,SAAU,SAACC,EAAGC,GACvC,OAAOD,IAAMC,CACd,CAAC,EAEDzD,EAAKY,UAAUc,EAAQS,MAAO,cAAgBpD,QAAAuB,gBAAgBoD,cAAa,EAAK,uBAAwB,GAAIL,EAASP,CAAS,EAAG,KAAM,KAAM,EAAE,EAE/I3C,EAAQuB,CAAO,CAChB,EAAG,SAAAiC,GAAY,OAAAvD,EAAOuD,CAAQ,CAAf,CAAgB,G,SAEhC,CACF,C,EAEDC,kBAAmB,CAClBvE,MAAO,IAAIX,eAAAY,QAAa,CACvBuE,OAAQ,CACPrE,KAAM6B,M,EAEP,EACDtB,SAAU,SAAS8D,GAAT,IAAA7D,EAAAC,KACT,OAAO,IAAIC,QAAQ,SAAOC,EAASC,GAAM,OAAAC,UAAAL,EAAA,KAAA,EAAA,KAAA,EAAA,W,0EAC7B,MAAA,CAAA,EAAMpB,kBAAA+C,MAAMM,QAAQ,CAACK,IAAKuB,CAAM,CAAC,G,cAAxC7C,EAAOoB,EAAAC,KAAA,KAGLrB,EAAKwB,WACTxB,EAAKwB,SAAW,IAGjBxB,EAAKwB,SAA0B,gBAAI1D,IAAI4D,KAAK,CAACzB,QAAS4C,CAAM,EAAG5D,KAAKY,aAAyB,UAAC,EAE1FiD,EAAY,CACfC,qBAAsB/C,EAAK+B,SAC3BiB,qBAAsB/D,KAAKe,KAC3BgC,IAAM/C,KAAKY,aAAuB,SAAI,oBAAsBoC,mBAAmBhD,KAAKY,aAAyB,UAAC,EAAI,IAAMG,EAAKwB,SAA0B,e,EAGxJ5D,kBAAA+C,MAAMsC,UAAU,CAAC3B,IAAKtB,EAAKsB,GAAG,EAAG,CAAC4B,KAAM,CAAC1B,SAAUxB,EAAKwB,SAAU2B,SAAU,CAAC,CAAC,CAAC,EAAEhB,KAAK,WACrFnD,EAAKkD,SAAS,sCAAsC,EAAEC,KAAK,SAAAC,GACtDC,EAAWxE,WAAWyE,QAAQF,CAAI,EACtCvE,WAAW0E,eAAe,SAAU,SAACC,EAAGC,GACvC,OAAOD,IAAMC,CACd,CAAC,EAEDzD,EAAKY,UAAUI,EAAKmB,MAAO,cAAgBpD,QAAAuB,gBAAgBoD,cAAa,EAAK,sBAAuB,GAAIL,EAASS,CAAS,EAAG,KAAM,KAAM,EAAE,EAE3I3D,EAAQ,CAAA,CAAI,CACb,EAAG,SAAAwD,GAAY,OAAAvD,EAAOuD,CAAQ,CAAf,CAAgB,CAChC,EAAG,YAAQ,G,SAEZ,CACF,C,EAEDS,gBAAiB,CAChB/E,MAAO,IAAIX,eAAAY,QAAa,CACvBuE,OAAQ,CACPrE,KAAM6B,M,EAEPgD,SAAU,CACT7E,KAAM6B,M,EAEP,EACDtB,SAAU,SAAS8D,EAAgBQ,GAAzB,IAAArE,EAAAC,KACT,OAAO,IAAIC,QAAQ,SAAOC,EAASC,GAAM,OAAAC,UAAAL,EAAA,KAAA,EAAA,KAAA,EAAA,W,iEAC7B,MAAA,CAAA,EAAMpB,kBAAA+C,MAAMM,QAAQ,CAACK,IAAKuB,CAAM,CAAC,G,aAExC7C,EAFAA,EAAOoB,EAAAC,KAAA,IAEErB,EAAKsD,MAAMC,YAApB,CAAA,EAAA,GACH,CAAA,EAAM3F,kBAAA+C,MAAM6C,YAAYxD,EAAMqD,CAAQ,G,cAAtCjC,EAAAC,KAAA,EAEAlC,EAAQ,CAAA,CAAI,E,aAGZC,EAAO,cAAc,E,gCAEtB,CACF,C,EAED,CACF,CArNAqE,QAAAxF,mBAAAA","file":"accounts.js","sourcesContent":["import SimpleSchema from 'simpl-schema';\nimport { Users } from '../collections/user.collection';\nimport * as handlebars from 'handlebars';\nimport * as jwt from 'jsonwebtoken';\nimport { MethodManager } from '../managers/method.manager';\nimport { ResolveIOServer } from '../index';\nimport { UserModel } from '../models/user.model';\nimport { objectIdHexString } from '../managers/mongo.manager';\n\nexport function loadAccountMethods(methodManager: MethodManager) {\n\tmethodManager.methods({\n\t\tincorrectUser: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\told_user: {\n\t\t\t\t\ttype: Object,\n\t\t\t\t\tblackbox: true\n\t\t\t\t},\n\t\t\t\tnew_user: {\n\t\t\t\t\ttype: Object,\n\t\t\t\t\tblackbox: true\n\t\t\t\t},\n\t\t\t\tclient_subs: {\n\t\t\t\t\ttype: Array\n\t\t\t\t},\n\t\t\t\t'client_subs.$': {\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: function(old_user, new_user, client_subs) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\t\tif (ResolveIOServer.getMainServer()) {\n\t\t\t\t\t\tlet ws = ResolveIOServer.getMainServer().getWebSocketManager().getWebSocket(this.id_ws);\n\n\t\t\t\t\t\tthis.sendEmail('dev@resolveio.com', 'SERVER - WRONG USER Detected - ' + this.serverConfig['CLIENT_NAME'], 'Wrong User Sent!\\nWS: ' + JSON.stringify(ws, null, 2) + '\\nUserMethod: ' + this.user + '\\nIdUserMethod: ' + this.id_user + '\\nSubManagerActiveSubs: ' + JSON.stringify(ResolveIOServer.getMainServer().getSubscriptionManager().getActiveSubscriptions(), null, 2) + '\\nOldUser: ' + JSON.stringify(old_user, null, 2) + '\\nNewUser: ' + JSON.stringify(new_user, null, 2) + '\\nClientSubs: ' + JSON.stringify(client_subs, null, 2));\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve(true);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\treloadWS: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tid_ws: String\n\t\t\t}),\n\t\t\tfunction: function(id_ws) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\t\tlet ws = ResolveIOServer.getMainServer().getWebSocketManager().getWebSocket(id_ws);\n\n\t\t\t\t\tif (ws) {\n\t\t\t\t\t\tResolveIOServer.getMainServer().unsubscribeWS(ws);\n\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject('No WS');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\treconnectWS: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tid_ws: String\n\t\t\t}),\n\t\t\tfunction: function(id_ws) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\t\tlet ws = ResolveIOServer.getMainServer().getWebSocketManager().getWebSocket(id_ws);\n\n\t\t\t\t\tif (ws) {\n\t\t\t\t\t\tResolveIOServer.getMainServer().unsubscribeWS(ws);\n\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject('No WS');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tdisconnectWS: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tid_ws: String\n\t\t\t}),\n\t\t\tfunction: function(id_ws) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\t\tlet ws = ResolveIOServer.getMainServer().getWebSocketManager().getWebSocket(id_ws);\n\n\t\t\t\t\tif (ws) {\n\t\t\t\t\t\tResolveIOServer.getMainServer().unsubscribeWS(ws);\n\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject('No WS');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tcreateUserAndEmailEnrollment: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tnewUser: {\n\t\t\t\t\ttype: Users['simplschema']\n\t\t\t\t},\n\t\t\t\tsendEnrollmentEmail: {\n\t\t\t\t\ttype: Boolean,\n\t\t\t\t\toptional: true\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: function(newUser: UserModel, sendEnrollmentEmail = true) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\t\tif (newUser.username.toLocaleLowerCase() === 'admin') {\n\t\t\t\t\t\treject('Username can not be admin');\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tlet otherUser = await Users.findOne({\n\t\t\t\t\t\t\t$or: [\n\t\t\t\t\t\t\t\t{username: newUser.username.toLocaleLowerCase()},\n\t\t\t\t\t\t\t\t{email: newUser.email.toLocaleLowerCase()}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (otherUser) {\n\t\t\t\t\t\t\treject('Username/Email is already used');\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tnewUser._id = objectIdHexString();\n\n\t\t\t\t\tnewUser.services = {\n\t\t\t\t\t\tenrollment: jwt.sign({id_user: newUser._id}, this.serverConfig['JWT_SECRET'], {\n\t\t\t\t\t\t\texpiresIn : 3 * 24 * 60 * 60 * 1000 // 3 days\n\t\t\t\t\t\t})\n\t\t\t\t\t};\n\n\t\t\t\t\tnewUser.is_customer = false;\n\t\t\t\t\t\n\t\t\t\t\tawait Users.insertOne(newUser);\n\n\t\t\t\t\tif (sendEnrollmentEmail) {\n\t\t\t\t\t\tlet emailData = {\n\t\t\t\t\t\t\tfullname: newUser.fullname,\n\t\t\t\t\t\t\tuser: this.user,\n\t\t\t\t\t\t\turl: (this.serverConfig['ROOT_URL'] + '/enroll-account?' + encodeURIComponent(this.serverConfig['SERVER_URL']) + '&' + newUser.services['enrollment'])\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tthis.readFile('email-templates/enrollment.html').then(html => {\n\t\t\t\t\t\t\tlet template = handlebars.compile(html);\n\t\t\t\t\t\t\thandlebars.registerHelper('equals', (a, b) => {\n\t\t\t\t\t\t\t\treturn a === b;\n\t\t\t\t\t\t\t});\n\t\t\n\t\t\t\t\t\t\tthis.sendEmail(newUser.email, 'ResolveIO (' + ResolveIOServer.getClientName() + ') - Enrollment Email', '', template(emailData), null, null, '');\n\t\t\n\t\t\t\t\t\t\tresolve(newUser);\n\t\t\t\t\t\t}, errEmail => reject(errEmail));\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tresetUserPassword: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tuserId: {\n\t\t\t\t\ttype: String\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: function(userId: string) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\t\t\t\t\n\t\t\t\t\tlet user = await Users.findOne({_id: userId});\n\t\t\n\t\t\t\t\tif (user) {\n\t\t\t\t\t\tif (!user.services) {\n\t\t\t\t\t\t\tuser.services = {};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tuser.services['forgot_password'] = jwt.sign({id_user: userId}, this.serverConfig['JWT_SECRET']);\n\n\t\t\t\t\t\tlet emailData = {\n\t\t\t\t\t\t\tuserToChangePassword: user.fullname,\n\t\t\t\t\t\t\tuserWhoResetPassword: this.user,\n\t\t\t\t\t\t\turl: (this.serverConfig['ROOT_URL'] + '/forgot-password?' + encodeURIComponent(this.serverConfig['SERVER_URL']) + '&' + user.services['forgot_password'])\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tUsers.updateOne({_id: user._id}, {$set: {services: user.services, attempts: 0}}).then(() => {\n\t\t\t\t\t\t\tthis.readFile('email-templates/forgot-password.html').then(html => {\n\t\t\t\t\t\t\t\tlet template = handlebars.compile(html);\n\t\t\t\t\t\t\t\thandlebars.registerHelper('equals', (a, b) => {\n\t\t\t\t\t\t\t\t\treturn a === b;\n\t\t\t\t\t\t\t\t});\n\t\t\t\n\t\t\t\t\t\t\t\tthis.sendEmail(user.email, 'ResolveIO (' + ResolveIOServer.getClientName() + ') - Forgot Password', '', template(emailData), null, null, '');\n\t\t\t\n\t\t\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t\t\t}, errEmail => reject(errEmail));\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\tsetUserPassword: {\n\t\t\tcheck: new SimpleSchema({\n\t\t\t\tuserId: {\n\t\t\t\t\ttype: String\n\t\t\t\t},\n\t\t\t\tpassword: {\n\t\t\t\t\ttype: String\n\t\t\t\t}\n\t\t\t}),\n\t\t\tfunction: function(userId: string, password: string) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\t\t\t\t\n\t\t\t\t\tlet user = await Users.findOne({_id: userId});\n\t\t\n\t\t\t\t\tif (user && !user.roles.super_admin) {\n\t\t\t\t\t\tawait Users.setPassword(user, password);\n\n\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject('Invalid User');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t});\n}"]}
|
package/methods/cron-jobs.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var __awaiter=this&&this.__awaiter||function(e,o,n,l){return new(n=n||Promise)(function(r,t){function fulfilled(e){try{step(l.next(e))}catch(e){t(e)}}function rejected(e){try{step(l.throw(e))}catch(e){t(e)}}function step(e){var t;e.done?r(e.value):((t=e.value)instanceof n?t:new n(function(e){e(t)})).then(fulfilled,rejected)}step((l=l.apply(e,o||[])).next())})},__generator=this&&this.__generator||function(o,n){var l,a,i,f={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]},d={next:verb(0),throw:verb(1),return:verb(2)};return"function"==typeof Symbol&&(d[Symbol.iterator]=function(){return this}),d;function verb(r){return function(e){var t=[r,e];if(l)throw new TypeError("Generator is already executing.");for(;f=d&&t[d=0]?0:f;)try{if(l=1,a&&(i=2&t[0]?a.return:t[0]?a.throw||((i=a.return)&&i.call(a),0):a.next)&&!(i=i.call(a,t[1])).done)return i;switch(a=0,(t=i?[2&t[0],i.value]:t)[0]){case 0:case 1:i=t;break;case 4:return f.label++,{value:t[1],done:!1};case 5:f.label++,a=t[1],t=[0];continue;case 7:t=f.ops.pop(),f.trys.pop();continue;default:if(!(i=0<(i=f.trys).length&&i[i.length-1])&&(6===t[0]||2===t[0])){f=0;continue}if(3===t[0]&&(!i||t[1]>i[0]&&t[1]<i[3]))f.label=t[1];else if(6===t[0]&&f.label<i[1])f.label=i[1],i=t;else{if(!(i&&f.label<i[2])){i[2]&&f.ops.pop(),f.trys.pop();continue}f.label=i[2],f.ops.push(t)}}t=n.call(o,f)}catch(e){t=[6,e],a=0}finally{l=i=0}if(5&t[0])throw t[1];return{value:t[0]?t[1]:void 0,done:!0}}}},report_builder_report_collection_1=(Object.defineProperty(exports,"__esModule",{value:!0}),exports.loadCronJobMethods=void 0,require("../collections/report-builder-report.collection")),simpl_schema_1=require("simpl-schema"),common_1=require("../util/common"),moment=require("moment-timezone"),XLSX=require("xlsx"),Excel=require("exceljs"),file_collection_1=require("../collections/file.collection"),cron_job_collection_1=require("../collections/cron-job.collection");function loadCronJobMethods(e){e.methods({cronEmailMergedDocsCleanUp:{function:function(){var t=this;return new Promise(function(r,e){return __awaiter(t,void 0,void 0,function(){var t;return __generator(this,function(e){switch(e.label){case 0:return[4,file_collection_1.Files.find({$and:[{type:"Email Merged Docs"},{createdAt:{$lte:moment().subtract(1,"day").toDate()}}]})];case 1:return(t=e.sent()).length&&(this.callMethodInternal("deleteFiles"),file_collection_1.Files.deleteMany({_id:{$in:t.map(function(e){return e._id})}})),r(!0),[2]}})})})}},stuckCronJob:{function:function(){var t=this;return new Promise(function(r,e){return __awaiter(t,void 0,void 0,function(){var t;return __generator(this,function(e){switch(e.label){case 0:return t=moment().subtract(5,"minutes").toDate(),[4,cron_job_collection_1.CronJobs.find({running:!0,updatedAt:{$lte:t}})];case 1:return(t=e.sent()).length&&cron_job_collection_1.CronJobs.updateMany({_id:{$in:t.map(function(e){return e._id})}},{$set:{running:!1}}),r(!0),[2]}})})})}},reportbuilderCronJob:{check:new simpl_schema_1.default({data:{type:Object,blackbox:!0}}),function:function(F){var e=this;return new Promise(function(L,N){return __awaiter(e,void 0,void 0,function(){var w,r,o,t,n,l,O=this;return __generator(this,function(e){switch(e.label){case 0:return[4,report_builder_report_collection_1.ReportBuilderReports.findById(F.id_report)];case 1:return(w=e.sent()).fields_selected.forEach(function(e){var t,r=e.fieldPath.replace(/\.\$/g,"").split(".");e.fieldPathObj=null;for(var o=r.length-1;0<=o;o--)e.fieldPathObj?e.fieldPathObj=((t={})[r[o]]=e.fieldPathObj,t):e.fieldPathObj=((t={})[r[o]]=1,t)}),(w.fields_selected&&w.fields_selected.length||w.groups_row&&w.groups_row.length)&&(r={},o=0,w.fields_selected.forEach(function(t){t.collection_name===w.collection_root&&(r=(0,common_1.mergeDeep)(r,t.fieldPathObj));var e=w.fields_sort.findIndex(function(e){return e.field===t.id});0<=e&&(w.fields_sort[e].field="f_"+o),t.id="f_"+o,o+=1}),t={},w.fields_sort.length?w.fields_sort.forEach(function(e){e.field.startsWith("gr_")?t["_id."+e.field]="asc"===e.order?1:-1:t[e.field]="asc"===e.order?1:-1}):t=null,n={limit:0,skip:0,fields:r,sort:t},l=[],w.fields_filter.forEach(function(e){var a=[];e.ors.filter(function(e){return!e.field.includes(".$.")}).forEach(function(o){var e,t,r,n,l;o.condition&&o.field&&(null!==o.value&&(!Array.isArray(o.value)||o.value.length)||"null"===o.condition||"nnull"===o.condition)&&("bw"===o.condition?"Date"===o.fieldType&&o.is_rolling?(t=r=null,"Q1"===o.rolling_interval?(r=moment().startOf("year").toDate(),t=moment().startOf("year").quarter(2).subtract(1,"days").toDate()):"Q2"===o.rolling_interval?(r=moment().startOf("year").quarter(2).toDate(),t=moment().startOf("year").quarter(3).subtract(1,"days").toDate()):"Q3"===o.rolling_interval?(r=moment().startOf("year").quarter(3).toDate(),t=moment().startOf("year").quarter(4).subtract(1,"days").toDate()):"Q4"===o.rolling_interval?(r=moment().startOf("year").quarter(4).toDate(),t=moment().endOf("year").toDate()):"Today"===o.rolling_interval?(r=moment().startOf("day").toDate(),t=moment().endOf("day").toDate()):"Yesterday"===o.rolling_interval?(r=moment().subtract(1,"days").startOf("day").toDate(),t=moment().subtract(1,"days").endOf("day").toDate()):"Week"===o.rolling_interval?(r=moment().startOf("isoWeek").toDate(),t=moment().endOf("day").toDate()):"Last Week"===o.rolling_interval?(t=moment().startOf("isoWeek").subtract(1,"days").toDate(),r=moment(t).startOf("isoWeek").toDate()):"Month"===o.rolling_interval?(r=moment().startOf("month").toDate(),t=moment().endOf("day").toDate()):"Last Month"===o.rolling_interval?(t=moment().startOf("month").subtract(1,"days").endOf("day").toDate(),r=moment(t).startOf("month").toDate()):"Last 30 Days"===o.rolling_interval?(t=moment().endOf("day").toDate(),r=moment().subtract(30,"days").startOf("day").toDate()):"Quarter"===o.rolling_interval?(r=moment().startOf("year").quarter(moment().quarter()).toDate(),t=moment().endOf("day").toDate()):"Last Quarter"===o.rolling_interval?(t=moment().startOf("year").quarter(moment().quarter()).subtract(1,"days").endOf("day").toDate(),r=moment(t).startOf("quarter").toDate()):"Year"===o.rolling_interval?(r=moment().startOf("year").toDate(),t=moment().endOf("day").toDate()):"Last Year"===o.rolling_interval?(t=moment().startOf("year").subtract(1,"days").endOf("day").toDate(),r=moment(t).startOf("year").toDate()):"All"===o.rolling_interval&&(r=new Date(2017,0,1,0,0,0,0),t=moment().endOf("day").toDate()),t.setHours(23),t.setMinutes(59),t.setSeconds(59),t.setMilliseconds(999),a.push({$and:[((e={})[o.field]={$gte:r},e),((r={})[o.field]={$lte:t},r)]})):a.push({$and:[((e={})[o.field]={$gte:o.value},e),((t={})[o.field]={$lte:o.highValue},t)]}):"nnull"===o.condition?((r=[]).push(((e={})[o.field]={$exists:!0},e)),r.push(((t={})[o.field]={$ne:null},t)),"String"===o.fieldType&&r.push(((e={})[o.field]={$ne:""},e)),a.push({$and:r})):"null"===o.condition?a.push(((t={})[o.field]={$eq:null},t)):Array.isArray(o.value)?"ne"===o.condition?(n=[],o.value.forEach(function(e){var t,r;n.push(((t={})[o.field]=((r={})["$"+o.condition]=Array.isArray(e)?e[0]:e,r),t))}),a.push(1<n.length?{$and:n}:n[0])):(l=[],o.value.forEach(function(e){var t,r;l.push(((t={})[o.field]=((r={})["$"+o.condition]=Array.isArray(e)?e[0]:e,r),t))}),a.push(1<l.length?{$or:l}:l[0])):a.push(((e={})[o.field]=((r={})["$"+o.condition]=o.value,r),e)))}),a.length&&l.push({$or:a})}),this.callMethodInternal("reportBuilderBuildTree",w.collection_root,function(e,t){var i,f,d;t&&(t.layers=[t],i=[],getTreeLeaves(t.children,[]),getTreeLeaves(t.children,i,!0),f=[],d=[],w.fields_filter.forEach(function(e){var a=[];e.ors.filter(function(e){return e.field.includes(".$.")}).forEach(function(o){var e,t,n,l,r=i.find(function(e){return e.fieldPath===o.field});r&&f.push(r),o.condition&&o.field&&(null!==o.value&&(!Array.isArray(o.value)||o.value.length)||"null"===o.condition||"nnull"===o.condition)&&("bw"===o.condition?"Date"===o.fieldType&&o.is_rolling?(t=r=null,"Q1"===o.rolling_interval?(r=moment().startOf("year").toDate(),t=moment().startOf("year").quarter(2).subtract(1,"days").toDate()):"Q2"===o.rolling_interval?(r=moment().startOf("year").quarter(2).toDate(),t=moment().startOf("year").quarter(3).subtract(1,"days").toDate()):"Q3"===o.rolling_interval?(r=moment().startOf("year").quarter(3).toDate(),t=moment().startOf("year").quarter(4).subtract(1,"days").toDate()):"Q4"===o.rolling_interval?(r=moment().startOf("year").quarter(4).toDate(),t=moment().endOf("year").toDate()):"Today"===o.rolling_interval?(r=moment().startOf("day").toDate(),t=moment().endOf("day").toDate()):"Yesterday"===o.rolling_interval?(r=moment().subtract(1,"days").startOf("day").toDate(),t=moment().subtract(1,"days").endOf("day").toDate()):"Week"===o.rolling_interval?(r=moment().startOf("isoWeek").toDate(),t=moment().endOf("day").toDate()):"Last Week"===o.rolling_interval?(t=moment().startOf("isoWeek").subtract(1,"days").toDate(),r=moment(t).startOf("isoWeek").toDate()):"Month"===o.rolling_interval?(r=moment().startOf("month").toDate(),t=moment().endOf("day").toDate()):"Last Month"===o.rolling_interval?(t=moment().startOf("month").subtract(1,"days").endOf("day").toDate(),r=moment(t).startOf("month").toDate()):"Last 30 Days"===o.rolling_interval?(t=moment().endOf("day").toDate(),r=moment().subtract(30,"days").startOf("day").toDate()):"Quarter"===o.rolling_interval?(r=moment().startOf("year").quarter(moment().quarter()).toDate(),t=moment().endOf("day").toDate()):"Last Quarter"===o.rolling_interval?(t=moment().startOf("year").quarter(moment().quarter()).subtract(1,"days").endOf("day").toDate(),r=moment(t).startOf("quarter").toDate()):"Year"===o.rolling_interval?(r=moment().startOf("year").toDate(),t=moment().endOf("day").toDate()):"Last Year"===o.rolling_interval?(t=moment().startOf("year").subtract(1,"days").endOf("day").toDate(),r=moment(t).startOf("year").toDate()):"All"===o.rolling_interval&&(r=new Date(2017,0,1,0,0,0,0),t=moment().endOf("day").toDate()),t.setHours(23),t.setMinutes(59),t.setSeconds(59),t.setMilliseconds(999),a.push({$and:[((e={})[o.field.replace(/\.\$/g,"")]={$gte:r},e),((r={})[o.field.replace(/\.\$/g,"")]={$lte:t},r)]})):d.push({$and:[((e={})[o.field.replace(/\.\$/g,"")]={$gte:o.value},e),((t={})[o.field.replace(/\.\$/g,"")]={$lte:o.highValue},t)]}):"nnull"===o.condition?((r=[]).push(((e={})[o.field.replace(/\.\$/g,"")]={$exists:!0},e)),r.push(((t={})[o.field.replace(/\.\$/g,"")]={$ne:null},t)),"String"===o.fieldType&&r.push(((e={})[o.field.replace(/\.\$/g,"")]={$ne:""},e)),a.push({$and:r})):"null"===o.condition?a.push(((t={})[o.field.replace(/\.\$/g,"")]={$eq:null},t)):Array.isArray(o.value)?"ne"===o.condition?(n=[],o.value.forEach(function(e){var t,r;n.push(((t={})[o.field.replace(/\.\$/g,"")]=((r={})["$"+o.condition]=Array.isArray(e)?e[0]:e,r),t))}),a.push(1<n.length?{$and:n}:n[0])):(l=[],o.value.forEach(function(e){var t,r;l.push(((t={})[o.field.replace(/\.\$/g,"")]=((r={})["$"+o.condition]=Array.isArray(e)?e[0]:e,r),t))}),a.push(1<l.length?{$or:l}:l[0])):a.push(((e={})[o.field.replace(/\.\$/g,"")]=((r={})["$"+o.condition]=o.value,r),e)))}),a.length&&d.push({$or:a})}),O.callMethodInternal("reportBuilderGetResults",w.type,w.collection_root,n,l,d,f,w.fields_selected,w.fields_custom,w.groups_row,w.fields_total,w.fields_link,w.id_date_field||null,w.date_interval||null,w.group_type,function(e,t){if(t&&t[0]){var i=t[0].results,r=t[0].totals;if("List"===w.type){w.fields_selected.filter(function(e){return e.show}).forEach(function(t){"Number"!==t.fieldType&&"Count"!==t.leafValueType||"Number"!==t.leafFormatType?"Number"!==t.fieldType&&"Count"!==t.leafValueType||"String"!==t.leafFormatType?"Number"!==t.fieldType&&"Count"!==t.leafValueType||"Currency"!==t.leafFormatType?"Boolean"!==t.fieldType||t.leafFormatType&&"Boolean"!==t.leafFormatType?"Boolean"===t.fieldType&&"String"===t.leafFormatType?i.filter(function(e){return null!==e[t.id]&&void 0!==e[t.id]}).forEach(function(e){e[t.id]=!0===e[t.id]?"Yes":"No"}):"Boolean"===t.fieldType&&"Boolean_Number"===t.leafFormatType?i.filter(function(e){return null!==e[t.id]&&void 0!==e[t.id]}).forEach(function(e){e[t.id]=!0===e[t.id]?1:0}):"Date"===t.fieldType&&"Date"===t.leafFormatType?i.filter(function(e){return null!==e[t.id]&&void 0!==e[t.id]}).forEach(function(e){e[t.id]=moment(e[t.id]).format("L")}):"Date"===t.fieldType&&"Time"===t.leafFormatType?i.filter(function(e){return null!==e[t.id]&&void 0!==e[t.id]}).forEach(function(e){e[t.id]=moment(e[t.id]).format("LT")}):"Date"===t.fieldType&&"DateTime"===t.leafFormatType?i.filter(function(e){return null!==e[t.id]&&void 0!==e[t.id]}).forEach(function(e){e[t.id]=moment(e[t.id]).format("MM/DD/YYYY h:mm A")}):"Date"===t.fieldType&&"Date_long"===t.leafFormatType?i.filter(function(e){return null!==e[t.id]&&void 0!==e[t.id]}).forEach(function(e){e[t.id]=moment(e[t.id]).format("LL")}):"Date"===t.fieldType&&"DateTime_long"===t.leafFormatType?i.filter(function(e){return null!==e[t.id]&&void 0!==e[t.id]}).forEach(function(e){e[t.id]=moment(e[t.id]).format("LLL")}):"Date"===t.fieldType&&"Timestamp"===t.leafFormatType&&i.filter(function(e){return null!==e[t.id]&&void 0!==e[t.id]}).forEach(function(e){e[t.id]=moment(e[t.id]).toDate().getTime()}):i.filter(function(e){return null!==e[t.id]&&void 0!==e[t.id]}).forEach(function(e){e[t.id]=!0===e[t.id]?"True":"False"}):i.filter(function(e){return null!==e[t.id]&&void 0!==e[t.id]}).forEach(function(e){e[t.id]=(0,common_1.round)(e[t.id],2).toLocaleString("en-US",{style:"currency",currency:"USD"})}):i.filter(function(e){return null!==e[t.id]&&void 0!==e[t.id]}).forEach(function(e){e[t.id]=e[t.id].toLocaleString("en-US",{style:"currency",currency:"USD"})}):i.filter(function(e){return null!==e[t.id]&&void 0!==e[t.id]}).forEach(function(e){e[t.id]=e[t.id].toLocaleString()})});var o=[],n=(w.groups_row.forEach(function(e){e.id,e.columnName}),w.fields_selected.filter(function(e){return e.show}).forEach(function(e){e.columnName,e.columnName}),XLSX.utils.book_new()),a=(i.forEach(function(t){var r={};w.groups_row.forEach(function(e){Array.isArray(t._id[e.id])?r[e.columnName]=t._id[e.id].join(","):"Number"===e.treeItem.fieldType?r[e.columnName]=t._id[e.id]?"string"==typeof t._id[e.id]?parseFloat(t._id[e.id].replace(/,/g,"").replace(/\$/g,"")):t._id[e.id]:"":r[e.columnName]=t._id[e.id]||""}),w.fields_selected.filter(function(e){return e.show}).forEach(function(e){Array.isArray(t[e.id])?r[e.columnName]=t[e.id].join(","):"Number"===e.fieldType||"Count"===e.leafValueType?r[e.columnName]=t[e.id]?"string"==typeof t[e.id]?parseFloat(t[e.id].replace(/,/g,"").replace(/\$/g,"")):t[e.id]:"":r[e.columnName]=t[e.id]||""}),o.push(r)}),XLSX.utils.json_to_sheet(o)),l=(XLSX.utils.book_append_sheet(n,a,"RB Data"),XLSX.write(n,{bookType:"xlsx",type:"base64"}));F.emails.forEach(function(e){O.sendEmail(e,O.serverConfig.CLIENT_NAME+" Scheduled Report - "+w.report_name,"","\n\t\t\t\t\t\t\t\t\t\t\t\t\t<b>"+O.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>"+w.report_name+"<br>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<b>Prepared By: </b>"+F.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>",[{filename:w.report_name+"-"+moment().format("MM-DD-YYYY-hh-mm-A")+".xlsx",content:l,encoding:"base64"}],O.serverConfig.MAIL_FROM_REPORTS,"")})}else if("Group"===w.type){w.fields_selected.filter(function(e){return e.show}).forEach(function(t){i.forEach(function(e){modifyDataTypeField(w,e,t,1)})});var f=(n=new Excel.Workbook).addWorksheet("RB_1",{views:[{showGridLines:!1}]}),d=(n.properties.date1904=!1,n.calcProperties.fullCalcOnLoad=!0,1),t=f.getRow(d),t=(t.getCell(2).font={name:"Arial",bold:!0,size:14},t.getCell(4).font={name:"Arial",size:14},t.getCell(2).value="Report Name:",t.getCell(4).value=w.report_name,d+=1,(t=f.getRow(d)).getCell(2).font={name:"Arial",bold:!0,size:14},t.getCell(4).font={name:"Arial",size:14},t.getCell(2).value="Run Date:",t.getCell(4).value=moment().format("LLL"),d+=2,(0,common_1.deepCopy)(i)),u=[];t.forEach(function(e){d=tabGroupExcelRecursive(w,f,d,1,e),tabGroupExcelWidthRecursive(w,1,e,u)});for(var c=1;c<f.columns.length;c++)f.columns[c].width=u[c-1];var s=new Date;n.xlsx.writeBuffer().then(function(t){F.emails.forEach(function(e){O.sendEmail(e,O.serverConfig.CLIENT_NAME+" Scheduled Report - "+w.report_name,"","\n\t\t\t\t\t\t\t\t\t\t\t\t\t<b>"+O.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>"+w.report_name+"<br>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<b>Prepared By: </b>"+F.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>",[{filename:"Group_Report_"+w.report_name+"_"+s.getFullYear()+"_"+(s.getMonth()+1)+"_"+s.getDate()+".xlsx",content:t}],O.serverConfig.MAIL_FROM_REPORTS,"")})}).catch(function(e){return console.log("Error writing excel export",e)})}else if("Dated"===w.type){var m=[],y=[],h=[],p=[],g=[];if("Quarterly"===w.date_interval){i.forEach(function(e){e._id.month<4?e._id.quarter=1:e._id.month<7?e._id.quarter=2:e._id.month<10?e._id.quarter=3:e._id.quarter=4,delete e._id.month});for(c=i.length-1;1<=c;c--)!function(e){var t,r=i[e];1<i.filter(function(e){return JSON.stringify(e._id)===JSON.stringify(r._id)}).length&&(t=i.find(function(e){return JSON.stringify(e._id)===JSON.stringify(r._id)}),Object.keys(t).filter(function(e){return"_id"!==e}).forEach(function(e){t[e]+=r[e]}),i.splice(e,1))}(c)}t=(0,common_1.deepCopy)(i);t.forEach(function(t){delete t._id.day,delete t._id.week,delete t._id.month,delete t._id.quarter,delete t._id.year;var r={};Object.keys(t._id).forEach(function(e){r[e]=t._id[e]}),y.find(function(e){return JSON.stringify(e)===JSON.stringify(r)})||y.push(r)}),(t=(0,common_1.deepCopy)(i)).forEach(function(t){Object.keys(t._id).filter(function(e){return"second"!==e&&"hour"!==e&&"minute"!==e&&"day"!==e&&"week"!==e&&"month"!==e&&"quarter"!==e&&"year"!==e}).forEach(function(e){delete t._id[e]});var r={};Object.keys(t._id).forEach(function(e){r[e]=t._id[e]}),m.find(function(e){return JSON.stringify(e)===JSON.stringify(r)})||m.push(r)}),m.forEach(function(e){e.year?"Seconds"===w.date_interval?(e.date=moment.tz({year:e.year,month:e.month-1,day:e.day,hour:e.hour,minute:e.minute,second:e.second},process.env.TZ_CLIENT||"America/Chicago").toDate(),e.dateString=moment(e.date).format("MMM DD YYYY HH:mm:ss")):"Minutes"===w.date_interval?(e.date=moment.tz({year:e.year,month:e.month-1,day:e.day,hour:e.hour,minute:e.minute},process.env.TZ_CLIENT||"America/Chicago").toDate(),e.dateString=moment(e.date).format("MMM DD YYYY HH:mm")):"Hours"===w.date_interval?(e.date=moment.tz({year:e.year,month:e.month-1,day:e.day,hour:e.hour},process.env.TZ_CLIENT||"America/Chicago").toDate(),e.dateString=moment(e.date).format("MMM DD YYYY HH")):"Daily"===w.date_interval?(e.date=moment.tz({year:e.year,month:e.month-1,day:e.day},process.env.TZ_CLIENT||"America/Chicago").toDate(),e.dateString=moment(e.date).format("MMM DD YYYY")):"Weekly"===w.date_interval?(e.date=moment.tz({year:e.year,week:e.week},process.env.TZ_CLIENT||"America/Chicago").day("Monday").toDate(),e.dateLast=moment.tz({year:e.year,week:e.week},process.env.TZ_CLIENT||"America/Chicago").day("Sunday").toDate(),e.dateString="Week #"+e.week+" "+e.year+" ("+moment(e.date).format("MM/DD/YY")+" - "+moment(e.dateLast).format("MM/DD/YY")+")"):"Monthly"===w.date_interval?(e.date=moment.tz({year:e.year,month:e.month-1},process.env.TZ_CLIENT||"America/Chicago").toDate(),e.dateString=moment(e.date).format("MMM YYYY")):"Quarterly"===w.date_interval?(e.date=moment.tz({year:e.year},process.env.TZ_CLIENT||"America/Chicago").quarter(e.quarter).toDate(),e.dateString="Q"+e.quarter+" "+e.year):"Yearly"===w.date_interval&&(e.date=moment.tz({year:e.year},process.env.TZ_CLIENT||"America/Chicago").toDate(),e.dateString=e.year.toString()):e.dateString="No Date"}),(m=m.filter(function(e){return!e.date}).concat(m.filter(function(e){return e.date}).sort(function(e,t){return e.date.getTime()-t.date.getTime()}))).forEach(function(n){var t=[],r={},l={},a={};y.forEach(function(o){var e=i.find(function(t){var r=!0;return Object.keys(o).forEach(function(e){t._id[e]!==o[e]&&(r=!1)}),Object.keys(n).filter(function(e){return"date"!==e&&"dateLast"!==e&&"dateString"!==e}).forEach(function(e){t._id[e]!==n[e]&&(r=!1)}),r});e?(t.push(e),Object.keys(e._id).filter(function(e){return e}).forEach(function(t){w.fields_total.filter(function(e){return e.fields.includes(t)}).length&&(r[t]?r[t]+=e._id[t]:r[t]=e._id[t],l[t]?l[t]+=1:l[t]=1,a[t]=w.fields_total.find(function(e){return e.fields.includes(t)}).type)}),Object.keys(e).filter(function(e){return e&&"_id"!==e}).forEach(function(t){w.fields_total.filter(function(e){return e.fields.includes(t)}).length&&(r[t]?r[t]+=e[t]:r[t]=e[t],l[t]?l[t]+=1:l[t]=1,a[t]=w.fields_total.find(function(e){return e.fields.includes(t)}).type)})):t.push(null)}),Object.keys(a).forEach(function(e){"avg"===a[e]&&(r[e]=r[e]/l[e]),r[e]=(0,common_1.round)(r[e],2)}),g.push(r),h.push(t)}),y.forEach(function(o){var r={},n=i.filter(function(t){var r=!(!Object.keys(o).length||null===o._id);return Object.keys(o).filter(function(e){return"date"!==e&&"dateLast"!==e&&"dateString"!==e&&"second"!==e&&"minute"!==e&&"hour"!==e&&"day"!==e&&"week"!==e&&"month"!==e&&"quarter"!==e&&"year"!==e}).forEach(function(e){t._id[e]!==o[e]&&(r=!1)}),r});w.fields_total.forEach(function(e){e.fields.forEach(function(t){n.length?(r[t]=n.filter(function(e){return e&&e[t]}).map(function(e){return e[t]}).reduce(function(e,t){return e+t},0),"avg"===e.type&&(r[t]=(0,common_1.round)(r[t]/n.length,2))):r[t]=0})}),p.push(r)});for(var a=(n=new Excel.Workbook).addWorksheet("Dated_Report",{views:[{showGridLines:!0}]}),_=(n.properties.date1904=!1,n.calcProperties.fullCalcOnLoad=!0,1),v=1,b=((D=a.getRow(_)).getCell(2).font={name:"Arial",bold:!0,size:14},D.getCell(4).font={name:"Arial",size:14},D.getCell(2).value="Report Name:",D.getCell(4).value=w.report_name,_+=1,(D=a.getRow(_)).getCell(2).font={name:"Arial",bold:!0,size:14},D.getCell(4).font={name:"Arial",size:14},D.getCell(2).value="Run Date:",D.getCell(4).value=moment().format("LLL"),_+=2,D=a.getRow(_),w.groups_row.forEach(function(e){D.getCell(v).value=e.columnName,v++}),w.fields_selected.filter(function(e){return e.show}).forEach(function(e){v++}),w.fields_selected.filter(function(e){return e.show}).forEach(function(){m.forEach(function(e){D.getCell(v).value=e.dateString,v++})}),w.fields_total.forEach(function(e){D.getCell(v).value="Totals - "+(0,common_1.toTitleCase)(e.type),v++}),_+=v=1,D=a.getRow(_),function(n){for(var l=y[n],e=0;e<w.fields_selected.filter(function(e){return e.show}).length;e++)!function(t){var e=w.fields_selected.filter(function(e){return e.show})[t];v=1,D=a.getRow(_),w.groups_row.forEach(function(e){D.getCell(v).value=0===t?l[e.id]:"",v++}),D.getCell(v).value=e.columnName,v++;for(var r=0;r<m.length;r++){var o=h[r];o[n]?D.getCell(v).value=o[n][e.id]||"":D.getCell(v).value="",v++}for(r=0;r<w.fields_total.length;r++){w.fields_total[r];D.getCell(v).value=p[n][e.id]||"",v++}_++}(e)}),c=0;c<y.length;c++)b(c);if(r)for(c=0;c<w.fields_total.length;c++){var T=w.fields_total[c],D=a.getRow(_),v=1;D.getCell(v).value=(0,common_1.toTitleCase)(T.type)+" Totals",v+=w.groups_row.length,w.fields_selected.filter(function(e){return e.show}).forEach(function(){v+=1}),m.forEach(function(){v++});for(var C=0;C<w.fields_selected.filter(function(e){return e.show}).length;C++){var E=w.fields_selected.filter(function(e){return e.show})[C];D.getCell(v).value=r[T.id+"_"+E.id]||"",v++}_++}n.xlsx.writeBuffer().then(function(t){F.emails.forEach(function(e){O.sendEmail(e,O.serverConfig.CLIENT_NAME+" Scheduled Report - "+w.report_name,"","\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<b>".concat(O.serverConfig.CLIENT_NAME," Automated Report</b><br>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<b>Report Name: </b>").concat(w.report_name,"<br>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<b>Prepared By: </b>").concat(F.user,"<br><br>\n\t\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\t\tResolveIO<br><br>"),[{filename:w.report_name+"-"+moment().format("MM-DD-YYYY-hh-mm-A")+".xlsx",content:t}],O.serverConfig.MAIL_FROM_REPORTS,"")})}).catch(function(e){return console.log("Error writing excel export",e)}),L(!0)}}else O.callMethodInternal("insertErrorLog","Report Builder Cron Job - Report Builder Get Results",[e]),N(e)}))})),[2]}})})})}}})}function getTreeLeaves(e,t,r){void 0===r&&(r=!1),e.forEach(function(e){e.isLeaf?t.push(e):e.lookup_collection&&!r||getTreeLeaves(e.children,t,r)})}function modifyDataTypeField(r,o,n,l){l<r.groups_row.length?(o=o["gr_"+(l+1)])&&o.forEach(function(e,t){modifyDataTypeField(r,e,n,l+1)}):Array.isArray(o[n.id])?o[n.id].forEach(function(e,t){"Number"!==n.fieldType&&"Count"!==n.leafValueType||"Number"!==n.leafFormatType?"Number"!==n.fieldType&&"Count"!==n.leafValueType||"String"!==n.leafFormatType?"Number"!==n.fieldType&&"Count"!==n.leafValueType||"Currency"!==n.leafFormatType?"Boolean"!==n.fieldType||n.leafFormatType&&"Boolean"!==n.leafFormatType?"Boolean"===n.fieldType&&"String"===n.leafFormatType?o[n.id].splice(t,1,!0===e?"Yes":"No"):"Boolean"===n.fieldType&&"Boolean_Number"===n.leafFormatType?o[n.id].splice(t,1,!0===e?1:0):"Date"===n.fieldType&&"Date"===n.leafFormatType?o[n.id].splice(t,1,moment(e).format("L")):"Date"===n.fieldType&&"Time"===n.leafFormatType?o[n.id].splice(t,1,moment(e).format("LT")):"Date"===n.fieldType&&"DateTime"===n.leafFormatType?o[n.id].splice(t,1,moment(e).format("MM/DD/YYYY h:mm A")):"Date"===n.fieldType&&"Date_long"===n.leafFormatType?o[n.id].splice(t,1,moment(e).format("LL")):"Date"===n.fieldType&&"DateTime_long"===n.leafFormatType?o[n.id].splice(t,1,moment(e).format("LLL")):"Date"===n.fieldType&&"Timestamp"===n.leafFormatType&&o[n.id].splice(t,1,moment(e).toDate().getTime()):o[n.id].splice(t,1,!0===e?"True":"False"):o[n.id].splice(t,1,(0,common_1.round)(e,2).toLocaleString("en-US",{style:"currency",currency:"USD"})):o[n.id].splice(t,1,e.toString()):o[n.id].splice(t,1,e.toLocaleString())}):"Number"!==n.fieldType&&"Count"!==n.leafValueType||"Number"!==n.leafFormatType?"Number"!==n.fieldType&&"Count"!==n.leafValueType||"String"!==n.leafFormatType?"Number"!==n.fieldType&&"Count"!==n.leafValueType||"Currency"!==n.leafFormatType?"Boolean"!==n.fieldType||n.leafFormatType&&"Boolean"!==n.leafFormatType?"Boolean"===n.fieldType&&"String"===n.leafFormatType?o[n.id]=!0===o[n.id]?"Yes":"No":"Boolean"===n.fieldType&&"Boolean_Number"===n.leafFormatType?o[n.id]=!0===o[n.id]?1:0:"Date"===n.fieldType&&"Date"===n.leafFormatType?o[n.id]=moment(o[n.id]).format("L"):"Date"===n.fieldType&&"Time"===n.leafFormatType?o[n.id]=moment(o[n.id]).format("LT"):"Date"===n.fieldType&&"DateTime"===n.leafFormatType?o[n.id]=moment(o[n.id]).format("MM/DD/YYYY h:mm A"):"Date"===n.fieldType&&"Date_long"===n.leafFormatType?o[n.id]=moment(o[n.id]).format("LL"):"Date"===n.fieldType&&"DateTime_long"===n.leafFormatType?o[n.id]=moment(o[n.id]).format("LLL"):"Date"===n.fieldType&&"Timestamp"===n.leafFormatType&&(o[n.id]=moment(o[n.id]).toDate().getTime()):o[n.id]=!0===o[n.id]?"True":"False":o[n.id]=(0,common_1.round)(o[n.id],2).toLocaleString("en-US",{style:"currency",currency:"USD"}):o[n.id]=o[n.id].toString():o[n.id]=o[n.id].toLocaleString()}function tabGroupExcelRecursive(o,n,l,r,a){var i=n.getRow(l);return r<o.groups_row.length?(i.getCell(2).fill={fgColor:{argb:o.groups_row[r-1].fill_color?o.groups_row[r-1].fill_color.replace("#",""):"ffffff"},type:"pattern",pattern:"solid"},i.getCell(2).font={color:{argb:o.groups_row[r-1].font_color?o.groups_row[r-1].font_color.replace("#",""):"000000"},name:"Arial",bold:!0,size:14},i.getCell(2).value=o.groups_row[r-1].columnName+": "+a._id["gr_"+r],n.mergeCells(i.getCell(2).$col$row+":"+i.getCell(o.fields_selected.filter(function(e){return e.show}).length+1).$col$row),i.getCell(2).border={top:{style:"thick"},left:{style:"thick"},right:{style:"thick"}},o.fields_total.length&&o.fields_total.forEach(function(r){l+=1,i=n.getRow(l),o.fields_selected.filter(function(e){return e.show}).forEach(function(e,t){r.fields.includes(e.id)&&(i.getCell(t+2).value=e.columnName,i.getCell(t+2).font={name:"Arial",bold:!0,size:10}),"Currency"===e.leafFormatType?i.getCell(t+2).numFmt='"$"#,##0.00':"Number"===e.leafFormatType&&(i.getCell(t+2).numFmt="#,##0"),0===t?i.getCell(t+2).border={left:{style:"thick"}}:t===o.fields_selected.filter(function(e){return e.show}).length-1&&(i.getCell(t+2).border={right:{style:"thick"}})})}),o.fields_total.forEach(function(r){l+=1,i=n.getRow(l),o.fields_selected.filter(function(e){return e.show}).forEach(function(e,t){r.fields.includes(e.id)&&(i.getCell(t+2).value=a[r.id+"_"+e.id],i.getCell(t+2).font={name:"Arial",bold:!0,size:10},"Currency"===e.leafFormatType?i.getCell(t+2).numFmt='"$"#,##0.00':"Number"===e.leafFormatType&&(i.getCell(t+2).numFmt="#,##0")),0===t?i.getCell(t+2).border={top:{style:"thin"},left:{style:"thick"},bottom:{style:"thick"}}:t===o.fields_selected.filter(function(e){return e.show}).length-1?i.getCell(t+2).border={top:{style:"thin"},bottom:{style:"thick"},right:{style:"thick"}}:i.getCell(t+2).border={top:{style:"thin"},bottom:{style:"thick"}}})}),l+=1,(a=a["gr_"+(r+1)]).forEach(function(e,t){l=tabGroupExcelRecursive(o,n,l,r+1,e)})):(i.getCell(2).fill={fgColor:{argb:o.groups_row[r-1].fill_color?o.groups_row[r-1].fill_color.replace("#",""):"ffffff"},type:"pattern",pattern:"solid"},i.getCell(2).font={color:{argb:o.groups_row[r-1].font_color?o.groups_row[r-1].font_color.replace("#",""):"000000"},name:"Arial",bold:!0,size:12},i.getCell(2).value=o.groups_row[r-1].columnName+": "+a._id["gr_"+r],n.mergeCells(i.getCell(2).$col$row+":"+i.getCell(o.fields_selected.filter(function(e){return e.show}).length+1).$col$row),i.getCell(2).border={top:{style:"thick"},left:{style:"thick"},right:{style:"thick"}},l+=1,i=n.getRow(l),o.fields_selected.filter(function(e){return e.show}).forEach(function(e,t){i.getCell(t+2).value=e.columnName,i.getCell(t+2).font={name:"Arial",bold:!0,size:10},"Currency"===e.leafFormatType?i.getCell(t+2).numFmt='"$"#,##0.00':"Number"===e.leafFormatType&&(i.getCell(t+2).numFmt="#,##0"),0===t?i.getCell(t+2).border={left:{style:"thick"}}:t===o.fields_selected.filter(function(e){return e.show}).length-1&&(i.getCell(t+2).border={right:{style:"thick"}})}),a.f_0.forEach(function(e,r){l+=1,i=n.getRow(l),o.fields_selected.filter(function(e){return e.show}).forEach(function(e,t){"Number"===e.fieldType&&(a[e.id][r],1)&&a[e.id][r]?i.getCell(t+2).value=parseFloat(a[e.id][r].replace(new RegExp(/\,/g),"").replace(new RegExp(/\$/g),"")):i.getCell(t+2).value=a[e.id][r],"Currency"===e.leafFormatType?i.getCell(t+2).numFmt='"$"#,##0.00':"Number"===e.leafFormatType&&(i.getCell(t+2).numFmt="#,##0"),i.getCell(t+2).font={name:"Arial",size:10},0===t?i.getCell(t+2).border={left:{style:"thick"}}:t===o.fields_selected.filter(function(e){return e.show}).length-1&&(i.getCell(t+2).border={right:{style:"thick"}})})}),o.fields_total.forEach(function(r){l+=1,i=n.getRow(l),o.fields_selected.filter(function(e){return e.show}).forEach(function(e,t){r.fields.includes(e.id)&&(i.getCell(t+2).value=a[r.id+"_"+e.id],i.getCell(t+2).font={name:"Arial",bold:!0,size:10},"Currency"===e.leafFormatType?i.getCell(t+2).numFmt='"$"#,##0.00':"Number"===e.leafFormatType&&(i.getCell(t+2).numFmt="#,##0")),0===t?i.getCell(t+2).border={top:{style:"thin"},left:{style:"thick"},bottom:{style:"thick"}}:t===o.fields_selected.filter(function(e){return e.show}).length-1?i.getCell(t+2).border={top:{style:"thin"},bottom:{style:"thick"},right:{style:"thick"}}:i.getCell(t+2).border={top:{style:"thin"},bottom:{style:"thick"}}})})),l+1}function tabGroupExcelWidthRecursive(r,o,t,n){return o<r.groups_row.length?(t=t["gr_"+(o+1)]).forEach(function(e,t){n=tabGroupExcelWidthRecursive(r,o+1,e,n)}):r.fields_selected.filter(function(e){return e.show}).forEach(function(r,o){var e;Array.isArray(t[r.id])?t[r.id].forEach(function(e){var t=10;e&&(t=e.length+3),n[o]||(n[o]=Math.max(10,r.columnName.length)),t>n[o]&&(n[o]=t)}):((e=t[r.id])&&(length=e.length+3),n[o]||(n[o]=Math.max(10,r.columnName.length)),length>n[o]&&(n[o]=length))}),n}exports.loadCronJobMethods=loadCronJobMethods;
|
|
1
|
+
"use strict";var __awaiter=this&&this.__awaiter||function(e,n,o,l){return new(o=o||Promise)(function(r,t){function fulfilled(e){try{step(l.next(e))}catch(e){t(e)}}function rejected(e){try{step(l.throw(e))}catch(e){t(e)}}function step(e){var t;e.done?r(e.value):((t=e.value)instanceof o?t:new o(function(e){e(t)})).then(fulfilled,rejected)}step((l=l.apply(e,n||[])).next())})},__generator=this&&this.__generator||function(n,o){var l,a,i,f={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]},u={next:verb(0),throw:verb(1),return:verb(2)};return"function"==typeof Symbol&&(u[Symbol.iterator]=function(){return this}),u;function verb(r){return function(e){var t=[r,e];if(l)throw new TypeError("Generator is already executing.");for(;f=u&&t[u=0]?0:f;)try{if(l=1,a&&(i=2&t[0]?a.return:t[0]?a.throw||((i=a.return)&&i.call(a),0):a.next)&&!(i=i.call(a,t[1])).done)return i;switch(a=0,(t=i?[2&t[0],i.value]:t)[0]){case 0:case 1:i=t;break;case 4:return f.label++,{value:t[1],done:!1};case 5:f.label++,a=t[1],t=[0];continue;case 7:t=f.ops.pop(),f.trys.pop();continue;default:if(!(i=0<(i=f.trys).length&&i[i.length-1])&&(6===t[0]||2===t[0])){f=0;continue}if(3===t[0]&&(!i||t[1]>i[0]&&t[1]<i[3]))f.label=t[1];else if(6===t[0]&&f.label<i[1])f.label=i[1],i=t;else{if(!(i&&f.label<i[2])){i[2]&&f.ops.pop(),f.trys.pop();continue}f.label=i[2],f.ops.push(t)}}t=o.call(n,f)}catch(e){t=[6,e],a=0}finally{l=i=0}if(5&t[0])throw t[1];return{value:t[0]?t[1]:void 0,done:!0}}}},report_builder_report_collection_1=(Object.defineProperty(exports,"__esModule",{value:!0}),exports.loadCronJobMethods=void 0,require("../collections/report-builder-report.collection")),simpl_schema_1=require("simpl-schema"),common_1=require("../util/common"),moment=require("moment-timezone"),XLSX=require("xlsx"),Excel=require("exceljs"),file_collection_1=require("../collections/file.collection"),cron_job_collection_1=require("../collections/cron-job.collection");function loadCronJobMethods(e){e.methods({cronEmailMergedDocsCleanUp:{function:function(){var t=this;return new Promise(function(r,e){return __awaiter(t,void 0,void 0,function(){var t;return __generator(this,function(e){switch(e.label){case 0:return[4,file_collection_1.Files.find({$and:[{type:"Email Merged Docs"},{createdAt:{$lte:moment().subtract(1,"day").toDate()}}]})];case 1:return(t=e.sent()).length&&(this.callMethodInternal("deleteFiles"),file_collection_1.Files.deleteMany({_id:{$in:t.map(function(e){return e._id})}})),r(!0),[2]}})})})}},stuckCronJob:{function:function(){var t=this;return new Promise(function(r,e){return __awaiter(t,void 0,void 0,function(){var t;return __generator(this,function(e){switch(e.label){case 0:return t=moment().subtract(5,"minutes").toDate(),[4,cron_job_collection_1.CronJobs.find({running:!0,updatedAt:{$lte:t}})];case 1:return(t=e.sent()).length&&cron_job_collection_1.CronJobs.updateMany({_id:{$in:t.map(function(e){return e._id})}},{$set:{running:!1}}),r(!0),[2]}})})})}},reportbuilderCronJob:{check:new simpl_schema_1.default({data:{type:Object,blackbox:!0}}),function:function(N){var e=this;return new Promise(function(L,A){return __awaiter(e,void 0,void 0,function(){var w,r,n,t,o,l,O=this;return __generator(this,function(e){switch(e.label){case 0:return[4,report_builder_report_collection_1.ReportBuilderReports.findById(N.id_report)];case 1:return(w=e.sent()).fields_selected.forEach(function(e){var t,r=e.fieldPath.replace(/\.\$/g,"").split(".");e.fieldPathObj=null;for(var n=r.length-1;0<=n;n--)e.fieldPathObj?e.fieldPathObj=((t={})[r[n]]=e.fieldPathObj,t):e.fieldPathObj=((t={})[r[n]]=1,t)}),(w.fields_selected&&w.fields_selected.length||w.groups_row&&w.groups_row.length)&&(r={},n=0,w.fields_selected.forEach(function(t){t.collection_name===w.collection_root&&(r=(0,common_1.mergeDeep)(r,t.fieldPathObj));var e=w.fields_sort.findIndex(function(e){return e.field===t.id});0<=e&&(w.fields_sort[e].field="f_"+n),t.id="f_"+n,n+=1}),t={},w.fields_sort.length?w.fields_sort.forEach(function(e){e.field.startsWith("gr_")?t["_id."+e.field]="asc"===e.order?1:-1:t[e.field]="asc"===e.order?1:-1}):t=null,o={limit:0,skip:0,fields:r,sort:t},l=[],w.fields_filter.forEach(function(e){var a=[];e.ors.filter(function(e){return!e.field.includes(".$.")}).forEach(function(n){var e,t,r,o,l;n.condition&&n.field&&(null!==n.value&&(!Array.isArray(n.value)||n.value.length)||"null"===n.condition||"nnull"===n.condition)&&("bw"===n.condition?"Date"===n.fieldType&&n.is_rolling?(t=r=null,"Q1"===n.rolling_interval?(r=moment().startOf("year").toDate(),t=moment().startOf("year").quarter(2).subtract(1,"days").toDate()):"Q2"===n.rolling_interval?(r=moment().startOf("year").quarter(2).toDate(),t=moment().startOf("year").quarter(3).subtract(1,"days").toDate()):"Q3"===n.rolling_interval?(r=moment().startOf("year").quarter(3).toDate(),t=moment().startOf("year").quarter(4).subtract(1,"days").toDate()):"Q4"===n.rolling_interval?(r=moment().startOf("year").quarter(4).toDate(),t=moment().endOf("year").toDate()):"Today"===n.rolling_interval?(r=moment().startOf("day").toDate(),t=moment().endOf("day").toDate()):"Yesterday"===n.rolling_interval?(r=moment().subtract(1,"days").startOf("day").toDate(),t=moment().subtract(1,"days").endOf("day").toDate()):"Week"===n.rolling_interval?(r=moment().startOf("isoWeek").toDate(),t=moment().endOf("day").toDate()):"Last Week"===n.rolling_interval?(t=moment().startOf("isoWeek").subtract(1,"days").toDate(),r=moment(t).startOf("isoWeek").toDate()):"Month"===n.rolling_interval?(r=moment().startOf("month").toDate(),t=moment().endOf("day").toDate()):"Last Month"===n.rolling_interval?(t=moment().startOf("month").subtract(1,"days").endOf("day").toDate(),r=moment(t).startOf("month").toDate()):"Last 30 Days"===n.rolling_interval?(t=moment().endOf("day").toDate(),r=moment().subtract(30,"days").startOf("day").toDate()):"Quarter"===n.rolling_interval?(r=moment().startOf("year").quarter(moment().quarter()).toDate(),t=moment().endOf("day").toDate()):"Last Quarter"===n.rolling_interval?(t=moment().startOf("year").quarter(moment().quarter()).subtract(1,"days").endOf("day").toDate(),r=moment(t).startOf("quarter").toDate()):"Year"===n.rolling_interval?(r=moment().startOf("year").toDate(),t=moment().endOf("day").toDate()):"Last Year"===n.rolling_interval?(t=moment().startOf("year").subtract(1,"days").endOf("day").toDate(),r=moment(t).startOf("year").toDate()):"All"===n.rolling_interval&&(r=new Date(2017,0,1,0,0,0,0),t=moment().endOf("day").toDate()),t.setHours(23),t.setMinutes(59),t.setSeconds(59),t.setMilliseconds(999),a.push({$and:[((e={})[n.field]={$gte:r},e),((r={})[n.field]={$lte:t},r)]})):a.push({$and:[((e={})[n.field]={$gte:n.value},e),((t={})[n.field]={$lte:n.highValue},t)]}):"nnull"===n.condition?((r=[]).push(((e={})[n.field]={$exists:!0},e)),r.push(((t={})[n.field]={$ne:null},t)),"String"===n.fieldType&&r.push(((e={})[n.field]={$ne:""},e)),a.push({$and:r})):"null"===n.condition?a.push(((t={})[n.field]={$eq:null},t)):Array.isArray(n.value)?"ne"===n.condition?(o=[],n.value.forEach(function(e){var t,r;o.push(((t={})[n.field]=((r={})["$"+n.condition]=Array.isArray(e)?e[0]:e,r),t))}),a.push(1<o.length?{$and:o}:o[0])):(l=[],n.value.forEach(function(e){var t,r;l.push(((t={})[n.field]=((r={})["$"+n.condition]=Array.isArray(e)?e[0]:e,r),t))}),a.push(1<l.length?{$or:l}:l[0])):a.push(((e={})[n.field]=((r={})["$"+n.condition]=n.value,r),e)))}),a.length&&l.push({$or:a})}),this.callMethodInternal("reportBuilderBuildTree",w.collection_root,function(e,t){var i,f,u;t&&(t.layers=[t],i=[],getTreeLeaves(t.children,[]),getTreeLeaves(t.children,i,!0),f=[],u=[],w.fields_filter.forEach(function(e){var a=[];e.ors.filter(function(e){return e.field.includes(".$.")}).forEach(function(n){var e,t,o,l,r=i.find(function(e){return e.fieldPath===n.field});r&&f.push(r),n.condition&&n.field&&(null!==n.value&&(!Array.isArray(n.value)||n.value.length)||"null"===n.condition||"nnull"===n.condition)&&("bw"===n.condition?"Date"===n.fieldType&&n.is_rolling?(t=r=null,"Q1"===n.rolling_interval?(r=moment().startOf("year").toDate(),t=moment().startOf("year").quarter(2).subtract(1,"days").toDate()):"Q2"===n.rolling_interval?(r=moment().startOf("year").quarter(2).toDate(),t=moment().startOf("year").quarter(3).subtract(1,"days").toDate()):"Q3"===n.rolling_interval?(r=moment().startOf("year").quarter(3).toDate(),t=moment().startOf("year").quarter(4).subtract(1,"days").toDate()):"Q4"===n.rolling_interval?(r=moment().startOf("year").quarter(4).toDate(),t=moment().endOf("year").toDate()):"Today"===n.rolling_interval?(r=moment().startOf("day").toDate(),t=moment().endOf("day").toDate()):"Yesterday"===n.rolling_interval?(r=moment().subtract(1,"days").startOf("day").toDate(),t=moment().subtract(1,"days").endOf("day").toDate()):"Week"===n.rolling_interval?(r=moment().startOf("isoWeek").toDate(),t=moment().endOf("day").toDate()):"Last Week"===n.rolling_interval?(t=moment().startOf("isoWeek").subtract(1,"days").toDate(),r=moment(t).startOf("isoWeek").toDate()):"Month"===n.rolling_interval?(r=moment().startOf("month").toDate(),t=moment().endOf("day").toDate()):"Last Month"===n.rolling_interval?(t=moment().startOf("month").subtract(1,"days").endOf("day").toDate(),r=moment(t).startOf("month").toDate()):"Last 30 Days"===n.rolling_interval?(t=moment().endOf("day").toDate(),r=moment().subtract(30,"days").startOf("day").toDate()):"Quarter"===n.rolling_interval?(r=moment().startOf("year").quarter(moment().quarter()).toDate(),t=moment().endOf("day").toDate()):"Last Quarter"===n.rolling_interval?(t=moment().startOf("year").quarter(moment().quarter()).subtract(1,"days").endOf("day").toDate(),r=moment(t).startOf("quarter").toDate()):"Year"===n.rolling_interval?(r=moment().startOf("year").toDate(),t=moment().endOf("day").toDate()):"Last Year"===n.rolling_interval?(t=moment().startOf("year").subtract(1,"days").endOf("day").toDate(),r=moment(t).startOf("year").toDate()):"All"===n.rolling_interval&&(r=new Date(2017,0,1,0,0,0,0),t=moment().endOf("day").toDate()),t.setHours(23),t.setMinutes(59),t.setSeconds(59),t.setMilliseconds(999),a.push({$and:[((e={})[n.field.replace(/\.\$/g,"")]={$gte:r},e),((r={})[n.field.replace(/\.\$/g,"")]={$lte:t},r)]})):u.push({$and:[((e={})[n.field.replace(/\.\$/g,"")]={$gte:n.value},e),((t={})[n.field.replace(/\.\$/g,"")]={$lte:n.highValue},t)]}):"nnull"===n.condition?((r=[]).push(((e={})[n.field.replace(/\.\$/g,"")]={$exists:!0},e)),r.push(((t={})[n.field.replace(/\.\$/g,"")]={$ne:null},t)),"String"===n.fieldType&&r.push(((e={})[n.field.replace(/\.\$/g,"")]={$ne:""},e)),a.push({$and:r})):"null"===n.condition?a.push(((t={})[n.field.replace(/\.\$/g,"")]={$eq:null},t)):Array.isArray(n.value)?"ne"===n.condition?(o=[],n.value.forEach(function(e){var t,r;o.push(((t={})[n.field.replace(/\.\$/g,"")]=((r={})["$"+n.condition]=Array.isArray(e)?e[0]:e,r),t))}),a.push(1<o.length?{$and:o}:o[0])):(l=[],n.value.forEach(function(e){var t,r;l.push(((t={})[n.field.replace(/\.\$/g,"")]=((r={})["$"+n.condition]=Array.isArray(e)?e[0]:e,r),t))}),a.push(1<l.length?{$or:l}:l[0])):a.push(((e={})[n.field.replace(/\.\$/g,"")]=((r={})["$"+n.condition]=n.value,r),e)))}),a.length&&u.push({$or:a})}),O.callMethodInternal("reportBuilderGetResults",w.type,w.collection_root,o,l,u,f,w.fields_selected,w.fields_custom,w.groups_row,w.fields_total,w.fields_link,w.id_date_field||null,w.date_interval||null,w.group_type,function(e,t){if(t&&t[0]){var i=t[0].results,r=t[0].totals;if("List"===w.type){w.fields_selected.filter(function(e){return e.show}).forEach(function(t){"Number"!==t.fieldType&&"Count"!==t.leafValueType||"Number"!==t.leafFormatType?"Number"!==t.fieldType&&"Count"!==t.leafValueType||"String"!==t.leafFormatType?"Number"!==t.fieldType&&"Count"!==t.leafValueType||"Currency"!==t.leafFormatType?"Boolean"!==t.fieldType||t.leafFormatType&&"Boolean"!==t.leafFormatType?"Boolean"===t.fieldType&&"String"===t.leafFormatType?i.filter(function(e){return null!==e[t.id]&&void 0!==e[t.id]}).forEach(function(e){e[t.id]=!0===e[t.id]?"Yes":"No"}):"Boolean"===t.fieldType&&"Boolean_Number"===t.leafFormatType?i.filter(function(e){return null!==e[t.id]&&void 0!==e[t.id]}).forEach(function(e){e[t.id]=!0===e[t.id]?1:0}):"Date"===t.fieldType&&"Date"===t.leafFormatType?i.filter(function(e){return null!==e[t.id]&&void 0!==e[t.id]}).forEach(function(e){e[t.id]=moment(e[t.id]).format("L")}):"Date"===t.fieldType&&"Time"===t.leafFormatType?i.filter(function(e){return null!==e[t.id]&&void 0!==e[t.id]}).forEach(function(e){e[t.id]=moment(e[t.id]).format("LT")}):"Date"===t.fieldType&&"DateTime"===t.leafFormatType?i.filter(function(e){return null!==e[t.id]&&void 0!==e[t.id]}).forEach(function(e){e[t.id]=moment(e[t.id]).format("MM/DD/YYYY h:mm A")}):"Date"===t.fieldType&&"Date_long"===t.leafFormatType?i.filter(function(e){return null!==e[t.id]&&void 0!==e[t.id]}).forEach(function(e){e[t.id]=moment(e[t.id]).format("LL")}):"Date"===t.fieldType&&"DateTime_long"===t.leafFormatType?i.filter(function(e){return null!==e[t.id]&&void 0!==e[t.id]}).forEach(function(e){e[t.id]=moment(e[t.id]).format("LLL")}):"Date"===t.fieldType&&"Timestamp"===t.leafFormatType&&i.filter(function(e){return null!==e[t.id]&&void 0!==e[t.id]}).forEach(function(e){e[t.id]=moment(e[t.id]).toDate().getTime()}):i.filter(function(e){return null!==e[t.id]&&void 0!==e[t.id]}).forEach(function(e){e[t.id]=!0===e[t.id]?"True":"False"}):i.filter(function(e){return null!==e[t.id]&&void 0!==e[t.id]}).forEach(function(e){e[t.id]=(0,common_1.round)(e[t.id],2).toLocaleString("en-US",{style:"currency",currency:"USD"})}):i.filter(function(e){return null!==e[t.id]&&void 0!==e[t.id]}).forEach(function(e){e[t.id]=e[t.id].toLocaleString("en-US",{style:"currency",currency:"USD"})}):i.filter(function(e){return null!==e[t.id]&&void 0!==e[t.id]}).forEach(function(e){e[t.id]=e[t.id].toLocaleString()})});var n=[],o=(w.groups_row.forEach(function(e){e.id,e.columnName}),w.fields_selected.filter(function(e){return e.show}).forEach(function(e){e.columnName,e.columnName}),XLSX.utils.book_new()),a=(i.forEach(function(t){var r={};w.groups_row.forEach(function(e){Array.isArray(t._id[e.id])?r[e.columnName]=t._id[e.id].join(","):"Number"===e.treeItem.fieldType?r[e.columnName]=t._id[e.id]?"string"==typeof t._id[e.id]?parseFloat(t._id[e.id].replace(/,/g,"").replace(/\$/g,"")):t._id[e.id]:"":r[e.columnName]=t._id[e.id]||""}),w.fields_selected.filter(function(e){return e.show}).forEach(function(e){Array.isArray(t[e.id])?r[e.columnName]=t[e.id].join(","):"Number"===e.fieldType||"Count"===e.leafValueType?r[e.columnName]=t[e.id]?"string"==typeof t[e.id]?parseFloat(t[e.id].replace(/,/g,"").replace(/\$/g,"")):t[e.id]:"":r[e.columnName]=t[e.id]||""}),n.push(r)}),XLSX.utils.json_to_sheet(n)),l=(XLSX.utils.book_append_sheet(o,a,"RB Data"),XLSX.write(o,{bookType:"xlsx",type:"base64"}));N.emails.forEach(function(e){O.sendEmail(e,O.serverConfig.CLIENT_NAME+" Scheduled Report - "+w.report_name,"","\n\t\t\t\t\t\t\t\t\t\t\t\t\t<b>"+O.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>"+w.report_name+"<br>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<b>Prepared By: </b>"+N.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>",[{filename:w.report_name+"-"+moment().format("MM-DD-YYYY-hh-mm-A")+".xlsx",content:l,encoding:"base64"}],O.serverConfig.MAIL_FROM_REPORTS,"")})}else if("Group"===w.type){w.fields_selected.filter(function(e){return e.show}).forEach(function(t){i.forEach(function(e){modifyDataTypeField(w,e,t,1)})});var f=(o=new Excel.Workbook).addWorksheet("RB_1",{views:[{showGridLines:!1}]}),u=(o.properties.date1904=!1,o.calcProperties.fullCalcOnLoad=!0,1),t=f.getRow(u),t=(t.getCell(2).font={name:"Arial",bold:!0,size:14},t.getCell(4).font={name:"Arial",size:14},t.getCell(2).value="Report Name:",t.getCell(4).value=w.report_name,u+=1,(t=f.getRow(u)).getCell(2).font={name:"Arial",bold:!0,size:14},t.getCell(4).font={name:"Arial",size:14},t.getCell(2).value="Run Date:",t.getCell(4).value=moment().format("LLL"),u+=2,(0,common_1.deepCopy)(i)),c=[];t.forEach(function(e){u=tabGroupExcelRecursive(w,f,u,1,e),tabGroupExcelWidthRecursive(w,1,e,c)});for(var d=1;d<f.columns.length;d++)f.columns[d].width=c[d-1];var s=new Date;o.xlsx.writeBuffer().then(function(t){N.emails.forEach(function(e){O.sendEmail(e,O.serverConfig.CLIENT_NAME+" Scheduled Report - "+w.report_name,"","\n\t\t\t\t\t\t\t\t\t\t\t\t\t<b>"+O.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>"+w.report_name+"<br>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<b>Prepared By: </b>"+N.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>",[{filename:"Group_Report_"+w.report_name+"_"+s.getFullYear()+"_"+(s.getMonth()+1)+"_"+s.getDate()+".xlsx",content:t}],O.serverConfig.MAIL_FROM_REPORTS,"")})}).catch(function(e){return console.log("Error writing excel export",e)})}else if("Dated"===w.type){var m=[],h=[],g=[],y=[],_=[];if("Quarterly"===w.date_interval){i.forEach(function(e){e._id.month<4?e._id.quarter=1:e._id.month<7?e._id.quarter=2:e._id.month<10?e._id.quarter=3:e._id.quarter=4,delete e._id.month});for(d=i.length-1;1<=d;d--)!function(e){var t,r=i[e];1<i.filter(function(e){return JSON.stringify(e._id)===JSON.stringify(r._id)}).length&&(t=i.find(function(e){return JSON.stringify(e._id)===JSON.stringify(r._id)}),Object.keys(t).filter(function(e){return"_id"!==e}).forEach(function(e){t[e]+=r[e]}),i.splice(e,1))}(d)}t=(0,common_1.deepCopy)(i);t.forEach(function(t){delete t._id.day,delete t._id.week,delete t._id.month,delete t._id.quarter,delete t._id.year;var r={};Object.keys(t._id).forEach(function(e){r[e]=t._id[e]}),h.find(function(e){return JSON.stringify(e)===JSON.stringify(r)})||h.push(r)}),(t=(0,common_1.deepCopy)(i)).forEach(function(t){Object.keys(t._id).filter(function(e){return"second"!==e&&"hour"!==e&&"minute"!==e&&"day"!==e&&"week"!==e&&"month"!==e&&"quarter"!==e&&"year"!==e}).forEach(function(e){delete t._id[e]});var r={};Object.keys(t._id).forEach(function(e){r[e]=t._id[e]}),m.find(function(e){return JSON.stringify(e)===JSON.stringify(r)})||m.push(r)}),m.forEach(function(e){e.year?"Seconds"===w.date_interval?(e.date=moment.tz({year:e.year,month:e.month-1,day:e.day,hour:e.hour,minute:e.minute,second:e.second},process.env.TZ_CLIENT||"America/Chicago").toDate(),e.dateString=moment(e.date).format("MMM DD YYYY HH:mm:ss")):"Minutes"===w.date_interval?(e.date=moment.tz({year:e.year,month:e.month-1,day:e.day,hour:e.hour,minute:e.minute},process.env.TZ_CLIENT||"America/Chicago").toDate(),e.dateString=moment(e.date).format("MMM DD YYYY HH:mm")):"Hours"===w.date_interval?(e.date=moment.tz({year:e.year,month:e.month-1,day:e.day,hour:e.hour},process.env.TZ_CLIENT||"America/Chicago").toDate(),e.dateString=moment(e.date).format("MMM DD YYYY HH")):"Daily"===w.date_interval?(e.date=moment.tz({year:e.year,month:e.month-1,day:e.day},process.env.TZ_CLIENT||"America/Chicago").toDate(),e.dateString=moment(e.date).format("MMM DD YYYY")):"Weekly"===w.date_interval?(e.date=moment.tz({year:e.year,week:e.week},process.env.TZ_CLIENT||"America/Chicago").day("Monday").toDate(),e.dateLast=moment.tz({year:e.year,week:e.week},process.env.TZ_CLIENT||"America/Chicago").day("Sunday").toDate(),e.dateString="Week #"+e.week+" "+e.year+" ("+moment(e.date).format("MM/DD/YY")+" - "+moment(e.dateLast).format("MM/DD/YY")+")"):"Monthly"===w.date_interval?(e.date=moment.tz({year:e.year,month:e.month-1},process.env.TZ_CLIENT||"America/Chicago").toDate(),e.dateString=moment(e.date).format("MMM YYYY")):"Quarterly"===w.date_interval?(e.date=moment.tz({year:e.year},process.env.TZ_CLIENT||"America/Chicago").quarter(e.quarter).toDate(),e.dateString="Q"+e.quarter+" "+e.year):"Yearly"===w.date_interval&&(e.date=moment.tz({year:e.year},process.env.TZ_CLIENT||"America/Chicago").toDate(),e.dateString=e.year.toString()):e.dateString="No Date"}),(m=m.filter(function(e){return!e.date}).concat(m.filter(function(e){return e.date}).sort(function(e,t){return e.date.getTime()-t.date.getTime()}))).forEach(function(o){var t=[],r={},l={},a={};h.forEach(function(n){var e=i.find(function(t){var r=!0;return Object.keys(n).forEach(function(e){t._id[e]!==n[e]&&(r=!1)}),Object.keys(o).filter(function(e){return"date"!==e&&"dateLast"!==e&&"dateString"!==e}).forEach(function(e){t._id[e]!==o[e]&&(r=!1)}),r});e?(t.push(e),Object.keys(e._id).filter(function(e){return e}).forEach(function(t){w.fields_total.filter(function(e){return e.fields.includes(t)}).length&&(r[t]?r[t]+=e._id[t]:r[t]=e._id[t],l[t]?l[t]+=1:l[t]=1,a[t]=w.fields_total.find(function(e){return e.fields.includes(t)}).type)}),Object.keys(e).filter(function(e){return e&&"_id"!==e}).forEach(function(t){w.fields_total.filter(function(e){return e.fields.includes(t)}).length&&(r[t]?r[t]+=e[t]:r[t]=e[t],l[t]?l[t]+=1:l[t]=1,a[t]=w.fields_total.find(function(e){return e.fields.includes(t)}).type)})):t.push(null)}),Object.keys(a).forEach(function(e){"avg"===a[e]&&(r[e]=r[e]/l[e]),r[e]=(0,common_1.round)(r[e],2)}),_.push(r),g.push(t)}),h.forEach(function(n){var r={},o=i.filter(function(t){var r=!(!Object.keys(n).length||null===n._id);return Object.keys(n).filter(function(e){return"date"!==e&&"dateLast"!==e&&"dateString"!==e&&"second"!==e&&"minute"!==e&&"hour"!==e&&"day"!==e&&"week"!==e&&"month"!==e&&"quarter"!==e&&"year"!==e}).forEach(function(e){t._id[e]!==n[e]&&(r=!1)}),r});w.fields_total.forEach(function(e){e.fields.forEach(function(t){o.length?(r[t]=o.filter(function(e){return e&&e[t]}).map(function(e){return e[t]}).reduce(function(e,t){return e+t},0),"avg"===e.type&&(r[t]=(0,common_1.round)(r[t]/o.length,2))):r[t]=0})}),y.push(r)});for(var a=(o=new Excel.Workbook).addWorksheet("Dated_Report",{views:[{showGridLines:!0}]}),p=(o.properties.date1904=!1,o.calcProperties.fullCalcOnLoad=!0,1),v=1,b=((D=a.getRow(p)).getCell(2).font={name:"Arial",bold:!0,size:14},D.getCell(4).font={name:"Arial",size:14},D.getCell(2).value="Report Name:",D.getCell(4).value=w.report_name,p+=1,(D=a.getRow(p)).getCell(2).font={name:"Arial",bold:!0,size:14},D.getCell(4).font={name:"Arial",size:14},D.getCell(2).value="Run Date:",D.getCell(4).value=moment().format("LLL"),p+=2,D=a.getRow(p),w.groups_row.forEach(function(e){D.getCell(v).value=e.columnName,v++}),w.fields_selected.filter(function(e){return e.show}).forEach(function(e){v++}),w.fields_selected.filter(function(e){return e.show}).forEach(function(){m.forEach(function(e){D.getCell(v).value=e.dateString,v++})}),w.fields_total.forEach(function(e){D.getCell(v).value="Totals - "+(0,common_1.toTitleCase)(e.type),v++}),p+=v=1,D=a.getRow(p),function(o){for(var l=h[o],e=0;e<w.fields_selected.filter(function(e){return e.show}).length;e++)!function(t){var e=w.fields_selected.filter(function(e){return e.show})[t];v=1,D=a.getRow(p),w.groups_row.forEach(function(e){D.getCell(v).value=0===t?l[e.id]:"",v++}),D.getCell(v).value=e.columnName,v++;for(var r=0;r<m.length;r++){var n=g[r];n[o]?D.getCell(v).value=n[o][e.id]||"":D.getCell(v).value="",v++}for(r=0;r<w.fields_total.length;r++){w.fields_total[r];D.getCell(v).value=y[o][e.id]||"",v++}p++}(e)}),d=0;d<h.length;d++)b(d);if(r)for(d=0;d<w.fields_total.length;d++){var C=w.fields_total[d],D=a.getRow(p),v=1;D.getCell(v).value=(0,common_1.toTitleCase)(C.type)+" Totals",v+=w.groups_row.length,w.fields_selected.filter(function(e){return e.show}).forEach(function(){v+=1}),m.forEach(function(){v++});for(var E=0;E<w.fields_selected.filter(function(e){return e.show}).length;E++){var T=w.fields_selected.filter(function(e){return e.show})[E];D.getCell(v).value=r[C.id+"_"+T.id]||"",v++}p++}o.xlsx.writeBuffer().then(function(t){N.emails.forEach(function(e){O.sendEmail(e,O.serverConfig.CLIENT_NAME+" Scheduled Report - "+w.report_name,"","\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<b>".concat(O.serverConfig.CLIENT_NAME," Automated Report</b><br>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<b>Report Name: </b>").concat(w.report_name,"<br>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<b>Prepared By: </b>").concat(N.user,"<br><br>\n\t\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\t\tResolveIO<br><br>"),[{filename:w.report_name+"-"+moment().format("MM-DD-YYYY-hh-mm-A")+".xlsx",content:t}],O.serverConfig.MAIL_FROM_REPORTS,"")})}).catch(function(e){return console.log("Error writing excel export",e)}),L(!0)}}else O.callMethodInternal("insertErrorLog","Report Builder Cron Job - Report Builder Get Results",[e]),A(e)}))})),[2]}})})})}}})}function getTreeLeaves(e,t,r){void 0===r&&(r=!1),e.forEach(function(e){e.isLeaf?t.push(e):e.lookup_collection&&!r||getTreeLeaves(e.children,t,r)})}function modifyDataTypeField(t,e,r,n){function jc(e,t){if(null==e)return"";if("Boolean"===t.fieldType){if(!t.leafFormatType||"Boolean"===t.leafFormatType)return!0===e?"True":"False";if("String"===t.leafFormatType)return!0===e?"Yes":"No";if("Boolean_Number"===t.leafFormatType)return!0===e?1:0}else if("Number"===t.fieldType||"Count"===t.leafValueType){if("Number"===t.leafFormatType)return e.toLocaleString();if("String"===t.leafFormatType)return e.toString();if("Currency"===t.leafFormatType)return(0,common_1.round)(e,2).toLocaleString("en-US",{style:"currency",currency:"USD"})}else if("Date"===t.fieldType)switch(t.leafFormatType){case"Date":return moment(e).format("L");case"Time":return moment(e).format("LT");case"DateTime":return moment(e).format("MM/DD/YYYY h:mm A");case"Date_long":return moment(e).format("LL");case"DateTime_long":return moment(e).format("LLL");case"Timestamp":return moment(e).toDate().getTime();default:return e}return e}var o,l;n<t.groups_row.length?e[o="gr_"+(n+1)]&&e[o].forEach(function(e){modifyDataTypeField(t,e,r,n+1)}):Array.isArray(e[r.id])?e[r.id]=(o=e[r.id],l=r,o.map(function(e){return jc(e,l)})):e[r.id]=jc(e[r.id],r)}function tabGroupExcelRecursive(n,o,l,r,a){var i=o.getRow(l);return r<n.groups_row.length?(i.getCell(2).fill={fgColor:{argb:n.groups_row[r-1].fill_color?n.groups_row[r-1].fill_color.replace("#",""):"ffffff"},type:"pattern",pattern:"solid"},i.getCell(2).font={color:{argb:n.groups_row[r-1].font_color?n.groups_row[r-1].font_color.replace("#",""):"000000"},name:"Arial",bold:!0,size:14},i.getCell(2).value=n.groups_row[r-1].columnName+": "+a._id["gr_"+r],o.mergeCells(i.getCell(2).$col$row+":"+i.getCell(n.fields_selected.filter(function(e){return e.show}).length+1).$col$row),i.getCell(2).border={top:{style:"thick"},left:{style:"thick"},right:{style:"thick"}},n.fields_total.length&&n.fields_total.forEach(function(r){l+=1,i=o.getRow(l),n.fields_selected.filter(function(e){return e.show}).forEach(function(e,t){r.fields.includes(e.id)&&(i.getCell(t+2).value=e.columnName,i.getCell(t+2).font={name:"Arial",bold:!0,size:10}),"Currency"===e.leafFormatType?i.getCell(t+2).numFmt='"$"#,##0.00':"Number"===e.leafFormatType&&(i.getCell(t+2).numFmt="#,##0"),0===t?i.getCell(t+2).border={left:{style:"thick"}}:t===n.fields_selected.filter(function(e){return e.show}).length-1&&(i.getCell(t+2).border={right:{style:"thick"}})})}),n.fields_total.forEach(function(r){l+=1,i=o.getRow(l),n.fields_selected.filter(function(e){return e.show}).forEach(function(e,t){r.fields.includes(e.id)&&(i.getCell(t+2).value=a[r.id+"_"+e.id],i.getCell(t+2).font={name:"Arial",bold:!0,size:10},"Currency"===e.leafFormatType?i.getCell(t+2).numFmt='"$"#,##0.00':"Number"===e.leafFormatType&&(i.getCell(t+2).numFmt="#,##0")),0===t?i.getCell(t+2).border={top:{style:"thin"},left:{style:"thick"},bottom:{style:"thick"}}:t===n.fields_selected.filter(function(e){return e.show}).length-1?i.getCell(t+2).border={top:{style:"thin"},bottom:{style:"thick"},right:{style:"thick"}}:i.getCell(t+2).border={top:{style:"thin"},bottom:{style:"thick"}}})}),l+=1,(a=a["gr_"+(r+1)]).forEach(function(e,t){l=tabGroupExcelRecursive(n,o,l,r+1,e)})):(i.getCell(2).fill={fgColor:{argb:n.groups_row[r-1].fill_color?n.groups_row[r-1].fill_color.replace("#",""):"ffffff"},type:"pattern",pattern:"solid"},i.getCell(2).font={color:{argb:n.groups_row[r-1].font_color?n.groups_row[r-1].font_color.replace("#",""):"000000"},name:"Arial",bold:!0,size:12},i.getCell(2).value=n.groups_row[r-1].columnName+": "+a._id["gr_"+r],o.mergeCells(i.getCell(2).$col$row+":"+i.getCell(n.fields_selected.filter(function(e){return e.show}).length+1).$col$row),i.getCell(2).border={top:{style:"thick"},left:{style:"thick"},right:{style:"thick"}},l+=1,i=o.getRow(l),n.fields_selected.filter(function(e){return e.show}).forEach(function(e,t){i.getCell(t+2).value=e.columnName,i.getCell(t+2).font={name:"Arial",bold:!0,size:10},"Currency"===e.leafFormatType?i.getCell(t+2).numFmt='"$"#,##0.00':"Number"===e.leafFormatType&&(i.getCell(t+2).numFmt="#,##0"),0===t?i.getCell(t+2).border={left:{style:"thick"}}:t===n.fields_selected.filter(function(e){return e.show}).length-1&&(i.getCell(t+2).border={right:{style:"thick"}})}),a.f_0.forEach(function(e,r){l+=1,i=o.getRow(l),n.fields_selected.filter(function(e){return e.show}).forEach(function(e,t){"Number"===e.fieldType&&(a[e.id][r],1)&&a[e.id][r]?i.getCell(t+2).value=parseFloat(a[e.id][r].replace(new RegExp(/\,/g),"").replace(new RegExp(/\$/g),"")):i.getCell(t+2).value=a[e.id][r],"Currency"===e.leafFormatType?i.getCell(t+2).numFmt='"$"#,##0.00':"Number"===e.leafFormatType&&(i.getCell(t+2).numFmt="#,##0"),i.getCell(t+2).font={name:"Arial",size:10},0===t?i.getCell(t+2).border={left:{style:"thick"}}:t===n.fields_selected.filter(function(e){return e.show}).length-1&&(i.getCell(t+2).border={right:{style:"thick"}})})}),n.fields_total.forEach(function(r){l+=1,i=o.getRow(l),n.fields_selected.filter(function(e){return e.show}).forEach(function(e,t){r.fields.includes(e.id)&&(i.getCell(t+2).value=a[r.id+"_"+e.id],i.getCell(t+2).font={name:"Arial",bold:!0,size:10},"Currency"===e.leafFormatType?i.getCell(t+2).numFmt='"$"#,##0.00':"Number"===e.leafFormatType&&(i.getCell(t+2).numFmt="#,##0")),0===t?i.getCell(t+2).border={top:{style:"thin"},left:{style:"thick"},bottom:{style:"thick"}}:t===n.fields_selected.filter(function(e){return e.show}).length-1?i.getCell(t+2).border={top:{style:"thin"},bottom:{style:"thick"},right:{style:"thick"}}:i.getCell(t+2).border={top:{style:"thin"},bottom:{style:"thick"}}})})),l+1}function tabGroupExcelWidthRecursive(r,n,t,o){return n<r.groups_row.length?(t=t["gr_"+(n+1)]).forEach(function(e,t){o=tabGroupExcelWidthRecursive(r,n+1,e,o)}):r.fields_selected.filter(function(e){return e.show}).forEach(function(r,n){var e;Array.isArray(t[r.id])?t[r.id].forEach(function(e){var t=10;e&&(t=e.length+3),o[n]||(o[n]=Math.max(10,r.columnName.length)),t>o[n]&&(o[n]=t)}):((e=t[r.id])&&(length=e.length+3),o[n]||(o[n]=Math.max(10,r.columnName.length)),length>o[n]&&(o[n]=length))}),o}exports.loadCronJobMethods=loadCronJobMethods;
|
|
2
2
|
//# sourceMappingURL=cron-jobs.js.map
|
package/methods/cron-jobs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/methods/cron-jobs.ts"],"names":["report_builder_report_collection_1","require","simpl_schema_1","common_1","moment","XLSX","Excel","file_collection_1","cron_job_collection_1","loadCronJobMethods","methodManager","methods","cronEmailMergedDocsCleanUp","function","_this","this","Promise","resolve","reject","__awaiter","Files","find","$and","type","createdAt","$lte","subtract","toDate","files","_a","sent","length","callMethodInternal","deleteMany","_id","$in","map","a","stuckCronJob","fiveMin","CronJobs","running","updatedAt","cronJobs","updateMany","$set","reportbuilderCronJob","check","default","data","Object","blackbox","ReportBuilderReports","findById","report","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_1","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","_k","errCollTree","collectionTree","allLeaves_1","filterArrayFields_1","filterArrays_1","layers","getTreeLeaves","children","and_2","or_2","filterLeaf","fields_custom","fields_total","fields_link","id_date_field","date_interval","group_type","err","res","results_1","results","reportTotals","totals","show","leafValueType","leafFormatType","id","undefined","result","format","getTime","round","toLocaleString","style","currency","lines_1","wb","group","columnName","header","utils","book_new","ws","tmp","join","treeItem","parseFloat","json_to_sheet","wbout_1","book_append_sheet","write","bookType","email","sendEmail","serverConfig","report_name","filename","content","encoding","modifyDataTypeField","ws_1","Workbook","addWorksheet","views","showGridLines","currentRow_1","properties","date1904","calcProperties","fullCalcOnLoad","row","getRow","copy","getCell","font","name","bold","size","deepCopy","widths_1","tabGroupExcelRecursive","tabGroupExcelWidthRecursive","columns","width","now_1","xlsx","writeBuffer","then","buffer","getFullYear","getMonth","getDate","catch","console","log","datedUniqueDates_1","datedUniqueGroups_1","datedData_1","reportTotalGroups_1","reportTotalDates_1","dataPt","month","tmpData_1","JSON","stringify","keys","key","splice","tmpResults","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","currentRow","currentCol_1","row_1","toTitleCase","j","groupRow","k","items","resArray","allowLookups","item","isLeaf","lookup_collection","index","tDataRes","tIndex","arr","arrIndex","level","fill","fgColor","argb","fill_color","pattern","color","font_color","mergeCells","$col$row","border","top","left","right","fieldIndex","numFmt","bottom","resIndex","RegExp","cols","Math","max","exports"],"mappings":"k8CACAA,oC,yFAAAC,QAAA,iDAAA,GACAC,eAAAD,QAAA,cAAA,EACAE,SAAAF,QAAA,gBAAA,EAEAG,OAAAH,QAAA,iBAAA,EACAI,KAAAJ,QAAA,MAAA,EACAK,MAAAL,QAAA,SAAA,EACAM,kBAAAN,QAAA,gCAAA,EACAO,sBAAAP,QAAA,oCAAA,EAEA,SAAgBQ,mBAAmBC,GAClCA,EAAcC,QAAQ,CACrBC,2BAA4B,CAC3BC,SAAU,WAAA,IAAAC,EAAAC,KACT,OAAO,IAAIC,QAAQ,SAAOC,EAASC,GAAM,OAAAC,UAAAL,EAAA,KAAA,EAAA,KAAA,EAAA,W,iEAC5B,MAAA,CAAA,EAAMP,kBAAAa,MAAMC,KAAK,CAACC,KAAM,CAAC,CAACC,KAAM,mBAAmB,EAAG,CAACC,UAAW,CAACC,KAAMrB,OAAM,EAAGsB,SAAS,EAAG,KAAK,EAAEC,OAAM,CAAE,CAAC,EAAE,CAAC,G,cAAzHC,EAAQC,EAAAC,KAAA,GAEFC,SACThB,KAAKiB,mBAAmB,aAAa,EACrCzB,kBAAAa,MAAMa,WAAW,CAACC,IAAK,CAACC,IAAKP,EAAMQ,IAAI,SAAAC,GAAK,OAAAA,EAAEH,GAAF,CAAK,CAAC,CAAC,CAAC,GAGrDjB,EAAQ,CAAA,CAAI,E,SACZ,CACF,C,EAEDqB,aAAc,CACbzB,SAAU,WAAA,IAAAC,EAAAC,KACT,OAAO,IAAIC,QAAQ,SAAOC,EAASC,GAAM,OAAAC,UAAAL,EAAA,KAAA,EAAA,KAAA,EAAA,W,iEAEzB,OADXyB,EAAUnC,OAAM,EAAGsB,SAAS,EAAG,SAAS,EAAEC,OAAM,EACrC,CAAA,EAAMnB,sBAAAgC,SAASnB,KAAK,CAACoB,QAAS,CAAA,EAAMC,UAAW,CAACjB,KAAMc,CAAO,CAAC,CAAC,G,cAA1EI,EAAWd,EAAAC,KAAA,GAEFC,QACZvB,sBAAAgC,SAASI,WAAW,CAACV,IAAK,CAACC,IAAKQ,EAASP,IAAI,SAAAC,GAAK,OAAAA,EAAEH,GAAF,CAAK,CAAC,CAAC,EAAG,CAACW,KAAM,CAACJ,QAAS,CAAA,CAAK,CAAC,CAAC,EAGrFxB,EAAQ,CAAA,CAAI,E,SACZ,CACF,C,EAED6B,qBAAsB,CACrBC,MAAO,IAAI7C,eAAA8C,QAAa,CACvBC,KAAM,CACL1B,KAAM2B,OACNC,SAAU,CAAA,C,EAEX,EACDtC,SAAU,SAASoC,GAAT,IAAAnC,EAAAC,KACT,OAAO,IAAIC,QAAQ,SAAOC,EAASC,GAAM,OAAAC,UAAAL,EAAA,KAAA,EAAA,KAAA,EAAA,W,kFAC3B,MAAA,CAAA,EAAMd,mCAAAoD,qBAAqBC,SAASJ,EAAgB,SAAC,G,cAA9DK,EAASzB,EAAAC,KAAA,GAENyB,gBAAgBC,QAAQ,SAACC,G,MAE3BC,EADUD,EAAME,UAAUC,QAAQ,QAAS,EAAE,EACzBC,MAAM,GAAG,EACjCJ,EAAMK,aAAe,KACrB,IAAK,IAAIC,EAAIL,EAAU3B,OAAS,EAAQ,GAALgC,EAAQA,CAAC,GACtCN,EAAMK,aAIVL,EAAMK,eAAYE,EAAA,IAAKN,EAAUK,IAAKN,EAAMK,aAAYE,GAHxDP,EAAMK,eAAYjC,EAAA,IAAK6B,EAAUK,IAAK,EAAClC,EAM1C,CAAC,GAEIyB,EAAOC,iBAAmBD,EAAOC,gBAAgBxB,QAAYuB,EAAOW,YAAcX,EAAOW,WAAWlC,UACpGmC,EAAY,GAEZC,EAAQ,EAEZb,EAAOC,gBAAgBC,QAAQ,SAACC,GAC3BA,EAAMW,kBAAoBd,EAAOe,kBACpCH,GAAY,EAAA/D,SAAAmE,WAAUJ,EAAWT,EAAMK,YAAY,GAGpD,IAAIS,EAAYjB,EAAOkB,YAAYC,UAAU,SAAApC,GAAK,OAAAA,EAAEoB,QAAUA,EAAU,EAAtB,CAAuB,EAExD,GAAbc,IACHjB,EAAOkB,YAAYD,GAAWd,MAAS,KAAOU,GAG/CV,EAAU,GAAI,KAAOU,EAErBA,GAAS,CACV,CAAC,EAEGO,EAAU,GACVpB,EAAOkB,YAAYzC,OACtBuB,EAAOkB,YAAYhB,QAAQ,SAAAmB,GACtBA,EAAUlB,MAAMmB,WAAW,KAAK,EACnCF,EAAQ,OAASC,EAAUlB,OAA8B,QAApBkB,EAAUE,MAAkB,EAAI,CAAC,EAGtEH,EAAQC,EAAUlB,OAA8B,QAApBkB,EAAUE,MAAkB,EAAI,CAAC,CAE/D,CAAC,EAGDH,EAAU,KAGPI,EAAiC,CACpCC,MAAO,EACPC,KAAM,EACNC,OAAQf,EACRgB,KAAMR,C,EAGHS,EAAU,GACd7B,EAAO8B,cAAc5B,QAAQ,SAAA6B,GAC5B,IAAIC,EAAM,GACVD,EAAUC,IAAIC,OAAO,SAAAlD,GAAK,MAAA,CAACA,EAAEoB,MAAM+B,SAAS,KAAK,CAAvB,CAAwB,EAAEhC,QAAQ,SAAA+B,G,MAKpDE,EA+EDC,EAgBEC,EAaAC,EAhHJL,EAAOM,WAAaN,EAAO9B,QAA4B,OAAjB8B,EAAOO,QAAmB,CAACC,MAAMC,QAAQT,EAAOO,KAAK,GAAKP,EAAOO,MAAM/D,SAAiC,SAArBwD,EAAOM,WAA6C,UAArBN,EAAOM,aACzI,OAArBN,EAAOM,UACe,SAArBN,EAAOU,WAAwBV,EAAOW,YAErCT,EADAU,EAAY,KAGgB,OAA5BZ,EAAOa,kBACVD,EAAY/F,OAAM,EAAGiG,QAAQ,MAAM,EAAE1E,OAAM,EAC3C8D,EAAUrF,OAAM,EAAGiG,QAAQ,MAAM,EAAEC,QAAQ,CAAC,EAAE5E,SAAS,EAAG,MAAM,EAAEC,OAAM,GAEpC,OAA5B4D,EAAOa,kBACfD,EAAY/F,OAAM,EAAGiG,QAAQ,MAAM,EAAEC,QAAQ,CAAC,EAAE3E,OAAM,EACtD8D,EAAUrF,OAAM,EAAGiG,QAAQ,MAAM,EAAEC,QAAQ,CAAC,EAAE5E,SAAS,EAAG,MAAM,EAAEC,OAAM,GAEpC,OAA5B4D,EAAOa,kBACfD,EAAY/F,OAAM,EAAGiG,QAAQ,MAAM,EAAEC,QAAQ,CAAC,EAAE3E,OAAM,EACtD8D,EAAUrF,OAAM,EAAGiG,QAAQ,MAAM,EAAEC,QAAQ,CAAC,EAAE5E,SAAS,EAAG,MAAM,EAAEC,OAAM,GAEpC,OAA5B4D,EAAOa,kBACfD,EAAY/F,OAAM,EAAGiG,QAAQ,MAAM,EAAEC,QAAQ,CAAC,EAAE3E,OAAM,EACtD8D,EAAUrF,OAAM,EAAGmG,MAAM,MAAM,EAAE5E,OAAM,GAEH,UAA5B4D,EAAOa,kBACfD,EAAY/F,OAAM,EAAGiG,QAAQ,KAAK,EAAE1E,OAAM,EAC1C8D,EAAUrF,OAAM,EAAGmG,MAAM,KAAK,EAAE5E,OAAM,GAEF,cAA5B4D,EAAOa,kBACfD,EAAY/F,OAAM,EAAGsB,SAAS,EAAG,MAAM,EAAE2E,QAAQ,KAAK,EAAE1E,OAAM,EAC9D8D,EAAUrF,OAAM,EAAGsB,SAAS,EAAG,MAAM,EAAE6E,MAAM,KAAK,EAAE5E,OAAM,GAEtB,SAA5B4D,EAAOa,kBACfD,EAAY/F,OAAM,EAAGiG,QAAQ,SAAS,EAAE1E,OAAM,EAC9C8D,EAAUrF,OAAM,EAAGmG,MAAM,KAAK,EAAE5E,OAAM,GAEF,cAA5B4D,EAAOa,kBACfX,EAAUrF,OAAM,EAAGiG,QAAQ,SAAS,EAAE3E,SAAS,EAAG,MAAM,EAAEC,OAAM,EAChEwE,EAAY/F,OAAOqF,CAAO,EAAEY,QAAQ,SAAS,EAAE1E,OAAM,GAEjB,UAA5B4D,EAAOa,kBACfD,EAAY/F,OAAM,EAAGiG,QAAQ,OAAO,EAAE1E,OAAM,EAC5C8D,EAAUrF,OAAM,EAAGmG,MAAM,KAAK,EAAE5E,OAAM,GAEF,eAA5B4D,EAAOa,kBACfX,EAAUrF,OAAM,EAAGiG,QAAQ,OAAO,EAAE3E,SAAS,EAAG,MAAM,EAAE6E,MAAM,KAAK,EAAE5E,OAAM,EAC3EwE,EAAY/F,OAAOqF,CAAO,EAAEY,QAAQ,OAAO,EAAE1E,OAAM,GAEf,iBAA5B4D,EAAOa,kBACfX,EAAUrF,OAAM,EAAGmG,MAAM,KAAK,EAAE5E,OAAM,EACtCwE,EAAY/F,OAAM,EAAGsB,SAAS,GAAI,MAAM,EAAE2E,QAAQ,KAAK,EAAE1E,OAAM,GAE3B,YAA5B4D,EAAOa,kBACfD,EAAY/F,OAAM,EAAGiG,QAAQ,MAAM,EAAEC,QAAQlG,OAAM,EAAGkG,QAAO,CAAE,EAAE3E,OAAM,EACvE8D,EAAUrF,OAAM,EAAGmG,MAAM,KAAK,EAAE5E,OAAM,GAEF,iBAA5B4D,EAAOa,kBACfX,EAAUrF,OAAM,EAAGiG,QAAQ,MAAM,EAAEC,QAAQlG,OAAM,EAAGkG,QAAO,CAAE,EAAE5E,SAAS,EAAG,MAAM,EAAE6E,MAAM,KAAK,EAAE5E,OAAM,EACtGwE,EAAY/F,OAAOqF,CAAO,EAAEY,QAAQ,SAAS,EAAE1E,OAAM,GAEjB,SAA5B4D,EAAOa,kBACfD,EAAY/F,OAAM,EAAGiG,QAAQ,MAAM,EAAE1E,OAAM,EAC3C8D,EAAUrF,OAAM,EAAGmG,MAAM,KAAK,EAAE5E,OAAM,GAEF,cAA5B4D,EAAOa,kBACfX,EAAUrF,OAAM,EAAGiG,QAAQ,MAAM,EAAE3E,SAAS,EAAG,MAAM,EAAE6E,MAAM,KAAK,EAAE5E,OAAM,EAC1EwE,EAAY/F,OAAOqF,CAAO,EAAEY,QAAQ,MAAM,EAAE1E,OAAM,GAEd,QAA5B4D,EAAOa,mBACfD,EAAY,IAAIK,KAAK,KAAM,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EAC3Cf,EAAUrF,OAAM,EAAGmG,MAAM,KAAK,EAAE5E,OAAM,GAGvC8D,EAAQgB,SAAS,EAAE,EACnBhB,EAAQiB,WAAW,EAAE,EACrBjB,EAAQkB,WAAW,EAAE,EACrBlB,EAAQmB,gBAAgB,GAAG,EAE3BtB,EAAIuB,KAAK,CAACvF,KAAM,GAAAO,EAAA,IAAG0D,EAAO9B,OAAQ,CAACqD,KAAQX,CAAS,EAACtE,KAAAmC,EAAA,IAAKuB,EAAO9B,OAAQ,CAAChC,KAAQgE,CAAO,EAACzB,GAAE,CAAC,GAG7FsB,EAAIuB,KAAK,CAACvF,KAAM,GAAAyF,EAAA,IAAGxB,EAAO9B,OAAQ,CAACqD,KAAQvB,EAAOO,KAAK,EAACiB,KAAAC,EAAA,IAAKzB,EAAO9B,OAAQ,CAAChC,KAAQ8D,EAAO0B,SAAS,EAACD,GAAE,CAAC,EAG7E,UAArBzB,EAAOM,YACXH,EAAM,IACNmB,OAAIK,EAAA,IAAG3B,EAAO9B,OAAQ,CAAC0D,QAAW,CAAA,CAAI,EAACD,EAAA,EAC3CxB,EAAImB,OAAIO,EAAA,IAAG7B,EAAO9B,OAAQ,CAAC4D,IAAO,IAAI,EAACD,EAAA,EAEd,WAArB7B,EAAOU,WACVP,EAAImB,OAAIS,EAAA,IAAG/B,EAAO9B,OAAQ,CAAC4D,IAAO,EAAE,EAACC,EAAA,EAGtChC,EAAIuB,KAAK,CAACvF,KAAMoE,CAAG,CAAC,GAES,SAArBH,EAAOM,UACfP,EAAIuB,OAAIU,EAAA,IAAGhC,EAAO9B,OAAQ,CAAC+D,IAAO,IAAI,EAACD,EAAA,EAGnCxB,MAAMC,QAAQT,EAAOO,KAAK,EACJ,OAArBP,EAAOM,WACNF,EAAM,GACVJ,EAAOO,MAAMtC,QAAQ,SAAAiE,G,QACpB9B,EAAIkB,OAAIhF,EAAA,IAAG0D,EAAO9B,SAAKO,EAAA,IAAK,IAAMuB,EAAOM,WAAaE,MAAMC,QAAQyB,CAAI,EAAIA,EAAK,GAAKA,EAAKzD,GAACnC,EAAA,CAC7F,CAAC,EAGAyD,EAAIuB,KADY,EAAblB,EAAI5D,OACE,CAACT,KAAMqE,CAAG,EAGVA,EAAI,EAHO,IAOjBC,EAAK,GAETL,EAAOO,MAAMtC,QAAQ,SAAAiE,G,QACpB7B,EAAGiB,OAAIhF,EAAA,IAAG0D,EAAO9B,SAAKO,EAAA,IAAK,IAAMuB,EAAOM,WAAaE,MAAMC,QAAQyB,CAAI,EAAIA,EAAK,GAAKA,EAAKzD,GAACnC,EAAA,CAC5F,CAAC,EAGAyD,EAAIuB,KADW,EAAZjB,EAAG7D,OACG,CAAC2F,IAAK9B,CAAE,EAGRA,EAAG,EAHM,GAQpBN,EAAIuB,OAAIc,EAAA,IAAGpC,EAAO9B,SAAKmE,EAAA,IAAK,IAAMrC,EAAOM,WAAYN,EAAOO,MAAK8B,GAACD,EAAA,EAItE,CAAC,EAEGrC,EAAIvD,QACPoD,EAAQ0B,KAAK,CAACa,IAAKpC,CAAG,CAAC,CAEzB,CAAC,EAEDvE,KAAKiB,mBAAmB,yBAA0BsB,EAAOe,gBAAiB,SAACwD,EAAaC,GACvF,IAIKC,EAIAC,EACAC,EATDH,IACHA,EAAeI,OAAS,CAACJ,GAGrBC,EAAY,GAChBI,cAAcL,EAAeM,SAFZ,EAEgC,EACjDD,cAAcL,EAAeM,SAAUL,EAAW,CAAA,CAAI,EAElDC,EAAoB,GACpBC,EAAe,GACnB3E,EAAO8B,cAAc5B,QAAQ,SAAA6B,GAC5B,IAAIC,EAAM,GACVD,EAAUC,IAAIC,OAAO,SAAAlD,GAAK,OAAAA,EAAEoB,MAAM+B,SAAS,KAAK,CAAtB,CAAuB,EAAEhC,QAAQ,SAAA+B,G,MAUnDE,EA8FC4C,EAaAC,EApHJC,EAAaR,EAAU1G,KAAK,SAAAgB,GAAK,OAAAA,EAAEsB,YAAc4B,EAAO9B,KAAvB,CAA4B,EAC7D8E,GACHP,EAAkBnB,KAAK0B,CAAU,EAG9BhD,EAAOM,WAAaN,EAAO9B,QAA4B,OAAjB8B,EAAOO,QAAmB,CAACC,MAAMC,QAAQT,EAAOO,KAAK,GAAKP,EAAOO,MAAM/D,SAAiC,SAArBwD,EAAOM,WAA6C,UAArBN,EAAOM,aACzI,OAArBN,EAAOM,UACe,SAArBN,EAAOU,WAAwBV,EAAOW,YAErCT,EADAU,EAAY,KAGgB,OAA5BZ,EAAOa,kBACVD,EAAY/F,OAAM,EAAGiG,QAAQ,MAAM,EAAE1E,OAAM,EAC3C8D,EAAUrF,OAAM,EAAGiG,QAAQ,MAAM,EAAEC,QAAQ,CAAC,EAAE5E,SAAS,EAAG,MAAM,EAAEC,OAAM,GAEpC,OAA5B4D,EAAOa,kBACfD,EAAY/F,OAAM,EAAGiG,QAAQ,MAAM,EAAEC,QAAQ,CAAC,EAAE3E,OAAM,EACtD8D,EAAUrF,OAAM,EAAGiG,QAAQ,MAAM,EAAEC,QAAQ,CAAC,EAAE5E,SAAS,EAAG,MAAM,EAAEC,OAAM,GAEpC,OAA5B4D,EAAOa,kBACfD,EAAY/F,OAAM,EAAGiG,QAAQ,MAAM,EAAEC,QAAQ,CAAC,EAAE3E,OAAM,EACtD8D,EAAUrF,OAAM,EAAGiG,QAAQ,MAAM,EAAEC,QAAQ,CAAC,EAAE5E,SAAS,EAAG,MAAM,EAAEC,OAAM,GAEpC,OAA5B4D,EAAOa,kBACfD,EAAY/F,OAAM,EAAGiG,QAAQ,MAAM,EAAEC,QAAQ,CAAC,EAAE3E,OAAM,EACtD8D,EAAUrF,OAAM,EAAGmG,MAAM,MAAM,EAAE5E,OAAM,GAEH,UAA5B4D,EAAOa,kBACfD,EAAY/F,OAAM,EAAGiG,QAAQ,KAAK,EAAE1E,OAAM,EAC1C8D,EAAUrF,OAAM,EAAGmG,MAAM,KAAK,EAAE5E,OAAM,GAEF,cAA5B4D,EAAOa,kBACfD,EAAY/F,OAAM,EAAGsB,SAAS,EAAG,MAAM,EAAE2E,QAAQ,KAAK,EAAE1E,OAAM,EAC9D8D,EAAUrF,OAAM,EAAGsB,SAAS,EAAG,MAAM,EAAE6E,MAAM,KAAK,EAAE5E,OAAM,GAEtB,SAA5B4D,EAAOa,kBACfD,EAAY/F,OAAM,EAAGiG,QAAQ,SAAS,EAAE1E,OAAM,EAC9C8D,EAAUrF,OAAM,EAAGmG,MAAM,KAAK,EAAE5E,OAAM,GAEF,cAA5B4D,EAAOa,kBACfX,EAAUrF,OAAM,EAAGiG,QAAQ,SAAS,EAAE3E,SAAS,EAAG,MAAM,EAAEC,OAAM,EAChEwE,EAAY/F,OAAOqF,CAAO,EAAEY,QAAQ,SAAS,EAAE1E,OAAM,GAEjB,UAA5B4D,EAAOa,kBACfD,EAAY/F,OAAM,EAAGiG,QAAQ,OAAO,EAAE1E,OAAM,EAC5C8D,EAAUrF,OAAM,EAAGmG,MAAM,KAAK,EAAE5E,OAAM,GAEF,eAA5B4D,EAAOa,kBACfX,EAAUrF,OAAM,EAAGiG,QAAQ,OAAO,EAAE3E,SAAS,EAAG,MAAM,EAAE6E,MAAM,KAAK,EAAE5E,OAAM,EAC3EwE,EAAY/F,OAAOqF,CAAO,EAAEY,QAAQ,OAAO,EAAE1E,OAAM,GAEf,iBAA5B4D,EAAOa,kBACfX,EAAUrF,OAAM,EAAGmG,MAAM,KAAK,EAAE5E,OAAM,EACtCwE,EAAY/F,OAAM,EAAGsB,SAAS,GAAI,MAAM,EAAE2E,QAAQ,KAAK,EAAE1E,OAAM,GAE3B,YAA5B4D,EAAOa,kBACfD,EAAY/F,OAAM,EAAGiG,QAAQ,MAAM,EAAEC,QAAQlG,OAAM,EAAGkG,QAAO,CAAE,EAAE3E,OAAM,EACvE8D,EAAUrF,OAAM,EAAGmG,MAAM,KAAK,EAAE5E,OAAM,GAEF,iBAA5B4D,EAAOa,kBACfX,EAAUrF,OAAM,EAAGiG,QAAQ,MAAM,EAAEC,QAAQlG,OAAM,EAAGkG,QAAO,CAAE,EAAE5E,SAAS,EAAG,MAAM,EAAE6E,MAAM,KAAK,EAAE5E,OAAM,EACtGwE,EAAY/F,OAAOqF,CAAO,EAAEY,QAAQ,SAAS,EAAE1E,OAAM,GAEjB,SAA5B4D,EAAOa,kBACfD,EAAY/F,OAAM,EAAGiG,QAAQ,MAAM,EAAE1E,OAAM,EAC3C8D,EAAUrF,OAAM,EAAGmG,MAAM,KAAK,EAAE5E,OAAM,GAEF,cAA5B4D,EAAOa,kBACfX,EAAUrF,OAAM,EAAGiG,QAAQ,MAAM,EAAE3E,SAAS,EAAG,MAAM,EAAE6E,MAAM,KAAK,EAAE5E,OAAM,EAC1EwE,EAAY/F,OAAOqF,CAAO,EAAEY,QAAQ,MAAM,EAAE1E,OAAM,GAEd,QAA5B4D,EAAOa,mBACfD,EAAY,IAAIK,KAAK,KAAM,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EAC3Cf,EAAUrF,OAAM,EAAGmG,MAAM,KAAK,EAAE5E,OAAM,GAEvC8D,EAAQgB,SAAS,EAAE,EACnBhB,EAAQiB,WAAW,EAAE,EACrBjB,EAAQkB,WAAW,EAAE,EACrBlB,EAAQmB,gBAAgB,GAAG,EAE3BtB,EAAIuB,KAAK,CAACvF,KAAM,GAAAO,EAAA,IAAG0D,EAAO9B,MAAMG,QAAQ,QAAS,EAAE,GAAI,CAACkD,KAAQX,CAAS,EAACtE,KAAAmC,EAAA,IAAKuB,EAAO9B,MAAMG,QAAQ,QAAS,EAAE,GAAI,CAACnC,KAAQgE,CAAO,EAACzB,GAAE,CAAC,GAGvIiE,EAAapB,KAAK,CAACvF,KAAM,GAAAyF,EAAA,IAAGxB,EAAO9B,MAAMG,QAAQ,QAAS,EAAE,GAAI,CAACkD,KAAQvB,EAAOO,KAAK,EAACiB,KAAAC,EAAA,IAAKzB,EAAO9B,MAAMG,QAAQ,QAAS,EAAE,GAAI,CAACnC,KAAQ8D,EAAO0B,SAAS,EAACD,GAAE,CAAC,EAGhI,UAArBzB,EAAOM,YACXH,EAAM,IACNmB,OAAIK,EAAA,IAAG3B,EAAO9B,MAAMG,QAAQ,QAAS,EAAE,GAAI,CAACuD,QAAW,CAAA,CAAI,EAACD,EAAA,EAChExB,EAAImB,OAAIO,EAAA,IAAG7B,EAAO9B,MAAMG,QAAQ,QAAS,EAAE,GAAI,CAACyD,IAAO,IAAI,EAACD,EAAA,EAEnC,WAArB7B,EAAOU,WACVP,EAAImB,OAAIS,EAAA,IAAG/B,EAAO9B,MAAMG,QAAQ,QAAS,EAAE,GAAI,CAACyD,IAAO,EAAE,EAACC,EAAA,EAG3DhC,EAAIuB,KAAK,CAACvF,KAAMoE,CAAG,CAAC,GAES,SAArBH,EAAOM,UACfP,EAAIuB,OAAIU,EAAA,IAAGhC,EAAO9B,MAAMG,QAAQ,QAAS,EAAE,GAAI,CAAC4D,IAAO,IAAI,EAACD,EAAA,EAGxDxB,MAAMC,QAAQT,EAAOO,KAAK,EACJ,OAArBP,EAAOM,WACNwC,EAAM,GACV9C,EAAOO,MAAMtC,QAAQ,SAAAiE,G,QACpBY,EAAIxB,OAAIhF,EAAA,IAAG0D,EAAO9B,MAAMG,QAAQ,QAAS,EAAE,KAACI,EAAA,IAAK,IAAMuB,EAAOM,WAAaE,MAAMC,QAAQyB,CAAI,EAAIA,EAAK,GAAKA,EAAKzD,GAACnC,EAAA,CAClH,CAAC,EAGAyD,EAAIuB,KADY,EAAbwB,EAAItG,OACE,CAACT,KAAM+G,CAAG,EAGVA,EAAI,EAHO,IAOjBC,EAAK,GAET/C,EAAOO,MAAMtC,QAAQ,SAAAiE,G,QACpBa,EAAGzB,OAAIhF,EAAA,IAAG0D,EAAO9B,MAAMG,QAAQ,QAAS,EAAE,KAACI,EAAA,IAAK,IAAMuB,EAAOM,WAAaE,MAAMC,QAAQyB,CAAI,EAAIA,EAAK,GAAKA,EAAKzD,GAACnC,EAAA,CACjH,CAAC,EAGAyD,EAAIuB,KADW,EAAZyB,EAAGvG,OACG,CAAC2F,IAAKY,CAAE,EAGRA,EAAG,EAHM,GAQpBhD,EAAIuB,OAAIc,EAAA,IAAGpC,EAAO9B,MAAMG,QAAQ,QAAS,EAAE,KAACgE,EAAA,IAAK,IAAMrC,EAAOM,WAAYN,EAAOO,MAAK8B,GAACD,EAAA,EAI3F,CAAC,EAEGrC,EAAIvD,QACPkG,EAAapB,KAAK,CAACa,IAAKpC,CAAG,CAAC,CAE9B,CAAC,EAEDxE,EAAKkB,mBAAmB,0BAA2BsB,EAAO/B,KAAM+B,EAAOe,gBAAiBS,EAAaK,EAAS8C,EAAcD,EAAmB1E,EAAOC,gBAAiBD,EAAOkF,cAAelF,EAAOW,WAAYX,EAAOmF,aAAcnF,EAAOoF,YAAapF,EAAOqF,eAAiB,KAAMrF,EAAOsF,eAAiB,KAAOtF,EAAOuF,WAAY,SAACC,EAAKC,GAC9U,GAAIA,GAAOA,EAAI,GAAI,CAClB,IAAIC,EAAUD,EAAI,GAAGE,QACjBC,EAAeH,EAAI,GAAGI,OAE1B,GAAoB,SAAhB7F,EAAO/B,KAAiB,CAC3B+B,EAAOC,gBAAgBgC,OAAO,SAAAlD,GAAK,OAAAA,EAAE+G,IAAF,CAAM,EAAE5F,QAAQ,SAAAC,GACzB,WAApBA,EAAMwC,WAAkD,UAAxBxC,EAAM4F,eAAuD,WAAzB5F,EAAM6F,eAKjD,WAApB7F,EAAMwC,WAAkD,UAAxBxC,EAAM4F,eAAuD,WAAzB5F,EAAM6F,eAKtD,WAApB7F,EAAMwC,WAAkD,UAAxBxC,EAAM4F,eAAuD,aAAzB5F,EAAM6F,eAKvD,YAApB7F,EAAMwC,WAA6BxC,EAAM6F,gBAA2C,YAAzB7F,EAAM6F,eAK7C,YAApB7F,EAAMwC,WAAoD,WAAzBxC,EAAM6F,eAC/CN,EAAQzD,OAAO,SAAAlD,GAAK,OAAgB,OAAhBA,EAAEoB,EAAM8F,KAAgCC,KAAAA,IAAhBnH,EAAEoB,EAAM8F,GAAhC,CAAiD,EAAE/F,QAAQ,SAAAiG,GAC9EA,EAAOhG,EAAM8F,IAA2B,CAAA,IAArBE,EAAOhG,EAAM8F,IAAe,MAAQ,IACxD,CAAC,EAE2B,YAApB9F,EAAMwC,WAAoD,mBAAzBxC,EAAM6F,eAC/CN,EAAQzD,OAAO,SAAAlD,GAAK,OAAgB,OAAhBA,EAAEoB,EAAM8F,KAAgCC,KAAAA,IAAhBnH,EAAEoB,EAAM8F,GAAhC,CAAiD,EAAE/F,QAAQ,SAAAiG,GAC9EA,EAAOhG,EAAM8F,IAA2B,CAAA,IAArBE,EAAOhG,EAAM8F,IAAe,EAAI,CACpD,CAAC,EAE2B,SAApB9F,EAAMwC,WAAkD,SAAzBxC,EAAM6F,eAC7CN,EAAQzD,OAAO,SAAAlD,GAAK,OAAgB,OAAhBA,EAAEoB,EAAM8F,KAAgCC,KAAAA,IAAhBnH,EAAEoB,EAAM8F,GAAhC,CAAiD,EAAE/F,QAAQ,SAAAiG,GAC9EA,EAAOhG,EAAM8F,IAAMnJ,OAAOqJ,EAAOhG,EAAM8F,GAAG,EAAEG,OAAO,GAAG,CACvD,CAAC,EAE2B,SAApBjG,EAAMwC,WAAiD,SAAzBxC,EAAM6F,eAC5CN,EAAQzD,OAAO,SAAAlD,GAAK,OAAgB,OAAhBA,EAAEoB,EAAM8F,KAAgCC,KAAAA,IAAhBnH,EAAEoB,EAAM8F,GAAhC,CAAiD,EAAE/F,QAAQ,SAAAiG,GAC9EA,EAAOhG,EAAM8F,IAAMnJ,OAAOqJ,EAAOhG,EAAM8F,GAAG,EAAEG,OAAO,IAAI,CACxD,CAAC,EAE2B,SAApBjG,EAAMwC,WAAiD,aAAzBxC,EAAM6F,eAC5CN,EAAQzD,OAAO,SAAAlD,GAAK,OAAgB,OAAhBA,EAAEoB,EAAM8F,KAAgCC,KAAAA,IAAhBnH,EAAEoB,EAAM8F,GAAhC,CAAiD,EAAE/F,QAAQ,SAAAiG,GAC9EA,EAAOhG,EAAM8F,IAAMnJ,OAAOqJ,EAAOhG,EAAM8F,GAAG,EAAEG,OAAO,mBAAmB,CACvE,CAAC,EAE2B,SAApBjG,EAAMwC,WAAiD,cAAzBxC,EAAM6F,eAC5CN,EAAQzD,OAAO,SAAAlD,GAAK,OAAgB,OAAhBA,EAAEoB,EAAM8F,KAAgCC,KAAAA,IAAhBnH,EAAEoB,EAAM8F,GAAhC,CAAiD,EAAE/F,QAAQ,SAAAiG,GAC9EA,EAAOhG,EAAM8F,IAAMnJ,OAAOqJ,EAAOhG,EAAM8F,GAAG,EAAEG,OAAO,IAAI,CACxD,CAAC,EAE2B,SAApBjG,EAAMwC,WAAiD,kBAAzBxC,EAAM6F,eAC5CN,EAAQzD,OAAO,SAAAlD,GAAK,OAAgB,OAAhBA,EAAEoB,EAAM8F,KAAgCC,KAAAA,IAAhBnH,EAAEoB,EAAM8F,GAAhC,CAAiD,EAAE/F,QAAQ,SAAAiG,GAC9EA,EAAOhG,EAAM8F,IAAMnJ,OAAOqJ,EAAOhG,EAAM8F,GAAG,EAAEG,OAAO,KAAK,CACzD,CAAC,EAE2B,SAApBjG,EAAMwC,WAAiD,cAAzBxC,EAAM6F,gBAC5CN,EAAQzD,OAAO,SAAAlD,GAAK,OAAgB,OAAhBA,EAAEoB,EAAM8F,KAAgCC,KAAAA,IAAhBnH,EAAEoB,EAAM8F,GAAhC,CAAiD,EAAE/F,QAAQ,SAAAiG,GAC9EA,EAAOhG,EAAM8F,IAAMnJ,OAAOqJ,EAAOhG,EAAM8F,GAAG,EAAE5H,OAAM,EAAGgI,QAAO,CAC7D,CAAC,EA1CDX,EAAQzD,OAAO,SAAAlD,GAAK,OAAgB,OAAhBA,EAAEoB,EAAM8F,KAAgCC,KAAAA,IAAhBnH,EAAEoB,EAAM8F,GAAhC,CAAiD,EAAE/F,QAAQ,SAAAiG,GAC9EA,EAAOhG,EAAM8F,IAA2B,CAAA,IAArBE,EAAOhG,EAAM8F,IAAe,OAAS,OACzD,CAAC,EAPDP,EAAQzD,OAAO,SAAAlD,GAAK,OAAgB,OAAhBA,EAAEoB,EAAM8F,KAAgCC,KAAAA,IAAhBnH,EAAEoB,EAAM8F,GAAhC,CAAiD,EAAE/F,QAAQ,SAAAiG,GAC9EA,EAAOhG,EAAM8F,KAAM,EAAApJ,SAAAyJ,OAAMH,EAAOhG,EAAM8F,IAAK,CAAC,EAAEM,eAAe,QAAS,CAAEC,MAAO,WAAYC,SAAU,KAAK,CAAE,CAC7G,CAAC,EAPDf,EAAQzD,OAAO,SAAAlD,GAAK,OAAgB,OAAhBA,EAAEoB,EAAM8F,KAAgCC,KAAAA,IAAhBnH,EAAEoB,EAAM8F,GAAhC,CAAiD,EAAE/F,QAAQ,SAAAiG,GAC9EA,EAAOhG,EAAM8F,IAAME,EAAOhG,EAAM8F,IAAIM,eAAe,QAAS,CAAEC,MAAO,WAAYC,SAAU,KAAK,CAAE,CACnG,CAAC,EAPDf,EAAQzD,OAAO,SAAAlD,GAAK,OAAgB,OAAhBA,EAAEoB,EAAM8F,KAAgCC,KAAAA,IAAhBnH,EAAEoB,EAAM8F,GAAhC,CAAiD,EAAG/F,QAAQ,SAAAiG,GAC/EA,EAAOhG,EAAM8F,IAAME,EAAOhG,EAAM8F,IAAIM,eAAc,CACnD,CAAC,CAyDH,CAAC,EAED,IAAIG,EAAa,GAYbC,GARJ3G,EAAOW,WAAWT,QAAQ,SAAA0G,GACdA,EAAMX,GAAMW,EAAMC,UAC9B,CAAC,EAED7G,EAAOC,gBAAgBgC,OAAO,SAAAlD,GAAK,OAAAA,EAAE+G,IAAF,CAAM,EAAE5F,QAAQ,SAAA4G,GACvCA,EAAOD,WAAcC,EAAOD,UACxC,CAAC,EAEQ9J,KAAKgK,MAAMC,SAAQ,GAkCxBC,GAhCJvB,EAAQxF,QAAQ,SAAAiG,GACf,IAAIe,EAAM,GACVlH,EAAOW,WAAWT,QAAQ,SAAA0G,GACrBnE,MAAMC,QAAQyD,EAAOvH,IAAIgI,EAAMX,GAAG,EACrCiB,EAAIN,EAAMC,YAAcV,EAAOvH,IAAIgI,EAAMX,IAAIkB,KAAK,GAAG,EAGpB,WAA7BP,EAAMQ,SAASzE,UAClBuE,EAAIN,EAAMC,YAAcV,EAAOvH,IAAIgI,EAAMX,IAAwC,UAAjC,OAAOE,EAAOvH,IAAIgI,EAAMX,IAAoBoB,WAAWlB,EAAOvH,IAAIgI,EAAMX,IAAI3F,QAAQ,KAAM,EAAE,EAAEA,QAAQ,MAAO,EAAE,CAAC,EAAI6F,EAAOvH,IAAIgI,EAAMX,IAAO,GAG5LiB,EAAIN,EAAMC,YAAcV,EAAOvH,IAAIgI,EAAMX,KAAO,EAGnD,CAAC,EACDjG,EAAOC,gBAAgBgC,OAAO,SAAAlD,GAAK,OAAAA,EAAE+G,IAAF,CAAM,EAAE5F,QAAQ,SAAA4G,GAC9CrE,MAAMC,QAAQyD,EAAOW,EAAOb,GAAG,EAClCiB,EAAIJ,EAAOD,YAAcV,EAAOW,EAAOb,IAAIkB,KAAK,GAAG,EAG1B,WAArBL,EAAOnE,WAAmD,UAAzBmE,EAAOf,cAC3CmB,EAAIJ,EAAOD,YAAcV,EAAOW,EAAOb,IAAqC,UAA9B,OAAOE,EAAOW,EAAOb,IAAoBoB,WAAWlB,EAAOW,EAAOb,IAAI3F,QAAQ,KAAM,EAAE,EAAEA,QAAQ,MAAO,EAAE,CAAC,EAAI6F,EAAOW,EAAOb,IAAO,GAGjLiB,EAAIJ,EAAOD,YAAcV,EAAOW,EAAOb,KAAO,EAGjD,CAAC,EAEDS,EAAMnD,KAAK2D,CAAG,CACf,CAAC,EAEQnK,KAAKgK,MAAMO,cAAcZ,CAAK,GAGnCa,GAFJxK,KAAKgK,MAAMS,kBAAkBb,EAAIM,EAAI,SAAS,EAElClK,KAAK0K,MAAMd,EAAI,CAACe,SAAU,OAAQzJ,KAAM,QAAQ,CAAC,GAE7D0B,EAAa,OAAEO,QAAQ,SAAAyH,GACtBnK,EAAKoK,UAAUD,EACdnK,EAAKqK,aAA0B,YAAI,uBAAyB7H,EAAO8H,YACnE,GACA,kCACOtK,EAAKqK,aAA0B,YAAI,4EAClB7H,EAAO8H,YAAc,uDACrBnI,EAAW,KAAI,8IAGvC,CACC,CACCoI,SAAU/H,EAAO8H,YAAc,IAAMhL,OAAM,EAAGsJ,OAAO,oBAAoB,EAAI,QAC7E4B,QAAUT,EACVU,SAAU,Q,GAGZzK,EAAKqK,aAAgC,kBACrC,EAAE,CAEJ,CAAC,C,MAEG,GAAoB,UAAhB7H,EAAO/B,KAAkB,CACjC+B,EAAOC,gBAAgBgC,OAAO,SAAAlD,GAAK,OAAAA,EAAE+G,IAAF,CAAM,EAAE5F,QAAQ,SAAAC,GAClDuF,EAAQxF,QAAQ,SAAAiG,GACf+B,oBAAoBlI,EAAQmG,EAAQhG,EAAO,CAAC,CAC7C,CAAC,CACF,CAAC,EAED,IACIgI,GAAKxB,EADA,IAAI3J,MAAMoL,UACPC,aAAa,OAAQ,CAACC,MAAO,CAAC,CAACC,cAAe,CAAA,CAAK,EAAE,CAAC,EAI9DC,GAHJ7B,EAAG8B,WAAWC,SAAW,CAAA,EACzB/B,EAAGgC,eAAeC,eAAiB,CAAA,EAElB,GACbC,EAAMV,EAAGW,OAAON,CAAU,EA+B1BO,GA7BJF,EAAIG,QAAQ,CAAC,EAAEC,KAAO,CACrBC,KAAM,QACNC,KAAM,CAAA,EACNC,KAAM,E,EAEPP,EAAIG,QAAQ,CAAC,EAAEC,KAAO,CACrBC,KAAM,QACNE,KAAM,E,EAEPP,EAAIG,QAAQ,CAAC,EAAExG,MAAQ,eACvBqG,EAAIG,QAAQ,CAAC,EAAExG,MAAQxC,EAAO8H,YAE9BU,GAAc,GACdK,EAAMV,EAAGW,OAAON,CAAU,GAEtBQ,QAAQ,CAAC,EAAEC,KAAO,CACrBC,KAAM,QACNC,KAAM,CAAA,EACNC,KAAM,E,EAEPP,EAAIG,QAAQ,CAAC,EAAEC,KAAO,CACrBC,KAAM,QACNE,KAAM,E,EAEPP,EAAIG,QAAQ,CAAC,EAAExG,MAAQ,YACvBqG,EAAIG,QAAQ,CAAC,EAAExG,MAAQ1F,OAAM,EAAGsJ,OAAO,KAAK,EAE5CoC,GAAc,GAEH,EAAA3L,SAAAwM,UAAS3D,CAAO,GACvB4D,EAAS,GACbP,EAAK7I,QAAQ,SAAAuF,GACZ+C,EAAae,uBAAuBvJ,EAAQmI,EAAIK,EAAY,EAAG/C,CAAG,EAClE+D,4BAA4BxJ,EAAQ,EAAGyF,EAAK6D,CAAM,CACnD,CAAC,EAED,IAAK,IAAI7I,EAAI,EAAGA,EAAI0H,EAAGsB,QAAQhL,OAAQgC,CAAC,GACvC0H,EAAGsB,QAAQhJ,GAAGiJ,MAAQJ,EAAO7I,EAAI,GAGlC,IAAIkJ,EAAM,IAAIzG,KAEdyD,EAAGiD,KAAKC,YAAW,EAAGC,KAAK,SAAAC,GAC1BpK,EAAa,OAAEO,QAAQ,SAAAyH,GACtBnK,EAAKoK,UAAUD,EACfnK,EAAKqK,aAA0B,YAAI,uBAAyB7H,EAAO8H,YACnE,GACA,kCACOtK,EAAKqK,aAA0B,YAAI,4EAClB7H,EAAO8H,YAAc,uDACrBnI,EAAW,KAAI,mMAIvC,CACC,CACCoI,SAAU,gBAAkB/H,EAAO8H,YAAc,IAAM6B,EAAIK,YAAW,EAAK,KAAOL,EAAIM,SAAQ,EAAK,GAAK,IAAMN,EAAIO,QAAO,EAAK,QAC9HlC,QAAU+B,C,GAGZvM,EAAKqK,aAAgC,kBACrC,EAAE,CAEH,CAAC,CACF,CAAC,EAAEsC,MAAM,SAAA3E,GAAO,OAAA4E,QAAQC,IAAI,6BAA8B7E,CAAG,CAA7C,CAA8C,C,MAE1D,GAAoB,UAAhBxF,EAAO/B,KAAkB,CACjC,IAAIqM,EAAmB,GACnBC,EAAoB,GACpBC,EAAY,GACZC,EAAoB,GACpBC,EAAmB,GAGvB,GAA6B,cAAzB1K,EAAOsF,cAA+B,CACzCI,EAAQxF,QAAQ,SAAAyK,GACXA,EAAO/L,IAAIgM,MAAQ,EACtBD,EAAO/L,IAAIoE,QAAU,EAEb2H,EAAO/L,IAAIgM,MAAQ,EAC3BD,EAAO/L,IAAIoE,QAAU,EAEb2H,EAAO/L,IAAIgM,MAAQ,GAC3BD,EAAO/L,IAAIoE,QAAU,EAGrB2H,EAAO/L,IAAIoE,QAAU,EAGtB,OAAO2H,EAAO/L,IAAIgM,KACnB,CAAC,EAGD,IAASnK,EAAIiF,EAAQjH,OAAS,EAAQ,GAALgC,EAAQA,CAAC,G,UAAjCA,GACR,IAEKoK,EAFDF,EAASjF,EAAQjF,GACkE,EAAnFiF,EAAQzD,OAAO,SAAAlD,GAAK,OAAA+L,KAAKC,UAAUhM,EAAEH,GAAG,IAAMkM,KAAKC,UAAUJ,EAAO/L,GAAG,CAAnD,CAAoD,EAAEH,SACzEoM,EAAUnF,EAAQ3H,KAAK,SAAAgB,GAAK,OAAA+L,KAAKC,UAAUhM,EAAEH,GAAG,IAAMkM,KAAKC,UAAUJ,EAAO/L,GAAG,CAAnD,CAAoD,EAEpFgB,OAAOoL,KAAKH,CAAO,EACjB5I,OAAO,SAAAlD,GAAK,MAAM,QAANA,CAAA,CAAW,EACvBmB,QAAQ,SAAA+K,GACRJ,EAAQI,IAAQN,EAAOM,EACxB,CAAC,EAEFvF,EAAQwF,OAAOzK,EAAG,CAAC,E,EAXZA,CAAC,C,CAiBP0K,GAAa,EAAAtO,SAAAwM,UAAS3D,CAAO,EACjCyF,EAAWjL,QAAQ,SAAAiG,GAClB,OAAOA,EAAOvH,IAAIwM,IAClB,OAAOjF,EAAOvH,IAAIyM,KAClB,OAAOlF,EAAOvH,IAAIgM,MAClB,OAAOzE,EAAOvH,IAAIoE,QAClB,OAAOmD,EAAOvH,IAAI0M,KAElB,IAAIC,EAAW,GACf3L,OAAOoL,KAAK7E,EAAOvH,GAAG,EAAEsB,QAAQ,SAAA+K,GAC/BM,EAASN,GAAO9E,EAAOvH,IAAIqM,EAC5B,CAAC,EAEIV,EAAkBxM,KAAK,SAAAgB,GAAK,OAAA+L,KAAKC,UAAUhM,CAAC,IAAM+L,KAAKC,UAAUQ,CAAQ,CAA7C,CAA8C,GAC9EhB,EAAkBhH,KAAKgI,CAAQ,CAEjC,CAAC,GAGDJ,GAAa,EAAAtO,SAAAwM,UAAS3D,CAAO,GAClBxF,QAAQ,SAAAiG,GAClBvG,OAAOoL,KAAK7E,EAAOvH,GAAG,EACpBqD,OAAO,SAAAlD,GAAK,MAAM,WAANA,GAAwB,SAANA,GAAsB,WAANA,GAAwB,QAANA,GAAqB,SAANA,GAAsB,UAANA,GAAuB,YAANA,GAAyB,SAANA,CAAvH,CAAmI,EAC/ImB,QAAQ,SAAA+K,GACR,OAAO9E,EAAOvH,IAAIqM,EACnB,CAAC,EAEF,IAAIO,EAAU,GACd5L,OAAOoL,KAAK7E,EAAOvH,GAAG,EAAEsB,QAAQ,SAAA+K,GAC/BO,EAAQP,GAAO9E,EAAOvH,IAAIqM,EAC3B,CAAC,EAEIX,EAAiBvM,KAAK,SAAAgB,GAAK,OAAA+L,KAAKC,UAAUhM,CAAC,IAAM+L,KAAKC,UAAUS,CAAO,CAA5C,CAA6C,GAC5ElB,EAAiB/G,KAAKiI,CAAO,CAE/B,CAAC,EAIDlB,EAAiBpK,QAAQ,SAAAiG,GACnBA,EAAOmF,KAIkB,YAAzBtL,EAAOsF,eACVa,EAAOsF,KAAO3O,OAAO4O,GAAG,CACvBJ,KAAMnF,EAAOmF,KACbV,MAAOzE,EAAOyE,MAAQ,EACtBQ,IAAKjF,EAAOiF,IACZO,KAAMxF,EAAOwF,KACbC,OAAQzF,EAAOyF,OACfC,OAAQ1F,EAAO0F,M,EACZC,QAAQC,IAAIC,WAAa,iBAAkB,EAAE3N,OAAM,EACvD8H,EAAO8F,WAAanP,OAAOqJ,EAAOsF,IAAI,EAAErF,OAAO,sBAAsB,GAEpC,YAAzBpG,EAAOsF,eACfa,EAAOsF,KAAO3O,OAAO4O,GAAG,CACvBJ,KAAMnF,EAAOmF,KACbV,MAAOzE,EAAOyE,MAAQ,EACtBQ,IAAKjF,EAAOiF,IACZO,KAAMxF,EAAOwF,KACbC,OAAQzF,EAAOyF,M,EACZE,QAAQC,IAAIC,WAAa,iBAAkB,EAAE3N,OAAM,EACvD8H,EAAO8F,WAAanP,OAAOqJ,EAAOsF,IAAI,EAAErF,OAAO,mBAAmB,GAEjC,UAAzBpG,EAAOsF,eACfa,EAAOsF,KAAO3O,OAAO4O,GAAG,CACvBJ,KAAMnF,EAAOmF,KACbV,MAAOzE,EAAOyE,MAAQ,EACtBQ,IAAKjF,EAAOiF,IACZO,KAAMxF,EAAOwF,I,EACVG,QAAQC,IAAIC,WAAa,iBAAkB,EAAE3N,OAAM,EACvD8H,EAAO8F,WAAanP,OAAOqJ,EAAOsF,IAAI,EAAErF,OAAO,gBAAgB,GAE9B,UAAzBpG,EAAOsF,eACfa,EAAOsF,KAAO3O,OAAO4O,GAAG,CACvBJ,KAAMnF,EAAOmF,KACbV,MAAOzE,EAAOyE,MAAQ,EACtBQ,IAAKjF,EAAOiF,G,EACTU,QAAQC,IAAIC,WAAa,iBAAkB,EAAE3N,OAAM,EACvD8H,EAAO8F,WAAanP,OAAOqJ,EAAOsF,IAAI,EAAErF,OAAO,aAAa,GAE3B,WAAzBpG,EAAOsF,eACfa,EAAOsF,KAAO3O,OAAO4O,GAAG,CACvBJ,KAAMnF,EAAOmF,KACbD,KAAMlF,EAAOkF,I,EACVS,QAAQC,IAAIC,WAAa,iBAAkB,EAAEZ,IAAI,QAAQ,EAAE/M,OAAM,EACrE8H,EAAO+F,SAAWpP,OAAO4O,GAAG,CAC3BJ,KAAMnF,EAAOmF,KACbD,KAAMlF,EAAOkF,I,EACVS,QAAQC,IAAIC,WAAa,iBAAkB,EAAEZ,IAAI,QAAQ,EAAE/M,OAAM,EACrE8H,EAAO8F,WAAa,SAAW9F,EAAOkF,KAAO,IAAMlF,EAAOmF,KAAO,KAAOxO,OAAOqJ,EAAOsF,IAAI,EAAErF,OAAO,UAAU,EAAI,MAAQtJ,OAAOqJ,EAAO+F,QAAQ,EAAE9F,OAAO,UAAU,EAAI,KAErI,YAAzBpG,EAAOsF,eACfa,EAAOsF,KAAO3O,OAAO4O,GAAG,CACvBJ,KAAMnF,EAAOmF,KACbV,MAAOzE,EAAOyE,MAAQ,C,EACnBkB,QAAQC,IAAIC,WAAa,iBAAkB,EAAE3N,OAAM,EACvD8H,EAAO8F,WAAanP,OAAOqJ,EAAOsF,IAAI,EAAErF,OAAO,UAAU,GAExB,cAAzBpG,EAAOsF,eACfa,EAAOsF,KAAO3O,OAAO4O,GAAG,CACvBJ,KAAMnF,EAAOmF,I,EACVQ,QAAQC,IAAIC,WAAa,iBAAkB,EAAEhJ,QAAQmD,EAAOnD,OAAO,EAAE3E,OAAM,EAC/E8H,EAAO8F,WAAa,IAAM9F,EAAOnD,QAAU,IAAMmD,EAAOmF,MAEvB,WAAzBtL,EAAOsF,gBACfa,EAAOsF,KAAO3O,OAAO4O,GAAG,CACvBJ,KAAMnF,EAAOmF,I,EACVQ,QAAQC,IAAIC,WAAa,iBAAkB,EAAE3N,OAAM,EACvD8H,EAAO8F,WAAa9F,EAAOmF,KAAKa,SAAQ,GArEzChG,EAAO8F,WAAa,SAwEtB,CAAC,GAED3B,EAAmBA,EAAiBrI,OAAO,SAAAlD,GAAK,MAAA,CAACA,EAAE0M,IAAH,CAAO,EACrDW,OAAO9B,EAAiBrI,OAAO,SAAAlD,GAAK,OAAAA,EAAE0M,IAAF,CAAM,EAAE7J,KAAK,SAAC7C,EAAGsN,GAAM,OAAAtN,EAAE0M,KAAKpF,QAAO,EAAKgG,EAAEZ,KAAKpF,QAAO,CAAjC,CAAmC,CAAC,GAGhFnG,QAAQ,SAAAuL,GACxB,IAAIa,EAAU,GACVC,EAAgB,GAChBC,EAAc,GACdC,EAAe,GAEnBlC,EAAkBrK,QAAQ,SAAA0G,GACzB,IAAIT,EAAST,EAAQ3H,KAAK,SAAAgB,GACzB,IAAI2N,EAAQ,CAAA,EAgBZ,OAbA9M,OAAOoL,KAAKpE,CAAK,EAAE1G,QAAQ,SAAA+K,GACtBlM,EAAEH,IAAIqM,KAASrE,EAAMqE,KACxByB,EAAQ,CAAA,EAEV,CAAC,EAGD9M,OAAOoL,KAAKS,CAAI,EAAExJ,OAAO,SAAAgJ,GAAO,MAAQ,SAARA,GAA0B,aAARA,GAA8B,eAARA,CAAxC,CAA4D,EAAE/K,QAAQ,SAAA+K,GACjGlM,EAAEH,IAAIqM,KAASQ,EAAKR,KACvByB,EAAQ,CAAA,EAEV,CAAC,EAEMA,CACR,CAAC,EAEGvG,GACHmG,EAAQ/I,KAAK4C,CAAM,EAEnBvG,OAAOoL,KAAK7E,EAAOvH,GAAG,EAAEqD,OAAO,SAAAlD,GAAK,OAAAA,CAAA,CAAC,EAAEmB,QAAQ,SAAA+K,GAC1CjL,EAAOmF,aAAalD,OAAO,SAAAlD,GAAK,OAAAA,EAAE4C,OAAOO,SAAS+I,CAAG,CAArB,CAAsB,EAAExM,SACtD8N,EAActB,GAIlBsB,EAActB,IAAQ9E,EAAOvH,IAAIqM,GAHjCsB,EAActB,GAAO9E,EAAOvH,IAAIqM,GAM5BuB,EAAYvB,GAIhBuB,EAAYvB,IAAQ,EAHpBuB,EAAYvB,GAAO,EAMpBwB,EAAaxB,GAAOjL,EAAOmF,aAAapH,KAAK,SAAAgB,GAAK,OAAAA,EAAE4C,OAAOO,SAAS+I,CAAG,CAArB,CAAsB,EAAEhN,KAE5E,CAAC,EAED2B,OAAOoL,KAAK7E,CAAM,EAAElE,OAAO,SAAAlD,GAAK,OAAAA,GAAW,QAANA,CAAL,CAAgB,EAAEmB,QAAQ,SAAA+K,GACrDjL,EAAOmF,aAAalD,OAAO,SAAAlD,GAAK,OAAAA,EAAE4C,OAAOO,SAAS+I,CAAG,CAArB,CAAsB,EAAExM,SACtD8N,EAActB,GAIlBsB,EAActB,IAAQ9E,EAAO8E,GAH7BsB,EAActB,GAAO9E,EAAO8E,GAMxBuB,EAAYvB,GAIhBuB,EAAYvB,IAAQ,EAHpBuB,EAAYvB,GAAO,EAMpBwB,EAAaxB,GAAOjL,EAAOmF,aAAapH,KAAK,SAAAgB,GAAK,OAAAA,EAAE4C,OAAOO,SAAS+I,CAAG,CAArB,CAAsB,EAAEhN,KAE5E,CAAC,GAGDqO,EAAQ/I,KAAK,IAAI,CAEnB,CAAC,EAGD3D,OAAOoL,KAAKyB,CAAY,EAAEvM,QAAQ,SAAAyM,GACF,QAA3BF,EAAaE,KAChBJ,EAAcI,GAAYJ,EAAcI,GAAYH,EAAYG,IAGjEJ,EAAcI,IAAY,EAAA9P,SAAAyJ,OAAMiG,EAAcI,GAAW,CAAC,CAC3D,CAAC,EAEDjC,EAAiBnH,KAAKgJ,CAAa,EACnC/B,EAAUjH,KAAK+I,CAAO,CACvB,CAAC,EAGD/B,EAAkBrK,QAAQ,SAAA0G,GACzB,IAAIgG,EAAgB,GAChBC,EAAenH,EAAQzD,OAAO,SAAAlD,GACjC,IAAI2N,EAAQ,EAAE9M,CAAAA,OAAOoL,KAAKpE,CAAK,EAAEnI,QAAwB,OAAdmI,EAAMhI,KAMjD,OALAgB,OAAOoL,KAAKpE,CAAK,EAAE3E,OAAO,SAAAlD,GAAK,MAAM,SAANA,GAAsB,aAANA,GAA0B,eAANA,GAA4B,WAANA,GAAwB,WAANA,GAAwB,SAANA,GAAsB,QAANA,GAAqB,SAANA,GAAsB,UAANA,GAAuB,YAANA,GAAyB,SAANA,CAAjL,CAA6L,EAAEmB,QAAQ,SAAA+K,GACjOlM,EAAEH,IAAIqM,KAASrE,EAAMqE,KACxByB,EAAQ,CAAA,EAEV,CAAC,EACMA,CACR,CAAC,EAED1M,EAAOmF,aAAajF,QAAQ,SAAA4M,GAC3BA,EAAMnL,OAAOzB,QAAQ,SAAAC,GAChB0M,EAAapO,QAChBmO,EAAczM,GAAS0M,EAAa5K,OAAO,SAAAlD,GAAK,OAAAA,GAAKA,EAAEoB,EAAP,CAAa,EAC3DrB,IAAI,SAAAC,GAAK,OAAAA,EAAEoB,EAAF,CAAQ,EACjB4M,OAAO,SAAChO,EAAGsN,GAAM,OAAAtN,EAAIsN,CAAJ,EAAO,CAAC,EAER,QAAfS,EAAM7O,OACT2O,EAAczM,IAAS,EAAAtD,SAAAyJ,OAAMsG,EAAczM,GAAS0M,EAAapO,OAAQ,CAAC,IAI3EmO,EAAczM,GAAS,CAEzB,CAAC,CACF,CAAC,EAEDsK,EAAkBlH,KAAKqJ,CAAa,CACrC,CAAC,EAwED,IAtTA,IAkPI3F,GAAKN,EADA,IAAI3J,MAAMoL,UACPC,aAAa,eAAgB,CAACC,MAAO,CAAC,CAACC,cAAe,CAAA,CAAI,EAAE,CAAC,EAIrEyE,GAHJrG,EAAG8B,WAAWC,SAAW,CAAA,EACzB/B,EAAGgC,eAAeC,eAAiB,CAAA,EAElB,GACbqE,EAAa,E,IAGjBC,EAFUjG,EAAG6B,OAAOkE,CAAU,GAE1BhE,QAAQ,CAAC,EAAEC,KAAO,CACrBC,KAAM,QACNC,KAAM,CAAA,EACNC,KAAM,E,EAEP8D,EAAIlE,QAAQ,CAAC,EAAEC,KAAO,CACrBC,KAAM,QACNE,KAAM,E,EAEP8D,EAAIlE,QAAQ,CAAC,EAAExG,MAAQ,eACvB0K,EAAIlE,QAAQ,CAAC,EAAExG,MAAQxC,EAAO8H,YAE9BkF,GAAc,GACdE,EAAMjG,EAAG6B,OAAOkE,CAAU,GAEtBhE,QAAQ,CAAC,EAAEC,KAAO,CACrBC,KAAM,QACNC,KAAM,CAAA,EACNC,KAAM,E,EAEP8D,EAAIlE,QAAQ,CAAC,EAAEC,KAAO,CACrBC,KAAM,QACNE,KAAM,E,EAEP8D,EAAIlE,QAAQ,CAAC,EAAExG,MAAQ,YACvB0K,EAAIlE,QAAQ,CAAC,EAAExG,MAAQ1F,OAAM,EAAGsJ,OAAO,KAAK,EAE5C4G,GAAc,EACdE,EAAMjG,EAAG6B,OAAOkE,CAAU,EAG1BhN,EAAOW,WAAWT,QAAQ,SAAA0G,GACzBsG,EAAIlE,QAAQiE,CAAU,EAAEzK,MAAQoE,EAAMC,WACtCoG,CAAU,EACX,CAAC,EAGDjN,EAAOC,gBAAgBgC,OAAO,SAAAlD,GAAK,OAAAA,EAAE+G,IAAF,CAAM,EAAE5F,QAAQ,SAAAC,GAClD8M,CAAU,EACX,CAAC,EAGDjN,EAAOC,gBAAgBgC,OAAO,SAAAlD,GAAK,OAAAA,EAAE+G,IAAF,CAAM,EAAE5F,QAAQ,WAClDoK,EAAiBpK,QAAQ,SAAAuL,GACxByB,EAAIlE,QAAQiE,CAAU,EAAEzK,MAAQiJ,EAAKQ,WACrCgB,CAAU,EACX,CAAC,CACF,CAAC,EAGDjN,EAAOmF,aAAajF,QAAQ,SAAA4M,GAC3BI,EAAIlE,QAAQiE,CAAU,EAAEzK,MAAQ,aAAc,EAAA3F,SAAAsQ,aAAYL,EAAM7O,IAAI,EACpEgP,CAAU,EACX,CAAC,EAGDD,GADAC,EAAa,EAEbC,EAAMjG,EAAG6B,OAAOkE,CAAU,E,SAGjBvM,GAGR,IAFA,IAAImG,EAAQ2D,EAAkB9J,GAErB2M,EAAI,EAAGA,EAAIpN,EAAOC,gBAAgBgC,OAAO,SAAAlD,GAAK,OAAAA,EAAE+G,IAAF,CAAM,EAAErH,OAAQ2O,CAAC,G,UAA/DA,GACR,IAAIjN,EAAQH,EAAOC,gBAAgBgC,OAAO,SAAAlD,GAAK,OAAAA,EAAE+G,IAAF,CAAM,EAAEsH,GAEvDH,EAAa,EACbC,EAAMjG,EAAG6B,OAAOkE,CAAU,EAG1BhN,EAAOW,WAAWT,QAAQ,SAAAmN,GACzBH,EAAIlE,QAAQiE,CAAU,EAAEzK,MAAe,IAAN4K,EAAWxG,EAAMyG,EAASpH,IAAM,GACjEgH,CAAU,EACX,CAAC,EAGDC,EAAIlE,QAAQiE,CAAU,EAAEzK,MAAQrC,EAAM0G,WACtCoG,CAAU,GAGV,IAAK,IAAIK,EAAI,EAAGA,EAAIhD,EAAiB7L,OAAQ6O,CAAC,GAAI,CACjD,IAAInH,EAASqE,EAAU8C,GACnBnH,EAAO1F,GACVyM,EAAIlE,QAAQiE,CAAU,EAAEzK,MAAQ2D,EAAO1F,GAAGN,EAAM8F,KAA4B,GAG5EiH,EAAIlE,QAAQiE,CAAU,EAAEzK,MAAQ,GAEjCyK,CAAU,E,CAIX,IAASK,EAAI,EAAGA,EAAItN,EAAOmF,aAAa1G,OAAQ6O,CAAC,GAAI,CACxCtN,EAAOmF,aAAamI,GAChCJ,EAAIlE,QAAQiE,CAAU,EAAEzK,MAAQiI,EAAkBhK,GAAGN,EAAM8F,KAAuC,GAClGgH,CAAU,E,CAGXD,CAAU,E,EAnCFI,CAAC,C,GAHF3M,EAAI,EAAGA,EAAI8J,EAAkB9L,OAAQgC,CAAC,G,EAAtCA,CAAC,EA2CV,GAAImF,EACH,IAASnF,EAAI,EAAGA,EAAIT,EAAOmF,aAAa1G,OAAQgC,CAAC,GAAI,CACpD,IAAIqM,EAAQ9M,EAAOmF,aAAa1E,GAChCyM,EAAMjG,EAAG6B,OAAOkE,CAAU,EAC1BC,EAAa,EAEbC,EAAIlE,QAAQiE,CAAU,EAAEzK,OAAQ,EAAA3F,SAAAsQ,aAAYL,EAAM7O,IAAI,EAAI,UAC1DgP,GAAcjN,EAAOW,WAAWlC,OAGhCuB,EAAOC,gBAAgBgC,OAAO,SAAAlD,GAAK,OAAAA,EAAE+G,IAAF,CAAM,EAAE5F,QAAQ,WAClD+M,GAAc,CACf,CAAC,EAED3C,EAAiBpK,QAAQ,WACxB+M,CAAU,EACX,CAAC,EAGD,IAAK,IAAIG,EAAI,EAAGA,EAAIpN,EAAOC,gBAAgBgC,OAAO,SAAAlD,GAAK,OAAAA,EAAE+G,IAAF,CAAM,EAAErH,OAAQ2O,CAAC,GAAI,CAC3E,IAAIjN,EAAQH,EAAOC,gBAAgBgC,OAAO,SAAAlD,GAAK,OAAAA,EAAE+G,IAAF,CAAM,EAAEsH,GACvDF,EAAIlE,QAAQiE,CAAU,EAAEzK,MAAQoD,EAAakH,EAAM7G,GAAK,IAAM9F,EAAM8F,KAAO,GAC3EgH,CAAU,E,CAGXD,CAAU,E,CAKZrG,EAAGiD,KAAKC,YAAW,EAAGC,KAAK,SAAAC,GAC1BpK,EAAa,OAAEO,QAAQ,SAAAyH,GACtBnK,EAAKoK,UACJD,EACAnK,EAAKqK,aAA0B,YAAI,uBAAyB7H,EAAO8H,YACnE,GACA,oCAAAsE,OACK5O,EAAKqK,aAA0B,YAAC,6EAAA,EAAAuE,OACfpM,EAAO8H,YAAW,wDAAA,EAAAsE,OAClBzM,EAAW,KAAC,iJAAA,EAGlC,CACC,CACCoI,SAAU/H,EAAO8H,YAAc,IAAMhL,OAAM,EAAGsJ,OAAO,oBAAoB,EAAI,QAC7E4B,QAAS+B,C,GAGXvM,EAAKqK,aAAgC,kBACrC,EAAE,CAEJ,CAAC,CACF,CAAC,EAAEsC,MAAM,SAAA3E,GAAO,OAAA4E,QAAQC,IAAI,6BAA8B7E,CAAG,CAA7C,CAA8C,EAE9D7H,EAAQ,CAAA,CAAI,C,OAIbH,EAAKkB,mBAAmB,iBAAkB,uDAAwD,CACjG8G,EACA,EAED5H,EAAO4H,CAAG,CAEZ,CAAC,EAEH,CAAC,G,SAEF,CACF,C,EAED,CACF,CAEA,SAASX,cAAc0I,EAAOC,EAAUC,GAAA,KAAA,IAAAA,IAAAA,EAAA,CAAA,GACvCF,EAAMrN,QAAQ,SAAAwN,GACTA,EAAKC,OACRH,EAASjK,KAAKmK,CAAI,EAGbA,EAAKE,mBAAqBH,CAAAA,GAC9B5I,cAAc6I,EAAK5I,SAAU0I,EAAUC,CAAY,CAGtD,CAAC,CACF,CAEA,SAASvF,oBAAoBlI,EAAQmG,EAAQhG,EAAO0N,GAC/CA,EAAQ7N,EAAOW,WAAWlC,QAC7B0H,EAASA,EAAO,OAAS0H,EAAQ,MAEhC1H,EAAOjG,QAAQ,SAAC4N,EAAUC,GACzB7F,oBAAoBlI,EAAQ8N,EAAU3N,EAAO0N,EAAQ,CAAC,CACvD,CAAC,EAIEpL,MAAMC,QAAQyD,EAAOhG,EAAM8F,GAAG,EACjCE,EAAOhG,EAAM8F,IAAI/F,QAAQ,SAAC8N,EAAKC,GACL,WAApB9N,EAAMwC,WAAkD,UAAxBxC,EAAM4F,eAAuD,WAAzB5F,EAAM6F,eAGjD,WAApB7F,EAAMwC,WAAkD,UAAxBxC,EAAM4F,eAAuD,WAAzB5F,EAAM6F,eAGtD,WAApB7F,EAAMwC,WAAkD,UAAxBxC,EAAM4F,eAAuD,aAAzB5F,EAAM6F,eAGvD,YAApB7F,EAAMwC,WAA6BxC,EAAM6F,gBAA2C,YAAzB7F,EAAM6F,eAG7C,YAApB7F,EAAMwC,WAAoD,WAAzBxC,EAAM6F,eAC/CG,EAAOhG,EAAM8F,IAAIiF,OAAO+C,EAAU,EAAW,CAAA,IAARD,EAAe,MAAQ,IAAI,EAEpC,YAApB7N,EAAMwC,WAAoD,mBAAzBxC,EAAM6F,eAC/CG,EAAOhG,EAAM8F,IAAIiF,OAAO+C,EAAU,EAAW,CAAA,IAARD,EAAe,EAAI,CAAC,EAE7B,SAApB7N,EAAMwC,WAAkD,SAAzBxC,EAAM6F,eAC7CG,EAAOhG,EAAM8F,IAAIiF,OAAO+C,EAAU,EAAGnR,OAAOkR,CAAG,EAAE5H,OAAO,GAAG,CAAC,EAEhC,SAApBjG,EAAMwC,WAAiD,SAAzBxC,EAAM6F,eAC5CG,EAAOhG,EAAM8F,IAAIiF,OAAO+C,EAAU,EAAGnR,OAAOkR,CAAG,EAAE5H,OAAO,IAAI,CAAC,EAEjC,SAApBjG,EAAMwC,WAAiD,aAAzBxC,EAAM6F,eAC5CG,EAAOhG,EAAM8F,IAAIiF,OAAO+C,EAAU,EAAGnR,OAAOkR,CAAG,EAAE5H,OAAO,mBAAmB,CAAC,EAEhD,SAApBjG,EAAMwC,WAAiD,cAAzBxC,EAAM6F,eAC5CG,EAAOhG,EAAM8F,IAAIiF,OAAO+C,EAAU,EAAGnR,OAAOkR,CAAG,EAAE5H,OAAO,IAAI,CAAC,EAEjC,SAApBjG,EAAMwC,WAAiD,kBAAzBxC,EAAM6F,eAC5CG,EAAOhG,EAAM8F,IAAIiF,OAAO+C,EAAU,EAAGnR,OAAOkR,CAAG,EAAE5H,OAAO,KAAK,CAAC,EAElC,SAApBjG,EAAMwC,WAAiD,cAAzBxC,EAAM6F,gBAC5CG,EAAOhG,EAAM8F,IAAIiF,OAAO+C,EAAU,EAAGnR,OAAOkR,CAAG,EAAE3P,OAAM,EAAGgI,QAAO,CAAE,EAxBnEF,EAAOhG,EAAM8F,IAAIiF,OAAO+C,EAAU,EAAW,CAAA,IAARD,EAAe,OAAS,OAAO,EAHpE7H,EAAOhG,EAAM8F,IAAIiF,OAAO+C,EAAU,GAAG,EAAApR,SAAAyJ,OAAM0H,EAAK,CAAC,EAAEzH,eAAe,QAAS,CAAEC,MAAO,WAAYC,SAAU,KAAK,CAAE,CAAC,EAHlHN,EAAOhG,EAAM8F,IAAIiF,OAAO+C,EAAU,EAAGD,EAAI7B,SAAQ,CAAE,EAHnDhG,EAAOhG,EAAM8F,IAAIiF,OAAO+C,EAAU,EAAGD,EAAIzH,eAAc,CAAE,CAmC3D,CAAC,EAGwB,WAApBpG,EAAMwC,WAAkD,UAAxBxC,EAAM4F,eAAuD,WAAzB5F,EAAM6F,eAGjD,WAApB7F,EAAMwC,WAAkD,UAAxBxC,EAAM4F,eAAuD,WAAzB5F,EAAM6F,eAGtD,WAApB7F,EAAMwC,WAAkD,UAAxBxC,EAAM4F,eAAuD,aAAzB5F,EAAM6F,eAGvD,YAApB7F,EAAMwC,WAA6BxC,EAAM6F,gBAA2C,YAAzB7F,EAAM6F,eAG7C,YAApB7F,EAAMwC,WAAoD,WAAzBxC,EAAM6F,eAC/CG,EAAOhG,EAAM8F,IAA2B,CAAA,IAArBE,EAAOhG,EAAM8F,IAAe,MAAQ,KAE3B,YAApB9F,EAAMwC,WAAoD,mBAAzBxC,EAAM6F,eAC/CG,EAAOhG,EAAM8F,IAA2B,CAAA,IAArBE,EAAOhG,EAAM8F,IAAe,EAAI,EAEvB,SAApB9F,EAAMwC,WAAkD,SAAzBxC,EAAM6F,eAC7CG,EAAOhG,EAAM8F,IAAMnJ,OAAOqJ,EAAOhG,EAAM8F,GAAG,EAAEG,OAAO,GAAG,EAE1B,SAApBjG,EAAMwC,WAAiD,SAAzBxC,EAAM6F,eAC5CG,EAAOhG,EAAM8F,IAAMnJ,OAAOqJ,EAAOhG,EAAM8F,GAAG,EAAEG,OAAO,IAAI,EAE3B,SAApBjG,EAAMwC,WAAiD,aAAzBxC,EAAM6F,eAC5CG,EAAOhG,EAAM8F,IAAMnJ,OAAOqJ,EAAOhG,EAAM8F,GAAG,EAAEG,OAAO,mBAAmB,EAE1C,SAApBjG,EAAMwC,WAAiD,cAAzBxC,EAAM6F,eAC5CG,EAAOhG,EAAM8F,IAAMnJ,OAAOqJ,EAAOhG,EAAM8F,GAAG,EAAEG,OAAO,IAAI,EAE3B,SAApBjG,EAAMwC,WAAiD,kBAAzBxC,EAAM6F,eAC5CG,EAAOhG,EAAM8F,IAAMnJ,OAAOqJ,EAAOhG,EAAM8F,GAAG,EAAEG,OAAO,KAAK,EAE5B,SAApBjG,EAAMwC,WAAiD,cAAzBxC,EAAM6F,iBAC5CG,EAAOhG,EAAM8F,IAAMnJ,OAAOqJ,EAAOhG,EAAM8F,GAAG,EAAE5H,OAAM,EAAGgI,QAAO,GAxB5DF,EAAOhG,EAAM8F,IAA2B,CAAA,IAArBE,EAAOhG,EAAM8F,IAAe,OAAS,QAHxDE,EAAOhG,EAAM8F,KAAM,EAAApJ,SAAAyJ,OAAMH,EAAOhG,EAAM8F,IAAK,CAAC,EAAEM,eAAe,QAAS,CAAEC,MAAO,WAAYC,SAAU,KAAK,CAAE,EAH5GN,EAAOhG,EAAM8F,IAAME,EAAOhG,EAAM8F,IAAIkG,SAAQ,EAH5ChG,EAAOhG,EAAM8F,IAAME,EAAOhG,EAAM8F,IAAIM,eAAc,CAqCtD,CAEA,SAASgD,uBAAuBvJ,EAAQiH,EAAqB+F,EAAYkB,EAAO/H,GAC/E,IAAI0C,EAAM5B,EAAG6B,OAAOkE,CAAU,EA2P9B,OAzPIkB,EAAQlO,EAAOW,WAAWlC,QAC7BoK,EAAIG,QAAQ,CAAC,EAAEmF,KAAO,CACrBC,QAAS,CAACC,KAAMrO,EAAOW,WAAWuN,EAAQ,GAAGI,WAAatO,EAAOW,WAAWuN,EAAQ,GAAGI,WAAWhO,QAAQ,IAAK,EAAE,EAAI,QAAQ,EAC7HrC,KAAM,UACNsQ,QAAS,O,EAEV1F,EAAIG,QAAQ,CAAC,EAAEC,KAAO,CACrBuF,MAAO,CAACH,KAAMrO,EAAOW,WAAWuN,EAAQ,GAAGO,WAAazO,EAAOW,WAAWuN,EAAQ,GAAGO,WAAWnO,QAAQ,IAAK,EAAE,EAAI,QAAQ,EAC3H4I,KAAM,QACNC,KAAM,CAAA,EACNC,KAAM,E,EAGPP,EAAIG,QAAQ,CAAC,EAAExG,MAAQxC,EAAOW,WAAWuN,EAAQ,GAAGrH,WAAa,KAAOV,EAAOvH,IAAI,MAAQsP,GAC3FjH,EAAGyH,WAAW7F,EAAIG,QAAQ,CAAC,EAAE2F,SAAW,IAAM9F,EAAIG,QAAQhJ,EAAOC,gBAAgBgC,OAAO,SAAAlD,GAAK,OAAAA,EAAE+G,IAAF,CAAM,EAAErH,OAAS,CAAC,EAAEkQ,QAAQ,EAEzH9F,EAAIG,QAAQ,CAAC,EAAE4F,OAAS,CACvBC,IAAK,CAACrI,MAAM,OAAO,EACnBsI,KAAM,CAACtI,MAAM,OAAO,EACpBuI,MAAO,CAACvI,MAAO,OAAO,C,EAGnBxG,EAAOmF,aAAa1G,QACvBuB,EAAOmF,aAAajF,QAAQ,SAAA4M,GAC3BE,GAAc,EACdnE,EAAM5B,EAAG6B,OAAOkE,CAAU,EAE1BhN,EAAOC,gBAAgBgC,OAAO,SAAAlD,GAAK,OAAAA,EAAE+G,IAAF,CAAM,EAAE5F,QAAQ,SAACC,EAAO6O,GACtDlC,EAAMnL,OAAOO,SAAS/B,EAAM8F,EAAE,IACjC4C,EAAIG,QAAQgG,EAAa,CAAC,EAAExM,MAAQrC,EAAM0G,WAE1CgC,EAAIG,QAAQgG,EAAa,CAAC,EAAE/F,KAAO,CAClCC,KAAM,QACNC,KAAM,CAAA,EACNC,KAAM,E,GAIqB,aAAzBjJ,EAAM6F,eACT6C,EAAIG,QAAQgG,EAAa,CAAC,EAAEC,OAAS,cAEJ,WAAzB9O,EAAM6F,iBACd6C,EAAIG,QAAQgG,EAAa,CAAC,EAAEC,OAAS,SAGnB,IAAfD,EACHnG,EAAIG,QAAQgG,EAAa,CAAC,EAAEJ,OAAS,CACpCE,KAAM,CAACtI,MAAM,OAAO,C,EAGbwI,IAAehP,EAAOC,gBAAgBgC,OAAO,SAAAlD,GAAK,OAAAA,EAAE+G,IAAF,CAAM,EAAErH,OAAS,IAC3EoK,EAAIG,QAAQgG,EAAa,CAAC,EAAEJ,OAAS,CACpCG,MAAO,CAACvI,MAAM,OAAO,C,EAGxB,CAAC,CACF,CAAC,EAIFxG,EAAOmF,aAAajF,QAAQ,SAAA4M,GAC3BE,GAAc,EACdnE,EAAM5B,EAAG6B,OAAOkE,CAAU,EAE1BhN,EAAOC,gBAAgBgC,OAAO,SAAAlD,GAAK,OAAAA,EAAE+G,IAAF,CAAM,EAAE5F,QAAQ,SAACC,EAAO6O,GACtDlC,EAAMnL,OAAOO,SAAS/B,EAAM8F,EAAE,IACjC4C,EAAIG,QAAQgG,EAAa,CAAC,EAAExM,MAAQ2D,EAAO2G,EAAM7G,GAAK,IAAM9F,EAAM8F,IAElE4C,EAAIG,QAAQgG,EAAa,CAAC,EAAE/F,KAAO,CAClCC,KAAM,QACNC,KAAM,CAAA,EACNC,KAAM,E,EAGsB,aAAzBjJ,EAAM6F,eACT6C,EAAIG,QAAQgG,EAAa,CAAC,EAAEC,OAAS,cAEJ,WAAzB9O,EAAM6F,iBACd6C,EAAIG,QAAQgG,EAAa,CAAC,EAAEC,OAAS,UAIpB,IAAfD,EACHnG,EAAIG,QAAQgG,EAAa,CAAC,EAAEJ,OAAS,CACpCC,IAAK,CAACrI,MAAM,MAAM,EAClBsI,KAAM,CAACtI,MAAM,OAAO,EACpB0I,OAAQ,CAAC1I,MAAM,OAAO,C,EAGfwI,IAAehP,EAAOC,gBAAgBgC,OAAO,SAAAlD,GAAK,OAAAA,EAAE+G,IAAF,CAAM,EAAErH,OAAS,EAC3EoK,EAAIG,QAAQgG,EAAa,CAAC,EAAEJ,OAAS,CACpCC,IAAK,CAACrI,MAAM,MAAM,EAClB0I,OAAQ,CAAC1I,MAAM,OAAO,EACtBuI,MAAO,CAACvI,MAAM,OAAO,C,EAItBqC,EAAIG,QAAQgG,EAAa,CAAC,EAAEJ,OAAS,CACpCC,IAAK,CAACrI,MAAM,MAAM,EAClB0I,OAAQ,CAAC1I,MAAM,OAAO,C,CAGzB,CAAC,CACF,CAAC,EAEDwG,GAAc,GAEd7G,EAASA,EAAO,OAAS+H,EAAQ,KAC1BhO,QAAQ,SAAC4N,EAAUC,GACzBf,EAAazD,uBAAuBvJ,EAAQiH,EAAI+F,EAAYkB,EAAQ,EAAGJ,CAAQ,CAChF,CAAC,IAGDjF,EAAIG,QAAQ,CAAC,EAAEmF,KAAO,CACrBC,QAAS,CAACC,KAAMrO,EAAOW,WAAWuN,EAAQ,GAAGI,WAAatO,EAAOW,WAAWuN,EAAQ,GAAGI,WAAWhO,QAAQ,IAAK,EAAE,EAAI,QAAQ,EAC7HrC,KAAM,UACNsQ,QAAS,O,EAEV1F,EAAIG,QAAQ,CAAC,EAAEC,KAAO,CACrBuF,MAAO,CAACH,KAAMrO,EAAOW,WAAWuN,EAAQ,GAAGO,WAAazO,EAAOW,WAAWuN,EAAQ,GAAGO,WAAWnO,QAAQ,IAAK,EAAE,EAAI,QAAQ,EAC3H4I,KAAM,QACNC,KAAM,CAAA,EACNC,KAAM,E,EAGPP,EAAIG,QAAQ,CAAC,EAAExG,MAAQxC,EAAOW,WAAWuN,EAAQ,GAAGrH,WAAa,KAAOV,EAAOvH,IAAI,MAAQsP,GAC3FjH,EAAGyH,WAAW7F,EAAIG,QAAQ,CAAC,EAAE2F,SAAW,IAAM9F,EAAIG,QAAQhJ,EAAOC,gBAAgBgC,OAAO,SAAAlD,GAAK,OAAAA,EAAE+G,IAAF,CAAM,EAAErH,OAAS,CAAC,EAAEkQ,QAAQ,EAEzH9F,EAAIG,QAAQ,CAAC,EAAE4F,OAAS,CACvBC,IAAK,CAACrI,MAAM,OAAO,EACnBsI,KAAM,CAACtI,MAAM,OAAO,EACpBuI,MAAO,CAACvI,MAAO,OAAO,C,EAGvBwG,GAAc,EACdnE,EAAM5B,EAAG6B,OAAOkE,CAAU,EAE1BhN,EAAOC,gBAAgBgC,OAAO,SAAAlD,GAAK,OAAAA,EAAE+G,IAAF,CAAM,EAAE5F,QAAQ,SAACC,EAAO6O,GAC1DnG,EAAIG,QAAQgG,EAAa,CAAC,EAAExM,MAAQrC,EAAM0G,WAC1CgC,EAAIG,QAAQgG,EAAa,CAAC,EAAE/F,KAAO,CAClCC,KAAM,QACNC,KAAM,CAAA,EACNC,KAAM,E,EAGsB,aAAzBjJ,EAAM6F,eACT6C,EAAIG,QAAQgG,EAAa,CAAC,EAAEC,OAAS,cAEJ,WAAzB9O,EAAM6F,iBACd6C,EAAIG,QAAQgG,EAAa,CAAC,EAAEC,OAAS,SAGnB,IAAfD,EACHnG,EAAIG,QAAQgG,EAAa,CAAC,EAAEJ,OAAS,CACpCE,KAAM,CAACtI,MAAM,OAAO,C,EAGbwI,IAAehP,EAAOC,gBAAgBgC,OAAO,SAAAlD,GAAK,OAAAA,EAAE+G,IAAF,CAAM,EAAErH,OAAS,IAC3EoK,EAAIG,QAAQgG,EAAa,CAAC,EAAEJ,OAAS,CACpCG,MAAO,CAACvI,MAAM,OAAO,C,EAGxB,CAAC,EAGDL,EAAY,IAAEjG,QAAQ,SAACuF,EAAK0J,GAC3BnC,GAAc,EACdnE,EAAM5B,EAAG6B,OAAOkE,CAAU,EAE1BhN,EAAOC,gBAAgBgC,OAAO,SAAAlD,GAAK,OAAAA,EAAE+G,IAAF,CAAM,EAAE5F,QAAQ,SAACC,EAAO6O,GAClC,WAApB7O,EAAMwC,YAAiCwD,EAAOhG,EAAM8F,IAAIkJ,GAAxB,IAAmDhJ,EAAOhG,EAAM8F,IAAIkJ,GACvGtG,EAAIG,QAAQgG,EAAa,CAAC,EAAExM,MAAQ6E,WAAWlB,EAAOhG,EAAM8F,IAAIkJ,GAAU7O,QAAQ,IAAI8O,OAAO,KAAK,EAAG,EAAE,EAAE9O,QAAQ,IAAI8O,OAAO,KAAK,EAAG,EAAE,CAAC,EAGvIvG,EAAIG,QAAQgG,EAAa,CAAC,EAAExM,MAAQ2D,EAAOhG,EAAM8F,IAAIkJ,GAGzB,aAAzBhP,EAAM6F,eACT6C,EAAIG,QAAQgG,EAAa,CAAC,EAAEC,OAAS,cAEJ,WAAzB9O,EAAM6F,iBACd6C,EAAIG,QAAQgG,EAAa,CAAC,EAAEC,OAAS,SAGtCpG,EAAIG,QAAQgG,EAAa,CAAC,EAAE/F,KAAO,CAClCC,KAAM,QACNE,KAAM,E,EAGY,IAAf4F,EACHnG,EAAIG,QAAQgG,EAAa,CAAC,EAAEJ,OAAS,CACpCE,KAAM,CAACtI,MAAM,OAAO,C,EAGbwI,IAAehP,EAAOC,gBAAgBgC,OAAO,SAAAlD,GAAK,OAAAA,EAAE+G,IAAF,CAAM,EAAErH,OAAS,IAC3EoK,EAAIG,QAAQgG,EAAa,CAAC,EAAEJ,OAAS,CACpCG,MAAO,CAACvI,MAAM,OAAO,C,EAGxB,CAAC,CACF,CAAC,EAGDxG,EAAOmF,aAAajF,QAAQ,SAAA4M,GAC3BE,GAAc,EACdnE,EAAM5B,EAAG6B,OAAOkE,CAAU,EAE1BhN,EAAOC,gBAAgBgC,OAAO,SAAAlD,GAAK,OAAAA,EAAE+G,IAAF,CAAM,EAAE5F,QAAQ,SAACC,EAAO6O,GACtDlC,EAAMnL,OAAOO,SAAS/B,EAAM8F,EAAE,IACjC4C,EAAIG,QAAQgG,EAAa,CAAC,EAAExM,MAAQ2D,EAAO2G,EAAM7G,GAAK,IAAM9F,EAAM8F,IAElE4C,EAAIG,QAAQgG,EAAa,CAAC,EAAE/F,KAAO,CAClCC,KAAM,QACNC,KAAM,CAAA,EACNC,KAAM,E,EAGsB,aAAzBjJ,EAAM6F,eACT6C,EAAIG,QAAQgG,EAAa,CAAC,EAAEC,OAAS,cAEJ,WAAzB9O,EAAM6F,iBACd6C,EAAIG,QAAQgG,EAAa,CAAC,EAAEC,OAAS,UAIpB,IAAfD,EACHnG,EAAIG,QAAQgG,EAAa,CAAC,EAAEJ,OAAS,CACpCC,IAAK,CAACrI,MAAM,MAAM,EAClBsI,KAAM,CAACtI,MAAM,OAAO,EACpB0I,OAAQ,CAAC1I,MAAM,OAAO,C,EAGfwI,IAAehP,EAAOC,gBAAgBgC,OAAO,SAAAlD,GAAK,OAAAA,EAAE+G,IAAF,CAAM,EAAErH,OAAS,EAC3EoK,EAAIG,QAAQgG,EAAa,CAAC,EAAEJ,OAAS,CACpCC,IAAK,CAACrI,MAAM,MAAM,EAClB0I,OAAQ,CAAC1I,MAAM,OAAO,EACtBuI,MAAO,CAACvI,MAAM,OAAO,C,EAItBqC,EAAIG,QAAQgG,EAAa,CAAC,EAAEJ,OAAS,CACpCC,IAAK,CAACrI,MAAM,MAAM,EAClB0I,OAAQ,CAAC1I,MAAM,OAAO,C,CAGzB,CAAC,CACF,CAAC,GAGKwG,EAAa,CACrB,CAEA,SAASxD,4BAA4BxJ,EAAQkO,EAAO/H,EAAQkJ,GA4C3D,OA3CInB,EAAQlO,EAAOW,WAAWlC,QAC7B0H,EAASA,EAAO,OAAS+H,EAAQ,KAC1BhO,QAAQ,SAAC4N,EAAUC,GACzBsB,EAAO7F,4BAA4BxJ,EAAQkO,EAAQ,EAAGJ,EAAUuB,CAAI,CACrE,CAAC,EAGDrP,EAAOC,gBAAgBgC,OAAO,SAAAlD,GAAK,OAAAA,EAAE+G,IAAF,CAAM,EAAE5F,QAAQ,SAACC,EAAO6O,GAC1D,IAkBKvJ,EAlBDhD,MAAMC,QAAQyD,EAAOhG,EAAM8F,GAAG,EACjCE,EAAOhG,EAAM8F,IAAI/F,QAAQ,SAAAuF,GACxB,IAAIhH,EAAS,GAETgH,IACHhH,EAASgH,EAAIhH,OAAS,GAGlB4Q,EAAKL,KACTK,EAAKL,GAAcM,KAAKC,IAAI,GAAIpP,EAAM0G,WAAWpI,MAAM,GAGpDA,EAAS4Q,EAAKL,KACjBK,EAAKL,GAAcvQ,EAErB,CAAC,IAGGgH,EAAMU,EAAOhG,EAAM8F,OAGtBxH,OAASgH,EAAIhH,OAAS,GAGlB4Q,EAAKL,KACTK,EAAKL,GAAcM,KAAKC,IAAI,GAAIpP,EAAM0G,WAAWpI,MAAM,GAGpDA,OAAS4Q,EAAKL,KACjBK,EAAKL,GAAcvQ,QAGtB,CAAC,EAGK4Q,CACR,CAt9CAG,QAAArS,mBAAAA","file":"cron-jobs.js","sourcesContent":["import { MethodManager } from '../managers/method.manager';\nimport { ReportBuilderReports } from '../collections/report-builder-report.collection';\nimport SimpleSchema from 'simpl-schema';\nimport { mergeDeep, deepCopy, toTitleCase, round } from '../util/common';\nimport { PaginationOptions } from '../models/pagination.model';\nimport * as moment from 'moment-timezone';\nimport * as XLSX from 'xlsx';\nimport * as Excel from 'exceljs';\nimport { Files } from '../collections/file.collection';\nimport { CronJobs } from '../collections/cron-job.collection';\n\nexport function loadCronJobMethods(methodManager: MethodManager) {\n\tmethodManager.methods({\n\t\tcronEmailMergedDocsCleanUp: {\n\t\t\tfunction: function() {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\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\t\n\t\t\t\t\tif (files.length) {\n\t\t\t\t\t\tthis.callMethodInternal('deleteFiles');\n\t\t\t\t\t\tFiles.deleteMany({_id: {$in: files.map(a => a._id)}});\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve(true);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tstuckCronJob: {\n\t\t\tfunction: function() {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\t\tlet fiveMin = moment().subtract(5, 'minutes').toDate();\n\t\t\t\t\tlet cronJobs = await CronJobs.find({running: true, updatedAt: {$lte: fiveMin}});\n\n\t\t\t\t\tif (cronJobs.length) {\n\t\t\t\t\t\tCronJobs.updateMany({_id: {$in: cronJobs.map(a => a._id)}}, {$set: {running: false}});\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve(true);\n\t\t\t\t});\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: function(data: Object) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\t\tlet report = await ReportBuilderReports.findById(data['id_report']);\n\n\t\t\t\t\treport.fields_selected.forEach((field: any) => {\n\t\t\t\t\t\tlet dotPath = field.fieldPath.replace(/\\.\\$/g, '');\n\t\t\t\t\t\tlet fieldData = dotPath.split('.');\n\t\t\t\t\t\tfield.fieldPathObj = null;\n\t\t\t\t\t\tfor (let i = fieldData.length - 1; i >= 0; i--) {\n\t\t\t\t\t\t\tif (!field.fieldPathObj) {\n\t\t\t\t\t\t\t\tfield.fieldPathObj = {[fieldData[i]]: 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\tfield.fieldPathObj = {[fieldData[i]]: field.fieldPathObj};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tif ((report.fields_selected && report.fields_selected.length) || (report.groups_row && report.groups_row.length)) {\n\t\t\t\t\t\tlet fieldsObj = {};\n\n\t\t\t\t\t\tlet count = 0;\n\n\t\t\t\t\t\treport.fields_selected.forEach((field: any) => {\n\t\t\t\t\t\t\tif (field.collection_name === report.collection_root) {\n\t\t\t\t\t\t\t\tfieldsObj = mergeDeep(fieldsObj, field.fieldPathObj);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tlet sortIndex = report.fields_sort.findIndex(a => a.field === field['id']);\n\n\t\t\t\t\t\t\tif (sortIndex >= 0) {\n\t\t\t\t\t\t\t\treport.fields_sort[sortIndex].field = ('f_' + count);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tfield['id'] = 'f_' + count;\n\n\t\t\t\t\t\t\tcount += 1;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tlet sortObj = {};\n\t\t\t\t\t\tif (report.fields_sort.length) {\n\t\t\t\t\t\t\treport.fields_sort.forEach(sortField => {\n\t\t\t\t\t\t\t\tif (sortField.field.startsWith('gr_')) {\n\t\t\t\t\t\t\t\t\tsortObj['_id.' + sortField.field] = (sortField.order === 'asc' ? 1 : -1);\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\tsortObj[sortField.field] = (sortField.order === 'asc' ? 1 : -1);\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\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tsortObj = null;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet rootOptions: PaginationOptions = {\n\t\t\t\t\t\t\tlimit: 0,\n\t\t\t\t\t\t\tskip: 0,\n\t\t\t\t\t\t\tfields: fieldsObj,\n\t\t\t\t\t\t\tsort: sortObj\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tlet filters = [];\n\t\t\t\t\t\treport.fields_filter.forEach(filterAnd => {\n\t\t\t\t\t\t\tlet ors = [];\n\t\t\t\t\t\t\tfilterAnd.ors.filter(a => !a.field.includes('.$.')).forEach(filter => {\n\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\tif (filter.condition === 'bw') {\n\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\tlet startDate = null;\n\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\tif (filter.rolling_interval === 'Q1') {\n\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\tendDate = moment().startOf('year').quarter(2).subtract(1, 'days').toDate();\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 (filter.rolling_interval === 'Q2') {\n\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\tendDate = moment().startOf('year').quarter(3).subtract(1, 'days').toDate();\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 (filter.rolling_interval === 'Q3') {\n\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\tendDate = moment().startOf('year').quarter(4).subtract(1, 'days').toDate();\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 (filter.rolling_interval === 'Q4') {\n\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\tendDate = moment().endOf('year').toDate();\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 (filter.rolling_interval === 'Today') {\n\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\tendDate = moment().endOf('day').toDate();\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 (filter.rolling_interval === 'Yesterday') {\n\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\tendDate = moment().subtract(1, 'days').endOf('day').toDate();\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 (filter.rolling_interval === 'Week') {\n\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\tendDate = moment().endOf('day').toDate();\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 (filter.rolling_interval === 'Last Week') {\n\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\tstartDate = moment(endDate).startOf('isoWeek').toDate();\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 (filter.rolling_interval === 'Month') {\n\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\tendDate = moment().endOf('day').toDate();\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 (filter.rolling_interval === 'Last Month') {\n\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\tstartDate = moment(endDate).startOf('month').toDate();\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 (filter.rolling_interval === 'Last 30 Days') {\n\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\tstartDate = moment().subtract(30, 'days').startOf('day').toDate();\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 (filter.rolling_interval === 'Quarter') {\n\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\tendDate = moment().endOf('day').toDate();\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 (filter.rolling_interval === 'Last Quarter') {\n\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\tstartDate = moment(endDate).startOf('quarter').toDate();\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 (filter.rolling_interval === 'Year') {\n\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\tendDate = moment().endOf('day').toDate();\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 (filter.rolling_interval === 'Last Year') {\n\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\tstartDate = moment(endDate).startOf('year').toDate();\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 (filter.rolling_interval === 'All') {\n\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\tendDate = moment().endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\tendDate.setHours(23);\n\t\t\t\t\t\t\t\t\t\t\tendDate.setMinutes(59);\n\t\t\t\t\t\t\t\t\t\t\tendDate.setSeconds(59);\n\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\tors.push({$and: [{[filter.field]: {'$gte': startDate}}, {[filter.field]: {'$lte': endDate}}]});\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\tors.push({$and: [{[filter.field]: {'$gte': filter.value}}, {[filter.field]: {'$lte': filter.highValue}}]});\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 (filter.condition === 'nnull') {\n\t\t\t\t\t\t\t\t\t\tlet and = [];\n\t\t\t\t\t\t\t\t\t\tand.push({[filter.field]: {'$exists': true}});\n\t\t\t\t\t\t\t\t\t\tand.push({[filter.field]: {'$ne': null}});\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tif (filter.fieldType === 'String') {\n\t\t\t\t\t\t\t\t\t\t\tand.push({[filter.field]: {'$ne': ''}});\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tors.push({$and: and});\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse if (filter.condition === 'null') {\n\t\t\t\t\t\t\t\t\t\tors.push({[filter.field]: {'$eq': null}});\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\tif (Array.isArray(filter.value)) {\n\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\tlet and = [];\n\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\tand.push({[filter.field]: {['$' + filter.condition]: (Array.isArray(filt) ? filt[0] : filt)}});\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\tif (and.length > 1) {\n\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}\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\tors.push(and[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 {\n\t\t\t\t\t\t\t\t\t\t\t\tlet or = [];\n\t\t\t\t\n\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\tor.push({[filter.field]: {['$' + filter.condition]: (Array.isArray(filt) ? filt[0] : filt)}});\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\n\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\tors.push({$or: or});\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\tors.push(or[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}\n\t\t\t\t\t\t\t\t\t\telse {\n\t\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\t}\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\n\t\t\t\t\t\t\tif (ors.length) {\n\t\t\t\t\t\t\t\tfilters.push({$or: ors});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tthis.callMethodInternal('reportBuilderBuildTree', report.collection_root, (errCollTree, collectionTree) => {\n\t\t\t\t\t\t\tif (collectionTree) {\n\t\t\t\t\t\t\t\tcollectionTree.layers = [collectionTree];\n\t\t\t\t\n\t\t\t\t\t\t\t\tlet treeLeaves = [];\n\t\t\t\t\t\t\t\tlet allLeaves = [];\n\t\t\t\t\t\t\t\tgetTreeLeaves(collectionTree.children, treeLeaves);\n\t\t\t\t\t\t\t\tgetTreeLeaves(collectionTree.children, allLeaves, true);\n\n\t\t\t\t\t\t\t\tlet filterArrayFields = [];\n\t\t\t\t\t\t\t\tlet filterArrays = [];\n\t\t\t\t\t\t\t\treport.fields_filter.forEach(filterAnd => {\n\t\t\t\t\t\t\t\t\tlet ors = [];\n\t\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\t\tlet filterLeaf = allLeaves.find(a => a.fieldPath === filter.field);\n\t\t\t\t\t\t\t\t\t\tif (filterLeaf) {\n\t\t\t\t\t\t\t\t\t\t\tfilterArrayFields.push(filterLeaf);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\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\t\tif (filter.condition === 'bw') {\n\t\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\t\tlet startDate = null;\n\t\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\t\tif (filter.rolling_interval === 'Q1') {\n\t\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\t\tendDate = moment().startOf('year').quarter(2).subtract(1, 'days').toDate();\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 if (filter.rolling_interval === 'Q2') {\n\t\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\t\tendDate = moment().startOf('year').quarter(3).subtract(1, 'days').toDate();\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 if (filter.rolling_interval === 'Q3') {\n\t\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\t\tendDate = moment().startOf('year').quarter(4).subtract(1, 'days').toDate();\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 if (filter.rolling_interval === 'Q4') {\n\t\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\t\tendDate = moment().endOf('year').toDate();\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 if (filter.rolling_interval === 'Today') {\n\t\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\t\tendDate = moment().endOf('day').toDate();\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 if (filter.rolling_interval === 'Yesterday') {\n\t\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\t\tendDate = moment().subtract(1, 'days').endOf('day').toDate();\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 if (filter.rolling_interval === 'Week') {\n\t\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\t\tendDate = moment().endOf('day').toDate();\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 if (filter.rolling_interval === 'Last Week') {\n\t\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\t\tstartDate = moment(endDate).startOf('isoWeek').toDate();\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 if (filter.rolling_interval === 'Month') {\n\t\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\t\tendDate = moment().endOf('day').toDate();\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 if (filter.rolling_interval === 'Last Month') {\n\t\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\t\tstartDate = moment(endDate).startOf('month').toDate();\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 if (filter.rolling_interval === 'Last 30 Days') {\n\t\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\t\tstartDate = moment().subtract(30, 'days').startOf('day').toDate();\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 if (filter.rolling_interval === 'Quarter') {\n\t\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\t\tendDate = moment().endOf('day').toDate();\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 if (filter.rolling_interval === 'Last Quarter') {\n\t\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\t\tstartDate = moment(endDate).startOf('quarter').toDate();\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 if (filter.rolling_interval === 'Year') {\n\t\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\t\tendDate = moment().endOf('day').toDate();\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 if (filter.rolling_interval === 'Last Year') {\n\t\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\t\tstartDate = moment(endDate).startOf('year').toDate();\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 if (filter.rolling_interval === 'All') {\n\t\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\t\tendDate = moment().endOf('day').toDate();\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\tendDate.setHours(23);\n\t\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\t\tendDate.setSeconds(59);\n\t\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\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\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\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\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 (filter.condition === 'nnull') {\n\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\tand.push({[filter.field.replace(/\\.\\$/g, '')]: {'$exists': true}});\n\t\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\t\n\t\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\t\tand.push({[filter.field.replace(/\\.\\$/g, '')]: {'$ne': ''}});\n\t\t\t\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\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 if (filter.condition === 'null') {\n\t\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\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 (Array.isArray(filter.value)) {\n\t\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\t\tlet and = [];\n\t\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\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\t});\n\t\t\t\t\t\t\t\t\n\t\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\t\tors.push({$and: and});\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\telse {\n\t\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\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\tlet or = [];\n\t\t\t\t\t\t\t\t\n\t\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\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\t});\n\t\t\t\t\t\t\t\t\n\t\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\t\tors.push({$or: or});\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\telse {\n\t\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\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\tors.push({[filter.field.replace(/\\.\\$/g, '')]: {['$' + filter.condition]: filter.value}});\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\n\t\t\t\t\t\t\t\t\tif (ors.length) {\n\t\t\t\t\t\t\t\t\t\tfilterArrays.push({$or: ors});\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\tthis.callMethodInternal('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, (err, res) => {\n\t\t\t\t\t\t\t\t\tif (res && res[0]) {\n\t\t\t\t\t\t\t\t\t\tlet results = res[0].results;\n\t\t\t\t\t\t\t\t\t\tlet reportTotals = res[0].totals;\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tif (report.type === 'List') {\n\t\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\t\tif ((field.fieldType === 'Number' || field.leafValueType === 'Count') && field.leafFormatType === 'Number') {\n\t\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\t\tresult[field.id] = result[field.id].toLocaleString();\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 if ((field.fieldType === 'Number' || field.leafValueType === 'Count') && field.leafFormatType === 'String') {\n\t\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\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\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 if ((field.fieldType === 'Number' || field.leafValueType === 'Count') && field.leafFormatType === 'Currency') {\n\t\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\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\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 if (field.fieldType === 'Boolean' && (!field.leafFormatType || field.leafFormatType === 'Boolean')) {\n\t\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\t\tresult[field.id] = result[field.id] === true ? 'True' : '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\telse if (field.fieldType === 'Boolean' && field.leafFormatType === 'String') {\n\t\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\t\tresult[field.id] = result[field.id] === true ? 'Yes' : 'No';\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 if (field.fieldType === 'Boolean' && field.leafFormatType === 'Boolean_Number') {\n\t\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\t\tresult[field.id] = result[field.id] === true ? 1 : 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 if (field.fieldType === 'Date' && (field.leafFormatType === 'Date')) {\n\t\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\t\tresult[field.id] = moment(result[field.id]).format('L');\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 if (field.fieldType === 'Date' && field.leafFormatType === 'Time') {\n\t\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\t\tresult[field.id] = moment(result[field.id]).format('LT');\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 if (field.fieldType === 'Date' && field.leafFormatType === 'DateTime') {\n\t\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\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\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 if (field.fieldType === 'Date' && field.leafFormatType === 'Date_long') {\n\t\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\t\tresult[field.id] = moment(result[field.id]).format('LL');\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 if (field.fieldType === 'Date' && field.leafFormatType === 'DateTime_long') {\n\t\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\t\tresult[field.id] = moment(result[field.id]).format('LLL');\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 if (field.fieldType === 'Date' && field.leafFormatType === 'Timestamp') {\n\t\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\t\tresult[field.id] = moment(result[field.id]).toDate().getTime();\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\tlet lines: any = [];\n\n\t\t\t\t\t\t\t\t\t\t\tlet tmpHeaders = {};\n\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\ttmpHeaders[group.id] = group.columnName;\n\t\t\t\t\t\t\t\t\t\t\t});\n\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\ttmpHeaders[header.columnName] = header.columnName;\n\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\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\t\tresults.forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\t\tlet tmp = {};\n\t\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\t\tif (Array.isArray(result._id[group.id])) {\n\t\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\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\tif (group.treeItem.fieldType === 'Number') {\n\t\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\t}\n\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\ttmp[group.columnName] = result._id[group.id] || '';\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\treport.fields_selected.filter(a => a.show).forEach(header => {\n\t\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\t\ttmp[header.columnName] = result[header.id].join(',');\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\tif (header.fieldType === 'Number' || header.leafValueType === 'Count') {\n\t\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\t}\n\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\ttmp[header.columnName] = result[header.id] || '';\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\n\t\t\t\t\t\t\t\t\t\t\t\tlines.push(tmp);\n\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\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\t\tXLSX.utils.book_append_sheet(wb, ws, 'RB Data');\n\t\t\t\t\t\t\t\t\t\n\t\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\t\tdata['emails'].forEach(email => {\n\t\t\t\t\t\t\t\t\t\t\t\tthis.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\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: wbout,\n\t\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\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\telse if (report.type === 'Group') {\n\t\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\t\tresults.forEach(result => {\n\t\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\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\tlet wb = new Excel.Workbook();\n\t\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\t\twb.properties.date1904 = false;\n\t\t\t\t\t\t\t\t\t\t\twb.calcProperties.fullCalcOnLoad = true;\n\n\t\t\t\t\t\t\t\t\t\t\tlet currentRow = 1;\n\t\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\t\trow.getCell(2).font = {\n\t\t\t\t\t\t\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\t\t\t\t\t\t\tbold: true,\n\t\t\t\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\t\trow.getCell(4).font = {\n\t\t\t\t\t\t\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t\t\t\t};\n\t\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\t\trow.getCell(4).value = report.report_name;\n\n\t\t\t\t\t\t\t\t\t\t\tcurrentRow += 1;\n\t\t\t\t\t\t\t\t\t\t\trow = ws.getRow(currentRow);\n\n\t\t\t\t\t\t\t\t\t\t\trow.getCell(2).font = {\n\t\t\t\t\t\t\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\t\t\t\t\t\t\tbold: true,\n\t\t\t\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\t\trow.getCell(4).font = {\n\t\t\t\t\t\t\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t\t\t\t};\n\t\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\t\trow.getCell(4).value = moment().format('LLL');\n\n\t\t\t\t\t\t\t\t\t\t\tcurrentRow += 2;\n\n\t\t\t\t\t\t\t\t\t\t\tlet copy = deepCopy(results);\n\t\t\t\t\t\t\t\t\t\t\tlet widths = [];\n\t\t\t\t\t\t\t\t\t\t\tcopy.forEach(res => {\n\t\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\t\ttabGroupExcelWidthRecursive(report, 1, res, widths);\n\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\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\t\tws.columns[i].width = widths[i - 1];\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\tlet now = new Date();\n\n\t\t\t\t\t\t\t\t\t\t\twb.xlsx.writeBuffer().then(buffer => {\n\t\t\t\t\t\t\t\t\t\t\t\tdata['emails'].forEach(email => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthis.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\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}).catch(err => console.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\telse if (report.type === 'Dated') {\n\t\t\t\t\t\t\t\t\t\t\tlet datedUniqueDates = [];\n\t\t\t\t\t\t\t\t\t\t\tlet datedUniqueGroups = [];\n\t\t\t\t\t\t\t\t\t\t\tlet datedData = [];\n\t\t\t\t\t\t\t\t\t\t\tlet reportTotalGroups = [];\n\t\t\t\t\t\t\t\t\t\t\tlet reportTotalDates = [];\n\t\t\t\t\t\t\t\t\t\t\n\t\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\t\tif (report.date_interval === 'Quarterly') {\n\t\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\t\tif (dataPt._id.month < 4) {\n\t\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\t}\n\t\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\t\tdataPt._id.quarter = 2;\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 if (dataPt._id.month < 10) {\n\t\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\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\tdataPt._id.quarter = 4;\n\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\tdelete dataPt._id.month;\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\t// Deduplicate quarterly data\n\t\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\t\tlet dataPt = results[i];\n\t\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\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\t\tObject.keys(tmpData)\n\t\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\t.forEach(key => {\n\t\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\t});\n\t\t\t\t\t\t\t\t\t\t\n\t\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\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\t// Step 2: Prepare unique groups\n\t\t\t\t\t\t\t\t\t\t\tlet tmpResults = deepCopy(results);\n\t\t\t\t\t\t\t\t\t\t\ttmpResults.forEach(result => {\n\t\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\t\tdelete result._id.week;\n\t\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\t\tdelete result._id.quarter;\n\t\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\t\tlet tmpGroup = {};\n\t\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\t\ttmpGroup[key] = 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\t\tif (!datedUniqueGroups.find(a => JSON.stringify(a) === JSON.stringify(tmpGroup))) {\n\t\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\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// Step 3: Prepare unique dates\n\t\t\t\t\t\t\t\t\t\t\ttmpResults = deepCopy(results);\n\t\t\t\t\t\t\t\t\t\t\ttmpResults.forEach(result => {\n\t\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\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\t.forEach(key => {\n\t\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\t});\n\n\t\t\t\t\t\t\t\t\t\t\t\tlet tmpDate = {};\n\t\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\t\ttmpDate[key] = 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\t\tif (!datedUniqueDates.find(a => JSON.stringify(a) === JSON.stringify(tmpDate))) {\n\t\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\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// Build the date strings\n\t\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\t\tdatedUniqueDates.forEach(result => {\n\t\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\t\tresult.dateString = 'No Date';\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 (report.date_interval === 'Seconds') {\n\t\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\t\tyear: result.year,\n\t\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\t\tday: result.day,\n\t\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\t\tminute: result.minute,\n\t\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\t}, (process.env.TZ_CLIENT || 'America/Chicago')).toDate();\n\t\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\t}\n\t\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\t\tresult.date = moment.tz({\n\t\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\t\tmonth: result.month - 1,\n\t\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\t\thour: result.hour,\n\t\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\t}, (process.env.TZ_CLIENT || 'America/Chicago')).toDate();\n\t\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\t}\n\t\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\t\tresult.date = moment.tz({\n\t\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\t\tmonth: result.month - 1,\n\t\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\t\thour: result.hour\n\t\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\t\tresult.dateString = moment(result.date).format('MMM DD YYYY HH');\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 if (report.date_interval === 'Daily') {\n\t\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\t\tyear: result.year,\n\t\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\t\tday: result.day\n\t\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\t\tresult.dateString = moment(result.date).format('MMM DD YYYY');\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 if (report.date_interval === 'Weekly') {\n\t\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\t\tyear: result.year,\n\t\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\t}, (process.env.TZ_CLIENT || 'America/Chicago')).day('Monday').toDate();\n\t\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\t\tyear: result.year,\n\t\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\t}, (process.env.TZ_CLIENT || 'America/Chicago')).day('Sunday').toDate();\n\t\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\t}\n\t\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\t\tresult.date = moment.tz({\n\t\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\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\t}, (process.env.TZ_CLIENT || 'America/Chicago')).toDate();\n\t\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\t}\n\t\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\t\tresult.date = moment.tz({\n\t\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\t}, (process.env.TZ_CLIENT || 'America/Chicago')).quarter(result.quarter).toDate();;\n\t\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\t}\n\t\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\t\tresult.date = moment.tz({\n\t\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\t}, (process.env.TZ_CLIENT || 'America/Chicago')).toDate();\n\t\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\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\t\tdatedUniqueDates = datedUniqueDates.filter(a => !a.date)\n\t\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\t\n\t\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\t\tdatedUniqueDates.forEach(date => {\n\t\t\t\t\t\t\t\t\t\t\t\tlet tmpData = [];\n\t\t\t\t\t\t\t\t\t\t\t\tlet tmpTotalDated = {};\n\t\t\t\t\t\t\t\t\t\t\t\tlet tmpTotalCnt = {};\n\t\t\t\t\t\t\t\t\t\t\t\tlet tmpTotalType = {};\n\n\t\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\t\tlet result = results.find(a => {\n\t\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\t// Match the group fields\n\t\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\t\tif (a._id[key] !== group[key]) {\n\t\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\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\n\t\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\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\t\tif (a._id[key] !== date[key]) {\n\t\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\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\n\t\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\t});\n\t\t\t\t\t\t\t\t\t\t\n\t\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\t\ttmpData.push(result);\n\t\t\t\t\t\t\t\t\t\t\n\t\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\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\t\tif (!tmpTotalDated[key]) {\n\t\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\t}\n\t\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\t\ttmpTotalDated[key] += result._id[key];\n\t\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\t\tif (!tmpTotalCnt[key]) {\n\t\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\t}\n\t\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\t\ttmpTotalCnt[key] += 1;\n\t\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\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\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\n\t\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\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\t\tif (!tmpTotalDated[key]) {\n\t\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\t}\n\t\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\t\ttmpTotalDated[key] += result[key];\n\t\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\t\tif (!tmpTotalCnt[key]) {\n\t\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\t}\n\t\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\t\ttmpTotalCnt[key] += 1;\n\t\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\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\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}\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\ttmpData.push(null);\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\n\t\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\t\tObject.keys(tmpTotalType).forEach(totalKey => {\n\t\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\t\ttmpTotalDated[totalKey] = tmpTotalDated[totalKey] / tmpTotalCnt[totalKey];\n\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\ttmpTotalDated[totalKey] = round(tmpTotalDated[totalKey], 2);\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\treportTotalDates.push(tmpTotalDated);\n\t\t\t\t\t\t\t\t\t\t\t\tdatedData.push(tmpData);\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\t\t// Calculate group-level totals\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 tmpTotalGroup = {};\n\t\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\t\tlet match = (!Object.keys(group).length || group._id === null) ? false : true;\n\t\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\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\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\t\n\t\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\t\ttotal.fields.forEach(field => {\n\t\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\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\t.map(a => a[field])\n\t\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\t\n\t\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\t\ttmpTotalGroup[field] = round(tmpTotalGroup[field] / filteredData.length, 2);\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}\n\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\ttmpTotalGroup[field] = 0;\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\n\t\t\t\t\t\t\t\t\t\t\t\treportTotalGroups.push(tmpTotalGroup);\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\t\t// Step 5: Proceed with Excel generation using datedData and reportTotalGroups\n\t\t\t\t\t\t\t\t\t\t\tlet wb = new Excel.Workbook();\n\t\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\t\twb.properties.date1904 = false;\n\t\t\t\t\t\t\t\t\t\t\twb.calcProperties.fullCalcOnLoad = true;\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tlet currentRow = 1;\n\t\t\t\t\t\t\t\t\t\t\tlet currentCol = 1;\n\t\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\t\trow.getCell(2).font = {\n\t\t\t\t\t\t\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\t\t\t\t\t\t\tbold: true,\n\t\t\t\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\t\trow.getCell(4).font = {\n\t\t\t\t\t\t\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t\t\t\t};\n\t\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\t\trow.getCell(4).value = report.report_name;\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tcurrentRow += 1;\n\t\t\t\t\t\t\t\t\t\t\trow = ws.getRow(currentRow);\n\t\t\n\t\t\t\t\t\t\t\t\t\t\trow.getCell(2).font = {\n\t\t\t\t\t\t\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\t\t\t\t\t\t\tbold: true,\n\t\t\t\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\t\trow.getCell(4).font = {\n\t\t\t\t\t\t\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t\t\t\t};\n\t\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\t\trow.getCell(4).value = moment().format('LLL');\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tcurrentRow += 2;\n\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\n\t\t\t\t\t\t\t\t\t\t\t// Add group column headers\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\trow.getCell(currentCol).value = group.columnName;\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\t\t// Add field headers\n\t\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\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\t\t// Add the date interval headers\n\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\tdatedUniqueDates.forEach(date => {\n\t\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\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\t\t});\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t// Add totals headers\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\trow.getCell(currentCol).value = 'Totals - ' + toTitleCase(total.type);\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\t\tcurrentCol = 1;\n\t\t\t\t\t\t\t\t\t\t\tcurrentRow += 1;\n\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\n\t\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\t\tfor (let i = 0; i < datedUniqueGroups.length; i++) {\n\t\t\t\t\t\t\t\t\t\t\t\tlet group = datedUniqueGroups[i];\n\t\t\t\t\t\t\t\t\t\t\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\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\trow = ws.getRow(currentRow);\n\t\t\t\t\t\t\t\t\t\t\n\t\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\t\treport.groups_row.forEach(groupRow => {\n\t\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\t\tcurrentCol++;\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\n\t\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\t\trow.getCell(currentCol).value = field.columnName;\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\n\t\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\t\tfor (let k = 0; k < datedUniqueDates.length; k++) {\n\t\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\t\tif (result[i]) {\n\t\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\t}\n\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\trow.getCell(currentCol).value = '';\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\tcurrentCol++;\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\n\t\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\t\tfor (let k = 0; k < report.fields_total.length; k++) {\n\t\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\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\t\tcurrentCol++;\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\n\t\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\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\t\t// Add report totals at the bottom\n\t\t\t\t\t\t\t\t\t\t\tif (reportTotals) {\n\t\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\t\tlet total = report.fields_total[i];\n\t\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\t\tcurrentCol = 1;\n\t\t\t\t\t\t\t\t\t\t\n\t\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\t\tcurrentCol += report.groups_row.length; // Skip group columns\n\t\t\t\t\t\t\t\t\t\t\n\t\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\t\treport.fields_selected.filter(a => a.show).forEach(() => {\n\t\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\t});\n\n\t\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\t\tcurrentCol++;\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\n\t\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\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\t\tlet field = report.fields_selected.filter(a => a.show)[j];\n\t\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\t\tcurrentCol++;\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\n\t\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\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\t\t// Save the Excel file and send it via email\n\t\t\t\t\t\t\t\t\t\t\twb.xlsx.writeBuffer().then(buffer => {\n\t\t\t\t\t\t\t\t\t\t\t\tdata['emails'].forEach(email => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthis.sendEmail(\n\t\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\t\tthis.serverConfig['CLIENT_NAME'] + ' Scheduled Report - ' + report.report_name,\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`\n\t\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\t<b>Report Name: </b>${report.report_name}<br>\n\t\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\t\tAttached are the results of this automated report.<br><br>\n\t\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\t[\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\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\t\tcontent: buffer\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],\n\t\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\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}).catch(err => console.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\t\tresolve(true);\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 {\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tthis.callMethodInternal('insertErrorLog', 'Report Builder Cron Job - Report Builder Get Results', [\n\t\t\t\t\t\t\t\t\t\t\terr\n\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\treject(err);\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\t\t\t\t\t}\n\t\t\t\t});\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\tif (index < report.groups_row.length) {\n\t\tresult = result['gr_' + (index + 1)];\n\t\tif (result) {\n\t\t\tresult.forEach((tDataRes, tIndex) => {\n\t\t\t\tmodifyDataTypeField(report, tDataRes, field, index + 1)\n\t\t\t});\n\t\t}\n\t}\n\telse {\n\t\tif (Array.isArray(result[field.id])) {\n\t\t\tresult[field.id].forEach((arr, arrIndex) => {\n\t\t\t\tif ((field.fieldType === 'Number' || field.leafValueType === 'Count') && field.leafFormatType === 'Number') {\n\t\t\t\t\tresult[field.id].splice(arrIndex, 1, arr.toLocaleString());\n\t\t\t\t}\n\t\t\t\telse if ((field.fieldType === 'Number' || field.leafValueType === 'Count') && field.leafFormatType === 'String') {\n\t\t\t\t\tresult[field.id].splice(arrIndex, 1, arr.toString());\n\t\t\t\t}\n\t\t\t\telse if ((field.fieldType === 'Number' || field.leafValueType === 'Count') && field.leafFormatType === 'Currency') {\n\t\t\t\t\tresult[field.id].splice(arrIndex, 1, round(arr, 2).toLocaleString('en-US', { style: 'currency', currency: 'USD' }));\n\t\t\t\t}\n\t\t\t\telse if (field.fieldType === 'Boolean' && (!field.leafFormatType || field.leafFormatType === 'Boolean')) {\n\t\t\t\t\tresult[field.id].splice(arrIndex, 1, arr === true ? 'True' : 'False');\n\t\t\t\t}\n\t\t\t\telse if (field.fieldType === 'Boolean' && field.leafFormatType === 'String') {\n\t\t\t\t\tresult[field.id].splice(arrIndex, 1, arr === true ? 'Yes' : 'No');\n\t\t\t\t}\n\t\t\t\telse if (field.fieldType === 'Boolean' && field.leafFormatType === 'Boolean_Number') {\n\t\t\t\t\tresult[field.id].splice(arrIndex, 1, arr === true ? 1 : 0);\n\t\t\t\t}\n\t\t\t\telse if (field.fieldType === 'Date' && (field.leafFormatType === 'Date')) {\n\t\t\t\t\tresult[field.id].splice(arrIndex, 1, moment(arr).format('L'));\n\t\t\t\t}\n\t\t\t\telse if (field.fieldType === 'Date' && field.leafFormatType === 'Time') {\n\t\t\t\t\tresult[field.id].splice(arrIndex, 1, moment(arr).format('LT'));\n\t\t\t\t}\n\t\t\t\telse if (field.fieldType === 'Date' && field.leafFormatType === 'DateTime') {\n\t\t\t\t\tresult[field.id].splice(arrIndex, 1, moment(arr).format('MM/DD/YYYY h:mm A'));\n\t\t\t\t}\n\t\t\t\telse if (field.fieldType === 'Date' && field.leafFormatType === 'Date_long') {\n\t\t\t\t\tresult[field.id].splice(arrIndex, 1, moment(arr).format('LL'));\n\t\t\t\t}\n\t\t\t\telse if (field.fieldType === 'Date' && field.leafFormatType === 'DateTime_long') {\n\t\t\t\t\tresult[field.id].splice(arrIndex, 1, moment(arr).format('LLL'));\n\t\t\t\t}\n\t\t\t\telse if (field.fieldType === 'Date' && field.leafFormatType === 'Timestamp') {\n\t\t\t\t\tresult[field.id].splice(arrIndex, 1, moment(arr).toDate().getTime());\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tif ((field.fieldType === 'Number' || field.leafValueType === 'Count') && field.leafFormatType === 'Number') {\n\t\t\t\tresult[field.id] = result[field.id].toLocaleString();\n\t\t\t}\n\t\t\telse if ((field.fieldType === 'Number' || field.leafValueType === 'Count') && field.leafFormatType === 'String') {\n\t\t\t\tresult[field.id] = result[field.id].toString();\n\t\t\t}\n\t\t\telse if ((field.fieldType === 'Number' || field.leafValueType === 'Count') && field.leafFormatType === 'Currency') {\n\t\t\t\tresult[field.id] = round(result[field.id], 2).toLocaleString('en-US', { style: 'currency', currency: 'USD' });\n\t\t\t}\n\t\t\telse if (field.fieldType === 'Boolean' && (!field.leafFormatType || field.leafFormatType === 'Boolean')) {\n\t\t\t\tresult[field.id] = result[field.id] === true ? 'True' : 'False';\n\t\t\t}\n\t\t\telse if (field.fieldType === 'Boolean' && field.leafFormatType === 'String') {\n\t\t\t\tresult[field.id] = result[field.id] === true ? 'Yes' : 'No';\n\t\t\t}\n\t\t\telse if (field.fieldType === 'Boolean' && field.leafFormatType === 'Boolean_Number') {\n\t\t\t\tresult[field.id] = result[field.id] === true ? 1 : 0;\n\t\t\t}\n\t\t\telse if (field.fieldType === 'Date' && (field.leafFormatType === 'Date')) {\n\t\t\t\tresult[field.id] = moment(result[field.id]).format('L');\n\t\t\t}\n\t\t\telse if (field.fieldType === 'Date' && field.leafFormatType === 'Time') {\n\t\t\t\tresult[field.id] = moment(result[field.id]).format('LT');\n\t\t\t}\n\t\t\telse if (field.fieldType === 'Date' && field.leafFormatType === 'DateTime') {\n\t\t\t\tresult[field.id] = moment(result[field.id]).format('MM/DD/YYYY h:mm A');\n\t\t\t}\n\t\t\telse if (field.fieldType === 'Date' && field.leafFormatType === 'Date_long') {\n\t\t\t\tresult[field.id] = moment(result[field.id]).format('LL');\n\t\t\t}\n\t\t\telse if (field.fieldType === 'Date' && field.leafFormatType === 'DateTime_long') {\n\t\t\t\tresult[field.id] = moment(result[field.id]).format('LLL');\n\t\t\t}\n\t\t\telse if (field.fieldType === 'Date' && field.leafFormatType === 'Timestamp') {\n\t\t\t\tresult[field.id] = moment(result[field.id]).toDate().getTime();\n\t\t\t}\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":["report_builder_report_collection_1","require","simpl_schema_1","common_1","moment","XLSX","Excel","file_collection_1","cron_job_collection_1","loadCronJobMethods","methodManager","methods","cronEmailMergedDocsCleanUp","function","_this","this","Promise","resolve","reject","__awaiter","Files","find","$and","type","createdAt","$lte","subtract","toDate","files","_a","sent","length","callMethodInternal","deleteMany","_id","$in","map","a","stuckCronJob","fiveMin","CronJobs","running","updatedAt","cronJobs","updateMany","$set","reportbuilderCronJob","check","default","data","Object","blackbox","ReportBuilderReports","findById","report","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_1","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","_k","errCollTree","collectionTree","allLeaves_1","filterArrayFields_1","filterArrays_1","layers","getTreeLeaves","children","and_2","or_2","filterLeaf","fields_custom","fields_total","fields_link","id_date_field","date_interval","group_type","err","res","results_1","results","reportTotals","totals","show","leafValueType","leafFormatType","id","undefined","result","format","getTime","round","toLocaleString","style","currency","lines_1","wb","group","columnName","header","utils","book_new","ws","tmp","join","treeItem","parseFloat","json_to_sheet","wbout_1","book_append_sheet","write","bookType","email","sendEmail","serverConfig","report_name","filename","content","encoding","modifyDataTypeField","ws_1","Workbook","addWorksheet","views","showGridLines","currentRow_1","properties","date1904","calcProperties","fullCalcOnLoad","row","getRow","copy","getCell","font","name","bold","size","deepCopy","widths_1","tabGroupExcelRecursive","tabGroupExcelWidthRecursive","columns","width","now_1","xlsx","writeBuffer","then","buffer","getFullYear","getMonth","getDate","catch","console","log","datedUniqueDates_1","datedUniqueGroups_1","datedData_1","reportTotalGroups_1","reportTotalDates_1","dataPt","month","tmpData_1","JSON","stringify","keys","key","splice","tmpResults","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","currentRow","currentCol_1","row_1","toTitleCase","j","groupRow","k","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 { MethodManager } from '../managers/method.manager';\nimport { ReportBuilderReports } from '../collections/report-builder-report.collection';\nimport SimpleSchema from 'simpl-schema';\nimport { mergeDeep, deepCopy, toTitleCase, round } from '../util/common';\nimport { PaginationOptions } from '../models/pagination.model';\nimport * as moment from 'moment-timezone';\nimport * as XLSX from 'xlsx';\nimport * as Excel from 'exceljs';\nimport { Files } from '../collections/file.collection';\nimport { CronJobs } from '../collections/cron-job.collection';\n\nexport function loadCronJobMethods(methodManager: MethodManager) {\n\tmethodManager.methods({\n\t\tcronEmailMergedDocsCleanUp: {\n\t\t\tfunction: function() {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\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\t\n\t\t\t\t\tif (files.length) {\n\t\t\t\t\t\tthis.callMethodInternal('deleteFiles');\n\t\t\t\t\t\tFiles.deleteMany({_id: {$in: files.map(a => a._id)}});\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve(true);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tstuckCronJob: {\n\t\t\tfunction: function() {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\t\tlet fiveMin = moment().subtract(5, 'minutes').toDate();\n\t\t\t\t\tlet cronJobs = await CronJobs.find({running: true, updatedAt: {$lte: fiveMin}});\n\n\t\t\t\t\tif (cronJobs.length) {\n\t\t\t\t\t\tCronJobs.updateMany({_id: {$in: cronJobs.map(a => a._id)}}, {$set: {running: false}});\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve(true);\n\t\t\t\t});\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: function(data: Object) {\n\t\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\t\tlet report = await ReportBuilderReports.findById(data['id_report']);\n\n\t\t\t\t\treport.fields_selected.forEach((field: any) => {\n\t\t\t\t\t\tlet dotPath = field.fieldPath.replace(/\\.\\$/g, '');\n\t\t\t\t\t\tlet fieldData = dotPath.split('.');\n\t\t\t\t\t\tfield.fieldPathObj = null;\n\t\t\t\t\t\tfor (let i = fieldData.length - 1; i >= 0; i--) {\n\t\t\t\t\t\t\tif (!field.fieldPathObj) {\n\t\t\t\t\t\t\t\tfield.fieldPathObj = {[fieldData[i]]: 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\tfield.fieldPathObj = {[fieldData[i]]: field.fieldPathObj};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tif ((report.fields_selected && report.fields_selected.length) || (report.groups_row && report.groups_row.length)) {\n\t\t\t\t\t\tlet fieldsObj = {};\n\n\t\t\t\t\t\tlet count = 0;\n\n\t\t\t\t\t\treport.fields_selected.forEach((field: any) => {\n\t\t\t\t\t\t\tif (field.collection_name === report.collection_root) {\n\t\t\t\t\t\t\t\tfieldsObj = mergeDeep(fieldsObj, field.fieldPathObj);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tlet sortIndex = report.fields_sort.findIndex(a => a.field === field['id']);\n\n\t\t\t\t\t\t\tif (sortIndex >= 0) {\n\t\t\t\t\t\t\t\treport.fields_sort[sortIndex].field = ('f_' + count);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tfield['id'] = 'f_' + count;\n\n\t\t\t\t\t\t\tcount += 1;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tlet sortObj = {};\n\t\t\t\t\t\tif (report.fields_sort.length) {\n\t\t\t\t\t\t\treport.fields_sort.forEach(sortField => {\n\t\t\t\t\t\t\t\tif (sortField.field.startsWith('gr_')) {\n\t\t\t\t\t\t\t\t\tsortObj['_id.' + sortField.field] = (sortField.order === 'asc' ? 1 : -1);\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\tsortObj[sortField.field] = (sortField.order === 'asc' ? 1 : -1);\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\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tsortObj = null;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet rootOptions: PaginationOptions = {\n\t\t\t\t\t\t\tlimit: 0,\n\t\t\t\t\t\t\tskip: 0,\n\t\t\t\t\t\t\tfields: fieldsObj,\n\t\t\t\t\t\t\tsort: sortObj\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tlet filters = [];\n\t\t\t\t\t\treport.fields_filter.forEach(filterAnd => {\n\t\t\t\t\t\t\tlet ors = [];\n\t\t\t\t\t\t\tfilterAnd.ors.filter(a => !a.field.includes('.$.')).forEach(filter => {\n\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\tif (filter.condition === 'bw') {\n\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\tlet startDate = null;\n\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\tif (filter.rolling_interval === 'Q1') {\n\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\tendDate = moment().startOf('year').quarter(2).subtract(1, 'days').toDate();\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 (filter.rolling_interval === 'Q2') {\n\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\tendDate = moment().startOf('year').quarter(3).subtract(1, 'days').toDate();\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 (filter.rolling_interval === 'Q3') {\n\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\tendDate = moment().startOf('year').quarter(4).subtract(1, 'days').toDate();\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 (filter.rolling_interval === 'Q4') {\n\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\tendDate = moment().endOf('year').toDate();\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 (filter.rolling_interval === 'Today') {\n\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\tendDate = moment().endOf('day').toDate();\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 (filter.rolling_interval === 'Yesterday') {\n\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\tendDate = moment().subtract(1, 'days').endOf('day').toDate();\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 (filter.rolling_interval === 'Week') {\n\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\tendDate = moment().endOf('day').toDate();\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 (filter.rolling_interval === 'Last Week') {\n\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\tstartDate = moment(endDate).startOf('isoWeek').toDate();\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 (filter.rolling_interval === 'Month') {\n\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\tendDate = moment().endOf('day').toDate();\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 (filter.rolling_interval === 'Last Month') {\n\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\tstartDate = moment(endDate).startOf('month').toDate();\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 (filter.rolling_interval === 'Last 30 Days') {\n\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\tstartDate = moment().subtract(30, 'days').startOf('day').toDate();\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 (filter.rolling_interval === 'Quarter') {\n\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\tendDate = moment().endOf('day').toDate();\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 (filter.rolling_interval === 'Last Quarter') {\n\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\tstartDate = moment(endDate).startOf('quarter').toDate();\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 (filter.rolling_interval === 'Year') {\n\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\tendDate = moment().endOf('day').toDate();\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 (filter.rolling_interval === 'Last Year') {\n\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\tstartDate = moment(endDate).startOf('year').toDate();\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 (filter.rolling_interval === 'All') {\n\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\tendDate = moment().endOf('day').toDate();\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\tendDate.setHours(23);\n\t\t\t\t\t\t\t\t\t\t\tendDate.setMinutes(59);\n\t\t\t\t\t\t\t\t\t\t\tendDate.setSeconds(59);\n\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\tors.push({$and: [{[filter.field]: {'$gte': startDate}}, {[filter.field]: {'$lte': endDate}}]});\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\tors.push({$and: [{[filter.field]: {'$gte': filter.value}}, {[filter.field]: {'$lte': filter.highValue}}]});\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 (filter.condition === 'nnull') {\n\t\t\t\t\t\t\t\t\t\tlet and = [];\n\t\t\t\t\t\t\t\t\t\tand.push({[filter.field]: {'$exists': true}});\n\t\t\t\t\t\t\t\t\t\tand.push({[filter.field]: {'$ne': null}});\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tif (filter.fieldType === 'String') {\n\t\t\t\t\t\t\t\t\t\t\tand.push({[filter.field]: {'$ne': ''}});\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tors.push({$and: and});\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse if (filter.condition === 'null') {\n\t\t\t\t\t\t\t\t\t\tors.push({[filter.field]: {'$eq': null}});\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\tif (Array.isArray(filter.value)) {\n\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\tlet and = [];\n\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\tand.push({[filter.field]: {['$' + filter.condition]: (Array.isArray(filt) ? filt[0] : filt)}});\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\tif (and.length > 1) {\n\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}\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\tors.push(and[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 {\n\t\t\t\t\t\t\t\t\t\t\t\tlet or = [];\n\t\t\t\t\n\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\tor.push({[filter.field]: {['$' + filter.condition]: (Array.isArray(filt) ? filt[0] : filt)}});\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\n\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\tors.push({$or: or});\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\tors.push(or[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}\n\t\t\t\t\t\t\t\t\t\telse {\n\t\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\t}\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\n\t\t\t\t\t\t\tif (ors.length) {\n\t\t\t\t\t\t\t\tfilters.push({$or: ors});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tthis.callMethodInternal('reportBuilderBuildTree', report.collection_root, (errCollTree, collectionTree) => {\n\t\t\t\t\t\t\tif (collectionTree) {\n\t\t\t\t\t\t\t\tcollectionTree.layers = [collectionTree];\n\t\t\t\t\n\t\t\t\t\t\t\t\tlet treeLeaves = [];\n\t\t\t\t\t\t\t\tlet allLeaves = [];\n\t\t\t\t\t\t\t\tgetTreeLeaves(collectionTree.children, treeLeaves);\n\t\t\t\t\t\t\t\tgetTreeLeaves(collectionTree.children, allLeaves, true);\n\n\t\t\t\t\t\t\t\tlet filterArrayFields = [];\n\t\t\t\t\t\t\t\tlet filterArrays = [];\n\t\t\t\t\t\t\t\treport.fields_filter.forEach(filterAnd => {\n\t\t\t\t\t\t\t\t\tlet ors = [];\n\t\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\t\tlet filterLeaf = allLeaves.find(a => a.fieldPath === filter.field);\n\t\t\t\t\t\t\t\t\t\tif (filterLeaf) {\n\t\t\t\t\t\t\t\t\t\t\tfilterArrayFields.push(filterLeaf);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\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\t\tif (filter.condition === 'bw') {\n\t\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\t\tlet startDate = null;\n\t\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\t\tif (filter.rolling_interval === 'Q1') {\n\t\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\t\tendDate = moment().startOf('year').quarter(2).subtract(1, 'days').toDate();\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 if (filter.rolling_interval === 'Q2') {\n\t\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\t\tendDate = moment().startOf('year').quarter(3).subtract(1, 'days').toDate();\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 if (filter.rolling_interval === 'Q3') {\n\t\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\t\tendDate = moment().startOf('year').quarter(4).subtract(1, 'days').toDate();\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 if (filter.rolling_interval === 'Q4') {\n\t\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\t\tendDate = moment().endOf('year').toDate();\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 if (filter.rolling_interval === 'Today') {\n\t\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\t\tendDate = moment().endOf('day').toDate();\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 if (filter.rolling_interval === 'Yesterday') {\n\t\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\t\tendDate = moment().subtract(1, 'days').endOf('day').toDate();\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 if (filter.rolling_interval === 'Week') {\n\t\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\t\tendDate = moment().endOf('day').toDate();\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 if (filter.rolling_interval === 'Last Week') {\n\t\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\t\tstartDate = moment(endDate).startOf('isoWeek').toDate();\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 if (filter.rolling_interval === 'Month') {\n\t\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\t\tendDate = moment().endOf('day').toDate();\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 if (filter.rolling_interval === 'Last Month') {\n\t\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\t\tstartDate = moment(endDate).startOf('month').toDate();\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 if (filter.rolling_interval === 'Last 30 Days') {\n\t\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\t\tstartDate = moment().subtract(30, 'days').startOf('day').toDate();\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 if (filter.rolling_interval === 'Quarter') {\n\t\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\t\tendDate = moment().endOf('day').toDate();\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 if (filter.rolling_interval === 'Last Quarter') {\n\t\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\t\tstartDate = moment(endDate).startOf('quarter').toDate();\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 if (filter.rolling_interval === 'Year') {\n\t\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\t\tendDate = moment().endOf('day').toDate();\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 if (filter.rolling_interval === 'Last Year') {\n\t\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\t\tstartDate = moment(endDate).startOf('year').toDate();\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 if (filter.rolling_interval === 'All') {\n\t\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\t\tendDate = moment().endOf('day').toDate();\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\tendDate.setHours(23);\n\t\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\t\tendDate.setSeconds(59);\n\t\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\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\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\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\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 (filter.condition === 'nnull') {\n\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\tand.push({[filter.field.replace(/\\.\\$/g, '')]: {'$exists': true}});\n\t\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\t\n\t\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\t\tand.push({[filter.field.replace(/\\.\\$/g, '')]: {'$ne': ''}});\n\t\t\t\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\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 if (filter.condition === 'null') {\n\t\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\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 (Array.isArray(filter.value)) {\n\t\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\t\tlet and = [];\n\t\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\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\t});\n\t\t\t\t\t\t\t\t\n\t\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\t\tors.push({$and: and});\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\telse {\n\t\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\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\tlet or = [];\n\t\t\t\t\t\t\t\t\n\t\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\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\t});\n\t\t\t\t\t\t\t\t\n\t\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\t\tors.push({$or: or});\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\telse {\n\t\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\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\tors.push({[filter.field.replace(/\\.\\$/g, '')]: {['$' + filter.condition]: filter.value}});\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\n\t\t\t\t\t\t\t\t\tif (ors.length) {\n\t\t\t\t\t\t\t\t\t\tfilterArrays.push({$or: ors});\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\tthis.callMethodInternal('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, (err, res) => {\n\t\t\t\t\t\t\t\t\tif (res && res[0]) {\n\t\t\t\t\t\t\t\t\t\tlet results = res[0].results;\n\t\t\t\t\t\t\t\t\t\tlet reportTotals = res[0].totals;\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tif (report.type === 'List') {\n\t\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\t\tif ((field.fieldType === 'Number' || field.leafValueType === 'Count') && field.leafFormatType === 'Number') {\n\t\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\t\tresult[field.id] = result[field.id].toLocaleString();\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 if ((field.fieldType === 'Number' || field.leafValueType === 'Count') && field.leafFormatType === 'String') {\n\t\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\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\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 if ((field.fieldType === 'Number' || field.leafValueType === 'Count') && field.leafFormatType === 'Currency') {\n\t\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\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\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 if (field.fieldType === 'Boolean' && (!field.leafFormatType || field.leafFormatType === 'Boolean')) {\n\t\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\t\tresult[field.id] = result[field.id] === true ? 'True' : '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\telse if (field.fieldType === 'Boolean' && field.leafFormatType === 'String') {\n\t\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\t\tresult[field.id] = result[field.id] === true ? 'Yes' : 'No';\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 if (field.fieldType === 'Boolean' && field.leafFormatType === 'Boolean_Number') {\n\t\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\t\tresult[field.id] = result[field.id] === true ? 1 : 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 if (field.fieldType === 'Date' && (field.leafFormatType === 'Date')) {\n\t\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\t\tresult[field.id] = moment(result[field.id]).format('L');\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 if (field.fieldType === 'Date' && field.leafFormatType === 'Time') {\n\t\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\t\tresult[field.id] = moment(result[field.id]).format('LT');\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 if (field.fieldType === 'Date' && field.leafFormatType === 'DateTime') {\n\t\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\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\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 if (field.fieldType === 'Date' && field.leafFormatType === 'Date_long') {\n\t\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\t\tresult[field.id] = moment(result[field.id]).format('LL');\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 if (field.fieldType === 'Date' && field.leafFormatType === 'DateTime_long') {\n\t\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\t\tresult[field.id] = moment(result[field.id]).format('LLL');\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 if (field.fieldType === 'Date' && field.leafFormatType === 'Timestamp') {\n\t\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\t\tresult[field.id] = moment(result[field.id]).toDate().getTime();\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\tlet lines: any = [];\n\n\t\t\t\t\t\t\t\t\t\t\tlet tmpHeaders = {};\n\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\ttmpHeaders[group.id] = group.columnName;\n\t\t\t\t\t\t\t\t\t\t\t});\n\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\ttmpHeaders[header.columnName] = header.columnName;\n\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\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\t\tresults.forEach(result => {\n\t\t\t\t\t\t\t\t\t\t\t\tlet tmp = {};\n\t\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\t\tif (Array.isArray(result._id[group.id])) {\n\t\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\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\tif (group.treeItem.fieldType === 'Number') {\n\t\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\t}\n\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\ttmp[group.columnName] = result._id[group.id] || '';\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\treport.fields_selected.filter(a => a.show).forEach(header => {\n\t\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\t\ttmp[header.columnName] = result[header.id].join(',');\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\tif (header.fieldType === 'Number' || header.leafValueType === 'Count') {\n\t\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\t}\n\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\ttmp[header.columnName] = result[header.id] || '';\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\n\t\t\t\t\t\t\t\t\t\t\t\tlines.push(tmp);\n\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\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\t\tXLSX.utils.book_append_sheet(wb, ws, 'RB Data');\n\t\t\t\t\t\t\t\t\t\n\t\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\t\tdata['emails'].forEach(email => {\n\t\t\t\t\t\t\t\t\t\t\t\tthis.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\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: wbout,\n\t\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\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\telse if (report.type === 'Group') {\n\t\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\t\tresults.forEach(result => {\n\t\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\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\tlet wb = new Excel.Workbook();\n\t\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\t\twb.properties.date1904 = false;\n\t\t\t\t\t\t\t\t\t\t\twb.calcProperties.fullCalcOnLoad = true;\n\n\t\t\t\t\t\t\t\t\t\t\tlet currentRow = 1;\n\t\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\t\trow.getCell(2).font = {\n\t\t\t\t\t\t\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\t\t\t\t\t\t\tbold: true,\n\t\t\t\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\t\trow.getCell(4).font = {\n\t\t\t\t\t\t\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t\t\t\t};\n\t\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\t\trow.getCell(4).value = report.report_name;\n\n\t\t\t\t\t\t\t\t\t\t\tcurrentRow += 1;\n\t\t\t\t\t\t\t\t\t\t\trow = ws.getRow(currentRow);\n\n\t\t\t\t\t\t\t\t\t\t\trow.getCell(2).font = {\n\t\t\t\t\t\t\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\t\t\t\t\t\t\tbold: true,\n\t\t\t\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\t\trow.getCell(4).font = {\n\t\t\t\t\t\t\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t\t\t\t};\n\t\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\t\trow.getCell(4).value = moment().format('LLL');\n\n\t\t\t\t\t\t\t\t\t\t\tcurrentRow += 2;\n\n\t\t\t\t\t\t\t\t\t\t\tlet copy = deepCopy(results);\n\t\t\t\t\t\t\t\t\t\t\tlet widths = [];\n\t\t\t\t\t\t\t\t\t\t\tcopy.forEach(res => {\n\t\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\t\ttabGroupExcelWidthRecursive(report, 1, res, widths);\n\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\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\t\tws.columns[i].width = widths[i - 1];\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\tlet now = new Date();\n\n\t\t\t\t\t\t\t\t\t\t\twb.xlsx.writeBuffer().then(buffer => {\n\t\t\t\t\t\t\t\t\t\t\t\tdata['emails'].forEach(email => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthis.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\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}).catch(err => console.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\telse if (report.type === 'Dated') {\n\t\t\t\t\t\t\t\t\t\t\tlet datedUniqueDates = [];\n\t\t\t\t\t\t\t\t\t\t\tlet datedUniqueGroups = [];\n\t\t\t\t\t\t\t\t\t\t\tlet datedData = [];\n\t\t\t\t\t\t\t\t\t\t\tlet reportTotalGroups = [];\n\t\t\t\t\t\t\t\t\t\t\tlet reportTotalDates = [];\n\t\t\t\t\t\t\t\t\t\t\n\t\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\t\tif (report.date_interval === 'Quarterly') {\n\t\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\t\tif (dataPt._id.month < 4) {\n\t\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\t}\n\t\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\t\tdataPt._id.quarter = 2;\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 if (dataPt._id.month < 10) {\n\t\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\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\tdataPt._id.quarter = 4;\n\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\tdelete dataPt._id.month;\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\t// Deduplicate quarterly data\n\t\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\t\tlet dataPt = results[i];\n\t\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\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\t\tObject.keys(tmpData)\n\t\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\t.forEach(key => {\n\t\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\t});\n\t\t\t\t\t\t\t\t\t\t\n\t\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\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\t// Step 2: Prepare unique groups\n\t\t\t\t\t\t\t\t\t\t\tlet tmpResults = deepCopy(results);\n\t\t\t\t\t\t\t\t\t\t\ttmpResults.forEach(result => {\n\t\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\t\tdelete result._id.week;\n\t\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\t\tdelete result._id.quarter;\n\t\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\t\tlet tmpGroup = {};\n\t\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\t\ttmpGroup[key] = 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\t\tif (!datedUniqueGroups.find(a => JSON.stringify(a) === JSON.stringify(tmpGroup))) {\n\t\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\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// Step 3: Prepare unique dates\n\t\t\t\t\t\t\t\t\t\t\ttmpResults = deepCopy(results);\n\t\t\t\t\t\t\t\t\t\t\ttmpResults.forEach(result => {\n\t\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\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\t.forEach(key => {\n\t\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\t});\n\n\t\t\t\t\t\t\t\t\t\t\t\tlet tmpDate = {};\n\t\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\t\ttmpDate[key] = 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\t\tif (!datedUniqueDates.find(a => JSON.stringify(a) === JSON.stringify(tmpDate))) {\n\t\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\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// Build the date strings\n\t\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\t\tdatedUniqueDates.forEach(result => {\n\t\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\t\tresult.dateString = 'No Date';\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 (report.date_interval === 'Seconds') {\n\t\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\t\tyear: result.year,\n\t\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\t\tday: result.day,\n\t\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\t\tminute: result.minute,\n\t\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\t}, (process.env.TZ_CLIENT || 'America/Chicago')).toDate();\n\t\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\t}\n\t\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\t\tresult.date = moment.tz({\n\t\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\t\tmonth: result.month - 1,\n\t\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\t\thour: result.hour,\n\t\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\t}, (process.env.TZ_CLIENT || 'America/Chicago')).toDate();\n\t\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\t}\n\t\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\t\tresult.date = moment.tz({\n\t\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\t\tmonth: result.month - 1,\n\t\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\t\thour: result.hour\n\t\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\t\tresult.dateString = moment(result.date).format('MMM DD YYYY HH');\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 if (report.date_interval === 'Daily') {\n\t\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\t\tyear: result.year,\n\t\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\t\tday: result.day\n\t\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\t\tresult.dateString = moment(result.date).format('MMM DD YYYY');\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 if (report.date_interval === 'Weekly') {\n\t\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\t\tyear: result.year,\n\t\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\t}, (process.env.TZ_CLIENT || 'America/Chicago')).day('Monday').toDate();\n\t\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\t\tyear: result.year,\n\t\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\t}, (process.env.TZ_CLIENT || 'America/Chicago')).day('Sunday').toDate();\n\t\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\t}\n\t\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\t\tresult.date = moment.tz({\n\t\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\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\t}, (process.env.TZ_CLIENT || 'America/Chicago')).toDate();\n\t\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\t}\n\t\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\t\tresult.date = moment.tz({\n\t\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\t}, (process.env.TZ_CLIENT || 'America/Chicago')).quarter(result.quarter).toDate();;\n\t\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\t}\n\t\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\t\tresult.date = moment.tz({\n\t\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\t}, (process.env.TZ_CLIENT || 'America/Chicago')).toDate();\n\t\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\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\t\tdatedUniqueDates = datedUniqueDates.filter(a => !a.date)\n\t\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\t\n\t\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\t\tdatedUniqueDates.forEach(date => {\n\t\t\t\t\t\t\t\t\t\t\t\tlet tmpData = [];\n\t\t\t\t\t\t\t\t\t\t\t\tlet tmpTotalDated = {};\n\t\t\t\t\t\t\t\t\t\t\t\tlet tmpTotalCnt = {};\n\t\t\t\t\t\t\t\t\t\t\t\tlet tmpTotalType = {};\n\n\t\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\t\tlet result = results.find(a => {\n\t\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\t// Match the group fields\n\t\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\t\tif (a._id[key] !== group[key]) {\n\t\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\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\n\t\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\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\t\tif (a._id[key] !== date[key]) {\n\t\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\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\n\t\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\t});\n\t\t\t\t\t\t\t\t\t\t\n\t\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\t\ttmpData.push(result);\n\t\t\t\t\t\t\t\t\t\t\n\t\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\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\t\tif (!tmpTotalDated[key]) {\n\t\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\t}\n\t\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\t\ttmpTotalDated[key] += result._id[key];\n\t\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\t\tif (!tmpTotalCnt[key]) {\n\t\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\t}\n\t\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\t\ttmpTotalCnt[key] += 1;\n\t\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\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\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\n\t\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\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\t\tif (!tmpTotalDated[key]) {\n\t\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\t}\n\t\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\t\ttmpTotalDated[key] += result[key];\n\t\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\t\tif (!tmpTotalCnt[key]) {\n\t\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\t}\n\t\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\t\ttmpTotalCnt[key] += 1;\n\t\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\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\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}\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\ttmpData.push(null);\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\n\t\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\t\tObject.keys(tmpTotalType).forEach(totalKey => {\n\t\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\t\ttmpTotalDated[totalKey] = tmpTotalDated[totalKey] / tmpTotalCnt[totalKey];\n\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\ttmpTotalDated[totalKey] = round(tmpTotalDated[totalKey], 2);\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\treportTotalDates.push(tmpTotalDated);\n\t\t\t\t\t\t\t\t\t\t\t\tdatedData.push(tmpData);\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\t\t// Calculate group-level totals\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 tmpTotalGroup = {};\n\t\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\t\tlet match = (!Object.keys(group).length || group._id === null) ? false : true;\n\t\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\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\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\t\n\t\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\t\ttotal.fields.forEach(field => {\n\t\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\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\t.map(a => a[field])\n\t\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\t\n\t\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\t\ttmpTotalGroup[field] = round(tmpTotalGroup[field] / filteredData.length, 2);\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}\n\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\ttmpTotalGroup[field] = 0;\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\n\t\t\t\t\t\t\t\t\t\t\t\treportTotalGroups.push(tmpTotalGroup);\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\t\t// Step 5: Proceed with Excel generation using datedData and reportTotalGroups\n\t\t\t\t\t\t\t\t\t\t\tlet wb = new Excel.Workbook();\n\t\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\t\twb.properties.date1904 = false;\n\t\t\t\t\t\t\t\t\t\t\twb.calcProperties.fullCalcOnLoad = true;\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tlet currentRow = 1;\n\t\t\t\t\t\t\t\t\t\t\tlet currentCol = 1;\n\t\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\t\trow.getCell(2).font = {\n\t\t\t\t\t\t\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\t\t\t\t\t\t\tbold: true,\n\t\t\t\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\t\trow.getCell(4).font = {\n\t\t\t\t\t\t\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t\t\t\t};\n\t\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\t\trow.getCell(4).value = report.report_name;\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tcurrentRow += 1;\n\t\t\t\t\t\t\t\t\t\t\trow = ws.getRow(currentRow);\n\t\t\n\t\t\t\t\t\t\t\t\t\t\trow.getCell(2).font = {\n\t\t\t\t\t\t\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\t\t\t\t\t\t\tbold: true,\n\t\t\t\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\t\trow.getCell(4).font = {\n\t\t\t\t\t\t\t\t\t\t\t\tname: 'Arial',\n\t\t\t\t\t\t\t\t\t\t\t\tsize: 14\n\t\t\t\t\t\t\t\t\t\t\t};\n\t\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\t\trow.getCell(4).value = moment().format('LLL');\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tcurrentRow += 2;\n\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\n\t\t\t\t\t\t\t\t\t\t\t// Add group column headers\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\trow.getCell(currentCol).value = group.columnName;\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\t\t// Add field headers\n\t\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\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\t\t// Add the date interval headers\n\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\tdatedUniqueDates.forEach(date => {\n\t\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\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\t\t});\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t// Add totals headers\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\trow.getCell(currentCol).value = 'Totals - ' + toTitleCase(total.type);\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\t\tcurrentCol = 1;\n\t\t\t\t\t\t\t\t\t\t\tcurrentRow += 1;\n\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\n\t\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\t\tfor (let i = 0; i < datedUniqueGroups.length; i++) {\n\t\t\t\t\t\t\t\t\t\t\t\tlet group = datedUniqueGroups[i];\n\t\t\t\t\t\t\t\t\t\t\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\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\trow = ws.getRow(currentRow);\n\t\t\t\t\t\t\t\t\t\t\n\t\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\t\treport.groups_row.forEach(groupRow => {\n\t\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\t\tcurrentCol++;\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\n\t\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\t\trow.getCell(currentCol).value = field.columnName;\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\n\t\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\t\tfor (let k = 0; k < datedUniqueDates.length; k++) {\n\t\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\t\tif (result[i]) {\n\t\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\t}\n\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\trow.getCell(currentCol).value = '';\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\tcurrentCol++;\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\n\t\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\t\tfor (let k = 0; k < report.fields_total.length; k++) {\n\t\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\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\t\tcurrentCol++;\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\n\t\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\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\t\t// Add report totals at the bottom\n\t\t\t\t\t\t\t\t\t\t\tif (reportTotals) {\n\t\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\t\tlet total = report.fields_total[i];\n\t\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\t\tcurrentCol = 1;\n\t\t\t\t\t\t\t\t\t\t\n\t\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\t\tcurrentCol += report.groups_row.length; // Skip group columns\n\t\t\t\t\t\t\t\t\t\t\n\t\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\t\treport.fields_selected.filter(a => a.show).forEach(() => {\n\t\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\t});\n\n\t\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\t\tcurrentCol++;\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\n\t\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\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\t\tlet field = report.fields_selected.filter(a => a.show)[j];\n\t\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\t\tcurrentCol++;\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\n\t\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\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\t\t// Save the Excel file and send it via email\n\t\t\t\t\t\t\t\t\t\t\twb.xlsx.writeBuffer().then(buffer => {\n\t\t\t\t\t\t\t\t\t\t\t\tdata['emails'].forEach(email => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthis.sendEmail(\n\t\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\t\tthis.serverConfig['CLIENT_NAME'] + ' Scheduled Report - ' + report.report_name,\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`\n\t\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\t<b>Report Name: </b>${report.report_name}<br>\n\t\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\t\tAttached are the results of this automated report.<br><br>\n\t\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\t[\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\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\t\tcontent: buffer\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],\n\t\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\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}).catch(err => console.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\t\tresolve(true);\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 {\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tthis.callMethodInternal('insertErrorLog', 'Report Builder Cron Job - Report Builder Get Results', [\n\t\t\t\t\t\t\t\t\t\t\terr\n\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\treject(err);\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\t\t\t\t\t}\n\t\t\t\t});\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}"]}
|