@etainabl/nodejs-sdk 1.3.34 → 1.3.36

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
@@ -228,6 +228,11 @@ var api_default = (auth, instanceOptions = {}) => {
228
228
  removeAutomationLog: subFactory.remove(etainablApi, "automation", "logs"),
229
229
  // company
230
230
  getCompany: factory.getWithId(etainablApi, "companies"),
231
+ getCompanyInvoiceValidationRules: factory.getWithId(
232
+ etainablApi,
233
+ "companies",
234
+ "invoice-validation-rules"
235
+ ),
231
236
  // consumption
232
237
  getConsumption: factory.getWithId(etainablApi, "consumptions"),
233
238
  listConsumptions: factory.list(etainablApi, "consumptions"),
@@ -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 InvoiceValidation,\n Log,\n Reading,\n Report,\n Supplier\n} from './types/index.js';\nimport { start } from 'repl';\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 // invoice validation\n getInvoiceValidation: factory.getWithId<InvoiceValidation<string>>(etainablApi, 'invoice-validation'),\n listInvoicesValidation: factory.list<InvoiceValidation<string>>(etainablApi, 'invoice-validation'),\n updateInvoiceValidation: factory.update<InvoiceValidation<string>>(etainablApi, 'invoice-validation'),\n createInvoiceValidation: factory.create<InvoiceValidation<string>>(etainablApi, 'invoice-validation'),\n removeInvoiceValidation: factory.remove<InvoiceValidation<string>>(etainablApi, 'invoice-validation'),\n getInvoiceValidationSchema: factory.get(etainablApi, 'invoice-validation', '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: 'Elveco 2108',\n key: 'elveco2108',\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 friendly: 'Trendlogs',\n key: 'trendlogs',\n category: 'company'\n },\n {\n friendly: 'Trio',\n key: 'trio',\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 './invoiceValidation.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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","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 CompanyInvoiceValidationRule,\n DataIngest,\n Invoice,\n InvoiceCapture,\n InvoiceValidation,\n Log,\n Reading,\n Report,\n Supplier\n} from './types/index.js';\nimport { start } from 'repl';\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 getCompanyInvoiceValidationRules: factory.getWithId<CompanyInvoiceValidationRule<string>[]>(\n etainablApi,\n 'companies',\n 'invoice-validation-rules'\n ),\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 // invoice validation\n getInvoiceValidation: factory.getWithId<InvoiceValidation<string>>(etainablApi, 'invoice-validation'),\n listInvoicesValidation: factory.list<InvoiceValidation<string>>(etainablApi, 'invoice-validation'),\n updateInvoiceValidation: factory.update<InvoiceValidation<string>>(etainablApi, 'invoice-validation'),\n createInvoiceValidation: factory.create<InvoiceValidation<string>>(etainablApi, 'invoice-validation'),\n removeInvoiceValidation: factory.remove<InvoiceValidation<string>>(etainablApi, 'invoice-validation'),\n getInvoiceValidationSchema: factory.get(etainablApi, 'invoice-validation', '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: 'Elveco 2108',\n key: 'elveco2108',\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 friendly: 'Trendlogs',\n key: 'trendlogs',\n category: 'company'\n },\n {\n friendly: 'Trio',\n key: 'trio',\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 './invoiceValidation.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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","names":["log","client","axios","axios","log","axios","moment"]}
package/dist/index.d.cts CHANGED
@@ -342,6 +342,34 @@ interface Automation<IDType = ObjectId | string> {
342
342
  companyId: IDType;
343
343
  }
344
344
 
