Skip to content

Commit c8905f0

Browse files
committed
Merge branch 'main' of https://github.com/samarroy84/App into fix/75248
2 parents 49350b4 + 94bc056 commit c8905f0

7 files changed

Lines changed: 40 additions & 23 deletions

File tree

.github/workflows/deploy.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ jobs:
355355
needs: prep
356356
runs-on: macos-15-xlarge
357357
env:
358-
DEVELOPER_DIR: /Applications/Xcode_16.4.0.app/Contents/Developer
358+
DEVELOPER_DIR: /Applications/Xcode_26.0.app/Contents/Developer
359359
SHOULD_BUILD_APP: ${{ github.ref == 'refs/heads/staging' || fromJSON(needs.prep.outputs.IS_CHERRY_PICK) }}
360360
steps:
361361
- name: Checkout

.github/workflows/verifyHybridApp.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ jobs:
113113
name: Verify iOS HybridApp builds on main
114114
runs-on: macos-15-xlarge
115115
env:
116-
DEVELOPER_DIR: /Applications/Xcode_16.4.0.app/Contents/Developer
116+
DEVELOPER_DIR: /Applications/Xcode_26.0.app/Contents/Developer
117117
# Only run on pull requests that are *not* on a fork
118118
if: ${{ !github.event.pull_request.head.repo.fork && github.event_name == 'pull_request' }}
119119
steps:

src/components/MoneyRequestConfirmationList.tsx

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -297,27 +297,29 @@ function MoneyRequestConfirmationList({
297297
const isTypeInvoice = iouType === CONST.IOU.TYPE.INVOICE;
298298
const isScanRequest = useMemo(() => isScanRequestUtil(transaction), [transaction]);
299299
const isCreateExpenseFlow = !!transaction?.isFromGlobalCreate && !isPerDiemRequest;
300+
const isMovingTransactionFromTrackExpense = isMovingTransactionFromTrackExpenseUtil(action);
300301

301302
const transactionID = transaction?.transactionID;
302303
const customUnitRateID = getRateID(transaction);
303304

304305
const subRates = transaction?.comment?.customUnit?.subRates ?? [];
306+
const defaultRate = defaultMileageRate?.customUnitRateID;
307+
const lastSelectedRate = policy?.id ? (lastSelectedDistanceRates?.[policy.id] ?? defaultRate) : defaultRate;
305308

306309
useEffect(() => {
307-
if (customUnitRateID !== '-1' || !isDistanceRequest || !transactionID || !policy?.id) {
310+
if (
311+
!['-1', CONST.CUSTOM_UNITS.FAKE_P2P_ID].includes(customUnitRateID) ||
312+
!isDistanceRequest ||
313+
!isPolicyExpenseChat ||
314+
!transactionID ||
315+
!lastSelectedRate ||
316+
isMovingTransactionFromTrackExpense
317+
) {
308318
return;
309319
}
310320

311-
const defaultRate = defaultMileageRate?.customUnitRateID;
312-
const lastSelectedRate = lastSelectedDistanceRates?.[policy.id] ?? defaultRate;
313-
const rateID = lastSelectedRate;
314-
315-
if (!rateID) {
316-
return;
317-
}
318-
319-
setCustomUnitRateID(transactionID, rateID);
320-
}, [defaultMileageRate, customUnitRateID, lastSelectedDistanceRates, policy?.id, transactionID, isDistanceRequest]);
321+
setCustomUnitRateID(transactionID, lastSelectedRate);
322+
}, [customUnitRateID, transactionID, lastSelectedRate, isDistanceRequest, isPolicyExpenseChat, isMovingTransactionFromTrackExpense]);
321323

322324
const mileageRate = DistanceRequestUtils.getRate({transaction, policy, policyDraft});
323325
const rate = mileageRate.rate;
@@ -350,8 +352,6 @@ function MoneyRequestConfirmationList({
350352
setMoneyRequestTaxRate(transactionID, defaultTaxCode);
351353
}, [defaultTaxCode, transactionID, isReadOnly]);
352354

353-
const isMovingTransactionFromTrackExpense = isMovingTransactionFromTrackExpenseUtil(action);
354-
355355
const distance = getDistanceInMeters(transaction, unit);
356356
const prevDistance = usePrevious(distance);
357357

src/libs/ReportPrimaryActionUtils.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,8 +195,10 @@ function isExportAction(report: Report, policy?: Policy, reportActions?: ReportA
195195
return false;
196196
}
197197

198+
const isAdmin = policy?.role === CONST.POLICY.ROLE.ADMIN;
199+
198200
const isReportExporter = isPreferredExporter(policy);
199-
if (!isReportExporter) {
201+
if (!isReportExporter && !isAdmin) {
200202
return false;
201203
}
202204

src/libs/ReportUtils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6592,7 +6592,7 @@ function buildOptimisticInvoiceReport(
65926592
// We don't translate reportName because the server response is always in English
65936593
reportName: `${receiverName} owes ${formattedTotal}`,
65946594
stateNum: CONST.REPORT.STATE_NUM.SUBMITTED,
6595-
statusNum: CONST.REPORT.STATUS_NUM.OPEN,
6595+
statusNum: CONST.REPORT.STATUS_NUM.SUBMITTED,
65966596
total: total * -1,
65976597
participants: {
65986598
[receiverAccountID]: {

src/libs/actions/Policy/Member.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -321,9 +321,8 @@ function resetAccountingPreferredExporter(policyID: string, loginList: string[])
321321
if (!adminLoginList.length) {
322322
return {optimisticData, successData, failureData};
323323
}
324-
325324
for (const connection of connections) {
326-
const exporter = policy?.connections?.[connection]?.config.export.exporter;
325+
const exporter = policy?.connections?.[connection]?.config?.export?.exporter;
327326
if (!exporter || !adminLoginList.includes(exporter)) {
328327
continue;
329328
}
@@ -357,7 +356,7 @@ function resetAccountingPreferredExporter(policyID: string, loginList: string[])
357356
connections: {
358357
[connection]: {
359358
config: {
360-
export: {exporter: policy?.connections?.[connection]?.config.export.exporter},
359+
export: {exporter},
361360
pendingFields: {[pendingFieldKey]: null},
362361
},
363362
},
@@ -366,7 +365,7 @@ function resetAccountingPreferredExporter(policyID: string, loginList: string[])
366365
});
367366
}
368367

369-
const exporter = policy?.connections?.netsuite?.options.config.exporter;
368+
const exporter = policy?.connections?.netsuite?.options?.config?.exporter;
370369
if (exporter && adminLoginList.includes(exporter)) {
371370
optimisticData.push({
372371
onyxMethod: Onyx.METHOD.MERGE,
@@ -385,7 +384,7 @@ function resetAccountingPreferredExporter(policyID: string, loginList: string[])
385384
failureData.push({
386385
onyxMethod: Onyx.METHOD.MERGE,
387386
key: policyKey,
388-
value: {connections: {netsuite: {options: {config: {exporter: policy?.connections?.netsuite?.options.config.exporter, pendingFields: {exporter: null}}}}}},
387+
value: {connections: {netsuite: {options: {config: {exporter, pendingFields: {exporter: null}}}}}},
389388
});
390389
}
391390

tests/unit/ReportUtilsTest.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import {
2424
buildOptimisticChatReport,
2525
buildOptimisticCreatedReportAction,
2626
buildOptimisticExpenseReport,
27+
buildOptimisticInvoiceReport,
2728
buildOptimisticIOUReportAction,
2829
buildOptimisticReportPreview,
2930
buildParticipantsFromAccountIDs,
@@ -1662,7 +1663,7 @@ describe('ReportUtils', () => {
16621663
currency: 'USD',
16631664
},
16641665
};
1665-
1666+
// eslint-disable-next-line @typescript-eslint/no-deprecated
16661667
const transaction: SearchTransaction = {
16671668
transactionID: 'txn1',
16681669
reportID: '2',
@@ -1671,6 +1672,7 @@ describe('ReportUtils', () => {
16711672
merchant: 'Test Merchant',
16721673
created: testDate,
16731674
modifiedMerchant: 'Test Merchant',
1675+
// eslint-disable-next-line @typescript-eslint/no-deprecated
16741676
} as SearchTransaction;
16751677

16761678
const reportName = getSearchReportName({
@@ -9410,6 +9412,20 @@ describe('ReportUtils', () => {
94109412
expect(reason).toBe(CONST.REPORT_IN_LHN_REASONS.DEFAULT);
94119413
await Onyx.clear();
94129414
});
9415+
9416+
it('should create an invoice report with SUBMITTED status the same BE response', () => {
9417+
const mockChatReportID = 'chat-report-123';
9418+
const mockPolicyID = 'policy-456';
9419+
const mockReceiverAccountID = 789;
9420+
const mockReceiverName = 'John Doe';
9421+
const mockTotal = 100;
9422+
const mockCurrency = 'USD';
9423+
const optimisticInvoiceReport = buildOptimisticInvoiceReport(mockChatReportID, mockPolicyID, mockReceiverAccountID, mockReceiverName, mockTotal, mockCurrency);
9424+
9425+
expect(optimisticInvoiceReport.statusNum).toBe(CONST.REPORT.STATUS_NUM.SUBMITTED);
9426+
expect(optimisticInvoiceReport.stateNum).toBe(CONST.REPORT.STATE_NUM.SUBMITTED);
9427+
});
9428+
94139429
it('should surface a GBR when copiloted into an approver account with a report with outstanding child request', async () => {
94149430
await Onyx.clear();
94159431

0 commit comments

Comments
 (0)