Skip to content

Align Sage Intacct export date constants with backend REPORT_* names - #102118

Merged
francoisl merged 4 commits into
mainfrom
claude-sageIntacctExportDateNaming
Oct 8, 2026
Merged

francoisl merged 4 commits into
mainfrom
claude-sageIntacctExportDateNaming

Conversation

@MelvinBot

@MelvinBot MelvinBot commented Sep 24, 2026 •

Copy link
Copy Markdown
Contributor

Explanation of Change

CONST.SAGE_INTACCT_EXPORT_DATE used the bare names EXPORTED / SUBMITTED, but the backend export logic uses REPORT_EXPORTED / REPORT_SUBMITTED. Both the Sage Intacct export summary row and the export date picker interpolate the raw stored config value into a translation key (workspace.sageIntacct.exportDate.values.<value>.label), so a workspace whose export date was set outside NewDot asks for a key that exists in no locale file — a hard throw in dev builds, and a Log.alert plus garbled label text on production. Sage Intacct was the only accounting integration still on the old naming; Xero, QuickBooks, Certinia, Rillet and DualEntry already match the backend.

This PR:

  1. Renames SAGE_INTACCT_EXPORT_DATE.EXPORTED → REPORT_EXPORTED and SUBMITTED → REPORT_SUBMITTED so the constant mirrors XERO_EXPORT_DATE, which also fixes the write path — the picker builds its rows from Object.values(CONST.SAGE_INTACCT_EXPORT_DATE) and previously could only ever send EXPORTED / SUBMITTED to UpdateSageIntacctExportDate.
  2. Updates the matching workspace.sageIntacct.exportDate.values.* keys in all 11 locale files. They are computed properties, so the rename carries through; the existing copy is unchanged.
  3. Adds a temporary Onyx migration, RenameLegacySageIntacctExportDate, that rewrites any locally cached policy still holding EXPORTED / SUBMITTED to the matching REPORT_* value. The backend has already migrated the stored values, so only stale client caches can still hold the old names. The migration can be removed after about a month.

No change was needed in DynamicSageIntacctExportPage.tsx or SageIntacctDatePage.tsx — both derive everything from the constant — and no API change either, since the UpdateSageIntacctExportDate value param is typed as a plain string. SageIntacctExportConfig.exportDate is already ValueOf<typeof CONST.SAGE_INTACCT_EXPORT_DATE>, so it follows the rename.

AI tests run locally
  • npm run typecheck — passed
  • npm run lint on the changed files — passed
  • npm test -- tests/unit/RenameLegacySageIntacctExportDateTest.ts — 3 passed (both legacy values rewritten, other export config fields kept, current values and non-Sage Intacct policies untouched)
  • Earlier run on the rename itself: npm test for translation and accounting suites (TranslateTest, TranslatorTest, AccountingUtilsTest, PolicyConnectionsTest, PolicyUtilsTest, PolicyAccountingPageAutoStartFlowTest and related) — passed
  • Web smoke check on this branch — the app builds, loads, and Workspace → Accounting renders with no error. The Sage Intacct Export page itself is not reachable on a test account, since it requires a real Sage Intacct connection.

Fixed Issues

$ #101276
PROPOSAL: #101276 (comment)

Tests

// TODO: The human co-author must fill out the tests they ran before marking this PR as "ready for review". Testing this change needs a workspace connected to Sage Intacct whose export date was set outside NewDot, which was not available in the automated environment.

  • Verify that no errors appear in the JS console

Offline tests

QA Steps

  1. Open a workspace with Sage Intacct accounting connection.
  2. Go to accounting.
  3. Click on Export > Export date.
  4. Verify that you can change the setting without any issues.
  • Verify that no errors appear in the JS console

PR Author Checklist

  • I linked the correct issue in the ### Fixed Issues section above
  • I wrote clear testing steps that cover the changes made in this PR
    • I added steps for local testing in the Tests section
    • I added steps for the expected offline behavior in the Offline steps section
    • I added steps for Staging and/or Production testing in the QA steps section
    • I added steps to cover failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
    • I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
    • I tested this PR with a High Traffic account against the staging or production API to ensure there are no regressions (e.g. long loading states that impact usability).
  • I included screenshots or videos for tests on all platforms
  • I ran the tests on all platforms & verified they passed on:
    • Android: Native
    • Android: mWeb Chrome
    • iOS: Native
    • iOS: mWeb Safari
    • MacOS: Chrome / Safari
  • I verified there are no console errors (if there's a console error not related to the PR, report it or open an issue for it to be fixed)
  • I followed proper code patterns (see Reviewing the code)
    • I verified that comments were added to code that is not self explanatory
    • I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
    • I verified any copy / text that was added to the app is grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I followed the guidelines as stated in the Review Guidelines
  • I tested other components that can be impacted by my changes (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar are working as expected)
  • If a new CSS style is added I verified that:
    • A similar style doesn't already exist
    • The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))
  • If new assets were added or existing ones were modified, I verified that:
    • The assets are optimized and compressed (for SVG files, run npm run compress-svg)
    • The assets load correctly across all supported platforms.
  • If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
  • If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected)
  • If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
  • If the PR modifies a component or page that can be accessed by a direct deeplink, I verified that the code functions as expected when the deeplink is used - from a logged in and logged out account.
  • If the PR modifies the UI (e.g. new buttons, new UI components, changing the padding/spacing/sizing, moving components, etc) or modifies the form input styles:
    • I verified that all the inputs inside a form are aligned with each other.
    • I added Design label and/or tagged @Expensify/design so the design team can review the changes.
  • I added unit tests for any new feature or bug fix in this PR to help automatically prevent regressions in this user flow.
  • If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.

