diff --git a/client/src/common/dataTypes.js b/client/src/common/dataTypes.js new file mode 100644 index 000000000..8a87f87e7 --- /dev/null +++ b/client/src/common/dataTypes.js @@ -0,0 +1,7 @@ +export const DATATYPES_LENGTH = { + STRING: 255, + TEXT: 65535, + INT_10: 4294967295, + DECIMAL_13_3: 9999999999.999, + DECIMAL_15_5: 999999999999.999, +}; diff --git a/client/src/containers/Accounting/MakeJournalEntriesForm.schema.js b/client/src/containers/Accounting/MakeJournalEntriesForm.schema.js new file mode 100644 index 000000000..fb1add89f --- /dev/null +++ b/client/src/containers/Accounting/MakeJournalEntriesForm.schema.js @@ -0,0 +1,40 @@ +import * as Yup from 'yup'; +import { formatMessage } from 'services/intl'; +import { DATATYPES_LENGTH } from 'common/dataTypes'; + +const Schema = Yup.object().shape({ + journal_number: Yup.string() + .required() + .min(1) + .max(DATATYPES_LENGTH.STRING) + .label(formatMessage({ id: 'journal_number_' })), + journal_type: Yup.string() + .required() + .min(1) + .max(DATATYPES_LENGTH.STRING) + .label(formatMessage({ id: 'journal_type' })), + date: Yup.date() + .required() + .label(formatMessage({ id: 'date' })), + currency_code: Yup.string().max(3), + reference: Yup.string().min(1).max(DATATYPES_LENGTH.STRING), + description: Yup.string().min(1).max(DATATYPES_LENGTH.STRING), + entries: Yup.array().of( + Yup.object().shape({ + credit: Yup.number().decimalScale(13).nullable(), + debit: Yup.number().decimalScale(13).nullable(), + account_id: Yup.number() + .nullable() + .when(['credit', 'debit'], { + is: (credit, debit) => credit || debit, + then: Yup.number().required(), + }), + contact_id: Yup.number().nullable(), + contact_type: Yup.string().nullable(), + note: Yup.string().max(DATATYPES_LENGTH.TEXT).nullable(), + }), + ), +}); + +export const CreateMakeJournalFormSchema = Schema; +export const EditMakeJournalFormSchema = Schema; diff --git a/client/src/containers/Dialogs/AccountFormDialog/AccountForm.schema.js b/client/src/containers/Dialogs/AccountFormDialog/AccountForm.schema.js new file mode 100644 index 000000000..c2633b931 --- /dev/null +++ b/client/src/containers/Dialogs/AccountFormDialog/AccountForm.schema.js @@ -0,0 +1,21 @@ +import * as Yup from 'yup'; +import { formatMessage } from 'services/intl'; +import { DATATYPES_LENGTH } from 'common/dataTypes'; + +const Schema = Yup.object().shape({ + name: Yup.string() + .required() + .min(3) + .max(DATATYPES_LENGTH.STRING) + .label(formatMessage({ id: 'account_name_' })), + code: Yup.string().digits().min(3).max(6), + account_type_id: Yup.number() + .nullable() + .required() + .label(formatMessage({ id: 'account_type_id' })), + description: Yup.string().min(3).max(DATATYPES_LENGTH.TEXT).nullable().trim(), + parent_account_id: Yup.number().nullable(), +}); + +export const CreateAccountFormSchema = Schema; +export const EditAccountFormSchema = Schema; diff --git a/client/src/containers/Dialogs/AccountFormDialog/AccountFormDialogContent.js b/client/src/containers/Dialogs/AccountFormDialog/AccountFormDialogContent.js index 6d5c9bafd..5880c8f8f 100644 --- a/client/src/containers/Dialogs/AccountFormDialog/AccountFormDialogContent.js +++ b/client/src/containers/Dialogs/AccountFormDialog/AccountFormDialogContent.js @@ -30,7 +30,10 @@ import withAccountsActions from 'containers/Accounts/withAccountsActions'; import withAccountDetail from 'containers/Accounts/withAccountDetail'; import withAccounts from 'containers/Accounts/withAccounts'; import withDialogActions from 'containers/Dialog/withDialogActions'; - +import { + EditAccountFormSchema, + CreateAccountFormSchema, +} from './AccountForm.schema'; import { compose } from 'utils'; /** @@ -61,19 +64,12 @@ function AccountFormDialogContent({ accountTypeId, }) { const { formatMessage } = useIntl(); - const validationSchema = Yup.object().shape({ - name: Yup.string() - .required() - .min(3) - .max(255) - .label(formatMessage({ id: 'account_name_' })), - code: Yup.string().digits().min(3).max(6), - account_type_id: Yup.number().nullable() - .required() - .label(formatMessage({ id: 'account_type_id' })), - description: Yup.string().min(3).max(512).nullable().trim(), - parent_account_id: Yup.number().nullable(), - }); + const isNewMode = !accountId; + + const validationSchema = isNewMode + ? CreateAccountFormSchema + : EditAccountFormSchema; + const initialValues = useMemo( () => ({ account_type_id: '', @@ -194,18 +190,14 @@ function AccountFormDialogContent({ }, [closeDialog, dialogName]); // Fetches accounts list. - const fetchAccountsList = useQuery( - 'accounts-list', - () => requestFetchAccounts(), + const fetchAccountsList = useQuery('accounts-list', () => + requestFetchAccounts(), ); // Fetches accounts types. - const fetchAccountsTypes = useQuery( - 'accounts-types-list', - async () => { - await requestFetchAccountTypes(); - }, - ); + const fetchAccountsTypes = useQuery('accounts-types-list', async () => { + await requestFetchAccountTypes(); + }); // Fetch the given account id on edit mode. const fetchAccount = useQuery( diff --git a/client/src/containers/Dialogs/ItemCategoryDialog/ItemCategoryFormDialogContent.js b/client/src/containers/Dialogs/ItemCategoryDialog/ItemCategoryFormDialogContent.js index cc5b5f0c1..11dadd132 100644 --- a/client/src/containers/Dialogs/ItemCategoryDialog/ItemCategoryFormDialogContent.js +++ b/client/src/containers/Dialogs/ItemCategoryDialog/ItemCategoryFormDialogContent.js @@ -1,11 +1,11 @@ import React, { useMemo, useCallback } from 'react'; import { Intent } from '@blueprintjs/core'; -import * as Yup from 'yup'; import { useQuery, queryCache } from 'react-query'; import { FormattedMessage as T, useIntl } from 'react-intl'; import { Formik } from 'formik'; import { AppToaster, DialogContent } from 'components'; +import ItemCategoryForm from './ItemCategoryForm'; import withItemCategories from 'containers/Items/withItemCategories'; import withItemCategoryDetail from 'containers/Items/withItemCategoryDetail'; import withItemCategoriesActions from 'containers/Items/withItemCategoriesActions'; @@ -14,8 +14,11 @@ import withAccounts from 'containers/Accounts/withAccounts'; import withAccountsActions from 'containers/Accounts/withAccountsActions'; import withDialogActions from 'containers/Dialog/withDialogActions'; +import { + EditItemCategoryFormSchema, + CreateItemCategoryFormSchema, +} from './itemCategoryForm.schema'; import { compose, transformToForm } from 'utils'; -import ItemCategoryForm from './ItemCategoryForm'; const defaultInitialValues = { name: '', @@ -70,17 +73,6 @@ function ItemCategoryFormDialogContent({ requestFetchAccounts(), ); - const validationSchema = Yup.object().shape({ - name: Yup.string() - .required() - .label(formatMessage({ id: 'category_name_' })), - parent_category_id: Yup.number().nullable(), - cost_account_id: Yup.number().nullable(), - sell_account_id: Yup.number().nullable(), - inventory_account_id: Yup.number().nullable(), - description: Yup.string().trim().nullable(), - }); - const initialValues = useMemo( () => ({ ...defaultInitialValues, @@ -131,7 +123,9 @@ function ItemCategoryFormDialogContent({ isLoading={fetchCategoriesList.isFetching || fetchAccountsList.isFetching} > diff --git a/client/src/containers/Dialogs/ItemCategoryDialog/itemCategoryForm.schema.js b/client/src/containers/Dialogs/ItemCategoryDialog/itemCategoryForm.schema.js new file mode 100644 index 000000000..57bf072a2 --- /dev/null +++ b/client/src/containers/Dialogs/ItemCategoryDialog/itemCategoryForm.schema.js @@ -0,0 +1,18 @@ +import * as Yup from 'yup'; +import { formatMessage } from 'services/intl'; +import { DATATYPES_LENGTH } from 'common/dataTypes'; + +const Schema = Yup.object().shape({ + name: Yup.string() + .required() + .max(DATATYPES_LENGTH.STRING) + .label(formatMessage({ id: 'category_name_' })), + parent_category_id: Yup.number().nullable(), + cost_account_id: Yup.number().nullable(), + sell_account_id: Yup.number().nullable(), + inventory_account_id: Yup.number().nullable(), + description: Yup.string().trim().max(DATATYPES_LENGTH.TEXT).nullable(), +}); + +export const CreateItemCategoryFormSchema = Schema; +export const EditItemCategoryFormSchema = Schema; diff --git a/client/src/containers/Expenses/ExpenseForm.js b/client/src/containers/Expenses/ExpenseForm.js index f5543642a..4fcf0c080 100644 --- a/client/src/containers/Expenses/ExpenseForm.js +++ b/client/src/containers/Expenses/ExpenseForm.js @@ -26,7 +26,10 @@ import withSettings from 'containers/Settings/withSettings'; import AppToaster from 'components/AppToaster'; import Dragzone from 'components/Dragzone'; - +import { + CreateExpenseFormSchema, + EditExpenseFormSchema, +} from './ExpenseForm.schema'; import useMedia from 'hooks/useMedia'; import { compose, repeatValue, transformToForm } from 'utils'; @@ -64,8 +67,9 @@ function ExpenseForm({ onCancelForm, }) { const [payload, setPayload] = useState({}); - const history = useHistory(); + + const isNewMode = !expenseId; const { formatMessage } = useIntl(); const { @@ -79,38 +83,9 @@ function ExpenseForm({ deleteCallback: requestDeleteMedia, }); - const validationSchema = Yup.object().shape({ - beneficiary: Yup.string().label(formatMessage({ id: 'beneficiary' })), - payment_account_id: Yup.number() - .required() - .label(formatMessage({ id: 'payment_account_' })), - payment_date: Yup.date() - .required() - .label(formatMessage({ id: 'payment_date_' })), - reference_no: Yup.string().min(1).max(255), - currency_code: Yup.string() - .nullable() - .label(formatMessage({ id: 'currency_code' })), - description: Yup.string() - .trim() - .min(1) - .max(1024) - .label(formatMessage({ id: 'description' })), - publish: Yup.boolean().label(formatMessage({ id: 'publish' })), - categories: Yup.array().of( - Yup.object().shape({ - index: Yup.number().min(1).max(1000).nullable(), - amount: Yup.number().decimalScale(13).nullable(), - expense_account_id: Yup.number() - .nullable() - .when(['amount'], { - is: (amount) => amount, - then: Yup.number().required(), - }), - description: Yup.string().nullable(), - }), - ), - }); + const validationSchema = isNewMode + ? CreateExpenseFormSchema + : EditExpenseFormSchema; const handleDropFiles = useCallback((_files) => { setFiles(_files.filter((file) => file.uploaded === false)); diff --git a/client/src/containers/Expenses/ExpenseForm.schema.js b/client/src/containers/Expenses/ExpenseForm.schema.js new file mode 100644 index 000000000..b65756c37 --- /dev/null +++ b/client/src/containers/Expenses/ExpenseForm.schema.js @@ -0,0 +1,40 @@ +import * as Yup from 'yup'; +import { formatMessage } from 'services/intl'; +import { DATATYPES_LENGTH } from 'common/dataTypes'; + +const Schema = Yup.object().shape({ + beneficiary: Yup.string().label(formatMessage({ id: 'beneficiary' })), + payment_account_id: Yup.number() + .required() + .label(formatMessage({ id: 'payment_account_' })), + payment_date: Yup.date() + .required() + .label(formatMessage({ id: 'payment_date_' })), + reference_no: Yup.string().min(1).max(DATATYPES_LENGTH.STRING), + currency_code: Yup.string() + .nullable() + .max(3) + .label(formatMessage({ id: 'currency_code' })), + description: Yup.string() + .trim() + .min(1) + .max(DATATYPES_LENGTH.TEXT) + .label(formatMessage({ id: 'description' })), + publish: Yup.boolean().label(formatMessage({ id: 'publish' })), + categories: Yup.array().of( + Yup.object().shape({ + index: Yup.number().min(1).max(DATATYPES_LENGTH.INT_10).nullable(), + amount: Yup.number().decimalScale(13).nullable(), + expense_account_id: Yup.number() + .nullable() + .when(['amount'], { + is: (amount) => amount, + then: Yup.number().required(), + }), + description: Yup.string().max(DATATYPES_LENGTH.TEXT).nullable(), + }), + ), +}); + +export const CreateExpenseFormSchema = Schema; +export const EditExpenseFormSchema = Schema; diff --git a/client/src/containers/Items/ItemForm.schema.js b/client/src/containers/Items/ItemForm.schema.js index 138967309..b745c71c0 100644 --- a/client/src/containers/Items/ItemForm.schema.js +++ b/client/src/containers/Items/ItemForm.schema.js @@ -1,16 +1,21 @@ import * as Yup from 'yup'; import { formatMessage } from 'services/intl'; +import { DATATYPES_LENGTH } from 'common/dataTypes'; const Schema = Yup.object().shape({ active: Yup.boolean(), name: Yup.string() .required() + .min(0) + .max(DATATYPES_LENGTH.STRING) .label(formatMessage({ id: 'item_name_' })), type: Yup.string() .trim() .required() + .min(0) + .max(DATATYPES_LENGTH.STRING) .label(formatMessage({ id: 'item_type_' })), - sku: Yup.string().trim(), + sku: Yup.string().trim().min(0).max(DATATYPES_LENGTH.STRING), cost_price: Yup.number().when(['purchasable'], { is: true, then: Yup.number() @@ -53,4 +58,4 @@ const Schema = Yup.object().shape({ }); export const CreateItemFormSchema = Schema; -export const EditItemFormSchema = Schema; \ No newline at end of file +export const EditItemFormSchema = Schema; diff --git a/client/src/containers/Purchases/Bill/BillForm.schema.js b/client/src/containers/Purchases/Bill/BillForm.schema.js index 1b3af549d..8f7cf1ba2 100644 --- a/client/src/containers/Purchases/Bill/BillForm.schema.js +++ b/client/src/containers/Purchases/Bill/BillForm.schema.js @@ -1,5 +1,6 @@ import * as Yup from 'yup'; import { formatMessage } from 'services/intl'; +import { DATATYPES_LENGTH } from 'common/dataTypes'; const BillFormSchema = Yup.object().shape({ vendor_id: Yup.number() @@ -12,22 +13,24 @@ const BillFormSchema = Yup.object().shape({ .required() .label(formatMessage({ id: 'due_date_' })), bill_number: Yup.string() + .max(DATATYPES_LENGTH.STRING) .label(formatMessage({ id: 'bill_number_' })), - reference_no: Yup.string().nullable().min(1).max(255), + reference_no: Yup.string().nullable().min(1).max(DATATYPES_LENGTH.STRING), note: Yup.string() .trim() .min(1) - .max(1024) + .max(DATATYPES_LENGTH.TEXT) .label(formatMessage({ id: 'note' })), entries: Yup.array().of( Yup.object().shape({ quantity: Yup.number() .nullable() + .max(DATATYPES_LENGTH.INT_10) .when(['rate'], { is: (rate) => rate, then: Yup.number().required(), }), - rate: Yup.number().nullable(), + rate: Yup.number().nullable().max(DATATYPES_LENGTH.INT_10), item_id: Yup.number() .nullable() .when(['quantity', 'rate'], { @@ -35,8 +38,8 @@ const BillFormSchema = Yup.object().shape({ then: Yup.number().required(), }), total: Yup.number().nullable(), - discount: Yup.number().nullable().min(0).max(100), - description: Yup.string().nullable(), + discount: Yup.number().nullable().min(0).max(DATATYPES_LENGTH.INT_10), + description: Yup.string().nullable().max(DATATYPES_LENGTH.TEXT), }), ), }); @@ -44,7 +47,4 @@ const BillFormSchema = Yup.object().shape({ const CreateBillFormSchema = BillFormSchema; const EditBillFormSchema = BillFormSchema; -export { - CreateBillFormSchema, - EditBillFormSchema, -}; +export { CreateBillFormSchema, EditBillFormSchema }; diff --git a/client/src/containers/Purchases/PaymentMades/PaymentMadeForm.js b/client/src/containers/Purchases/PaymentMades/PaymentMadeForm.js index 2d29efe01..b12a59cbd 100644 --- a/client/src/containers/Purchases/PaymentMades/PaymentMadeForm.js +++ b/client/src/containers/Purchases/PaymentMades/PaymentMadeForm.js @@ -21,7 +21,10 @@ import withPaymentMadeDetail from './withPaymentMadeDetail'; import withPaymentMade from './withPaymentMade'; import withSettings from 'containers/Settings/withSettings'; import withDashboardActions from 'containers/Dashboard/withDashboardActions'; - +import { + EditPaymentMadeFormSchema, + CreatePaymentMadeFormSchema, +} from './PaymentMadeForm.schema'; import { compose, orderingLinesIndexes } from 'utils'; const ERRORS = { @@ -73,50 +76,27 @@ function PaymentMadeForm({ }) { const history = useHistory(); const { formatMessage } = useIntl(); - + const isNewMode = !paymentMadeId; const [amountChangeAlert, setAmountChangeAlert] = useState(false); const [clearLinesAlert, setClearLinesAlert] = useState(false); const [clearFormAlert, setClearFormAlert] = useState(false); const [fullAmount, setFullAmount] = useState(null); - const [localPaymentEntries, setLocalPaymentEntries] = useState(paymentMadeEntries); + const [localPaymentEntries, setLocalPaymentEntries] = useState( + paymentMadeEntries, + ); useEffect(() => { if (localPaymentEntries !== paymentMadeEntries) { setLocalPaymentEntries(paymentMadeEntries); } - }, [localPaymentEntries, paymentMadeEntries]) + }, [localPaymentEntries, paymentMadeEntries]); // Yup validation schema. - const validationSchema = Yup.object().shape({ - vendor_id: Yup.string() - .label(formatMessage({ id: 'vendor_name_' })) - .required(), - payment_date: Yup.date() - .required() - .label(formatMessage({ id: 'payment_date_' })), - payment_account_id: Yup.number() - .required() - .label(formatMessage({ id: 'payment_account_' })), - payment_number: Yup.string() - .label(formatMessage({ id: 'payment_no_' })), - reference: Yup.string().min(1).max(255).nullable(), - description: Yup.string(), - entries: Yup.array().of( - Yup.object().shape({ - id: Yup.number().nullable(), - due_amount: Yup.number().nullable(), - payment_amount: Yup.number().nullable().max(Yup.ref('due_amount')), - bill_id: Yup.number() - .nullable() - .when(['payment_amount'], { - is: (payment_amount) => payment_amount, - then: Yup.number().required(), - }), - }), - ), - }); - + const validationSchema = isNewMode + ? CreatePaymentMadeFormSchema + : EditPaymentMadeFormSchema; + // Form initial values. const initialValues = useMemo( () => ({ @@ -246,7 +226,7 @@ function PaymentMadeForm({ const resetEntriesPaymentAmount = (entries) => { return entries.map((entry) => ({ ...entry, payment_amount: 0 })); - } + }; // Handle fetch success of vendor bills entries. const handleFetchEntriesSuccess = useCallback( (entries) => { @@ -307,10 +287,13 @@ function PaymentMadeForm({ changePageSubtitle(paymentNumber); }; - // Clear page subtitle before once page leave. - useEffect(() => () => { - changePageSubtitle('') - }, [changePageSubtitle]); + // Clear page subtitle before once page leave. + useEffect( + () => () => { + changePageSubtitle(''); + }, + [changePageSubtitle], + ); const fullAmountPaid = useMemo( () => sumBy(values.entries, 'payment_amount'), @@ -385,9 +368,7 @@ function PaymentMadeForm({

Are you sure you want to clear this transaction?

- + payment_amount, + then: Yup.number().required(), + }), + }), + ), +}); + +export const CreatePaymentMadeFormSchema = Schema; +export const EditPaymentMadeFormSchema = Schema; diff --git a/client/src/containers/Sales/Estimate/EstimateForm.schema.js b/client/src/containers/Sales/Estimate/EstimateForm.schema.js index e72697a1f..9e64f31cd 100644 --- a/client/src/containers/Sales/Estimate/EstimateForm.schema.js +++ b/client/src/containers/Sales/Estimate/EstimateForm.schema.js @@ -1,7 +1,8 @@ import * as Yup from 'yup'; import { formatMessage } from 'services/intl'; +import { DATATYPES_LENGTH } from 'common/dataTypes'; -const Schema = Yup.object().shape({ +const Schema = Yup.object().shape({ customer_id: Yup.number() .label(formatMessage({ id: 'customer_name_' })) .required(), @@ -13,38 +14,40 @@ const Schema = Yup.object().shape({ .label(formatMessage({ id: 'expiration_date_' })), estimate_number: Yup.string() .nullable() + .max(DATATYPES_LENGTH.STRING) .label(formatMessage({ id: 'estimate_number_' })), - reference: Yup.string().min(1).max(255).nullable(), + reference: Yup.string().min(1).max(DATATYPES_LENGTH.STRING).nullable(), note: Yup.string() .trim() .min(1) - .max(1024) + .max(DATATYPES_LENGTH.STRING) .label(formatMessage({ id: 'note' })), terms_conditions: Yup.string() .trim() .min(1) - .max(1024) + .max(DATATYPES_LENGTH.TEXT) .label(formatMessage({ id: 'note' })), entries: Yup.array().of( Yup.object().shape({ quantity: Yup.number() .nullable() + .max(DATATYPES_LENGTH.INT_10) .when(['rate'], { is: (rate) => rate, then: Yup.number().required(), }), - rate: Yup.number().nullable(), + rate: Yup.number().nullable().max(DATATYPES_LENGTH.INT_10), item_id: Yup.number() .nullable() .when(['quantity', 'rate'], { is: (quantity, rate) => quantity || rate, then: Yup.number().required(), }), - discount: Yup.number().nullable().min(0).max(100), - description: Yup.string().nullable(), + discount: Yup.number().nullable().min(0).max(DATATYPES_LENGTH.INT_10), + description: Yup.string().nullable().max(DATATYPES_LENGTH.TEXT), }), ), }); export const CreateEstimateFormSchema = Schema; -export const EditEstimateFormSchema = Schema; \ No newline at end of file +export const EditEstimateFormSchema = Schema; diff --git a/client/src/containers/Sales/Invoice/InvoiceForm.schema.js b/client/src/containers/Sales/Invoice/InvoiceForm.schema.js index 8a74ac522..69c292e52 100644 --- a/client/src/containers/Sales/Invoice/InvoiceForm.schema.js +++ b/client/src/containers/Sales/Invoice/InvoiceForm.schema.js @@ -1,5 +1,6 @@ import * as Yup from 'yup'; import { formatMessage } from 'services/intl'; +import { DATATYPES_LENGTH } from 'common/dataTypes'; const Schema = Yup.object().shape({ customer_id: Yup.string() @@ -12,39 +13,40 @@ const Schema = Yup.object().shape({ .required() .label(formatMessage({ id: 'due_date_' })), invoice_no: Yup.string() - .label(formatMessage({ id: 'invoice_no_' })), - reference_no: Yup.string().min(1).max(255), + .max(DATATYPES_LENGTH.STRING) + .label(formatMessage({ id: 'invoice_no_' })), + reference_no: Yup.string().min(1).max(DATATYPES_LENGTH.STRING), status: Yup.string().required(), invoice_message: Yup.string() .trim() .min(1) - .max(1024) + .max(DATATYPES_LENGTH.TEXT) .label(formatMessage({ id: 'note' })), terms_conditions: Yup.string() .trim() .min(1) - .max(1024) + .max(DATATYPES_LENGTH.TEXT) .label(formatMessage({ id: 'note' })), entries: Yup.array().of( Yup.object().shape({ quantity: Yup.number() - .nullable() + .nullable().max(DATATYPES_LENGTH.INT_10) .when(['rate'], { is: (rate) => rate, then: Yup.number().required(), }), - rate: Yup.number().nullable(), + rate: Yup.number().nullable().max(DATATYPES_LENGTH.INT_10), item_id: Yup.number() .nullable() .when(['quantity', 'rate'], { is: (quantity, rate) => quantity || rate, then: Yup.number().required(), }), - discount: Yup.number().nullable().min(0).max(100), - description: Yup.string().nullable(), + discount: Yup.number().nullable().min(0).max(DATATYPES_LENGTH.INT_10), + description: Yup.string().nullable().max(DATATYPES_LENGTH.TEXT), }), ), }); export const CreateInvoiceFormSchema = Schema; -export const EditInvoiceFormSchema = Schema; \ No newline at end of file +export const EditInvoiceFormSchema = Schema; diff --git a/client/src/containers/Sales/PaymentReceive/PaymentReceiveForm.js b/client/src/containers/Sales/PaymentReceive/PaymentReceiveForm.js index 725ad442f..bd9e3e71f 100644 --- a/client/src/containers/Sales/PaymentReceive/PaymentReceiveForm.js +++ b/client/src/containers/Sales/PaymentReceive/PaymentReceiveForm.js @@ -26,6 +26,10 @@ import withPaymentReceiveDetail from './withPaymentReceiveDetail'; import withPaymentReceives from './withPaymentReceives'; import withSettings from 'containers/Settings/withSettings'; import withDashboardActions from 'containers/Dashboard/withDashboardActions'; +import { + EditPaymentReceiveFormSchema, + CreatePaymentReceiveFormSchema, +} from './PaymentReceiveForm.schema'; import { AppToaster } from 'components'; import { compose } from 'utils'; @@ -64,7 +68,7 @@ function PaymentReceiveForm({ const [clearFormAlert, setClearFormAlert] = useState(false); const { formatMessage } = useIntl(); - + const isNewMode = !paymentReceiveId; const [localPaymentEntries, setLocalPaymentEntries] = useState( paymentReceiveEntries, ); @@ -96,37 +100,10 @@ function PaymentReceiveForm({ }, [localPaymentEntries, paymentReceiveEntries]); // Form validation schema. - const validationSchema = Yup.object().shape({ - customer_id: Yup.string() - .label(formatMessage({ id: 'customer_name_' })) - .required(), - payment_date: Yup.date() - .required() - .label(formatMessage({ id: 'payment_date_' })), - deposit_account_id: Yup.number() - .required() - .label(formatMessage({ id: 'deposit_account_' })), - full_amount: Yup.number().nullable(), - payment_receive_no: Yup.string().label( - formatMessage({ id: 'payment_receive_no_' }), - ), - reference_no: Yup.string().min(1).max(255).nullable(), - description: Yup.string().nullable(), - entries: Yup.array().of( - Yup.object().shape({ - id: Yup.number().nullable(), - due_amount: Yup.number().nullable(), - payment_amount: Yup.number().nullable().max(Yup.ref('due_amount')), - invoice_id: Yup.number() - .nullable() - .when(['payment_amount'], { - is: (payment_amount) => payment_amount, - then: Yup.number().required(), - }), - }), - ), - }); - + const validationSchema = isNewMode + ? CreatePaymentReceiveFormSchema + : EditPaymentReceiveFormSchema; + // Default payment receive entry. const defaultPaymentReceiveEntry = { id: null, @@ -354,7 +331,6 @@ function PaymentReceiveForm({ changePageSubtitle, ]); - const handlePaymentReceiveNumberChanged = useCallback( (payment_receive_no) => { changePageSubtitle(`No.${payment_receive_no}`); diff --git a/client/src/containers/Sales/PaymentReceive/PaymentReceiveForm.schema.js b/client/src/containers/Sales/PaymentReceive/PaymentReceiveForm.schema.js new file mode 100644 index 000000000..39982e0f2 --- /dev/null +++ b/client/src/containers/Sales/PaymentReceive/PaymentReceiveForm.schema.js @@ -0,0 +1,37 @@ +import * as Yup from 'yup'; +import { formatMessage } from 'services/intl'; +import { DATATYPES_LENGTH } from 'common/dataTypes'; + +const Schema = Yup.object().shape({ + customer_id: Yup.string() + .label(formatMessage({ id: 'customer_name_' })) + .required(), + payment_date: Yup.date() + .required() + .label(formatMessage({ id: 'payment_date_' })), + deposit_account_id: Yup.number() + .required() + .label(formatMessage({ id: 'deposit_account_' })), + full_amount: Yup.number().nullable(), + payment_receive_no: Yup.string() + .max(DATATYPES_LENGTH.STRING) + .label(formatMessage({ id: 'payment_receive_no_' })), + reference_no: Yup.string().min(1).max(DATATYPES_LENGTH.STRING).nullable(), + description: Yup.string().nullable().max(DATATYPES_LENGTH.TEXT), + entries: Yup.array().of( + Yup.object().shape({ + id: Yup.number().nullable(), + due_amount: Yup.number().nullable(), + payment_amount: Yup.number().nullable().max(Yup.ref('due_amount')), + invoice_id: Yup.number() + .nullable() + .when(['payment_amount'], { + is: (payment_amount) => payment_amount, + then: Yup.number().required(), + }), + }), + ), +}); + +export const CreatePaymentReceiveFormSchema = Schema; +export const EditPaymentReceiveFormSchema = Schema; diff --git a/client/src/containers/Sales/Receipt/ReceiptForm.schema.js b/client/src/containers/Sales/Receipt/ReceiptForm.schema.js index e6bd5aecb..d382910de 100644 --- a/client/src/containers/Sales/Receipt/ReceiptForm.schema.js +++ b/client/src/containers/Sales/Receipt/ReceiptForm.schema.js @@ -1,5 +1,6 @@ import * as Yup from 'yup'; import { formatMessage } from 'services/intl'; +import { DATATYPES_LENGTH } from 'common/dataTypes'; const Schema = Yup.object().shape({ customer_id: Yup.string() @@ -10,38 +11,40 @@ const Schema = Yup.object().shape({ .label(formatMessage({ id: 'receipt_date_' })), receipt_number: Yup.string() .nullable() + .max(DATATYPES_LENGTH.STRING) .label(formatMessage({ id: 'receipt_no_' })), deposit_account_id: Yup.number() .required() .label(formatMessage({ id: 'deposit_account_' })), - reference_no: Yup.string().min(1).max(255), + reference_no: Yup.string().min(1).max(DATATYPES_LENGTH.STRING), receipt_message: Yup.string() .trim() .min(1) - .max(1024) + .max(DATATYPES_LENGTH.STRING) .label(formatMessage({ id: 'receipt_message_' })), statement: Yup.string() .trim() .min(1) - .max(1024) + .max(DATATYPES_LENGTH.TEXT) .label(formatMessage({ id: 'note' })), entries: Yup.array().of( Yup.object().shape({ quantity: Yup.number() .nullable() + .max(DATATYPES_LENGTH.INT_10) .when(['rate'], { is: (rate) => rate, then: Yup.number().required(), }), - rate: Yup.number().nullable(), + rate: Yup.number().nullable().max(DATATYPES_LENGTH.INT_10), item_id: Yup.number() .nullable() .when(['quantity', 'rate'], { is: (quantity, rate) => quantity || rate, then: Yup.number().required(), }), - discount: Yup.number().nullable().min(0).max(100), - description: Yup.string().nullable(), + discount: Yup.number().nullable().min(0).max(DATATYPES_LENGTH.INT_10), + description: Yup.string().nullable().max(DATATYPES_LENGTH.TEXT), }), ), });