345
+ interface InvoiceValidationRule<IDType = ObjectId | string> {
346
+ _id: IDType;
347
+ key: string;
348
+ name: string;
349
+ description?: string;
350
+ defaultEnabled: boolean;
351
+ defaultThresholds: Record<string, any>;
352
+ defaultStatus: 'pass' | 'warn' | 'fail';
353
+ category: string;
354
+ companyId?: IDType;
355
+ }
356
+ interface InvoiceValidationResults<IDType = ObjectId | string> {
357
+ invoiceValidationRuleId: IDType;
358
+ comment: string;
359
+ status: 'passed' | 'warning' | 'failed' | 'error';
360
+ checkedAt: Date;
361
+ }
362
+ interface InvoiceValidation<IDType = ObjectId | string> {
363
+ _id: IDType;
364
+ status: 'pending' | 'passed' | 'warning' | 'failed' | 'error';
365
+ results: InvoiceValidationResults<IDType>[];
366
+ invoiceCaptureId: IDType;
367
+ invoiceId?: IDType;
368
+ batchId?: string;
369
+ companyId: IDType;
370
+ userSub: string;
371
+ }
372
+
345
373
  interface SupplierPortals<IDType = ObjectId | string> {
346
374
  supplierId: IDType;
347
375
  portal: Portal;
@@ -357,12 +385,13 @@ interface DefaultSources {
357
385
  gas: 'invoice' | 'consumption' | 'reading';
358
386
  water: 'invoice' | 'consumption' | 'reading';
359
387
  }
360
- interface InvoiceValidationSettings<IDType = ObjectId | string> {
388
+ interface CompanyInvoiceValidationSettings<IDType = ObjectId | string> {
361
389
  enabled: boolean;
362
390
  invoiceValidationRuleId: IDType;
363
- thresholds: object;
391
+ thresholds: Record<string, any>;
364
392
  status: 'pass' | 'warn' | 'fail';
365
393
  }
394
+ type CompanyInvoiceValidationRule<IDType = ObjectId | string> = InvoiceValidationRule<IDType> & Pick<CompanyInvoiceValidationSettings<IDType>, 'enabled' | 'thresholds' | 'status'>;
366
395
  interface CompanySettings<IDType = ObjectId | string> {
367
396
  showLogo?: boolean;
368
397
  invoiceCategories?: any[];
@@ -376,7 +405,8 @@ interface CompanySettings<IDType = ObjectId | string> {
376
405
  supplierPortals?: SupplierPortals[];
377
406
  defaultSources?: DefaultSources;
378
407
  scraperCounter?: number;
379
- invoiceValidationSettings?: InvoiceValidationSettings<IDType>;
408
+ invoiceValidationSettings?: CompanyInvoiceValidationSettings<IDType>;
409
+ autoInvoiceValidation?: boolean;
380
410
  }
381
411
  interface Company<IDType = ObjectId | string> {
382
412
  _id: IDType;
@@ -604,23 +634,6 @@ interface InvoiceCapture<IDType = ObjectId | string> {
604
634
  userSub: string;
605
635
  }
606
636
 
607
- interface InvoiceValidationResults<IDType = ObjectId | string> {
608
- invoiceValidationRuleId: IDType;
609
- comment: string;
610
- status: 'passed' | 'warning' | 'failed' | 'error';
611
- checkedAt: Date;
612
- }
613
- interface InvoiceValidation<IDType = ObjectId | string> {
614
- _id: IDType;
615
- status: 'pending' | 'passed' | 'warning' | 'failed' | 'error';
616
- results: InvoiceValidationResults<IDType>[];
617
- invoiceCaptureId: IDType;
618
- invoiceId?: IDType;
619
- batchId?: string;
620
- companyId: IDType;
621
- userSub: string;
622
- }
623
-
624
637
  interface Log<IDType = ObjectId | string> {
625
638
  _id: IDType;
626
639
  message: string;
@@ -778,6 +791,7 @@ declare const _default$3: (auth: AuthOptions, instanceOptions?: CreateAxiosDefau
778
791
  updateAutomationLog: (id: string, subId: string, data: any, options?: AxiosRequestConfig<any>) => Promise<any>;
779
792
  removeAutomationLog: (id: string, subId: string, options?: AxiosRequestConfig<any>) => Promise<any>;
780
793
  getCompany: (id: string, options?: AxiosRequestConfig<any>) => Promise<Company<string>>;
794
+ getCompanyInvoiceValidationRules: (id: string, options?: AxiosRequestConfig<any>) => Promise<CompanyInvoiceValidationRule<string>[]>;
781
795
  getConsumption: (id: string, options?: AxiosRequestConfig<any>) => Promise<any>;
782
796
  listConsumptions: (options?: AxiosRequestConfig<any>) => Promise<ETNPagedResponse<any>>;
783
797
  updateConsumption: (id: string, data: any, options?: AxiosRequestConfig<any>) => Promise<any>;
@@ -913,4 +927,4 @@ declare namespace index {
913
927
  export { index_automationServices as automationServices, index_automationSources as automationSources };
914
928
  }
915
929
 
916
- export { type Account, type Asset, type Automation, type AutomationService, type AutomationServiceCategory, type AutomationSource, type Company, type CreateScraperRunParams, type DataIngest, type ETNPagedResponse$1 as ETNPagedResponse, type Email, type Entity, type Invoice, type InvoiceCapture, type InvoiceCaptureMetadata, type InvoiceCaptureMetadataResult, type InvoiceRate, type InvoiceRateType, type InvoiceValidation, type InvoiceValidationResults, type InvoiceValues, type Log, type Reading, type Report, type ReportMetadata, type ReportSource, type ReportSourceIdItem, type ScraperRun, type Supplier, type UtilityType, _default$3 as api, consumption, _default$1 as db, _default$2 as logger, monitoring, reporting, _default as slack, units, index as utils };
930
+ export { type Account, type Asset, type Automation, type AutomationService, type AutomationServiceCategory, type AutomationSource, type Company, type CompanyInvoiceValidationRule, type CompanyInvoiceValidationSettings, type CreateScraperRunParams, type DataIngest, type ETNPagedResponse$1 as ETNPagedResponse, type Email, type Entity, type Invoice, type InvoiceCapture, type InvoiceCaptureMetadata, type InvoiceCaptureMetadataResult, type InvoiceRate, type InvoiceRateType, type InvoiceValidation, type InvoiceValidationResults, type InvoiceValidationRule, type InvoiceValues, type Log, type Reading, type Report, type ReportMetadata, type ReportSource, type ReportSourceIdItem, type ScraperRun, type Supplier, type UtilityType, _default$3 as api, consumption, _default$1 as db, _default$2 as logger, monitoring, reporting, _default as slack, units, index as utils };
package/dist/index.d.ts CHANGED
@@ -342,6 +342,34 @@ interface Automation<IDType = ObjectId | string> {
342
342
  companyId: IDType;
343
343
  }
344
344
 
345
+ interface InvoiceValidationRule<IDType = ObjectId | string> {
346
+ _id: IDType;
347
+ key: string;
348
+ name: string;
349
+ description?: string;
350
+ defaultEnabled: boolean;
351
+ defaultThresholds: Record<string, any>;
352
+ defaultStatus: 'pass' | 'warn' | 'fail';
353
+ category: string;
354
+ companyId?: IDType;
355
+ }
356
+ interface InvoiceValidationResults<IDType = ObjectId | string> {
357
+ invoiceValidationRuleId: IDType;
358
+ comment: string;
359
+ status: 'passed' | 'warning' | 'failed' | 'error';
360
+ checkedAt: Date;
361
+ }
362
+ interface InvoiceValidation<IDType = ObjectId | string> {
363
+ _id: IDType;
364
+ status: 'pending' | 'passed' | 'warning' | 'failed' | 'error';
365
+ results: InvoiceValidationResults<IDType>[];
366
+ invoiceCaptureId: IDType;
367
+ invoiceId?: IDType;
368
+ batchId?: string;
369
+ companyId: IDType;
370
+ userSub: string;
371
+ }
372
+
345
373
  interface SupplierPortals<IDType = ObjectId | string> {
346
374
  supplierId: IDType;
347
375
  portal: Portal;
@@ -357,12 +385,13 @@ interface DefaultSources {
357
385
  gas: 'invoice' | 'consumption' | 'reading';
358
386
  water: 'invoice' | 'consumption' | 'reading';
359
387
  }
360
- interface InvoiceValidationSettings<IDType = ObjectId | string> {
388
+ interface CompanyInvoiceValidationSettings<IDType = ObjectId | string> {
361
389
  enabled: boolean;
362
390
  invoiceValidationRuleId: IDType;
363
- thresholds: object;
391
+ thresholds: Record<string, any>;
364
392
  status: 'pass' | 'warn' | 'fail';
365
393
  }
394
+ type CompanyInvoiceValidationRule<IDType = ObjectId | string> = InvoiceValidationRule<IDType> & Pick<CompanyInvoiceValidationSettings<IDType>, 'enabled' | 'thresholds' | 'status'>;
366
395
  interface CompanySettings<IDType = ObjectId | string> {
367
396
  showLogo?: boolean;
368
397
  invoiceCategories?: any[];
@@ -376,7 +405,8 @@ interface CompanySettings<IDType = ObjectId | string> {
376
405
  supplierPortals?: SupplierPortals[];
377
406
  defaultSources?: DefaultSources;
378
407
  scraperCounter?: number;
379
- invoiceValidationSettings?: InvoiceValidationSettings<IDType>;
408
+ invoiceValidationSettings?: CompanyInvoiceValidationSettings<IDType>;
409
+ autoInvoiceValidation?: boolean;
380
410
  }
381
411
  interface Company<IDType = ObjectId | string> {
382
412
  _id: IDType;
@@ -604,23 +634,6 @@ interface InvoiceCapture<IDType = ObjectId | string> {
604
634
  userSub: string;
605
635
  }
606
636
 
607
- interface InvoiceValidationResults<IDType = ObjectId | string> {
608
- invoiceValidationRuleId: IDType;
609
- comment: string;
610
- status: 'passed' | 'warning' | 'failed' | 'error';
611
- checkedAt: Date;
612
- }
613
- interface InvoiceValidation<IDType = ObjectId | string> {
614
- _id: IDType;
615
- status: 'pending' | 'passed' | 'warning' | 'failed' | 'error';
616
- results: InvoiceValidationResults<IDType>[];
617
- invoiceCaptureId: IDType;
618
- invoiceId?: IDType;
619
- batchId?: string;
620
- companyId: IDType;
621
- userSub: string;
622
- }
623
-
624
637
  interface Log<IDType = ObjectId | string> {
625
638
  _id: IDType;
626
639
  message: string;
@@ -778,6 +791,7 @@ declare const _default$3: (auth: AuthOptions, instanceOptions?: CreateAxiosDefau
778
791
  updateAutomationLog: (id: string, subId: string, data: any, options?: AxiosRequestConfig<any>) => Promise<any>;
779
792
  removeAutomationLog: (id: string, subId: string, options?: AxiosRequestConfig<any>) => Promise<any>;
780
793
  getCompany: (id: string, options?: AxiosRequestConfig<any>) => Promise<Company<string>>;
794
+ getCompanyInvoiceValidationRules: (id: string, options?: AxiosRequestConfig<any>) => Promise<CompanyInvoiceValidationRule<string>[]>;
781
795
  getConsumption: (id: string, options?: AxiosRequestConfig<any>) => Promise<any>;
782
796
  listConsumptions: (options?: AxiosRequestConfig<any>) => Promise<ETNPagedResponse<any>>;
783
797
  updateConsumption: (id: string, data: any, options?: AxiosRequestConfig<any>) => Promise<any>;
@@ -913,4 +927,4 @@ declare namespace index {
913
927
  export { index_automationServices as automationServices, index_automationSources as automationSources };
914
928
  }
915
929
 
916
- export { type Account, type Asset, type Automation, type AutomationService, type AutomationServiceCategory, type AutomationSource, type Company, type CreateScraperRunParams, type DataIngest, type ETNPagedResponse$1 as ETNPagedResponse, type Email, type Entity, type Invoice, type InvoiceCapture, type InvoiceCaptureMetadata, type InvoiceCaptureMetadataResult, type InvoiceRate, type InvoiceRateType, type InvoiceValidation, type InvoiceValidationResults, type InvoiceValues, type Log, type Reading, type Report, type ReportMetadata, type ReportSource, type ReportSourceIdItem, type ScraperRun, type Supplier, type UtilityType, _default$3 as api, consumption, _default$1 as db, _default$2 as logger, monitoring, reporting, _default as slack, units, index as utils };
930
+ export { type Account, type Asset, type Automation, type AutomationService, type AutomationServiceCategory, type AutomationSource, type Company, type CompanyInvoiceValidationRule, type CompanyInvoiceValidationSettings, type CreateScraperRunParams, type DataIngest, type ETNPagedResponse$1 as ETNPagedResponse, type Email, type Entity, type Invoice, type InvoiceCapture, type InvoiceCaptureMetadata, type InvoiceCaptureMetadataResult, type InvoiceRate, type InvoiceRateType, type InvoiceValidation, type InvoiceValidationResults, type InvoiceValidationRule, type InvoiceValues, type Log, type Reading, type Report, type ReportMetadata, type ReportSource, type ReportSourceIdItem, type ScraperRun, type Supplier, type UtilityType, _default$3 as api, consumption, _default$1 as db, _default$2 as logger, monitoring, reporting, _default as slack, units, index as utils };
package/dist/index.js CHANGED
@@ -267,6 +267,11 @@ var api_default = (auth, instanceOptions = {}) => {
267
267
  removeAutomationLog: subFactory.remove(etainablApi, "automation", "logs"),
268
268
  // company
269
269
  getCompany: factory.getWithId(etainablApi, "companies"),
270
+ getCompanyInvoiceValidationRules: factory.getWithId(
271
+ etainablApi,
272
+ "companies",
273
+ "invoice-validation-rules"
274
+ ),
270
275
  // consumption
271
276
  getConsumption: factory.getWithId(etainablApi, "consumptions"),
272
277
  listConsumptions: factory.list(etainablApi, "consumptions"),
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 InvoiceValidation,\n Log,\n Reading,\n Report,\n Supplier\n} from './types/index.js';\nimport { start } from 'repl';\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 // invoice validation\n getInvoiceValidation: factory.getWithId<InvoiceValidation<string>>(etainablApi, 'invoice-validation'),\n listInvoicesValidation: factory.list<InvoiceValidation<string>>(etainablApi, 'invoice-validation'),\n updateInvoiceValidation: factory.update<InvoiceValidation<string>>(etainablApi, 'invoice-validation'),\n createInvoiceValidation: factory.create<InvoiceValidation<string>>(etainablApi, 'invoice-validation'),\n removeInvoiceValidation: factory.remove<InvoiceValidation<string>>(etainablApi, 'invoice-validation'),\n getInvoiceValidationSchema: factory.get(etainablApi, 'invoice-validation', '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: 'Elveco 2108',\n key: 'elveco2108',\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 friendly: 'Trendlogs',\n key: 'trendlogs',\n category: 'company'\n },\n {\n friendly: 'Trio',\n key: 'trio',\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 './invoiceValidation.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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","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 CompanyInvoiceValidationRule,\n DataIngest,\n Invoice,\n InvoiceCapture,\n InvoiceValidation,\n Log,\n Reading,\n Report,\n Supplier\n} from './types/index.js';\nimport { start } from 'repl';\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 getCompanyInvoiceValidationRules: factory.getWithId<CompanyInvoiceValidationRule<string>[]>(\n etainablApi,\n 'companies',\n 'invoice-validation-rules'\n ),\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 // invoice validation\n getInvoiceValidation: factory.getWithId<InvoiceValidation<string>>(etainablApi, 'invoice-validation'),\n listInvoicesValidation: factory.list<InvoiceValidation<string>>(etainablApi, 'invoice-validation'),\n updateInvoiceValidation: factory.update<InvoiceValidation<string>>(etainablApi, 'invoice-validation'),\n createInvoiceValidation: factory.create<InvoiceValidation<string>>(etainablApi, 'invoice-validation'),\n removeInvoiceValidation: factory.remove<InvoiceValidation<string>>(etainablApi, 'invoice-validation'),\n getInvoiceValidationSchema: factory.get(etainablApi, 'invoice-validation', '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: 'Elveco 2108',\n key: 'elveco2108',\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 friendly: 'Trendlogs',\n key: 'trendlogs',\n category: 'company'\n },\n {\n friendly: 'Trio',\n key: 'trio',\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 './invoiceValidation.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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,mBAAkB;AAElB,mBAAkB;;;ACFlB,qBAAoB;AAEpB,IAAO,iBAAQ,CAAC,cAAsB,eAAAA,QAAQ,aAAa;AAAA,EACzD,OAAO;AAAA,EACP,QAAQ,eAAAA,QAAQ,OAAO;AAAA,IACrB,eAAAA,QAAQ,OAAO,UAAU;AAAA,IACzB,eAAAA,QAAQ,OAAO,KAAK;AAAA,EACtB;AAAA,EACA,aAAa,EAAE,SAAS,QAAQ,IAAI,0BAA0B,QAAQ,UAAU;AAAA,EAChF,YAAY;AAAA,IACV,IAAI,eAAAA,QAAQ,WAAW,QAAQ;AAAA,EACjC;AACF,CAAC;;;ADYD,IAAM,MAAM,eAAO,aAAa;AAchC,SAAS,gBAAgB,KAAa,KAAoB,UAAU,OAAO;AACvE,MAAI,CAAC,KAAK;AACN,UAAM,IAAI,MAAM,yBAAyB,IAAI,MAAM,IAAI,IAAI,GAAG,GAAG;AAAA,EACrE;AAEA,MAAI,IAAI,WAAW,KAAK;AACpB,UAAM,IAAI,MAAM,GAAG,IAAI,MAAM,IAAI,IAAI,UAAU,uBAAuB,IAAI,MAAM,IAAI,IAAI,GAAG,GAAG;AAAA,EAClG;AAEA,MAAI,CAAC,IAAI,MAAM;AACX,UAAM,IAAI,MAAM,qBAAqB,IAAI,MAAM,IAAI,IAAI,GAAG,GAAG;AAAA,EACjE;AAEA,MAAI,WAAW,CAAC,IAAI,KAAK,MAAM;AAC3B,UAAM,IAAI,MAAM,qBAAqB,IAAI,MAAM,IAAI,IAAI,GAAG,GAAG;AAAA,EACjE;AAEA,SAAO;AACX;AAEA,IAAM,UAAU;AAAA,EACZ,WACI,CAAU,aAA4B,UAAkB,iBACxD,OAAO,IAAY,UAA8B,CAAC,MAAkB;AAChE,UAAM,MAAM;AAAA,MACR,QAAQ;AAAA,MACR,KAAK,GAAG,QAAQ,IAAI,EAAE,GAAG,eAAe,IAAI,YAAY,KAAK,EAAE;AAAA,IACnE;AAEA,QAAI,KAAK,gBAAgB,IAAI,MAAM,IAAI,QAAQ,IAAI,iBAAiB,IAAI,IAAI,GAAG,EAAE;AAEjF,QAAI;AAEJ,QAAI;AACA,YAAM,MAAM,YAAY,IAAI,IAAI,KAAK,OAAO;AAAA,IAChD,SAAS,GAAQ;AACb,UAAI,EAAE,UAAU,KAAM,OAAM,IAAI,MAAM,uBAAuB,KAAK,UAAU,EAAE,SAAS,IAAI,CAAC,EAAE;AAC9F,YAAM;AAAA,IACV;AAEA,YAAQ,IAAI,iBAAiB,IAAI,MAAM,IAAI,QAAQ,IAAI,gBAAgB,IAAI,IAAI,GAAG,EAAE;AAEpF,oBAAgB,KAAK,GAAG;AAExB,WAAO,IAAI;AAAA,EACf;AAAA,EACJ,KACI,CAAU,aAA4B,UAAkB,iBACxD,OAAO,UAA8B,CAAC,MAAkB;AACpD,UAAM,MAAM;AAAA,MACR,QAAQ;AAAA,MACR,KAAK,GAAG,QAAQ,GAAG,eAAe,IAAI,YAAY,KAAK,EAAE;AAAA,IAC7D;AAEA,QAAI,KAAK,gBAAgB,IAAI,MAAM,IAAI,QAAQ,IAAI,gBAAgB,IAAI,IAAI,GAAG,EAAE;AAEhF,QAAI;AAEJ,QAAI;AACA,YAAM,MAAM,YAAY,IAAI,IAAI,KAAK,OAAO;AAAA,IAChD,SAAS,GAAQ;AACb,UAAI,EAAE,UAAU,KAAM,OAAM,IAAI,MAAM,uBAAuB,KAAK,UAAU,EAAE,SAAS,IAAI,CAAC,EAAE;AAC9F,YAAM;AAAA,IACV;AAEA,YAAQ,IAAI,iBAAiB,IAAI,MAAM,IAAI,QAAQ,IAAI,gBAAgB,IAAI,IAAI,GAAG,EAAE;AACpF,oBAAgB,KAAK,GAAG;AAExB,WAAO,IAAI;AAAA,EACf;AAAA,EACJ,MACI,CAAU,aAA4B,UAAkB,iBACxD,OAAO,UAA8B,CAAC,MAAoC;AACtE,UAAM,MAAM;AAAA,MACR,QAAQ;AAAA,MACR,KAAK,GAAG,QAAQ,GAAG,eAAe,IAAI,YAAY,KAAK,EAAE;AAAA,IAC7D;AAEA,QAAI,KAAK,gBAAgB,IAAI,MAAM,IAAI,QAAQ,IAAI,gBAAgB,IAAI,IAAI,GAAG,EAAE;AAEhF,QAAI;AAEJ,QAAI;AACA,YAAM,MAAM,YAAY,IAAI,IAAI,KAAK,OAAO;AAAA,IAChD,SAAS,GAAQ;AACb,UAAI,EAAE,UAAU,KAAM,OAAM,IAAI,MAAM,uBAAuB,KAAK,UAAU,EAAE,SAAS,IAAI,CAAC,EAAE;AAC9F,YAAM;AAAA,IACV;AAEA,YAAQ,IAAI,iBAAiB,IAAI,MAAM,IAAI,QAAQ,IAAI,gBAAgB,IAAI,IAAI,GAAG,EAAE;AACpF,oBAAgB,KAAK,KAAK,IAAI;AAE9B,WAAO,IAAI;AAAA,EACf;AAAA,EACJ,QACI,CAAU,aAA4B,UAAkB,iBACxD,OAAO,IAAY,MAAW,UAA8B,CAAC,MAAkB;AAC3E,UAAM,MAAM;AAAA,MACR,QAAQ;AAAA,MACR,KAAK,GAAG,QAAQ,IAAI,EAAE,GAAG,eAAe,IAAI,YAAY,KAAK,EAAE;AAAA,IACnE;AAEA,QAAI,KAAK,gBAAgB,IAAI,MAAM,IAAI,QAAQ,IAAI,gBAAgB,IAAI,IAAI,GAAG,EAAE;AAEhF,QAAI;AAEJ,QAAI;AACA,YAAM,MAAM,YAAY,MAAM,IAAI,KAAK,MAAM,OAAO;AAAA,IACxD,SAAS,GAAQ;AACb,UAAI,EAAE,UAAU,KAAM,OAAM,IAAI,MAAM,uBAAuB,KAAK,UAAU,EAAE,SAAS,IAAI,CAAC,EAAE;AAC9F,YAAM;AAAA,IACV;AAEA,oBAAgB,KAAK,GAAG;AAExB,WAAO,IAAI;AAAA,EACf;AAAA,EACJ,QACI,CAAU,aAA4B,UAAkB,iBACxD,OAAO,MAAW,UAA8B,CAAC,MAAkB;AAC/D,UAAM,MAAM;AAAA,MACR,QAAQ;AAAA,MACR,KAAK,GAAG,QAAQ,GAAG,eAAe,IAAI,YAAY,KAAK,EAAE;AAAA,IAC7D;AAEA,QAAI,KAAK,gBAAgB,IAAI,MAAM,IAAI,QAAQ,IAAI,gBAAgB,IAAI,IAAI,GAAG,EAAE;AAEhF,QAAI;AAEJ,QAAI;AACA,YAAM,MAAM,YAAY,KAAK,IAAI,KAAK,MAAM,OAAO;AAAA,IACvD,SAAS,GAAQ;AACb,UAAI,EAAE,UAAU,KAAM,OAAM,IAAI,MAAM,uBAAuB,KAAK,UAAU,EAAE,SAAS,IAAI,CAAC,EAAE;AAC9F,YAAM;AAAA,IACV;AAEA,oBAAgB,KAAK,GAAG;AAExB,WAAO,IAAI;AAAA,EACf;AAAA,EACJ,QACI,CAAU,aAA4B,UAAkB,iBACxD,OAAO,IAAY,UAA8B,CAAC,MAAkB;AAChE,UAAM,MAAM;AAAA,MACR,QAAQ;AAAA,MACR,KAAK,GAAG,QAAQ,IAAI,EAAE,GAAG,eAAe,IAAI,YAAY,KAAK,EAAE;AAAA,IACnE;AAEA,QAAI;AAEJ,QAAI,KAAK,gBAAgB,IAAI,MAAM,IAAI,QAAQ,IAAI,gBAAgB,IAAI,IAAI,GAAG,EAAE;AAEhF,QAAI;AACA,YAAM,MAAM,YAAY,OAAO,IAAI,KAAK,OAAO;AAAA,IACnD,SAAS,GAAQ;AACb,UAAI,EAAE,UAAU,KAAM,OAAM,IAAI,MAAM,uBAAuB,KAAK,UAAU,EAAE,SAAS,IAAI,CAAC,EAAE;AAC9F,YAAM;AAAA,IACV;AAEA,oBAAgB,KAAK,GAAG;AAExB,WAAO,IAAI;AAAA,EACf;AAAA,EACJ,cACI,CAAU,aAA4B,QAAgB,UAAkB,iBACxE,OAAO,IAAY,MAAW,UAA8B,CAAC,MAAkB;AAC3E,UAAM,MAAM;AAAA,MACR;AAAA,MACA,KAAK,GAAG,QAAQ,IAAI,EAAE,GAAG,eAAe,IAAI,YAAY,KAAK,EAAE;AAAA,MAC/D;AAAA,MACA,GAAG;AAAA,IACP;AAEA,QAAI,KAAK,yBAAyB,IAAI,MAAM,IAAI,QAAQ,IAAI,gBAAgB,IAAI,IAAI,GAAG,EAAE;AAEzF,QAAI;AAEJ,QAAI;AACA,YAAM,MAAM,YAAY,QAAQ,GAAG;AAAA,IACvC,SAAS,GAAQ;AACb,UAAI,EAAE,UAAU,KAAM,OAAM,IAAI,MAAM,uBAAuB,KAAK,UAAU,EAAE,SAAS,IAAI,CAAC,EAAE;AAC9F,YAAM;AAAA,IACV;AAEA,oBAAgB,KAAK,GAAG;AAExB,WAAO,IAAI;AAAA,EACf;AACR;AAIA,IAAM,aAAa;AAAA;AAAA,EAEf,QACI,CAAU,aAA4B,UAAkB,gBACxD,OAAO,IAAY,MAAW,UAA8B,CAAC,MAAM;AAC/D,UAAM,SAAS,GAAG,EAAE,IAAI,WAAW;AACnC,WAAO,QAAQ,OAAU,aAAa,UAAU,MAAM,EAAE,MAAM,OAAO;AAAA,EACzE;AAAA;AAAA,EAEJ,QACI,CAAU,aAA4B,UAAkB,gBACxD,OAAO,IAAY,OAAe,MAAW,UAA8B,CAAC,MAAM;AAC9E,UAAM,SAAS,GAAG,WAAW,IAAI,KAAK;AAEtC,WAAO,QAAQ,OAAU,aAAa,UAAU,MAAM,EAAE,IAAI,MAAM,OAAO;AAAA,EAC7E;AAAA;AAAA,EAEJ,QACI,CAAU,aAA4B,UAAkB,gBACxD,OAAO,IAAY,OAAe,UAA8B,CAAC,MAAM;AACnE,UAAM,SAAS,GAAG,WAAW,IAAI,KAAK;AAEtC,WAAO,QAAQ,OAAU,aAAa,UAAU,MAAM,EAAE,IAAI,OAAO;AAAA,EACvE;AACR;AAOA,IAAO,cAAQ,CAAC,MAAmB,kBAAuC,CAAC,MAAM;AAC7E,MAAI;AACA,UAAM,UAAe,CAAC;AAEtB,QAAI,KAAK,KAAK;AACV,cAAQ,OAAO,IAAI,KAAK;AAAA,IAC5B,WAAW,KAAK,OAAO;AACnB,cAAQ,eAAe,IAAI,KAAK;AAAA,IACpC,OAAO;AACH,cAAQ,OAAO,IAAI,QAAQ,IAAI;AAAA,IACnC;AAEA,UAAM,cAAc,aAAAC,QAAM,OAAO;AAAA,MAC7B,SAAS,QAAQ,IAAI;AAAA,MACrB,SAAS;AAAA,MACT,YAAY,IAAI,aAAAC,QAAM,MAAM,EAAE,WAAW,KAAK,CAAC;AAAA,MAC/C;AAAA,MACA,GAAG;AAAA,IACP,CAAC;AAED,WAAO;AAAA,MACH,UAAU;AAAA;AAAA,MAGV,YAAY,QAAQ,UAA2B,aAAa,UAAU;AAAA,MACtE,cAAc,QAAQ,KAAsB,aAAa,UAAU;AAAA,MACnE,eAAe,QAAQ,OAAwB,aAAa,UAAU;AAAA,MACtE,eAAe,QAAQ,OAAwB,aAAa,UAAU;AAAA,MACtE,eAAe,QAAQ,OAAwB,aAAa,UAAU;AAAA,MACtE,kBAAkB,QAAQ,IAAI,aAAa,YAAY,QAAQ;AAAA,MAC/D,wBAAwB,QAAQ,aAAa,aAAa,OAAO,YAAY,kBAAkB;AAAA;AAAA,MAG/F,UAAU,QAAQ,UAAyB,aAAa,QAAQ;AAAA,MAChE,YAAY,QAAQ,KAAoB,aAAa,QAAQ;AAAA,MAC7D,aAAa,QAAQ,OAAsB,aAAa,QAAQ;AAAA,MAChE,aAAa,QAAQ,OAAsB,aAAa,QAAQ;AAAA,MAChE,aAAa,QAAQ,OAAsB,aAAa,QAAQ;AAAA,MAChE,gBAAgB,QAAQ,IAAI,aAAa,UAAU,QAAQ;AAAA;AAAA,MAG3D,eAAe,QAAQ,UAAU,aAAa,cAAc;AAAA,MAC5D,iBAAiB,QAAQ,KAAK,aAAa,cAAc;AAAA,MACzD,kBAAkB,QAAQ,OAAO,aAAa,cAAc;AAAA,MAC5D,kBAAkB,QAAQ,OAAO,aAAa,cAAc;AAAA,MAC5D,kBAAkB,QAAQ,OAAO,aAAa,cAAc;AAAA,MAC5D,qBAAqB,QAAQ,UAAU,aAAa,gBAAgB,QAAQ;AAAA,MAC5E,qBAAqB,QAAQ,IAAI,aAAa,gBAAgB,QAAQ;AAAA;AAAA,MAGtE,eAAe,QAAQ,UAA8B,aAAa,YAAY;AAAA,MAC9E,iBAAiB,QAAQ,KAAyB,aAAa,YAAY;AAAA,MAC3E,kBAAkB,QAAQ,OAA2B,aAAa,YAAY;AAAA,MAC9E,kBAAkB,QAAQ,OAA2B,aAAa,YAAY;AAAA,MAC9E,kBAAkB,QAAQ,OAA2B,aAAa,YAAY;AAAA,MAC9E,qBAAqB,WAAW,OAAO,aAAa,cAAc,MAAM;AAAA,MACxE,qBAAqB,WAAW,OAAO,aAAa,cAAc,MAAM;AAAA,MACxE,qBAAqB,WAAW,OAAO,aAAa,cAAc,MAAM;AAAA;AAAA,MAGxE,YAAY,QAAQ,UAA2B,aAAa,WAAW;AAAA,MACvE,kCAAkC,QAAQ;AAAA,QACtC;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA;AAAA,MAGA,gBAAgB,QAAQ,UAAU,aAAa,cAAc;AAAA,MAC7D,kBAAkB,QAAQ,KAAK,aAAa,cAAc;AAAA,MAC1D,mBAAmB,QAAQ,OAAO,aAAa,cAAc;AAAA,MAC7D,mBAAmB,QAAQ,OAAO,aAAa,cAAc;AAAA,MAC7D,mBAAmB,QAAQ,OAAO,aAAa,cAAc;AAAA,MAC7D,sBAAsB,QAAQ,IAAI,aAAa,gBAAgB,QAAQ;AAAA;AAAA,MAGvE,UAAU,QAAQ,UAAU,aAAa,QAAQ;AAAA,MACjD,YAAY,QAAQ,KAAK,aAAa,QAAQ;AAAA,MAC9C,aAAa,QAAQ,OAAO,aAAa,QAAQ;AAAA,MACjD,aAAa,QAAQ,OAAO,aAAa,QAAQ;AAAA,MACjD,aAAa,QAAQ,OAAO,aAAa,QAAQ;AAAA;AAAA,MAGjD,mBAAmB,QAAQ,UAAU,aAAa,kBAAkB;AAAA,MACpE,qBAAqB,QAAQ,KAAK,aAAa,kBAAkB;AAAA,MACjE,sBAAsB,QAAQ,OAAO,aAAa,kBAAkB;AAAA,MACpE,sBAAsB,QAAQ,OAAO,aAAa,kBAAkB;AAAA,MACpE,sBAAsB,QAAQ,OAAO,aAAa,kBAAkB;AAAA;AAAA,MAGpE,WAAW,QAAQ,UAA0B,aAAa,UAAU;AAAA,MACpE,cAAc,QAAQ,KAAqB,aAAa,UAAU;AAAA,MAClE,cAAc,QAAQ,OAAuB,aAAa,UAAU;AAAA,MACpE,cAAc,QAAQ,OAAuB,aAAa,UAAU;AAAA,MACpE,cAAc,QAAQ,OAAuB,aAAa,UAAU;AAAA,MACpE,mBAAmB,QAAQ,IAAI,aAAa,YAAY,QAAQ;AAAA;AAAA,MAGhE,QAAQ,QAAQ,UAAuB,aAAa,MAAM;AAAA,MAC1D,UAAU,QAAQ,KAAkB,aAAa,MAAM;AAAA,MACvD,WAAW,QAAQ,OAAoB,aAAa,MAAM;AAAA,MAC1D,WAAW,QAAQ,OAAoB,aAAa,MAAM;AAAA,MAC1D,WAAW,QAAQ,OAAoB,aAAa,MAAM;AAAA;AAAA,MAG1D,YAAY,QAAQ,UAA2B,aAAa,UAAU;AAAA,MACtE,cAAc,QAAQ,KAAsB,aAAa,UAAU;AAAA,MACnE,eAAe,QAAQ,OAAwB,aAAa,UAAU;AAAA,MACtE,eAAe,QAAQ,OAAwB,aAAa,UAAU;AAAA,MACtE,eAAe,QAAQ,OAAwB,aAAa,UAAU;AAAA,MACtE,kBAAkB,QAAQ,IAAI,aAAa,YAAY,QAAQ;AAAA;AAAA,MAG/D,WAAW,QAAQ,UAA0B,aAAa,SAAS;AAAA,MACnE,aAAa,QAAQ,KAAqB,aAAa,SAAS;AAAA,MAChE,cAAc,QAAQ,OAAuB,aAAa,SAAS;AAAA,MACnE,cAAc,QAAQ,OAAuB,aAAa,SAAS;AAAA,MACnE,cAAc,QAAQ,OAAuB,aAAa,SAAS;AAAA,MACnE,YAAY,QAAQ,aAAa,aAAa,QAAQ,WAAW,MAAM;AAAA;AAAA,MAGvE,mBAAmB,QAAQ,UAAU,aAAa,kBAAkB;AAAA,MACpE,qBAAqB,QAAQ,KAAK,aAAa,kBAAkB;AAAA,MACjE,sBAAsB,QAAQ,OAAO,aAAa,kBAAkB;AAAA,MACpE,sBAAsB,QAAQ,OAAO,aAAa,kBAAkB;AAAA,MACpE,sBAAsB,QAAQ,OAAO,aAAa,kBAAkB;AAAA;AAAA,MAGpE,oBAAoB,QAAQ,UAAU,aAAa,mBAAmB;AAAA,MACtE,sBAAsB,QAAQ,KAAK,aAAa,mBAAmB;AAAA,MACnE,uBAAuB,QAAQ,OAAO,aAAa,mBAAmB;AAAA,MACtE,uBAAuB,QAAQ,OAAO,aAAa,mBAAmB;AAAA,MACtE,uBAAuB,QAAQ,OAAO,aAAa,mBAAmB;AAAA,MACtE,qBAAqB,QAAQ,aAAa,aAAa,QAAQ,qBAAqB,MAAM;AAAA;AAAA,MAG1F,YAAY,QAAQ,UAA2B,aAAa,UAAU;AAAA,MACtE,cAAc,QAAQ,KAAsB,aAAa,UAAU;AAAA,MACnE,eAAe,QAAQ,OAAwB,aAAa,UAAU;AAAA,MACtE,eAAe,QAAQ,OAAwB,aAAa,UAAU;AAAA,MACtE,eAAe,QAAQ,OAAwB,aAAa,UAAU;AAAA,MACtE,kBAAkB,QAAQ,IAAI,aAAa,YAAY,QAAQ;AAAA;AAAA,MAG/D,mBAAmB,QAAQ,UAAkC,aAAa,iBAAiB;AAAA,MAC3F,qBAAqB,QAAQ,KAA6B,aAAa,iBAAiB;AAAA,MACxF,sBAAsB,QAAQ,OAA+B,aAAa,iBAAiB;AAAA,MAC3F,sBAAsB,QAAQ,OAA+B,aAAa,iBAAiB;AAAA,MAC3F,sBAAsB,QAAQ,OAA+B,aAAa,iBAAiB;AAAA,MAC3F,yBAAyB,QAAQ,IAAI,aAAa,mBAAmB,QAAQ;AAAA;AAAA,MAG7E,sBAAsB,QAAQ,UAAqC,aAAa,oBAAoB;AAAA,MACpG,wBAAwB,QAAQ,KAAgC,aAAa,oBAAoB;AAAA,MACjG,yBAAyB,QAAQ,OAAkC,aAAa,oBAAoB;AAAA,MACpG,yBAAyB,QAAQ,OAAkC,aAAa,oBAAoB;AAAA,MACpG,yBAAyB,QAAQ,OAAkC,aAAa,oBAAoB;AAAA,MACpG,4BAA4B,QAAQ,IAAI,aAAa,sBAAsB,QAAQ;AAAA;AAAA,MAGnF,eAAe,QAAQ,KAAuB,aAAa,WAAW;AAAA,MACtE,mBAAmB,QAAQ,IAAI,aAAa,aAAa,QAAQ;AAAA;AAAA,MAGjE,mBAAmB,QAAQ,UAAU,aAAa,kBAAkB;AAAA;AAAA,MAGpE,gBAAgB,QAAQ,KAAyB,aAAa,cAAc;AAAA,MAC5E,kBAAkB,QAAQ,OAA2B,aAAa,cAAc;AAAA,MAChF,kBAAkB,QAAQ,OAA2B,aAAa,cAAc;AAAA,IACpF;AAAA,EACJ,SAAS,GAAG;AACR,QAAI,MAAM,CAAC;AACX,UAAM;AAAA,EACV;AACJ;;;AEpbA,qBAAgC;AAGhC,IAAMC,OAAM,eAAO,WAAW;AAE9B,IAAI;AAEJ,eAAe,kBAAkB,eAAuB,GAAgB;AACtE,MAAI,CAAC,QAAQ,IAAI,gBAAiB,OAAM,IAAI,MAAM,4BAA4B;AAC9E,MAAI,CAAC,QAAQ,IAAI,kBAAmB,OAAM,IAAI,MAAM,8BAA8B;AAClF,MAAI,CAAC,QAAQ,IAAI,sBAAuB,OAAM,IAAI,MAAM,kCAAkC;AAE1F,MAAI,UAAU;AACZ,IAAAA,KAAI,MAAM,kCAAkC;AAC5C,WAAO,QAAQ,QAAQ,QAAQ;AAAA,EACjC;AAEA,QAAM,MAAM,iBAAiB,QAAQ,IAAI,eAAe;AAExD,MAAI;AACF,QAAI,QAAQ,IAAI,kBAAkB,QAAQ;AACxC,MAAAA,KAAI,MAAM,+CAA+C;AAEzD,YAAMC,UAAS,IAAI,2BAAY,GAAG;AAClC,YAAMA,QAAO,QAAQ;AAErB,MAAAD,KAAI,MAAM,yDAAyD;AAEnE,iBAAWC,QAAO,GAAG,UAAU;AAE/B,aAAO;AAAA,IACT;AAEA,IAAAD,KAAI,MAAM,6CAA6C;AAEvD,UAAM,SAAS,IAAI,2BAAY,KAAK;AAAA,MAClC,MAAM;AAAA,QACJ,UAAU,QAAQ,IAAI;AAAA,QACtB,UAAU,QAAQ,IAAI;AAAA,MACxB;AAAA,MACA,YAAY;AAAA,MACZ,eAAe;AAAA,IACjB,CAAC;AAED,UAAM,OAAO,QAAQ;AAErB,IAAAA,KAAI,MAAM,uDAAuD;AAEjE,eAAW,OAAO,GAAG,UAAU;AAE/B,WAAO;AAAA,EAET,SAAS,GAAQ;AAEf,QAAI,eAAe,GAAG;AACpB,cAAQ,IAAI,wDAAwD;AACpE,YAAM;AAAA,IACR;AAEA,YAAQ,IAAI,6BAA6B,EAAE,OAAO,EAAE;AAEpD,YAAQ,IAAI,2EAA2E,YAAY,GAAG;AACtG,WAAO,kBAAkB,eAAe,CAAC;AAAA,EAC3C;AACF;AAEA,IAAO,aAAQ;AAAA,EACb;AACF;;;ACpEA,IAAAE,gBAAkB;AAElB,IAAM,cAAc,OAAO,YAAoB;AAC7C,QAAM,MAAM;AACZ,QAAM,OAAO;AAAA,IACX,MAAM,KAAK,QAAQ,IAAI,OAAO,IAAI,YAAY,CAAC,KAAK,QAAQ,IAAI,wBAAwB,KAAK,OAAO;AAAA,EACtG;AACA,QAAM,UAAU;AAAA,IACd,gBAAgB;AAAA,EAClB;AACA,SAAO,cAAAC,QAAM,KAAK,KAAK,MAAM,EAAE,QAAQ,CAAC;AAC1C;AAEA,IAAO,gBAAQ;AAAA,EACb;AACF;;;ACfA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiCO,IAAM,iBAA8C;AAAA,EACvD,aAAa;AAAA,EACb,KAAK;AAAA,EACL,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AAAA,EACN,SAAS;AAAA,EACT,aAAa;AAAA,EACb,KAAK;AACT;AAEA,IAAM,wBAAgD;AAAA,EAClD,KAAK;AAAA,IACD,KAAK;AAAA,IACL,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,IAAK,KAAK,UAAW;AAAA,IACrB,KAAM,SAAS,KAAK,UAAW;AAAA,IAC/B,KAAM,OAAO,KAAK,UAAW;AAAA,EACjC;AAAA,EACA,IAAI;AAAA,IACA,IAAI;AAAA,IACJ,GAAG;AAAA,EACP;AAAA,EACA,GAAG;AAAA,IACC,GAAG;AAAA,EACP;AAAA,EACA,IAAI;AAAA,IACA,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,QAAQ;AAAA,EACZ;AAAA,EACA,QAAQ;AAAA,IACJ,QAAQ;AAAA,EACZ;AACJ;AAEO,IAAM,qBAAmD;AAAA,EAC5D,aAAa,CAAC,OAAO,OAAO,IAAI;AAAA,EAChC,KAAK,CAAC,OAAO,MAAM,OAAO,KAAK;AAAA,EAC/B,OAAO,CAAC,MAAM,GAAG;AAAA,EACjB,OAAO,CAAC,MAAM,OAAO,QAAQ;AAAA,EAC7B,OAAO,CAAC,OAAO,OAAO,IAAI;AAAA,EAC1B,SAAS,CAAC,OAAO,OAAO,IAAI;AAAA,EAC5B,MAAM,CAAC,MAAM;AAAA,EACb,SAAS,CAAC,OAAO,OAAO,IAAI;AAAA,EAC5B,aAAa,CAAC,GAAG;AAAA,EACjB,KAAK,CAAC,GAAG;AACb;AAGO,IAAM,eAAe,CAAC,OAAe,MAAmB,cAAmC,kBAA2C;AACzI,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,0BAA0B;AAErD,QAAM,WAAW,eAAe,IAAI;AACpC,MAAI,CAAC,SAAU,OAAM,IAAI,MAAM,gBAAgB,IAAI,mBAAmB;AAEtE,QAAM,iBAAiB,MAAM,IAAI,UAAQ;AACrC,UAAM,SAAS,KAAK,UAAU,iBAAiB;AAC/C,UAAM,QAAQ,KAAK,SAAS,KAAK,QAAQ,gBAAgB;AACzD,UAAM,iBAAiB,KAAK,QAAQ,qBAAqB,OAAO,QAAQ,IAAI;AAC5E,WAAO,EAAE,GAAG,MAAM,OAAO,gBAAgB,OAAO,SAAS;AAAA,EAC7D,CAAC;AAED,SAAO;AACX;AAEA,IAAM,uBAAuB,CAAC,WAAmB,OAAO,WAAmB;AACvE,QAAM,oBAAoB,sBAAsB,MAAM;AAEtD,MAAI,CAAC,mBAAmB;AACpB,UAAM,IAAI,MAAM,+BAA+B,MAAM,iBAAiB;AAAA,EAC1E;AAEA,MAAI,CAAC,kBAAkB,QAAQ,GAAG;AAC9B,UAAM,IAAI,MAAM,+BAA+B,QAAQ,iBAAiB;AAAA,EAC5E;AAEA,SAAO,kBAAkB,QAAQ;AACrC;AAEO,IAAM,0BAA0B,CAAC,MAAc,MAAc,gBAA6B,OAAO;AACpG,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,0BAA0B;AACrD,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,kBAAkB;AAE7C,QAAM,aAAa,KAAK,YAAY,EAAE,KAAK;AAE3C,QAAM,mBAAmB,mBAAmB,UAAU;AACtD,MAAI,CAAC,iBAAkB,OAAM,IAAI,MAAM,iBAAiB,UAAU,sBAAsB,aAAa,EAAE;AAEvG,QAAM,aAAa,KAAK,YAAY,EAAE,KAAK;AAE3C,MAAI,CAAC,iBAAiB,SAAS,UAAU,GAAG;AACxC,UAAM,IAAI,MAAM,iBAAiB,UAAU,4BAA4B,UAAU,KAAK,aAAa,EAAE;AAAA,EACzG;AAEA,SAAO,EAAE,MAAM,YAA2B,MAAM,WAAW;AAC/D;;;ACpIA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAmB;AAaZ,IAAM,sBAAsB,CAAC,SAA4B,KAAK,OAAO,CAAC,KAA0B,SAA+C;AACpJ,QAAM,OAAO,cAAAC,QAAO,IAAI,KAAK,IAAI,EAAE,KAAK;AAExC,MAAI,QAAQ,KAAK,OAAO,GAAG;AACzB,QAAI,oBAAoB,KAAK;AAAA,EAC/B,OAAO;AACL,QAAI,kBAAkB,KAAK;AAAA,EAC7B;AAEA,MAAI,eAAe,KAAK;AAExB,SAAO;AACT,GAAG;AAAA,EACD,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,aAAa;AACf,CAAC;AAEM,IAAM,0BAA0B,CAAC,SAA4B,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,SAA0B,KAAK,WAAW,CAAC;AAE9H,IAAM,gBAAgB,CAAC,SAA4B,wBAAwB,IAAI,IAAI;AAEnF,IAAM,eAAe,CAAC,aAAqB,WAAmB,WAAmC,YAAoC;AAC1I,QAAM,OAAO,KAAK,SAAK,cAAAA,SAAO,OAAO,EAAE,SAAK,cAAAA,SAAO,SAAS,GAAG,QAAQ,IAAI,CAAC;AAE5E,SAAO,cAAc,IAAI,IAAM,eAAe,YAAY,KAAK,QAAS;AAC1E;;;ACvCA;AAAA;AAAA;AAAA;AAAA,IAAAC,gBAAkB;AAIlB,IAAMC,OAAM,eAAO,YAAY;AAExB,IAAM,gBAAgB,YAAY;AACrC,MAAI,CAAC,QAAQ,IAAI,iBAAiB,QAAQ,IAAI,cAAc,SAAS,GAAG,EAAG,QAAO;AAElF,MAAI;AACA,UAAM,cAAAC,QAAM,KAAK,QAAQ,IAAI,aAAa;AAE1C,WAAO;AAAA,EACX,SAAS,GAAQ;AACb,IAAAD,KAAI,KAAK,6BAA6B,EAAE,WAAW,CAAC,EAAE;AACtD,WAAO;AAAA,EACX;AACJ;;;ACjBA;AAAA;AAAA;AAAA;AAAA,IAAAE,iBAAmB;AAEnB,eAAAC,QAAO,OAAO,MAAM;AAAA,EAClB,MAAM;AAAA,IACJ,KAAK;AAAA,EACP;AACF,CAAC;AAED,IAAM,iBAAiB,CAAC,WAA0B,UAAe,aAA2C;AAC1G,QAAM,CAAC,KAAK,IAAI,IAAI,SAAS,UAAU,MAAM,GAAG;AAChD,QAAM,iBAAa,eAAAA,SAAO,SAAS,EAAE,IAAI,KAAK,IAA8B;AAE5E,MAAI,SAAS,oBAAoB,SAAS;AACxC,eAAW,QAAQ,IAAiC;AAAA,EACtD,WAAW,SAAS,oBAAoB,QAAQ;AAC9C,eAAW,MAAM,IAAiC;AAAA,EACpD;AAEA,QAAM,YAAY,WAAW,WAAW,IAAI,KAAK,WAAW,WAAW,IAAI;AAC3E,QAAM,aAAa,WAAW,WAAW,MAAM;AAG/C,MAAI,SAAS,iBAAiB,cAAc,CAAC,WAAW;AACtD,QAAK,WAAW,KAAK,IAAI,IAAK,GAAG;AAC/B,iBAAW,IAAI,aAAa,IAAI,GAAG,MAAM;AAAA,IAC3C,OAAO;AACL,iBAAW,SAAS,aAAa,IAAI,GAAG,MAAM;AAAA,IAChD;AAAA,EACF,WAAW,SAAS,iBAAiB,cAAc,WAAW;AAC5D,QAAK,WAAW,KAAK,IAAI,IAAK,GAAG;AAC/B,iBAAW,WAAW,CAAC;AAAA,IACzB,OAAO;AACL,iBAAW,WAAW,CAAC;AAAA,IACzB;AAAA,EACF;AAEA,MAAI,SAAS,QAAQ,YAAY,QAAQ,GAAG;AAC1C,WAAO,eAAe,YAAY,UAAU,QAAQ;AAAA,EACtD;AAEA,SAAO;AACT;AAEO,IAAM,6BAA6B,CAAC,UAAe,QAAQ,GAAG,eAAW,eAAAA,SAAO,MAAuB;AAC5G,MAAI,CAAC,SAAS,aAAa,CAAC,SAAS,QAAS,QAAO,CAAC;AAEtD,QAAM,oBAAoB,eAAAA,QAAO,IAAI,SAAS,SAAS;AAEvD,MAAI,YAAY;AAEhB,QAAM,mBAAmB,SAAS,eAAe,mBAAmB,QAAQ;AAE5E,MAAI,WAAW,CAAC;AAEhB,MAAI,kBAAkB;AACpB,eAAW,CAAC,iBAAiB;AAAA,EAC/B;AAEA,QAAM,CAAC,EAAE,IAAI,IAAI,SAAS,UAAU,MAAM,GAAG;AAE7C,MAAI,SAAS,QAAQ;AACnB,UAAM,cAAc,SAAS,CAAC;AAG9B,WAAO,SAAS,QAAQ,aAAa,QAAQ,IAAI,CAAC,IAAI;AAAA,EACxD;AAGA,QAAM,mBAAmB,MAAM,KAAK,MAAM,mBAAmB,QAAQ,IAAI,KAAK,EAAE,KAAK,CAAC,EAAE,IAAI,MAAM;AAChG,UAAM,cAAc,eAAe,WAAW,UAAU,QAAQ;AAEhE,gBAAY,YAAY,KAAK,kBAAkB,KAAK,CAAC,EAAE,OAAO,kBAAkB,OAAO,CAAC;AAExF,WAAO;AAAA,EACT,CAAC;AAED,SAAO,CAAC,GAAG,UAAU,GAAG,gBAAgB;AAC1C;;;AC7EA;AAAA;AAAA;AAAA;AAAA;;;ACEO,IAAM,oBAAwC,CAAC,OAAO,SAAS,IAAI;AAEnE,IAAM,qBAA0G;AAAA,EACnH;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;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;;;AClNA,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.34",
3
+ "version": "1.3.36",
4
4
  "type": "module",
5
5
  "main": "./dist/cjs/index.js",
6
6
  "module": "./dist/esm/index.mjs",