diff --git a/assets/images/integrationicons/campfire-icon-square.svg b/assets/images/integrationicons/campfire-icon-square.svg
new file mode 100644
index 000000000000..56eb98a74c61
--- /dev/null
+++ b/assets/images/integrationicons/campfire-icon-square.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/images/integrationicons/rillet-icon-square.svg b/assets/images/integrationicons/rillet-icon-square.svg
new file mode 100644
index 000000000000..e2730a151e7d
--- /dev/null
+++ b/assets/images/integrationicons/rillet-icon-square.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/CONST/index.ts b/src/CONST/index.ts
index da0e91e99027..596e7e9f514f 100644
--- a/src/CONST/index.ts
+++ b/src/CONST/index.ts
@@ -3709,6 +3709,8 @@ const CONST = {
NETSUITE: 'netsuite',
SAGE_INTACCT: 'intacct',
CERTINIA: 'certinia',
+ RILLET: 'rillet',
+ CAMPFIRE: 'campfire',
GUSTO: 'gusto',
},
SUPPORTED_ONLY_ON_OLDDOT: {
@@ -3724,6 +3726,8 @@ const CONST = {
SAGE_INTACCT: 'sage-intacct',
QBD: 'quickbooks-desktop',
CERTINIA: 'certinia',
+ RILLET: 'rillet',
+ CAMPFIRE: 'campfire',
GUSTO: 'gusto',
},
NAME_USER_FRIENDLY: {
@@ -3734,6 +3738,8 @@ const CONST = {
intacct: 'Sage Intacct',
financialForce: 'FinancialForce',
certinia: 'Certinia',
+ rillet: 'Rillet',
+ campfire: 'Campfire',
gusto: 'Gusto',
billCom: 'Bill.com',
zenefits: 'Zenefits',
@@ -3743,7 +3749,7 @@ const CONST = {
other: 'Other',
},
get ACCOUNTING_CONNECTION_NAMES() {
- return [this.NAME.QBO, this.NAME.QBD, this.NAME.XERO, this.NAME.NETSUITE, this.NAME.SAGE_INTACCT, this.NAME.CERTINIA] as const;
+ return [this.NAME.QBO, this.NAME.QBD, this.NAME.XERO, this.NAME.NETSUITE, this.NAME.SAGE_INTACCT, this.NAME.CERTINIA, this.NAME.RILLET, this.NAME.CAMPFIRE] as const;
},
get HR_CONNECTION_NAMES() {
return [this.NAME.GUSTO] as const;
@@ -6099,6 +6105,8 @@ const CONST = {
SEARCH_ISSUES: 'https://github.com/Expensify/App/issues',
},
+ RILLET_INTEGRATION_URL: 'https://www.rillet.com/integrations/expensify',
+ CAMPFIRE_INTEGRATION_URL: 'https://campfire.ai/integrations',
BOOK_TRAVEL_DEMO_URL: 'https://calendly.com/d/ck2z-xsh-q97/expensify-travel-demo-travel-page',
TRAVEL_DOT_URL: 'https://travel.expensify.com',
STAGING_TRAVEL_DOT_URL: 'https://staging.travel.expensify.com',
diff --git a/src/components/ConnectToCampfireFlow/index.tsx b/src/components/ConnectToCampfireFlow/index.tsx
new file mode 100644
index 000000000000..adc75fc2d48b
--- /dev/null
+++ b/src/components/ConnectToCampfireFlow/index.tsx
@@ -0,0 +1,15 @@
+import {useEffect} from 'react';
+import {openExternalLink} from '@userActions/Link';
+import CONST from '@src/CONST';
+import type {ConnectToCampfireFlowProps} from './types';
+
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
+function ConnectToCampfireFlow(_props: ConnectToCampfireFlowProps) {
+ useEffect(() => {
+ openExternalLink(CONST.CAMPFIRE_INTEGRATION_URL);
+ }, []);
+
+ return null;
+}
+
+export default ConnectToCampfireFlow;
diff --git a/src/components/ConnectToCampfireFlow/types.ts b/src/components/ConnectToCampfireFlow/types.ts
new file mode 100644
index 000000000000..ee4c8f142ce9
--- /dev/null
+++ b/src/components/ConnectToCampfireFlow/types.ts
@@ -0,0 +1,6 @@
+type ConnectToCampfireFlowProps = {
+ policyID: string;
+};
+
+// eslint-disable-next-line import/prefer-default-export
+export type {ConnectToCampfireFlowProps};
diff --git a/src/components/ConnectToRilletFlow/index.tsx b/src/components/ConnectToRilletFlow/index.tsx
new file mode 100644
index 000000000000..8753d4078fc2
--- /dev/null
+++ b/src/components/ConnectToRilletFlow/index.tsx
@@ -0,0 +1,15 @@
+import {useEffect} from 'react';
+import {openExternalLink} from '@userActions/Link';
+import CONST from '@src/CONST';
+import type {ConnectToRilletFlowProps} from './types';
+
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
+function ConnectToRilletFlow(_props: ConnectToRilletFlowProps) {
+ useEffect(() => {
+ openExternalLink(CONST.RILLET_INTEGRATION_URL);
+ }, []);
+
+ return null;
+}
+
+export default ConnectToRilletFlow;
diff --git a/src/components/ConnectToRilletFlow/types.ts b/src/components/ConnectToRilletFlow/types.ts
new file mode 100644
index 000000000000..41cde739d89a
--- /dev/null
+++ b/src/components/ConnectToRilletFlow/types.ts
@@ -0,0 +1,6 @@
+type ConnectToRilletFlowProps = {
+ policyID: string;
+};
+
+// eslint-disable-next-line import/prefer-default-export
+export type {ConnectToRilletFlowProps};
diff --git a/src/components/Icon/chunks/expensify-icons.chunk.ts b/src/components/Icon/chunks/expensify-icons.chunk.ts
index 4b929e95dfec..8a80c2af8420 100644
--- a/src/components/Icon/chunks/expensify-icons.chunk.ts
+++ b/src/components/Icon/chunks/expensify-icons.chunk.ts
@@ -126,6 +126,7 @@ import ImageCropSquareMask from '@assets/images/image-crop-square-mask.svg';
import Inbox from '@assets/images/inbox.svg';
import Info from '@assets/images/info.svg';
import BillComSquare from '@assets/images/integrationicons/bill-com-icon-square.svg';
+import CampfireSquare from '@assets/images/integrationicons/campfire-icon-square.svg';
import CertiniaSquare from '@assets/images/integrationicons/certinia-icon-square.svg';
import CircleSlash from '@assets/images/integrationicons/circle-slash.svg';
import NetSuiteExport from '@assets/images/integrationicons/export/netsuite-icon.svg';
@@ -139,6 +140,7 @@ import OracleSquare from '@assets/images/integrationicons/oracle-icon-square.svg
import QBDSquare from '@assets/images/integrationicons/qbd-icon-square.svg';
import QBOCircle from '@assets/images/integrationicons/qbo-icon-circle.svg';
import QBOSquare from '@assets/images/integrationicons/qbo-icon-square.svg';
+import RilletSquare from '@assets/images/integrationicons/rillet-icon-square.svg';
import SageIntacctSquare from '@assets/images/integrationicons/sage-intacct-icon-square.svg';
import SapSquare from '@assets/images/integrationicons/sap-icon-square.svg';
import Uber from '@assets/images/integrationicons/uber.svg';
@@ -294,6 +296,7 @@ const Expensicons = {
Buildings,
Calendar,
Camera,
+ CampfireSquare,
Car,
CarPlus,
Cash,
@@ -431,6 +434,7 @@ const Expensicons = {
ReportCopy,
ReplaceReceipt,
ReceiptMultiple,
+ RilletSquare,
Rotate,
RotateLeft,
Scan,
diff --git a/src/languages/de.ts b/src/languages/de.ts
index 46ac20d0c7cd..62ffb53ee0f4 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -6081,6 +6081,8 @@ _Für ausführlichere Anweisungen [besuchen Sie unsere Hilfeseite](${CONST.NETSU
xero: 'Xero',
netsuite: 'NetSuite',
intacct: 'Sage Intacct',
+ rillet: 'Rillet',
+ campfire: 'Campfire',
sap: 'SAP',
oracle: 'Oracle',
microsoftDynamics: 'Microsoft Dynamics',
diff --git a/src/languages/en.ts b/src/languages/en.ts
index 29a0d14f555c..1f09aa44d60a 100644
--- a/src/languages/en.ts
+++ b/src/languages/en.ts
@@ -6093,6 +6093,8 @@ const translations = {
xero: 'Xero',
netsuite: 'NetSuite',
intacct: 'Sage Intacct',
+ rillet: 'Rillet',
+ campfire: 'Campfire',
sap: 'SAP',
oracle: 'Oracle',
microsoftDynamics: 'Microsoft Dynamics',
@@ -6110,6 +6112,10 @@ const translations = {
return 'NetSuite';
case CONST.POLICY.CONNECTIONS.NAME.SAGE_INTACCT:
return 'Sage Intacct';
+ case CONST.POLICY.CONNECTIONS.NAME.RILLET:
+ return 'Rillet';
+ case CONST.POLICY.CONNECTIONS.NAME.CAMPFIRE:
+ return 'Campfire';
default: {
return '';
}
diff --git a/src/languages/es.ts b/src/languages/es.ts
index f8b418c51c29..6b17fa19c7b6 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -5902,6 +5902,8 @@ ${amount} para ${merchant} - ${date}`,
xero: 'Xero',
netsuite: 'NetSuite',
intacct: 'Sage Intacct',
+ rillet: 'Rillet',
+ campfire: 'Campfire',
sap: 'SAP',
oracle: 'Oracle',
microsoftDynamics: 'Microsoft Dynamics',
@@ -5919,6 +5921,10 @@ ${amount} para ${merchant} - ${date}`,
return 'NetSuite';
case CONST.POLICY.CONNECTIONS.NAME.SAGE_INTACCT:
return 'Sage Intacct';
+ case CONST.POLICY.CONNECTIONS.NAME.RILLET:
+ return 'Rillet';
+ case CONST.POLICY.CONNECTIONS.NAME.CAMPFIRE:
+ return 'Campfire';
default: {
return '';
}
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index 9398b551c2e4..fd242c5a6223 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -6102,6 +6102,8 @@ _Pour des instructions plus détaillées, [visitez notre site d’aide](${CONST.
xero: 'Xero',
netsuite: 'NetSuite',
intacct: 'Sage Intacct',
+ rillet: 'Rillet',
+ campfire: 'Campfire',
sap: 'SAP',
oracle: 'Oracle',
microsoftDynamics: 'Microsoft Dynamics',
diff --git a/src/languages/it.ts b/src/languages/it.ts
index a1a85aa1fb11..688e9001745c 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -6070,6 +6070,8 @@ _Per istruzioni più dettagliate, [visita il nostro sito di assistenza](${CONST.
xero: 'Xero',
netsuite: 'NetSuite',
intacct: 'Sage Intacct',
+ rillet: 'Rillet',
+ campfire: 'Campfire',
sap: 'SAP',
oracle: 'Oracle',
microsoftDynamics: 'Microsoft Dynamics',
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index c3630de5a202..7f77af74aa5a 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -6002,6 +6002,8 @@ _詳しい手順については、[ヘルプサイトをご覧ください](${CO
xero: 'Xero',
netsuite: 'NetSuite',
intacct: 'Sage Intacct',
+ rillet: 'Rillet',
+ campfire: 'Campfire',
sap: 'SAP',
oracle: 'Oracle',
microsoftDynamics: 'Microsoft Dynamics',
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index 043fb84b6c3c..6cdd5f513104 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -6051,6 +6051,8 @@ _Voor meer gedetailleerde instructies, [bezoek onze help-site](${CONST.NETSUITE_
xero: 'Xero',
netsuite: 'NetSuite',
intacct: 'Sage Intacct',
+ rillet: 'Rillet',
+ campfire: 'Campfire',
sap: 'SAP',
oracle: 'Oracle',
microsoftDynamics: 'Microsoft Dynamics',
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index 8c2c6d443f2a..049a7c878bf9 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -6043,6 +6043,8 @@ _Aby uzyskać bardziej szczegółowe instrukcje, [odwiedź naszą stronę pomocy
xero: 'Xero',
netsuite: 'NetSuite',
intacct: 'Sage Intacct',
+ rillet: 'Rillet',
+ campfire: 'Campfire',
sap: 'SAP',
oracle: 'Oracle',
microsoftDynamics: 'Microsoft Dynamics',
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index 05e6368b9ab2..f14b56c2eb68 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -6050,6 +6050,8 @@ _Para instruções mais detalhadas, [visite nossa central de ajuda](${CONST.NETS
xero: 'Xero',
netsuite: 'NetSuite',
intacct: 'Sage Intacct',
+ rillet: 'Rillet',
+ campfire: 'Campfire',
sap: 'SAP',
oracle: 'Oracle',
microsoftDynamics: 'Microsoft Dynamics',
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index 22a780fe0e36..4a038f54f0cc 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -5900,6 +5900,8 @@ _如需更详细的说明,请[访问我们的帮助网站](${CONST.NETSUITE_IM
xero: 'Xero',
netsuite: 'NetSuite',
intacct: 'Sage Intacct',
+ rillet: 'Rillet',
+ campfire: 'Campfire',
sap: 'SAP',
oracle: 'Oracle',
microsoftDynamics: 'Microsoft Dynamics',
diff --git a/src/libs/AccountingUtils.ts b/src/libs/AccountingUtils.ts
index 194ce5c2dd92..3b0f96603422 100644
--- a/src/libs/AccountingUtils.ts
+++ b/src/libs/AccountingUtils.ts
@@ -9,6 +9,8 @@ const ROUTE_NAME_MAPPING = {
[CONST.POLICY.CONNECTIONS.ROUTE.NETSUITE]: CONST.POLICY.CONNECTIONS.NAME.NETSUITE,
[CONST.POLICY.CONNECTIONS.ROUTE.QBD]: CONST.POLICY.CONNECTIONS.NAME.QBD,
[CONST.POLICY.CONNECTIONS.ROUTE.CERTINIA]: CONST.POLICY.CONNECTIONS.NAME.CERTINIA,
+ [CONST.POLICY.CONNECTIONS.ROUTE.RILLET]: CONST.POLICY.CONNECTIONS.NAME.RILLET,
+ [CONST.POLICY.CONNECTIONS.ROUTE.CAMPFIRE]: CONST.POLICY.CONNECTIONS.NAME.CAMPFIRE,
[CONST.POLICY.CONNECTIONS.ROUTE.GUSTO]: CONST.POLICY.CONNECTIONS.NAME.GUSTO,
};
@@ -19,6 +21,8 @@ const NAME_ROUTE_MAPPING = {
[CONST.POLICY.CONNECTIONS.NAME.NETSUITE]: CONST.POLICY.CONNECTIONS.ROUTE.NETSUITE,
[CONST.POLICY.CONNECTIONS.NAME.QBD]: CONST.POLICY.CONNECTIONS.ROUTE.QBD,
[CONST.POLICY.CONNECTIONS.NAME.CERTINIA]: CONST.POLICY.CONNECTIONS.ROUTE.CERTINIA,
+ [CONST.POLICY.CONNECTIONS.NAME.RILLET]: CONST.POLICY.CONNECTIONS.ROUTE.RILLET,
+ [CONST.POLICY.CONNECTIONS.NAME.CAMPFIRE]: CONST.POLICY.CONNECTIONS.ROUTE.CAMPFIRE,
[CONST.POLICY.CONNECTIONS.NAME.GUSTO]: CONST.POLICY.CONNECTIONS.ROUTE.GUSTO,
};
diff --git a/src/pages/workspace/accounting/AccountingContext/index.tsx b/src/pages/workspace/accounting/AccountingContext/index.tsx
index bf8c6305a587..d8304851398e 100644
--- a/src/pages/workspace/accounting/AccountingContext/index.tsx
+++ b/src/pages/workspace/accounting/AccountingContext/index.tsx
@@ -29,7 +29,7 @@ function AccountingContextProvider({children, policy}: AccountingContextProvider
const [activeIntegration, setActiveIntegration] = useState();
const {translate} = useLocalize();
const policyID = policy?.id;
- const accountingIcons = useMemoizedLazyExpensifyIcons(['IntacctSquare', 'QBOSquare', 'XeroSquare', 'NetSuiteSquare', 'QBDSquare']);
+ const accountingIcons = useMemoizedLazyExpensifyIcons(['IntacctSquare', 'QBOSquare', 'XeroSquare', 'NetSuiteSquare', 'QBDSquare', 'RilletSquare', 'CampfireSquare']);
const hasReusablePoliciesConnectedToSageIntacct = useHasReusablePoliciesConnectedTo(CONST.POLICY.CONNECTIONS.NAME.SAGE_INTACCT, policyID);
const hasReusablePoliciesConnectedToQBD = useHasReusablePoliciesConnectedTo(CONST.POLICY.CONNECTIONS.NAME.QBD, policyID);
diff --git a/src/pages/workspace/accounting/PolicyAccountingPage.tsx b/src/pages/workspace/accounting/PolicyAccountingPage.tsx
index 15c559c3a144..219e33479c51 100644
--- a/src/pages/workspace/accounting/PolicyAccountingPage.tsx
+++ b/src/pages/workspace/accounting/PolicyAccountingPage.tsx
@@ -101,7 +101,7 @@ function PolicyAccountingPage({policy}: PolicyAccountingPageProps) {
const allCardSettings = useExpensifyCardFeeds(policyID);
const isSyncInProgress = isConnectionInProgress(connectionSyncProgress, policy);
const icons = useMemoizedLazyExpensifyIcons(['ArrowRight', 'CircularArrowBackwards', 'ExpensifyCard', 'Gear', 'Key', 'NewWindow', 'Pencil', 'QuestionMark', 'Send', 'Sync', 'Trashcan']);
- const accountingIcons = useMemoizedLazyExpensifyIcons(['IntacctSquare', 'QBOSquare', 'XeroSquare', 'NetSuiteSquare', 'QBDSquare']);
+ const accountingIcons = useMemoizedLazyExpensifyIcons(['IntacctSquare', 'QBOSquare', 'XeroSquare', 'NetSuiteSquare', 'QBDSquare', 'RilletSquare', 'CampfireSquare']);
const illustrations = useMemoizedLazyIllustrations(['Accounting']);
const accountingIntegrations = CONST.POLICY.CONNECTIONS.ACCOUNTING_CONNECTION_NAMES;
diff --git a/src/pages/workspace/accounting/utils.tsx b/src/pages/workspace/accounting/utils.tsx
index 8bf8dd939d5d..f716c3b87f41 100644
--- a/src/pages/workspace/accounting/utils.tsx
+++ b/src/pages/workspace/accounting/utils.tsx
@@ -1,8 +1,10 @@
import React from 'react';
import type {OnyxEntry} from 'react-native-onyx';
+import ConnectToCampfireFlow from '@components/ConnectToCampfireFlow';
import ConnectToNetSuiteFlow from '@components/ConnectToNetSuiteFlow';
import ConnectToQuickbooksDesktopFlow from '@components/ConnectToQuickbooksDesktopFlow';
import ConnectToQuickbooksOnlineFlow from '@components/ConnectToQuickbooksOnlineFlow';
+import ConnectToRilletFlow from '@components/ConnectToRilletFlow';
import ConnectToSageIntacctFlow from '@components/ConnectToSageIntacctFlow';
import ConnectToXeroFlow from '@components/ConnectToXeroFlow';
import type {LocaleContextProps} from '@components/LocaleContextProvider';
@@ -50,7 +52,7 @@ function getAccountingIntegrationData(
integrationToDisconnect?: ConnectionName,
shouldDisconnectIntegrationBeforeConnecting?: boolean,
canUseNetSuiteUSATax?: boolean,
- expensifyIcons?: Record<'IntacctSquare' | 'QBOSquare' | 'XeroSquare' | 'NetSuiteSquare' | 'QBDSquare', IconAsset>,
+ expensifyIcons?: Record<'IntacctSquare' | 'QBOSquare' | 'XeroSquare' | 'NetSuiteSquare' | 'QBDSquare' | 'RilletSquare' | 'CampfireSquare', IconAsset>,
): AccountingIntegration | undefined {
const qboConfig = policy?.connections?.quickbooksOnline?.config;
const netsuiteConfig = policy?.connections?.netsuite?.options?.config;
@@ -308,6 +310,36 @@ function getAccountingIntegrationData(
backToAfterWorkspaceUpgradeRoute: getBackToAfterWorkspaceUpgradeRouteForQBD(),
},
};
+ case CONST.POLICY.CONNECTIONS.NAME.RILLET:
+ return {
+ title: translate('workspace.accounting.rillet'),
+ icon: expensifyIcons?.RilletSquare,
+ setupConnectionFlow: (
+
+ ),
+ onImportPagePress: () => {},
+ onExportPagePress: () => {},
+ onAdvancedPagePress: () => {},
+ onCardReconciliationPagePress: () => {},
+ };
+ case CONST.POLICY.CONNECTIONS.NAME.CAMPFIRE:
+ return {
+ title: translate('workspace.accounting.campfire'),
+ icon: expensifyIcons?.CampfireSquare,
+ setupConnectionFlow: (
+
+ ),
+ onImportPagePress: () => {},
+ onExportPagePress: () => {},
+ onAdvancedPagePress: () => {},
+ onCardReconciliationPagePress: () => {},
+ };
default:
return undefined;
}
diff --git a/src/types/onyx/Policy.ts b/src/types/onyx/Policy.ts
index bfb93a47da07..d96dd8b998be 100644
--- a/src/types/onyx/Policy.ts
+++ b/src/types/onyx/Policy.ts
@@ -1507,6 +1507,12 @@ type Connections = {
/** Certinia integration connection */
[CONST.POLICY.CONNECTIONS.NAME.CERTINIA]: Connection, Record>;
+ /** Rillet integration connection */
+ [CONST.POLICY.CONNECTIONS.NAME.RILLET]: Connection, Record>;
+
+ /** Campfire integration connection */
+ [CONST.POLICY.CONNECTIONS.NAME.CAMPFIRE]: Connection, Record>;
+
/** Gusto integration connection */
[CONST.POLICY.CONNECTIONS.NAME.GUSTO]: Connection;
};