feat: open status in bill.

This commit is contained in:
elforjani3
2020-12-16 12:55:01 +02:00
parent 153b71184f
commit cc1f81241c
8 changed files with 124 additions and 30 deletions

View File

@@ -25,37 +25,37 @@ export default function BillFloatingActions({
onCancelClick,
onClearClick,
billId,
billPublished,
isOpen,
}) {
const { resetForm, submitForm } = useFormikContext();
const handleSubmitPublishBtnClick = (event) => {
const handleSubmitOpenBtnClick = (event) => {
saveInvoke(onSubmitClick, event, {
redirect: true,
publish: true,
status: true,
});
};
const handleSubmitPublishAndNewBtnClick = (event) => {
const handleSubmitOpenAndNewBtnClick = (event) => {
submitForm();
saveInvoke(onSubmitClick, event, {
redirect: false,
publish: true,
status: true,
resetForm: true,
});
};
const handleSubmitPublishContinueEditingBtnClick = (event) => {
const handleSubmitOpenContinueEditingBtnClick = (event) => {
submitForm();
saveInvoke(onSubmitClick, event, {
redirect: false,
publish: true,
status: true,
});
};
const handleSubmitDraftBtnClick = (event) => {
saveInvoke(onSubmitClick, event, {
redirect: true,
publish: false,
status: false,
});
};
@@ -63,7 +63,7 @@ export default function BillFloatingActions({
submitForm();
saveInvoke(onSubmitClick, event, {
redirect: false,
publish: false,
status: false,
resetForm: true,
});
};
@@ -72,7 +72,7 @@ export default function BillFloatingActions({
submitForm();
saveInvoke(onSubmitClick, event, {
redirect: false,
publish: false,
status: false,
});
};
@@ -87,26 +87,26 @@ export default function BillFloatingActions({
return (
<div className={classNames(CLASSES.PAGE_FORM_FLOATING_ACTIONS)}>
{/* ----------- Save And Publish ----------- */}
<If condition={!billId || !billPublished}>
{/* ----------- Save And Open ----------- */}
<If condition={!billId || !isOpen}>
<ButtonGroup>
<Button
disabled={isSubmitting}
intent={Intent.PRIMARY}
type="submit"
onClick={handleSubmitPublishBtnClick}
text={<T id={'save_publish'} />}
onClick={handleSubmitOpenBtnClick}
text={<T id={'save_open'} />}
/>
<Popover
content={
<Menu>
<MenuItem
text={<T id={'publish_and_new'} />}
onClick={handleSubmitPublishAndNewBtnClick}
text={<T id={'open_and_new'} />}
onClick={handleSubmitOpenAndNewBtnClick}
/>
<MenuItem
text={<T id={'publish_continue_editing'} />}
onClick={handleSubmitPublishContinueEditingBtnClick}
text={<T id={'open_continue_editing'} />}
onClick={handleSubmitOpenContinueEditingBtnClick}
/>
</Menu>
}
@@ -155,13 +155,13 @@ export default function BillFloatingActions({
</ButtonGroup>
</If>
{/* ----------- Save and New ----------- */}
<If condition={billId && billPublished}>
<If condition={billId && isOpen}>
<ButtonGroup>
<Button
disabled={isSubmitting}
intent={Intent.PRIMARY}
type="submit"
onClick={handleSubmitPublishBtnClick}
onClick={handleSubmitOpenBtnClick}
text={<T id={'save'} />}
/>
<Popover
@@ -169,7 +169,7 @@ export default function BillFloatingActions({
<Menu>
<MenuItem
text={<T id={'save_and_new'} />}
onClick={handleSubmitPublishAndNewBtnClick}
onClick={handleSubmitOpenAndNewBtnClick}
/>
</Menu>
}

View File

@@ -43,6 +43,7 @@ const defaultInitialValues = {
due_date: moment(new Date()).format('YYYY-MM-DD'),
reference_no: '',
note: '',
open:'',
entries: [...repeatValue(defaultBill, MIN_LINES_NUMBER)],
};
@@ -141,6 +142,7 @@ function BillForm({
const form = {
...values,
open:submitPayload.status,
entries: entries.map((entry) => ({ ...omit(entry, ['total']) })),
};
// Handle the request success.
@@ -217,7 +219,7 @@ function BillForm({
initialValues={initialValues}
onSubmit={handleFormSubmit}
>
{({ isSubmitting }) => (
{({ isSubmitting ,values }) => (
<Form>
<BillFormHeader onBillNumberChanged={handleBillNumberChanged} />
<BillFormBody defaultBill={defaultBill} />
@@ -228,7 +230,7 @@ function BillForm({
<BillFloatingActions
isSubmitting={isSubmitting}
billId={billId}
billPublished={true}
isOpen={values.open}
onSubmitClick={handleSubmitClick}
onCancelClick={handleCancelClick}
/>

View File

@@ -22,6 +22,7 @@ const BillFormSchema = Yup.object().shape({
.min(1)
.max(DATATYPES_LENGTH.TEXT)
.label(formatMessage({ id: 'note' })),
open: Yup.boolean().required(),
entries: Yup.array().of(
Yup.object().shape({
quantity: Yup.number()

View File

@@ -35,11 +35,13 @@ function BillList({
//#withBillActions
requestFetchBillsTable,
requestDeleteBill,
requestOpenBill,
addBillsTableQueries,
}) {
const history = useHistory();
const { formatMessage } = useIntl();
const [deleteBill, setDeleteBill] = useState(false);
const [openBill, setOpenBill] = useState(false);
const [selectedRows, setSelectedRows] = useState([]);
useEffect(() => {
@@ -86,12 +88,36 @@ function BillList({
});
}, [deleteBill, requestDeleteBill, formatMessage]);
// Handle cancel/confirm bill open.
const handleOpenBill = useCallback((bill) => {
setOpenBill(bill);
}, []);
// Handle cancel open bill alert.
const handleCancelOpenBill = useCallback(() => {
setOpenBill(false);
}, []);
// Handle confirm bill open.
const handleConfirmBillOpen = useCallback(() => {
requestOpenBill(openBill.id)
.then(() => {
setOpenBill(false);
AppToaster.show({
message: formatMessage({
id: 'the_bill_has_been_successfully_opened',
}),
intent: Intent.SUCCESS,
});
queryCache.invalidateQueries('bills-table');
})
.catch((error) => {});
}, [openBill, requestOpenBill, formatMessage]);
const handleEditBill = useCallback((bill) => {
history.push(`/bills/${bill.id}/edit`);
});
// Handle selected rows change.
const handleSelectedRowsChange = useCallback(
(_invoices) => {
@@ -127,6 +153,7 @@ function BillList({
<BillsDataTable
onDeleteBill={handleDeleteBill}
onEditBill={handleEditBill}
onOpenBill={handleOpenBill}
onSelectedRowsChange={handleSelectedRowsChange}
/>
</Route>
@@ -144,6 +171,18 @@ function BillList({
<T id={'once_delete_this_bill_you_will_able_to_restore_it'} />
</p>
</Alert>
<Alert
cancelButtonText={<T id={'cancel'} />}
confirmButtonText={<T id={'open'} />}
intent={Intent.WARNING}
isOpen={openBill}
onCancel={handleCancelOpenBill}
onConfirm={handleConfirmBillOpen}
>
<p>
<T id={'are_sure_to_open_this_bill'} />
</p>
</Alert>
</DashboardPageContent>
</DashboardInsider>
);

View File

@@ -7,6 +7,7 @@ import {
MenuItem,
MenuDivider,
Position,
Tag,
} from '@blueprintjs/core';
import { useParams } from 'react-router-dom';
@@ -20,7 +21,7 @@ import { compose, saveInvoke } from 'utils';
import { CLASSES } from 'common/classes';
import { useIsValuePassed } from 'hooks';
import { LoadingIndicator, Choose } from 'components';
import { LoadingIndicator, Choose, If } from 'components';
import DataTable from 'components/DataTable';
import BillsEmptyStatus from './BillsEmptyStatus';
@@ -56,6 +57,7 @@ function BillsDataTable({
onFetchData,
onEditBill,
onDeleteBill,
onOpenBill,
onSelectedRowsChange,
}) {
const { custom_view_id: customViewId } = useParams();
@@ -121,6 +123,13 @@ function BillsDataTable({
text={formatMessage({ id: 'edit_bill' })}
onClick={handleEditBill(bill)}
/>
<If condition={!bill.is_open}>
<MenuItem
text={formatMessage({ id: 'mark_as_opened' })}
onClick={() => onOpenBill(bill)}
/>
</If>
<MenuItem
text={formatMessage({ id: 'delete_bill' })}
intent={Intent.DANGER}
@@ -186,7 +195,21 @@ function BillsDataTable({
{
id: 'status',
Header: formatMessage({ id: 'status' }),
accessor: 'status',
accessor: (row) => (
<Choose>
<Choose.When condition={row.is_open}>
<Tag minimal={true}>
<T id={'opened'} />
</Tag>
</Choose.When>
<Choose.Otherwise>
<Tag minimal={true} intent={Intent.WARNING}>
<T id={'draft'} />
</Tag>
</Choose.Otherwise>
</Choose>
),
width: 140,
className: 'status',
},

View File

@@ -6,6 +6,7 @@ import {
fetchBillsTable,
fetchBill,
fetchDueBills,
openBill,
} from 'store/Bills/bills.actions';
import t from 'store/types';
@@ -17,7 +18,7 @@ const mapDispatchToProps = (dispatch) => ({
requestFetchBillsTable: (query = {}) =>
dispatch(fetchBillsTable({ query: { ...query } })),
requestFetchDueBills: (vendorId) => dispatch(fetchDueBills({ vendorId })),
requestOpenBill: (id) => dispatch(openBill({ id })),
changeBillView: (id) =>
dispatch({
type: t.BILLS_SET_CURRENT_VIEW,

View File

@@ -866,7 +866,7 @@ export default {
receivable_accounts_should_assign_with_customers:
'receivable accounts should assign with customers',
delivered: 'Delivered',
save_and_deliver: 'Save and Deliver',
save_and_deliver: 'Save & Deliver',
deliver_and_new: 'Deliver and new',
deliver_continue_editing: 'Deliver (continue editing)',
due_in: 'Due in',
@@ -878,4 +878,28 @@ export default {
paid: 'Paid',
your_account_has_been_locked:
'Your account has been locked due to repeated failed login attempts. Please wait a few minutes before trying again.',
the_invoice_has_been_successfully_delivered:
'The invoice has been successfully delivered.',
are_sure_to_deliver_this_invoice:
'Are you sure you want to deliver this invoice?',
mark_as_delivered: 'Mark as delivered',
deliver: 'Deliver',
mark_as_closed: 'Mark as closed',
mark_as_opened: 'Mark as opened',
save_close: 'Save & Close',
save_open: 'Save & Open',
close_and_new: 'Close and new',
close_continue_editing: 'Close (continue editing)',
the_receipt_has_been_successfully_closed:
'The receipt has been successfully closed.',
are_sure_to_close_this_receipt:
'Are you sure you want to close this receipt?',
closed: 'Closed',
open_and_new: 'Open and new',
open_continue_editing: 'Open (continue editing)',
the_bill_has_been_successfully_opened:
'The bill has been successfully opened.',
open: 'Open',
are_sure_to_open_this_bill: 'Are you sure you want to open this bill?',
opened: 'Opened',
};

View File

@@ -138,4 +138,8 @@ export const fetchDueBills = ({ vendorId }) => (dispatch) => new Promise((resolv
}
resolve(response);
}).catch(error => { reject(error) });
});
});
export const openBill = ({ id }) => {
return (dispatch) => ApiService.post(`purchases/bills/${id}/open`);
};