Skip to content

Commit

Permalink
Merge branch 'main' into fix/30428-list-height-styling
Browse files Browse the repository at this point in the history
  • Loading branch information
bernhardoj committed Nov 14, 2023
2 parents 62f40a7 + 5e7022d commit 497c3aa
Show file tree
Hide file tree
Showing 89 changed files with 1,475 additions and 810 deletions.
5 changes: 5 additions & 0 deletions .github/actions/javascript/authorChecklist/authorChecklist.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ function checkPRForCompletedChecklist(expectedNumberOfChecklistItems: number, ch

async function generateDynamicChecksAndCheckForCompletion() {
// Generate dynamic checks
console.log('Generating dynamic checks...');
const dynamicChecks = await getChecklistCategoriesForPullRequest();
let isPassing = true;
let didChecklistChange = false;
Expand All @@ -91,13 +92,15 @@ async function generateDynamicChecksAndCheckForCompletion() {
const regex = new RegExp(`- \\[([ x])] ${escapeRegExp(check)}`);
const match = regex.exec(checklist);
if (!match) {
console.log('Adding check to the checklist:', check);
// Add it to the PR body
isPassing = false;
checklist += `- [ ] ${check}\r\n`;
didChecklistChange = true;
} else {
const isChecked = match[1] === 'x';
if (!isChecked) {
console.log('Found unchecked checklist item:', check);
isPassing = false;
}
}
Expand All @@ -112,6 +115,7 @@ async function generateDynamicChecksAndCheckForCompletion() {
const match = regex.exec(checklist);
if (match) {
// Remove it from the PR body
console.log('Check has been removed from the checklist:', check);
checklist = checklist.replace(match[0], '');
didChecklistChange = true;
}
Expand All @@ -123,6 +127,7 @@ async function generateDynamicChecksAndCheckForCompletion() {

// Update the PR body
if (didChecklistChange) {
console.log('Checklist changed, updating PR...');
await GithubUtils.octokit.pulls.update({
owner: CONST.GITHUB_OWNER,
repo: CONST.APP_REPO,
Expand Down
5 changes: 5 additions & 0 deletions .github/actions/javascript/authorChecklist/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -21574,6 +21574,7 @@ function checkPRForCompletedChecklist(expectedNumberOfChecklistItems, checklist)
}
async function generateDynamicChecksAndCheckForCompletion() {
// Generate dynamic checks
console.log('Generating dynamic checks...');
const dynamicChecks = await getChecklistCategoriesForPullRequest();
let isPassing = true;
let didChecklistChange = false;
Expand All @@ -21585,6 +21586,7 @@ async function generateDynamicChecksAndCheckForCompletion() {
const regex = new RegExp(`- \\[([ x])] ${(0, escapeRegExp_1.default)(check)}`);
const match = regex.exec(checklist);
if (!match) {
console.log('Adding check to the checklist:', check);
// Add it to the PR body
isPassing = false;
checklist += `- [ ] ${check}\r\n`;
Expand All @@ -21593,6 +21595,7 @@ async function generateDynamicChecksAndCheckForCompletion() {
else {
const isChecked = match[1] === 'x';
if (!isChecked) {
console.log('Found unchecked checklist item:', check);
isPassing = false;
}
}
Expand All @@ -21605,6 +21608,7 @@ async function generateDynamicChecksAndCheckForCompletion() {
const match = regex.exec(checklist);
if (match) {
// Remove it from the PR body
console.log('Check has been removed from the checklist:', check);
checklist = checklist.replace(match[0], '');
didChecklistChange = true;
}
Expand All @@ -21614,6 +21618,7 @@ async function generateDynamicChecksAndCheckForCompletion() {
const newBody = contentBeforeChecklist + checklistStartsWith + checklist + checklistEndsWith + contentAfterChecklist;
// Update the PR body
if (didChecklistChange) {
console.log('Checklist changed, updating PR...');
await GithubUtils_1.default.octokit.pulls.update({
owner: CONST_1.default.GITHUB_OWNER,
repo: CONST_1.default.APP_REPO,
Expand Down
6 changes: 4 additions & 2 deletions .github/workflows/authorChecklist.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
name: PR Author Checklist

on:
pull_request:
# We use pull_request_target here so that the GitHub token will have read/write access and be able to modify the PR description if needed.
# Warning: – when using the pull_request_target event, DO NOT checkout code from an untrusted branch: https://securitylab.github.com/research/github-actions-preventing-pwn-requests/
pull_request_target:
types: [opened, edited, reopened, synchronize]

jobs:
Expand All @@ -16,4 +18,4 @@ jobs:
- name: authorChecklist.js
uses: ./.github/actions/javascript/authorChecklist
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_TOKEN: ${{ github.token }}
4 changes: 2 additions & 2 deletions android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -91,8 +91,8 @@ android {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
multiDexEnabled rootProject.ext.multiDexEnabled
versionCode 1001039803
versionName "1.3.98-3"
versionCode 1001039805
versionName "1.3.98-5"
}

flavorDimensions "default"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
---
title: Personal Credit Cards
description: How to import your personal credit cards into Expensify for tracking and reimbursement!
---
# Overview
Welcome to the world of effortless expense tracking! Connecting your personal credit card for importing transactions is a breeze, and we're here to guide you through it. Let's dive in and get your financial journey started.

## 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.
Discover below the numerous ways to easily bring your personal card expenses into Expensify below.

### *Important terms to know:*
- _Transaction Start Date_: When you first import your card, you can choose a specific transaction start date. Depending on your bank, you can go back up to 90 days. If you need to include transactions from an earlier date, you can upload a spreadsheet of those transactions separately.
- _Deleted Cards_: If you delete an imported card from Expensify, all unsubmitted expenses associated with that card will also be removed from the system. Don't worry, though – any imported card transactions within a processing, approved, closed, or reimbursed report will remain unaffected.

### *Importing expenses directly from your credit card or bank (in the web browser)*
1. Log into your Expensify account.
2. Navigate to *Settings* > *Account* > *Credit Card Import*.
3. Click the *Import Bank/Card* button.
4. Choose your bank from the list provided. If you don't see your bank, use the search box below to find it. If your bank isn't listed, you can use our CSV method to import your expenses instead.
5. Select a transaction start date using the calendar dropdown, then click *Take me there*.
6. Enter the same username and password you use for online banking to connect.
7. We'll display all the accounts linked to your username. Select the account(s) you want to import.
8. Once your card(s) are successfully imported, you can click *Update* next to the importing card(s) to fetch the latest transactions into your account.

## Importing expenses directly from your credit card or bank (in the mobile app)
In your Settings, tap *Import a card* and follow the directions (similar to the instructions above) for your bank to start importing transactions.

### Importing expenses via a spreadsheet
Spreadsheets can be uploaded as long as they are in one of the following formats:
- CSV
- XLS
- OFX
- QFX

To import expenses via a spreadsheet:
1. Download a spreadsheet of your expenses directly from your online banking account.
_Please note: an OFX file type will require no editing but not all banks' OFX files are compatible, so CSV is a good fallback option._
2. If you need to, delete any extra header rows so that you have one header row. At minimum, you should include the merchant, transaction date and amount. It's fine to have extra columns, but make sure you know which ones you’ll need so the data gets imported correctly.
3. Format the date column — if you use Excel, you can do this by navigating to *Format Cells* > *Custom*. You can choose your preferred format (e.g, yyyy-mm-dd or mm-dd-yyyy), but remember to use the same format each month.
4. Once your file is saved and ready, log into Expensify and click *Settings* > *Account* > *Credit Card Import*. Then click *Import Transactions from File* and on the next screen, select *Upload*.
5. Now, let's set up your file details. If this is the first time you're uploading for this card, keep the layout as *Default* and choose a logical *Mapping Name*, such as 'Platinum Visa.' You might use this layout again in the future so be sure to choose something that’s easy to remember.
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.
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.

## Removing or managing settings for imported personal cards
*Changing How Card Appears*: If you'd like to change the name of how your imported card appears, click *Settings* located under the card listed. Here, you can rename the account as well as decide whether these transactions should be reimbursable by default.

*Reimbursable Status of Imported Transactions*:
Expenses can be imported as either reimbursable or non-reimbursable. Select the option that best fits your card.
- *Reimbursable expenses* are expenses that are owed back to you by the person/company you are submitting them to. If you incurred an expense on a personal card you, it is likely reimbursable.
- *Non-reimbursable expenses* are expenses that are not owed back to you. This is likely spend incurred on a company card or any card that someone else pays the balance for that you incur spend on and must track the expenses for.

*Remove a card*: If you need to remove a card, you can select the red trash can icon. Please remember this will remove all unreported and un-submitted transactions from your account that are tied to this card, so be careful!

# FAQ
*Is the bank/credit card import option right for me?*
If you incur expenses using your personal or business card and need to get them accounted for in your company’s accounting, then you might want to import your bank/credit card. Please note, if you have a company-assigned corporate card, check with your company's Expensify admin on how to handle these cards. Often, admins will take care of card assignments, and you won't need to import them yourself.

*Is the personal card spreadsheet import option right for me?*
Spreadsheet import is a great option for manually creating expenses in bulk when you run into any of the below scenarios. Take advantage of this time-saving option if:
- You have already imported your bank/credit card, but you need earlier transactions beyond the default 30-90 days (this varies depending on your bank).
- Your bank is not supported through a direct connection with Expensify, but you still need to get your transactions into the system. The best way to find if your bank is supported is to try importing it. If the bank is not listed, we do not support it at this time.
- You would like a way to do either of the above and would like to have the transactions merge with your SmartScanned receipts.

*I'm not able to see the transactions I have imported when I click "View expenses". Why?*
If you aren't able to see the expenses imported when you click “View expenses”, try using the filters at the top of the Expenses screen to open up search criteria (such as the date) which often reveals "missing" expenses.

*How do I remove an imported spreadsheet?*
If you need to remove an imported spreadsheet, you can select the red trash can icon. Please remember this will remove all unreported and unsubmitted transactions from your account that are tied to this import, so be careful!

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,5 +1,69 @@
---
title: Reconciliation
description: Reconciliation
title: Company card reconciliation
description: How to reconcile company card transactions
---
## Resource Coming Soon!
# Overview

If your company imports corporate card transactions into Expensify, you can reconcile them by using the Reconciliation dashboard under **Settings > Domains > Domain Name > Company Cards > Reconciliation**. To use the dashboard, simply enter the statement dates and click **Run**.

# How to reconcile company cards

## Confirm statement total

To confirm the total of transactions imported into Expensify against a credit card statement:
1. Review the **Imported Total**, which shows the sum of all expenses imported into Expensify for that statement period. This should match the total on your credit card statement.
2. If there is a discrepancy, refresh the feed to import missing expenses. Click **Update all cards** for commercial card feeds, or update individual cards by clicking the blue cog icon and choosing **Update** for other feed types.
3. After updating, click **Run** to update the transaction totals.

## Confirm card totals

If there is a discrepancy between the totals on the credit card statement and the Reconciliation dashboard, then review each card’s total to find the source of the missing transactions.

1. Sort the cards by clicking the heading for **Card Name/Number**, **Assignee** or **Total** and compare each card's total to the statement to determine which card(s) don't match the statement total.
2. Click on the **Total** amount for a card to view the imported expenses and identify any that are missing from the statement. Confirm that all cards have been assigned to cardholders, as this could be another reason that the Imported Total doesn't match the statement.
3. If there is still a discrepancy after updating and re-calculating the totals, please contact concierge@expensify.com and provide the details of the expenses that are showing on your statement but are missing in Expensify. To investigate, we’ll need the cardholder email, expense date, and amount. Keep in mind sorting by column heading also makes locating expenses easier.

# Deep dive

## Identifying outstanding unapproved expenses using the Reconciliation Dashboard
Use the **Unapproved total** and **Approved Total** on the Reconciliation Dashboard to identify expenses which have not yet been approved and/or exported:

### View expenses
- Click on the **Unapproved Total** heading to sort cards by those with outstanding expenses.
- Click the **Unapproved** amount for a card to view the expenses which are in the Unreported, Open, Processing, or Deleted states.

Note: You will need to be both a Domain Admin and a Workspace Admin to access expenses.

### Add unreported and/or deleted expenses to a report

- Change the filters so that only Unreported and/or Deleted expenses are showing.
- Select all expenses, then click **Add to a Report > Auto Report**.
- If there is an open report in the cardholder's account, the expense(s) will be added to that. If not, a new report will be created with these expenses.
## Process reports

- Workspace admins have the ability to code (categorize, tag, comment or add a receipt) unsubmitted expenses, submit Open reports, and approve Processing reports. Any changes made by an admin are tracked under Report History and Comments at the bottom of each report.
- You can remind members to submit and approve reports via the Report History and Comments. An email notification will be sent to all members who have taken action on that report.

## Prepare accrual

If there are still unapproved expenses when you want to close your books for the month, then you can use the feed’s Imported, Approved, and Unapproved totals to create an accrual entry.
- Match Imported Total to Statement amount.
- Match Approved Total to Company Card Liability account in your accounting system.
- Unapproved Total becomes the Accrual amount (provided the first two amounts are correct).

# FAQ

## Who can view and access the Reconciliation tab?

Domain admins can access the Reconciliation tool under **Settings > Domains > Company Cards > Reconciliation**.

## Who can view and process company card transactions?

Domain admins can view all company card transactions using the Reconciliation tool, even if they are unreported. Workspace admins can only view reported expenses on a workspace. So if a workspace admin does not have access to the domain, they will be unable to see any transaction that hasn’t been placed on a report.

## What do I do if company card expenses are missing?

If a cardholder reports expenses as missing, we first recommend using the Reconciliation tool to try and locate the expense. Select the date range the expense falls under, and once the report is available, select the specific card to view the data. If the expense is not listed, you will want to click **Update** next to the card under the Card List tab. This will pull in any missing expenses.

If after updating, the expense still hasn’t appeared, you should reach out to Concierge with the missing expense specifics (merchant, date, amount and last four digits of the card number). Please note, only posted transactions will import.

Loading

0 comments on commit 497c3aa

Please sign in to comment.