@tamu-dor/famis-db 3.0.2 → 3.0.4
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/index.d.mts +6 -3
- package/dist/index.d.ts +6 -3
- package/dist/main.cjs +27 -6
- package/dist/main.cjs.map +1 -1
- package/dist/main.js +27 -6
- package/dist/main.js.map +1 -1
- package/package.json +4 -4
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sources":["../src/index.ts"],"sourcesContent":["import knex from \"knex\";\nimport { createId } from \"@paralleldrive/cuid2\";\n//@ts-ignore\nimport awaity from \"awaity\";\nimport revisionHash from \"rev-hash\";\nimport { attachPaginate } from \"knex-paginate\";\nimport \"knex-with-relations\";\n\nattachPaginate();\n\nexport type SortDirection = \"asc\" | \"desc\";\n\nexport interface PI {\n tamuEduPersonUIN: string;\n tamuEduPersonNetID: string | null;\n uid: string;\n sn: string;\n givenName: string;\n cn: string[];\n displayName: string;\n tamuEduPersonOfficialName: string;\n mail: string;\n postalAddress: string;\n mailStop: string;\n localityName: string;\n stateOrProvinceName: string;\n postalCode: string;\n telephoneNumber: string;\n title: string;\n tamuEduPersonTitleCode: string;\n tamuEduPersonDepartmentName: string;\n tamuEduPersonPrimaryMember: string;\n tamuEduPersonMember: string[];\n tamuEduPersonPrimaryMemberName: string | null;\n tamuEduPersonAffiliation: string[];\n eduPersonOrcid: string | null;\n tamuEduPersonAdLoc: string;\n tamuEduPersonEmpLoc: string;\n tamuEduDataFeed: string[];\n tamuLastSeenTimestamp: string | null;\n tamuEduPersonSupervisorUIN: string;\n tamuManualAddRDN: string | null;\n}\nexport interface AccountBalance {\n account_number: string;\n campus_code: string;\n fiscal_year: number;\n account: string;\n support_account: string;\n description?: string | null;\n balance: number;\n}\n\nexport interface Department {\n part: string;\n dept: string;\n sub?: string | null;\n dept_name: string;\n dept_head?: string | null;\n exec_level?: string | null;\n division?: string | null;\n school?: string | null;\n exp_date?: Date | null;\n idt_email?: string | null;\n id?: string | null; // GENERATED ALWAYS column\n}\n\nexport interface CoreAccountEmail {\n uid?: string;\n core_id?: number;\n account_number?: string;\n email: string;\n created?: Date | null;\n deleted?: Date | null;\n}\n\nexport type FAMISObjectCode = {\n id: number;\n revenue: string | null;\n expense: string | null;\n sales: boolean;\n srs: boolean;\n};\n\nexport type User = {\n id?: number;\n userId: string;\n admin?: boolean;\n role?: boolean;\n roleName?: string | null;\n roleEmail?: string | null;\n email?: string | null;\n usersSystemId?: number | null;\n systemId?: number | null;\n coreId?: number | null;\n coreUserId?: number | null;\n cores?: CorePayload | null;\n systems?: SystemPart[] | [] | null;\n deleted?: Date | null;\n};\n\nexport interface SystemPart {\n id: number;\n name: string;\n due: string;\n fein: string;\n agency: string;\n checkAddress: string;\n credit?: boolean | null;\n creditUrl?: string | null;\n creditFee?: string | null;\n part: string;\n abbrev: string;\n aggiebuy: string;\n image: string;\n}\n\nexport interface Account {\n uid: string;\n account_number: string;\n campus_code: string;\n fiscal_year: number;\n account: string;\n support_account: string;\n budget_support_account: string;\n budget_account_number: string;\n title: string | null;\n expiration_date: Date | null;\n status: string | null;\n uin: string;\n responsible_uin: string | null;\n department: string | null;\n setup_date: Date | null;\n budget_access: string | null;\n abr_rule: string;\n idt_allowed: boolean | null;\n adloc_campus_code: string | null;\n adloc_department: string | null;\n adloc_name: string | null;\n preferred_first_name: string | null;\n first_name: string | null;\n middle_name: string | null;\n last_name: string | null;\n email: string | null;\n work_phone: string | null;\n active: boolean | null;\n default_bank: string | null;\n bank_override: boolean | null;\n last_seen: Date | null;\n srs: boolean | null;\n cfda_no: string | null;\n sponsor_type: string | null;\n}\n\nexport interface CoreAccount {\n id?: number;\n account?: string;\n coreId: number;\n coreAccountId?: number;\n coreAccountActive?: boolean | null;\n effective?: Date | null;\n active?: boolean | null;\n}\n\nexport interface CoreUser {\n id?: number;\n userId?: string;\n coreId: number;\n coreUserId?: number;\n email?: boolean | null;\n}\n\nexport interface Core {\n id?: number;\n account?: string;\n effective?: string;\n facility?: string;\n contact: string;\n contactEmail: string;\n systemId: number;\n enabled: boolean;\n deleted: string | null;\n coreEmail?: string | null;\n corePhone: string | null;\n coreAddress: string | null;\n from_email: string | null;\n invoice_email: string | null;\n systemPart?: SystemPart;\n system_part?: string;\n system_name?: string;\n system_abbrev?: string;\n users?: CoreUser[];\n accounts?: CoreAccount[];\n}\n\nexport interface FamisDetails {\n invoiceType: string;\n invoiceNumber: string;\n customerPONumber: string;\n invoiceDepartment: string;\n sellingCampusCode: string;\n sellingAccountNumber: string;\n customerAccountNumber: string;\n sellingSupportAccount: string;\n}\n\nexport interface Details {\n ppu: number;\n date: string;\n famis: FamisDetails;\n other: string;\n amount: number;\n status: string;\n category: string;\n comments: string | null;\n quantity: number;\n pmtNumber: string | null;\n usageType: string;\n itemComment: string | null;\n customerName: string;\n purchaseDate: string;\n billingPeriod: string | null;\n customerEmail: string;\n customerTitle: string;\n itemDescription: string;\n sellingObjectCode: string;\n}\n\nexport interface HighRiskTransaction {\n [key: number]: Details[];\n}\n\nexport interface IsHighRisk {\n isHighRisk: boolean;\n flaggedTransactions: Details[];\n}\n\nexport interface CustomerAccountInfo {\n uid: string;\n account_number: string;\n campus_code: string;\n fiscal_year: number;\n account: string;\n support_account: string;\n budget_support_account: string;\n budget_account_number: string;\n title: string;\n expiration_date: string;\n status: string;\n uin: string;\n responsible_uin: string;\n department: string;\n setup_date: string;\n budget_access: string;\n abr_rule: string;\n idt_allowed: boolean;\n adloc_campus_code: string;\n adloc_department: string;\n adloc_name: string;\n preferred_first_name: string;\n first_name: string;\n middle_name: string | null;\n last_name: string;\n email: string;\n work_phone: string;\n active: boolean;\n default_bank: string;\n bank_override: boolean;\n srs: boolean;\n cfda_no: string;\n sponsor_type: string;\n billingEmailId: string;\n parent_account_idt_allowed: boolean;\n}\n\nexport interface HighRiskInfo {\n isHighRisk: boolean;\n flaggedTransactions: Details[];\n}\n\nexport interface Contact {\n fax?: string | null;\n city?: string | null;\n name?: string;\n email?: string | null;\n phone?: string | null;\n state?: string | null;\n country?: string | null;\n address1?: string | null;\n address2?: string | null;\n mailstop?: string | null;\n department?: string | null;\n postalCode?: string | null;\n institution?: string | null;\n}\n\nexport interface TransactionData {\n to: Contact;\n lab: string;\n date: string;\n from: Contact;\n number: string;\n details: Details[];\n fingerprint: string;\n totalAmount: string;\n}\n\nexport interface InvoiceComment {\n id?: number;\n uid?: string;\n invoice_id: string;\n user_id?: string | null;\n comment: string | null;\n type: string | null;\n created: string | null;\n deleted: string | null;\n}\n\nexport type InvoiceCommentFile = {\n id?: number; // Database generated id\n uid: string; // UID\n invoice_id: string; // Invoice UID\n comment_id: string; // Comment UID\n original_filename: string | null; // Original file name\n filename: string | null; // Generated unique filename on the filesystem\n created: Date | null; // Created date\n deleted: Date | null; // Deleted date\n};\n\nexport interface Invoice {\n uid?: string | null;\n number?: string | null;\n lab?: string | null;\n totalAmount?: string;\n date?: string;\n data: TransactionData;\n invoiced: boolean;\n type: string;\n famisInvoiceNumber: string;\n deleted: string | null;\n customerAccount: string;\n sellingAccount: string;\n postedDate: string | null;\n emailed: boolean;\n replace_data?: object | null;\n fingerprint?: string | null;\n core?: Core | null;\n customerAccountInfo?: CustomerAccountInfo | null;\n isIdt?: boolean | null;\n poNumber?: string | null;\n pi?: PI | null;\n highRiskInfo?: HighRiskInfo | null;\n comments?: InvoiceComment[] | null;\n}\n\nexport interface Edge {\n cursor: string;\n node: Invoice;\n}\n\nexport interface PageInfo {\n total?: number;\n lastPage?: number;\n currentPage: number;\n perPage: number;\n from: number;\n to: number;\n}\n\nexport interface InvoicePayload {\n data: Invoice[];\n pagination: PageInfo;\n}\n\nexport interface AccountPayload {\n data: Account[];\n pagination: PageInfo;\n}\n\nexport interface CorePayload {\n data: Core[];\n pagination: PageInfo;\n}\n\nconst systemPartFields: string[] = [\n \"id\",\n \"name\",\n \"due\",\n \"fein\",\n \"agency\",\n \"checkAddress\",\n \"credit\",\n \"creditUrl\",\n \"creditFee\",\n \"part\",\n \"abbrev\",\n \"aggiebuy\",\n \"image\",\n];\n\nconst invoiceFields: string[] = [\n \"uid\",\n \"number\",\n \"lab\",\n \"totalAmount\",\n \"date\",\n \"data\",\n \"invoiced\",\n \"type\",\n \"famisInvoiceNumber\",\n \"deleted\",\n \"customerAccount\",\n \"sellingAccount\",\n \"postedDate\",\n \"emailed\",\n \"replace_data\",\n];\n\nconst accountFields: string[] = [\n \"uid\",\n \"account_number\",\n \"campus_code\",\n \"fiscal_year\",\n \"account\",\n \"support_account\",\n \"budget_support_account\",\n \"budget_account_number\",\n \"title\",\n \"expiration_date\",\n \"status\",\n \"uin\",\n \"responsible_uin\",\n \"department\",\n \"setup_date\",\n \"budget_access\",\n \"abr_rule\",\n \"idt_allowed\",\n \"adloc_campus_code\",\n \"adloc_department\",\n \"adloc_name\",\n \"preferred_first_name\",\n \"first_name\",\n \"middle_name\",\n \"last_name\",\n \"email\",\n \"work_phone\",\n \"active\",\n \"default_bank\",\n \"bank_override\",\n \"srs\",\n \"cfda_no\",\n \"sponsor_type\",\n];\n\nconst departmentFields: string[] = [\n \"part\",\n \"dept\",\n \"sub\",\n \"dept_name\",\n \"dept_head\",\n \"exec_level\",\n \"division\",\n \"school\",\n \"exp_date\",\n \"idt_email\",\n \"id\",\n];\n\nconst accountBalanceFields: string[] = [\n \"account_number\",\n \"campus_code\",\n \"fiscal_year\",\n \"account\",\n \"support_account\",\n \"description\",\n \"balance\",\n];\n\nconst personFields: string[] = [\n \"tamuEduPersonUIN\",\n \"tamuEduPersonNetID\",\n \"uid\",\n \"sn\",\n \"givenName\",\n \"cn\",\n \"displayName\",\n \"tamuEduPersonOfficialName\",\n \"mail\",\n \"postalAddress\",\n \"mailStop\",\n \"localityName\",\n \"stateOrProvinceName\",\n \"postalCode\",\n \"telephoneNumber\",\n \"title\",\n \"tamuEduPersonTitleCode\",\n \"tamuEduPersonDepartmentName\",\n \"tamuEduPersonPrimaryMember\",\n \"tamuEduPersonMember\",\n \"tamuEduPersonPrimaryMemberName\",\n \"tamuEduPersonAffiliation\",\n \"eduPersonOrcid\",\n \"tamuEduDataFeed\",\n \"tamuLastSeenTimestamp\",\n \"tamuEduPersonSupervisorUIN\",\n \"tamuManualAddRDN\",\n];\n\nconst famisInvoiceNumbers = [\n {\n start: 300128,\n end: 399999,\n prefix: \"I\",\n aliases: [\"ilabs\"],\n },\n {\n start: 100000,\n end: 999999,\n prefix: \"V\",\n aliases: [\"mosaic\"],\n },\n];\nconst returningColumns = [\n \"uid\",\n \"number\",\n \"lab\",\n \"totalAmount\",\n \"data\",\n \"date\",\n \"type\",\n \"famisInvoiceNumber\",\n \"customerAccount\",\n \"sellingAccount\",\n];\n\n/**\n * Pads a string with leading zeros or truncates it to a specified length.\n * @param {string} str - The input string.\n * @param {number} max - The maximum length of the output string.\n * @param {boolean} right - If true, pads on the right instead of the left.\n * @returns {string} The padded or truncated string.\n */\nconst pad = (str: string, max: number, right?: boolean): string => {\n let retVal = str;\n str = str.toString();\n if (str.length < max) {\n retVal = pad(\"0\" + str, max);\n } else if (str.length > max) {\n retVal = str.substring(0, max);\n }\n if (right) {\n retVal = retVal.length < max ? pad(retVal + \"0\", max, right) : retVal;\n }\n return retVal;\n};\n\n/**\n * Sanitizes an account number by removing non-digit characters and padding/truncating to 13 digits.\n * @param {string} account - The input account number.\n * @returns {string} The sanitized account number.\n */\nconst sanitizeAccountNumber = (account: string): string =>\n pad(account.replace(/\\D/g, \"\"), 13, true);\n\n/**\n * Gets the core account number from a FAMIS object.\n * @param {object} famis - The FAMIS object containing sellingCampusCode, sellingAccountNumber, and sellingSupportAccount.\n * @returns {string} The core account number.\n */\nconst getCoreAccountNumber = (famis: {\n sellingCampusCode: string;\n sellingAccountNumber: string;\n sellingSupportAccount: string;\n}): string => {\n const { sellingCampusCode, sellingAccountNumber, sellingSupportAccount } =\n famis;\n const account = `${sellingCampusCode}${sellingAccountNumber}${sellingSupportAccount}`;\n return sanitizeAccountNumber(account);\n};\n\n/**\n * Recursively sorts the keys of an object.\n * @param {object} obj - The input object.\n * @returns {object} The object with sorted keys.\n */\nconst sortObjectKeys = (obj: any): any => {\n if (obj === null || obj === undefined) {\n return obj;\n }\n if (typeof obj !== \"object\") {\n // it is a primitive: number/string (in an array)\n return obj;\n }\n const result: any = Object.keys(obj)\n .sort()\n .reduce((acc: any, key: string) => {\n if (Array.isArray(obj[key])) {\n acc[key] = obj[key].map(sortObjectKeys);\n } else if (typeof obj[key] === \"object\") {\n acc[key] = sortObjectKeys(obj[key]);\n } else {\n acc[key] = obj[key];\n }\n return acc;\n }, {});\n return result;\n};\n\n/**\n * @typedef {Object} Account\n * @property {string} uid\n * @property {string} account_number\n * @property {string} campus_code\n * @property {number} fiscal_year\n * @property {string} account\n * @property {string} support_account\n * @property {string} budget_support_account\n * @property {string} budget_account_number\n * @property {string | null} title\n * @property {Date | null} expiration_date\n * @property {string | null} status\n * @property {string} uin\n * @property {string | null} responsible_uin\n * @property {string | null} department\n * @property {Date | null} setup_date\n * @property {string | null} budget_access\n * @property {string} abr_rule\n * @property {boolean | null} idt_allowed\n * @property {string | null} adloc_campus_code\n * @property {string | null} adloc_department\n * @property {string | null} adloc_name\n * @property {string | null} preferred_first_name\n * @property {string | null} first_name\n * @property {string | null} middle_name\n * @property {string | null} last_name\n * @property {string | null} email\n * @property {string | null} work_phone\n * @property {boolean | null} active\n * @property {string | null} default_bank\n * @property {boolean | null} bank_override\n * @property {Date | null} last_seen\n * @property {boolean | null} srs\n * @property {string | null} cfda_no\n * @property {string | null} sponsor_type\n */\n\n/**\n * Represents the Core schema.\n * @typedef {Object} Core\n * @property {number} id - The ID.\n * @property {string} account - The account.\n * @property {string} effective - The effective date.\n * @property {string} facility - The facility.\n * @property {string} contact - The contact.\n * @property {string} contactEmail - The contact email.\n * @property {number} systemId - The system ID.\n * @property {boolean} enabled - Indicates if it's enabled.\n * @property {string | null} deleted - The deletion status.\n * @property {string} coreEmail - The core email.\n * @property {string | null} corePhone - The core phone.\n * @property {string | null} coreAddress - The core address.\n * @property {string | null} from_email - The from email.\n * @property {string | null} invoice_email - The invoice email.\n * @property {Object} systemPart - The system part.\n */\n\n/**\n * @typedef {Object} Edge\n * @property {string} cursor - Description of the property.\n * @property {InvoiceSchema} node - Description of the property.\n */\n\n/**\n * @typedef {Object} PageInfo\n * @property {boolean} hasNextPage - Description of the property.\n * @property {boolean} hasPreviousPage - Description of the property.\n * @property {string|null} [startCursor] - Description of the property.\n * @property {string|null} [endCursor] - Description of the property.\n */\n\n/**\n * @typedef {Object} InvoicePayload\n * @property {Edge[]} edges - Description of the property.\n * @property {PageInfo} pageInfo - Description of the property.\n */\n\n/**\n * @typedef {Object} CorePayload\n * @property {Edge[]} edges - Description of the property.\n * @property {PageInfo} pageInfo - Description of the property.\n */\n\nclass FAMISDb {\n private db: any;\n //@ts-ignore\n private people: any[];\n\n constructor(config: any, people: any, debug: boolean) {\n if (config) {\n this.init(config, people, debug || false);\n }\n }\n\n /**\n * Initializes the database connection and sets up the Knex instance for interacting with PostgreSQL database.\n *\n * @param {any} config - The configuration object that includes details about how to connect to a PostgreSQL database. This should include properties such as `host`, `user`, `password`, etc.\n * @param {any} people - The data related to the 'people' entity. It could be an array of person objects or any other format depending on your application requirements.\n * @param {boolean} debug - A flag indicating whether to enable debugging for Knex queries. Defaults to `false`. If set to `true`, it will log all SQL queries that are executed against the database in the console.\n */\n init(config: any, people: any = null, debug: boolean = false): void {\n this.db = knex({\n client: \"pg\",\n connection: config,\n debug,\n pool: {\n min: 0,\n max: 10,\n createTimeoutMillis: 30000,\n acquireTimeoutMillis: 30000,\n idleTimeoutMillis: 30000,\n reapIntervalMillis: 1000,\n createRetryIntervalMillis: 100,\n },\n });\n this.people = people;\n }\n\n /**\n *\n * Extract customer account and po number\n * @param {object} famis\n * @param {object} replace_data\n * @returns {object} account number object\n * @memberof FAMISDb\n */\n getAccountNumber(\n famis: { customerAccountNumber: string; customerPONumber: string },\n replace_data?: { customerAccountNumber?: string; customerPONumber?: string }\n ): { accountNumber: string; poNumber: string | null } {\n const retVal = {\n accountNumber: \"\",\n poNumber: \"\",\n };\n\n if (\n famis.customerAccountNumber ||\n (replace_data && replace_data.customerAccountNumber)\n ) {\n retVal.accountNumber =\n replace_data && replace_data.customerAccountNumber\n ? replace_data.customerAccountNumber\n : famis.customerAccountNumber;\n } else if (\n famis.customerPONumber.includes(\"|\") ||\n (replace_data && replace_data.customerPONumber?.includes(\"|\"))\n ) {\n const result =\n replace_data && replace_data.customerPONumber?.includes(\"|\")\n ? replace_data.customerPONumber?.split(\"|\")\n : famis.customerPONumber.split(\"|\");\n retVal.accountNumber = sanitizeAccountNumber(result[0]);\n retVal.poNumber = result[1].trim();\n } else {\n retVal.accountNumber =\n replace_data && replace_data.customerPONumber\n ? sanitizeAccountNumber(replace_data.customerPONumber)\n : sanitizeAccountNumber(famis.customerPONumber);\n }\n\n return retVal;\n }\n\n /**\n *\n * Process an invoice to have all necessary relationships\n * @param {object} invoice - the invoice object sent by iLab\n * @param {boolean} [historical=false] - if true use historical accounts too\n * @returns {Promise<object>} invoice object\n * @memberof FAMISDb\n */\n async processInvoice(\n invoice: any,\n historical: boolean = false\n ): Promise<any> {\n // console.log(invoice);\n try {\n const account = getCoreAccountNumber(invoice.data.details[0].famis);\n invoice.core = await this.getCoreByAccount(account);\n\n if (invoice.core) {\n invoice.core.systemPart = await this.getSystemById(\n invoice.core.systemId\n );\n } else {\n const e = Error(\n `Revenue account ${account} is not associated with a core.`\n );\n throw e;\n }\n\n const campus = account.substring(0, 2);\n const revenueAccount = await this.getByAccountNumber(\n account,\n campus,\n historical\n );\n const customerAccountNumber = this.getAccountNumber(\n invoice.data.details[0].famis,\n invoice.replace_data\n );\n invoice.customerAccountInfo = await this.getByAccountNumber(\n customerAccountNumber.accountNumber,\n campus,\n historical\n );\n\n if (invoice.customerAccountInfo) {\n let idtAllowed =\n \"idt_allowed\" in invoice.customerAccountInfo &&\n invoice.customerAccountInfo.idt_allowed !== null\n ? invoice.customerAccountInfo.idt_allowed\n : \"parent_account_idt_allowed\" in invoice.customerAccountInfo &&\n invoice.customerAccountInfo.parent_account_idt_allowed;\n\n idtAllowed =\n idtAllowed &&\n !(\n invoice.replace_data &&\n typeof invoice.replace_data === \"object\" &&\n invoice.replace_data.forcedAr\n );\n\n const isIdt =\n customerAccountNumber &&\n customerAccountNumber.accountNumber?.substring(0, 2) ===\n account.substring(0, 2) &&\n idtAllowed;\n\n invoice.isIdt = isIdt;\n } else {\n invoice.isIdt = false;\n }\n\n let poNumber =\n customerAccountNumber.accountNumber?.substring(0, 2) !== \"68\"\n ? `${campus}-${revenueAccount.department}`\n : customerAccountNumber.poNumber;\n\n invoice.poNumber = poNumber;\n invoice.customerAccount = customerAccountNumber.accountNumber;\n\n if (invoice.customerAccountInfo && this.people) {\n const pi = invoice.customerAccountInfo.uin\n ? //@ts-ignore\n await this.people.getByUin(invoice.customerAccountInfo.uin)\n : [];\n\n if (pi.length) {\n invoice.pi = JSON.parse(JSON.stringify(pi[0]));\n }\n }\n\n invoice.highRiskInfo = await this.isSrsHighRisk(invoice);\n invoice.comments = await this.getInvoiceComments(invoice.uid);\n } catch (e) {\n throw e;\n }\n return invoice;\n }\n\n /**\n *\n * Get invoice by uid\n * @param {string} uid\n * @param {string} [sortColumn='date']\n * @param {string} [sortDirection='desc']\n * @param {boolean} [deleted=false]\n * @param {integer} page - page of results to return\n * @param {string} perPage - number of results per page to return\n * @returns {Promise<InvoicePayload>} invoice object\n * @memberof FAMISDb\n */\n async getInvoiceByUid(\n uid: string,\n sortColumn: string = \"date\",\n sortDirection: SortDirection | string = \"desc\",\n page: number = 1,\n perPage: number = 50\n ): Promise<InvoicePayload> {\n let self = this;\n let rows: InvoicePayload;\n try {\n rows = await this.db\n .from(\"invoices\")\n .andWhere(\"uid\", uid)\n .orderBy(sortColumn, sortDirection)\n .select(\"*\")\n .paginate({ perPage, currentPage: page, isLengthAware: true });\n rows.data = await Promise.all(\n rows.data.map(async (row: any) => {\n const rec: Invoice = await self.processInvoice(row);\n return rec;\n })\n );\n } catch (e) {\n throw e;\n }\n\n return rows;\n }\n\n /**\n *\n * Get invoice by originating system assigned number\n * @param {string} number\n * @param {string} [sortColumn='date']\n * @param {string} [sortDirection='desc']\n * @param {boolean} [deleted=false]\n * @param {integer} page - page of results to return\n * @param {string} perPage - number of results per page to return\n * @returns {Promise<InvoicePayload>} invoice object\n * @memberof FAMISDb\n */\n async getInvoiceByNumber(\n number: string,\n sortColumn: string = \"date\",\n sortDirection: SortDirection | string = \"desc\",\n page: number = 1,\n perPage: number = 50\n ): Promise<InvoicePayload> {\n let self = this;\n let rows: InvoicePayload;\n try {\n rows = await this.db\n .from(\"invoices\")\n .andWhere(\"number\", \"ILIKE\", `${number}%`)\n .orderBy(sortColumn, sortDirection)\n .select(\"*\")\n .paginate({ perPage, currentPage: page, isLengthAware: true });\n rows.data = await Promise.all(\n rows.data.map(async (row: any) => {\n const rec: Invoice = await self.processInvoice(row);\n return rec;\n })\n );\n } catch (e) {\n throw e;\n }\n\n return rows;\n }\n\n /**\n *\n * Get invoice by fingerprint\n * @param {string} fingerPrint\n * @returns {Promise<object>} invoice object\n * @memberof FAMISDb\n */\n async getInvoiceByFingerPrint(fingerPrint: string): Promise<any> {\n let records;\n let retVal;\n\n try {\n records = await this.db(\"invoices\").where(\"fingerprint\", fingerPrint);\n if (records.length) {\n retVal = await this.processInvoice(records[0]);\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Get all invoices associated with a specified account number\n * @param {string} accountNumber\n * @param {string} [sortColumn='date']\n * @param {string} [sortDirection='desc']\n * @param {boolean} [deleted=false]\n * @param {integer} page - page of results to return\n * @param {string} perPage - number of results per page to return\n * @returns {Promise<InvoicePayload>} invoice objects\n * @memberof FAMISDb\n */\n async getInvoicesByAccount(\n accountNumber: string | string[],\n sortColumn: string = \"date\",\n sortDirection: SortDirection | string = \"desc\",\n page: number = 1,\n perPage: number = 50\n ): Promise<InvoicePayload> {\n let self = this;\n let rows: InvoicePayload;\n try {\n const where = Array.isArray(accountNumber)\n ? `ALL(ARRAY[${accountNumber.map((n: string) => `'%${n}%'`).join()}])`\n : `ALL(ARRAY['%${accountNumber}%'])`;\n rows = await this.db\n .from(\"invoices\")\n .whereNull(\"deleted\")\n .andWhere(function (this: any) {\n this.where(\"customerAccount\", \"ilike\", this.db.raw(where));\n this.orWhere(\"sellingAccount\", \"ilike\", this.db.raw(where));\n this.orWhereRaw(\"replace_data->>'customerAccountNumber' = ?\", [\n accountNumber,\n ]);\n this.orWhereRaw(\"replace_data->>'customerPONumber' ILIKE ?\", [\n `${accountNumber}%`,\n ]);\n })\n .orderBy(sortColumn, sortDirection)\n .select(\"*\")\n .paginate({ perPage, currentPage: page, isLengthAware: true });\n rows.data = await Promise.all(\n rows.data.map(async (row: any) => {\n const rec: Invoice = await self.processInvoice(row);\n return rec;\n })\n );\n } catch (e) {\n throw e;\n }\n\n return rows;\n }\n\n /**\n *\n * Get all invoice ordered by and sorted by parameters passed\n * @param {string} [sortColumn='date']\n * @param {string} [sortDirection='desc']\n * @param {boolean} [deleted=false]\n * @param {integer} page - page of results to return\n * @param {string} perPage - number of results per page to return\n * @returns {Promise<InvoicePayload>} invoice objects\n * @memberof FAMISDb\n */\n async getAllInvoices(\n sortColumn: string = \"date\",\n sortDirection: SortDirection | string = \"desc\",\n deleted?: boolean,\n page: number = 1,\n perPage: number = 50\n ): Promise<InvoicePayload> {\n const self = this;\n let rows: InvoicePayload;\n try {\n const qry = this.db\n .from(\"invoices\")\n .orderBy(sortColumn, sortDirection)\n .select(\"*\");\n rows = deleted\n ? await qry\n .whereNotNull(\"deleted\")\n .paginate({ perPage, currentPage: page, isLengthAware: true })\n : await qry\n .whereNull(\"deleted\")\n .paginate({ perPage, currentPage: page, isLengthAware: true });\n rows.data = await Promise.all(\n rows.data.map(async (row: any) => {\n const rec = await self.processInvoice(row);\n return rec;\n })\n );\n } catch (e) {\n throw e;\n }\n //@ts-ignore\n return rows;\n }\n\n /**\n *\n * Retrieves invoices from the latest date\n * @param {string} [sortColumn='date']\n * @param {string} [sortDirection='desc']\n * @param {integer} first - corresponds to the first param of the Relay spec\n * @param {string} after - corresponds to the after param of the Relay spec\n * @param {integer} last - corresponds to the last param of the Relay spec\n * @param {string} before - corresponds to the before param of the Relay spec\n * @returns {Promise<InvoicePayload>} invoice objects\n * @memberof FAMISDb\n */\n async getLatestInvoices(\n sortColumn: string = \"date\",\n sortDirection: SortDirection | string = \"desc\",\n page: number = 1,\n perPage: number = 50\n ): Promise<InvoicePayload> {\n const self = this;\n let rows: InvoicePayload;\n try {\n rows = await this.db\n .from(\"invoices\")\n .whereNull(\"deleted\")\n .whereIn(\"date\", function (this: any) {\n this.max(\"date\").from(\"invoices\");\n })\n .orderBy(sortColumn, sortDirection)\n .select(\"*\")\n .paginate({ perPage, currentPage: page, isLengthAware: true });\n rows.data = await Promise.all(\n rows.data.map(async (row: any) => {\n const rec: Invoice = await self.processInvoice(row);\n return rec;\n })\n );\n } catch (e) {\n throw e;\n }\n //@ts-ignore\n return rows;\n }\n\n /**\n *\n * Returns all held invoices\n * @param {string} [sortColumn='date']\n * @param {string} [sortDirection='desc']\n * @param {integer} page - corresponds to the first param of the Relay spec\n * @param {integer} perPage - corresponds to the last param of the Relay spec\n * @returns {Promise<InvoicePayload>} held invoice objects\n * @memberof FAMISDb\n */\n async getHeldInvoices(\n sortColumn: string = \"date\",\n sortDirection: string = \"desc\",\n page: number = 1,\n perPage: number = 50\n ): Promise<InvoicePayload> {\n const self = this;\n let rows: InvoicePayload;\n try {\n rows = await this.db\n .from(\"invoices\")\n .whereNull(\"deleted\")\n .andWhere(\"invoiced\", \"0\")\n .orderBy(sortColumn, sortDirection)\n .select(\"*\")\n .paginate({ perPage, currentPage: page, isLengthAware: true });\n rows.data = await Promise.all(\n rows.data.map(async (row: any) => {\n const rec = await self.processInvoice(row);\n return rec;\n })\n );\n //@ts-ignore\n } catch (e) {\n throw e;\n }\n return rows;\n }\n\n /**\n *\n * Returns all awaiting email invoices\n * @param {string} [sortColumn='date']\n * @param {string} [sortDirection='desc']\n * @param {integer} first - corresponds to the first param of the Relay spec\n * @param {string} after - corresponds to the after param of the Relay spec\n * @param {integer} last - corresponds to the last param of the Relay spec\n * @param {string} before - corresponds to the before param of the Relay spec\n * @returns {Promise<InvoicePayload>} awaiting email invoice objects\n * @memberof FAMISDb\n */\n async getInvoicesAwaitingEmail(\n sortColumn: string = \"date\",\n sortDirection: SortDirection | string = \"desc\",\n page: number = 1,\n perPage: number = 50\n ): Promise<InvoicePayload> {\n const self = this;\n let rows: InvoicePayload;\n try {\n rows = await this.db\n .from(\"invoices\")\n .whereNull(\"deleted\")\n .andWhere(\"emailed\", \"False\")\n .orderBy(sortColumn, sortDirection)\n .select(\"*\")\n .paginate({ perPage, currentPage: page, isLengthAware: true });\n rows.data = await Promise.all(\n rows.data.map(async (row: any) => {\n const rec = await self.processInvoice(row);\n return rec;\n })\n );\n } catch (e) {\n throw e;\n }\n\n return rows;\n }\n\n /**\n *\n * Search invoices by originating system generated invoice number\n * @param {string} number\n * @param {string} [sortColumn='date']\n * @param {string} [sortDirection='desc']\n * @param {integer} first - corresponds to the first param of the Relay spec\n * @param {string} after - corresponds to the after param of the Relay spec\n * @param {integer} last - corresponds to the last param of the Relay spec\n * @param {string} before - corresponds to the before param of the Relay spec\n * @returns {Promise<InvoicePayload>} invoice objects\n * @memberof FAMISDb\n */\n async searchInvoicesByNumber(\n number: string,\n sortColumn: string = \"date\",\n sortDirection: SortDirection | string = \"desc\",\n page: number = 1,\n perPage: number = 50\n ): Promise<InvoicePayload> {\n const self = this;\n let rows: InvoicePayload;\n try {\n rows = await this.db\n .from(\"invoices\")\n .whereNull(\"deleted\")\n .andWhere(\"number\", \"ilike\", `${number}%`)\n .orderBy(sortColumn, sortDirection)\n .select(\"*\")\n .paginate({ perPage, currentPage: page, isLengthAware: true });\n rows.data = await Promise.all(\n rows.data.map(async (row: any) => {\n const rec = await self.processInvoice(row);\n return rec;\n })\n );\n } catch (e) {\n throw e;\n }\n\n return rows;\n }\n\n /**\n *\n * Search invoices by famis account number\n * @param {string} account\n * @param {string} [sortColumn='date']\n * @param {string} [sortDirection='desc']\n * @param {integer} first - corresponds to the first param of the Relay spec\n * @param {string} after - corresponds to the after param of the Relay spec\n * @param {integer} last - corresponds to the last param of the Relay spec\n * @param {string} before - corresponds to the before param of the Relay spec\n * @returns {Promise<InvoicePayload>} invoice objects\n * @memberof FAMISDb\n */\n async searchInvoicesByAccountNumber(\n account: string,\n sortColumn: string = \"date\",\n sortDirection: SortDirection | string = \"desc\",\n page: number = 1,\n perPage: number = 50\n ): Promise<InvoicePayload> {\n const self = this;\n let rows: InvoicePayload;\n try {\n rows = await this.db\n .from(\"invoices\")\n .whereNull(\"deleted\")\n .andWhere((q: any) =>\n q\n .where(\"sellingAccount\", \"ilike\", `${account}%`)\n .orWhere(\"customerAccount\", \"ilike\", `${account}%`)\n )\n .orderBy(sortColumn, sortDirection)\n .select(\"*\")\n .paginate({ perPage, currentPage: page, isLengthAware: true });\n rows.data = await Promise.all(\n rows.data.map(async (row: any) => {\n const rec = await self.processInvoice(row);\n return rec;\n })\n );\n } catch (e) {\n throw e;\n }\n return rows;\n }\n\n /**\n *\n * Search invoices by FAMIS invoice number\n * @param {string} famis\n * @param {string} [sortColumn='date']\n * @param {string} [sortDirection='desc']\n * @param {integer} page - page of results to return\n * @param {integer} perPage - number of results per page to return\n * @returns {Promise<InvoicePayload>} invoice objects\n * @memberof FAMISDb\n */\n async searchInvoicesByFamis(\n famis: string,\n sortColumn: string = \"date\",\n sortDirection: SortDirection | string = \"desc\",\n page: number = 1,\n perPage: number = 50\n ): Promise<InvoicePayload> {\n const self = this;\n let rows: InvoicePayload;\n try {\n rows = await this.db\n .from(\"invoices\")\n .whereNull(\"deleted\")\n .andWhere(\"famisInvoiceNumber\", \"ilike\", `${famis}%`)\n .orderBy(sortColumn, sortDirection)\n .select(\"*\")\n .paginate({ perPage, currentPage: page, isLengthAware: true });\n rows.data = await Promise.all(\n rows.data.map(async (row: any) => {\n const rec = await self.processInvoice(row);\n return rec;\n })\n );\n } catch (e) {\n throw e;\n }\n\n return rows;\n }\n\n /**\n *\n * Queries invoices\n * @param {string} query\n * @param {string} [sortColumn='date']\n * @param {string} [sortDirection='desc']\n * @param {integer} page - page of results to return\n * @param {integer} perPage - number of results per page to return\n * @returns {Promise<InvoicePayload>} invoice objects\n * @memberof FAMISDb\n */\n async queryInvoices(\n query: string,\n sortColumn: string = \"date\",\n sortDirection: SortDirection | string = \"desc\",\n page: number = 1,\n perPage: number = 50\n ): Promise<InvoicePayload> {\n const self = this;\n let rows: InvoicePayload;\n const invFields = invoiceFields.map((f: string) => `invoices.${f}`);\n const expenseAccountFields = accountFields.map(\n (f: string) => `expenseAccount.${f} AS expenseAccount_${f}`\n );\n const revenueAccountFields = accountFields.map(\n (f: string) => `revenueAccount.${f} AS revenueAccount_${f}`\n );\n const expenseAccountDeptFields = departmentFields.map(\n (f: string) =>\n `expenseAccountDepartment.${f} AS expenseAccountDepartment_${f}`\n );\n const revenueAccountDeptFields = departmentFields.map(\n (f: string) =>\n `revenueAccountDepartment.${f} AS revenueAccountDepartment_${f}`\n );\n const expenseAccountBalFields = accountBalanceFields.map(\n (f: string) => `expenseAccountBalance.${f} AS expenseAccountBalance_${f}`\n );\n const fields = [\n ...invFields,\n ...expenseAccountFields,\n ...revenueAccountFields,\n ...expenseAccountDeptFields,\n ...revenueAccountDeptFields,\n ...expenseAccountBalFields,\n ];\n try {\n rows = await this.db\n .from(\"invoices\")\n .leftJoin(\n \"accounts as expenseAccount\",\n \"invoices.customerAccount\",\n \"expenseAccount.account_number\"\n )\n .leftJoin(\n \"accounts as revenueAccount\",\n \"invoices.sellingAccount\",\n \"revenueAccount.account_number\"\n )\n .leftJoin(\n \"departments as expenseAccountDepartment\",\n function (this: any) {\n this.on(\n \"expenseAccount.department\",\n \"=\",\n \"expenseAccountDepartment.dept\"\n )\n .on(\n \"expenseAccountDepartment.part\",\n \"=\",\n \"expenseAccount.campus_code\"\n )\n .andOnVal(\"expenseAccountDepartment.sub\", null);\n }\n )\n .leftJoin(\n \"departments as revenueAccountDepartment\",\n function (this: any) {\n this.on(\n \"revenueAccount.department\",\n \"=\",\n \"revenueAccountDepartment.dept\"\n ).on(\n \"revenueAccountDepartment.part\",\n \"=\",\n \"revenueAccount.campus_code\"\n );\n }\n )\n .leftJoin(\n \"account_balances as expenseAccountBalance\",\n function (this: any) {\n this.on(\n \"expenseAccountBalance.account_number\",\n \"=\",\n \"expenseAccount.budget_account_number\"\n ).on(\n \"expenseAccountBalance.fiscal_year\",\n \"=\",\n \"expenseAccount.fiscal_year\"\n );\n }\n )\n .where(this.db.raw(query))\n .whereNull(\"revenueAccountDepartment.sub\")\n .orderBy(sortColumn, sortDirection)\n .select(fields)\n .paginate({ perPage, currentPage: page, isLengthAware: true });\n rows.data = await Promise.all(\n rows.data.map(async (row: any) => {\n const rec = await self.processInvoice(row);\n return rec;\n })\n );\n } catch (e) {\n throw e;\n }\n\n return rows;\n }\n\n /**\n *\n * Adds an invoice\n * @param {object} invoice\n * @param {string} type\n * @param {string} famisInvoiceNumber\n * @returns {Promise<object>} invoice\n * @memberof FAMISDb\n */\n async addInvoice(\n invoice: any,\n type: string,\n famisInvoiceNumber?: string\n ): Promise<any> {\n let records;\n\n try {\n famisInvoiceNumber = famisInvoiceNumber ?? undefined;\n famisInvoiceNumber = famisInvoiceNumber\n ? famisInvoiceNumber\n : await this.getNextFAMISInvoiceNumber(type);\n\n invoice.details.forEach((d: any) => {\n d.famis.invoiceNumber = famisInvoiceNumber;\n if (!d.other) {\n d.other = \"0.00\";\n }\n if (!d.comments) {\n d.comments = null;\n }\n if (!d.billingPeriod) {\n d.billingPeriod = null;\n }\n });\n\n records = await this.db(\"invoices\")\n .returning(returningColumns)\n .insert({\n number: invoice.number,\n lab: invoice.lab,\n totalAmount: parseFloat(invoice.totalAmount),\n data: JSON.stringify(invoice),\n date: invoice.date,\n uid: createId(),\n fingerprint: invoice.fingerprint,\n type: type,\n famisInvoiceNumber: famisInvoiceNumber,\n customerAccount: this.getAccountNumber(invoice.details[0].famis)\n .accountNumber,\n sellingAccount: getCoreAccountNumber(invoice.details[0].famis),\n });\n } catch (e) {\n throw e;\n }\n\n return records;\n }\n\n /**\n *\n * Updates an invoice\n * @param {string} uid\n * @param {Invoice} invoice\n * @returns {Promise<Invoice>} invoice object\n * @memberof FAMISDb\n */\n async updateInvoice(uid: string, invoice: Invoice): Promise<InvoicePayload> {\n let records;\n invoice.data.details.forEach((d: any) => {\n if (!d.other) {\n d.other = \"0.00\";\n }\n if (!d.comments) {\n d.comments = null;\n }\n if (!d.billingPeriod) {\n d.billingPeriod = null;\n }\n });\n try {\n const {\n comments,\n isIdt,\n poNumber,\n totalAmount,\n data,\n customerAccount,\n sellingAccount,\n fingerprint,\n ...rest\n } = invoice;\n\n const record: any = {\n ...rest,\n totalAmount: parseFloat(totalAmount!.replace(\"$\", \"\")),\n data: JSON.stringify(data),\n customerAccount: this.getAccountNumber(data.details[0].famis)\n .accountNumber,\n sellingAccount: getCoreAccountNumber(data.details[0].famis),\n fingerprint: fingerprint ? fingerprint : null,\n };\n /**\n if (invoice.replace_data) {\n record.replace_data = invoice.replace_data;\n }\n */\n records = await this.db(\"invoices\")\n .returning(returningColumns)\n .update(record)\n .where(\"uid\", uid);\n records = await this.getInvoiceByUid(uid);\n } catch (e) {\n throw e;\n }\n return records;\n }\n\n /**\n *\n * Toggles an invoice as paid\n * @param {string} uid\n * @param {boolean} invoiced\n * @returns {Promise<object>} invoice object\n * @memberof FAMISDb\n */\n async markInvoiced(uid: string, invoiced: boolean): Promise<any> {\n let records;\n\n try {\n records = await this.db(\"invoices\")\n .returning(returningColumns)\n .update({\n invoiced,\n })\n .where(\"uid\", uid);\n } catch (e) {\n throw e;\n }\n return records;\n }\n\n /**\n *\n * Toggles an invoice as emailed\n * @param {string} uid\n * @param {boolean} emailed\n * @returns {Promise<object>} invoice object\n * @memberof FAMISDb\n */\n async markEmailed(uid: string, emailed: boolean): Promise<any> {\n let records;\n\n try {\n records = await this.db(\"invoices\")\n .returning(returningColumns)\n .update({\n emailed,\n })\n .where(\"uid\", uid);\n } catch (e) {\n throw e;\n }\n return records;\n }\n\n /**\n *\n * Sets an invoice's deletion date\n * @param {string} uid\n * @param {date} deleted\n * @returns {Promise<object>} invoice object\n * @memberof FAMISDb\n */\n async setDeleted(uid: string, deleted: Date): Promise<any> {\n let records;\n\n try {\n records = await this.db(\"invoices\")\n .returning(returningColumns)\n .update({\n deleted,\n })\n .where(\"uid\", uid);\n } catch (e) {\n throw e;\n }\n return records;\n }\n\n /**\n *\n * Sets an invoice's posted date\n * @param {string} uid\n * @param {date} postedDate\n * @returns {Promise<object>} invoice object\n * @memberof FAMISDb\n */\n async setInvoicePostedDate(\n uid: string,\n postedDate: Date | null\n ): Promise<any> {\n let records;\n\n try {\n records = await this.db(\"invoices\")\n .returning(returningColumns)\n .update({\n postedDate,\n })\n .where(\"uid\", uid);\n } catch (e) {\n throw e;\n }\n return records;\n }\n\n /**\n *\n * Sets an invoice's fingerprint\n * @param {string} uid\n * @param {string} fingerprint\n * @returns {Promise<object>} invoice object\n * @memberof FAMISDb\n */\n async setInvoiceFingerPrint(uid: string, fingerprint: string): Promise<any> {\n let records;\n\n try {\n records = await this.db(\"invoices\")\n .returning(returningColumns)\n .update({\n fingerprint,\n })\n .where(\"uid\", uid);\n } catch (e) {\n throw e;\n }\n return records;\n }\n\n /**\n *\n * Get PI accounts by account number\n * @param {string} number\n * @param {string} campus\n * @param {boolean} [historical=false]\n * @returns {Promise<Account>} account object\n * @memberof FAMISDb\n */\n async getByAccountNumber(\n number: string,\n campus: string = \"02\",\n historical: boolean = false\n ): Promise<any> {\n let records;\n let retVal;\n let table = historical ? \"accounts_all\" : \"accounts\";\n const self = this;\n\n if (!number) {\n throw Error(\"Null account number\");\n }\n try {\n records = await this.db(`${table}`)\n .leftJoin(\"departments\", function (this: any) {\n this.on(`${table}.department`, \"=\", \"departments.dept\").on(\n \"departments.part\",\n \"=\",\n self.db.raw(\"?\", [number.substring(0, 2)])\n );\n })\n .leftJoin(`${table} as parent_account`, function (this: any) {\n this.on(`${table}.campus_code`, \"=\", \"parent_account.campus_code\")\n .on(`${table}.account`, \"=\", \"parent_account.account\")\n .on(\n \"parent_account.support_account\",\n \"=\",\n self.db.raw(\"?\", [\"00000\"])\n )\n .on(`${table}.fiscal_year`, \"=\", \"parent_account.fiscal_year\");\n })\n .select(\n `${table}.*`,\n \"departments.idt_email as billingEmailId\",\n \"parent_account.idt_allowed as parent_account_idt_allowed\"\n )\n .whereNull(\"departments.sub\")\n .andWhere(function (this: any) {\n this.whereNull(\"departments.exp_date\").orWhere(\n \"departments.exp_date\",\n \">\",\n self.db.raw(\"CURRENT_DATE\")\n );\n })\n .andWhere(`${table}.account_number`, number);\n if (records.length) {\n retVal = records[0];\n } else {\n records = await this.db(\"customers\")\n .where(\"account_number\", number)\n .andWhere(\"campus_code\", campus);\n if (records.length) {\n retVal = Object.assign({}, records[0], {\n idt_allowed: false,\n parent_account_idt_allowed: false,\n billingEmailId: records[0].email,\n });\n }\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Search PI accounts by partial account number\n * @param {string|string[]} number\n * @returns {Promise<AccountPayload>} account object(s)\n * @memberof FAMISDb\n */\n async searchByAccountNumber(\n number: string | string[],\n sortColumn: string = \"account_number\",\n sortDirection: SortDirection | string = \"desc\",\n page: number = 1,\n perPage: number = 50\n ): Promise<AccountPayload> {\n let records: AccountPayload;\n const self = this;\n\n try {\n const where = Array.isArray(number)\n ? `ALL(ARRAY[${number.map((n: string) => `'%${n}%'`).join()}])`\n : `ALL(ARRAY['%${number}%'])`;\n const accounts = await this.db(\"accounts\")\n .leftJoin(\"departments\", function (this: any) {\n this.on(\"accounts.department\", \"=\", \"departments.dept\").on(\n \"departments.part\",\n \"=\",\n \"accounts.campus_code\"\n );\n })\n .leftJoin(\"account_balances\", function (this: any) {\n this.on(\n \"account_balances.account_number\",\n \"=\",\n \"accounts.budget_account_number\"\n ).on(\"account_balances.fiscal_year\", \"=\", \"accounts.fiscal_year\");\n })\n .select(\n \"accounts.*\",\n \"departments.idt_email as billingEmailId\",\n \"account_balances.balance\"\n )\n .whereNull(\"departments.sub\")\n .andWhere(function (this: any) {\n this.whereNull(\"departments.exp_date\").orWhere(\n \"departments.exp_date\",\n \">\",\n self.db.raw(\"CURRENT_DATE\")\n );\n })\n .where(\"accounts.account_number\", \"ilike\", this.db.raw(where))\n .unionAll([\n this.db\n .select(\n \"NULL as uid\",\n \"NULL as campus_code\",\n \"NULL as account_number\",\n 'NULL as \"name\" as title',\n \"NULL as email\",\n \"NULL as fiscal_year\",\n \"NULL as account\",\n \"NULL as support_account\",\n \"NULL as budget_support_account\",\n \"NULL as budget_account_number\",\n \"NULL as expiration_date\",\n \"NULL as status\",\n \"NULL as uin\",\n \"NULL as responsible_uin\",\n \"NULL as department\",\n \"NULL as setup_date\",\n \"NULL as budget_access\",\n \"NULL as abr_rule\",\n \"NULL as idt_allowed\",\n \"NULL as adloc_campus_code\",\n \"NULL as adloc_department\",\n \"NULL as adloc_name\",\n \"NULL as preferred_first_name\",\n \"NULL as first_name\",\n \"NULL as middle_name\",\n \"NULL as last_name\",\n \"NULL as work_phone\",\n \"NULL as active\",\n \"NULL as default_bank\",\n \"NULL as bank_override\",\n \"NULL as last_seen\",\n \"NULL as srs\",\n \"NULL as cfda_no\",\n \"NULL as sponsor_type\",\n \"NULL as billingEmailId\",\n \"NULL as balance\"\n )\n .from(\"customers\")\n .where(\"customers.account_number\", \"ilike\", this.db.raw(where)),\n ])\n .orderBy(sortColumn, sortDirection)\n .paginate({ perPage, currentPage: page, isLengthAware: true });\n records = accounts;\n } catch (e) {\n throw e;\n }\n return records;\n }\n\n /**\n *\n * Get PI Accounts by UIN\n * @param {string|string[]} uin\n * @returns {Promise<Account[]>} account object array\n * @memberof FAMISDb\n */\n async getAccountsByUin(\n uin: string | string[],\n responsible?: boolean,\n sortColumn: string = \"account_number\",\n sortDirection: SortDirection | string = \"desc\",\n page: number = 1,\n perPage: number = 50\n ): Promise<AccountPayload> {\n let records: AccountPayload;\n const self = this;\n\n try {\n const where = Array.isArray(uin)\n ? `ALL(ARRAY[${uin.map((n: string) => `'%${n}%'`).join()}])`\n : `ALL(ARRAY['%${uin}%'])`;\n const qry = this.db(\"accounts\")\n .join(\n \"departments\",\n function (this: any) {\n this.on(\"accounts.department\", \"=\", \"departments.dept\").on(\n \"accounts.campus_code\",\n \"=\",\n \"departments.part\"\n );\n },\n \"left\"\n )\n .select(\"accounts.*\", \"departments.idt_email as billingEmailId\")\n .whereNull(\"departments.sub\")\n .andWhere(function (this: any) {\n this.whereNull(\"departments.exp_date\").orWhere(\n \"departments.exp_date\",\n \">\",\n self.db.raw(\"CURRENT_DATE\")\n );\n })\n .where(\"uin\", \"ilike\", this.db.raw(where))\n .orderBy(sortColumn, sortDirection);\n records = responsible\n ? await qry\n .orWhere(\"responsible_uin\", \"ilike\", this.db.raw(where))\n .paginate({ perPage, currentPage: page, isLengthAware: true })\n : await qry.paginate({\n perPage,\n currentPage: page,\n isLengthAware: true,\n });\n } catch (e) {\n throw e;\n }\n return records;\n }\n\n /**\n *\n * Get PI accounts by responsible UIN\n * @param {string} uin\n * @returns {Promise<Account[]>} account object array\n * @memberof FAMISDb\n */\n async getAccountsByResponsibleUin(\n uin: string | string[]\n ): Promise<Account[]> {\n let records: Account[];\n const self = this;\n\n try {\n const where = Array.isArray(uin)\n ? `ALL(ARRAY[${uin.map((n: string) => `'%${n}%'`).join()}])`\n : `ALL(ARRAY['%${uin}%'])`;\n records = await this.db(\"accounts\")\n .join(\n \"departments\",\n function (this: any) {\n this.on(\"accounts.department\", \"=\", \"departments.dept\").on(\n \"accounts.campus_code\",\n \"=\",\n \"departments.part\"\n );\n },\n \"left\"\n )\n .select(\"accounts.*\", \"departments.idt_email as billingEmailId\")\n .whereNull(\"departments.sub\")\n .andWhere(function (this: any) {\n this.whereNull(\"departments.exp_date\").orWhere(\n \"departments.exp_date\",\n \">\",\n self.db.raw(\"CURRENT_DATE\")\n );\n })\n .where(\"uin\", \"ilike\", this.db.raw(where));\n } catch (e) {\n throw e;\n }\n return records;\n }\n\n /**\n *\n * Queries accounts\n * @param {string} query\n * @param {string} [sortColumn='date']\n * @param {string} [sortDirection='desc']\n * @param {integer} page - page of results to return\n * @param {integer} perPage - number of results per page to return\n * @returns {Promise<AccountPayload>} invoice objects\n * @memberof FAMISDb\n */\n async queryAccounts(\n query: string,\n sortColumn: string = \"date\",\n sortDirection: SortDirection | string = \"desc\",\n page: number = 1,\n perPage: number = 50\n ): Promise<AccountPayload> {\n let rows: AccountPayload;\n const acctFields = accountFields.map((f: string) => `accounts.${f}`);\n const accountBalFields = accountBalanceFields.map(\n (f: string) => `accountBalance.${f} AS accountBalance_${f}`\n );\n const deptFields = departmentFields.map(\n (f: string) => `d.${f} AS department_${f}`\n );\n const accountantFields = personFields.map(\n (f: string) => `accountant.${f} AS accountant_${f}`\n );\n /*\n const expenseAccountFields = accountFields.map((f: string) => `expenseAccount.${f} AS expenseAccount_${f}`);\n const revenueAccountFields = accountFields.map((f: string) => `revenueAccount.${f} AS revenueAccount_${f}`);\n const revenueAccountDeptFields = departmentFields.map((f: string) => `revenueAccountDepartment.${f} AS revenueAccountDepartment_${f}`);\n */\n const fields = [\n ...acctFields,\n ...accountBalFields,\n ...deptFields,\n ...accountantFields,\n /*\n ...expenseAccountFields,\n ...revenueAccountFields,\n ...expenseAccountDeptFields,\n ...revenueAccountDeptFields,\n ...expenseAccountBalFields,\n */\n ];\n try {\n rows = await this.db\n .from(\"accounts\")\n .leftJoin(\"account_balances as accountBalance\", function (this: any) {\n this.on(\n \"accountBalance.account_number\",\n \"=\",\n \"accounts.budget_account_number\"\n ).on(\"accountBalance.fiscal_year\", \"=\", \"accounts.fiscal_year\");\n })\n .leftJoin(\"departments as d\", function (this: any) {\n this.on(\"accounts.department\", \"=\", \"d.dept\").on(\n \"accounts.campus_code\",\n \"=\",\n \"d.part\"\n );\n })\n .leftJoin(\"people.current as accountant\", function (this: any) {\n this.on(\n \"accounts.responsible_uin\",\n \"=\",\n \"accountant.tamuEduPersonUIN\"\n );\n })\n .where(this.db.raw(query))\n .whereNull(\"d.sub\")\n .orderBy(sortColumn, sortDirection)\n .select(fields)\n .paginate({ perPage, currentPage: page, isLengthAware: true });\n /*\n rows.data = await Promise.all(\n rows.data.map(async (row: any) => {\n const rec = await self.processInvoice(row);\n return rec;\n })\n );\n */\n } catch (e) {\n throw e;\n }\n\n return rows;\n }\n\n /**\n *\n * Get next FAMIS invoice number in sequence for specified invoice type\n * @param {string} invoice\n * @returns {Promise<string>} next invoice number in sequence\n * @memberof FAMISDb\n */\n async getNextFAMISInvoiceNumber(type: string): Promise<string> {\n let records;\n let prefix: {\n start: number;\n end: number;\n prefix: string;\n aliases: string[];\n } = {\n start: 0,\n end: 0,\n prefix: \"\",\n aliases: [],\n };\n let retVal;\n famisInvoiceNumbers.forEach((f) => {\n if (f.aliases.includes(type)) {\n prefix = f;\n }\n });\n try {\n retVal = `${prefix.prefix}${prefix.start}`;\n records = await this.db(\"invoices\")\n .whereIn(\"type\", prefix.aliases)\n .orderBy(\"famisInvoiceNumber\", \"desc\");\n if (records.length) {\n const number =\n parseInt(records[0].famisInvoiceNumber.substring(1), 10) + 1;\n //@ts-ignore\n retVal = `${prefix.prefix}${number}`;\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Get matching expense code for specified revenue code\n * @param {string} revenue\n * @returns {Promise<string>} expense code\n * @memberof FAMISDb\n */\n async getExpenseCodeByRevenue(revenue: string): Promise<string> {\n let records;\n let retVal;\n try {\n records = await this.db(\"codes\")\n .where(\"revenue\", revenue)\n .orderBy(\"id\", \"desc\");\n if (records.length) {\n retVal = records[0].expense;\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n * Represents a row in the 'codes' table.\n * @typedef {Object} Code\n * @property {number} id - The unique identifier for the code.\n * @property {string|null} revenue - The revenue code (nullable).\n * @property {string|null} expense - The expense code (nullable).\n * @property {boolean} sales - Indicates if the code is associated with sales.\n * @property {boolean} srs - Indicates if the code is associated with SRS.\n */\n\n /**\n *\n * Get revenue code object\n * @param {string} revenue\n * @returns {Promise<Code>} revenue code object\n * @memberof FAMISDb\n */\n async getRevenueCode(revenue: string): Promise<FAMISObjectCode> {\n let records;\n let retVal;\n try {\n records = await this.db(\"codes\")\n .where(\"revenue\", revenue)\n .orderBy(\"id\", \"desc\");\n if (records.length) {\n retVal = records[0];\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Get expense code object\n * @param {string} code\n * @returns {Promise<Code>} expense code object\n * @memberof FAMISDb\n */\n async getExpenseCode(code: string): Promise<FAMISObjectCode> {\n let records;\n let retVal;\n try {\n records = await this.db(\"codes\")\n .where(\"expense\", code)\n .orderBy(\"id\", \"desc\");\n if (records.length) {\n retVal = records[0];\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Check if expense code is within the allowable range for specified account and the specified fiscal year (defaults to the current)\n * @param {string} accountNumber\n * @param {string} code\n * @param {integer} fiscal\n * @returns {Promise<boolean>} truthy value\n * @memberof FAMISDb\n */\n async allowableExpenseCode(\n accountNumber: string,\n code: string,\n fiscal?: number\n ): Promise<boolean> {\n let records;\n let retVal = false;\n const year = fiscal ? fiscal : this.getCurrentFiscalYear();\n try {\n records = await this.db(\"subcode_edits\")\n .select(\"allowed\")\n .where(\"campus_code\", accountNumber.substring(0, 2))\n .andWhere(\"account\", accountNumber.substring(2, 8))\n .andWhere(\"support_account\", accountNumber.substring(8, 13))\n .andWhere(\"fiscal_year\", year)\n .andWhereRaw(\"? BETWEEN low AND high\", [parseInt(code)]);\n if (records.length) {\n retVal = records[0].allowed;\n } else {\n records = await this.db(\"abr_rules\")\n .select(\"abr_rules.*\")\n .join(\n \"accounts\",\n function (this: any) {\n this.on(\"accounts.abr_rule\", \"=\", \"abr_rules.abr_rule\")\n .on(\"accounts.campus_code\", \"=\", \"abr_rules.campus_code\")\n .on(\"accounts.fiscal_year\", \"=\", \"abr_rules.fiscal_year\");\n },\n \"left\"\n )\n .where(\"accounts.account_number\", accountNumber)\n .andWhere(\"accounts.fiscal_year\", year)\n .andWhereRaw(\"? BETWEEN abr_rules.low AND abr_rules.high\", [\n parseInt(code),\n ]);\n if (records.length) {\n retVal = true;\n }\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Get allowable expense code ranges for the specified account\n * @param {string} accountNumber\n * @param {integer} fiscal\n * @returns {Promise<boolean>} expense code range object(s)\n * @memberof FAMISDb\n */\n async getAllowableExpenseCodes(\n accountNumber: string,\n fiscal?: number\n ): Promise<{ allowed: object[]; disallowed: object[] }> {\n let abr;\n let subcode;\n let disallowed;\n let retVal = <{ allowed: any[]; disallowed: any[] }>{\n allowed: [],\n disallowed: [],\n };\n const year = fiscal ? fiscal : this.getCurrentFiscalYear();\n try {\n subcode = await this.db(\"subcode_edits\")\n .select(\"low\", \"high\")\n .where(\"campus_code\", accountNumber.substring(0, 2))\n .andWhere(\"account\", accountNumber.substring(2, 8))\n .andWhere(\"support_account\", accountNumber.substring(8, 13))\n .andWhere(\"fiscal_year\", year)\n .andWhere(\"allowed\", true)\n .orderBy(\"low\", \"asc\");\n disallowed = await this.db(\"subcode_edits\")\n .select(\"low\", \"high\")\n .where(\"campus_code\", accountNumber.substring(0, 2))\n .andWhere(\"account\", accountNumber.substring(2, 8))\n .andWhere(\"support_account\", accountNumber.substring(8, 13))\n .andWhere(\"fiscal_year\", year)\n .andWhere(\"allowed\", false)\n .orderBy(\"low\", \"asc\");\n abr = await this.db(\"abr_rules\")\n .select(\"abr_rules.low\", \"abr_rules.high\")\n .join(\n \"accounts\",\n function (this: any) {\n this.on(\"accounts.abr_rule\", \"=\", \"abr_rules.abr_rule\")\n .on(\"accounts.campus_code\", \"=\", \"abr_rules.campus_code\")\n .on(\"accounts.fiscal_year\", \"=\", \"abr_rules.fiscal_year\");\n },\n \"left\"\n )\n .where(\"accounts.account_number\", accountNumber)\n .andWhere(\"accounts.fiscal_year\", year)\n .orderBy(\"low\", \"asc\");\n if (abr.length || subcode.length) {\n const allowed = [...abr, ...subcode];\n retVal = {\n allowed,\n disallowed,\n };\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Query cores\n * @param {string} query\n * @param {string} [sortColumn='facility']\n * @param {string} [sortDirection='asc']\n * @param {integer} page - page of results to return\n * @param {integer} perPage - number of results per page to return\n * @param {string[]} excludeFields - fields to exclude from results\n * @returns {Promise<CorePayload>} core objects\n * @memberof FAMISDb\n */\n async queryCores(\n query: string,\n sortColumn: string = \"facility\",\n sortDirection: SortDirection | string = \"asc\",\n page: number = 1,\n perPage: number = 50,\n excludeFields: string[] = []\n ): Promise<CorePayload> {\n const self = this;\n let rows: CorePayload;\n const systemFields = systemPartFields.map(\n (f: string) => `system.${f} AS system_${f}`\n );\n /*\n const expenseAccountFields = accountFields.map((f: string) => `expenseAccount.${f} AS expenseAccount_${f}`);\n const revenueAccountFields = accountFields.map((f: string) => `revenueAccount.${f} AS revenueAccount_${f}`);\n const revenueAccountDeptFields = departmentFields.map((f: string) => `revenueAccountDepartment.${f} AS revenueAccountDepartment_${f}`);\n */\n const fields = [\n ...systemFields,\n /*\n ...expenseAccountFields,\n ...revenueAccountFields,\n ...expenseAccountDeptFields,\n ...revenueAccountDeptFields,\n ...expenseAccountBalFields,\n */\n ];\n if (excludeFields.length) {\n excludeFields.forEach((f: string) => {\n const idx = fields.findIndex((field: string) => field.includes(f));\n if (idx > -1) {\n fields.splice(idx, 1);\n }\n });\n }\n try {\n rows = await this.db\n .with(\"coreaccounts\", (qb: any) => {\n qb.select(\n \"accounts.*\",\n \"core_accounts.active as coreAccountActive\",\n \"core_accounts.coreId\",\n \"core_accounts.effective\",\n \"core_accounts.id as coreAccountId\"\n )\n .from(\"core_accounts\")\n .join(\n \"accounts\",\n \"core_accounts.account\",\n \"accounts.account_number\"\n );\n })\n .with(\"coreusers\", (qb: any) => {\n qb.select(\n \"users.*\",\n \"user_cores.email\",\n \"user_cores.coreId\",\n \"user_cores.id as coreUserId\"\n )\n .from(\"user_cores\")\n .join(\"users\", \"user_cores.userId\", \"users.id\");\n })\n .from(\"cores\")\n .leftJoin(\"system\", \"system.id\", \"cores.systemId\")\n .where(this.db.raw(query))\n .orderBy(sortColumn, sortDirection)\n .leftJoin(\n this.db\n .from(\"user_cores\")\n .join(\"coreusers\", {\n \"user_cores.userId\": \"coreusers.id\",\n \"user_cores.coreId\": \"coreusers.coreId\",\n })\n .select(\n \"user_cores.coreId\",\n this.db.raw(\n \"case when count(coreusers) = 0 then '[]' else jsonb_agg(coreusers.*) end as users\"\n )\n )\n .groupBy([\"user_cores.coreId\"])\n .as(\"user_cores\"),\n \"user_cores.coreId\",\n \"cores.id\"\n )\n .leftJoin(\n this.db\n .from(\"core_accounts\")\n .join(\"coreaccounts\", {\n \"core_accounts.account\": \"coreaccounts.account_number\",\n \"core_accounts.coreId\": \"coreaccounts.coreId\",\n })\n .select(\n \"core_accounts.coreId\",\n this.db.raw(\n \"case when count(coreaccounts) = 0 then '[]' else jsonb_agg(coreaccounts.*) end as accounts\"\n )\n )\n .groupBy([\"core_accounts.coreId\"])\n .as(\"core_accounts\"),\n \"core_accounts.coreId\",\n \"cores.id\"\n )\n .select([\n \"cores.*\",\n \"user_cores.users\",\n \"core_accounts.accounts\",\n ...fields,\n ])\n .paginate({ perPage, currentPage: page, isLengthAware: true });\n if (self.people) {\n rows.data = await Promise.all(\n rows.data.map(async (row: any) => {\n const uids = row.users?.map((u: any) => u.userId);\n if (uids) {\n // @ts-ignore\n const users = await self.people.bulkGetByUid(uids);\n if (users) {\n row.users = row.users?.map((u: any) => {\n let retVal = u;\n const user = users.find((u1: any) => u1.uid === u.userId);\n if (user) {\n retVal = {\n ...u,\n ...user,\n };\n } else if (u.role) {\n retVal = {\n ...u,\n sn: u.roleName,\n mail: u.roleEmail,\n };\n }\n return retVal;\n });\n }\n }\n return row;\n })\n );\n }\n } catch (e) {\n throw e;\n }\n\n return rows;\n }\n\n /**\n *\n * Get core by specified attribute and search term\n * @param {string} type\n * @param {string} operator\n * @param {string} search\n * @returns {Promise<Core>} core object\n * @memberof FAMISDb\n */\n async getCore(\n type: string,\n operator: string = \"=\",\n search: string\n ): Promise<Core> {\n let records;\n let retVal;\n try {\n const systemFields = systemPartFields.map(\n (f: string) => `system.${f} AS system_${f}`\n );\n const fields = [\n ...systemFields,\n /*\n ...expenseAccountFields,\n ...revenueAccountFields,\n ...expenseAccountDeptFields,\n ...revenueAccountDeptFields,\n ...expenseAccountBalFields,\n */\n ];\n records = await this.db\n .with(\"coreaccounts\", (qb: any) => {\n qb.select(\n \"accounts.*\",\n \"core_accounts.coreId\",\n \"core_accounts.active as coreAccountActive\",\n \"core_accounts.effective\",\n \"core_accounts.id as coreAccountId\"\n )\n .from(\"core_accounts\")\n .join(\n \"accounts\",\n \"core_accounts.account\",\n \"accounts.account_number\"\n );\n })\n .with(\"coreusers\", (qb: any) => {\n qb.select(\n \"users.*\",\n \"user_cores.email\",\n \"user_cores.coreId\",\n \"user_cores.id as coreUserId\"\n )\n .from(\"user_cores\")\n .join(\"users\", \"user_cores.userId\", \"users.id\");\n })\n .from(\"cores\")\n .leftJoin(\"system\", \"system.id\", \"cores.systemId\")\n .where(type, operator, search)\n .leftJoin(\n this.db\n .from(\"user_cores\")\n .join(\"coreusers\", {\n \"user_cores.userId\": \"coreusers.id\",\n \"user_cores.coreId\": \"coreusers.coreId\",\n })\n .select(\n \"user_cores.coreId\",\n this.db.raw(\n \"case when count(coreusers) = 0 then '[]' else jsonb_agg(coreusers.*) end as users\"\n )\n )\n .groupBy([\"user_cores.coreId\"])\n .as(\"user_cores\"),\n \"user_cores.coreId\",\n \"cores.id\"\n )\n .leftJoin(\n this.db\n .from(\"core_accounts\")\n .join(\"coreaccounts\", {\n \"core_accounts.account\": \"coreaccounts.account_number\",\n \"core_accounts.coreId\": \"coreaccounts.coreId\",\n })\n .select(\n \"core_accounts.coreId\",\n this.db.raw(\n \"case when count(coreaccounts) = 0 then '[]' else jsonb_agg(coreaccounts.*) end as accounts\"\n )\n )\n .groupBy([\"core_accounts.coreId\"])\n .as(\"core_accounts\"),\n \"core_accounts.coreId\",\n \"cores.id\"\n )\n .select([\n \"cores.*\",\n \"user_cores.users\",\n \"core_accounts.accounts\",\n ...fields,\n ]);\n if (records.length) {\n retVal = records[0];\n if (this.people) {\n const uids = retVal.users?.map((u: any) => u.userId);\n if (uids) {\n // @ts-ignore\n const users = await this.people.bulkGetByUid(uids);\n if (users) {\n retVal.users = retVal.users?.map((u: any) => {\n let retVal = u;\n const user = users.find((u1: any) => u1.uid === u.userId);\n if (user) {\n retVal = {\n ...u,\n ...user,\n };\n } else if (u.role) {\n retVal = {\n ...u,\n sn: u.roleName,\n mail: u.roleEmail,\n };\n }\n return retVal;\n });\n }\n }\n }\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Get core by id\n * @param {string} id\n * @returns {Promise<Core>} core object\n * @memberof FAMISDb\n */\n async getCoreById(id: string): Promise<Core> {\n let retVal;\n try {\n retVal = await this.getCore(\"cores.id\", \"=\", id);\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Get core by account number\n * @param {string} account\n * @returns {Promise<Core>} core object\n * @memberof FAMISDb\n */\n async getCoreByAccount(account: string): Promise<Core> {\n let retVal;\n try {\n retVal = await this.getCore(\n \"core_accounts.accounts\",\n \"@>\",\n `[{\"account_number\": \"${account}\"}]`\n );\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Update core\n * @param {Core} core object\n * @returns {Promise<Core>} core object\n * @memberof FAMISDb\n */\n async updateCore(core: Core): Promise<Core | undefined> {\n let retVal;\n const columns = [\n \"id\",\n \"facility\",\n \"contact\",\n \"contactEmail\",\n \"systemId\",\n \"enabled\",\n \"deleted\",\n \"coreEmail\",\n \"corePhone\",\n \"coreAddress\",\n \"from_email\",\n \"invoice_email\",\n ];\n const { id, ...record } = core;\n try {\n if (id) {\n await this.db(\"cores\")\n .returning(columns)\n .update(record)\n .where(\"id\", id);\n retVal = await this.getCore(\"cores.id\", \"=\", id.toString());\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Add core\n * @param {Core} core object\n * @returns {Promise<Core>} core object\n * @memberof FAMISDb\n */\n async addCore(core: Core): Promise<Core> {\n let retVal;\n const columns = [\n \"id\",\n \"facility\",\n \"contact\",\n \"contactEmail\",\n \"systemId\",\n \"enabled\",\n \"deleted\",\n \"coreEmail\",\n \"corePhone\",\n \"coreAddress\",\n \"from_email\",\n \"invoice_email\",\n ];\n try {\n retVal = await this.db(\"cores\").returning(columns).insert(core);\n if (retVal && retVal.length) {\n retVal = retVal[0];\n }\n const systemPart = this.getSystemById(retVal.systemId);\n retVal.systemPart = systemPart;\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Update core account\n * @param {CoreAccount} account object\n * @returns {Promise<CoreAccount>} core_account object\n * @memberof FAMISDb\n */\n async updateCoreAccount(account: CoreAccount): Promise<CoreAccount> {\n let retVal;\n const columns = [\"id\", \"account\", \"effective\", \"coreId\", \"active\"];\n const { id, ...record } = account;\n try {\n if (\"id\" in account) {\n retVal = await this.db(\"core_accounts\")\n .returning(columns)\n .update(record)\n .where(\"id\", id);\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Add core_account\n * @param {CoreAccount} account object\n * @returns {Promise<CoreAccount>} core_account object\n * @memberof FAMISDb\n */\n async addCoreAccount(account: CoreAccount): Promise<CoreAccount> {\n let retVal;\n const columns = [\"id\", \"account\", \"effective\", \"coreId\", \"active\"];\n try {\n retVal = await this.db(\"core_accounts\")\n .returning(columns)\n .insert(account);\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Delete core account\n * @param {coreAccountId} string core account id\n * @returns {Promise<CoreAccount>} core account object\n * @memberof FAMISDb\n */\n async deleteCoreAccount(coreAccountId: string): Promise<CoreAccount> {\n let retVal;\n try {\n retVal = await this.db(\"core_accounts\")\n .where(\"id\", coreAccountId)\n .delete();\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Get system part by ID\n * @param {number} id\n * @returns {Promise<SystemPart>} system part object\n * @memberof FAMISDb\n */\n async getSystemById(id: number): Promise<SystemPart> {\n let records;\n let retVal;\n try {\n records = await this.db(\"system\").where(\"id\", id).orderBy(\"id\", \"desc\");\n if (records.length) {\n retVal = records[0];\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Get system part by two-digit part number\n * @param {string} number\n * @returns {Promise<SystemPart>} system part object\n * @memberof FAMISDb\n */\n async getSystemByPartNumber(number: string): Promise<SystemPart> {\n let records;\n let retVal;\n try {\n records = await this.db(\"system\")\n .where(\"part\", number)\n .orderBy(\"id\", \"desc\");\n if (records.length) {\n retVal = records[0];\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Get all enabled cores\n * @returns {Promise<Core[]>} core objects\n * @memberof FAMISDb\n */\n async getEnabledCores(): Promise<Core[]> {\n let records;\n let retVal = [];\n try {\n records = await this.db\n .with(\"coreaccounts\", (qb: any) => {\n qb.select(\n \"accounts.*\",\n \"core_accounts.active as coreAccountActive\",\n \"core_accounts.coreId\",\n \"core_accounts.effective\",\n \"core_accounts.id as coreAccountId\"\n )\n .from(\"core_accounts\")\n .join(\n \"accounts\",\n \"core_accounts.account\",\n \"accounts.account_number\"\n );\n })\n .with(\"coreusers\", (qb: any) => {\n qb.select(\n \"users.*\",\n \"user_cores.email\",\n \"user_cores.coreId\",\n \"user_cores.id as coreUserId\"\n )\n .from(\"user_cores\")\n .join(\"users\", \"user_cores.userId\", \"users.id\");\n })\n .from(\"cores\")\n .leftJoin(\n this.db\n .from(\"user_cores\")\n .join(\"coreusers\", {\n \"user_cores.userId\": \"coreusers.id\",\n \"user_cores.coreId\": \"coreusers.coreId\",\n })\n .select(\n \"user_cores.coreId\",\n this.db.raw(\n \"case when count(coreusers) = 0 then '[]' else jsonb_agg(coreusers.*) end as users\"\n )\n )\n .groupBy([\"user_cores.coreId\"])\n .as(\"user_cores\"),\n \"user_cores.coreId\",\n \"cores.id\"\n )\n .leftJoin(\n this.db\n .from(\"core_accounts\")\n .join(\"coreaccounts\", {\n \"core_accounts.account\": \"coreaccounts.account_number\",\n \"core_accounts.coreId\": \"coreaccounts.coreId\",\n })\n .select(\n \"core_accounts.coreId\",\n this.db.raw(\n \"case when count(coreaccounts) = 0 then '[]' else jsonb_agg(coreaccounts.*) end as accounts\"\n )\n )\n .groupBy([\"core_accounts.coreId\"])\n .as(\"core_accounts\"),\n \"core_accounts.coreId\",\n \"cores.id\"\n )\n .select(\"cores.*\", \"user_cores.users\", \"core_accounts.accounts\")\n .where(\"enabled\", \"1\")\n .orderBy(\"cores.id\", \"desc\");\n if (records.length) {\n retVal = records;\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Get all cores\n * @param {string} [sortColumn='facility']\n * @param {string} [sortDirection='asc']\n * @param {boolean} [deleted=false]\n * @param {integer} page - page of results to return\n * @param {string} perPage - number of results per page to return\n * @returns {Promise<CorePayload>} core objects\n * @memberof FAMISDb\n */\n async getAllCores(\n sortColumn: string = \"facility\",\n sortDirection: SortDirection | string = \"asc\",\n deleted?: boolean,\n page: number = 1,\n perPage: number = 50\n ): Promise<CorePayload> {\n let rows;\n try {\n const systemParts = await this.getAllSystemParts();\n const qry = this.db(\"cores\")\n .orderBy(sortColumn, sortDirection)\n .select(\"*\");\n rows = deleted\n ? await qry\n .whereNotNull(\"deleted\")\n .paginate({ perPage, currentPage: page, isLengthAware: true })\n : await qry\n .whereNull(\"deleted\")\n .paginate({ perPage, currentPage: page, isLengthAware: true });\n rows.data = rows.data.map((c: any) => {\n const systemPart = systemParts.find((s) => s.id === c.systemId);\n return {\n ...c,\n systemPart,\n };\n });\n } catch (e) {\n throw e;\n }\n return rows;\n }\n\n /**\n *\n * Get a core's users by core ID\n * @param {number} coreId\n * @returns {Promise<Core[]>} user objects\n * @memberof FAMISDb\n */\n async getCoreUsers(coreId: number): Promise<Core[]> {\n let retVal;\n try {\n retVal = await this.db(\"user_cores\")\n .join(\"users\", \"user_cores.userId\", \"=\", \"users.id\")\n .where(\"coreId\", coreId)\n .select(\n \"users.*\",\n \"user_cores.id as userCoreId\",\n \"user_cores.coreId\",\n \"user_cores.email\"\n );\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Update core user\n * @param {CoreUser} user object\n * @returns {Promise<CoreUser>} user_core object\n * @memberof FAMISDb\n */\n async updateCoreUser(user: CoreUser): Promise<CoreUser> {\n let retVal;\n const columns = [\"id\", \"userId\", \"coreId\", \"email\"];\n const { id, ...record } = user;\n try {\n if (\"id\" in user) {\n retVal = await this.db(\"user_cores\")\n .returning(columns)\n .update(record)\n .where(\"id\", id);\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n * This function adds a new CoreUser to the database. If the user already exists, it updates the existing record.\n * @param {CoreUser} coreUser - The CoreUser object containing details about the user.\n * @return {Promise<CoreUser>} A Promise that resolves to the newly added or updated CoreUser, if successfully added and returned from the database; otherwise it rejects with an error.\n */\n async addCoreUser(coreUser: CoreUser): Promise<CoreUser> {\n let retVal;\n const columns = [\"id\", \"userId\", \"coreId\", \"email\"];\n try {\n let record = {\n userId: coreUser.userId,\n };\n const [userInsert] = await this.db(\"users\")\n .insert(record)\n .onConflict(\"userId\")\n .merge()\n .returning(\"*\");\n if (userInsert) {\n retVal = await this.db(\"user_cores\")\n .insert({\n ...coreUser,\n userId: userInsert.id,\n })\n .onConflict([\"userId\", \"coreId\"])\n .ignore()\n .returning(columns);\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Delete core user\n * @param {coreUserId} string core user object\n * @returns {Promise<CoreUser>} core user object\n * @memberof FAMISDb\n */\n async deleteCoreUser(coreUserId: string): Promise<CoreUser> {\n let retVal;\n try {\n retVal = await this.db(\"user_cores\").where(\"id\", coreUserId).delete();\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Get a user's cores they manage\n * @param {string} userId\n * @param {string} [sortColumn='facility']\n * @param {string} [sortDirection='asc']\n * @param {boolean} [deleted=false]\n * @param {integer} page - page of results to return\n * @param {string} perPage - number of results per page to return\n * @returns {Promise<CorePayload]>} core objects\n * @memberof FAMISDb\n */\n async getUserCores(\n userId: string,\n sortColumn: string = \"facility\",\n sortDirection: SortDirection | string = \"asc\",\n deleted?: boolean,\n page: number = 1,\n perPage: number = 50\n ): Promise<CorePayload> {\n let rows;\n try {\n const systemParts = await this.getAllSystemParts();\n const qry = this.db(\"user_cores\")\n .join(\"cores\", \"user_cores.coreId\", \"=\", \"cores.id\")\n .join(\"users\", \"user_cores.userId\", \"=\", \"users.id\")\n .where(\"users.userId\", userId)\n .select(\n \"cores.*\",\n \"user_cores.id as userCoreId\",\n \"user_cores.userId\",\n \"user_cores.email\"\n )\n .orderBy(sortColumn, sortDirection);\n rows = deleted\n ? await qry\n .whereNotNull(\"cores.deleted\")\n .paginate({ perPage, currentPage: page, isLengthAware: true })\n : await qry\n .whereNull(\"cores.deleted\")\n .paginate({ perPage, currentPage: page, isLengthAware: true });\n rows.data = rows.data.map((c: any) => {\n const systemPart = systemParts.find((s) => s.id === c.systemId);\n return {\n ...c,\n systemPart,\n };\n });\n } catch (e) {\n throw e;\n }\n return rows;\n }\n\n /**\n *\n * Get a system part's users by system ID\n * @param {number} systemId\n * @returns {Promise<object[]>} user objects\n * @memberof FAMISDb\n */\n async getSystemUsers(systemId: number): Promise<User[]> {\n let retVal;\n try {\n retVal = await this.db(\"user_systems\")\n .join(\"users\", \"user_systems.userId\", \"=\", \"users.id\")\n .where(\"systemId\", systemId)\n .select(\n \"users.*\",\n \"user_systems.id as userSystemId\",\n \"user_systems.systemId\",\n \"user_systems.email\"\n );\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Get a user's system parts they manage\n * @param {string} userId\n * @returns {Promise<SystemPart[]>} system objects\n * @memberof FAMISDb\n */\n async getUserSystemParts(userId: string): Promise<SystemPart[]> {\n let retVal;\n try {\n retVal = await this.db(\"user_systems\")\n .join(\"system\", \"user_systems.systemId\", \"=\", \"system.id\")\n .join(\"users\", \"user_systems.userId\", \"=\", \"users.id\")\n .where(\"users.userId\", userId)\n .select(\n \"system.*\",\n \"user_systems.id as userSystemId\",\n \"user_systems.userId\",\n \"user_systems.email\"\n );\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n * Represents the \"system\" table in the public schema.\n * @typedef {Object} System\n * @property {number} id - The ID (auto-generated).\n * @property {string | null} name - The name.\n * @property {string | null} due - The due text.\n * @property {string | null} fein - The FEIN (Federal Employer Identification Number).\n * @property {string | null} agency - The agency.\n * @property {string | null} checkAddress - The check address.\n * @property {boolean} credit - Indicates if credit is allowed.\n * @property {string | null} creditUrl - The credit URL.\n * @property {string | null} creditFee - The credit fee.\n * @property {string | null} part - The part.\n * @property {string | null} abbrev - The abbreviation.\n * @property {string | null} aggiebuy - The AggieBuy information.\n * @property {string | null} image - The image URL.\n */\n\n /**\n * Get all system parts.\n * @returns {Promise<SystemPart[]>} System objects.\n * @memberof FAMISDb\n */\n async getAllSystemParts(): Promise<SystemPart[]> {\n let retVal: SystemPart[];\n try {\n retVal = await this.db(\"system\").orderBy(\"id\", \"asc\");\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n * Get all admin users.\n * @returns {Promise<object[]>} Array of user objects.\n * @memberof FAMISDb\n */\n async getAdminUsers(): Promise<User[] | []> {\n let retVal: User[] | [] = [];\n try {\n retVal = await this.db(\"users\").where(\"admin\", true);\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n * Get user.\n * @param {string} userId - User ID.\n * @returns {Promise<object>} User object.\n * @memberof FAMISDb\n */\n async getUser(userId: string): Promise<User | null> {\n let records: User[];\n let retVal: User | null = null;\n try {\n records = await this.db(\"users\").where(\"userId\", userId);\n if (records.length) {\n const cores = await this.getUserCores(userId);\n const systems = await this.getUserSystemParts(userId);\n retVal = {\n ...records[0],\n cores,\n systems,\n };\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n * Update user.\n * @param {object} user - User object.\n * @returns {Promise<object>} Updated user object.\n * @memberof FAMISDb\n */\n async updateUser(user: object): Promise<object | null> {\n let retVal: object | null = null;\n const columns = [\n \"id\",\n \"userId\",\n \"admin\",\n \"role\",\n \"roleName\",\n \"roleEmail\",\n \"deleted\",\n ];\n try {\n if (\"id\" in user)\n retVal = await this.db(\"users\")\n .returning(columns)\n .update(user)\n .where(\"id\", user.id);\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n * Get customer by customer account number.\n * @param {string} accountNumber - Customer account number.\n * @param {string} campusCode - Campus code.\n * @returns {Promise<object>} Customer account object.\n * @memberof FAMISDb\n */\n async getCustomerNumber(\n accountNumber: string,\n campusCode: string\n ): Promise<object | null> {\n let records: object[];\n let retVal: object | null = null;\n const code = pad(campusCode, 2);\n\n try {\n records = await this.db(\"customers\").where(\n \"uid\",\n `${code}${accountNumber}`\n );\n if (records.length) {\n retVal = records[0];\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n * Get current fiscal year.\n * @returns {number} Fiscal year.\n * @memberof FAMISDb\n */\n getCurrentFiscalYear(): number {\n let year: number;\n let today = new Date();\n if (today.getMonth() + 1 >= 9) {\n year = today.getFullYear() + 1;\n } else {\n year = today.getFullYear();\n }\n return year;\n }\n\n /**\n * Return fingerprint of invoice.\n * @param {object} invoice - JSON object.\n * @returns {string} Fingerprint.\n * @memberof FAMISDb\n */\n getInvoiceFingerPrint(invoice: object): string {\n const fingerPrint = revisionHash(\n JSON.stringify(sortObjectKeys(invoice), (_k, v) =>\n v === undefined ? \"undef\" : v\n )\n );\n return fingerPrint;\n }\n\n /**\n * Return formatted account number.\n * @param {string} accountNumber - Unformatted 13-digit FAMIS account number.\n * @returns {string} Formatted 13-digit FAMIS account number.\n * @memberof FAMISDb\n */\n formatAccountNumber(accountNumber: string): string {\n const formatted = accountNumber.replace(\n /(\\d{2})(\\d{6})(\\d{5})/,\n \"$1-$2-$3\"\n );\n\n return formatted;\n }\n\n /**\n * Is invoice flagged by SRS high-risk policies.\n * @param {object} invoice - JSON object.\n * @returns {Promise<HighRisk>} High-risk object.\n * @memberof FAMISDb\n */\n async isSrsHighRisk(invoice: Invoice): Promise<HighRiskInfo> {\n let srsHighRisk = false;\n const objectCodes = new Map();\n //console.log(invoice);\n try {\n await awaity.each(invoice.data.details, async (detail: any) => {\n //console.log(detail);\n if (\n detail.famis.customerAccountNumber &&\n detail.famis.sellingCampusCode\n ) {\n const acct = await this.getByAccountNumber(\n detail.famis.customerAccountNumber,\n detail.famis.sellingCampusCode\n );\n const objCode = await this.getRevenueCode(detail.sellingObjectCode);\n const isFederal =\n acct &&\n acct.cfda_no &&\n acct.sponsor_type &&\n acct.sponsor_type === \"F\";\n const srsApproved =\n invoice.replace_data && \"srs_approved\" in invoice.replace_data\n ? invoice.replace_data.srs_approved\n : false;\n if (\n objCode &&\n objCode.srs &&\n acct &&\n acct.srs &&\n isFederal &&\n !srsApproved &&\n invoice.isIdt\n ) {\n srsHighRisk = true;\n let val = [detail];\n if (objectCodes.has(objCode.expense))\n val.push(...objectCodes.get(objCode.expense));\n objectCodes.set(objCode.expense, val);\n }\n }\n });\n } catch (e) {\n //console.log(invoice);\n console.log(e);\n }\n return {\n isHighRisk: srsHighRisk,\n flaggedTransactions: Object.fromEntries(objectCodes),\n };\n }\n\n /**\n * @typedef {Object} Comment\n * @property {integer} id - db generated id\n * @property {string} uid - uid\n * @property {string} invoice_id - invoice id\n * @property {string} user_id - user uid\n * @property {string} comment - text of comment\n * @property {string} type - type of comment\n * @property {date} created - created date\n * @property {date} deleted - deleted date\n */\n\n /**\n * Create or update an invoice comment.\n * @param {Comment} comment - JSON object representing the comment\n * @returns {Promise<Comment>} - Promise that resolves to the comment object\n * @memberof FAMISDb\n */\n async saveComment(comment: InvoiceComment): Promise<InvoiceComment | null> {\n const returningColumns = [\n \"id\",\n \"uid\",\n \"invoice_id\",\n \"user_id\",\n \"comment\",\n \"type\",\n \"created\",\n \"deleted\",\n ];\n let response: InvoiceComment | null;\n try {\n const records = await this.db(\"invoice_comments\").where({\n uid: comment.uid,\n });\n if (records.length) {\n response = await this.db(\"invoice_comments\")\n .returning(returningColumns)\n .update(comment)\n .where(\"uid\", comment.uid);\n } else {\n response = await this.db(\"invoice_comments\")\n .returning(returningColumns)\n .insert(comment);\n }\n\n if (response && Array.isArray(response) && response.length) {\n response = response[0];\n }\n } catch (e) {\n console.log(e);\n throw e;\n }\n return response;\n }\n\n /**\n * Get comments associated with an invoice.\n * @param {string} invoiceUid - Invoice UID\n * @returns {Promise<Comment[]>} - Promise that resolves to an array of comment objects\n * @memberof FAMISDb\n */\n async getInvoiceComments(invoiceUid: string): Promise<InvoiceComment[]> {\n let self = this;\n let response: InvoiceComment[];\n try {\n const records = await this.db(\"invoice_comments\")\n .select(\"invoice_comments.*\")\n .where({ invoice_id: invoiceUid })\n .orderBy(\"created\", \"desc\");\n response = await awaity.map(records, async (r: any) => {\n const retVal = r;\n const files = await self.getCommentFiles(r.uid);\n r.files = files;\n if (self.people) {\n //@ts-ignore\n const user = await self.people.getByUid(r.user_id);\n if (user) {\n retVal.user = user;\n }\n }\n return retVal;\n });\n } catch (e) {\n console.log(e);\n throw e;\n }\n return response;\n }\n\n /**\n * @typedef {Object} CommentFile\n * @property {integer} id - db generated id\n * @property {string} uid - uid\n * @property {string} invoice_id - invoice uid\n * @property {string} comment_id - comment uid\n * @property {string} original_filename - original file name\n * @property {string} filename - generate unique filename on filesystem\n * @property {date} created - created date\n * @property {date} deleted - deleted date\n */\n\n /**\n * Create an invoice comment file.\n * @param {InvoiceCommentFile} file - JSON object representing the comment file\n * @returns {Promise<InvoiceCommentFile>} - Promise that resolves to the comment file object\n * @memberof FAMISDb\n */\n async saveCommentFile(\n file: InvoiceCommentFile\n ): Promise<InvoiceCommentFile | null> {\n const returningColumns = [\n \"id\",\n \"uid\",\n \"invoice_id\",\n \"comment_id\",\n \"original_filename\",\n \"filename\",\n \"created\",\n \"deleted\",\n ];\n let response: InvoiceCommentFile | null;\n try {\n response = await this.db(\"invoice_comment_files\")\n .returning(returningColumns)\n .insert(file);\n\n if (response && Array.isArray(response) && response.length) {\n response = response[0];\n }\n } catch (e) {\n console.log(e);\n throw e;\n }\n return response;\n }\n\n /**\n * Get invoice comment files.\n * @param {string} commentUid - Comment UID\n * @returns {Promise<CommentFile[]>} - Promise that resolves to an array of comment file objects\n * @memberof FAMISDb\n */\n async getCommentFiles(\n commentUid: string\n ): Promise<InvoiceCommentFile[] | []> {\n let response: InvoiceCommentFile[] | [] = [];\n try {\n const records = await this.db(\"invoice_comment_files\")\n .where({ comment_id: commentUid })\n .orderBy(\"created\", \"desc\");\n response = records;\n } catch (e) {\n console.log(e);\n throw e;\n }\n return response;\n }\n\n /**\n * Get invoice comment file.\n * @param {string} fileUid - File UID\n * @returns {Promise<CommentFile>} - Promise that resolves to a comment file object\n * @memberof FAMISDb\n */\n async getCommentFile(fileUid: string): Promise<InvoiceCommentFile | null> {\n let response: InvoiceCommentFile | null = null;\n try {\n const records = await this.db(\"invoice_comment_files\").where({\n uid: fileUid,\n });\n if (records.length) response = records[0];\n } catch (e) {\n console.log(e);\n throw e;\n }\n return response;\n }\n\n /**\n * Represents a row in the public.core_account_emails table.\n *\n * @interface CoreAccountEmail\n * @property {string} uid - The unique identifier for the account email.\n * @property {number} core_id - The core ID associated with the account email.\n * @property {string} account_number - The account number associated with the email.\n * @property {string} email - The email address associated with the account.\n * @property {Date | null} [created] - The timestamp when the account email was created. Nullable.\n * @property {Date | null} [deleted] - The timestamp when the account email was deleted. Nullable.\n */\n\n /**\n * Get additional delivery email to an expense accounts by uid\n * @param {string} uid - additional delivery email record uid\n * @returns {Promise<CoreAccountEmail|null>} - Promise that resolves to an account object\n * @memberof FAMISDb\n */\n async getCoreAccountAdditionalEmailByUid(\n uid: string\n ): Promise<CoreAccountEmail | null> {\n let response: CoreAccountEmail | null = null;\n try {\n const records = await this.db(\"core_account_emails\").where({ uid });\n response = records.length ? records[0] : records;\n } catch (e) {\n console.log(e);\n throw e;\n }\n return response;\n }\n\n /**\n * Get additional delivery emails to expense accounts for a core by core id\n * @param {number} coreId - Core ID\n * @returns {Promise<CoreAccountEmail[]|[]>} - Promise that resolves to an account object\n * @memberof FAMISDb\n */\n async getCoreAccountAdditionalEmailsByCoreId(\n coreId: number\n ): Promise<CoreAccountEmail[] | []> {\n let response: CoreAccountEmail[] | [] = [];\n try {\n const records = await this.db(\"core_account_emails\").where({\n core_id: coreId,\n });\n response = records;\n } catch (e) {\n console.log(e);\n throw e;\n }\n return response;\n }\n\n /**\n * Get additional delivery emails to expense accounts for a core by account number\n * @param {string} accountNumber - 13 digit famis account or customernumber\n * @returns {Promise<CoreAccountEmail[]|[]>} - Promise that resolves to an account object\n * @memberof FAMISDb\n */\n async getCoreAccountAdditionalEmailsByAccount(\n accountNumber: string\n ): Promise<CoreAccountEmail[] | []> {\n let response: CoreAccountEmail[] | [] = [];\n try {\n const records = await this.db(\"core_account_emails\").where({\n account_number: accountNumber,\n });\n response = records;\n } catch (e) {\n console.log(e);\n throw e;\n }\n return response;\n }\n\n /**\n * Get additional delivery emails to expense accounts for a core by core id\n * and account number\n * @param {number} coreId - Core ID\n * @param {string} account - account number\n * @returns {Promise<CoreAccountEmail[]|[]>} - Promise that resolves to an account object\n * @memberof FAMISDb\n */\n async getCoreAccountAdditionalEmailsByCoreIdAccount(\n coreId: number,\n account: string\n ): Promise<CoreAccountEmail[] | []> {\n let response: CoreAccountEmail[] | [] = [];\n try {\n const records = await this.db(\"core_account_emails\")\n .where({\n core_id: coreId,\n account_number: account,\n })\n .whereNull(\"deleted\");\n response = records;\n } catch (e) {\n console.log(e);\n throw e;\n }\n return response;\n }\n\n /**\n * Add an additional delivery email to an expense account for a core\n * @param {CoreAccountEmail} record - core account email delivery record\n * @returns {Promise<CoreAccountEmail>} - Promise that resolves to an account object\n * @memberof FAMISDb\n */\n async addCoreAccountAdditionalEmail(\n record: CoreAccountEmail\n ): Promise<CoreAccountEmail | null> {\n let response: CoreAccountEmail | null = null;\n const columns = [\n \"uid\",\n \"core_id\",\n \"account_number\",\n \"email\",\n \"created\",\n \"deleted\",\n ];\n try {\n const records = await this.db(\"core_account_emails\")\n .returning(columns)\n .insert(record);\n response = records.length ? records[0] : records;\n } catch (e) {\n console.log(e);\n throw e;\n }\n return response;\n }\n\n /**\n * Remove an additional delivery email to an expense account for a core\n * @param {string} uid - uid for core account email record\n * @returns {Promise<CoreAccountEmail>} - Promise that resolves to an account object\n * @memberof FAMISDb\n */\n async removeCoreAccountAdditionalEmail(\n uid: string\n ): Promise<CoreAccountEmail | null> {\n let response: CoreAccountEmail | null = null;\n const columns = [\n \"uid\",\n \"core_id\",\n \"account_number\",\n \"email\",\n \"created\",\n \"deleted\",\n ];\n try {\n const records = await this.db(\"core_account_emails\")\n .returning(columns)\n .update({\n deleted: this.db.raw(\"CURRENT_TIMESTAMP\"),\n })\n .where({ uid });\n response = records.length ? records[0] : records;\n } catch (e) {\n console.log(e);\n throw e;\n }\n return response;\n }\n}\n\nexport default FAMISDb;\n"],"names":["retVal","returningColumns"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"main.js","sources":["../src/index.ts"],"sourcesContent":["import knex from \"knex\";\nimport { createId } from \"@paralleldrive/cuid2\";\n//@ts-ignore\nimport awaity from \"awaity\";\nimport revisionHash from \"rev-hash\";\nimport { attachPaginate } from \"knex-paginate\";\nimport \"knex-with-relations\";\n\nattachPaginate();\n\nexport type SortDirection = \"asc\" | \"desc\";\n\nexport interface PI {\n tamuEduPersonUIN: string;\n tamuEduPersonNetID: string | null;\n uid: string;\n sn: string;\n givenName: string;\n cn: string[];\n displayName: string;\n tamuEduPersonOfficialName: string;\n mail: string;\n postalAddress: string;\n mailStop: string;\n localityName: string;\n stateOrProvinceName: string;\n postalCode: string;\n telephoneNumber: string;\n title: string;\n tamuEduPersonTitleCode: string;\n tamuEduPersonDepartmentName: string;\n tamuEduPersonPrimaryMember: string;\n tamuEduPersonMember: string[];\n tamuEduPersonPrimaryMemberName: string | null;\n tamuEduPersonAffiliation: string[];\n eduPersonOrcid: string | null;\n tamuEduPersonAdLoc: string;\n tamuEduPersonEmpLoc: string;\n tamuEduDataFeed: string[];\n tamuLastSeenTimestamp: string | null;\n tamuEduPersonSupervisorUIN: string;\n tamuManualAddRDN: string | null;\n}\nexport interface AccountBalance {\n account_number: string;\n campus_code: string;\n fiscal_year: number;\n account: string;\n support_account: string;\n description?: string | null;\n balance: number;\n}\n\nexport interface Department {\n part: string;\n dept: string;\n sub?: string | null;\n dept_name: string;\n dept_head?: string | null;\n exec_level?: string | null;\n division?: string | null;\n school?: string | null;\n exp_date?: Date | null;\n idt_email?: string | null;\n id?: string | null; // GENERATED ALWAYS column\n}\n\nexport interface CoreAccountEmail {\n uid?: string;\n core_id?: number;\n account_number?: string;\n email: string;\n created?: Date | null;\n deleted?: Date | null;\n}\n\nexport type FAMISObjectCode = {\n id: number;\n revenue: string | null;\n expense: string | null;\n sales: boolean;\n srs: boolean;\n};\n\nexport type User = {\n id?: number;\n userId: string;\n admin?: boolean;\n role?: boolean;\n roleName?: string | null;\n roleEmail?: string | null;\n email?: string | null;\n usersSystemId?: number | null;\n systemId?: number | null;\n coreId?: number | null;\n coreUserId?: number | null;\n cores?: CorePayload | null;\n systems?: SystemPart[] | [] | null;\n deleted?: Date | null;\n};\n\nexport interface SystemPart {\n id: number;\n name: string;\n due: string;\n fein: string;\n agency: string;\n checkAddress: string;\n credit?: boolean | null;\n creditUrl?: string | null;\n creditFee?: string | null;\n part: string;\n abbrev: string;\n aggiebuy: string;\n image: string;\n}\n\nexport interface Account {\n uid: string;\n account_number: string;\n campus_code: string;\n fiscal_year: number;\n account: string;\n support_account: string;\n budget_support_account: string;\n budget_account_number: string;\n title: string | null;\n expiration_date: Date | null;\n status: string | null;\n uin: string;\n responsible_uin: string | null;\n department: string | null;\n setup_date: Date | null;\n budget_access: string | null;\n abr_rule: string;\n idt_allowed: boolean | null;\n adloc_campus_code: string | null;\n adloc_department: string | null;\n adloc_name: string | null;\n preferred_first_name: string | null;\n first_name: string | null;\n middle_name: string | null;\n last_name: string | null;\n email: string | null;\n work_phone: string | null;\n active: boolean | null;\n default_bank: string | null;\n bank_override: boolean | null;\n last_seen: Date | null;\n srs: boolean | null;\n cfda_no: string | null;\n sponsor_type: string | null;\n}\n\nexport interface CoreAccount {\n id?: number;\n account?: string;\n coreId: number;\n coreAccountId?: number;\n coreAccountActive?: boolean | null;\n effective?: Date | null;\n active?: boolean | null;\n}\n\nexport interface CoreUser {\n id?: number;\n userId?: string;\n coreId: number;\n coreUserId?: number;\n email?: boolean | null;\n}\n\nexport interface Core {\n id?: number;\n account?: string;\n effective?: string;\n facility?: string;\n contact: string;\n contactEmail: string;\n systemId: number;\n enabled: boolean;\n deleted: string | null;\n coreEmail?: string | null;\n corePhone: string | null;\n coreAddress: string | null;\n from_email: string | null;\n invoice_email: string | null;\n systemPart?: SystemPart;\n system_part?: string;\n system_name?: string;\n system_abbrev?: string;\n users?: CoreUser[];\n accounts?: CoreAccount[];\n}\n\nexport interface FamisDetails {\n invoiceType: string;\n invoiceNumber: string;\n customerPONumber: string;\n invoiceDepartment: string;\n sellingCampusCode: string;\n sellingAccountNumber: string;\n customerAccountNumber: string;\n sellingSupportAccount: string;\n}\n\nexport interface Details {\n ppu: number;\n date: string;\n famis: FamisDetails;\n other: string;\n amount: number;\n status: string;\n category: string;\n comments: string | null;\n quantity: number;\n pmtNumber: string | null;\n usageType: string;\n itemComment: string | null;\n customerName: string;\n purchaseDate: string;\n billingPeriod: string | null;\n customerEmail: string;\n customerTitle: string;\n itemDescription: string;\n sellingObjectCode: string;\n}\n\nexport interface HighRiskTransaction {\n [key: number]: Details[];\n}\n\nexport interface IsHighRisk {\n isHighRisk: boolean;\n flaggedTransactions: Details[];\n}\n\nexport interface CustomerAccountInfo {\n uid: string;\n account_number: string;\n campus_code: string;\n fiscal_year: number;\n account: string;\n support_account: string;\n budget_support_account: string;\n budget_account_number: string;\n title: string;\n expiration_date: string;\n status: string;\n uin: string;\n responsible_uin: string;\n department: string;\n setup_date: string;\n budget_access: string;\n abr_rule: string;\n idt_allowed: boolean;\n adloc_campus_code: string;\n adloc_department: string;\n adloc_name: string;\n preferred_first_name: string;\n first_name: string;\n middle_name: string | null;\n last_name: string;\n email: string;\n work_phone: string;\n active: boolean;\n default_bank: string;\n bank_override: boolean;\n srs: boolean;\n cfda_no: string;\n sponsor_type: string;\n billingEmailId: string;\n parent_account_idt_allowed: boolean;\n}\n\nexport interface HighRiskInfo {\n isHighRisk: boolean;\n flaggedTransactions: Details[];\n}\n\nexport interface Contact {\n fax?: string | null;\n city?: string | null;\n name?: string;\n email?: string | null;\n phone?: string | null;\n state?: string | null;\n country?: string | null;\n address1?: string | null;\n address2?: string | null;\n mailstop?: string | null;\n department?: string | null;\n postalCode?: string | null;\n institution?: string | null;\n}\n\nexport interface TransactionData {\n to: Contact;\n lab: string;\n date: string;\n from: Contact;\n number: string;\n details: Details[];\n fingerprint: string;\n totalAmount: string;\n}\n\nexport interface InvoiceComment {\n id?: number;\n uid?: string;\n invoice_id: string;\n user_id?: string | null;\n comment: string | null;\n type: string | null;\n created: string | null;\n deleted: string | null;\n}\n\nexport type InvoiceCommentFile = {\n id?: number; // Database generated id\n uid: string; // UID\n invoice_id: string; // Invoice UID\n comment_id: string; // Comment UID\n original_filename: string | null; // Original file name\n filename: string | null; // Generated unique filename on the filesystem\n created: Date | null; // Created date\n deleted: Date | null; // Deleted date\n};\n\nexport interface Invoice {\n uid?: string | null;\n number?: string | null;\n lab?: string | null;\n totalAmount?: string;\n date?: string;\n data: TransactionData;\n invoiced: boolean;\n type: string;\n famisInvoiceNumber: string;\n deleted: string | null;\n customerAccount: string;\n sellingAccount: string;\n postedDate: string | null;\n emailed: boolean;\n replace_data?: object | null;\n fingerprint?: string | null;\n core?: Core | null;\n customerAccountInfo?: CustomerAccountInfo | null;\n isIdt?: boolean | null;\n poNumber?: string | null;\n pi?: PI | null;\n highRiskInfo?: HighRiskInfo | null;\n comments?: InvoiceComment[] | null;\n}\n\nexport interface Edge {\n cursor: string;\n node: Invoice;\n}\n\nexport interface PageInfo {\n total?: number;\n lastPage?: number;\n currentPage: number;\n perPage: number;\n from: number;\n to: number;\n}\n\nexport interface InvoicePayload {\n data: Invoice[];\n pagination: PageInfo;\n}\n\nexport interface AccountPayload {\n data: Account[];\n pagination: PageInfo;\n}\n\nexport interface CorePayload {\n data: Core[];\n pagination: PageInfo;\n}\n\nconst systemPartFields: string[] = [\n \"id\",\n \"name\",\n \"due\",\n \"fein\",\n \"agency\",\n \"checkAddress\",\n \"credit\",\n \"creditUrl\",\n \"creditFee\",\n \"part\",\n \"abbrev\",\n \"aggiebuy\",\n \"image\",\n];\n\nconst invoiceFields: string[] = [\n \"uid\",\n \"number\",\n \"lab\",\n \"totalAmount\",\n \"date\",\n \"data\",\n \"invoiced\",\n \"type\",\n \"famisInvoiceNumber\",\n \"deleted\",\n \"customerAccount\",\n \"sellingAccount\",\n \"postedDate\",\n \"emailed\",\n \"replace_data\",\n];\n\nconst accountFields: string[] = [\n \"uid\",\n \"account_number\",\n \"campus_code\",\n \"fiscal_year\",\n \"account\",\n \"support_account\",\n \"budget_support_account\",\n \"budget_account_number\",\n \"title\",\n \"expiration_date\",\n \"status\",\n \"uin\",\n \"responsible_uin\",\n \"department\",\n \"setup_date\",\n \"budget_access\",\n \"abr_rule\",\n \"idt_allowed\",\n \"adloc_campus_code\",\n \"adloc_department\",\n \"adloc_name\",\n \"preferred_first_name\",\n \"first_name\",\n \"middle_name\",\n \"last_name\",\n \"email\",\n \"work_phone\",\n \"active\",\n \"default_bank\",\n \"bank_override\",\n \"srs\",\n \"cfda_no\",\n \"sponsor_type\",\n];\n\nconst departmentFields: string[] = [\n \"part\",\n \"dept\",\n \"sub\",\n \"dept_name\",\n \"dept_head\",\n \"exec_level\",\n \"division\",\n \"school\",\n \"exp_date\",\n \"idt_email\",\n \"id\",\n];\n\nconst accountBalanceFields: string[] = [\n \"account_number\",\n \"campus_code\",\n \"fiscal_year\",\n \"account\",\n \"support_account\",\n \"description\",\n \"balance\",\n];\n\nconst personFields: string[] = [\n \"tamuEduPersonUIN\",\n \"tamuEduPersonNetID\",\n \"uid\",\n \"sn\",\n \"givenName\",\n \"cn\",\n \"displayName\",\n \"tamuEduPersonOfficialName\",\n \"mail\",\n \"postalAddress\",\n \"mailStop\",\n \"localityName\",\n \"stateOrProvinceName\",\n \"postalCode\",\n \"telephoneNumber\",\n \"title\",\n \"tamuEduPersonTitleCode\",\n \"tamuEduPersonDepartmentName\",\n \"tamuEduPersonPrimaryMember\",\n \"tamuEduPersonMember\",\n \"tamuEduPersonPrimaryMemberName\",\n \"tamuEduPersonAffiliation\",\n \"eduPersonOrcid\",\n \"tamuEduDataFeed\",\n \"tamuLastSeenTimestamp\",\n \"tamuEduPersonSupervisorUIN\",\n \"tamuManualAddRDN\",\n];\n\nconst famisInvoiceNumbers = [\n {\n start: 300128,\n end: 399999,\n prefix: \"I\",\n aliases: [\"ilabs\"],\n },\n {\n start: 100000,\n end: 999999,\n prefix: \"V\",\n aliases: [\"mosaic\"],\n },\n];\nconst returningColumns = [\n \"uid\",\n \"number\",\n \"lab\",\n \"totalAmount\",\n \"data\",\n \"date\",\n \"type\",\n \"famisInvoiceNumber\",\n \"customerAccount\",\n \"sellingAccount\",\n];\n\n/**\n * Pads a string with leading zeros or truncates it to a specified length.\n * @param {string} str - The input string.\n * @param {number} max - The maximum length of the output string.\n * @param {boolean} right - If true, pads on the right instead of the left.\n * @returns {string} The padded or truncated string.\n */\nconst pad = (str: string, max: number, right?: boolean): string => {\n let retVal = str;\n str = str.toString();\n if (str.length < max) {\n retVal = pad(\"0\" + str, max);\n } else if (str.length > max) {\n retVal = str.substring(0, max);\n }\n if (right) {\n retVal = retVal.length < max ? pad(retVal + \"0\", max, right) : retVal;\n }\n return retVal;\n};\n\n/**\n * Sanitizes an account number by removing non-digit characters and padding/truncating to 13 digits.\n * @param {string} account - The input account number.\n * @returns {string} The sanitized account number.\n */\nconst sanitizeAccountNumber = (account: string): string =>\n pad(account.replace(/\\D/g, \"\"), 13, true);\n\n/**\n * Gets the core account number from a FAMIS object.\n * @param {object} famis - The FAMIS object containing sellingCampusCode, sellingAccountNumber, and sellingSupportAccount.\n * @returns {string} The core account number.\n */\nconst getCoreAccountNumber = (famis: {\n sellingCampusCode: string;\n sellingAccountNumber: string;\n sellingSupportAccount: string;\n}): string => {\n const { sellingCampusCode, sellingAccountNumber, sellingSupportAccount } =\n famis;\n const account = `${sellingCampusCode}${sellingAccountNumber}${sellingSupportAccount}`;\n return sanitizeAccountNumber(account);\n};\n\n/**\n * Recursively sorts the keys of an object.\n * @param {object} obj - The input object.\n * @returns {object} The object with sorted keys.\n */\nconst sortObjectKeys = (obj: any): any => {\n if (obj === null || obj === undefined) {\n return obj;\n }\n if (typeof obj !== \"object\") {\n // it is a primitive: number/string (in an array)\n return obj;\n }\n const result: any = Object.keys(obj)\n .sort()\n .reduce((acc: any, key: string) => {\n if (Array.isArray(obj[key])) {\n acc[key] = obj[key].map(sortObjectKeys);\n } else if (typeof obj[key] === \"object\") {\n acc[key] = sortObjectKeys(obj[key]);\n } else {\n acc[key] = obj[key];\n }\n return acc;\n }, {});\n return result;\n};\n\n/**\n * @typedef {Object} Account\n * @property {string} uid\n * @property {string} account_number\n * @property {string} campus_code\n * @property {number} fiscal_year\n * @property {string} account\n * @property {string} support_account\n * @property {string} budget_support_account\n * @property {string} budget_account_number\n * @property {string | null} title\n * @property {Date | null} expiration_date\n * @property {string | null} status\n * @property {string} uin\n * @property {string | null} responsible_uin\n * @property {string | null} department\n * @property {Date | null} setup_date\n * @property {string | null} budget_access\n * @property {string} abr_rule\n * @property {boolean | null} idt_allowed\n * @property {string | null} adloc_campus_code\n * @property {string | null} adloc_department\n * @property {string | null} adloc_name\n * @property {string | null} preferred_first_name\n * @property {string | null} first_name\n * @property {string | null} middle_name\n * @property {string | null} last_name\n * @property {string | null} email\n * @property {string | null} work_phone\n * @property {boolean | null} active\n * @property {string | null} default_bank\n * @property {boolean | null} bank_override\n * @property {Date | null} last_seen\n * @property {boolean | null} srs\n * @property {string | null} cfda_no\n * @property {string | null} sponsor_type\n */\n\n/**\n * Represents the Core schema.\n * @typedef {Object} Core\n * @property {number} id - The ID.\n * @property {string} account - The account.\n * @property {string} effective - The effective date.\n * @property {string} facility - The facility.\n * @property {string} contact - The contact.\n * @property {string} contactEmail - The contact email.\n * @property {number} systemId - The system ID.\n * @property {boolean} enabled - Indicates if it's enabled.\n * @property {string | null} deleted - The deletion status.\n * @property {string} coreEmail - The core email.\n * @property {string | null} corePhone - The core phone.\n * @property {string | null} coreAddress - The core address.\n * @property {string | null} from_email - The from email.\n * @property {string | null} invoice_email - The invoice email.\n * @property {Object} systemPart - The system part.\n */\n\n/**\n * @typedef {Object} Edge\n * @property {string} cursor - Description of the property.\n * @property {InvoiceSchema} node - Description of the property.\n */\n\n/**\n * @typedef {Object} PageInfo\n * @property {boolean} hasNextPage - Description of the property.\n * @property {boolean} hasPreviousPage - Description of the property.\n * @property {string|null} [startCursor] - Description of the property.\n * @property {string|null} [endCursor] - Description of the property.\n */\n\n/**\n * @typedef {Object} InvoicePayload\n * @property {Edge[]} edges - Description of the property.\n * @property {PageInfo} pageInfo - Description of the property.\n */\n\n/**\n * @typedef {Object} CorePayload\n * @property {Edge[]} edges - Description of the property.\n * @property {PageInfo} pageInfo - Description of the property.\n */\n\nclass FAMISDb {\n private db: any;\n //@ts-ignore\n private people: any[];\n\n constructor(config: any, people: any, debug: boolean) {\n if (config) {\n this.init(config, people, debug || false);\n }\n }\n\n /**\n * Initializes the database connection and sets up the Knex instance for interacting with PostgreSQL database.\n *\n * @param {any} config - The configuration object that includes details about how to connect to a PostgreSQL database. This should include properties such as `host`, `user`, `password`, etc.\n * @param {any} people - The data related to the 'people' entity. It could be an array of person objects or any other format depending on your application requirements.\n * @param {boolean} debug - A flag indicating whether to enable debugging for Knex queries. Defaults to `false`. If set to `true`, it will log all SQL queries that are executed against the database in the console.\n */\n init(config: any, people: any = null, debug: boolean = false): void {\n this.db = knex({\n client: \"pg\",\n connection: config,\n debug,\n pool: {\n min: 0,\n max: 10,\n createTimeoutMillis: 30000,\n acquireTimeoutMillis: 30000,\n idleTimeoutMillis: 30000,\n reapIntervalMillis: 1000,\n createRetryIntervalMillis: 100,\n },\n });\n this.people = people;\n }\n\n /**\n *\n * Extract customer account and po number\n * @param {object} famis\n * @param {object} replace_data\n * @returns {object} account number object\n * @memberof FAMISDb\n */\n getAccountNumber(\n famis: { customerAccountNumber: string; customerPONumber: string },\n replace_data?: { customerAccountNumber?: string; customerPONumber?: string }\n ): { accountNumber: string; poNumber: string | null } {\n const retVal = {\n accountNumber: \"\",\n poNumber: \"\",\n };\n\n if (\n famis.customerAccountNumber ||\n (replace_data && replace_data.customerAccountNumber)\n ) {\n retVal.accountNumber =\n replace_data && replace_data.customerAccountNumber\n ? replace_data.customerAccountNumber\n : famis.customerAccountNumber;\n } else if (\n famis.customerPONumber.includes(\"|\") ||\n (replace_data && replace_data.customerPONumber?.includes(\"|\"))\n ) {\n const result =\n replace_data && replace_data.customerPONumber?.includes(\"|\")\n ? replace_data.customerPONumber?.split(\"|\")\n : famis.customerPONumber.split(\"|\");\n retVal.accountNumber = sanitizeAccountNumber(result[0]);\n retVal.poNumber = result[1].trim();\n } else {\n retVal.accountNumber =\n replace_data && replace_data.customerPONumber\n ? sanitizeAccountNumber(replace_data.customerPONumber)\n : sanitizeAccountNumber(famis.customerPONumber);\n }\n\n return retVal;\n }\n\n /**\n *\n * Process an invoice to have all necessary relationships\n * @param {object} invoice - the invoice object sent by iLab\n * @param {boolean} [historical=false] - if true use historical accounts too\n * @param {string[]} excludeFields - fields to exclude from results\n * @returns {Promise<object>} invoice object\n * @memberof FAMISDb\n */\n async processInvoice(\n invoice: any,\n historical: boolean = false,\n excludeFields: string[] = []\n ): Promise<any> {\n // console.log(invoice);\n try {\n const account = getCoreAccountNumber(invoice.data.details[0].famis);\n invoice.core = await this.getCoreByAccount(account);\n\n if (invoice.core) {\n invoice.core.systemPart = await this.getSystemById(\n invoice.core.systemId,\n excludeFields\n );\n } else {\n const e = Error(\n `Revenue account ${account} is not associated with a core.`\n );\n throw e;\n }\n\n const campus = account.substring(0, 2);\n const revenueAccount = await this.getByAccountNumber(\n account,\n campus,\n historical\n );\n const customerAccountNumber = this.getAccountNumber(\n invoice.data.details[0].famis,\n invoice.replace_data\n );\n invoice.customerAccountInfo = await this.getByAccountNumber(\n customerAccountNumber.accountNumber,\n campus,\n historical\n );\n\n if (invoice.customerAccountInfo) {\n let idtAllowed =\n \"idt_allowed\" in invoice.customerAccountInfo &&\n invoice.customerAccountInfo.idt_allowed !== null\n ? invoice.customerAccountInfo.idt_allowed\n : \"parent_account_idt_allowed\" in invoice.customerAccountInfo &&\n invoice.customerAccountInfo.parent_account_idt_allowed;\n\n idtAllowed =\n idtAllowed &&\n !(\n invoice.replace_data &&\n typeof invoice.replace_data === \"object\" &&\n invoice.replace_data.forcedAr\n );\n\n const isIdt =\n customerAccountNumber &&\n customerAccountNumber.accountNumber?.substring(0, 2) ===\n account.substring(0, 2) &&\n idtAllowed;\n\n invoice.isIdt = isIdt;\n } else {\n invoice.isIdt = false;\n }\n\n let poNumber =\n customerAccountNumber.accountNumber?.substring(0, 2) !== \"68\"\n ? `${campus}-${revenueAccount.department}`\n : customerAccountNumber.poNumber;\n\n invoice.poNumber = poNumber;\n invoice.customerAccount = customerAccountNumber.accountNumber;\n\n if (invoice.customerAccountInfo && this.people) {\n const pi = invoice.customerAccountInfo.uin\n ? //@ts-ignore\n await this.people.getByUin(invoice.customerAccountInfo.uin)\n : [];\n\n if (pi.length) {\n invoice.pi = JSON.parse(JSON.stringify(pi[0]));\n }\n }\n\n invoice.highRiskInfo = await this.isSrsHighRisk(invoice);\n invoice.comments = await this.getInvoiceComments(invoice.uid);\n } catch (e) {\n throw e;\n }\n return invoice;\n }\n\n /**\n *\n * Get invoice by uid\n * @param {string} uid\n * @param {string} [sortColumn='date']\n * @param {string} [sortDirection='desc']\n * @param {boolean} [deleted=false]\n * @param {integer} page - page of results to return\n * @param {string} perPage - number of results per page to return\n * @returns {Promise<InvoicePayload>} invoice object\n * @memberof FAMISDb\n */\n async getInvoiceByUid(\n uid: string,\n sortColumn: string = \"date\",\n sortDirection: SortDirection | string = \"desc\",\n page: number = 1,\n perPage: number = 50\n ): Promise<InvoicePayload> {\n let self = this;\n let rows: InvoicePayload;\n try {\n rows = await this.db\n .from(\"invoices\")\n .andWhere(\"uid\", uid)\n .orderBy(sortColumn, sortDirection)\n .select(\"*\")\n .paginate({ perPage, currentPage: page, isLengthAware: true });\n rows.data = await Promise.all(\n rows.data.map(async (row: any) => {\n const rec: Invoice = await self.processInvoice(row);\n return rec;\n })\n );\n } catch (e) {\n throw e;\n }\n\n return rows;\n }\n\n /**\n *\n * Get invoice by originating system assigned number\n * @param {string} number\n * @param {string} [sortColumn='date']\n * @param {string} [sortDirection='desc']\n * @param {boolean} [deleted=false]\n * @param {integer} page - page of results to return\n * @param {string} perPage - number of results per page to return\n * @returns {Promise<InvoicePayload>} invoice object\n * @memberof FAMISDb\n */\n async getInvoiceByNumber(\n number: string,\n sortColumn: string = \"date\",\n sortDirection: SortDirection | string = \"desc\",\n page: number = 1,\n perPage: number = 50\n ): Promise<InvoicePayload> {\n let self = this;\n let rows: InvoicePayload;\n try {\n rows = await this.db\n .from(\"invoices\")\n .andWhere(\"number\", \"ILIKE\", `${number}%`)\n .orderBy(sortColumn, sortDirection)\n .select(\"*\")\n .paginate({ perPage, currentPage: page, isLengthAware: true });\n rows.data = await Promise.all(\n rows.data.map(async (row: any) => {\n const rec: Invoice = await self.processInvoice(row);\n return rec;\n })\n );\n } catch (e) {\n throw e;\n }\n\n return rows;\n }\n\n /**\n *\n * Get invoice by fingerprint\n * @param {string} fingerPrint\n * @returns {Promise<object>} invoice object\n * @memberof FAMISDb\n */\n async getInvoiceByFingerPrint(fingerPrint: string): Promise<any> {\n let records;\n let retVal;\n\n try {\n records = await this.db(\"invoices\").where(\"fingerprint\", fingerPrint);\n if (records.length) {\n retVal = await this.processInvoice(records[0]);\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Get all invoices associated with a specified account number\n * @param {string} accountNumber\n * @param {string} [sortColumn='date']\n * @param {string} [sortDirection='desc']\n * @param {boolean} [deleted=false]\n * @param {integer} page - page of results to return\n * @param {string} perPage - number of results per page to return\n * @returns {Promise<InvoicePayload>} invoice objects\n * @memberof FAMISDb\n */\n async getInvoicesByAccount(\n accountNumber: string | string[],\n sortColumn: string = \"date\",\n sortDirection: SortDirection | string = \"desc\",\n page: number = 1,\n perPage: number = 50\n ): Promise<InvoicePayload> {\n let self = this;\n let rows: InvoicePayload;\n try {\n const where = Array.isArray(accountNumber)\n ? `ALL(ARRAY[${accountNumber.map((n: string) => `'%${n}%'`).join()}])`\n : `ALL(ARRAY['%${accountNumber}%'])`;\n rows = await this.db\n .from(\"invoices\")\n .whereNull(\"deleted\")\n .andWhere(function (this: any) {\n this.where(\"customerAccount\", \"ilike\", this.db.raw(where));\n this.orWhere(\"sellingAccount\", \"ilike\", this.db.raw(where));\n this.orWhereRaw(\"replace_data->>'customerAccountNumber' = ?\", [\n accountNumber,\n ]);\n this.orWhereRaw(\"replace_data->>'customerPONumber' ILIKE ?\", [\n `${accountNumber}%`,\n ]);\n })\n .orderBy(sortColumn, sortDirection)\n .select(\"*\")\n .paginate({ perPage, currentPage: page, isLengthAware: true });\n rows.data = await Promise.all(\n rows.data.map(async (row: any) => {\n const rec: Invoice = await self.processInvoice(row);\n return rec;\n })\n );\n } catch (e) {\n throw e;\n }\n\n return rows;\n }\n\n /**\n *\n * Get all invoice ordered by and sorted by parameters passed\n * @param {string} [sortColumn='date']\n * @param {string} [sortDirection='desc']\n * @param {boolean} [deleted=false]\n * @param {integer} page - page of results to return\n * @param {string} perPage - number of results per page to return\n * @returns {Promise<InvoicePayload>} invoice objects\n * @memberof FAMISDb\n */\n async getAllInvoices(\n sortColumn: string = \"date\",\n sortDirection: SortDirection | string = \"desc\",\n deleted?: boolean,\n page: number = 1,\n perPage: number = 50\n ): Promise<InvoicePayload> {\n const self = this;\n let rows: InvoicePayload;\n try {\n const qry = this.db\n .from(\"invoices\")\n .orderBy(sortColumn, sortDirection)\n .select(\"*\");\n rows = deleted\n ? await qry\n .whereNotNull(\"deleted\")\n .paginate({ perPage, currentPage: page, isLengthAware: true })\n : await qry\n .whereNull(\"deleted\")\n .paginate({ perPage, currentPage: page, isLengthAware: true });\n rows.data = await Promise.all(\n rows.data.map(async (row: any) => {\n const rec = await self.processInvoice(row);\n return rec;\n })\n );\n } catch (e) {\n throw e;\n }\n //@ts-ignore\n return rows;\n }\n\n /**\n *\n * Retrieves invoices from the latest date\n * @param {string} [sortColumn='date']\n * @param {string} [sortDirection='desc']\n * @param {integer} first - corresponds to the first param of the Relay spec\n * @param {string} after - corresponds to the after param of the Relay spec\n * @param {integer} last - corresponds to the last param of the Relay spec\n * @param {string} before - corresponds to the before param of the Relay spec\n * @returns {Promise<InvoicePayload>} invoice objects\n * @memberof FAMISDb\n */\n async getLatestInvoices(\n sortColumn: string = \"date\",\n sortDirection: SortDirection | string = \"desc\",\n page: number = 1,\n perPage: number = 50\n ): Promise<InvoicePayload> {\n const self = this;\n let rows: InvoicePayload;\n try {\n rows = await this.db\n .from(\"invoices\")\n .whereNull(\"deleted\")\n .whereIn(\"date\", function (this: any) {\n this.max(\"date\").from(\"invoices\");\n })\n .orderBy(sortColumn, sortDirection)\n .select(\"*\")\n .paginate({ perPage, currentPage: page, isLengthAware: true });\n rows.data = await Promise.all(\n rows.data.map(async (row: any) => {\n const rec: Invoice = await self.processInvoice(row);\n return rec;\n })\n );\n } catch (e) {\n throw e;\n }\n //@ts-ignore\n return rows;\n }\n\n /**\n *\n * Returns all held invoices\n * @param {string} [sortColumn='date']\n * @param {string} [sortDirection='desc']\n * @param {integer} page - corresponds to the first param of the Relay spec\n * @param {integer} perPage - corresponds to the last param of the Relay spec\n * @returns {Promise<InvoicePayload>} held invoice objects\n * @memberof FAMISDb\n */\n async getHeldInvoices(\n sortColumn: string = \"date\",\n sortDirection: string = \"desc\",\n page: number = 1,\n perPage: number = 50\n ): Promise<InvoicePayload> {\n const self = this;\n let rows: InvoicePayload;\n try {\n rows = await this.db\n .from(\"invoices\")\n .whereNull(\"deleted\")\n .andWhere(\"invoiced\", \"0\")\n .orderBy(sortColumn, sortDirection)\n .select(\"*\")\n .paginate({ perPage, currentPage: page, isLengthAware: true });\n rows.data = await Promise.all(\n rows.data.map(async (row: any) => {\n const rec = await self.processInvoice(row);\n return rec;\n })\n );\n //@ts-ignore\n } catch (e) {\n throw e;\n }\n return rows;\n }\n\n /**\n *\n * Returns all awaiting email invoices\n * @param {string} [sortColumn='date']\n * @param {string} [sortDirection='desc']\n * @param {integer} first - corresponds to the first param of the Relay spec\n * @param {string} after - corresponds to the after param of the Relay spec\n * @param {integer} last - corresponds to the last param of the Relay spec\n * @param {string} before - corresponds to the before param of the Relay spec\n * @returns {Promise<InvoicePayload>} awaiting email invoice objects\n * @memberof FAMISDb\n */\n async getInvoicesAwaitingEmail(\n sortColumn: string = \"date\",\n sortDirection: SortDirection | string = \"desc\",\n page: number = 1,\n perPage: number = 50\n ): Promise<InvoicePayload> {\n const self = this;\n let rows: InvoicePayload;\n try {\n rows = await this.db\n .from(\"invoices\")\n .whereNull(\"deleted\")\n .andWhere(\"emailed\", \"False\")\n .orderBy(sortColumn, sortDirection)\n .select(\"*\")\n .paginate({ perPage, currentPage: page, isLengthAware: true });\n rows.data = await Promise.all(\n rows.data.map(async (row: any) => {\n const rec = await self.processInvoice(row);\n return rec;\n })\n );\n } catch (e) {\n throw e;\n }\n\n return rows;\n }\n\n /**\n *\n * Search invoices by originating system generated invoice number\n * @param {string} number\n * @param {string} [sortColumn='date']\n * @param {string} [sortDirection='desc']\n * @param {integer} first - corresponds to the first param of the Relay spec\n * @param {string} after - corresponds to the after param of the Relay spec\n * @param {integer} last - corresponds to the last param of the Relay spec\n * @param {string} before - corresponds to the before param of the Relay spec\n * @returns {Promise<InvoicePayload>} invoice objects\n * @memberof FAMISDb\n */\n async searchInvoicesByNumber(\n number: string,\n sortColumn: string = \"date\",\n sortDirection: SortDirection | string = \"desc\",\n page: number = 1,\n perPage: number = 50\n ): Promise<InvoicePayload> {\n const self = this;\n let rows: InvoicePayload;\n try {\n rows = await this.db\n .from(\"invoices\")\n .whereNull(\"deleted\")\n .andWhere(\"number\", \"ilike\", `${number}%`)\n .orderBy(sortColumn, sortDirection)\n .select(\"*\")\n .paginate({ perPage, currentPage: page, isLengthAware: true });\n rows.data = await Promise.all(\n rows.data.map(async (row: any) => {\n const rec = await self.processInvoice(row);\n return rec;\n })\n );\n } catch (e) {\n throw e;\n }\n\n return rows;\n }\n\n /**\n *\n * Search invoices by famis account number\n * @param {string} account\n * @param {string} [sortColumn='date']\n * @param {string} [sortDirection='desc']\n * @param {integer} first - corresponds to the first param of the Relay spec\n * @param {string} after - corresponds to the after param of the Relay spec\n * @param {integer} last - corresponds to the last param of the Relay spec\n * @param {string} before - corresponds to the before param of the Relay spec\n * @returns {Promise<InvoicePayload>} invoice objects\n * @memberof FAMISDb\n */\n async searchInvoicesByAccountNumber(\n account: string,\n sortColumn: string = \"date\",\n sortDirection: SortDirection | string = \"desc\",\n page: number = 1,\n perPage: number = 50\n ): Promise<InvoicePayload> {\n const self = this;\n let rows: InvoicePayload;\n try {\n rows = await this.db\n .from(\"invoices\")\n .whereNull(\"deleted\")\n .andWhere((q: any) =>\n q\n .where(\"sellingAccount\", \"ilike\", `${account}%`)\n .orWhere(\"customerAccount\", \"ilike\", `${account}%`)\n )\n .orderBy(sortColumn, sortDirection)\n .select(\"*\")\n .paginate({ perPage, currentPage: page, isLengthAware: true });\n rows.data = await Promise.all(\n rows.data.map(async (row: any) => {\n const rec = await self.processInvoice(row);\n return rec;\n })\n );\n } catch (e) {\n throw e;\n }\n return rows;\n }\n\n /**\n *\n * Search invoices by FAMIS invoice number\n * @param {string} famis\n * @param {string} [sortColumn='date']\n * @param {string} [sortDirection='desc']\n * @param {integer} page - page of results to return\n * @param {integer} perPage - number of results per page to return\n * @returns {Promise<InvoicePayload>} invoice objects\n * @memberof FAMISDb\n */\n async searchInvoicesByFamis(\n famis: string,\n sortColumn: string = \"date\",\n sortDirection: SortDirection | string = \"desc\",\n page: number = 1,\n perPage: number = 50\n ): Promise<InvoicePayload> {\n const self = this;\n let rows: InvoicePayload;\n try {\n rows = await this.db\n .from(\"invoices\")\n .whereNull(\"deleted\")\n .andWhere(\"famisInvoiceNumber\", \"ilike\", `${famis}%`)\n .orderBy(sortColumn, sortDirection)\n .select(\"*\")\n .paginate({ perPage, currentPage: page, isLengthAware: true });\n rows.data = await Promise.all(\n rows.data.map(async (row: any) => {\n const rec = await self.processInvoice(row);\n return rec;\n })\n );\n } catch (e) {\n throw e;\n }\n\n return rows;\n }\n\n /**\n *\n * Queries invoices\n * @param {string} query\n * @param {string} [sortColumn='date']\n * @param {string} [sortDirection='desc']\n * @param {integer} page - page of results to return\n * @param {integer} perPage - number of results per page to return\n * @param {string[]} excludeFields - fields to exclude from results\n * @returns {Promise<InvoicePayload>} invoice objects\n * @memberof FAMISDb\n */\n async queryInvoices(\n query: string,\n sortColumn: string = \"date\",\n sortDirection: SortDirection | string = \"desc\",\n page: number = 1,\n perPage: number = 50,\n excludeFields: string[] = []\n ): Promise<InvoicePayload> {\n const self = this;\n let rows: InvoicePayload;\n const invFields = invoiceFields.map((f: string) => `invoices.${f}`);\n const expenseAccountFields = accountFields.map(\n (f: string) => `expenseAccount.${f} AS expenseAccount_${f}`\n );\n const revenueAccountFields = accountFields.map(\n (f: string) => `revenueAccount.${f} AS revenueAccount_${f}`\n );\n const expenseAccountDeptFields = departmentFields.map(\n (f: string) =>\n `expenseAccountDepartment.${f} AS expenseAccountDepartment_${f}`\n );\n const revenueAccountDeptFields = departmentFields.map(\n (f: string) =>\n `revenueAccountDepartment.${f} AS revenueAccountDepartment_${f}`\n );\n const expenseAccountBalFields = accountBalanceFields.map(\n (f: string) => `expenseAccountBalance.${f} AS expenseAccountBalance_${f}`\n );\n const fields = [\n ...invFields,\n ...expenseAccountFields,\n ...revenueAccountFields,\n ...expenseAccountDeptFields,\n ...revenueAccountDeptFields,\n ...expenseAccountBalFields,\n ];\n\n if (excludeFields.length) {\n excludeFields.forEach((f: string) => {\n const idx = fields.findIndex((field: string) => field.includes(f));\n if (idx > -1) {\n fields.splice(idx, 1);\n }\n });\n }\n try {\n rows = await this.db\n .from(\"invoices\")\n .leftJoin(\n \"accounts as expenseAccount\",\n \"invoices.customerAccount\",\n \"expenseAccount.account_number\"\n )\n .leftJoin(\n \"accounts as revenueAccount\",\n \"invoices.sellingAccount\",\n \"revenueAccount.account_number\"\n )\n .leftJoin(\n \"departments as expenseAccountDepartment\",\n function (this: any) {\n this.on(\n \"expenseAccount.department\",\n \"=\",\n \"expenseAccountDepartment.dept\"\n )\n .on(\n \"expenseAccountDepartment.part\",\n \"=\",\n \"expenseAccount.campus_code\"\n )\n .andOnVal(\"expenseAccountDepartment.sub\", null);\n }\n )\n .leftJoin(\n \"departments as revenueAccountDepartment\",\n function (this: any) {\n this.on(\n \"revenueAccount.department\",\n \"=\",\n \"revenueAccountDepartment.dept\"\n ).on(\n \"revenueAccountDepartment.part\",\n \"=\",\n \"revenueAccount.campus_code\"\n );\n }\n )\n .leftJoin(\n \"account_balances as expenseAccountBalance\",\n function (this: any) {\n this.on(\n \"expenseAccountBalance.account_number\",\n \"=\",\n \"expenseAccount.budget_account_number\"\n ).on(\n \"expenseAccountBalance.fiscal_year\",\n \"=\",\n \"expenseAccount.fiscal_year\"\n );\n }\n )\n .where(this.db.raw(query))\n .whereNull(\"revenueAccountDepartment.sub\")\n .orderBy(sortColumn, sortDirection)\n .select(fields)\n .paginate({ perPage, currentPage: page, isLengthAware: true });\n rows.data = await Promise.all(\n rows.data.map(async (row: any) => {\n const rec = await self.processInvoice(row, false, excludeFields);\n return rec;\n })\n );\n } catch (e) {\n throw e;\n }\n\n return rows;\n }\n\n /**\n *\n * Adds an invoice\n * @param {object} invoice\n * @param {string} type\n * @param {string} famisInvoiceNumber\n * @returns {Promise<object>} invoice\n * @memberof FAMISDb\n */\n async addInvoice(\n invoice: any,\n type: string,\n famisInvoiceNumber?: string\n ): Promise<any> {\n let records;\n\n try {\n famisInvoiceNumber = famisInvoiceNumber ?? undefined;\n famisInvoiceNumber = famisInvoiceNumber\n ? famisInvoiceNumber\n : await this.getNextFAMISInvoiceNumber(type);\n\n invoice.details.forEach((d: any) => {\n d.famis.invoiceNumber = famisInvoiceNumber;\n if (!d.other) {\n d.other = \"0.00\";\n }\n if (!d.comments) {\n d.comments = null;\n }\n if (!d.billingPeriod) {\n d.billingPeriod = null;\n }\n });\n\n records = await this.db(\"invoices\")\n .returning(returningColumns)\n .insert({\n number: invoice.number,\n lab: invoice.lab,\n totalAmount: parseFloat(invoice.totalAmount),\n data: JSON.stringify(invoice),\n date: invoice.date,\n uid: createId(),\n fingerprint: invoice.fingerprint,\n type: type,\n famisInvoiceNumber: famisInvoiceNumber,\n customerAccount: this.getAccountNumber(invoice.details[0].famis)\n .accountNumber,\n sellingAccount: getCoreAccountNumber(invoice.details[0].famis),\n });\n } catch (e) {\n throw e;\n }\n\n return records;\n }\n\n /**\n *\n * Updates an invoice\n * @param {string} uid\n * @param {Invoice} invoice\n * @returns {Promise<Invoice>} invoice object\n * @memberof FAMISDb\n */\n async updateInvoice(uid: string, invoice: Invoice): Promise<InvoicePayload> {\n let records;\n invoice.data.details.forEach((d: any) => {\n if (!d.other) {\n d.other = \"0.00\";\n }\n if (!d.comments) {\n d.comments = null;\n }\n if (!d.billingPeriod) {\n d.billingPeriod = null;\n }\n });\n try {\n const {\n comments,\n isIdt,\n poNumber,\n totalAmount,\n data,\n customerAccount,\n sellingAccount,\n fingerprint,\n ...rest\n } = invoice;\n\n const record: any = {\n ...rest,\n totalAmount: parseFloat(totalAmount!.replace(\"$\", \"\")),\n data: JSON.stringify(data),\n customerAccount: this.getAccountNumber(data.details[0].famis)\n .accountNumber,\n sellingAccount: getCoreAccountNumber(data.details[0].famis),\n fingerprint: fingerprint ? fingerprint : null,\n };\n /**\n if (invoice.replace_data) {\n record.replace_data = invoice.replace_data;\n }\n */\n records = await this.db(\"invoices\")\n .returning(returningColumns)\n .update(record)\n .where(\"uid\", uid);\n records = await this.getInvoiceByUid(uid);\n } catch (e) {\n throw e;\n }\n return records;\n }\n\n /**\n *\n * Toggles an invoice as paid\n * @param {string} uid\n * @param {boolean} invoiced\n * @returns {Promise<object>} invoice object\n * @memberof FAMISDb\n */\n async markInvoiced(uid: string, invoiced: boolean): Promise<any> {\n let records;\n\n try {\n records = await this.db(\"invoices\")\n .returning(returningColumns)\n .update({\n invoiced,\n })\n .where(\"uid\", uid);\n } catch (e) {\n throw e;\n }\n return records;\n }\n\n /**\n *\n * Toggles an invoice as emailed\n * @param {string} uid\n * @param {boolean} emailed\n * @returns {Promise<object>} invoice object\n * @memberof FAMISDb\n */\n async markEmailed(uid: string, emailed: boolean): Promise<any> {\n let records;\n\n try {\n records = await this.db(\"invoices\")\n .returning(returningColumns)\n .update({\n emailed,\n })\n .where(\"uid\", uid);\n } catch (e) {\n throw e;\n }\n return records;\n }\n\n /**\n *\n * Sets an invoice's deletion date\n * @param {string} uid\n * @param {date} deleted\n * @returns {Promise<object>} invoice object\n * @memberof FAMISDb\n */\n async setDeleted(uid: string, deleted: Date): Promise<any> {\n let records;\n\n try {\n records = await this.db(\"invoices\")\n .returning(returningColumns)\n .update({\n deleted,\n })\n .where(\"uid\", uid);\n } catch (e) {\n throw e;\n }\n return records;\n }\n\n /**\n *\n * Sets an invoice's posted date\n * @param {string} uid\n * @param {date} postedDate\n * @returns {Promise<object>} invoice object\n * @memberof FAMISDb\n */\n async setInvoicePostedDate(\n uid: string,\n postedDate: Date | null\n ): Promise<any> {\n let records;\n\n try {\n records = await this.db(\"invoices\")\n .returning(returningColumns)\n .update({\n postedDate,\n })\n .where(\"uid\", uid);\n } catch (e) {\n throw e;\n }\n return records;\n }\n\n /**\n *\n * Sets an invoice's fingerprint\n * @param {string} uid\n * @param {string} fingerprint\n * @returns {Promise<object>} invoice object\n * @memberof FAMISDb\n */\n async setInvoiceFingerPrint(uid: string, fingerprint: string): Promise<any> {\n let records;\n\n try {\n records = await this.db(\"invoices\")\n .returning(returningColumns)\n .update({\n fingerprint,\n })\n .where(\"uid\", uid);\n } catch (e) {\n throw e;\n }\n return records;\n }\n\n /**\n *\n * Get PI accounts by account number\n * @param {string} number\n * @param {string} campus\n * @param {boolean} [historical=false]\n * @returns {Promise<Account>} account object\n * @memberof FAMISDb\n */\n async getByAccountNumber(\n number: string,\n campus: string = \"02\",\n historical: boolean = false\n ): Promise<any> {\n let records;\n let retVal;\n let table = historical ? \"accounts_all\" : \"accounts\";\n const self = this;\n\n if (!number) {\n throw Error(\"Null account number\");\n }\n try {\n records = await this.db(`${table}`)\n .leftJoin(\"departments\", function (this: any) {\n this.on(`${table}.department`, \"=\", \"departments.dept\").on(\n \"departments.part\",\n \"=\",\n self.db.raw(\"?\", [number.substring(0, 2)])\n );\n })\n .leftJoin(`${table} as parent_account`, function (this: any) {\n this.on(`${table}.campus_code`, \"=\", \"parent_account.campus_code\")\n .on(`${table}.account`, \"=\", \"parent_account.account\")\n .on(\n \"parent_account.support_account\",\n \"=\",\n self.db.raw(\"?\", [\"00000\"])\n )\n .on(`${table}.fiscal_year`, \"=\", \"parent_account.fiscal_year\");\n })\n .select(\n `${table}.*`,\n \"departments.idt_email as billingEmailId\",\n \"parent_account.idt_allowed as parent_account_idt_allowed\"\n )\n .whereNull(\"departments.sub\")\n .andWhere(function (this: any) {\n this.whereNull(\"departments.exp_date\").orWhere(\n \"departments.exp_date\",\n \">\",\n self.db.raw(\"CURRENT_DATE\")\n );\n })\n .andWhere(`${table}.account_number`, number);\n if (records.length) {\n retVal = records[0];\n } else {\n records = await this.db(\"customers\")\n .where(\"account_number\", number)\n .andWhere(\"campus_code\", campus);\n if (records.length) {\n retVal = Object.assign({}, records[0], {\n idt_allowed: false,\n parent_account_idt_allowed: false,\n billingEmailId: records[0].email,\n });\n }\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Search PI accounts by partial account number\n * @param {string|string[]} number\n * @returns {Promise<AccountPayload>} account object(s)\n * @memberof FAMISDb\n */\n async searchByAccountNumber(\n number: string | string[],\n sortColumn: string = \"account_number\",\n sortDirection: SortDirection | string = \"desc\",\n page: number = 1,\n perPage: number = 50\n ): Promise<AccountPayload> {\n let records: AccountPayload;\n const self = this;\n\n try {\n const where = Array.isArray(number)\n ? `ALL(ARRAY[${number.map((n: string) => `'%${n}%'`).join()}])`\n : `ALL(ARRAY['%${number}%'])`;\n const accounts = await this.db(\"accounts\")\n .leftJoin(\"departments\", function (this: any) {\n this.on(\"accounts.department\", \"=\", \"departments.dept\").on(\n \"departments.part\",\n \"=\",\n \"accounts.campus_code\"\n );\n })\n .leftJoin(\"account_balances\", function (this: any) {\n this.on(\n \"account_balances.account_number\",\n \"=\",\n \"accounts.budget_account_number\"\n ).on(\"account_balances.fiscal_year\", \"=\", \"accounts.fiscal_year\");\n })\n .select(\n \"accounts.*\",\n \"departments.idt_email as billingEmailId\",\n \"account_balances.balance\"\n )\n .whereNull(\"departments.sub\")\n .andWhere(function (this: any) {\n this.whereNull(\"departments.exp_date\").orWhere(\n \"departments.exp_date\",\n \">\",\n self.db.raw(\"CURRENT_DATE\")\n );\n })\n .where(\"accounts.account_number\", \"ilike\", this.db.raw(where))\n .unionAll([\n this.db\n .select(\n \"NULL as uid\",\n \"NULL as campus_code\",\n \"NULL as account_number\",\n 'NULL as \"name\" as title',\n \"NULL as email\",\n \"NULL as fiscal_year\",\n \"NULL as account\",\n \"NULL as support_account\",\n \"NULL as budget_support_account\",\n \"NULL as budget_account_number\",\n \"NULL as expiration_date\",\n \"NULL as status\",\n \"NULL as uin\",\n \"NULL as responsible_uin\",\n \"NULL as department\",\n \"NULL as setup_date\",\n \"NULL as budget_access\",\n \"NULL as abr_rule\",\n \"NULL as idt_allowed\",\n \"NULL as adloc_campus_code\",\n \"NULL as adloc_department\",\n \"NULL as adloc_name\",\n \"NULL as preferred_first_name\",\n \"NULL as first_name\",\n \"NULL as middle_name\",\n \"NULL as last_name\",\n \"NULL as work_phone\",\n \"NULL as active\",\n \"NULL as default_bank\",\n \"NULL as bank_override\",\n \"NULL as last_seen\",\n \"NULL as srs\",\n \"NULL as cfda_no\",\n \"NULL as sponsor_type\",\n \"NULL as billingEmailId\",\n \"NULL as balance\"\n )\n .from(\"customers\")\n .where(\"customers.account_number\", \"ilike\", this.db.raw(where)),\n ])\n .orderBy(sortColumn, sortDirection)\n .paginate({ perPage, currentPage: page, isLengthAware: true });\n records = accounts;\n } catch (e) {\n throw e;\n }\n return records;\n }\n\n /**\n *\n * Get PI Accounts by UIN\n * @param {string|string[]} uin\n * @returns {Promise<Account[]>} account object array\n * @memberof FAMISDb\n */\n async getAccountsByUin(\n uin: string | string[],\n responsible?: boolean,\n sortColumn: string = \"account_number\",\n sortDirection: SortDirection | string = \"desc\",\n page: number = 1,\n perPage: number = 50\n ): Promise<AccountPayload> {\n let records: AccountPayload;\n const self = this;\n\n try {\n const where = Array.isArray(uin)\n ? `ALL(ARRAY[${uin.map((n: string) => `'%${n}%'`).join()}])`\n : `ALL(ARRAY['%${uin}%'])`;\n const qry = this.db(\"accounts\")\n .join(\n \"departments\",\n function (this: any) {\n this.on(\"accounts.department\", \"=\", \"departments.dept\").on(\n \"accounts.campus_code\",\n \"=\",\n \"departments.part\"\n );\n },\n \"left\"\n )\n .select(\"accounts.*\", \"departments.idt_email as billingEmailId\")\n .whereNull(\"departments.sub\")\n .andWhere(function (this: any) {\n this.whereNull(\"departments.exp_date\").orWhere(\n \"departments.exp_date\",\n \">\",\n self.db.raw(\"CURRENT_DATE\")\n );\n })\n .where(\"uin\", \"ilike\", this.db.raw(where))\n .orderBy(sortColumn, sortDirection);\n records = responsible\n ? await qry\n .orWhere(\"responsible_uin\", \"ilike\", this.db.raw(where))\n .paginate({ perPage, currentPage: page, isLengthAware: true })\n : await qry.paginate({\n perPage,\n currentPage: page,\n isLengthAware: true,\n });\n } catch (e) {\n throw e;\n }\n return records;\n }\n\n /**\n *\n * Get PI accounts by responsible UIN\n * @param {string} uin\n * @returns {Promise<Account[]>} account object array\n * @memberof FAMISDb\n */\n async getAccountsByResponsibleUin(\n uin: string | string[]\n ): Promise<Account[]> {\n let records: Account[];\n const self = this;\n\n try {\n const where = Array.isArray(uin)\n ? `ALL(ARRAY[${uin.map((n: string) => `'%${n}%'`).join()}])`\n : `ALL(ARRAY['%${uin}%'])`;\n records = await this.db(\"accounts\")\n .join(\n \"departments\",\n function (this: any) {\n this.on(\"accounts.department\", \"=\", \"departments.dept\").on(\n \"accounts.campus_code\",\n \"=\",\n \"departments.part\"\n );\n },\n \"left\"\n )\n .select(\"accounts.*\", \"departments.idt_email as billingEmailId\")\n .whereNull(\"departments.sub\")\n .andWhere(function (this: any) {\n this.whereNull(\"departments.exp_date\").orWhere(\n \"departments.exp_date\",\n \">\",\n self.db.raw(\"CURRENT_DATE\")\n );\n })\n .where(\"uin\", \"ilike\", this.db.raw(where));\n } catch (e) {\n throw e;\n }\n return records;\n }\n\n /**\n *\n * Queries accounts\n * @param {string} query\n * @param {string} [sortColumn='date']\n * @param {string} [sortDirection='desc']\n * @param {integer} page - page of results to return\n * @param {integer} perPage - number of results per page to return\n * @returns {Promise<AccountPayload>} invoice objects\n * @memberof FAMISDb\n */\n async queryAccounts(\n query: string,\n sortColumn: string = \"date\",\n sortDirection: SortDirection | string = \"desc\",\n page: number = 1,\n perPage: number = 50\n ): Promise<AccountPayload> {\n let rows: AccountPayload;\n const acctFields = accountFields.map((f: string) => `accounts.${f}`);\n const accountBalFields = accountBalanceFields.map(\n (f: string) => `accountBalance.${f} AS accountBalance_${f}`\n );\n const deptFields = departmentFields.map(\n (f: string) => `d.${f} AS department_${f}`\n );\n const accountantFields = personFields.map(\n (f: string) => `accountant.${f} AS accountant_${f}`\n );\n /*\n const expenseAccountFields = accountFields.map((f: string) => `expenseAccount.${f} AS expenseAccount_${f}`);\n const revenueAccountFields = accountFields.map((f: string) => `revenueAccount.${f} AS revenueAccount_${f}`);\n const revenueAccountDeptFields = departmentFields.map((f: string) => `revenueAccountDepartment.${f} AS revenueAccountDepartment_${f}`);\n */\n const fields = [\n ...acctFields,\n ...accountBalFields,\n ...deptFields,\n ...accountantFields,\n /*\n ...expenseAccountFields,\n ...revenueAccountFields,\n ...expenseAccountDeptFields,\n ...revenueAccountDeptFields,\n ...expenseAccountBalFields,\n */\n ];\n try {\n rows = await this.db\n .from(\"accounts\")\n .leftJoin(\"account_balances as accountBalance\", function (this: any) {\n this.on(\n \"accountBalance.account_number\",\n \"=\",\n \"accounts.budget_account_number\"\n ).on(\"accountBalance.fiscal_year\", \"=\", \"accounts.fiscal_year\");\n })\n .leftJoin(\"departments as d\", function (this: any) {\n this.on(\"accounts.department\", \"=\", \"d.dept\").on(\n \"accounts.campus_code\",\n \"=\",\n \"d.part\"\n );\n })\n .leftJoin(\"people.current as accountant\", function (this: any) {\n this.on(\n \"accounts.responsible_uin\",\n \"=\",\n \"accountant.tamuEduPersonUIN\"\n );\n })\n .where(this.db.raw(query))\n .whereNull(\"d.sub\")\n .orderBy(sortColumn, sortDirection)\n .select(fields)\n .paginate({ perPage, currentPage: page, isLengthAware: true });\n /*\n rows.data = await Promise.all(\n rows.data.map(async (row: any) => {\n const rec = await self.processInvoice(row);\n return rec;\n })\n );\n */\n } catch (e) {\n throw e;\n }\n\n return rows;\n }\n\n /**\n *\n * Get next FAMIS invoice number in sequence for specified invoice type\n * @param {string} invoice\n * @returns {Promise<string>} next invoice number in sequence\n * @memberof FAMISDb\n */\n async getNextFAMISInvoiceNumber(type: string): Promise<string> {\n let records;\n let prefix: {\n start: number;\n end: number;\n prefix: string;\n aliases: string[];\n } = {\n start: 0,\n end: 0,\n prefix: \"\",\n aliases: [],\n };\n let retVal;\n famisInvoiceNumbers.forEach((f) => {\n if (f.aliases.includes(type)) {\n prefix = f;\n }\n });\n try {\n retVal = `${prefix.prefix}${prefix.start}`;\n records = await this.db(\"invoices\")\n .whereIn(\"type\", prefix.aliases)\n .orderBy(\"famisInvoiceNumber\", \"desc\");\n if (records.length) {\n const number =\n parseInt(records[0].famisInvoiceNumber.substring(1), 10) + 1;\n //@ts-ignore\n retVal = `${prefix.prefix}${number}`;\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Get matching expense code for specified revenue code\n * @param {string} revenue\n * @returns {Promise<string>} expense code\n * @memberof FAMISDb\n */\n async getExpenseCodeByRevenue(revenue: string): Promise<string> {\n let records;\n let retVal;\n try {\n records = await this.db(\"codes\")\n .where(\"revenue\", revenue)\n .orderBy(\"id\", \"desc\");\n if (records.length) {\n retVal = records[0].expense;\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n * Represents a row in the 'codes' table.\n * @typedef {Object} Code\n * @property {number} id - The unique identifier for the code.\n * @property {string|null} revenue - The revenue code (nullable).\n * @property {string|null} expense - The expense code (nullable).\n * @property {boolean} sales - Indicates if the code is associated with sales.\n * @property {boolean} srs - Indicates if the code is associated with SRS.\n */\n\n /**\n *\n * Get revenue code object\n * @param {string} revenue\n * @returns {Promise<Code>} revenue code object\n * @memberof FAMISDb\n */\n async getRevenueCode(revenue: string): Promise<FAMISObjectCode> {\n let records;\n let retVal;\n try {\n records = await this.db(\"codes\")\n .where(\"revenue\", revenue)\n .orderBy(\"id\", \"desc\");\n if (records.length) {\n retVal = records[0];\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Get expense code object\n * @param {string} code\n * @returns {Promise<Code>} expense code object\n * @memberof FAMISDb\n */\n async getExpenseCode(code: string): Promise<FAMISObjectCode> {\n let records;\n let retVal;\n try {\n records = await this.db(\"codes\")\n .where(\"expense\", code)\n .orderBy(\"id\", \"desc\");\n if (records.length) {\n retVal = records[0];\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Check if expense code is within the allowable range for specified account and the specified fiscal year (defaults to the current)\n * @param {string} accountNumber\n * @param {string} code\n * @param {integer} fiscal\n * @returns {Promise<boolean>} truthy value\n * @memberof FAMISDb\n */\n async allowableExpenseCode(\n accountNumber: string,\n code: string,\n fiscal?: number\n ): Promise<boolean> {\n let records;\n let retVal = false;\n const year = fiscal ? fiscal : this.getCurrentFiscalYear();\n try {\n records = await this.db(\"subcode_edits\")\n .select(\"allowed\")\n .where(\"campus_code\", accountNumber.substring(0, 2))\n .andWhere(\"account\", accountNumber.substring(2, 8))\n .andWhere(\"support_account\", accountNumber.substring(8, 13))\n .andWhere(\"fiscal_year\", year)\n .andWhereRaw(\"? BETWEEN low AND high\", [parseInt(code)]);\n if (records.length) {\n retVal = records[0].allowed;\n } else {\n records = await this.db(\"abr_rules\")\n .select(\"abr_rules.*\")\n .join(\n \"accounts\",\n function (this: any) {\n this.on(\"accounts.abr_rule\", \"=\", \"abr_rules.abr_rule\")\n .on(\"accounts.campus_code\", \"=\", \"abr_rules.campus_code\")\n .on(\"accounts.fiscal_year\", \"=\", \"abr_rules.fiscal_year\");\n },\n \"left\"\n )\n .where(\"accounts.account_number\", accountNumber)\n .andWhere(\"accounts.fiscal_year\", year)\n .andWhereRaw(\"? BETWEEN abr_rules.low AND abr_rules.high\", [\n parseInt(code),\n ]);\n if (records.length) {\n retVal = true;\n }\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Get allowable expense code ranges for the specified account\n * @param {string} accountNumber\n * @param {integer} fiscal\n * @returns {Promise<boolean>} expense code range object(s)\n * @memberof FAMISDb\n */\n async getAllowableExpenseCodes(\n accountNumber: string,\n fiscal?: number\n ): Promise<{ allowed: object[]; disallowed: object[] }> {\n let abr;\n let subcode;\n let disallowed;\n let retVal = <{ allowed: any[]; disallowed: any[] }>{\n allowed: [],\n disallowed: [],\n };\n const year = fiscal ? fiscal : this.getCurrentFiscalYear();\n try {\n subcode = await this.db(\"subcode_edits\")\n .select(\"low\", \"high\")\n .where(\"campus_code\", accountNumber.substring(0, 2))\n .andWhere(\"account\", accountNumber.substring(2, 8))\n .andWhere(\"support_account\", accountNumber.substring(8, 13))\n .andWhere(\"fiscal_year\", year)\n .andWhere(\"allowed\", true)\n .orderBy(\"low\", \"asc\");\n disallowed = await this.db(\"subcode_edits\")\n .select(\"low\", \"high\")\n .where(\"campus_code\", accountNumber.substring(0, 2))\n .andWhere(\"account\", accountNumber.substring(2, 8))\n .andWhere(\"support_account\", accountNumber.substring(8, 13))\n .andWhere(\"fiscal_year\", year)\n .andWhere(\"allowed\", false)\n .orderBy(\"low\", \"asc\");\n abr = await this.db(\"abr_rules\")\n .select(\"abr_rules.low\", \"abr_rules.high\")\n .join(\n \"accounts\",\n function (this: any) {\n this.on(\"accounts.abr_rule\", \"=\", \"abr_rules.abr_rule\")\n .on(\"accounts.campus_code\", \"=\", \"abr_rules.campus_code\")\n .on(\"accounts.fiscal_year\", \"=\", \"abr_rules.fiscal_year\");\n },\n \"left\"\n )\n .where(\"accounts.account_number\", accountNumber)\n .andWhere(\"accounts.fiscal_year\", year)\n .orderBy(\"low\", \"asc\");\n if (abr.length || subcode.length) {\n const allowed = [...abr, ...subcode];\n retVal = {\n allowed,\n disallowed,\n };\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Query cores\n * @param {string} query\n * @param {string} [sortColumn='facility']\n * @param {string} [sortDirection='asc']\n * @param {integer} page - page of results to return\n * @param {integer} perPage - number of results per page to return\n * @param {string[]} excludeFields - fields to exclude from results\n * @returns {Promise<CorePayload>} core objects\n * @memberof FAMISDb\n */\n async queryCores(\n query: string,\n sortColumn: string = \"facility\",\n sortDirection: SortDirection | string = \"asc\",\n page: number = 1,\n perPage: number = 50,\n excludeFields: string[] = []\n ): Promise<CorePayload> {\n const self = this;\n let rows: CorePayload;\n const systemFields = systemPartFields.map(\n (f: string) => `system.${f} AS system_${f}`\n );\n /*\n const expenseAccountFields = accountFields.map((f: string) => `expenseAccount.${f} AS expenseAccount_${f}`);\n const revenueAccountFields = accountFields.map((f: string) => `revenueAccount.${f} AS revenueAccount_${f}`);\n const revenueAccountDeptFields = departmentFields.map((f: string) => `revenueAccountDepartment.${f} AS revenueAccountDepartment_${f}`);\n */\n const fields = [\n ...systemFields,\n /*\n ...expenseAccountFields,\n ...revenueAccountFields,\n ...expenseAccountDeptFields,\n ...revenueAccountDeptFields,\n ...expenseAccountBalFields,\n */\n ];\n if (excludeFields.length) {\n excludeFields.forEach((f: string) => {\n const idx = fields.findIndex((field: string) => field.includes(f));\n if (idx > -1) {\n fields.splice(idx, 1);\n }\n });\n }\n try {\n rows = await this.db\n .with(\"coreaccounts\", (qb: any) => {\n qb.select(\n \"accounts.*\",\n \"core_accounts.active as coreAccountActive\",\n \"core_accounts.coreId\",\n \"core_accounts.effective\",\n \"core_accounts.id as coreAccountId\"\n )\n .from(\"core_accounts\")\n .join(\n \"accounts\",\n \"core_accounts.account\",\n \"accounts.account_number\"\n );\n })\n .with(\"coreusers\", (qb: any) => {\n qb.select(\n \"users.*\",\n \"user_cores.email\",\n \"user_cores.coreId\",\n \"user_cores.id as coreUserId\"\n )\n .from(\"user_cores\")\n .join(\"users\", \"user_cores.userId\", \"users.id\");\n })\n .from(\"cores\")\n .leftJoin(\"system\", \"system.id\", \"cores.systemId\")\n .where(this.db.raw(query))\n .orderBy(sortColumn, sortDirection)\n .leftJoin(\n this.db\n .from(\"user_cores\")\n .join(\"coreusers\", {\n \"user_cores.userId\": \"coreusers.id\",\n \"user_cores.coreId\": \"coreusers.coreId\",\n })\n .select(\n \"user_cores.coreId\",\n this.db.raw(\n \"case when count(coreusers) = 0 then '[]' else jsonb_agg(coreusers.*) end as users\"\n )\n )\n .groupBy([\"user_cores.coreId\"])\n .as(\"user_cores\"),\n \"user_cores.coreId\",\n \"cores.id\"\n )\n .leftJoin(\n this.db\n .from(\"core_accounts\")\n .join(\"coreaccounts\", {\n \"core_accounts.account\": \"coreaccounts.account_number\",\n \"core_accounts.coreId\": \"coreaccounts.coreId\",\n })\n .select(\n \"core_accounts.coreId\",\n this.db.raw(\n \"case when count(coreaccounts) = 0 then '[]' else jsonb_agg(coreaccounts.*) end as accounts\"\n )\n )\n .groupBy([\"core_accounts.coreId\"])\n .as(\"core_accounts\"),\n \"core_accounts.coreId\",\n \"cores.id\"\n )\n .select([\n \"cores.*\",\n \"user_cores.users\",\n \"core_accounts.accounts\",\n ...fields,\n ])\n .paginate({ perPage, currentPage: page, isLengthAware: true });\n if (self.people) {\n rows.data = await Promise.all(\n rows.data.map(async (row: any) => {\n const uids = row.users?.map((u: any) => u.userId);\n if (uids) {\n // @ts-ignore\n const users = await self.people.bulkGetByUid(uids);\n if (users) {\n row.users = row.users?.map((u: any) => {\n let retVal = u;\n const user = users.find((u1: any) => u1.uid === u.userId);\n if (user) {\n retVal = {\n ...u,\n ...user,\n };\n } else if (u.role) {\n retVal = {\n ...u,\n sn: u.roleName,\n mail: u.roleEmail,\n };\n }\n return retVal;\n });\n }\n }\n return row;\n })\n );\n }\n } catch (e) {\n throw e;\n }\n\n return rows;\n }\n\n /**\n *\n * Get core by specified attribute and search term\n * @param {string} type\n * @param {string} operator\n * @param {string} search\n * @returns {Promise<Core>} core object\n * @memberof FAMISDb\n */\n async getCore(\n type: string,\n operator: string = \"=\",\n search: string\n ): Promise<Core> {\n let records;\n let retVal;\n try {\n const systemFields = systemPartFields.map(\n (f: string) => `system.${f} AS system_${f}`\n );\n const fields = [\n ...systemFields,\n /*\n ...expenseAccountFields,\n ...revenueAccountFields,\n ...expenseAccountDeptFields,\n ...revenueAccountDeptFields,\n ...expenseAccountBalFields,\n */\n ];\n records = await this.db\n .with(\"coreaccounts\", (qb: any) => {\n qb.select(\n \"accounts.*\",\n \"core_accounts.coreId\",\n \"core_accounts.active as coreAccountActive\",\n \"core_accounts.effective\",\n \"core_accounts.id as coreAccountId\"\n )\n .from(\"core_accounts\")\n .join(\n \"accounts\",\n \"core_accounts.account\",\n \"accounts.account_number\"\n );\n })\n .with(\"coreusers\", (qb: any) => {\n qb.select(\n \"users.*\",\n \"user_cores.email\",\n \"user_cores.coreId\",\n \"user_cores.id as coreUserId\"\n )\n .from(\"user_cores\")\n .join(\"users\", \"user_cores.userId\", \"users.id\");\n })\n .from(\"cores\")\n .leftJoin(\"system\", \"system.id\", \"cores.systemId\")\n .where(type, operator, search)\n .leftJoin(\n this.db\n .from(\"user_cores\")\n .join(\"coreusers\", {\n \"user_cores.userId\": \"coreusers.id\",\n \"user_cores.coreId\": \"coreusers.coreId\",\n })\n .select(\n \"user_cores.coreId\",\n this.db.raw(\n \"case when count(coreusers) = 0 then '[]' else jsonb_agg(coreusers.*) end as users\"\n )\n )\n .groupBy([\"user_cores.coreId\"])\n .as(\"user_cores\"),\n \"user_cores.coreId\",\n \"cores.id\"\n )\n .leftJoin(\n this.db\n .from(\"core_accounts\")\n .join(\"coreaccounts\", {\n \"core_accounts.account\": \"coreaccounts.account_number\",\n \"core_accounts.coreId\": \"coreaccounts.coreId\",\n })\n .select(\n \"core_accounts.coreId\",\n this.db.raw(\n \"case when count(coreaccounts) = 0 then '[]' else jsonb_agg(coreaccounts.*) end as accounts\"\n )\n )\n .groupBy([\"core_accounts.coreId\"])\n .as(\"core_accounts\"),\n \"core_accounts.coreId\",\n \"cores.id\"\n )\n .select([\n \"cores.*\",\n \"user_cores.users\",\n \"core_accounts.accounts\",\n ...fields,\n ]);\n if (records.length) {\n retVal = records[0];\n if (this.people) {\n const uids = retVal.users?.map((u: any) => u.userId);\n if (uids) {\n // @ts-ignore\n const users = await this.people.bulkGetByUid(uids);\n if (users) {\n retVal.users = retVal.users?.map((u: any) => {\n let retVal = u;\n const user = users.find((u1: any) => u1.uid === u.userId);\n if (user) {\n retVal = {\n ...u,\n ...user,\n };\n } else if (u.role) {\n retVal = {\n ...u,\n sn: u.roleName,\n mail: u.roleEmail,\n };\n }\n return retVal;\n });\n }\n }\n }\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Get core by id\n * @param {string} id\n * @returns {Promise<Core>} core object\n * @memberof FAMISDb\n */\n async getCoreById(id: string): Promise<Core> {\n let retVal;\n try {\n retVal = await this.getCore(\"cores.id\", \"=\", id);\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Get core by account number\n * @param {string} account\n * @returns {Promise<Core>} core object\n * @memberof FAMISDb\n */\n async getCoreByAccount(account: string): Promise<Core> {\n let retVal;\n try {\n retVal = await this.getCore(\n \"core_accounts.accounts\",\n \"@>\",\n `[{\"account_number\": \"${account}\"}]`\n );\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Update core\n * @param {Core} core object\n * @returns {Promise<Core>} core object\n * @memberof FAMISDb\n */\n async updateCore(core: Core): Promise<Core | undefined> {\n let retVal;\n const columns = [\n \"id\",\n \"facility\",\n \"contact\",\n \"contactEmail\",\n \"systemId\",\n \"enabled\",\n \"deleted\",\n \"coreEmail\",\n \"corePhone\",\n \"coreAddress\",\n \"from_email\",\n \"invoice_email\",\n ];\n const { id, ...record } = core;\n try {\n if (id) {\n await this.db(\"cores\")\n .returning(columns)\n .update(record)\n .where(\"id\", id);\n retVal = await this.getCore(\"cores.id\", \"=\", id.toString());\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Add core\n * @param {Core} core object\n * @returns {Promise<Core>} core object\n * @memberof FAMISDb\n */\n async addCore(core: Core): Promise<Core> {\n let retVal;\n const columns = [\n \"id\",\n \"facility\",\n \"contact\",\n \"contactEmail\",\n \"systemId\",\n \"enabled\",\n \"deleted\",\n \"coreEmail\",\n \"corePhone\",\n \"coreAddress\",\n \"from_email\",\n \"invoice_email\",\n ];\n try {\n retVal = await this.db(\"cores\").returning(columns).insert(core);\n if (retVal && retVal.length) {\n retVal = retVal[0];\n }\n const systemPart = this.getSystemById(retVal.systemId);\n retVal.systemPart = systemPart;\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Update core account\n * @param {CoreAccount} account object\n * @returns {Promise<CoreAccount>} core_account object\n * @memberof FAMISDb\n */\n async updateCoreAccount(account: CoreAccount): Promise<CoreAccount> {\n let retVal;\n const columns = [\"id\", \"account\", \"effective\", \"coreId\", \"active\"];\n const { id, ...record } = account;\n try {\n if (\"id\" in account) {\n retVal = await this.db(\"core_accounts\")\n .returning(columns)\n .update(record)\n .where(\"id\", id);\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Add core_account\n * @param {CoreAccount} account object\n * @returns {Promise<CoreAccount>} core_account object\n * @memberof FAMISDb\n */\n async addCoreAccount(account: CoreAccount): Promise<CoreAccount> {\n let retVal;\n const columns = [\"id\", \"account\", \"effective\", \"coreId\", \"active\"];\n try {\n retVal = await this.db(\"core_accounts\")\n .returning(columns)\n .insert(account);\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Delete core account\n * @param {coreAccountId} string core account id\n * @returns {Promise<CoreAccount>} core account object\n * @memberof FAMISDb\n */\n async deleteCoreAccount(coreAccountId: string): Promise<CoreAccount> {\n let retVal;\n try {\n retVal = await this.db(\"core_accounts\")\n .where(\"id\", coreAccountId)\n .delete();\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Get system part by ID\n * @param {number} id\n * @param {string[]} excludeFields - fields to exclude from results\n * @returns {Promise<SystemPart>} system part object\n * @memberof FAMISDb\n */\n async getSystemById(\n id: number,\n excludeFields: string[] = []\n ): Promise<SystemPart> {\n let records;\n let retVal;\n const fields = systemPartFields.map((f: string) => `system.${f}`);\n if (excludeFields.length) {\n excludeFields.forEach((f: string) => {\n const idx = fields.findIndex((field: string) => field.includes(f));\n if (idx > -1) {\n fields.splice(idx, 1);\n }\n });\n }\n try {\n records = await this.db(\"system\")\n .select(fields)\n .where(\"id\", id)\n .orderBy(\"id\", \"desc\");\n if (records.length) {\n retVal = records[0];\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Get system part by two-digit part number\n * @param {string} number\n * @returns {Promise<SystemPart>} system part object\n * @memberof FAMISDb\n */\n async getSystemByPartNumber(number: string): Promise<SystemPart> {\n let records;\n let retVal;\n try {\n records = await this.db(\"system\")\n .where(\"part\", number)\n .orderBy(\"id\", \"desc\");\n if (records.length) {\n retVal = records[0];\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Get all enabled cores\n * @returns {Promise<Core[]>} core objects\n * @memberof FAMISDb\n */\n async getEnabledCores(): Promise<Core[]> {\n let records;\n let retVal = [];\n try {\n records = await this.db\n .with(\"coreaccounts\", (qb: any) => {\n qb.select(\n \"accounts.*\",\n \"core_accounts.active as coreAccountActive\",\n \"core_accounts.coreId\",\n \"core_accounts.effective\",\n \"core_accounts.id as coreAccountId\"\n )\n .from(\"core_accounts\")\n .join(\n \"accounts\",\n \"core_accounts.account\",\n \"accounts.account_number\"\n );\n })\n .with(\"coreusers\", (qb: any) => {\n qb.select(\n \"users.*\",\n \"user_cores.email\",\n \"user_cores.coreId\",\n \"user_cores.id as coreUserId\"\n )\n .from(\"user_cores\")\n .join(\"users\", \"user_cores.userId\", \"users.id\");\n })\n .from(\"cores\")\n .leftJoin(\n this.db\n .from(\"user_cores\")\n .join(\"coreusers\", {\n \"user_cores.userId\": \"coreusers.id\",\n \"user_cores.coreId\": \"coreusers.coreId\",\n })\n .select(\n \"user_cores.coreId\",\n this.db.raw(\n \"case when count(coreusers) = 0 then '[]' else jsonb_agg(coreusers.*) end as users\"\n )\n )\n .groupBy([\"user_cores.coreId\"])\n .as(\"user_cores\"),\n \"user_cores.coreId\",\n \"cores.id\"\n )\n .leftJoin(\n this.db\n .from(\"core_accounts\")\n .join(\"coreaccounts\", {\n \"core_accounts.account\": \"coreaccounts.account_number\",\n \"core_accounts.coreId\": \"coreaccounts.coreId\",\n })\n .select(\n \"core_accounts.coreId\",\n this.db.raw(\n \"case when count(coreaccounts) = 0 then '[]' else jsonb_agg(coreaccounts.*) end as accounts\"\n )\n )\n .groupBy([\"core_accounts.coreId\"])\n .as(\"core_accounts\"),\n \"core_accounts.coreId\",\n \"cores.id\"\n )\n .select(\"cores.*\", \"user_cores.users\", \"core_accounts.accounts\")\n .where(\"enabled\", \"1\")\n .orderBy(\"cores.id\", \"desc\");\n if (records.length) {\n retVal = records;\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Get all cores\n * @param {string} [sortColumn='facility']\n * @param {string} [sortDirection='asc']\n * @param {boolean} [deleted=false]\n * @param {integer} page - page of results to return\n * @param {string} perPage - number of results per page to return\n * @returns {Promise<CorePayload>} core objects\n * @memberof FAMISDb\n */\n async getAllCores(\n sortColumn: string = \"facility\",\n sortDirection: SortDirection | string = \"asc\",\n deleted?: boolean,\n page: number = 1,\n perPage: number = 50\n ): Promise<CorePayload> {\n let rows;\n try {\n const systemParts = await this.getAllSystemParts();\n const qry = this.db(\"cores\")\n .orderBy(sortColumn, sortDirection)\n .select(\"*\");\n rows = deleted\n ? await qry\n .whereNotNull(\"deleted\")\n .paginate({ perPage, currentPage: page, isLengthAware: true })\n : await qry\n .whereNull(\"deleted\")\n .paginate({ perPage, currentPage: page, isLengthAware: true });\n rows.data = rows.data.map((c: any) => {\n const systemPart = systemParts.find((s) => s.id === c.systemId);\n return {\n ...c,\n systemPart,\n };\n });\n } catch (e) {\n throw e;\n }\n return rows;\n }\n\n /**\n *\n * Get a core's users by core ID\n * @param {number} coreId\n * @returns {Promise<Core[]>} user objects\n * @memberof FAMISDb\n */\n async getCoreUsers(coreId: number): Promise<Core[]> {\n let retVal;\n try {\n retVal = await this.db(\"user_cores\")\n .join(\"users\", \"user_cores.userId\", \"=\", \"users.id\")\n .where(\"coreId\", coreId)\n .select(\n \"users.*\",\n \"user_cores.id as userCoreId\",\n \"user_cores.coreId\",\n \"user_cores.email\"\n );\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Update core user\n * @param {CoreUser} user object\n * @returns {Promise<CoreUser>} user_core object\n * @memberof FAMISDb\n */\n async updateCoreUser(user: CoreUser): Promise<CoreUser> {\n let retVal;\n const columns = [\"id\", \"userId\", \"coreId\", \"email\"];\n const { id, ...record } = user;\n try {\n if (\"id\" in user) {\n retVal = await this.db(\"user_cores\")\n .returning(columns)\n .update(record)\n .where(\"id\", id);\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n * This function adds a new CoreUser to the database. If the user already exists, it updates the existing record.\n * @param {CoreUser} coreUser - The CoreUser object containing details about the user.\n * @return {Promise<CoreUser>} A Promise that resolves to the newly added or updated CoreUser, if successfully added and returned from the database; otherwise it rejects with an error.\n */\n async addCoreUser(coreUser: CoreUser): Promise<CoreUser> {\n let retVal;\n const columns = [\"id\", \"userId\", \"coreId\", \"email\"];\n try {\n let record = {\n userId: coreUser.userId,\n };\n const [userInsert] = await this.db(\"users\")\n .insert(record)\n .onConflict(\"userId\")\n .merge()\n .returning(\"*\");\n if (userInsert) {\n retVal = await this.db(\"user_cores\")\n .insert({\n ...coreUser,\n userId: userInsert.id,\n })\n .onConflict([\"userId\", \"coreId\"])\n .ignore()\n .returning(columns);\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Delete core user\n * @param {coreUserId} string core user object\n * @returns {Promise<CoreUser>} core user object\n * @memberof FAMISDb\n */\n async deleteCoreUser(coreUserId: string): Promise<CoreUser> {\n let retVal;\n try {\n retVal = await this.db(\"user_cores\").where(\"id\", coreUserId).delete();\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Get a user's cores they manage\n * @param {string} userId\n * @param {string} [sortColumn='facility']\n * @param {string} [sortDirection='asc']\n * @param {boolean} [deleted=false]\n * @param {integer} page - page of results to return\n * @param {string} perPage - number of results per page to return\n * @returns {Promise<CorePayload]>} core objects\n * @memberof FAMISDb\n */\n async getUserCores(\n userId: string,\n sortColumn: string = \"facility\",\n sortDirection: SortDirection | string = \"asc\",\n deleted?: boolean,\n page: number = 1,\n perPage: number = 50\n ): Promise<CorePayload> {\n let rows;\n try {\n const systemParts = await this.getAllSystemParts();\n const qry = this.db(\"user_cores\")\n .join(\"cores\", \"user_cores.coreId\", \"=\", \"cores.id\")\n .join(\"users\", \"user_cores.userId\", \"=\", \"users.id\")\n .where(\"users.userId\", userId)\n .select(\n \"cores.*\",\n \"user_cores.id as userCoreId\",\n \"user_cores.userId\",\n \"user_cores.email\"\n )\n .orderBy(sortColumn, sortDirection);\n rows = deleted\n ? await qry\n .whereNotNull(\"cores.deleted\")\n .paginate({ perPage, currentPage: page, isLengthAware: true })\n : await qry\n .whereNull(\"cores.deleted\")\n .paginate({ perPage, currentPage: page, isLengthAware: true });\n rows.data = rows.data.map((c: any) => {\n const systemPart = systemParts.find((s) => s.id === c.systemId);\n return {\n ...c,\n systemPart,\n };\n });\n } catch (e) {\n throw e;\n }\n return rows;\n }\n\n /**\n *\n * Get a system part's users by system ID\n * @param {number} systemId\n * @returns {Promise<object[]>} user objects\n * @memberof FAMISDb\n */\n async getSystemUsers(systemId: number): Promise<User[]> {\n let retVal;\n try {\n retVal = await this.db(\"user_systems\")\n .join(\"users\", \"user_systems.userId\", \"=\", \"users.id\")\n .where(\"systemId\", systemId)\n .select(\n \"users.*\",\n \"user_systems.id as userSystemId\",\n \"user_systems.systemId\",\n \"user_systems.email\"\n );\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n *\n * Get a user's system parts they manage\n * @param {string} userId\n * @returns {Promise<SystemPart[]>} system objects\n * @memberof FAMISDb\n */\n async getUserSystemParts(userId: string): Promise<SystemPart[]> {\n let retVal;\n try {\n retVal = await this.db(\"user_systems\")\n .join(\"system\", \"user_systems.systemId\", \"=\", \"system.id\")\n .join(\"users\", \"user_systems.userId\", \"=\", \"users.id\")\n .where(\"users.userId\", userId)\n .select(\n \"system.*\",\n \"user_systems.id as userSystemId\",\n \"user_systems.userId\",\n \"user_systems.email\"\n );\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n * Represents the \"system\" table in the public schema.\n * @typedef {Object} System\n * @property {number} id - The ID (auto-generated).\n * @property {string | null} name - The name.\n * @property {string | null} due - The due text.\n * @property {string | null} fein - The FEIN (Federal Employer Identification Number).\n * @property {string | null} agency - The agency.\n * @property {string | null} checkAddress - The check address.\n * @property {boolean} credit - Indicates if credit is allowed.\n * @property {string | null} creditUrl - The credit URL.\n * @property {string | null} creditFee - The credit fee.\n * @property {string | null} part - The part.\n * @property {string | null} abbrev - The abbreviation.\n * @property {string | null} aggiebuy - The AggieBuy information.\n * @property {string | null} image - The image URL.\n */\n\n /**\n * Get all system parts.\n * @returns {Promise<SystemPart[]>} System objects.\n * @memberof FAMISDb\n */\n async getAllSystemParts(): Promise<SystemPart[]> {\n let retVal: SystemPart[];\n try {\n retVal = await this.db(\"system\").orderBy(\"id\", \"asc\");\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n * Get all admin users.\n * @returns {Promise<object[]>} Array of user objects.\n * @memberof FAMISDb\n */\n async getAdminUsers(): Promise<User[] | []> {\n let retVal: User[] | [] = [];\n try {\n retVal = await this.db(\"users\").where(\"admin\", true);\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n * Get user.\n * @param {string} userId - User ID.\n * @returns {Promise<object>} User object.\n * @memberof FAMISDb\n */\n async getUser(userId: string): Promise<User | null> {\n let records: User[];\n let retVal: User | null = null;\n try {\n records = await this.db(\"users\").where(\"userId\", userId);\n if (records.length) {\n const cores = await this.getUserCores(userId);\n const systems = await this.getUserSystemParts(userId);\n retVal = {\n ...records[0],\n cores,\n systems,\n };\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n * Update user.\n * @param {object} user - User object.\n * @returns {Promise<object>} Updated user object.\n * @memberof FAMISDb\n */\n async updateUser(user: object): Promise<object | null> {\n let retVal: object | null = null;\n const columns = [\n \"id\",\n \"userId\",\n \"admin\",\n \"role\",\n \"roleName\",\n \"roleEmail\",\n \"deleted\",\n ];\n try {\n if (\"id\" in user)\n retVal = await this.db(\"users\")\n .returning(columns)\n .update(user)\n .where(\"id\", user.id);\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n * Get customer by customer account number.\n * @param {string} accountNumber - Customer account number.\n * @param {string} campusCode - Campus code.\n * @returns {Promise<object>} Customer account object.\n * @memberof FAMISDb\n */\n async getCustomerNumber(\n accountNumber: string,\n campusCode: string\n ): Promise<object | null> {\n let records: object[];\n let retVal: object | null = null;\n const code = pad(campusCode, 2);\n\n try {\n records = await this.db(\"customers\").where(\n \"uid\",\n `${code}${accountNumber}`\n );\n if (records.length) {\n retVal = records[0];\n }\n } catch (e) {\n throw e;\n }\n return retVal;\n }\n\n /**\n * Get current fiscal year.\n * @returns {number} Fiscal year.\n * @memberof FAMISDb\n */\n getCurrentFiscalYear(): number {\n let year: number;\n let today = new Date();\n if (today.getMonth() + 1 >= 9) {\n year = today.getFullYear() + 1;\n } else {\n year = today.getFullYear();\n }\n return year;\n }\n\n /**\n * Return fingerprint of invoice.\n * @param {object} invoice - JSON object.\n * @returns {string} Fingerprint.\n * @memberof FAMISDb\n */\n getInvoiceFingerPrint(invoice: object): string {\n const fingerPrint = revisionHash(\n JSON.stringify(sortObjectKeys(invoice), (_k, v) =>\n v === undefined ? \"undef\" : v\n )\n );\n return fingerPrint;\n }\n\n /**\n * Return formatted account number.\n * @param {string} accountNumber - Unformatted 13-digit FAMIS account number.\n * @returns {string} Formatted 13-digit FAMIS account number.\n * @memberof FAMISDb\n */\n formatAccountNumber(accountNumber: string): string {\n const formatted = accountNumber.replace(\n /(\\d{2})(\\d{6})(\\d{5})/,\n \"$1-$2-$3\"\n );\n\n return formatted;\n }\n\n /**\n * Is invoice flagged by SRS high-risk policies.\n * @param {object} invoice - JSON object.\n * @returns {Promise<HighRisk>} High-risk object.\n * @memberof FAMISDb\n */\n async isSrsHighRisk(invoice: Invoice): Promise<HighRiskInfo> {\n let srsHighRisk = false;\n const objectCodes = new Map();\n //console.log(invoice);\n try {\n await awaity.each(invoice.data.details, async (detail: any) => {\n //console.log(detail);\n if (\n detail.famis.customerAccountNumber &&\n detail.famis.sellingCampusCode\n ) {\n const acct = await this.getByAccountNumber(\n detail.famis.customerAccountNumber,\n detail.famis.sellingCampusCode\n );\n const objCode = await this.getRevenueCode(detail.sellingObjectCode);\n const isFederal =\n acct &&\n acct.cfda_no &&\n acct.sponsor_type &&\n acct.sponsor_type === \"F\";\n const srsApproved =\n invoice.replace_data && \"srs_approved\" in invoice.replace_data\n ? invoice.replace_data.srs_approved\n : false;\n if (\n objCode &&\n objCode.srs &&\n acct &&\n acct.srs &&\n isFederal &&\n !srsApproved &&\n invoice.isIdt\n ) {\n srsHighRisk = true;\n let val = [detail];\n if (objectCodes.has(objCode.expense))\n val.push(...objectCodes.get(objCode.expense));\n objectCodes.set(objCode.expense, val);\n }\n }\n });\n } catch (e) {\n //console.log(invoice);\n console.log(e);\n }\n return {\n isHighRisk: srsHighRisk,\n flaggedTransactions: Object.fromEntries(objectCodes),\n };\n }\n\n /**\n * @typedef {Object} Comment\n * @property {integer} id - db generated id\n * @property {string} uid - uid\n * @property {string} invoice_id - invoice id\n * @property {string} user_id - user uid\n * @property {string} comment - text of comment\n * @property {string} type - type of comment\n * @property {date} created - created date\n * @property {date} deleted - deleted date\n */\n\n /**\n * Create or update an invoice comment.\n * @param {Comment} comment - JSON object representing the comment\n * @returns {Promise<Comment>} - Promise that resolves to the comment object\n * @memberof FAMISDb\n */\n async saveComment(comment: InvoiceComment): Promise<InvoiceComment | null> {\n const returningColumns = [\n \"id\",\n \"uid\",\n \"invoice_id\",\n \"user_id\",\n \"comment\",\n \"type\",\n \"created\",\n \"deleted\",\n ];\n let response: InvoiceComment | null;\n try {\n const records = await this.db(\"invoice_comments\").where({\n uid: comment.uid,\n });\n if (records.length) {\n response = await this.db(\"invoice_comments\")\n .returning(returningColumns)\n .update(comment)\n .where(\"uid\", comment.uid);\n } else {\n response = await this.db(\"invoice_comments\")\n .returning(returningColumns)\n .insert(comment);\n }\n\n if (response && Array.isArray(response) && response.length) {\n response = response[0];\n }\n } catch (e) {\n console.log(e);\n throw e;\n }\n return response;\n }\n\n /**\n * Get comments associated with an invoice.\n * @param {string} invoiceUid - Invoice UID\n * @returns {Promise<Comment[]>} - Promise that resolves to an array of comment objects\n * @memberof FAMISDb\n */\n async getInvoiceComments(invoiceUid: string): Promise<InvoiceComment[]> {\n let self = this;\n let response: InvoiceComment[];\n try {\n const records = await this.db(\"invoice_comments\")\n .select(\"invoice_comments.*\")\n .where({ invoice_id: invoiceUid })\n .orderBy(\"created\", \"desc\");\n response = await awaity.map(records, async (r: any) => {\n const retVal = r;\n const files = await self.getCommentFiles(r.uid);\n r.files = files;\n if (self.people) {\n //@ts-ignore\n const user = await self.people.getByUid(r.user_id);\n if (user) {\n retVal.user = user;\n }\n }\n return retVal;\n });\n } catch (e) {\n console.log(e);\n throw e;\n }\n return response;\n }\n\n /**\n * @typedef {Object} CommentFile\n * @property {integer} id - db generated id\n * @property {string} uid - uid\n * @property {string} invoice_id - invoice uid\n * @property {string} comment_id - comment uid\n * @property {string} original_filename - original file name\n * @property {string} filename - generate unique filename on filesystem\n * @property {date} created - created date\n * @property {date} deleted - deleted date\n */\n\n /**\n * Create an invoice comment file.\n * @param {InvoiceCommentFile} file - JSON object representing the comment file\n * @returns {Promise<InvoiceCommentFile>} - Promise that resolves to the comment file object\n * @memberof FAMISDb\n */\n async saveCommentFile(\n file: InvoiceCommentFile\n ): Promise<InvoiceCommentFile | null> {\n const returningColumns = [\n \"id\",\n \"uid\",\n \"invoice_id\",\n \"comment_id\",\n \"original_filename\",\n \"filename\",\n \"created\",\n \"deleted\",\n ];\n let response: InvoiceCommentFile | null;\n try {\n response = await this.db(\"invoice_comment_files\")\n .returning(returningColumns)\n .insert(file);\n\n if (response && Array.isArray(response) && response.length) {\n response = response[0];\n }\n } catch (e) {\n console.log(e);\n throw e;\n }\n return response;\n }\n\n /**\n * Get invoice comment files.\n * @param {string} commentUid - Comment UID\n * @returns {Promise<CommentFile[]>} - Promise that resolves to an array of comment file objects\n * @memberof FAMISDb\n */\n async getCommentFiles(\n commentUid: string\n ): Promise<InvoiceCommentFile[] | []> {\n let response: InvoiceCommentFile[] | [] = [];\n try {\n const records = await this.db(\"invoice_comment_files\")\n .where({ comment_id: commentUid })\n .orderBy(\"created\", \"desc\");\n response = records;\n } catch (e) {\n console.log(e);\n throw e;\n }\n return response;\n }\n\n /**\n * Get invoice comment file.\n * @param {string} fileUid - File UID\n * @returns {Promise<CommentFile>} - Promise that resolves to a comment file object\n * @memberof FAMISDb\n */\n async getCommentFile(fileUid: string): Promise<InvoiceCommentFile | null> {\n let response: InvoiceCommentFile | null = null;\n try {\n const records = await this.db(\"invoice_comment_files\").where({\n uid: fileUid,\n });\n if (records.length) response = records[0];\n } catch (e) {\n console.log(e);\n throw e;\n }\n return response;\n }\n\n /**\n * Represents a row in the public.core_account_emails table.\n *\n * @interface CoreAccountEmail\n * @property {string} uid - The unique identifier for the account email.\n * @property {number} core_id - The core ID associated with the account email.\n * @property {string} account_number - The account number associated with the email.\n * @property {string} email - The email address associated with the account.\n * @property {Date | null} [created] - The timestamp when the account email was created. Nullable.\n * @property {Date | null} [deleted] - The timestamp when the account email was deleted. Nullable.\n */\n\n /**\n * Get additional delivery email to an expense accounts by uid\n * @param {string} uid - additional delivery email record uid\n * @returns {Promise<CoreAccountEmail|null>} - Promise that resolves to an account object\n * @memberof FAMISDb\n */\n async getCoreAccountAdditionalEmailByUid(\n uid: string\n ): Promise<CoreAccountEmail | null> {\n let response: CoreAccountEmail | null = null;\n try {\n const records = await this.db(\"core_account_emails\").where({ uid });\n response = records.length ? records[0] : records;\n } catch (e) {\n console.log(e);\n throw e;\n }\n return response;\n }\n\n /**\n * Get additional delivery emails to expense accounts for a core by core id\n * @param {number} coreId - Core ID\n * @returns {Promise<CoreAccountEmail[]|[]>} - Promise that resolves to an account object\n * @memberof FAMISDb\n */\n async getCoreAccountAdditionalEmailsByCoreId(\n coreId: number\n ): Promise<CoreAccountEmail[] | []> {\n let response: CoreAccountEmail[] | [] = [];\n try {\n const records = await this.db(\"core_account_emails\").where({\n core_id: coreId,\n });\n response = records;\n } catch (e) {\n console.log(e);\n throw e;\n }\n return response;\n }\n\n /**\n * Get additional delivery emails to expense accounts for a core by account number\n * @param {string} accountNumber - 13 digit famis account or customernumber\n * @returns {Promise<CoreAccountEmail[]|[]>} - Promise that resolves to an account object\n * @memberof FAMISDb\n */\n async getCoreAccountAdditionalEmailsByAccount(\n accountNumber: string\n ): Promise<CoreAccountEmail[] | []> {\n let response: CoreAccountEmail[] | [] = [];\n try {\n const records = await this.db(\"core_account_emails\").where({\n account_number: accountNumber,\n });\n response = records;\n } catch (e) {\n console.log(e);\n throw e;\n }\n return response;\n }\n\n /**\n * Get additional delivery emails to expense accounts for a core by core id\n * and account number\n * @param {number} coreId - Core ID\n * @param {string} account - account number\n * @returns {Promise<CoreAccountEmail[]|[]>} - Promise that resolves to an account object\n * @memberof FAMISDb\n */\n async getCoreAccountAdditionalEmailsByCoreIdAccount(\n coreId: number,\n account: string\n ): Promise<CoreAccountEmail[] | []> {\n let response: CoreAccountEmail[] | [] = [];\n try {\n const records = await this.db(\"core_account_emails\")\n .where({\n core_id: coreId,\n account_number: account,\n })\n .whereNull(\"deleted\");\n response = records;\n } catch (e) {\n console.log(e);\n throw e;\n }\n return response;\n }\n\n /**\n * Add an additional delivery email to an expense account for a core\n * @param {CoreAccountEmail} record - core account email delivery record\n * @returns {Promise<CoreAccountEmail>} - Promise that resolves to an account object\n * @memberof FAMISDb\n */\n async addCoreAccountAdditionalEmail(\n record: CoreAccountEmail\n ): Promise<CoreAccountEmail | null> {\n let response: CoreAccountEmail | null = null;\n const columns = [\n \"uid\",\n \"core_id\",\n \"account_number\",\n \"email\",\n \"created\",\n \"deleted\",\n ];\n try {\n const records = await this.db(\"core_account_emails\")\n .returning(columns)\n .insert(record);\n response = records.length ? records[0] : records;\n } catch (e) {\n console.log(e);\n throw e;\n }\n return response;\n }\n\n /**\n * Remove an additional delivery email to an expense account for a core\n * @param {string} uid - uid for core account email record\n * @returns {Promise<CoreAccountEmail>} - Promise that resolves to an account object\n * @memberof FAMISDb\n */\n async removeCoreAccountAdditionalEmail(\n uid: string\n ): Promise<CoreAccountEmail | null> {\n let response: CoreAccountEmail | null = null;\n const columns = [\n \"uid\",\n \"core_id\",\n \"account_number\",\n \"email\",\n \"created\",\n \"deleted\",\n ];\n try {\n const records = await this.db(\"core_account_emails\")\n .returning(columns)\n .update({\n deleted: this.db.raw(\"CURRENT_TIMESTAMP\"),\n })\n .where({ uid });\n response = records.length ? records[0] : records;\n } catch (e) {\n console.log(e);\n throw e;\n }\n return response;\n }\n}\n\nexport default FAMISDb;\n"],"names":["retVal","returningColumns"],"mappings":"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"}
|