From bed281a6375b551ecb734b58329b9b64524dbcce Mon Sep 17 00:00:00 2001 From: Ahmed Bouhuolia Date: Thu, 1 Aug 2024 13:44:49 +0200 Subject: [PATCH] feat: wip multipe transactions categorization --- .../MatchingTransaction.tsx | 30 ++++++++++++++----- .../MatchingTransactionBoot.tsx | 6 ++-- .../src/containers/CashFlow/withBanking.ts | 3 ++ packages/webapp/src/hooks/query/bank-rules.ts | 12 +++++--- .../src/store/banking/banking.reducer.ts | 3 ++ 5 files changed, 40 insertions(+), 14 deletions(-) diff --git a/packages/webapp/src/containers/CashFlow/CategorizeTransactionAside/MatchingTransaction.tsx b/packages/webapp/src/containers/CashFlow/CategorizeTransactionAside/MatchingTransaction.tsx index a96368e70..92f5721a8 100644 --- a/packages/webapp/src/containers/CashFlow/CategorizeTransactionAside/MatchingTransaction.tsx +++ b/packages/webapp/src/containers/CashFlow/CategorizeTransactionAside/MatchingTransaction.tsx @@ -1,7 +1,8 @@ // @ts-nocheck import { isEmpty } from 'lodash'; import * as R from 'ramda'; -import { useEffect, useState } from 'react'; +import { useEffect, useState, useMemo } from 'react'; +import { uniq } from 'lodash'; import { AnchorButton, Button, Intent, Tag, Text } from '@blueprintjs/core'; import { FastField, FastFieldProps, Formik, useFormikContext } from 'formik'; import { AppToaster, Box, FormatNumber, Group, Stack } from '@/components'; @@ -25,9 +26,9 @@ import { WithBankingActionsProps, withBankingActions, } from '../withBankingActions'; -import styles from './CategorizeTransactionAside.module.scss'; -import { MatchingReconcileTransactionForm } from './MatchingReconcileTransactionAside/MatchingReconcileTransactionForm'; import { withBanking } from '../withBanking'; +import { MatchingReconcileTransactionForm } from './MatchingReconcileTransactionAside/MatchingReconcileTransactionForm'; +import styles from './CategorizeTransactionAside.module.scss'; const initialValues = { matched: {}, @@ -40,10 +41,22 @@ const initialValues = { function MatchingBankTransactionRoot({ // #withBankingActions closeMatchingTransactionAside, + + // #withBanking + transactionsToCategorizeIdsSelected, }) { const { uncategorizedTransactionId } = useCategorizeTransactionTabsBoot(); const { mutateAsync: matchTransaction } = useMatchUncategorizedTransaction(); + const selectedTransactionsIds = useMemo( + () => + uniq([ + ...transactionsToCategorizeIdsSelected, + uncategorizedTransactionId, + ]), + [uncategorizedTransactionId, transactionsToCategorizeIdsSelected], + ); + // Handles the form submitting. const handleSubmit = ( values: MatchingTransactionFormValues, @@ -91,7 +104,7 @@ function MatchingBankTransactionRoot({ return ( @@ -100,9 +113,12 @@ function MatchingBankTransactionRoot({ ); } -export const MatchingBankTransaction = R.compose(withBankingActions)( - MatchingBankTransactionRoot, -); +export const MatchingBankTransaction = R.compose( + withBankingActions, + withBanking(({ transactionsToCategorizeIdsSelected }) => ({ + transactionsToCategorizeIdsSelected, + })), +)(MatchingBankTransactionRoot); /** * Matching bank transaction form content. diff --git a/packages/webapp/src/containers/CashFlow/CategorizeTransactionAside/MatchingTransactionBoot.tsx b/packages/webapp/src/containers/CashFlow/CategorizeTransactionAside/MatchingTransactionBoot.tsx index 51ad9beb1..3c45a7d4c 100644 --- a/packages/webapp/src/containers/CashFlow/CategorizeTransactionAside/MatchingTransactionBoot.tsx +++ b/packages/webapp/src/containers/CashFlow/CategorizeTransactionAside/MatchingTransactionBoot.tsx @@ -18,12 +18,12 @@ const RuleFormBootContext = createContext( ); interface RuleFormBootProps { - uncategorizedTransactionId: number; + uncategorizedTransactionsIds: Array; children: React.ReactNode; } function MatchingTransactionBoot({ - uncategorizedTransactionId, + uncategorizedTransactionsIds, ...props }: RuleFormBootProps) { const { @@ -31,7 +31,7 @@ function MatchingTransactionBoot({ isLoading: isMatchingTransactionsLoading, isFetching: isMatchingTransactionsFetching, isSuccess: isMatchingTransactionsSuccess, - } = useGetBankTransactionsMatches(uncategorizedTransactionId); + } = useGetBankTransactionsMatches(uncategorizedTransactionsIds); const possibleMatches = defaultTo(matchingTransactions?.possibleMatches, []); const perfectMatchesCount = matchingTransactions?.perfectMatches?.length || 0; diff --git a/packages/webapp/src/containers/CashFlow/withBanking.ts b/packages/webapp/src/containers/CashFlow/withBanking.ts index 08ddbf87f..579b54e6f 100644 --- a/packages/webapp/src/containers/CashFlow/withBanking.ts +++ b/packages/webapp/src/containers/CashFlow/withBanking.ts @@ -19,6 +19,9 @@ export const withBanking = (mapState) => { excludedTransactionsIdsSelected: state.plaid.excludedTransactionsSelected, isMultipleCategorization: state.plaid.isMultipleCategorization, + + transactionsToCategorizeIdsSelected: + state.plaid.transactionsToCategorizeSelected, }; return mapState ? mapState(mapped, state, props) : mapped; }; diff --git a/packages/webapp/src/hooks/query/bank-rules.ts b/packages/webapp/src/hooks/query/bank-rules.ts index b25fd86f6..e6098a37e 100644 --- a/packages/webapp/src/hooks/query/bank-rules.ts +++ b/packages/webapp/src/hooks/query/bank-rules.ts @@ -168,7 +168,9 @@ export function useBankRule( ); } -type GetBankTransactionsMatchesValue = number; +interface GetBankTransactionsMatchesValue { + uncategorizeTransactionsIds: Array; +} interface GetBankTransactionsMatchesResponse { perfectMatches: Array; possibleMatches: Array; @@ -180,16 +182,18 @@ interface GetBankTransactionsMatchesResponse { * @returns {UseQueryResult} */ export function useGetBankTransactionsMatches( - uncategorizedTransactionId: number, + uncategorizeTransactionsIds: Array, options?: UseQueryOptions, ): UseQueryResult { const apiRequest = useApiRequest(); return useQuery( - [QUERY_KEY.BANK_TRANSACTION_MATCHES, uncategorizedTransactionId], + [QUERY_KEY.BANK_TRANSACTION_MATCHES, uncategorizeTransactionsIds], () => apiRequest - .get(`/cashflow/transactions/${uncategorizedTransactionId}/matches`) + .get(`/cashflow/transactions/matches`, { + params: { uncategorizeTransactionsIds }, + }) .then((res) => transformToCamelCase(res.data)), options, ); diff --git a/packages/webapp/src/store/banking/banking.reducer.ts b/packages/webapp/src/store/banking/banking.reducer.ts index 81a2bc0dd..0d57b8acc 100644 --- a/packages/webapp/src/store/banking/banking.reducer.ts +++ b/packages/webapp/src/store/banking/banking.reducer.ts @@ -195,3 +195,6 @@ export const getOpenMatchingTransactionAside = (state: any) => export const isMultipleCategorization = (state: any) => state.plaid.enableMultipleCategorization; + +export const getTransactionsToCategorizeIdsSelected = (state: any) => + state.plaid.transactionsToCategorizeSelected;