import React, { useCallback, useMemo } from 'react'; import moment from 'moment'; import { connect } from 'react-redux'; import { defaultExpanderReducer, compose } from 'utils'; import { useIntl } from 'react-intl'; import FinancialSheet from 'components/FinancialSheet'; import DataTable from 'components/DataTable'; import Money from 'components/Money'; import { getFinancialSheetIndexByQuery } from 'store/financialStatement/financialStatements.selectors'; import withGeneralLedger from './withGeneralLedger'; const ROW_TYPE = { CLOSING_BALANCE: 'closing_balance', OPENING_BALANCE: 'opening_balance', ACCOUNT: 'account_name', TRANSACTION: 'transaction', }; function GeneralLedgerTable({ companyName, onFetchData, generalLedgerSheetLoading, generalLedgerTableRows, generalLedgerQuery, }) { const { formatMessage } = useIntl(); // Account name column accessor. const accountNameAccessor = useCallback( (row) => { switch (row.rowType) { case ROW_TYPE.OPENING_BALANCE: return 'Opening Balance'; case ROW_TYPE.CLOSING_BALANCE: return 'Closing Balance'; default: return row.name; } }, [ROW_TYPE], ); // Date accessor. const dateAccessor = useCallback( (row) => { const TYPES = [ ROW_TYPE.OPENING_BALANCE, ROW_TYPE.CLOSING_BALANCE, ROW_TYPE.TRANSACTION, ]; return TYPES.indexOf(row.rowType) !== -1 ? moment(row.date).format('DD-MM-YYYY') : ''; }, [moment, ROW_TYPE], ); // Amount cell const amountCell = useCallback(({ cell }) => { const transaction = cell.row.original; if (transaction.rowType === ROW_TYPE.ACCOUNT) { return !cell.row.isExpanded ? ( ) : ( '' ); } return ; }, []); const referenceLink = useCallback((row) => { return {row.referenceId}; }); const columns = useMemo( () => [ { Header: formatMessage({ id: 'account_name' }), accessor: accountNameAccessor, className: 'name', }, { Header: formatMessage({ id: 'date' }), accessor: dateAccessor, className: 'date', }, { Header: formatMessage({ id: 'transaction_type' }), accessor: 'referenceType', className: 'transaction_type', }, { Header: formatMessage({ id: 'trans_num' }), accessor: referenceLink, className: 'transaction_number', }, { Header: formatMessage({ id: 'description' }), accessor: 'note', className: 'description', }, { Header: formatMessage({ id: 'amount' }), Cell: amountCell, className: 'amount', }, { Header: formatMessage({ id: 'balance' }), Cell: amountCell, className: 'balance', }, ], [], ); const handleFetchData = useCallback(() => { onFetchData && onFetchData(); }, [onFetchData]); // Default expanded rows of general ledger table. const expandedRows = useMemo( () => defaultExpanderReducer(generalLedgerTableRows, 1), [generalLedgerTableRows], ); const rowClassNames = (row) => [`row-type--${row.original.rowType}`]; return ( ); } const mapStateToProps = (state, props) => { const { generalLedgerQuery } = props; return { generalLedgerIndex: getFinancialSheetIndexByQuery( state.financialStatements.generalLedger.sheets, generalLedgerQuery, ), }; }; const withGeneralLedgerTable = connect(mapStateToProps); export default compose( withGeneralLedgerTable, withGeneralLedger( ({ generalLedgerTableRows, generalLedgerSheetLoading, generalLedgerQuery, }) => ({ generalLedgerTableRows, generalLedgerSheetLoading, generalLedgerQuery, }), ), )(GeneralLedgerTable);