Skip to content

Commit

Permalink
Merge branch 'main' into rules/category-rules
Browse files Browse the repository at this point in the history
  • Loading branch information
WojtekBoman committed Sep 5, 2024
2 parents 3abcbdb + 8a35256 commit c592466
Show file tree
Hide file tree
Showing 253 changed files with 4,703 additions and 2,729 deletions.
5 changes: 2 additions & 3 deletions .github/actions/composite/buildAndroidE2EAPK/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,14 +51,13 @@ runs:
- uses: Expensify/App/.github/actions/composite/setupNode@main

- name: Setup Java
uses: actions/setup-java@v3
uses: actions/setup-java@v4
with:
distribution: "oracle"
java-version: "17"

- uses: ruby/setup-ruby@v1.187.0
- uses: ruby/setup-ruby@v1.190.0
with:
ruby-version: "2.7"
bundler-cache: true

- uses: gradle/gradle-build-action@3fbe033aaae657f011f88f29be9e65ed26bd29ef
Expand Down
6 changes: 6 additions & 0 deletions .github/scripts/verifyRedirect.sh
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,12 @@ while read -r line; do
SOURCE_URL=${LINE_PARTS[0]}
DEST_URL=${LINE_PARTS[1]}

# Make sure that the source and destination are not identical
if [[ "$SOURCE_URL" == "$DEST_URL" ]]; then
error "Source and destination URLs are identical: $SOURCE_URL"
exit 1
fi

# Make sure the format of the line is as expected.
if [[ "${#LINE_PARTS[@]}" -gt 2 ]]; then
error "Found a line with more than one comma: $line"
Expand Down
8 changes: 3 additions & 5 deletions .github/workflows/platformDeploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,15 +54,14 @@ jobs:
uses: ./.github/actions/composite/setupNode

- name: Setup Java
uses: actions/setup-java@v3
uses: actions/setup-java@v4
with:
distribution: 'oracle'
java-version: '17'

- name: Setup Ruby
uses: ruby/setup-ruby@v1.187.0
uses: ruby/setup-ruby@v1.190.0
with:
ruby-version: '2.7'
bundler-cache: true

- name: Decrypt keystore
Expand Down Expand Up @@ -186,9 +185,8 @@ jobs:
uses: ./.github/actions/composite/setupNode

- name: Setup Ruby
uses: ruby/setup-ruby@v1.187.0
uses: ruby/setup-ruby@v1.190.0
with:
ruby-version: '2.7'
bundler-cache: true

- name: Cache Pod dependencies
Expand Down
8 changes: 3 additions & 5 deletions .github/workflows/testBuild.yml
Original file line number Diff line number Diff line change
Expand Up @@ -81,15 +81,14 @@ jobs:
uses: ./.github/actions/composite/setupNode

- name: Setup Java
uses: actions/setup-java@v3
uses: actions/setup-java@v4
with:
distribution: 'oracle'
java-version: '17'

- name: Setup Ruby
uses: ruby/setup-ruby@v1.187.0
uses: ruby/setup-ruby@v1.190.0
with:
ruby-version: '2.7'
bundler-cache: true

- name: Decrypt keystore
Expand Down Expand Up @@ -161,9 +160,8 @@ jobs:
run: sudo xcode-select -switch /Applications/Xcode_15.2.0.app

- name: Setup Ruby
uses: ruby/setup-ruby@v1.187.0
uses: ruby/setup-ruby@v1.190.0
with:
ruby-version: '2.7'
bundler-cache: true

- name: Cache Pod dependencies
Expand Down
1 change: 1 addition & 0 deletions .ruby-version
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
3.3.4
5 changes: 1 addition & 4 deletions .storybook/preview.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import {LocaleContextProvider} from '@src/components/LocaleContextProvider';
import OnyxProvider from '@src/components/OnyxProvider';
import {EnvironmentProvider} from '@src/components/withEnvironment';
import {KeyboardStateProvider} from '@src/components/withKeyboardState';
import {WindowDimensionsProvider} from '@src/components/withWindowDimensions';
import ONYXKEYS from '@src/ONYXKEYS';
import './fonts.css';

