From 227ce21c52e618955e1a670609df3ffcaeb4350f Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Mon, 24 Jun 2024 03:38:06 +0300 Subject: [PATCH 01/45] add manually reimbursed func --- src/libs/ReportUtils.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 0a18b10b126f..226c24cdc7e9 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -774,6 +774,13 @@ function isReportApproved(reportOrID: OnyxInputOrEntry | string | EmptyO return report?.stateNum === CONST.REPORT.STATE_NUM.APPROVED && report?.statusNum === CONST.REPORT.STATUS_NUM.APPROVED; } +/** + * Checks if the supplied report has been manually reimbursed + */ +function isReportManuallyReimbursed(report: OnyxEntry): boolean { + return report?.stateNum === CONST.REPORT.STATE_NUM.APPROVED && report?.statusNum === CONST.REPORT.STATUS_NUM.REIMBURSED; +} + /** * Checks if the supplied report is an expense report in Open state and status. */ @@ -7224,6 +7231,7 @@ export { isPublicAnnounceRoom, isPublicRoom, isReportApproved, + isReportManuallyReimbursed, isReportDataReady, isReportFieldDisabled, isReportFieldOfTypeTitle, From 076dba0440ecb0de6eff1dc94508c91844a31200 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Mon, 24 Jun 2024 03:38:17 +0300 Subject: [PATCH 02/45] add canUnapproveRequest --- src/pages/ReportDetailsPage.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index f693c10c69f1..6ff94420f72f 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -191,6 +191,13 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD isActionOwner && (ReportUtils.canAddOrDeleteTransactions(moneyRequestReport) || ReportUtils.isTrackExpenseReport(transactionThreadReport)) && !isDeletedParentAction; const shouldShowDeleteButton = shouldShowTaskDeleteButton || canDeleteRequest; + const canUnapproveRequest = + ReportUtils.isMoneyRequestReport(moneyRequestReport) && + (ReportUtils.isReportManager(moneyRequestReport) || isPolicyAdmin) && + (ReportUtils.isReportApproved(moneyRequestReport) || ReportUtils.isReportManuallyReimbursed(moneyRequestReport)); + + console.log('[canUnapproveRequest]: ', canUnapproveRequest); + useEffect(() => { if (canDeleteRequest) { return; From 0a2f286baabe4b2ec7d1378458c1c8a53573ab52 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Mon, 24 Jun 2024 03:48:05 +0300 Subject: [PATCH 03/45] add menu item type --- src/CONST.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/CONST.ts b/src/CONST.ts index c485268b55e2..a25a1528ad20 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -2144,6 +2144,7 @@ const CONST = { PRIVATE_NOTES: 'privateNotes', DELETE: 'delete', MARK_AS_INCOMPLETE: 'markAsIncomplete', + UNAPPROVE: 'unapprove', }, EDIT_REQUEST_FIELD: { AMOUNT: 'amount', From 43564f45b76f0e4156708565a07bd5a35a162613 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Mon, 24 Jun 2024 03:48:15 +0300 Subject: [PATCH 04/45] add unapprove lang --- src/languages/en.ts | 1 + src/languages/es.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/src/languages/en.ts b/src/languages/en.ts index cced280d97df..69cba1d130ff 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -788,6 +788,7 @@ export default { removed: 'removed', transactionPending: 'Transaction pending.', chooseARate: ({unit}: ReimbursementRateParams) => `Select a workspace reimbursement rate per ${unit}`, + unapprove: 'Unapprove', }, notificationPreferencesPage: { header: 'Notification preferences', diff --git a/src/languages/es.ts b/src/languages/es.ts index 2471450ad8d0..12709efdc362 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -784,6 +784,7 @@ export default { removed: 'eliminó', transactionPending: 'Transacción pendiente.', chooseARate: ({unit}: ReimbursementRateParams) => `Seleccione una tasa de reembolso del espacio de trabajo por ${unit}`, + unapprove: 'Desaprobar', }, notificationPreferencesPage: { header: 'Preferencias de avisos', From f212e2d81abe873034b3371a51bd83ef41b1609b Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Mon, 24 Jun 2024 03:48:27 +0300 Subject: [PATCH 05/45] show menu item for unapprove --- src/pages/ReportDetailsPage.tsx | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index 6ff94420f72f..a372cb8a8a80 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -196,8 +196,6 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD (ReportUtils.isReportManager(moneyRequestReport) || isPolicyAdmin) && (ReportUtils.isReportApproved(moneyRequestReport) || ReportUtils.isReportManuallyReimbursed(moneyRequestReport)); - console.log('[canUnapproveRequest]: ', canUnapproveRequest); - useEffect(() => { if (canDeleteRequest) { return; @@ -355,6 +353,16 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD }, }); } + + if (canUnapproveRequest) { + items.push({ + key: CONST.REPORT_DETAILS_MENU_ITEM.UNAPPROVE, + icon: Expensicons.Exit, + translationKey: 'iou.unapprove', + isAnonymousAction: false, + action: () => {}, + }); + } return items; }, [ isSelfDM, @@ -379,6 +387,7 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD isPolicyAdmin, session, leaveChat, + canUnapproveRequest, ]); const displayNamesWithTooltips = useMemo(() => { From e8c0adba230a9e08660f52df1c88d5cfb97c851b Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Mon, 24 Jun 2024 04:01:18 +0300 Subject: [PATCH 06/45] add func to unapprove request --- src/pages/ReportDetailsPage.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index a372cb8a8a80..8743d552682b 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -222,6 +222,10 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD Report.leaveGroupChat(report.reportID); }, [isChatRoom, isPolicyEmployee, isPolicyExpenseChat, report.reportID, report.visibility]); + const unapproveExpenseReportOrShowModal = () => { + // TODO: show modal if report is exported to accounting + }; + const shouldShowLeaveButton = !isThread && (isGroupChat || (isChatRoom && ReportUtils.canLeaveChat(report, policy)) || (isPolicyExpenseChat && !isPolicyAdmin)); const reportName = ReportUtils.isDeprecatedGroupDM(report) || isGroupChat ? ReportUtils.getGroupChatName(undefined, false, report) : ReportUtils.getReportName(report); @@ -360,7 +364,7 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD icon: Expensicons.Exit, translationKey: 'iou.unapprove', isAnonymousAction: false, - action: () => {}, + action: () => unapproveExpenseReportOrShowModal(), }); } return items; From c17d87667c6b8e8120f528e49fdfd10389955a43 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Mon, 24 Jun 2024 04:13:14 +0300 Subject: [PATCH 07/45] fix onyx type for unapprove --- src/types/onyx/OriginalMessage.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/types/onyx/OriginalMessage.ts b/src/types/onyx/OriginalMessage.ts index c700dca53f34..a986f3815ad1 100644 --- a/src/types/onyx/OriginalMessage.ts +++ b/src/types/onyx/OriginalMessage.ts @@ -399,6 +399,18 @@ type OriginalMessageApproved = { expenseReportID: string; }; +/** Model of `unapproved` report action */ +type OriginalMessageUnapproved = { + /** Unapproved expense amount */ + amount: number; + + /** Currency of the unapproved expense amount */ + currency: string; + + /** Report ID of the expense */ + expenseReportID: string; +}; + /** The map type of original message */ type OriginalMessageMap = { /** */ @@ -504,7 +516,7 @@ type OriginalMessageMap = { /** */ [CONST.REPORT.ACTIONS.TYPE.TAKE_CONTROL]: never; /** */ - [CONST.REPORT.ACTIONS.TYPE.UNAPPROVED]: never; + [CONST.REPORT.ACTIONS.TYPE.UNAPPROVED]: OriginalMessageUnapproved; /** */ [CONST.REPORT.ACTIONS.TYPE.UNHOLD]: never; /** */ From 17541872722b3a68eafa008089564176191df51f Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Mon, 24 Jun 2024 04:14:01 +0300 Subject: [PATCH 08/45] rm unapprove as olddot action --- src/CONST.ts | 2 +- src/libs/ReportActionsUtils.ts | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/CONST.ts b/src/CONST.ts index a25a1528ad20..eeeb1605d0a7 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -711,7 +711,7 @@ const CONST = { TASK_EDITED: 'TASKEDITED', TASK_REOPENED: 'TASKREOPENED', TRIPPREVIEW: 'TRIPPREVIEW', - UNAPPROVED: 'UNAPPROVED', // OldDot Action + UNAPPROVED: 'UNAPPROVED', UNHOLD: 'UNHOLD', UNSHARE: 'UNSHARE', // OldDot Action UPDATE_GROUP_CHAT_MEMBER_ROLE: 'UPDATEGROUPCHATMEMBERROLE', diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts index 16032d41b949..072de0fbe023 100644 --- a/src/libs/ReportActionsUtils.ts +++ b/src/libs/ReportActionsUtils.ts @@ -1187,7 +1187,6 @@ function isOldDotReportAction(action: ReportAction): boolean { CONST.REPORT.ACTIONS.TYPE.SHARE, CONST.REPORT.ACTIONS.TYPE.STRIPE_PAID, CONST.REPORT.ACTIONS.TYPE.TAKE_CONTROL, - CONST.REPORT.ACTIONS.TYPE.UNAPPROVED, CONST.REPORT.ACTIONS.TYPE.UNSHARE, ].some((oldDotActionName) => oldDotActionName === action.actionName); } From 6274247db4e8516f7f6864c42059be2244cc9b26 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Mon, 24 Jun 2024 05:29:15 +0300 Subject: [PATCH 09/45] add backwards icon --- assets/images/backwards.svg | 3 +++ src/components/Icon/Expensicons.ts | 2 ++ 2 files changed, 5 insertions(+) create mode 100644 assets/images/backwards.svg diff --git a/assets/images/backwards.svg b/assets/images/backwards.svg new file mode 100644 index 000000000000..aebaed88b727 --- /dev/null +++ b/assets/images/backwards.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/components/Icon/Expensicons.ts b/src/components/Icon/Expensicons.ts index c3e50cff3178..71d583467011 100644 --- a/src/components/Icon/Expensicons.ts +++ b/src/components/Icon/Expensicons.ts @@ -18,6 +18,7 @@ import FallbackWorkspaceAvatar from '@assets/images/avatars/fallback-workspace-a import NotificationsAvatar from '@assets/images/avatars/notifications-avatar.svg'; import ActiveRoomAvatar from '@assets/images/avatars/room.svg'; import BackArrow from '@assets/images/back-left.svg'; +import Backwards from '@assets/images/backwards.svg'; import Bank from '@assets/images/bank.svg'; import Bed from '@assets/images/bed.svg'; import Bell from '@assets/images/bell.svg'; @@ -199,6 +200,7 @@ export { Wrench, BackArrow, Bank, + Backwards, Bill, Bell, BellSlash, From b588e810e5a68e8abfc4389932b4ce60d82ac338 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Mon, 24 Jun 2024 05:29:48 +0300 Subject: [PATCH 10/45] use backwards icon --- src/pages/ReportDetailsPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index 8743d552682b..86f6bda22c35 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -361,7 +361,7 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD if (canUnapproveRequest) { items.push({ key: CONST.REPORT_DETAILS_MENU_ITEM.UNAPPROVE, - icon: Expensicons.Exit, + icon: Expensicons.Backwards, translationKey: 'iou.unapprove', isAnonymousAction: false, action: () => unapproveExpenseReportOrShowModal(), From a1cdab6ae2c178594bc63314a1007c5057618620 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Mon, 24 Jun 2024 05:32:17 +0300 Subject: [PATCH 11/45] add optimistic unapproved action --- src/libs/ReportUtils.ts | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 226c24cdc7e9..55e49589b562 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -187,6 +187,11 @@ type OptimisticApprovedReportAction = Pick< 'actionName' | 'actorAccountID' | 'automatic' | 'avatar' | 'isAttachment' | 'originalMessage' | 'message' | 'person' | 'reportActionID' | 'shouldShow' | 'created' | 'pendingAction' >; +type OptimisticUnapprovedReportAction = Pick< + ReportAction, + 'actionName' | 'actorAccountID' | 'automatic' | 'avatar' | 'isAttachment' | 'originalMessage' | 'message' | 'person' | 'reportActionID' | 'shouldShow' | 'created' | 'pendingAction' +>; + type OptimisticSubmittedReportAction = Pick< ReportAction, | 'actionName' @@ -4056,6 +4061,9 @@ function getIOUReportActionMessage(iouReportID: string, type: string, total: num case CONST.REPORT.ACTIONS.TYPE.APPROVED: iouMessage = `approved ${amount}`; break; + case CONST.REPORT.ACTIONS.TYPE.UNAPPROVED: + iouMessage = `unapproved ${amount}`; + break; case CONST.IOU.REPORT_ACTION_TYPE.CREATE: iouMessage = `submitted ${amount}${comment && ` for ${comment}`}`; break; @@ -4215,6 +4223,38 @@ function buildOptimisticApprovedReportAction(amount: number, currency: string, e }; } +/** + * Builds an optimistic APPROVED report action with a randomly generated reportActionID. + */ +function buildOptimisticUnapprovedReportAction(amount: number, currency: string, expenseReportID: string): OptimisticUnapprovedReportAction { + const originalMessage = { + amount, + currency, + expenseReportID, + }; + + return { + actionName: CONST.REPORT.ACTIONS.TYPE.UNAPPROVED, + actorAccountID: currentUserAccountID, + automatic: false, + avatar: getCurrentUserAvatar(), + isAttachment: false, + originalMessage, + message: getIOUReportActionMessage(expenseReportID, CONST.REPORT.ACTIONS.TYPE.UNAPPROVED, Math.abs(amount), '', currency), + person: [ + { + style: 'strong', + text: getCurrentUserDisplayNameOrEmail(), + type: 'TEXT', + }, + ], + reportActionID: NumberUtils.rand64(), + shouldShow: true, + created: DateUtils.getDBTime(), + pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, + }; +} + /** * Builds an optimistic MOVED report action with a randomly generated reportActionID. * This action is used when we move reports across workspaces. @@ -7020,6 +7060,7 @@ export { areAllRequestsBeingSmartScanned, buildOptimisticAddCommentReportAction, buildOptimisticApprovedReportAction, + buildOptimisticUnapprovedReportAction, buildOptimisticCancelPaymentReportAction, buildOptimisticChangedTaskAssigneeReportAction, buildOptimisticChatReport, From 15312484939839930ee995cc6260637cbdb3df02 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Mon, 24 Jun 2024 05:50:07 +0300 Subject: [PATCH 12/45] add unapprove api type --- src/libs/API/types.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts index 92b6d7679418..5c8700f7578a 100644 --- a/src/libs/API/types.ts +++ b/src/libs/API/types.ts @@ -170,6 +170,7 @@ const WRITE_COMMANDS = { SEND_MONEY_ELSEWHERE: 'SendMoneyElsewhere', SEND_MONEY_WITH_WALLET: 'SendMoneyWithWallet', APPROVE_MONEY_REQUEST: 'ApproveMoneyRequest', + UNAPPROVE_MONEY_REQUEST: 'UnapproveExpenseReport', EDIT_MONEY_REQUEST: 'EditMoneyRequest', REPLACE_RECEIPT: 'ReplaceReceipt', SUBMIT_REPORT: 'SubmitReport', @@ -389,6 +390,7 @@ type WriteCommandParameters = { [WRITE_COMMANDS.SEND_MONEY_ELSEWHERE]: Parameters.SendMoneyParams; [WRITE_COMMANDS.SEND_MONEY_WITH_WALLET]: Parameters.SendMoneyParams; [WRITE_COMMANDS.APPROVE_MONEY_REQUEST]: Parameters.ApproveMoneyRequestParams; + [WRITE_COMMANDS.UNAPPROVE_MONEY_REQUEST]: EmptyObject; [WRITE_COMMANDS.EDIT_MONEY_REQUEST]: Parameters.EditMoneyRequestParams; [WRITE_COMMANDS.REPLACE_RECEIPT]: Parameters.ReplaceReceiptParams; [WRITE_COMMANDS.SUBMIT_REPORT]: Parameters.SubmitReportParams; From 3213e7e65529b6be1e01ef727524724a0b774491 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Mon, 24 Jun 2024 05:50:23 +0300 Subject: [PATCH 13/45] add unapprove api command call --- src/libs/actions/IOU.ts | 82 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index bf37d90e82d5..5f631d23789b 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -6339,6 +6339,87 @@ function approveMoneyRequest(expenseReport: OnyxTypes.Report | EmptyObject, full API.write(WRITE_COMMANDS.APPROVE_MONEY_REQUEST, parameters, {optimisticData, successData, failureData}); } +function unapproveMoneyRequest(expenseReport: OnyxTypes.Report | EmptyObject) { + const currentNextStep = allNextSteps[`${ONYXKEYS.COLLECTION.NEXT_STEP}${expenseReport.reportID}`] ?? null; + const total = expenseReport.total ?? 0; + + const optimisticUnapprovedReportAction = ReportUtils.buildOptimisticUnapprovedReportAction(total, expenseReport.currency ?? '', expenseReport.reportID); + const optimisticNextStep = NextStepUtils.buildNextStep(expenseReport, CONST.REPORT.STATUS_NUM.SUBMITTED); + + const optimisticReportActionsData: OnyxUpdate = { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseReport.reportID}`, + value: { + [optimisticUnapprovedReportAction.reportActionID]: { + ...(optimisticUnapprovedReportAction as OnyxTypes.ReportAction), + pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, + }, + }, + }; + const optimisticIOUReportData: OnyxUpdate = { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${expenseReport.reportID}`, + value: { + ...expenseReport, + lastMessageText: ReportActionsUtils.getReportActionText(optimisticUnapprovedReportAction), + lastMessageHtml: ReportActionsUtils.getReportActionHtml(optimisticUnapprovedReportAction), + stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, + statusNum: CONST.REPORT.STATUS_NUM.SUBMITTED, + pendingFields: { + partial: full ? null : CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, + }, + }, + }; + + const optimisticNextStepData: OnyxUpdate = { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.NEXT_STEP}${expenseReport.reportID}`, + value: optimisticNextStep, + }; + + const optimisticData: OnyxUpdate[] = [optimisticIOUReportData, optimisticReportActionsData, optimisticNextStepData, optimisticChatReportData]; + + const successData: OnyxUpdate[] = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseReport.reportID}`, + value: { + [optimisticUnapprovedReportAction.reportActionID]: { + pendingAction: null, + }, + }, + }, + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${expenseReport.reportID}`, + value: { + pendingFields: { + partial: null, + }, + }, + }, + ]; + + const failureData: OnyxUpdate[] = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseReport.reportID}`, + value: { + [optimisticUnapprovedReportAction.reportActionID]: { + errors: ErrorUtils.getMicroSecondOnyxErrorWithTranslationKey('iou.error.other'), + }, + }, + }, + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.NEXT_STEP}${expenseReport.reportID}`, + value: currentNextStep, + }, + ]; + + API.write(WRITE_COMMANDS.UNAPPROVE_MONEY_REQUEST, {}, {optimisticData, successData, failureData}); +} + function submitReport(expenseReport: OnyxTypes.Report) { const currentNextStep = allNextSteps[`${ONYXKEYS.COLLECTION.NEXT_STEP}${expenseReport.reportID}`] ?? null; const parentReport = getReportOrDraftReport(expenseReport.parentReportID); @@ -6986,6 +7067,7 @@ function getIOURequestPolicyID(transaction: OnyxEntry, re export { approveMoneyRequest, + unapproveMoneyRequest, canApproveIOU, canIOUBePaid, cancelPayment, From 1b5532757de7d19820d239bc71b9d131c77f73dc Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Mon, 24 Jun 2024 05:53:15 +0300 Subject: [PATCH 14/45] call api on unapprove click --- src/pages/ReportDetailsPage.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index 86f6bda22c35..7b0041b9e822 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -224,6 +224,7 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD const unapproveExpenseReportOrShowModal = () => { // TODO: show modal if report is exported to accounting + IOU.unapproveMoneyRequest(moneyRequestReport ?? {}); }; const shouldShowLeaveButton = !isThread && (isGroupChat || (isChatRoom && ReportUtils.canLeaveChat(report, policy)) || (isPolicyExpenseChat && !isPolicyAdmin)); From bdbe266262f14b819934ee4b8bd2bbbe2b31e6e8 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Mon, 24 Jun 2024 06:28:45 +0300 Subject: [PATCH 15/45] add warning if connected to accounting --- src/languages/en.ts | 3 +++ src/pages/ReportDetailsPage.tsx | 20 ++++++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/languages/en.ts b/src/languages/en.ts index 69cba1d130ff..c03d9b323a11 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -789,6 +789,9 @@ export default { transactionPending: 'Transaction pending.', chooseARate: ({unit}: ReimbursementRateParams) => `Select a workspace reimbursement rate per ${unit}`, unapprove: 'Unapprove', + unapproveReport: 'Unapprove report', + unapproveWithIntegrationWarning: (accountingIntegration: string) => + `Heads up! This report has already been exported to ${accountingIntegration}. Changes to this report in Expensify may lead to data discrepancies and Expensify Card reconciliation issues. Are you sure you want to unapprove this report?`, }, notificationPreferencesPage: { header: 'Notification preferences', diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index 7b0041b9e822..bc7b8bce20c0 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -101,6 +101,7 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD const [isLastMemberLeavingGroupModalVisible, setIsLastMemberLeavingGroupModalVisible] = useState(false); const [isDeleteModalVisible, setIsDeleteModalVisible] = useState(false); + const [isUnapproveModalVisible, setIsUnapproveModalVisible] = useState(false); const policy = useMemo(() => policies?.[`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID ?? '-1'}`], [policies, report?.policyID]); const isPolicyAdmin = useMemo(() => PolicyUtils.isPolicyAdmin(policy), [policy]); const isPolicyEmployee = useMemo(() => PolicyUtils.isPolicyEmployee(report?.policyID ?? '-1', policies), [report?.policyID, policies]); @@ -222,10 +223,12 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD Report.leaveGroupChat(report.reportID); }, [isChatRoom, isPolicyEmployee, isPolicyExpenseChat, report.reportID, report.visibility]); - const unapproveExpenseReportOrShowModal = () => { + const unapproveExpenseReportOrShowModal = useCallback(() => { // TODO: show modal if report is exported to accounting + // setIsUnapproveModalVisible(true); + IOU.unapproveMoneyRequest(moneyRequestReport ?? {}); - }; + }, [moneyRequestReport]); const shouldShowLeaveButton = !isThread && (isGroupChat || (isChatRoom && ReportUtils.canLeaveChat(report, policy)) || (isPolicyExpenseChat && !isPolicyAdmin)); @@ -393,6 +396,7 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD session, leaveChat, canUnapproveRequest, + unapproveExpenseReportOrShowModal, ]); const displayNamesWithTooltips = useMemo(() => { @@ -663,6 +667,18 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD danger shouldEnableNewFocusManagement /> + { + setIsUnapproveModalVisible(false); + IOU.unapproveMoneyRequest(moneyRequestReport ?? {}); + }} + isVisible={isUnapproveModalVisible} + danger + cancelText={translate('common.cancel')} + onCancel={() => setIsUnapproveModalVisible(false)} + /> ); From 341244edc9cc0544a84262c0de89baf8d0794f3e Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Mon, 24 Jun 2024 06:29:03 +0300 Subject: [PATCH 16/45] add warning if connected to accounting --- src/pages/ReportDetailsPage.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index bc7b8bce20c0..73346c93e6cc 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -669,6 +669,7 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD /> { setIsUnapproveModalVisible(false); From d4a052b8ab7c86819f3117c39f58fed4462f39a5 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Mon, 24 Jun 2024 06:35:22 +0300 Subject: [PATCH 17/45] rm full --- src/libs/actions/IOU.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 5f631d23789b..3e3f6b57e848 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -6366,7 +6366,7 @@ function unapproveMoneyRequest(expenseReport: OnyxTypes.Report | EmptyObject) { stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, statusNum: CONST.REPORT.STATUS_NUM.SUBMITTED, pendingFields: { - partial: full ? null : CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, + partial: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, }, }, }; From 35ef33dd92d5a8abc13146ffbc0694b1978270a2 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Mon, 24 Jun 2024 06:36:54 +0300 Subject: [PATCH 18/45] add spanish --- src/languages/es.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/languages/es.ts b/src/languages/es.ts index 12709efdc362..a11cb1e70d1d 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -785,6 +785,9 @@ export default { transactionPending: 'Transacción pendiente.', chooseARate: ({unit}: ReimbursementRateParams) => `Seleccione una tasa de reembolso del espacio de trabajo por ${unit}`, unapprove: 'Desaprobar', + unapproveReport: 'Unapprove report', + unapproveWithIntegrationWarning: (accountingIntegration: string) => + `Heads up! This report has already been exported to ${accountingIntegration}. Changes to this report in Expensify may lead to data discrepancies and Expensify Card reconciliation issues. Are you sure you want to unapprove this report?`, }, notificationPreferencesPage: { header: 'Preferencias de avisos', From 36cc15f4c46718668797a086e57a10554ea08853 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Mon, 24 Jun 2024 06:38:56 +0300 Subject: [PATCH 19/45] rm optimisticChatReportData --- src/libs/actions/IOU.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 3e3f6b57e848..91606c95f790 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -6377,7 +6377,7 @@ function unapproveMoneyRequest(expenseReport: OnyxTypes.Report | EmptyObject) { value: optimisticNextStep, }; - const optimisticData: OnyxUpdate[] = [optimisticIOUReportData, optimisticReportActionsData, optimisticNextStepData, optimisticChatReportData]; + const optimisticData: OnyxUpdate[] = [optimisticIOUReportData, optimisticReportActionsData, optimisticNextStepData]; const successData: OnyxUpdate[] = [ { From cc8957849ee8d4b528263d12e0ef12436d1c7aa0 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Mon, 24 Jun 2024 06:46:40 +0300 Subject: [PATCH 20/45] add unapprove to muted actions --- src/pages/home/report/ReportActionItemFragment.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/home/report/ReportActionItemFragment.tsx b/src/pages/home/report/ReportActionItemFragment.tsx index 27227251b0b6..088ee9eb2b6e 100644 --- a/src/pages/home/report/ReportActionItemFragment.tsx +++ b/src/pages/home/report/ReportActionItemFragment.tsx @@ -69,6 +69,7 @@ const MUTED_ACTIONS = [ ...Object.values(CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG), CONST.REPORT.ACTIONS.TYPE.IOU, CONST.REPORT.ACTIONS.TYPE.APPROVED, + CONST.REPORT.ACTIONS.TYPE.UNAPPROVED, CONST.REPORT.ACTIONS.TYPE.MOVED, CONST.REPORT.ACTIONS.TYPE.ACTIONABLE_JOIN_REQUEST, ] as ReportActionName[]; From 72013c0d728ed7ddcbda966c65a818ea64b3309a Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Mon, 24 Jun 2024 07:30:05 +0300 Subject: [PATCH 21/45] add bold style to prompt --- src/languages/en.ts | 3 ++- src/languages/es.ts | 1 + src/pages/ReportDetailsPage.tsx | 17 +++++++++++++---- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/languages/en.ts b/src/languages/en.ts index c03d9b323a11..2b1211f4fb7e 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -790,8 +790,9 @@ export default { chooseARate: ({unit}: ReimbursementRateParams) => `Select a workspace reimbursement rate per ${unit}`, unapprove: 'Unapprove', unapproveReport: 'Unapprove report', + headsUp: 'Heads up!', unapproveWithIntegrationWarning: (accountingIntegration: string) => - `Heads up! This report has already been exported to ${accountingIntegration}. Changes to this report in Expensify may lead to data discrepancies and Expensify Card reconciliation issues. Are you sure you want to unapprove this report?`, + `This report has already been exported to ${accountingIntegration}. Changes to this report in Expensify may lead to data discrepancies and Expensify Card reconciliation issues. Are you sure you want to unapprove this report?`, }, notificationPreferencesPage: { header: 'Notification preferences', diff --git a/src/languages/es.ts b/src/languages/es.ts index a11cb1e70d1d..541ba4bbfbe6 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -786,6 +786,7 @@ export default { chooseARate: ({unit}: ReimbursementRateParams) => `Seleccione una tasa de reembolso del espacio de trabajo por ${unit}`, unapprove: 'Desaprobar', unapproveReport: 'Unapprove report', + headsUp: 'Heads up!', unapproveWithIntegrationWarning: (accountingIntegration: string) => `Heads up! This report has already been exported to ${accountingIntegration}. Changes to this report in Expensify may lead to data discrepancies and Expensify Card reconciliation issues. Are you sure you want to unapprove this report?`, }, diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index 73346c93e6cc..384eed2f9e69 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -20,6 +20,7 @@ import PromotedActionsBar, {PromotedActions} from '@components/PromotedActionsBa import RoomHeaderAvatars from '@components/RoomHeaderAvatars'; import ScreenWrapper from '@components/ScreenWrapper'; import ScrollView from '@components/ScrollView'; +import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import useThemeStyles from '@hooks/useThemeStyles'; @@ -416,6 +417,13 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD /> ) : null; + const unapproveWarningText = ( + + {/* TODO: Replace with the connected accounting integration name */} + {translate('iou.headsUp')} {translate('iou.unapproveWithIntegrationWarning', 'Xero')} + + ); + const renderedAvatar = useMemo(() => { if (isMoneyRequestReport || isInvoiceReport) { return ( @@ -669,16 +677,17 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD /> { setIsUnapproveModalVisible(false); + Navigation.dismissModal(); IOU.unapproveMoneyRequest(moneyRequestReport ?? {}); }} - isVisible={isUnapproveModalVisible} - danger cancelText={translate('common.cancel')} onCancel={() => setIsUnapproveModalVisible(false)} + prompt={unapproveWarningText} /> From 1478954f03be243875944b9be99c62ade865dd9f Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Wed, 26 Jun 2024 04:00:41 +0300 Subject: [PATCH 22/45] rename to circular arrow backwards --- assets/images/backwards.svg | 3 --- assets/images/circular-arrow-backwards.svg | 9 +++++++++ 2 files changed, 9 insertions(+), 3 deletions(-) delete mode 100644 assets/images/backwards.svg create mode 100644 assets/images/circular-arrow-backwards.svg diff --git a/assets/images/backwards.svg b/assets/images/backwards.svg deleted file mode 100644 index aebaed88b727..000000000000 --- a/assets/images/backwards.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/circular-arrow-backwards.svg b/assets/images/circular-arrow-backwards.svg new file mode 100644 index 000000000000..209c0aea5fa7 --- /dev/null +++ b/assets/images/circular-arrow-backwards.svg @@ -0,0 +1,9 @@ + + + + + From 5ce355144314aa41ee08a1b456691f356c449782 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Wed, 26 Jun 2024 04:01:47 +0300 Subject: [PATCH 23/45] rename to circular arrow backwards --- src/components/Icon/Expensicons.ts | 4 ++-- src/pages/ReportDetailsPage.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/Icon/Expensicons.ts b/src/components/Icon/Expensicons.ts index 71d583467011..c32dc695c446 100644 --- a/src/components/Icon/Expensicons.ts +++ b/src/components/Icon/Expensicons.ts @@ -18,7 +18,7 @@ import FallbackWorkspaceAvatar from '@assets/images/avatars/fallback-workspace-a import NotificationsAvatar from '@assets/images/avatars/notifications-avatar.svg'; import ActiveRoomAvatar from '@assets/images/avatars/room.svg'; import BackArrow from '@assets/images/back-left.svg'; -import Backwards from '@assets/images/backwards.svg'; +import CircularArrowBackwards from '@assets/images/circular-arrow-backwards.svg'; import Bank from '@assets/images/bank.svg'; import Bed from '@assets/images/bed.svg'; import Bell from '@assets/images/bell.svg'; @@ -200,7 +200,7 @@ export { Wrench, BackArrow, Bank, - Backwards, + CircularArrowBackwards, Bill, Bell, BellSlash, diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index 384eed2f9e69..c45d2cae93da 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -366,7 +366,7 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD if (canUnapproveRequest) { items.push({ key: CONST.REPORT_DETAILS_MENU_ITEM.UNAPPROVE, - icon: Expensicons.Backwards, + icon: Expensicons.CircularArrowBackwards, translationKey: 'iou.unapprove', isAnonymousAction: false, action: () => unapproveExpenseReportOrShowModal(), From f27f0dc30099c5d569c87dcf602c202dd5666425 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Wed, 26 Jun 2024 04:02:42 +0300 Subject: [PATCH 24/45] rename to expense report --- src/libs/actions/IOU.ts | 4 ++-- src/pages/ReportDetailsPage.tsx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 91606c95f790..020349fc2206 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -6339,7 +6339,7 @@ function approveMoneyRequest(expenseReport: OnyxTypes.Report | EmptyObject, full API.write(WRITE_COMMANDS.APPROVE_MONEY_REQUEST, parameters, {optimisticData, successData, failureData}); } -function unapproveMoneyRequest(expenseReport: OnyxTypes.Report | EmptyObject) { +function unapproveExpenseReport(expenseReport: OnyxTypes.Report | EmptyObject) { const currentNextStep = allNextSteps[`${ONYXKEYS.COLLECTION.NEXT_STEP}${expenseReport.reportID}`] ?? null; const total = expenseReport.total ?? 0; @@ -7067,7 +7067,7 @@ function getIOURequestPolicyID(transaction: OnyxEntry, re export { approveMoneyRequest, - unapproveMoneyRequest, + unapproveExpenseReport, canApproveIOU, canIOUBePaid, cancelPayment, diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index c45d2cae93da..634096c7ecb8 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -228,7 +228,7 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD // TODO: show modal if report is exported to accounting // setIsUnapproveModalVisible(true); - IOU.unapproveMoneyRequest(moneyRequestReport ?? {}); + IOU.unapproveExpenseReport(moneyRequestReport ?? {}); }, [moneyRequestReport]); const shouldShowLeaveButton = !isThread && (isGroupChat || (isChatRoom && ReportUtils.canLeaveChat(report, policy)) || (isPolicyExpenseChat && !isPolicyAdmin)); @@ -683,7 +683,7 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD onConfirm={() => { setIsUnapproveModalVisible(false); Navigation.dismissModal(); - IOU.unapproveMoneyRequest(moneyRequestReport ?? {}); + IOU.unapproveExpenseReport(moneyRequestReport ?? {}); }} cancelText={translate('common.cancel')} onCancel={() => setIsUnapproveModalVisible(false)} From 97c3220e1498310a839cc0dfb6650b3a2275bd33 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Wed, 26 Jun 2024 04:03:38 +0300 Subject: [PATCH 25/45] rm const --- src/libs/ReportUtils.ts | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 55e49589b562..c2e09c81d2c8 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -4195,19 +4195,17 @@ function buildOptimisticIOUReportAction( * Builds an optimistic APPROVED report action with a randomly generated reportActionID. */ function buildOptimisticApprovedReportAction(amount: number, currency: string, expenseReportID: string): OptimisticApprovedReportAction { - const originalMessage = { - amount, - currency, - expenseReportID, - }; - return { actionName: CONST.REPORT.ACTIONS.TYPE.APPROVED, actorAccountID: currentUserAccountID, automatic: false, avatar: getCurrentUserAvatar(), isAttachment: false, - originalMessage, + originalMessage: { + amount, + currency, + expenseReportID, + }, message: getIOUReportActionMessage(expenseReportID, CONST.REPORT.ACTIONS.TYPE.APPROVED, Math.abs(amount), '', currency), person: [ { From 05b5696ba920f3965c24190b902d0130e109b814 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Wed, 26 Jun 2024 04:04:57 +0300 Subject: [PATCH 26/45] rm const --- src/libs/ReportUtils.ts | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index c2e09c81d2c8..e15db5617828 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -4195,17 +4195,19 @@ function buildOptimisticIOUReportAction( * Builds an optimistic APPROVED report action with a randomly generated reportActionID. */ function buildOptimisticApprovedReportAction(amount: number, currency: string, expenseReportID: string): OptimisticApprovedReportAction { + const originalMessage = { + amount, + currency, + expenseReportID, + }; + return { actionName: CONST.REPORT.ACTIONS.TYPE.APPROVED, actorAccountID: currentUserAccountID, automatic: false, avatar: getCurrentUserAvatar(), isAttachment: false, - originalMessage: { - amount, - currency, - expenseReportID, - }, + originalMessage, message: getIOUReportActionMessage(expenseReportID, CONST.REPORT.ACTIONS.TYPE.APPROVED, Math.abs(amount), '', currency), person: [ { @@ -4225,19 +4227,17 @@ function buildOptimisticApprovedReportAction(amount: number, currency: string, e * Builds an optimistic APPROVED report action with a randomly generated reportActionID. */ function buildOptimisticUnapprovedReportAction(amount: number, currency: string, expenseReportID: string): OptimisticUnapprovedReportAction { - const originalMessage = { - amount, - currency, - expenseReportID, - }; - return { actionName: CONST.REPORT.ACTIONS.TYPE.UNAPPROVED, actorAccountID: currentUserAccountID, automatic: false, avatar: getCurrentUserAvatar(), isAttachment: false, - originalMessage, + originalMessage: { + amount, + currency, + expenseReportID, + }, message: getIOUReportActionMessage(expenseReportID, CONST.REPORT.ACTIONS.TYPE.UNAPPROVED, Math.abs(amount), '', currency), person: [ { From ead7a1c084e1fc48466d8377e0031397f3294f4a Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Wed, 26 Jun 2024 04:16:53 +0300 Subject: [PATCH 27/45] rm unused lang --- src/languages/en.ts | 1 - src/languages/es.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/src/languages/en.ts b/src/languages/en.ts index 2b1211f4fb7e..0824d001d21e 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -790,7 +790,6 @@ export default { chooseARate: ({unit}: ReimbursementRateParams) => `Select a workspace reimbursement rate per ${unit}`, unapprove: 'Unapprove', unapproveReport: 'Unapprove report', - headsUp: 'Heads up!', unapproveWithIntegrationWarning: (accountingIntegration: string) => `This report has already been exported to ${accountingIntegration}. Changes to this report in Expensify may lead to data discrepancies and Expensify Card reconciliation issues. Are you sure you want to unapprove this report?`, }, diff --git a/src/languages/es.ts b/src/languages/es.ts index 541ba4bbfbe6..a11cb1e70d1d 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -786,7 +786,6 @@ export default { chooseARate: ({unit}: ReimbursementRateParams) => `Seleccione una tasa de reembolso del espacio de trabajo por ${unit}`, unapprove: 'Desaprobar', unapproveReport: 'Unapprove report', - headsUp: 'Heads up!', unapproveWithIntegrationWarning: (accountingIntegration: string) => `Heads up! This report has already been exported to ${accountingIntegration}. Changes to this report in Expensify may lead to data discrepancies and Expensify Card reconciliation issues. Are you sure you want to unapprove this report?`, }, From cd6e8f1ea624daaa8327f2cf6bae40cadb7d1bd9 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Wed, 26 Jun 2024 04:17:27 +0300 Subject: [PATCH 28/45] revert: rm unused lang --- src/languages/en.ts | 1 + src/languages/es.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/src/languages/en.ts b/src/languages/en.ts index 0824d001d21e..2b1211f4fb7e 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -790,6 +790,7 @@ export default { chooseARate: ({unit}: ReimbursementRateParams) => `Select a workspace reimbursement rate per ${unit}`, unapprove: 'Unapprove', unapproveReport: 'Unapprove report', + headsUp: 'Heads up!', unapproveWithIntegrationWarning: (accountingIntegration: string) => `This report has already been exported to ${accountingIntegration}. Changes to this report in Expensify may lead to data discrepancies and Expensify Card reconciliation issues. Are you sure you want to unapprove this report?`, }, diff --git a/src/languages/es.ts b/src/languages/es.ts index a11cb1e70d1d..541ba4bbfbe6 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -786,6 +786,7 @@ export default { chooseARate: ({unit}: ReimbursementRateParams) => `Seleccione una tasa de reembolso del espacio de trabajo por ${unit}`, unapprove: 'Desaprobar', unapproveReport: 'Unapprove report', + headsUp: 'Heads up!', unapproveWithIntegrationWarning: (accountingIntegration: string) => `Heads up! This report has already been exported to ${accountingIntegration}. Changes to this report in Expensify may lead to data discrepancies and Expensify Card reconciliation issues. Are you sure you want to unapprove this report?`, }, From 1b6dc73a9726a518630a224c51212c1614ac43d5 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Wed, 26 Jun 2024 04:17:49 +0300 Subject: [PATCH 29/45] revert: rm unused lang --- src/languages/es.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/languages/es.ts b/src/languages/es.ts index 541ba4bbfbe6..5cb86c20bb0e 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -788,7 +788,7 @@ export default { unapproveReport: 'Unapprove report', headsUp: 'Heads up!', unapproveWithIntegrationWarning: (accountingIntegration: string) => - `Heads up! This report has already been exported to ${accountingIntegration}. Changes to this report in Expensify may lead to data discrepancies and Expensify Card reconciliation issues. Are you sure you want to unapprove this report?`, + `This report has already been exported to ${accountingIntegration}. Changes to this report in Expensify may lead to data discrepancies and Expensify Card reconciliation issues. Are you sure you want to unapprove this report?`, }, notificationPreferencesPage: { header: 'Preferencias de avisos', From 8ba06e06178fdd8bdbd78df375bb850898bdaa5a Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Wed, 26 Jun 2024 04:35:57 +0300 Subject: [PATCH 30/45] add param type for unapprove --- src/libs/API/parameters/UnapproveMoneyRequestParams.ts | 6 ++++++ src/libs/API/parameters/index.ts | 1 + 2 files changed, 7 insertions(+) create mode 100644 src/libs/API/parameters/UnapproveMoneyRequestParams.ts diff --git a/src/libs/API/parameters/UnapproveMoneyRequestParams.ts b/src/libs/API/parameters/UnapproveMoneyRequestParams.ts new file mode 100644 index 000000000000..8926dc143128 --- /dev/null +++ b/src/libs/API/parameters/UnapproveMoneyRequestParams.ts @@ -0,0 +1,6 @@ +type UnapproveMoneyRequestParams = { + reportID: string; + reportActionID: string; +}; + +export default UnapproveMoneyRequestParams; diff --git a/src/libs/API/parameters/index.ts b/src/libs/API/parameters/index.ts index c43ab514b251..f08576613c69 100644 --- a/src/libs/API/parameters/index.ts +++ b/src/libs/API/parameters/index.ts @@ -149,6 +149,7 @@ export type {default as CreateDistanceRequestParams} from './CreateDistanceReque export type {default as StartSplitBillParams} from './StartSplitBillParams'; export type {default as SendMoneyParams} from './SendMoneyParams'; export type {default as ApproveMoneyRequestParams} from './ApproveMoneyRequestParams'; +export type {default as UnapproveMoneyRequestParams} from './UnapproveMoneyRequestParams'; export type {default as EditMoneyRequestParams} from './EditMoneyRequestParams'; export type {default as ReplaceReceiptParams} from './ReplaceReceiptParams'; export type {default as SubmitReportParams} from './SubmitReportParams'; From cfa5803118032a371646746e1a606d4d26833392 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Wed, 26 Jun 2024 04:37:38 +0300 Subject: [PATCH 31/45] call api with parms --- src/libs/actions/IOU.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index e5f825172942..4c5826d52710 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -24,6 +24,7 @@ import type { StartSplitBillParams, SubmitReportParams, TrackExpenseParams, + UnapproveMoneyRequestParams, UpdateMoneyRequestParams, } from '@libs/API/parameters'; import {WRITE_COMMANDS} from '@libs/API/types'; @@ -6415,7 +6416,12 @@ function unapproveExpenseReport(expenseReport: OnyxTypes.Report | EmptyObject) { }, ]; - API.write(WRITE_COMMANDS.UNAPPROVE_MONEY_REQUEST, {}, {optimisticData, successData, failureData}); + const parameters: UnapproveMoneyRequestParams = { + reportID: expenseReport.reportID, + reportActionID: optimisticUnapprovedReportAction.reportActionID, + }; + + API.write(WRITE_COMMANDS.UNAPPROVE_MONEY_REQUEST, parameters, {optimisticData, successData, failureData}); } function submitReport(expenseReport: OnyxTypes.Report) { From 538e6213331c9457902355913d8118613e654e4e Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Thu, 27 Jun 2024 11:58:02 +0300 Subject: [PATCH 32/45] run prettier --- src/components/Icon/Expensicons.ts | 2 +- src/libs/API/types.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/Icon/Expensicons.ts b/src/components/Icon/Expensicons.ts index debd4584b0fe..bfaac6b0ff18 100644 --- a/src/components/Icon/Expensicons.ts +++ b/src/components/Icon/Expensicons.ts @@ -18,7 +18,6 @@ import FallbackWorkspaceAvatar from '@assets/images/avatars/fallback-workspace-a import NotificationsAvatar from '@assets/images/avatars/notifications-avatar.svg'; import ActiveRoomAvatar from '@assets/images/avatars/room.svg'; import BackArrow from '@assets/images/back-left.svg'; -import CircularArrowBackwards from '@assets/images/circular-arrow-backwards.svg'; import Bank from '@assets/images/bank.svg'; import Bed from '@assets/images/bed.svg'; import Bell from '@assets/images/bell.svg'; @@ -43,6 +42,7 @@ import ChatBubbles from '@assets/images/chatbubbles.svg'; import CheckCircle from '@assets/images/check-circle.svg'; import CheckmarkCircle from '@assets/images/checkmark-circle.svg'; import Checkmark from '@assets/images/checkmark.svg'; +import CircularArrowBackwards from '@assets/images/circular-arrow-backwards.svg'; import Close from '@assets/images/close.svg'; import ClosedSign from '@assets/images/closed-sign.svg'; import Coins from '@assets/images/coins.svg'; diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts index 1775a669846a..87dcc15f994a 100644 --- a/src/libs/API/types.ts +++ b/src/libs/API/types.ts @@ -391,7 +391,7 @@ type WriteCommandParameters = { [WRITE_COMMANDS.SEND_MONEY_ELSEWHERE]: Parameters.SendMoneyParams; [WRITE_COMMANDS.SEND_MONEY_WITH_WALLET]: Parameters.SendMoneyParams; [WRITE_COMMANDS.APPROVE_MONEY_REQUEST]: Parameters.ApproveMoneyRequestParams; - [WRITE_COMMANDS.UNAPPROVE_MONEY_REQUEST]: EmptyObject; + [WRITE_COMMANDS.UNAPPROVE_MONEY_REQUEST]: Parameters.UnapproveMoneyRequestParams; [WRITE_COMMANDS.EDIT_MONEY_REQUEST]: Parameters.EditMoneyRequestParams; [WRITE_COMMANDS.REPLACE_RECEIPT]: Parameters.ReplaceReceiptParams; [WRITE_COMMANDS.SUBMIT_REPORT]: Parameters.SubmitReportParams; From b87b726daa18f0ffce08314998d77dc7271947ac Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Thu, 27 Jun 2024 13:27:37 +0300 Subject: [PATCH 33/45] add spanish translation --- src/languages/es.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/languages/es.ts b/src/languages/es.ts index d6243de477ad..cc719e53e4df 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -785,10 +785,10 @@ export default { removed: 'eliminó', transactionPending: 'Transacción pendiente.', unapprove: 'Desaprobar', - unapproveReport: 'Unapprove report', - headsUp: 'Heads up!', + unapproveReport: 'Anular la aprobación del informe', + headsUp: 'Atención!', unapproveWithIntegrationWarning: (accountingIntegration: string) => - `This report has already been exported to ${accountingIntegration}. Changes to this report in Expensify may lead to data discrepancies and Expensify Card reconciliation issues. Are you sure you want to unapprove this report?`, + `Este informe ya se ha exportado a ${accountingIntegration}. Los cambios realizados en este informe en Expensify pueden provocar discrepancias en los datos y problemas de conciliación de la tarjeta Expensify. ¿Está seguro de que desea anular la aprobación de este informe?`, chooseARate: ({unit}: ReimbursementRateParams) => `Selecciona una tasa de reembolso por ${unit} del espacio de trabajo`, }, notificationPreferencesPage: { From 4a3ebfab680c49f1f116ed51a49d9881ae1f3e98 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Thu, 27 Jun 2024 13:45:13 +0300 Subject: [PATCH 34/45] fix type --- src/libs/actions/IOU.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 4f31ff72dc50..8ecb73a0c301 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -6338,7 +6338,11 @@ function approveMoneyRequest(expenseReport: OnyxEntry, full?: API.write(WRITE_COMMANDS.APPROVE_MONEY_REQUEST, parameters, {optimisticData, successData, failureData}); } -function unapproveExpenseReport(expenseReport: OnyxTypes.Report | EmptyObject) { +function unapproveExpenseReport(expenseReport: OnyxEntry) { + if (isEmptyObject(expenseReport)) { + return; + } + const currentNextStep = allNextSteps[`${ONYXKEYS.COLLECTION.NEXT_STEP}${expenseReport.reportID}`] ?? null; const total = expenseReport.total ?? 0; From 0280572f9c243dfdc28ce2f615a1bd191df2caad Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Thu, 27 Jun 2024 14:00:03 +0300 Subject: [PATCH 35/45] fix type --- src/pages/ReportDetailsPage.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index b71e93a6e1f8..2cc6ccc60aca 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -174,7 +174,7 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD typeof requestParentReportAction?.actorAccountID === 'number' && typeof session?.accountID === 'number' && requestParentReportAction.actorAccountID === session?.accountID; const isDeletedParentAction = ReportActionsUtils.isDeletedAction(requestParentReportAction); - const moneyRequestReport = useMemo(() => { + const moneyRequestReport: OnyxEntry = useMemo(() => { if (caseID === CASES.MONEY_REQUEST) { return parentReport; } @@ -229,7 +229,7 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD // TODO: show modal if report is exported to accounting // setIsUnapproveModalVisible(true); - IOU.unapproveExpenseReport(moneyRequestReport ?? {}); + IOU.unapproveExpenseReport(moneyRequestReport); }, [moneyRequestReport]); const shouldShowLeaveButton = @@ -678,7 +678,7 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD onConfirm={() => { setIsUnapproveModalVisible(false); Navigation.dismissModal(); - IOU.unapproveExpenseReport(moneyRequestReport ?? {}); + IOU.unapproveExpenseReport(moneyRequestReport); }} cancelText={translate('common.cancel')} onCancel={() => setIsUnapproveModalVisible(false)} From 737f730bef9b439a42872309106bc0fbc8901247 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Thu, 27 Jun 2024 14:01:55 +0300 Subject: [PATCH 36/45] chg order --- src/languages/es.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/languages/es.ts b/src/languages/es.ts index c690fd726e65..07561a8cce26 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -784,12 +784,12 @@ export default { changed: 'cambió', removed: 'eliminó', transactionPending: 'Transacción pendiente.', + chooseARate: ({unit}: ReimbursementRateParams) => `Selecciona una tasa de reembolso por ${unit} del espacio de trabajo`, unapprove: 'Desaprobar', unapproveReport: 'Anular la aprobación del informe', headsUp: 'Atención!', unapproveWithIntegrationWarning: (accountingIntegration: string) => `Este informe ya se ha exportado a ${accountingIntegration}. Los cambios realizados en este informe en Expensify pueden provocar discrepancias en los datos y problemas de conciliación de la tarjeta Expensify. ¿Está seguro de que desea anular la aprobación de este informe?`, - chooseARate: ({unit}: ReimbursementRateParams) => `Selecciona una tasa de reembolso por ${unit} del espacio de trabajo`, }, notificationPreferencesPage: { header: 'Preferencias de avisos', From 1b59e176505797cf147bd7b60db8a7e490e10b55 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Thu, 27 Jun 2024 14:03:42 +0300 Subject: [PATCH 37/45] rename to expense report --- src/libs/API/parameters/UnapproveExpenseReportParams.ts | 6 ++++++ src/libs/API/parameters/UnapproveMoneyRequestParams.ts | 6 ------ src/libs/API/parameters/index.ts | 2 +- src/libs/API/types.ts | 4 ++-- src/libs/actions/IOU.ts | 6 +++--- 5 files changed, 12 insertions(+), 12 deletions(-) create mode 100644 src/libs/API/parameters/UnapproveExpenseReportParams.ts delete mode 100644 src/libs/API/parameters/UnapproveMoneyRequestParams.ts diff --git a/src/libs/API/parameters/UnapproveExpenseReportParams.ts b/src/libs/API/parameters/UnapproveExpenseReportParams.ts new file mode 100644 index 000000000000..ba25424aeda6 --- /dev/null +++ b/src/libs/API/parameters/UnapproveExpenseReportParams.ts @@ -0,0 +1,6 @@ +type UnapproveExpenseReportParams = { + reportID: string; + reportActionID: string; +}; + +export default UnapproveExpenseReportParams; diff --git a/src/libs/API/parameters/UnapproveMoneyRequestParams.ts b/src/libs/API/parameters/UnapproveMoneyRequestParams.ts deleted file mode 100644 index 8926dc143128..000000000000 --- a/src/libs/API/parameters/UnapproveMoneyRequestParams.ts +++ /dev/null @@ -1,6 +0,0 @@ -type UnapproveMoneyRequestParams = { - reportID: string; - reportActionID: string; -}; - -export default UnapproveMoneyRequestParams; diff --git a/src/libs/API/parameters/index.ts b/src/libs/API/parameters/index.ts index 45b2c3daaf72..c937f02bfd31 100644 --- a/src/libs/API/parameters/index.ts +++ b/src/libs/API/parameters/index.ts @@ -149,7 +149,7 @@ export type {default as CreateDistanceRequestParams} from './CreateDistanceReque export type {default as StartSplitBillParams} from './StartSplitBillParams'; export type {default as SendMoneyParams} from './SendMoneyParams'; export type {default as ApproveMoneyRequestParams} from './ApproveMoneyRequestParams'; -export type {default as UnapproveMoneyRequestParams} from './UnapproveMoneyRequestParams'; +export type {default as UnapproveExpenseReportParams} from './UnapproveExpenseReportParams'; export type {default as EditMoneyRequestParams} from './EditMoneyRequestParams'; export type {default as ReplaceReceiptParams} from './ReplaceReceiptParams'; export type {default as SubmitReportParams} from './SubmitReportParams'; diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts index 1c203aab6861..5b25e5490ea0 100644 --- a/src/libs/API/types.ts +++ b/src/libs/API/types.ts @@ -169,7 +169,7 @@ const WRITE_COMMANDS = { SEND_MONEY_ELSEWHERE: 'SendMoneyElsewhere', SEND_MONEY_WITH_WALLET: 'SendMoneyWithWallet', APPROVE_MONEY_REQUEST: 'ApproveMoneyRequest', - UNAPPROVE_MONEY_REQUEST: 'UnapproveExpenseReport', + UNAPPROVE_EXPENSE_REPORT: 'UnapproveExpenseReport', EDIT_MONEY_REQUEST: 'EditMoneyRequest', REPLACE_RECEIPT: 'ReplaceReceipt', SUBMIT_REPORT: 'SubmitReport', @@ -389,7 +389,7 @@ type WriteCommandParameters = { [WRITE_COMMANDS.SEND_MONEY_ELSEWHERE]: Parameters.SendMoneyParams; [WRITE_COMMANDS.SEND_MONEY_WITH_WALLET]: Parameters.SendMoneyParams; [WRITE_COMMANDS.APPROVE_MONEY_REQUEST]: Parameters.ApproveMoneyRequestParams; - [WRITE_COMMANDS.UNAPPROVE_MONEY_REQUEST]: Parameters.UnapproveMoneyRequestParams; + [WRITE_COMMANDS.UNAPPROVE_EXPENSE_REPORT]: Parameters.UnapproveExpenseReportParams; [WRITE_COMMANDS.EDIT_MONEY_REQUEST]: Parameters.EditMoneyRequestParams; [WRITE_COMMANDS.REPLACE_RECEIPT]: Parameters.ReplaceReceiptParams; [WRITE_COMMANDS.SUBMIT_REPORT]: Parameters.SubmitReportParams; diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 8ecb73a0c301..5a1815e3d684 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -24,7 +24,7 @@ import type { StartSplitBillParams, SubmitReportParams, TrackExpenseParams, - UnapproveMoneyRequestParams, + UnapproveExpenseReportParams, UpdateMoneyRequestParams, } from '@libs/API/parameters'; import {WRITE_COMMANDS} from '@libs/API/types'; @@ -6420,12 +6420,12 @@ function unapproveExpenseReport(expenseReport: OnyxEntry) { }, ]; - const parameters: UnapproveMoneyRequestParams = { + const parameters: UnapproveExpenseReportParams = { reportID: expenseReport.reportID, reportActionID: optimisticUnapprovedReportAction.reportActionID, }; - API.write(WRITE_COMMANDS.UNAPPROVE_MONEY_REQUEST, parameters, {optimisticData, successData, failureData}); + API.write(WRITE_COMMANDS.UNAPPROVE_EXPENSE_REPORT, parameters, {optimisticData, successData, failureData}); } function submitReport(expenseReport: OnyxTypes.Report) { From 7441936f4d64343c85de749403f3259f808ff8f4 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Thu, 27 Jun 2024 14:05:36 +0300 Subject: [PATCH 38/45] rename stuff --- src/libs/actions/IOU.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 5a1815e3d684..de4c9b7cfc69 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -6344,12 +6344,11 @@ function unapproveExpenseReport(expenseReport: OnyxEntry) { } const currentNextStep = allNextSteps[`${ONYXKEYS.COLLECTION.NEXT_STEP}${expenseReport.reportID}`] ?? null; - const total = expenseReport.total ?? 0; - const optimisticUnapprovedReportAction = ReportUtils.buildOptimisticUnapprovedReportAction(total, expenseReport.currency ?? '', expenseReport.reportID); + const optimisticUnapprovedReportAction = ReportUtils.buildOptimisticUnapprovedReportAction(expenseReport.total ?? 0, expenseReport.currency ?? '', expenseReport.reportID); const optimisticNextStep = NextStepUtils.buildNextStep(expenseReport, CONST.REPORT.STATUS_NUM.SUBMITTED); - const optimisticReportActionsData: OnyxUpdate = { + const optimisticReportActionData: OnyxUpdate = { onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseReport.reportID}`, value: { @@ -6380,7 +6379,7 @@ function unapproveExpenseReport(expenseReport: OnyxEntry) { value: optimisticNextStep, }; - const optimisticData: OnyxUpdate[] = [optimisticIOUReportData, optimisticReportActionsData, optimisticNextStepData]; + const optimisticData: OnyxUpdate[] = [optimisticIOUReportData, optimisticReportActionData, optimisticNextStepData]; const successData: OnyxUpdate[] = [ { From 35d10e0e04a1b2778a608e2d073559bcc156fa9b Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Thu, 27 Jun 2024 14:54:09 +0300 Subject: [PATCH 39/45] move to func --- src/pages/ReportDetailsPage.tsx | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index 2cc6ccc60aca..85f90d0af335 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -225,12 +225,18 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD Report.leaveGroupChat(report.reportID); }, [isChatRoom, isPolicyEmployee, isPolicyExpenseChat, report.reportID, report.visibility]); + const unapproveAndClose = useCallback(() => { + setIsUnapproveModalVisible(false); + Navigation.dismissModal(); + IOU.unapproveExpenseReport(moneyRequestReport); + }, [moneyRequestReport]); + const unapproveExpenseReportOrShowModal = useCallback(() => { // TODO: show modal if report is exported to accounting // setIsUnapproveModalVisible(true); - IOU.unapproveExpenseReport(moneyRequestReport); - }, [moneyRequestReport]); + unapproveAndClose(); + }, [unapproveAndClose]); const shouldShowLeaveButton = !isThread && (isGroupChat || (isChatRoom && ReportUtils.canLeaveChat(report, policy)) || (isPolicyExpenseChat && !report.isOwnPolicyExpenseChat && !isPolicyAdmin)); @@ -675,11 +681,7 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD isVisible={isUnapproveModalVisible} danger confirmText={translate('iou.unapproveReport')} - onConfirm={() => { - setIsUnapproveModalVisible(false); - Navigation.dismissModal(); - IOU.unapproveExpenseReport(moneyRequestReport); - }} + onConfirm={unapproveAndClose} cancelText={translate('common.cancel')} onCancel={() => setIsUnapproveModalVisible(false)} prompt={unapproveWarningText} From b6b49e78eb370a395b9eb6d87975469680024874 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Thu, 27 Jun 2024 14:55:43 +0300 Subject: [PATCH 40/45] move to func --- src/pages/ReportDetailsPage.tsx | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index 85f90d0af335..6402ecda3401 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -225,18 +225,14 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD Report.leaveGroupChat(report.reportID); }, [isChatRoom, isPolicyEmployee, isPolicyExpenseChat, report.reportID, report.visibility]); - const unapproveAndClose = useCallback(() => { - setIsUnapproveModalVisible(false); - Navigation.dismissModal(); - IOU.unapproveExpenseReport(moneyRequestReport); - }, [moneyRequestReport]); - const unapproveExpenseReportOrShowModal = useCallback(() => { // TODO: show modal if report is exported to accounting // setIsUnapproveModalVisible(true); - unapproveAndClose(); - }, [unapproveAndClose]); + setIsUnapproveModalVisible(false); + Navigation.dismissModal(); + IOU.unapproveExpenseReport(moneyRequestReport); + }, [moneyRequestReport]); const shouldShowLeaveButton = !isThread && (isGroupChat || (isChatRoom && ReportUtils.canLeaveChat(report, policy)) || (isPolicyExpenseChat && !report.isOwnPolicyExpenseChat && !isPolicyAdmin)); @@ -681,7 +677,7 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD isVisible={isUnapproveModalVisible} danger confirmText={translate('iou.unapproveReport')} - onConfirm={unapproveAndClose} + onConfirm={unapproveExpenseReportOrShowModal} cancelText={translate('common.cancel')} onCancel={() => setIsUnapproveModalVisible(false)} prompt={unapproveWarningText} From 5e23460a2dba169c665c00508781e6db1c222489 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Sat, 6 Jul 2024 03:00:22 +0300 Subject: [PATCH 41/45] show warning if connected to accounting --- src/pages/ReportDetailsPage.tsx | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index 6402ecda3401..e302105bc280 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -226,9 +226,10 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD }, [isChatRoom, isPolicyEmployee, isPolicyExpenseChat, report.reportID, report.visibility]); const unapproveExpenseReportOrShowModal = useCallback(() => { - // TODO: show modal if report is exported to accounting - // setIsUnapproveModalVisible(true); - + if(PolicyUtils.hasAccountingConnections(policy)){ + setIsUnapproveModalVisible(true); + return; + } setIsUnapproveModalVisible(false); Navigation.dismissModal(); IOU.unapproveExpenseReport(moneyRequestReport); @@ -677,7 +678,11 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD isVisible={isUnapproveModalVisible} danger confirmText={translate('iou.unapproveReport')} - onConfirm={unapproveExpenseReportOrShowModal} + onConfirm={() => { + setIsUnapproveModalVisible(false); + Navigation.dismissModal(); + IOU.unapproveExpenseReport(moneyRequestReport); + }} cancelText={translate('common.cancel')} onCancel={() => setIsUnapproveModalVisible(false)} prompt={unapproveWarningText} From 4aa5d8eab2e88c42e45db8231f437502ba0984fa Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Sat, 6 Jul 2024 03:34:59 +0300 Subject: [PATCH 42/45] get connected integration name --- src/languages/en.ts | 13 +++++++++++++ src/languages/es.ts | 13 +++++++++++++ src/pages/ReportDetailsPage.tsx | 7 ++++--- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/languages/en.ts b/src/languages/en.ts index 35500c6ccc74..ea710e961445 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -2431,6 +2431,19 @@ export default { qbo: 'Quickbooks Online', xero: 'Xero', netsuite: 'NetSuite', + connectionName: (integration: ConnectionName) => { + switch (integration) { + case CONST.POLICY.CONNECTIONS.NAME.QBO: + return 'Quickbooks Online'; + case CONST.POLICY.CONNECTIONS.NAME.XERO: + return 'Xero'; + case CONST.POLICY.CONNECTIONS.NAME.NETSUITE: + return 'NetSuite'; + default: { + return 'Accounting integration'; + } + } + }, setup: 'Connect', lastSync: 'Last synced just now', import: 'Import', diff --git a/src/languages/es.ts b/src/languages/es.ts index 07561a8cce26..0994b990bfd4 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -2434,6 +2434,19 @@ export default { qbo: 'Quickbooks Online', xero: 'Xero', netsuite: 'NetSuite', + connectionName: (integration: ConnectionName) => { + switch (integration) { + case CONST.POLICY.CONNECTIONS.NAME.QBO: + return 'Quickbooks Online'; + case CONST.POLICY.CONNECTIONS.NAME.XERO: + return 'Xero'; + case CONST.POLICY.CONNECTIONS.NAME.NETSUITE: + return 'NetSuite'; + default: { + return 'Contabilidad integración'; + } + } + }, setup: 'Configurar', lastSync: 'Recién sincronizado', import: 'Importar', diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index e302105bc280..1f537342af03 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -226,7 +226,7 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD }, [isChatRoom, isPolicyEmployee, isPolicyExpenseChat, report.reportID, report.visibility]); const unapproveExpenseReportOrShowModal = useCallback(() => { - if(PolicyUtils.hasAccountingConnections(policy)){ + if (PolicyUtils.hasAccountingConnections(policy)) { setIsUnapproveModalVisible(true); return; } @@ -422,10 +422,11 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD /> ) : null; + const connectedIntegration = Object.values(CONST.POLICY.CONNECTIONS.NAME).find((integration) => !!policy?.connections?.[integration]); + const connectedIntegrationName = connectedIntegration ? translate('workspace.accounting.connectionName', connectedIntegration) : ''; const unapproveWarningText = ( - {/* TODO: Replace with the connected accounting integration name */} - {translate('iou.headsUp')} {translate('iou.unapproveWithIntegrationWarning', 'Xero')} + {translate('iou.headsUp')} {translate('iou.unapproveWithIntegrationWarning', connectedIntegrationName)} ); From afd5eac57fc4aae40ba0f30eb2ce7c62ea517c21 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Sat, 6 Jul 2024 03:37:16 +0300 Subject: [PATCH 43/45] default to none --- src/languages/en.ts | 2 +- src/languages/es.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/languages/en.ts b/src/languages/en.ts index ea710e961445..6630f42eaac8 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -2440,7 +2440,7 @@ export default { case CONST.POLICY.CONNECTIONS.NAME.NETSUITE: return 'NetSuite'; default: { - return 'Accounting integration'; + return ''; } } }, diff --git a/src/languages/es.ts b/src/languages/es.ts index 0994b990bfd4..3e3ed21e1e98 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -2443,7 +2443,7 @@ export default { case CONST.POLICY.CONNECTIONS.NAME.NETSUITE: return 'NetSuite'; default: { - return 'Contabilidad integración'; + return ''; } } }, From a422850a4889ea078dcb9d18c73971ddf7bef78a Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Sat, 6 Jul 2024 03:56:49 +0300 Subject: [PATCH 44/45] fix lint --- src/pages/ReportDetailsPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index 4edfc8ba22cb..bba2f2c8fcb6 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -239,7 +239,7 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD setIsUnapproveModalVisible(false); Navigation.dismissModal(); IOU.unapproveExpenseReport(moneyRequestReport); - }, [moneyRequestReport]); + }, [moneyRequestReport, policy]); const shouldShowLeaveButton = !isThread && (isGroupChat || (isChatRoom && ReportUtils.canLeaveChat(report, policy)) || (isPolicyExpenseChat && !report.isOwnPolicyExpenseChat && !isPolicyAdmin)); From c90b70389bb4979f0e9eb8a26c1599100bdfd8f3 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Sat, 6 Jul 2024 16:39:07 +0300 Subject: [PATCH 45/45] rm unnecessary setstate --- src/pages/ReportDetailsPage.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index bba2f2c8fcb6..c6e25bcaa70a 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -236,7 +236,6 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD setIsUnapproveModalVisible(true); return; } - setIsUnapproveModalVisible(false); Navigation.dismissModal(); IOU.unapproveExpenseReport(moneyRequestReport); }, [moneyRequestReport, policy]);