Skip to content

Commit

Permalink
Merge Main
Browse files Browse the repository at this point in the history
  • Loading branch information
ChavdaSachin committed Dec 4, 2024
2 parents b720e98 + d7859ea commit edfbbcd
Show file tree
Hide file tree
Showing 28 changed files with 60 additions and 88 deletions.
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 1009007100
versionName "9.0.71-0"
versionCode 1009007101
versionName "9.0.71-1"
// 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 @@ -10,7 +10,7 @@ To connect a deposit-only account,

1. Hover over **Settings**, then click **Account**.
2. Click the **Payments** tab on the left.
3. Click **Add Deposit-Only Bank Account**, then click **Connect to your bank**.
3. Click **Add Deposit-Only Bank Account**, then click **Connect to your bank**.
4. Click **Continue**.
5. Search for your bank account in the list of banks and follow the prompts to sign in to your bank account.
- If your bank doesn’t appear, click the X in the right corner of the Plaid pop-up window, then click **Connect Manually**. You’ll then manually enter your account information and click **Save & Continue**.
Expand All @@ -19,6 +19,10 @@ To connect a deposit-only account,

You’ll now receive reimbursements for your expense reports and invoices directly to this bank account.

{% include info.html %}
If your organization has global reimbursement enabled and you want to add a bank account outside of the US, you can do so by following the steps above. However, after clicking on **Add Deposit-Only Bank Account**, look for a button that says **Switch Country**. This will allow you to add a deposit account from a supported country and receive reimbursements in your local currency.
{% include end-info.html %}

{% include faq-begin.md %}

**I connected my deposit-only bank account. Why haven’t I received my reimbursement?**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,56 +1,58 @@
---
title: Set notifications
description: This article is about how to troubleshoot notifications from Expensify.
title: Expensify Email notifications
description: Troubleshooting steps for receiving emails and notifications from Expensify.
---

# Overview
Sometimes members may have trouble receiving important email notifications from Expensify, such as Expensify Magic Code emails, account validation emails, secondary login validations, integration emails, or report action notifications (rejections, approvals, etc.).
Occasionally, members may have trouble receiving email notifications from Expensify, such as Expensify Magic Code emails, account validation emails, secondary login validations, integration emails, or report action notifications.

# Troubleshooting missing Expensify notifications

## Issue: The email or notification is never received, and no message, banner, or additional context is provided
Emails can sometimes be delayed and could take up to 30-60 minutes to arrive in your inbox. If you're expecting a notification that still hasn't arrived after waiting:
- Check your **Email Preferences** on the web via **Settings > Account > Preferences**. In the **Contact Preferences** section, ensure that the relevant boxes are checked for the email type you're missing.
- Check your email spam and trash folders, as Expensify messages might end up there inadvertently.
- Check to make sure you haven't unintentionally blocked Expensify emails. Allowlist the domain expensify.com with your email provider.
- Check to make sure you haven't unintentionally blocked Expensify emails. whitelist the domain expensify.com with your email provider.

## Issue: A banner that says “We’re having trouble emailing you” shows the top of your screen.
Confirm the email address on your Expensify account is a deliverable email address, and then click the link in the banner that says "here". If successful, you will see a confirmation that your email was unblocked.
Confirm that the email address on your Expensify account is deliverable, and then click the link in the banner that says "here." If successful, you will see a confirmation that your email was unblocked.

![ExpensifyHelp_EmailError]({{site.url}}/assets/images/ExpensifyHelp_EmailError.png){:width="100%"}

**If unsuccessful, you will see another error:**
- If the new error or SMTP message includes a URL, navigate to that URL for further instructions.
- If the new error or SMTP message includes "mimecast.com", consult with your company's IT team.
- If the new error or SMTP message includes "blacklist", it means your company has configured their email servers to use a third-party email reputation or blocklisting service. Consult with your company's IT team.
- If the new error or SMTP message includes "blacklist," it means your company has configured its email servers to use a third-party email reputation or blocklisting service. Consult with your company's IT team.

![ExpensifyHelp_SMTPError]({{site.url}}/assets/images/ExpensifyHelp_SMTPError.png){:width="100%"}

# Further troubleshooting for public domains

If you are still not receiving Expensify notifications and have an email address on a public domain such as gmail.com or yahoo.com, you may need to add Expensify's domain expensify.com to your email's allowlist by taking the following steps:
If you are still not receiving Expensify notifications and have an email address on a public domain such as gmail.com or yahoo.com, you may need to add Expensify's domain expensify.com to your email's whitelist by taking the following steps:

- Search for messages from expensify.com in your spam folder, open them, and click “Not Spam” at the top of each message.
- Configure an email filter that identifies Expensify's email domain expensify.com and directs all incoming messages to your inbox, to avoid messages going to spam.
- Add specific known Expensify email addresses such as concierge@expensify.com to your email contacts list.
Configure an email filter that identifies Expensify's email domain as expensify.com and directs all incoming messages to your inbox to prevent messages from going to spam.
- Add specific known Expensify email addresses, such as concierge@expensify.com, to your email contacts list.

# Further troubleshooting for private domains

If your organization uses a private domain, Expensify emails may be blocked at the server level. This can sometimes happen unexpectedly due to broader changes in email provider's handling or filtering of incoming messages. Consult your internal IT team to assist with the following:

- Ensure that the domain expensify.com is allowlisted on domain email servers. This domains is the sources of various notification emails, so it's important it is allowlisted.
- Confirm there is no server-level email blocking and that spam filters are not blocking Expensify emails. Even if you have received messages from our Concierge support in the past, ensure that expensify.com is allowlisted.
- Ensure that the domain expensify.com is allowed on the domain email servers. This domain is the source of various notification emails, so it's important it is whitelisted.
- Confirm there is no server-level email blocking
- Make sure spam filters are not blocking Expensify emails.

Even if you have received messages from our Concierge support in the past, ensure that expensify.com is whitelisted.

## Companies using Outlook

