Skip to content

Commit 1e8a04c

Browse files
authored
Merge pull request #94137 from linhvovan29546/refactor/66418-remove-deprecatedAllTransactions-in-getTransactionReportName
Refactor: remove deprecatedAllTransactions in getTransactionReportName
2 parents c144f62 + 4e0f969 commit 1e8a04c

5 files changed

Lines changed: 232 additions & 25 deletions

File tree

src/libs/ReportNameUtils.ts

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ type ComputeReportName = {
175175
report?: Report;
176176
reports?: OnyxCollection<Report>;
177177
policies?: OnyxCollection<Policy>;
178-
transactions?: OnyxCollection<Transaction>;
178+
transactions: OnyxCollection<Transaction>;
179179
allReportNameValuePairs?: OnyxCollection<ReportNameValuePairs>;
180180
allPolicyTags?: OnyxCollection<PolicyTagLists>;
181181
personalDetailsList?: PersonalDetailsList;
@@ -839,10 +839,10 @@ function computeChatThreadReportName(
839839
report: Report,
840840
reports: OnyxCollection<Report>,
841841
currentUserLogin: string,
842+
transactions: OnyxCollection<Transaction>,
842843
parentReportAction?: ReportAction,
843844
policyTags?: OnyxEntry<PolicyTagLists>,
844845
policy?: OnyxEntry<Policy>,
845-
transactions?: OnyxCollection<Transaction>,
846846
): string | undefined {
847847
if (!isChatThread(report)) {
848848
return undefined;
@@ -857,15 +857,11 @@ function computeChatThreadReportName(
857857
if (!isEmptyObject(parentReportAction) && isTransactionThread(parentReportAction)) {
858858
const linkedTransactionID = getLinkedTransactionID(parentReportAction);
859859
const linkedTransaction = linkedTransactionID ? transactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${linkedTransactionID}`] : undefined;
860-
let linkedTransactions: Transaction[] | undefined;
861-
if (transactions) {
862-
linkedTransactions = linkedTransaction ? [linkedTransaction] : [];
863-
}
864860
const linkedTransactionReport = linkedTransaction?.reportID ? reports?.[`${ONYXKEYS.COLLECTION.REPORT}${linkedTransaction.reportID}`] : undefined;
865861
let formattedName = getTransactionReportName({
866862
translate,
867863
reportAction: parentReportAction,
868-
transactions: linkedTransactions,
864+
linkedTransaction,
869865
report: linkedTransactionReport,
870866
});
871867

@@ -999,10 +995,10 @@ function computeReportName({
999995
report,
1000996
reports ?? {},
1001997
currentUserLogin ?? '',
998+
transactions,
1002999
parentReportAction,
10031000
policyTags,
10041001
reportPolicy,
1005-
transactions,
10061002
);
10071003
if (chatThreadReportName) {
10081004
return chatThreadReportName;

src/libs/ReportUtils.ts

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5467,12 +5467,12 @@ function shouldShowRBRForMissingSmartscanFields(iouReport: OnyxEntry<Report>, io
54675467
function getTransactionReportName({
54685468
translate,
54695469
reportAction,
5470-
transactions,
5470+
linkedTransaction,
54715471
report,
54725472
}: {
54735473
translate: LocalizedTranslate;
54745474
reportAction: OnyxEntry<ReportAction | OptimisticIOUReportAction>;
5475-
transactions?: Transaction[];
5475+
linkedTransaction: OnyxEntry<Transaction>;
54765476
report: OnyxEntry<Report>;
54775477
}): string {
54785478
if (reportAction && isReversedTransaction(reportAction)) {
@@ -5483,36 +5483,34 @@ function getTransactionReportName({
54835483
return translate('parentReportAction.deletedExpense');
54845484
}
54855485

5486-
const transaction = reportAction ? getLinkedTransaction(reportAction, transactions) : transactions?.at(0);
5487-
5488-
if (isEmptyObject(transaction)) {
5486+
if (isEmptyObject(linkedTransaction)) {
54895487
// Transaction data might be empty on app's first load, if so we fallback to Expense/Track Expense
54905488
return isTrackExpenseAction(reportAction) ? translate('iou.createExpense') : translate('iou.expense');
54915489
}
54925490

5493-
if (isScanning(transaction)) {
5491+
if (isScanning(linkedTransaction)) {
54945492
return translate('iou.receiptScanning', {count: 1});
54955493
}
54965494

5497-
if (hasMissingSmartscanFieldsTransactionUtils(transaction, report)) {
5495+
if (hasMissingSmartscanFieldsTransactionUtils(linkedTransaction, report)) {
54985496
return translate('iou.receiptMissingDetails');
54995497
}
5500-
if (isFetchingWaypointsFromServer(transaction) && getMerchant(transaction) === translate('iou.fieldPending')) {
5498+
if (isFetchingWaypointsFromServer(linkedTransaction) && getMerchant(linkedTransaction) === translate('iou.fieldPending')) {
55015499
return translate('iou.fieldPending');
55025500
}
55035501

55045502
// The unit does not matter as we are only interested in whether the distance is zero or not
5505-
if (isMapDistanceRequest(transaction) && !getDistanceInMeters(transaction, CONST.CUSTOM_UNITS.DISTANCE_UNIT_KILOMETERS) && !hasReceiptTransactionUtils(transaction)) {
5503+
if (isMapDistanceRequest(linkedTransaction) && !getDistanceInMeters(linkedTransaction, CONST.CUSTOM_UNITS.DISTANCE_UNIT_KILOMETERS) && !hasReceiptTransactionUtils(linkedTransaction)) {
55065504
return translate('violations.noRoute');
55075505
}
55085506

55095507
if (isSentMoneyReportAction(reportAction)) {
5510-
return getIOUReportActionDisplayMessage(translate, reportAction as ReportAction, transaction);
5508+
return getIOUReportActionDisplayMessage(translate, reportAction as ReportAction, linkedTransaction);
55115509
}
55125510

5513-
const amount = getTransactionAmount(transaction, !isEmptyObject(report) && isExpenseReport(report), transaction?.reportID === CONST.REPORT.UNREPORTED_REPORT_ID) ?? 0;
5514-
const formattedAmount = convertToDisplayString(amount, getCurrency(transaction)) ?? '';
5515-
const comment = getMerchantOrDescription(transaction);
5511+
const amount = getTransactionAmount(linkedTransaction, !isEmptyObject(report) && isExpenseReport(report), linkedTransaction?.reportID === CONST.REPORT.UNREPORTED_REPORT_ID) ?? 0;
5512+
const formattedAmount = convertToDisplayString(amount, getCurrency(linkedTransaction)) ?? '';
5513+
const comment = getMerchantOrDescription(linkedTransaction);
55165514
return translate('iou.threadExpenseReportName', formattedAmount, Parser.htmlToText(comment));
55175515
}
55185516

src/pages/TransactionMerge/MergeTransactionsListContent.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ function MergeTransactionsListContent({transactionID, mergeTransaction}: MergeTr
130130
? getTransactionReportName({
131131
translate,
132132
reportAction: undefined,
133-
transactions: [targetTransaction],
133+
linkedTransaction: targetTransaction,
134134
report: getReportOrDraftReport(targetTransaction?.reportID, targetTransactionReport ? [targetTransactionReport] : [], undefined, undefined, targetTransactionReport),
135135
})
136136
: '';

tests/unit/ReportNameUtilsTest.ts

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import ONYXKEYS from '@src/ONYXKEYS';
1818
import type {PersonalDetailsList, Policy, PolicyTagLists, Report, ReportAction, ReportActions, ReportAttributesDerivedValue, ReportNameValuePairs, Transaction} from '@src/types/onyx';
1919
import createRandomPolicy from '../utils/collections/policies';
2020
import {createAdminRoom, createExpenseReport, createPolicyExpenseChat, createRegularChat, createRegularTaskReport, createSelfDM, createWorkspaceThread} from '../utils/collections/reports';
21+
import createRandomTransaction from '../utils/collections/transaction';
2122
import {fakePersonalDetails} from '../utils/LHNTestUtils';
2223
import {formatPhoneNumber} from '../utils/TestHelper';
2324
import waitForBatchedUpdates from '../utils/waitForBatchedUpdates';
@@ -549,6 +550,7 @@ describe('ReportNameUtils', () => {
549550
report: thread,
550551
reports: emptyCollections.reports,
551552
policies: emptyCollections.policies,
553+
transactions: {},
552554
personalDetailsList: participantsPersonalDetails,
553555
reportActions: reportActionsCollection,
554556
currentUserAccountID,
@@ -1288,4 +1290,132 @@ describe('ReportNameUtils', () => {
12881290
expect(reportName).not.toBe('');
12891291
});
12901292
});
1293+
1294+
describe('computeReportName - Transaction thread with linkedTransaction', () => {
1295+
test('returns formatted expense name for transaction thread', () => {
1296+
const transactionID = '999';
1297+
const parentReportID = '100';
1298+
const parentReportActionID = '200';
1299+
const expenseReportID = '300';
1300+
1301+
const thread: Report = {
1302+
...createWorkspaceThread(60),
1303+
parentReportID,
1304+
parentReportActionID,
1305+
};
1306+
1307+
const parentAction: ReportAction = {
1308+
actionName: CONST.REPORT.ACTIONS.TYPE.IOU,
1309+
reportActionID: parentReportActionID,
1310+
message: [{type: 'TEXT', text: 'test'}],
1311+
created: '2024-01-01 00:00:00',
1312+
lastModified: '',
1313+
actorAccountID: 1,
1314+
person: [],
1315+
originalMessage: {
1316+
type: CONST.IOU.REPORT_ACTION_TYPE.CREATE,
1317+
IOUTransactionID: transactionID,
1318+
IOUReportID: expenseReportID,
1319+
amount: 2500,
1320+
currency: CONST.CURRENCY.USD,
1321+
participantAccountIDs: [1, 2],
1322+
},
1323+
} as ReportAction;
1324+
1325+
const transaction: Transaction = {
1326+
...createRandomTransaction(1),
1327+
transactionID,
1328+
reportID: expenseReportID,
1329+
merchant: 'Coffee Shop',
1330+
modifiedMerchant: '',
1331+
amount: -2500,
1332+
currency: CONST.CURRENCY.USD,
1333+
comment: {comment: ''},
1334+
};
1335+
1336+
const reportActionsCollection: Record<string, ReportActions> = {
1337+
[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${parentReportID}`]: {
1338+
[parentReportActionID]: parentAction,
1339+
},
1340+
};
1341+
1342+
const transactionsCollection: Record<string, Transaction> = {
1343+
[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`]: transaction,
1344+
};
1345+
1346+
const expenseReport: Report = {
1347+
...createExpenseReport(300),
1348+
reportID: expenseReportID,
1349+
type: CONST.REPORT.TYPE.EXPENSE,
1350+
};
1351+
1352+
const reportsCollection: Record<string, Report> = {
1353+
[`${ONYXKEYS.COLLECTION.REPORT}${parentReportID}`]: createRegularChat(100, [1, 2]),
1354+
[`${ONYXKEYS.COLLECTION.REPORT}${expenseReportID}`]: expenseReport,
1355+
};
1356+
1357+
const name = computeReportName(
1358+
thread,
1359+
reportsCollection,
1360+
emptyCollections.policies,
1361+
transactionsCollection,
1362+
undefined,
1363+
participantsPersonalDetails,
1364+
reportActionsCollection,
1365+
currentUserAccountID,
1366+
);
1367+
1368+
expect(name).toContain('$25.00');
1369+
expect(name).toContain('Coffee Shop');
1370+
});
1371+
1372+
test('returns expense fallback when transaction is not in collection', () => {
1373+
const transactionID = '888';
1374+
const parentReportID = '101';
1375+
const parentReportActionID = '201';
1376+
1377+
const thread: Report = {
1378+
...createWorkspaceThread(61),
1379+
parentReportID,
1380+
parentReportActionID,
1381+
};
1382+
1383+
const parentAction: ReportAction = {
1384+
actionName: CONST.REPORT.ACTIONS.TYPE.IOU,
1385+
reportActionID: parentReportActionID,
1386+
message: [{type: 'TEXT', text: 'test'}],
1387+
created: '2024-01-01 00:00:00',
1388+
lastModified: '',
1389+
actorAccountID: 1,
1390+
person: [],
1391+
originalMessage: {
1392+
type: CONST.IOU.REPORT_ACTION_TYPE.CREATE,
1393+
IOUTransactionID: transactionID,
1394+
IOUReportID: '301',
1395+
amount: 1000,
1396+
currency: CONST.CURRENCY.USD,
1397+
participantAccountIDs: [1, 2],
1398+
},
1399+
} as ReportAction;
1400+
1401+
const reportActionsCollection: Record<string, ReportActions> = {
1402+
[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${parentReportID}`]: {
1403+
[parentReportActionID]: parentAction,
1404+
},
1405+
};
1406+
1407+
const name = computeReportName(
1408+
thread,
1409+
emptyCollections.reports,
1410+
emptyCollections.policies,
1411+
{},
1412+
undefined,
1413+
participantsPersonalDetails,
1414+
reportActionsCollection,
1415+
currentUserAccountID,
1416+
);
1417+
1418+
expect(name).toBe(translate(CONST.LOCALES.EN, 'iou.expense'));
1419+
});
1420+
});
12911421
});

