Compare commits

...

3 Commits

Author SHA1 Message Date
Ahmed Bouhuolia
4cd0405078 fix: quick payment received and payment made form initial values 2024-07-30 11:06:45 +02:00
Ahmed Bouhuolia
783102449f fix: create quick payment received and payment made transactions 2024-07-30 11:06:35 +02:00
Denis
ae617b2e1d Fixed Quick Payment Dialogs
PaymentReceives and BillsPayments Controllers expect 'amount' parameter, but webapp sends 'payment_amount'
2024-07-30 11:06:24 +02:00
8 changed files with 76 additions and 65 deletions

View File

@@ -3,15 +3,14 @@ import React from 'react';
import intl from 'react-intl-universal'; import intl from 'react-intl-universal';
import { Formik } from 'formik'; import { Formik } from 'formik';
import { Intent } from '@blueprintjs/core'; import { Intent } from '@blueprintjs/core';
import { pick } from 'lodash'; import { omit } from 'lodash';
import { AppToaster } from '@/components'; import { AppToaster } from '@/components';
import { CreateQuickPaymentMadeFormSchema } from './QuickPaymentMade.schema'; import { CreateQuickPaymentMadeFormSchema } from './QuickPaymentMade.schema';
import { useQuickPaymentMadeContext } from './QuickPaymentMadeFormProvider'; import { useQuickPaymentMadeContext } from './QuickPaymentMadeFormProvider';
import QuickPaymentMadeFormContent from './QuickPaymentMadeFormContent'; import QuickPaymentMadeFormContent from './QuickPaymentMadeFormContent';
import withDialogActions from '@/containers/Dialog/withDialogActions'; import withDialogActions from '@/containers/Dialog/withDialogActions';
import { defaultPaymentMade, transformErrors } from './utils'; import { defaultPaymentMade, transformBillToForm, transformErrors } from './utils';
import { compose } from '@/utils'; import { compose } from '@/utils';
/** /**
@@ -21,31 +20,24 @@ function QuickPaymentMadeForm({
// #withDialogActions // #withDialogActions
closeDialog, closeDialog,
}) { }) {
const { bill, dialogName, createPaymentMadeMutate } =
const { useQuickPaymentMadeContext();
bill,
dialogName,
createPaymentMadeMutate,
} = useQuickPaymentMadeContext();
// Initial form values // Initial form values.
const initialValues = { const initialValues = {
...defaultPaymentMade, ...defaultPaymentMade,
...bill, ...transformBillToForm(bill),
}; };
// Handles the form submit. // Handles the form submit.
const handleFormSubmit = (values, { setSubmitting, setFieldError }) => { const handleFormSubmit = (values, { setSubmitting, setFieldError }) => {
const entries = [values] const entries = [
.filter((entry) => entry.id && entry.payment_amount) {
.map((entry) => ({ payment_amount: values.amount,
bill_id: entry.id, bill_id: values.bill_id,
...pick(entry, ['payment_amount']), },
})); ];
const form = { const form = {
...values, ...omit(values, ['bill_id']),
vendor_id: values?.vendor?.id,
entries, entries,
}; };

View File

@@ -124,7 +124,7 @@ function QuickPaymentMadeFormFields({
</Col> </Col>
</Row> </Row>
{/*------------ Amount Received -----------*/} {/*------------ Amount Received -----------*/}
<FastField name={'payment_amount'}> <FastField name={'amount'}>
{({ {({
form: { values, setFieldValue }, form: { values, setFieldValue },
field: { value }, field: { value },
@@ -135,7 +135,7 @@ function QuickPaymentMadeFormFields({
labelInfo={<FieldRequiredHint />} labelInfo={<FieldRequiredHint />}
className={classNames('form-group--payment_amount', CLASSES.FILL)} className={classNames('form-group--payment_amount', CLASSES.FILL)}
intent={inputIntent({ error, touched })} intent={inputIntent({ error, touched })}
helperText={<ErrorMessage name="payment_amount" />} helperText={<ErrorMessage name="amount" />}
> >
<ControlGroup> <ControlGroup>
<InputPrependText text={values.currency_code} /> <InputPrependText text={values.currency_code} />
@@ -144,7 +144,7 @@ function QuickPaymentMadeFormFields({
value={value} value={value}
minimal={true} minimal={true}
onChange={(amount) => { onChange={(amount) => {
setFieldValue('payment_amount', amount); setFieldValue('amount', amount);
}} }}
intent={inputIntent({ error, touched })} intent={inputIntent({ error, touched })}
inputRef={(ref) => (paymentMadeFieldRef.current = ref)} inputRef={(ref) => (paymentMadeFieldRef.current = ref)}

View File

@@ -1,5 +1,5 @@
// @ts-nocheck // @ts-nocheck
import React from 'react'; import React, { useMemo } from 'react';
import { DialogContent } from '@/components'; import { DialogContent } from '@/components';
import { import {
useBill, useBill,
@@ -11,7 +11,6 @@ import { Features } from '@/constants';
import { useFeatureCan } from '@/hooks/state'; import { useFeatureCan } from '@/hooks/state';
import { pick } from 'lodash'; import { pick } from 'lodash';
const QuickPaymentMadeContext = React.createContext(); const QuickPaymentMadeContext = React.createContext();
/** /**
@@ -40,13 +39,14 @@ function QuickPaymentMadeFormProvider({ query, billId, dialogName, ...props }) {
isSuccess: isBranchesSuccess, isSuccess: isBranchesSuccess,
} = useBranches(query, { enabled: isBranchFeatureCan }); } = useBranches(query, { enabled: isBranchFeatureCan });
const paymentBill = useMemo(
() => pick(bill, ['id', 'due_amount', 'vendor_id', 'currency_code']),
[bill],
);
// State provider. // State provider.
const provider = { const provider = {
bill: { bill: paymentBill,
...pick(bill, ['id', 'due_amount', 'vendor', 'currency_code']),
vendor_id: bill?.vendor?.display_name,
payment_amount: bill?.due_amount,
},
accounts, accounts,
branches, branches,
dialogName, dialogName,

View File

@@ -2,24 +2,25 @@
import React from 'react'; import React from 'react';
import moment from 'moment'; import moment from 'moment';
import intl from 'react-intl-universal'; import intl from 'react-intl-universal';
import { first } from 'lodash'; import { first, pick } from 'lodash';
import { useFormikContext } from 'formik';
import { Intent } from '@blueprintjs/core'; import { Intent } from '@blueprintjs/core';
import { AppToaster } from '@/components'; import { AppToaster } from '@/components';
import { useFormikContext } from 'formik';
import { useQuickPaymentMadeContext } from './QuickPaymentMadeFormProvider'; import { useQuickPaymentMadeContext } from './QuickPaymentMadeFormProvider';
import { PAYMENT_MADE_ERRORS } from '@/containers/Purchases/PaymentMades/constants'; import { PAYMENT_MADE_ERRORS } from '@/containers/Purchases/PaymentMades/constants';
// Default initial values of payment made. // Default initial values of payment made.
export const defaultPaymentMade = { export const defaultPaymentMade = {
bill_id: '',
vendor_id: '', vendor_id: '',
payment_account_id: '', payment_account_id: '',
payment_date: moment(new Date()).format('YYYY-MM-DD'), payment_date: moment(new Date()).format('YYYY-MM-DD'),
reference: '', reference: '',
payment_number: '', payment_number: '',
amount: '',
// statement: '', // statement: '',
exchange_rate: 1, exchange_rate: 1,
branch_id: '', branch_id: '',
entries: [{ bill_id: '', payment_amount: '' }],
}; };
export const transformErrors = (errors, { setFieldError }) => { export const transformErrors = (errors, { setFieldError }) => {
@@ -58,3 +59,11 @@ export const useSetPrimaryBranchToForm = () => {
} }
}, [isBranchesSuccess, setFieldValue, branches]); }, [isBranchesSuccess, setFieldValue, branches]);
}; };
export const transformBillToForm = (bill) => {
return {
...pick(bill, ['vendor_id', 'currency_code']),
amount: bill.due_amount,
bill_id: bill.id,
};
}

View File

@@ -3,7 +3,7 @@ import React from 'react';
import intl from 'react-intl-universal'; import intl from 'react-intl-universal';
import { Formik } from 'formik'; import { Formik } from 'formik';
import { Intent } from '@blueprintjs/core'; import { Intent } from '@blueprintjs/core';
import { pick, defaultTo, omit } from 'lodash'; import { defaultTo, omit } from 'lodash';
import { AppToaster } from '@/components'; import { AppToaster } from '@/components';
import { useQuickPaymentReceiveContext } from './QuickPaymentReceiveFormProvider'; import { useQuickPaymentReceiveContext } from './QuickPaymentReceiveFormProvider';
@@ -12,7 +12,11 @@ import QuickPaymentReceiveFormContent from './QuickPaymentReceiveFormContent';
import withSettings from '@/containers/Settings/withSettings'; import withSettings from '@/containers/Settings/withSettings';
import withDialogActions from '@/containers/Dialog/withDialogActions'; import withDialogActions from '@/containers/Dialog/withDialogActions';
import { defaultInitialValues, transformErrors } from './utils'; import {
defaultInitialValues,
transformErrors,
transformInvoiceToForm,
} from './utils';
import { compose, transactionNumber } from '@/utils'; import { compose, transactionNumber } from '@/utils';
/** /**
@@ -26,14 +30,10 @@ function QuickPaymentReceiveForm({
paymentReceiveAutoIncrement, paymentReceiveAutoIncrement,
paymentReceiveNumberPrefix, paymentReceiveNumberPrefix,
paymentReceiveNextNumber, paymentReceiveNextNumber,
preferredDepositAccount preferredDepositAccount,
}) { }) {
const { dialogName, invoice, createPaymentReceiveMutate } =
const { useQuickPaymentReceiveContext();
dialogName,
invoice,
createPaymentReceiveMutate,
} = useQuickPaymentReceiveContext();
// Payment receive number. // Payment receive number.
const nextPaymentNumber = transactionNumber( const nextPaymentNumber = transactionNumber(
@@ -48,24 +48,22 @@ function QuickPaymentReceiveForm({
payment_receive_no: nextPaymentNumber, payment_receive_no: nextPaymentNumber,
}), }),
deposit_account_id: defaultTo(preferredDepositAccount, ''), deposit_account_id: defaultTo(preferredDepositAccount, ''),
...invoice, ...transformInvoiceToForm(invoice),
}; };
// Handles the form submit. // Handles the form submit.
const handleFormSubmit = (values, { setSubmitting, setFieldError }) => { const handleFormSubmit = (values, { setSubmitting, setFieldError }) => {
const entries = [values] const entries = [
.filter((entry) => entry.id && entry.payment_amount) {
.map((entry) => ({ invoice_id: values.invoice_id,
invoice_id: entry.id, payment_amount: values.amount,
...pick(entry, ['payment_amount']), },
})); ];
const form = { const form = {
...omit(values, ['payment_receive_no']), ...omit(values, ['payment_receive_no', 'invoice_id']),
...(!paymentReceiveAutoIncrement && { ...(!paymentReceiveAutoIncrement && {
payment_receive_no: values.payment_receive_no, payment_receive_no: values.payment_receive_no,
}), }),
customer_id: values.customer.id,
entries, entries,
}; };

View File

@@ -128,7 +128,7 @@ function QuickPaymentReceiveFormFields({
</Col> </Col>
</Row> </Row>
{/*------------ Amount Received -----------*/} {/*------------ Amount Received -----------*/}
<FastField name={'payment_amount'}> <FastField name={'amount'}>
{({ {({
form: { values, setFieldValue }, form: { values, setFieldValue },
field: { value }, field: { value },
@@ -139,7 +139,7 @@ function QuickPaymentReceiveFormFields({
labelInfo={<FieldRequiredHint />} labelInfo={<FieldRequiredHint />}
className={classNames('form-group--payment_amount', CLASSES.FILL)} className={classNames('form-group--payment_amount', CLASSES.FILL)}
intent={inputIntent({ error, touched })} intent={inputIntent({ error, touched })}
helperText={<ErrorMessage name="payment_amount" />} helperText={<ErrorMessage name="amount" />}
> >
<ControlGroup> <ControlGroup>
<InputPrependText text={values.currency_code} /> <InputPrependText text={values.currency_code} />
@@ -148,7 +148,7 @@ function QuickPaymentReceiveFormFields({
value={value} value={value}
minimal={true} minimal={true}
onChange={(amount) => { onChange={(amount) => {
setFieldValue('payment_amount', amount); setFieldValue('amount', amount);
}} }}
intent={inputIntent({ error, touched })} intent={inputIntent({ error, touched })}
inputRef={(ref) => (paymentReceiveFieldRef.current = ref)} inputRef={(ref) => (paymentReceiveFieldRef.current = ref)}

View File

@@ -1,5 +1,5 @@
// @ts-nocheck // @ts-nocheck
import React, { useContext, createContext } from 'react'; import React, { useContext, createContext, useMemo } from 'react';
import { pick } from 'lodash'; import { pick } from 'lodash';
import { DialogContent } from '@/components'; import { DialogContent } from '@/components';
import { Features } from '@/constants'; import { Features } from '@/constants';
@@ -47,15 +47,16 @@ function QuickPaymentReceiveFormProvider({
isSuccess: isBranchesSuccess, isSuccess: isBranchesSuccess,
} = useBranches(query, { enabled: isBranchFeatureCan }); } = useBranches(query, { enabled: isBranchFeatureCan });
const invoicePayment = useMemo(
() => pick(invoice, ['id', 'due_amount', 'customer_id', 'currency_code']),
[invoice],
);
// State provider. // State provider.
const provider = { const provider = {
accounts, accounts,
branches, branches,
invoice: { invoice: invoicePayment,
...pick(invoice, ['id', 'due_amount', 'customer', 'currency_code']),
customer_id: invoice?.customer?.display_name,
payment_amount: invoice.due_amount,
},
isAccountsLoading, isAccountsLoading,
isSettingsLoading, isSettingsLoading,
isBranchesSuccess, isBranchesSuccess,

View File

@@ -2,7 +2,7 @@
import React from 'react'; import React from 'react';
import moment from 'moment'; import moment from 'moment';
import intl from 'react-intl-universal'; import intl from 'react-intl-universal';
import { first } from 'lodash'; import { first, pick } from 'lodash';
import { Intent } from '@blueprintjs/core'; import { Intent } from '@blueprintjs/core';
import { AppToaster } from '@/components'; import { AppToaster } from '@/components';
@@ -10,15 +10,16 @@ import { useFormikContext } from 'formik';
import { useQuickPaymentReceiveContext } from './QuickPaymentReceiveFormProvider'; import { useQuickPaymentReceiveContext } from './QuickPaymentReceiveFormProvider';
export const defaultInitialValues = { export const defaultInitialValues = {
invoice_id: '',
customer_id: '', customer_id: '',
deposit_account_id: '', deposit_account_id: '',
payment_receive_no: '', payment_receive_no: '',
payment_date: moment(new Date()).format('YYYY-MM-DD'), payment_date: moment(new Date()).format('YYYY-MM-DD'),
reference_no: '', reference_no: '',
amount: '',
// statement: '', // statement: '',
exchange_rate: 1, exchange_rate: 1,
branch_id: '', branch_id: '',
entries: [{ invoice_id: '', payment_amount: '' }],
}; };
export const transformErrors = (errors, { setFieldError }) => { export const transformErrors = (errors, { setFieldError }) => {
@@ -44,7 +45,9 @@ export const transformErrors = (errors, { setFieldError }) => {
} }
if (getError('PAYMENT_ACCOUNT_CURRENCY_INVALID')) { if (getError('PAYMENT_ACCOUNT_CURRENCY_INVALID')) {
AppToaster.show({ AppToaster.show({
message: intl.get('payment_Receive.error.payment_account_currency_invalid'), message: intl.get(
'payment_Receive.error.payment_account_currency_invalid',
),
intent: Intent.DANGER, intent: Intent.DANGER,
}); });
} }
@@ -64,3 +67,11 @@ export const useSetPrimaryBranchToForm = () => {
} }
}, [isBranchesSuccess, setFieldValue, branches]); }, [isBranchesSuccess, setFieldValue, branches]);
}; };
export const transformInvoiceToForm = (invoice) => {
return {
...pick(invoice, ['customer_id', 'currency_code']),
amount: invoice.due_amount,
invoice_id: invoice.id,
};
};