From 6e6103ca99b2bf7afbc3d3fe6573b7ee6b6d5a01 Mon Sep 17 00:00:00 2001 From: "a.bouhuolia" Date: Sun, 21 Feb 2021 18:50:47 +0200 Subject: [PATCH] fix: AR aging summary report. --- .../ARAgingSummary/ARAgingSummary.js | 104 ++++-------------- .../ARAgingSummaryActionsBar.js | 15 +-- .../ARAgingSummary/ARAgingSummaryHeader.js | 21 ++-- .../ARAgingSummaryHeaderGeneral.js | 20 ++-- .../ARAgingSummary/ARAgingSummaryProvider.js | 47 ++++++++ .../ARAgingSummary/ARAgingSummaryTable.js | 83 ++------------ .../ARAgingSummary/components.js | 58 ++++++++++ .../BalanceSheet/BalanceSheet.js | 3 +- .../BalanceSheet/BalanceSheetProvider.js | 15 ++- .../GeneralLedger/GeneralLedger.js | 30 +---- .../GeneralLedgerHeaderGeneralPane.js | 19 +--- .../GeneralLedger/GeneralLedgerProvider.js | 8 +- .../TrialBalanceSheet/TrialBalanceSheet.js | 28 +---- .../containers/FinancialStatements/common.js | 4 +- .../FinancialStatements/reducers.js | 35 ++++++ client/src/hooks/query/financialReports.js | 26 ++++- client/src/routes/dashboard.js | 8 ++ 17 files changed, 252 insertions(+), 272 deletions(-) create mode 100644 client/src/containers/FinancialStatements/ARAgingSummary/components.js diff --git a/client/src/containers/FinancialStatements/ARAgingSummary/ARAgingSummary.js b/client/src/containers/FinancialStatements/ARAgingSummary/ARAgingSummary.js index 7fae6f73b..c5831ff86 100644 --- a/client/src/containers/FinancialStatements/ARAgingSummary/ARAgingSummary.js +++ b/client/src/containers/FinancialStatements/ARAgingSummary/ARAgingSummary.js @@ -1,25 +1,19 @@ -import React, { useEffect, useState, useCallback } from 'react'; -import { useIntl } from 'react-intl'; -import { queryCache, useQuery } from 'react-query'; +import React, { useState, useCallback } from 'react'; import moment from 'moment'; +import 'style/pages/FinancialStatements/ARAgingSummary.scss'; + import { FinancialStatement } from 'components'; -import DashboardInsider from 'components/Dashboard/DashboardInsider'; -import ARAgingSummaryActionsBar from './ARAgingSummaryActionsBar'; -import DashboardPageContent from 'components/Dashboard/DashboardPageContent'; import ARAgingSummaryHeader from './ARAgingSummaryHeader'; -import ReceivableAgingSummaryTable from './ARAgingSummaryTable'; +import ARAgingSummaryActionsBar from './ARAgingSummaryActionsBar'; +import ARAgingSummaryTable from './ARAgingSummaryTable'; +import DashboardPageContent from 'components/Dashboard/DashboardPageContent'; +import { ARAgingSummaryProvider } from './ARAgingSummaryProvider'; import withSettings from 'containers/Settings/withSettings'; -import withDashboardActions from 'containers/Dashboard/withDashboardActions'; -import withARAgingSummaryActions from './withARAgingSummaryActions'; -import withARAgingSummary from './withARAgingSummary'; import { compose } from 'utils'; -import { transfromFilterFormToQuery } from './common'; - -import 'style/pages/FinancialStatements/ARAgingSummary.scss'; /** * AR aging summary report. @@ -27,115 +21,55 @@ import 'style/pages/FinancialStatements/ARAgingSummary.scss'; function ReceivableAgingSummarySheet({ // #withSettings organizationName, - - // #withDashboardActions - changePageTitle, - setDashboardBackLink, - setSidebarShrink, - - // #withARAgingSummaryActions - requestReceivableAgingSummary, - refreshARAgingSummary, - toggleFilterARAgingSummary, - - // #withARAgingSummary - ARAgingSummaryRefresh, }) { - const { formatMessage } = useIntl(); - const [query, setQuery] = useState({ + const [filter, setFilter] = useState({ asDate: moment().endOf('day').format('YYYY-MM-DD'), - agingBeforeDays: 30, + agingDaysBefore: 30, agingPeriods: 3, }); - useEffect(() => { - changePageTitle(formatMessage({ id: 'receivable_aging_summary' })); - }, [changePageTitle, formatMessage]); - - useEffect(() => { - if (ARAgingSummaryRefresh) { - queryCache.invalidateQueries('receivable-aging-summary'); - refreshARAgingSummary(false); - } - }, [ARAgingSummaryRefresh, refreshARAgingSummary]); - - useEffect(() => { - setSidebarShrink() - // Show the back link on dashboard topbar. - setDashboardBackLink(true); - - return () => { - // Hide the back link on dashboard topbar. - setDashboardBackLink(false); - }; - }, [setDashboardBackLink,setSidebarShrink]); - - // Handle fetching receivable aging summary report. - const fetchARAgingSummarySheet = useQuery( - ['receivable-aging-summary', query], - (key, q) => - requestReceivableAgingSummary({ - ...transfromFilterFormToQuery(q), - }), - { manual: true }, - ); - - // Handle fetch the data of receivable aging summary sheet. - const handleFetchData = useCallback((...args) => {}, []); - + // Handle filter submit. const handleFilterSubmit = useCallback( (filter) => { const _filter = { ...filter, asDate: moment(filter.asDate).format('YYYY-MM-DD'), }; - setQuery(_filter); - refreshARAgingSummary(true); - toggleFilterARAgingSummary(false); + setFilter(_filter); }, - [refreshARAgingSummary, toggleFilterARAgingSummary], + [], ); + // Handle number format submit. const handleNumberFormatSubmit = (numberFormat) => { - setQuery({ - ...query, - numberFormat - }); - refreshARAgingSummary(true); + setFilter({ ...filter, numberFormat }); }; return ( - +
-
-
+ ); } export default compose( - withDashboardActions, - withARAgingSummaryActions, withSettings(({ organizationSettings }) => ({ organizationName: organizationSettings.name, })), - withARAgingSummary(({ ARAgingSummaryRefresh }) => ({ - ARAgingSummaryRefresh: ARAgingSummaryRefresh, - })), )(ReceivableAgingSummarySheet); diff --git a/client/src/containers/FinancialStatements/ARAgingSummary/ARAgingSummaryActionsBar.js b/client/src/containers/FinancialStatements/ARAgingSummary/ARAgingSummaryActionsBar.js index 9059987cc..e5a363887 100644 --- a/client/src/containers/FinancialStatements/ARAgingSummary/ARAgingSummaryActionsBar.js +++ b/client/src/containers/FinancialStatements/ARAgingSummary/ARAgingSummaryActionsBar.js @@ -15,34 +15,34 @@ import DashboardActionsBar from 'components/Dashboard/DashboardActionsBar'; import Icon from 'components/Icon'; import NumberFormatDropdown from 'components/NumberFormatDropdown'; -import withARAgingSummary from './withARAgingSummary'; +import { useARAgingSummaryContext } from './ARAgingSummaryProvider'; import withARAgingSummaryActions from './withARAgingSummaryActions'; import { compose } from 'utils'; import { safeInvoke } from '@blueprintjs/core/lib/esm/common/utils'; /** - * AR Aging summary sheet - Actions bar. + * A/R Aging summary sheet - Actions bar. */ function ARAgingSummaryActionsBar({ // #withReceivableAging receivableAgingFilter, - ARAgingSummaryLoading, // #withReceivableAgingActions toggleFilterARAgingSummary, - refreshARAgingSummary, // #ownProps numberFormat, onNumberFormatSubmit, }) { + const { isARAgingFetching, refetch } = useARAgingSummaryContext(); + const handleFilterToggleClick = () => { toggleFilterARAgingSummary(); }; // Handles re-calculate report button. const handleRecalcReport = () => { - refreshARAgingSummary(true); + refetch(); }; // Handle number format submit. const handleNumberFormatSubmit = (numberFormat) => { @@ -80,7 +80,7 @@ function ARAgingSummaryActionsBar({ } minimal={true} @@ -118,7 +118,4 @@ function ARAgingSummaryActionsBar({ export default compose( withARAgingSummaryActions, - withARAgingSummary(({ receivableAgingSummaryLoading }) => ({ - ARAgingSummaryLoading: receivableAgingSummaryLoading, - })), )(ARAgingSummaryActionsBar); diff --git a/client/src/containers/FinancialStatements/ARAgingSummary/ARAgingSummaryHeader.js b/client/src/containers/FinancialStatements/ARAgingSummary/ARAgingSummaryHeader.js index ad7649bad..7eaa4bceb 100644 --- a/client/src/containers/FinancialStatements/ARAgingSummary/ARAgingSummaryHeader.js +++ b/client/src/containers/FinancialStatements/ARAgingSummary/ARAgingSummaryHeader.js @@ -17,24 +17,21 @@ import { compose } from 'utils'; * AR Aging Summary Report - Drawer Header. */ function ARAgingSummaryHeader({ + // #ownProps pageFilter, onSubmitFilter, receivableAgingFilter, - // #withReceivableAgingSummary - receivableAgingRefresh, - // #withReceivableAgingSummaryActions - refreshReceivableAgingSummary, toggleFilterARAgingSummary, }) { const validationSchema = Yup.object().shape({ asDate: Yup.date().required().label('asDate'), - agingBeforeDays: Yup.number() + agingDaysBefore: Yup.number() .required() .integer() .positive() - .label('agingBeforeDays'), + .label('agingDaysBefore'), agingPeriods: Yup.number() .required() .integer() @@ -44,12 +41,13 @@ function ARAgingSummaryHeader({ // Initial values. const initialValues = { asDate: moment(pageFilter.asDate).toDate(), - agingBeforeDays: 30, + agingDaysBefore: 30, agingPeriods: 3, }; // Handle form submit. const handleSubmit = (values, { setSubmitting }) => { onSubmitFilter(values); + toggleFilterARAgingSummary(); setSubmitting(false); }; // Handle cancel button click. @@ -89,10 +87,7 @@ function ARAgingSummaryHeader({ export default compose( withARAgingSummaryActions, - withARAgingSummary( - ({ receivableAgingSummaryFilter, receivableAgingSummaryRefresh }) => ({ - receivableAgingFilter: receivableAgingSummaryFilter, - receivableAgingRefresh: receivableAgingSummaryRefresh, - }), - ), + withARAgingSummary(({ receivableAgingSummaryFilter }) => ({ + receivableAgingFilter: receivableAgingSummaryFilter, + })), )(ARAgingSummaryHeader); diff --git a/client/src/containers/FinancialStatements/ARAgingSummary/ARAgingSummaryHeaderGeneral.js b/client/src/containers/FinancialStatements/ARAgingSummary/ARAgingSummaryHeaderGeneral.js index 3eb0ad97a..4636882bf 100644 --- a/client/src/containers/FinancialStatements/ARAgingSummary/ARAgingSummaryHeaderGeneral.js +++ b/client/src/containers/FinancialStatements/ARAgingSummary/ARAgingSummaryHeaderGeneral.js @@ -12,17 +12,16 @@ import { FormattedMessage as T } from 'react-intl'; import classNames from 'classnames'; import { CustomersMultiSelect, Row, Col, FieldHint } from 'components'; import { momentFormatter } from 'utils'; -// import withCustomers from 'containers/Customers/withCustomers'; -import { compose } from 'redux'; +import { useARAgingSummaryContext } from './ARAgingSummaryProvider'; /** * AR Aging Summary - Drawer Header - General Fields. */ -function ARAgingSummaryHeaderGeneral({ - // #withCustomers - customers, -}) { +export default function ARAgingSummaryHeaderGeneral() { + // AR Aging summary context. + const { customers } = useARAgingSummaryContext(); + return (
@@ -53,7 +52,7 @@ function ARAgingSummaryHeaderGeneral({ - + {({ field, meta: { error, touched } }) => ( } @@ -104,9 +103,4 @@ function ARAgingSummaryHeaderGeneral({
); -} -export default compose( - // withCustomers(({ customers }) => ({ - // customers, - // })), -)(ARAgingSummaryHeaderGeneral); +} \ No newline at end of file diff --git a/client/src/containers/FinancialStatements/ARAgingSummary/ARAgingSummaryProvider.js b/client/src/containers/FinancialStatements/ARAgingSummary/ARAgingSummaryProvider.js index e69de29bb..7e1f40781 100644 --- a/client/src/containers/FinancialStatements/ARAgingSummary/ARAgingSummaryProvider.js +++ b/client/src/containers/FinancialStatements/ARAgingSummary/ARAgingSummaryProvider.js @@ -0,0 +1,47 @@ +import React, { useMemo, createContext, useContext } from 'react'; +import DashboardInsider from 'components/Dashboard/DashboardInsider'; +import { useARAgingSummaryReport, useCustomers } from 'hooks/query'; +import { transformFilterFormToQuery } from '../common'; + +const ARAgingSummaryContext = createContext(); + +/** + * A/R aging summary provider. + */ +function ARAgingSummaryProvider({ filter, ...props }) { + // Transformes the filter from to the Url query. + const query = useMemo(() => transformFilterFormToQuery(filter), [filter]); + + const { + data: ARAgingSummary, + isLoading: isARAgingLoading, + isFetching: isARAgingFetching, + refetch, + } = useARAgingSummaryReport(query); + + // Retrieve the customers list. + const { + data: { customers }, + isFetching: isCustomersFetching, + } = useCustomers(); + + const provider = { + ARAgingSummary, + customers, + + isARAgingLoading, + isARAgingFetching, + isCustomersFetching, + refetch, + }; + + return ( + + + + ); +} + +const useARAgingSummaryContext = () => useContext(ARAgingSummaryContext); + +export { ARAgingSummaryProvider, useARAgingSummaryContext }; diff --git a/client/src/containers/FinancialStatements/ARAgingSummary/ARAgingSummaryTable.js b/client/src/containers/FinancialStatements/ARAgingSummary/ARAgingSummaryTable.js index 88dc2f23f..09300f2b1 100644 --- a/client/src/containers/FinancialStatements/ARAgingSummary/ARAgingSummaryTable.js +++ b/client/src/containers/FinancialStatements/ARAgingSummary/ARAgingSummaryTable.js @@ -1,72 +1,25 @@ -import React, { useMemo, useCallback } from 'react'; -import { FormattedMessage as T, useIntl } from 'react-intl'; +import React, { useCallback } from 'react'; +import { useIntl } from 'react-intl'; import DataTable from 'components/DataTable'; import FinancialSheet from 'components/FinancialSheet'; -import withARAgingSummary from './withARAgingSummary'; - -import { compose, getColumnWidth } from 'utils'; +import { useARAgingSummaryContext } from './ARAgingSummaryProvider'; +import { useARAgingSummaryColumns } from './components'; /** * AR aging summary table sheet. */ -function ReceivableAgingSummaryTable({ - // #withReceivableAgingSummary - receivableAgingRows, - receivableAgingLoading, - receivableAgingColumns, - +export default function ReceivableAgingSummaryTable({ // #ownProps - onFetchData, organizationName, }) { const { formatMessage } = useIntl(); - const agingColumns = useMemo(() => { - return receivableAgingColumns.map((agingColumn) => { - return `${agingColumn.before_days} - ${ - agingColumn.to_days || 'And Over' - }`; - }); - }, [receivableAgingColumns]); + // AR aging summary report context. + const { ARAgingSummary, isARAgingFetching } = useARAgingSummaryContext(); - const columns = useMemo( - () => [ - { - Header: , - accessor: 'name', - className: 'customer_name', - sticky: 'left', - width: 240, - textOverview: true, - }, - { - Header: , - accessor: 'current', - className: 'current', - width: getColumnWidth(receivableAgingRows, `current`, { - minWidth: 120, - }), - }, - ...agingColumns.map((agingColumn, index) => ({ - Header: agingColumn, - accessor: `aging-${index }`, - width: getColumnWidth(receivableAgingRows, `aging-${index }`, { - minWidth: 120, - }), - })), - { - Header: (), - id: 'total', - accessor: 'total', - className: 'total', - width: getColumnWidth(receivableAgingRows, 'total', { - minWidth: 120, - }), - }, - ], - [receivableAgingRows, agingColumns], - ); + // AR aging summary columns. + const columns = useARAgingSummaryColumns(); const rowClassNames = (row) => [`row-type--${row.original.rowType}`]; @@ -80,12 +33,12 @@ function ReceivableAgingSummaryTable({ name={'receivable-aging-summary'} sheetType={formatMessage({ id: 'receivable_aging_summary' })} asDate={new Date()} - loading={receivableAgingLoading} + loading={isARAgingFetching} > ); } - -export default compose( - withARAgingSummary( - ({ - receivableAgingSummaryLoading, - receivableAgingSummaryColumns, - receivableAgingSummaryRows, - }) => ({ - receivableAgingLoading: receivableAgingSummaryLoading, - receivableAgingColumns: receivableAgingSummaryColumns, - receivableAgingRows: receivableAgingSummaryRows, - }), - ), -)(ReceivableAgingSummaryTable); diff --git a/client/src/containers/FinancialStatements/ARAgingSummary/components.js b/client/src/containers/FinancialStatements/ARAgingSummary/components.js new file mode 100644 index 000000000..dc1e174e4 --- /dev/null +++ b/client/src/containers/FinancialStatements/ARAgingSummary/components.js @@ -0,0 +1,58 @@ +import React from 'react'; +import { useARAgingSummaryContext } from './ARAgingSummaryProvider'; +import { getColumnWidth } from 'utils'; +import { FormattedMessage as T } from 'react-intl'; + +/** + * Retrieve AR aging summary columns. + */ +export const useARAgingSummaryColumns = () => { + const { + ARAgingSummary: { tableRows, columns }, + } = useARAgingSummaryContext(); + + const agingColumns = React.useMemo(() => { + return columns.map( + (agingColumn) => + `${agingColumn.before_days} - ${agingColumn.to_days || 'And Over'}`, + ); + }, [columns]); + + return React.useMemo( + () => [ + { + Header: , + accessor: 'name', + className: 'customer_name', + sticky: 'left', + width: 240, + textOverview: true, + }, + { + Header: , + accessor: 'current', + className: 'current', + width: getColumnWidth(tableRows, `current`, { + minWidth: 120, + }), + }, + ...agingColumns.map((agingColumn, index) => ({ + Header: agingColumn, + accessor: `aging-${index}`, + width: getColumnWidth(tableRows, `aging-${index}`, { + minWidth: 120, + }), + })), + { + Header: , + id: 'total', + accessor: 'total', + className: 'total', + width: getColumnWidth(tableRows, 'total', { + minWidth: 120, + }), + }, + ], + [tableRows, agingColumns], + ); +}; diff --git a/client/src/containers/FinancialStatements/BalanceSheet/BalanceSheet.js b/client/src/containers/FinancialStatements/BalanceSheet/BalanceSheet.js index ff9c1eaee..3f27d76b7 100644 --- a/client/src/containers/FinancialStatements/BalanceSheet/BalanceSheet.js +++ b/client/src/containers/FinancialStatements/BalanceSheet/BalanceSheet.js @@ -40,6 +40,7 @@ function BalanceSheet({ setFilter({ ..._filter }); }; + // Hnadle number format submit. const handleNumberFormatSubmit = (values) => { setFilter({ ...filter, @@ -48,7 +49,7 @@ function BalanceSheet({ }; return ( - + transformFilterFormToQuery(filter), [filter]); + + // Fetches the balance sheet report. + const { data: balanceSheet, isFetching, refetch } = useBalanceSheet(query); const provider = { balanceSheet, isLoading: isFetching, - refetchBalanceSheet: refetch + refetchBalanceSheet: refetch, + + query, + filter, }; return ( diff --git a/client/src/containers/FinancialStatements/GeneralLedger/GeneralLedger.js b/client/src/containers/FinancialStatements/GeneralLedger/GeneralLedger.js index bae07efb9..613099ce9 100644 --- a/client/src/containers/FinancialStatements/GeneralLedger/GeneralLedger.js +++ b/client/src/containers/FinancialStatements/GeneralLedger/GeneralLedger.js @@ -1,6 +1,5 @@ -import React, { useEffect, useCallback, useState } from 'react'; +import React, { useCallback, useState } from 'react'; import moment from 'moment'; -import { useIntl } from 'react-intl'; import 'style/pages/FinancialStatements/GeneralLedger.scss'; @@ -12,28 +11,21 @@ import GeneralLedgerActionsBar from './GeneralLedgerActionsBar'; import { GeneralLedgerProvider } from './GeneralLedgerProvider'; import withGeneralLedgerActions from './withGeneralLedgerActions'; -import withDashboardActions from 'containers/Dashboard/withDashboardActions'; import withSettings from 'containers/Settings/withSettings'; -import { compose } from 'utils'; - import { transformFilterFormToQuery } from 'containers/FinancialStatements/common'; +import { compose } from 'utils'; /** * General Ledger (GL) sheet. */ function GeneralLedger({ - // #withDashboardActions - changePageTitle, - setDashboardBackLink, - // #withGeneralLedgerActions refreshGeneralLedgerSheet, // #withSettings organizationName, }) { - const { formatMessage } = useIntl(); const [filter, setFilter] = useState({ fromDate: moment().startOf('year').format('YYYY-MM-DD'), toDate: moment().endOf('year').format('YYYY-MM-DD'), @@ -41,21 +33,6 @@ function GeneralLedger({ accountsFilter: 'with-transactions', }); - // Change page title of the dashboard. - useEffect(() => { - changePageTitle(formatMessage({ id: 'general_ledger' })); - }, [changePageTitle, formatMessage]); - - useEffect(() => { - // Show the back link on dashboard topbar. - setDashboardBackLink(true); - - return () => { - // Hide the back link on dashboard topbar. - setDashboardBackLink(false); - }; - }); - // Handle financial statement filter change. const handleFilterSubmit = useCallback( (filter) => { @@ -71,7 +48,7 @@ function GeneralLedger({ ); return ( - + @@ -95,7 +72,6 @@ function GeneralLedger({ export default compose( withGeneralLedgerActions, - withDashboardActions, withSettings(({ organizationSettings }) => ({ organizationName: organizationSettings.name, })), diff --git a/client/src/containers/FinancialStatements/GeneralLedger/GeneralLedgerHeaderGeneralPane.js b/client/src/containers/FinancialStatements/GeneralLedger/GeneralLedgerHeaderGeneralPane.js index 7f7f455d1..694362c08 100644 --- a/client/src/containers/FinancialStatements/GeneralLedger/GeneralLedgerHeaderGeneralPane.js +++ b/client/src/containers/FinancialStatements/GeneralLedger/GeneralLedgerHeaderGeneralPane.js @@ -5,7 +5,6 @@ import { } from '@blueprintjs/core'; import { FormattedMessage as T } from 'react-intl'; import classNames from 'classnames'; -import { compose } from 'redux'; import { AccountsMultiSelect, Row, Col } from 'components'; @@ -13,17 +12,15 @@ import FinancialStatementDateRange from 'containers/FinancialStatements/Financia import RadiosAccountingBasis from '../RadiosAccountingBasis'; import FinancialAccountsFilter from '../FinancialAccountsFilter'; -import withAccounts from 'containers/Accounts/withAccounts'; - import { filterAccountsOptions } from './common'; +import { useGeneralLedgerContext } from './GeneralLedgerProvider' /** * General ledger (GL) - Header - General panel. */ -function GeneralLedgerHeaderGeneralPane({ - // #withAccounts - accountsList, -}) { +export default function GeneralLedgerHeaderGeneralPane() { + const { accounts } = useGeneralLedgerContext(); + return (
@@ -37,7 +34,7 @@ function GeneralLedgerHeaderGeneralPane({ label={} className={classNames('form-group--select-list', Classes.FILL)} > - + @@ -45,8 +42,4 @@ function GeneralLedgerHeaderGeneralPane({
); -} - -export default compose(withAccounts(({ accountsList }) => ({ accountsList })))( - GeneralLedgerHeaderGeneralPane, -); +} \ No newline at end of file diff --git a/client/src/containers/FinancialStatements/GeneralLedger/GeneralLedgerProvider.js b/client/src/containers/FinancialStatements/GeneralLedger/GeneralLedgerProvider.js index 2f8a0d5ee..c10cd9c22 100644 --- a/client/src/containers/FinancialStatements/GeneralLedger/GeneralLedgerProvider.js +++ b/client/src/containers/FinancialStatements/GeneralLedger/GeneralLedgerProvider.js @@ -1,14 +1,14 @@ import React, { createContext, useContext } from 'react'; import DashboardInsider from 'components/Dashboard/DashboardInsider'; import { useGeneralLedgerSheet, useAccounts } from 'hooks/query'; -import { transformFilterFormToQuery } from '../common'; const GeneralLedgerContext = createContext(); +/** + * General ledger provider. + */ function GeneralLedgerProvider({ query, ...props }) { - const { data: generalLedger, isFetching, refetch } = useGeneralLedgerSheet({ - ...transformFilterFormToQuery(query), - }); + const { data: generalLedger, isFetching, refetch } = useGeneralLedgerSheet(query); // Accounts list. const { data: accounts, isFetching: isAccountsLoading } = useAccounts(); diff --git a/client/src/containers/FinancialStatements/TrialBalanceSheet/TrialBalanceSheet.js b/client/src/containers/FinancialStatements/TrialBalanceSheet/TrialBalanceSheet.js index ab41cdaed..cc8969c41 100644 --- a/client/src/containers/FinancialStatements/TrialBalanceSheet/TrialBalanceSheet.js +++ b/client/src/containers/FinancialStatements/TrialBalanceSheet/TrialBalanceSheet.js @@ -1,6 +1,5 @@ -import React, { useEffect, useCallback, useState } from 'react'; +import React, { useCallback, useState } from 'react'; import moment from 'moment'; -import { useIntl } from 'react-intl'; import 'style/pages/FinancialStatements/TrialBalanceSheet.scss'; @@ -10,7 +9,6 @@ import TrialBalanceSheetHeader from './TrialBalanceSheetHeader'; import TrialBalanceSheetTable from './TrialBalanceSheetTable'; import DashboardPageContent from 'components/Dashboard/DashboardPageContent'; -import withDashboardActions from 'containers/Dashboard/withDashboardActions'; import withTrialBalanceActions from './withTrialBalanceActions'; import withSettings from 'containers/Settings/withSettings'; import withTrialBalance from './withTrialBalance'; @@ -21,16 +19,9 @@ import { compose } from 'utils'; * Trial balance sheet. */ function TrialBalanceSheet({ - // #withDashboardActions - changePageTitle, - setDashboardBackLink, - setSidebarShrink, - // #withPreferences organizationName, }) { - const { formatMessage } = useIntl(); - const [filter, setFilter] = useState({ fromDate: moment().startOf('year').format('YYYY-MM-DD'), toDate: moment().endOf('year').format('YYYY-MM-DD'), @@ -38,22 +29,6 @@ function TrialBalanceSheet({ accountsFilter: 'all-accounts', }); - // Change page title of the dashboard. - useEffect(() => { - changePageTitle(formatMessage({ id: 'trial_balance_sheet' })); - }, [changePageTitle, formatMessage]); - - useEffect(() => { - setSidebarShrink(); - // Show the back link on dashboard topbar. - setDashboardBackLink(true); - - return () => { - // Hide the back link on dashboard topbar. - setDashboardBackLink(false); - }; - }, [setDashboardBackLink, setSidebarShrink]); - // Handle filter form submit. const handleFilterSubmit = useCallback( (filter) => { @@ -97,7 +72,6 @@ function TrialBalanceSheet({ } export default compose( - withDashboardActions, withTrialBalanceActions, withTrialBalance(({ trialBalanceQuery }) => ({ trialBalanceQuery, diff --git a/client/src/containers/FinancialStatements/common.js b/client/src/containers/FinancialStatements/common.js index 216e06ab4..73c7a3537 100644 --- a/client/src/containers/FinancialStatements/common.js +++ b/client/src/containers/FinancialStatements/common.js @@ -1,5 +1,5 @@ import { omit } from 'lodash'; -import { transformToCamelCase, flatObject } from 'utils'; +import { transfromToSnakeCase, flatObject } from 'utils'; import { formatMessage } from 'services/intl'; export const displayColumnsByOptions = [ @@ -53,7 +53,7 @@ export const transformDisplayColumnsType = (form) => { }; export const transformFilterFormToQuery = (form) => { - const transformed = transformToCamelCase({ + const transformed = transfromToSnakeCase({ ...omit(form, ['accountsFilter']), ...transformDisplayColumnsType(form), noneZero: form.accountsFilter === 'without-zero-balance', diff --git a/client/src/containers/FinancialStatements/reducers.js b/client/src/containers/FinancialStatements/reducers.js index d9ebf45a9..775a2c074 100644 --- a/client/src/containers/FinancialStatements/reducers.js +++ b/client/src/containers/FinancialStatements/reducers.js @@ -226,3 +226,38 @@ export const generalLedgerTableRowsReducer = (accounts) => { }) .value(); }; + +export const ARAgingSummaryTableRowsMapper = (sheet, total) => { + const rows = []; + + const mapAging = (agingPeriods) => { + return agingPeriods.reduce((acc, aging, index) => { + acc[`aging-${index}`] = aging.total.formatted_amount; + return acc; + }, {}); + }; + sheet.customers.forEach((customer) => { + const agingRow = mapAging(customer.aging); + + rows.push({ + rowType: 'customer', + name: customer.customer_name, + ...agingRow, + current: customer.current.formatted_amount, + total: customer.total.formatted_amount, + }); + }); + if (rows.length <= 0) { + return []; + } + return [ + ...rows, + { + name: '', + rowType: 'total', + current: sheet.total.current.formatted_amount, + ...mapAging(sheet.total.aging), + total: sheet.total.total.formatted_amount, + }, + ]; +}; diff --git a/client/src/hooks/query/financialReports.js b/client/src/hooks/query/financialReports.js index 54558157c..b7bdf7d51 100644 --- a/client/src/hooks/query/financialReports.js +++ b/client/src/hooks/query/financialReports.js @@ -6,6 +6,7 @@ import { profitLossSheetReducer, generalLedgerTableRowsReducer, journalTableRowsReducer, + ARAgingSummaryTableRowsMapper } from 'containers/FinancialStatements/reducers'; import useApiRequest from '../useRequest'; @@ -175,6 +176,29 @@ export function useARAgingSummaryReport(query, props) { apiRequest.get('/financial_statements/receivable_aging_summary', { params: query, }), - props, + { + select: (res) => ({ + columns: res.data.columns, + data: res.data.data, + query: res.data.query, + tableRows: ARAgingSummaryTableRowsMapper({ + customers: res.data.data.customers, + total: res.data.data.total, + columns: res.data.columns, + }), + }), + initialData: { + data: { + data: { + customers: [], + total: {}, + }, + columns: [], + tableRows: [] + } + }, + initialDataUpdatedAt: 0, + ...props + }, ); } diff --git a/client/src/routes/dashboard.js b/client/src/routes/dashboard.js index a814e2aec..12a5d5931 100644 --- a/client/src/routes/dashboard.js +++ b/client/src/routes/dashboard.js @@ -110,6 +110,9 @@ export default [ ), breadcrumb: 'General Ledger', hotkey: 'shift+4', + pageTitle: formatMessage({ id: 'general_ledger' }), + backLink: true, + sidebarShrink: true }, { path: `/financial-reports/balance-sheet`, @@ -131,6 +134,8 @@ export default [ ), breadcrumb: 'Trial Balance Sheet', hotkey: 'shift+5', + pageTitle: formatMessage({ id: 'trial_balance_sheet' }), + backLink: true, }, { path: `/financial-reports/profit-loss-sheet`, @@ -146,6 +151,9 @@ export default [ import('containers/FinancialStatements/ARAgingSummary/ARAgingSummary'), ), breadcrumb: 'Receivable Aging Summary', + pageTitle: formatMessage({ id: 'receivable_aging_summary' }), + backLink: true, + sidebarShrink: true, }, { path: `/financial-reports/journal-sheet`,