From 1f3ed79f2a762f29c9fc109f6deb9a8286a78d77 Mon Sep 17 00:00:00 2001 From: "a.bouhuolia" Date: Tue, 3 Aug 2021 21:41:53 +0200 Subject: [PATCH] fix: ensure items entries has one empty line atleast. --- client/src/containers/Entries/utils.js | 20 +++++++++++-- .../Purchases/Bills/BillForm/utils.js | 29 +++++++++++++------ .../Sales/Estimates/EstimateForm/utils.js | 23 +++++++++++---- .../Sales/Invoices/InvoiceForm/utils.js | 14 ++++++--- .../Sales/Receipts/ReceiptForm/utils.js | 23 +++++++++++---- 5 files changed, 84 insertions(+), 25 deletions(-) diff --git a/client/src/containers/Entries/utils.js b/client/src/containers/Entries/utils.js index 437f7faf2..4cc79a8b4 100644 --- a/client/src/containers/Entries/utils.js +++ b/client/src/containers/Entries/utils.js @@ -1,4 +1,5 @@ -import { sumBy } from 'lodash'; +import { sumBy, isEmpty, last } from 'lodash'; +import * as R from 'ramda'; import { toSafeNumber } from 'utils'; /** @@ -36,4 +37,19 @@ export const ITEM_TYPE = { */ export function getEntriesTotal(entries) { return sumBy(entries, 'amount'); -} \ No newline at end of file +} + +/** + * Ensure the given entries have enough empty line on the last. + * @param {Object} defaultEntry - Default entry. + * @param {Array} entries - Entries. + * @return {Array} + */ +export const ensureEntriesHaveEmptyLine = R.curry((defaultEntry, entries) => { + const lastEntry = last(entries); + + if (isEmpty(lastEntry.account_id) || isEmpty(lastEntry.amount)) { + return [...entries, defaultEntry]; + } + return entries; +}); \ No newline at end of file diff --git a/client/src/containers/Purchases/Bills/BillForm/utils.js b/client/src/containers/Purchases/Bills/BillForm/utils.js index 531179c38..373c6411b 100644 --- a/client/src/containers/Purchases/Bills/BillForm/utils.js +++ b/client/src/containers/Purchases/Bills/BillForm/utils.js @@ -1,5 +1,6 @@ import moment from 'moment'; import intl from 'react-intl-universal'; +import * as R from 'ramda'; import { Intent } from '@blueprintjs/core'; import { AppToaster } from 'components'; import { @@ -7,6 +8,10 @@ import { transformToForm, repeatValue, } from 'utils'; +import { + updateItemsEntriesTotal, + ensureEntriesHaveEmptyLine, +} from 'containers/Entries/utils'; export const MIN_LINES_NUMBER = 4; @@ -33,17 +38,23 @@ export const defaultBill = { }; export const transformToEditForm = (bill) => { + const initialEntries = [ + ...bill.entries.map((bill) => ({ + ...transformToForm(bill, defaultBill.entries[0]), + })), + ...repeatValue( + defaultBill, + Math.max(MIN_LINES_NUMBER - bill.entries.length, 0), + ), + ]; + const entries = R.compose( + ensureEntriesHaveEmptyLine(defaultBillEntry), + updateItemsEntriesTotal, + )(initialEntries); + return { ...transformToForm(bill, defaultBill), - entries: [ - ...bill.entries.map((bill) => ({ - ...transformToForm(bill, defaultBill.entries[0]), - })), - ...repeatValue( - defaultBill, - Math.max(MIN_LINES_NUMBER - bill.entries.length, 0), - ), - ], + entries, }; }; diff --git a/client/src/containers/Sales/Estimates/EstimateForm/utils.js b/client/src/containers/Sales/Estimates/EstimateForm/utils.js index 3056c29f7..cbb3b826d 100644 --- a/client/src/containers/Sales/Estimates/EstimateForm/utils.js +++ b/client/src/containers/Sales/Estimates/EstimateForm/utils.js @@ -1,12 +1,17 @@ import React from 'react'; import { useFormikContext } from 'formik'; import moment from 'moment'; +import * as R from 'ramda'; import { defaultFastFieldShouldUpdate, transactionNumber, repeatValue, transformToForm, } from 'utils'; +import { + updateItemsEntriesTotal, + ensureEntriesHaveEmptyLine, +} from 'containers/Entries/utils'; export const MIN_LINES_NUMBER = 4; @@ -32,9 +37,8 @@ export const defaultEstimate = { entries: [...repeatValue(defaultEstimateEntry, MIN_LINES_NUMBER)], }; -export const transformToEditForm = (estimate) => ({ - ...transformToForm(estimate, defaultEstimate), - entries: [ +export const transformToEditForm = (estimate) => { + const initialEntries = [ ...estimate.entries.map((estimate) => ({ ...transformToForm(estimate, defaultEstimateEntry), })), @@ -42,8 +46,17 @@ export const transformToEditForm = (estimate) => ({ defaultEstimateEntry, Math.max(MIN_LINES_NUMBER - estimate.entries.length, 0), ), - ], -}); + ]; + const entries = R.compose( + ensureEntriesHaveEmptyLine(defaultEstimateEntry), + updateItemsEntriesTotal, + )(initialEntries); + + return { + ...transformToForm(estimate, defaultEstimate), + entries + } +}; /** * Syncs estimate number of the settings with the context form. diff --git a/client/src/containers/Sales/Invoices/InvoiceForm/utils.js b/client/src/containers/Sales/Invoices/InvoiceForm/utils.js index 2f0ee469c..96f658788 100644 --- a/client/src/containers/Sales/Invoices/InvoiceForm/utils.js +++ b/client/src/containers/Sales/Invoices/InvoiceForm/utils.js @@ -1,13 +1,11 @@ import React from 'react'; import moment from 'moment'; -import { isEmpty } from 'lodash'; import { compose, transformToForm, repeatValue, transactionNumber, } from 'utils'; -import { updateItemsEntriesTotal } from 'containers/Entries/utils'; import { useFormikContext } from 'formik'; import { Intent } from '@blueprintjs/core'; @@ -15,6 +13,10 @@ import { defaultFastFieldShouldUpdate } from 'utils'; import intl from 'react-intl-universal'; import { ERROR } from 'common/errors'; import { AppToaster } from 'components'; +import { + updateItemsEntriesTotal, + ensureEntriesHaveEmptyLine, +} from 'containers/Entries/utils'; export const MIN_LINES_NUMBER = 4; @@ -47,7 +49,7 @@ export const defaultInvoice = { * Transform invoice to initial values in edit mode. */ export function transformToEditForm(invoice) { - const entries = compose(updateItemsEntriesTotal)([ + const initialEntries = [ ...invoice.entries.map((invoice) => ({ ...transformToForm(invoice, defaultInvoiceEntry), })), @@ -55,7 +57,11 @@ export function transformToEditForm(invoice) { defaultInvoiceEntry, Math.max(MIN_LINES_NUMBER - invoice.entries.length, 0), ), - ]); + ]; + const entries = compose( + ensureEntriesHaveEmptyLine(defaultInvoiceEntry), + updateItemsEntriesTotal, + )(initialEntries); return { ...transformToForm(invoice, defaultInvoice), diff --git a/client/src/containers/Sales/Receipts/ReceiptForm/utils.js b/client/src/containers/Sales/Receipts/ReceiptForm/utils.js index d4b82d660..d2462b9b7 100644 --- a/client/src/containers/Sales/Receipts/ReceiptForm/utils.js +++ b/client/src/containers/Sales/Receipts/ReceiptForm/utils.js @@ -1,12 +1,17 @@ import React from 'react'; import { useFormikContext } from 'formik'; import moment from 'moment'; +import * as R from 'ramda'; import { defaultFastFieldShouldUpdate, transactionNumber, repeatValue, transformToForm, } from 'utils'; +import { + updateItemsEntriesTotal, + ensureEntriesHaveEmptyLine, +} from 'containers/Entries/utils'; export const MIN_LINES_NUMBER = 4; @@ -35,9 +40,8 @@ export const defaultReceipt = { /** * Transform to form in edit mode. */ -export const transformToEditForm = (receipt) => ({ - ...transformToForm(receipt, defaultReceipt), - entries: [ +export const transformToEditForm = (receipt) => { + const initialEntries = [ ...receipt.entries.map((entry) => ({ ...transformToForm(entry, defaultReceiptEntry), })), @@ -45,8 +49,17 @@ export const transformToEditForm = (receipt) => ({ defaultReceiptEntry, Math.max(MIN_LINES_NUMBER - receipt.entries.length, 0), ), - ], -}); + ]; + const entries = R.compose( + ensureEntriesHaveEmptyLine(defaultReceiptEntry), + updateItemsEntriesTotal, + )(initialEntries); + + return { + ...transformToForm(receipt, defaultReceipt), + entries, + }; +}; export const useObserveReceiptNoSettings = (prefix, nextNumber) => { const { setFieldValue } = useFormikContext();