feat(server): change the Plaid synced bank name.

This commit is contained in:
Ahmed Bouhuolia
2024-03-05 16:36:35 +02:00
parent b602f28696
commit db839137d0
4 changed files with 75 additions and 23 deletions

View File

@@ -1,6 +1,9 @@
exports.up = function (knex) { exports.up = function (knex) {
return knex.schema.table('accounts', (table) => { return knex.schema.table('accounts', (table) => {
table.integer('uncategorized_transactions').defaultTo(0); table.integer('uncategorized_transactions').defaultTo(0);
table.boolean('is_system_account').defaultTo(true);
table.boolean('is_feeds_active').defaultTo(false);
table.datetime('last_feeds_updated_at').nullable();
}); });
}; };

View File

@@ -40,11 +40,14 @@ export class PlaidSyncDb {
*/ */
public async syncBankAccounts( public async syncBankAccounts(
tenantId: number, tenantId: number,
plaidAccounts: PlaidAccount[] plaidAccounts: PlaidAccount[],
institution: any
): Promise<void> { ): Promise<void> {
const accountCreateDTOs = R.map(transformPlaidAccountToCreateAccount)( const transformToPlaidAccounts =
plaidAccounts transformPlaidAccountToCreateAccount(institution);
);
const accountCreateDTOs = R.map(transformToPlaidAccounts)(plaidAccounts);
await bluebird.map( await bluebird.map(
accountCreateDTOs, accountCreateDTOs,
(createAccountDTO: any) => (createAccountDTO: any) =>
@@ -162,4 +165,38 @@ export class PlaidSyncDb {
await PlaidItem.query().findOne({ plaidItemId }).patch({ lastCursor }); await PlaidItem.query().findOne({ plaidItemId }).patch({ lastCursor });
} }
/**
* Updates the last feeds updated at of the given Plaid accounts ids.
* @param {number} tenantId
* @param {string[]} plaidAccountIds
*/
public async updateLastFeedsUpdatedAt(
tenantId: number,
plaidAccountIds: string[]
) {
const { Account } = this.tenancy.models(tenantId);
await Account.query().whereIn('plaid_account_id', plaidAccountIds).patch({
lastFeedsUpdatedAt: new Date(),
});
}
/**
* Updates the accounts feed active status of the given Plaid accounts ids.
* @param {number} tenantId
* @param {number[]} plaidAccountIds
* @param {boolean} isFeedsActive
*/
public async updateAccountsFeedsActive(
tenantId: number,
plaidAccountIds: string[],
isFeedsActive: boolean = true
) {
const { Account } = this.tenancy.models(tenantId);
await Account.query().whereIn('plaid_account_id', plaidAccountIds).patch({
isFeedsActive,
});
}
} }

View File

@@ -25,11 +25,19 @@ export class PlaidUpdateTransactions {
const request = { access_token: accessToken }; const request = { access_token: accessToken };
const plaidInstance = new PlaidClientWrapper(); const plaidInstance = new PlaidClientWrapper();
const { const {
data: { accounts }, data: { accounts, item },
} = await plaidInstance.accountsGet(request); } = await plaidInstance.accountsGet(request);
const plaidAccountsIds = accounts.map((a) => a.account_id);
const {
data: { institution },
} = await plaidInstance.institutionsGetById({
institution_id: item.institution_id,
country_codes: ['US', 'UK'],
});
// Update the DB. // Update the DB.
await this.plaidSync.syncBankAccounts(tenantId, accounts); await this.plaidSync.syncBankAccounts(tenantId, accounts, institution);
await this.plaidSync.syncAccountsTransactions( await this.plaidSync.syncAccountsTransactions(
tenantId, tenantId,
added.concat(modified) added.concat(modified)
@@ -37,6 +45,12 @@ export class PlaidUpdateTransactions {
await this.plaidSync.syncRemoveTransactions(tenantId, removed); await this.plaidSync.syncRemoveTransactions(tenantId, removed);
await this.plaidSync.syncTransactionsCursor(tenantId, plaidItemId, cursor); await this.plaidSync.syncTransactionsCursor(tenantId, plaidItemId, cursor);
// Update the last feeds updated at of the updated accounts.
await this.plaidSync.updateLastFeedsUpdatedAt(tenantId, plaidAccountsIds);
// Turn on the accounts feeds flag.
await this.plaidSync.updateAccountsFeedsActive(tenantId, plaidAccountsIds);
return { return {
addedCount: added.length, addedCount: added.length,
modifiedCount: modified.length, modifiedCount: modified.length,

View File

@@ -2,8 +2,6 @@ import * as R from 'ramda';
import { import {
CreateUncategorizedTransactionDTO, CreateUncategorizedTransactionDTO,
IAccountCreateDTO, IAccountCreateDTO,
ICashflowNewCommandDTO,
IUncategorizedCashflowTransaction,
PlaidAccount, PlaidAccount,
PlaidTransaction, PlaidTransaction,
} from '@/interfaces'; } from '@/interfaces';
@@ -13,21 +11,21 @@ import {
* @param {PlaidAccount} plaidAccount * @param {PlaidAccount} plaidAccount
* @returns {IAccountCreateDTO} * @returns {IAccountCreateDTO}
*/ */
export const transformPlaidAccountToCreateAccount = ( export const transformPlaidAccountToCreateAccount = R.curry(
plaidAccount: PlaidAccount (institution: any, plaidAccount: PlaidAccount): IAccountCreateDTO => {
): IAccountCreateDTO => { return {
return { name: `${institution.name} - ${plaidAccount.name}`,
name: plaidAccount.name, code: '',
code: '', description: plaidAccount.official_name,
description: plaidAccount.official_name, currencyCode: plaidAccount.balances.iso_currency_code,
currencyCode: plaidAccount.balances.iso_currency_code, accountType: 'cash',
accountType: 'cash', active: true,
active: true, plaidAccountId: plaidAccount.account_id,
plaidAccountId: plaidAccount.account_id, bankBalance: plaidAccount.balances.current,
bankBalance: plaidAccount.balances.current, accountMask: plaidAccount.mask,
accountMask: plaidAccount.mask, };
}; }
}; );
/** /**
* Transformes the plaid transaction to cashflow create DTO. * Transformes the plaid transaction to cashflow create DTO.