Fix / takse expense & Journal

This commit is contained in:
elforjani3
2020-07-05 21:30:51 +02:00
parent 679789345c
commit 7ea417d8c0
11 changed files with 176 additions and 73 deletions

View File

@@ -34,6 +34,7 @@ const ERROR = {
VENDORS_NOT_WITH_PAYABLE_ACCOUNT: 'VENDORS.NOT.WITH.PAYABLE.ACCOUNT', VENDORS_NOT_WITH_PAYABLE_ACCOUNT: 'VENDORS.NOT.WITH.PAYABLE.ACCOUNT',
PAYABLE_ENTRIES_HAS_NO_VENDORS: 'PAYABLE.ENTRIES.HAS.NO.VENDORS', PAYABLE_ENTRIES_HAS_NO_VENDORS: 'PAYABLE.ENTRIES.HAS.NO.VENDORS',
RECEIVABLE_ENTRIES_HAS_NO_CUSTOMERS: 'RECEIVABLE.ENTRIES.HAS.NO.CUSTOMERS', RECEIVABLE_ENTRIES_HAS_NO_CUSTOMERS: 'RECEIVABLE.ENTRIES.HAS.NO.CUSTOMERS',
CREDIT_DEBIT_SUMATION_SHOULD_NOT_EQUAL_ZERO:'CREDIT.DEBIT.SUMATION.SHOULD.NOT.EQUAL.ZERO'
}; };
/** /**
@@ -57,6 +58,7 @@ function MakeJournalEntriesForm({
onFormSubmit, onFormSubmit,
onCancelForm, onCancelForm,
}) { }) {
const { formatMessage } = useIntl(); const { formatMessage } = useIntl();
const { const {
setFiles, setFiles,
@@ -68,10 +70,12 @@ function MakeJournalEntriesForm({
saveCallback: requestSubmitMedia, saveCallback: requestSubmitMedia,
deleteCallback: requestDeleteMedia, deleteCallback: requestDeleteMedia,
}); });
const handleDropFiles = useCallback((_files) => { const handleDropFiles = useCallback((_files) => {
setFiles(_files.filter((file) => file.uploaded === false)); setFiles(_files.filter((file) => file.uploaded === false));
}, []); }, []);
const savedMediaIds = useRef([]); const savedMediaIds = useRef([]);
const clearSavedMediaIds = () => { const clearSavedMediaIds = () => {
savedMediaIds.current = []; savedMediaIds.current = [];
@@ -222,6 +226,15 @@ function MakeJournalEntriesForm({
}), }),
}); });
} }
if(hasError(ERROR.CREDIT_DEBIT_SUMATION_SHOULD_NOT_EQUAL_ZERO)){
AppToaster.show({
message:formatMessage({
id:'credit_debit_summation_should_not_equal_zero'
}),
intent:Intent.DANGER
})
}
}; };
const formik = useFormik({ const formik = useFormik({

View File

@@ -46,7 +46,7 @@ function MakeJournalEntriesPage({
); );
const handleCancel = useCallback(() => { const handleCancel = useCallback(() => {
history.push('/manual-journals'); history.goBack();
}, [history]); }, [history]);
return ( return (

View File

@@ -41,7 +41,7 @@ function ManualJournalActionsBar({
addManualJournalsTableQueries, addManualJournalsTableQueries,
onFilterChanged, onFilterChanged,
selectedRows, selectedRows = [],
onBulkDelete, onBulkDelete,
}) { }) {
const { path } = useRouteMatch(); const { path } = useRouteMatch();
@@ -73,9 +73,9 @@ function ManualJournalActionsBar({
onFilterChanged && onFilterChanged(filterConditions); onFilterChanged && onFilterChanged(filterConditions);
}, },
}); });
const hasSelectedRows = useMemo(() => selectedRows.length > 0, [ const hasSelectedRows = useMemo(
selectedRows, () => selectedRows.length > 0,
]); [selectedRows]);
// Handle delete button click. // Handle delete button click.
const handleBulkDelete = useCallback(() => { const handleBulkDelete = useCallback(() => {

View File

@@ -25,10 +25,10 @@ import withManualJournalsActions from 'containers/Accounting/withManualJournalsA
/** /**
* Status column accessor. * Status column accessor.
*/ */
function StatusAccessor(row) { const StatusAccessor = (row) => {
return ( return (
<Choose> <Choose>
<Choose.When condition={row.status}> <Choose.When condition={!!row.status}>
<Tag minimal={true}> <Tag minimal={true}>
<T id={'published'} /> <T id={'published'} />
</Tag> </Tag>
@@ -41,7 +41,7 @@ function StatusAccessor(row) {
</Choose.Otherwise> </Choose.Otherwise>
</Choose> </Choose>
); );
} };
/** /**
* Note column accessor. * Note column accessor.
@@ -115,12 +115,12 @@ function ManualJournalsDataTable({
<Menu> <Menu>
<MenuItem text={formatMessage({ id: 'view_details' })} /> <MenuItem text={formatMessage({ id: 'view_details' })} />
<MenuDivider /> <MenuDivider />
{!journal.status && ( <If condition={!journal.status}>
<MenuItem <MenuItem
text={formatMessage({ id: 'publish_journal' })} text={formatMessage({ id: 'publish_journal' })}
onClick={handlePublishJournal(journal)} onClick={handlePublishJournal(journal)}
/> />
)} </If>
<MenuItem <MenuItem
text={formatMessage({ id: 'edit_journal' })} text={formatMessage({ id: 'edit_journal' })}
onClick={handleEditJournal(journal)} onClick={handleEditJournal(journal)}
@@ -230,20 +230,29 @@ function ManualJournalsDataTable({
}, },
[onSelectedRowsChange], [onSelectedRowsChange],
); );
const selectionColumn = useMemo(
() => ({
minWidth: 40,
width: 40,
maxWidth: 40,
}),
[],
);
return ( return (
<DataTable <DataTable
noInitialFetch={true}
columns={columns} columns={columns}
data={manualJournalsCurrentPage} data={manualJournalsCurrentPage}
onFetchData={handleDataTableFetchData} onFetchData={handleDataTableFetchData}
manualSortBy={true} manualSortBy={true}
selectionColumn={true} selectionColumn={selectionColumn}
noInitialFetch={true} expandable={true}
sticky={true} sticky={true}
loading={manualJournalsLoading && !isMounted}
onSelectedRowsChange={handleSelectedRowsChange} onSelectedRowsChange={handleSelectedRowsChange}
pagination={true} loading={manualJournalsLoading && !isMounted}
rowContextMenu={onRowContextMenu} rowContextMenu={onRowContextMenu}
pagination={true}
pagesCount={manualJournalsPagination.pagesCount} pagesCount={manualJournalsPagination.pagesCount}
initialPageSize={manualJournalsTableQuery.page_size} initialPageSize={manualJournalsTableQuery.page_size}
initialPageIndex={manualJournalsTableQuery.page - 1} initialPageIndex={manualJournalsTableQuery.page - 1}

View File

@@ -3,7 +3,11 @@ import { Route, Switch, useHistory, withRouter } from 'react-router-dom';
import { useQuery } from 'react-query'; import { useQuery } from 'react-query';
import { Alert, Intent } from '@blueprintjs/core'; import { Alert, Intent } from '@blueprintjs/core';
import AppToaster from 'components/AppToaster'; import AppToaster from 'components/AppToaster';
import { FormattedMessage as T, useIntl } from 'react-intl'; import {
FormattedMessage as T,
useIntl,
FormattedHTMLMessage,
} from 'react-intl';
import DashboardPageContent from 'components/Dashboard/DashboardPageContent'; import DashboardPageContent from 'components/Dashboard/DashboardPageContent';
import DashboardInsider from 'components/Dashboard/DashboardInsider'; import DashboardInsider from 'components/Dashboard/DashboardInsider';
@@ -114,6 +118,7 @@ function ManualJournalsTable({
const handleConfirmBulkDelete = useCallback(() => { const handleConfirmBulkDelete = useCallback(() => {
requestDeleteBulkManualJournals(bulkDelete) requestDeleteBulkManualJournals(bulkDelete)
.then(() => { .then(() => {
setBulkDelete(false);
AppToaster.show({ AppToaster.show({
message: formatMessage( message: formatMessage(
{ id: 'the_journals_has_been_successfully_deleted' }, { id: 'the_journals_has_been_successfully_deleted' },
@@ -121,7 +126,6 @@ function ManualJournalsTable({
), ),
intent: Intent.SUCCESS, intent: Intent.SUCCESS,
}); });
setBulkDelete(false);
}) })
.catch((error) => { .catch((error) => {
setBulkDelete(false); setBulkDelete(false);
@@ -181,6 +185,7 @@ function ManualJournalsTable({
message: formatMessage({ message: formatMessage({
id: 'the_manual_journal_id_has_been_published', id: 'the_manual_journal_id_has_been_published',
}), }),
intent: Intent.SUCCESS,
}); });
}); });
}, },
@@ -237,11 +242,7 @@ function ManualJournalsTable({
onConfirm={handleConfirmManualJournalDelete} onConfirm={handleConfirmManualJournalDelete}
> >
<p> <p>
<T <T id={'once_delete_this_journal_you_will_able_to_restore_it'} />
id={
'once_delete_this_journal_category_you_will_able_to_restore_it'
}
/>
</p> </p>
</Alert> </Alert>

View File

@@ -1,11 +1,7 @@
import React, { useEffect, useRef } from 'react'; import React, { useEffect, useRef } from 'react';
import { useHistory } from 'react-router'; import { useHistory } from 'react-router';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { import { Alignment, Navbar, NavbarGroup } from '@blueprintjs/core';
Alignment,
Navbar,
NavbarGroup,
} from '@blueprintjs/core';
import { useParams, withRouter } from 'react-router-dom'; import { useParams, withRouter } from 'react-router-dom';
import { pick, debounce } from 'lodash'; import { pick, debounce } from 'lodash';
@@ -38,13 +34,14 @@ function AccountsViewsTabs({
customViewChanged, customViewChanged,
onViewChanged, onViewChanged,
}) { }) {
const history = useHistory(); const history = useHistory();
const { custom_view_id: customViewId = null } = useParams(); const { custom_view_id: customViewId = null } = useParams();
useEffect(() => { useEffect(() => {
changeAccountsCurrentView(customViewId || -1); changeAccountsCurrentView(customViewId || -1);
setTopbarEditView(customViewId); setTopbarEditView(customViewId);
changePageSubtitle((customViewId && viewItem) ? viewItem.name : ''); changePageSubtitle(customViewId && viewItem ? viewItem.name : '');
addAccountsTableQueries({ addAccountsTableQueries({
custom_view_id: customViewId, custom_view_id: customViewId,

View File

@@ -12,6 +12,7 @@ import {
Tag, Tag,
} from '@blueprintjs/core'; } from '@blueprintjs/core';
import { useParams } from 'react-router-dom'; import { useParams } from 'react-router-dom';
import { withRouter } from 'react-router';
import { FormattedMessage as T, useIntl } from 'react-intl'; import { FormattedMessage as T, useIntl } from 'react-intl';
import moment from 'moment'; import moment from 'moment';
@@ -28,6 +29,7 @@ import withDashboardActions from 'containers/Dashboard/withDashboardActions';
import withViewDetails from 'containers/Views/withViewDetails'; import withViewDetails from 'containers/Views/withViewDetails';
import withExpenses from 'containers/Expenses/withExpenses'; import withExpenses from 'containers/Expenses/withExpenses';
import withExpensesActions from 'containers/Expenses/withExpensesActions'; import withExpensesActions from 'containers/Expenses/withExpensesActions';
import withCurrentView from 'containers/Views/withCurrentView';
function ExpensesDataTable({ function ExpensesDataTable({
//#withExpenes //#withExpenes
@@ -55,6 +57,10 @@ function ExpensesDataTable({
const [initialMount, setInitialMount] = useState(false); const [initialMount, setInitialMount] = useState(false);
const { formatMessage } = useIntl(); const { formatMessage } = useIntl();
useEffect(()=>{
setInitialMount(false)
},[customViewId])
useUpdateEffect(() => { useUpdateEffect(() => {
if (!expensesLoading) { if (!expensesLoading) {
setInitialMount(true); setInitialMount(true);
@@ -260,7 +266,7 @@ function ExpensesDataTable({
selectionColumn={true} selectionColumn={true}
noInitialFetch={true} noInitialFetch={true}
sticky={true} sticky={true}
loading={expensesLoading} loading={expensesLoading && !initialMount}
onSelectedRowsChange={handleSelectedRowsChange} onSelectedRowsChange={handleSelectedRowsChange}
rowContextMenu={onRowContextMenu} rowContextMenu={onRowContextMenu}
pagination={true} pagination={true}
@@ -274,6 +280,8 @@ function ExpensesDataTable({
} }
export default compose( export default compose(
withRouter,
withCurrentView,
withDialogActions, withDialogActions,
withDashboardActions, withDashboardActions,
withExpensesActions, withExpensesActions,

View File

@@ -28,6 +28,11 @@ import Dragzone from 'components/Dragzone';
import useMedia from 'hooks/useMedia'; import useMedia from 'hooks/useMedia';
import { compose, repeatValue } from 'utils'; import { compose, repeatValue } from 'utils';
const ERROR = {
TOTAL_AMOUNT_EQUALS_ZERO: 'TOTAL.AMOUNT.EQUALS.ZERO',
EXPENSE_ALREADY_PUBLISHED: 'EXPENSE.ALREADY.PUBLISHED',
};
function ExpenseForm({ function ExpenseForm({
// #withMedia // #withMedia
requestSubmitMedia, requestSubmitMedia,
@@ -134,9 +139,7 @@ function ExpenseForm({
description: '', description: '',
reference_no: '', reference_no: '',
currency_code: '', currency_code: '',
categories: [ categories: [...repeatValue(defaultCategory, 4)],
...repeatValue(defaultCategory, 4),
],
}), }),
[defaultCategory], [defaultCategory],
); );
@@ -177,6 +180,30 @@ function ExpenseForm({
: []; : [];
}, [expense]); }, [expense]);
// Transform API errors in toasts messages.
const transformErrors = (errors, { setErrors }) => {
const hasError = (errorType) => errors.some((e) => e.type === errorType);
if (hasError(ERROR.TOTAL_AMOUNT_EQUALS_ZERO)) {
setErrors(
AppToaster.show({
message: formatMessage({
id: 'total_amount_equals_zero',
}),
intent: Intent.DANGER,
}),
);
}
if (hasError(ERROR.EXPENSE_ALREADY_PUBLISHED)) {
setErrors(
AppToaster.show({
message: formatMessage({
id: 'expense_already_published',
}),
}),
);
}
};
const formik = useFormik({ const formik = useFormik({
enableReinitialize: true, enableReinitialize: true,
validationSchema, validationSchema,
@@ -214,16 +241,7 @@ function ExpenseForm({
resetForm(); resetForm();
}) })
.catch((errors) => { .catch((errors) => {
if (errors.find((e) => e.type === 'TOTAL.AMOUNT.EQUALS.ZERO')) { transformErrors(errors, { setErrors });
}
setErrors(
AppToaster.show({
message: formatMessage({
id: 'total_amount_equals_zero',
}),
intent: Intent.DANGER,
}),
);
setSubmitting(false); setSubmitting(false);
}); });
} else { } else {
@@ -244,6 +262,7 @@ function ExpenseForm({
// resolve(response); // resolve(response);
}) })
.catch((errors) => { .catch((errors) => {
transformErrors(errors, { setErrors });
setSubmitting(false); setSubmitting(false);
}); });
} }
@@ -298,11 +317,9 @@ function ExpenseForm({
const handleClearAllLines = () => { const handleClearAllLines = () => {
formik.setFieldValue( formik.setFieldValue(
'categories', 'categories',
orderingCategoriesIndex([ orderingCategoriesIndex([...repeatValue(defaultCategory, 4)]),
...repeatValue(defaultCategory, 4),
]),
); );
} };
return ( return (
<div className={'expense-form'}> <div className={'expense-form'}>
@@ -316,7 +333,6 @@ function ExpenseForm({
formik={formik} formik={formik}
defaultRow={defaultCategory} defaultRow={defaultCategory}
/> />
<div class="expense-form-footer"> <div class="expense-form-footer">
<FormGroup <FormGroup
label={<T id={'description'} />} label={<T id={'description'} />}

View File

@@ -1,15 +1,12 @@
import React, { useEffect, useRef } from 'react'; import React, { useEffect, useRef } from 'react';
import { useHistory } from 'react-router'; import { useHistory } from 'react-router';
import { import { Alignment, Navbar, NavbarGroup } from '@blueprintjs/core';
Alignment,
Navbar,
NavbarGroup,
} from '@blueprintjs/core';
import { useParams, withRouter } from 'react-router-dom'; import { useParams, withRouter } from 'react-router-dom';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { pick, debounce } from 'lodash'; import { pick, debounce } from 'lodash';
import { DashboardViewsTabs } from 'components'; import { DashboardViewsTabs } from 'components';
import { useUpdateEffect } from 'hooks';
import withExpenses from './withExpenses'; import withExpenses from './withExpenses';
import withExpensesActions from './withExpensesActions'; import withExpensesActions from './withExpensesActions';
@@ -32,9 +29,13 @@ function ExpenseViewTabs({
// #withDashboardActions // #withDashboardActions
setTopbarEditView, setTopbarEditView,
changePageSubtitle, changePageSubtitle,
// props
customViewChanged,
onViewChanged,
}) { }) {
const history = useHistory(); const history = useHistory();
const { custom_view_id: customViewId } = useParams(); const { custom_view_id: customViewId = null } = useParams();
useEffect(() => { useEffect(() => {
changeExpensesView(customViewId || -1); changeExpensesView(customViewId || -1);
@@ -51,6 +52,10 @@ function ExpenseViewTabs({
}; };
}, [customViewId, addExpensesTableQueries, changeExpensesView]); }, [customViewId, addExpensesTableQueries, changeExpensesView]);
useUpdateEffect(() => {
onViewChanged && onViewChanged(customViewId);
}, [customViewId]);
const debounceChangeHistory = useRef( const debounceChangeHistory = useRef(
debounce((toUrl) => { debounce((toUrl) => {
history.push(toUrl); history.push(toUrl);
@@ -59,7 +64,7 @@ function ExpenseViewTabs({
const handleTabsChange = (viewId) => { const handleTabsChange = (viewId) => {
const toPath = viewId ? `${viewId}/custom_view` : ''; const toPath = viewId ? `${viewId}/custom_view` : '';
debounceChangeHistory.current(`/expenses/${toPath}`); debounceChangeHistory.current(`/expenses-list/${toPath}`);
setTopbarEditView(viewId); setTopbarEditView(viewId);
}; };
@@ -78,7 +83,7 @@ function ExpenseViewTabs({
<NavbarGroup align={Alignment.LEFT}> <NavbarGroup align={Alignment.LEFT}>
<DashboardViewsTabs <DashboardViewsTabs
initialViewId={customViewId} initialViewId={customViewId}
baseUrl={'/expenses'} baseUrl={'/expenses-list'}
tabs={tabs} tabs={tabs}
onNewViewTabClick={handleClickNewView} onNewViewTabClick={handleClickNewView}
onChange={handleTabsChange} onChange={handleTabsChange}

View File

@@ -1,6 +1,6 @@
import React, { useEffect, useState, useMemo, useCallback } from 'react'; import React, { useEffect, useState, useMemo, useCallback } from 'react';
import { Route, Switch, useHistory, useParams } from 'react-router-dom'; import { Route, Switch, useHistory, useParams } from 'react-router-dom';
import { useQuery } from 'react-query'; import { useQuery, queryCache } from 'react-query';
import { Alert, Intent } from '@blueprintjs/core'; import { Alert, Intent } from '@blueprintjs/core';
import AppToaster from 'components/AppToaster'; import AppToaster from 'components/AppToaster';
import { FormattedMessage as T, useIntl } from 'react-intl'; import { FormattedMessage as T, useIntl } from 'react-intl';
@@ -45,6 +45,7 @@ function ExpensesList({
const [deleteExpense, setDeleteExpense] = useState(false); const [deleteExpense, setDeleteExpense] = useState(false);
const [selectedRows, setSelectedRows] = useState([]); const [selectedRows, setSelectedRows] = useState([]);
const [bulkDelete, setBulkDelete] = useState(false); const [bulkDelete, setBulkDelete] = useState(false);
const [publishExpense, setPublishExpense] = useState(false);
const fetchResourceViews = useQuery( const fetchResourceViews = useQuery(
['resource-views', 'expenses'], ['resource-views', 'expenses'],
@@ -155,17 +156,35 @@ function ExpensesList({
[addExpensesTableQueries], [addExpensesTableQueries],
); );
const handlePublishExpense = useCallback( // const fetchExpenses = useQuery(['expenses-table', expensesTableQuery], () =>
(expense) => { // requestFetchExpensesTable(),
requestPublishExpense(expense.id).then(() => { // );
const handlePublishExpense = useCallback((expense) => {
setPublishExpense(expense);
}, []);
const handleCancelPublishExpense = useCallback(() => {
setPublishExpense(false);
});
// Handle publish expense confirm.
const handleConfirmPublishExpense = useCallback(() => {
requestPublishExpense(publishExpense.id)
.then(() => {
setPublishExpense(false);
AppToaster.show({ AppToaster.show({
message: formatMessage({ id: 'the_expense_id_has_been_published' }), message: formatMessage({
id: 'the_expense_has_been_published',
}),
intent: Intent.SUCCESS,
}); });
queryCache.invalidateQueries('expenses-table');
})
.catch((error) => {
setPublishExpense(false);
}); });
fetchExpenses.refetch(); }, [publishExpense, requestPublishExpense, formatMessage]);
},
[requestPublishExpense, formatMessage],
);
// Handle selected rows change. // Handle selected rows change.
const handleSelectedRowsChange = useCallback( const handleSelectedRowsChange = useCallback(
@@ -189,10 +208,10 @@ function ExpensesList({
<DashboardPageContent> <DashboardPageContent>
<Switch> <Switch>
<Route <Route
// exact={true} exact={true}
// path={[ // path={[
// '/expenses/:custom_view_id/custom_view', // '/expenses/:custom_view_id/custom_view',
// '/expenses/new', // 'expenses',
// ]} // ]}
> >
<ExpenseViewTabs /> <ExpenseViewTabs />
@@ -239,14 +258,26 @@ function ExpensesList({
/> />
</p> </p>
</Alert> </Alert>
<Alert
cancelButtonText={<T id={'cancel'} />}
confirmButtonText={<T id={'publish'} />}
intent={Intent.WARNING}
isOpen={publishExpense}
onCancel={handleCancelPublishExpense}
onConfirm={handleConfirmPublishExpense}
>
<p>
<T id={'are_sure_to_publish_this_account'} />
</p>
</Alert>
</DashboardPageContent> </DashboardPageContent>
</DashboardInsider> </DashboardInsider>
); );
} }
export default compose( export default compose(
withDashboardActions,
withExpensesActions, withExpensesActions,
withDashboardActions,
withViewsActions, withViewsActions,
withResourceActions, withResourceActions,
withExpenses(({ expensesTableQuery }) => ({ expensesTableQuery })), withExpenses(({ expensesTableQuery }) => ({ expensesTableQuery })),

View File

@@ -441,7 +441,7 @@ export default {
once_delete_these_expenses_you_will_not_able_restore_them: once_delete_these_expenses_you_will_not_able_restore_them:
"Once you delete these expenses, you won't be able to retrieve them later. Are you sure you want to delete them?", "Once you delete these expenses, you won't be able to retrieve them later. Are you sure you want to delete them?",
the_expense_id_has_been_published: 'The expense id has been published', the_expense_has_been_published: 'The expense has been published',
select_beneficiary_account: 'Select Beneficiary Account', select_beneficiary_account: 'Select Beneficiary Account',
total_amount_equals_zero: 'Total amount equals zero', total_amount_equals_zero: 'Total amount equals zero',
value: 'Value', value: 'Value',
@@ -450,7 +450,7 @@ export default {
as_date: 'As Date', as_date: 'As Date',
aging_before_days: 'Aging before days', aging_before_days: 'Aging before days',
aging_periods: 'Aging periods', aging_periods: 'Aging periods',
name_:'name', name_: 'name',
as: 'As', as: 'As',
receivable_aging_summary: 'Receivable Aging Summary', receivable_aging_summary: 'Receivable Aging Summary',
customers: 'Customers', customers: 'Customers',
@@ -528,4 +528,27 @@ export default {
'A unique code/number for this account (limited to 10 characters)', 'A unique code/number for this account (limited to 10 characters)',
logic_expression: 'logic expression', logic_expression: 'logic expression',
assign_to_customer: 'Assign to Customer', assign_to_customer: 'Assign to Customer',
are_sure_to_publish_this_account:
'Are you sure you want to publish this expense?',
once_delete_these_journalss_you_will_not_able_restore_them:
"Once you delete these journalss, you won't be able to retrieve them later. Are you sure you want to delete them?",
once_delete_this_journal_you_will_able_to_restore_it: `Once you delete this journal, you won\'t be able to restore it later. Are you sure you want to delete this account?<br /><br />If you're not sure, you can inactivate this account instead.`,
once_delete_this_journal_you_will_able_to_restore_it: `Once you delete this journal, you won\'t be able to restore the item later. Are you sure you want to delete ?`,
should_total_of_credit_and_debit_be_equal:
'should total of credit and debit be equal',
should_total_of_credit_and_debit_be_bigger_then_zero:
'should total of credit and debit be bigger then zero',
credit_debit_summation_should_not_equal_zero:
'credit debit summation should not equal zero',
entries_with_payable_account_no_assigned_with_vendors:
'entries with payable account no assigned with vendors',
entries_with_receivable_account_no_assigned_with_customers:
'entries with receivable account no assigned with customers',
vendors_should_assign_with_payable_account_only:
'vendors should assign with payable account only',
customers_should_assign_with_receivable_account_only:
'customers should assign with receivable account only',
expense_already_published: 'expense already published',
}; };