mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-20 14:50:32 +00:00
fix: ensure items entries has one empty line atleast.
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
import { sumBy } from 'lodash';
|
import { sumBy, isEmpty, last } from 'lodash';
|
||||||
|
import * as R from 'ramda';
|
||||||
import { toSafeNumber } from 'utils';
|
import { toSafeNumber } from 'utils';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -37,3 +38,18 @@ export const ITEM_TYPE = {
|
|||||||
export function getEntriesTotal(entries) {
|
export function getEntriesTotal(entries) {
|
||||||
return sumBy(entries, 'amount');
|
return sumBy(entries, 'amount');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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;
|
||||||
|
});
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
import moment from 'moment';
|
import moment from 'moment';
|
||||||
import intl from 'react-intl-universal';
|
import intl from 'react-intl-universal';
|
||||||
|
import * as R from 'ramda';
|
||||||
import { Intent } from '@blueprintjs/core';
|
import { Intent } from '@blueprintjs/core';
|
||||||
import { AppToaster } from 'components';
|
import { AppToaster } from 'components';
|
||||||
import {
|
import {
|
||||||
@@ -7,6 +8,10 @@ import {
|
|||||||
transformToForm,
|
transformToForm,
|
||||||
repeatValue,
|
repeatValue,
|
||||||
} from 'utils';
|
} from 'utils';
|
||||||
|
import {
|
||||||
|
updateItemsEntriesTotal,
|
||||||
|
ensureEntriesHaveEmptyLine,
|
||||||
|
} from 'containers/Entries/utils';
|
||||||
|
|
||||||
export const MIN_LINES_NUMBER = 4;
|
export const MIN_LINES_NUMBER = 4;
|
||||||
|
|
||||||
@@ -33,17 +38,23 @@ export const defaultBill = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const transformToEditForm = (bill) => {
|
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 {
|
return {
|
||||||
...transformToForm(bill, defaultBill),
|
...transformToForm(bill, defaultBill),
|
||||||
entries: [
|
entries,
|
||||||
...bill.entries.map((bill) => ({
|
|
||||||
...transformToForm(bill, defaultBill.entries[0]),
|
|
||||||
})),
|
|
||||||
...repeatValue(
|
|
||||||
defaultBill,
|
|
||||||
Math.max(MIN_LINES_NUMBER - bill.entries.length, 0),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,17 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useFormikContext } from 'formik';
|
import { useFormikContext } from 'formik';
|
||||||
import moment from 'moment';
|
import moment from 'moment';
|
||||||
|
import * as R from 'ramda';
|
||||||
import {
|
import {
|
||||||
defaultFastFieldShouldUpdate,
|
defaultFastFieldShouldUpdate,
|
||||||
transactionNumber,
|
transactionNumber,
|
||||||
repeatValue,
|
repeatValue,
|
||||||
transformToForm,
|
transformToForm,
|
||||||
} from 'utils';
|
} from 'utils';
|
||||||
|
import {
|
||||||
|
updateItemsEntriesTotal,
|
||||||
|
ensureEntriesHaveEmptyLine,
|
||||||
|
} from 'containers/Entries/utils';
|
||||||
|
|
||||||
export const MIN_LINES_NUMBER = 4;
|
export const MIN_LINES_NUMBER = 4;
|
||||||
|
|
||||||
@@ -32,9 +37,8 @@ export const defaultEstimate = {
|
|||||||
entries: [...repeatValue(defaultEstimateEntry, MIN_LINES_NUMBER)],
|
entries: [...repeatValue(defaultEstimateEntry, MIN_LINES_NUMBER)],
|
||||||
};
|
};
|
||||||
|
|
||||||
export const transformToEditForm = (estimate) => ({
|
export const transformToEditForm = (estimate) => {
|
||||||
...transformToForm(estimate, defaultEstimate),
|
const initialEntries = [
|
||||||
entries: [
|
|
||||||
...estimate.entries.map((estimate) => ({
|
...estimate.entries.map((estimate) => ({
|
||||||
...transformToForm(estimate, defaultEstimateEntry),
|
...transformToForm(estimate, defaultEstimateEntry),
|
||||||
})),
|
})),
|
||||||
@@ -42,8 +46,17 @@ export const transformToEditForm = (estimate) => ({
|
|||||||
defaultEstimateEntry,
|
defaultEstimateEntry,
|
||||||
Math.max(MIN_LINES_NUMBER - estimate.entries.length, 0),
|
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.
|
* Syncs estimate number of the settings with the context form.
|
||||||
|
|||||||
@@ -1,13 +1,11 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import moment from 'moment';
|
import moment from 'moment';
|
||||||
import { isEmpty } from 'lodash';
|
|
||||||
import {
|
import {
|
||||||
compose,
|
compose,
|
||||||
transformToForm,
|
transformToForm,
|
||||||
repeatValue,
|
repeatValue,
|
||||||
transactionNumber,
|
transactionNumber,
|
||||||
} from 'utils';
|
} from 'utils';
|
||||||
import { updateItemsEntriesTotal } from 'containers/Entries/utils';
|
|
||||||
import { useFormikContext } from 'formik';
|
import { useFormikContext } from 'formik';
|
||||||
import { Intent } from '@blueprintjs/core';
|
import { Intent } from '@blueprintjs/core';
|
||||||
|
|
||||||
@@ -15,6 +13,10 @@ import { defaultFastFieldShouldUpdate } from 'utils';
|
|||||||
import intl from 'react-intl-universal';
|
import intl from 'react-intl-universal';
|
||||||
import { ERROR } from 'common/errors';
|
import { ERROR } from 'common/errors';
|
||||||
import { AppToaster } from 'components';
|
import { AppToaster } from 'components';
|
||||||
|
import {
|
||||||
|
updateItemsEntriesTotal,
|
||||||
|
ensureEntriesHaveEmptyLine,
|
||||||
|
} from 'containers/Entries/utils';
|
||||||
|
|
||||||
export const MIN_LINES_NUMBER = 4;
|
export const MIN_LINES_NUMBER = 4;
|
||||||
|
|
||||||
@@ -47,7 +49,7 @@ export const defaultInvoice = {
|
|||||||
* Transform invoice to initial values in edit mode.
|
* Transform invoice to initial values in edit mode.
|
||||||
*/
|
*/
|
||||||
export function transformToEditForm(invoice) {
|
export function transformToEditForm(invoice) {
|
||||||
const entries = compose(updateItemsEntriesTotal)([
|
const initialEntries = [
|
||||||
...invoice.entries.map((invoice) => ({
|
...invoice.entries.map((invoice) => ({
|
||||||
...transformToForm(invoice, defaultInvoiceEntry),
|
...transformToForm(invoice, defaultInvoiceEntry),
|
||||||
})),
|
})),
|
||||||
@@ -55,7 +57,11 @@ export function transformToEditForm(invoice) {
|
|||||||
defaultInvoiceEntry,
|
defaultInvoiceEntry,
|
||||||
Math.max(MIN_LINES_NUMBER - invoice.entries.length, 0),
|
Math.max(MIN_LINES_NUMBER - invoice.entries.length, 0),
|
||||||
),
|
),
|
||||||
]);
|
];
|
||||||
|
const entries = compose(
|
||||||
|
ensureEntriesHaveEmptyLine(defaultInvoiceEntry),
|
||||||
|
updateItemsEntriesTotal,
|
||||||
|
)(initialEntries);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...transformToForm(invoice, defaultInvoice),
|
...transformToForm(invoice, defaultInvoice),
|
||||||
|
|||||||
@@ -1,12 +1,17 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useFormikContext } from 'formik';
|
import { useFormikContext } from 'formik';
|
||||||
import moment from 'moment';
|
import moment from 'moment';
|
||||||
|
import * as R from 'ramda';
|
||||||
import {
|
import {
|
||||||
defaultFastFieldShouldUpdate,
|
defaultFastFieldShouldUpdate,
|
||||||
transactionNumber,
|
transactionNumber,
|
||||||
repeatValue,
|
repeatValue,
|
||||||
transformToForm,
|
transformToForm,
|
||||||
} from 'utils';
|
} from 'utils';
|
||||||
|
import {
|
||||||
|
updateItemsEntriesTotal,
|
||||||
|
ensureEntriesHaveEmptyLine,
|
||||||
|
} from 'containers/Entries/utils';
|
||||||
|
|
||||||
export const MIN_LINES_NUMBER = 4;
|
export const MIN_LINES_NUMBER = 4;
|
||||||
|
|
||||||
@@ -35,9 +40,8 @@ export const defaultReceipt = {
|
|||||||
/**
|
/**
|
||||||
* Transform to form in edit mode.
|
* Transform to form in edit mode.
|
||||||
*/
|
*/
|
||||||
export const transformToEditForm = (receipt) => ({
|
export const transformToEditForm = (receipt) => {
|
||||||
...transformToForm(receipt, defaultReceipt),
|
const initialEntries = [
|
||||||
entries: [
|
|
||||||
...receipt.entries.map((entry) => ({
|
...receipt.entries.map((entry) => ({
|
||||||
...transformToForm(entry, defaultReceiptEntry),
|
...transformToForm(entry, defaultReceiptEntry),
|
||||||
})),
|
})),
|
||||||
@@ -45,8 +49,17 @@ export const transformToEditForm = (receipt) => ({
|
|||||||
defaultReceiptEntry,
|
defaultReceiptEntry,
|
||||||
Math.max(MIN_LINES_NUMBER - receipt.entries.length, 0),
|
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) => {
|
export const useObserveReceiptNoSettings = (prefix, nextNumber) => {
|
||||||
const { setFieldValue } = useFormikContext();
|
const { setFieldValue } = useFormikContext();
|
||||||
|
|||||||
Reference in New Issue
Block a user