diff --git a/changelogs/unreleased/86726.json b/changelogs/unreleased/86726.json new file mode 100644 index 0000000000..2a5690c919 --- /dev/null +++ b/changelogs/unreleased/86726.json @@ -0,0 +1,5 @@ +{ + "title": "Expense: add cancel and return to draft status actions", + "type": "feat", + "packages": "hr" +} diff --git a/packages/apps/hr/src/api/expense-api.js b/packages/apps/hr/src/api/expense-api.js index 25040080bf..1b50da3530 100644 --- a/packages/apps/hr/src/api/expense-api.js +++ b/packages/apps/hr/src/api/expense-api.js @@ -17,10 +17,10 @@ */ import { - createStandardSearch, - getSearchCriterias, createStandardFetch, + createStandardSearch, getActionApi, + getSearchCriterias, getTypes, } from '@axelor/aos-mobile-core'; @@ -202,3 +202,25 @@ export async function deleteExpense({expenseId}) { }, }); } + +export async function cancelExpense({expenseId, version}) { + return getActionApi().send({ + url: `ws/aos/expense/cancel/${expenseId}`, + method: 'put', + body: { + version, + }, + description: 'cancel expense', + }); +} + +export async function returnToDraftStatusExpense({expenseId, version}) { + return getActionApi().send({ + url: `ws/aos/expense/draft/${expenseId}`, + method: 'put', + body: { + version, + }, + description: 'return expense to draft status', + }); +} diff --git a/packages/apps/hr/src/api/index.ts b/packages/apps/hr/src/api/index.ts index 18344c3f74..f60833f5af 100644 --- a/packages/apps/hr/src/api/index.ts +++ b/packages/apps/hr/src/api/index.ts @@ -20,11 +20,13 @@ export {searchCurrencies as searchCurrenciesApi} from './currency-api'; export {getDistance as getDistanceApi} from './distance-api'; export {searchManagedEmployee as searchManagedEmployeeApi} from './employee-api'; export { + cancelExpense as cancelExpenseApi, createExpense as createExpenseApi, deleteExpense as deleteExpenseApi, getExpense, quickCreateExpense as quickCreateExpenseApi, refuseExpense as refuseExpenseApi, + returnToDraftStatusExpense as returnToDraftStatusExpenseApi, searchExpenseDraft as searchExpenseDraftApi, searchExpenseToValidate as searchExpenseToValidateApi, searchMyExpense as searchMyExpenseApi, diff --git a/packages/apps/hr/src/components/molecules/ExpenseDetailsValidationButton/ExpenseDetailsValidationButton.js b/packages/apps/hr/src/components/molecules/ExpenseDetailsValidationButton/ExpenseDetailsValidationButton.tsx similarity index 52% rename from packages/apps/hr/src/components/molecules/ExpenseDetailsValidationButton/ExpenseDetailsValidationButton.js rename to packages/apps/hr/src/components/molecules/ExpenseDetailsValidationButton/ExpenseDetailsValidationButton.tsx index 221708b018..0ce9f684d1 100644 --- a/packages/apps/hr/src/components/molecules/ExpenseDetailsValidationButton/ExpenseDetailsValidationButton.js +++ b/packages/apps/hr/src/components/molecules/ExpenseDetailsValidationButton/ExpenseDetailsValidationButton.tsx @@ -28,13 +28,25 @@ import { } from '@axelor/aos-mobile-core'; import {Button, useThemeColor} from '@axelor/aos-mobile-ui'; import { + cancelExpense, deleteExpense, + returnToDraftStatusExpense, sendExpense, validateExpense, } from '../../../features/expenseSlice'; import {ExpenseRefusalPopup} from '../../templates'; -const ExpenseDetailsValidationButton = ({expense, mode, isManualCreation}) => { +interface ExpenseDetailsValidationButtonProps { + expense: any; + mode: string; + isManualCreation?: boolean; +} + +const ExpenseDetailsValidationButton = ({ + expense, + mode, + isManualCreation = false, +}: ExpenseDetailsValidationButtonProps) => { const navigation = useNavigation(); const Colors = useThemeColor(); const I18n = useTranslator(); @@ -50,7 +62,7 @@ const ExpenseDetailsValidationButton = ({expense, mode, isManualCreation}) => { const sendExpenseAPI = useCallback(() => { dispatch( - sendExpense({ + (sendExpense as any)({ expenseId: expense.id, version: expense.version, onExpense: true, @@ -60,7 +72,7 @@ const ExpenseDetailsValidationButton = ({expense, mode, isManualCreation}) => { const validateExpenseAPI = useCallback(() => { dispatch( - validateExpense({ + (validateExpense as any)({ expenseId: expense.id, version: expense.version, onExpense: true, @@ -70,10 +82,43 @@ const ExpenseDetailsValidationButton = ({expense, mode, isManualCreation}) => { }, [dispatch, mode, expense]); const deleteExpenseAPI = useCallback(() => { - dispatch(deleteExpense({expenseId: expense.id, userId: user.id})); + dispatch((deleteExpense as any)({expenseId: expense.id, userId: user.id})); navigation.pop(); }, [dispatch, expense.id, navigation, user.id]); + const cancelExpenseAPI = useCallback(() => { + dispatch( + (cancelExpense as any)({ + expenseId: expense.id, + version: expense.version, + mode, + user, + }), + ); + }, [dispatch, expense, mode, user]); + + const returnToDraftStatusExpenseAPI = useCallback(() => { + dispatch( + (returnToDraftStatusExpense as any)({ + expenseId: expense.id, + version: expense.version, + user, + }), + ); + }, [dispatch, expense, user]); + + const renderCancelButton = width => { + return ( +