- Add Expensify to your personal Safe Senders list by following these steps: [Outlook email client](https://support.microsoft.com/en-us/office/add-recipients-of-my-email-messages-to-the-safe-senders-list-be1baea0-beab-4a30-b968-9004332336ce) / [Outlook.com](https://support.microsoft.com/en-us/office/safe-senders-in-outlook-com-470d4ee6-e3b6-402b-8cd9-a6f00eda7339)
- **Company IT administrators:** Add Expensify to your domain's Safe Sender list by following the steps here: [Create safe sender lists in EOP](https://learn.microsoft.com/en-us/defender-office-365/create-safe-sender-lists-in-office-365)
- **Company IT administrators:** Add expensify.com to the domain's explicit allowlist. You may need to contact Outlook support for specific instructions, as each company's setup varies.
**Company IT administrators:** Add expensify.com to the domain's explicit whitelist. As each company's setup varies, you may need to contact Outlook support for specific instructions.
- **Company administrators:** Contact Outlook support to see if there are additional steps to take based on your domain's email configuration.

## Companies using Google Workspaces:

- **Company IT administrators:** Adjust your domain's email allowlist and safe senders lists to include expensify.com by following these steps: [Allowlists, denylists, and approved senders](https://support.google.com/a/answer/60752)
- **Company IT administrators:** Adjust your domain's email whitelist and safe senders lists to include expensify.com by following these steps: [Allowlists, denylists, and approved senders](https://support.google.com/a/answer/60752)

{% include faq-begin.md %}

Expand All @@ -60,10 +62,10 @@ Expensify's emails are SPF and DKIM-signed, meaning they are cryptographically s

## Why do legitimate emails from Expensify sometimes end up marked as spam?

The problem typically arises when our domain or one of our sending IP addresses gets erroneously flagged by a 3rd party domain or IP reputation services. Many IT departments use lists published by such services to filter email for the entire company.
The problem typically arises when a third-party domain or IP reputation service erroneously flags our domain or one of our sending IP addresses. Many IT departments use lists published by such services to filter email for the entire company.

## What is the best way to ensure emails are not accidentally marked as Spam?

For server-level spam detection, the safest approach to allowlisting email from Expensify is to verify DKIM and SPF, rather than solely relying on the third-party reputation of the sending IP address.
For server-level spam detection, the safest approach to whitelisting email from Expensify is to verify DKIM and SPF, rather than solely relying on the third-party reputation of the sending IP address.

{% include faq-end.md %}
3 changes: 2 additions & 1 deletion docs/redirects.csv
Original file line number Diff line number Diff line change
Expand Up @@ -604,4 +604,5 @@ https://help.expensify.com/articles/expensify-classic/spending-insights/Custom-T
https://help.expensify.com/articles/expensify-classic/spending-insights/Default-Export-Templates,https://help.expensify.com/articles/expensify-classic/spending-insights/Export-Expenses-And-Reports/
https://help.expensify.com/articles/expensify-classic/spending-insights/Other-Export-Options,https://help.expensify.com/articles/expensify-classic/spending-insights/Export-Expenses-And-Reports/
https://help.expensify.com/articles/expensify-classic/travel/Edit-or-cancel-travel-arrangements,https://help.expensify.com/articles/expensify-classic/travel/Book-with-Expensify-Travel
https://help.expensify.com/articles/expensify-classic/bank-accounts-and-payments/payments/Create-and-Pay-Bills,https://help.expensify.com/articles/expensify-classic/bank-accounts-and-payments/payments/Receive-and-Pay-Bills
https://help.expensify.com/articles/expensify-classic/bank-accounts-and-payments/payments/Create-and-Pay-Bills,https://help.expensify.com/articles/expensify-classic/bank-accounts-and-payments/payments/Receive-and-Pay-Bills
https://help.expensify.com/articles/expensify-classic/settings/Set-Notifications,https://help.expensify.com/articles/expensify-classic/settings/Email-Notifications
2 changes: 1 addition & 1 deletion ios/NewExpensify/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
</dict>
</array>
<key>CFBundleVersion</key>
<string>9.0.71.0</string>
<string>9.0.71.1</string>
<key>FullStory</key>
<dict>
<key>OrgId</key>
Expand Down
2 changes: 1 addition & 1 deletion ios/NewExpensifyTests/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>9.0.71.0</string>
<string>9.0.71.1</string>
</dict>
</plist>
2 changes: 1 addition & 1 deletion ios/NotificationServiceExtension/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
<key>CFBundleShortVersionString</key>
<string>9.0.71</string>
<key>CFBundleVersion</key>
<string>9.0.71.0</string>
<string>9.0.71.1</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.71-0",
"version": "9.0.71-1",
"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: 0 additions & 1 deletion src/CONST.ts
Original file line number Diff line number Diff line change
Expand Up @@ -670,7 +670,6 @@ const CONST = {
BETAS: {
ALL: 'all',
DEFAULT_ROOMS: 'defaultRooms',
DUPE_DETECTION: 'dupeDetection',
P2P_DISTANCE_REQUESTS: 'p2pDistanceRequests',
SPOTNANA_TRAVEL: 'spotnanaTravel',
REPORT_FIELDS_FEATURE: 'reportFieldsFeature',
Expand Down
9 changes: 2 additions & 7 deletions src/components/AddPaymentCard/PaymentCardForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -165,10 +165,6 @@ function PaymentCardForm({
errors.addressStreet = translate(label.error.addressStreet);
}

if (values.addressZipCode && !ValidationUtils.isValidZipCode(values.addressZipCode)) {
errors.addressZipCode = translate(label.error.addressZipCode);
}

if (!values.acceptTerms) {
errors.acceptTerms = translate('common.error.acceptTerms');
}
Expand Down Expand Up @@ -283,10 +279,9 @@ function PaymentCardForm({
InputComponent={TextInput}
defaultValue={data?.addressZipCode}
inputID={INPUT_IDS.ADDRESS_ZIP_CODE}
label={translate('common.zip')}
aria-label={translate('common.zip')}
label={translate('common.zipPostCode')}
aria-label={translate('common.zipPostCode')}
role={CONST.ROLE.PRESENTATION}
inputMode={CONST.INPUT_MODE.NUMERIC}
maxLength={CONST.BANK_ACCOUNT.MAX_LENGTH.ZIP_CODE}
containerStyles={[styles.mt5]}
/>
Expand Down
4 changes: 2 additions & 2 deletions src/components/DatePicker/CalendarPicker/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -53,14 +53,14 @@ function CalendarPicker({
const {preferredLocale, translate} = useLocalize();
const pressableRef = useRef<View>(null);

const [currentDateView, setCurrentDateView] = useState(getInitialCurrentDateView(value, minDate, maxDate));
const [currentDateView, setCurrentDateView] = useState(() => getInitialCurrentDateView(value, minDate, maxDate));

const [isYearPickerVisible, setIsYearPickerVisible] = useState(false);

const minYear = getYear(new Date(minDate));
const maxYear = getYear(new Date(maxDate));

const [years, setYears] = useState<CalendarPickerListItem[]>(
const [years, setYears] = useState<CalendarPickerListItem[]>(() =>
Array.from({length: maxYear - minYear + 1}, (v, i) => i + minYear).map((year) => ({
text: year.toString(),
value: year,
Expand Down
2 changes: 1 addition & 1 deletion src/components/VideoPlayer/BaseVideoPlayer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ function BaseVideoPlayer({
const [isEnded, setIsEnded] = useState(false);
const [isBuffering, setIsBuffering] = useState(true);
// we add "#t=0.001" at the end of the URL to skip first milisecond of the video and always be able to show proper video preview when video is paused at the beginning
const [sourceURL] = useState(VideoUtils.addSkipTimeTagToURL(url.includes('blob:') || url.includes('file:///') ? url : addEncryptedAuthTokenToURL(url), 0.001));
const [sourceURL] = useState(() => VideoUtils.addSkipTimeTagToURL(url.includes('blob:') || url.includes('file:///') ? url : addEncryptedAuthTokenToURL(url), 0.001));
const [isPopoverVisible, setIsPopoverVisible] = useState(false);
const [popoverAnchorPosition, setPopoverAnchorPosition] = useState({horizontal: 0, vertical: 0});
const [controlStatusState, setControlStatusState] = useState(controlsStatus);
Expand Down
5 changes: 0 additions & 5 deletions src/libs/Permissions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,6 @@ function canUseDefaultRooms(betas: OnyxEntry<Beta[]>): boolean {
return !!betas?.includes(CONST.BETAS.DEFAULT_ROOMS) || canUseAllBetas(betas);
}

function canUseDupeDetection(betas: OnyxEntry<Beta[]>): boolean {
return !!betas?.includes(CONST.BETAS.DUPE_DETECTION) || canUseAllBetas(betas);
}

function canUseSpotnanaTravel(betas: OnyxEntry<Beta[]>): boolean {
return !!betas?.includes(CONST.BETAS.SPOTNANA_TRAVEL) || canUseAllBetas(betas);
}
Expand Down Expand Up @@ -49,7 +45,6 @@ function canUseLinkPreviews(): boolean {
export default {
canUseDefaultRooms,
canUseLinkPreviews,
canUseDupeDetection,
canUseSpotnanaTravel,
canUseNetSuiteUSATax,
canUseCombinedTrackSubmit,
Expand Down
15 changes: 2 additions & 13 deletions src/libs/TransactionUtils/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ import DistanceRequestUtils from '@libs/DistanceRequestUtils';
import {toLocaleDigit} from '@libs/LocaleDigitUtils';
import * as Localize from '@libs/Localize';
import * as NumberUtils from '@libs/NumberUtils';
import Permissions from '@libs/Permissions';
import {getCleanedTagName, getDistanceRateCustomUnitRate} from '@libs/PolicyUtils';
import * as PolicyUtils from '@libs/PolicyUtils';
// eslint-disable-next-line import/no-cycle
Expand All @@ -26,7 +25,7 @@ import type {IOURequestType} from '@userActions/IOU';
import CONST from '@src/CONST';
import type {IOUType} from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import type {Beta, OnyxInputOrEntry, Policy, RecentWaypoint, Report, ReviewDuplicates, TaxRate, TaxRates, Transaction, TransactionViolation, TransactionViolations} from '@src/types/onyx';
import type {OnyxInputOrEntry, Policy, RecentWaypoint, Report, ReviewDuplicates, TaxRate, TaxRates, Transaction, TransactionViolation, TransactionViolations} from '@src/types/onyx';
import type {Attendee} from '@src/types/onyx/IOU';
import type {SearchPolicy, SearchReport} from '@src/types/onyx/SearchResults';
import type {Comment, Receipt, TransactionChanges, TransactionPendingFieldsKey, Waypoint, WaypointCollection} from '@src/types/onyx/Transaction';
Expand Down Expand Up @@ -74,12 +73,6 @@ Onyx.connect({
},
});

let allBetas: OnyxEntry<Beta[]>;
Onyx.connect({
key: ONYXKEYS.BETAS,
callback: (value) => (allBetas = value),
});

function isDistanceRequest(transaction: OnyxEntry<Transaction>): boolean {
// This is used during the expense creation flow before the transaction has been saved to the server
if (lodashHas(transaction, 'iouRequestType')) {
Expand Down Expand Up @@ -843,10 +836,6 @@ function getRecentTransactions(transactions: Record<string, string>, size = 2):
* @param checkDismissed - whether to check if the violation has already been dismissed as well
*/
function isDuplicate(transactionID: string, checkDismissed = false): boolean {
if (!Permissions.canUseDupeDetection(allBetas ?? [])) {
return false;
}

const hasDuplicatedViolation = !!allTransactionViolations?.[`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionID}`]?.some(
(violation: TransactionViolation) => violation.name === CONST.VIOLATIONS.DUPLICATED_TRANSACTION,
);
Expand Down Expand Up @@ -909,7 +898,7 @@ function hasWarningTypeViolation(transactionID: string, transactionViolations: O
) ?? [];

const hasOnlyDupeDetectionViolation = warningTypeViolations?.every((violation: TransactionViolation) => violation.name === CONST.VIOLATIONS.DUPLICATED_TRANSACTION);
if (!Permissions.canUseDupeDetection(allBetas ?? []) && hasOnlyDupeDetectionViolation) {
if (hasOnlyDupeDetectionViolation) {
return false;
}

Expand Down
2 changes: 1 addition & 1 deletion src/pages/Debug/DebugDetailsDateTimePickerPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ function DebugDetailsDateTimePickerPage({
}: DebugDetailsDateTimePickerPageProps) {
const {translate} = useLocalize();
const styles = useThemeStyles();
const [date, setDate] = useState(DateUtils.extractDate(fieldValue));
const [date, setDate] = useState(() => DateUtils.extractDate(fieldValue));
return (
<ScreenWrapper testID={DebugDetailsDateTimePickerPage.displayName}>
<HeaderWithBackButton title={fieldName} />
Expand Down
Loading

0 comments on commit edfbbcd

Please sign in to comment.