Skip to content

Commit

Permalink
Merge branch 'main' into fix/46611-re-create
Browse files Browse the repository at this point in the history
  • Loading branch information
nkdengineer committed Jan 6, 2025
2 parents b413d4b + b23c478 commit af12eae
Show file tree
Hide file tree
Showing 144 changed files with 5,067 additions and 1,407 deletions.
3 changes: 1 addition & 2 deletions .eslintrc.changed.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,14 @@ module.exports = {
overrides: [
{
files: [
'src/libs/ReportUtils.ts',
'src/libs/actions/IOU.ts',
'src/libs/actions/Report.ts',
'src/libs/actions/Task.ts',
'src/libs/OptionsListUtils.ts',
'src/libs/ReportActionsUtils.ts',
'src/libs/TransactionUtils/index.ts',
'src/pages/home/ReportScreen.tsx',
'src/pages/workspace/WorkspaceInitialPage.tsx',
'src/pages/home/report/PureReportActionItem.tsx',
],
rules: {
'rulesdir/no-default-id-values': 'off',
Expand Down
2 changes: 1 addition & 1 deletion Mobile-Expensify
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 1009007902
versionName "9.0.79-2"
versionCode 1009008006
versionName "9.0.80-6"
// 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 @@ -13,14 +13,16 @@ Expensify makes it easy to receive bills in three simple ways:
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 `expensify@expensify.cash`).
- Ask vendors to email bills to your billing address: `[email protected]` (e.g., for *expensicorp.com*, use `expensicorp@expensify.cash`).
- Once emailed, the bill is automatically created in Expensify, ready for payment.

![Setting the Primary Contact at Domain Admins > Primary Contact](https://help.expensify.com/assets/images/OldDot%20-%20Create%20%26%20Pay%20Bills%201.png){:width="100%"}

### 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 `expensify@expensify.cash`).
- Forward bills to `[email protected]`. Example: `[email protected]` (e.g., for *expensicorp.com*, use `expensicorp@expensify.cash`).
- Expensify will create a bill automatically, ready for payment.

### 3. Manual Upload
Expand All @@ -31,6 +33,7 @@ Got a paper bill? Create a bill manually in [Expensify](https://www.expensify.co
3. Enter the invoice details: sender’s email, merchant name, amount, and date.
4. Upload the invoice as a receipt.

![Manually Create a Bill](https://help.expensify.com/assets/images/OldDot%20-%20Create%20%26%20Pay%20Bills%202.png){:width="100%"}

# Paying Bills in Expensify

Expand All @@ -44,6 +47,8 @@ Expensify makes it easy to manage and pay vendor bills with a straightforward wo
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.

![Paying a Bill](https://help.expensify.com/assets/images/OldDot%20-%20Create%20%26%20Pay%20Bills%203.png){:width="100%"}

## Payment Methods

Expensify offers several ways to pay bills. Choose the method that works best for you:
Expand Down Expand Up @@ -92,20 +97,27 @@ If you prefer to pay outside Expensify, you can still track the payment within t
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**.

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 %}
4 changes: 2 additions & 2 deletions ios/NewExpensify/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>9.0.79</string>
<string>9.0.80</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>
Expand All @@ -40,7 +40,7 @@
</dict>
</array>
<key>CFBundleVersion</key>
<string>9.0.79.2</string>
<string>9.0.80.6</string>
<key>FullStory</key>
<dict>
<key>OrgId</key>
Expand Down
4 changes: 2 additions & 2 deletions ios/NewExpensifyTests/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>9.0.79</string>
<string>9.0.80</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>9.0.79.2</string>
<string>9.0.80.6</string>
</dict>
</plist>
4 changes: 2 additions & 2 deletions ios/NotificationServiceExtension/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundleShortVersionString</key>
<string>9.0.79</string>
<string>9.0.80</string>
<key>CFBundleVersion</key>
<string>9.0.79.2</string>
<string>9.0.80.6</string>
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "new.expensify",
"version": "9.0.79-2",
"version": "9.0.80-6",
"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.",
Expand Down
1 change: 1 addition & 0 deletions src/CONFIG.ts
Original file line number Diff line number Diff line change
Expand Up @@ -104,4 +104,5 @@ export default {
// to read more about StrictMode see: contributingGuides/STRICT_MODE.md
USE_REACT_STRICT_MODE_IN_DEV: false,
ELECTRON_DISABLE_SECURITY_WARNINGS: 'true',
IS_TEST_ENV: process.env.NODE_ENV === 'test',
} as const;
52 changes: 51 additions & 1 deletion src/CONST.ts
Original file line number Diff line number Diff line change
Expand Up @@ -668,6 +668,7 @@ const CONST = {
HANG_TIGHT: 4,
},
},
BANK_INFO_STEP_ACCOUNT_HOLDER_KEY_PREFIX: 'accountHolder',
},
INCORPORATION_TYPES: {
LLC: 'LLC',
Expand All @@ -689,7 +690,7 @@ const CONST = {
COMBINED_TRACK_SUBMIT: 'combinedTrackSubmit',
CATEGORY_AND_TAG_APPROVERS: 'categoryAndTagApprovers',
PER_DIEM: 'newDotPerDiem',
PRODUCT_TRAINING: 'productTraining',
NEWDOT_MERGE_ACCOUNTS: 'newDotMergeAccounts',
},
BUTTON_STATES: {
DEFAULT: 'default',
Expand Down Expand Up @@ -2361,6 +2362,7 @@ const CONST = {
DISTANCE: 'distance',
MANUAL: 'manual',
SCAN: 'scan',
PER_DIEM: 'per-diem',
},
REPORT_ACTION_TYPE: {
PAY: 'pay',
Expand Down Expand Up @@ -2981,6 +2983,50 @@ const CONST = {
PAYPERUSE: 'monthly2018',
},
},
get SUBSCRIPTION_PRICES() {
return {
[this.PAYMENT_CARD_CURRENCY.USD]: {
[this.POLICY.TYPE.CORPORATE]: {
[this.SUBSCRIPTION.TYPE.ANNUAL]: 900,
[this.SUBSCRIPTION.TYPE.PAYPERUSE]: 1800,
},
[this.POLICY.TYPE.TEAM]: {
[this.SUBSCRIPTION.TYPE.ANNUAL]: 500,
[this.SUBSCRIPTION.TYPE.PAYPERUSE]: 1000,
},
},
[this.PAYMENT_CARD_CURRENCY.AUD]: {
[this.POLICY.TYPE.CORPORATE]: {
[this.SUBSCRIPTION.TYPE.ANNUAL]: 1500,
[this.SUBSCRIPTION.TYPE.PAYPERUSE]: 3000,
},
[this.POLICY.TYPE.TEAM]: {
[this.SUBSCRIPTION.TYPE.ANNUAL]: 700,
[this.SUBSCRIPTION.TYPE.PAYPERUSE]: 1400,
},
},
[this.PAYMENT_CARD_CURRENCY.GBP]: {
[this.POLICY.TYPE.CORPORATE]: {
[this.SUBSCRIPTION.TYPE.ANNUAL]: 700,
[this.SUBSCRIPTION.TYPE.PAYPERUSE]: 1400,
},
[this.POLICY.TYPE.TEAM]: {
[this.SUBSCRIPTION.TYPE.ANNUAL]: 400,
[this.SUBSCRIPTION.TYPE.PAYPERUSE]: 800,
},
},
[this.PAYMENT_CARD_CURRENCY.NZD]: {
[this.POLICY.TYPE.CORPORATE]: {
[this.SUBSCRIPTION.TYPE.ANNUAL]: 1600,
[this.SUBSCRIPTION.TYPE.PAYPERUSE]: 3200,
},
[this.POLICY.TYPE.TEAM]: {
[this.SUBSCRIPTION.TYPE.ANNUAL]: 800,
[this.SUBSCRIPTION.TYPE.PAYPERUSE]: 1600,
},
},
};
},
REGEX: {
SPECIAL_CHARS_WITHOUT_NEWLINE: /((?!\n)[()-\s\t])/g,
DIGITS_AND_PLUS: /^\+?[0-9]*$/,
Expand Down Expand Up @@ -3168,6 +3214,7 @@ const CONST = {
REPORT_NAME_LIMIT: 100,
TITLE_CHARACTER_LIMIT: 100,
DESCRIPTION_LIMIT: 1000,
SEARCH_QUERY_LIMIT: 1000,
WORKSPACE_NAME_CHARACTER_LIMIT: 80,
STATE_CHARACTER_LIMIT: 32,

Expand Down Expand Up @@ -3205,6 +3252,7 @@ const CONST = {
CANCEL_PAYMENT: 'cancelPayment',
UNAPPROVE: 'unapprove',
DEBUG: 'debug',
GO_TO_WORKSPACE: 'goToWorkspace',
},
EDIT_REQUEST_FIELD: {
AMOUNT: 'amount',
Expand Down Expand Up @@ -4614,6 +4662,7 @@ const CONST = {
MANUAL: 'manual',
SCAN: 'scan',
DISTANCE: 'distance',
PER_DIEM: 'per-diem',
},

STATUS_TEXT_MAX_LENGTH: 100,
Expand Down Expand Up @@ -6458,6 +6507,7 @@ const CONST = {
LHN_WORKSPACE_CHAT_TOOLTIP: 'workspaceChatLHNTooltip',
GLOBAL_CREATE_TOOLTIP: 'globalCreateTooltip',
},
SMART_BANNER_HEIGHT: 152,
} as const;

type Country = keyof typeof CONST.ALL_COUNTRIES;
Expand Down
12 changes: 12 additions & 0 deletions src/ONYXKEYS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -458,6 +458,9 @@ const ONYXKEYS = {
/** The user's Concierge reportID */
CONCIERGE_REPORT_ID: 'conciergeReportID',

/* Corpay fieds to be used in the bank account creation setup */
CORPAY_FIELDS: 'corpayFields',

/** The user's session that will be preserved when using imported state */
PRESERVED_USER_SESSION: 'preservedUserSession',

Expand All @@ -472,6 +475,7 @@ const ONYXKEYS = {
POLICY_RECENTLY_USED_CATEGORIES: 'policyRecentlyUsedCategories_',
POLICY_TAGS: 'policyTags_',
POLICY_RECENTLY_USED_TAGS: 'nvp_recentlyUsedTags_',
POLICY_RECENTLY_USED_DESTINATIONS: 'nvp_recentlyUsedDestinations_',
// Whether the policy's connection data was attempted to be fetched in
// the current user session. As this state only exists client-side, it
// should not be included as part of the policy object. The policy
Expand Down Expand Up @@ -617,6 +621,10 @@ const ONYXKEYS = {
MONEY_REQUEST_HOLD_FORM_DRAFT: 'moneyHoldReasonFormDraft',
MONEY_REQUEST_COMPANY_INFO_FORM: 'moneyRequestCompanyInfoForm',
MONEY_REQUEST_COMPANY_INFO_FORM_DRAFT: 'moneyRequestCompanyInfoFormDraft',
MONEY_REQUEST_TIME_FORM: 'moneyRequestTimeForm',
MONEY_REQUEST_TIME_FORM_DRAFT: 'moneyRequestTimeFormDraft',
MONEY_REQUEST_SUBRATE_FORM: 'moneyRequestSubrateForm',
MONEY_REQUEST_SUBRATE_FORM_DRAFT: 'moneyRequestSubrateFormDraft',
NEW_CONTACT_METHOD_FORM: 'newContactMethodForm',
NEW_CONTACT_METHOD_FORM_DRAFT: 'newContactMethodFormDraft',
WAYPOINT_FORM: 'waypointForm',
Expand Down Expand Up @@ -762,6 +770,8 @@ type OnyxFormValuesMapping = {
[ONYXKEYS.FORMS.MONEY_REQUEST_MERCHANT_FORM]: FormTypes.MoneyRequestMerchantForm;
[ONYXKEYS.FORMS.MONEY_REQUEST_AMOUNT_FORM]: FormTypes.MoneyRequestAmountForm;
[ONYXKEYS.FORMS.MONEY_REQUEST_DATE_FORM]: FormTypes.MoneyRequestDateForm;
[ONYXKEYS.FORMS.MONEY_REQUEST_TIME_FORM]: FormTypes.MoneyRequestTimeForm;
[ONYXKEYS.FORMS.MONEY_REQUEST_SUBRATE_FORM]: FormTypes.MoneyRequestSubrateForm;
[ONYXKEYS.FORMS.MONEY_REQUEST_HOLD_FORM]: FormTypes.MoneyRequestHoldReasonForm;
[ONYXKEYS.FORMS.MONEY_REQUEST_COMPANY_INFO_FORM]: FormTypes.MoneyRequestCompanyInfoForm;
[ONYXKEYS.FORMS.NEW_CONTACT_METHOD_FORM]: FormTypes.NewContactMethodForm;
Expand Down Expand Up @@ -831,6 +841,7 @@ type OnyxCollectionValuesMapping = {
[ONYXKEYS.COLLECTION.POLICY_CATEGORIES_DRAFT]: OnyxTypes.PolicyCategories;
[ONYXKEYS.COLLECTION.POLICY_TAGS]: OnyxTypes.PolicyTagLists;
[ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_CATEGORIES]: OnyxTypes.RecentlyUsedCategories;
[ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_DESTINATIONS]: OnyxTypes.RecentlyUsedCategories;
[ONYXKEYS.COLLECTION.POLICY_HAS_CONNECTIONS_DATA_BEEN_FETCHED]: boolean;
[ONYXKEYS.COLLECTION.DEPRECATED_POLICY_MEMBER_LIST]: OnyxTypes.PolicyEmployeeList;
[ONYXKEYS.COLLECTION.WORKSPACE_INVITE_MEMBERS_DRAFT]: OnyxTypes.InvitedEmailsToAccountIDs;
Expand Down Expand Up @@ -1027,6 +1038,7 @@ type OnyxValuesMapping = {
[ONYXKEYS.IS_USING_IMPORTED_STATE]: boolean;
[ONYXKEYS.NVP_EXPENSIFY_COMPANY_CARDS_CUSTOM_NAMES]: Record<string, string>;
[ONYXKEYS.CONCIERGE_REPORT_ID]: string;
[ONYXKEYS.CORPAY_FIELDS]: OnyxTypes.CorpayFields;
[ONYXKEYS.PRESERVED_USER_SESSION]: OnyxTypes.Session;
[ONYXKEYS.NVP_DISMISSED_PRODUCT_TRAINING]: OnyxTypes.DismissedProductTraining;
};
Expand Down
34 changes: 34 additions & 0 deletions src/ROUTES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -485,6 +485,36 @@ const ROUTES = {
getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backTo = '') =>
getUrlWithBackToParam(`${action as string}/${iouType as string}/upgrade/${transactionID}/${reportID}`, backTo),
},
MONEY_REQUEST_STEP_DESTINATION: {
route: ':action/:iouType/destination/:transactionID/:reportID',
getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backTo = '') =>
getUrlWithBackToParam(`${action as string}/${iouType as string}/destination/${transactionID}/${reportID}`, backTo),
},
MONEY_REQUEST_STEP_TIME: {
route: ':action/:iouType/time/:transactionID/:reportID',
getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backTo = '') =>
getUrlWithBackToParam(`${action as string}/${iouType as string}/time/${transactionID}/${reportID}`, backTo),
},
MONEY_REQUEST_STEP_SUBRATE: {
route: ':action/:iouType/subrate/:transactionID/:reportID/:pageIndex',
getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backTo = '') =>
getUrlWithBackToParam(`${action as string}/${iouType as string}/subrate/${transactionID}/${reportID}/0`, backTo),
},
MONEY_REQUEST_STEP_DESTINATION_EDIT: {
route: ':action/:iouType/destination/:transactionID/:reportID/edit',
getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backTo = '') =>
getUrlWithBackToParam(`${action as string}/${iouType as string}/destination/${transactionID}/${reportID}/edit`, backTo),
},
MONEY_REQUEST_STEP_TIME_EDIT: {
route: ':action/:iouType/time/:transactionID/:reportID/edit',
getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backTo = '') =>
getUrlWithBackToParam(`${action as string}/${iouType as string}/time/${transactionID}/${reportID}/edit`, backTo),
},
MONEY_REQUEST_STEP_SUBRATE_EDIT: {
route: ':action/:iouType/subrate/:transactionID/:reportID/edit/:pageIndex',
getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, pageIndex = 0, backTo = '') =>
getUrlWithBackToParam(`${action as string}/${iouType as string}/subrate/${transactionID}/${reportID}/edit/${pageIndex}`, backTo),
},
SETTINGS_TAGS_ROOT: {
route: 'settings/:policyID/tags',
getRoute: (policyID: string, backTo = '') => getUrlWithBackToParam(`settings/${policyID}/tags`, backTo),
Expand Down Expand Up @@ -645,6 +675,10 @@ const ROUTES = {
route: ':action/:iouType/start/:transactionID/:reportID/scan',
getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string) => `create/${iouType as string}/start/${transactionID}/${reportID}/scan` as const,
},
MONEY_REQUEST_CREATE_TAB_PER_DIEM: {
route: ':action/:iouType/start/:transactionID/:reportID/per-diem',
getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string) => `create/${iouType as string}/start/${transactionID}/${reportID}/per-diem` as const,
},

MONEY_REQUEST_STATE_SELECTOR: {
route: 'submit/state',
Expand Down
6 changes: 6 additions & 0 deletions src/SCREENS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,12 @@ const SCREENS = {
RECEIPT: 'Money_Request_Receipt',
STATE_SELECTOR: 'Money_Request_State_Selector',
STEP_ATTENDEES: 'Money_Request_Attendee',
STEP_DESTINATION: 'Money_Request_Destination',
STEP_TIME: 'Money_Request_Time',
STEP_SUBRATE: 'Money_Request_SubRate',
STEP_DESTINATION_EDIT: 'Money_Request_Destination_Edit',
STEP_TIME_EDIT: 'Money_Request_Time_Edit',
STEP_SUBRATE_EDIT: 'Money_Request_SubRate_Edit',
},

TRANSACTION_DUPLICATE: {
Expand Down
Loading

0 comments on commit af12eae

Please sign in to comment.