diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index e0c474e3d8fb..6b22c48ac534 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -1,3 +1,4 @@ +import {format} from 'date-fns'; import ExpensiMark from 'expensify-common/lib/ExpensiMark'; import Str from 'expensify-common/lib/str'; import {isEmpty} from 'lodash'; @@ -1996,6 +1997,13 @@ function getFormulaTypeReportField(reportFields: PolicyReportFields) { return Object.values(reportFields).find((field) => field.type === 'formula'); } +/** + * Given a set of report fields, return the field that refers to title + */ +function getTitleReportField(reportFields: PolicyReportFields) { + return Object.values(reportFields).find((field) => isReportFieldOfTypeTitle(field)); +} + /** * Get the report fields attached to the policy given policyID */ @@ -2904,6 +2912,26 @@ function buildOptimisticIOUReport(payeeAccountID: number, payerAccountID: number }; } +/** + * Populates the report field formula with the values from the report and policy. + * Currently, is supports only optimistic expense reports. + * Each formula field is either replaced with a value, or removed. + * If after all replacements the formula is empty, the original formula is returned. + */ +function populateOptimisticReportFormula(formula: string, report: OptimisticExpenseReport, policy: Policy | EmptyObject): string { + const result = formula + .replaceAll('{report:id}', report.reportID) + // We don't translate because the server response is always in English + .replaceAll('{report:type}', 'Expense Report') + .replaceAll('{report:startdate}', report.lastVisibleActionCreated ? format(new Date(report.lastVisibleActionCreated), CONST.DATE.FNS_FORMAT_STRING) : '') + .replaceAll('{report:total}', report.total?.toString() ?? '') + .replaceAll('{report:currency}', report.currency ?? '') + .replaceAll('{report:policyname}', policy.name ?? '') + .replaceAll(/\{report:(.+)}/g, ''); + + return result.trim().length ? result : formula; +} + /** * Builds an optimistic Expense report with a randomly generated reportID * @@ -2913,7 +2941,6 @@ function buildOptimisticIOUReport(payeeAccountID: number, payerAccountID: number * @param total - Amount in cents * @param currency */ - function buildOptimisticExpenseReport(chatReportID: string, policyID: string, payeeAccountID: number, total: number, currency: string): OptimisticExpenseReport { // The amount for Expense reports are stored as negative value in the database const storedTotal = total * -1; @@ -2934,7 +2961,6 @@ function buildOptimisticExpenseReport(chatReportID: string, policyID: string, pa type: CONST.REPORT.TYPE.EXPENSE, ownerAccountID: payeeAccountID, currency, - // We don't translate reportName because the server response is always in English reportName: `${policyName} owes ${formattedTotal}`, stateNum, @@ -2950,6 +2976,11 @@ function buildOptimisticExpenseReport(chatReportID: string, policyID: string, pa expenseReport.managerID = policy.submitsTo; } + const titleReportField = getTitleReportField(getReportFieldsByPolicyID(policyID) ?? {}); + if (!!titleReportField && reportFieldsEnabled(expenseReport)) { + expenseReport.reportName = populateOptimisticReportFormula(titleReportField.defaultValue, expenseReport, policy); + } + return expenseReport; }