diff --git a/src/containers/Drawers/BillDrawer/BillDrawerDetails.js b/src/containers/Drawers/BillDrawer/BillDrawerDetails.js index 8369fb7b8..0c4d44846 100644 --- a/src/containers/Drawers/BillDrawer/BillDrawerDetails.js +++ b/src/containers/Drawers/BillDrawer/BillDrawerDetails.js @@ -8,6 +8,7 @@ import { DrawerMainTabs } from 'components'; import BillDetailTab from './BillDetailTab'; import LocatedLandedCostTable from './LocatedLandedCostTable'; import JournalEntriesTable from '../../JournalEntriesTable/JournalEntriesTable'; +import BillPaymentTransactionTable from './BillPaymentTransactions/BillPaymentTransactionTable'; import { useBillDrawerContext } from './BillDrawerProvider'; import BillDrawerCls from 'style/components/Drawers/BillDrawer.module.scss'; @@ -33,16 +34,16 @@ export default function BillDrawerDetails() { id={'journal_entries'} panel={} /> + } + /> } /> - {/* */} ); diff --git a/src/containers/Drawers/BillDrawer/BillDrawerProvider.js b/src/containers/Drawers/BillDrawer/BillDrawerProvider.js index bef541bb0..4bc138362 100644 --- a/src/containers/Drawers/BillDrawer/BillDrawerProvider.js +++ b/src/containers/Drawers/BillDrawer/BillDrawerProvider.js @@ -5,6 +5,7 @@ import { useBill, useTransactionsByReference, useBillLocatedLandedCost, + useBillPaymentTransactions, } from 'hooks/query'; const BillDrawerContext = React.createContext(); @@ -33,15 +34,31 @@ function BillDrawerProvider({ billId, ...props }) { enabled: !!billId, }); + // Handle fetch bill payment transaction. + const { + isLoading: isPaymentTransactionsLoading, + isFetching: isPaymentTransactionFetching, + data: paymentTransactions, + } = useBillPaymentTransactions(billId, { + enabled: !!billId, + }); + //provider. const provider = { transactions, billId, data, bill, + paymentTransactions, + isPaymentTransactionsLoading, + isPaymentTransactionFetching, }; - const loading = isLandedCostLoading || isTransactionLoading || isBillLoading; + const loading = + isLandedCostLoading || + isTransactionLoading || + isPaymentTransactionsLoading || + isBillLoading; return ( diff --git a/src/containers/Drawers/BillDrawer/BillPaymentTransactions/BillPaymentTransactionTable.js b/src/containers/Drawers/BillDrawer/BillPaymentTransactions/BillPaymentTransactionTable.js new file mode 100644 index 000000000..77fafdf26 --- /dev/null +++ b/src/containers/Drawers/BillDrawer/BillPaymentTransactions/BillPaymentTransactionTable.js @@ -0,0 +1,33 @@ +import React from 'react'; +import { DataTable, Card } from 'components'; + +import 'style/pages/PaymentTransactions/List.scss'; + +import { useBillPaymentTransactionsColumns } from './components'; +import { useBillDrawerContext } from '../BillDrawerProvider'; + +/** + * Bill payment transactions datatable. + */ +export default function BillPaymentTransactionTable() { + const columns = useBillPaymentTransactionsColumns(); + + const { + paymentTransactions, + isPaymentTransactionsLoading, + isPaymentTransactionFetching, + } = useBillDrawerContext(); + + return ( + + + + ); +} diff --git a/src/containers/Drawers/BillDrawer/BillPaymentTransactions/components.js b/src/containers/Drawers/BillDrawer/BillPaymentTransactions/components.js new file mode 100644 index 000000000..8927ef7e6 --- /dev/null +++ b/src/containers/Drawers/BillDrawer/BillPaymentTransactions/components.js @@ -0,0 +1,52 @@ +import React from 'react'; +import intl from 'react-intl-universal'; + +import clsx from 'classnames'; +import { CLASSES } from '../../../../common/classes'; +import { FormatDateCell } from '../../../../components'; + +/** + * Retrieve bill payment transactions table columns. + */ +export const useBillPaymentTransactionsColumns = () => { + return React.useMemo( + () => [ + { + id: 'date', + Header: intl.get('payment_date'), + accessor: 'date', + Cell: FormatDateCell, + width: 110, + className: 'date', + textOverview: true, + }, + { + id: 'amount', + Header: intl.get('amount'), + accessor: 'amount', + // accessor: 'formatted_amount', + align: 'right', + width: 100, + className: clsx(CLASSES.FONT_BOLD), + textOverview: true, + }, + { + id: 'payment_number', + Header: intl.get('payment_no'), + accessor: 'payment_number', + width: 100, + className: 'payment_number', + }, + { + id: 'reference', + Header: intl.get('reference_no'), + accessor: 'reference', + width: 90, + className: 'reference', + clickable: true, + textOverview: true, + }, + ], + [], + ); +}; diff --git a/src/containers/Drawers/BillDrawer/utils.js b/src/containers/Drawers/BillDrawer/utils.js index fea0879cd..32894150b 100644 --- a/src/containers/Drawers/BillDrawer/utils.js +++ b/src/containers/Drawers/BillDrawer/utils.js @@ -7,45 +7,45 @@ import { FormatNumberCell } from '../../../components'; * Retrieve bill readonly details entries table columns. */ export const useBillReadonlyEntriesTableColumns = () => -React.useMemo( - () => [ - { - Header: intl.get('product_and_service'), - accessor: 'item.name', - width: 150, - className: 'item', - disableSortBy: true - }, - { - Header: intl.get('description'), - accessor: 'description', - className: 'description', - disableSortBy: true - }, - { - Header: intl.get('quantity'), - accessor: 'quantity', - Cell: FormatNumberCell, - width: 100, - align: 'right', - disableSortBy: true - }, - { - Header: intl.get('rate'), - accessor: 'rate', - Cell: FormatNumberCell, - width: 100, - align: 'right', - disableSortBy: true - }, - { - Header: intl.get('amount'), - accessor: 'amount', - Cell: FormatNumberCell, - width: 100, - align: 'right', - disableSortBy: true - }, - ], - [], -); \ No newline at end of file + React.useMemo( + () => [ + { + Header: intl.get('product_and_service'), + accessor: 'item.name', + width: 150, + className: 'item', + disableSortBy: true, + }, + { + Header: intl.get('description'), + accessor: 'description', + className: 'description', + disableSortBy: true, + }, + { + Header: intl.get('quantity'), + accessor: 'quantity', + Cell: FormatNumberCell, + width: 100, + align: 'right', + disableSortBy: true, + }, + { + Header: intl.get('rate'), + accessor: 'rate', + Cell: FormatNumberCell, + width: 100, + align: 'right', + disableSortBy: true, + }, + { + Header: intl.get('amount'), + accessor: 'amount', + Cell: FormatNumberCell, + width: 100, + align: 'right', + disableSortBy: true, + }, + ], + [], + ); diff --git a/src/containers/Drawers/InvoiceDetailDrawer/InvoiceDetail.js b/src/containers/Drawers/InvoiceDetailDrawer/InvoiceDetail.js index 224e948a0..9bc708e0d 100644 --- a/src/containers/Drawers/InvoiceDetailDrawer/InvoiceDetail.js +++ b/src/containers/Drawers/InvoiceDetailDrawer/InvoiceDetail.js @@ -6,6 +6,7 @@ import clsx from 'classnames'; import { DrawerMainTabs } from 'components'; import JournalEntriesTable from '../../JournalEntriesTable/JournalEntriesTable'; +import InvoicePaymentTransactionsTable from './InvoicePaymentTransactions/InvoicePaymentTransactionsTable'; import InvoiceDetailTab from './InvoiceDetailTab'; import { useInvoiceDetailDrawerContext } from './InvoiceDetailDrawerProvider'; @@ -30,11 +31,11 @@ export default function InvoiceDetail() { id={'journal_entries'} panel={} /> - {/* */} + panel={} + /> ); diff --git a/src/containers/Drawers/InvoiceDetailDrawer/InvoiceDetailDrawerProvider.js b/src/containers/Drawers/InvoiceDetailDrawer/InvoiceDetailDrawerProvider.js index ccb64799b..9b59028a5 100644 --- a/src/containers/Drawers/InvoiceDetailDrawer/InvoiceDetailDrawerProvider.js +++ b/src/containers/Drawers/InvoiceDetailDrawer/InvoiceDetailDrawerProvider.js @@ -1,7 +1,11 @@ import React from 'react'; import intl from 'react-intl-universal'; import { DrawerHeaderContent, DrawerLoading } from 'components'; -import { useTransactionsByReference, useInvoice } from 'hooks/query'; +import { + useTransactionsByReference, + useInvoice, + useInvoicePaymentTransactions, +} from 'hooks/query'; const InvoiceDetailDrawerContext = React.createContext(); /** @@ -25,14 +29,30 @@ function InvoiceDetailDrawerProvider({ invoiceId, ...props }) { enabled: !!invoiceId, }); + // Fetch invoice payment transactions. + const { + data: paymentTransactions, + isFetching: isPaymentTransactionFetching, + isLoading: isPaymentTransactionLoading, + } = useInvoicePaymentTransactions(invoiceId, { + enabled: !!invoiceId, + }); + //provider. const provider = { transactions, + paymentTransactions, + isPaymentTransactionLoading, + isPaymentTransactionFetching, invoiceId, invoice, }; return ( - + + + + ); +} diff --git a/src/containers/Drawers/InvoiceDetailDrawer/InvoicePaymentTransactions/components.js b/src/containers/Drawers/InvoiceDetailDrawer/InvoicePaymentTransactions/components.js new file mode 100644 index 000000000..d57bda7f4 --- /dev/null +++ b/src/containers/Drawers/InvoiceDetailDrawer/InvoicePaymentTransactions/components.js @@ -0,0 +1,52 @@ +import React from 'react'; +import intl from 'react-intl-universal'; + +import clsx from 'classnames'; +import { CLASSES } from '../../../../common/classes'; +import { FormattedMessage as T, FormatDateCell } from '../../../../components'; + +/** + * Retrieve invoice payment transactions table columns. + */ +export const useInvoicePaymentTransactionsColumns = () => { + return React.useMemo( + () => [ + { + id: 'date', + Header: intl.get('payment_date'), + accessor: 'date', + Cell: FormatDateCell, + width: 110, + className: 'date', + textOverview: true, + }, + { + id: 'amount', + Header: intl.get('amount'), + accessor: 'amount', + // accessor: 'formatted_amount', + align: 'right', + width: 120, + className: clsx(CLASSES.FONT_BOLD), + textOverview: true, + }, + { + id: 'payment_receive_no.', + Header: intl.get('payment_no'), + accessor: 'payment_receive_no', + width: 100, + className: 'payment_receive_no', + }, + { + id: 'reference_no', + Header: intl.get('reference_no'), + accessor: 'reference_no', + width: 90, + className: 'reference_no', + clickable: true, + textOverview: true, + }, + ], + [], + ); +}; diff --git a/src/containers/Drawers/InvoiceDetailDrawer/utils.js b/src/containers/Drawers/InvoiceDetailDrawer/utils.js index 43b06170e..36c9f29d8 100644 --- a/src/containers/Drawers/InvoiceDetailDrawer/utils.js +++ b/src/containers/Drawers/InvoiceDetailDrawer/utils.js @@ -105,3 +105,4 @@ export const BadDebtMenuItem = ({ ); }; + diff --git a/src/containers/Drawers/ItemDetailDrawer/ItemContentDetails.js b/src/containers/Drawers/ItemDetailDrawer/ItemContentDetails.js index 140e72543..163b310ba 100644 --- a/src/containers/Drawers/ItemDetailDrawer/ItemContentDetails.js +++ b/src/containers/Drawers/ItemDetailDrawer/ItemContentDetails.js @@ -2,6 +2,8 @@ import React from 'react'; import ItemDetailActionsBar from './ItemDetailActionsBar'; import ItemDetailHeader from './ItemDetailHeader'; +import { ItemPaymentTransactions } from './ItemPaymentTransactions'; +import DashboardActionsBar from 'components/Dashboard/DashboardActionsBar'; import { Card } from 'components'; @@ -12,7 +14,7 @@ export default function ItemDetail() { return (
- + diff --git a/src/containers/Drawers/ItemDetailDrawer/ItemPaymentTransactions/BillPaymentTransactionsDataTable.js b/src/containers/Drawers/ItemDetailDrawer/ItemPaymentTransactions/BillPaymentTransactionsDataTable.js new file mode 100644 index 000000000..3cfd3218c --- /dev/null +++ b/src/containers/Drawers/ItemDetailDrawer/ItemPaymentTransactions/BillPaymentTransactionsDataTable.js @@ -0,0 +1,78 @@ +import React from 'react'; +import intl from 'react-intl-universal'; +import clsx from 'classnames'; +import { CLASSES } from '../../../../common/classes'; +import { DataTable, Card, FormatDateCell } from '../../../../components'; + +/** + * Bill payment transactions data table. + */ +export default function BillPaymentTransactions() { + const columns = React.useMemo( + () => [ + { + id: 'bill_date', + Header: intl.get('date'), + accessor: 'bill_date', + Cell: FormatDateCell, + width: 110, + className: 'bill_date', + }, + { + id: 'bill_number', + Header: intl.get('bill_number'), + accessor: (row) => (row.bill_number ? `${row.bill_number}` : null), + width: 100, + className: 'bill_number', + }, + { + id: 'vendor', + Header: intl.get('vendor_name'), + accessor: 'vendor.display_name', + width: 180, + className: 'vendor', + }, + { + id: 'reference_no', + Header: intl.get('reference_no'), + accessor: 'reference_no', + width: 90, + className: 'reference_no', + }, + { + id: 'qunatity', + Header: 'Quantity Purchase', + }, + { + id: 'rate', + Header: 'Rate', + }, + { + id: 'total', + Header: intl.get('total'), + }, + { + id: 'status', + Header: intl.get('status'), + // accessor: (row) => statusAccessor(row), + width: 160, + className: 'status', + }, + ], + [], + ); + + return ( +
+ + + +
+ ); +} diff --git a/src/containers/Drawers/ItemDetailDrawer/ItemPaymentTransactions/EstimatePaymentTransactionsDataTable.js b/src/containers/Drawers/ItemDetailDrawer/ItemPaymentTransactions/EstimatePaymentTransactionsDataTable.js new file mode 100644 index 000000000..de04b499e --- /dev/null +++ b/src/containers/Drawers/ItemDetailDrawer/ItemPaymentTransactions/EstimatePaymentTransactionsDataTable.js @@ -0,0 +1,73 @@ +import React from 'react'; +import intl from 'react-intl-universal'; +import clsx from 'classnames'; +import { CLASSES } from '../../../../common/classes'; +import { DataTable, Card, FormatDateCell } from '../../../../components'; + +/** + * Esimtate payment transactions datatable. + */ +export default function EstimatePaymentTransactions() { + const columns = React.useMemo( + () => [ + { + id: 'estimate_date', + Header: intl.get('date'), + accessor: 'estimate_date', + Cell: FormatDateCell, + width: 110, + className: 'estimate_date', + textOverview: true, + }, + { + id: 'estimate_number', + Header: intl.get('estimate_no'), + accessor: 'estimate_number', + width: 100, + className: 'estimate_number', + textOverview: true, + }, + { + id: 'reference', + Header: intl.get('reference_no'), + accessor: 'reference', + width: 140, + className: 'reference', + }, + { + id: 'customer_id', + Header: intl.get('customer_name'), + accessor: 'customer.display_name', + width: 140, + className: 'customer_id', + }, + { + id: 'qunatity', + Header: 'Quantity Sold', + }, + { + id: 'rate', + Header: 'Rate', + }, + { + id: 'total', + Header: intl.get('total'), + }, + ], + [], + ); + + return ( +
+ + + +
+ ); +} diff --git a/src/containers/Drawers/ItemDetailDrawer/ItemPaymentTransactions/InvoicePaymentTransactionsDataTable.js b/src/containers/Drawers/ItemDetailDrawer/ItemPaymentTransactions/InvoicePaymentTransactionsDataTable.js new file mode 100644 index 000000000..345ff9587 --- /dev/null +++ b/src/containers/Drawers/ItemDetailDrawer/ItemPaymentTransactions/InvoicePaymentTransactionsDataTable.js @@ -0,0 +1,83 @@ +import React from 'react'; +import intl from 'react-intl-universal'; +import clsx from 'classnames'; +import { CLASSES } from '../../../../common/classes'; +import { DataTable, Card, FormatDateCell } from '../../../../components'; + +/** + * Invoice payment transactions datatable. + */ +export default function InvoicePaymentTransactionsTable() { + const columns = React.useMemo( + () => [ + { + id: 'invoice_date', + Header: intl.get('date'), + accessor: 'invoice_date', + Cell: FormatDateCell, + width: 110, + className: 'invoice_date', + textOverview: true, + }, + { + id: 'invoice_no', + Header: intl.get('invoice_no__'), + accessor: 'invoice_no', + width: 240, + className: 'invoice_no', + textOverview: true, + }, + { + id: 'customer', + Header: intl.get('customer_name'), + accessor: 'customer.display_name', + width: 140, + className: 'customer_id', + clickable: true, + textOverview: true, + }, + { + id: 'reference_no', + Header: intl.get('reference_no'), + accessor: 'reference_no', + width: 140, + className: 'reference_no', + textOverview: true, + }, + { + id: 'qunatity', + Header: 'Quantity Sold', + }, + { + id: 'rate', + Header: 'Rate', + }, + { + id: 'total', + Header: intl.get('total'), + }, + { + id: 'status', + Header: intl.get('status'), + // accessor: (row) => statusAccessor(row), + width: 160, + className: 'status', + }, + ], + [], + ); + + return ( +
+ + + +
+ ); +} diff --git a/src/containers/Drawers/ItemDetailDrawer/ItemPaymentTransactions/ReceiptPaymentTransactionsDataTable.js b/src/containers/Drawers/ItemDetailDrawer/ItemPaymentTransactions/ReceiptPaymentTransactionsDataTable.js new file mode 100644 index 000000000..3b82ce7b9 --- /dev/null +++ b/src/containers/Drawers/ItemDetailDrawer/ItemPaymentTransactions/ReceiptPaymentTransactionsDataTable.js @@ -0,0 +1,83 @@ +import React from 'react'; +import intl from 'react-intl-universal'; +import clsx from 'classnames'; +import { CLASSES } from '../../../../common/classes'; +import { DataTable, Card, FormatDateCell } from '../../../../components'; + +/** + * Receipt payment transactions datatable. + */ +export default function ReceiptPaymentTransactions() { + const columns = React.useMemo( + () => [ + { + id: 'receipt_date', + Header: intl.get('date'), + accessor: 'receipt_date', + Cell: FormatDateCell, + width: 110, + className: 'receipt_date', + textOverview: true, + }, + { + id: 'receipt_number', + Header: intl.get('receipt_no'), + accessor: 'receipt_number', + width: 140, + className: 'receipt_number', + clickable: true, + textOverview: true, + }, + { + id: 'customer', + Header: intl.get('customer_name'), + accessor: 'customer.display_name', + width: 140, + className: 'customer_id', + textOverview: true, + }, + { + id: 'reference_no', + Header: intl.get('reference_no'), + accessor: 'reference_no', + width: 140, + className: 'reference_no', + textOverview: true, + }, + { + id: 'status', + Header: intl.get('status'), + // accessor: StatusAccessor, + width: 140, + className: 'status', + }, + { + id: 'qunatity', + Header: 'Quantity Sold', + }, + { + id: 'rate', + Header: 'Rate', + }, + { + id: 'total', + Header: intl.get('total'), + }, + ], + [], + ); + + return ( +
+ + + +
+ ); +} diff --git a/src/containers/Drawers/ItemDetailDrawer/ItemPaymentTransactions/index.js b/src/containers/Drawers/ItemDetailDrawer/ItemPaymentTransactions/index.js new file mode 100644 index 000000000..502918c8c --- /dev/null +++ b/src/containers/Drawers/ItemDetailDrawer/ItemPaymentTransactions/index.js @@ -0,0 +1,37 @@ +import React from 'react'; +import { Tab } from '@blueprintjs/core'; +import { DrawerMainTabs, FormattedMessage as T } from 'components'; +import InvoicePaymentTransactionsTable from './InvoicePaymentTransactionsDataTable'; +import EstimatePaymentTransactionsTable from './EstimatePaymentTransactionsDataTable'; +import ReceiptPaymentTransactionsTable from './ReceiptPaymentTransactionsDataTable'; +import BillPaymentTransactionsTable from './BillPaymentTransactionsDataTable'; + +import ItemSwitchMenuItem from './utils'; + +export const ItemPaymentTransactions = () => { + return ( + + } + panel={} + /> + } + panel={} + /> + } + panel={} + /> + } + /> + + ); +}; diff --git a/src/containers/Drawers/ItemDetailDrawer/ItemPaymentTransactions/utils.js b/src/containers/Drawers/ItemDetailDrawer/ItemPaymentTransactions/utils.js new file mode 100644 index 000000000..783e6dde0 --- /dev/null +++ b/src/containers/Drawers/ItemDetailDrawer/ItemPaymentTransactions/utils.js @@ -0,0 +1,59 @@ +import React from 'react'; +import intl from 'react-intl-universal'; +import { + Popover, + Menu, + Position, + Button, + MenuItem, + Classes, + NavbarGroup, + PopoverInteractionKind, +} from '@blueprintjs/core'; +import { Icon } from '../../../../components'; +import { curry } from 'lodash/fp'; +import { Select } from '@blueprintjs/select'; + +function ItemSwitchMenuItem({ onChange }) { + const Transaction = [ + { name: 'Invoice' }, + { name: 'Estimate' }, + { name: 'Bill' }, + { name: 'Receipt' }, + ]; + + const handleSwitchMenutItem = (item) => { + onChange && onChange(item); + }; + + const content = ( + + {Transaction.map((item) => ( + handleSwitchMenutItem(item.name)} + text={item.name} + /> + ))} + + ); + + return ( + +