From 10f0d47b549402d2ffc72b01efed9c3681bc6df8 Mon Sep 17 00:00:00 2001 From: elforjani13 <39470382+elforjani13@users.noreply.github.com> Date: Sun, 26 Dec 2021 13:22:27 +0200 Subject: [PATCH 1/9] fix: BIG-145 rename product/service to product. --- src/containers/Drawers/InventoryAdjustmentDetailDrawer/utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/containers/Drawers/InventoryAdjustmentDetailDrawer/utils.js b/src/containers/Drawers/InventoryAdjustmentDetailDrawer/utils.js index e30135d69..56bd7501a 100644 --- a/src/containers/Drawers/InventoryAdjustmentDetailDrawer/utils.js +++ b/src/containers/Drawers/InventoryAdjustmentDetailDrawer/utils.js @@ -5,7 +5,7 @@ export const useInventoryAdjustmentEntriesColumns = () => React.useMemo( () => [ { - Header: intl.get('product_and_service'), + Header: intl.get('inventory_adjustment.column.product'), accessor: 'item.name', width: 150, className: 'name', From f9a7306e47a1ae04f6c98f6a94563dd1d6c2f202 Mon Sep 17 00:00:00 2001 From: elforjani13 <39470382+elforjani13@users.noreply.github.com> Date: Sun, 26 Dec 2021 13:24:38 +0200 Subject: [PATCH 2/9] feat: add convert to credit note. --- .../CreditNoteForm/CreditNoteForm.js | 2 ++ .../CreditNoteForm/CreditNoteFormProvider.js | 28 +++++++++++++---- .../InvoicesLanding/InvoicesDataTable.js | 6 ++++ .../Invoices/InvoicesLanding/components.js | 7 ++++- src/routes/dashboard.js | 30 +++++++++++++++++++ 5 files changed, 67 insertions(+), 6 deletions(-) diff --git a/src/containers/Sales/CreditNotes/CreditNoteForm/CreditNoteForm.js b/src/containers/Sales/CreditNotes/CreditNoteForm/CreditNoteForm.js index 25a636aa0..c27023426 100644 --- a/src/containers/Sales/CreditNotes/CreditNoteForm/CreditNoteForm.js +++ b/src/containers/Sales/CreditNotes/CreditNoteForm/CreditNoteForm.js @@ -56,6 +56,7 @@ function CreditNoteForm({ isNewMode, submitPayload, creditNote, + newCreditNote, createCreditNoteMutate, editCreditNoteMutate, } = useCreditNoteFormContext(); @@ -74,6 +75,7 @@ function CreditNoteForm({ credit_note_number: creditNumber, }), entries: orderingLinesIndexes(defaultCreditNote.entries), + ...newCreditNote, }), }), [], diff --git a/src/containers/Sales/CreditNotes/CreditNoteForm/CreditNoteFormProvider.js b/src/containers/Sales/CreditNotes/CreditNoteForm/CreditNoteFormProvider.js index 569bd27cc..539747020 100644 --- a/src/containers/Sales/CreditNotes/CreditNoteForm/CreditNoteFormProvider.js +++ b/src/containers/Sales/CreditNotes/CreditNoteForm/CreditNoteFormProvider.js @@ -11,6 +11,7 @@ import { useItems, useCustomers, useSettingsCreditNotes, + useInvoice, } from 'hooks/query'; const CreditNoteFormContext = React.createContext(); @@ -19,6 +20,9 @@ const CreditNoteFormContext = React.createContext(); * Credit note data provider. */ function CreditNoteFormProvider({ creditNoteId, ...props }) { + const { state } = useLocation(); + const invoiceId = state?.invoiceId; + // Handle fetch customers data table or list const { data: { customers }, @@ -33,13 +37,17 @@ function CreditNoteFormProvider({ creditNoteId, ...props }) { page_size: 10000, }); - // Handle fetch vendor credit details. + // Handle fetch credit details. const { data: creditNote, isLoading: isCreditNoteLoading } = useCreditNote( creditNoteId, { enabled: !!creditNoteId, }, ); + // Handle fetch invoice detail. + const { data: invoice, isLoading: isInvoiceLoading } = useInvoice(invoiceId, { + enabled: !!invoiceId, + }); // Handle fetching settings. useSettingsCreditNotes(); @@ -54,6 +62,12 @@ function CreditNoteFormProvider({ creditNoteId, ...props }) { // Determines whether the form in new mode. const isNewMode = !creditNoteId; + const newCreditNote = !isEmpty(invoice) + ? transformToEditForm({ + ...pick(invoice, ['customer_id', 'entries']), + }) + : []; + // Provider payload. const provider = { items, @@ -61,6 +75,7 @@ function CreditNoteFormProvider({ creditNoteId, ...props }) { creditNote, submitPayload, isNewMode, + newCreditNote, isItemsLoading, isCustomersLoading, @@ -70,11 +85,14 @@ function CreditNoteFormProvider({ creditNoteId, ...props }) { setSubmitPayload, }; + const isLoading = + isItemsLoading || + isCustomersLoading || + isCreditNoteLoading || + isInvoiceLoading; + return ( - + ); diff --git a/src/containers/Sales/Invoices/InvoicesLanding/InvoicesDataTable.js b/src/containers/Sales/Invoices/InvoicesLanding/InvoicesDataTable.js index 501618392..a143c6a10 100644 --- a/src/containers/Sales/Invoices/InvoicesLanding/InvoicesDataTable.js +++ b/src/containers/Sales/Invoices/InvoicesLanding/InvoicesDataTable.js @@ -74,6 +74,11 @@ function InvoicesDataTable({ history.push(`/invoices/${invoice.id}/edit`); }; + // Handle convert to credit note. + const handleConvertToCreitNote = ({ id }) => { + history.push(`/credit-notes/new?from_invoice_id=${id}`, { invoiceId: id }); + }; + // handle quick payment receive. const handleQuickPaymentReceive = ({ id }) => { openDialog('quick-payment-receive', { invoiceId: id }); @@ -147,6 +152,7 @@ function InvoicesDataTable({ onQuick: handleQuickPaymentReceive, onViewDetails: handleViewDetailInvoice, onPrint: handlePrintInvoice, + onConvert: handleConvertToCreitNote, }} /> diff --git a/src/containers/Sales/Invoices/InvoicesLanding/components.js b/src/containers/Sales/Invoices/InvoicesLanding/components.js index 89dc752cc..9fb628a99 100644 --- a/src/containers/Sales/Invoices/InvoicesLanding/components.js +++ b/src/containers/Sales/Invoices/InvoicesLanding/components.js @@ -124,7 +124,7 @@ export function ActionsMenu({ onEdit, onDeliver, onDelete, - onDrawer, + onConvert, onQuick, onViewDetails, onPrint, @@ -145,6 +145,11 @@ export function ActionsMenu({ text={intl.get('edit_invoice')} onClick={safeCallback(onEdit, original)} /> + } + text={intl.get('convert_to_credit_note')} + onClick={safeCallback(onConvert, original)} + /> [ defaultSearchResource: RESOURCES_TYPES.CREDIT_NOTE, subscriptionActive: [SUBSCRIPTION_TYPE.MAIN], }, + { + path: `/credit-notes/new/?from_invoice_id=/:id`, + component: lazy(() => + import( + '../containers/Sales/CreditNotes/CreditNoteForm/CreditNoteFormPage' + ), + ), + name: 'credit-note-new', + breadcrumb: intl.get('credit_note.label.new_credit_note'), + backLink: true, + sidebarExpand: false, + pageTitle: intl.get('credit_note.label.new_credit_note'), + defaultSearchResource: RESOURCES_TYPES.CREDIT_NOTE, + subscriptionActive: [SUBSCRIPTION_TYPE.MAIN], + }, { path: '/credit-notes/new', component: lazy(() => @@ -773,6 +788,21 @@ export const getDashboardRoutes = () => [ defaultSearchResource: RESOURCES_TYPES.VENDOR_CREDIT, subscriptionActive: [SUBSCRIPTION_TYPE.MAIN], }, + { + path: '/vendor-credits/new/?from_bill_id=/:id', + component: lazy(() => + import( + 'containers/Purchases/CreditNotes/CreditNoteForm/VendorCreditNoteFormPage' + ), + ), + name: 'vendor-credits-new', + backLink: true, + sidebarExpand: false, + breadcrumb: intl.get('vendor_credits.label.new_vendor_credit'), + pageTitle: intl.get('vendor_credits.label.new_vendor_credit'), + defaultSearchResource: RESOURCES_TYPES.VENDOR_CREDIT, + subscriptionActive: [SUBSCRIPTION_TYPE.MAIN], + }, { path: '/vendor-credits/new', component: lazy(() => From 93aa60124bf55753348d3835f0e1e2896f2b7824 Mon Sep 17 00:00:00 2001 From: elforjani13 <39470382+elforjani13@users.noreply.github.com> Date: Sun, 26 Dec 2021 13:25:07 +0200 Subject: [PATCH 3/9] feat: add convert to vendor credit. --- .../Purchases/Bills/BillsLanding/BillsTable.js | 6 ++++++ .../Purchases/Bills/BillsLanding/components.js | 6 ++++++ .../CreditNoteForm/VendorCreditNoteForm.js | 6 +++++- .../VendorCreditNoteFormProvider.js | 18 ++++++++++++++++-- 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/containers/Purchases/Bills/BillsLanding/BillsTable.js b/src/containers/Purchases/Bills/BillsLanding/BillsTable.js index f2a2ef353..151e14603 100644 --- a/src/containers/Purchases/Bills/BillsLanding/BillsTable.js +++ b/src/containers/Purchases/Bills/BillsLanding/BillsTable.js @@ -70,6 +70,11 @@ function BillsDataTable({ history.push(`/bills/${bill.id}/edit`); }; + // Handle convert to vendor credit. + const handleConvertToVendorCredit = ({ id }) => { + history.push(`/vendor-credits/new?from_bill_id=${id}`, { billId: id }); + }; + // Handle bill delete action. const handleDeleteBill = (bill) => { openAlert('bill-delete', { billId: bill.id }); @@ -137,6 +142,7 @@ function BillsDataTable({ onQuick: handleQuickPaymentMade, onAllocateLandedCost: handleAllocateLandedCost, onViewDetails: handleViewDetailBill, + onConvert: handleConvertToVendorCredit, }} /> diff --git a/src/containers/Purchases/Bills/BillsLanding/components.js b/src/containers/Purchases/Bills/BillsLanding/components.js index 289815252..86427d54a 100644 --- a/src/containers/Purchases/Bills/BillsLanding/components.js +++ b/src/containers/Purchases/Bills/BillsLanding/components.js @@ -34,6 +34,7 @@ export function ActionsMenu({ onOpen, onDelete, onQuick, + onConvert, onViewDetails, onAllocateLandedCost, }, @@ -53,6 +54,11 @@ export function ActionsMenu({ text={intl.get('edit_bill')} onClick={safeCallback(onEdit, original)} /> + } + text={intl.get('convert_to_vendor_credit')} + onClick={safeCallback(onConvert, original)} + /> From a075b998d34c7dd004c2c444511b1c2625849d65 Mon Sep 17 00:00:00 2001 From: elforjani13 <39470382+elforjani13@users.noreply.github.com> Date: Sun, 26 Dec 2021 13:25:52 +0200 Subject: [PATCH 4/9] feat: estimate detail footer. --- .../EstimateDetailFooter.js | 50 ++++++++----------- .../EstimateDetailPanel.js | 3 ++ .../EstimateDetailTableFooter.js | 43 ++++++++++++++++ 3 files changed, 67 insertions(+), 29 deletions(-) create mode 100644 src/containers/Drawers/EstimateDetailDrawer/EstimateDetailTableFooter.js diff --git a/src/containers/Drawers/EstimateDetailDrawer/EstimateDetailFooter.js b/src/containers/Drawers/EstimateDetailDrawer/EstimateDetailFooter.js index cc5b2f01a..c97691e78 100644 --- a/src/containers/Drawers/EstimateDetailDrawer/EstimateDetailFooter.js +++ b/src/containers/Drawers/EstimateDetailDrawer/EstimateDetailFooter.js @@ -1,43 +1,35 @@ import React from 'react'; -import styled from 'styled-components'; import { + CommercialDocFooter, T, - TotalLines, - TotalLine, - TotalLineBorderStyle, - TotalLineTextStyle, - FormatNumber, + If, + DetailsMenu, + DetailItem, } from 'components'; import { useEstimateDetailDrawerContext } from './EstimateDetailDrawerProvider'; /** - * Estimate details panel footer content. + * Estimate details footer. + * @returns {React.JSX} */ export default function EstimateDetailFooter() { const { estimate } = useEstimateDetailDrawerContext(); - + return ( - - - } - value={} - borderStyle={TotalLineBorderStyle.SingleDark} - /> - } - value={estimate.formatted_amount} - borderStyle={TotalLineBorderStyle.DoubleDark} - textStyle={TotalLineTextStyle.Bold} - /> - - + + + + }> + {estimate.terms_conditions} + + + + }> + {estimate.note} + + + + ); } - -export const EstimateDetailsFooterRoot = styled.div``; - -export const EstimateTotalLines = styled(TotalLines)` - margin-left: auto; -`; diff --git a/src/containers/Drawers/EstimateDetailDrawer/EstimateDetailPanel.js b/src/containers/Drawers/EstimateDetailDrawer/EstimateDetailPanel.js index a2ed72a4d..def91b3d6 100644 --- a/src/containers/Drawers/EstimateDetailDrawer/EstimateDetailPanel.js +++ b/src/containers/Drawers/EstimateDetailDrawer/EstimateDetailPanel.js @@ -4,13 +4,16 @@ import { CommercialDocBox } from 'components'; import EstimateDetailHeader from './EstimateDetailHeader'; import EstimateDetailTable from './EstimateDetailTable'; +import EstimateDetailTableFooter from './EstimateDetailTableFooter'; import EstimateDetailFooter from './EstimateDetailFooter'; + export default function EstimateDetailTab() { return ( + ); diff --git a/src/containers/Drawers/EstimateDetailDrawer/EstimateDetailTableFooter.js b/src/containers/Drawers/EstimateDetailDrawer/EstimateDetailTableFooter.js new file mode 100644 index 000000000..38c877917 --- /dev/null +++ b/src/containers/Drawers/EstimateDetailDrawer/EstimateDetailTableFooter.js @@ -0,0 +1,43 @@ +import React from 'react'; +import styled from 'styled-components'; + +import { + T, + TotalLines, + TotalLine, + TotalLineBorderStyle, + TotalLineTextStyle, + FormatNumber, +} from 'components'; +import { useEstimateDetailDrawerContext } from './EstimateDetailDrawerProvider'; + +/** + * Estimate details panel footer content. + */ +export default function EstimateDetailTableFooter() { + const { estimate } = useEstimateDetailDrawerContext(); + + return ( + + + } + value={} + borderStyle={TotalLineBorderStyle.SingleDark} + /> + } + value={estimate.formatted_amount} + borderStyle={TotalLineBorderStyle.DoubleDark} + textStyle={TotalLineTextStyle.Bold} + /> + + + ); +} + +export const EstimateDetailsFooterRoot = styled.div``; + +export const EstimateTotalLines = styled(TotalLines)` + margin-left: auto; +`; From 8ea92513fec800012c71a808b6ed0f0de7c5787a Mon Sep 17 00:00:00 2001 From: elforjani13 <39470382+elforjani13@users.noreply.github.com> Date: Sun, 26 Dec 2021 13:26:10 +0200 Subject: [PATCH 5/9] feat: receipt detail footer. --- .../ReceiptDetailFooter.js | 60 +++++++------------ .../ReceiptDetailDrawer/ReceiptDetailTab.js | 4 +- .../ReceiptDetailTableFooter.js | 51 ++++++++++++++++ 3 files changed, 76 insertions(+), 39 deletions(-) create mode 100644 src/containers/Drawers/ReceiptDetailDrawer/ReceiptDetailTableFooter.js diff --git a/src/containers/Drawers/ReceiptDetailDrawer/ReceiptDetailFooter.js b/src/containers/Drawers/ReceiptDetailDrawer/ReceiptDetailFooter.js index d721337af..31d214119 100644 --- a/src/containers/Drawers/ReceiptDetailDrawer/ReceiptDetailFooter.js +++ b/src/containers/Drawers/ReceiptDetailDrawer/ReceiptDetailFooter.js @@ -1,51 +1,35 @@ import React from 'react'; -import styled from 'styled-components'; - import { + CommercialDocFooter, T, - TotalLines, - TotalLine, - TotalLineBorderStyle, - TotalLineTextStyle, - FormatNumber, + If, + DetailsMenu, + DetailItem, } from 'components'; + import { useReceiptDetailDrawerContext } from './ReceiptDetailDrawerProvider'; /** - * Receipts read-only details footer. + * Receipt details footer + * @returns {React.JSX} */ -export function ReceiptDetailFooter() { +export default function ReceiptDetailFooter() { const { receipt } = useReceiptDetailDrawerContext(); return ( - - - } - value={} - /> - } - value={receipt.formatted_amount} - borderStyle={TotalLineBorderStyle.DoubleDark} - textStyle={TotalLineTextStyle.Bold} - /> - } - value={receipt.formatted_amount} - borderStyle={TotalLineBorderStyle.DoubleDark} - /> - } - value={'0'} - /> - - + + + + }> + {receipt.statement} + + + + }> + {receipt.receipt_message} + + + + ); } - -export const ReceiptDetailsFooterRoot = styled.div``; - -export const ReceiptTotalLines = styled(TotalLines)` - margin-left: auto; -`; diff --git a/src/containers/Drawers/ReceiptDetailDrawer/ReceiptDetailTab.js b/src/containers/Drawers/ReceiptDetailDrawer/ReceiptDetailTab.js index 5529e89ed..c594f5285 100644 --- a/src/containers/Drawers/ReceiptDetailDrawer/ReceiptDetailTab.js +++ b/src/containers/Drawers/ReceiptDetailDrawer/ReceiptDetailTab.js @@ -5,7 +5,8 @@ import { CommercialDocBox } from 'components'; import ReceiptDetailHeader from './ReceiptDetailHeader'; import ReceiptDetailTable from './ReceiptDetailTable'; -import { ReceiptDetailFooter } from './ReceiptDetailFooter'; +import ReceiptDetailTableFooter from './ReceiptDetailTableFooter'; +import ReceiptDetailFooter from './ReceiptDetailFooter'; export default function ReceiptDetailTab() { return ( @@ -13,6 +14,7 @@ export default function ReceiptDetailTab() { + diff --git a/src/containers/Drawers/ReceiptDetailDrawer/ReceiptDetailTableFooter.js b/src/containers/Drawers/ReceiptDetailDrawer/ReceiptDetailTableFooter.js new file mode 100644 index 000000000..370221e9a --- /dev/null +++ b/src/containers/Drawers/ReceiptDetailDrawer/ReceiptDetailTableFooter.js @@ -0,0 +1,51 @@ +import React from 'react'; +import styled from 'styled-components'; + +import { + T, + TotalLines, + TotalLine, + TotalLineBorderStyle, + TotalLineTextStyle, + FormatNumber, +} from 'components'; +import { useReceiptDetailDrawerContext } from './ReceiptDetailDrawerProvider'; + +/** + * Receipts read-only details table footer. + */ +export default function ReceiptDetailTableFooter() { + const { receipt } = useReceiptDetailDrawerContext(); + + return ( + + + } + value={} + /> + } + value={receipt.formatted_amount} + borderStyle={TotalLineBorderStyle.DoubleDark} + textStyle={TotalLineTextStyle.Bold} + /> + } + value={receipt.formatted_amount} + borderStyle={TotalLineBorderStyle.DoubleDark} + /> + } + value={'0'} + /> + + + ); +} + +export const ReceiptDetailsFooterRoot = styled.div``; + +export const ReceiptTotalLines = styled(TotalLines)` + margin-left: auto; +`; From 4a42fa4edcb183686bbb18d07c910565e53d0e7f Mon Sep 17 00:00:00 2001 From: elforjani13 <39470382+elforjani13@users.noreply.github.com> Date: Sun, 26 Dec 2021 13:26:53 +0200 Subject: [PATCH 6/9] feat: credit note detail footer. --- .../CreditNoteDetailFooter.js | 29 +++++++++++++++++++ .../CreditNoteDetailPanel.js | 6 ++-- ...oter.js => CreditNoteDetailTableFooter.js} | 2 +- 3 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 src/containers/Drawers/CreditNoteDetailDrawer/CreditNoteDetailFooter.js rename src/containers/Drawers/CreditNoteDetailDrawer/{CreditNoteDetailDrawerFooter.js => CreditNoteDetailTableFooter.js} (95%) diff --git a/src/containers/Drawers/CreditNoteDetailDrawer/CreditNoteDetailFooter.js b/src/containers/Drawers/CreditNoteDetailDrawer/CreditNoteDetailFooter.js new file mode 100644 index 000000000..1bcea07e5 --- /dev/null +++ b/src/containers/Drawers/CreditNoteDetailDrawer/CreditNoteDetailFooter.js @@ -0,0 +1,29 @@ +import React from 'react'; +import { + CommercialDocFooter, + T, + If, + DetailsMenu, + DetailItem, +} from 'components'; + +import { useCreditNoteDetailDrawerContext } from './CreditNoteDetailDrawerProvider'; + +/** + * Credit note detail footer + * @returns {React.JSX} + */ +export default function CreditNoteDetailFooter() { + const { creditNote } = useCreditNoteDetailDrawerContext(); + return ( + + + + }> + {creditNote.terms_conditions} + + + + + ); +} diff --git a/src/containers/Drawers/CreditNoteDetailDrawer/CreditNoteDetailPanel.js b/src/containers/Drawers/CreditNoteDetailDrawer/CreditNoteDetailPanel.js index e29f36c41..00be70f26 100644 --- a/src/containers/Drawers/CreditNoteDetailDrawer/CreditNoteDetailPanel.js +++ b/src/containers/Drawers/CreditNoteDetailDrawer/CreditNoteDetailPanel.js @@ -4,7 +4,8 @@ import { CommercialDocBox } from 'components'; import CreditNoteDetailHeader from './CreditNoteDetailHeader'; import CreditNoteDetailTable from './CreditNoteDetailTable'; -import CreditNoteDetailDrawerFooter from './CreditNoteDetailDrawerFooter'; +import CreditNoteDetailTableFooter from './CreditNoteDetailTableFooter'; +import CreditNoteDetailFooter from './CreditNoteDetailFooter'; /** * Credit note details panel. @@ -14,7 +15,8 @@ export default function CreditNoteDetailPanel() { - + + ); } diff --git a/src/containers/Drawers/CreditNoteDetailDrawer/CreditNoteDetailDrawerFooter.js b/src/containers/Drawers/CreditNoteDetailDrawer/CreditNoteDetailTableFooter.js similarity index 95% rename from src/containers/Drawers/CreditNoteDetailDrawer/CreditNoteDetailDrawerFooter.js rename to src/containers/Drawers/CreditNoteDetailDrawer/CreditNoteDetailTableFooter.js index bb12bccc3..ee39586ef 100644 --- a/src/containers/Drawers/CreditNoteDetailDrawer/CreditNoteDetailDrawerFooter.js +++ b/src/containers/Drawers/CreditNoteDetailDrawer/CreditNoteDetailTableFooter.js @@ -14,7 +14,7 @@ import { useCreditNoteDetailDrawerContext } from './CreditNoteDetailDrawerProvid /** * Credit note details panel footer. */ -export default function CreditNoteDetailDrawerFooter() { +export default function CreditNoteDetailTableFooter() { const { creditNote } = useCreditNoteDetailDrawerContext(); return ( From 80d86b01decdc7f83bde311e046e0d9d08b08209 Mon Sep 17 00:00:00 2001 From: elforjani13 <39470382+elforjani13@users.noreply.github.com> Date: Sun, 26 Dec 2021 13:28:25 +0200 Subject: [PATCH 7/9] feat: add payment receive & bill detail footer. --- .../Drawers/BillDrawer/BillDetailFooter.js | 56 ++++++------------- .../Drawers/BillDrawer/BillDetailTab.js | 5 +- .../BillDrawer/BillDetailTableFooter.js | 51 +++++++++++++++++ .../PaymentReceiveDetailFooter.js | 44 +++++---------- .../PaymentReceiveDetailTab.js | 2 + .../PaymentReceiveDetailTableFooter.js | 46 +++++++++++++++ src/lang/ar/index.json | 3 +- src/lang/en/index.json | 10 +++- 8 files changed, 143 insertions(+), 74 deletions(-) create mode 100644 src/containers/Drawers/BillDrawer/BillDetailTableFooter.js create mode 100644 src/containers/Drawers/PaymentReceiveDetailDrawer/PaymentReceiveDetailTableFooter.js diff --git a/src/containers/Drawers/BillDrawer/BillDetailFooter.js b/src/containers/Drawers/BillDrawer/BillDetailFooter.js index 43b7bebde..c5d411cb1 100644 --- a/src/containers/Drawers/BillDrawer/BillDetailFooter.js +++ b/src/containers/Drawers/BillDrawer/BillDetailFooter.js @@ -1,51 +1,27 @@ import React from 'react'; -import styled from 'styled-components'; - import { - TotalLineBorderStyle, - TotalLineTextStyle, - FormatNumber, + CommercialDocFooter, T, - TotalLines, - TotalLine, -} from '../../../components'; + If, + DetailsMenu, + DetailItem, +} from 'components'; + import { useBillDrawerContext } from './BillDrawerProvider'; /** - * Bill read-only details footer. + * Bill detail footer. + * @returns {React.JSX} */ -export function BillDetailFooter() { +export default function BillDetailFooter() { const { bill } = useBillDrawerContext(); - return ( - - - } - value={} - borderStyle={TotalLineBorderStyle.SingleDark} - /> - } - value={bill.formatted_amount} - borderStyle={TotalLineBorderStyle.DoubleDark} - textStyle={TotalLineTextStyle.Bold} - /> - } - value={bill.formatted_payment_amount} - /> - } - value={bill.formatted_due_amount} - /> - - + + + + }>{bill.note} + + + ); } - -export const BillDetailsFooterRoot = styled.div``; - -export const BillTotalLines = styled(TotalLines)` - margin-left: auto; -`; diff --git a/src/containers/Drawers/BillDrawer/BillDetailTab.js b/src/containers/Drawers/BillDrawer/BillDetailTab.js index 86fcd6571..fd238d216 100644 --- a/src/containers/Drawers/BillDrawer/BillDetailTab.js +++ b/src/containers/Drawers/BillDrawer/BillDetailTab.js @@ -4,8 +4,8 @@ import { CommercialDocBox } from 'components'; import BillDetailHeader from './BillDetailHeader'; import BillDetailTable from './BillDetailTable'; -import { BillDetailFooter } from './BillDetailFooter'; - +import { BillDetailTableFooter } from './BillDetailTableFooter'; +import BillDetailFooter from './BillDetailFooter'; /** * Bill detail panel tab. @@ -15,6 +15,7 @@ export default function BillDetailTab() { + ); diff --git a/src/containers/Drawers/BillDrawer/BillDetailTableFooter.js b/src/containers/Drawers/BillDrawer/BillDetailTableFooter.js new file mode 100644 index 000000000..d55edc514 --- /dev/null +++ b/src/containers/Drawers/BillDrawer/BillDetailTableFooter.js @@ -0,0 +1,51 @@ +import React from 'react'; +import styled from 'styled-components'; + +import { + TotalLineBorderStyle, + TotalLineTextStyle, + FormatNumber, + T, + TotalLines, + TotalLine, +} from '../../../components'; +import { useBillDrawerContext } from './BillDrawerProvider'; + +/** + * Bill read-only details table footer. + */ +export function BillDetailTableFooter() { + const { bill } = useBillDrawerContext(); + + return ( + + + } + value={} + borderStyle={TotalLineBorderStyle.SingleDark} + /> + } + value={bill.formatted_amount} + borderStyle={TotalLineBorderStyle.DoubleDark} + textStyle={TotalLineTextStyle.Bold} + /> + } + value={bill.formatted_payment_amount} + /> + } + value={bill.formatted_due_amount} + /> + + + ); +} + +export const BillDetailsFooterRoot = styled.div``; + +export const BillTotalLines = styled(TotalLines)` + margin-left: auto; +`; diff --git a/src/containers/Drawers/PaymentReceiveDetailDrawer/PaymentReceiveDetailFooter.js b/src/containers/Drawers/PaymentReceiveDetailDrawer/PaymentReceiveDetailFooter.js index 45876042b..6f4f37199 100644 --- a/src/containers/Drawers/PaymentReceiveDetailDrawer/PaymentReceiveDetailFooter.js +++ b/src/containers/Drawers/PaymentReceiveDetailDrawer/PaymentReceiveDetailFooter.js @@ -1,13 +1,11 @@ import React from 'react'; -import styled from 'styled-components'; import { - FormatNumber, - TotalLineTextStyle, - TotalLineBorderStyle, + CommercialDocFooter, T, - TotalLine, - TotalLines, + If, + DetailsMenu, + DetailItem, } from 'components'; import { usePaymentReceiveDetailContext } from './PaymentReceiveDetailProvider'; @@ -17,30 +15,16 @@ import { usePaymentReceiveDetailContext } from './PaymentReceiveDetailProvider'; */ export default function PaymentReceiveDetailFooter() { const { paymentReceive } = usePaymentReceiveDetailContext(); - + return ( - - - } - value={} - /> - } - value={paymentReceive.formatted_amount} - borderStyle={TotalLineBorderStyle.DoubleDark} - textStyle={TotalLineTextStyle.Bold} - /> - - + + + + }> + {paymentReceive.statement} + + + + ); } - -export const PaymentReceiveDetailsFooterRoot = styled.div``; - -export const PaymentReceiveTotalLines = styled(TotalLines)` - margin-left: auto; -`; diff --git a/src/containers/Drawers/PaymentReceiveDetailDrawer/PaymentReceiveDetailTab.js b/src/containers/Drawers/PaymentReceiveDetailDrawer/PaymentReceiveDetailTab.js index edf48e1c7..f84f2c633 100644 --- a/src/containers/Drawers/PaymentReceiveDetailDrawer/PaymentReceiveDetailTab.js +++ b/src/containers/Drawers/PaymentReceiveDetailDrawer/PaymentReceiveDetailTab.js @@ -5,6 +5,7 @@ import { CommercialDocBox } from 'components'; import PaymentReceiveDetailHeader from './PaymentReceiveDetailHeader'; import PaymentReceiveDetailTable from './PaymentReceiveDetailTable'; +import PaymentReceiveDetailTableFooter from './PaymentReceiveDetailTableFooter'; import PaymentReceiveDetailFooter from './PaymentReceiveDetailFooter'; /** @@ -17,6 +18,7 @@ export default function PaymentReceiveDetailTab() { + diff --git a/src/containers/Drawers/PaymentReceiveDetailDrawer/PaymentReceiveDetailTableFooter.js b/src/containers/Drawers/PaymentReceiveDetailDrawer/PaymentReceiveDetailTableFooter.js new file mode 100644 index 000000000..5b677ae4a --- /dev/null +++ b/src/containers/Drawers/PaymentReceiveDetailDrawer/PaymentReceiveDetailTableFooter.js @@ -0,0 +1,46 @@ +import React from 'react'; +import styled from 'styled-components'; + +import { + FormatNumber, + TotalLineTextStyle, + TotalLineBorderStyle, + T, + TotalLine, + TotalLines, +} from 'components'; +import { usePaymentReceiveDetailContext } from './PaymentReceiveDetailProvider'; + +/** + * Payment receive detail table footer. + * @returns {React.JSX} + */ +export default function PaymentReceiveDetailTableFooter() { + const { paymentReceive } = usePaymentReceiveDetailContext(); + + return ( + + + } + value={} + /> + } + value={paymentReceive.formatted_amount} + borderStyle={TotalLineBorderStyle.DoubleDark} + textStyle={TotalLineTextStyle.Bold} + /> + + + ); +} + +export const PaymentReceiveDetailsFooterRoot = styled.div``; + +export const PaymentReceiveTotalLines = styled(TotalLines)` + margin-left: auto; +`; diff --git a/src/lang/ar/index.json b/src/lang/ar/index.json index 6f924d22b..d1747625b 100644 --- a/src/lang/ar/index.json +++ b/src/lang/ar/index.json @@ -1659,7 +1659,8 @@ "transactions": "معاملات ", "item.drawer_transactions_by": "معاملات حسب :", "item.drawer_quantity_sold": "الكمية المباعة", - "journal_entries.amount_displayed_base_currency":"يتم عرض المبلغ بالعملة الأساسية الخاصة بك " + "journal_entries.amount_displayed_base_currency":"يتم عرض المبلغ بالعملة الأساسية الخاصة بك ", + "inventory_adjustment.column.product":"المنتج" } diff --git a/src/lang/en/index.json b/src/lang/en/index.json index bb10562dc..224164922 100644 --- a/src/lang/en/index.json +++ b/src/lang/en/index.json @@ -1195,6 +1195,7 @@ "payment_receive.details.payment_number": "Payment #", "payment_receive.details.total": "TOTAL", "payment_receive.details.subtotal": "Subtotal", + "payment_receive.details.statement": "Statement", "estimate.details.estimate_number": "Estimate #", "estimate.details.subtotal": "Subtotal", "estimate.details.total": "TOTAL", @@ -1202,12 +1203,15 @@ "estimate.details.due_amount": "Due amount", "estimate.details.note": "Note", "estimate.details.created_at": "Created at", + "estimate.details.terms_conditions": "Terms & Conditions", "receipt.details.receipt_number": "Receipt #", "receipt.details.subtotal": "Subtotal", "receipt.details.total": "TOTAL", "receipt.details.payment_amount": "Payment amount", "receipt.details.due_amount": "Due amount", "receipt.details.created_at": "Created at", + "receipt.details.receipt_message": "Receipt Message", + "receipt.details.statement": "Statement", "invoice.details.created_at": "Created at", "invoice.details.total": "TOTAL", "invoice.details.subtotal": "Subtotal", @@ -1523,6 +1527,7 @@ "credit_note.drawer.label_subtotal": "Subtotal", "credit_note.drawer.label_refund_transactions": "Refund Transactions", "credit_note.drawer.label_invoices_reconciled": "Invoices Reconciled", + "credit_note.drawer.terms_conditions": "Terms Conditions", "sidebar_vendor_credits": "Vendor Credits", "vendor_credits.lable_vendor_credit_list": "Vendor Credits List", @@ -1655,5 +1660,8 @@ "item.drawer_transactions_by": "Transactions by:", "item.drawer_quantity_sold": "Quantity Sold", "role_name": "Role name", - "journal_entries.amount_displayed_base_currency":"Amount is displayed in your base currency" + "journal_entries.amount_displayed_base_currency":"Amount is displayed in your base currency", + "inventory_adjustment.column.product":"Product", + "convert_to_credit_note":"Convert to Credit Note", + "convert_to_vendor_credit":"Convert to Vendor Credit" } \ No newline at end of file From 2a9c1a9833bbd14560f98b3949d1954b513a25f5 Mon Sep 17 00:00:00 2001 From: elforjani13 <39470382+elforjani13@users.noreply.github.com> Date: Sun, 26 Dec 2021 16:34:05 +0200 Subject: [PATCH 8/9] feat: add convert to credit note in drawer. --- .../InvoiceDetailActionsBar.js | 17 ++++++++++++++++- .../Drawers/InvoiceDetailDrawer/utils.js | 8 +++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/containers/Drawers/InvoiceDetailDrawer/InvoiceDetailActionsBar.js b/src/containers/Drawers/InvoiceDetailDrawer/InvoiceDetailActionsBar.js index 3a0a354cc..3042ae0db 100644 --- a/src/containers/Drawers/InvoiceDetailDrawer/InvoiceDetailActionsBar.js +++ b/src/containers/Drawers/InvoiceDetailDrawer/InvoiceDetailActionsBar.js @@ -14,7 +14,13 @@ import withDialogActions from 'containers/Dialog/withDialogActions'; import withAlertsActions from 'containers/Alert/withAlertActions'; import withDrawerActions from 'containers/Drawer/withDrawerActions'; -import { If, Can, Icon, DrawerActionsBar, FormattedMessage as T } from 'components'; +import { + If, + Can, + Icon, + DrawerActionsBar, + FormattedMessage as T, +} from 'components'; import { SaleInvoiceAction, PaymentReceiveAction, @@ -48,6 +54,14 @@ function InvoiceDetailActionsBar({ closeDrawer('invoice-detail-drawer'); }; + // Handle convert to invoice. + const handleConvertToCreitNote = () => { + history.push(`/credit-notes/new?from_invoice_id=${invoiceId}`, { + invoiceId: invoiceId, + }); + closeDrawer('invoice-detail-drawer'); + }; + // Handle delete sale invoice. const handleDeleteInvoice = () => { openAlert('invoice-delete', { invoiceId }); @@ -124,6 +138,7 @@ function InvoiceDetailActionsBar({ onBadDebt: handleBadDebtInvoice, onCancelBadDebt: handleCancelBadDebtInvoice, onNotifyViaSMS: handleNotifyViaSMS, + onConvert: handleConvertToCreitNote, }} /> diff --git a/src/containers/Drawers/InvoiceDetailDrawer/utils.js b/src/containers/Drawers/InvoiceDetailDrawer/utils.js index 3a8bdb695..2b4566b8b 100644 --- a/src/containers/Drawers/InvoiceDetailDrawer/utils.js +++ b/src/containers/Drawers/InvoiceDetailDrawer/utils.js @@ -76,7 +76,7 @@ export const useInvoiceReadonlyEntriesColumns = () => * @returns {React.JSX} */ export const BadDebtMenuItem = ({ - payload: { onCancelBadDebt, onBadDebt, onNotifyViaSMS }, + payload: { onCancelBadDebt, onBadDebt, onNotifyViaSMS, onConvert }, }) => { const { invoice } = useInvoiceDetailDrawerContext(); @@ -104,6 +104,12 @@ export const BadDebtMenuItem = ({ /> + + } + /> + Date: Sun, 26 Dec 2021 17:11:04 +0200 Subject: [PATCH 9/9] feat: add convert to vendor credit in drawer. --- .../BillDrawer/BillDetailActionsBar.js | 17 +++++++++ src/containers/Drawers/BillDrawer/utils.js | 38 +++++++++++++++++-- .../Drawers/InvoiceDetailDrawer/utils.js | 4 +- src/lang/ar/index.json | 6 ++- src/lang/en/index.json | 4 +- 5 files changed, 61 insertions(+), 8 deletions(-) diff --git a/src/containers/Drawers/BillDrawer/BillDetailActionsBar.js b/src/containers/Drawers/BillDrawer/BillDetailActionsBar.js index 3a5aecb96..0db244234 100644 --- a/src/containers/Drawers/BillDrawer/BillDetailActionsBar.js +++ b/src/containers/Drawers/BillDrawer/BillDetailActionsBar.js @@ -27,6 +27,7 @@ import { PaymentMadeAction, AbilitySubject, } from '../../../common/abilityOption'; +import { BillMenuItem } from './utils'; import { safeCallback, compose } from 'utils'; @@ -50,6 +51,14 @@ function BillDetailActionsBar({ closeDrawer('bill-drawer'); }; + // Handle convert to vendor credit. + const handleConvertToVendorCredit = () => { + history.push(`/vendor-credits/new?from_bill_id=${billId}`, { + billId: billId, + }); + closeDrawer('bill-drawer'); + }; + // Handle delete bill. const onDeleteBill = () => { openAlert('bill-delete', { billId }); @@ -92,6 +101,14 @@ function BillDetailActionsBar({ onClick={safeCallback(onDeleteBill)} /> + + + + ); diff --git a/src/containers/Drawers/BillDrawer/utils.js b/src/containers/Drawers/BillDrawer/utils.js index 5f0febb19..1c3be7018 100644 --- a/src/containers/Drawers/BillDrawer/utils.js +++ b/src/containers/Drawers/BillDrawer/utils.js @@ -1,12 +1,21 @@ import React from 'react'; import intl from 'react-intl-universal'; import styled from 'styled-components'; -import { Intent, Tag } from '@blueprintjs/core'; - +import { + Button, + Popover, + PopoverInteractionKind, + Position, + MenuItem, + Menu, + Intent, + Tag, +} from '@blueprintjs/core'; import { FormatNumberCell, FormattedMessage as T, Choose, + Icon, } from '../../../components'; /** @@ -73,7 +82,7 @@ export function BillDetailsStatus({ bill }) { - Overdue + @@ -92,6 +101,29 @@ export function BillDetailsStatus({ bill }) { ); } +export const BillMenuItem = ({ payload: { onConvert } }) => { + return ( + + } + /> + + } + > +