diff --git a/android/app/build.gradle b/android/app/build.gradle index d85dda721838..ed9f5c677615 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -90,8 +90,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1001037508 - versionName "1.3.75-8" + versionCode 1001037511 + versionName "1.3.75-11" } flavorDimensions "default" diff --git a/docs/articles/expensify-classic/expensify-card/Auto-Reconciliation.md b/docs/articles/expensify-classic/expensify-card/Auto-Reconciliation.md index 85202835a0e4..9de47d6e5beb 100644 --- a/docs/articles/expensify-classic/expensify-card/Auto-Reconciliation.md +++ b/docs/articles/expensify-classic/expensify-card/Auto-Reconciliation.md @@ -1,5 +1,200 @@ --- -title: Auto-reconciliation -description: Auto-reconciliation +title: Expensify Card Auto-Reconciliation +description: Everything you need to know about Expensify Card Auto-Reconciliation --- -## Resource Coming Soon! + + +# Overview +If your company uses the Expensify Card, and connects to a direct accounting integration, you can auto-reconcile card spending each month. + +The integrations that auto-reconciliation are available on are: + +- QuickBooks Online +- Xero +- NetSuite +- Sage Intacct + +# How-to Set Up Expensify Card Auto-Reconciliation + +## Auto-Reconciliation Prerequisites + +- Connection: +1. A Preferred Workspace is set. +2. A Reconciliation Account is set and matches the Expensify Card settlement account. +- Automation: +1. Auto-Sync is enabled on the Preferred Workspace above. +2. Scheduled Submit is enabled on the Preferred Workspace above. +- User: +1. A Domain Admin is set as the Preferred Workspace’s Preferred Exporter. + +To set up your auto-reconciliation account with the Expensify Card, follow these steps: +1. Navigate to your Settings. +2. Choose "Domains," then select your specific domain name. +3. Click on "Company Cards." +4. From the dropdown menu, pick the Expensify Card. +5. Head to the "Settings" tab. +6. Select the account in your accounting solution that you want to use for reconciliation. Make sure this account matches the settlement business bank account. + +That's it! You've successfully set up your auto-reconciliation account. + +## How does Auto-Reconciliation work +Once Auto-Reconciliation is enabled, there are a few things that happen. Let’s go over those! + +### Handling Purchases and Card Balance Payments +**What happens**: When an Expensify Card is used to make purchases, the amount spent is automatically deducted from your company’s 'Settlement Account' (your business checking account). This deduction happens on a daily or monthly basis, depending on your chosen settlement frequency. Don't worry; this settlement account is pre-defined when you apply for the Expensify Card, and you can't accidentally change it. +**Accounting treatment**: After your card balance is settled each day, we update your accounting system with a journal entry. This entry credits your bank account (referred to as the GL account) and debits the Expensify Card Clearing Account. To ensure accuracy, please make sure that the 'bank account' in your Expensify Card settings matches your real-life settlement account. You can easily verify this by navigating to **Settings > Account > Payments**, where you'll see 'Settlement Account' next to your business bank account. To keep track of settlement figures by date, use the Company Card Reconciliation Dashboard's Settlements tab: + +### Submitting, Approving, and Exporting Expenses +**What happens**: Users submit their expenses on a report, which might occur after some time has passed since the initial purchase. Once the report is approved, it's then exported to your accounting software. +**Accounting treatment**: When the report is exported, we create a journal entry in your accounting system. This entry credits the Clearing Account and debits the Liability Account for the purchase amount. The Liability Account functions as a bank account in your ledger, specifically for Expensify Card expenses: + +# Deep Dive +## QuickBooks Online + +### Initial Setup +1. Start by accessing your group workspace linked to QuickBooks Online. On the Export tab, make sure that the user chosen as the Preferred Exporter holds the role of a Workspace Admin and has an email address associated with your Expensify Cards' domain. For instance, if your domain is company.com, the Preferred Exporter's email should be email@company.com. +2. Head over to the Advanced tab and ensure that Auto-Sync is enabled. +3. Now, navigate to **Settings > Domains > *Domain Name* > Company Cards > Settings**. Use the dropdown menu next to "Preferred Workspace" to select the group workspace connected to QuickBooks Online and with Scheduled Submit enabled. +4. In the dropdown menu next to "Expensify Card reconciliation account," choose your existing QuickBooks Online bank account for reconciliation. This should be the same account you use for Expensify Card settlements. +5. In the dropdown menu next to "Expensify Card settlement account," select your business bank account used for settlements (found in Expensify under **Settings > Account > Payments**). + +### How This Works +1. On the day of your first card settlement, we'll create the Expensify Card Liability account in your QuickBooks Online general ledger. If you've opted for Daily Settlement, we'll also create an Expensify Clearing Account. +2. During your QuickBooks Online auto-sync on that same day, if there are unsettled transactions, we'll generate a journal entry totaling all posted transactions since the last settlement. This entry will credit the selected bank account and debit the new Expensify Clearing Account (for Daily Settlement) or the Expensify Liability Account (for Monthly Settlement). +3. Once the transactions are posted and the expense report is approved in Expensify, the report will be exported to QuickBooks Online with each line as individual credit card expenses. For Daily Settlement, an additional journal entry will credit the Expensify Clearing Account and debit the Expensify Card Liability Account. For Monthly Settlement, the journal entry will credit the Liability account directly and debit the appropriate expense categories. + +### Example +- We have card transactions for the day totaling $100, so we create the following journal entry upon sync: +- The current balance of the Expensify Clearing Account is now $100: +- After transactions are posted in Expensify and the report is approved and exported, a second journal entry is generated: +- We reconcile the matching amounts automatically, clearing the balance of the Expensify Clearing Account: +- Now, you'll have a debit on your credit card account (increasing the total spent) and a credit on the bank account (reducing the available amount). The Clearing Account balance is $0. +- Each expense will also create a credit card expense, similar to how we do it today, exported upon final approval. This action debits the expense account (category) and includes any other line item data. +- This process occurs daily during the QuickBooks Online Auto-Sync to ensure your card remains reconciled. + +**Note:** If Auto-Reconciliation is disabled for your company's Expensify Cards, a Domain Admin can set an export account for individual cards via **Settings > Domains > *Domain Name* > Company Cards > Edit Exports**. The Expensify Card transactions will always export as Credit Card charges in your accounting software, even if the non-reimbursable setting is configured differently, such as a Vendor Bill. + +## Xero + +### Initial Setup +1. Begin by accessing your group workspace linked to Xero. On the Export tab, ensure that the Preferred Exporter is a Workspace Admin with an email address from your Expensify Cards domain (e.g. company.com). +2. Head to the Advanced tab and confirm that Auto-Sync is enabled. +3. Now, go to **Settings > Domains > *Domain Name* > Company Cards > Settings**. From the dropdown menu next to "Preferred Workspace," select the group workspace connected to Xero with Scheduled Submit enabled. +4. In the dropdown menu for "Expensify Card settlement account," pick your settlement business bank account (found in Expensify under **Settings > Account > Payments**). +5. In the dropdown menu for "Expensify Card reconciliation account," select the corresponding GL account from Xero for your settlement business bank account from step 4. + +### How This Works +1. During the first overnight Auto Sync after enabling Continuous Reconciliation, Expensify will create a Liability Account (Bank Account) on your Xero Dashboard. If you've opted for Daily Settlement, an additional Clearing Account will be created in your General Ledger. Two Contacts —Expensify and Expensify Card— will also be generated: +2. The bank account for Expensify Card transactions is tied to the Liability Account Expensify created. Note that this doesn't apply to other cards or non-reimbursable expenses, which follow your workspace settings. + +### Daily Settlement Reconciliation +- If you've selected Daily Settlement, Expensify uses entries in the Clearing Account to reconcile the daily settlement. This is because Expensify bills on posted transactions, which you can review via **Settings > Domains > *Domain Name* > Company Cards > Reconciliation > Settlements**. +- At the end of each day (or month on your settlement date), the settlement charge posts to your Business Bank Account. Expensify assigns the Clearing Account (or Liability Account for monthly settlement) as a Category to the transaction, posting it in your GL. The charge is successfully reconciled. + +### Bank Transaction Reconciliation +- Expensify will pay off the Liability Account with the Clearing Account balance and reconcile bank transaction entries to the Liability Account with your Expense Accounts. +- When transactions are approved and exported from Expensify, bank transactions (Receive Money) are added to the Liability Account, and coded to the Clearing Account. Simultaneously, Spend Money transactions are created and coded to the Category field. If you see many Credit Card Misc. entries, add commonly used merchants as Contacts in Xero to export with the original merchant name. +- The Clearing Account balance is reduced, paying off the entries to the Liability Account created in Step 1. Each payment to and from the Liability Account should have a corresponding bank transaction referencing an expense account. Liability Account Receive Money payments appear with "EXPCARD-APPROVAL" and the corresponding Report ID from Expensify. +- You can run a Bank Reconciliation Summary displaying entries in the Liability Account referencing individual payments, as well as entries that reduce the Clearing Account balance to unapproved expenses. +- **Important**: To bring your Liability Account balance to 0, enable marking transactions as reconciled in Xero. When a Spend Money bank transaction in the Liability Account has a matching Receive Transaction, you can mark both as Reconciled using the provided hyperlink. + +**Note**: If Auto-Reconciliation is disabled for your company's Expensify Cards, a Domain Admin can set an export account for individual cards via **Settings > Domains > *Domain Name* > Company Cards > Edit Exports**. The Expensify Card transactions will always export as a Credit Card charge in your accounting software, regardless of the non-reimbursable setting in their accounting configuration. + +## NetSuite + +### Initial Setup +1. Start by accessing your group workspace connected to NetSuite and click on "Configure" under **Connections > NetSuite**. +2. On the Export tab, ensure that the Preferred Exporter is a Workspace Admin with an email address from your Expensify Cards' domain. For example, if your domain is company.com, the Preferred Exporter's email should be email@company.com. +3. Head over to the Advanced tab and make sure Auto-Sync is enabled. +4. Now, go to **Settings > Domains > *Domain Name* > Company Cards > Settings**. From the dropdown menu next to "Preferred Workspace," select the group workspace connected to NetSuite with Scheduled Submit enabled. +5. In the dropdown menu next to "Expensify Card reconciliation account," choose your existing NetSuite bank account used for reconciliation. This account must match the one set in Step 3. +6. In the dropdown menu next to "Expensify Card settlement account," select your daily settlement business bank account (found in Expensify under **Settings > Account > Payments**). + +### How This Works with Daily Settlement +1. After setting up the card and running the first auto-sync, we'll create the Expensify Card Liability account and the Expensify Clearing Account within your NetSuite subsidiary general ledger. +2. During the same sync, if there are newly posted transactions, we'll create a journal entry totaling all posted transactions for the day. This entry will credit the selected bank account and debit the new Expensify Clearing account. +3. Once transactions are approved in Expensify, the report will be exported to NetSuite, with each line recorded as individual credit card expenses. Additionally, another journal entry will be generated, crediting the Expensify Clearing Account and debiting the Expensify Card Liability account. + +### How This Works with Monthly Settlement +1. After the first monthly settlement, during Auto-Sync, Expensify creates a Liability Account in NetSuite (without a clearing account). +2. Each time the monthly settlement occurs, Expensify calculates the total purchase amount since the last settlement and creates a Journal Entry that credits the settlement bank account (GL Account) and debits the Expensify Liability Account in NetSuite. +3. As expenses are approved and exported to NetSuite, Expensify credits the Liability Account and debits the correct expense categories. + +**Note**: By default, the Journal Entries created by Expensify are set to the approval level "Approved for posting," so they will automatically credit and debit the appropriate accounts. If you have "Require approval on Journal Entries" enabled in your accounting preferences in NetSuite (**Setup > Accounting > Accounting Preferences**), this will override that default. Additionally, if you have set up Custom Workflows (**Customization > Workflow**), these can also override the default. In these cases, the Journal Entries created by Expensify will post as "Pending approval." You will need to approve these Journal Entries manually to complete the reconciliation process. + +### Example +- Let's say you have card transactions totaling $100 for the day. +- We create a journal entry: +- After transactions are posted in Expensify, we create the second Journal Entry(ies): +- We then reconcile the matching amounts automatically, clearing the balance of the Expensify Clearing Account. +- Now, you'll have a debit on your Credit Card account (increasing the total spent) and a credit on the bank account (reducing the amount available). The clearing account has a $0 balance. +- Each expense will also create a Journal Entry, just as we do today, exported upon final approval. This entry will debit the expense account (category) and contain any other line item data. +- This process happens daily during the NetSuite Auto-Sync to keep your card reconciled. + +**Note**: Currently, only Journal Entry export is supported for auto-reconciliation. You can set other export options for all other non-reimbursable spend in the **Configure > Export** tab. Be on the lookout for Expense Report export in the future! + +If Auto-Reconciliation is disabled for your company's Expensify Cards, a Domain Admin can set an export account for individual Expensify Cards via **Settings > Domains > Company Cards > Edit Exports**. The Expensify Card transactions will always export as a Credit Card charge in your accounting software, regardless of the non-reimbursable setting in their accounting configuration. + +## Sage Intacct + +### Initial Setup +1. Start by accessing your group workspace connected to Sage Intacct and click on "Configure" under **Connections > Sage Intacct**. +2. On the Export tab, ensure that you've selected a specific entity. To enable Expensify to create the liability account, syncing at the entity level is crucial, especially for multi-entity environments. +3. Still on the Export tab, confirm that the user chosen as the Preferred Exporter is a Workspace Admin, and their email address belongs to the domain used for Expensify Cards. For instance, if your domain is company.com, the Preferred Exporter's email should be email@company.com. +4. Head over to the Advanced tab and make sure Auto-Sync is enabled. +5. Now, go to **Settings > Domains > *Domain Name* > Company Cards > Settings**. From the dropdown menu next to "Preferred Workspace," select the group workspace connected to Sage Intacct with Scheduled Submit enabled. +6. In the dropdown menu next to "Expensify Card reconciliation account" pick your existing Sage Intacct bank account used for daily settlement. This account must match the one set in the next step. +7. In the dropdown menu next to "Expensify Card settlement account" select your daily settlement business bank account (found in Expensify under **Settings > Account > Payments**). +8. Use the dropdown menus to select your cash-only and accrual-only journals. If your organization operates on a cash-only or accrual-only basis, choose "No Selection" for the journals as needed. If your organization uses both cash and accrual methods, please select both a cash-only and an accrual-only journal. Don't forget to save your settings! + +### How This Works with Daily Settlement +1. After setting up the card and running the first auto-sync, we'll create the Expensify Card Expensify Clearing Account within your Sage Intacct general ledger. Once the first card transaction is exported, we'll create a Liability Account. +2. In the same sync, if there are newly posted transactions from your Expensify Cards, we'll then create a journal entry totaling all posted transactions for the day. This entry will credit the business bank account (set in Step 4 above) and debit the new Expensify Clearing account. +3. Once Expensify Card transactions are approved in Expensify, the report will be exported to Sage Intacct, with each line recorded as individual credit card expenses. Additionally, another journal entry will be generated, crediting the Expensify Clearing Account and debiting the Expensify Card Liability Account. + +### How This Works with Monthly Settlement +1. After the initial export of a card transaction, Expensify establishes a Liability Account in Intacct (without a clearing account). +2. Each time a monthly settlement occurs, Expensify calculates the total purchase amount since the last settlement and creates a Journal Entry. This entry credits the settlement bank account (GL Account) and debits the Expensify Liability Account in Intacct. +3. As expenses are approved and exported to Intacct, Expensify credits the Liability Account and debits the appropriate expense categories. + +# FAQ + +## What are the timeframes for auto-reconciliation in Expensify? +We offer either daily or monthly auto-reconciliation: +- Daily Settlement: each day, as purchases are made on your Expensify Cards, the posted balance is withdrawn from your Expensify Card Settlement Account (your business bank account). +- Monthly Settlement: each month, on the day of the month that you enabled Expensify Cards (or switched from Daily to Monthly Settlement), the posted balance of all purchases since the last settlement payment is withdrawn from your Expensify Card Settlement Account (your business bank account). + +## Why is my Expensify Card auto-reconciliation not working with Xero? +When initially creating the Liability and Bank accounts to complete the auto-reconciliation process, we rely on the system to match and recognize those accounts created. You can't make any changes or we will not “find” those accounts. + +If you have changed the accounts. It's an easy fix, just rename them! +- Internal Account Code: must be **ExpCardLbl** +- Account Type: must be **Bank** + +## My accounting integration is not syncing. How will this affect the Expensify Card auto-reconciliation? +When you receive a message that your accounting solution’s connection failed to sync, you will also receive an email or error message with the steps to correct the sync issue. If you do not, please contact Support for help. When your accounting solution’s sync reconnects and is successful, your auto-reconciliation will resume. + +If your company doesn't have auto-reconciliation enabled for its Expensify Cards, you can still set up individual export accounts. Here's how: + +1. Make sure you have Domain Admin privileges. +2. Navigate to **Settings > Domains** +3. Select 'Company Cards' +4. Find the Expensify Card you want to configure and choose 'Edit Exports.' +5. Pick the export account where you want the Expensify Card transactions to be recorded. +6. Please note that these transactions will always be exported as Credit Card charges in your accounting software. This remains the case even if you've configured non-reimbursable settings as something else, such as a Vendor Bill. + +These simple steps will ensure your Expensify Card transactions are correctly exported to the designated account in your accounting software. + +## Why does my Expensify Card Liability Account have a balance? +If you’re using the Expensify Card with auto-reconciliation, your Expensify Card Liability Account balance should always be $0 in your accounting system. + +If you see that your Expensify Card Liability Account balance isn’t $0, then you’ll need to take action to return that balance to $0. + +If you were using Expensify Cards before auto-reconciliation was enabled for your accounting system, then any expenses that occurred prior will not be cleared from the Liability Account. +You will need to prepare a manual journal entry for the approved amount to bring the balance to $0. + +To address this, please follow these steps: +1. Identify the earliest date of a transaction entry in the Liability Account that doesn't have a corresponding entry. Remember that each expense will typically have both a positive and a negative entry in the Liability Account, balancing out to $0. +2. Go to the General Ledger (GL) account where your daily Expensify Card settlement withdrawals are recorded, and locate entries for the dates identified in Step 1. +3. Adjust each settlement entry so that it now posts to the Clearing Account. +4. Create a Journal Entry or Receive Money Transaction to clear the balance in the Liability Account using the funds currently held in the Clearing Account, which was set up in Step 2. diff --git a/docs/articles/expensify-classic/getting-started/Individual-Users.md b/docs/articles/expensify-classic/getting-started/Individual-Users.md index de7a527df010..12029f80388b 100644 --- a/docs/articles/expensify-classic/getting-started/Individual-Users.md +++ b/docs/articles/expensify-classic/getting-started/Individual-Users.md @@ -1,5 +1,43 @@ --- title: Individual Users -description: Individual Users +description: Learn how Expensify can help you track and submit your personal or self-employed business expenses. --- -## Resource Coming Soon! +# Overview +If you're an individual using Expensify, the Track and Submit plans are designed to assist self-employed users in effectively managing both their personal and business finances. + +# How to use the Track plan + +The Track plan is tailored for solo Expensify users who don't require expense submission to others. Individuals or sole proprietors can choose the Track plan to customize their Individual Workspace to align with their personal expense tracking requirements. + +You can select the Track plan from the Workspace settings. Navigate to **Settings > Workspace > Individual > *[Workspace Name]* > Plan** to select Track. +You can also do this from the Pricing page at https://www.expensify.com/pricing. + +The Track plan includes a predefined set of categories designed to align with IRS Schedule C expense categories. However, you have the flexibility to add extra categories as needed. For a more detailed breakdown, you can also set up tags to create another layer of coding. + +The Track plan offers 25 free SmartScans per month. If you require more than 25 SmartScans, you can upgrade to a Monthly Individual subscription at a cost of $4.99 USD per month. + +# How to use the Submit plan +The Submit plan is designed for individuals who need to keep track of their expenses and share them with someone else, such as their boss, accountant, or even a housemate. It's specifically tailored for single users who want to both track and submit their expenses efficiently. + +You can select the Track plan from the Workspace settings. Navigate to **Settings > Workspaces > Individual > *[Workspace Name]* > Plan** to select "Submit" or from the Pricing page at https://www.expensify.com/pricing. + +You will select who your expenses get sent to under **Settings > Workspace > Individual > *[Workspace Name]* > Reports**. If the recipient already has an Expensify account, they'll be able to see the report directly in the Expensify app. Otherwise, non-Expensify users will receive a PDF copy of the report attached to the email so it can be processed. + +The Submit plan includes a predefined set of categories designed to align with IRS Schedule C expense categories. However, you have the flexibility to add extra categories as needed. For a more detailed breakdown, you can also set up tags to create another layer of coding. + +The Submit plan offers 25 free SmartScans per month.If you require more than 25 SmartScans, you can upgrade to a Monthly Individual subscription at a cost of $4.99 USD per month. + +# FAQ + +## Who should use the Track plan? +An individual who wants to store receipts, look to track spending by category to help with budgeting and a self-employed user who needs to track receipts and mileage for tax purposes. + +## Who should use the Submit plan? +An individual who seeks to utilize the features of the track plan to monitor their expenses while also requiring the ability to submit those expenses to someone else. + +## How can I keep track of personal and business expenses in the same account? +You have the capability to create distinct "business" and "personal" tags and assign them to your expenses for proper categorization. By doing so, you can effectively code your expenses based on their nature. Additionally, you can utilize filters to ensure that you only view the expenses that are relevant to your specific needs, whether they are business-related or personal. + +## How can I export expenses for tax purposes? +From the expense page, you have the option to select all of your expenses and export them to a CSV (Comma-Separated Values) file. This CSV file can be conveniently imported directly into your tax software for easier tax preparation. + diff --git a/docs/articles/expensify-classic/integrations/HR-integrations/Zenefits.md b/docs/articles/expensify-classic/integrations/HR-integrations/Zenefits.md index 3ee1c8656b4b..e94d915e4dfa 100644 --- a/docs/articles/expensify-classic/integrations/HR-integrations/Zenefits.md +++ b/docs/articles/expensify-classic/integrations/HR-integrations/Zenefits.md @@ -1,5 +1,39 @@ --- -title: Coming Soon -description: Coming Soon +title: Zenefits Integration +description: Automatically sync employees between Zenefits and Expensify --- -## Resource Coming Soon! +# How the Zenefits integration works with Expensify + +Expensify's direct integration with Zenefits will automatically: +- **Create new Expensify accounts** for full-time, active employees when they're hired +- **Update the approval workflow in Expensify** based on any changes in Zenefits +- **Deprovision an employee's Expensify account** upon Zenefits termination date + +# How to connect the Zenefits integration +## Before connecting Expensify with Zenefits, please review the prerequisites: + +- You must be an admin in Zenefits and in Expensify to establish the integration +- You must have a Control or Collect workspace in Expensify to integrate with Zenefits. If you do not, you'll be given the opportunity to upgrade to Control or Collect during the integration setup. +- Every employee record in Zenefits must have a work email address since we use this as the unique identifier in Expensify. +- Zenefits will add all your employees to one Expensify workspace. If your company uses multiple Expensify workspaces, you'll be given the option to choose which workspace to connect to when you're setting up the integration. + +## To connect your Expensify workspace to Gusto: + +1. Navigate to **Settings > Workspaces > Group > _[Workspace Name]_ > Connections** +2. Scroll down to HR Integrations, click the **Connect to Zenefits** radio button, then click **Sync with Zenefits** +3. Login to your Zenefits account using your Zenefits admin credentials and authorize Expensify to access your Zenefits account. +4. If you want to exclude an individual user from syncing with Expensify, make your selections before clicking **Authorize** + +## To configure the connection: + +1. Select the Approval Workflow that works best for your team: + - **Basic Approval:** Each employee will submit expense reports to one final approver. By default, the final approver is the workspace's Billing Owner. + - **Manager Approval:** Expense reports will first be submitted to each employee's direct manager, and then forwarded to one final approver. By default, the final approver is the workspace's Billing Owner. + - **Configure Manually:** Use the members table to manually configure how employees submit reports. In this case, you're choosing to not import an employee's manager. You will need to set and update the approval workflow for each employee manually. If your team has a highly complex approval workflow, this option will allow for multi-tiered approval chains. + +# Zenefit integration FAQs +## Will this notify my employees? +Each employee will receive a welcome email at their work email address along with a request to validate their account and choose a password. They can also download our mobile app for iOS and Android devices. Please note that there is no way to disable the welcome email. + +## Should I connect the integration from Expensify or from Zenefits? +It's totally up to you! You'll have the same options available to you when syncing from either product. diff --git a/docs/articles/expensify-classic/integrations/accounting-integrations/Indirect-Accounting-Integrations.md b/docs/articles/expensify-classic/integrations/accounting-integrations/Indirect-Accounting-Integrations.md new file mode 100644 index 000000000000..852db0b7f7c0 --- /dev/null +++ b/docs/articles/expensify-classic/integrations/accounting-integrations/Indirect-Accounting-Integrations.md @@ -0,0 +1,48 @@ +--- +title: Indirect Accounting Integrations +description: Learn how to export your expenses and reports to a built-for-purpose flat file that works with your accounting platform. +--- + + +# Overview + +Along with the direct integrations Expensify supports, there's also an option to integrate with other accounting solutions via a flat-file import. + +When you set up one of these accounting packages in Expensify, we will automatically create and add a relevant export template. The template will allow you to quickly and easily transfer expense and report data to your accounting package. + +# How to Set Up an Indirect Accounting Integration + +## Home Page + +After selecting your Group Plan type for your first workspace, you'll be taken through a few workspace setup tasks on the home page. When you reach the **Accounting Software** task, select your accounting solution from the available options. + +You'll receive a confirmation message, and the respective export template will be added to the account. From then on, it will show in the **Export to** option on the **Reports** page and at the top of each report. + +## Workspace Settings + +Head to **Settings** > **Workspaces** > **Group** > _Your desired workspace_ > **Connections** and select an accounting package from the options listed here. You'll receive a confirmation message, and the respective export template will be added to the account. From then on, it will show in the **Export to** option on the **Reports** page and at the top of each report. + +# How to Export a Report for My Accounting Package + +You can export reports to these templates in two ways: + +To export a report, click **Export To** in the top-left of a report and select your accounting package from the dropdown menu. + +To export multiple reports, tick the checkbox next to the reports on the **Reports** page, then click **Export To** and select your accounting package from the dropdown menu. + +# FAQ + +## Which accounting packages offer this indirect integration with Expensify? + +We support a pre-configured flat-file integration for the following accounting packages: + + - Sage + - Microsoft Dynamics + - MYOB + - Oracle + - SAP + +## What if my accounting package isn’t listed here? + +If your accounting package isn’t listed, but it still accepts a flat-file import, select **Other** when completing the Accounting Software task on your Home page or head to **Settings** > **Workspaces** > **Group** > _Your desired workspace_ > **Export Formats**. This option allows you to create your own templates to export your expense and report data into a format compatible with your accounting system. + diff --git a/docs/articles/expensify-classic/integrations/travel-integrations/Global-VaTax.md b/docs/articles/expensify-classic/integrations/travel-integrations/Global-VaTax.md index 3ee1c8656b4b..4a18b30458a6 100644 --- a/docs/articles/expensify-classic/integrations/travel-integrations/Global-VaTax.md +++ b/docs/articles/expensify-classic/integrations/travel-integrations/Global-VaTax.md @@ -1,5 +1,31 @@ --- -title: Coming Soon -description: Coming Soon +title: Global VaTax Integration +description: The Expensify-Global VaTax integration turns your company’s international expenses into an easy VAT refund. --- -## Resource Coming Soon! +# About +The Expensify-Global VaTax integration turns your company’s international expenses into an easy VAT refund. +If your company is based in the U.S. but doing business abroad, track your [expenses](https://use.expensify.com/expense-management) in Expensify and then sync to [Global VaTax](https://globalvatax.com/) to receive a VAT refund. +## VAT +[Value Added Tax (VAT)](https://www.investopedia.com/terms/v/valueaddedtax.asp#:~:text=Value%2Dadded%20tax%20(VAT)%20is%20a%20flat%20tax%20levied,different%20parties%20to%20a%20transaction.) is a consumption tax applied to goods and services in many countries. It is typically applied automatically upon purchase, however, international business travelers can reclaim some VAT. + +VAT-recoverable expenses include hotels, entertainment, conferences, legal and marketing fees, DDP shipping and storage fees, aviation recovery, and other international expenses. +## VAT Refund +The VAT refund process is complex and requires a detailed understanding of the regulations and requirements in each country. The VAT rules and rates vary from country to country and by expense type. + +You can seamlessly sync your Expensify expenses to Global VaTax for easy VAT analysis, calculation, and reporting. + + +# How to Connect to Global VaTax +1. Fill out [this form](https://www.vataxcloud.com/expensify/signup) to receive a confirmation email from Global VaTax. +2. Click the link in the confirmation email to sign into your Global VaTax account. +3. Go to the **Method of Extraction** section. +4. Click **Expensify** +5. Follow the steps to obtain your partner credentials and activate the integration. +6. Enter your credentials and extraction dates +7. Click **Submit** +8. VaTax Cloud will begin automatically calculating your VAT rates for each eligible expense line item, per expense type, in each country. +9. Within a few hours, you'll receive an email that your VAT potential analysis report is ready for review. + +Your VAT reclaim will be prepared by Global VaTax in the necessary languages and submitted to the appropriate tax agents in each country. + +After submitting your VAT reclaim, you can track it via the submission analysis report in Global VaTax. diff --git a/docs/articles/expensify-classic/policy-and-domain-settings/Expenses.md b/docs/articles/expensify-classic/policy-and-domain-settings/Expenses.md index 3ee1c8656b4b..424338120010 100644 --- a/docs/articles/expensify-classic/policy-and-domain-settings/Expenses.md +++ b/docs/articles/expensify-classic/policy-and-domain-settings/Expenses.md @@ -1,5 +1,118 @@ --- -title: Coming Soon -description: Coming Soon +title: Expensify Workspace Expense Settings +description: Expense Settings --- -## Resource Coming Soon! +# Overview + +Expensify offers multiple ways to customize how expenses are created in your workspace. In this doc, you’ll learn how to set up and expense basics, distance expenses, and time expenses. + +Whether you’re flying solo with your Individual workspace or submitting with a team on your Group workspace, we have settings to support how you use Expensify. + +# How to manage expense settings in your workspace + +Let’s cover the expense basics first! In the following sections, we’ll go through each part of managing expense settings in your workspace. + +## Controlling cash expenses + +A cash expense is any expense created manually or by uploading a receipt for SmartScan; a cash expense does not mean the expense was paid for with cash. The other type of expense you’ll most commonly see is credit card expenses, which means the expenses imported from a credit card or bank connection. + +There are four options for cash expenses: + +- **Reimbursable by default** - All cash expenses are reimbursable but can be marked as non-reimbursable as needed. +- **Non-reimbursable by default** - All cash expenses are non-reimbursable but can be marked as reimbursable as needed. +- **Forced always reimbursable** - All cash expenses are forced to be reimbursable; they cannot be marked as non-reimbursable. +- **Forced always non-reimbursable** - All cash expenses are forced to be non-reimbursable; they cannot be marked as reimbursable. + +## Setting up billable expenses + +Billable expenses refer to expenses you or your employees incur that need to be re-billed to a specific client or vendor. + +If you need to track expenses for the purpose of billing them to customers, clients, or other departments, billable expenses are supported in both Individual and Group workspaces. Either way, head to **Settings** > **Workspaces** > **Individual** or **Group** > [_Workspace Name_] > **Expenses**. + +Under Expense Basics, you can choose the setting that is best for you. + +- **Disabled** means expenses are not allowed to be billable at all. +- **Default to billable** means expenses will always be billable but can be marked as non-billable as needed. +- **Default to non-billable** means expenses will always be non-billable but can be marked as billable as needed. + +If your Group workspace is connected to Xero, QuickBooks Online, NetSuite, or Sage Intacct, you can export billable expenses to be invoiced to customers. To set this up, go to the Coding tab in the connection configuration settings. + +## Using eReceipts + +eReceipts are full digital replacements of their paper equivalents for purchases of $75 or less. + +Click the toggle to your preferred configuration. + +- **Enabled** - All imported credit card expenses in US dollars of $75 or less will have eReceipts in the receipt image. +- **Disabled** - No expenses will generate an eReceipt. + +Note: _We will not generate an eReceipt for lodging expenses._ + +## Securing receipt images + +Whether you’re sharing your receipts with your accountant, having an auditor review exported expenses, or simply wanting to export to keep a hard copy for yourself, receipt visibility will be an essential consideration. + +Under _Public Receipt Visibility_, you can determine who can view receipts on your workspace. + +- **Enabled** means receipts are viewable by anyone with the URL. They don't need to be an Expensify user or a workspace member to view receipts. +- **Disabled** means receipts are viewable by users of Expensify, who would have access to view the receipt in the application. You must be an Expensify user with access to the report a receipt is on and logged into your account to view a receipt image via URL. + + +## Track mileage expenses + +Whether using the Individual or Group workspace, you can create distance rates to capture expenses in miles or kilometers. + +Preliminary setup steps include: + +1. Selecting whether you want to capture _miles_ or _kilometers_, +2. Setting the default category to be used on distance expenses, +3. Click **Add A Mileage Rate** to add as many rates as you need, +4. Set the reimbursable amount per mile or kilometer. + +Note: _If a rate is toggled off it is immediately disabled. This means that users are no longer able to select it when creating a new distance expense. If only one rate is available then this rate will be toggled on by default._ + +## Set an hourly rate + +Using Expensify you can track time-based expenses to bill your clients at an hourly rate or allow employees to claim an hourly stipend. + +Click the toggle under the _Time_ section to enable the feature and set a default hourly rate. After that, you and your users will be able to create time-based expenses from the [**Expenses**](https://expensify.com/expenses) page of the account. + +# Deep dives + +## What is Concierge Receipt Audit for the Control Plan? + +Concierge Receipt Audit is a real-time audit and compliance of receipts submitted by employees and workspace users. Concierge checks every receipt for accuracy and compliance, flagging any expenses that seem fishy before expense reports are even submitted for approval. All risky expenses are highlighted for manual review, leaving you with more control over and visibility into expenses. When a report is submitted and there are risky expenses on it, you will be immediately prompted to review the risky expenses and determine the next steps. + +**Why you should use Concierge Receipt Audit** + +- To make sure you don't miss any risky expenses that need human oversight. +- To avoid needing to manually review all your company receipts. +- It's included for free with the [Control Plan](https://www.expensify.com/pricing). +- Instead of paying someone to audit your company expenses or being concerned that your expenses might be audited by a government agency. +- It's easy to use! Concierge will alert you to the risky expense and present it to you in an easy-to-follow review tutorial. +- In addition to the risky expense alerts, Expensify will include a Note with audit details on every report. + +Note: _If a report has audit alerts on it, you'll need to Review the report and Accept the alerts before it can be approved._ + +## Tracking tax on mileage expenses + +If you’re tracking tax in Expensify you can also track tax on distance expenses. The first step is to enable tax the workspace. You can do this by going to **Settings** > **Workspaces** > **Individual** or **Group** > [_Workspace Name_] > **Tax**. + +Once tax is enabled on a workspace level you will see a toggle to _Track Tax_ in the Distance section of the workspace settings. If tax is disabled on the workspace the Track Tax toggle will not display. + +When Track Tax is enabled you will need to enter additional information to the rates you have set, this includes the _Tax Reclaimable on_ and _Tax Rate_ fields. With that information, Expensify will work out the correct tax reclaim for each expense. + +If you enable tax but don’t select a tax rate or enter a tax reclaimable amount, we will not calculate any tax amount for that rate. If, at any point, you switch the tax rate or enter a different reclaimable portion for an existing distance rate, the mileage rate will need to be re-selected on expenses for the tax amount to update according to the new values. + +Note: _Expensify won’t automatically track cumulative mileage. If you need to track cumulative mileage per employee, we recommend building a mileage report using our custom export formulas._ + +# FAQs + +## Why do I see eReceipts for expenses greater than $75? + +An eReceipt is generated for Expensify card purchases of any amount in the following categories: Airlines, Commuter expenses, Gas, Groceries, Mail, Meals, Car rental, Taxis, and Utilities. + +## Why didn’t my rate get updated with the newest rate guidance by the IRS? + +Expensify does not update mileage rates to match the rate provided by the IRS. An admin of the workspace will need to update the rate or create a new rate in the workspace. This is because Expensify has customers worldwide, not just in the United States, and most companies want to communicate the change with employees and control the timing. + diff --git a/docs/articles/expensify-classic/policy-and-domain-settings/reports/Currency.md b/docs/articles/expensify-classic/policy-and-domain-settings/reports/Currency.md index e5c9096fa610..19fd4e8f3723 100644 --- a/docs/articles/expensify-classic/policy-and-domain-settings/reports/Currency.md +++ b/docs/articles/expensify-classic/policy-and-domain-settings/reports/Currency.md @@ -1,5 +1,31 @@ --- title: Currency -description: Currency +description: How currency works in Expensify and how to change the default currency in your Expensify workspace --- -## Resource Coming Soon! +# Overview + +In this article, we’ll outline how to change the default currency in your account and how currency works in Expensify. +Expensify supports expenses in almost every currency in the world. Group workspace admins and individual workspace users can specify the desired output currency for employee reports. Expensify handles the currency conversion process. + +# How to change your default currency + +The default currency for all expenses added to your account is set by the primary company workspace. Just head to **Settings > Workspaces > Group > *[Workspace Name]* > Reports > Report Basics** and select your desired Report Currency. + +If you are not using a group workspace, you can change your default currency under **Settings > Workspaces > Individual > *[Workspace Name]* > Reports** and then choose your desired Report Currency. Please note that the currency selected here will be overridden should you begin reporting on a group workspace. + +# How currency works in Expensify + +When totaling expenses across multiple currencies, we convert them to a single currency, which is the "report currency" of the report's expense workspace, or your personal output currency if no workspace is in use. + +**Important notes:** + +- Currency settings on a workspace are all-or-nothing. To reflect a different output currency in reports, create a new workspace for those employees and adjust the currency settings accordingly. +- Currency settings in the workspace take precedence over a user's individual account settings. + +# How the conversion rate is determined +When converting expenses between currencies, we rely on [Open Exchange Rates](https://openexchangerates.org/) to determine the average bid and ask rate on the expense date. This rate becomes available after the market closes for that day, resulting in varying conversion rates depending on when the expense occurred and how the currencies were trading. + +If the markets were closed on the expense date (e.g., weekends), we use the daily average rate from the last open market day prior to the purchase. For future-dated expenses, we use the most recent available data. Consequently, the report's value may fluctuate until the expense date, potentially leading to unexpected results. You cannot submit reports until the markets have closed for all the expense dates on the report. + +To bypass exchange rate calculations, manually enter expenses in your default currency. These entries will only be converted when included in a report with a different default currency. + diff --git a/docs/articles/expensify-classic/policy-and-domain-settings/reports/Report-Fields-And-Titles.md b/docs/articles/expensify-classic/policy-and-domain-settings/reports/Report-Fields-And-Titles.md index 47b96f495a1c..e79e30ce42c9 100644 --- a/docs/articles/expensify-classic/policy-and-domain-settings/reports/Report-Fields-And-Titles.md +++ b/docs/articles/expensify-classic/policy-and-domain-settings/reports/Report-Fields-And-Titles.md @@ -1,5 +1,43 @@ --- title: Report Fields & Titles -description: Report Fields & Titles +description: This article is about managing Report Fields and Report Titles in Expensify --- -## Resource Coming Soon! +# Overview + +In this article, we'll go over how to use Report Titles and Report Fields. + +## How to use Report Titles + +Default report titles enable group workspace admins or individual workspace users to establish a standardized title format for reports associated with a specific workspace. Additionally, admins have the choice to enforce these report titles, preventing employees from altering them. This ensures uniformity in report naming conventions during the review process, eliminating the need for employees to manually input titles for each report they generate. + +- Group workspace admins can set the Default Report Title from **Settings > Workspaces > Group > *[Workspace Name]* > Reports**. +- Individual users can set the Default Report Title from **Settings > Workspaces > Individual > *[Workspace Name]* > Reports**. + +You can configure the title by using the formulas that we provide to populate the Report Title. Take a look at the help article on Custom Formulas to find all eligible formulas for your Report Titles. + +## Deep Dive on Report Titles + +Some formulas will automatically update the report title as changes are made to the report. For example, any formula related to dates, total amounts, workspace name, would adjust the title before the report is submitted for approval. Changes will not retroactively update report titles for reports which have been Approved or Reimbursed. + +To prevent report title editing by employees, simply enable "Enforce Default Report Title." + +## How to use Report Fields + +Report fields let you specify header-level details, distinct from tags which pertain to expenses on individual line items. These details can encompass specific project names, business trip information, locations, and more. Customize them according to your workspace's requirements. + +To set up Report Fields, follow these steps: +- Workspace Admins can create report fields for group workspaces from **Settings > Workspaces > Group > *[Workspace Name]* > Reports > Report and Invoice Fields**. For individual workspaces, follow **Settings > Workspaces > Individual > *[Workspace Name]* > Reports > Report and Invoice Fields**. +- Under "Add New Field," enter the desired field name in the "Field Title" to describe the type of information to be selected. +- Choose the appropriate input method under "Type": + - Text: Provides users with a free-text box to enter the requested information. + - Dropdown: Creates a selection of options for users to choose from. + - Date: Displays a clickable box that opens a calendar for users to select a date. + +## Deep Dive on Report Fields + +You cannot create these report fields directly in Expensify if you are connected to an accounting integration (QuickBooks Online, QuickBooks Desktop, Intacct, Xero, or NetSuite). Please refer to the relevant article for instructions on creating fields within that system. + +When report fields are configured on a workspace, they become mandatory information for associated reports. Leaving a report field empty or unselected will trigger a report violation, potentially blocking report submission or export. + +Report fields are "sticky," which means that any changes made by an employee will persist and be reflected in subsequent reports they create. + diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index fb13a410dd8e..23e9a98a9629 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -40,7 +40,7 @@ CFBundleVersion - 1.3.75.8 + 1.3.75.11 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index 2168da376988..884394a03de4 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 1.3.75.8 + 1.3.75.11 diff --git a/package-lock.json b/package-lock.json index e31fae9ded6d..9737202667f7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "1.3.75-8", + "version": "1.3.75-11", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "1.3.75-8", + "version": "1.3.75-11", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -81,12 +81,12 @@ "react-native-fast-image": "^8.6.3", "react-native-fs": "^2.20.0", "react-native-gesture-handler": "2.12.0", - "react-native-google-places-autocomplete": "git+https://github.com/Expensify/react-native-google-places-autocomplete.git#cef3ac29d9501091453136e1219e24c4ec9f9d76", + "react-native-google-places-autocomplete": "git+https://github.com/Expensify/react-native-google-places-autocomplete.git#c8c2a873335df19081056a5667f5c109583882e1", "react-native-haptic-feedback": "^1.13.0", "react-native-image-pan-zoom": "^2.1.12", "react-native-image-picker": "^5.1.0", "react-native-image-size": "git+https://github.com/Expensify/react-native-image-size#8393b7e58df6ff65fd41f60aee8ece8822c91e2b", - "react-native-key-command": "^1.0.1", + "react-native-key-command": "^1.0.5", "react-native-linear-gradient": "^2.8.1", "react-native-localize": "^2.2.6", "react-native-modal": "^13.0.0", @@ -41099,8 +41099,8 @@ }, "node_modules/react-native-google-places-autocomplete": { "version": "2.5.1", - "resolved": "git+ssh://git@github.com/Expensify/react-native-google-places-autocomplete.git#cef3ac29d9501091453136e1219e24c4ec9f9d76", - "integrity": "sha512-2z3ED8jOXasPTzBqvPwpG10LQsBArTRsYszmoz+TfqbgZrSBmP3c8rhaC//lx6Pvfs2r+KYWqJUrLf4mbCrjZw==", + "resolved": "git+ssh://git@github.com/Expensify/react-native-google-places-autocomplete.git#c8c2a873335df19081056a5667f5c109583882e1", + "integrity": "sha512-jYQJlI5Pp/UI4k4Xy9fqnE0x4BC+O6c5Fh7I+7SjtaywA5KpZqQcYApx2e9YcH/igJ4Rdp/n4awKPX+vE5vFcg==", "license": "MIT", "dependencies": { "lodash.debounce": "^4.0.8", @@ -41151,19 +41151,25 @@ "license": "MIT" }, "node_modules/react-native-key-command": { - "version": "1.0.1", - "license": "MIT", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/react-native-key-command/-/react-native-key-command-1.0.5.tgz", + "integrity": "sha512-SJWf1e8f3yGFrFDNCmJ+aiGmnwokGgtMicfvuyukhQtXkncCQb9pBI4uhBen0Bd30uMmUDgGAA9O56OyIdf5jw==", "dependencies": { - "events": "^3.3.0", + "eventemitter3": "^5.0.1", "underscore": "^1.13.4" }, "peerDependencies": { "react": "^18.1.0", "react-dom": "18.1.0", "react-native": "^0.70.4", - "react-native-web": "^0.18.1" + "react-native-web": "^0.19.7" } }, + "node_modules/react-native-key-command/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, "node_modules/react-native-linear-gradient": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/react-native-linear-gradient/-/react-native-linear-gradient-2.8.1.tgz", @@ -41491,21 +41497,23 @@ } }, "node_modules/react-native-web": { - "version": "0.18.12", - "license": "MIT", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/react-native-web/-/react-native-web-0.19.9.tgz", + "integrity": "sha512-m69arZbS6FV+BNSKE6R/NQwUX+CzxCkYM7AJlSLlS8dz3BDzlaxG8Bzqtzv/r3r1YFowhnZLBXVKIwovKDw49g==", "peer": true, "dependencies": { "@babel/runtime": "^7.18.6", - "create-react-class": "^15.7.0", + "@react-native/normalize-color": "^2.1.0", "fbjs": "^3.0.4", "inline-style-prefixer": "^6.0.1", - "normalize-css-color": "^1.0.2", + "memoize-one": "^6.0.0", + "nullthrows": "^1.1.1", "postcss-value-parser": "^4.2.0", - "styleq": "^0.1.2" + "styleq": "^0.1.3" }, "peerDependencies": { - "react": "^17.0.2 || ^18.0.0", - "react-dom": "^17.0.2 || ^18.0.0" + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, "node_modules/react-native-web-linear-gradient": { @@ -41526,6 +41534,12 @@ "react-native-web": "*" } }, + "node_modules/react-native-web/node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "peer": true + }, "node_modules/react-native-webview": { "version": "11.23.0", "license": "MIT", @@ -45183,8 +45197,9 @@ } }, "node_modules/styleq": { - "version": "0.1.2", - "license": "MIT" + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/styleq/-/styleq-0.1.3.tgz", + "integrity": "sha512-3ZUifmCDCQanjeej1f6kyl/BeP/Vae5EYkQ9iJfUm/QwZvlgnZzyflqAsAWYURdtea8Vkvswu2GrC57h3qffcA==" }, "node_modules/sudo-prompt": { "version": "9.2.1", @@ -77213,9 +77228,9 @@ } }, "react-native-google-places-autocomplete": { - "version": "git+ssh://git@github.com/Expensify/react-native-google-places-autocomplete.git#cef3ac29d9501091453136e1219e24c4ec9f9d76", - "integrity": "sha512-2z3ED8jOXasPTzBqvPwpG10LQsBArTRsYszmoz+TfqbgZrSBmP3c8rhaC//lx6Pvfs2r+KYWqJUrLf4mbCrjZw==", - "from": "react-native-google-places-autocomplete@git+https://github.com/Expensify/react-native-google-places-autocomplete.git#cef3ac29d9501091453136e1219e24c4ec9f9d76", + "version": "git+ssh://git@github.com/Expensify/react-native-google-places-autocomplete.git#c8c2a873335df19081056a5667f5c109583882e1", + "integrity": "sha512-jYQJlI5Pp/UI4k4Xy9fqnE0x4BC+O6c5Fh7I+7SjtaywA5KpZqQcYApx2e9YcH/igJ4Rdp/n4awKPX+vE5vFcg==", + "from": "react-native-google-places-autocomplete@git+https://github.com/Expensify/react-native-google-places-autocomplete.git#c8c2a873335df19081056a5667f5c109583882e1", "requires": { "lodash.debounce": "^4.0.8", "prop-types": "^15.7.2", @@ -77245,10 +77260,19 @@ "from": "react-native-image-size@git+https://github.com/Expensify/react-native-image-size#8393b7e58df6ff65fd41f60aee8ece8822c91e2b" }, "react-native-key-command": { - "version": "1.0.1", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/react-native-key-command/-/react-native-key-command-1.0.5.tgz", + "integrity": "sha512-SJWf1e8f3yGFrFDNCmJ+aiGmnwokGgtMicfvuyukhQtXkncCQb9pBI4uhBen0Bd30uMmUDgGAA9O56OyIdf5jw==", "requires": { - "events": "^3.3.0", + "eventemitter3": "^5.0.1", "underscore": "^1.13.4" + }, + "dependencies": { + "eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + } } }, "react-native-linear-gradient": { @@ -77439,16 +77463,27 @@ "requires": {} }, "react-native-web": { - "version": "0.18.12", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/react-native-web/-/react-native-web-0.19.9.tgz", + "integrity": "sha512-m69arZbS6FV+BNSKE6R/NQwUX+CzxCkYM7AJlSLlS8dz3BDzlaxG8Bzqtzv/r3r1YFowhnZLBXVKIwovKDw49g==", "peer": true, "requires": { "@babel/runtime": "^7.18.6", - "create-react-class": "^15.7.0", + "@react-native/normalize-color": "^2.1.0", "fbjs": "^3.0.4", "inline-style-prefixer": "^6.0.1", - "normalize-css-color": "^1.0.2", + "memoize-one": "^6.0.0", + "nullthrows": "^1.1.1", "postcss-value-parser": "^4.2.0", - "styleq": "^0.1.2" + "styleq": "^0.1.3" + }, + "dependencies": { + "memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "peer": true + } } }, "react-native-web-linear-gradient": { @@ -79905,7 +79940,9 @@ } }, "styleq": { - "version": "0.1.2" + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/styleq/-/styleq-0.1.3.tgz", + "integrity": "sha512-3ZUifmCDCQanjeej1f6kyl/BeP/Vae5EYkQ9iJfUm/QwZvlgnZzyflqAsAWYURdtea8Vkvswu2GrC57h3qffcA==" }, "sudo-prompt": { "version": "9.2.1", diff --git a/package.json b/package.json index 6f00a174971e..21d64eb02859 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "1.3.75-8", + "version": "1.3.75-11", "author": "Expensify, Inc.", "homepage": "https://new.expensify.com", "description": "New Expensify is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.", @@ -124,12 +124,12 @@ "react-native-fast-image": "^8.6.3", "react-native-fs": "^2.20.0", "react-native-gesture-handler": "2.12.0", - "react-native-google-places-autocomplete": "git+https://github.com/Expensify/react-native-google-places-autocomplete.git#cef3ac29d9501091453136e1219e24c4ec9f9d76", + "react-native-google-places-autocomplete": "git+https://github.com/Expensify/react-native-google-places-autocomplete.git#c8c2a873335df19081056a5667f5c109583882e1", "react-native-haptic-feedback": "^1.13.0", "react-native-image-pan-zoom": "^2.1.12", "react-native-image-picker": "^5.1.0", "react-native-image-size": "git+https://github.com/Expensify/react-native-image-size#8393b7e58df6ff65fd41f60aee8ece8822c91e2b", - "react-native-key-command": "^1.0.1", + "react-native-key-command": "^1.0.5", "react-native-linear-gradient": "^2.8.1", "react-native-localize": "^2.2.6", "react-native-modal": "^13.0.0", diff --git a/src/ONYXKEYS.ts b/src/ONYXKEYS.ts index a1afc4fef2c1..0a17d3a1d2f7 100755 --- a/src/ONYXKEYS.ts +++ b/src/ONYXKEYS.ts @@ -238,6 +238,9 @@ const ONYXKEYS = { POLICY_RECENTLY_USED_TAGS: 'policyRecentlyUsedTags_', WORKSPACE_INVITE_MEMBERS_DRAFT: 'workspaceInviteMembersDraft_', REPORT: 'report_', + // REPORT_METADATA is a perf optimization used to hold loading states (isLoadingReportActions, isLoadingMoreReportActions). + // A lot of components are connected to the Report entity and do not care about the actions. Setting the loading state + // directly on the report caused a lot of unnecessary re-renders REPORT_METADATA: 'reportMetadata_', REPORT_ACTIONS: 'reportActions_', REPORT_ACTIONS_DRAFTS: 'reportActionsDrafts_', diff --git a/src/components/AddressSearch/index.js b/src/components/AddressSearch/index.js index 1b4200572664..14d13a63eec3 100644 --- a/src/components/AddressSearch/index.js +++ b/src/components/AddressSearch/index.js @@ -291,6 +291,12 @@ function AddressSearch(props) { {props.translate('common.noResultsFound')} ) } + renderHeaderComponent={() => + !props.value && + props.predefinedPlaces && ( + {props.translate('common.recentDestinations')} + ) + } onPress={(data, details) => { saveLocationDetails(data, details); diff --git a/src/components/Button/index.js b/src/components/Button/index.js index 4ca933a45d6f..dc12a4ded5c2 100644 --- a/src/components/Button/index.js +++ b/src/components/Button/index.js @@ -18,6 +18,9 @@ import PressableWithFeedback from '../Pressable/PressableWithFeedback'; import refPropTypes from '../refPropTypes'; const propTypes = { + /** Should the press event bubble across multiple instances when Enter key triggers it. */ + allowBubble: PropTypes.bool, + /** The text for the button label */ text: PropTypes.string, @@ -123,6 +126,7 @@ const propTypes = { }; const defaultProps = { + allowBubble: false, text: '', shouldShowRightIcon: false, icon: null, @@ -183,7 +187,7 @@ class Button extends Component { shortcutConfig.descriptionKey, shortcutConfig.modifiers, true, - false, + this.props.allowBubble, this.props.enterKeyEventListenerPriority, false, ); diff --git a/src/components/ButtonWithDropdownMenu.js b/src/components/ButtonWithDropdownMenu.js index 54d6c0deac5a..a0a6e276bc28 100644 --- a/src/components/ButtonWithDropdownMenu.js +++ b/src/components/ButtonWithDropdownMenu.js @@ -19,6 +19,9 @@ const propTypes = { /** Callback to execute when the main button is pressed */ onPress: PropTypes.func.isRequired, + /** Call the onPress function on main button when Enter key is pressed */ + pressOnEnter: PropTypes.bool, + /** Whether we should show a loading state for the main button */ isLoading: PropTypes.bool, @@ -57,6 +60,7 @@ const propTypes = { const defaultProps = { isLoading: false, isDisabled: false, + pressOnEnter: false, menuHeaderText: '', style: [], buttonSize: CONST.DROPDOWN_BUTTON_SIZE.MEDIUM, @@ -101,6 +105,7 @@ function ButtonWithDropdownMenu(props) {