From 2a48d9be519e6d979a156bc837b7111765765b4d Mon Sep 17 00:00:00 2001
From: elforjani13 <39470382+elforjani13@users.noreply.github.com>
Date: Sun, 5 Dec 2021 19:30:52 +0200
Subject: [PATCH] feat: add refund transactions.
---
.../RefundCreditNoteDeleteAlert.js | 68 ++++++++++++++++++
.../RefundVendorCreditDeleteAlert.js | 70 +++++++++++++++++++
.../CreditNoteDetail.js | 6 ++
.../CreditNoteDetailActionsBar.js | 13 ++++
.../CreditNoteDetailDrawerProvider.js | 16 ++++-
.../RefundCreditNoteTransactionsTable.js | 48 +++++++++++++
.../components.js | 59 ++++++++++++++++
.../RefundVendorCreditTransactionsTable.js | 46 ++++++++++++
.../components.js | 57 +++++++++++++++
.../VendorCreditDetail.js | 6 ++
.../VendorCreditDetailActionsBar.js | 11 +++
.../VendorCreditDetailDrawerProvider.js | 18 ++++-
.../VendorsCreditNoteDataTable.js | 10 +++
.../CreditNotesLanding/components.js | 7 +-
.../CreditNotes/VendorCreditNotesAlerts.js | 8 +++
.../Sales/CreditNotes/CreditNotesAlerts.js | 8 +++
.../CreditNotesDataTable.js | 10 +++
.../CreditNotesLanding/components.js | 7 +-
src/hooks/query/creditNote.js | 65 +++++++++++++++++
src/hooks/query/types.js | 2 +
src/hooks/query/vendorCredit.js | 69 ++++++++++++++++++
src/lang/en/index.json | 47 ++++++++++---
src/style/pages/RefundCreditNote/List.scss | 27 +++++++
src/style/pages/RefundVendorCredit/List.scss | 27 +++++++
24 files changed, 688 insertions(+), 17 deletions(-)
create mode 100644 src/containers/Alerts/CreditNotes/RefundCreditNoteDeleteAlert.js
create mode 100644 src/containers/Alerts/VendorCeditNotes/RefundVendorCreditDeleteAlert.js
create mode 100644 src/containers/Drawers/CreditNoteDetailDrawer/RefundCreditNoteTransactions/RefundCreditNoteTransactionsTable.js
create mode 100644 src/containers/Drawers/CreditNoteDetailDrawer/RefundCreditNoteTransactions/components.js
create mode 100644 src/containers/Drawers/VendorCreditDetailDrawer/RefundVendorCreditTransactions/RefundVendorCreditTransactionsTable.js
create mode 100644 src/containers/Drawers/VendorCreditDetailDrawer/RefundVendorCreditTransactions/components.js
create mode 100644 src/style/pages/RefundCreditNote/List.scss
create mode 100644 src/style/pages/RefundVendorCredit/List.scss
diff --git a/src/containers/Alerts/CreditNotes/RefundCreditNoteDeleteAlert.js b/src/containers/Alerts/CreditNotes/RefundCreditNoteDeleteAlert.js
new file mode 100644
index 000000000..9fe3774ad
--- /dev/null
+++ b/src/containers/Alerts/CreditNotes/RefundCreditNoteDeleteAlert.js
@@ -0,0 +1,68 @@
+import React from 'react';
+import intl from 'react-intl-universal';
+import { FormattedMessage as T, FormattedHTMLMessage } from 'components';
+import { Intent, Alert } from '@blueprintjs/core';
+import { AppToaster } from 'components';
+import { useDeleteRefundCreditNote } from 'hooks/query';
+
+import withAlertActions from 'containers/Alert/withAlertActions';
+import withAlertStoreConnect from 'containers/Alert/withAlertStoreConnect';
+
+import { compose } from 'utils';
+
+/**
+ * Refund credit transactions delete alert
+ */
+function RefundCreditNoteDeleteAlert({
+ name,
+ // #withAlertStoreConnect
+ isOpen,
+ payload: { creditNoteId },
+ // #withAlertActions
+ closeAlert,
+}) {
+ const { mutateAsync: deleteRefundCreditMutate, isLoading } =
+ useDeleteRefundCreditNote();
+
+ // Handle cancel delete.
+ const handleCancelAlert = () => {
+ closeAlert(name);
+ };
+
+ // Handle confirm delete .
+ const handleConfirmRefundCreditDelete = () => {
+ deleteRefundCreditMutate(creditNoteId)
+ .then(() => {
+ AppToaster.show({
+ message: intl.get('refund_credit_transactions.alert.delete_message'),
+ intent: Intent.SUCCESS,
+ });
+ closeAlert(name);
+ })
+ .catch(() => {});
+ };
+
+ return (
+ }
+ confirmButtonText={}
+ icon="trash"
+ intent={Intent.DANGER}
+ isOpen={isOpen}
+ onCancel={handleCancelAlert}
+ onConfirm={handleConfirmRefundCreditDelete}
+ loading={isLoading}
+ >
+
+
+
+
+ );
+}
+
+export default compose(
+ withAlertStoreConnect(),
+ withAlertActions,
+)(RefundCreditNoteDeleteAlert);
diff --git a/src/containers/Alerts/VendorCeditNotes/RefundVendorCreditDeleteAlert.js b/src/containers/Alerts/VendorCeditNotes/RefundVendorCreditDeleteAlert.js
new file mode 100644
index 000000000..526d92bfb
--- /dev/null
+++ b/src/containers/Alerts/VendorCeditNotes/RefundVendorCreditDeleteAlert.js
@@ -0,0 +1,70 @@
+import React from 'react';
+import intl from 'react-intl-universal';
+import { FormattedMessage as T, FormattedHTMLMessage } from 'components';
+import { Intent, Alert } from '@blueprintjs/core';
+import { AppToaster } from 'components';
+import { useDeleteRefundVendorCredit } from 'hooks/query';
+
+import withAlertActions from 'containers/Alert/withAlertActions';
+import withAlertStoreConnect from 'containers/Alert/withAlertStoreConnect';
+
+import { compose } from 'utils';
+
+/**
+ * Refund Vendor transactions delete alert.
+ */
+function RefundVendorCreditDeleteAlert({
+ name,
+ // #withAlertStoreConnect
+ isOpen,
+ payload: { vendorCreditId },
+ // #withAlertActions
+ closeAlert,
+}) {
+ const { mutateAsync: deleteRefundVendorCreditMutate, isLoading } =
+ useDeleteRefundVendorCredit();
+
+ // Handle cancel delete.
+ const handleCancelAlert = () => {
+ closeAlert(name);
+ };
+
+ // Handle confirm delete .
+ const handleConfirmRefundVendorCreditDelete = () => {
+ deleteRefundVendorCreditMutate(vendorCreditId)
+ .then(() => {
+ AppToaster.show({
+ message: intl.get(
+ 'refund_vendor_credit_transactions.alert.delete_message',
+ ),
+ intent: Intent.SUCCESS,
+ });
+ closeAlert(name);
+ })
+ .catch(() => {});
+ };
+
+ return (
+ }
+ confirmButtonText={}
+ icon="trash"
+ intent={Intent.DANGER}
+ isOpen={isOpen}
+ onCancel={handleCancelAlert}
+ onConfirm={handleConfirmRefundVendorCreditDelete}
+ loading={isLoading}
+ >
+
+
+
+
+ );
+}
+
+export default compose(
+ withAlertStoreConnect(),
+ withAlertActions,
+)(RefundVendorCreditDeleteAlert);
diff --git a/src/containers/Drawers/CreditNoteDetailDrawer/CreditNoteDetail.js b/src/containers/Drawers/CreditNoteDetailDrawer/CreditNoteDetail.js
index 74f7e760b..3e992afda 100644
--- a/src/containers/Drawers/CreditNoteDetailDrawer/CreditNoteDetail.js
+++ b/src/containers/Drawers/CreditNoteDetailDrawer/CreditNoteDetail.js
@@ -4,6 +4,7 @@ import intl from 'react-intl-universal';
import { DrawerMainTabs } from 'components';
import CreditNoteDetailPanel from './CreditNoteDetailPanel';
+import RefundCreditNoteTransactionsTable from './RefundCreditNoteTransactions/RefundCreditNoteTransactionsTable';
import clsx from 'classnames';
import CreditNoteDetailCls from '../../../style/components/Drawers/CreditNoteDetails.module.scss';
@@ -20,6 +21,11 @@ export default function CreditNoteDetail() {
id={'details'}
panel={}
/>
+ }
+ />
);
diff --git a/src/containers/Drawers/CreditNoteDetailDrawer/CreditNoteDetailActionsBar.js b/src/containers/Drawers/CreditNoteDetailDrawer/CreditNoteDetailActionsBar.js
index a7b92ae21..b6e876638 100644
--- a/src/containers/Drawers/CreditNoteDetailDrawer/CreditNoteDetailActionsBar.js
+++ b/src/containers/Drawers/CreditNoteDetailDrawer/CreditNoteDetailActionsBar.js
@@ -42,6 +42,10 @@ function CreditNoteDetailActionsBar({
closeDrawer('credit-note-detail-drawer');
};
+ const handleRefundCreditNote = () => {
+ openDialog('refund-credit-note', { creditNoteId });
+ };
+
// Handle delete credit note.
const handleDeleteCreditNote = () => {
openAlert('credit-note-delete', { creditNoteId });
@@ -57,6 +61,15 @@ function CreditNoteDetailActionsBar({
onClick={handleEditCreditNote}
/>
+ }
+ text={'Refund'}
+ // text={}
+ onClick={handleRefundCreditNote}
+ />
+
+
}
diff --git a/src/containers/Drawers/CreditNoteDetailDrawer/CreditNoteDetailDrawerProvider.js b/src/containers/Drawers/CreditNoteDetailDrawer/CreditNoteDetailDrawerProvider.js
index 1b0673d8c..6dc49e32e 100644
--- a/src/containers/Drawers/CreditNoteDetailDrawer/CreditNoteDetailDrawerProvider.js
+++ b/src/containers/Drawers/CreditNoteDetailDrawer/CreditNoteDetailDrawerProvider.js
@@ -1,6 +1,6 @@
import React from 'react';
import intl from 'react-intl-universal';
-import { useCreditNote } from 'hooks/query';
+import { useCreditNote, useRefundCreditNote } from 'hooks/query';
import { DrawerHeaderContent, DrawerLoading } from 'components';
const CreditNoteDetailDrawerContext = React.createContext();
@@ -17,13 +17,25 @@ function CreditNoteDetailDrawerProvider({ creditNoteId, ...props }) {
},
);
+ // Handle fetch refund credit note.
+ const {
+ data: refundCreditNote,
+ isFetching: isRefundCreditNoteFetching,
+ isLoading: isRefundCreditNoteLoading,
+ } = useRefundCreditNote(creditNoteId, {
+ enabled: !!creditNoteId,
+ });
+
const provider = {
creditNote,
+ refundCreditNote,
+ isRefundCreditNoteLoading,
+ isRefundCreditNoteFetching,
creditNoteId,
};
return (
-
+
{
+ openAlert('refund-credit-delete', { creditNoteId: id });
+ };
+
+ return (
+
+
+
+ );
+}
+
+export default compose(withAlertsActions)(RefundCreditNoteTransactionsTable);
diff --git a/src/containers/Drawers/CreditNoteDetailDrawer/RefundCreditNoteTransactions/components.js b/src/containers/Drawers/CreditNoteDetailDrawer/RefundCreditNoteTransactions/components.js
new file mode 100644
index 000000000..1d3c12a93
--- /dev/null
+++ b/src/containers/Drawers/CreditNoteDetailDrawer/RefundCreditNoteTransactions/components.js
@@ -0,0 +1,59 @@
+import React from 'react';
+import { Intent, MenuItem, Menu } from '@blueprintjs/core';
+import intl from 'react-intl-universal';
+import { FormatDateCell, Icon } from 'components';
+import { safeCallback } from 'utils';
+
+/**
+ * Actions menu.
+ */
+export function ActionsMenu({ payload: { onDelete }, row: { original } }) {
+ return (
+
+ );
+}
+
+export function useRefundCreditTransactionsTableColumns() {
+ return React.useMemo(
+ () => [
+ {
+ Header: intl.get('date'),
+ accessor: 'date',
+ Cell: FormatDateCell,
+ width: 100,
+ className: 'date',
+ },
+ {
+ Header: intl.get('refund_credit_transactions.column.amount_refunded'),
+ accessor: 'amount',
+ width: 100,
+ className: 'amount',
+ align: 'right',
+ },
+ {
+ Header: intl.get(
+ 'refund_credit_transactions.column.withdrawal_account',
+ ),
+ accessor: ({ from_account }) => from_account.name,
+ width: 100,
+ className: 'from_account',
+ },
+ {
+ id: 'reference_no',
+ Header: intl.get('reference_no'),
+ accessor: 'reference_no',
+ width: 100,
+ className: 'reference_no',
+ textOverview: true,
+ },
+ ],
+ [],
+ );
+}
diff --git a/src/containers/Drawers/VendorCreditDetailDrawer/RefundVendorCreditTransactions/RefundVendorCreditTransactionsTable.js b/src/containers/Drawers/VendorCreditDetailDrawer/RefundVendorCreditTransactions/RefundVendorCreditTransactionsTable.js
new file mode 100644
index 000000000..4c924f531
--- /dev/null
+++ b/src/containers/Drawers/VendorCreditDetailDrawer/RefundVendorCreditTransactions/RefundVendorCreditTransactionsTable.js
@@ -0,0 +1,46 @@
+import React from 'react';
+import { DataTable, Card } from 'components';
+
+import 'style/pages/RefundVendorCredit/List.scss';
+
+import withAlertsActions from 'containers/Alert/withAlertActions';
+import { useVendorCreditDetailDrawerContext } from '../VendorCreditDetailDrawerProvider';
+import {
+ useRefundCreditTransactionsTableColumns,
+ ActionsMenu,
+} from './components';
+
+import { compose } from 'utils';
+
+/**
+ * Refund vendor transactions table.
+ */
+function RefundVendorCreditTransactionsTable({
+ // #withAlertsActions
+ openAlert,
+}) {
+ const { refundVendorCredit } = useVendorCreditDetailDrawerContext();
+
+ const columns = useRefundCreditTransactionsTableColumns();
+
+ // Handle delete refund vendor credit.
+ const handleDeleteRefundVendorCredit = ({ id }) => {
+ openAlert('refund-vendor-delete', { vendorCreditId: id });
+ };
+
+ return (
+
+
+
+ );
+}
+
+export default compose(withAlertsActions)(RefundVendorCreditTransactionsTable);
diff --git a/src/containers/Drawers/VendorCreditDetailDrawer/RefundVendorCreditTransactions/components.js b/src/containers/Drawers/VendorCreditDetailDrawer/RefundVendorCreditTransactions/components.js
new file mode 100644
index 000000000..2eb0dc9d2
--- /dev/null
+++ b/src/containers/Drawers/VendorCreditDetailDrawer/RefundVendorCreditTransactions/components.js
@@ -0,0 +1,57 @@
+import React from 'react';
+import intl from 'react-intl-universal';
+import { Intent, MenuItem, Menu } from '@blueprintjs/core';
+import { FormatDateCell, Icon } from 'components';
+import { safeCallback } from 'utils';
+
+/**
+ * Actions menu.
+ */
+export function ActionsMenu({ payload: { onDelete }, row: { original } }) {
+ return (
+
+ );
+}
+
+export function useRefundCreditTransactionsTableColumns() {
+ return React.useMemo(
+ () => [
+ {
+ Header: intl.get('date'),
+ accessor: 'date',
+ Cell: FormatDateCell,
+ width: 100,
+ className: 'date',
+ },
+ {
+ Header: intl.get('refund_vendor_credit.column.amount'),
+ accessor: 'amount',
+ width: 100,
+ className: 'amount',
+ align: 'right',
+ },
+ {
+ Header: intl.get('refund_vendor_credit.column.withdrawal_account'),
+ accessor: ({ from_account }) => from_account.name,
+ width: 100,
+ className: 'from_account',
+ },
+ {
+ id: 'reference_no',
+ Header: intl.get('reference_no'),
+ accessor: 'reference_no',
+ width: 100,
+ className: 'reference_no',
+ textOverview: true,
+ },
+ ],
+ [],
+ );
+}
diff --git a/src/containers/Drawers/VendorCreditDetailDrawer/VendorCreditDetail.js b/src/containers/Drawers/VendorCreditDetailDrawer/VendorCreditDetail.js
index e603c667f..cbc825676 100644
--- a/src/containers/Drawers/VendorCreditDetailDrawer/VendorCreditDetail.js
+++ b/src/containers/Drawers/VendorCreditDetailDrawer/VendorCreditDetail.js
@@ -4,6 +4,7 @@ import intl from 'react-intl-universal';
import { DrawerMainTabs } from 'components';
import VendorCreditDetailPanel from './VendorCreditDetailPanel';
+import RefundVendorCreditTransactionsTable from './RefundVendorCreditTransactions/RefundVendorCreditTransactionsTable';
import clsx from 'classnames';
import VendorCreditDetailCls from '../../../style/components/Drawers/VendorCreditDetail.module.scss';
@@ -20,6 +21,11 @@ export default function VendorCreditDetail() {
id={'details'}
panel={}
/>
+ }
+ />
);
diff --git a/src/containers/Drawers/VendorCreditDetailDrawer/VendorCreditDetailActionsBar.js b/src/containers/Drawers/VendorCreditDetailDrawer/VendorCreditDetailActionsBar.js
index 9c720ea52..d2cfdead2 100644
--- a/src/containers/Drawers/VendorCreditDetailDrawer/VendorCreditDetailActionsBar.js
+++ b/src/containers/Drawers/VendorCreditDetailDrawer/VendorCreditDetailActionsBar.js
@@ -42,6 +42,9 @@ function VendorCreditDetailActionsBar({
closeDrawer('vendor-credit-detail-drawer');
};
+ const handleRefundVendorCredit = () => {
+ openDialog('refund-vendor-credit', { vendorCreditId });
+ };
// Handle delete credit note.
const handleDeleteVendorCredit = () => {
openAlert('vendor-credit-delete', { vendorCreditId });
@@ -57,6 +60,14 @@ function VendorCreditDetailActionsBar({
onClick={handleEditVendorCredit}
/>
+ }
+ text={'Refund'}
+ // text={}
+ onClick={handleRefundVendorCredit}
+ />
+
}
diff --git a/src/containers/Drawers/VendorCreditDetailDrawer/VendorCreditDetailDrawerProvider.js b/src/containers/Drawers/VendorCreditDetailDrawer/VendorCreditDetailDrawerProvider.js
index 74236d87c..eb15c6d20 100644
--- a/src/containers/Drawers/VendorCreditDetailDrawer/VendorCreditDetailDrawerProvider.js
+++ b/src/containers/Drawers/VendorCreditDetailDrawer/VendorCreditDetailDrawerProvider.js
@@ -1,6 +1,6 @@
import React from 'react';
import intl from 'react-intl-universal';
-import { useVendorCredit } from 'hooks/query';
+import { useVendorCredit, useRefundVendorCredit } from 'hooks/query';
import { DrawerHeaderContent, DrawerLoading } from 'components';
const VendorCreditDetailDrawerContext = React.createContext();
@@ -15,13 +15,27 @@ function VendorCreditDetailDrawerProvider({ vendorCreditId, ...props }) {
enabled: !!vendorCreditId,
});
+ // Handle fetch refund credit note.
+ const {
+ data: refundVendorCredit,
+ isFetching: isRefundVendorCreditFetching,
+ isLoading: isRefundVendorCreditLoading,
+ } = useRefundVendorCredit(vendorCreditId, {
+ enabled: !!vendorCreditId,
+ });
+
const provider = {
vendorCredit,
+ refundVendorCredit,
+ isRefundVendorCreditLoading,
+ isRefundVendorCreditFetching,
vendorCreditId,
};
return (
-
+
{
+ openDialog('refund-vendor-credit', { vendorCreditId: id });
+ };
+
return (
@@ -129,6 +138,7 @@ export default compose(
withVendorsCreditNotesActions,
withAlertsActions,
withDrawerActions,
+ withDialogActions,
withSettings(({ vendorsCreditNoteSetting }) => ({
creditNoteTableSize: vendorsCreditNoteSetting?.tableSize,
})),
diff --git a/src/containers/Purchases/CreditNotes/CreditNotesLanding/components.js b/src/containers/Purchases/CreditNotes/CreditNotesLanding/components.js
index 20f182f2d..fd4f4adb0 100644
--- a/src/containers/Purchases/CreditNotes/CreditNotesLanding/components.js
+++ b/src/containers/Purchases/CreditNotes/CreditNotesLanding/components.js
@@ -25,7 +25,7 @@ import { formattedAmount, safeCallback, calculateStatus } from 'utils';
* Actions menu.
*/
export function ActionsMenu({
- payload: { onEdit, onDelete, onViewDetails },
+ payload: { onEdit, onDelete, onRefund, onViewDetails },
row: { original },
}) {
return (
@@ -41,6 +41,11 @@ export function ActionsMenu({
text={intl.get('vendor_credits.action.edit_vendor_credit')}
onClick={safeCallback(onEdit, original)}
/>
+ }
+ text={intl.get('vendor_credits.action.refund_vendor_credit')}
+ onClick={safeCallback(onRefund, original)}
+ />