diff --git a/packages/server/src/models/BankRule.ts b/packages/server/src/models/BankRule.ts index a65b3bb27..ce47853f7 100644 --- a/packages/server/src/models/BankRule.ts +++ b/packages/server/src/models/BankRule.ts @@ -39,6 +39,7 @@ export class BankRule extends TenantModel { */ static get relationMappings() { const { BankRuleCondition } = require('models/BankRuleCondition'); + const Account = require('models/Account'); return { /** @@ -52,6 +53,15 @@ export class BankRule extends TenantModel { to: 'bank_rule_conditions.ruleId', }, }, + + assignAccount: { + relation: Model.BelongsToOneRelation, + modelClass: Account.default, + join: { + from: 'bank_rules.assignAccountId', + to: 'accounts.id' + } + } }; } } diff --git a/packages/server/src/services/Banking/Rules/GetBankRules.ts b/packages/server/src/services/Banking/Rules/GetBankRules.ts index 6eeb2c215..fdf34fb2c 100644 --- a/packages/server/src/services/Banking/Rules/GetBankRules.ts +++ b/packages/server/src/services/Banking/Rules/GetBankRules.ts @@ -13,14 +13,16 @@ export class GetBankRulesService { /** * Retrieves the bank rules of the given account. - * @param {number} tenantId - * @param {number} accountId + * @param {number} tenantId + * @param {number} accountId * @returns {Promise} */ public async getBankRules(tenantId: number): Promise { const { BankRule } = this.tenancy.models(tenantId); - const bankRule = await BankRule.query(); + const bankRule = await BankRule.query() + .withGraphFetched('conditions') + .withGraphFetched('assignAccount'); return this.transformer.transform( tenantId, diff --git a/packages/server/src/services/Banking/Rules/GetBankRulesTransformer.ts b/packages/server/src/services/Banking/Rules/GetBankRulesTransformer.ts index 634798826..431b4f42d 100644 --- a/packages/server/src/services/Banking/Rules/GetBankRulesTransformer.ts +++ b/packages/server/src/services/Banking/Rules/GetBankRulesTransformer.ts @@ -1,4 +1,6 @@ +import { upperFirst, camelCase } from 'lodash'; import { Transformer } from '@/lib/Transformer/Transformer'; +import { getTransactionTypeLabel } from '@/utils/transactions-types'; export class GetBankRulesTransformer extends Transformer { /** @@ -6,6 +8,44 @@ export class GetBankRulesTransformer extends Transformer { * @returns {Array} */ public includeAttributes = (): string[] => { - return []; + return [ + 'assignAccountName', + 'assignCategoryFormatted', + 'conditionsFormatted', + ]; }; + + /** + * Get the assign account name. + * @param bankRule + * @returns {string} + */ + protected assignAccountName(bankRule: any) { + return bankRule.assignAccount.name; + } + + /** + * Assigned category formatted. + * @returns {string} + */ + protected assignCategoryFormatted(bankRule: any) { + const assignCategory = upperFirst(camelCase(bankRule.assignCategory)); + return getTransactionTypeLabel(assignCategory); + } + + /** + * Get the bank rule formatted conditions. + * @param bankRule + * @returns {string} + */ + protected conditionsFormatted(bankRule: any) { + return bankRule.conditions + .map((condition) => { + const field = + condition.field.charAt(0).toUpperCase() + condition.field.slice(1); + + return `${field} ${condition.comparator} ${condition.value}`; + }) + .join(bankRule.conditionsType === 'and' ? ' and ' : ' or '); + } } diff --git a/packages/webapp/src/containers/Banking/Rules/RulesList/hooks.tsx b/packages/webapp/src/containers/Banking/Rules/RulesList/hooks.tsx index 1e3f74d97..17dfc29b1 100644 --- a/packages/webapp/src/containers/Banking/Rules/RulesList/hooks.tsx +++ b/packages/webapp/src/containers/Banking/Rules/RulesList/hooks.tsx @@ -2,17 +2,36 @@ import { useMemo } from 'react'; import { Intent, Tag } from '@blueprintjs/core'; +const applyToTypeAccessor = (rule) => { + return rule.apply_if_transaction_type === 'deposit' ? ( + + Deposits + + ) : ( + + Withdrawals + + ); +}; + +const conditionsAccessor = (rule) => ( + + {rule.conditions_formatted} + +); + +const applyToAccessor = (rule) => ( + + {rule.assign_account_name} + +); + export const useBankRulesTableColumns = () => { return useMemo( () => [ { Header: 'Apply to', - accessor: (rule) => - rule.apply_if_transaction_type === 'deposit' ? ( - Deposits - ) : ( - Withdrawals - ), + accessor: applyToTypeAccessor, }, { Header: 'Rule Name', @@ -20,15 +39,15 @@ export const useBankRulesTableColumns = () => { }, { Header: 'Categorize As', - accessor: () => 'Expense', + accessor: 'assign_category_formatted', }, { Header: 'Apply To', - accessor: () => All Accounts, + accessor: applyToAccessor, }, { Header: 'Conditions', - accessor: () => '', + accessor: conditionsAccessor, }, ], [],