Skip to content

Feature: Implement ChangeTransactionsReport #58597

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from 27 commits
Commits
Show all changes
84 commits
Select commit Hold shift + click to select a range
5d3ff13
add new tranlsations
waterim Mar 17, 2025
54a1e4b
add new action type
waterim Mar 17, 2025
4680cab
add new screen and route
waterim Mar 17, 2025
0371346
update withWritable
waterim Mar 17, 2025
7168ce6
add new report action build
waterim Mar 17, 2025
b97b0cd
update confirmation footer
waterim Mar 17, 2025
2666643
update moneyRequestView
waterim Mar 17, 2025
72c84df
create new screen
waterim Mar 17, 2025
2f52373
add new UNREPORTED_TRANSACTION
waterim Mar 18, 2025
48c3444
add new translations
waterim Mar 18, 2025
f8e4e7d
update params
waterim Mar 18, 2025
2197850
add and update buildOptimisticUnreportedTransactionAction
waterim Mar 18, 2025
b5de70f
add new api params
waterim Mar 18, 2025
697db04
ChangeTransactionsReportParams
waterim Mar 18, 2025
e93d40e
update pure and stepReport
waterim Mar 18, 2025
73a2a3f
update original message
waterim Mar 18, 2025
777f8ee
Merge remote-tracking branch 'upstream/main' into feature/57468-Chang…
waterim Mar 27, 2025
56dad97
fix linter
waterim Mar 27, 2025
a85f5bd
Merge remote-tracking branch 'upstream/main' into feature/57468-Chang…
waterim Mar 31, 2025
b60caf3
fix import
waterim Mar 31, 2025
7b1bea4
add new transaction function
waterim Mar 31, 2025
5e528d8
update requestStep report step
waterim Mar 31, 2025
9855633
Merge remote-tracking branch 'upstream/main' into feature/57468-Chang…
waterim Mar 31, 2025
3884eea
update message types
waterim Apr 1, 2025
5662a31
fix transaction ts
waterim Apr 1, 2025
4c04878
fix requestStep
waterim Apr 1, 2025
3c2d751
update param
waterim Apr 1, 2025
4162fd8
update selectedParticipants check
waterim Apr 2, 2025
c7a4825
update reportId to parentReportID
waterim Apr 2, 2025
b1a93c9
update route
waterim Apr 2, 2025
ff77293
update translations
waterim Apr 2, 2025
2a56d07
update params
waterim Apr 2, 2025
0bff732
update moved/unreported transactions optimistic
waterim Apr 2, 2025
32a4ef2
update buildOptimisticUnreportedTransactionAction
waterim Apr 2, 2025
ef2bd05
add fake policy id
waterim Apr 2, 2025
868b44f
update request step
waterim Apr 2, 2025
c28ad5c
update params
waterim Apr 2, 2025
29a7100
add selected report
waterim Apr 2, 2025
0c8d6f5
update transaction
waterim Apr 2, 2025
0ef8628
add hasForwardedAction
waterim Apr 2, 2025
715b699
update
waterim Apr 2, 2025
a8ad06d
apply changes
waterim Apr 3, 2025
51ee336
Merge remote-tracking branch 'upstream/main' into feature/57468-Chang…
waterim Apr 3, 2025
8e39c24
update transaction
waterim Apr 3, 2025
2093ee8
revert deleted
waterim Apr 3, 2025
8b73cc2
update correct link
waterim Apr 3, 2025
59bc33d
update translations
waterim Apr 3, 2025
4a9caea
apply changes
waterim Apr 4, 2025
649ae99
Merge remote-tracking branch 'upstream/main' into feature/57468-Chang…
waterim Apr 6, 2025
fd04917
fix linter
waterim Apr 6, 2025
f6fecf6
update key
waterim Apr 6, 2025
214704d
fix ts
waterim Apr 6, 2025
c6a0505
fix ts
waterim Apr 6, 2025
823e40a
fix ts
waterim Apr 7, 2025
2374b45
fix ts
waterim Apr 7, 2025
aa71e55
provide feedback
waterim Apr 7, 2025
d0ecbdc
update optimistic creation
waterim Apr 7, 2025
9af729d
Merge remote-tracking branch 'upstream/main' into feature/57468-Chang…
waterim Apr 8, 2025
ec32e10
fix merge conf
waterim Apr 8, 2025
3f707d5
fix linter
waterim Apr 8, 2025
0584d74
fix condition
waterim Apr 8, 2025
70696b3
update condition and update selected
waterim Apr 8, 2025
3807bef
fix reportName
waterim Apr 8, 2025
92384ca
update with new util
waterim Apr 8, 2025
69e56c8
fix lint
waterim Apr 8, 2025
835b6eb
Merge remote-tracking branch 'upstream/main' into feature/57468-Chang…
waterim Apr 8, 2025
8a00c88
fix selection issues
waterim Apr 8, 2025
8cce592
provide feedback
waterim Apr 9, 2025
e38c1f9
fix policyID
waterim Apr 9, 2025
54faeac
update report utils
waterim Apr 9, 2025
d7de72b
update reportID
waterim Apr 9, 2025
32baeaf
remove unused code
waterim Apr 9, 2025
4f2efa6
update to use transaction report
waterim Apr 9, 2025
02e030a
Merge remote-tracking branch 'upstream/main' into feature/57468-Chang…
waterim Apr 9, 2025
351c22e
prvide feedback
waterim Apr 10, 2025
9b64aac
fix transactionReport
waterim Apr 10, 2025
efb86d1
updates
waterim Apr 10, 2025
5d35c8a
fix reassure
waterim Apr 11, 2025
e289e34
Merge remote-tracking branch 'upstream/main' into feature/57468-Chang…
waterim Apr 14, 2025
658a9ad
fix condition
waterim Apr 14, 2025
3688002
update search
waterim Apr 14, 2025
84e0536
add comment
waterim Apr 14, 2025
17647a0
fix report passed
waterim Apr 14, 2025
6ec8f3b
Update IOURequestStepConfirmation.tsx
waterim Apr 14, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/CONST.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1202,6 +1202,8 @@ const CONST = {
MERGED_WITH_CASH_TRANSACTION: 'MERGEDWITHCASHTRANSACTION',
MODIFIED_EXPENSE: 'MODIFIEDEXPENSE',
MOVED: 'MOVED',
MOVED_TRANSACTION: 'MOVEDTRANSACTION',
UNREPORTED_TRANSACTION: 'UNREPORTEDTRANSACTION',
OUTDATED_BANK_ACCOUNT: 'OUTDATEDBANKACCOUNT', // OldDot Action
REIMBURSED: 'REIMBURSED',
REIMBURSEMENT_ACH_BOUNCE: 'REIMBURSEMENTACHBOUNCE', // OldDot Action
Expand Down
5 changes: 5 additions & 0 deletions src/ROUTES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -645,6 +645,11 @@ const ROUTES = {
getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, pageIndex = 0, backTo = '') =>
getUrlWithBackToParam(`${action as string}/${iouType as string}/subrate/${transactionID}/${reportID}/edit/${pageIndex}`, backTo),
},
MONEY_REQUEST_STEP_REPORT: {
route: ':action/:iouType/report/:transactionID/:reportID/edit',
getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backTo = '') =>
getUrlWithBackToParam(`${action as string}/${iouType as string}/report/${transactionID}/${reportID}/edit`, backTo),
},
SETTINGS_TAGS_ROOT: {
route: 'settings/:policyID/tags',
getRoute: (policyID: string | undefined, backTo = '') => {
Expand Down
1 change: 1 addition & 0 deletions src/SCREENS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,7 @@ const SCREENS = {
STEP_DESTINATION_EDIT: 'Money_Request_Destination_Edit',
STEP_TIME_EDIT: 'Money_Request_Time_Edit',
STEP_SUBRATE_EDIT: 'Money_Request_SubRate_Edit',
STEP_REPORT: 'Money_Request_Report',
},

TRANSACTION_DUPLICATE: {
Expand Down
45 changes: 44 additions & 1 deletion src/components/MoneyRequestConfirmationListFooter.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import {getDestinationForDisplay, getSubratesFields, getSubratesForDisplay, getT
import {canSendInvoice, getPerDiemCustomUnit, isMultiLevelTags as isMultiLevelTagsPolicyUtils, isPaidGroupPolicy} from '@libs/PolicyUtils';
import type {ThumbnailAndImageURI} from '@libs/ReceiptUtils';
import {getThumbnailAndImageURIs} from '@libs/ReceiptUtils';
import {getDefaultWorkspaceAvatar} from '@libs/ReportUtils';
import {buildOptimisticExpenseReport, getDefaultWorkspaceAvatar, isExpenseReport, populateOptimisticReportFormula} from '@libs/ReportUtils';
import {hasEnabledTags} from '@libs/TagsOptionsListUtils';
import {
getTagForDisplay,
Expand Down Expand Up @@ -247,6 +247,8 @@ function MoneyRequestConfirmationListFooter({
const {translate, toLocaleDigit} = useLocalize();
const {isOffline} = useNetwork();
const [allPolicies] = useOnyx(ONYXKEYS.COLLECTION.POLICY);
const [allReports] = useOnyx(ONYXKEYS.COLLECTION.REPORT);

const [currentUserLogin] = useOnyx(ONYXKEYS.SESSION, {selector: (session) => session?.email});

// A flag and a toggler for showing the rest of the form fields
Expand All @@ -272,6 +274,25 @@ function MoneyRequestConfirmationListFooter({
return canSendInvoice(allPolicies, currentUserLogin) && !!transaction?.isFromGlobalCreate && !isInvoiceRoomParticipant;
}, [allPolicies, currentUserLogin, selectedParticipants, transaction?.isFromGlobalCreate]);

const outstandingReport = Object.values(allReports ?? {})
.filter(
(report) =>
isExpenseReport(report) &&
report?.stateNum &&
report?.statusNum &&
report?.policyID === senderWorkspace?.id &&
report?.stateNum <= CONST.REPORT.STATE_NUM.SUBMITTED &&
report?.statusNum <= CONST.REPORT.STATUS_NUM.SUBMITTED,
)
.sort((a, b) => a?.reportName?.localeCompare(b?.reportName?.toLowerCase() ?? '') ?? 0)
.at(0);

let reportName = outstandingReport?.reportName;
if (!reportName) {
const optimisticReport = buildOptimisticExpenseReport(reportID, policy?.id, policy?.ownerAccountID ?? CONST.DEFAULT_NUMBER_ID, Number(formattedAmount), currency);
reportName = populateOptimisticReportFormula(policy?.fieldList?.text_title?.defaultValue ?? '', optimisticReport, policy);
}

const isTypeSend = iouType === CONST.IOU.TYPE.PAY;
const taxRates = policy?.taxRates ?? null;
// In Send Money and Split Bill with Scan flow, we don't allow the Merchant or Date to be edited. For distance requests, don't show the merchant as there's already another "Distance" menu item
Expand Down Expand Up @@ -624,6 +645,28 @@ function MoneyRequestConfirmationListFooter({
shouldShow: shouldShowBillable,
isSupplementary: true,
},
{
item: (
<MenuItemWithTopDescription
key="report"
shouldShowRightIcon
title={reportName}
description={translate('common.report')}
style={[styles.moneyRequestMenuItem]}
titleStyle={styles.flex1}
onPress={() => {
if (!transactionID) {
return;
}
Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_REPORT.getRoute(action, iouType, transactionID, reportID, Navigation.getActiveRoute()));
}}
interactive
shouldRenderAsHTML
/>
),
shouldShow: isPolicyExpenseChat,
isSupplementary: true,
},
];

const subRates = getSubratesFields(perDiemCustomUnit, transaction);
Expand Down
21 changes: 21 additions & 0 deletions src/components/ReportActionItem/MoneyRequestView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -801,6 +801,27 @@ function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = fals
/>
</View>
)}
{!!report?.reportID && (
<OfflineWithFeedback pendingAction={getPendingFieldAction('reportID')}>
<MenuItemWithTopDescription
shouldShowRightIcon
title={report?.reportName}
description={translate('common.report')}
style={[styles.moneyRequestMenuItem]}
titleStyle={styles.flex1}
onPress={() => {
if (!report?.reportID || !transaction?.transactionID) {
return;
}
Navigation.navigate(
ROUTES.MONEY_REQUEST_STEP_REPORT.getRoute(CONST.IOU.ACTION.EDIT, iouType, transaction?.transactionID, report.reportID, getReportRHPActiveRoute()),
);
}}
interactive
shouldRenderAsHTML
/>
</OfflineWithFeedback>
)}
</>
<ConfirmModal
isVisible={showConfirmDismissReceiptError}
Expand Down
5 changes: 5 additions & 0 deletions src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ import type {
MarkReimbursedFromIntegrationParams,
MissingPropertyParams,
MovedFromPersonalSpaceParams,
MovedTransactionParams,
NeedCategoryForExportToIntegrationParams,
NewWorkspaceNameParams,
NoLongerHaveAccessParams,
Expand Down Expand Up @@ -179,6 +180,7 @@ import type {
TrialStartedTitleParams,
UnapprovedParams,
UnapproveWithIntegrationWarningParams,
UnreportedTransactionParams,
UnshareParams,
UntilTimeParams,
UpdatedPolicyCategoryNameParams,
Expand Down Expand Up @@ -441,6 +443,7 @@ const translations = {
showMore: 'Show more',
merchant: 'Merchant',
category: 'Category',
report: 'Report',
billable: 'Billable',
nonBillable: 'Non-billable',
tag: 'Tag',
Expand Down Expand Up @@ -917,6 +920,8 @@ const translations = {
posted: 'Posted',
deleteReceipt: 'Delete receipt',
deletedTransaction: ({amount, merchant}: DeleteTransactionParams) => `deleted an expense on this report, ${merchant} - ${amount}`,
movedTransaction: ({reportID}: MovedTransactionParams) => `moved this expense to [Expense Report ${reportID}]`,
unreportedTransaction: ({reportID}: UnreportedTransactionParams) => `removed this expense from [Expense Report ${reportID}]`,
pendingMatchWithCreditCard: 'Receipt pending match with card transaction',
pendingMatch: 'Pending match',
pendingMatchWithCreditCardDescription: 'Receipt pending match with card transaction. Mark as cash to cancel.',
Expand Down
5 changes: 5 additions & 0 deletions src/languages/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ import type {
MarkReimbursedFromIntegrationParams,
MissingPropertyParams,
MovedFromPersonalSpaceParams,
MovedTransactionParams,
NeedCategoryForExportToIntegrationParams,
NewWorkspaceNameParams,
NoLongerHaveAccessParams,
Expand Down Expand Up @@ -178,6 +179,7 @@ import type {
TrialStartedTitleParams,
UnapprovedParams,
UnapproveWithIntegrationWarningParams,
UnreportedTransactionParams,
UnshareParams,
UntilTimeParams,
UpdatedPolicyCategoryNameParams,
Expand Down Expand Up @@ -434,6 +436,7 @@ const translations = {
showMore: 'Mostrar más',
merchant: 'Comerciante',
category: 'Categoría',
report: 'Informe',
billable: 'Facturable',
nonBillable: 'No facturable',
tag: 'Etiqueta',
Expand Down Expand Up @@ -917,6 +920,8 @@ const translations = {
markAsCash: 'Marcar como efectivo',
routePending: 'Ruta pendiente...',
deletedTransaction: ({amount, merchant}: DeleteTransactionParams) => `eliminó un gasto de este informe, ${merchant} - ${amount}`,
movedTransaction: ({reportID}: MovedTransactionParams) => `movió este gasto a [Gasto ${reportID}]`,
unreportedTransaction: ({reportID}: UnreportedTransactionParams) => `eliminó este gasto de [Gasto ${reportID}]`,
receiptIssuesFound: () => ({
one: 'Problema encontrado',
other: 'Problemas encontrados',
Expand Down
10 changes: 10 additions & 0 deletions src/languages/params.ts
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,14 @@ type DeleteTransactionParams = {
merchant: string;
};

type MovedTransactionParams = {
reportID: string;
};

type UnreportedTransactionParams = {
reportID?: string;
};

type SettleExpensifyCardParams = {
formattedAmount: string;
};
Expand Down Expand Up @@ -786,6 +794,8 @@ export type {
RequestAmountParams,
RequestCountParams,
DeleteTransactionParams,
MovedTransactionParams,
UnreportedTransactionParams,
RequestedAmountMessageParams,
ResolutionConstraintsParams,
RoomNameReservedErrorParams,
Expand Down
6 changes: 6 additions & 0 deletions src/libs/API/parameters/ChangeTransactionsReportParams.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
type ChangeTransactionsReportParams = {
transactionList: string;
reportID: string;
reportActionIDToThreadReportIDMap: Record<string, string>; // A map linking the optimistic MOVEDTRANSACTION or UNREPORTEDTRANSACTION reportActionID to the transaction thread reportID.
};
export default ChangeTransactionsReportParams;
1 change: 1 addition & 0 deletions src/libs/API/parameters/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -377,6 +377,7 @@ export type {default as SaveCorpayOnboardingBeneficialOwnerParams} from './SaveC
export type {default as MoveIOUReportToPolicyAndInviteSubmitterParams} from './MoveIOUReportToPolicyAndInviteSubmitterParams';
export type {default as MoveIOUReportToExistingPolicyParams} from './MoveIOUReportToExistingPolicyParams';
export type {default as ChangeReportPolicyParams} from './ChangeReportPolicyParams';
export type {default as ChangeTransactionsReportParams} from './ChangeTransactionsReportParams';
export type {default as ResetBankAccountSetupParams} from './ResetBankAccountSetupParams';
export type {default as SendRecapInAdminsRoomParams} from './SendRecapInAdminsRoomParams';
export type {default as SetPolicyProhibitedExpensesParams} from './SetPolicyProhibitedExpensesParams';
4 changes: 4 additions & 0 deletions src/libs/API/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -460,6 +460,7 @@ const WRITE_COMMANDS = {
SAVE_CORPAY_ONBOARDING_COMPANY_DETAILS: 'SaveCorpayOnboardingCompanyDetails',
SAVE_CORPAY_ONBOARDING_BENEFICIAL_OWNER: 'SaveCorpayOnboardingBeneficialOwner',
CHANGE_REPORT_POLICY: 'ChangeReportPolicy',
CHANGE_TRANSACTIONS_REPORT: 'ChangeTransactionsReport',
SEND_RECAP_IN_ADMINS_ROOM: 'SendRecapInAdminsRoom',
} as const;

Expand Down Expand Up @@ -935,6 +936,9 @@ type WriteCommandParameters = {

// Change report policy
[WRITE_COMMANDS.CHANGE_REPORT_POLICY]: Parameters.ChangeReportPolicyParams;

// Change transaction report
[WRITE_COMMANDS.CHANGE_TRANSACTIONS_REPORT]: Parameters.ChangeTransactionsReportParams;
};

const READ_COMMANDS = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ const MoneyRequestModalStackNavigator = createModalStackNavigator<MoneyRequestNa
[SCREENS.MONEY_REQUEST.STEP_WAYPOINT]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/IOURequestStepWaypoint').default,
[SCREENS.MONEY_REQUEST.STEP_SPLIT_PAYER]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/IOURequestStepSplitPayer').default,
[SCREENS.MONEY_REQUEST.STEP_SEND_FROM]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/IOURequestStepSendFrom').default,
[SCREENS.MONEY_REQUEST.STEP_REPORT]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/IOURequestStepReport').default,
[SCREENS.MONEY_REQUEST.STEP_COMPANY_INFO]: () => require<ReactComponentModule>('../../../../pages/iou/request/step/IOURequestStepCompanyInfo').default,
[SCREENS.MONEY_REQUEST.HOLD]: () => require<ReactComponentModule>('../../../../pages/iou/HoldReasonPage').default,
[SCREENS.IOU_SEND.ADD_BANK_ACCOUNT]: () => require<ReactComponentModule>('../../../../pages/AddPersonalBankAccountPage').default,
Expand Down
1 change: 1 addition & 0 deletions src/libs/Navigation/linkingConfig/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1244,6 +1244,7 @@ const config: LinkingOptions<RootNavigatorParamList>['config'] = {
[SCREENS.SETTINGS_CATEGORIES.SETTINGS_CATEGORIES_ROOT]: ROUTES.SETTINGS_CATEGORIES_ROOT.route,
[SCREENS.SETTINGS_TAGS.SETTINGS_TAGS_ROOT]: ROUTES.SETTINGS_TAGS_ROOT.route,
[SCREENS.MONEY_REQUEST.STEP_SEND_FROM]: ROUTES.MONEY_REQUEST_STEP_SEND_FROM.route,
[SCREENS.MONEY_REQUEST.STEP_REPORT]: ROUTES.MONEY_REQUEST_STEP_REPORT.route,
[SCREENS.MONEY_REQUEST.STEP_COMPANY_INFO]: ROUTES.MONEY_REQUEST_STEP_COMPANY_INFO.route,
[SCREENS.MONEY_REQUEST.STEP_AMOUNT]: ROUTES.MONEY_REQUEST_STEP_AMOUNT.route,
[SCREENS.MONEY_REQUEST.STEP_CATEGORY]: ROUTES.MONEY_REQUEST_STEP_CATEGORY.route,
Expand Down
7 changes: 7 additions & 0 deletions src/libs/Navigation/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1117,6 +1117,13 @@ type MoneyRequestNavigatorParamList = {
reportID: string;
backTo: Routes;
};
[SCREENS.MONEY_REQUEST.STEP_REPORT]: {
action: IOUAction;
iouType: IOUType;
transactionID: string;
reportID: string;
backTo: Routes;
};
[SCREENS.MONEY_REQUEST.STEP_COMPANY_INFO]: {
iouType: IOUType;
transactionID: string;
Expand Down
Loading
Loading