From 2078b6bc99b1f657263f056910e6e41bb84e9bbc Mon Sep 17 00:00:00 2001
From: elforjani13 <39470382+elforjani13@users.noreply.github.com>
Date: Wed, 13 Oct 2021 19:56:48 +0200
Subject: [PATCH] feat: Money in & out Dialog.
---
src/common/cashflowOptions.js | 27 +++
src/components/DialogsContainer.js | 4 +
src/config/sidebarMenu.js | 32 +++
.../MoneyInDialog/MoneyInDialogContent.js | 20 ++
.../MoneyInDialog/MoneyInDialogForm.js | 20 ++
.../MoneyInDialog/MoneyInDialogProvider.js | 42 ++++
.../MoneyInDialog/MoneyInFloatingActions.js | 76 +++++++
.../OtherIncome/OtherIncomeForm.js | 91 +++++++++
.../OtherIncome/OtherIncomeForm.schema.js | 22 ++
.../OtherIncome/OtherIncomeFormContent.js | 17 ++
.../OtherIncome/OtherIncomeFormFields.js | 186 +++++++++++++++++
.../OwnerContributionForm.js | 91 +++++++++
.../OwnerContributionForm.schema.js | 22 ++
.../OwnerContributionFormContent.js | 17 ++
.../OwnerContributionFormFields.js | 186 +++++++++++++++++
src/containers/Dialogs/MoneyInDialog/index.js | 36 ++++
.../MoneyOutDialog/MoneyOutDialogContent.js | 20 ++
.../MoneyOutDialog/MoneyOutProvider.js | 37 ++++
.../OwnerDrawingsFloatingActions.js | 76 +++++++
.../OwnerDrawings/OwnerDrawingsForm.js | 72 +++++++
.../OwnerDrawings/OwnerDrawingsForm.schema.js | 21 ++
.../OwnerDrawings/OwnerDrawingsFormContent.js | 17 ++
.../OwnerDrawings/OwnerDrawingsFormFields.js | 188 ++++++++++++++++++
.../Dialogs/MoneyOutDialog/index.js | 39 ++++
src/hooks/query/index.js | 1 +
src/hooks/query/types.js | 9 +-
src/lang/en/index.json | 32 ++-
src/routes/dashboard.js | 38 +++-
.../CashFlow/CashflowTransactionForm.scss | 30 +++
29 files changed, 1458 insertions(+), 11 deletions(-)
create mode 100644 src/common/cashflowOptions.js
create mode 100644 src/containers/Dialogs/MoneyInDialog/MoneyInDialogContent.js
create mode 100644 src/containers/Dialogs/MoneyInDialog/MoneyInDialogForm.js
create mode 100644 src/containers/Dialogs/MoneyInDialog/MoneyInDialogProvider.js
create mode 100644 src/containers/Dialogs/MoneyInDialog/MoneyInFloatingActions.js
create mode 100644 src/containers/Dialogs/MoneyInDialog/OtherIncome/OtherIncomeForm.js
create mode 100644 src/containers/Dialogs/MoneyInDialog/OtherIncome/OtherIncomeForm.schema.js
create mode 100644 src/containers/Dialogs/MoneyInDialog/OtherIncome/OtherIncomeFormContent.js
create mode 100644 src/containers/Dialogs/MoneyInDialog/OtherIncome/OtherIncomeFormFields.js
create mode 100644 src/containers/Dialogs/MoneyInDialog/OwnerContribution/OwnerContributionForm.js
create mode 100644 src/containers/Dialogs/MoneyInDialog/OwnerContribution/OwnerContributionForm.schema.js
create mode 100644 src/containers/Dialogs/MoneyInDialog/OwnerContribution/OwnerContributionFormContent.js
create mode 100644 src/containers/Dialogs/MoneyInDialog/OwnerContribution/OwnerContributionFormFields.js
create mode 100644 src/containers/Dialogs/MoneyInDialog/index.js
create mode 100644 src/containers/Dialogs/MoneyOutDialog/MoneyOutDialogContent.js
create mode 100644 src/containers/Dialogs/MoneyOutDialog/MoneyOutProvider.js
create mode 100644 src/containers/Dialogs/MoneyOutDialog/OwnerDrawings/OwnerDrawingsFloatingActions.js
create mode 100644 src/containers/Dialogs/MoneyOutDialog/OwnerDrawings/OwnerDrawingsForm.js
create mode 100644 src/containers/Dialogs/MoneyOutDialog/OwnerDrawings/OwnerDrawingsForm.schema.js
create mode 100644 src/containers/Dialogs/MoneyOutDialog/OwnerDrawings/OwnerDrawingsFormContent.js
create mode 100644 src/containers/Dialogs/MoneyOutDialog/OwnerDrawings/OwnerDrawingsFormFields.js
create mode 100644 src/containers/Dialogs/MoneyOutDialog/index.js
create mode 100644 src/style/pages/CashFlow/CashflowTransactionForm.scss
diff --git a/src/common/cashflowOptions.js b/src/common/cashflowOptions.js
new file mode 100644
index 000000000..86a6a8863
--- /dev/null
+++ b/src/common/cashflowOptions.js
@@ -0,0 +1,27 @@
+import intl from 'react-intl-universal';
+
+export const addMoneyIn = [
+ {
+ name: intl.get('cash_flow.option_owner_contribution'),
+ type: 'OWNERS',
+ },
+ {
+ name: intl.get('cash_flow.option_other_income'),
+ type: 'EQUITY',
+ },
+];
+
+export const addMoneyOut = [
+ {
+ name: intl.get('cash_flow.option_owner_drawings'),
+ type: 'OWNERS',
+ },
+ {
+ name: intl.get('cash_flow.option_expenses'),
+ type: 'EXPENSES',
+ },
+ {
+ name: intl.get('cash_flow.option_vendor_payment'),
+ type: '',
+ },
+];
diff --git a/src/components/DialogsContainer.js b/src/components/DialogsContainer.js
index 19d8e021b..07c00ca6f 100644
--- a/src/components/DialogsContainer.js
+++ b/src/components/DialogsContainer.js
@@ -17,6 +17,8 @@ import AllocateLandedCostDialog from 'containers/Dialogs/AllocateLandedCostDialo
import InvoicePdfPreviewDialog from 'containers/Dialogs/InvoicePdfPreviewDialog';
import EstimatePdfPreviewDialog from 'containers/Dialogs/EstimatePdfPreviewDialog';
import ReceiptPdfPreviewDialog from '../containers/Dialogs/ReceiptPdfPreviewDialog';
+import MoneyInDialog from '../containers/Dialogs/MoneyInDialog';
+import MoneyOutDialog from '../containers/Dialogs/MoneyOutDialog';
/**
* Dialogs container.
@@ -40,6 +42,8 @@ export default function DialogsContainer() {
+
+
);
}
diff --git a/src/config/sidebarMenu.js b/src/config/sidebarMenu.js
index 5a1149e44..b110bc863 100644
--- a/src/config/sidebarMenu.js
+++ b/src/config/sidebarMenu.js
@@ -193,6 +193,38 @@ export default [
text: ,
children: [],
},
+ {
+ text: ,
+ children: [
+ {
+ text: ,
+ href: '/cashflow-accounts',
+ },
+ {
+ text: ,
+ label: true,
+ },
+ {
+ divider: true,
+ },
+ {
+ text: ,
+ href: '/',
+ },
+ {
+ text: ,
+ href: '/',
+ },
+ {
+ text: ,
+ href: '/',
+ },
+ {
+ text: ,
+ href: '/',
+ },
+ ],
+ },
{
text: ,
children: [
diff --git a/src/containers/Dialogs/MoneyInDialog/MoneyInDialogContent.js b/src/containers/Dialogs/MoneyInDialog/MoneyInDialogContent.js
new file mode 100644
index 000000000..959490ded
--- /dev/null
+++ b/src/containers/Dialogs/MoneyInDialog/MoneyInDialogContent.js
@@ -0,0 +1,20 @@
+import React from 'react';
+
+import { MoneyInDialogProvider } from './MoneyInDialogProvider';
+import MoneyInDialogForm from './MoneyInDialogForm';
+
+/**
+ * Money in dialog content.
+ */
+export default function MoneyInDialogContent({
+ // #ownProps
+ dialogName,
+ accountId,
+ accountType,
+}) {
+ return (
+
+
+
+ );
+}
diff --git a/src/containers/Dialogs/MoneyInDialog/MoneyInDialogForm.js b/src/containers/Dialogs/MoneyInDialog/MoneyInDialogForm.js
new file mode 100644
index 000000000..6becf35d8
--- /dev/null
+++ b/src/containers/Dialogs/MoneyInDialog/MoneyInDialogForm.js
@@ -0,0 +1,20 @@
+import React from 'react';
+import OwnerContributionForm from './OwnerContribution/OwnerContributionForm';
+import OtherIncomeForm from './OtherIncome/OtherIncomeForm';
+
+export default function MoneyInDialogForm({ accountType }) {
+ // Handle from transaction.
+ const handleFromTransaction = () => {
+ switch (accountType) {
+ case 'OWNERS':
+ return ;
+
+ case 'EQUITY':
+ return ;
+ default:
+ break;
+ }
+ };
+
+ return
{handleFromTransaction()}
;
+}
diff --git a/src/containers/Dialogs/MoneyInDialog/MoneyInDialogProvider.js b/src/containers/Dialogs/MoneyInDialog/MoneyInDialogProvider.js
new file mode 100644
index 000000000..0525c8edf
--- /dev/null
+++ b/src/containers/Dialogs/MoneyInDialog/MoneyInDialogProvider.js
@@ -0,0 +1,42 @@
+import React from 'react';
+import { DialogContent } from 'components';
+import { useCreateCashflowTransaction, useAccounts } from 'hooks/query';
+
+const MoneyInDialogContent = React.createContext();
+
+/**
+ * Money in dialog provider.
+ */
+function MoneyInDialogProvider({ accountId, dialogName, ...props }) {
+ // Fetches accounts list.
+ const { isFetching: isAccountsLoading, data: accounts } = useAccounts();
+
+ const { mutateAsync: createCashflowTransactionMutate } =
+ useCreateCashflowTransaction();
+
+ // Submit payload.
+ const [submitPayload, setSubmitPayload] = React.useState({});
+
+ // provider.
+ const provider = {
+ accounts,
+ accountId,
+ isAccountsLoading,
+
+ submitPayload,
+ dialogName,
+
+ createCashflowTransactionMutate,
+ setSubmitPayload,
+ };
+
+ return (
+
+
+
+ );
+}
+
+const useMoneyInDailogContext = () => React.useContext(MoneyInDialogContent);
+
+export { MoneyInDialogProvider, useMoneyInDailogContext };
diff --git a/src/containers/Dialogs/MoneyInDialog/MoneyInFloatingActions.js b/src/containers/Dialogs/MoneyInDialog/MoneyInFloatingActions.js
new file mode 100644
index 000000000..b33647f0f
--- /dev/null
+++ b/src/containers/Dialogs/MoneyInDialog/MoneyInFloatingActions.js
@@ -0,0 +1,76 @@
+import React from 'react';
+import { Intent, Button, Classes } from '@blueprintjs/core';
+import { useFormikContext } from 'formik';
+import { FormattedMessage as T } from 'components';
+
+import { useMoneyInDailogContext } from './MoneyInDialogProvider';
+
+import withDialogActions from 'containers/Dialog/withDialogActions';
+import { compose } from 'utils';
+
+/**
+ * Money in floating actions.
+ */
+function MoneyInFloatingActions({
+ // #withDialogActions
+ closeDialog,
+}) {
+ // Formik context.
+ const { isSubmitting, submitForm } = useFormikContext();
+ // money in dialog context.
+ const { dialogName, setSubmitPayload, submitPayload } =
+ useMoneyInDailogContext();
+
+ // handle submit as draft button click.
+ const handleSubmitDraftBtnClick = (event) => {
+ setSubmitPayload({ publish: false });
+ submitForm();
+ };
+
+ // Handle submit button click.
+ const handleSubmittBtnClick = (event) => {
+ setSubmitPayload({ publish: true });
+ submitForm();
+ };
+
+ // Handle close button click.
+ const handleCloseBtnClick = (event) => {
+ closeDialog(dialogName);
+ };
+
+ return (
+
+
+
+
+
+
+
+
+ );
+}
+
+export default compose(withDialogActions)(MoneyInFloatingActions);
diff --git a/src/containers/Dialogs/MoneyInDialog/OtherIncome/OtherIncomeForm.js b/src/containers/Dialogs/MoneyInDialog/OtherIncome/OtherIncomeForm.js
new file mode 100644
index 000000000..8ffcab15a
--- /dev/null
+++ b/src/containers/Dialogs/MoneyInDialog/OtherIncome/OtherIncomeForm.js
@@ -0,0 +1,91 @@
+import React from 'react';
+import moment from 'moment';
+import { Intent } from '@blueprintjs/core';
+import { Formik } from 'formik';
+import intl from 'react-intl-universal';
+
+import 'style/pages/CashFlow/CashflowTransactionForm.scss';
+
+import { AppToaster } from 'components';
+import { CreateOtherIncomeFormSchema } from './OtherIncomeForm.schema';
+import OtherIncomeFormContent from './OtherIncomeFormContent';
+
+import { useMoneyInDailogContext } from '../MoneyInDialogProvider';
+
+import withDialogActions from 'containers/Dialog/withDialogActions';
+import withCurrentOrganization from 'containers/Organization/withCurrentOrganization';
+
+import { compose } from 'utils';
+
+const defaultInitialValues = {
+ date: moment(new Date()).format('YYYY-MM-DD'),
+ amount: '',
+ transaction_number: '',
+ transaction_type: 'other_income',
+ reference_no: '',
+ cashflow_account_id: '',
+ credit_account_id: '',
+ description: '',
+ published: '',
+};
+
+/**
+ * Other income form.
+ */
+function OtherIncomeForm({
+ // #withDialogActions
+ closeDialog,
+
+ // #withCurrentOrganization
+ organization: { base_currency },
+}) {
+ const {
+ dialogName,
+ accountId,
+ createCashflowTransactionMutate,
+ submitPayload,
+ } = useMoneyInDailogContext();
+
+ // Initial form values.
+ const initialValues = {
+ ...defaultInitialValues,
+ currency_code: base_currency,
+ credit_account_id: accountId,
+ };
+
+ // Handles the form submit.
+ const handleFormSubmit = (values, { setSubmitting, setErrors }) => {
+ const form = {
+ ...values,
+ published: submitPayload.publish,
+ };
+ setSubmitting(true);
+ createCashflowTransactionMutate(form)
+ .then(() => {
+ closeDialog(dialogName);
+
+ AppToaster.show({
+ message: intl.get('cash_flow_transaction_success_message'),
+ intent: Intent.SUCCESS,
+ });
+ })
+ .finally(() => {
+ setSubmitting(true);
+ });
+ };
+
+ return (
+
+
+
+ );
+}
+
+export default compose(
+ withDialogActions,
+ withCurrentOrganization(),
+)(OtherIncomeForm);
diff --git a/src/containers/Dialogs/MoneyInDialog/OtherIncome/OtherIncomeForm.schema.js b/src/containers/Dialogs/MoneyInDialog/OtherIncome/OtherIncomeForm.schema.js
new file mode 100644
index 000000000..f6178739d
--- /dev/null
+++ b/src/containers/Dialogs/MoneyInDialog/OtherIncome/OtherIncomeForm.schema.js
@@ -0,0 +1,22 @@
+import * as Yup from 'yup';
+import intl from 'react-intl-universal';
+import { DATATYPES_LENGTH } from 'common/dataTypes';
+
+const Schema = Yup.object().shape({
+ date: Yup.date().required().label(intl.get('date')),
+ amount: Yup.number().required().label(intl.get('amount')),
+ transaction_number: Yup.string(),
+ transaction_type: Yup.string().required().label(intl.get('transaction_type')),
+ reference_no: Yup.string(),
+ credit_account_id: Yup.number().required(),
+ cashflow_account_id: Yup.string()
+ .required()
+ .label(intl.get('other_income_account')),
+ description: Yup.string()
+ .min(3)
+ .max(DATATYPES_LENGTH.TEXT)
+ .label(intl.get('description')),
+ published: Yup.boolean(),
+});
+
+export const CreateOtherIncomeFormSchema = Schema;
diff --git a/src/containers/Dialogs/MoneyInDialog/OtherIncome/OtherIncomeFormContent.js b/src/containers/Dialogs/MoneyInDialog/OtherIncome/OtherIncomeFormContent.js
new file mode 100644
index 000000000..e05f48788
--- /dev/null
+++ b/src/containers/Dialogs/MoneyInDialog/OtherIncome/OtherIncomeFormContent.js
@@ -0,0 +1,17 @@
+import React from 'react';
+import { Form } from 'formik';
+
+import OtherIncomeFormFields from './OtherIncomeFormFields';
+import MoneyInFloatingActions from '../MoneyInFloatingActions';
+
+/**
+ * Other income form content.
+ */
+export default function OtherIncomeFormContent() {
+ return (
+
+ );
+}
diff --git a/src/containers/Dialogs/MoneyInDialog/OtherIncome/OtherIncomeFormFields.js b/src/containers/Dialogs/MoneyInDialog/OtherIncome/OtherIncomeFormFields.js
new file mode 100644
index 000000000..a181ccd4a
--- /dev/null
+++ b/src/containers/Dialogs/MoneyInDialog/OtherIncome/OtherIncomeFormFields.js
@@ -0,0 +1,186 @@
+import React from 'react';
+import { FastField, ErrorMessage } from 'formik';
+import {
+ Classes,
+ FormGroup,
+ InputGroup,
+ TextArea,
+ Position,
+ ControlGroup,
+} from '@blueprintjs/core';
+import classNames from 'classnames';
+import {
+ FormattedMessage as T,
+ AccountsSuggestField,
+ InputPrependText,
+ MoneyInputGroup,
+} from 'components';
+import { DateInput } from '@blueprintjs/datetime';
+import { useAutofocus } from 'hooks';
+import { FieldRequiredHint, Col, Row } from 'components';
+import {
+ inputIntent,
+ momentFormatter,
+ tansformDateValue,
+ handleDateChange,
+} from 'utils';
+import { CLASSES } from 'common/classes';
+import { useMoneyInDailogContext } from '../MoneyInDialogProvider';
+
+/**
+ * Other income form fiedls.
+ */
+function OtherIncomeFormFields() {
+ // Money in dialog context.
+ const { accounts } = useMoneyInDailogContext();
+
+ const amountFieldRef = useAutofocus();
+
+ return (
+
+
+
+ {/*------------ Date -----------*/}
+
+ {({ form, field: { value }, meta: { error, touched } }) => (
+ }
+ labelInfo={}
+ intent={inputIntent({ error, touched })}
+ helperText={}
+ minimal={true}
+ className={classNames(CLASSES.FILL, 'form-group--date')}
+ >
+ {
+ form.setFieldValue('date', formattedDate);
+ })}
+ value={tansformDateValue(value)}
+ popoverProps={{
+ position: Position.BOTTOM,
+ minimal: true,
+ }}
+ intent={inputIntent({ error, touched })}
+ />
+
+ )}
+
+
+
+ {/*------------ Transaction number -----------*/}
+
+ {({ form, field, meta: { error, touched } }) => (
+ }
+ intent={inputIntent({ error, touched })}
+ helperText={}
+ className={'form-group--transaction_number'}
+ >
+
+
+ )}
+
+
+
+ {/*------------ amount -----------*/}
+
+ {({
+ form: { values, setFieldValue },
+ field: { value },
+ meta: { error, touched },
+ }) => (
+ }
+ labelInfo={}
+ intent={inputIntent({ error, touched })}
+ helperText={}
+ className={'form-group--amount'}
+ >
+
+
+
+ {
+ setFieldValue('amount', amount);
+ }}
+ inputRef={(ref) => (amountFieldRef.current = ref)}
+ intent={inputIntent({ error, touched })}
+ />
+
+
+ )}
+
+
+
+
+ {/*------------ other income account -----------*/}
+
+ {({ form, field, meta: { error, touched } }) => (
+ }
+ labelInfo={}
+ intent={inputIntent({ error, touched })}
+ helperText={}
+ className={'form-group--cashflow_account_id'}
+ >
+
+ form.setFieldValue('cashflow_account_id', id)
+ }
+ inputProps={{
+ intent: inputIntent({ error, touched }),
+ }}
+ />
+
+ )}
+
+
+
+ {/*------------ Reference -----------*/}
+
+ {({ form, field, meta: { error, touched } }) => (
+ }
+ intent={inputIntent({ error, touched })}
+ helperText={}
+ className={'form-group--reference-no'}
+ >
+
+
+ )}
+
+
+
+ {/*------------ description -----------*/}
+
+ {({ field, meta: { error, touched } }) => (
+ }
+ className={'form-group--description'}
+ intent={inputIntent({ error, touched })}
+ helperText={}
+ >
+
+
+ )}
+
+
+ );
+}
+
+export default OtherIncomeFormFields;
diff --git a/src/containers/Dialogs/MoneyInDialog/OwnerContribution/OwnerContributionForm.js b/src/containers/Dialogs/MoneyInDialog/OwnerContribution/OwnerContributionForm.js
new file mode 100644
index 000000000..305bce64b
--- /dev/null
+++ b/src/containers/Dialogs/MoneyInDialog/OwnerContribution/OwnerContributionForm.js
@@ -0,0 +1,91 @@
+import React from 'react';
+import moment from 'moment';
+import { Intent } from '@blueprintjs/core';
+import { Formik } from 'formik';
+import intl from 'react-intl-universal';
+
+import 'style/pages/CashFlow/CashflowTransactionForm.scss';
+
+import { AppToaster } from 'components';
+import { CreateOwnerContributionFormSchema } from './OwnerContributionForm.schema';
+import OwnerContributionFormContent from './OwnerContributionFormContent';
+
+import { useMoneyInDailogContext } from '../MoneyInDialogProvider';
+
+import withDialogActions from 'containers/Dialog/withDialogActions';
+import withCurrentOrganization from 'containers/Organization/withCurrentOrganization';
+
+import { compose } from 'utils';
+
+const defaultInitialValues = {
+ date: moment(new Date()).format('YYYY-MM-DD'),
+ amount: '',
+ transaction_number: '',
+ transaction_type: 'owner_contribution',
+ reference_no: '',
+ cashflow_account_id: '',
+ credit_account_id: '',
+ description: '',
+ published: '',
+};
+
+/**
+ * Owner contribution form
+ */
+function OwnerContributionForm({
+ // #withDialogActions
+ closeDialog,
+
+ // #withCurrentOrganization
+ organization: { base_currency },
+}) {
+ const {
+ dialogName,
+ accountId,
+ submitPayload,
+ createCashflowTransactionMutate,
+ } = useMoneyInDailogContext();
+
+ // Initial form values.
+ const initialValues = {
+ ...defaultInitialValues,
+ currency_code: base_currency,
+ credit_account_id: accountId,
+ };
+
+ // Handles the form submit.
+ const handleFormSubmit = (values, { setSubmitting, setErrors }) => {
+ const form = {
+ ...values,
+ published: submitPayload.publish,
+ };
+ setSubmitting(true);
+ createCashflowTransactionMutate(form)
+ .then(() => {
+ closeDialog(dialogName);
+
+ AppToaster.show({
+ message: intl.get('cash_flow_transaction_success_message'),
+ intent: Intent.SUCCESS,
+ });
+ })
+ .finally(() => {
+ setSubmitting(true);
+ });
+ };
+
+ return (
+
+
+
+ );
+}
+
+export default compose(
+ withDialogActions,
+ withCurrentOrganization(),
+)(OwnerContributionForm);
diff --git a/src/containers/Dialogs/MoneyInDialog/OwnerContribution/OwnerContributionForm.schema.js b/src/containers/Dialogs/MoneyInDialog/OwnerContribution/OwnerContributionForm.schema.js
new file mode 100644
index 000000000..a55931df1
--- /dev/null
+++ b/src/containers/Dialogs/MoneyInDialog/OwnerContribution/OwnerContributionForm.schema.js
@@ -0,0 +1,22 @@
+import * as Yup from 'yup';
+import intl from 'react-intl-universal';
+import { DATATYPES_LENGTH } from 'common/dataTypes';
+
+const Schema = Yup.object().shape({
+ date: Yup.date().required().label(intl.get('date')),
+ amount: Yup.number().required().label(intl.get('amount')),
+ transaction_number: Yup.string(),
+ transaction_type: Yup.string().required().label(intl.get('transaction_type')),
+ reference_no: Yup.string(),
+ credit_account_id: Yup.number().required(),
+ cashflow_account_id: Yup.string()
+ .required()
+ .label(intl.get('cash_flow_transaction.label_equity_account')),
+ description: Yup.string()
+ .min(3)
+ .max(DATATYPES_LENGTH.TEXT)
+ .label(intl.get('description')),
+ published: Yup.boolean(),
+});
+
+export const CreateOwnerContributionFormSchema = Schema;
diff --git a/src/containers/Dialogs/MoneyInDialog/OwnerContribution/OwnerContributionFormContent.js b/src/containers/Dialogs/MoneyInDialog/OwnerContribution/OwnerContributionFormContent.js
new file mode 100644
index 000000000..27932fc3b
--- /dev/null
+++ b/src/containers/Dialogs/MoneyInDialog/OwnerContribution/OwnerContributionFormContent.js
@@ -0,0 +1,17 @@
+import React from 'react';
+import { Form } from 'formik';
+
+import OwnerContributionFormFields from './OwnerContributionFormFields';
+import MoneyInFloatingActions from '../MoneyInFloatingActions';
+
+/**
+ * Owner contribution form content.
+ */
+export default function OwnerContributionFormContent() {
+ return (
+
+ );
+}
diff --git a/src/containers/Dialogs/MoneyInDialog/OwnerContribution/OwnerContributionFormFields.js b/src/containers/Dialogs/MoneyInDialog/OwnerContribution/OwnerContributionFormFields.js
new file mode 100644
index 000000000..1effb9d14
--- /dev/null
+++ b/src/containers/Dialogs/MoneyInDialog/OwnerContribution/OwnerContributionFormFields.js
@@ -0,0 +1,186 @@
+import React from 'react';
+import { FastField, ErrorMessage } from 'formik';
+import {
+ Classes,
+ FormGroup,
+ InputGroup,
+ TextArea,
+ Position,
+ ControlGroup,
+} from '@blueprintjs/core';
+import classNames from 'classnames';
+import {
+ FormattedMessage as T,
+ AccountsSuggestField,
+ InputPrependText,
+ MoneyInputGroup,
+} from 'components';
+import { DateInput } from '@blueprintjs/datetime';
+import { useAutofocus } from 'hooks';
+import { FieldRequiredHint, Col, Row } from 'components';
+import {
+ inputIntent,
+ momentFormatter,
+ tansformDateValue,
+ handleDateChange,
+} from 'utils';
+import { CLASSES } from 'common/classes';
+import { useMoneyInDailogContext } from '../MoneyInDialogProvider';
+
+/**
+ * Owner contribution form fields.
+ */
+function OwnerContributionFormFields() {
+ // Money in dialog context.
+ const { accounts } = useMoneyInDailogContext();
+
+ const amountFieldRef = useAutofocus();
+ return (
+
+
+
+ {/*------------ Date -----------*/}
+
+ {({ form, field: { value }, meta: { error, touched } }) => (
+ }
+ labelInfo={}
+ intent={inputIntent({ error, touched })}
+ helperText={}
+ minimal={true}
+ className={classNames(CLASSES.FILL, 'form-group--date')}
+ >
+ {
+ form.setFieldValue('date', formattedDate);
+ })}
+ value={tansformDateValue(value)}
+ popoverProps={{
+ position: Position.BOTTOM,
+ minimal: true,
+ }}
+ intent={inputIntent({ error, touched })}
+ />
+
+ )}
+
+
+
+ {/*------------ Transaction number -----------*/}
+
+ {({ form, field, meta: { error, touched } }) => (
+ }
+ intent={inputIntent({ error, touched })}
+ helperText={}
+ className={'form-group--transaction_number'}
+ >
+
+
+ )}
+
+
+
+ {/*------------ amount -----------*/}
+
+ {({
+ form: { values, setFieldValue },
+ field: { value },
+ meta: { error, touched },
+ }) => (
+ }
+ labelInfo={}
+ intent={inputIntent({ error, touched })}
+ helperText={}
+ className={'form-group--amount'}
+ >
+
+
+
+ {
+ setFieldValue('amount', amount);
+ }}
+ inputRef={(ref) => (amountFieldRef.current = ref)}
+ intent={inputIntent({ error, touched })}
+ />
+
+
+ )}
+
+
+
+
+ {/*------------ cash flow account -----------*/}
+
+ {({ form, field, meta: { error, touched } }) => (
+ }
+ labelInfo={}
+ intent={inputIntent({ error, touched })}
+ helperText={}
+ className={'form-group--cashflow_account_id'}
+ >
+
+ form.setFieldValue('cashflow_account_id', id)
+ }
+ inputProps={{
+ intent: inputIntent({ error, touched }),
+ }}
+ />
+
+ )}
+
+
+
+ {/*------------ Reference -----------*/}
+
+ {({ form, field, meta: { error, touched } }) => (
+ }
+ intent={inputIntent({ error, touched })}
+ helperText={}
+ className={'form-group--reference-no'}
+ >
+
+
+ )}
+
+
+
+
+ {/*------------ description -----------*/}
+
+ {({ field, meta: { error, touched } }) => (
+ }
+ className={'form-group--description'}
+ intent={inputIntent({ error, touched })}
+ helperText={}
+ >
+
+
+ )}
+
+
+ );
+}
+
+export default OwnerContributionFormFields;
diff --git a/src/containers/Dialogs/MoneyInDialog/index.js b/src/containers/Dialogs/MoneyInDialog/index.js
new file mode 100644
index 000000000..a751b3934
--- /dev/null
+++ b/src/containers/Dialogs/MoneyInDialog/index.js
@@ -0,0 +1,36 @@
+import React from 'react';
+import { FormattedMessage as T } from 'components';
+import { Dialog, DialogSuspense } from 'components';
+import withDialogRedux from 'components/DialogReduxConnect';
+import { compose } from 'redux';
+
+const MoneyInDialogContent = React.lazy(() => import('./MoneyInDialogContent'));
+
+/**
+ * Money In dialog.
+ */
+function MoneyInDialog({
+ dialogName,
+ payload = { action: '', account_type: null, account_id: null },
+ isOpen,
+}) {
+ return (
+ }
+ isOpen={isOpen}
+ canEscapeJeyClose={true}
+ autoFocus={true}
+ className={'dialog--money-in'}
+ >
+
+
+
+
+ );
+}
+export default compose(withDialogRedux())(MoneyInDialog);
diff --git a/src/containers/Dialogs/MoneyOutDialog/MoneyOutDialogContent.js b/src/containers/Dialogs/MoneyOutDialog/MoneyOutDialogContent.js
new file mode 100644
index 000000000..c737d10cd
--- /dev/null
+++ b/src/containers/Dialogs/MoneyOutDialog/MoneyOutDialogContent.js
@@ -0,0 +1,20 @@
+import React from 'react';
+import { MoneyOutProvider } from './MoneyOutProvider';
+
+import OwnerDrawingsForm from './OwnerDrawings/OwnerDrawingsForm';
+
+/**
+ * Money out dailog content.
+ */
+export default function MoneyOutDialogContent({
+ // #ownProps
+ dialogName,
+ accountId,
+ accountType,
+}) {
+ return (
+
+
+
+ );
+}
diff --git a/src/containers/Dialogs/MoneyOutDialog/MoneyOutProvider.js b/src/containers/Dialogs/MoneyOutDialog/MoneyOutProvider.js
new file mode 100644
index 000000000..57692e3a8
--- /dev/null
+++ b/src/containers/Dialogs/MoneyOutDialog/MoneyOutProvider.js
@@ -0,0 +1,37 @@
+import React from 'react';
+import { DialogContent } from 'components';
+import { useAccounts } from 'hooks/query';
+
+const MoneyInDialogContent = React.createContext();
+
+/**
+ * Money out dialog provider.
+ */
+function MoneyOutProvider({ accountId, dialogName, ...props }) {
+ // Fetches accounts list.
+ const { isFetching: isAccountsLoading, data: accounts } = useAccounts();
+
+ // Submit payload.
+ const [submitPayload, setSubmitPayload] = React.useState({});
+
+ // provider.
+ const provider = {
+ accounts,
+ accountId,
+ isAccountsLoading,
+
+ submitPayload,
+ dialogName,
+
+ setSubmitPayload,
+ };
+
+ return (
+
+
+
+ );
+}
+
+const useMoneyOutDialogContext = () => React.useContext(MoneyInDialogContent);
+export { MoneyOutProvider, useMoneyOutDialogContext };
diff --git a/src/containers/Dialogs/MoneyOutDialog/OwnerDrawings/OwnerDrawingsFloatingActions.js b/src/containers/Dialogs/MoneyOutDialog/OwnerDrawings/OwnerDrawingsFloatingActions.js
new file mode 100644
index 000000000..219d0b058
--- /dev/null
+++ b/src/containers/Dialogs/MoneyOutDialog/OwnerDrawings/OwnerDrawingsFloatingActions.js
@@ -0,0 +1,76 @@
+import React from 'react';
+import { Intent, Button, Classes } from '@blueprintjs/core';
+import { useFormikContext } from 'formik';
+import { FormattedMessage as T } from 'components';
+
+import { useMoneyOutDialogContext } from '../MoneyOutProvider';
+
+import withDialogActions from 'containers/Dialog/withDialogActions';
+import { compose } from 'utils';
+
+/**
+ * Owner drawingsfloating actions.
+ */
+function OwnerDrawingsFloatingActions({
+ // #withDialogActions
+ closeDialog,
+}) {
+ // Formik context.
+ const { isSubmitting, submitForm } = useFormikContext();
+ // money in dialog context.
+ const { dialogName, setSubmitPayload, submitPayload } =
+ useMoneyOutDialogContext();
+
+ // handle submit as draft button click.
+ const handleSubmitDraftBtnClick = (event) => {
+ setSubmitPayload({ publish: false });
+ submitForm();
+ };
+
+ // Handle submit button click.
+ const handleSubmittBtnClick = (event) => {
+ setSubmitPayload({ publish: true });
+ submitForm();
+ };
+
+ // Handle close button click.
+ const handleCloseBtnClick = (event) => {
+ closeDialog(dialogName);
+ };
+
+ return (
+
+
+
+
+
+
+
+
+ );
+}
+
+export default compose(withDialogActions)(OwnerDrawingsFloatingActions);
diff --git a/src/containers/Dialogs/MoneyOutDialog/OwnerDrawings/OwnerDrawingsForm.js b/src/containers/Dialogs/MoneyOutDialog/OwnerDrawings/OwnerDrawingsForm.js
new file mode 100644
index 000000000..3732d1cf4
--- /dev/null
+++ b/src/containers/Dialogs/MoneyOutDialog/OwnerDrawings/OwnerDrawingsForm.js
@@ -0,0 +1,72 @@
+import React from 'react';
+import moment from 'moment';
+import { Intent } from '@blueprintjs/core';
+import { Formik } from 'formik';
+import intl from 'react-intl-universal';
+
+// styles
+
+import { AppToaster } from 'components';
+import { CreateOwnerDrawingsFormSchema } from './OwnerDrawingsForm.schema';
+import OwnerDrawingsFormContent from './OwnerDrawingsFormContent';
+
+import { useMoneyOutDialogContext } from '../MoneyOutProvider';
+
+import withDialogActions from 'containers/Dialog/withDialogActions';
+import withCurrentOrganization from 'containers/Organization/withCurrentOrganization';
+
+import { compose } from 'utils';
+
+const defaultInitialValues = {
+ date: moment(new Date()).format('YYYY-MM-DD'),
+ amount: '',
+ transaction_number: '',
+ reference_no: '',
+ equity_account_id: '',
+ account_id: '',
+ description: '',
+ published: '',
+};
+
+/**
+ * Owner drawings form.
+ */
+function OwnerDrawingsForm({
+ // #withDialogActions
+ closeDialog,
+
+ // #withCurrentOrganization
+ organization: { base_currency },
+}) {
+ const { accountId, submitPayload } = useMoneyOutDialogContext();
+
+ // Initial form values.
+ const initialValues = {
+ ...defaultInitialValues,
+ currency_code: base_currency,
+ account_id: accountId,
+ };
+ // Handles the form submit.
+ const handleFormSubmit = (values, { setSubmitting, setErrors }) => {
+ const form = {
+ ...values,
+ published: submitPayload.publish,
+ };
+ setSubmitting(true);
+ };
+
+ return (
+
+
+
+ );
+}
+
+export default compose(
+ withDialogActions,
+ withCurrentOrganization(),
+)(OwnerDrawingsForm);
diff --git a/src/containers/Dialogs/MoneyOutDialog/OwnerDrawings/OwnerDrawingsForm.schema.js b/src/containers/Dialogs/MoneyOutDialog/OwnerDrawings/OwnerDrawingsForm.schema.js
new file mode 100644
index 000000000..878397d3d
--- /dev/null
+++ b/src/containers/Dialogs/MoneyOutDialog/OwnerDrawings/OwnerDrawingsForm.schema.js
@@ -0,0 +1,21 @@
+import * as Yup from 'yup';
+import intl from 'react-intl-universal';
+import { DATATYPES_LENGTH } from 'common/dataTypes';
+
+const Schema = Yup.object().shape({
+ date: Yup.date().required().label(intl.get('date')),
+ amount: Yup.number().required().label(intl.get('amount')),
+ transaction_number: Yup.string(),
+ reference_no: Yup.string(),
+ account_id: Yup.number().required(),
+ equity_account_id: Yup.string()
+ .required()
+ .label(intl.get('cash_flow_transaction.label_equity_account')),
+ description: Yup.string()
+ .min(3)
+ .max(DATATYPES_LENGTH.TEXT)
+ .label(intl.get('description')),
+ published: Yup.boolean(),
+});
+
+export const CreateOwnerDrawingsFormSchema = Schema;
diff --git a/src/containers/Dialogs/MoneyOutDialog/OwnerDrawings/OwnerDrawingsFormContent.js b/src/containers/Dialogs/MoneyOutDialog/OwnerDrawings/OwnerDrawingsFormContent.js
new file mode 100644
index 000000000..cab946864
--- /dev/null
+++ b/src/containers/Dialogs/MoneyOutDialog/OwnerDrawings/OwnerDrawingsFormContent.js
@@ -0,0 +1,17 @@
+import React from 'react';
+import { Form } from 'formik';
+
+import OwnerDrawingsFormFields from './OwnerDrawingsFormFields';
+import OwnerDrawingsFloatingActions from './OwnerDrawingsFloatingActions';
+
+/**
+ * Owner drawings form content.
+ */
+export default function OwnerDrawingsFormContent() {
+ return (
+
+ );
+}
diff --git a/src/containers/Dialogs/MoneyOutDialog/OwnerDrawings/OwnerDrawingsFormFields.js b/src/containers/Dialogs/MoneyOutDialog/OwnerDrawings/OwnerDrawingsFormFields.js
new file mode 100644
index 000000000..e2be11875
--- /dev/null
+++ b/src/containers/Dialogs/MoneyOutDialog/OwnerDrawings/OwnerDrawingsFormFields.js
@@ -0,0 +1,188 @@
+import React from 'react';
+import { FastField, ErrorMessage } from 'formik';
+import {
+ Classes,
+ FormGroup,
+ InputGroup,
+ TextArea,
+ Position,
+ ControlGroup,
+} from '@blueprintjs/core';
+import classNames from 'classnames';
+import {
+ FormattedMessage as T,
+ AccountsSuggestField,
+ InputPrependText,
+ MoneyInputGroup,
+} from 'components';
+import { DateInput } from '@blueprintjs/datetime';
+import { useAutofocus } from 'hooks';
+import { FieldRequiredHint, Col, Row } from 'components';
+
+import {
+ inputIntent,
+ momentFormatter,
+ tansformDateValue,
+ handleDateChange,
+} from 'utils';
+import { CLASSES } from 'common/classes';
+import { useMoneyOutDialogContext } from '../MoneyOutProvider';
+
+/**
+ * Owner drawings form fields.
+ */
+function OwnerDrawingsFormFields() {
+ // Money out dialog context.
+ const { accounts } = useMoneyOutDialogContext();
+
+ const amountFieldRef = useAutofocus();
+
+ return (
+
+
+
+ {/*------------ Date -----------*/}
+
+ {({ form, field: { value }, meta: { error, touched } }) => (
+ }
+ labelInfo={}
+ intent={inputIntent({ error, touched })}
+ helperText={}
+ minimal={true}
+ className={classNames(CLASSES.FILL, 'form-group--date')}
+ >
+ {
+ form.setFieldValue('date', formattedDate);
+ })}
+ value={tansformDateValue(value)}
+ popoverProps={{
+ position: Position.BOTTOM,
+ minimal: true,
+ }}
+ intent={inputIntent({ error, touched })}
+ />
+
+ )}
+
+
+
+ {/*------------ Transaction number -----------*/}
+
+ {({ form, field, meta: { error, touched } }) => (
+ }
+ intent={inputIntent({ error, touched })}
+ helperText={}
+ className={'form-group--transaction_number'}
+ >
+
+
+ )}
+
+
+
+ {/*------------ amount -----------*/}
+
+ {({
+ form: { values, setFieldValue },
+ field: { value },
+ meta: { error, touched },
+ }) => (
+ }
+ labelInfo={}
+ intent={inputIntent({ error, touched })}
+ helperText={}
+ className={'form-group--amount'}
+ >
+
+
+
+ {
+ setFieldValue('amount', amount);
+ }}
+ inputRef={(ref) => (amountFieldRef.current = ref)}
+ intent={inputIntent({ error, touched })}
+ />
+
+
+ )}
+
+
+
+
+ {/*------------ equitty account -----------*/}
+
+ {({ form, field, meta: { error, touched } }) => (
+ }
+ labelInfo={}
+ intent={inputIntent({ error, touched })}
+ helperText={}
+ className={'form-group--equity_account_id'}
+ >
+
+ form.setFieldValue('equity_account_id', id)
+ }
+ inputProps={{
+ intent: inputIntent({ error, touched }),
+ }}
+ />
+
+ )}
+
+
+
+ {/*------------ Reference -----------*/}
+
+ {({ form, field, meta: { error, touched } }) => (
+ }
+ intent={inputIntent({ error, touched })}
+ helperText={}
+ className={'form-group--reference-no'}
+ >
+
+
+ )}
+
+
+
+
+ {/*------------ description -----------*/}
+
+ {({ field, meta: { error, touched } }) => (
+ }
+ className={'form-group--description'}
+ intent={inputIntent({ error, touched })}
+ helperText={}
+ >
+
+
+ )}
+
+
+ );
+}
+
+export default OwnerDrawingsFormFields;
diff --git a/src/containers/Dialogs/MoneyOutDialog/index.js b/src/containers/Dialogs/MoneyOutDialog/index.js
new file mode 100644
index 000000000..d7fd6e5d0
--- /dev/null
+++ b/src/containers/Dialogs/MoneyOutDialog/index.js
@@ -0,0 +1,39 @@
+import React from 'react';
+import { FormattedMessage as T } from 'components';
+import { Dialog, DialogSuspense } from 'components';
+import withDialogRedux from 'components/DialogReduxConnect';
+import { compose } from 'redux';
+
+const MoneyOutDialogContent = React.lazy(() =>
+ import('./MoneyOutDialogContent'),
+);
+
+/**
+ * Money out dialog.
+ */
+function MoneyOutDialog({
+ dialogName,
+ payload = { action: '', account_type: null, account_id: null },
+ isOpen,
+}) {
+ return (
+ }
+ isOpen={isOpen}
+ canEscapeJeyClose={true}
+ autoFocus={true}
+ className={'dialog--money-out'}
+ >
+
+
+
+
+ );
+}
+
+export default compose(withDialogRedux())(MoneyOutDialog);
diff --git a/src/hooks/query/index.js b/src/hooks/query/index.js
index 6ed15f9e9..ca18d976d 100644
--- a/src/hooks/query/index.js
+++ b/src/hooks/query/index.js
@@ -28,3 +28,4 @@ export * from './UniversalSearch/UniversalSearch';
export * from './GenericResource';
export * from './jobs';
export * from './misc';
+export * from './cashflowAccounts'
diff --git a/src/hooks/query/types.js b/src/hooks/query/types.js
index 9461b93db..2764784f4 100644
--- a/src/hooks/query/types.js
+++ b/src/hooks/query/types.js
@@ -99,7 +99,7 @@ const SETTING = {
SETTING_RECEIPTS: 'SETTING_RECEIPTS',
SETTING_PAYMENT_RECEIVES: 'SETTING_PAYMENT_RECEIVES',
SETTING_MANUAL_JOURNALS: 'SETTING_MANUAL_JOURNALS',
- SETTING_ITEMS: 'SETTING_ITEMS'
+ SETTING_ITEMS: 'SETTING_ITEMS',
};
const ORGANIZATIONS = {
@@ -132,6 +132,12 @@ const CONTACTS = {
CONTACT: 'CONTACT',
};
+const CASH_FLOW_ACCOUNTS = {
+ CASH_FLOW_ACCOUNTS: 'CASH_FLOW_ACCOUNTS',
+ CASH_FLOW_TRANSACTIONS: 'CASH_FLOW_TRANSACTIONS',
+ CASH_FLOW_TRANSACTION: 'CASH_FLOW_TRANSACTION',
+};
+
export default {
...ACCOUNTS,
...BILLS,
@@ -154,4 +160,5 @@ export default {
...MANUAL_JOURNALS,
...LANDED_COSTS,
...CONTACTS,
+ ...CASH_FLOW_ACCOUNTS,
};
diff --git a/src/lang/en/index.json b/src/lang/en/index.json
index 1ffcc604b..5bc30ec48 100644
--- a/src/lang/en/index.json
+++ b/src/lang/en/index.json
@@ -221,6 +221,7 @@
"manual_journal": "Manual Journal",
"make_journal": "Make Journal",
"banking": "Banking",
+ "cash_flow": "Cash Flow",
"sales": "Sales",
"purchases": "Purchases",
"financial_reports": "Financial Reports",
@@ -820,7 +821,7 @@
"invoice_date": "Invoice date",
"invoice_amount": "Invoice amount",
"make_payment": "Make Payment",
-"add_payment": "Add Payment",
+ "add_payment": "Add Payment",
"quick_receive_payment": "Quick Receive Payment",
"amount_received": "Amount Received",
"payment_no": "Payment No.",
@@ -1119,6 +1120,7 @@
"transaction_number": "Transaction number",
"transaction_line": "Transaction line",
"allocation_method": "Allocation method",
+ "other_income_account":"Other income account",
"valuation": "Valuation",
"select_transaction": "Select transaction account",
"details": "Details",
@@ -1359,5 +1361,29 @@
"vendors.option_without_zero_balance.hint": "Include vendors and exclude that ones have zero-balance.",
"vendors.option_with_transactions": "Vendors with transactions",
"vendors.option_with_transactions.hint": "Include vendors that onces have transactions on the given date period only.",
- "landed_cost.action.delete.success_message": "The landed cost has been deleted successfully."
-}
\ No newline at end of file
+ "landed_cost.action.delete.success_message": "The landed cost has been deleted successfully.",
+ "siebar.cashflow.label_cash_and_bank_accounts": "Cash & Bank accounts",
+
+ "cash_flow.label_account_transcations": "Account Transcations",
+ "cash_flow.label.deposit":"Deposit",
+ "cash_flow.label.withdrawal":"Withdrawal",
+ "cash_flow.label.running_balance":"Running balance",
+ "cash_flow.label.add_cash_account":"Add Cash account",
+ "cash_flow.label.add_bank_account":"Add Bank account",
+ "cash_flow.label.add_money_in":"Add Money In",
+ "cash_flow.label.add_money_out":"Add Money Out",
+ "cash_flow.option_owner_contribution":"Owner contribution",
+ "cash_flow.option_other_income":"Other income",
+ "cash_flow.option_owner_drawings":"Owner drawings",
+ "cash_flow.option_expenses":"Expenes",
+ "cash_flow.option_vendor_payment":"Vendor payment",
+ "cash_flow_transaction.label_equity_account":"Equity account",
+ "cash_flow_transaction_success_message":" The cashflow transaction has been created successfully.",
+ "cash_flow_transaction.money_in":"Money In",
+ "cash_flow_transaction.money_out":"Money Out",
+ "cash_flow_transaction.outher_income_account":"Other income account",
+ "save_and_publish": "Save & Publish"
+
+}
+
+
diff --git a/src/routes/dashboard.js b/src/routes/dashboard.js
index eed0bcae3..0d39a6e5d 100644
--- a/src/routes/dashboard.js
+++ b/src/routes/dashboard.js
@@ -1,12 +1,10 @@
-
import { lazy } from 'react';
import intl from 'react-intl-universal';
import { RESOURCES_TYPES } from '../common/resourcesTypes';
-
const SUBSCRIPTION_TYPE = {
MAIN: 'main',
-}
+};
// const BASE_URL = '/dashboard';
export const getDashboardRoutes = () => [
@@ -84,7 +82,7 @@ export const getDashboardRoutes = () => [
loader: () => import('containers/Items/ItemFormPage'),
}),
breadcrumb: intl.get('duplicate_item'),
- defaultSearchResource: RESOURCES_TYPES.ITEM,
+ defaultSearchResource: RESOURCES_TYPES.ITEM,
subscriptionActive: [SUBSCRIPTION_TYPE.MAIN],
},
{
@@ -291,7 +289,9 @@ export const getDashboardRoutes = () => [
),
),
breadcrumb: intl.get('customers_transactions'),
- hint: intl.get('reports_every_transaction_going_in_and_out_of_each_customer'),
+ hint: intl.get(
+ 'reports_every_transaction_going_in_and_out_of_each_customer',
+ ),
pageTitle: intl.get('customers_transactions'),
backLink: true,
sidebarExpand: false,
@@ -305,7 +305,9 @@ export const getDashboardRoutes = () => [
),
),
breadcrumb: intl.get('vendors_transactions'),
- hint: intl.get('reports_every_transaction_going_in_and_out_of_each_vendor_supplier'),
+ hint: intl.get(
+ 'reports_every_transaction_going_in_and_out_of_each_vendor_supplier',
+ ),
pageTitle: intl.get('vendors_transactions'),
backLink: true,
sidebarExpand: false,
@@ -717,7 +719,7 @@ export const getDashboardRoutes = () => [
path: `/billing`,
component: lazy(() => import('containers/Subscriptions/BillingForm')),
breadcrumb: intl.get('new_billing'),
- subscriptionInactive: [SUBSCRIPTION_TYPE.MAIN]
+ subscriptionInactive: [SUBSCRIPTION_TYPE.MAIN],
},
// Payment modes.
{
@@ -762,6 +764,28 @@ export const getDashboardRoutes = () => [
defaultSearchResource: RESOURCES_TYPES.PAYMENT_MADE,
subscriptionActive: [SUBSCRIPTION_TYPE.MAIN],
},
+ // Cash flow
+ {
+ path: `/account/:id/transactions`,
+ component: lazy(() =>
+ import('containers/CashFlow/AccountTransactions/AccountTransactionsList'),
+ ),
+ sidebarExpand: false,
+ backLink: true,
+ pageTitle: intl.get('cash_flow.label_account_transcations'),
+ subscriptionActive: [SUBSCRIPTION_TYPE.MAIN],
+ },
+ {
+ path: `/cashflow-accounts`,
+ component: lazy(() =>
+ import('containers/CashFlow/CashFlowAccounts/CashFlowAccountsList'),
+ ),
+ backLink: true,
+ // breadcrumb: intl.get('homepage'),
+ pageTitle: intl.get('siebar.cashflow.label_cash_and_bank_accounts'),
+ subscriptionActive: [SUBSCRIPTION_TYPE.MAIN],
+ },
+
// Homepage
{
path: `/`,
diff --git a/src/style/pages/CashFlow/CashflowTransactionForm.scss b/src/style/pages/CashFlow/CashflowTransactionForm.scss
new file mode 100644
index 000000000..2e3834168
--- /dev/null
+++ b/src/style/pages/CashFlow/CashflowTransactionForm.scss
@@ -0,0 +1,30 @@
+.dialog--money-in {
+ .bp3-form-group {
+ margin-bottom: 15px;
+
+ label.bp3-label {
+ font-size: 13px;
+ margin-bottom: 3px;
+ }
+ }
+ .form-group {
+ &--description {
+ .bp3-form-content {
+ textarea {
+ width: 100%;
+ min-width: 100%;
+ font-size: 14px;
+ }
+ }
+ }
+ &--reference-no,
+ &--amount,
+ &--cashflow_account_id {
+ max-width: 270px;
+ }
+ }
+
+ .bp3-dialog-footer {
+ padding-top: 10px;
+ }
+}