Skip to content

Commit

Permalink
Merge branch 'main' of https://github.com/rezkiy37/Expensify into fea…
Browse files Browse the repository at this point in the history
…ture/51528-multiple-invoices-page
  • Loading branch information
rezkiy37 committed Nov 25, 2024
2 parents 1d3f3fd + bd95c30 commit cd83557
Show file tree
Hide file tree
Showing 331 changed files with 9,201 additions and 3,776 deletions.
2 changes: 1 addition & 1 deletion .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ This is a checklist for PR authors. Please make sure to complete all tasks and c
- [ ] I verified that comments were added to code that is not self explanatory
- [ ] I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
- [ ] I verified any copy / text shown in the product is localized by adding it to `src/languages/*` files and using the [translation method](https://github.com/Expensify/App/blob/4bd99402cebdf4d7394e0d1f260879ea238197eb/src/components/withLocalize.js#L60)
- [ ] If any non-english text was added/modified, I verified the translation was requested/reviewed in #expensify-open-source and it was approved by an internal Expensify engineer. Link to Slack message:
- [ ] If any non-english text was added/modified, I used [JaimeGPT](https://chatgpt.com/g/g-2dgOQl5VM-english-to-spanish-translator-aka-jaimegpt) to get English > Spanish translation. I then posted it in #expensify-open-source and it was approved by an internal Expensify engineer. Link to Slack message:
- [ ] I verified all numbers, amounts, dates and phone numbers shown in the product are using the [localization methods](https://github.com/Expensify/App/blob/4bd99402cebdf4d7394e0d1f260879ea238197eb/src/components/withLocalize.js#L60-L68)
- [ ] I verified any copy / text that was added to the app is grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
- [ ] I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,7 @@ Often times in order to write a unit test, you may need to mock data, a componen
to help run our Unit tests.

* To run the **Jest unit tests**: `npm run test`
* UI tests guidelines can be found [here](tests/ui/README.md)

## Performance tests
We use Reassure for monitoring performance regression. More detailed information can be found [here](tests/perf-test/README.md):
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 1009006403
versionName "9.0.64-3"
versionCode 1009006603
versionName "9.0.66-3"
// 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
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import android.database.CursorWindow
import android.os.Process
import androidx.multidex.MultiDexApplication
import com.expensify.chat.bootsplash.BootSplashPackage
import com.expensify.chat.navbar.NavBarManagerPackage
import com.expensify.chat.shortcutManagerModule.ShortcutManagerPackage
import com.facebook.react.PackageList
import com.facebook.react.ReactApplication
Expand Down Expand Up @@ -36,6 +37,7 @@ class MainApplication : MultiDexApplication(), ReactApplication {
add(BootSplashPackage())
add(ExpensifyAppPackage())
add(RNTextInputResetPackage())
add(NavBarManagerPackage())
}

override fun getJSMainModuleName() = ".expo/.virtual-metro-entry"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.expensify.chat.navbar

import androidx.core.view.WindowInsetsControllerCompat
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.ReactContextBaseJavaModule
import com.facebook.react.bridge.ReactMethod
import com.facebook.react.bridge.UiThreadUtil;

class NavBarManagerModule(
private val mReactContext: ReactApplicationContext,
) : ReactContextBaseJavaModule(mReactContext) {
override fun getName(): String = "RNNavBarManager"

@ReactMethod
fun setButtonStyle(style: String) {
UiThreadUtil.runOnUiThread {
mReactContext.currentActivity?.window?.let {
WindowInsetsControllerCompat(it, it.decorView).let { controller ->
when (style) {
"light" -> controller.isAppearanceLightNavigationBars = false
"dark" -> controller.isAppearanceLightNavigationBars = true
}
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.expensify.chat.navbar

import com.facebook.react.ReactPackage
import com.facebook.react.bridge.NativeModule
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.uimanager.ViewManager

class NavBarManagerPackage : ReactPackage {
override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
return emptyList()
}

override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> {
val modules: MutableList<NativeModule> = ArrayList()
modules.add(NavBarManagerModule(reactContext))
return modules
}
}
4 changes: 4 additions & 0 deletions android/app/src/main/res/values/styles.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
<style name="BaseAppTheme" parent="Theme.AppCompat.NoActionBar">
<item name="android:colorEdgeEffect">@color/gray4</item>
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:navigationBarColor">@android:color/transparent</item>
<item name="android:enforceNavigationBarContrast">false</item>
<item name="colorAccent">@color/accent</item>
<item name="android:editTextBackground">@drawable/rn_edit_text_material</item>
<item name="popupTheme">@style/AppTheme.Popup</item>
Expand Down Expand Up @@ -59,6 +61,8 @@

<style name="BootTheme" parent="Theme.SplashScreen">
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:navigationBarColor">@android:color/transparent</item>
<item name="android:enforceNavigationBarContrast">false</item>
<item name="windowSplashScreenAnimatedIcon">@drawable/bootsplash_logo</item>
<item name="windowSplashScreenBackground">@color/bootsplash_background</item>
</style>
Expand Down
8 changes: 8 additions & 0 deletions desktop/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,14 @@ const {DESKTOP_SHORTCUT_ACCELERATOR, LOCALES} = CONST;
// geolocation api (window.navigator.geolocation.getCurrentPosition) to work on desktop.
// Source: https://github.com/electron/electron/blob/98cd16d336f512406eee3565be1cead86514db7b/docs/api/environment-variables.md#google_api_key
process.env.GOOGLE_API_KEY = CONFIG.GCP_GEOLOCATION_API_KEY;
/**
* Suppresses Content Security Policy (CSP) console warnings related to 'unsafe-eval'.
* This is required because:
* 1. Webpack utilizes eval() for module bundling
* 2. The application requires 'unsafe-eval' in CSP to function properly
* Note: CSP warnings are expected and unavoidable in this context
*/
process.env.ELECTRON_DISABLE_SECURITY_WARNINGS = CONFIG.ELECTRON_DISABLE_SECURITY_WARNINGS;

app.setName('New Expensify');

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
---
title: Receive and Pay Bills
description: Expensify bill management and payment methods.
---

Easily receive and pay vendor or supplier bills directly in Expensify. Your vendors don’t even need an Expensify account! Manage everything seamlessly in one place.

# Receiving Bills

Expensify makes it easy to receive bills in three simple ways:

### 1. Directly from Vendors
Share your Expensify billing email with vendors to receive bills automatically.

- Set a Primary Contact under **Settings > Domains > Domain Admins**.
- Ask vendors to email bills to your billing address: `[email protected]` (e.g., for *expensify.com*, use `[email protected]`).
- Once emailed, the bill is automatically created in Expensify, ready for payment.

### 2. Forwarding Emails
Received a bill in your email? Forward it to Expensify.

- Ensure your Primary Contact is set under **Settings > Domains > Domain Admins**.
- Forward bills to `[email protected]`. Example: `[email protected]` (e.g., for *expensify.com*, use `[email protected]`).
- Expensify will create a bill automatically, ready for payment.

### 3. Manual Upload
Got a paper bill? Create a bill manually in [Expensify](https://www.expensify.com/):

1. Log in to [Expensify](https://www.expensify.com).
2. Go to **Reports > New Report > Bill**.
3. Enter the invoice details: sender’s email, merchant name, amount, and date.
4. Upload the invoice as a receipt.


# Paying Bills in Expensify

Expensify makes it easy to manage and pay vendor bills with a straightforward workflow and flexible payment options. Here’s how it works:

## Bill Pay Workflow

1. **SmartScan & Create**: When a vendor sends a bill, Expensify automatically SmartScans the document and creates a bill.
2. **Submission to Primary Contact**: The bill is submitted to the primary contact, who can review it on the Reports page under their default group policy.
3. **Communication**: If the approver needs clarification, they can communicate directly with the sender via the invoice linked to the bill.
4. **Approval Workflow**: Once reviewed, the bill follows your workspace’s approval process. The final approver handles the payment.
5. **Accounting Integration**: During approval, the bill is coded with the correct GL codes from your connected accounting software. Once approved, it can be exported back to your accounting system.

## Payment Methods

Expensify offers several ways to pay bills. Choose the method that works best for you:

### 1. ACH Bank-to-Bank Transfer

Fast and fee-free, this method requires a connected [business bank account](https://help.expensify.com/articles/expensify-classic/bank-accounts-and-payments/bank-accounts/Connect-US-Business-Bank-Account).

**How to Pay via ACH:**
1. Log in to your [Expensify web account](https://www.expensify.com/).
2. Find the bill on the Home or Reports page.
3. Click **Pay** and select the ACH option.

**Fees:** None.

---

### 2. Credit or Debit Card

Pay vendors using a credit or debit card. This option is available for US and international customers paying US vendors with a US business bank account.

**How to Pay with a Card:**
1. Log in to your [Expensify web account](https://www.expensify.com/).
2. Open the bill details and click **Pay**.
3. Enter your card information to complete the payment.

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

---

### 3. Venmo

If both you and the vendor have Venmo accounts connected to Expensify, you can pay through Venmo. Learn how to set up Venmo [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.

---

### 4. Pay Outside Expensify

If you prefer to pay outside Expensify, you can still track the payment within the platform.

**How to Mark as Paid Outside Expensify:**
1. Log in to your [Expensify web account](https://www.expensify.com/).
2. Open the bill details and click **Pay**.
3. Select **Mark as Paid** to update its status.

**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
Expand Up @@ -8,7 +8,7 @@ Welcome to the world of effortless expense tracking! Connecting your personal cr
## How to connect your personal card to import expenses
Importing your card or bank via Account Settings will:
Automatically sync your bank/card transactions with your Expensify account. These will merge seamlessly with any SmartScanned expenses in your account.
Generate IRS-compliant eReceipts, provided your Policy Admin has enabled this feature.
Generate IRS-compliant eReceipts, provided your Workspace Admin has enabled this feature.
Discover below the numerous ways to easily bring your personal card expenses into Expensify below.

### *Important terms to know:*
Expand Down Expand Up @@ -45,7 +45,7 @@ _Please note: an OFX file type will require no editing but not all banks' OFX fi
6. Set the date format to match your CSV and adjust the currency to match your bank account currency.
7. If you've previously imported expenses for the same card, choose the default layout of a previously uploaded spreadsheet.
8. Scroll down and select which columns map to the merchant, date and amount (as a number without a currency symbol) – these are required presets which must be assigned.
9. If applicable, you can also map specific Categories and Tags as long as you don't have an integration connection to your default group policy. If you have an integration connected, you'll want to add the Categories and Tags to the expense after the expense is uploaded.
9. If applicable, you can also map specific Categories and Tags as long as you don't have an integration connection to your default group workspace. If you have an integration connected, you'll want to add the Categories and Tags to the expense after the expense is uploaded.
10. Check the preview of your selection under *Output Preview*. If everything looks good, you can then select *Add Expenses*.
11. For checking accounts, you may need to "Flip Amount Sign" as transactions are often exported as negative amounts.

Expand Down
Loading

0 comments on commit cd83557

Please sign in to comment.