diff --git a/client/src/components/DialogsContainer.js b/client/src/components/DialogsContainer.js
index b8ff6d95b..53fbf7034 100644
--- a/client/src/components/DialogsContainer.js
+++ b/client/src/components/DialogsContainer.js
@@ -5,6 +5,7 @@ import ItemCategoryDialog from 'containers/Dialogs/ItemCategoryDialog';
import CurrencyDialog from 'containers/Dialogs/CurrencyDialog';
import InviteUserDialog from 'containers/Dialogs/InviteUserDialog';
import ExchangeRateDialog from 'containers/Dialogs/ExchangeRateDialog';
+import JournalNumberDailog from 'containers/Dialogs/JournalNumberDailog';
export default function DialogsContainer() {
return (
@@ -15,6 +16,7 @@ export default function DialogsContainer() {
{/* */}
+
);
}
diff --git a/client/src/containers/Accounting/MakeJournalEntriesFooter.js b/client/src/containers/Accounting/MakeJournalEntriesFooter.js
index 1d8e0cb1a..d23186ebc 100644
--- a/client/src/containers/Accounting/MakeJournalEntriesFooter.js
+++ b/client/src/containers/Accounting/MakeJournalEntriesFooter.js
@@ -6,10 +6,11 @@ export default function MakeJournalEntriesFooter({
formik: { isSubmitting },
onSubmitClick,
onCancelClick,
+ manualJournal,
}) {
return (
-
diff --git a/client/src/containers/Accounting/MakeJournalEntriesForm.js b/client/src/containers/Accounting/MakeJournalEntriesForm.js
index 3f5d89176..5d7d0ddc6 100644
--- a/client/src/containers/Accounting/MakeJournalEntriesForm.js
+++ b/client/src/containers/Accounting/MakeJournalEntriesForm.js
@@ -34,7 +34,8 @@ const ERROR = {
VENDORS_NOT_WITH_PAYABLE_ACCOUNT: 'VENDORS.NOT.WITH.PAYABLE.ACCOUNT',
PAYABLE_ENTRIES_HAS_NO_VENDORS: 'PAYABLE.ENTRIES.HAS.NO.VENDORS',
RECEIVABLE_ENTRIES_HAS_NO_CUSTOMERS: 'RECEIVABLE.ENTRIES.HAS.NO.CUSTOMERS',
- CREDIT_DEBIT_SUMATION_SHOULD_NOT_EQUAL_ZERO:'CREDIT.DEBIT.SUMATION.SHOULD.NOT.EQUAL.ZERO'
+ CREDIT_DEBIT_SUMATION_SHOULD_NOT_EQUAL_ZERO:
+ 'CREDIT.DEBIT.SUMATION.SHOULD.NOT.EQUAL.ZERO',
};
/**
@@ -58,7 +59,6 @@ function MakeJournalEntriesForm({
onFormSubmit,
onCancelForm,
}) {
-
const { formatMessage } = useIntl();
const {
setFiles,
@@ -75,7 +75,6 @@ function MakeJournalEntriesForm({
setFiles(_files.filter((file) => file.uploaded === false));
}, []);
-
const savedMediaIds = useRef([]);
const clearSavedMediaIds = () => {
savedMediaIds.current = [];
@@ -140,6 +139,7 @@ function MakeJournalEntriesForm({
const defaultEntry = useMemo(
() => ({
+ index: 0,
account_id: null,
credit: 0,
debit: 0,
@@ -251,7 +251,7 @@ function MakeJournalEntriesForm({
}),
intent: Intent.DANGER,
});
- }
+ }
};
const formik = useFormik({
@@ -262,7 +262,7 @@ function MakeJournalEntriesForm({
},
onSubmit: async (values, { setErrors, setSubmitting, resetForm }) => {
const entries = values.entries.filter(
- (entry) => entry.credit || entry.debit,
+ (entry) => entry.debit || entry.credit,
);
const getTotal = (type = 'credit') => {
return entries.reduce((total, item) => {
@@ -413,6 +413,7 @@ function MakeJournalEntriesForm({
formik={formik}
onSubmitClick={handleSubmitClick}
onCancelClick={handleCancelClick}
+ manualJournal={manualJournal}
/>
diff --git a/client/src/containers/Accounting/MakeJournalEntriesHeader.js b/client/src/containers/Accounting/MakeJournalEntriesHeader.js
index 57bed5d86..ab9e33622 100644
--- a/client/src/containers/Accounting/MakeJournalEntriesHeader.js
+++ b/client/src/containers/Accounting/MakeJournalEntriesHeader.js
@@ -5,6 +5,7 @@ import {
Intent,
Position,
Classes,
+ Button,
} from '@blueprintjs/core';
import { DateInput } from '@blueprintjs/datetime';
import { FormattedMessage as T } from 'react-intl';
@@ -18,11 +19,18 @@ import {
Hint,
FieldHint,
FieldRequiredHint,
+ Icon,
} from 'components';
+import withDialogActions from 'containers/Dialog/withDialogActions';
-export default function MakeJournalEntriesHeader({
+import { compose } from 'utils';
+
+function MakeJournalEntriesHeader({
formik: { errors, touched, values, setFieldValue, getFieldProps },
+
+ // #withDialog
+ openDialog,
}) {
const handleDateChange = useCallback(
(date) => {
@@ -31,6 +39,9 @@ export default function MakeJournalEntriesHeader({
},
[setFieldValue],
);
+ const handleJournalNumberChange = useCallback(() => {
+ openDialog('journalNumber-form', {});
+ }, [openDialog]);
return (
);
}
+
+export default compose(withDialogActions)(MakeJournalEntriesHeader);
diff --git a/client/src/containers/Dialogs/ItemCategoryDialog.js b/client/src/containers/Dialogs/ItemCategoryDialog.js
index 24f95e412..4cb1d8635 100644
--- a/client/src/containers/Dialogs/ItemCategoryDialog.js
+++ b/client/src/containers/Dialogs/ItemCategoryDialog.js
@@ -78,15 +78,9 @@ function ItemCategoryDialog({
.required()
.label(formatMessage({ id: 'category_name_' })),
parent_category_id: Yup.string().nullable(),
- cost_account_id: Yup.number()
- .required()
- .label(formatMessage({ id: 'cost_account_' })),
- sell_account_id: Yup.number()
- .required()
- .label(formatMessage({ id: 'sell_account_' })),
- inventory_account_id: Yup.number()
- .required()
- .label(formatMessage({ id: 'inventory_account_' })),
+ cost_account_id: Yup.number().nullable(),
+ sell_account_id: Yup.number().nullable(),
+ inventory_account_id: Yup.number(),
description: Yup.string().trim().nullable(),
});
@@ -122,7 +116,7 @@ function ItemCategoryDialog({
onSubmit: (values, { setSubmitting }) => {
const afterSubmit = () => {
closeDialog(dialogName);
- queryCache.invalidateQueries('items-categories-table');
+ queryCache.invalidateQueries('items-categories-list');
queryCache.invalidateQueries('accounts-list');
};
if (payload.action === 'edit') {
diff --git a/client/src/containers/Dialogs/JournalNumberDailog.js b/client/src/containers/Dialogs/JournalNumberDailog.js
new file mode 100644
index 000000000..71bd214b5
--- /dev/null
+++ b/client/src/containers/Dialogs/JournalNumberDailog.js
@@ -0,0 +1,71 @@
+import React, { useEffect, useCallback, useMemo } from 'react';
+import { FormattedMessage as T, useIntl } from 'react-intl';
+import { useQuery, queryCache } from 'react-query';
+import { Dialog } from 'components';
+import withDialogActions from 'containers/Dialog/withDialogActions';
+import withDialogRedux from 'components/DialogReduxConnect';
+import withSettingsActions from 'containers/Settings/withSettingsActions';
+import withSettings from 'containers/Settings/withSettings';
+import ReferenceNumberForm from 'containers/JournalNumber/ReferenceNumberForm';
+import classNames from 'classnames';
+
+import { connect } from 'react-redux';
+import { compose, optionsMapToArray } from 'utils';
+
+function JournalNumberDailog({
+ dialogName,
+ payload,
+ isOpen,
+
+ // #withSettingsActions
+ requestSubmitOptions,
+
+ // #withDialogActions
+ closeDialog,
+}) {
+ // Handles dialog close.
+ const handleClose = useCallback(() => {
+ closeDialog(dialogName);
+ }, [closeDialog, dialogName]);
+
+ const handleSubmitForm = useCallback(() => {});
+
+ // Handle dialog on closed.
+ // const onDialogClosed = useCallback(() => {
+ // resetForm();
+ // }, [resetForm]);
+
+ return (
+
}
+ autoFocus={true}
+ canEscapeKeyClose={true}
+ isOpen={isOpen}
+ onClose={handleClose}
+ >
+
+
+ );
+}
+
+const mapStateToProps = (state, props) => ({
+ dialogName: 'journalNumber-form',
+ journalNumberId: props?.payload?.id || null,
+});
+
+const withJournalNumberDailog = connect(mapStateToProps);
+
+export default compose(
+ withDialogRedux(null, 'journalNumber-form'),
+ withJournalNumberDailog,
+ withDialogActions,
+ withSettingsActions,
+)(JournalNumberDailog);
diff --git a/client/src/containers/Expenses/ExpenseForm.js b/client/src/containers/Expenses/ExpenseForm.js
index b659e8f00..20e75c8c6 100644
--- a/client/src/containers/Expenses/ExpenseForm.js
+++ b/client/src/containers/Expenses/ExpenseForm.js
@@ -164,10 +164,10 @@ function ExpenseForm({
...expense.categories.map((category) => ({
...pick(category, Object.keys(defaultCategory)),
})),
- ...repeatValue(
- defaultCategory,
- Math.max(MIN_LINES_NUMBER - expense.categories.length, 0),
- ),
+ // ...repeatValue(
+ // defaultCategory,
+ // Math.max(MIN_LINES_NUMBER - expense.categories.length, 0),
+ // ),
],
}
: {
@@ -226,10 +226,12 @@ function ExpenseForm({
});
return;
}
+
const categories = values.categories.filter(
(category) =>
category.amount && category.index && category.expense_account_id,
);
+
const form = {
...values,
publish: payload.publish,
@@ -329,10 +331,21 @@ function ExpenseForm({
const handleClearAllLines = () => {
formik.setFieldValue(
'categories',
- orderingCategoriesIndex([...repeatValue(defaultCategory, MIN_LINES_NUMBER)]),
+ orderingCategoriesIndex([
+ ...repeatValue(defaultCategory, MIN_LINES_NUMBER),
+ ]),
);
};
+ const categories = formik.values.categories.filter(
+ (category) =>
+ category.amount && category.index && category.expense_account_id,
+ );
+
+ console.log(categories, 'V');
+
+ console.log(formik.errors, 'Error');
+
return (