From 15fa1729a23ea94e3c345e3d319ae631ae3e9237 Mon Sep 17 00:00:00 2001 From: elforjani13 <39470382+elforjani13@users.noreply.github.com> Date: Tue, 30 Nov 2021 16:34:13 +0200 Subject: [PATCH] feat: add create & edit & delete in vendor credit. --- src/common/resourcesTypes.js | 2 +- src/config/sidebarMenu.js | 12 +- ...eteAlert.js => VendorCreditDeleteAlert.js} | 40 ++++- .../VendorCreditNoteFloatingActions.js | 67 ++++++-- .../CreditNoteForm/VendorCreditNoteForm.js | 66 ++++++-- .../VendorCreditNoteForm.schema.js | 7 +- .../VendorCreditNoteFormHeaderFields.js | 25 +-- .../VendorCreditNoteFormPage.js | 2 +- .../VendorCreditNoteFormProvider.js | 50 +++--- .../CreditNotes/CreditNoteForm/utils.js | 30 ++-- .../VendorsCreditNoteActionsBar.js | 46 +++++- .../VendorsCreditNoteDataTable.js | 40 +++-- .../VendorsCreditNoteEmptyStatus.js | 9 +- .../VendorsCreditNoteListProvider.js | 56 ++++++- .../VendorsCreditNoteViewTabs.js | 24 +-- .../CreditNotesLanding/components.js | 45 +++++- .../CreditNotes/VendorCreditNotesAlerts.js | 8 +- src/containers/Settings/withSettings.js | 4 +- src/hooks/query/index.js | 1 + src/hooks/query/types.js | 12 ++ src/hooks/query/vendorCredit.js | 149 ++++++++++++++++++ src/lang/en/index.json | 15 +- src/routes/dashboard.js | 26 +-- src/store/settings/settings.reducer.js | 6 + 24 files changed, 584 insertions(+), 158 deletions(-) rename src/containers/Alerts/VendorCeditNotes/{VendorCreditNoteDeleteAlert.js => VendorCreditDeleteAlert.js} (55%) create mode 100644 src/hooks/query/vendorCredit.js diff --git a/src/common/resourcesTypes.js b/src/common/resourcesTypes.js index e6de2706d..91e981aa8 100644 --- a/src/common/resourcesTypes.js +++ b/src/common/resourcesTypes.js @@ -12,5 +12,5 @@ export const RESOURCES_TYPES = { MANUAL_JOURNAL: 'manual_journal', ACCOUNT: 'account', CREDIT_NOTE: 'credit_note', - VENDOR_CREDIT_NOTE:'vendor_credit_note' + VENDOR_CREDIT:'vendor_credit' }; diff --git a/src/config/sidebarMenu.js b/src/config/sidebarMenu.js index 928d37eb0..5e1ca1b60 100644 --- a/src/config/sidebarMenu.js +++ b/src/config/sidebarMenu.js @@ -259,8 +259,8 @@ export default [ }, }, { - text: , - href: '/vendors-credit-notes', + text: , + href: '/vendor-credits', }, { text: , @@ -306,6 +306,14 @@ export default [ ability: BillAction.Create, }, }, + { + text: , + href: '/vendor-credits/new', + permission: { + subject: AbilitySubject.Bill, + ability: BillAction.Create, + }, + }, { text: , href: '/payment-mades/new', diff --git a/src/containers/Alerts/VendorCeditNotes/VendorCreditNoteDeleteAlert.js b/src/containers/Alerts/VendorCeditNotes/VendorCreditDeleteAlert.js similarity index 55% rename from src/containers/Alerts/VendorCeditNotes/VendorCreditNoteDeleteAlert.js rename to src/containers/Alerts/VendorCeditNotes/VendorCreditDeleteAlert.js index 25e935099..1067d486e 100644 --- a/src/containers/Alerts/VendorCeditNotes/VendorCreditNoteDeleteAlert.js +++ b/src/containers/Alerts/VendorCeditNotes/VendorCreditDeleteAlert.js @@ -8,17 +8,18 @@ import withAlertStoreConnect from 'containers/Alert/withAlertStoreConnect'; import withAlertActions from 'containers/Alert/withAlertActions'; import withDrawerActions from 'containers/Drawer/withDrawerActions'; +import { useDeleteVendorCredit } from 'hooks/query'; import { compose } from 'utils'; /** - * Vendor Credit note delete alert. + * Vendor Credit delete alert. */ -function VendorCreditNoteDeleteAlert({ +function VendorCreditDeleteAlert({ name, // #withAlertStoreConnect isOpen, - payload: { vendorCrditNoteId }, + payload: { vendorCreditId }, // #withAlertActions closeAlert, @@ -26,11 +27,32 @@ function VendorCreditNoteDeleteAlert({ // #withDrawerActions closeDrawer, }) { + const { isLoading, mutateAsync: deleteVendorCreditMutate } = + useDeleteVendorCredit(); + // handle cancel delete credit note alert. const handleCancelDeleteAlert = () => { closeAlert(name); }; - const handleConfirmCreditNoteDelete = () => {}; + const handleConfirmCreditDelete = () => { + deleteVendorCreditMutate(vendorCreditId) + .then(() => { + AppToaster.show({ + message: intl.get('vendor_credits.alert.success_message'), + intent: Intent.SUCCESS, + }); + }) + .catch( + ({ + response: { + data: { errors }, + }, + }) => {}, + ) + .finally(() => { + closeAlert(name); + }); + }; return (

- +

); @@ -54,4 +78,4 @@ export default compose( withAlertStoreConnect(), withAlertActions, withDrawerActions, -)(VendorCreditNoteDeleteAlert); +)(VendorCreditDeleteAlert); diff --git a/src/containers/Purchases/CreditNotes/CreditNoteForm/VendorCreditNoteFloatingActions.js b/src/containers/Purchases/CreditNotes/CreditNoteForm/VendorCreditNoteFloatingActions.js index a8f0121f4..3affd700e 100644 --- a/src/containers/Purchases/CreditNotes/CreditNoteForm/VendorCreditNoteFloatingActions.js +++ b/src/containers/Purchases/CreditNotes/CreditNoteForm/VendorCreditNoteFloatingActions.js @@ -26,32 +26,74 @@ export default function VendorCreditNoteFloatingActions() { const { resetForm, submitForm, isSubmitting } = useFormikContext(); // Credit note form context. - const { setSubmitPayload } = useVendorCreditNoteFormContext(); + const { setSubmitPayload, isNewMode } = useVendorCreditNoteFormContext(); + + // Handle submit, save and anothe new button click. + const handleSubmitAndNewBtnClick = (event) => { + setSubmitPayload({ redirect: false, status: true, resetForm: true }); + submitForm(); + }; + + // Handle submit as save & continue editing button click. + const handleSubmitSaveContinueEditingBtnClick = (event) => { + setSubmitPayload({ redirect: false, status: true }); + submitForm(); + }; + + // Handle submit as draft button click. + const handleSubmitDraftBtnClick = (event) => { + setSubmitPayload({ redirect: true, status: false }); + submitForm(); + }; + + // handle submit as draft & new button click. + const handleSubmitDraftAndNewBtnClick = (event) => { + setSubmitPayload({ redirect: false, status: false, resetForm: true }); + submitForm(); + }; + + // Handle submit as draft & continue editing button click. + const handleSubmitDraftContinueEditingBtnClick = (event) => { + setSubmitPayload({ redirect: false, status: false }); + submitForm(); + }; // Handle cancel button click. const handleCancelBtnClick = (event) => { history.goBack(); }; + // Handle submit button click. + const handleSubmitBtnClick = (event) => { + setSubmitPayload({ redirect: true }); + }; + const handleClearBtnClick = (event) => { resetForm(); }; return (
- {/* ----------- Save And Open ----------- */} + {/* ----------- Save ----------- */}
); } diff --git a/src/containers/Purchases/CreditNotes/CreditNoteForm/VendorCreditNoteFormPage.js b/src/containers/Purchases/CreditNotes/CreditNoteForm/VendorCreditNoteFormPage.js index 62c966293..31a4c3e3e 100644 --- a/src/containers/Purchases/CreditNotes/CreditNoteForm/VendorCreditNoteFormPage.js +++ b/src/containers/Purchases/CreditNotes/CreditNoteForm/VendorCreditNoteFormPage.js @@ -14,7 +14,7 @@ export default function VendorCreditNoteFormPage() { const idAsInteger = parseInt(id, 10); return ( - + ); diff --git a/src/containers/Purchases/CreditNotes/CreditNoteForm/VendorCreditNoteFormProvider.js b/src/containers/Purchases/CreditNotes/CreditNoteForm/VendorCreditNoteFormProvider.js index 0cb45a195..b3e74703b 100644 --- a/src/containers/Purchases/CreditNotes/CreditNoteForm/VendorCreditNoteFormProvider.js +++ b/src/containers/Purchases/CreditNotes/CreditNoteForm/VendorCreditNoteFormProvider.js @@ -1,25 +1,20 @@ import React from 'react'; -import { useLocation } from 'react-router-dom'; -import { isEmpty, pick } from 'lodash'; import DashboardInsider from 'components/Dashboard/DashboardInsider'; -import { transformToEditForm } from './utils'; -import { useBill, useItems, useVendors } from 'hooks/query'; +import { + useCreateVendorCredit, + useEditVendorCredit, + useVendorCredit, + useItems, + useVendors, +} from 'hooks/query'; const VendorCreditNoteFormContext = React.createContext(); /** * Vendor Credit note data provider. */ -function VendorCreditNoteFormProvider({ creditNoteId, ...props }) { - const { state } = useLocation(); - const billId = state?.action; - - // Fetches the bill by the given id. - const { data: bill, isLoading: isBillLoading } = useBill(billId, { - enabled: !!billId, - }); - +function VendorCreditNoteFormProvider({ vendorCreditId, ...props }) { // Handle fetching the items table based on the given query. const { data: { items }, @@ -34,28 +29,41 @@ function VendorCreditNoteFormProvider({ creditNoteId, ...props }) { isLoading: isVendorsLoading, } = useVendors({ page_size: 10000 }); + // Handle fetch vendor credit details. + const { data: vendorCredit, isLoading: isVendorCreditLoading } = + useVendorCredit(vendorCreditId, { + enabled: !!vendorCreditId, + }); + // Form submit payload. const [submitPayload, setSubmitPayload] = React.useState(); + // Create and edit vendor credit mutations. + const { mutateAsync: createVendorCreditMutate } = useCreateVendorCredit(); + const { mutateAsync: editVendorCreditMutate } = useEditVendorCredit(); + // Determines whether the form in new mode. - const isNewMode = !creditNoteId; + const isNewMode = !vendorCreditId; // Provider payload. const provider = { - bill, items, vendors, - billId, + vendorCredit, submitPayload, - - setSubmitPayload, isNewMode, + + isVendorCreditLoading, + + createVendorCreditMutate, + editVendorCreditMutate, + setSubmitPayload, }; return ( @@ -65,4 +73,4 @@ function VendorCreditNoteFormProvider({ creditNoteId, ...props }) { const useVendorCreditNoteFormContext = () => React.useContext(VendorCreditNoteFormContext); -export { VendorCreditNoteFormProvider , useVendorCreditNoteFormContext }; +export { VendorCreditNoteFormProvider, useVendorCreditNoteFormContext }; diff --git a/src/containers/Purchases/CreditNotes/CreditNoteForm/utils.js b/src/containers/Purchases/CreditNotes/CreditNoteForm/utils.js index c5d611c0b..114dc1580 100644 --- a/src/containers/Purchases/CreditNotes/CreditNoteForm/utils.js +++ b/src/containers/Purchases/CreditNotes/CreditNoteForm/utils.js @@ -1,9 +1,7 @@ import React from 'react'; import * as R from 'ramda'; import moment from 'moment'; -import intl from 'react-intl-universal'; -import { Intent } from '@blueprintjs/core'; -import { AppToaster } from 'components'; + import { defaultFastFieldShouldUpdate, transformToForm, @@ -14,7 +12,6 @@ import { updateItemsEntriesTotal, ensureEntriesHaveEmptyLine, } from 'containers/Entries/utils'; -import { isLandedCostDisabled } from '../../../Entries/utils'; export const MIN_LINES_NUMBER = 4; @@ -32,11 +29,10 @@ export const defaultCreditNoteEntry = { // Default Vendors Credit Note. export const defaultVendorsCreditNote = { vendor_id: '', - bill_number: '', - bill_date: moment(new Date()).format('YYYY-MM-DD'), - reference_no: '', + vendor_credit_number: '', + vendor_credit_date: moment(new Date()).format('YYYY-MM-DD'), + // reference_no: '', note: '', - open: '', entries: [...repeatValue(defaultCreditNoteEntry, MIN_LINES_NUMBER)], }; @@ -64,16 +60,18 @@ export const transformToEditForm = (creditNote) => { }; }; - /** * Transformes credit note entries to submit request. */ - export const transformEntriesToSubmit = (entries) => { +export const transformEntriesToSubmit = (entries) => { const transformCreditNoteEntry = R.compose( R.omit(['amount']), R.curry(transformToForm)(R.__, defaultCreditNoteEntry), ); - return R.compose(orderingLinesIndexes, R.map(transformCreditNoteEntry))(entries); + return R.compose( + orderingLinesIndexes, + R.map(transformCreditNoteEntry), + )(entries); }; /** @@ -86,21 +84,19 @@ export const filterNonZeroEntries = (entries) => { /** * Transformes form values to request body. */ - export const transformFormValuesToRequest = (values) => { +export const transformFormValuesToRequest = (values) => { const entries = filterNonZeroEntries(values.entries); return { ...values, entries: transformEntriesToSubmit(entries), - open: false, }; }; - /** * Detarmines vendors fast field should update */ - export const vendorsFieldShouldUpdate = (newProps, oldProps) => { +export const vendorsFieldShouldUpdate = (newProps, oldProps) => { return ( newProps.vendors !== oldProps.vendors || defaultFastFieldShouldUpdate(newProps, oldProps) @@ -110,9 +106,9 @@ export const filterNonZeroEntries = (entries) => { /** * Detarmines entries fast field should update. */ - export const entriesFieldShouldUpdate = (newProps, oldProps) => { +export const entriesFieldShouldUpdate = (newProps, oldProps) => { return ( newProps.items !== oldProps.items || defaultFastFieldShouldUpdate(newProps, oldProps) ); -}; \ No newline at end of file +}; diff --git a/src/containers/Purchases/CreditNotes/CreditNotesLanding/VendorsCreditNoteActionsBar.js b/src/containers/Purchases/CreditNotes/CreditNotesLanding/VendorsCreditNoteActionsBar.js index 12a79c20f..e52077150 100644 --- a/src/containers/Purchases/CreditNotes/CreditNotesLanding/VendorsCreditNoteActionsBar.js +++ b/src/containers/Purchases/CreditNotes/CreditNotesLanding/VendorsCreditNoteActionsBar.js @@ -18,6 +18,8 @@ import { } from 'components'; import DashboardActionsBar from '../../../../components/Dashboard/DashboardActionsBar'; +import { useVendorsCreditNoteListContext } from './VendorsCreditNoteListProvider'; + import withVendorsCreditNotes from './withVendorsCreditNotes'; import withVendorsCreditNotesActions from './withVendorsCreditNotesActions'; import withSettings from '../../../Settings/withSettings'; @@ -30,6 +32,7 @@ import { compose } from 'utils'; */ function VendorsCreditNoteActionsBar({ // #withVendorsCreditNotes + vendorCreditFilterRoles, // #withVendorsCreditNotesActions setVendorsCreditNoteTableState, @@ -42,9 +45,14 @@ function VendorsCreditNoteActionsBar({ }) { const history = useHistory(); - // credit note list context. + // vendor credit list context. + const { VendorCreditsViews, fields, refresh } = + useVendorsCreditNoteListContext(); - // credit note refresh action. + // Handle click a new Vendor. + const handleClickNewVendorCredit = () => { + history.push('/vendor-credits/new'); + }; // Handle view tab change. const handleTabChange = (view) => { @@ -52,11 +60,13 @@ function VendorsCreditNoteActionsBar({ }; // Handle click a refresh credit note. - const handleRefreshBtnClick = () => {}; + const handleRefreshBtnClick = () => { + refresh(); + }; // Handle table row size change. const handleTableRowSizeChange = (size) => { - addSetting('vendorsCreditNote', 'tableSize', size); + addSetting('vendorCredits', 'tableSize', size); }; return ( @@ -64,11 +74,33 @@ function VendorsCreditNoteActionsBar({ } onChange={handleTabChange} /> +