BIG-125: prevent items entries from send amount computed attribute.

This commit is contained in:
a.bouhuolia
2021-09-28 18:37:10 +02:00
parent 96269ccafb
commit 0aca6d9af7
10 changed files with 225 additions and 100 deletions

View File

@@ -2,7 +2,6 @@ import React, { useMemo } from 'react';
import { Formik, Form } from 'formik';
import { Intent } from '@blueprintjs/core';
import classNames from 'classnames';
import * as R from 'ramda';
import intl from 'react-intl-universal';
import { useHistory } from 'react-router-dom';
import { isEmpty } from 'lodash';
@@ -16,13 +15,14 @@ import BillItemsEntriesEditor from './BillItemsEntriesEditor';
import { AppToaster } from 'components';
import { ERROR } from 'common/errors';
import { useBillFormContext } from './BillFormProvider';
import { compose, safeSumBy } from 'utils';
import {
defaultBill,
filterNonZeroEntries,
transformToEditForm,
transformEntriesToSubmit,
transformFormValuesToRequest,
handleErrors,
} from './utils';
import withCurrentOrganization from 'containers/Organization/withCurrentOrganization';
@@ -55,35 +55,12 @@ function BillForm({
[bill, base_currency],
);
// Transform response error to fields.
const handleErrors = (errors, { setErrors }) => {
if (errors.some((e) => e.type === ERROR.BILL_NUMBER_EXISTS)) {
setErrors({
bill_number: intl.get('bill_number_exists'),
});
}
if (
errors.some(
(e) => e.type === ERROR.ENTRIES_ALLOCATED_COST_COULD_NOT_DELETED,
)
) {
setErrors(
AppToaster.show({
intent: Intent.DANGER,
message: 'ENTRIES_ALLOCATED_COST_COULD_NOT_DELETED',
}),
);
}
};
// Handles form submit.
const handleFormSubmit = (
values,
{ setSubmitting, setErrors, resetForm },
) => {
const entries = values.entries.filter(
(item) => item.item_id && item.quantity,
);
const entries = filterNonZeroEntries(values.entries);
const totalQuantity = safeSumBy(entries, 'quantity');
if (totalQuantity === 0) {
@@ -95,9 +72,8 @@ function BillForm({
return;
}
const form = {
...values,
...transformFormValuesToRequest(values),
open: submitPayload.status,
entries: transformEntriesToSubmit(entries),
};
// Handle the request success.
const onSuccess = (response) => {

View File

@@ -41,6 +41,12 @@ export const defaultBill = {
entries: [...repeatValue(defaultBillEntry, MIN_LINES_NUMBER)],
};
export const ERRORS = {
// Bills
BILL_NUMBER_EXISTS: 'BILL.NUMBER.EXISTS',
ENTRIES_ALLOCATED_COST_COULD_NOT_DELETED:
'ENTRIES_ALLOCATED_COST_COULD_NOT_DELETED',
};
/**
* Transformes the bill to initial values of edit form.
*/
@@ -70,11 +76,33 @@ export const transformToEditForm = (bill) => {
* Transformes bill entries to submit request.
*/
export const transformEntriesToSubmit = (entries) => {
const transformBillEntry = R.curry(transformToForm)(R.__, defaultBillEntry);
const transformBillEntry = R.compose(
R.omit(['amount']),
R.curry(transformToForm)(R.__, defaultBillEntry),
);
return R.compose(orderingLinesIndexes, R.map(transformBillEntry))(entries);
};
/**
* Filters the givne non-zero entries.
*/
export const filterNonZeroEntries = (entries) => {
return entries.filter((item) => item.item_id && item.quantity);
};
/**
* Transformes form values to request body.
*/
export const transformFormValuesToRequest = (values) => {
const entries = filterNonZeroEntries(values.entries);
return {
...values,
entries: transformEntriesToSubmit(entries),
open: false,
};
};
/**
* Handle delete errors.
*/
@@ -118,3 +146,24 @@ export const entriesFieldShouldUpdate = (newProps, oldProps) => {
defaultFastFieldShouldUpdate(newProps, oldProps)
);
};
// Transform response error to fields.
export const handleErrors = (errors, { setErrors }) => {
if (errors.some((e) => e.type === ERRORS.BILL_NUMBER_EXISTS)) {
setErrors({
bill_number: intl.get('bill_number_exists'),
});
}
if (
errors.some(
(e) => e.type === ERRORS.ENTRIES_ALLOCATED_COST_COULD_NOT_DELETED,
)
) {
setErrors(
AppToaster.show({
intent: Intent.DANGER,
message: 'ENTRIES_ALLOCATED_COST_COULD_NOT_DELETED',
}),
);
}
};