diff --git a/packages/server/src/database/migrations/20240201235818_add_plaid_account_id_to_accounts_table.js b/packages/server/src/database/migrations/20240201235818_add_plaid_account_id_to_accounts_table.js index 2c58038b3..901f08987 100644 --- a/packages/server/src/database/migrations/20240201235818_add_plaid_account_id_to_accounts_table.js +++ b/packages/server/src/database/migrations/20240201235818_add_plaid_account_id_to_accounts_table.js @@ -1,6 +1,8 @@ exports.up = function (knex) { return knex.schema.table('accounts', (table) => { table.string('plaid_account_id'); + table.string('account_mask').nullable(); + table.decimal('bank_balance', 15, 5); }); }; diff --git a/packages/server/src/database/migrations/20240204180554_add_plaid_transaction_id_to_cashflow_transaction.js b/packages/server/src/database/migrations/20240204180554_add_plaid_transaction_id_to_cashflow_transaction.js new file mode 100644 index 000000000..3c88cd589 --- /dev/null +++ b/packages/server/src/database/migrations/20240204180554_add_plaid_transaction_id_to_cashflow_transaction.js @@ -0,0 +1,7 @@ +exports.up = function (knex) { + return knex.schema.table('cashflow_transactions', (table) => { + table.string('plaid_transaction_id'); + }); +}; + +exports.down = function (knex) {}; diff --git a/packages/server/src/interfaces/Account.ts b/packages/server/src/interfaces/Account.ts index 5e80a0d92..7c045def3 100644 --- a/packages/server/src/interfaces/Account.ts +++ b/packages/server/src/interfaces/Account.ts @@ -8,6 +8,8 @@ export interface IAccountDTO { accountType: string; parentAccountId?: number; active: boolean; + bankBalance?: number; + accountMask?: string; } export interface IAccountCreateDTO extends IAccountDTO { @@ -34,6 +36,7 @@ export interface IAccount { type?: any[]; accountNormal: string; accountParentType: string; + bankBalance: string; } export enum AccountNormal { @@ -155,10 +158,9 @@ export enum AccountAction { TransactionsLocking = 'TransactionsLocking', } - export enum TaxRateAction { CREATE = 'Create', EDIT = 'Edit', DELETE = 'Delete', VIEW = 'View', -} \ No newline at end of file +} diff --git a/packages/server/src/interfaces/CashflowService.ts b/packages/server/src/interfaces/CashflowService.ts index 9df08a9ad..e279aec05 100644 --- a/packages/server/src/interfaces/CashflowService.ts +++ b/packages/server/src/interfaces/CashflowService.ts @@ -45,6 +45,7 @@ export interface ICashflowCommandDTO { publish: boolean; branchId?: number; + plaidTransactionId?: string; } export interface ICashflowNewCommandDTO extends ICashflowCommandDTO { diff --git a/packages/server/src/services/Accounts/AccountTransform.ts b/packages/server/src/services/Accounts/AccountTransform.ts index 9297994be..ee22a2cc5 100644 --- a/packages/server/src/services/Accounts/AccountTransform.ts +++ b/packages/server/src/services/Accounts/AccountTransform.ts @@ -13,7 +13,7 @@ export class AccountTransformer extends Transformer { * @returns {Array} */ public includeAttributes = (): string[] => { - return ['formattedAmount', 'flattenName']; + return ['formattedAmount', 'flattenName', 'bankBalanceFormatted']; }; /** @@ -41,6 +41,17 @@ export class AccountTransformer extends Transformer { return formatNumber(account.amount, { currencyCode: account.currencyCode }); }; + /** + * Retrieves the formatted bank balance. + * @param {IAccount} account + * @returns {string} + */ + protected bankBalanceFormatted = (account: IAccount): string => { + return formatNumber(account.bankBalance, { + currencyCode: account.currencyCode, + }); + }; + /** * Transformes the accounts collection to flat or nested array. * @param {IAccount[]} diff --git a/packages/server/src/services/Banking/Plaid/PlaidApplication.ts b/packages/server/src/services/Banking/Plaid/PlaidApplication.ts index 1789eafdd..16096207e 100644 --- a/packages/server/src/services/Banking/Plaid/PlaidApplication.ts +++ b/packages/server/src/services/Banking/Plaid/PlaidApplication.ts @@ -27,7 +27,7 @@ export class PlaidApplication { * @param {PlaidItemDTO} itemDTO * @returns */ - public exchangeToken(tenantId: number, itemDTO: PlaidItemDTO) { + public exchangeToken(tenantId: number, itemDTO: PlaidItemDTO): Promise { return this.plaidItemService.item(tenantId, itemDTO); } } diff --git a/packages/server/src/services/Banking/Plaid/utils.ts b/packages/server/src/services/Banking/Plaid/utils.ts index c8b97d7b7..1fe18bee7 100644 --- a/packages/server/src/services/Banking/Plaid/utils.ts +++ b/packages/server/src/services/Banking/Plaid/utils.ts @@ -1,6 +1,10 @@ import * as R from 'ramda'; -import { IAccountCreateDTO, ICashflowNewCommandDTO } from '@/interfaces'; -import { PlaidAccount, PlaidTransaction } from './_types'; +import { + IAccountCreateDTO, + ICashflowNewCommandDTO, + PlaidAccount, + PlaidTransaction, +} from '@/interfaces'; /** * Transformes the Plaid account to create cashflow account DTO. @@ -18,6 +22,8 @@ export const transformPlaidAccountToCreateAccount = ( accountType: 'cash', active: true, plaidAccountId: plaidAccount.account_id, + bankBalance: plaidAccount.balances.current, + accountMask: plaidAccount.mask, }; }; @@ -48,6 +54,7 @@ export const transformPlaidTrxsToCashflowCreate = R.curry( // transactionNumber: string; // referenceNo: string; + plaidTransactionId: plaidTranasction.transaction_id, publish: true, }; } diff --git a/packages/server/src/services/Cashflow/NewCashflowTransactionService.ts b/packages/server/src/services/Cashflow/NewCashflowTransactionService.ts index 45ef60308..e8c53f5fc 100644 --- a/packages/server/src/services/Cashflow/NewCashflowTransactionService.ts +++ b/packages/server/src/services/Cashflow/NewCashflowTransactionService.ts @@ -86,7 +86,7 @@ export default class NewCashflowTransactionService { 'cashflowAccountId', 'creditAccountId', 'branchId', - 'plaidAccountId' + 'plaidTransactionId', ]); // Retreive the next invoice number. const autoNextNumber = @@ -125,7 +125,7 @@ export default class NewCashflowTransactionService { public newCashflowTransaction = async ( tenantId: number, newTransactionDTO: ICashflowNewCommandDTO, - userId?: number + userId?: number ): Promise<{ cashflowTransaction: ICashflowTransaction }> => { const { CashflowTransaction, Account } = this.tenancy.models(tenantId);