Skip to content

Commit 0b969c8

Browse files
authored
Merge pull request #52061 from FitseTLT/fix-include-workspaces-in-submit-via-track-flow
Fix - Submit expense RHP doesn't include workspaces from Track flow
2 parents 1365991 + e8d2b20 commit 0b969c8

File tree

6 files changed

+138
-16
lines changed

6 files changed

+138
-16
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import type {Receipt} from '@src/types/onyx/Transaction';
2+
3+
type AddTrackedExpenseToPolicyParams = {
4+
amount: number;
5+
currency: string;
6+
created: string;
7+
comment?: string;
8+
merchant?: string;
9+
category: string | undefined;
10+
tag: string | undefined;
11+
taxCode: string;
12+
taxAmount: number;
13+
reimbursable: boolean;
14+
billable: boolean | undefined;
15+
receipt: Receipt | undefined;
16+
waypoints?: string;
17+
customUnitRateID?: string;
18+
policyID: string;
19+
transactionID: string;
20+
actionableWhisperReportActionID: string;
21+
moneyRequestReportID: string;
22+
reportPreviewReportActionID: string;
23+
modifiedExpenseReportActionID: string;
24+
moneyRequestCreatedReportActionID: string | undefined;
25+
moneyRequestPreviewReportActionID: string;
26+
};
27+
28+
export default AddTrackedExpenseToPolicyParams;

src/libs/API/parameters/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@ export type {default as RenamePolicyTaxParams} from './RenamePolicyTaxParams';
233233
export type {default as UpdatePolicyTaxCodeParams} from './UpdatePolicyTaxCodeParams';
234234
export type {default as CompleteGuidedSetupParams} from './CompleteGuidedSetupParams';
235235
export type {default as DismissTrackExpenseActionableWhisperParams} from './DismissTrackExpenseActionableWhisperParams';
236+
export type {default as AddTrackedExpenseToPolicyParams} from './AddTrackedExpenseToPolicyParams';
236237
export type {default as ConvertTrackedExpenseToRequestParams} from './ConvertTrackedExpenseToRequestParams';
237238
export type {default as ShareTrackedExpenseParams} from './ShareTrackedExpenseParams';
238239
export type {default as CategorizeTrackedExpenseParams} from './CategorizeTrackedExpenseParams';

src/libs/API/types.ts

