diff --git a/packages/webapp/src/components/PageForm/PageFormBigNumber.tsx b/packages/webapp/src/components/PageForm/PageFormBigNumber.tsx
index 5508b8fdb..914cc95a0 100644
--- a/packages/webapp/src/components/PageForm/PageFormBigNumber.tsx
+++ b/packages/webapp/src/components/PageForm/PageFormBigNumber.tsx
@@ -2,18 +2,22 @@
import React from 'react';
import classNames from 'classnames';
import { CLASSES } from '@/constants/classes';
-import { Money } from '@/components';
import '@/style/components/BigAmount.scss';
-export function PageFormBigNumber({ label, amount, currencyCode }) {
+interface PageFormBigNumberProps {
+ label: string;
+ amount: string | number;
+}
+export function PageFormBigNumber({
+ label,
+ amount,
+}: PageFormBigNumberProps) {
return (
);
diff --git a/packages/webapp/src/containers/Drawers/BillDrawer/BillDetailTableFooter.tsx b/packages/webapp/src/containers/Drawers/BillDrawer/BillDetailTableFooter.tsx
index 458705217..558d0f1ca 100644
--- a/packages/webapp/src/containers/Drawers/BillDrawer/BillDetailTableFooter.tsx
+++ b/packages/webapp/src/containers/Drawers/BillDrawer/BillDetailTableFooter.tsx
@@ -42,6 +42,12 @@ export function BillDetailTableFooter() {
textStyle={TotalLineTextStyle.Regular}
/>
)}
+ {bill.adjustment > 0 && (
+
+ )}
}
value={bill.total_formatted}
diff --git a/packages/webapp/src/containers/Drawers/CreditNoteDetailDrawer/CreditNoteDetailHeader.tsx b/packages/webapp/src/containers/Drawers/CreditNoteDetailDrawer/CreditNoteDetailHeader.tsx
index ffb1f7985..c5bec8978 100644
--- a/packages/webapp/src/containers/Drawers/CreditNoteDetailDrawer/CreditNoteDetailHeader.tsx
+++ b/packages/webapp/src/containers/Drawers/CreditNoteDetailDrawer/CreditNoteDetailHeader.tsx
@@ -30,7 +30,7 @@ export default function CreditNoteDetailHeader() {
- {creditNote.formatted_amount}
+ {creditNote.total_formatted}
diff --git a/packages/webapp/src/containers/Drawers/CreditNoteDetailDrawer/CreditNoteDetailTableFooter.tsx b/packages/webapp/src/containers/Drawers/CreditNoteDetailDrawer/CreditNoteDetailTableFooter.tsx
index 881ac1def..ddb828370 100644
--- a/packages/webapp/src/containers/Drawers/CreditNoteDetailDrawer/CreditNoteDetailTableFooter.tsx
+++ b/packages/webapp/src/containers/Drawers/CreditNoteDetailDrawer/CreditNoteDetailTableFooter.tsx
@@ -21,6 +21,7 @@ export default function CreditNoteDetailTableFooter() {
}
value={creditNote.formatted_subtotal}
+ borderStyle={TotalLineBorderStyle.SingleDark}
/>
{creditNote.discount_amount > 0 && (
+ )}
+ {creditNote.adjustment > 0 && (
+
)}
)}
+ {invoice.adjustment > 0 && (
+
+ )}
{invoice.taxes.map((taxRate) => (
))}
-
}
value={invoice.total_formatted}
diff --git a/packages/webapp/src/containers/Drawers/ReceiptDetailDrawer/ReceiptDetailHeader.tsx b/packages/webapp/src/containers/Drawers/ReceiptDetailDrawer/ReceiptDetailHeader.tsx
index a55d47ee6..21bd0a923 100644
--- a/packages/webapp/src/containers/Drawers/ReceiptDetailDrawer/ReceiptDetailHeader.tsx
+++ b/packages/webapp/src/containers/Drawers/ReceiptDetailDrawer/ReceiptDetailHeader.tsx
@@ -31,7 +31,7 @@ export default function ReceiptDetailHeader() {
- {receipt.formatted_amount}
+ {receipt.total_formatted}
diff --git a/packages/webapp/src/containers/Drawers/ReceiptDetailDrawer/ReceiptDetailTableFooter.tsx b/packages/webapp/src/containers/Drawers/ReceiptDetailDrawer/ReceiptDetailTableFooter.tsx
index d142f0775..ee799c2a7 100644
--- a/packages/webapp/src/containers/Drawers/ReceiptDetailDrawer/ReceiptDetailTableFooter.tsx
+++ b/packages/webapp/src/containers/Drawers/ReceiptDetailDrawer/ReceiptDetailTableFooter.tsx
@@ -23,7 +23,7 @@ export default function ReceiptDetailTableFooter() {
}
- value={receipt.formatted_subtotal}
+ value={receipt.subtotal_formatted}
/>
{receipt.discount_amount > 0 && (
)}
+ {receipt.adjustment > 0 && (
+
+ )}
}
- value={receipt.formatted_amount}
+ value={receipt.total_formatted}
borderStyle={TotalLineBorderStyle.DoubleDark}
textStyle={TotalLineTextStyle.Bold}
/>
diff --git a/packages/webapp/src/containers/Expenses/ExpenseForm/ExpenseFormFooterRight.tsx b/packages/webapp/src/containers/Expenses/ExpenseForm/ExpenseFormFooterRight.tsx
index 31b1172d5..0eb41999e 100644
--- a/packages/webapp/src/containers/Expenses/ExpenseForm/ExpenseFormFooterRight.tsx
+++ b/packages/webapp/src/containers/Expenses/ExpenseForm/ExpenseFormFooterRight.tsx
@@ -8,21 +8,25 @@ import {
TotalLineBorderStyle,
TotalLineTextStyle,
} from '@/components';
-import { useExpensesTotals } from './utils';
+import {
+ useExpenseSubtotalFormatted,
+ useExpenseTotalFormatted,
+} from './utils';
export function ExpenseFormFooterRight() {
- const { formattedSubtotal, formattedTotal } = useExpensesTotals();
+ const totalFormatted = useExpenseTotalFormatted();
+ const subtotalFormatted = useExpenseSubtotalFormatted();
return (
}
- value={formattedSubtotal}
+ value={subtotalFormatted}
borderStyle={TotalLineBorderStyle.None}
/>
}
- value={formattedTotal}
+ value={totalFormatted}
textStyle={TotalLineTextStyle.Bold}
/>
diff --git a/packages/webapp/src/containers/Expenses/ExpenseForm/ExpenseFormHeader.tsx b/packages/webapp/src/containers/Expenses/ExpenseForm/ExpenseFormHeader.tsx
index 97dbd2399..858b0bc35 100644
--- a/packages/webapp/src/containers/Expenses/ExpenseForm/ExpenseFormHeader.tsx
+++ b/packages/webapp/src/containers/Expenses/ExpenseForm/ExpenseFormHeader.tsx
@@ -1,34 +1,23 @@
// @ts-nocheck
-import React, { useMemo } from 'react';
+import React from 'react';
import classNames from 'classnames';
-import { sumBy } from 'lodash';
-import { useFormikContext } from 'formik';
import { FormattedMessage as T } from '@/components';
import { CLASSES } from '@/constants/classes';
-
import ExpenseFormHeaderFields from './ExpenseFormHeaderFields';
import { PageFormBigNumber } from '@/components';
+import { useExpenseTotalFormatted } from './utils';
// Expense form header.
export default function ExpenseFormHeader() {
- const {
- values: { currency_code, categories },
- } = useFormikContext();
-
- // Calculates the expense entries amount.
- const totalExpenseAmount = useMemo(
- () => sumBy(categories, 'amount'),
- [categories],
- );
+ const totalFormatted = useExpenseTotalFormatted();
return (
}
- amount={totalExpenseAmount}
- currencyCode={currency_code}
+ amount={totalFormatted}
/>
);
diff --git a/packages/webapp/src/containers/Expenses/ExpenseForm/utils.tsx b/packages/webapp/src/containers/Expenses/ExpenseForm/utils.tsx
index e411d810a..19cb5ab0a 100644
--- a/packages/webapp/src/containers/Expenses/ExpenseForm/utils.tsx
+++ b/packages/webapp/src/containers/Expenses/ExpenseForm/utils.tsx
@@ -166,30 +166,52 @@ export const useSetPrimaryBranchToForm = () => {
};
/**
- * Retreives the Journal totals.
+ * Retrieves the expense subtotal.
+ * @returns {number}
*/
-export const useExpensesTotals = () => {
+export const useExpenseSubtotal = () => {
const {
- values: { categories, currency_code: currencyCode },
+ values: { categories },
} = useFormikContext();
- const total = sumBy(categories, 'amount');
+ // Calculates the expense entries amount.
+ return React.useMemo(() => sumBy(categories, 'amount'), [categories]);
+};
- // Retrieves the formatted total money.
- const formattedTotal = React.useMemo(
- () => formattedAmount(total, currencyCode),
- [total, currencyCode],
- );
- // Retrieves the formatted subtotal.
- const formattedSubtotal = React.useMemo(
- () => formattedAmount(total, currencyCode, { money: false }),
- [total, currencyCode],
- );
+/**
+ * Retrieves the expense subtotal formatted.
+ * @returns {string}
+ */
+export const useExpenseSubtotalFormatted = () => {
+ const subtotal = useExpenseSubtotal();
+ const {
+ values: { currency_code },
+ } = useFormikContext();
- return {
- formattedTotal,
- formattedSubtotal,
- };
+ return formattedAmount(subtotal, currency_code);
+};
+
+/**
+ * Retrieves the expense total.
+ * @returns {number}
+ */
+export const useExpenseTotal = () => {
+ const subtotal = useExpenseSubtotal();
+
+ return subtotal;
+};
+
+/**
+ * Retrieves the expense total formatted.
+ * @returns {string}
+ */
+export const useExpenseTotalFormatted = () => {
+ const total = useExpenseTotal();
+ const {
+ values: { currency_code },
+ } = useFormikContext();
+
+ return formattedAmount(total, currency_code);
};
/**
diff --git a/packages/webapp/src/containers/Purchases/Bills/BillForm/BillFormHeader.tsx b/packages/webapp/src/containers/Purchases/Bills/BillForm/BillFormHeader.tsx
index b3439fa4c..d4e5149d4 100644
--- a/packages/webapp/src/containers/Purchases/Bills/BillForm/BillFormHeader.tsx
+++ b/packages/webapp/src/containers/Purchases/Bills/BillForm/BillFormHeader.tsx
@@ -1,13 +1,12 @@
// @ts-nocheck
-import React, { useMemo } from 'react';
+import React from 'react';
import intl from 'react-intl-universal';
import classNames from 'classnames';
-import { sumBy } from 'lodash';
-import { useFormikContext } from 'formik';
import { CLASSES } from '@/constants/classes';
import { PageFormBigNumber } from '@/components';
import BillFormHeaderFields from './BillFormHeaderFields';
+import { useBillTotalFormatted } from './utils';
/**
* Fill form header.
@@ -22,19 +21,10 @@ function BillFormHeader() {
}
function BillFormBigTotal() {
- const {
- values: { currency_code, entries },
- } = useFormikContext();
-
- // Calculate the total due amount of bill entries.
- const totalDueAmount = useMemo(() => sumBy(entries, 'amount'), [entries]);
+ const totalFormatted = useBillTotalFormatted();
return (
-
+
);
}
diff --git a/packages/webapp/src/containers/Purchases/Bills/BillForm/utils.tsx b/packages/webapp/src/containers/Purchases/Bills/BillForm/utils.tsx
index 80de66529..35296368a 100644
--- a/packages/webapp/src/containers/Purchases/Bills/BillForm/utils.tsx
+++ b/packages/webapp/src/containers/Purchases/Bills/BillForm/utils.tsx
@@ -325,7 +325,7 @@ export const useBillSubtotal = () => {
*/
export const useBillSubtotalFormatted = () => {
const subtotal = useBillSubtotal();
- const { values} = useFormikContext();
+ const { values } = useFormikContext();
return formattedAmount(subtotal, values.currency_code);
};
@@ -336,8 +336,12 @@ export const useBillSubtotalFormatted = () => {
*/
export const useBillDiscountAmount = () => {
const { values } = useFormikContext();
+ const subtotal = useBillSubtotal();
+ const discount = toSafeNumber(values.discount);
- return toSafeNumber(values.discount);
+ return values?.discount_type === 'percentage'
+ ? (subtotal * discount) / 100
+ : discount;
};
/**
@@ -384,7 +388,6 @@ export const useBillTotalTaxAmount = () => {
.filter((entry) => entry.tax_amount)
.sumBy('tax_amount')
.value();
-
}, [values.entries]);
};
diff --git a/packages/webapp/src/containers/Purchases/CreditNotes/CreditNoteForm/VendorCreditNoteFormHeader.tsx b/packages/webapp/src/containers/Purchases/CreditNotes/CreditNoteForm/VendorCreditNoteFormHeader.tsx
index 4ae780e45..9c1b66a5a 100644
--- a/packages/webapp/src/containers/Purchases/CreditNotes/CreditNoteForm/VendorCreditNoteFormHeader.tsx
+++ b/packages/webapp/src/containers/Purchases/CreditNotes/CreditNoteForm/VendorCreditNoteFormHeader.tsx
@@ -2,33 +2,23 @@
import React from 'react';
import intl from 'react-intl-universal';
import classNames from 'classnames';
-import { useFormikContext } from 'formik';
import { CLASSES } from '@/constants/classes';
import VendorCreditNoteFormHeaderFields from './VendorCreditNoteFormHeaderFields';
-
-import { getEntriesTotal } from '@/containers/Entries/utils';
import { PageFormBigNumber } from '@/components';
-
+import { useVendorCreditTotalFormatted } from './utils';
/**
* Vendor Credit note header.
*/
function VendorCreditNoteFormHeader() {
- const { values:{entries ,currency_code} } = useFormikContext();
-
- // Calculate the total amount.
- const totalAmount = React.useMemo(
- () => getEntriesTotal(entries),
- [entries],
- );
+ const totalFormatted = useVendorCreditTotalFormatted();
return (
);
diff --git a/packages/webapp/src/containers/Purchases/CreditNotes/CreditNoteForm/utils.tsx b/packages/webapp/src/containers/Purchases/CreditNotes/CreditNoteForm/utils.tsx
index 3dc3c0a72..e796d85d3 100644
--- a/packages/webapp/src/containers/Purchases/CreditNotes/CreditNoteForm/utils.tsx
+++ b/packages/webapp/src/containers/Purchases/CreditNotes/CreditNoteForm/utils.tsx
@@ -206,8 +206,12 @@ export const useVendorCreditSubtotal = () => {
*/
export const useVendorCreditDiscountAmount = () => {
const { values } = useFormikContext();
+ const subtotal = useVendorCreditSubtotal();
+ const discount = toSafeNumber(values.discount);
- return toSafeNumber(values.discount);
+ return values.discount_type === 'percentage'
+ ? (subtotal * discount) / 100
+ : discount;
};
/**
diff --git a/packages/webapp/src/containers/Sales/CreditNotes/CreditNoteForm/CreditNoteFormHeader.tsx b/packages/webapp/src/containers/Sales/CreditNotes/CreditNoteForm/CreditNoteFormHeader.tsx
index 06ed4837d..9a3f450e1 100644
--- a/packages/webapp/src/containers/Sales/CreditNotes/CreditNoteForm/CreditNoteFormHeader.tsx
+++ b/packages/webapp/src/containers/Sales/CreditNotes/CreditNoteForm/CreditNoteFormHeader.tsx
@@ -1,11 +1,9 @@
// @ts-nocheck
import React from 'react';
import intl from 'react-intl-universal';
-import { useFormikContext } from 'formik';
import CreditNoteFormHeaderFields from './CreditNoteFormHeaderFields';
-
-import { getEntriesTotal } from '@/containers/Entries/utils';
import { Group, PageFormBigNumber } from '@/components';
+import { useCreditNoteTotalFormatted } from './utils';
/**
* Credit note header.
@@ -31,18 +29,12 @@ function CreditNoteFormHeader() {
* @returns {React.ReactNode}
*/
function CreditNoteFormBigNumber() {
- const {
- values: { entries, currency_code },
- } = useFormikContext();
-
- // Calculate the total amount.
- const totalAmount = React.useMemo(() => getEntriesTotal(entries), [entries]);
+ const totalFormatted = useCreditNoteTotalFormatted();
return (
);
}
diff --git a/packages/webapp/src/containers/Sales/Estimates/EstimateForm/EstimateFormDialogs.tsx b/packages/webapp/src/containers/Sales/Estimates/EstimateForm/EstimateFormDialogs.tsx
index 33f8dbe3e..aa1c165a1 100644
--- a/packages/webapp/src/containers/Sales/Estimates/EstimateForm/EstimateFormDialogs.tsx
+++ b/packages/webapp/src/containers/Sales/Estimates/EstimateForm/EstimateFormDialogs.tsx
@@ -1,5 +1,6 @@
// @ts-nocheck
import React from 'react';
+import { useFormikContext } from 'formik';
import EstimateNumberDialog from '@/containers/Dialogs/EstimateNumberDialog';
/**
diff --git a/packages/webapp/src/containers/Sales/Estimates/EstimateForm/EstimateFormHeader.tsx b/packages/webapp/src/containers/Sales/Estimates/EstimateForm/EstimateFormHeader.tsx
index ac62fc4da..a8d924784 100644
--- a/packages/webapp/src/containers/Sales/Estimates/EstimateForm/EstimateFormHeader.tsx
+++ b/packages/webapp/src/containers/Sales/Estimates/EstimateForm/EstimateFormHeader.tsx
@@ -1,12 +1,10 @@
// @ts-nocheck
-import React, { useMemo } from 'react';
+import React from 'react';
import intl from 'react-intl-universal';
-import { useFormikContext } from 'formik';
-import { x } from '@xstyled/emotion';
import EstimateFormHeaderFields from './EstimateFormHeaderFields';
-import { getEntriesTotal } from '@/containers/Entries/utils';
import { Group, PageFormBigNumber } from '@/components';
+import { useEstimateTotalFormatted } from './utils';
// Estimate form top header.
function EstimateFormHeader() {
@@ -29,19 +27,10 @@ function EstimateFormHeader() {
* @returns {React.ReactNode}
*/
function EstimateFormBigTotal() {
- const {
- values: { entries, currency_code },
- } = useFormikContext();
-
- // Calculate the total due amount of bill entries.
- const totalDueAmount = useMemo(() => getEntriesTotal(entries), [entries]);
+ const totalFormatted = useEstimateTotalFormatted();
return (
-
+
);
}
diff --git a/packages/webapp/src/containers/Sales/Estimates/EstimateForm/utils.tsx b/packages/webapp/src/containers/Sales/Estimates/EstimateForm/utils.tsx
index 5c3307b0b..3669bf868 100644
--- a/packages/webapp/src/containers/Sales/Estimates/EstimateForm/utils.tsx
+++ b/packages/webapp/src/containers/Sales/Estimates/EstimateForm/utils.tsx
@@ -245,6 +245,7 @@ export const useEstimateSubtotalFormatted = () => {
*/
export const useEstimateDiscount = () => {
const { values } = useFormikContext();
+ const subtotal = useEstimateSubtotal();
const discount = toSafeNumber(values.discount);
return values?.discount_type === 'percentage'
diff --git a/packages/webapp/src/containers/Sales/Invoices/InvoiceForm/InvoiceFormHeader.tsx b/packages/webapp/src/containers/Sales/Invoices/InvoiceForm/InvoiceFormHeader.tsx
index 78a6e7b2f..ae63a1012 100644
--- a/packages/webapp/src/containers/Sales/Invoices/InvoiceForm/InvoiceFormHeader.tsx
+++ b/packages/webapp/src/containers/Sales/Invoices/InvoiceForm/InvoiceFormHeader.tsx
@@ -1,10 +1,9 @@
// @ts-nocheck
import React from 'react';
import intl from 'react-intl-universal';
-import { useFormikContext } from 'formik';
import { Group, PageFormBigNumber } from '@/components';
import InvoiceFormHeaderFields from './InvoiceFormHeaderFields';
-import { useInvoiceDueAmount } from './utils';
+import { useInvoiceTotalFormatted } from './utils';
/**
* Invoice form header section.
@@ -29,19 +28,11 @@ function InvoiceFormHeader() {
* @returns {React.ReactNode}
*/
function InvoiceFormBigTotal() {
- const {
- values: { currency_code },
- } = useFormikContext();
-
// Calculate the total due amount of invoice entries.
- const totalDueAmount = useInvoiceDueAmount();
+ const totalFormatted = useInvoiceTotalFormatted();
return (
-
+
);
}
export default InvoiceFormHeader;
diff --git a/packages/webapp/src/containers/Sales/Invoices/InvoiceForm/utils.tsx b/packages/webapp/src/containers/Sales/Invoices/InvoiceForm/utils.tsx
index 844415483..93fb58841 100644
--- a/packages/webapp/src/containers/Sales/Invoices/InvoiceForm/utils.tsx
+++ b/packages/webapp/src/containers/Sales/Invoices/InvoiceForm/utils.tsx
@@ -324,7 +324,7 @@ export const useInvoiceSubtotalFormatted = () => {
export const useInvoiceDiscountAmount = () => {
const { values } = useFormikContext();
const subtotal = useInvoiceSubtotal();
- const discount = parseFloat(values.discount);
+ const discount = toSafeNumber(values.discount);
return values?.discount_type === 'percentage'
? (subtotal * discount) / 100
@@ -350,7 +350,7 @@ export const useInvoiceDiscountAmountFormatted = () => {
*/
export const useInvoiceAdjustmentAmount = () => {
const { values } = useFormikContext();
- const adjustment = parseFloat(values.adjustment);
+ const adjustment = toSafeNumber(values.adjustment);
return adjustment;
};
diff --git a/packages/webapp/src/containers/Sales/Receipts/ReceiptForm/ReceiptFormHeader.tsx b/packages/webapp/src/containers/Sales/Receipts/ReceiptForm/ReceiptFormHeader.tsx
index 9c6d8ac2e..997e4f66f 100644
--- a/packages/webapp/src/containers/Sales/Receipts/ReceiptForm/ReceiptFormHeader.tsx
+++ b/packages/webapp/src/containers/Sales/Receipts/ReceiptForm/ReceiptFormHeader.tsx
@@ -1,10 +1,9 @@
// @ts-nocheck
-import React, { useMemo } from 'react';
+import React from 'react';
import intl from 'react-intl-universal';
-import { useFormikContext } from 'formik';
import { Group, PageFormBigNumber } from '@/components';
import ReceiptFormHeaderFields from './ReceiptFormHeaderFields';
-import { getEntriesTotal } from '@/containers/Entries/utils';
+import { useReceiptTotalFormatted } from './utils';
/**
* Receipt form header section.
@@ -35,19 +34,10 @@ function ReceiptFormHeader({
* @returns {React.ReactNode}
*/
function ReceiptFormHeaderBigTotal() {
- const {
- values: { currency_code, entries },
- } = useFormikContext();
-
- // Calculate the total due amount of bill entries.
- const totalDueAmount = useMemo(() => getEntriesTotal(entries), [entries]);
+ const totalFormatted = useReceiptTotalFormatted();
return (
-
+
);
}