Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
20 changes: 17 additions & 3 deletions src/libs/actions/TransactionInlineEdit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,16 @@ import {
shouldEnableNegative,
} from '@libs/ReportUtils';
import {hasEnabledTags} from '@libs/TagsOptionsListUtils';
import {calculateTaxAmount, getCurrency, getOriginalTransactionWithSplitInfo, getTaxValue, isDistanceRequest, isExpenseUnreported, isScanning} from '@libs/TransactionUtils';
import {
calculateTaxAmount,
getCurrency,
getOriginalTransactionWithSplitInfo,
getTaxValue,
isDistanceRequest,
isExpenseUnreported,
isPerDiemRequest,
isScanning,
} from '@libs/TransactionUtils';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import type {
Expand Down Expand Up @@ -422,15 +431,20 @@ function getTransactionEditPermissions({
return false;
}

// Per diem amount is derived from the rate and cannot be edited
if (isPerDiemRequest(transaction)) {
return false;
}

// Amount field shows "Scanning..." during SmartScan
if (isTransactionScanning) {
return false;
}
}

if (field === CONST.EDIT_REQUEST_FIELD.MERCHANT) {
// Distance expenses cannot have their merchant edited
if (isDistanceRequest(transaction)) {
// Distance and per diem expenses cannot have their merchant edited
if (isDistanceRequest(transaction) || isPerDiemRequest(transaction)) {
return false;
}

Expand Down
48 changes: 48 additions & 0 deletions tests/unit/inlineEditing/TransactionInlineEdit.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,36 @@ describe('getTransactionEditPermissions', () => {
});
});

describe('per diem requests', () => {
it('should disable amount and merchant for per diem requests', () => {
const perDiemTransaction: Transaction = {
...baseTransaction,
reportID: CONST.REPORT.UNREPORTED_REPORT_ID,
comment: {
type: CONST.TRANSACTION.TYPE.CUSTOM_UNIT,
customUnit: {
name: CONST.CUSTOM_UNITS.NAME_PER_DIEM_INTERNATIONAL,
},
},
};

const permissions = getTransactionEditPermissions({
...baseUnreportedParams,
transaction: perDiemTransaction,
});

expect(permissions).toMatchObject({
canEditCategory: true,
canEditDate: true,
canEditDescription: true,
canEditTag: true,
// Amount and merchant are derived from the rate and cannot be edited
canEditAmount: false,
canEditMerchant: false,
} satisfies TransactionEditPermissions);
});
});

describe('split expenses', () => {
it('should handle field permissions correctly for split expense children', () => {
const splitTransaction: Transaction = {
Expand Down Expand Up @@ -360,6 +390,24 @@ describe('getTransactionEditPermissions', () => {
} satisfies Partial<TransactionEditPermissions>);
});

it('should respect per diem request restrictions', () => {
const permissions = getTransactionEditPermissions({
...baseUnreportedParams,
transaction: {
...unreportedTransaction,
comment: {
type: CONST.TRANSACTION.TYPE.CUSTOM_UNIT,
customUnit: {name: CONST.CUSTOM_UNITS.NAME_PER_DIEM_INTERNATIONAL},
},
},
});

expect(permissions).toMatchObject({
canEditAmount: false,
canEditMerchant: false,
} satisfies Partial<TransactionEditPermissions>);
});

it('should disable category editing when workspace selection is required', () => {
const permissions = getTransactionEditPermissions({
...baseUnreportedParams,
Expand Down
Loading