tests/unit/ReportUtilsTest.ts

Lines changed: 86 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12929,7 +12929,7 @@ describe('ReportUtils', () => {
1292912929
const result = getTransactionReportName({
1293012930
translate: translateLocal,
1293112931
reportAction: undefined,
12932-
transactions: [transaction],
12932+
linkedTransaction: transaction,
1293312933
report: mockTransactionReport,
1293412934
});
1293512935

@@ -12949,7 +12949,7 @@ describe('ReportUtils', () => {
1294912949
const result = getTransactionReportName({
1295012950
translate: translateLocal,
1295112951
reportAction: undefined,
12952-
transactions: [transaction],
12952+
linkedTransaction: transaction,
1295312953
report: mockTransactionReport,
1295412954
});
1295512955

@@ -12965,6 +12965,7 @@ describe('ReportUtils', () => {
1296512965
const result = getTransactionReportName({
1296612966
translate: translateLocal,
1296712967
reportAction,
12968+
linkedTransaction: undefined,
1296812969
report: mockTransactionReport,
1296912970
});
1297012971

@@ -12979,6 +12980,7 @@ describe('ReportUtils', () => {
1297912980
const result = getTransactionReportName({
1298012981
translate: translateLocal,
1298112982
reportAction,
12983+
linkedTransaction: undefined,
1298212984
report: mockTransactionReport,
1298312985
});
1298412986

@@ -12997,13 +12999,94 @@ describe('ReportUtils', () => {
1299712999
const result = getTransactionReportName({
1299813000
translate: translateLocal,
1299913001
reportAction: undefined,
13000-
transactions: [transaction],
13002+
linkedTransaction: transaction,
1300113003
report: mockTransactionReport,
1300213004
});
1300313005

1300413006
expect(result).toBeDefined();
1300513007
expect(typeof result).toBe('string');
1300613008
});
13009+
13010+
test('returns expense fallback when linkedTransaction is empty and reportAction is not track expense', () => {
13011+
const result = getTransactionReportName({
13012+
translate: translateLocal,
13013+
reportAction: undefined,
13014+
linkedTransaction: undefined,
13015+
report: mockTransactionReport,
13016+
});
13017+
13018+
expect(result).toBe(translateLocal('iou.expense'));
13019+
});
13020+
13021+
test('returns create expense fallback when linkedTransaction is empty and reportAction is track expense', () => {
13022+
const reportAction = createRandomReportAction(1);
13023+
jest.spyOn(require('@libs/ReportActionsUtils'), 'isTrackExpenseAction').mockReturnValueOnce(true);
13024+
13025+
const result = getTransactionReportName({
13026+
translate: translateLocal,
13027+
reportAction,
13028+
linkedTransaction: undefined,
13029+
report: mockTransactionReport,
13030+
});
13031+
13032+
expect(result).toBe(translateLocal('iou.createExpense'));
13033+
});
13034+
13035+
test('returns scanning message when transaction is being scanned', () => {
13036+
const transaction: Transaction = {
13037+
...createRandomTransaction(1),
13038+
reportID: mockReportID,
13039+
};
13040+
jest.spyOn(require('@libs/TransactionUtils'), 'isScanning').mockReturnValueOnce(true);
13041+
13042+
const result = getTransactionReportName({
13043+
translate: translateLocal,
13044+
reportAction: undefined,
13045+
linkedTransaction: transaction,
13046+
report: mockTransactionReport,
13047+
});
13048+
13049+
expect(result).toBe(translateLocal('iou.receiptScanning', {count: 1}));
13050+
});
13051+
13052+
test('returns missing details message when smartscan fields are missing', () => {
13053+
const transaction: Transaction = {
13054+
...createRandomTransaction(1),
13055+
reportID: mockReportID,
13056+
};
13057+
jest.spyOn(require('@libs/TransactionUtils'), 'hasMissingSmartscanFields').mockReturnValueOnce(true);
13058+
13059+
const result = getTransactionReportName({
13060+
translate: translateLocal,
13061+
reportAction: undefined,
13062+
linkedTransaction: transaction,
13063+
report: mockTransactionReport,
13064+
});
13065+
13066+
expect(result).toBe(translateLocal('iou.receiptMissingDetails'));
13067+
});
13068+
13069+
test('returns formatted amount and merchant for normal expense', () => {
13070+
const transaction: Transaction = {
13071+
...createRandomTransaction(1),
13072+
reportID: mockReportID,
13073+
merchant: 'Coffee Shop',
13074+
modifiedMerchant: '',
13075+
comment: {comment: ''},
13076+
amount: -2500,
13077+
currency: CONST.CURRENCY.USD,
13078+
};
13079+
13080+
const result = getTransactionReportName({
13081+
translate: translateLocal,
13082+
reportAction: undefined,
13083+
linkedTransaction: transaction,
13084+
report: mockTransactionReport,
13085+
});
13086+
13087+
expect(result).toContain('Coffee Shop');
13088+
expect(result).toContain('$25.00');
13089+
});
1300713090
});
1300813091

1300913092
describe('buildOptimisticExpenseReport', () => {

0 commit comments

Comments
 (0)