Expand All @@ -22,9 +21,7 @@ Onyx.init({

const decorators = [
(Story: React.ElementType) => (
<ComposeProviders
components={[OnyxProvider, LocaleContextProvider, HTMLEngineProvider, SafeAreaProvider, PortalProvider, EnvironmentProvider, KeyboardStateProvider, WindowDimensionsProvider]}
>
<ComposeProviders components={[OnyxProvider, LocaleContextProvider, HTMLEngineProvider, SafeAreaProvider, PortalProvider, EnvironmentProvider, KeyboardStateProvider]}>
<Story />
</ComposeProviders>
),
Expand Down
2 changes: 1 addition & 1 deletion Gemfile
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
source "https://rubygems.org"

# You may use http://rbenv.org/ or https://rvm.io/ to install and use this version
ruby ">= 2.6.10"
ruby ">= 3.3.4"

gem "cocoapods", "= 1.15.2"
gem 'activesupport', '>= 6.1.7.5', '!= 7.1.0'
Expand Down
2 changes: 1 addition & 1 deletion Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,7 @@ DEPENDENCIES
xcpretty (~> 0)

RUBY VERSION
ruby 2.6.10p210
ruby 3.3.4p94

BUNDLED WITH
2.4.19
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -142,14 +142,14 @@ You create this certificate by following the instructions in [`Configuring HTTPS
3. Install the certificate as CA certificate from the settings. On the Android emulator, this option can be found in Settings > Security > Encryption & Credentials > Install a certificate > CA certificate.
4. Close the emulator.

Note - If you want to run app on `https://127.0.0.1:8082`, then just install the certificate and use `adb reverse tcp:8082 tcp:8082` on every startup.
**Note:** If you want to run app on `https://127.0.0.1:8082`, then just install the certificate and use `adb reverse tcp:8082 tcp:8082` on every startup.

#### Android Flow
1. Run `npm run setupNewDotWebForEmulators android`
2. Select the emulator you want to run if prompted. (If single emulator is available, then it will open automatically)
3. Let the script execute till the message `🎉 Done!`.

Note - If you want to run app on `https://dev.new.expensify.com:8082`, then just do the Android flow and use `npm run startAndroidEmulator` to start the Android Emulator every time (It will configure the emulator).
**Note:** If you want to run app on `https://dev.new.expensify.com:8082`, then just do the Android flow and use `npm run startAndroidEmulator` to start the Android Emulator every time (It will configure the emulator).


Possible Scenario:
Expand Down Expand Up @@ -392,7 +392,7 @@ In most cases, the code written for this repo should be platform-independent. In
- Web => `index.website.js`
- Desktop => `index.desktop.js`
Note that `index.js` should be the default and only platform-specific implementations should be done in their respective files. i.e: If you have mobile-specific implementation in `index.native.js`, then the desktop/web implementation can be contained in a shared `index.js`.
**Note:** `index.js` should be the default and only platform-specific implementations should be done in their respective files. i.e: If you have mobile-specific implementation in `index.native.js`, then the desktop/web implementation can be contained in a shared `index.js`.
`index.ios.js` and `index.android.js` are used when the app is running natively on respective platforms. These files are not used when users access the app through mobile browsers, but `index.website.js` is used instead. `index.native.js` are for both iOS and Android native apps. `index.native.js` should not be included in the same module as `index.ios.js` or `index.android.js`.
Expand Down
2 changes: 0 additions & 2 deletions __mocks__/react-native.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ jest.doMock('react-native', () => {
type ReactNativeMock = typeof ReactNative & {
NativeModules: typeof ReactNative.NativeModules & {
BootSplash: {
getVisibilityStatus: typeof BootSplash.getVisibilityStatus;
hide: typeof BootSplash.hide;
logoSizeRatio: number;
navigationBarHeight: number;
Expand All @@ -46,7 +45,6 @@ jest.doMock('react-native', () => {
NativeModules: {
...ReactNative.NativeModules,
BootSplash: {
getVisibilityStatus: jest.fn(),
hide: jest.fn(),
logoSizeRatio: 1,
navigationBarHeight: 0,
Expand Down
4 changes: 2 additions & 2 deletions android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -110,8 +110,8 @@ android {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
multiDexEnabled rootProject.ext.multiDexEnabled
versionCode 1009002900
versionName "9.0.29-0"
versionCode 1009002907
versionName "9.0.29-7"
// Supported language variants must be declared here to avoid from being removed during the compilation.
// This also helps us to not include unnecessary language variants in the APK.
resConfigs "en", "es"
Expand Down
28 changes: 28 additions & 0 deletions assets/images/product-illustrations/broken-magnifying-glass.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
---
title: Pay Bills
description: Expensify bill management and payment methods.
---
Streamline your operations by receiving and paying vendor or supplier bills directly in Expensify. Vendors can send bills even if they don't have an Expensify account, and you can manage payments seamlessly.

## Receive Bills in Expensify
You can receive bills in three ways:
- Directly from Vendors: Provide your Expensify billing email to vendors.
- Forwarding Emails: Forward bills received in your email to Expensify.
- Manual Upload: For physical bills, create a Bill in Expensify from the Reports page.

## Bill Pay Workflow
1. When a vendor or supplier sends a bill to Expensify, the document is automatically SmartScanned, and a Bill is created. This Bill is managed by the primary domain contact, who can view it on the Reports page within their default group policy.

2. Once the Bill is ready for processing, it follows the established approval workflow. As each person approves it, the Bill appears in the next approver’s Inbox. The final approver will pay the Bill using one of the available payment methods.

3. During this process, the Bill is coded with the appropriate GL codes from your connected accounting software. After completing the approval workflow, the Bill can be exported back to your accounting system.

## Payment Methods
There are multiple ways to pay Bills in Expensify. Let’s go over each method below.

### ACH bank-to-bank transfer

To use this payment method, you must have a [business bank account connected to your Expensify account](https://help.expensify.com/articles/expensify-classic/bank-accounts-and-payments/bank-accounts/Connect-US-Business-Bank-Account).

**To pay with an ACH bank-to-bank transfer:**
1. Sign in to your [Expensify web account](www.expensify.com).
2. Go to the Home or Reports page and locate the Bill that needs to be paid.
3. Click the Pay button to be redirected to the Bill.
4. Choose the ACH option from the drop-down list.

**Fees:** None

### Credit or Debit Card
This option is available to all US and International customers receiving a bill from a US vendor with a US business bank account.

**To pay with a credit or debit card:**
1. Sign in to your [Expensify web account](www.expensify.com).
2. Click on the Bill you’d like to pay to see the details.
3. Click the Pay button.
4. Enter your credit card or debit card details.

**Fees:** 2.9% of the total amount paid.

### Venmo
If both you and the vendor must have Venmo connected to Expensify, you can pay the bill by following the steps outlined [here](https://help.expensify.com/articles/expensify-classic/bank-accounts-and-payments/Third-Party-Payments#setting-up-third-party-payments).

**Fees:** Venmo charges a 3% sender’s fee.


### Pay outside of Expensify
If you are unable to pay using one of the above methods, you can still mark the Bill as paid. This will update its status to indicate that the payment was made outside Expensify.

**To mark a Bill as paid outside of Expensify:**
1. Sign in to your [Expensify web account](www.expensify.com).
2. Click on the Bill you’d like to pay to see the details.
3. Click the Reimburse button.
4. Choose **I’ll do it manually**.

**Fees:** None.

{% include faq-begin.md %}

## Who receives vendor bills in Expensify?
Bills are sent to the Primary Contact listed under **Settings > Domains > [Domain Name] > Domain Admins**.

## Who can view and pay a Bill?
Only the primary domain contact can view and pay a Bill.

## How can others access Bills?
The primary contact can share Bills or grant Copilot access for others to manage payments.

## Is Bill Pay supported internationally?
Currently, payments are only supported in USD.

## What's the difference between a Bill and an Invoice in Expensify?
A Bill represents a payable amount owed to a vendor, while an Invoice is a receivable amount owed to you.
{% include faq-end.md %}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
---
title: Out-of-date Billing
description: What to do if you receive an out-of-date billing notification
---

A notification that your workspace has out-of-date billing will appear for one of the following reasons:

- A workspace you’re an Admin for has an expired/invalid payment card or insufficient funds.
- Your company’s Expensify trial has ended and it’s time to [upgrade your subscription](https://help.expensify.com/articles/expensify-classic/expensify-billing/Change-Plan-Or-Subscription).

## Step 1: Determine who the billing owner is

1. Hover over **Settings** and click **Workspaces**.
2. Click the name of the workspace that has the `!` symbol next to it.
3. Review who is listed as the Billing Owner.
4. Have this person complete the steps below, or you can click **Take Over Billing** if you will take over handling payments for the Expensify workspace.

## Step 2: Retry payment or update the payment card

{% include info.html %}
This step must be completed by the Billing Owner.
{% include end-info.html %}

1. Ensure that the card or bank account has sufficient funds for the payment.
2. Hover over **Settings** and click **Account**.
3. Click the **Payments** tab on the left.
4. Click **Retry Billing** if there were originally insufficient funds in the payment account, or click **Add Payment Card** to add a payment method.

Once the payment is processed, the out-of-date billing notification will disappear.
Loading

0 comments on commit c592466

Please sign in to comment.