From 298273147e1934756c09cf45de7e0a2ca58a3cb5 Mon Sep 17 00:00:00 2001 From: Mohammad Jafarinejad <71210799+mohammadjafarinejad@users.noreply.github.com> Date: Thu, 21 May 2026 14:52:11 +0400 Subject: [PATCH 1/2] fix: inline merchant field is not disabled for unreported per diem expense --- src/libs/actions/TransactionInlineEdit.ts | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/libs/actions/TransactionInlineEdit.ts b/src/libs/actions/TransactionInlineEdit.ts index de926c3759e1..2ae25330776b 100644 --- a/src/libs/actions/TransactionInlineEdit.ts +++ b/src/libs/actions/TransactionInlineEdit.ts @@ -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 { @@ -422,6 +431,11 @@ 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; @@ -429,8 +443,8 @@ function getTransactionEditPermissions({ } 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; } From 04fee98d8c0583545cf96b6ead9baa25199e9850 Mon Sep 17 00:00:00 2001 From: Mohammad Jafarinejad <71210799+mohammadjafarinejad@users.noreply.github.com> Date: Thu, 21 May 2026 15:00:05 +0400 Subject: [PATCH 2/2] test: add per diem request permissions validation --- .../TransactionInlineEdit.test.ts | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/tests/unit/inlineEditing/TransactionInlineEdit.test.ts b/tests/unit/inlineEditing/TransactionInlineEdit.test.ts index f74c358017c1..c90c02cf7e84 100644 --- a/tests/unit/inlineEditing/TransactionInlineEdit.test.ts +++ b/tests/unit/inlineEditing/TransactionInlineEdit.test.ts @@ -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 = { @@ -360,6 +390,24 @@ describe('getTransactionEditPermissions', () => { } satisfies Partial); }); + 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); + }); + it('should disable category editing when workspace selection is required', () => { const permissions = getTransactionEditPermissions({ ...baseUnreportedParams,