Skip to content

Commit acae30c

Browse files
committed
Merge branch 'main' of github.com:Expensify/App into fix/composer-not-clearing-force-clear-event
2 parents 41d67c9 + c1881ed commit acae30c

File tree

250 files changed

+4247
-6305
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

250 files changed

+4247
-6305
lines changed

.github/scripts/createDocsRoutes.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import type {ValueOf} from 'type-fest';
55
type Article = {
66
href: string;
77
title: string;
8+
order?: number;
89
};
910

1011
type Section = {
@@ -60,11 +61,12 @@ function toTitleCase(str: string): string {
6061
/**
6162
* @param filename - The name of the file
6263
*/
63-
function getArticleObj(filename: string): Article {
64+
function getArticleObj(filename: string, order?: number): Article {
6465
const href = filename.replace('.md', '');
6566
return {
6667
href,
6768
title: toTitleCase(href.replaceAll('-', ' ')),
69+
order,
6870
};
6971
}
7072

@@ -90,6 +92,12 @@ function pushOrCreateEntry<TKey extends HubEntriesKey>(hubs: Hub[], hub: string,
9092
}
9193
}
9294

95+
function getOrderFromArticleFrontMatter(path: string): number | undefined {
96+
const frontmatter = fs.readFileSync(path, 'utf8').split('---')[1];
97+
const frontmatterObject = yaml.load(frontmatter) as Record<string, unknown>;
98+
return frontmatterObject.order as number | undefined;
99+
}
100+
93101
/**
94102
* Add articles and sections to hubs
95103
* @param hubs - The hubs inside docs/articles/ for a platform
@@ -113,7 +121,8 @@ function createHubsWithArticles(hubs: string[], platformName: ValueOf<typeof pla
113121

114122
// Each subfolder will be a section containing articles
115123
fs.readdirSync(`${docsDir}/articles/${platformName}/${hub}/${section}`).forEach((subArticle) => {
116-
articles.push(getArticleObj(subArticle));
124+
const order = getOrderFromArticleFrontMatter(`${docsDir}/articles/${platformName}/${hub}/${section}/${subArticle}`);
125+
articles.push(getArticleObj(subArticle, order));
117126
});
118127

119128
pushOrCreateEntry(routeHubs, hub, 'sections', {

.github/workflows/preDeploy.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ jobs:
3232

3333
- name: Exit failed workflow
3434
if: ${{ needs.typecheck.result == 'failure' || needs.lint.result == 'failure' || needs.test.result == 'failure' }}
35-
run: exit 1
35+
run: |
36+
echo "Checks failed, exiting ~ typecheck: ${{ needs.typecheck.result }}, lint: ${{ needs.lint.result }}, test: ${{ needs.test.result }}"
37+
exit 1
3638
3739
chooseDeployActions:
3840
runs-on: ubuntu-latest

.github/workflows/reassurePerformanceTests.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,12 @@ jobs:
4747
BASELINE_BRANCH=${BASELINE_BRANCH:="main"}
4848
git fetch origin "$BASELINE_BRANCH" --no-tags --depth=1
4949
git switch "$BASELINE_BRANCH"
50-
npm install --force
50+
npm install --force || (rm -rf node_modules && npm install --force)
5151
NODE_OPTIONS=--experimental-vm-modules npx reassure --baseline
5252
git switch --force --detach -
5353
git merge --no-commit --allow-unrelated-histories "$BASELINE_BRANCH" -X ours
5454
git checkout --ours .
55-
npm install --force
55+
npm install --force || (rm -rf node_modules && npm install --force)
5656
NODE_OPTIONS=--experimental-vm-modules npx reassure --branch
5757
5858
- name: Validate output.json

.storybook/webpack.config.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -100,11 +100,6 @@ const webpackConfig = ({config}: {config: Configuration}) => {
100100
}),
101101
);
102102

103-
config.module.rules?.push({
104-
test: /\.lottie$/,
105-
type: 'asset/resource',
106-
});
107-
108103
return config;
109104
};
110105

android/app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,8 @@ android {
108108
minSdkVersion rootProject.ext.minSdkVersion
109109
targetSdkVersion rootProject.ext.targetSdkVersion
110110
multiDexEnabled rootProject.ext.multiDexEnabled
111-
versionCode 1009000802
112-
versionName "9.0.8-2"
111+
versionCode 1009000901
112+
versionName "9.0.9-1"
113113
// Supported language variants must be declared here to avoid from being removed during the compilation.
114114
// This also helps us to not include unnecessary language variants in the APK.
115115
resConfigs "en", "es"

docs/_data/_routes.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ platforms:
6969
icon: /assets/images/handshake.svg
7070
description: Discover the benefits of becoming an Expensify Partner.
7171

72-
- href: integrations
73-
title: Integrations
72+
- href: connections
73+
title: Connections
7474
icon: /assets/images/simple-illustration__monitor-remotesync.svg
7575
description: Integrate with accounting or HR software to streamline expense approvals.
7676

docs/_includes/hub.html

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,17 @@ <h1 class="title">
1212
{{ hub.description }}
1313
</p>
1414

15+
{% assign sortedSectionsAndArticles = hub.sections | concat: hub.articles | sort: 'title' %}
16+
1517
<section>
1618
<div class="cards-group">
17-
{% for section in hub.sections %}
18-
{% include section-card.html platform=activePlatform hub=hub.href section=section.href title=section.title %}
19-
{% endfor %}
20-
{% for article in hub.articles %}
21-
{% include article-card.html hub=hub.href href=article.href title=article.title platform=activePlatform %}
19+
{% for item in sortedSectionsAndArticles %}
20+
<!-- The item is a section if it has articles inside it -->
21+
{% if item.articles %}
22+
{% include section-card.html platform=activePlatform hub=hub.href section=item.href title=item.title %}
23+
{% else %}
24+
{% include article-card.html hub=hub.href href=item.href title=item.title platform=activePlatform %}
25+
{% endif %}
2226
{% endfor %}
2327
</div>
2428
</section>

docs/_includes/lhn-template.html

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -33,31 +33,31 @@
3333
<span>{{ hub.title }}</span>
3434
</div>
3535
<ul class="nested-treeview">
36-
{% for section in hub.sections %}
37-
<li>
38-
{% if section.href == activeSection %}
39-
<div class="icon-with-link selected">
40-
<a href="/{{ activePlatform }}/hubs/{{ hub.href }}"><img src="/assets/images/down.svg" class="base-icon"></img></a>
41-
<span>{{ section.title }}</span>
42-
</div>
43-
<ul>
44-
{% for article in section.articles %}
45-
{% assign article_href = section.href | append: '/' | append: article.href %}
46-
{% include lhn-article-link.html platform=activePlatform hub=hub.href href=article_href title=article.title %}
47-
{% endfor %}
48-
</ul>
49-
{% else %}
50-
<a href="{{ section.href }}" class="icon-with-link link">
51-
<img src="/assets/images/arrow-right.svg" class="base-icon"></img>
52-
{{ section.title }}
53-
</a>
54-
{% endif %}
55-
56-
</li>
57-
{% endfor %}
58-
59-
{% for article in hub.articles %}
60-
{% include lhn-article-link.html platform=activePlatform hub=hub.href href=article.href title=article.title %}
36+
{% assign sortedSectionsAndArticles = hub.sections | concat: hub.articles | sort: 'title' %}
37+
{% for item in sortedSectionsAndArticles %}
38+
{% if item.articles %}
39+
<li>
40+
{% if item.href == activeSection %}
41+
<div class="icon-with-link selected">
42+
<a href="/{{ activePlatform }}/hubs/{{ hub.href }}"><img src="/assets/images/down.svg" class="base-icon"></img></a>
43+
<span>{{ item.title }}</span>
44+
</div>
45+
<ul>
46+
{% for article in item.articles %}
47+
{% assign article_href = item.href | append: '/' | append: article.href %}
48+
{% include lhn-article-link.html platform=activePlatform hub=hub.href href=article_href title=article.title %}
49+
{% endfor %}
50+
</ul>
51+
{% else %}
52+
<a href="{{ item.href }}" class="icon-with-link link">
53+
<img src="/assets/images/arrow-right.svg" class="base-icon"></img>
54+
{{ item.title }}
55+
</a>
56+
{% endif %}
57+
</li>
58+
{% else %}
59+
{% include lhn-article-link.html platform=activePlatform hub=hub.href href=item.href title=item.title %}
60+
{% endif %}
6161
{% endfor %}
6262
</ul>
6363
{% else %}

docs/_includes/section.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ <h1 class="title">
1515

1616
<section>
1717
<div class="cards-group">
18-
{% for article in section.articles %}
18+
{% assign sortedArticles = section.articles | sort: 'order', 'last' | default: 999 %}
19+
{% for article in sortedArticles %}
1920
{% assign article_href = section.href | append: '/' | append: article.href %}
2021
{% include article-card.html hub=hub.href href=article_href title=article.title platform=activePlatform %}
2122
{% endfor %}

docs/articles/expensify-classic/connect-credit-cards/company-cards/Troubleshooting.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,15 @@ Whether you're encountering issues related to company cards, require assistance
88
## How to add company cards to Expensify
99
You can add company credit cards under the Domain settings in your Expensify account by navigating to *Settings* > *Domain* > _Domain Name_ > *Company Cards* and clicking *Import Card/Bank* and following the prompts.
1010

11+
## To Locate Missing Card Transactions in Expensify
12+
1. **Wait for Posting**: Bank transactions may take up to 24 hours to import into Expensify after they have "posted" at your bank. Ensure sufficient time has passed for transactions to appear.
13+
2. **Update Company Cards**: Go to Settings > Domains > Company Cards. Click on the card in question and click "Update" to refresh the card feed.
14+
3. **Reconcile Cards**: Navigate to the Reconciliation section under Settings > Domains > Company Cards. Refer to the detailed guide on how to use the [Reconciliation Dashboard](https://help.expensify.com/articles/expensify-classic/connect-credit-cards/company-cards/Reconciliation#identifying-outstanding-unapproved-expenses-using-the-reconciliation-dashboard).
15+
4. **Review Transactions**: Use the Reconciliation Dashboard to view all transactions within a specific timeframe. Transactions will display on the Expenses page based on their "Posted Date". If needed, uncheck the "use posted date" checkbox near the filters to view transactions based on their "Transaction Date" instead.
16+
5. **Address Gaps**: If there is a significant gap in transactions or if transactions are still missing, contact Expensify's Concierge or your Account Manager. They can initiate a historical data update on your card feed to ensure all transactions are properly imported.
17+
18+
Following these steps should help you identify and resolve any issues with missing card transactions in Expensify.
19+
1120
## Known issues importing transactions
1221
The first step should always be to "Update" your card, either from Settings > Your Account > Credit Card Import or Settings > Domain > [Domain Name] > Company Cards for centrally managed cards. If a "Fix" or "Fix card" option appears, follow the steps to fix the connection. If this fails to import your missing transactions, there is a known issue whereby some transactions will not import for certain API-based company card connections. So far this has been reported on American Express, Chase and Wells Fargo. This can be temporarily resolved by creating the expenses manually instead:
1322

@@ -63,6 +72,24 @@ If you've answered "yes" to any of these questions, a Domain Admins need to upda
6372
Make sure you're importing your card in the correct spot in Expensify and selecting the right bank connection. For company cards, use the master administrative credentials to import your set of cards at *Settings* > *Domains* > _Domain Name_ > *Company Cards* > *Import Card*.
6473
Please note there are some things that cannot be bypassed within Expensify, including two-factor authentication being enabled within your bank account. This will prevent the connection from remaining stable and will need to be turned off on the bank side.
6574

75+
## Why Can’t I See the Transactions Before a Certain Date?
76+
When importing a card into Expensify, the platform typically retrieves 30-90 days of historical transactions, depending on the card or account type. For commercial feeds, transactions cannot be imported before the bank starts sending data. If needed, banks can send backdated files, and Expensify can run a historical update upon request.
77+
78+
Additionally, Expensify does not import transactions dated before the "start date" you specify when assigning the card. Unless transitioning from an old card to a new one to avoid duplicates, it's advisable to set the start date to "earliest possible" or leave it blank.
79+
80+
For historical expenses that cannot be imported automatically, consider using Expensify's [company card](https://help.expensify.com/articles/expensify-classic/connect-credit-cards/company-cards/CSV-Import) or [personal card](https://help.expensify.com/articles/expensify-classic/connect-credit-cards/Personal-Credit-Cards#importing-expenses-via-a-spreadsheet) spreadsheet import method. This allows you to manually input missing transactions into the system.
81+
82+
## Why Am I / Why Is My Employee Seeing Duplicates?
83+
If an employee is seeing duplicate expenses, they may have accidentally imported the card as a personal credit card as well as having the Domain Admin assign them a company card.
84+
85+
To troubleshoot:
86+
- Have the employee navigate to their Settings > Your Account > Credit Card Import and confirm that their card is only listed once.
87+
- If the card is listed twice, delete the entry without the "padlock" icon.
88+
89+
**Important:** Deleting a duplicate card will delete all unapproved expenses from that transaction feed. Transactions associated with the remaining card will not be affected. If receipts were attached to those transactions, they will still be on the Expenses page, and the employee can click to SmartScan them again.
90+
91+
Duplicate expenses might also occur if you recently unassigned and reassigned a company card with an overlapping start date. If this is the case and expenses on the “new” copy have not been submitted, you can unassign the card again and reassign it with a more appropriate start date. This action will delete all unsubmitted expenses from the new card feed.
92+
6693
## What are the most reliable bank connections in Expensify?*
6794
All bank connections listed below are extremely reliable, but we recommend transacting with the Expensify Visa® Commercial Card. It also offers daily and monthly settlement, unapproved expense limits, realtime compliance for secure and efficient spending, and cash back on all US purchases. [Click here to learn more about the Expensify Card](https://use.expensify.com/company-credit-card).
6895

docs/articles/expensify-classic/integrations/travel-integrations/Uber.md renamed to docs/articles/expensify-classic/connections/Uber.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,5 @@ Now, every time you use Uber for Business – be it for rides or meals – the r
2222

2323
![Uber integration set up steps: Connecting your account](https://help.expensify.com/assets/images/Uber1.png){:width="100%"}
2424
![Uber integration set up steps: Selecting Expensify](https://help.expensify.com/assets/images/Uber2.png){:width="100%"}
25+
26+
To disconnect Uber and Expensify, simply follow the above path and select Disconnect on the Expensify option.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
title: Accelo Troubleshooting
3+
description: Accelo Troubleshooting
4+
order: 3
5+
---
6+
7+
# Coming soon
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
title: Configure Accelo
3+
description: Configure Accelo
4+
order: 2
5+
---
6+
7+
# Coming soon

docs/articles/expensify-classic/integrations/accounting-integrations/Accelo.md renamed to docs/articles/expensify-classic/connections/accelo/Connect-To-Accelo.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
---
22
title: Accelo
33
description: Help doc for Accelo integration
4+
order: 1
45
---
56
<!-- The lines above are required by Jekyll to process the .md file -->
67

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
title: Certinia Troubleshooting
3+
description: Certinia Troubleshooting
4+
---
5+
6+
# Coming soon
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
title: Configure Certinia
3+
description: Configure Certinia
4+
order: 2
5+
---
6+
7+
# Coming soon

docs/articles/expensify-classic/integrations/accounting-integrations/Certinia.md renamed to docs/articles/expensify-classic/connections/certinia/Connect-To-Certinia.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
---
22
title: Certinia
33
description: Guide to connecting Expensify and Certinia FFA and PSA/SRP (formerly known as FinancialForce)
4+
order: 1
45
---
56
# Overview
67
[Cetinia](https://use.expensify.com/financialforce) (formerly known as FinancialForce) is a cloud-based software solution that provides a range of financial management and accounting applications built on the Salesforce platform. There are two versions: PSA/SRP and FFA and we support both.

0 commit comments

Comments
 (0)