Screenshots/Videos

Android: Native
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari

Co-authored-by: Shubham Agrawal <shubham1206agra@users.noreply.github.com>
@OSBotify

Copy link
Copy Markdown
Contributor

🦜 Polyglot Parrot! 🦜

Squawk! Looks like you added some shiny new English strings. Allow me to parrot them back to you in other tongues:

View the translation diff
diff --git a/src/languages/de.ts b/src/languages/de.ts
index 8f5880e7..19466270 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -5321,25 +5321,27 @@ ${amount} für ${merchant} – ${date}`,
                 description: 'Verwende dieses Datum beim Exportieren von Reports nach Sage Intacct.',
                 values: {
                     [CONST.SAGE_INTACCT_EXPORT_DATE.LAST_EXPENSE]: {
-                        label: 'Datum der letzten Ausgabe',
-                        description: 'Datum der letzten Ausgabe im Bericht.',
+                        label: 'Eingereichtes Datum',
+                        description: 'Datum, an dem der Bericht zur Genehmigung eingereicht wurde.',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE.REPORT_EXPORTED]: {
-                        label: 'Exportdatum',
-                        description: 'Datum, an dem der Bericht nach Sage Intacct exportiert wurde.',
+                        label: 'Eingereichtes Datum',
+                        description: 'Datum, an dem der Bericht zur Genehmigung eingereicht wurde.',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE.REPORT_SUBMITTED]: {
                         label: 'Eingereichtes Datum',
                         description: 'Datum, an dem der Bericht zur Genehmigung eingereicht wurde.',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE_LEGACY.EXPORTED]: {
-                        label: 'Exportdatum',
-                        description: 'Datum, an dem der Bericht nach Sage Intacct exportiert wurde.',
+                        label: 'Eingereichtes Datum',
+                        description: 'Datum, an dem der Bericht zur Genehmigung eingereicht wurde.',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE_LEGACY.SUBMITTED]: {
                         label: 'Eingereichtes Datum',
                         description: 'Datum, an dem der Bericht zur Genehmigung eingereicht wurde.',
                     },
+                    label: 'Eingereichtes Datum',
+                    description: 'Datum, an dem der Bericht zur Genehmigung eingereicht wurde.',
                 },
             },
             reimbursableExpenses: {
diff --git a/src/languages/el.ts b/src/languages/el.ts
index 731203f1..0806b2e9 100644
--- a/src/languages/el.ts
+++ b/src/languages/el.ts
@@ -5399,25 +5399,27 @@ ${amount} για ${merchant} - ${date}`,
                 description: 'Χρησιμοποιήστε αυτήν την ημερομηνία κατά την εξαγωγή αναφορών στο Sage Intacct.',
                 values: {
                     [CONST.SAGE_INTACCT_EXPORT_DATE.LAST_EXPENSE]: {
-                        label: 'Ημερομηνία τελευταίας δαπάνης',
-                        description: 'Ημερομηνία της πιο πρόσφατης δαπάνης στην αναφορά.',
+                        label: 'Ημερομηνία υποβολής',
+                        description: 'Ημερομηνία υποβολής της αναφοράς για έγκριση.',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE.REPORT_EXPORTED]: {
-                        label: 'Ημερομηνία εξαγωγής',
-                        description: 'Ημερομηνία εξαγωγής της αναφοράς στο Sage Intacct.',
+                        label: 'Ημερομηνία υποβολής',
+                        description: 'Ημερομηνία υποβολής της αναφοράς για έγκριση.',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE.REPORT_SUBMITTED]: {
                         label: 'Ημερομηνία υποβολής',
                         description: 'Ημερομηνία υποβολής της αναφοράς για έγκριση.',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE_LEGACY.EXPORTED]: {
-                        label: 'Ημερομηνία εξαγωγής',
-                        description: 'Ημερομηνία εξαγωγής της αναφοράς στο Sage Intacct.',
+                        label: 'Ημερομηνία υποβολής',
+                        description: 'Ημερομηνία υποβολής της αναφοράς για έγκριση.',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE_LEGACY.SUBMITTED]: {
                         label: 'Ημερομηνία υποβολής',
                         description: 'Ημερομηνία υποβολής της αναφοράς για έγκριση.',
                     },
+                    label: 'Ημερομηνία υποβολής',
+                    description: 'Ημερομηνία υποβολής της αναφοράς για έγκριση.',
                 },
             },
             reimbursableExpenses: {
diff --git a/src/languages/es.ts b/src/languages/es.ts
index 849db936..5823c6a9 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -5252,25 +5252,27 @@ ${amount} para ${merchant} - ${date}`,
                 description: 'Utilice esta fecha cuando exporte informes a Sage Intacct.',
                 values: {
                     [CONST.SAGE_INTACCT_EXPORT_DATE.LAST_EXPENSE]: {
-                        label: 'Fecha del último gasto',
-                        description: 'Fecha del gasto más reciente del informe.',
+                        label: 'Fecha de envío',
+                        description: 'Fecha en que se envió el informe para su aprobación.',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE.REPORT_EXPORTED]: {
-                        label: 'Fecha de exportación',
-                        description: 'Fecha en la que se exportó el informe a Sage Intacct.',
+                        label: 'Fecha de envío',
+                        description: 'Fecha en que se envió el informe para su aprobación.',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE.REPORT_SUBMITTED]: {
                         label: 'Fecha de envío',
-                        description: 'Fecha de presentación del informe para su aprobación.',
+                        description: 'Fecha en que se envió el informe para su aprobación.',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE_LEGACY.EXPORTED]: {
-                        label: 'Fecha de exportación',
-                        description: 'Fecha en la que se exportó el informe a Sage Intacct.',
+                        label: 'Fecha de envío',
+                        description: 'Fecha en que se envió el informe para su aprobación.',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE_LEGACY.SUBMITTED]: {
                         label: 'Fecha de envío',
-                        description: 'Fecha de presentación del informe para su aprobación.',
+                        description: 'Fecha en que se envió el informe para su aprobación.',
                     },
+                    label: 'Fecha de envío',
+                    description: 'Fecha en que se envió el informe para su aprobación.',
                 },
             },
             reimbursableExpenses: {
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index d8a0860f..d6f26c60 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -5328,25 +5328,27 @@ ${amount} pour ${merchant} - ${date}`,
                 description: 'Utiliser cette date lors de l’exportation des notes de frais vers Sage Intacct.',
                 values: {
                     [CONST.SAGE_INTACCT_EXPORT_DATE.LAST_EXPENSE]: {
-                        label: 'Date de la dernière dépense',
-                        description: 'Date de la dépense la plus récente sur la note de frais.',
+                        label: 'Date de soumission',
+                        description: 'Date à laquelle la note de frais a été soumise pour approbation.',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE.REPORT_EXPORTED]: {
-                        label: 'Date d’exportation',
-                        description: 'Date à laquelle la note de frais a été exportée vers Sage Intacct.',
+                        label: 'Date de soumission',
+                        description: 'Date à laquelle la note de frais a été soumise pour approbation.',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE.REPORT_SUBMITTED]: {
                         label: 'Date de soumission',
                         description: 'Date à laquelle la note de frais a été soumise pour approbation.',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE_LEGACY.EXPORTED]: {
-                        label: 'Date d’exportation',
-                        description: 'Date à laquelle la note de frais a été exportée vers Sage Intacct.',
+                        label: 'Date de soumission',
+                        description: 'Date à laquelle la note de frais a été soumise pour approbation.',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE_LEGACY.SUBMITTED]: {
                         label: 'Date de soumission',
                         description: 'Date à laquelle la note de frais a été soumise pour approbation.',
                     },
+                    label: 'Date de soumission',
+                    description: 'Date à laquelle la note de frais a été soumise pour approbation.',
                 },
             },
             reimbursableExpenses: {
diff --git a/src/languages/it.ts b/src/languages/it.ts
index 1a7c0998..0ea97993 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -5286,25 +5286,27 @@ ${amount} per ${merchant} - ${date}`,
                 description: 'Usa questa data quando esporti i report su Sage Intacct.',
                 values: {
                     [CONST.SAGE_INTACCT_EXPORT_DATE.LAST_EXPENSE]: {
-                        label: "Data dell'ultima spesa",
-                        description: 'Data della spesa più recente nel rendiconto.',
+                        label: 'Data di invio',
+                        description: 'Data in cui il report è stato inviato per l’approvazione.',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE.REPORT_EXPORTED]: {
-                        label: 'Data di esportazione',
-                        description: 'Data in cui il report è stato esportato in Sage Intacct.',
+                        label: 'Data di invio',
+                        description: 'Data in cui il report è stato inviato per l’approvazione.',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE.REPORT_SUBMITTED]: {
                         label: 'Data di invio',
-                        description: "Data in cui il report è stato inviato per l'approvazione.",
+                        description: 'Data in cui il report è stato inviato per l’approvazione.',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE_LEGACY.EXPORTED]: {
-                        label: 'Data di esportazione',
-                        description: 'Data in cui il report è stato esportato in Sage Intacct.',
+                        label: 'Data di invio',
+                        description: 'Data in cui il report è stato inviato per l’approvazione.',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE_LEGACY.SUBMITTED]: {
                         label: 'Data di invio',
-                        description: "Data in cui il report è stato inviato per l'approvazione.",
+                        description: 'Data in cui il report è stato inviato per l’approvazione.',
                     },
+                    label: 'Data di invio',
+                    description: 'Data in cui il report è stato inviato per l’approvazione.',
                 },
             },
             reimbursableExpenses: {
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index 6ff38579..8a8c4cc1 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -5240,25 +5240,27 @@ ${integrationName === CONST.ONBOARDING_ACCOUNTING_MAPPING.other ? 'あなたの'
                 description: 'Sage Intacct へレポートをエクスポートする際は、この日付を使用します。',
                 values: {
                     [CONST.SAGE_INTACCT_EXPORT_DATE.LAST_EXPENSE]: {
-                        label: '最終経費の日付',
-                        description: 'レポート内で最新の経費の日付。',
+                        label: '提出日',
+                        description: 'レポートが承認申請として提出された日付です。',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE.REPORT_EXPORTED]: {
-                        label: 'エクスポート日',
-                        description: 'レポートが Sage Intacct にエクスポートされた日付。',
+                        label: '提出日',
+                        description: 'レポートが承認申請として提出された日付です。',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE.REPORT_SUBMITTED]: {
                         label: '提出日',
-                        description: 'レポートが承認申請として提出された日付。',
+                        description: 'レポートが承認申請として提出された日付です。',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE_LEGACY.EXPORTED]: {
-                        label: 'エクスポート日',
-                        description: 'レポートが Sage Intacct にエクスポートされた日付。',
+                        label: '提出日',
+                        description: 'レポートが承認申請として提出された日付です。',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE_LEGACY.SUBMITTED]: {
                         label: '提出日',
-                        description: 'レポートが承認申請として提出された日付。',
+                        description: 'レポートが承認申請として提出された日付です。',
                     },
+                    label: '提出日',
+                    description: 'レポートが承認申請として提出された日付です。',
                 },
             },
             reimbursableExpenses: {
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index e35fee72..07f4f8ca 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -5284,25 +5284,27 @@ ${amount} voor ${merchant} - ${date}`,
                 description: 'Gebruik deze datum bij het exporteren van rapporten naar Sage Intacct.',
                 values: {
                     [CONST.SAGE_INTACCT_EXPORT_DATE.LAST_EXPENSE]: {
-                        label: 'Datum van laatste uitgave',
-                        description: 'Datum van de meest recente uitgave in het rapport.',
+                        label: 'Datum ingediend',
+                        description: 'Datum waarop het rapport ter goedkeuring is ingediend.',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE.REPORT_EXPORTED]: {
-                        label: 'Exportdatum',
-                        description: 'Datum waarop het rapport is geëxporteerd naar Sage Intacct.',
+                        label: 'Datum ingediend',
+                        description: 'Datum waarop het rapport ter goedkeuring is ingediend.',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE.REPORT_SUBMITTED]: {
-                        label: 'Ingediend op datum',
+                        label: 'Datum ingediend',
                         description: 'Datum waarop het rapport ter goedkeuring is ingediend.',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE_LEGACY.EXPORTED]: {
-                        label: 'Exportdatum',
-                        description: 'Datum waarop het rapport is geëxporteerd naar Sage Intacct.',
+                        label: 'Datum ingediend',
+                        description: 'Datum waarop het rapport ter goedkeuring is ingediend.',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE_LEGACY.SUBMITTED]: {
-                        label: 'Ingediend op datum',
+                        label: 'Datum ingediend',
                         description: 'Datum waarop het rapport ter goedkeuring is ingediend.',
                     },
+                    label: 'Datum ingediend',
+                    description: 'Datum waarop het rapport ter goedkeuring is ingediend.',
                 },
             },
             reimbursableExpenses: {
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index 333c07b2..70813c35 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -5312,25 +5312,27 @@ ${amount} dla ${merchant} - ${date}`,
                 description: 'Użyj tej daty podczas eksportowania raportów do Sage Intacct.',
                 values: {
                     [CONST.SAGE_INTACCT_EXPORT_DATE.LAST_EXPENSE]: {
-                        label: 'Data ostatniego wydatku',
-                        description: 'Data najnowszego wydatku w raporcie.',
+                        label: 'Data wysłania',
+                        description: 'Data przesłania raportu do zatwierdzenia.',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE.REPORT_EXPORTED]: {
-                        label: 'Data eksportu',
-                        description: 'Data wyeksportowania raportu do Sage Intacct.',
+                        label: 'Data wysłania',
+                        description: 'Data przesłania raportu do zatwierdzenia.',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE.REPORT_SUBMITTED]: {
                         label: 'Data wysłania',
                         description: 'Data przesłania raportu do zatwierdzenia.',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE_LEGACY.EXPORTED]: {
-                        label: 'Data eksportu',
-                        description: 'Data wyeksportowania raportu do Sage Intacct.',
+                        label: 'Data wysłania',
+                        description: 'Data przesłania raportu do zatwierdzenia.',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE_LEGACY.SUBMITTED]: {
                         label: 'Data wysłania',
                         description: 'Data przesłania raportu do zatwierdzenia.',
                     },
+                    label: 'Data wysłania',
+                    description: 'Data przesłania raportu do zatwierdzenia.',
                 },
             },
             reimbursableExpenses: {
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index 753b2b3e..115ce1b4 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -5279,25 +5279,27 @@ ${amount} para ${merchant} - ${date}`,
                 description: 'Use esta data ao exportar relatórios para o Sage Intacct.',
                 values: {
                     [CONST.SAGE_INTACCT_EXPORT_DATE.LAST_EXPENSE]: {
-                        label: 'Data da última despesa',
-                        description: 'Data da despesa mais recente no relatório.',
+                        label: 'Data de envio',
+                        description: 'Data em que o relatório foi enviado para aprovação.',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE.REPORT_EXPORTED]: {
-                        label: 'Data de exportação',
-                        description: 'Data em que o relatório foi exportado para o Sage Intacct.',
+                        label: 'Data de envio',
+                        description: 'Data em que o relatório foi enviado para aprovação.',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE.REPORT_SUBMITTED]: {
                         label: 'Data de envio',
                         description: 'Data em que o relatório foi enviado para aprovação.',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE_LEGACY.EXPORTED]: {
-                        label: 'Data de exportação',
-                        description: 'Data em que o relatório foi exportado para o Sage Intacct.',
+                        label: 'Data de envio',
+                        description: 'Data em que o relatório foi enviado para aprovação.',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE_LEGACY.SUBMITTED]: {
                         label: 'Data de envio',
                         description: 'Data em que o relatório foi enviado para aprovação.',
                     },
+                    label: 'Data de envio',
+                    description: 'Data em que o relatório foi enviado para aprovação.',
                 },
             },
             reimbursableExpenses: {
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index df622694..e05e047c 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -5108,25 +5108,27 @@ ${amount},商户:${merchant} - 日期:${date}`,
                 description: '将导出报表到 Sage Intacct 时使用此日期。',
                 values: {
                     [CONST.SAGE_INTACCT_EXPORT_DATE.LAST_EXPENSE]: {
-                        label: '上次报销日期',
-                        description: '报表中最近一笔报销的日期。',
+                        label: '提交日期',
+                        description: '报表提交审批的日期。',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE.REPORT_EXPORTED]: {
-                        label: '导出日期',
-                        description: '报表导出到 Sage Intacct 的日期。',
+                        label: '提交日期',
+                        description: '报表提交审批的日期。',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE.REPORT_SUBMITTED]: {
                         label: '提交日期',
                         description: '报表提交审批的日期。',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE_LEGACY.EXPORTED]: {
-                        label: '导出日期',
-                        description: '报表导出到 Sage Intacct 的日期。',
+                        label: '提交日期',
+                        description: '报表提交审批的日期。',
                     },
                     [CONST.SAGE_INTACCT_EXPORT_DATE_LEGACY.SUBMITTED]: {
                         label: '提交日期',
                         description: '报表提交审批的日期。',
                     },
+                    label: '提交日期',
+                    description: '报表提交审批的日期。',
                 },
             },
             reimbursableExpenses: {

Note

You can apply these changes to your branch by copying the patch to your clipboard, then running pbpaste | git apply 😉

View workflow run

@MelvinBot

MelvinBot commented Sep 24, 2026 •

Copy link
Copy Markdown
Contributor Author

🤖 Android test steps verification results: ⚠️ partial

The app loaded and Workspace → Accounting rendered without error on standalone Android NewDot, but Sage Intacct is behind the Control-plan paywall on the test account, so the actual change in this PR — the REPORT_EXPORTED / REPORT_SUBMITTED export date labels — could not be exercised on-device. Note the Tests and QA Steps sections of this PR are still // TODO, so the only documented step was "verify no console errors"; the rest came from the repro steps in Sage Intacct – export date page crashes when the config value is REPORT_EXPORTED or REPORT_SUBMITTED, which require a Sage Intacct connection set up in Expensify Classic.

Sage Intacct locked behind Control-plan upgrade paywall

Step Status
App loads with no JS console / runtime errorsHome screen rendered fully (Inbox, recent expenses, Concierge prompt box). App log from session start showed only benign emulator noise (CameraX "no available camera" warnings, RN SurfaceMountingManager MissingViewState soft exceptions, background NVP/Onyx retries) — no redbox, FATAL EXCEPTION, TypeError, or ReferenceError.
Home screen after app load
✅
Open Workspaces, create/open a workspace, Accounting page renders with no errorNo workspaces existed on this fresh test account; created one via New workspace → Confirm. Workspace settings sidebar rendered. Enabled the Accounting toggle under More features, then opened Workspace → Accounting — the connections list rendered cleanly with no error banner.
New workspace created, settings sidebar shown
Workspace Accounting page with connection list
✅
Report what connection options are shown on Workspace → AccountingNine connections listed, each with a Connect button: QuickBooks Online, Intuit Enterprise Suite, QuickBooks Desktop, Xero (with an "Offer available!" badge), NetSuite, Sage Intacct, Certinia, Rillet, DualEntry.
Workspace Accounting page with connection list
✅
Sage Intacct → Export → Export date options and labelsBlocked. Tapping Connect next to Sage Intacct opened an "Unlock this feature" paywall stating the integration requires the Control plan at $9/member/month, with Upgrade and Learn more. No way to complete a connection on this account's plan, so Export → Export date was unreachable and the label rename could not be checked.
Sage Intacct locked behind Control-plan upgrade paywall
❌
No console errors during navigation (Home → Workspaces → new workspace → More features → Accounting → Sage Intacct)Reviewed app.log from a marker at session start through the end of navigation. Only recurring non-fatal noise: CameraX "No available camera can be found" (emulator has no camera), RN SurfaceMountingManager MissingViewState soft exceptions, and expected background API retries. No FATAL EXCEPTION, redbox, TypeError, or ReferenceError.
✅

What this does and does not prove: no regression was introduced in app startup or the Accounting page, but the renamed constants were never rendered, so this run is not evidence the fix works. Verifying it needs a Control-plan workspace connected to Sage Intacct with its export date set to Exported Date or Submitted Date in Expensify Classic. shubham1206agra — if you can point me at an account with that setup, or upgrade the test account's plan, I can re-run step 4 and capture the export date labels.


view run · view recording

@MelvinBot

MelvinBot commented Sep 24, 2026 •

Copy link
Copy Markdown
Contributor Author

🤖 Web test steps verification results: ⚠️ partial

The app loaded cleanly and the Workspace Accounting page rendered correctly with no errors, but Sage Intacct's Export date screen could not be verified because the test workspace is on the Collect plan, which gates Sage Intacct behind an Upgrade paywall. Same outcome as the Android run. The Tests and QA Steps sections of this PR are still // TODO, so the only documented step was "verify no console errors"; the rest came from the repro steps in Sage Intacct – export date page crashes when the config value is REPORT_EXPORTED or REPORT_SUBMITTED, which require a Sage Intacct connection set up in Expensify Classic.

Accounting page after returning from the blocked Sage Intacct attempt, no error state

Step Status
The app loads and no JS console errors appearApp rendered fully (nav, workspace overview, admin room) after completing onboarding. agent-device does not expose a console-log read command for web sessions (logs returns UNSUPPORTED_OPERATION), so this was corroborated via a network dump showing only HTTP 200 responses across 200+ requests with zero 4xx/5xx, plus the absence of any error banner or toast in every screenshot.
App loaded showing Workspace Overview and admin room, no errors
✅
Open Workspaces, open/create a workspace, Accounting page renders with no errorOnboarding auto-created a workspace. Enabled the Accounting feature via More features, then opened the Accounting tab — it rendered a Connections section with the accounting-software connect options and no error state.
Workspace Accounting page rendered with Connections list
✅
Report what connection options are shown on Workspace → AccountingSix options listed, each with a Connect button: QuickBooks Online, Intuit Enterprise Suite, QuickBooks Desktop, Xero (with an "Offer available!" badge), NetSuite, Sage Intacct. Note this differs from the Android run, which listed nine — Certinia, Rillet and DualEntry also appeared there.
Accounting connection options list
✅
Sage Intacct → Export → Export date options and labelsBlocked. Clicking Connect next to Sage Intacct opened an Upgrade paywall stating the integration is only available on the Control plan at $9/member/month, and this workspace is on Collect. No Export or Export date screen was reachable, so the renamed constants could not be inspected. The tester stopped at the Upgrade screen rather than clicking through to a billing flow.
Sage Intacct connect blocked by Control-plan Upgrade paywall
❌
No console errors at any point during navigationNo error banners or toasts in any screenshot during onboarding, the Accounting page load, or the Sage Intacct upgrade prompt. Network dump across the full session showed exclusively HTTP 200. Caveat as above: true browser console inspection was unavailable for this web session, so this verdict rests on the network proxy and the visual absence of error UI.
Accounting page after returning from the blocked Sage Intacct attempt
✅

What this does and does not prove: no regression in app load or the Accounting page on web, but the renamed constants were never rendered, so neither this run nor the Android run is evidence the fix works. Both platforms stop at the same wall.

shubham1206agra — to actually verify this, the test account needs a Control-plan workspace connected to Sage Intacct with its export date set to Exported Date or Submitted Date in Expensify Classic. Point me at an account with that setup and I can re-run step 4 on either platform. Worth noting one caveat on the console-error step: agent-device can't read the browser console on web, so that ✅ is inferred from network responses and the absence of error UI, not from a direct console read.


view run · view recording

Comment thread src/CONST/index.ts Outdated
* Values NewDot used to write for the Sage Intacct export date before it was aligned with the backend's REPORT_* names.
* Only used to keep rendering a label for workspaces that still hold one of them.
*/
SAGE_INTACCT_EXPORT_DATE_LEGACY: {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@MelvinBot We have to add fix selected option when the selected option is the legacy one in export date config of Sage Intacct.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We fixed the incorrect values in the database so we can skip this I think

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@francoisl We can write a migration instead cause there will be some users with this value in Onyx. This will be a temporary measure which we can remove in a month.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah ok, works for me!

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@MelvinBot Go for the Onyx migration instead here since BE has already migrated the values.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done. I pushed 2d5e0de, which replaces the runtime mapping with an Onyx migration.

  • Added RenameLegacySageIntacctExportDate. On startup it rewrites any cached policy whose Sage Intacct exportDate is EXPORTED or SUBMITTED to the matching REPORT_* value. It is registered last in migrateOnyx.ts. The legacy names live only in that file, so you can remove it in a month by deleting the file and its import.
  • Removed getSageIntacctExportDate, CONST.SAGE_INTACCT_EXPORT_DATE_LEGACY, the widened SageIntacctExportDate type, and ConnectionUtilsTest. Both Sage Intacct pages, SageIntacct.ts, and Policy.ts now match main again. The PR's only remaining change there is the REPORT_* rename.
  • Added RenameLegacySageIntacctExportDateTest (3 cases). Typecheck and lint pass. I also updated the PR description to match.

The export date picker builds its rows from CONST.SAGE_INTACCT_EXPORT_DATE, so a workspace
still holding the legacy EXPORTED / SUBMITTED matched no row and showed nothing selected.

Add getSageIntacctExportDate, which maps the legacy values onto their REPORT_* equivalents
and returns undefined for anything it does not recognize. Both read sites go through it, so
the picker selects the right option and the export summary renders the right label. That
makes the legacy locale entries unreachable, so drop them from all 11 locale files.

Co-authored-by: Shubham Agrawal <shubham1206agra@users.noreply.github.com>
@codecov

codecov Bot commented Sep 24, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ Changes either increased or maintained existing code coverage, great job!

Files with missing lines Coverage Δ
src/CONST/index.ts 95.86% <ø> (ø)
src/libs/migrateOnyx.ts 100.00% <ø> (ø)
...bs/migrations/RenameLegacySageIntacctExportDate.ts 100.00% <100.00%> (ø)
... and 14 files with indirect coverage changes

@MelvinBot

Copy link
Copy Markdown
Contributor Author

Done — pushed as 99c3f39.

You were right that the selected option was broken. The picker builds its rows from Object.values(CONST.SAGE_INTACCT_EXPORT_DATE), so on a workspace still holding EXPORTED / SUBMITTED the isSelected check matched no row at all: the list rendered with nothing selected and no initially-focused option.

The fix: a single getSageIntacctExportDate that maps EXPORTED → REPORT_EXPORTED and SUBMITTED → REPORT_SUBMITTED, and returns undefined for anything it doesn't recognize. Both read sites go through it — the picker at SageIntacctDatePage.tsx:44 and the export summary row at DynamicSageIntacctExportPage.tsx:53.

Two follow-on decisions worth your review:

  • The legacy locale entries are gone. Once both read sites normalize, values.EXPORTED / values.SUBMITTED can never be requested, so I removed them from all 11 locale files (88 pure deletions, no other lines touched). The undefined fallback now covers any unrecognized value, not just those two — so this is strictly more protection than the locale entries gave, and it closes the original crash for future backend values too. CONST.SAGE_INTACCT_EXPORT_DATE_LEGACY stays, since the mapping needs it.
  • Re-picking the selected row still writes. The comparison is against the raw stored value, not the resolved one, so tapping the now-correctly-selected option on a legacy workspace writes REPORT_EXPORTED instead of being a no-op. That lets these workspaces self-heal as admins touch the setting, which shrinks whatever migration the issue's open question lands on.

SageIntacctExportConfig.exportDate was widened to include the legacy values, since that is what Onyx actually holds.

AI tests run locally
  • npm run typecheck — passed
  • npm run lint-changed — passed (one real finding on the way: an unsafe type assertion in my test, fixed by typing the helper's parameter as string, which is honest — it exists precisely to handle values outside the declared union)
  • npm test on ConnectionUtilsTest, TranslateTest, TranslatorTest, AccountingUtilsTest, PolicyConnectionsTest, PolicyUtilsTest, PolicyAccountingPageAutoStartFlowTest, AccountingConnectionConfirmationTest — 584 passed, including 7 new cases covering both legacy values, all three current values, undefined, and an unrecognized value
  • npm run react-compiler-compliance-check on both changed pages — compiled under Babel and OXC
  • npm run spell-changed — passed after fixing two British spellings
  • npm run fmt (oxfmt) — no drift
  • Throwaway runtime check (since removed): loaded all 11 locale modules and asserted each resolves a label and description for every offered export date, and that the removed legacy keys are actually gone — 11 passed
  • scripts/generateTranslations.ts --dry-run — could not run; ts-node fails here for tooling reasons and there's no npm script for it. This change only deletes locale entries and adds no new English strings

What I could not verify. The web smoke test did not run. The session was handed to me already broken — prestart failed during onboarding with a replay divergence (Unknown ref: e22) before my commit existed, and the browser rendered a blank page with zero network requests throughout. That's an automation failure, not a symptom of this change; typecheck compiles all 11 locale files and both pages, and the locale runtime check above passes. But it does mean nobody has exercised this fix in a running app yet — and from the earlier Android run, Sage Intacct is Control-plan gated on the test account, so that needs a workspace actually connected to Sage Intacct with its export date set to Exported Date or Submitted Date in Expensify Classic. If you can point me at one, I'll run it.

@MelvinBot

Copy link
Copy Markdown
Contributor Author

🤖 No code fix needed — every automated check passes.

The only failing check is Check independent approval, and it isn't a test or build failure. It's the peer review gate: the Verify peer review step fails because this PR has no approval from a reviewer independent of the author. Nothing I can push to the branch will clear it — it flips to green once someone approves.

Full check status

I re-ran gh pr checks after the last in-progress job settled. Current state:

Result Checks
✅ pass 30, including typecheck, ESLint check, Oxfmt check, all 8 test (job N) shards, Bun tests, Storybook tests, generateTranslations, spellcheck, React Compiler Compliance, Check for unused styles, and all 4 build jobs
❌ fail 1 — Check independent approval
⏭️ skipping 8 (checklist, actionlint, approveAndMerge, etc.)

branch-perf-tests was still running when I started; it has since finished successfully.

Notably, generateTranslations passed, which confirms the renamed workspace.sageIntacct.exportDate.values.* keys are complete across all 11 locale files.

What's actually blocking this PR: the Tests and QA Steps sections of the PR body still carry // TODO placeholders for the human co-author. Those need filling in before the PR goes "Ready for review", and the independent approval will follow from there.


view run

@francoisl

Copy link
Copy Markdown
Contributor

@shubham1206agra what's the latest here? Are we adding a migration?

The backend has already rewritten stored Sage Intacct export dates to REPORT_EXPORTED / REPORT_SUBMITTED, so only locally cached policies can still hold EXPORTED / SUBMITTED. A one-time Onyx migration rewrites those, which lets the read sites, types, and constants go back to the plain current values.

Co-authored-by: Shubham Agrawal <shubham1206agra@users.noreply.github.com>
@shubham1206agra

Copy link
Copy Markdown
Contributor

@MelvinBot Fix conflicts

…ortDateNaming

Co-authored-by: Shubham Agrawal <shubham1206agra@users.noreply.github.com>

# Conflicts:
#	src/libs/migrateOnyx.ts
@MelvinBot

Copy link
Copy Markdown
Contributor Author

I fixed the merge conflict by merging main into the branch in 2cf82d4. GitHub now shows the PR as mergeable.

The only conflict was in src/libs/migrateOnyx.ts. main added MoveSearchQueryByHashToSnapshots in the same place this PR adds RenameLegacySageIntacctExportDate. I kept both, with main's migration running first. Every other file merged without conflicts.

The tests for both migrations pass (6 tests). I couldn't run typecheck or lint locally because of an environment problem with the bun tool. CI will run them on this push.

@shubham1206agra

Copy link
Copy Markdown
Contributor

Reviewer Checklist

  • I have verified the author checklist is complete (all boxes are checked off).
  • I verified the correct issue is linked in the ### Fixed Issues section above
  • I verified testing steps are clear and they cover the changes made in this PR
    • I verified the steps for local testing are in the Tests section
    • I verified the steps for Staging and/or Production testing are in the QA steps section
    • I verified the steps cover any possible failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
    • I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
  • I checked that screenshots or videos are included for tests on all platforms
  • I included screenshots or videos for tests on all platforms
  • I verified that the composer does not automatically focus or open the keyboard on mobile unless explicitly intended. This includes checking that returning the app from the background does not unexpectedly open the keyboard.
  • I verified tests pass on all platforms & I tested again on:
    • Android: HybridApp
    • Android: mWeb Chrome
    • iOS: HybridApp
    • iOS: mWeb Safari
    • MacOS: Chrome / Safari
  • If there are any errors in the console that are unrelated to this PR, I either fixed them (preferred) or linked to where I reported them in Slack
  • I verified proper code patterns were followed (see Reviewing the code)
    • I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e. toggleReport and not onIconClick).
    • I verified that comments were added to code that is not self explanatory
    • I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
    • I verified any copy / text that was added to the app is grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I verified that this PR follows the guidelines as stated in the Review Guidelines
  • I verified other components that can be impacted by these changes have been tested, and I retested again (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar have been tested & I retested again)
  • If a new component is created I verified that:
    • A similar component doesn't exist in the codebase
    • All props are defined accurately and each prop has a /** comment above it */
    • The file is named correctly
    • The component has a clear name that is non-ambiguous and the purpose of the component can be inferred from the name alone
    • The only data being stored in the state is data necessary for rendering and nothing else
    • For Class Components, any internal methods passed to components event handlers are bound to this properly so there are no scoping issues (i.e. for onClick={this.submit} the method this.submit should be bound to this in the constructor)
    • Any internal methods bound to this are necessary to be bound (i.e. avoid this.submit = this.submit.bind(this); if this.submit is never passed to a component event handler like onClick)
    • All JSX used for rendering exists in the render method
    • The component has the minimum amount of code necessary for its purpose, and it is broken down into smaller components in order to separate concerns and functions
  • If any new file was added I verified that:
    • The file has a description of what it does and/or why is needed at the top of the file if the code is not self explanatory
  • If a new CSS style is added I verified that:
    • A similar style doesn't already exist
    • The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(theme.componentBG)
  • If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
  • If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
  • If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
  • If the PR modifies a component or page that can be accessed by a direct deeplink, I verified that the code functions as expected when the deeplink is used - from a logged in and logged out account.
  • If the PR modifies the UI (e.g. new buttons, new UI components, changing the padding/spacing/sizing, moving components, etc) or modifies the form input styles:
    • I verified that all the inputs inside a form are aligned with each other.
    • I added Design label and/or tagged @Expensify/design so the design team can review the changes.
  • For any bug fix or new feature in this PR, I verified that sufficient unit tests are included to prevent regressions in this flow.
  • If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.
  • I have checked off every checkbox in the PR reviewer checklist, including those that don't apply to this PR.

Screenshots/Videos

Screen.Recording.2026-10-08.at.3.01.42.PM.mov

@shubham1206agra

Copy link
Copy Markdown
Contributor

@MelvinBot Mark PR ready for review

@MelvinBot
MelvinBot marked this pull request as ready for review October 8, 2026 09:36
@MelvinBot
MelvinBot requested a review from a team as a code owner October 8, 2026 09:36
@chatgpt-codex-connector

Copy link
Copy Markdown

Codex usage limits have been reached for code reviews. Please check with the admins of this repo to increase the limits by adding credits.
Credits must be used to enable repository wide code reviews.

@melvin-bot
melvin-bot Bot requested review from dylanexpensify and shubham1206agra and removed request for a team and dylanexpensify October 8, 2026 09:36
@melvin-bot

melvin-bot Bot commented Oct 8, 2026

Copy link
Copy Markdown

@shubham1206agra Please copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button]

@melvin-bot
melvin-bot Bot removed the request for review from a team October 8, 2026 09:37
@MelvinBot

Copy link
Copy Markdown
Contributor Author

I marked this PR ready for review.

The Tests and QA Steps sections still have // TODO placeholders. Please fill them in before review, because the PR checklist needs them.

@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

This PR adds a new Onyx.connectWithoutView call, so I've requested a review from the Onyx performance reviewers (@tgolen, @mountiny, @luacmartins, @chuckdries) — a review from any one of them is enough. Please add a link in your PR description to the Slack discussion where the @frontend-performance team approved using connectWithoutView here.

@melvin-bot
melvin-bot Bot requested a review from francoisl October 8, 2026 09:37
@tgolen
tgolen removed their request for review October 8, 2026 15:24
@chuckdries
chuckdries removed their request for review October 8, 2026 17:40
@francoisl
francoisl merged commit fd53968 into main Oct 8, 2026
50 of 52 checks passed
@francoisl
francoisl deleted the claude-sageIntacctExportDateNaming branch October 8, 2026 17:54
@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

🚧 francoisl has triggered a test Expensify/App build. You can view the workflow run here.

@OSBotify

OSBotify commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release.

@OSBotify OSBotify mentioned this pull request Oct 8, 2026
90 tasks done
@OSBotify

OSBotify commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

🚀 Deployed to staging by https://github.com/francoisl in version: 9.5.6-0 🚀

platform result
🕸 web 🕸 success ✅
🤖 android 🤖 success ✅
🍎 iOS 🍎 success ✅

@MelvinBot

Copy link
Copy Markdown
Contributor Author

No help site update is needed. This PR only renames internal export date values and migrates cached data, and the three option labels in Configure Sage Intacct (Date of last expense, Export date, Submitted date) stay the same.

@IuliiaHerets

Copy link
Copy Markdown

Any QA steps here?

cc @francoisl @luacmartins @mountiny @shubham1206agra

@shubham1206agra

Copy link
Copy Markdown
Contributor

@IuliiaHerets Just connect a workspace with the Sage Intacct accounting connection, and verify that you are able to change export date property without any issues.

@IuliiaHerets

Copy link
Copy Markdown

@shubham1206agra could you please add QA steps?

@shubham1206agra

Copy link
Copy Markdown
Contributor

@IuliiaHerets

  1. Open a workspace with Sage Intacct accounting connection.
  2. Go to accounting.
  3. Click on Export > Export date.
  4. Verify that you can change the setting without any issues.

@OSBotify

OSBotify commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

🚀 Deployed to production by https://github.com/puneetlath in version: 9.5.6-6 🚀

platform result
🕸 web 🕸 success ✅
🤖 android 🤖 success ✅
🍎 iOS 🍎 success ✅

Bundle Size Analysis (Sentry):

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Melvin-Test-Android Melvin-Test-Web Triggers Melvin to run the testing steps of the PR on web

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants