Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/CONST/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4685,6 +4685,12 @@ const CONST = {
BLOCK: 'block',
},
},
AI_RULES: {
TAB_SELECTOR: {
SUGGESTED: 'suggested',
EDIT: 'edit',
},
},

get SUBSCRIPTION_PRICES() {
return {
Expand Down Expand Up @@ -9844,6 +9850,9 @@ const CONST = {
SPEND_RULE_SECTION_ITEM: 'WorkspaceRules-SpendRuleSectionItem',
SPEND_RULE_SAVE: 'WorkspaceRules-SpendRuleSave',
SPEND_RULE_RESTRICTION_TYPE: 'WorkspaceRules-SpendRuleRestrictionType',
AI_RULE_ITEM: 'WorkspaceRules-AIRuleItem',
ADD_AI_RULE: 'WorkspaceRules-AddAIRule',
AI_RULE_SAVE: 'WorkspaceRules-AIRuleSave',
},
EXPENSIFY_CARD: {
ISSUE_CARD_BUTTON: 'WorkspaceExpensifyCard-IssueCardButton',
Expand Down
3 changes: 3 additions & 0 deletions src/ONYXKEYS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1180,6 +1180,8 @@ const ONYXKEYS = {
EDIT_AGENT_NAME_FORM_DRAFT: 'editAgentNameFormDraft',
EDIT_AGENT_PROMPT_FORM: 'editAgentPromptForm',
EDIT_AGENT_PROMPT_FORM_DRAFT: 'editAgentPromptFormDraft',
ADD_AI_RULE_FORM: 'addAIRuleForm',
ADD_AI_RULE_FORM_DRAFT: 'addAIRuleFormDraft',
},
DERIVED: {
REPORT_ATTRIBUTES: 'reportAttributes',
Expand Down Expand Up @@ -1331,6 +1333,7 @@ type OnyxFormValuesMapping = {
[ONYXKEYS.FORMS.CREATE_DOMAIN_GROUP_FORM]: FormTypes.DomainGroupCreateForm;
[ONYXKEYS.FORMS.EDIT_AGENT_NAME_FORM]: FormTypes.EditAgentNameForm;
[ONYXKEYS.FORMS.EDIT_AGENT_PROMPT_FORM]: FormTypes.EditAgentPromptForm;
[ONYXKEYS.FORMS.ADD_AI_RULE_FORM]: FormTypes.AddAIRuleForm;
};

type OnyxFormDraftValuesMapping = {
Expand Down
8 changes: 8 additions & 0 deletions src/ROUTES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3248,6 +3248,14 @@ const ROUTES = {
route: 'workspaces/:policyID/rules/merchant-rules/:ruleID/preview-matches',
getRoute: (policyID: string, ruleID?: string) => `workspaces/${policyID}/rules/merchant-rules/${ruleID ?? 'new'}/preview-matches` as const,
},
RULES_AI_NEW: {
route: 'workspaces/:policyID/rules/ai-rules/new',
getRoute: (policyID: string) => `workspaces/${policyID}/rules/ai-rules/new` as const,
},
RULES_AI_EDIT: {
route: 'workspaces/:policyID/rules/ai-rules/:ruleID',
getRoute: (policyID: string, ruleID: string) => `workspaces/${policyID}/rules/ai-rules/${ruleID}` as const,
},
SHARE_ROOT: 'share/root',
SHARE_ROOT_SHARE: 'share/root/share',
SHARE_ROOT_SUBMIT: 'share/root/submit',
Expand Down
1 change: 1 addition & 0 deletions src/SCREENS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -914,6 +914,7 @@ const SCREENS = {
RULES_MERCHANT_EDIT: 'Rules_Merchant_Edit',
RULES_SPEND_MERCHANTS: 'Rules_Spend_Merchants',
RULES_SPEND_MERCHANT_EDIT: 'Rules_Spend_Merchant_Edit',
RULES_AI_NEW: 'Rules_AI_New',
PER_DIEM: 'Per_Diem',
PER_DIEM_IMPORT: 'Per_Diem_Import',
PER_DIEM_IMPORTED: 'Per_Diem_Imported',
Expand Down
10 changes: 10 additions & 0 deletions src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -334,6 +334,7 @@ const translations = {
tag: 'Tag',
receipt: 'Receipt',
verified: 'Verified',
suggestted: 'Suggested',
replace: 'Replace',
distance: 'Distance',
mile: 'mile',
Expand Down Expand Up @@ -7311,6 +7312,15 @@ const translations = {
[CONST.SPEND_RULES.CATEGORIES.TRAVEL_AGENCIES]: 'Travel agencies',
},
},
aiRules: {
title: 'AI rules',
subtitle: 'Describe flexible runs that runs when you need',
addRule: 'Add AI rule',
findRule: 'Find AI rule',
addRuleTitle: 'Add rule',
describeRuleTitle: 'Describe your rule',
describeRuleSubtitle: 'Describe your rule and Concierge will build it',
},
},
planTypePage: {
planTypes: {
Expand Down
7 changes: 7 additions & 0 deletions src/libs/API/parameters/AddPolicyAIRuleParams.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
type AddPolicyAIRuleParams = {
policyID: string;
aiRuleID: string;
prompt: string;
};

export default AddPolicyAIRuleParams;
1 change: 1 addition & 0 deletions src/libs/API/parameters/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -372,6 +372,7 @@ export type {default as SetPolicyExpenseMaxAmountNoReceipt} from './SetPolicyExp
export type {default as SetPolicyExpenseMaxAmountNoItemizedReceipt} from './SetPolicyExpenseMaxAmountNoItemizedReceipt';
export type {default as SetPolicyExpenseMaxAmount} from './SetPolicyExpenseMaxAmount';
export type {default as SetPolicyExpenseMaxAge} from './SetPolicyExpenseMaxAge';
export type {default as AddPolicyAIRuleParams} from './AddPolicyAIRuleParams';
export type {default as UpdateCustomRules} from './UpdateCustomRules';
export type {default as SetPolicyBillableModeParams} from './SetPolicyBillableModeParams';
export type {default as SetPolicyCashExpenseModeParams} from './SetPolicyCashExpenseModeParams';
Expand Down
4 changes: 3 additions & 1 deletion src/libs/API/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,8 @@ const WRITE_COMMANDS = {
SET_POLICY_EXPENSE_MAX_AMOUNT_NO_ITEMIZED_RECEIPT: 'SetPolicyExpenseMaxAmountNoItemizedReceipt',
SET_POLICY_EXPENSE_MAX_AMOUNT: 'SetPolicyExpenseMaxAmount',
SET_POLICY_PROHIBITED_EXPENSES: 'SetPolicyProhibitedExpenses',
SET_POLICY_EXPENSE_MAX_AGE: ' SetPolicyExpenseMaxAge',
SET_POLICY_EXPENSE_MAX_AGE: 'SetPolicyExpenseMaxAge',
ADD_POLICY_AI_RULE: 'AddPolicyAIRule',
UPDATE_CUSTOM_RULES: 'UpdateCustomRules',
SET_POLICY_BILLABLE_MODE: 'SetPolicyBillableMode',
SET_POLICY_REIMBURSABLE_MODE: 'SetPolicyReimbursableMode',
Expand Down Expand Up @@ -942,6 +943,7 @@ type WriteCommandParameters = {
[WRITE_COMMANDS.SET_POLICY_EXPENSE_MAX_AMOUNT_NO_ITEMIZED_RECEIPT]: Parameters.SetPolicyExpenseMaxAmountNoItemizedReceipt;
[WRITE_COMMANDS.SET_POLICY_EXPENSE_MAX_AMOUNT]: Parameters.SetPolicyExpenseMaxAmount;
[WRITE_COMMANDS.SET_POLICY_EXPENSE_MAX_AGE]: Parameters.SetPolicyExpenseMaxAge;
[WRITE_COMMANDS.ADD_POLICY_AI_RULE]: Parameters.AddPolicyAIRuleParams;
[WRITE_COMMANDS.UPDATE_CUSTOM_RULES]: Parameters.UpdateCustomRules;
[WRITE_COMMANDS.SET_POLICY_BILLABLE_MODE]: Parameters.SetPolicyBillableModeParams;
[WRITE_COMMANDS.SET_POLICY_REIMBURSABLE_MODE]: Parameters.SetPolicyCashExpenseModeParams;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1077,6 +1077,7 @@ const SettingsModalStackNavigator = createModalStackNavigator<SettingsNavigatorP
[SCREENS.WORKSPACE.RULES_MERCHANT_BILLABLE]: () => require<ReactComponentModule>('../../../../pages/workspace/rules/MerchantRules/AddBillablePage').default,
[SCREENS.WORKSPACE.RULES_MERCHANT_PREVIEW_MATCHES]: () => require<ReactComponentModule>('../../../../pages/workspace/rules/MerchantRules/PreviewMatchesPage').default,
[SCREENS.WORKSPACE.RULES_MERCHANT_EDIT]: () => require<ReactComponentModule>('../../../../pages/workspace/rules/MerchantRules/EditMerchantRulePage').default,
[SCREENS.WORKSPACE.RULES_AI_NEW]: () => require<ReactComponentModule>('../../../../pages/workspace/rules/AIRules/AddAIRulePage').default,
[SCREENS.WORKSPACE.PER_DIEM_IMPORT]: () => require<ReactComponentModule>('../../../../pages/workspace/perDiem/ImportPerDiemPage').default,
[SCREENS.WORKSPACE.PER_DIEM_IMPORTED]: () => require<ReactComponentModule>('../../../../pages/workspace/perDiem/ImportedPerDiemPage').default,
[SCREENS.WORKSPACE.PER_DIEM_SETTINGS]: () => require<ReactComponentModule>('../../../../pages/workspace/perDiem/WorkspacePerDiemSettingsPage').default,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,7 @@ const WORKSPACE_TO_RHP: Partial<Record<keyof WorkspaceSplitNavigatorParamList, s
SCREENS.WORKSPACE.RULES_MERCHANT_BILLABLE,
SCREENS.WORKSPACE.RULES_MERCHANT_PREVIEW_MATCHES,
SCREENS.WORKSPACE.RULES_MERCHANT_EDIT,
SCREENS.WORKSPACE.RULES_AI_NEW,
],
[SCREENS.WORKSPACE.RECEIPT_PARTNERS]: [
SCREENS.WORKSPACE.RECEIPT_PARTNERS_INVITE,
Expand Down
3 changes: 3 additions & 0 deletions src/libs/Navigation/linkingConfig/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1365,6 +1365,9 @@ const config: LinkingOptions<RootNavigatorParamList>['config'] = {
[SCREENS.WORKSPACE.RULES_MERCHANT_EDIT]: {
path: ROUTES.RULES_MERCHANT_EDIT.route,
},
[SCREENS.WORKSPACE.RULES_AI_NEW]: {
path: ROUTES.RULES_AI_NEW.route,
},
[SCREENS.WORKSPACE.PER_DIEM_IMPORT]: {
path: ROUTES.WORKSPACE_PER_DIEM_IMPORT.route,
},
Expand Down
3 changes: 3 additions & 0 deletions src/libs/Navigation/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1529,6 +1529,9 @@ type SettingsNavigatorParamList = {
ruleID: string;
merchantIndex: string;
};
[SCREENS.WORKSPACE.RULES_AI_NEW]: {
policyID: string;
};
[SCREENS.WORKSPACE.RULES_MERCHANT_MERCHANT_TO_MATCH]: {
policyID: string;
ruleID: string;
Expand Down
73 changes: 72 additions & 1 deletion src/libs/actions/Policy/Rules.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import type {OnyxUpdate} from 'react-native-onyx';
import Onyx from 'react-native-onyx';
import * as API from '@libs/API';
import {AddPolicyAIRuleParams} from '@libs/API/parameters';

Check failure on line 4 in src/libs/actions/Policy/Rules.ts

View workflow job for this annotation

GitHub Actions / ESLint check

All imports in the declaration are only used as types. Use `import type`

Check failure on line 4 in src/libs/actions/Policy/Rules.ts

View workflow job for this annotation

GitHub Actions / ESLint check

All imports in the declaration are only used as types. Use `import type`

Check failure on line 4 in src/libs/actions/Policy/Rules.ts

View workflow job for this annotation

GitHub Actions / ESLint check

All imports in the declaration are only used as types. Use `import type`
import type OpenPolicyRulesPageParams from '@libs/API/parameters/OpenPolicyRulesPageParams';
import type SetPolicyCodingRuleParams from '@libs/API/parameters/SetPolicyCodingRuleParams';
import {READ_COMMANDS, WRITE_COMMANDS} from '@libs/API/types';
Expand All @@ -13,6 +14,7 @@
import type {MerchantRuleForm} from '@src/types/form';
import type Policy from '@src/types/onyx/Policy';
import type {CodingRule, CodingRuleFilter, CodingRuleTax} from '@src/types/onyx/Policy';
import type {OnyxData} from '@src/types/onyx/Request';

/**
* Builds the tax object from a tax key and policy
Expand Down Expand Up @@ -324,4 +326,73 @@
API.write(WRITE_COMMANDS.SET_POLICY_CODING_RULE, parameters, onyxData);
}

export {openPolicyRulesPage, setPolicyCodingRule, deletePolicyCodingRule, getTransactionsMatchingCodingRule};
function addPolicyAIRule(policyID: string, aiRuleID: string, prompt: string) {
if (!policyID || !aiRuleID || !prompt) {
Log.warn('Invalid params for addPolicyAIRule', {policyID, aiRuleID, prompt});
return;
}

const policyKey = `${ONYXKEYS.COLLECTION.POLICY}${policyID}` as const;

const onyxData: OnyxData<typeof ONYXKEYS.COLLECTION.POLICY> = {
optimisticData: [
{
onyxMethod: Onyx.METHOD.MERGE,
key: policyKey,
value: {
rules: {
aiRules: {
[aiRuleID]: {
ruleID: aiRuleID,
created: new Date().toISOString(),
prompt,
pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD,
},
},
},
},
},
],
successData: [
{
onyxMethod: Onyx.METHOD.MERGE,
key: policyKey,
value: {
rules: {
aiRules: {
[aiRuleID]: {
pendingAction: null,
errors: null,
},
},
},
},
},
],
failureData: [
{
onyxMethod: Onyx.METHOD.MERGE,
key: policyKey,
value: {
rules: {
aiRules: {
[aiRuleID]: {
pendingAction: null,
},
},
},
},
},
],
};

const parameters: AddPolicyAIRuleParams = {
policyID,
aiRuleID,
prompt,
};

API.write(WRITE_COMMANDS.ADD_POLICY_AI_RULE, parameters, onyxData);
}

export {openPolicyRulesPage, setPolicyCodingRule, deletePolicyCodingRule, getTransactionsMatchingCodingRule, addPolicyAIRule};
Loading
Loading