@etainabl/nodejs-sdk 1.3.17 → 1.3.19

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/dist/esm/index.js CHANGED
@@ -624,7 +624,7 @@ var automationServices = [
624
624
  category: "company"
625
625
  },
626
626
  {
627
- friendly: "ETN Multi Column",
627
+ friendly: "ETN Single Column",
628
628
  key: "etnsinglecolumn",
629
629
  category: "company"
630
630
  },
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/api.ts","../../src/logger.ts","../../src/db.ts","../../src/slack.ts","../../src/units.ts","../../src/consumption.ts","../../src/monitoring.ts","../../src/reporting.ts","../../src/utils/index.ts","../../src/utils/automation.ts","../../src/types/index.ts"],"sourcesContent":["import axios from 'axios';\nimport type { AxiosRequestConfig, AxiosInstance, CreateAxiosDefaults, AxiosResponse } from 'axios';\nimport https from 'https';\n\nimport logger from './logger.js';\n\nimport type {\n Account,\n Asset,\n Automation,\n Entity,\n Company,\n DataIngest,\n Invoice,\n InvoiceCapture,\n Log,\n Reading,\n Report,\n Supplier\n} from './types/index.js';\n\nconst log = logger('etainablApi');\n\nexport interface ETNPagedResponse<T = any> {\n data: T[];\n total: number;\n limit: number;\n skip: number;\n}\n\nexport interface ETNReq {\n method: string;\n url: string;\n}\n\nfunction _handleResponse(req: ETNReq, res: AxiosResponse, isPaged = false) {\n if (!res) {\n throw new Error(`No response from API (${req.method} ${req.url})`);\n }\n\n if (res.status !== 200) {\n throw new Error(`${res.status} ${res.statusText} response from API (${req.method} ${req.url})`);\n }\n\n if (!res.data) {\n throw new Error(`No data from API (${req.method} ${req.url})`);\n }\n\n if (isPaged && !res.data.data) {\n throw new Error(`No data from API (${req.method} ${req.url})`);\n }\n\n return res;\n}\n\nconst factory = {\n getWithId:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) =>\n async (id: string, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'GET',\n url: `${endpoint}/${id}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n log.info(`API Request: ${req.method} ${process.env.ETAsINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n\n try {\n res = await etainablApi.get(req.url, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n console.log(`API Response: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n _handleResponse(req, res);\n\n return res.data;\n },\n get:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) =>\n async (options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'GET',\n url: `${endpoint}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n\n try {\n res = await etainablApi.get(req.url, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n console.log(`API Response: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n _handleResponse(req, res);\n\n return res.data;\n },\n list:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) =>\n async (options: AxiosRequestConfig = {}): Promise<ETNPagedResponse<T>> => {\n const req = {\n method: 'GET',\n url: `${endpoint}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n\n try {\n res = await etainablApi.get(req.url, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n console.log(`API Response: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n _handleResponse(req, res, true);\n\n return res.data;\n },\n update:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) =>\n async (id: string, data: any, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'PATCH',\n url: `${endpoint}/${id}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n\n try {\n res = await etainablApi.patch(req.url, data, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n _handleResponse(req, res);\n\n return res.data;\n },\n create:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) =>\n async (data: any, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'POST',\n url: `${endpoint}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n\n try {\n res = await etainablApi.post(req.url, data, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n _handleResponse(req, res);\n\n return res.data;\n },\n remove:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) =>\n async (id: string, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'DELETE',\n url: `${endpoint}/${id}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n let res: AxiosResponse;\n\n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n try {\n res = await etainablApi.delete(req.url, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n _handleResponse(req, res);\n\n return res.data;\n },\n customWithId:\n <T = any>(etainablApi: AxiosInstance, method: string, endpoint: string, postEndpoint?: string) =>\n async (id: string, data: any, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: method,\n url: `${endpoint}/${id}${postEndpoint ? `/${postEndpoint}` : ''}`,\n data,\n ...options\n };\n\n log.info(`API Request (Custom): ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n\n try {\n res = await etainablApi.request(req);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n _handleResponse(req, res);\n\n return res.data;\n }\n};\n\n// ETN Sub Endpoints\n// e.g. /assets/:id/documents/:documentId\nconst subFactory = {\n // e.g. POST /assets/:id/documents\n create:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, subEndpoint: string) =>\n async (id: string, data: any, options: AxiosRequestConfig = {}) => {\n const subUrl = `${id}/${subEndpoint}`;\n return factory.create<T>(etainablApi, endpoint, subUrl)(data, options);\n },\n // e.g. PATCH /assets/:id/documents/:documentId\n update:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, subEndpoint: string) =>\n async (id: string, subId: string, data: any, options: AxiosRequestConfig = {}) => {\n const subUrl = `${subEndpoint}/${subId}`;\n\n return factory.update<T>(etainablApi, endpoint, subUrl)(id, data, options);\n },\n // e.g. DELETE /assets/:id/documents/:documentId\n remove:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, subEndpoint: string) =>\n async (id: string, subId: string, options: AxiosRequestConfig = {}) => {\n const subUrl = `${subEndpoint}/${subId}`;\n\n return factory.remove<T>(etainablApi, endpoint, subUrl)(id, options);\n }\n};\n\ninterface AuthOptions {\n key?: string;\n token?: string;\n}\n\nexport default (auth: AuthOptions, instanceOptions: CreateAxiosDefaults = {}) => {\n try {\n const headers: any = {};\n\n if (auth.key) {\n headers['x-key'] = auth.key;\n } else if (auth.token) {\n headers['Authorization'] = auth.token;\n } else {\n headers['x-key'] = process.env.ETAINABL_API_KEY;\n }\n\n const etainablApi = axios.create({\n baseURL: process.env.ETAINABL_API_URL,\n timeout: 300000,\n httpsAgent: new https.Agent({ keepAlive: true }),\n headers,\n ...instanceOptions\n });\n\n return {\n instance: etainablApi,\n\n // accounts\n getAccount: factory.getWithId<Account<string>>(etainablApi, 'accounts'),\n listAccounts: factory.list<Account<string>>(etainablApi, 'accounts'),\n updateAccount: factory.update<Account<string>>(etainablApi, 'accounts'),\n createAccount: factory.create<Account<string>>(etainablApi, 'accounts'),\n removeAccount: factory.remove<Account<string>>(etainablApi, 'accounts'),\n getAccountSchema: factory.get(etainablApi, 'accounts', 'schema'),\n invalidateAccountCache: factory.customWithId(etainablApi, 'put', 'accounts', 'invalidate-cache'),\n\n // assets\n getAsset: factory.getWithId<Asset<string>>(etainablApi, 'assets'),\n listAssets: factory.list<Asset<string>>(etainablApi, 'assets'),\n updateAsset: factory.update<Asset<string>>(etainablApi, 'assets'),\n createAsset: factory.create<Asset<string>>(etainablApi, 'assets'),\n removeAsset: factory.remove<Asset<string>>(etainablApi, 'assets'),\n getAssetSchema: factory.get(etainablApi, 'assets', 'schema'),\n\n // assetGroups\n getAssetGroup: factory.getWithId(etainablApi, 'asset-groups'),\n listAssetGroups: factory.list(etainablApi, 'asset-groups'),\n updateAssetGroup: factory.update(etainablApi, 'asset-groups'),\n createAssetGroup: factory.create(etainablApi, 'asset-groups'),\n removeAssetGroup: factory.remove(etainablApi, 'asset-groups'),\n getAssetGroupAssets: factory.getWithId(etainablApi, 'asset-groups', 'assets'),\n getAssetGroupSchema: factory.get(etainablApi, 'asset-groups', 'schema'),\n\n // automation\n getAutomation: factory.getWithId<Automation<string>>(etainablApi, 'automation'),\n listAutomations: factory.list<Automation<string>>(etainablApi, 'automation'),\n updateAutomation: factory.update<Automation<string>>(etainablApi, 'automation'),\n createAutomation: factory.create<Automation<string>>(etainablApi, 'automation'),\n removeAutomation: factory.remove<Automation<string>>(etainablApi, 'automation'),\n createAutomationLog: subFactory.create(etainablApi, 'automation', 'logs'),\n updateAutomationLog: subFactory.update(etainablApi, 'automation', 'logs'),\n removeAutomationLog: subFactory.remove(etainablApi, 'automation', 'logs'),\n\n // company\n getCompany: factory.getWithId<Company<string>>(etainablApi, 'companies'),\n\n // consumption\n getConsumption: factory.getWithId(etainablApi, 'consumptions'),\n listConsumptions: factory.list(etainablApi, 'consumptions'),\n updateConsumption: factory.update(etainablApi, 'consumptions'),\n createConsumption: factory.create(etainablApi, 'consumptions'),\n removeConsumption: factory.remove(etainablApi, 'consumptions'),\n getConsumptionSchema: factory.get(etainablApi, 'consumptions', 'schema'),\n\n // emails\n getEmail: factory.getWithId(etainablApi, 'emails'),\n listEmails: factory.list(etainablApi, 'emails'),\n updateEmail: factory.update(etainablApi, 'emails'),\n createEmail: factory.create(etainablApi, 'emails'),\n removeEmail: factory.remove(etainablApi, 'emails'),\n\n // emission factors\n getEmissionFactor: factory.getWithId(etainablApi, 'emission-factors'),\n listEmissionFactors: factory.list(etainablApi, 'emission-factors'),\n updateEmissionFactor: factory.update(etainablApi, 'emission-factors'),\n createEmissionFactor: factory.create(etainablApi, 'emission-factors'),\n removeEmissionFactor: factory.remove(etainablApi, 'emission-factors'),\n\n // entity\n getEntity: factory.getWithId<Entity<string>>(etainablApi, 'entities'),\n listEntities: factory.list<Entity<string>>(etainablApi, 'entities'),\n updateEntity: factory.update<Entity<string>>(etainablApi, 'entities'),\n createEntity: factory.create<Entity<string>>(etainablApi, 'entities'),\n removeEntity: factory.remove<Entity<string>>(etainablApi, 'entities'),\n getEntitiesSchema: factory.get(etainablApi, 'entities', 'schema'),\n\n // logs\n getLog: factory.getWithId<Log<string>>(etainablApi, 'logs'),\n listLogs: factory.list<Log<string>>(etainablApi, 'logs'),\n updateLog: factory.update<Log<string>>(etainablApi, 'logs'),\n createLog: factory.create<Log<string>>(etainablApi, 'logs'),\n removeLog: factory.remove<Log<string>>(etainablApi, 'logs'),\n\n // readings\n getReading: factory.getWithId<Reading<string>>(etainablApi, 'readings'),\n listReadings: factory.list<Reading<string>>(etainablApi, 'readings'),\n updateReading: factory.update<Reading<string>>(etainablApi, 'readings'),\n createReading: factory.create<Reading<string>>(etainablApi, 'readings'),\n removeReading: factory.remove<Reading<string>>(etainablApi, 'readings'),\n getReadingSchema: factory.get(etainablApi, 'readings', 'schema'),\n\n // reports\n getReport: factory.getWithId<Report<string>>(etainablApi, 'reports'),\n listReports: factory.list<Report<string>>(etainablApi, 'reports'),\n updateReport: factory.update<Report<string>>(etainablApi, 'reports'),\n createReport: factory.create<Report<string>>(etainablApi, 'reports'),\n removeReport: factory.remove<Report<string>>(etainablApi, 'reports'),\n sendReport: factory.customWithId(etainablApi, 'post', 'reports', 'send'),\n\n // report templates\n getReportTemplate: factory.getWithId(etainablApi, 'report-templates'),\n listReportTemplates: factory.list(etainablApi, 'report-templates'),\n updateReportTemplate: factory.update(etainablApi, 'report-templates'),\n createReportTemplate: factory.create(etainablApi, 'report-templates'),\n removeReportTemplate: factory.remove(etainablApi, 'report-templates'),\n\n // scheduled reports\n getScheduledReport: factory.getWithId(etainablApi, 'scheduled-reports'),\n listScheduledReports: factory.list(etainablApi, 'scheduled-reports'),\n updateScheduledReport: factory.update(etainablApi, 'scheduled-reports'),\n createScheduledReport: factory.create(etainablApi, 'scheduled-reports'),\n removeScheduledReport: factory.remove(etainablApi, 'scheduled-reports'),\n sendScheduledReport: factory.customWithId(etainablApi, 'post', 'scheduled-reports', 'send'),\n\n // invoices\n getInvoice: factory.getWithId<Invoice<string>>(etainablApi, 'invoices'),\n listInvoices: factory.list<Invoice<string>>(etainablApi, 'invoices'),\n updateInvoice: factory.update<Invoice<string>>(etainablApi, 'invoices'),\n createInvoice: factory.create<Invoice<string>>(etainablApi, 'invoices'),\n removeInvoice: factory.remove<Invoice<string>>(etainablApi, 'invoices'),\n getInvoiceSchema: factory.get(etainablApi, 'invoices', 'schema'),\n\n // invoice capture\n getInvoiceCapture: factory.getWithId<InvoiceCapture<string>>(etainablApi, 'invoice-capture'),\n listInvoicesCapture: factory.list<InvoiceCapture<string>>(etainablApi, 'invoice-capture'),\n updateInvoiceCapture: factory.update<InvoiceCapture<string>>(etainablApi, 'invoice-capture'),\n createInvoiceCapture: factory.create<InvoiceCapture<string>>(etainablApi, 'invoice-capture'),\n removeInvoiceCapture: factory.remove<InvoiceCapture<string>>(etainablApi, 'invoice-capture'),\n getInvoiceCaptureSchema: factory.get(etainablApi, 'invoice-capture', 'schema'),\n\n //suppliers\n listSuppliers: factory.list<Supplier<string>>(etainablApi, 'suppliers'),\n getSupplierSchema: factory.get(etainablApi, 'suppliers', 'schema'),\n\n // import templates\n getImportTemplate: factory.getWithId(etainablApi, 'import-templates'),\n\n //data imports\n listDataIngest: factory.list<DataIngest<string>>(etainablApi, 'data-ingests'),\n updateDataIngest: factory.update<DataIngest<string>>(etainablApi, 'data-ingests'),\n createDataIngest: factory.create<DataIngest<string>>(etainablApi, 'data-ingests')\n };\n } catch (e) {\n log.error(e);\n throw e;\n }\n};\n","import winston from 'winston';\n\nexport default (namespace: string) => winston.createLogger({\n level: 'debug',\n format: winston.format.combine(\n winston.format.timestamp(),\n winston.format.json()\n ),\n defaultMeta: { service: process.env.AWS_LAMBDA_FUNCTION_NAME, script: namespace },\n transports: [\n new winston.transports.Console()\n ]\n});\n","import { MongoClient, Db } from 'mongodb';\nimport logger from './logger.js';\n\nconst log = logger('dbHelpers');\n\nlet cachedDb: Db;\n\nasync function connectToDatabase(retryAttempt: number = 1): Promise<Db> {\n if (!process.env.ETAINABL_DB_URL) throw new Error(\"ETAINABL_DB_URL is not set\");\n if (!process.env.AWS_ACCESS_KEY_ID) throw new Error(\"AWS_ACCESS_KEY_ID is not set\");\n if (!process.env.AWS_SECRET_ACCESS_KEY) throw new Error(\"AWS_SECRET_ACCESS_KEY is not set\");\n\n if (cachedDb) {\n log.debug('Using cached MongoDB connection.');\n return Promise.resolve(cachedDb);\n }\n \n const uri = `mongodb+srv://${process.env.ETAINABL_DB_URL}`;\n \n try {\n if (process.env.DB_BASIC_AUTH === 'true') {\n log.debug('Connecting to MongoDB server... (Auth: Basic)');\n\n const client = new MongoClient(uri);\n await client.connect();\n\n log.debug('Connected successfully to MongoDB server! (Auth: Basic)');\n\n cachedDb = client.db('etainabl');\n\n return cachedDb;\n }\n\n log.debug('Connecting to MongoDB server... (Auth: AWS)');\n\n const client = new MongoClient(uri, {\n auth: {\n username: process.env.AWS_ACCESS_KEY_ID,\n password: process.env.AWS_SECRET_ACCESS_KEY\n },\n authSource: '$external',\n authMechanism: 'MONGODB-AWS'\n });\n\n await client.connect();\n\n log.debug('Connected successfully to MongoDB server! (Auth: AWS)');\n\n cachedDb = client.db('etainabl');\n\n return cachedDb;\n\n } catch (e: any) {\n // Retry\n if (retryAttempt > 5) {\n console.log(`Error connecting to MongoDB server after 5 attempts...`);\n throw e;\n }\n\n console.log(`MongoDB Connection error: ${e.message}`);\n\n console.log(`Error connecting to MongoDB server... Retrying in 3 seconds... (Attempt ${retryAttempt})`);\n return connectToDatabase(retryAttempt + 1);\n }\n}\n\nexport default {\n connectToDatabase\n};","import axios from 'axios';\n\nconst postMessage = async (message: string) => {\n const url = 'https://hooks.slack.com/services/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';\n const data = {\n text: `[${(process.env.ENV || '').toUpperCase()}][${process.env.AWS_LAMBDA_FUNCTION_NAME}] ${message}`\n };\n const headers = {\n 'Content-Type': 'application/json'\n };\n return axios.post(url, data, { headers });\n};\n\nexport default {\n postMessage\n}","interface Item {\n units?: string | null;\n unit?: string | null;\n factor?: number | null;\n value: number;\n [key: string]: any; \n}\n\nexport type AccountType = 'electricity' | 'gas' | 'water' | 'waste' | 'solar' | 'heating' | 'flow' | 'cooling' | 'temperature' | 'oil' | 'other';\nexport type ETNUnit = 'kwh' | 'kg' | 'm3' | 'lbs' | 'tonnes' | 'wh' | 'mwh' | 'ft3' | 'hcf' | 'm3/h' | 'qty' | 'l' | 'C' | 'mcuf' | 'hcuf' | 'tcuf' | 'ocuf' | 'hm3' | 'tm3' | 'nm3';\nexport type BaseUnit = 'kwh' | 'm3' | 'C' | 'kg' | 'm3/h' | 'l';\nexport const accountTypeMap: { [key: string]: BaseUnit } = {\n electricity: 'kwh',\n gas: 'kwh',\n water: 'm3',\n waste: 'kg',\n solar: 'kwh',\n heating: 'kwh',\n flow: 'm3/h',\n cooling: 'kwh',\n temperature: 'C',\n oil: 'l'\n};\n\nconst unitConversionFactors: { [key: string]: any } = {\n kwh: {\n kwh: 1,\n mwh: 1000,\n wh: 0.001,\n m3: (39 * 1.02264) / 3.6,\n ft3: (0.0283 * 39 * 1.02264) / 3.6,\n hcf: (2.83 * 39 * 1.02264) / 3.6\n },\n m3: {\n m3: 1,\n l: 0.001\n },\n C: {\n C: 1\n },\n kg: {\n kg: 1,\n lbs: 0.45359237,\n tonnes: 1000\n },\n 'm3/h': {\n 'm3/h': 1\n }\n};\n\nexport const accountTypeUnitMap: { [key: string]: ETNUnit[] } = {\n electricity: ['kwh', 'mwh', 'wh'],\n gas: ['kwh', 'm3', 'ft3', 'hcf'],\n water: ['m3', 'l'],\n waste: ['kg', 'lbs', 'tonnes'],\n solar: ['kwh', 'mwh', 'wh'],\n heating: ['kwh', 'mwh', 'wh'],\n flow: ['m3/h'],\n cooling: ['kwh', 'mwh', 'wh'],\n temperature: ['C'],\n oil: ['l']\n};\n\n// Convert units to base format\nexport const convertItems = (items: Item[], type: AccountType, defaultUnits: ETNUnit | undefined, accountFactor: number | undefined): any => {\n if (!type) throw new Error('Account type is required');\n\n const baseUnit = accountTypeMap[type];\n if (!baseUnit) throw new Error(`Account type ${type} is not supported`);\n\n const convertedItems = items.map(item => {\n const factor = item.factor || accountFactor || 1;\n const units = item.units || item.unit || defaultUnits || baseUnit;\n const convertedValue = item.value * _getConversionFactor(units, baseUnit) * factor;\n return { ...item, value: convertedValue, units: baseUnit };\n });\n\n return convertedItems;\n};\n\nconst _getConversionFactor = (fromUnit: string = 'kwh', toUnit: string) => {\n const conversionFactors = unitConversionFactors[toUnit];\n\n if (!conversionFactors) {\n throw new Error(`Conversion factor base unit ${toUnit} is not defined`);\n }\n\n if (!conversionFactors[fromUnit]) {\n throw new Error(`Conversion factor from unit ${fromUnit} is not defined`);\n }\n\n return conversionFactors[fromUnit];\n};\n\nexport const checkAccountTypeVsUnits = (type: string, unit: string, additionalLog: number | '' = '') => {\n if (!type) throw new Error('Account type is required');\n if (!unit) throw new Error('Unit is required');\n\n const parsedType = type.toLowerCase().trim();\n\n const accountTypeUnits = accountTypeUnitMap[parsedType];\n if (!accountTypeUnits) throw new Error(`Account type \"${parsedType}\" is not supported ${additionalLog}`);\n\n const parsedUnit = unit.toLowerCase().trim() as ETNUnit;\n\n if (!accountTypeUnits.includes(parsedUnit)) {\n throw new Error(`Account type \"${parsedType}\" does not support unit \"${parsedUnit}\" ${additionalLog}`);\n }\n\n return { type: parsedType as AccountType, unit: parsedUnit};\n};\n","import moment from 'moment';\n\ninterface ConsumptionData {\n date: Date;\n consumption: number;\n}\n\ninterface DayNightConsumption {\n dayConsumption: number,\n nightConsumption: number,\n consumption: number\n}\n\nexport const dayNightConsumption = (data: ConsumptionData[]) => data.reduce((acc: DayNightConsumption, item: ConsumptionData): DayNightConsumption => {\n const hour = moment.utc(item.date).hour(); // End Time of HH consumption period\n\n if (hour >= 0 && hour < 7) {\n acc.nightConsumption += item.consumption;\n } else {\n acc.dayConsumption += item.consumption;\n }\n\n acc.consumption += item.consumption;\n\n return acc;\n}, {\n dayConsumption: 0,\n nightConsumption: 0,\n consumption: 0\n});\n\nexport const calcMaxConsumptionValue = (data: ConsumptionData[]) => Math.max(...data.map((item: ConsumptionData) => item.consumption));\n\nexport const calcMaxDemand = (data: ConsumptionData[]) => calcMaxConsumptionValue(data) * 2;\n\nexport const calcPeakLoad = (consumption: number, maxDemand: number, startDate: string | moment.Moment, endDate: string | moment.Moment) => {\n const days = Math.ceil(moment(endDate).diff(moment(startDate), 'days', true));\n\n return maxDemand === 0 ? 0 : ((consumption / (maxDemand * 24 * days)) * 100);\n};","import axios from 'axios';\n\nimport logger from './logger.js';\n\nconst log = logger('monitoring');\n\nexport const sendHeartbeat = async () => {\n if (!process.env.HEARTBEAT_URL || process.env.HEARTBEAT_URL.endsWith('/')) return false;\n\n try {\n await axios.post(process.env.HEARTBEAT_URL);\n\n return true;\n } catch (e: any) {\n log.warn(`Failed to send heartbeat: ${e.message || e}`);\n return false;\n }\n}","import moment from 'moment';\n\nmoment.locale('en', {\n week: {\n dow: 1\n }\n});\n\nconst getNextRunTime = (startDate: moment.Moment, schedule: any, taskTime: moment.Moment): moment.Moment => {\n const [num, freq] = schedule.frequency.split('|');\n const targetDate = moment(startDate).add(num, freq as moment.unitOfTime.Base);\n\n if (schedule.frequencyPeriod === 'first') {\n targetDate.startOf(freq as moment.unitOfTime.StartOf);\n } else if (schedule.frequencyPeriod === 'last') {\n targetDate.endOf(freq as moment.unitOfTime.StartOf);\n }\n\n const isWeekday = targetDate.isoWeekday() > 0 && targetDate.isoWeekday() < 6;\n const isSaturday = targetDate.isoWeekday() === 6;\n\n // The weekday or weekend chosen should be within the same month as the target date\n if (schedule.frequencyDay === 'weekdays' && !isWeekday) {\n if ((targetDate.date() / 7) < 2) {\n targetDate.add(isSaturday ? 2 : 1, 'days');\n } else {\n targetDate.subtract(isSaturday ? 1 : 2, 'days');\n }\n } else if (schedule.frequencyDay === 'weekends' && isWeekday) {\n if ((targetDate.date() / 7) < 2) {\n targetDate.isoWeekday(6);\n } else {\n targetDate.isoWeekday(0);\n }\n }\n\n if (taskTime.isAfter(targetDate, 'minute')) {\n return getNextRunTime(targetDate, schedule, taskTime);\n }\n\n return targetDate;\n};\n\nexport const getScheduledReportRunTimes = (schedule: any, limit = 1, taskTime = moment()): moment.Moment[] => {\n if (!schedule.startDate || !schedule.enabled) return [];\n\n const originalStartDate = moment.utc(schedule.startDate);\n\n let startDate = originalStartDate;\n\n const includeStartDate = taskTime.isSameOrBefore(originalStartDate, 'minute');\n\n let runTimes = [] as moment.Moment[];\n\n if (includeStartDate) {\n runTimes = [originalStartDate];\n }\n\n const [, freq] = schedule.frequency.split('|');\n\n if (freq === 'once') {\n const nextRunTime = runTimes[0];\n\n // If this is now beyond the start date, return an empty array\n return taskTime.isAfter(nextRunTime, 'minute') ? [] : runTimes;\n }\n\n\n const scheduleRunTimes = Array.from(Array(includeStartDate ? limit - 1 : limit).keys()).map(() => {\n const nextRunTime = getNextRunTime(startDate, schedule, taskTime);\n\n startDate = nextRunTime.hour(originalStartDate.hour()).minute(originalStartDate.minute());\n\n return nextRunTime;\n });\n\n return [...runTimes, ...scheduleRunTimes];\n};\n","export * from './automation.js';\n","import { AutomationSource, AutomationService, AutomationServiceCategory } from 'types/automation.js';\n\nexport const automationSources: AutomationSource[] = ['ftp', 'email', 's3'];\n\nexport const automationServices: { key: AutomationService, friendly: string, category: AutomationServiceCategory }[] = [\n {\n friendly: 'Account Status',\n key: 'accountStatus',\n category: 'system'\n },\n {\n friendly: 'Autometer',\n key: 'autometer',\n category: 'company'\n },\n {\n friendly: 'BACnet',\n key: 'bacnet',\n category: 'account'\n },\n {\n friendly: 'CarloGavazziVmuc',\n key: 'carlogavazzivmuc',\n category: 'company'\n },\n {\n friendly: 'Carlo Gavazzi UWP',\n key: 'carlogavazziuwp',\n category: 'company'\n },\n {\n friendly: 'CXG Multi Column',\n key: 'cxgmulticolumn',\n category: 'company'\n },\n {\n friendly: 'ETN Multi Column',\n key: 'etnsinglecolumn',\n category: 'company'\n },\n {\n friendly: 'ETN Multi Column',\n key: 'etnmulticolumn',\n category: 'company'\n },\n {\n friendly: 'ETN Multi Time Column',\n key: 'etnmultitimecolumn',\n category: 'company'\n },\n {\n friendly: 'CXG Multi Time Column',\n key: 'cxgmultitimecolumn',\n category: 'company'\n },\n {\n friendly: 'CXG Single Column',\n key: 'cxgsinglecolumn',\n category: 'company'\n },\n {\n friendly: 'Deepki',\n key: 'deepki',\n category: 'company'\n },\n {\n friendly: 'Crown AMR',\n key: 'crownamr',\n category: 'company'\n },\n {\n friendly: 'eLogBooks',\n key: 'elogbooks',\n category: 'account'\n },\n {\n friendly: 'Elveco',\n key: 'elveco',\n category: 'company'\n },\n {\n friendly: 'Gridfetch',\n key: 'gridfetch',\n category: 'account'\n },\n {\n friendly: 'IMServ Data Vision',\n key: 'imserv',\n category: 'company'\n },\n {\n friendly: 'Meter.co.uk',\n key: 'meteruk',\n category: 'account'\n },\n {\n friendly: 'MJ Church',\n key: 'mjchurch',\n category: 'company'\n },\n {\n friendly: 'MSM Solutions',\n key: 'msmsolutions',\n category: 'company'\n },\n {\n friendly: 'Niagara N4',\n key: 'niagaran4',\n category: 'company'\n },\n {\n friendly: 'Octanise',\n key: 'octanise',\n category: 'company'\n },\n {\n friendly: 'Orsis',\n key: 'orsis',\n category: 'company'\n },\n {\n friendly: 'Schneider',\n key: 'schneider',\n category: 'company'\n },\n {\n friendly: 'Schneider EGX',\n key: 'schneideregx',\n category: 'company'\n },\n {\n friendly: 'Schneider Com X',\n key: 'schneidercomx',\n category: 'company'\n },\n {\n friendly: 'Sentinel',\n key: 'sentinel',\n category: 'company'\n },\n {\n friendly: 'Siemens',\n key: 'siemens',\n category: 'company'\n },\n {\n friendly: 'Siemens Tem',\n key: 'siemenstem',\n category: 'company'\n },\n {\n friendly: 'Smart Flow',\n key: 'smartflow',\n category: 'account'\n },\n {\n friendly: 'Smartvatten',\n key: 'smartvatten',\n category: 'account'\n },\n {\n friendly: 'SMS Energy',\n key: 'sms',\n category: 'company'\n },\n {\n friendly: 'SoClean',\n key: 'soclean',\n category: 'company'\n },\n {\n friendly: 'Solarman',\n key: 'solarman',\n category: 'account'\n },\n {\n friendly: 'Solis',\n key: 'solis',\n category: 'account'\n },\n {\n friendly: 'SSE Clarity',\n key: 'sse',\n category: 'company'\n },\n {\n friendly: 'Stark',\n key: 'stark',\n category: 'company'\n },\n {\n friendly: 'Synapsys',\n key: 'synapsys',\n category: 'company'\n }\n];\n","import { ObjectId } from 'mongodb';\n\nexport * from './account.js';\nexport * from './asset.js';\nexport * from './automation.js';\nexport * from './company.js';\nexport * from './scraperRun.js';\nexport * from './dataIngest.js';\nexport * from './entity.js';\nexport * from './email.js';\nexport * from './global.js';\nexport * from './invoice.js';\nexport * from './invoiceCapture.js';\nexport * from './log.js';\nexport * from './reading.js';\nexport * from './report.js';\nexport * from './supplier.js';\nexport { ObjectId };\n\nexport interface ETNPagedResponse<T = any> {\n data: T[];\n total: number;\n limit: number;\n skip: number;\n}\n"],"mappings":"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AAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AACJ;;;ACnMA,SAAS,gBAAgB;","names":["log","client","axios","axios","log","axios","moment"]}
1
+ {"version":3,"sources":["../../src/api.ts","../../src/logger.ts","../../src/db.ts","../../src/slack.ts","../../src/units.ts","../../src/consumption.ts","../../src/monitoring.ts","../../src/reporting.ts","../../src/utils/index.ts","../../src/utils/automation.ts","../../src/types/index.ts"],"sourcesContent":["import axios from 'axios';\nimport type { AxiosRequestConfig, AxiosInstance, CreateAxiosDefaults, AxiosResponse } from 'axios';\nimport https from 'https';\n\nimport logger from './logger.js';\n\nimport type {\n Account,\n Asset,\n Automation,\n Entity,\n Company,\n DataIngest,\n Invoice,\n InvoiceCapture,\n Log,\n Reading,\n Report,\n Supplier\n} from './types/index.js';\n\nconst log = logger('etainablApi');\n\nexport interface ETNPagedResponse<T = any> {\n data: T[];\n total: number;\n limit: number;\n skip: number;\n}\n\nexport interface ETNReq {\n method: string;\n url: string;\n}\n\nfunction _handleResponse(req: ETNReq, res: AxiosResponse, isPaged = false) {\n if (!res) {\n throw new Error(`No response from API (${req.method} ${req.url})`);\n }\n\n if (res.status !== 200) {\n throw new Error(`${res.status} ${res.statusText} response from API (${req.method} ${req.url})`);\n }\n\n if (!res.data) {\n throw new Error(`No data from API (${req.method} ${req.url})`);\n }\n\n if (isPaged && !res.data.data) {\n throw new Error(`No data from API (${req.method} ${req.url})`);\n }\n\n return res;\n}\n\nconst factory = {\n getWithId:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) =>\n async (id: string, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'GET',\n url: `${endpoint}/${id}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n log.info(`API Request: ${req.method} ${process.env.ETAsINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n\n try {\n res = await etainablApi.get(req.url, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n console.log(`API Response: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n _handleResponse(req, res);\n\n return res.data;\n },\n get:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) =>\n async (options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'GET',\n url: `${endpoint}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n\n try {\n res = await etainablApi.get(req.url, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n console.log(`API Response: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n _handleResponse(req, res);\n\n return res.data;\n },\n list:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) =>\n async (options: AxiosRequestConfig = {}): Promise<ETNPagedResponse<T>> => {\n const req = {\n method: 'GET',\n url: `${endpoint}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n\n try {\n res = await etainablApi.get(req.url, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n console.log(`API Response: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n _handleResponse(req, res, true);\n\n return res.data;\n },\n update:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) =>\n async (id: string, data: any, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'PATCH',\n url: `${endpoint}/${id}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n\n try {\n res = await etainablApi.patch(req.url, data, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n _handleResponse(req, res);\n\n return res.data;\n },\n create:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) =>\n async (data: any, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'POST',\n url: `${endpoint}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n\n try {\n res = await etainablApi.post(req.url, data, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n _handleResponse(req, res);\n\n return res.data;\n },\n remove:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) =>\n async (id: string, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'DELETE',\n url: `${endpoint}/${id}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n let res: AxiosResponse;\n\n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n try {\n res = await etainablApi.delete(req.url, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n _handleResponse(req, res);\n\n return res.data;\n },\n customWithId:\n <T = any>(etainablApi: AxiosInstance, method: string, endpoint: string, postEndpoint?: string) =>\n async (id: string, data: any, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: method,\n url: `${endpoint}/${id}${postEndpoint ? `/${postEndpoint}` : ''}`,\n data,\n ...options\n };\n\n log.info(`API Request (Custom): ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n\n try {\n res = await etainablApi.request(req);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n _handleResponse(req, res);\n\n return res.data;\n }\n};\n\n// ETN Sub Endpoints\n// e.g. /assets/:id/documents/:documentId\nconst subFactory = {\n // e.g. POST /assets/:id/documents\n create:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, subEndpoint: string) =>\n async (id: string, data: any, options: AxiosRequestConfig = {}) => {\n const subUrl = `${id}/${subEndpoint}`;\n return factory.create<T>(etainablApi, endpoint, subUrl)(data, options);\n },\n // e.g. PATCH /assets/:id/documents/:documentId\n update:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, subEndpoint: string) =>\n async (id: string, subId: string, data: any, options: AxiosRequestConfig = {}) => {\n const subUrl = `${subEndpoint}/${subId}`;\n\n return factory.update<T>(etainablApi, endpoint, subUrl)(id, data, options);\n },\n // e.g. DELETE /assets/:id/documents/:documentId\n remove:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, subEndpoint: string) =>\n async (id: string, subId: string, options: AxiosRequestConfig = {}) => {\n const subUrl = `${subEndpoint}/${subId}`;\n\n return factory.remove<T>(etainablApi, endpoint, subUrl)(id, options);\n }\n};\n\ninterface AuthOptions {\n key?: string;\n token?: string;\n}\n\nexport default (auth: AuthOptions, instanceOptions: CreateAxiosDefaults = {}) => {\n try {\n const headers: any = {};\n\n if (auth.key) {\n headers['x-key'] = auth.key;\n } else if (auth.token) {\n headers['Authorization'] = auth.token;\n } else {\n headers['x-key'] = process.env.ETAINABL_API_KEY;\n }\n\n const etainablApi = axios.create({\n baseURL: process.env.ETAINABL_API_URL,\n timeout: 300000,\n httpsAgent: new https.Agent({ keepAlive: true }),\n headers,\n ...instanceOptions\n });\n\n return {\n instance: etainablApi,\n\n // accounts\n getAccount: factory.getWithId<Account<string>>(etainablApi, 'accounts'),\n listAccounts: factory.list<Account<string>>(etainablApi, 'accounts'),\n updateAccount: factory.update<Account<string>>(etainablApi, 'accounts'),\n createAccount: factory.create<Account<string>>(etainablApi, 'accounts'),\n removeAccount: factory.remove<Account<string>>(etainablApi, 'accounts'),\n getAccountSchema: factory.get(etainablApi, 'accounts', 'schema'),\n invalidateAccountCache: factory.customWithId(etainablApi, 'put', 'accounts', 'invalidate-cache'),\n\n // assets\n getAsset: factory.getWithId<Asset<string>>(etainablApi, 'assets'),\n listAssets: factory.list<Asset<string>>(etainablApi, 'assets'),\n updateAsset: factory.update<Asset<string>>(etainablApi, 'assets'),\n createAsset: factory.create<Asset<string>>(etainablApi, 'assets'),\n removeAsset: factory.remove<Asset<string>>(etainablApi, 'assets'),\n getAssetSchema: factory.get(etainablApi, 'assets', 'schema'),\n\n // assetGroups\n getAssetGroup: factory.getWithId(etainablApi, 'asset-groups'),\n listAssetGroups: factory.list(etainablApi, 'asset-groups'),\n updateAssetGroup: factory.update(etainablApi, 'asset-groups'),\n createAssetGroup: factory.create(etainablApi, 'asset-groups'),\n removeAssetGroup: factory.remove(etainablApi, 'asset-groups'),\n getAssetGroupAssets: factory.getWithId(etainablApi, 'asset-groups', 'assets'),\n getAssetGroupSchema: factory.get(etainablApi, 'asset-groups', 'schema'),\n\n // automation\n getAutomation: factory.getWithId<Automation<string>>(etainablApi, 'automation'),\n listAutomations: factory.list<Automation<string>>(etainablApi, 'automation'),\n updateAutomation: factory.update<Automation<string>>(etainablApi, 'automation'),\n createAutomation: factory.create<Automation<string>>(etainablApi, 'automation'),\n removeAutomation: factory.remove<Automation<string>>(etainablApi, 'automation'),\n createAutomationLog: subFactory.create(etainablApi, 'automation', 'logs'),\n updateAutomationLog: subFactory.update(etainablApi, 'automation', 'logs'),\n removeAutomationLog: subFactory.remove(etainablApi, 'automation', 'logs'),\n\n // company\n getCompany: factory.getWithId<Company<string>>(etainablApi, 'companies'),\n\n // consumption\n getConsumption: factory.getWithId(etainablApi, 'consumptions'),\n listConsumptions: factory.list(etainablApi, 'consumptions'),\n updateConsumption: factory.update(etainablApi, 'consumptions'),\n createConsumption: factory.create(etainablApi, 'consumptions'),\n removeConsumption: factory.remove(etainablApi, 'consumptions'),\n getConsumptionSchema: factory.get(etainablApi, 'consumptions', 'schema'),\n\n // emails\n getEmail: factory.getWithId(etainablApi, 'emails'),\n listEmails: factory.list(etainablApi, 'emails'),\n updateEmail: factory.update(etainablApi, 'emails'),\n createEmail: factory.create(etainablApi, 'emails'),\n removeEmail: factory.remove(etainablApi, 'emails'),\n\n // emission factors\n getEmissionFactor: factory.getWithId(etainablApi, 'emission-factors'),\n listEmissionFactors: factory.list(etainablApi, 'emission-factors'),\n updateEmissionFactor: factory.update(etainablApi, 'emission-factors'),\n createEmissionFactor: factory.create(etainablApi, 'emission-factors'),\n removeEmissionFactor: factory.remove(etainablApi, 'emission-factors'),\n\n // entity\n getEntity: factory.getWithId<Entity<string>>(etainablApi, 'entities'),\n listEntities: factory.list<Entity<string>>(etainablApi, 'entities'),\n updateEntity: factory.update<Entity<string>>(etainablApi, 'entities'),\n createEntity: factory.create<Entity<string>>(etainablApi, 'entities'),\n removeEntity: factory.remove<Entity<string>>(etainablApi, 'entities'),\n getEntitiesSchema: factory.get(etainablApi, 'entities', 'schema'),\n\n // logs\n getLog: factory.getWithId<Log<string>>(etainablApi, 'logs'),\n listLogs: factory.list<Log<string>>(etainablApi, 'logs'),\n updateLog: factory.update<Log<string>>(etainablApi, 'logs'),\n createLog: factory.create<Log<string>>(etainablApi, 'logs'),\n removeLog: factory.remove<Log<string>>(etainablApi, 'logs'),\n\n // readings\n getReading: factory.getWithId<Reading<string>>(etainablApi, 'readings'),\n listReadings: factory.list<Reading<string>>(etainablApi, 'readings'),\n updateReading: factory.update<Reading<string>>(etainablApi, 'readings'),\n createReading: factory.create<Reading<string>>(etainablApi, 'readings'),\n removeReading: factory.remove<Reading<string>>(etainablApi, 'readings'),\n getReadingSchema: factory.get(etainablApi, 'readings', 'schema'),\n\n // reports\n getReport: factory.getWithId<Report<string>>(etainablApi, 'reports'),\n listReports: factory.list<Report<string>>(etainablApi, 'reports'),\n updateReport: factory.update<Report<string>>(etainablApi, 'reports'),\n createReport: factory.create<Report<string>>(etainablApi, 'reports'),\n removeReport: factory.remove<Report<string>>(etainablApi, 'reports'),\n sendReport: factory.customWithId(etainablApi, 'post', 'reports', 'send'),\n\n // report templates\n getReportTemplate: factory.getWithId(etainablApi, 'report-templates'),\n listReportTemplates: factory.list(etainablApi, 'report-templates'),\n updateReportTemplate: factory.update(etainablApi, 'report-templates'),\n createReportTemplate: factory.create(etainablApi, 'report-templates'),\n removeReportTemplate: factory.remove(etainablApi, 'report-templates'),\n\n // scheduled reports\n getScheduledReport: factory.getWithId(etainablApi, 'scheduled-reports'),\n listScheduledReports: factory.list(etainablApi, 'scheduled-reports'),\n updateScheduledReport: factory.update(etainablApi, 'scheduled-reports'),\n createScheduledReport: factory.create(etainablApi, 'scheduled-reports'),\n removeScheduledReport: factory.remove(etainablApi, 'scheduled-reports'),\n sendScheduledReport: factory.customWithId(etainablApi, 'post', 'scheduled-reports', 'send'),\n\n // invoices\n getInvoice: factory.getWithId<Invoice<string>>(etainablApi, 'invoices'),\n listInvoices: factory.list<Invoice<string>>(etainablApi, 'invoices'),\n updateInvoice: factory.update<Invoice<string>>(etainablApi, 'invoices'),\n createInvoice: factory.create<Invoice<string>>(etainablApi, 'invoices'),\n removeInvoice: factory.remove<Invoice<string>>(etainablApi, 'invoices'),\n getInvoiceSchema: factory.get(etainablApi, 'invoices', 'schema'),\n\n // invoice capture\n getInvoiceCapture: factory.getWithId<InvoiceCapture<string>>(etainablApi, 'invoice-capture'),\n listInvoicesCapture: factory.list<InvoiceCapture<string>>(etainablApi, 'invoice-capture'),\n updateInvoiceCapture: factory.update<InvoiceCapture<string>>(etainablApi, 'invoice-capture'),\n createInvoiceCapture: factory.create<InvoiceCapture<string>>(etainablApi, 'invoice-capture'),\n removeInvoiceCapture: factory.remove<InvoiceCapture<string>>(etainablApi, 'invoice-capture'),\n getInvoiceCaptureSchema: factory.get(etainablApi, 'invoice-capture', 'schema'),\n\n //suppliers\n listSuppliers: factory.list<Supplier<string>>(etainablApi, 'suppliers'),\n getSupplierSchema: factory.get(etainablApi, 'suppliers', 'schema'),\n\n // import templates\n getImportTemplate: factory.getWithId(etainablApi, 'import-templates'),\n\n //data imports\n listDataIngest: factory.list<DataIngest<string>>(etainablApi, 'data-ingests'),\n updateDataIngest: factory.update<DataIngest<string>>(etainablApi, 'data-ingests'),\n createDataIngest: factory.create<DataIngest<string>>(etainablApi, 'data-ingests')\n };\n } catch (e) {\n log.error(e);\n throw e;\n }\n};\n","import winston from 'winston';\n\nexport default (namespace: string) => winston.createLogger({\n level: 'debug',\n format: winston.format.combine(\n winston.format.timestamp(),\n winston.format.json()\n ),\n defaultMeta: { service: process.env.AWS_LAMBDA_FUNCTION_NAME, script: namespace },\n transports: [\n new winston.transports.Console()\n ]\n});\n","import { MongoClient, Db } from 'mongodb';\nimport logger from './logger.js';\n\nconst log = logger('dbHelpers');\n\nlet cachedDb: Db;\n\nasync function connectToDatabase(retryAttempt: number = 1): Promise<Db> {\n if (!process.env.ETAINABL_DB_URL) throw new Error(\"ETAINABL_DB_URL is not set\");\n if (!process.env.AWS_ACCESS_KEY_ID) throw new Error(\"AWS_ACCESS_KEY_ID is not set\");\n if (!process.env.AWS_SECRET_ACCESS_KEY) throw new Error(\"AWS_SECRET_ACCESS_KEY is not set\");\n\n if (cachedDb) {\n log.debug('Using cached MongoDB connection.');\n return Promise.resolve(cachedDb);\n }\n \n const uri = `mongodb+srv://${process.env.ETAINABL_DB_URL}`;\n \n try {\n if (process.env.DB_BASIC_AUTH === 'true') {\n log.debug('Connecting to MongoDB server... (Auth: Basic)');\n\n const client = new MongoClient(uri);\n await client.connect();\n\n log.debug('Connected successfully to MongoDB server! (Auth: Basic)');\n\n cachedDb = client.db('etainabl');\n\n return cachedDb;\n }\n\n log.debug('Connecting to MongoDB server... (Auth: AWS)');\n\n const client = new MongoClient(uri, {\n auth: {\n username: process.env.AWS_ACCESS_KEY_ID,\n password: process.env.AWS_SECRET_ACCESS_KEY\n },\n authSource: '$external',\n authMechanism: 'MONGODB-AWS'\n });\n\n await client.connect();\n\n log.debug('Connected successfully to MongoDB server! (Auth: AWS)');\n\n cachedDb = client.db('etainabl');\n\n return cachedDb;\n\n } catch (e: any) {\n // Retry\n if (retryAttempt > 5) {\n console.log(`Error connecting to MongoDB server after 5 attempts...`);\n throw e;\n }\n\n console.log(`MongoDB Connection error: ${e.message}`);\n\n console.log(`Error connecting to MongoDB server... Retrying in 3 seconds... (Attempt ${retryAttempt})`);\n return connectToDatabase(retryAttempt + 1);\n }\n}\n\nexport default {\n connectToDatabase\n};","import axios from 'axios';\n\nconst postMessage = async (message: string) => {\n const url = 'https://hooks.slack.com/services/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';\n const data = {\n text: `[${(process.env.ENV || '').toUpperCase()}][${process.env.AWS_LAMBDA_FUNCTION_NAME}] ${message}`\n };\n const headers = {\n 'Content-Type': 'application/json'\n };\n return axios.post(url, data, { headers });\n};\n\nexport default {\n postMessage\n}","import type { UtilityType } from 'types/global.js';\n\ninterface Item {\n units?: string | null;\n unit?: string | null;\n factor?: number | null;\n value: number;\n [key: string]: any;\n}\n\nexport type AccountType = UtilityType;\nexport type ETNUnit =\n | 'kwh'\n | 'kg'\n | 'm3'\n | 'lbs'\n | 'tonnes'\n | 'wh'\n | 'mwh'\n | 'ft3'\n | 'hcf'\n | 'm3/h'\n | 'qty'\n | 'l'\n | 'C'\n | 'mcuf'\n | 'hcuf'\n | 'tcuf'\n | 'ocuf'\n | 'hm3'\n | 'tm3'\n | 'nm3';\nexport type BaseUnit = 'kwh' | 'm3' | 'C' | 'kg' | 'm3/h' | 'l';\nexport const accountTypeMap: { [key: string]: BaseUnit } = {\n electricity: 'kwh',\n gas: 'kwh',\n water: 'm3',\n waste: 'kg',\n solar: 'kwh',\n heating: 'kwh',\n flow: 'm3/h',\n cooling: 'kwh',\n temperature: 'C',\n oil: 'l'\n};\n\nconst unitConversionFactors: { [key: string]: any } = {\n kwh: {\n kwh: 1,\n mwh: 1000,\n wh: 0.001,\n m3: (39 * 1.02264) / 3.6,\n ft3: (0.0283 * 39 * 1.02264) / 3.6,\n hcf: (2.83 * 39 * 1.02264) / 3.6\n },\n m3: {\n m3: 1,\n l: 0.001\n },\n C: {\n C: 1\n },\n kg: {\n kg: 1,\n lbs: 0.45359237,\n tonnes: 1000\n },\n 'm3/h': {\n 'm3/h': 1\n }\n};\n\nexport const accountTypeUnitMap: { [key: string]: ETNUnit[] } = {\n electricity: ['kwh', 'mwh', 'wh'],\n gas: ['kwh', 'm3', 'ft3', 'hcf'],\n water: ['m3', 'l'],\n waste: ['kg', 'lbs', 'tonnes'],\n solar: ['kwh', 'mwh', 'wh'],\n heating: ['kwh', 'mwh', 'wh'],\n flow: ['m3/h'],\n cooling: ['kwh', 'mwh', 'wh'],\n temperature: ['C'],\n oil: ['l']\n};\n\n// Convert units to base format\nexport const convertItems = (items: Item[], type: AccountType, defaultUnits: ETNUnit | undefined, accountFactor: number | undefined): any => {\n if (!type) throw new Error('Account type is required');\n\n const baseUnit = accountTypeMap[type];\n if (!baseUnit) throw new Error(`Account type ${type} is not supported`);\n\n const convertedItems = items.map(item => {\n const factor = item.factor || accountFactor || 1;\n const units = item.units || item.unit || defaultUnits || baseUnit;\n const convertedValue = item.value * _getConversionFactor(units, baseUnit) * factor;\n return { ...item, value: convertedValue, units: baseUnit };\n });\n\n return convertedItems;\n};\n\nconst _getConversionFactor = (fromUnit: string = 'kwh', toUnit: string) => {\n const conversionFactors = unitConversionFactors[toUnit];\n\n if (!conversionFactors) {\n throw new Error(`Conversion factor base unit ${toUnit} is not defined`);\n }\n\n if (!conversionFactors[fromUnit]) {\n throw new Error(`Conversion factor from unit ${fromUnit} is not defined`);\n }\n\n return conversionFactors[fromUnit];\n};\n\nexport const checkAccountTypeVsUnits = (type: string, unit: string, additionalLog: number | '' = '') => {\n if (!type) throw new Error('Account type is required');\n if (!unit) throw new Error('Unit is required');\n\n const parsedType = type.toLowerCase().trim();\n\n const accountTypeUnits = accountTypeUnitMap[parsedType];\n if (!accountTypeUnits) throw new Error(`Account type \"${parsedType}\" is not supported ${additionalLog}`);\n\n const parsedUnit = unit.toLowerCase().trim() as ETNUnit;\n\n if (!accountTypeUnits.includes(parsedUnit)) {\n throw new Error(`Account type \"${parsedType}\" does not support unit \"${parsedUnit}\" ${additionalLog}`);\n }\n\n return { type: parsedType as AccountType, unit: parsedUnit };\n};\n","import moment from 'moment';\n\ninterface ConsumptionData {\n date: Date;\n consumption: number;\n}\n\ninterface DayNightConsumption {\n dayConsumption: number,\n nightConsumption: number,\n consumption: number\n}\n\nexport const dayNightConsumption = (data: ConsumptionData[]) => data.reduce((acc: DayNightConsumption, item: ConsumptionData): DayNightConsumption => {\n const hour = moment.utc(item.date).hour(); // End Time of HH consumption period\n\n if (hour >= 0 && hour < 7) {\n acc.nightConsumption += item.consumption;\n } else {\n acc.dayConsumption += item.consumption;\n }\n\n acc.consumption += item.consumption;\n\n return acc;\n}, {\n dayConsumption: 0,\n nightConsumption: 0,\n consumption: 0\n});\n\nexport const calcMaxConsumptionValue = (data: ConsumptionData[]) => Math.max(...data.map((item: ConsumptionData) => item.consumption));\n\nexport const calcMaxDemand = (data: ConsumptionData[]) => calcMaxConsumptionValue(data) * 2;\n\nexport const calcPeakLoad = (consumption: number, maxDemand: number, startDate: string | moment.Moment, endDate: string | moment.Moment) => {\n const days = Math.ceil(moment(endDate).diff(moment(startDate), 'days', true));\n\n return maxDemand === 0 ? 0 : ((consumption / (maxDemand * 24 * days)) * 100);\n};","import axios from 'axios';\n\nimport logger from './logger.js';\n\nconst log = logger('monitoring');\n\nexport const sendHeartbeat = async () => {\n if (!process.env.HEARTBEAT_URL || process.env.HEARTBEAT_URL.endsWith('/')) return false;\n\n try {\n await axios.post(process.env.HEARTBEAT_URL);\n\n return true;\n } catch (e: any) {\n log.warn(`Failed to send heartbeat: ${e.message || e}`);\n return false;\n }\n}","import moment from 'moment';\n\nmoment.locale('en', {\n week: {\n dow: 1\n }\n});\n\nconst getNextRunTime = (startDate: moment.Moment, schedule: any, taskTime: moment.Moment): moment.Moment => {\n const [num, freq] = schedule.frequency.split('|');\n const targetDate = moment(startDate).add(num, freq as moment.unitOfTime.Base);\n\n if (schedule.frequencyPeriod === 'first') {\n targetDate.startOf(freq as moment.unitOfTime.StartOf);\n } else if (schedule.frequencyPeriod === 'last') {\n targetDate.endOf(freq as moment.unitOfTime.StartOf);\n }\n\n const isWeekday = targetDate.isoWeekday() > 0 && targetDate.isoWeekday() < 6;\n const isSaturday = targetDate.isoWeekday() === 6;\n\n // The weekday or weekend chosen should be within the same month as the target date\n if (schedule.frequencyDay === 'weekdays' && !isWeekday) {\n if ((targetDate.date() / 7) < 2) {\n targetDate.add(isSaturday ? 2 : 1, 'days');\n } else {\n targetDate.subtract(isSaturday ? 1 : 2, 'days');\n }\n } else if (schedule.frequencyDay === 'weekends' && isWeekday) {\n if ((targetDate.date() / 7) < 2) {\n targetDate.isoWeekday(6);\n } else {\n targetDate.isoWeekday(0);\n }\n }\n\n if (taskTime.isAfter(targetDate, 'minute')) {\n return getNextRunTime(targetDate, schedule, taskTime);\n }\n\n return targetDate;\n};\n\nexport const getScheduledReportRunTimes = (schedule: any, limit = 1, taskTime = moment()): moment.Moment[] => {\n if (!schedule.startDate || !schedule.enabled) return [];\n\n const originalStartDate = moment.utc(schedule.startDate);\n\n let startDate = originalStartDate;\n\n const includeStartDate = taskTime.isSameOrBefore(originalStartDate, 'minute');\n\n let runTimes = [] as moment.Moment[];\n\n if (includeStartDate) {\n runTimes = [originalStartDate];\n }\n\n const [, freq] = schedule.frequency.split('|');\n\n if (freq === 'once') {\n const nextRunTime = runTimes[0];\n\n // If this is now beyond the start date, return an empty array\n return taskTime.isAfter(nextRunTime, 'minute') ? [] : runTimes;\n }\n\n\n const scheduleRunTimes = Array.from(Array(includeStartDate ? limit - 1 : limit).keys()).map(() => {\n const nextRunTime = getNextRunTime(startDate, schedule, taskTime);\n\n startDate = nextRunTime.hour(originalStartDate.hour()).minute(originalStartDate.minute());\n\n return nextRunTime;\n });\n\n return [...runTimes, ...scheduleRunTimes];\n};\n","export * from './automation.js';\n","import { AutomationSource, AutomationService, AutomationServiceCategory } from 'types/automation.js';\n\nexport const automationSources: AutomationSource[] = ['ftp', 'email', 's3'];\n\nexport const automationServices: { key: AutomationService, friendly: string, category: AutomationServiceCategory }[] = [\n {\n friendly: 'Account Status',\n key: 'accountStatus',\n category: 'system'\n },\n {\n friendly: 'Autometer',\n key: 'autometer',\n category: 'company'\n },\n {\n friendly: 'BACnet',\n key: 'bacnet',\n category: 'account'\n },\n {\n friendly: 'CarloGavazziVmuc',\n key: 'carlogavazzivmuc',\n category: 'company'\n },\n {\n friendly: 'Carlo Gavazzi UWP',\n key: 'carlogavazziuwp',\n category: 'company'\n },\n {\n friendly: 'CXG Multi Column',\n key: 'cxgmulticolumn',\n category: 'company'\n },\n {\n friendly: 'ETN Single Column',\n key: 'etnsinglecolumn',\n category: 'company'\n },\n {\n friendly: 'ETN Multi Column',\n key: 'etnmulticolumn',\n category: 'company'\n },\n {\n friendly: 'ETN Multi Time Column',\n key: 'etnmultitimecolumn',\n category: 'company'\n },\n {\n friendly: 'CXG Multi Time Column',\n key: 'cxgmultitimecolumn',\n category: 'company'\n },\n {\n friendly: 'CXG Single Column',\n key: 'cxgsinglecolumn',\n category: 'company'\n },\n {\n friendly: 'Deepki',\n key: 'deepki',\n category: 'company'\n },\n {\n friendly: 'Crown AMR',\n key: 'crownamr',\n category: 'company'\n },\n {\n friendly: 'eLogBooks',\n key: 'elogbooks',\n category: 'account'\n },\n {\n friendly: 'Elveco',\n key: 'elveco',\n category: 'company'\n },\n {\n friendly: 'Gridfetch',\n key: 'gridfetch',\n category: 'account'\n },\n {\n friendly: 'IMServ Data Vision',\n key: 'imserv',\n category: 'company'\n },\n {\n friendly: 'Meter.co.uk',\n key: 'meteruk',\n category: 'account'\n },\n {\n friendly: 'MJ Church',\n key: 'mjchurch',\n category: 'company'\n },\n {\n friendly: 'MSM Solutions',\n key: 'msmsolutions',\n category: 'company'\n },\n {\n friendly: 'Niagara N4',\n key: 'niagaran4',\n category: 'company'\n },\n {\n friendly: 'Octanise',\n key: 'octanise',\n category: 'company'\n },\n {\n friendly: 'Orsis',\n key: 'orsis',\n category: 'company'\n },\n {\n friendly: 'Schneider',\n key: 'schneider',\n category: 'company'\n },\n {\n friendly: 'Schneider EGX',\n key: 'schneideregx',\n category: 'company'\n },\n {\n friendly: 'Schneider Com X',\n key: 'schneidercomx',\n category: 'company'\n },\n {\n friendly: 'Sentinel',\n key: 'sentinel',\n category: 'company'\n },\n {\n friendly: 'Siemens',\n key: 'siemens',\n category: 'company'\n },\n {\n friendly: 'Siemens Tem',\n key: 'siemenstem',\n category: 'company'\n },\n {\n friendly: 'Smart Flow',\n key: 'smartflow',\n category: 'account'\n },\n {\n friendly: 'Smartvatten',\n key: 'smartvatten',\n category: 'account'\n },\n {\n friendly: 'SMS Energy',\n key: 'sms',\n category: 'company'\n },\n {\n friendly: 'SoClean',\n key: 'soclean',\n category: 'company'\n },\n {\n friendly: 'Solarman',\n key: 'solarman',\n category: 'account'\n },\n {\n friendly: 'Solis',\n key: 'solis',\n category: 'account'\n },\n {\n friendly: 'SSE Clarity',\n key: 'sse',\n category: 'company'\n },\n {\n friendly: 'Stark',\n key: 'stark',\n category: 'company'\n },\n {\n friendly: 'Synapsys',\n key: 'synapsys',\n category: 'company'\n }\n];\n","import { ObjectId } from 'mongodb';\n\nexport * from './account.js';\nexport * from './asset.js';\nexport * from './automation.js';\nexport * from './company.js';\nexport * from './scraperRun.js';\nexport * from './dataIngest.js';\nexport * from './entity.js';\nexport * from './email.js';\nexport * from './global.js';\nexport * from './invoice.js';\nexport * from './invoiceCapture.js';\nexport * from './log.js';\nexport * from './reading.js';\nexport * from './report.js';\nexport * from './supplier.js';\nexport { ObjectId };\n\nexport interface ETNPagedResponse<T = any> {\n data: T[];\n total: number;\n limit: number;\n skip: number;\n}\n"],"mappings":"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AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AACJ;;;ACnMA,SAAS,gBAAgB;","names":["log","client","axios","axios","log","axios","moment"]}
package/dist/index.d.cts CHANGED
@@ -5,6 +5,41 @@ export { ObjectId } from 'mongodb';
5
5
  import winston from 'winston';
6
6
  import moment from 'moment';
7
7
 
8
+ type UtilityType = 'electricity' | 'gas' | 'water' | 'waste' | 'solar' | 'heating' | 'flow' | 'cooling' | 'temperature' | 'oil' | 'other';
9
+
10
+ interface Item {
11
+ units?: string | null;
12
+ unit?: string | null;
13
+ factor?: number | null;
14
+ value: number;
15
+ [key: string]: any;
16
+ }
17
+ type AccountType = UtilityType;
18
+ type ETNUnit = 'kwh' | 'kg' | 'm3' | 'lbs' | 'tonnes' | 'wh' | 'mwh' | 'ft3' | 'hcf' | 'm3/h' | 'qty' | 'l' | 'C' | 'mcuf' | 'hcuf' | 'tcuf' | 'ocuf' | 'hm3' | 'tm3' | 'nm3';
19
+ type BaseUnit = 'kwh' | 'm3' | 'C' | 'kg' | 'm3/h' | 'l';
20
+ declare const accountTypeMap: {
21
+ [key: string]: BaseUnit;
22
+ };
23
+ declare const accountTypeUnitMap: {
24
+ [key: string]: ETNUnit[];
25
+ };
26
+ declare const convertItems: (items: Item[], type: AccountType, defaultUnits: ETNUnit | undefined, accountFactor: number | undefined) => any;
27
+ declare const checkAccountTypeVsUnits: (type: string, unit: string, additionalLog?: number | '') => {
28
+ type: UtilityType;
29
+ unit: ETNUnit;
30
+ };
31
+
32
+ type units_AccountType = AccountType;
33
+ type units_BaseUnit = BaseUnit;
34
+ type units_ETNUnit = ETNUnit;
35
+ declare const units_accountTypeMap: typeof accountTypeMap;
36
+ declare const units_accountTypeUnitMap: typeof accountTypeUnitMap;
37
+ declare const units_checkAccountTypeVsUnits: typeof checkAccountTypeVsUnits;
38
+ declare const units_convertItems: typeof convertItems;
39
+ declare namespace units {
40
+ export { type units_AccountType as AccountType, type units_BaseUnit as BaseUnit, type units_ETNUnit as ETNUnit, units_accountTypeMap as accountTypeMap, units_accountTypeUnitMap as accountTypeUnitMap, units_checkAccountTypeVsUnits as checkAccountTypeVsUnits, units_convertItems as convertItems };
41
+ }
42
+
8
43
  interface Portal<IDType = ObjectId | string> {
9
44
  username?: string;
10
45
  password?: string;
@@ -20,8 +55,6 @@ interface StatusHistory {
20
55
  notes?: string;
21
56
  }
22
57
 
23
- type UtilityType = 'electricity' | 'gas' | 'water' | 'waste' | 'solar' | 'heating' | 'flow' | 'cooling' | 'temperature' | 'oil' | 'other';
24
-
25
58
  interface PortalAccountSchema extends Portal {
26
59
  invoiceFilenames: any[];
27
60
  }
@@ -94,7 +127,7 @@ interface Account<IDType = ObjectId | string> {
94
127
  meterPointNumber?: string;
95
128
  meterSerialNumber?: string;
96
129
  meterPointNumber2?: string;
97
- meterUnits: 'kwh' | 'm3' | 'ft3';
130
+ meterUnits: ETNUnit;
98
131
  factor?: number;
99
132
  registerIds?: string[];
100
133
  automaticMeterRead?: boolean;
@@ -235,12 +268,11 @@ interface Asset<IDType = ObjectId | string> {
235
268
  address: Address;
236
269
  assetType: string;
237
270
  floorArea: number;
238
- floorAreaUnit: 'metric' | 'imperial';
271
+ floorAreaUnit?: 'metric' | 'imperial';
239
272
  noOfFloors?: number;
240
- energyRating: string;
241
- gav: string;
242
- gavCurrency: string;
243
- currency: string;
273
+ energyRating?: string;
274
+ gav?: string;
275
+ gavCurrency?: string;
244
276
  occupationStatus: 'occupied' | 'vacant' | 'other' | 'n/a';
245
277
  type: 'new construction' | 'major renovation' | 'standing investment' | 'n/a';
246
278
  vacancyRate?: number;
@@ -257,7 +289,6 @@ interface Asset<IDType = ObjectId | string> {
257
289
  recentCrimes: Crime[];
258
290
  recentAirQuality: AirQuality;
259
291
  documents?: Document<IDType>[];
260
- epbCertificates: any[];
261
292
  status?: string;
262
293
  settings: AssetSettings;
263
294
  recommendations?: AssetRecommendation[];
@@ -576,6 +607,7 @@ interface Reading<IDType = ObjectId | string> {
576
607
  _id: string;
577
608
  submittedAt: Date;
578
609
  value: number;
610
+ units: ETNUnit;
579
611
  type?: string;
580
612
  invoiceStartRead?: number;
581
613
  source: string;
@@ -797,39 +829,6 @@ declare const _default: {
797
829
  postMessage: (message: string) => Promise<axios.AxiosResponse<any, any>>;
798
830
  };
799
831
 
800
- interface Item {
801
- units?: string | null;
802
- unit?: string | null;
803
- factor?: number | null;
804
- value: number;
805
- [key: string]: any;
806
- }
807
- type AccountType = 'electricity' | 'gas' | 'water' | 'waste' | 'solar' | 'heating' | 'flow' | 'cooling' | 'temperature' | 'oil' | 'other';
808
- type ETNUnit = 'kwh' | 'kg' | 'm3' | 'lbs' | 'tonnes' | 'wh' | 'mwh' | 'ft3' | 'hcf' | 'm3/h' | 'qty' | 'l' | 'C' | 'mcuf' | 'hcuf' | 'tcuf' | 'ocuf' | 'hm3' | 'tm3' | 'nm3';
809
- type BaseUnit = 'kwh' | 'm3' | 'C' | 'kg' | 'm3/h' | 'l';
810
- declare const accountTypeMap: {
811
- [key: string]: BaseUnit;
812
- };
813
- declare const accountTypeUnitMap: {
814
- [key: string]: ETNUnit[];
815
- };
816
- declare const convertItems: (items: Item[], type: AccountType, defaultUnits: ETNUnit | undefined, accountFactor: number | undefined) => any;
817
- declare const checkAccountTypeVsUnits: (type: string, unit: string, additionalLog?: number | '') => {
818
- type: AccountType;
819
- unit: ETNUnit;
820
- };
821
-
822
- type units_AccountType = AccountType;
823
- type units_BaseUnit = BaseUnit;
824
- type units_ETNUnit = ETNUnit;
825
- declare const units_accountTypeMap: typeof accountTypeMap;
826
- declare const units_accountTypeUnitMap: typeof accountTypeUnitMap;
827
- declare const units_checkAccountTypeVsUnits: typeof checkAccountTypeVsUnits;
828
- declare const units_convertItems: typeof convertItems;
829
- declare namespace units {
830
- export { type units_AccountType as AccountType, type units_BaseUnit as BaseUnit, type units_ETNUnit as ETNUnit, units_accountTypeMap as accountTypeMap, units_accountTypeUnitMap as accountTypeUnitMap, units_checkAccountTypeVsUnits as checkAccountTypeVsUnits, units_convertItems as convertItems };
831
- }
832
-
833
832
  interface ConsumptionData {
834
833
  date: Date;
835
834
  consumption: number;
package/dist/index.d.ts CHANGED
@@ -5,6 +5,41 @@ export { ObjectId } from 'mongodb';
5
5
  import winston from 'winston';
6
6
  import moment from 'moment';
7
7
 
8
+ type UtilityType = 'electricity' | 'gas' | 'water' | 'waste' | 'solar' | 'heating' | 'flow' | 'cooling' | 'temperature' | 'oil' | 'other';
9
+
10
+ interface Item {
11
+ units?: string | null;
12
+ unit?: string | null;
13
+ factor?: number | null;
14
+ value: number;
15
+ [key: string]: any;
16
+ }
17
+ type AccountType = UtilityType;
18
+ type ETNUnit = 'kwh' | 'kg' | 'm3' | 'lbs' | 'tonnes' | 'wh' | 'mwh' | 'ft3' | 'hcf' | 'm3/h' | 'qty' | 'l' | 'C' | 'mcuf' | 'hcuf' | 'tcuf' | 'ocuf' | 'hm3' | 'tm3' | 'nm3';
19
+ type BaseUnit = 'kwh' | 'm3' | 'C' | 'kg' | 'm3/h' | 'l';
20
+ declare const accountTypeMap: {
21
+ [key: string]: BaseUnit;
22
+ };
23
+ declare const accountTypeUnitMap: {
24
+ [key: string]: ETNUnit[];
25
+ };
26
+ declare const convertItems: (items: Item[], type: AccountType, defaultUnits: ETNUnit | undefined, accountFactor: number | undefined) => any;
27
+ declare const checkAccountTypeVsUnits: (type: string, unit: string, additionalLog?: number | '') => {
28
+ type: UtilityType;
29
+ unit: ETNUnit;
30
+ };
31
+
32
+ type units_AccountType = AccountType;
33
+ type units_BaseUnit = BaseUnit;
34
+ type units_ETNUnit = ETNUnit;
35
+ declare const units_accountTypeMap: typeof accountTypeMap;
36
+ declare const units_accountTypeUnitMap: typeof accountTypeUnitMap;
37
+ declare const units_checkAccountTypeVsUnits: typeof checkAccountTypeVsUnits;
38
+ declare const units_convertItems: typeof convertItems;
39
+ declare namespace units {
40
+ export { type units_AccountType as AccountType, type units_BaseUnit as BaseUnit, type units_ETNUnit as ETNUnit, units_accountTypeMap as accountTypeMap, units_accountTypeUnitMap as accountTypeUnitMap, units_checkAccountTypeVsUnits as checkAccountTypeVsUnits, units_convertItems as convertItems };
41
+ }
42
+
8
43
  interface Portal<IDType = ObjectId | string> {
9
44
  username?: string;
10
45
  password?: string;
@@ -20,8 +55,6 @@ interface StatusHistory {
20
55
  notes?: string;
21
56
  }
22
57
 
23
- type UtilityType = 'electricity' | 'gas' | 'water' | 'waste' | 'solar' | 'heating' | 'flow' | 'cooling' | 'temperature' | 'oil' | 'other';
24
-
25
58
  interface PortalAccountSchema extends Portal {
26
59
  invoiceFilenames: any[];
27
60
  }
@@ -94,7 +127,7 @@ interface Account<IDType = ObjectId | string> {
94
127
  meterPointNumber?: string;
95
128
  meterSerialNumber?: string;
96
129
  meterPointNumber2?: string;
97
- meterUnits: 'kwh' | 'm3' | 'ft3';
130
+ meterUnits: ETNUnit;
98
131
  factor?: number;
99
132
  registerIds?: string[];
100
133
  automaticMeterRead?: boolean;
@@ -235,12 +268,11 @@ interface Asset<IDType = ObjectId | string> {
235
268
  address: Address;
236
269
  assetType: string;
237
270
  floorArea: number;
238
- floorAreaUnit: 'metric' | 'imperial';
271
+ floorAreaUnit?: 'metric' | 'imperial';
239
272
  noOfFloors?: number;
240
- energyRating: string;
241
- gav: string;
242
- gavCurrency: string;
243
- currency: string;
273
+ energyRating?: string;
274
+ gav?: string;
275
+ gavCurrency?: string;
244
276
  occupationStatus: 'occupied' | 'vacant' | 'other' | 'n/a';
245
277
  type: 'new construction' | 'major renovation' | 'standing investment' | 'n/a';
246
278
  vacancyRate?: number;
@@ -257,7 +289,6 @@ interface Asset<IDType = ObjectId | string> {
257
289
  recentCrimes: Crime[];
258
290
  recentAirQuality: AirQuality;
259
291
  documents?: Document<IDType>[];
260
- epbCertificates: any[];
261
292
  status?: string;
262
293
  settings: AssetSettings;
263
294
  recommendations?: AssetRecommendation[];
@@ -576,6 +607,7 @@ interface Reading<IDType = ObjectId | string> {
576
607
  _id: string;
577
608
  submittedAt: Date;
578
609
  value: number;
610
+ units: ETNUnit;
579
611
  type?: string;
580
612
  invoiceStartRead?: number;
581
613
  source: string;
@@ -797,39 +829,6 @@ declare const _default: {
797
829
  postMessage: (message: string) => Promise<axios.AxiosResponse<any, any>>;
798
830
  };
799
831
 
800
- interface Item {
801
- units?: string | null;
802
- unit?: string | null;
803
- factor?: number | null;
804
- value: number;
805
- [key: string]: any;
806
- }
807
- type AccountType = 'electricity' | 'gas' | 'water' | 'waste' | 'solar' | 'heating' | 'flow' | 'cooling' | 'temperature' | 'oil' | 'other';
808
- type ETNUnit = 'kwh' | 'kg' | 'm3' | 'lbs' | 'tonnes' | 'wh' | 'mwh' | 'ft3' | 'hcf' | 'm3/h' | 'qty' | 'l' | 'C' | 'mcuf' | 'hcuf' | 'tcuf' | 'ocuf' | 'hm3' | 'tm3' | 'nm3';
809
- type BaseUnit = 'kwh' | 'm3' | 'C' | 'kg' | 'm3/h' | 'l';
810
- declare const accountTypeMap: {
811
- [key: string]: BaseUnit;
812
- };
813
- declare const accountTypeUnitMap: {
814
- [key: string]: ETNUnit[];
815
- };
816
- declare const convertItems: (items: Item[], type: AccountType, defaultUnits: ETNUnit | undefined, accountFactor: number | undefined) => any;
817
- declare const checkAccountTypeVsUnits: (type: string, unit: string, additionalLog?: number | '') => {
818
- type: AccountType;
819
- unit: ETNUnit;
820
- };
821
-
822
- type units_AccountType = AccountType;
823
- type units_BaseUnit = BaseUnit;
824
- type units_ETNUnit = ETNUnit;
825
- declare const units_accountTypeMap: typeof accountTypeMap;
826
- declare const units_accountTypeUnitMap: typeof accountTypeUnitMap;
827
- declare const units_checkAccountTypeVsUnits: typeof checkAccountTypeVsUnits;
828
- declare const units_convertItems: typeof convertItems;
829
- declare namespace units {
830
- export { type units_AccountType as AccountType, type units_BaseUnit as BaseUnit, type units_ETNUnit as ETNUnit, units_accountTypeMap as accountTypeMap, units_accountTypeUnitMap as accountTypeUnitMap, units_checkAccountTypeVsUnits as checkAccountTypeVsUnits, units_convertItems as convertItems };
831
- }
832
-
833
832
  interface ConsumptionData {
834
833
  date: Date;
835
834
  consumption: number;
package/dist/index.js CHANGED
@@ -663,7 +663,7 @@ var automationServices = [
663
663
  category: "company"
664
664
  },
665
665
  {
666
- friendly: "ETN Multi Column",
666
+ friendly: "ETN Single Column",
667
667
  key: "etnsinglecolumn",
668
668
  category: "company"
669
669
  },
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/api.ts","../src/logger.ts","../src/db.ts","../src/slack.ts","../src/units.ts","../src/consumption.ts","../src/monitoring.ts","../src/reporting.ts","../src/utils/index.ts","../src/utils/automation.ts","../src/types/index.ts"],"sourcesContent":["import api from './api.js';\nimport logger from './logger.js';\nimport db from './db.js';\nimport slack from './slack.js';\nimport * as units from './units.js';\nimport * as consumption from './consumption.js';\nimport * as monitoring from './monitoring.js';\nimport * as reporting from './reporting.js';\nimport * as utils from './utils/index.js';\n\nexport { api, logger, consumption, monitoring, db, slack, units, reporting, utils };\n\nexport * from './types/index.js';\n","import axios from 'axios';\nimport type { AxiosRequestConfig, AxiosInstance, CreateAxiosDefaults, AxiosResponse } from 'axios';\nimport https from 'https';\n\nimport logger from './logger.js';\n\nimport type {\n Account,\n Asset,\n Automation,\n Entity,\n Company,\n DataIngest,\n Invoice,\n InvoiceCapture,\n Log,\n Reading,\n Report,\n Supplier\n} from './types/index.js';\n\nconst log = logger('etainablApi');\n\nexport interface ETNPagedResponse<T = any> {\n data: T[];\n total: number;\n limit: number;\n skip: number;\n}\n\nexport interface ETNReq {\n method: string;\n url: string;\n}\n\nfunction _handleResponse(req: ETNReq, res: AxiosResponse, isPaged = false) {\n if (!res) {\n throw new Error(`No response from API (${req.method} ${req.url})`);\n }\n\n if (res.status !== 200) {\n throw new Error(`${res.status} ${res.statusText} response from API (${req.method} ${req.url})`);\n }\n\n if (!res.data) {\n throw new Error(`No data from API (${req.method} ${req.url})`);\n }\n\n if (isPaged && !res.data.data) {\n throw new Error(`No data from API (${req.method} ${req.url})`);\n }\n\n return res;\n}\n\nconst factory = {\n getWithId:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) =>\n async (id: string, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'GET',\n url: `${endpoint}/${id}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n log.info(`API Request: ${req.method} ${process.env.ETAsINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n\n try {\n res = await etainablApi.get(req.url, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n console.log(`API Response: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n _handleResponse(req, res);\n\n return res.data;\n },\n get:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) =>\n async (options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'GET',\n url: `${endpoint}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n\n try {\n res = await etainablApi.get(req.url, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n console.log(`API Response: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n _handleResponse(req, res);\n\n return res.data;\n },\n list:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) =>\n async (options: AxiosRequestConfig = {}): Promise<ETNPagedResponse<T>> => {\n const req = {\n method: 'GET',\n url: `${endpoint}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n\n try {\n res = await etainablApi.get(req.url, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n console.log(`API Response: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n _handleResponse(req, res, true);\n\n return res.data;\n },\n update:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) =>\n async (id: string, data: any, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'PATCH',\n url: `${endpoint}/${id}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n\n try {\n res = await etainablApi.patch(req.url, data, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n _handleResponse(req, res);\n\n return res.data;\n },\n create:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) =>\n async (data: any, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'POST',\n url: `${endpoint}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n\n try {\n res = await etainablApi.post(req.url, data, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n _handleResponse(req, res);\n\n return res.data;\n },\n remove:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) =>\n async (id: string, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'DELETE',\n url: `${endpoint}/${id}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n let res: AxiosResponse;\n\n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n try {\n res = await etainablApi.delete(req.url, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n _handleResponse(req, res);\n\n return res.data;\n },\n customWithId:\n <T = any>(etainablApi: AxiosInstance, method: string, endpoint: string, postEndpoint?: string) =>\n async (id: string, data: any, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: method,\n url: `${endpoint}/${id}${postEndpoint ? `/${postEndpoint}` : ''}`,\n data,\n ...options\n };\n\n log.info(`API Request (Custom): ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n\n try {\n res = await etainablApi.request(req);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n _handleResponse(req, res);\n\n return res.data;\n }\n};\n\n// ETN Sub Endpoints\n// e.g. /assets/:id/documents/:documentId\nconst subFactory = {\n // e.g. POST /assets/:id/documents\n create:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, subEndpoint: string) =>\n async (id: string, data: any, options: AxiosRequestConfig = {}) => {\n const subUrl = `${id}/${subEndpoint}`;\n return factory.create<T>(etainablApi, endpoint, subUrl)(data, options);\n },\n // e.g. PATCH /assets/:id/documents/:documentId\n update:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, subEndpoint: string) =>\n async (id: string, subId: string, data: any, options: AxiosRequestConfig = {}) => {\n const subUrl = `${subEndpoint}/${subId}`;\n\n return factory.update<T>(etainablApi, endpoint, subUrl)(id, data, options);\n },\n // e.g. DELETE /assets/:id/documents/:documentId\n remove:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, subEndpoint: string) =>\n async (id: string, subId: string, options: AxiosRequestConfig = {}) => {\n const subUrl = `${subEndpoint}/${subId}`;\n\n return factory.remove<T>(etainablApi, endpoint, subUrl)(id, options);\n }\n};\n\ninterface AuthOptions {\n key?: string;\n token?: string;\n}\n\nexport default (auth: AuthOptions, instanceOptions: CreateAxiosDefaults = {}) => {\n try {\n const headers: any = {};\n\n if (auth.key) {\n headers['x-key'] = auth.key;\n } else if (auth.token) {\n headers['Authorization'] = auth.token;\n } else {\n headers['x-key'] = process.env.ETAINABL_API_KEY;\n }\n\n const etainablApi = axios.create({\n baseURL: process.env.ETAINABL_API_URL,\n timeout: 300000,\n httpsAgent: new https.Agent({ keepAlive: true }),\n headers,\n ...instanceOptions\n });\n\n return {\n instance: etainablApi,\n\n // accounts\n getAccount: factory.getWithId<Account<string>>(etainablApi, 'accounts'),\n listAccounts: factory.list<Account<string>>(etainablApi, 'accounts'),\n updateAccount: factory.update<Account<string>>(etainablApi, 'accounts'),\n createAccount: factory.create<Account<string>>(etainablApi, 'accounts'),\n removeAccount: factory.remove<Account<string>>(etainablApi, 'accounts'),\n getAccountSchema: factory.get(etainablApi, 'accounts', 'schema'),\n invalidateAccountCache: factory.customWithId(etainablApi, 'put', 'accounts', 'invalidate-cache'),\n\n // assets\n getAsset: factory.getWithId<Asset<string>>(etainablApi, 'assets'),\n listAssets: factory.list<Asset<string>>(etainablApi, 'assets'),\n updateAsset: factory.update<Asset<string>>(etainablApi, 'assets'),\n createAsset: factory.create<Asset<string>>(etainablApi, 'assets'),\n removeAsset: factory.remove<Asset<string>>(etainablApi, 'assets'),\n getAssetSchema: factory.get(etainablApi, 'assets', 'schema'),\n\n // assetGroups\n getAssetGroup: factory.getWithId(etainablApi, 'asset-groups'),\n listAssetGroups: factory.list(etainablApi, 'asset-groups'),\n updateAssetGroup: factory.update(etainablApi, 'asset-groups'),\n createAssetGroup: factory.create(etainablApi, 'asset-groups'),\n removeAssetGroup: factory.remove(etainablApi, 'asset-groups'),\n getAssetGroupAssets: factory.getWithId(etainablApi, 'asset-groups', 'assets'),\n getAssetGroupSchema: factory.get(etainablApi, 'asset-groups', 'schema'),\n\n // automation\n getAutomation: factory.getWithId<Automation<string>>(etainablApi, 'automation'),\n listAutomations: factory.list<Automation<string>>(etainablApi, 'automation'),\n updateAutomation: factory.update<Automation<string>>(etainablApi, 'automation'),\n createAutomation: factory.create<Automation<string>>(etainablApi, 'automation'),\n removeAutomation: factory.remove<Automation<string>>(etainablApi, 'automation'),\n createAutomationLog: subFactory.create(etainablApi, 'automation', 'logs'),\n updateAutomationLog: subFactory.update(etainablApi, 'automation', 'logs'),\n removeAutomationLog: subFactory.remove(etainablApi, 'automation', 'logs'),\n\n // company\n getCompany: factory.getWithId<Company<string>>(etainablApi, 'companies'),\n\n // consumption\n getConsumption: factory.getWithId(etainablApi, 'consumptions'),\n listConsumptions: factory.list(etainablApi, 'consumptions'),\n updateConsumption: factory.update(etainablApi, 'consumptions'),\n createConsumption: factory.create(etainablApi, 'consumptions'),\n removeConsumption: factory.remove(etainablApi, 'consumptions'),\n getConsumptionSchema: factory.get(etainablApi, 'consumptions', 'schema'),\n\n // emails\n getEmail: factory.getWithId(etainablApi, 'emails'),\n listEmails: factory.list(etainablApi, 'emails'),\n updateEmail: factory.update(etainablApi, 'emails'),\n createEmail: factory.create(etainablApi, 'emails'),\n removeEmail: factory.remove(etainablApi, 'emails'),\n\n // emission factors\n getEmissionFactor: factory.getWithId(etainablApi, 'emission-factors'),\n listEmissionFactors: factory.list(etainablApi, 'emission-factors'),\n updateEmissionFactor: factory.update(etainablApi, 'emission-factors'),\n createEmissionFactor: factory.create(etainablApi, 'emission-factors'),\n removeEmissionFactor: factory.remove(etainablApi, 'emission-factors'),\n\n // entity\n getEntity: factory.getWithId<Entity<string>>(etainablApi, 'entities'),\n listEntities: factory.list<Entity<string>>(etainablApi, 'entities'),\n updateEntity: factory.update<Entity<string>>(etainablApi, 'entities'),\n createEntity: factory.create<Entity<string>>(etainablApi, 'entities'),\n removeEntity: factory.remove<Entity<string>>(etainablApi, 'entities'),\n getEntitiesSchema: factory.get(etainablApi, 'entities', 'schema'),\n\n // logs\n getLog: factory.getWithId<Log<string>>(etainablApi, 'logs'),\n listLogs: factory.list<Log<string>>(etainablApi, 'logs'),\n updateLog: factory.update<Log<string>>(etainablApi, 'logs'),\n createLog: factory.create<Log<string>>(etainablApi, 'logs'),\n removeLog: factory.remove<Log<string>>(etainablApi, 'logs'),\n\n // readings\n getReading: factory.getWithId<Reading<string>>(etainablApi, 'readings'),\n listReadings: factory.list<Reading<string>>(etainablApi, 'readings'),\n updateReading: factory.update<Reading<string>>(etainablApi, 'readings'),\n createReading: factory.create<Reading<string>>(etainablApi, 'readings'),\n removeReading: factory.remove<Reading<string>>(etainablApi, 'readings'),\n getReadingSchema: factory.get(etainablApi, 'readings', 'schema'),\n\n // reports\n getReport: factory.getWithId<Report<string>>(etainablApi, 'reports'),\n listReports: factory.list<Report<string>>(etainablApi, 'reports'),\n updateReport: factory.update<Report<string>>(etainablApi, 'reports'),\n createReport: factory.create<Report<string>>(etainablApi, 'reports'),\n removeReport: factory.remove<Report<string>>(etainablApi, 'reports'),\n sendReport: factory.customWithId(etainablApi, 'post', 'reports', 'send'),\n\n // report templates\n getReportTemplate: factory.getWithId(etainablApi, 'report-templates'),\n listReportTemplates: factory.list(etainablApi, 'report-templates'),\n updateReportTemplate: factory.update(etainablApi, 'report-templates'),\n createReportTemplate: factory.create(etainablApi, 'report-templates'),\n removeReportTemplate: factory.remove(etainablApi, 'report-templates'),\n\n // scheduled reports\n getScheduledReport: factory.getWithId(etainablApi, 'scheduled-reports'),\n listScheduledReports: factory.list(etainablApi, 'scheduled-reports'),\n updateScheduledReport: factory.update(etainablApi, 'scheduled-reports'),\n createScheduledReport: factory.create(etainablApi, 'scheduled-reports'),\n removeScheduledReport: factory.remove(etainablApi, 'scheduled-reports'),\n sendScheduledReport: factory.customWithId(etainablApi, 'post', 'scheduled-reports', 'send'),\n\n // invoices\n getInvoice: factory.getWithId<Invoice<string>>(etainablApi, 'invoices'),\n listInvoices: factory.list<Invoice<string>>(etainablApi, 'invoices'),\n updateInvoice: factory.update<Invoice<string>>(etainablApi, 'invoices'),\n createInvoice: factory.create<Invoice<string>>(etainablApi, 'invoices'),\n removeInvoice: factory.remove<Invoice<string>>(etainablApi, 'invoices'),\n getInvoiceSchema: factory.get(etainablApi, 'invoices', 'schema'),\n\n // invoice capture\n getInvoiceCapture: factory.getWithId<InvoiceCapture<string>>(etainablApi, 'invoice-capture'),\n listInvoicesCapture: factory.list<InvoiceCapture<string>>(etainablApi, 'invoice-capture'),\n updateInvoiceCapture: factory.update<InvoiceCapture<string>>(etainablApi, 'invoice-capture'),\n createInvoiceCapture: factory.create<InvoiceCapture<string>>(etainablApi, 'invoice-capture'),\n removeInvoiceCapture: factory.remove<InvoiceCapture<string>>(etainablApi, 'invoice-capture'),\n getInvoiceCaptureSchema: factory.get(etainablApi, 'invoice-capture', 'schema'),\n\n //suppliers\n listSuppliers: factory.list<Supplier<string>>(etainablApi, 'suppliers'),\n getSupplierSchema: factory.get(etainablApi, 'suppliers', 'schema'),\n\n // import templates\n getImportTemplate: factory.getWithId(etainablApi, 'import-templates'),\n\n //data imports\n listDataIngest: factory.list<DataIngest<string>>(etainablApi, 'data-ingests'),\n updateDataIngest: factory.update<DataIngest<string>>(etainablApi, 'data-ingests'),\n createDataIngest: factory.create<DataIngest<string>>(etainablApi, 'data-ingests')\n };\n } catch (e) {\n log.error(e);\n throw e;\n }\n};\n","import winston from 'winston';\n\nexport default (namespace: string) => winston.createLogger({\n level: 'debug',\n format: winston.format.combine(\n winston.format.timestamp(),\n winston.format.json()\n ),\n defaultMeta: { service: process.env.AWS_LAMBDA_FUNCTION_NAME, script: namespace },\n transports: [\n new winston.transports.Console()\n ]\n});\n","import { MongoClient, Db } from 'mongodb';\nimport logger from './logger.js';\n\nconst log = logger('dbHelpers');\n\nlet cachedDb: Db;\n\nasync function connectToDatabase(retryAttempt: number = 1): Promise<Db> {\n if (!process.env.ETAINABL_DB_URL) throw new Error(\"ETAINABL_DB_URL is not set\");\n if (!process.env.AWS_ACCESS_KEY_ID) throw new Error(\"AWS_ACCESS_KEY_ID is not set\");\n if (!process.env.AWS_SECRET_ACCESS_KEY) throw new Error(\"AWS_SECRET_ACCESS_KEY is not set\");\n\n if (cachedDb) {\n log.debug('Using cached MongoDB connection.');\n return Promise.resolve(cachedDb);\n }\n \n const uri = `mongodb+srv://${process.env.ETAINABL_DB_URL}`;\n \n try {\n if (process.env.DB_BASIC_AUTH === 'true') {\n log.debug('Connecting to MongoDB server... (Auth: Basic)');\n\n const client = new MongoClient(uri);\n await client.connect();\n\n log.debug('Connected successfully to MongoDB server! (Auth: Basic)');\n\n cachedDb = client.db('etainabl');\n\n return cachedDb;\n }\n\n log.debug('Connecting to MongoDB server... (Auth: AWS)');\n\n const client = new MongoClient(uri, {\n auth: {\n username: process.env.AWS_ACCESS_KEY_ID,\n password: process.env.AWS_SECRET_ACCESS_KEY\n },\n authSource: '$external',\n authMechanism: 'MONGODB-AWS'\n });\n\n await client.connect();\n\n log.debug('Connected successfully to MongoDB server! (Auth: AWS)');\n\n cachedDb = client.db('etainabl');\n\n return cachedDb;\n\n } catch (e: any) {\n // Retry\n if (retryAttempt > 5) {\n console.log(`Error connecting to MongoDB server after 5 attempts...`);\n throw e;\n }\n\n console.log(`MongoDB Connection error: ${e.message}`);\n\n console.log(`Error connecting to MongoDB server... Retrying in 3 seconds... (Attempt ${retryAttempt})`);\n return connectToDatabase(retryAttempt + 1);\n }\n}\n\nexport default {\n connectToDatabase\n};","import axios from 'axios';\n\nconst postMessage = async (message: string) => {\n const url = 'https://hooks.slack.com/services/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';\n const data = {\n text: `[${(process.env.ENV || '').toUpperCase()}][${process.env.AWS_LAMBDA_FUNCTION_NAME}] ${message}`\n };\n const headers = {\n 'Content-Type': 'application/json'\n };\n return axios.post(url, data, { headers });\n};\n\nexport default {\n postMessage\n}","interface Item {\n units?: string | null;\n unit?: string | null;\n factor?: number | null;\n value: number;\n [key: string]: any; \n}\n\nexport type AccountType = 'electricity' | 'gas' | 'water' | 'waste' | 'solar' | 'heating' | 'flow' | 'cooling' | 'temperature' | 'oil' | 'other';\nexport type ETNUnit = 'kwh' | 'kg' | 'm3' | 'lbs' | 'tonnes' | 'wh' | 'mwh' | 'ft3' | 'hcf' | 'm3/h' | 'qty' | 'l' | 'C' | 'mcuf' | 'hcuf' | 'tcuf' | 'ocuf' | 'hm3' | 'tm3' | 'nm3';\nexport type BaseUnit = 'kwh' | 'm3' | 'C' | 'kg' | 'm3/h' | 'l';\nexport const accountTypeMap: { [key: string]: BaseUnit } = {\n electricity: 'kwh',\n gas: 'kwh',\n water: 'm3',\n waste: 'kg',\n solar: 'kwh',\n heating: 'kwh',\n flow: 'm3/h',\n cooling: 'kwh',\n temperature: 'C',\n oil: 'l'\n};\n\nconst unitConversionFactors: { [key: string]: any } = {\n kwh: {\n kwh: 1,\n mwh: 1000,\n wh: 0.001,\n m3: (39 * 1.02264) / 3.6,\n ft3: (0.0283 * 39 * 1.02264) / 3.6,\n hcf: (2.83 * 39 * 1.02264) / 3.6\n },\n m3: {\n m3: 1,\n l: 0.001\n },\n C: {\n C: 1\n },\n kg: {\n kg: 1,\n lbs: 0.45359237,\n tonnes: 1000\n },\n 'm3/h': {\n 'm3/h': 1\n }\n};\n\nexport const accountTypeUnitMap: { [key: string]: ETNUnit[] } = {\n electricity: ['kwh', 'mwh', 'wh'],\n gas: ['kwh', 'm3', 'ft3', 'hcf'],\n water: ['m3', 'l'],\n waste: ['kg', 'lbs', 'tonnes'],\n solar: ['kwh', 'mwh', 'wh'],\n heating: ['kwh', 'mwh', 'wh'],\n flow: ['m3/h'],\n cooling: ['kwh', 'mwh', 'wh'],\n temperature: ['C'],\n oil: ['l']\n};\n\n// Convert units to base format\nexport const convertItems = (items: Item[], type: AccountType, defaultUnits: ETNUnit | undefined, accountFactor: number | undefined): any => {\n if (!type) throw new Error('Account type is required');\n\n const baseUnit = accountTypeMap[type];\n if (!baseUnit) throw new Error(`Account type ${type} is not supported`);\n\n const convertedItems = items.map(item => {\n const factor = item.factor || accountFactor || 1;\n const units = item.units || item.unit || defaultUnits || baseUnit;\n const convertedValue = item.value * _getConversionFactor(units, baseUnit) * factor;\n return { ...item, value: convertedValue, units: baseUnit };\n });\n\n return convertedItems;\n};\n\nconst _getConversionFactor = (fromUnit: string = 'kwh', toUnit: string) => {\n const conversionFactors = unitConversionFactors[toUnit];\n\n if (!conversionFactors) {\n throw new Error(`Conversion factor base unit ${toUnit} is not defined`);\n }\n\n if (!conversionFactors[fromUnit]) {\n throw new Error(`Conversion factor from unit ${fromUnit} is not defined`);\n }\n\n return conversionFactors[fromUnit];\n};\n\nexport const checkAccountTypeVsUnits = (type: string, unit: string, additionalLog: number | '' = '') => {\n if (!type) throw new Error('Account type is required');\n if (!unit) throw new Error('Unit is required');\n\n const parsedType = type.toLowerCase().trim();\n\n const accountTypeUnits = accountTypeUnitMap[parsedType];\n if (!accountTypeUnits) throw new Error(`Account type \"${parsedType}\" is not supported ${additionalLog}`);\n\n const parsedUnit = unit.toLowerCase().trim() as ETNUnit;\n\n if (!accountTypeUnits.includes(parsedUnit)) {\n throw new Error(`Account type \"${parsedType}\" does not support unit \"${parsedUnit}\" ${additionalLog}`);\n }\n\n return { type: parsedType as AccountType, unit: parsedUnit};\n};\n","import moment from 'moment';\n\ninterface ConsumptionData {\n date: Date;\n consumption: number;\n}\n\ninterface DayNightConsumption {\n dayConsumption: number,\n nightConsumption: number,\n consumption: number\n}\n\nexport const dayNightConsumption = (data: ConsumptionData[]) => data.reduce((acc: DayNightConsumption, item: ConsumptionData): DayNightConsumption => {\n const hour = moment.utc(item.date).hour(); // End Time of HH consumption period\n\n if (hour >= 0 && hour < 7) {\n acc.nightConsumption += item.consumption;\n } else {\n acc.dayConsumption += item.consumption;\n }\n\n acc.consumption += item.consumption;\n\n return acc;\n}, {\n dayConsumption: 0,\n nightConsumption: 0,\n consumption: 0\n});\n\nexport const calcMaxConsumptionValue = (data: ConsumptionData[]) => Math.max(...data.map((item: ConsumptionData) => item.consumption));\n\nexport const calcMaxDemand = (data: ConsumptionData[]) => calcMaxConsumptionValue(data) * 2;\n\nexport const calcPeakLoad = (consumption: number, maxDemand: number, startDate: string | moment.Moment, endDate: string | moment.Moment) => {\n const days = Math.ceil(moment(endDate).diff(moment(startDate), 'days', true));\n\n return maxDemand === 0 ? 0 : ((consumption / (maxDemand * 24 * days)) * 100);\n};","import axios from 'axios';\n\nimport logger from './logger.js';\n\nconst log = logger('monitoring');\n\nexport const sendHeartbeat = async () => {\n if (!process.env.HEARTBEAT_URL || process.env.HEARTBEAT_URL.endsWith('/')) return false;\n\n try {\n await axios.post(process.env.HEARTBEAT_URL);\n\n return true;\n } catch (e: any) {\n log.warn(`Failed to send heartbeat: ${e.message || e}`);\n return false;\n }\n}","import moment from 'moment';\n\nmoment.locale('en', {\n week: {\n dow: 1\n }\n});\n\nconst getNextRunTime = (startDate: moment.Moment, schedule: any, taskTime: moment.Moment): moment.Moment => {\n const [num, freq] = schedule.frequency.split('|');\n const targetDate = moment(startDate).add(num, freq as moment.unitOfTime.Base);\n\n if (schedule.frequencyPeriod === 'first') {\n targetDate.startOf(freq as moment.unitOfTime.StartOf);\n } else if (schedule.frequencyPeriod === 'last') {\n targetDate.endOf(freq as moment.unitOfTime.StartOf);\n }\n\n const isWeekday = targetDate.isoWeekday() > 0 && targetDate.isoWeekday() < 6;\n const isSaturday = targetDate.isoWeekday() === 6;\n\n // The weekday or weekend chosen should be within the same month as the target date\n if (schedule.frequencyDay === 'weekdays' && !isWeekday) {\n if ((targetDate.date() / 7) < 2) {\n targetDate.add(isSaturday ? 2 : 1, 'days');\n } else {\n targetDate.subtract(isSaturday ? 1 : 2, 'days');\n }\n } else if (schedule.frequencyDay === 'weekends' && isWeekday) {\n if ((targetDate.date() / 7) < 2) {\n targetDate.isoWeekday(6);\n } else {\n targetDate.isoWeekday(0);\n }\n }\n\n if (taskTime.isAfter(targetDate, 'minute')) {\n return getNextRunTime(targetDate, schedule, taskTime);\n }\n\n return targetDate;\n};\n\nexport const getScheduledReportRunTimes = (schedule: any, limit = 1, taskTime = moment()): moment.Moment[] => {\n if (!schedule.startDate || !schedule.enabled) return [];\n\n const originalStartDate = moment.utc(schedule.startDate);\n\n let startDate = originalStartDate;\n\n const includeStartDate = taskTime.isSameOrBefore(originalStartDate, 'minute');\n\n let runTimes = [] as moment.Moment[];\n\n if (includeStartDate) {\n runTimes = [originalStartDate];\n }\n\n const [, freq] = schedule.frequency.split('|');\n\n if (freq === 'once') {\n const nextRunTime = runTimes[0];\n\n // If this is now beyond the start date, return an empty array\n return taskTime.isAfter(nextRunTime, 'minute') ? [] : runTimes;\n }\n\n\n const scheduleRunTimes = Array.from(Array(includeStartDate ? limit - 1 : limit).keys()).map(() => {\n const nextRunTime = getNextRunTime(startDate, schedule, taskTime);\n\n startDate = nextRunTime.hour(originalStartDate.hour()).minute(originalStartDate.minute());\n\n return nextRunTime;\n });\n\n return [...runTimes, ...scheduleRunTimes];\n};\n","export * from './automation.js';\n","import { AutomationSource, AutomationService, AutomationServiceCategory } from 'types/automation.js';\n\nexport const automationSources: AutomationSource[] = ['ftp', 'email', 's3'];\n\nexport const automationServices: { key: AutomationService, friendly: string, category: AutomationServiceCategory }[] = [\n {\n friendly: 'Account Status',\n key: 'accountStatus',\n category: 'system'\n },\n {\n friendly: 'Autometer',\n key: 'autometer',\n category: 'company'\n },\n {\n friendly: 'BACnet',\n key: 'bacnet',\n category: 'account'\n },\n {\n friendly: 'CarloGavazziVmuc',\n key: 'carlogavazzivmuc',\n category: 'company'\n },\n {\n friendly: 'Carlo Gavazzi UWP',\n key: 'carlogavazziuwp',\n category: 'company'\n },\n {\n friendly: 'CXG Multi Column',\n key: 'cxgmulticolumn',\n category: 'company'\n },\n {\n friendly: 'ETN Multi Column',\n key: 'etnsinglecolumn',\n category: 'company'\n },\n {\n friendly: 'ETN Multi Column',\n key: 'etnmulticolumn',\n category: 'company'\n },\n {\n friendly: 'ETN Multi Time Column',\n key: 'etnmultitimecolumn',\n category: 'company'\n },\n {\n friendly: 'CXG Multi Time Column',\n key: 'cxgmultitimecolumn',\n category: 'company'\n },\n {\n friendly: 'CXG Single Column',\n key: 'cxgsinglecolumn',\n category: 'company'\n },\n {\n friendly: 'Deepki',\n key: 'deepki',\n category: 'company'\n },\n {\n friendly: 'Crown AMR',\n key: 'crownamr',\n category: 'company'\n },\n {\n friendly: 'eLogBooks',\n key: 'elogbooks',\n category: 'account'\n },\n {\n friendly: 'Elveco',\n key: 'elveco',\n category: 'company'\n },\n {\n friendly: 'Gridfetch',\n key: 'gridfetch',\n category: 'account'\n },\n {\n friendly: 'IMServ Data Vision',\n key: 'imserv',\n category: 'company'\n },\n {\n friendly: 'Meter.co.uk',\n key: 'meteruk',\n category: 'account'\n },\n {\n friendly: 'MJ Church',\n key: 'mjchurch',\n category: 'company'\n },\n {\n friendly: 'MSM Solutions',\n key: 'msmsolutions',\n category: 'company'\n },\n {\n friendly: 'Niagara N4',\n key: 'niagaran4',\n category: 'company'\n },\n {\n friendly: 'Octanise',\n key: 'octanise',\n category: 'company'\n },\n {\n friendly: 'Orsis',\n key: 'orsis',\n category: 'company'\n },\n {\n friendly: 'Schneider',\n key: 'schneider',\n category: 'company'\n },\n {\n friendly: 'Schneider EGX',\n key: 'schneideregx',\n category: 'company'\n },\n {\n friendly: 'Schneider Com X',\n key: 'schneidercomx',\n category: 'company'\n },\n {\n friendly: 'Sentinel',\n key: 'sentinel',\n category: 'company'\n },\n {\n friendly: 'Siemens',\n key: 'siemens',\n category: 'company'\n },\n {\n friendly: 'Siemens Tem',\n key: 'siemenstem',\n category: 'company'\n },\n {\n friendly: 'Smart Flow',\n key: 'smartflow',\n category: 'account'\n },\n {\n friendly: 'Smartvatten',\n key: 'smartvatten',\n category: 'account'\n },\n {\n friendly: 'SMS Energy',\n key: 'sms',\n category: 'company'\n },\n {\n friendly: 'SoClean',\n key: 'soclean',\n category: 'company'\n },\n {\n friendly: 'Solarman',\n key: 'solarman',\n category: 'account'\n },\n {\n friendly: 'Solis',\n key: 'solis',\n category: 'account'\n },\n {\n friendly: 'SSE Clarity',\n key: 'sse',\n category: 'company'\n },\n {\n friendly: 'Stark',\n key: 'stark',\n category: 'company'\n },\n {\n friendly: 'Synapsys',\n key: 'synapsys',\n category: 'company'\n }\n];\n","import { ObjectId } from 'mongodb';\n\nexport * from './account.js';\nexport * from './asset.js';\nexport * from './automation.js';\nexport * from './company.js';\nexport * from './scraperRun.js';\nexport * from './dataIngest.js';\nexport * from './entity.js';\nexport * from './email.js';\nexport * from './global.js';\nexport * from './invoice.js';\nexport * from './invoiceCapture.js';\nexport * from './log.js';\nexport * from './reading.js';\nexport * from './report.js';\nexport * from './supplier.js';\nexport { ObjectId };\n\nexport interface ETNPagedResponse<T = any> {\n data: T[];\n total: number;\n limit: number;\n skip: number;\n}\n"],"mappings":"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,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AACJ;;;ACnMA,IAAAC,kBAAyB;","names":["winston","axios","https","log","client","import_axios","axios","moment","import_axios","log","axios","import_moment","moment","import_mongodb"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/api.ts","../src/logger.ts","../src/db.ts","../src/slack.ts","../src/units.ts","../src/consumption.ts","../src/monitoring.ts","../src/reporting.ts","../src/utils/index.ts","../src/utils/automation.ts","../src/types/index.ts"],"sourcesContent":["import api from './api.js';\nimport logger from './logger.js';\nimport db from './db.js';\nimport slack from './slack.js';\nimport * as units from './units.js';\nimport * as consumption from './consumption.js';\nimport * as monitoring from './monitoring.js';\nimport * as reporting from './reporting.js';\nimport * as utils from './utils/index.js';\n\nexport { api, logger, consumption, monitoring, db, slack, units, reporting, utils };\n\nexport * from './types/index.js';\n","import axios from 'axios';\nimport type { AxiosRequestConfig, AxiosInstance, CreateAxiosDefaults, AxiosResponse } from 'axios';\nimport https from 'https';\n\nimport logger from './logger.js';\n\nimport type {\n Account,\n Asset,\n Automation,\n Entity,\n Company,\n DataIngest,\n Invoice,\n InvoiceCapture,\n Log,\n Reading,\n Report,\n Supplier\n} from './types/index.js';\n\nconst log = logger('etainablApi');\n\nexport interface ETNPagedResponse<T = any> {\n data: T[];\n total: number;\n limit: number;\n skip: number;\n}\n\nexport interface ETNReq {\n method: string;\n url: string;\n}\n\nfunction _handleResponse(req: ETNReq, res: AxiosResponse, isPaged = false) {\n if (!res) {\n throw new Error(`No response from API (${req.method} ${req.url})`);\n }\n\n if (res.status !== 200) {\n throw new Error(`${res.status} ${res.statusText} response from API (${req.method} ${req.url})`);\n }\n\n if (!res.data) {\n throw new Error(`No data from API (${req.method} ${req.url})`);\n }\n\n if (isPaged && !res.data.data) {\n throw new Error(`No data from API (${req.method} ${req.url})`);\n }\n\n return res;\n}\n\nconst factory = {\n getWithId:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) =>\n async (id: string, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'GET',\n url: `${endpoint}/${id}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n log.info(`API Request: ${req.method} ${process.env.ETAsINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n\n try {\n res = await etainablApi.get(req.url, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n console.log(`API Response: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n _handleResponse(req, res);\n\n return res.data;\n },\n get:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) =>\n async (options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'GET',\n url: `${endpoint}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n\n try {\n res = await etainablApi.get(req.url, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n console.log(`API Response: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n _handleResponse(req, res);\n\n return res.data;\n },\n list:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) =>\n async (options: AxiosRequestConfig = {}): Promise<ETNPagedResponse<T>> => {\n const req = {\n method: 'GET',\n url: `${endpoint}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n\n try {\n res = await etainablApi.get(req.url, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n console.log(`API Response: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n _handleResponse(req, res, true);\n\n return res.data;\n },\n update:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) =>\n async (id: string, data: any, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'PATCH',\n url: `${endpoint}/${id}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n\n try {\n res = await etainablApi.patch(req.url, data, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n _handleResponse(req, res);\n\n return res.data;\n },\n create:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) =>\n async (data: any, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'POST',\n url: `${endpoint}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n\n try {\n res = await etainablApi.post(req.url, data, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n _handleResponse(req, res);\n\n return res.data;\n },\n remove:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, postEndpoint?: string) =>\n async (id: string, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: 'DELETE',\n url: `${endpoint}/${id}${postEndpoint ? `/${postEndpoint}` : ''}`\n };\n\n let res: AxiosResponse;\n\n log.info(`API Request: ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n try {\n res = await etainablApi.delete(req.url, options);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n _handleResponse(req, res);\n\n return res.data;\n },\n customWithId:\n <T = any>(etainablApi: AxiosInstance, method: string, endpoint: string, postEndpoint?: string) =>\n async (id: string, data: any, options: AxiosRequestConfig = {}): Promise<T> => {\n const req = {\n method: method,\n url: `${endpoint}/${id}${postEndpoint ? `/${postEndpoint}` : ''}`,\n data,\n ...options\n };\n\n log.info(`API Request (Custom): ${req.method} ${process.env.ETAINABL_API_URL}/${req.url}`);\n\n let res: AxiosResponse;\n\n try {\n res = await etainablApi.request(req);\n } catch (e: any) {\n if (e.response?.data) throw new Error(`API error response: ${JSON.stringify(e.response.data)}`);\n throw e;\n }\n\n _handleResponse(req, res);\n\n return res.data;\n }\n};\n\n// ETN Sub Endpoints\n// e.g. /assets/:id/documents/:documentId\nconst subFactory = {\n // e.g. POST /assets/:id/documents\n create:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, subEndpoint: string) =>\n async (id: string, data: any, options: AxiosRequestConfig = {}) => {\n const subUrl = `${id}/${subEndpoint}`;\n return factory.create<T>(etainablApi, endpoint, subUrl)(data, options);\n },\n // e.g. PATCH /assets/:id/documents/:documentId\n update:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, subEndpoint: string) =>\n async (id: string, subId: string, data: any, options: AxiosRequestConfig = {}) => {\n const subUrl = `${subEndpoint}/${subId}`;\n\n return factory.update<T>(etainablApi, endpoint, subUrl)(id, data, options);\n },\n // e.g. DELETE /assets/:id/documents/:documentId\n remove:\n <T = any>(etainablApi: AxiosInstance, endpoint: string, subEndpoint: string) =>\n async (id: string, subId: string, options: AxiosRequestConfig = {}) => {\n const subUrl = `${subEndpoint}/${subId}`;\n\n return factory.remove<T>(etainablApi, endpoint, subUrl)(id, options);\n }\n};\n\ninterface AuthOptions {\n key?: string;\n token?: string;\n}\n\nexport default (auth: AuthOptions, instanceOptions: CreateAxiosDefaults = {}) => {\n try {\n const headers: any = {};\n\n if (auth.key) {\n headers['x-key'] = auth.key;\n } else if (auth.token) {\n headers['Authorization'] = auth.token;\n } else {\n headers['x-key'] = process.env.ETAINABL_API_KEY;\n }\n\n const etainablApi = axios.create({\n baseURL: process.env.ETAINABL_API_URL,\n timeout: 300000,\n httpsAgent: new https.Agent({ keepAlive: true }),\n headers,\n ...instanceOptions\n });\n\n return {\n instance: etainablApi,\n\n // accounts\n getAccount: factory.getWithId<Account<string>>(etainablApi, 'accounts'),\n listAccounts: factory.list<Account<string>>(etainablApi, 'accounts'),\n updateAccount: factory.update<Account<string>>(etainablApi, 'accounts'),\n createAccount: factory.create<Account<string>>(etainablApi, 'accounts'),\n removeAccount: factory.remove<Account<string>>(etainablApi, 'accounts'),\n getAccountSchema: factory.get(etainablApi, 'accounts', 'schema'),\n invalidateAccountCache: factory.customWithId(etainablApi, 'put', 'accounts', 'invalidate-cache'),\n\n // assets\n getAsset: factory.getWithId<Asset<string>>(etainablApi, 'assets'),\n listAssets: factory.list<Asset<string>>(etainablApi, 'assets'),\n updateAsset: factory.update<Asset<string>>(etainablApi, 'assets'),\n createAsset: factory.create<Asset<string>>(etainablApi, 'assets'),\n removeAsset: factory.remove<Asset<string>>(etainablApi, 'assets'),\n getAssetSchema: factory.get(etainablApi, 'assets', 'schema'),\n\n // assetGroups\n getAssetGroup: factory.getWithId(etainablApi, 'asset-groups'),\n listAssetGroups: factory.list(etainablApi, 'asset-groups'),\n updateAssetGroup: factory.update(etainablApi, 'asset-groups'),\n createAssetGroup: factory.create(etainablApi, 'asset-groups'),\n removeAssetGroup: factory.remove(etainablApi, 'asset-groups'),\n getAssetGroupAssets: factory.getWithId(etainablApi, 'asset-groups', 'assets'),\n getAssetGroupSchema: factory.get(etainablApi, 'asset-groups', 'schema'),\n\n // automation\n getAutomation: factory.getWithId<Automation<string>>(etainablApi, 'automation'),\n listAutomations: factory.list<Automation<string>>(etainablApi, 'automation'),\n updateAutomation: factory.update<Automation<string>>(etainablApi, 'automation'),\n createAutomation: factory.create<Automation<string>>(etainablApi, 'automation'),\n removeAutomation: factory.remove<Automation<string>>(etainablApi, 'automation'),\n createAutomationLog: subFactory.create(etainablApi, 'automation', 'logs'),\n updateAutomationLog: subFactory.update(etainablApi, 'automation', 'logs'),\n removeAutomationLog: subFactory.remove(etainablApi, 'automation', 'logs'),\n\n // company\n getCompany: factory.getWithId<Company<string>>(etainablApi, 'companies'),\n\n // consumption\n getConsumption: factory.getWithId(etainablApi, 'consumptions'),\n listConsumptions: factory.list(etainablApi, 'consumptions'),\n updateConsumption: factory.update(etainablApi, 'consumptions'),\n createConsumption: factory.create(etainablApi, 'consumptions'),\n removeConsumption: factory.remove(etainablApi, 'consumptions'),\n getConsumptionSchema: factory.get(etainablApi, 'consumptions', 'schema'),\n\n // emails\n getEmail: factory.getWithId(etainablApi, 'emails'),\n listEmails: factory.list(etainablApi, 'emails'),\n updateEmail: factory.update(etainablApi, 'emails'),\n createEmail: factory.create(etainablApi, 'emails'),\n removeEmail: factory.remove(etainablApi, 'emails'),\n\n // emission factors\n getEmissionFactor: factory.getWithId(etainablApi, 'emission-factors'),\n listEmissionFactors: factory.list(etainablApi, 'emission-factors'),\n updateEmissionFactor: factory.update(etainablApi, 'emission-factors'),\n createEmissionFactor: factory.create(etainablApi, 'emission-factors'),\n removeEmissionFactor: factory.remove(etainablApi, 'emission-factors'),\n\n // entity\n getEntity: factory.getWithId<Entity<string>>(etainablApi, 'entities'),\n listEntities: factory.list<Entity<string>>(etainablApi, 'entities'),\n updateEntity: factory.update<Entity<string>>(etainablApi, 'entities'),\n createEntity: factory.create<Entity<string>>(etainablApi, 'entities'),\n removeEntity: factory.remove<Entity<string>>(etainablApi, 'entities'),\n getEntitiesSchema: factory.get(etainablApi, 'entities', 'schema'),\n\n // logs\n getLog: factory.getWithId<Log<string>>(etainablApi, 'logs'),\n listLogs: factory.list<Log<string>>(etainablApi, 'logs'),\n updateLog: factory.update<Log<string>>(etainablApi, 'logs'),\n createLog: factory.create<Log<string>>(etainablApi, 'logs'),\n removeLog: factory.remove<Log<string>>(etainablApi, 'logs'),\n\n // readings\n getReading: factory.getWithId<Reading<string>>(etainablApi, 'readings'),\n listReadings: factory.list<Reading<string>>(etainablApi, 'readings'),\n updateReading: factory.update<Reading<string>>(etainablApi, 'readings'),\n createReading: factory.create<Reading<string>>(etainablApi, 'readings'),\n removeReading: factory.remove<Reading<string>>(etainablApi, 'readings'),\n getReadingSchema: factory.get(etainablApi, 'readings', 'schema'),\n\n // reports\n getReport: factory.getWithId<Report<string>>(etainablApi, 'reports'),\n listReports: factory.list<Report<string>>(etainablApi, 'reports'),\n updateReport: factory.update<Report<string>>(etainablApi, 'reports'),\n createReport: factory.create<Report<string>>(etainablApi, 'reports'),\n removeReport: factory.remove<Report<string>>(etainablApi, 'reports'),\n sendReport: factory.customWithId(etainablApi, 'post', 'reports', 'send'),\n\n // report templates\n getReportTemplate: factory.getWithId(etainablApi, 'report-templates'),\n listReportTemplates: factory.list(etainablApi, 'report-templates'),\n updateReportTemplate: factory.update(etainablApi, 'report-templates'),\n createReportTemplate: factory.create(etainablApi, 'report-templates'),\n removeReportTemplate: factory.remove(etainablApi, 'report-templates'),\n\n // scheduled reports\n getScheduledReport: factory.getWithId(etainablApi, 'scheduled-reports'),\n listScheduledReports: factory.list(etainablApi, 'scheduled-reports'),\n updateScheduledReport: factory.update(etainablApi, 'scheduled-reports'),\n createScheduledReport: factory.create(etainablApi, 'scheduled-reports'),\n removeScheduledReport: factory.remove(etainablApi, 'scheduled-reports'),\n sendScheduledReport: factory.customWithId(etainablApi, 'post', 'scheduled-reports', 'send'),\n\n // invoices\n getInvoice: factory.getWithId<Invoice<string>>(etainablApi, 'invoices'),\n listInvoices: factory.list<Invoice<string>>(etainablApi, 'invoices'),\n updateInvoice: factory.update<Invoice<string>>(etainablApi, 'invoices'),\n createInvoice: factory.create<Invoice<string>>(etainablApi, 'invoices'),\n removeInvoice: factory.remove<Invoice<string>>(etainablApi, 'invoices'),\n getInvoiceSchema: factory.get(etainablApi, 'invoices', 'schema'),\n\n // invoice capture\n getInvoiceCapture: factory.getWithId<InvoiceCapture<string>>(etainablApi, 'invoice-capture'),\n listInvoicesCapture: factory.list<InvoiceCapture<string>>(etainablApi, 'invoice-capture'),\n updateInvoiceCapture: factory.update<InvoiceCapture<string>>(etainablApi, 'invoice-capture'),\n createInvoiceCapture: factory.create<InvoiceCapture<string>>(etainablApi, 'invoice-capture'),\n removeInvoiceCapture: factory.remove<InvoiceCapture<string>>(etainablApi, 'invoice-capture'),\n getInvoiceCaptureSchema: factory.get(etainablApi, 'invoice-capture', 'schema'),\n\n //suppliers\n listSuppliers: factory.list<Supplier<string>>(etainablApi, 'suppliers'),\n getSupplierSchema: factory.get(etainablApi, 'suppliers', 'schema'),\n\n // import templates\n getImportTemplate: factory.getWithId(etainablApi, 'import-templates'),\n\n //data imports\n listDataIngest: factory.list<DataIngest<string>>(etainablApi, 'data-ingests'),\n updateDataIngest: factory.update<DataIngest<string>>(etainablApi, 'data-ingests'),\n createDataIngest: factory.create<DataIngest<string>>(etainablApi, 'data-ingests')\n };\n } catch (e) {\n log.error(e);\n throw e;\n }\n};\n","import winston from 'winston';\n\nexport default (namespace: string) => winston.createLogger({\n level: 'debug',\n format: winston.format.combine(\n winston.format.timestamp(),\n winston.format.json()\n ),\n defaultMeta: { service: process.env.AWS_LAMBDA_FUNCTION_NAME, script: namespace },\n transports: [\n new winston.transports.Console()\n ]\n});\n","import { MongoClient, Db } from 'mongodb';\nimport logger from './logger.js';\n\nconst log = logger('dbHelpers');\n\nlet cachedDb: Db;\n\nasync function connectToDatabase(retryAttempt: number = 1): Promise<Db> {\n if (!process.env.ETAINABL_DB_URL) throw new Error(\"ETAINABL_DB_URL is not set\");\n if (!process.env.AWS_ACCESS_KEY_ID) throw new Error(\"AWS_ACCESS_KEY_ID is not set\");\n if (!process.env.AWS_SECRET_ACCESS_KEY) throw new Error(\"AWS_SECRET_ACCESS_KEY is not set\");\n\n if (cachedDb) {\n log.debug('Using cached MongoDB connection.');\n return Promise.resolve(cachedDb);\n }\n \n const uri = `mongodb+srv://${process.env.ETAINABL_DB_URL}`;\n \n try {\n if (process.env.DB_BASIC_AUTH === 'true') {\n log.debug('Connecting to MongoDB server... (Auth: Basic)');\n\n const client = new MongoClient(uri);\n await client.connect();\n\n log.debug('Connected successfully to MongoDB server! (Auth: Basic)');\n\n cachedDb = client.db('etainabl');\n\n return cachedDb;\n }\n\n log.debug('Connecting to MongoDB server... (Auth: AWS)');\n\n const client = new MongoClient(uri, {\n auth: {\n username: process.env.AWS_ACCESS_KEY_ID,\n password: process.env.AWS_SECRET_ACCESS_KEY\n },\n authSource: '$external',\n authMechanism: 'MONGODB-AWS'\n });\n\n await client.connect();\n\n log.debug('Connected successfully to MongoDB server! (Auth: AWS)');\n\n cachedDb = client.db('etainabl');\n\n return cachedDb;\n\n } catch (e: any) {\n // Retry\n if (retryAttempt > 5) {\n console.log(`Error connecting to MongoDB server after 5 attempts...`);\n throw e;\n }\n\n console.log(`MongoDB Connection error: ${e.message}`);\n\n console.log(`Error connecting to MongoDB server... Retrying in 3 seconds... (Attempt ${retryAttempt})`);\n return connectToDatabase(retryAttempt + 1);\n }\n}\n\nexport default {\n connectToDatabase\n};","import axios from 'axios';\n\nconst postMessage = async (message: string) => {\n const url = 'https://hooks.slack.com/services/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';\n const data = {\n text: `[${(process.env.ENV || '').toUpperCase()}][${process.env.AWS_LAMBDA_FUNCTION_NAME}] ${message}`\n };\n const headers = {\n 'Content-Type': 'application/json'\n };\n return axios.post(url, data, { headers });\n};\n\nexport default {\n postMessage\n}","import type { UtilityType } from 'types/global.js';\n\ninterface Item {\n units?: string | null;\n unit?: string | null;\n factor?: number | null;\n value: number;\n [key: string]: any;\n}\n\nexport type AccountType = UtilityType;\nexport type ETNUnit =\n | 'kwh'\n | 'kg'\n | 'm3'\n | 'lbs'\n | 'tonnes'\n | 'wh'\n | 'mwh'\n | 'ft3'\n | 'hcf'\n | 'm3/h'\n | 'qty'\n | 'l'\n | 'C'\n | 'mcuf'\n | 'hcuf'\n | 'tcuf'\n | 'ocuf'\n | 'hm3'\n | 'tm3'\n | 'nm3';\nexport type BaseUnit = 'kwh' | 'm3' | 'C' | 'kg' | 'm3/h' | 'l';\nexport const accountTypeMap: { [key: string]: BaseUnit } = {\n electricity: 'kwh',\n gas: 'kwh',\n water: 'm3',\n waste: 'kg',\n solar: 'kwh',\n heating: 'kwh',\n flow: 'm3/h',\n cooling: 'kwh',\n temperature: 'C',\n oil: 'l'\n};\n\nconst unitConversionFactors: { [key: string]: any } = {\n kwh: {\n kwh: 1,\n mwh: 1000,\n wh: 0.001,\n m3: (39 * 1.02264) / 3.6,\n ft3: (0.0283 * 39 * 1.02264) / 3.6,\n hcf: (2.83 * 39 * 1.02264) / 3.6\n },\n m3: {\n m3: 1,\n l: 0.001\n },\n C: {\n C: 1\n },\n kg: {\n kg: 1,\n lbs: 0.45359237,\n tonnes: 1000\n },\n 'm3/h': {\n 'm3/h': 1\n }\n};\n\nexport const accountTypeUnitMap: { [key: string]: ETNUnit[] } = {\n electricity: ['kwh', 'mwh', 'wh'],\n gas: ['kwh', 'm3', 'ft3', 'hcf'],\n water: ['m3', 'l'],\n waste: ['kg', 'lbs', 'tonnes'],\n solar: ['kwh', 'mwh', 'wh'],\n heating: ['kwh', 'mwh', 'wh'],\n flow: ['m3/h'],\n cooling: ['kwh', 'mwh', 'wh'],\n temperature: ['C'],\n oil: ['l']\n};\n\n// Convert units to base format\nexport const convertItems = (items: Item[], type: AccountType, defaultUnits: ETNUnit | undefined, accountFactor: number | undefined): any => {\n if (!type) throw new Error('Account type is required');\n\n const baseUnit = accountTypeMap[type];\n if (!baseUnit) throw new Error(`Account type ${type} is not supported`);\n\n const convertedItems = items.map(item => {\n const factor = item.factor || accountFactor || 1;\n const units = item.units || item.unit || defaultUnits || baseUnit;\n const convertedValue = item.value * _getConversionFactor(units, baseUnit) * factor;\n return { ...item, value: convertedValue, units: baseUnit };\n });\n\n return convertedItems;\n};\n\nconst _getConversionFactor = (fromUnit: string = 'kwh', toUnit: string) => {\n const conversionFactors = unitConversionFactors[toUnit];\n\n if (!conversionFactors) {\n throw new Error(`Conversion factor base unit ${toUnit} is not defined`);\n }\n\n if (!conversionFactors[fromUnit]) {\n throw new Error(`Conversion factor from unit ${fromUnit} is not defined`);\n }\n\n return conversionFactors[fromUnit];\n};\n\nexport const checkAccountTypeVsUnits = (type: string, unit: string, additionalLog: number | '' = '') => {\n if (!type) throw new Error('Account type is required');\n if (!unit) throw new Error('Unit is required');\n\n const parsedType = type.toLowerCase().trim();\n\n const accountTypeUnits = accountTypeUnitMap[parsedType];\n if (!accountTypeUnits) throw new Error(`Account type \"${parsedType}\" is not supported ${additionalLog}`);\n\n const parsedUnit = unit.toLowerCase().trim() as ETNUnit;\n\n if (!accountTypeUnits.includes(parsedUnit)) {\n throw new Error(`Account type \"${parsedType}\" does not support unit \"${parsedUnit}\" ${additionalLog}`);\n }\n\n return { type: parsedType as AccountType, unit: parsedUnit };\n};\n","import moment from 'moment';\n\ninterface ConsumptionData {\n date: Date;\n consumption: number;\n}\n\ninterface DayNightConsumption {\n dayConsumption: number,\n nightConsumption: number,\n consumption: number\n}\n\nexport const dayNightConsumption = (data: ConsumptionData[]) => data.reduce((acc: DayNightConsumption, item: ConsumptionData): DayNightConsumption => {\n const hour = moment.utc(item.date).hour(); // End Time of HH consumption period\n\n if (hour >= 0 && hour < 7) {\n acc.nightConsumption += item.consumption;\n } else {\n acc.dayConsumption += item.consumption;\n }\n\n acc.consumption += item.consumption;\n\n return acc;\n}, {\n dayConsumption: 0,\n nightConsumption: 0,\n consumption: 0\n});\n\nexport const calcMaxConsumptionValue = (data: ConsumptionData[]) => Math.max(...data.map((item: ConsumptionData) => item.consumption));\n\nexport const calcMaxDemand = (data: ConsumptionData[]) => calcMaxConsumptionValue(data) * 2;\n\nexport const calcPeakLoad = (consumption: number, maxDemand: number, startDate: string | moment.Moment, endDate: string | moment.Moment) => {\n const days = Math.ceil(moment(endDate).diff(moment(startDate), 'days', true));\n\n return maxDemand === 0 ? 0 : ((consumption / (maxDemand * 24 * days)) * 100);\n};","import axios from 'axios';\n\nimport logger from './logger.js';\n\nconst log = logger('monitoring');\n\nexport const sendHeartbeat = async () => {\n if (!process.env.HEARTBEAT_URL || process.env.HEARTBEAT_URL.endsWith('/')) return false;\n\n try {\n await axios.post(process.env.HEARTBEAT_URL);\n\n return true;\n } catch (e: any) {\n log.warn(`Failed to send heartbeat: ${e.message || e}`);\n return false;\n }\n}","import moment from 'moment';\n\nmoment.locale('en', {\n week: {\n dow: 1\n }\n});\n\nconst getNextRunTime = (startDate: moment.Moment, schedule: any, taskTime: moment.Moment): moment.Moment => {\n const [num, freq] = schedule.frequency.split('|');\n const targetDate = moment(startDate).add(num, freq as moment.unitOfTime.Base);\n\n if (schedule.frequencyPeriod === 'first') {\n targetDate.startOf(freq as moment.unitOfTime.StartOf);\n } else if (schedule.frequencyPeriod === 'last') {\n targetDate.endOf(freq as moment.unitOfTime.StartOf);\n }\n\n const isWeekday = targetDate.isoWeekday() > 0 && targetDate.isoWeekday() < 6;\n const isSaturday = targetDate.isoWeekday() === 6;\n\n // The weekday or weekend chosen should be within the same month as the target date\n if (schedule.frequencyDay === 'weekdays' && !isWeekday) {\n if ((targetDate.date() / 7) < 2) {\n targetDate.add(isSaturday ? 2 : 1, 'days');\n } else {\n targetDate.subtract(isSaturday ? 1 : 2, 'days');\n }\n } else if (schedule.frequencyDay === 'weekends' && isWeekday) {\n if ((targetDate.date() / 7) < 2) {\n targetDate.isoWeekday(6);\n } else {\n targetDate.isoWeekday(0);\n }\n }\n\n if (taskTime.isAfter(targetDate, 'minute')) {\n return getNextRunTime(targetDate, schedule, taskTime);\n }\n\n return targetDate;\n};\n\nexport const getScheduledReportRunTimes = (schedule: any, limit = 1, taskTime = moment()): moment.Moment[] => {\n if (!schedule.startDate || !schedule.enabled) return [];\n\n const originalStartDate = moment.utc(schedule.startDate);\n\n let startDate = originalStartDate;\n\n const includeStartDate = taskTime.isSameOrBefore(originalStartDate, 'minute');\n\n let runTimes = [] as moment.Moment[];\n\n if (includeStartDate) {\n runTimes = [originalStartDate];\n }\n\n const [, freq] = schedule.frequency.split('|');\n\n if (freq === 'once') {\n const nextRunTime = runTimes[0];\n\n // If this is now beyond the start date, return an empty array\n return taskTime.isAfter(nextRunTime, 'minute') ? [] : runTimes;\n }\n\n\n const scheduleRunTimes = Array.from(Array(includeStartDate ? limit - 1 : limit).keys()).map(() => {\n const nextRunTime = getNextRunTime(startDate, schedule, taskTime);\n\n startDate = nextRunTime.hour(originalStartDate.hour()).minute(originalStartDate.minute());\n\n return nextRunTime;\n });\n\n return [...runTimes, ...scheduleRunTimes];\n};\n","export * from './automation.js';\n","import { AutomationSource, AutomationService, AutomationServiceCategory } from 'types/automation.js';\n\nexport const automationSources: AutomationSource[] = ['ftp', 'email', 's3'];\n\nexport const automationServices: { key: AutomationService, friendly: string, category: AutomationServiceCategory }[] = [\n {\n friendly: 'Account Status',\n key: 'accountStatus',\n category: 'system'\n },\n {\n friendly: 'Autometer',\n key: 'autometer',\n category: 'company'\n },\n {\n friendly: 'BACnet',\n key: 'bacnet',\n category: 'account'\n },\n {\n friendly: 'CarloGavazziVmuc',\n key: 'carlogavazzivmuc',\n category: 'company'\n },\n {\n friendly: 'Carlo Gavazzi UWP',\n key: 'carlogavazziuwp',\n category: 'company'\n },\n {\n friendly: 'CXG Multi Column',\n key: 'cxgmulticolumn',\n category: 'company'\n },\n {\n friendly: 'ETN Single Column',\n key: 'etnsinglecolumn',\n category: 'company'\n },\n {\n friendly: 'ETN Multi Column',\n key: 'etnmulticolumn',\n category: 'company'\n },\n {\n friendly: 'ETN Multi Time Column',\n key: 'etnmultitimecolumn',\n category: 'company'\n },\n {\n friendly: 'CXG Multi Time Column',\n key: 'cxgmultitimecolumn',\n category: 'company'\n },\n {\n friendly: 'CXG Single Column',\n key: 'cxgsinglecolumn',\n category: 'company'\n },\n {\n friendly: 'Deepki',\n key: 'deepki',\n category: 'company'\n },\n {\n friendly: 'Crown AMR',\n key: 'crownamr',\n category: 'company'\n },\n {\n friendly: 'eLogBooks',\n key: 'elogbooks',\n category: 'account'\n },\n {\n friendly: 'Elveco',\n key: 'elveco',\n category: 'company'\n },\n {\n friendly: 'Gridfetch',\n key: 'gridfetch',\n category: 'account'\n },\n {\n friendly: 'IMServ Data Vision',\n key: 'imserv',\n category: 'company'\n },\n {\n friendly: 'Meter.co.uk',\n key: 'meteruk',\n category: 'account'\n },\n {\n friendly: 'MJ Church',\n key: 'mjchurch',\n category: 'company'\n },\n {\n friendly: 'MSM Solutions',\n key: 'msmsolutions',\n category: 'company'\n },\n {\n friendly: 'Niagara N4',\n key: 'niagaran4',\n category: 'company'\n },\n {\n friendly: 'Octanise',\n key: 'octanise',\n category: 'company'\n },\n {\n friendly: 'Orsis',\n key: 'orsis',\n category: 'company'\n },\n {\n friendly: 'Schneider',\n key: 'schneider',\n category: 'company'\n },\n {\n friendly: 'Schneider EGX',\n key: 'schneideregx',\n category: 'company'\n },\n {\n friendly: 'Schneider Com X',\n key: 'schneidercomx',\n category: 'company'\n },\n {\n friendly: 'Sentinel',\n key: 'sentinel',\n category: 'company'\n },\n {\n friendly: 'Siemens',\n key: 'siemens',\n category: 'company'\n },\n {\n friendly: 'Siemens Tem',\n key: 'siemenstem',\n category: 'company'\n },\n {\n friendly: 'Smart Flow',\n key: 'smartflow',\n category: 'account'\n },\n {\n friendly: 'Smartvatten',\n key: 'smartvatten',\n category: 'account'\n },\n {\n friendly: 'SMS Energy',\n key: 'sms',\n category: 'company'\n },\n {\n friendly: 'SoClean',\n key: 'soclean',\n category: 'company'\n },\n {\n friendly: 'Solarman',\n key: 'solarman',\n category: 'account'\n },\n {\n friendly: 'Solis',\n key: 'solis',\n category: 'account'\n },\n {\n friendly: 'SSE Clarity',\n key: 'sse',\n category: 'company'\n },\n {\n friendly: 'Stark',\n key: 'stark',\n category: 'company'\n },\n {\n friendly: 'Synapsys',\n key: 'synapsys',\n category: 'company'\n }\n];\n","import { ObjectId } from 'mongodb';\n\nexport * from './account.js';\nexport * from './asset.js';\nexport * from './automation.js';\nexport * from './company.js';\nexport * from './scraperRun.js';\nexport * from './dataIngest.js';\nexport * from './entity.js';\nexport * from './email.js';\nexport * from './global.js';\nexport * from './invoice.js';\nexport * from './invoiceCapture.js';\nexport * from './log.js';\nexport * from './reading.js';\nexport * from './report.js';\nexport * from './supplier.js';\nexport { ObjectId };\n\nexport interface ETNPagedResponse<T = any> {\n data: T[];\n total: number;\n limit: number;\n skip: number;\n}\n"],"mappings":"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A,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AAAA,EACA;AAAA,IACI,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,EACd;AACJ;;;ACnMA,IAAAC,kBAAyB;","names":["winston","axios","https","log","client","import_axios","axios","moment","import_axios","log","axios","import_moment","moment","import_mongodb"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@etainabl/nodejs-sdk",
3
- "version": "1.3.17",
3
+ "version": "1.3.19",
4
4
  "type": "module",
5
5
  "main": "./dist/cjs/index.js",
6
6
  "module": "./dist/esm/index.mjs",