Skip to content

Commit c871c1f

Browse files
authored
Merge pull request #87993 from dominictb/fix/time-expenses-are-created-with-tax
Fix: Time expenses are created with tax
2 parents d733b1f + cd63c40 commit c871c1f

3 files changed

Lines changed: 40 additions & 1 deletion

File tree

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,7 @@ function IOURequestStepConfirmation({
270270
isCategorizingTrackExpense,
271271
isSharingTrackExpense,
272272
isUnreported,
273+
isPolicyExpenseChat,
273274
draftTransactionIDs,
274275
privateIsArchivedMap,
275276
backToReport,

src/pages/iou/request/step/confirmation/useExpenseSubmission.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import dismissModalAndOpenReportInInboxTabHelper from '@libs/Navigation/helpers/
2323
import navigateAfterExpenseCreate from '@libs/Navigation/helpers/navigateAfterExpenseCreate';
2424
import Navigation from '@libs/Navigation/Navigation';
2525
import {rand64, roundToTwoDecimalPlaces} from '@libs/NumberUtils';
26+
import {isTaxTrackingEnabled} from '@libs/PolicyUtils';
2627
import {findSelfDMReportID, generateReportID, getReportOrDraftReport, hasViolations as hasViolationsReportUtils, isMoneyRequestReport, isSelectedManagerMcTest} from '@libs/ReportUtils';
2728
import {endSpan, getSpan, startSpan} from '@libs/telemetry/activeSpans';
2829
import markSubmitExpenseEnd from '@libs/telemetry/markSubmitExpenseEnd';
@@ -111,6 +112,7 @@ type UseExpenseSubmissionParams = {
111112
isCategorizingTrackExpense: boolean;
112113
isSharingTrackExpense: boolean;
113114
isUnreported: boolean;
115+
isPolicyExpenseChat: boolean;
114116

115117
// Onyx values
116118
draftTransactionIDs: string[] | undefined;
@@ -144,6 +146,7 @@ function useExpenseSubmission(params: UseExpenseSubmissionParams) {
144146
isCategorizingTrackExpense,
145147
isSharingTrackExpense,
146148
isUnreported,
149+
isPolicyExpenseChat,
147150
draftTransactionIDs,
148151
privateIsArchivedMap,
149152
backToReport,
@@ -219,7 +222,9 @@ function useExpenseSubmission(params: UseExpenseSubmissionParams) {
219222
const customUnitRateID = getRateID(transaction) ?? '';
220223
const transactionDistance = isManualDistanceRequest || isOdometerDistanceRequest || isGPSDistanceRequest ? (transaction?.comment?.customUnit?.quantity ?? undefined) : undefined;
221224
const defaultTaxCode = getDefaultTaxCode(policy, transaction);
222-
const transactionTaxCode = (transaction?.taxCode ? transaction?.taxCode : defaultTaxCode) ?? '';
225+
const transactionTaxCode = isTaxTrackingEnabled(isPolicyExpenseChat || isUnreported, policy, isDistanceRequest, isPerDiemRequest, isTimeRequest)
226+
? ((transaction?.taxCode ? transaction?.taxCode : defaultTaxCode) ?? '')
227+
: '';
223228
const transactionTaxAmount = transaction?.taxAmount ?? 0;
224229
const transactionTaxValue = transaction?.taxValue ?? getTaxValue(policy, transaction, transactionTaxCode) ?? '';
225230

tests/ui/TimeExpenseConfirmationTest.tsx

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,22 @@ function createPolicyWithTimeTracking(): Policy {
123123
...createRandomPolicy(1, CONST.POLICY.TYPE.CORPORATE, 'Test Policy'),
124124
id: POLICY_ID,
125125
outputCurrency: CONST.CURRENCY.USD,
126+
tax: {
127+
trackingEnabled: true,
128+
},
129+
taxRates: {
130+
defaultExternalID: 'TAX_RATE_1',
131+
defaultValue: '10%',
132+
foreignTaxDefault: 'TAX_RATE_2',
133+
name: 'Tax',
134+
taxes: {
135+
TAX_RATE_1: {
136+
name: 'Tax Rate 1',
137+
value: '10%',
138+
isDisabled: false,
139+
},
140+
},
141+
},
126142
units: {
127143
time: {
128144
enabled: true,
@@ -340,6 +356,23 @@ describe('TimeExpenseConfirmationTest', () => {
340356
expect(requestMoney).toHaveBeenCalled();
341357
});
342358

359+
it('should not apply default tax code to time expenses', async () => {
360+
await setupTransaction();
361+
362+
renderConfirmation();
363+
await waitForBatchedUpdatesWithAct();
364+
365+
const submitButton = screen.getByText(/create.*expense/i);
366+
fireEvent.press(submitButton);
367+
await waitForBatchedUpdatesWithAct();
368+
369+
expect(requestMoney).toHaveBeenCalled();
370+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
371+
const callArgs = (requestMoney as jest.Mock).mock.calls.at(0)?.[0] as {transactionParams: {taxCode: string; taxAmount: number}};
372+
expect(callArgs.transactionParams.taxCode).toBe('');
373+
expect(callArgs.transactionParams.taxAmount).toBe(0);
374+
});
375+
343376
it('should show error when rate and hours result in too large amount', async () => {
344377
await setupTransaction({
345378
comment: {

0 commit comments

Comments
 (0)