+2
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,7 @@ const WRITE_COMMANDS = {
298298
SET_POLICY_DISTANCE_RATES_ENABLED: 'SetPolicyDistanceRatesEnabled',
299299
DELETE_POLICY_DISTANCE_RATES: 'DeletePolicyDistanceRates',
300300
DISMISS_TRACK_EXPENSE_ACTIONABLE_WHISPER: 'DismissActionableWhisper',
301+
ADD_TRACKED_EXPENSE_TO_POLICY: 'AddTrackedExpenseToPolicy',
301302
CONVERT_TRACKED_EXPENSE_TO_REQUEST: 'ConvertTrackedExpenseToRequest',
302303
CATEGORIZE_TRACKED_EXPENSE: 'CategorizeTrackedExpense',
303304
SHARE_TRACKED_EXPENSE: 'ShareTrackedExpense',
@@ -758,6 +759,7 @@ type WriteCommandParameters = {
758759
[WRITE_COMMANDS.DISMISS_TRACK_EXPENSE_ACTIONABLE_WHISPER]: Parameters.DismissTrackExpenseActionableWhisperParams;
759760
[WRITE_COMMANDS.UPDATE_BILLING_CARD_CURRENCY]: Parameters.UpdateBillingCurrencyParams;
760761
[WRITE_COMMANDS.CONVERT_TRACKED_EXPENSE_TO_REQUEST]: Parameters.ConvertTrackedExpenseToRequestParams;
762+
[WRITE_COMMANDS.ADD_TRACKED_EXPENSE_TO_POLICY]: Parameters.AddTrackedExpenseToPolicyParams;
761763
[WRITE_COMMANDS.CATEGORIZE_TRACKED_EXPENSE]: Parameters.CategorizeTrackedExpenseParams;
762764
[WRITE_COMMANDS.SHARE_TRACKED_EXPENSE]: Parameters.ShareTrackedExpenseParams;
763765
[WRITE_COMMANDS.LEAVE_POLICY]: Parameters.LeavePolicyParams;

src/libs/actions/IOU.ts

+90-12
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ import {
126126
isOptimisticPersonalDetail,
127127
isPayAtEndExpenseReport as isPayAtEndExpenseReportReportUtils,
128128
isPayer as isPayerReportUtils,
129-
isPolicyExpenseChat as isPolicyExpenseChatReportUtils,
129+
isPolicyExpenseChat as isPolicyExpenseChatReportUtil,
130130
isReportApproved,
131131
isSelfDM,
132132
isSettled,
@@ -325,6 +325,8 @@ type RequestMoneyTransactionParams = {
325325
actionableWhisperReportActionID?: string;
326326
linkedTrackedExpenseReportAction?: OnyxTypes.ReportAction;
327327
linkedTrackedExpenseReportID?: string;
328+
waypoints?: WaypointCollection;
329+
customUnitRateID?: string;
328330
};
329331

330332
type PerDiemExpenseTransactionParams = {
@@ -4131,6 +4133,38 @@ const getConvertTrackedExpenseInformation = (
41314133
return {optimisticData, successData, failureData, modifiedExpenseReportActionID: modifiedExpenseReportAction.reportActionID};
41324134
};
41334135

4136+
type ConvertTrackedWorkspaceParams = {
4137+
category: string | undefined;
4138+
tag: string | undefined;
4139+
taxCode: string;
4140+
taxAmount: number;
4141+
billable: boolean | undefined;
4142+
policyID: string;
4143+
receipt: Receipt | undefined;
4144+
waypoints?: string;
4145+
customUnitRateID?: string;
4146+
};
4147+
4148+
type AddTrackedExpenseToPolicyParam = {
4149+
amount: number;
4150+
currency: string;
4151+
comment: string;
4152+
created: string;
4153+
merchant: string;
4154+
transactionID: string;
4155+
reimbursable: boolean;
4156+
actionableWhisperReportActionID: string;
4157+
moneyRequestReportID: string;
4158+
reportPreviewReportActionID: string;
4159+
modifiedExpenseReportActionID: string;
4160+
moneyRequestCreatedReportActionID: string | undefined;
4161+
moneyRequestPreviewReportActionID: string;
4162+
} & ConvertTrackedWorkspaceParams;
4163+
4164+
function addTrackedExpenseToPolicy(parameters: AddTrackedExpenseToPolicyParam, onyxData: OnyxData) {
4165+
API.write(WRITE_COMMANDS.ADD_TRACKED_EXPENSE_TO_POLICY, parameters, onyxData);
4166+
}
4167+
41344168
function convertTrackedExpenseToRequest(
41354169
payerAccountID: number,
41364170
payerEmail: string,
@@ -4152,6 +4186,7 @@ function convertTrackedExpenseToRequest(
41524186
merchant: string,
41534187
created: string,
41544188
attendees?: Attendee[],
4189+
workspaceParams?: ConvertTrackedWorkspaceParams,
41554190
) {
41564191
const {optimisticData, successData, failureData} = onyxData;
41574192

@@ -4174,6 +4209,28 @@ function convertTrackedExpenseToRequest(
41744209
successData?.push(...moveTransactionSuccessData);
41754210
failureData?.push(...moveTransactionFailureData);
41764211

4212+
if (workspaceParams) {
4213+
const params = {
4214+
amount,
4215+
currency,
4216+
comment,
4217+
created,
4218+
merchant,
4219+
reimbursable: true,
4220+
transactionID,
4221+
actionableWhisperReportActionID,
4222+
moneyRequestReportID,
4223+
moneyRequestCreatedReportActionID,
4224+
moneyRequestPreviewReportActionID,
4225+
modifiedExpenseReportActionID,
4226+
reportPreviewReportActionID,
4227+
...workspaceParams,
4228+
};
4229+
4230+
addTrackedExpenseToPolicy(params, {optimisticData, successData, failureData});
4231+
return;
4232+
}
4233+
41774234
const parameters = {
41784235
attendees,
41794236
amount,
@@ -4319,13 +4376,22 @@ function requestMoney(requestMoneyInformation: RequestMoneyInformation) {
43194376
actionableWhisperReportActionID,
43204377
linkedTrackedExpenseReportAction,
43214378
linkedTrackedExpenseReportID,
4379+
waypoints,
4380+
customUnitRateID,
43224381
} = transactionParams;
43234382

4383+
const sanitizedWaypoints = waypoints ? JSON.stringify(sanitizeRecentWaypoints(waypoints)) : undefined;
4384+
43244385
// If the report is iou or expense report, we should get the linked chat report to be passed to the getMoneyRequestInformation function
43254386
const isMoneyRequestReport = isMoneyRequestReportReportUtils(report);
43264387
const currentChatReport = isMoneyRequestReport ? getReportOrDraftReport(report?.chatReportID) : report;
43274388
const moneyRequestReportID = isMoneyRequestReport ? report?.reportID : '';
43284389
const isMovingTransactionFromTrackExpense = isMovingTransactionFromTrackExpenseIOUUtils(action);
4390+
const existingTransactionID =
4391+
isMovingTransactionFromTrackExpense && linkedTrackedExpenseReportAction && isMoneyRequestAction(linkedTrackedExpenseReportAction)
4392+
? getOriginalMessage(linkedTrackedExpenseReportAction)?.IOUTransactionID
4393+
: undefined;
4394+
const existingTransaction = allTransactions[`${ONYXKEYS.COLLECTION.TRANSACTION}${existingTransactionID}`];
43294395

43304396
const {
43314397
payerAccountID,
@@ -4346,10 +4412,8 @@ function requestMoney(requestMoneyInformation: RequestMoneyInformation) {
43464412
policyParams,
43474413
transactionParams,
43484414
moneyRequestReportID,
4349-
existingTransactionID:
4350-
isMovingTransactionFromTrackExpense && linkedTrackedExpenseReportAction && isMoneyRequestAction(linkedTrackedExpenseReportAction)
4351-
? getOriginalMessage(linkedTrackedExpenseReportAction)?.IOUTransactionID
4352-
: undefined,
4415+
existingTransactionID,
4416+
existingTransaction: isDistanceRequestTransactionUtils(existingTransaction) ? existingTransaction : undefined,
43534417
});
43544418
const activeReportID = isMoneyRequestReport ? report?.reportID : chatReport.reportID;
43554419

@@ -4358,7 +4422,20 @@ function requestMoney(requestMoneyInformation: RequestMoneyInformation) {
43584422
if (!linkedTrackedExpenseReportAction || !actionableWhisperReportActionID || !linkedTrackedExpenseReportID) {
43594423
return;
43604424
}
4361-
4425+
const workspaceParams =
4426+
isPolicyExpenseChatReportUtil(chatReport) && chatReport.policyID
4427+
? {
4428+
receipt: receipt instanceof Blob ? receipt : undefined,
4429+
category,
4430+
tag,
4431+
taxCode,
4432+
taxAmount,
4433+
billable,
4434+
policyID: chatReport.policyID,
4435+
waypoints: sanitizedWaypoints,
4436+
customUnitRateID,
4437+
}
4438+
: undefined;
43624439
convertTrackedExpenseToRequest(
43634440
payerAccountID,
43644441
payerEmail,
@@ -4380,6 +4457,7 @@ function requestMoney(requestMoneyInformation: RequestMoneyInformation) {
43804457
merchant,
43814458
created,
43824459
attendees,
4460+
workspaceParams,
43834461
);
43844462
break;
43854463
}
@@ -5044,7 +5122,7 @@ function createSplitsAndOnyxData(
50445122
const hasMultipleParticipants = participants.length > 1;
50455123
participants.forEach((participant) => {
50465124
// In a case when a participant is a workspace, even when a current user is not an owner of the workspace
5047-
const isPolicyExpenseChat = isPolicyExpenseChatReportUtils(participant);
5125+
const isPolicyExpenseChat = isPolicyExpenseChatReportUtil(participant);
50485126
const splitAmount = splitShares?.[participant.accountID ?? CONST.DEFAULT_NUMBER_ID]?.amount ?? calculateIOUAmount(participants.length, amount, currency, false);
50495127
const splitTaxAmount = calculateIOUAmount(participants.length, taxAmount, currency, false);
50505128

@@ -5670,7 +5748,7 @@ function startSplitBill({
56705748
});
56715749

56725750
participants.forEach((participant) => {
5673-
const isPolicyExpenseChat = isPolicyExpenseChatReportUtils(participant);
5751+
const isPolicyExpenseChat = isPolicyExpenseChatReportUtil(participant);
56745752
if (!isPolicyExpenseChat) {
56755753
return;
56765754
}
@@ -7279,7 +7357,7 @@ function getReportFromHoldRequestsOnyxData(
72797357
const newParentReportActionID = rand64();
72807358

72817359
const coefficient = isExpenseReport(iouReport) ? -1 : 1;
7282-
const isPolicyExpenseChat = isPolicyExpenseChatReportUtils(chatReport);
7360+
const isPolicyExpenseChat = isPolicyExpenseChatReportUtil(chatReport);
72837361
const holdAmount = ((iouReport?.total ?? 0) - (iouReport?.unheldTotal ?? 0)) * coefficient;
72847362
const holdNonReimbursableAmount = ((iouReport?.nonReimbursableTotal ?? 0) - (iouReport?.unheldNonReimbursableTotal ?? 0)) * coefficient;
72857363
const optimisticExpenseReport = isPolicyExpenseChat
@@ -7858,7 +7936,7 @@ function canIOUBePaid(
78587936
invoiceReceiverPolicy?: SearchPolicy,
78597937
shouldCheckApprovedState = true,
78607938
) {
7861-
const isPolicyExpenseChat = isPolicyExpenseChatReportUtils(chatReport);
7939+
const isPolicyExpenseChat = isPolicyExpenseChatReportUtil(chatReport);
78627940
const reportNameValuePairs = chatReportRNVP ?? getReportNameValuePairs(chatReport?.reportID);
78637941
const isChatReportArchived = isArchivedReport(reportNameValuePairs);
78647942
const iouSettled = isSettled(iouReport);
@@ -8826,8 +8904,8 @@ function setMoneyRequestParticipantsFromReport(transactionID: string, report: On
88268904
const shouldAddAsReport = !isEmptyObject(chatReport) && isSelfDM(chatReport);
88278905
let participants: Participant[] = [];
88288906

8829-
if (isPolicyExpenseChatReportUtils(chatReport) || shouldAddAsReport) {
8830-
participants = [{accountID: 0, reportID: chatReport?.reportID, isPolicyExpenseChat: isPolicyExpenseChatReportUtils(chatReport), selected: true}];
8907+
if (isPolicyExpenseChatReportUtil(chatReport) || shouldAddAsReport) {
8908+
participants = [{accountID: 0, reportID: chatReport?.reportID, isPolicyExpenseChat: isPolicyExpenseChatReportUtil(chatReport), selected: true}];
88318909
} else if (isInvoiceRoom(chatReport)) {
88328910
participants = [
88338911
{reportID: chatReport?.reportID, selected: true},

src/pages/iou/request/MoneyRequestParticipantsSelector.tsx

+2-3
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import useThemeStyles from '@hooks/useThemeStyles';
2222
import {canUseTouchScreen} from '@libs/DeviceCapabilities';
2323
import {isMovingTransactionFromTrackExpense} from '@libs/IOUUtils';
2424
import Navigation from '@libs/Navigation/Navigation';
25+
import type {Section} from '@libs/OptionsListUtils';
2526
import {
2627
filterAndOrderOptions,
2728
formatSectionsFromSearchTerm,
@@ -33,7 +34,6 @@ import {
3334
isCurrentUser,
3435
orderOptions,
3536
} from '@libs/OptionsListUtils';
36-
import type {Section} from '@libs/OptionsListUtils';
3737
import {isPaidGroupPolicy as isPaidGroupPolicyUtil} from '@libs/PolicyUtils';
3838
import type {OptionData} from '@libs/ReportUtils';
3939
import {isInvoiceRoom} from '@libs/ReportUtils';
@@ -115,8 +115,7 @@ function MoneyRequestParticipantsSelector({participants = CONST.EMPTY_ARRAY, onF
115115

116116
// If we are using this component in the "Submit expense" or the combined submit/track flow then we pass the includeOwnedWorkspaceChats argument so that the current user
117117
// sees the option to submit an expense from their admin on their own Workspace Chat.
118-
includeOwnedWorkspaceChats:
119-
(iouType === CONST.IOU.TYPE.SUBMIT || iouType === CONST.IOU.TYPE.CREATE || iouType === CONST.IOU.TYPE.SPLIT) && action !== CONST.IOU.ACTION.SUBMIT,
118+
includeOwnedWorkspaceChats: iouType === CONST.IOU.TYPE.SUBMIT || iouType === CONST.IOU.TYPE.CREATE || iouType === CONST.IOU.TYPE.SPLIT,
120119

121120
includeP2P: !isCategorizeOrShareAction,
122121
includeInvoiceRooms: iouType === CONST.IOU.TYPE.INVOICE,

src/pages/iou/request/step/IOURequestStepConfirmation.tsx

+15-1
Original file line numberDiff line numberDiff line change
@@ -277,10 +277,24 @@ function IOURequestStepConfirmation({
277277
actionableWhisperReportActionID: transaction.actionableWhisperReportActionID,
278278
linkedTrackedExpenseReportAction: transaction.linkedTrackedExpenseReportAction,
279279
linkedTrackedExpenseReportID: transaction.linkedTrackedExpenseReportID,
280+
waypoints: Object.keys(transaction.comment?.waypoints ?? {}).length ? getValidWaypoints(transaction.comment?.waypoints, true) : undefined,
281+
customUnitRateID,
280282
},
281283
});
282284
},
283-
[report, transaction, transactionTaxCode, transactionTaxAmount, currentUserPersonalDetails.login, currentUserPersonalDetails.accountID, policy, policyTags, policyCategories, action],
285+
[
286+
report,
287+
transaction,
288+
transactionTaxCode,
289+
transactionTaxAmount,
290+
currentUserPersonalDetails.login,
291+
currentUserPersonalDetails.accountID,
292+
policy,
293+
policyTags,
294+
policyCategories,
295+
action,
296+
customUnitRateID,
297+
],
284298
);
285299

286300
const submitPerDiemExpense = useCallback(

0 commit comments

Comments
 (0)