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 @@ +C \ 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 @@ +R \ 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; };