diff --git a/helpers/functions.config.d.ts b/helpers/functions.config.d.ts index d6d29b4d..6a703fe1 100644 --- a/helpers/functions.config.d.ts +++ b/helpers/functions.config.d.ts @@ -52,4 +52,6 @@ export declare function getProperty(propertyName: 'settings.printPdf.contentDisp export declare function getProperty(propertyName: 'settings.dynamicsGP.integrationIsEnabled'): boolean; export declare function getProperty(propertyName: 'settings.dynamicsGP.mssqlConfig'): MSSQLConfig; export declare function getProperty(propertyName: 'settings.dynamicsGP.lookupOrder'): configTypes.DynamicsGPLookup[]; +export declare function getProperty(propertyName: 'settings.dynamicsGP.accountCodes'): string[]; +export declare function getProperty(propertyName: 'settings.dynamicsGP.itemNumbers'): string[]; export declare const keepAliveMillis: number; diff --git a/helpers/functions.config.js b/helpers/functions.config.js index 877eb891..fc88bb77 100644 --- a/helpers/functions.config.js +++ b/helpers/functions.config.js @@ -52,6 +52,8 @@ configFallbackValues.set('settings.adminCleanup.recordDeleteAgeDays', 60); configFallbackValues.set('settings.printPdf.contentDisposition', 'attachment'); configFallbackValues.set('settings.dynamicsGP.integrationIsEnabled', false); configFallbackValues.set('settings.dynamicsGP.lookupOrder', ['invoice']); +configFallbackValues.set('settings.dynamicsGP.accountCodes', []); +configFallbackValues.set('settings.dynamicsGP.itemNumbers', []); export function getProperty(propertyName) { const propertyNameSplit = propertyName.split('.'); let currentObject = config; diff --git a/helpers/functions.config.ts b/helpers/functions.config.ts index 75b5f2e8..b5e64725 100644 --- a/helpers/functions.config.ts +++ b/helpers/functions.config.ts @@ -99,6 +99,8 @@ configFallbackValues.set('settings.printPdf.contentDisposition', 'attachment') configFallbackValues.set('settings.dynamicsGP.integrationIsEnabled', false) configFallbackValues.set('settings.dynamicsGP.lookupOrder', ['invoice']) +configFallbackValues.set('settings.dynamicsGP.accountCodes', []) +configFallbackValues.set('settings.dynamicsGP.itemNumbers', []) /* * Set up function overloads @@ -229,6 +231,14 @@ export function getProperty( propertyName: 'settings.dynamicsGP.lookupOrder' ): configTypes.DynamicsGPLookup[] +export function getProperty( + propertyName: 'settings.dynamicsGP.accountCodes' +): string[] + +export function getProperty( + propertyName: 'settings.dynamicsGP.itemNumbers' +): string[] + export function getProperty(propertyName: string): unknown { const propertyNameSplit = propertyName.split('.') diff --git a/helpers/functions.dynamicsGP.js b/helpers/functions.dynamicsGP.js index fc0e86c9..73f9df31 100644 --- a/helpers/functions.dynamicsGP.js +++ b/helpers/functions.dynamicsGP.js @@ -5,11 +5,43 @@ if (configFunctions.getProperty('settings.dynamicsGP.integrationIsEnabled')) { gp.setMSSQLConfig(configFunctions.getProperty('settings.dynamicsGP.mssqlConfig')); diamond.setMSSQLConfig(configFunctions.getProperty('settings.dynamicsGP.mssqlConfig')); } +function filterCashReceipt(cashReceipt) { + const accountCodes = configFunctions.getProperty('settings.dynamicsGP.accountCodes'); + for (const accountCode of accountCodes) { + let found = cashReceipt.details.some((detailRecord) => { + return detailRecord.accountCode === accountCode; + }); + if (!found) { + found = cashReceipt.distributions.some((distributionRecord) => { + return distributionRecord.accountCode === accountCode; + }); + } + if (!found) { + return undefined; + } + } + return cashReceipt; +} +function filterInvoice(invoice) { + const itemNumbers = configFunctions.getProperty('settings.dynamicsGP.itemNumbers'); + for (const itemNumber of itemNumbers) { + const found = invoice.lineItems.some((itemRecord) => { + return itemRecord.itemNumber === itemNumber; + }); + if (!found) { + return undefined; + } + } + return invoice; +} async function _getDynamicsGPDocument(documentNumber, lookupType) { let document; switch (lookupType) { case 'invoice': { - const invoice = await gp.getInvoiceByInvoiceNumber(documentNumber); + let invoice = await gp.getInvoiceByInvoiceNumber(documentNumber); + if (invoice !== undefined) { + invoice = filterInvoice(invoice); + } if (invoice !== undefined) { document = { documentType: 'Invoice', @@ -27,7 +59,10 @@ async function _getDynamicsGPDocument(documentNumber, lookupType) { break; } case 'diamond/cashReceipt': { - const receipt = await diamond.getCashReceiptByDocumentNumber(documentNumber); + let receipt = await diamond.getCashReceiptByDocumentNumber(documentNumber); + if (receipt !== undefined) { + receipt = filterCashReceipt(receipt); + } if (receipt !== undefined) { document = { documentType: 'Cash Receipt', diff --git a/helpers/functions.dynamicsGP.ts b/helpers/functions.dynamicsGP.ts index b386b79b..678c4589 100644 --- a/helpers/functions.dynamicsGP.ts +++ b/helpers/functions.dynamicsGP.ts @@ -8,6 +8,9 @@ import * as configFunctions from './functions.config.js' import type { DynamicsGPLookup } from '../types/configTypes' import type { DynamicsGPDocument } from '../types/recordTypes.js' +import { type DiamondCashReceipt } from '@cityssm/dynamics-gp/diamond/types.js' +import { type GPInvoice } from '@cityssm/dynamics-gp/gp/types.js' + if (configFunctions.getProperty('settings.dynamicsGP.integrationIsEnabled')) { gp.setMSSQLConfig( configFunctions.getProperty('settings.dynamicsGP.mssqlConfig') @@ -17,6 +20,50 @@ if (configFunctions.getProperty('settings.dynamicsGP.integrationIsEnabled')) { ) } +function filterCashReceipt( + cashReceipt: DiamondCashReceipt +): DiamondCashReceipt | undefined { + const accountCodes = configFunctions.getProperty( + 'settings.dynamicsGP.accountCodes' + ) + + for (const accountCode of accountCodes) { + let found = cashReceipt.details.some((detailRecord) => { + return detailRecord.accountCode === accountCode + }) + + if (!found) { + found = cashReceipt.distributions.some((distributionRecord) => { + return distributionRecord.accountCode === accountCode + }) + } + + if (!found) { + return undefined + } + } + + return cashReceipt +} + +function filterInvoice(invoice: GPInvoice): GPInvoice | undefined { + const itemNumbers = configFunctions.getProperty( + 'settings.dynamicsGP.itemNumbers' + ) + + for (const itemNumber of itemNumbers) { + const found = invoice.lineItems.some((itemRecord) => { + return itemRecord.itemNumber === itemNumber + }) + + if (!found) { + return undefined + } + } + + return invoice +} + async function _getDynamicsGPDocument( documentNumber: string, lookupType: DynamicsGPLookup @@ -25,7 +72,11 @@ async function _getDynamicsGPDocument( switch (lookupType) { case 'invoice': { - const invoice = await gp.getInvoiceByInvoiceNumber(documentNumber) + let invoice = await gp.getInvoiceByInvoiceNumber(documentNumber) + + if (invoice !== undefined) { + invoice = filterInvoice(invoice) + } if (invoice !== undefined) { document = { @@ -45,9 +96,12 @@ async function _getDynamicsGPDocument( break } case 'diamond/cashReceipt': { - const receipt = await diamond.getCashReceiptByDocumentNumber( - documentNumber - ) + let receipt: DiamondCashReceipt | undefined = + await diamond.getCashReceiptByDocumentNumber(documentNumber) + + if (receipt !== undefined) { + receipt = filterCashReceipt(receipt) + } if (receipt !== undefined) { document = { diff --git a/package-lock.json b/package-lock.json index 3412e6d1..76571cdb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@cityssm/bulma-js": "^0.4.0", "@cityssm/bulma-webapp-js": "^1.5.0", "@cityssm/date-diff": "^2.2.3", - "@cityssm/dynamics-gp": "^0.4.0", + "@cityssm/dynamics-gp": "^0.4.1", "@cityssm/expressjs-server-js": "^2.3.3", "@cityssm/ntfy-publish": "^0.2.2", "@cityssm/pdf-puppeteer": "^2.0.0-beta.1", @@ -523,11 +523,11 @@ } }, "node_modules/@cityssm/dynamics-gp": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@cityssm/dynamics-gp/-/dynamics-gp-0.4.0.tgz", - "integrity": "sha512-bbgZxUYAOfN3xFigX501UvEaCfVZ0ReyagcN+ZcKTWtOGrMnUOKK850l+xRnYymfaaUQ2amp4Uj9O6gP+Bj3gQ==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@cityssm/dynamics-gp/-/dynamics-gp-0.4.1.tgz", + "integrity": "sha512-gj3zC7SMEZCLX1OihpxMH4zc6VYP+vkwkX8g8Yf5csJwVFq3l8PkKrCCC2WSaya/Cd9JdMacMl2m9XnT4TYPiA==", "dependencies": { - "@cityssm/mssql-multi-pool": "^2.2.0", + "@cityssm/mssql-multi-pool": "^2.2.1", "debug": "^4.3.4", "mssql": "^9.1.1", "node-cache": "^5.1.2" @@ -12929,11 +12929,11 @@ "integrity": "sha512-GmRXmBQxBPnt/oJ4V7iM1UszRzv/NjvfZDqVB0NdVZ8Mw+udT7G8+VZuo8pLBmiSMcijNYvJ/hV0AW2Vi5nDJA==" }, "@cityssm/dynamics-gp": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@cityssm/dynamics-gp/-/dynamics-gp-0.4.0.tgz", - "integrity": "sha512-bbgZxUYAOfN3xFigX501UvEaCfVZ0ReyagcN+ZcKTWtOGrMnUOKK850l+xRnYymfaaUQ2amp4Uj9O6gP+Bj3gQ==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@cityssm/dynamics-gp/-/dynamics-gp-0.4.1.tgz", + "integrity": "sha512-gj3zC7SMEZCLX1OihpxMH4zc6VYP+vkwkX8g8Yf5csJwVFq3l8PkKrCCC2WSaya/Cd9JdMacMl2m9XnT4TYPiA==", "requires": { - "@cityssm/mssql-multi-pool": "^2.2.0", + "@cityssm/mssql-multi-pool": "^2.2.1", "debug": "^4.3.4", "mssql": "^9.1.1", "node-cache": "^5.1.2" diff --git a/package.json b/package.json index a852e36c..8c902b83 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "@cityssm/bulma-js": "^0.4.0", "@cityssm/bulma-webapp-js": "^1.5.0", "@cityssm/date-diff": "^2.2.3", - "@cityssm/dynamics-gp": "^0.4.0", + "@cityssm/dynamics-gp": "^0.4.1", "@cityssm/expressjs-server-js": "^2.3.3", "@cityssm/ntfy-publish": "^0.2.2", "@cityssm/pdf-puppeteer": "^2.0.0-beta.1", diff --git a/types/configTypes.d.ts b/types/configTypes.d.ts index 5534743c..7dbd8329 100644 --- a/types/configTypes.d.ts +++ b/types/configTypes.d.ts @@ -65,6 +65,8 @@ export interface Config { integrationIsEnabled: boolean; mssqlConfig?: MSSQLConfig; lookupOrder?: DynamicsGPLookup[]; + accountCodes?: string[]; + itemNumbers?: string[]; }; }; } diff --git a/types/configTypes.ts b/types/configTypes.ts index d637fd3c..65b8ab17 100644 --- a/types/configTypes.ts +++ b/types/configTypes.ts @@ -66,6 +66,8 @@ export interface Config { integrationIsEnabled: boolean mssqlConfig?: MSSQLConfig lookupOrder?: DynamicsGPLookup[] + accountCodes?: string[] + itemNumbers?: string[] } } }