Skip to content

Commit 76f16bc

Browse files
authored
Merge pull request #48185 from narefyev91/feed-settings
[NO QA]: Feed Settings
2 parents 694fd06 + c34a080 commit 76f16bc

22 files changed

+490
-1
lines changed

src/CONST.ts

+6
Original file line numberDiff line numberDiff line change
@@ -2341,6 +2341,12 @@ const CONST = {
23412341
PAYPERUSE: 'monthly2018',
23422342
},
23432343
},
2344+
COMPANY_CARDS: {
2345+
DELETE_TRANSACTIONS: {
2346+
RESTRICT: 'corporate',
2347+
ALLOW: 'personal',
2348+
},
2349+
},
23442350
REGEX: {
23452351
SPECIAL_CHARS_WITHOUT_NEWLINE: /((?!\n)[()-\s\t])/g,
23462352
DIGITS_AND_PLUS: /^\+?[0-9]*$/,

src/ONYXKEYS.ts

+3
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,8 @@ const ONYXKEYS = {
497497
WORKSPACE_RATE_AND_UNIT_FORM_DRAFT: 'workspaceRateAndUnitFormDraft',
498498
WORKSPACE_TAX_CUSTOM_NAME: 'workspaceTaxCustomName',
499499
WORKSPACE_TAX_CUSTOM_NAME_DRAFT: 'workspaceTaxCustomNameDraft',
500+
WORKSPACE_COMPANY_CARD_FEED_NAME: 'workspaceCompanyCardFeedName',
501+
WORKSPACE_COMPANY_CARD_FEED_NAME_DRAFT: 'workspaceCompanyCardFeedNameDraft',
500502
WORKSPACE_REPORT_FIELDS_FORM: 'workspaceReportFieldForm',
501503
WORKSPACE_REPORT_FIELDS_FORM_DRAFT: 'workspaceReportFieldFormDraft',
502504
POLICY_CREATE_DISTANCE_RATE_FORM: 'policyCreateDistanceRateForm',
@@ -647,6 +649,7 @@ type OnyxFormValuesMapping = {
647649
[ONYXKEYS.FORMS.WORKSPACE_TAG_FORM]: FormTypes.WorkspaceTagForm;
648650
[ONYXKEYS.FORMS.WORKSPACE_RATE_AND_UNIT_FORM]: FormTypes.WorkspaceRateAndUnitForm;
649651
[ONYXKEYS.FORMS.WORKSPACE_TAX_CUSTOM_NAME]: FormTypes.WorkspaceTaxCustomName;
652+
[ONYXKEYS.FORMS.WORKSPACE_COMPANY_CARD_FEED_NAME]: FormTypes.WorkspaceCompanyCardFeedName;
650653
[ONYXKEYS.FORMS.WORKSPACE_REPORT_FIELDS_FORM]: FormTypes.WorkspaceReportFieldForm;
651654
[ONYXKEYS.FORMS.CLOSE_ACCOUNT_FORM]: FormTypes.CloseAccountForm;
652655
[ONYXKEYS.FORMS.PROFILE_SETTINGS_FORM]: FormTypes.ProfileSettingsForm;

src/ROUTES.ts

+8
Original file line numberDiff line numberDiff line change
@@ -936,6 +936,14 @@ const ROUTES = {
936936
route: 'settings/workspaces/:policyID/expensify-card/settings/frequency',
937937
getRoute: (policyID: string) => `settings/workspaces/${policyID}/expensify-card/settings/frequency` as const,
938938
},
939+
WORKSPACE_COMPANY_CARDS_SETTINGS: {
940+
route: 'settings/workspaces/:policyID/company-cards/settings',
941+
getRoute: (policyID: string) => `settings/workspaces/${policyID}/company-cards/settings` as const,
942+
},
943+
WORKSPACE_COMPANY_CARDS_SETTINGS_FEED_NAME: {
944+
route: 'settings/workspaces/:policyID/company-cards/settings/feed-name',
945+
getRoute: (policyID: string) => `settings/workspaces/${policyID}/company-cards/settings/feed-name` as const,
946+
},
939947
WORKSPACE_RULES: {
940948
route: 'settings/workspaces/:policyID/rules',
941949
getRoute: (policyID: string) => `settings/workspaces/${policyID}/rules` as const,

src/SCREENS.ts

+2
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,8 @@ const SCREENS = {
367367
RATE_AND_UNIT_UNIT: 'Workspace_RateAndUnit_Unit',
368368
COMPANY_CARDS: 'Workspace_CompanyCards',
369369
COMPANY_CARDS_SELECT_FEED: 'Workspace_CompanyCards_Select_Feed',
370+
COMPANY_CARDS_SETTINGS: 'Workspace_CompanyCards_Settings',
371+
COMPANY_CARDS_SETTINGS_FEED_NAME: 'Workspace_CompanyCards_Settings_Feed_Name',
370372
EXPENSIFY_CARD: 'Workspace_ExpensifyCard',
371373
EXPENSIFY_CARD_DETAILS: 'Workspace_ExpensifyCard_Details',
372374
EXPENSIFY_CARD_LIMIT: 'Workspace_ExpensifyCard_Limit',

src/languages/en.ts

+18
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import type {
1919
ChangePolicyParams,
2020
ChangeTypeParams,
2121
CharacterLimitParams,
22+
CompanyCardFeedNameParams,
2223
ConfirmHoldExpenseParams,
2324
ConfirmThatParams,
2425
DateShouldBeAfterParams,
@@ -2901,6 +2902,23 @@ export default {
29012902
disableCardTitle: 'Disable Company Cards',
29022903
disableCardPrompt: 'You can’t disable company cards because this feature is in use. Reach out to the Concierge for next steps.',
29032904
disableCardButton: 'Chat with Concierge',
2905+
assignCard: 'Assign card',
2906+
cardFeedName: 'Card feed name',
2907+
cardFeedNameDescription: 'Give the card feed a unique name so you can tell it apart from the others.',
2908+
cardFeedTransaction: 'Delete transactions',
2909+
cardFeedTransactionDescription: 'Choose whether cardholders can delete card transactions. New transactions will follow these rules.',
2910+
cardFeedRestrictDeletingTransaction: 'Restrict deleting transactions',
2911+
cardFeedAllowDeletingTransaction: 'Allow deleting transactions',
2912+
removeCardFeed: 'Remove card feed',
2913+
removeCardFeedTitle: ({feedName}: CompanyCardFeedNameParams) => `Remove ${feedName} feed`,
2914+
removeCardFeedDescription: 'Are you sure you want to remove this card feed? This will unassign all cards.',
2915+
error: {
2916+
feedNameRequired: 'Card feed name is required.',
2917+
},
2918+
corporate: 'Restrict deleting transactions',
2919+
personal: 'Allow deleting transactions',
2920+
setFeedNameDescription: 'Give the card feed a unique name so you can tell it apart from the others.',
2921+
setTransactionLiabilityDescription: 'When enabled, cardholders can delete card transactions. New transactions will follow this rule.',
29042922
emptyAddedFeedTitle: 'Assign company cards',
29052923
emptyAddedFeedDescription: 'Get started by assigning your first card to a member.',
29062924
},

src/languages/es.ts

+19
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import type {
1717
ChangePolicyParams,
1818
ChangeTypeParams,
1919
CharacterLimitParams,
20+
CompanyCardFeedNameParams,
2021
ConfirmHoldExpenseParams,
2122
ConfirmThatParams,
2223
DateShouldBeAfterParams,
@@ -2945,6 +2946,24 @@ export default {
29452946
disableCardTitle: 'Deshabilitar tarjetas de empresa',
29462947
disableCardPrompt: 'No puedes deshabilitar las tarjetas de empresa porque esta función está en uso. Por favor, contacta a Concierge para los próximos pasos.',
29472948
disableCardButton: 'Chatear con Concierge',
2949+
assignCard: 'Asignar tarjeta',
2950+
cardFeedName: 'Nombre del feed de tarjeta',
2951+
cardFeedNameDescription: 'Dale al feed de tarjeta un nombre único para que puedas distinguirlo de los demás.',
2952+
cardFeedTransaction: 'Eliminar transacciones',
2953+
cardFeedTransactionDescription: 'Elige si los titulares de tarjetas pueden eliminar transacciones de tarjetas. Las nuevas transacciones seguirán estas reglas.',
2954+
cardFeedRestrictDeletingTransaction: 'Restringir eliminación de transacciones',
2955+
cardFeedAllowDeletingTransaction: 'Permitir eliminación de transacciones',
2956+
removeCardFeed: 'Quitar la alimentación de tarjetas',
2957+
removeCardFeedTitle: ({feedName}: CompanyCardFeedNameParams) => `Eliminar el feed de ${feedName}`,
2958+
removeCardFeedDescription: '¿Estás seguro de que deseas eliminar esta fuente de tarjetas? Esto anulará la asignación de todas las tarjetas.',
2959+
error: {
2960+
feedNameRequired: 'Se requiere el nombre de la fuente de la tarjeta.',
2961+
},
2962+
corporate: 'Restringir eliminación de transacciones',
2963+
personal: 'Permitir eliminación de transacciones',
2964+
setFeedNameDescription: 'Dale al feed de tarjeta un nombre único para que puedas distinguirlo de los demás.',
2965+
setTransactionLiabilityDescription:
2966+
'Cuando está habilitada, los titulares de tarjetas pueden eliminar transacciones con tarjeta. Las transacciones nuevas seguirán esta regla.',
29482967
emptyAddedFeedTitle: 'Asignar tarjetas de empresa',
29492968
emptyAddedFeedDescription: 'Comienza asignando tu primera tarjeta a un miembro.',
29502969
},

src/languages/types.ts

+3
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,8 @@ type PayerOwesAmountParams = {payer: string; amount: number | string; comment?:
119119

120120
type PayerOwesParams = {payer: string};
121121

122+
type CompanyCardFeedNameParams = {feedName: string};
123+
122124
type PayerPaidAmountParams = {payer?: string; amount: number | string};
123125

124126
type ApprovedAmountParams = {amount: number | string};
@@ -371,6 +373,7 @@ export type {
371373
CharacterLimitParams,
372374
ConfirmHoldExpenseParams,
373375
ConfirmThatParams,
376+
CompanyCardFeedNameParams,
374377
DateShouldBeAfterParams,
375378
DateShouldBeBeforeParams,
376379
DeleteActionParams,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
type DeleteCompanyCardFeed = {
2+
authToken?: string | null;
3+
policyID: string;
4+
bankName: string;
5+
};
6+
7+
export default DeleteCompanyCardFeed;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
type SetCompanyCardFeedName = {
2+
authToken?: string | null;
3+
policyID: string;
4+
bankName: string;
5+
userDefinedName: string;
6+
};
7+
8+
export default SetCompanyCardFeedName;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
type SetCompanyCardTransactionLiability = {
2+
authToken?: string | null;
3+
bankName: string;
4+
liabilityType: string;
5+
};
6+
7+
export default SetCompanyCardTransactionLiability;

src/libs/API/parameters/index.ts

+3
Original file line numberDiff line numberDiff line change
@@ -290,3 +290,6 @@ export type {default as UpdateExpensifyCardLimitTypeParams} from './UpdateExpens
290290
export type {default as UpdateXeroGenericTypeParams} from './UpdateXeroGenericTypeParams';
291291
export type {default as UpdateCardSettlementFrequencyParams} from './UpdateCardSettlementFrequencyParams';
292292
export type {default as UpdateCardSettlementAccountParams} from './UpdateCardSettlementAccountParams';
293+
export type {default as SetCompanyCardFeedName} from './SetCompanyCardFeedName';
294+
export type {default as DeleteCompanyCardFeed} from './DeleteCompanyCardFeed';
295+
export type {default as SetCompanyCardTransactionLiability} from './SetCompanyCardTransactionLiability';

src/libs/API/types.ts

+6
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,9 @@ const WRITE_COMMANDS = {
348348
UPDATE_XERO_IMPORT_TAX_RATES: 'UpdateXeroImportTaxRates',
349349
UPDATE_XERO_TENANT_ID: 'UpdateXeroTenantID',
350350
UPDATE_XERO_MAPPING: 'UpdateXeroMappings',
351+
SET_COMPANY_CARD_FEED_NAME: 'SetFeedName',
352+
DELETE_COMPANY_CARD_FEED: 'RemoveFeed',
353+
SET_COMPANY_CARD_TRANSACTION_LIABILITY: 'SetFeedTransactionLiability',
351354
} as const;
352355

353356
type WriteCommand = ValueOf<typeof WRITE_COMMANDS>;
@@ -405,6 +408,9 @@ type WriteCommandParameters = {
405408
[WRITE_COMMANDS.UPDATE_STATUS]: Parameters.UpdateStatusParams;
406409
[WRITE_COMMANDS.CLEAR_STATUS]: null;
407410
[WRITE_COMMANDS.UPDATE_PERSONAL_DETAILS_FOR_WALLET]: Parameters.UpdatePersonalDetailsForWalletParams;
411+
[WRITE_COMMANDS.SET_COMPANY_CARD_FEED_NAME]: Parameters.SetCompanyCardFeedName;
412+
[WRITE_COMMANDS.DELETE_COMPANY_CARD_FEED]: Parameters.DeleteCompanyCardFeed;
413+
[WRITE_COMMANDS.SET_COMPANY_CARD_TRANSACTION_LIABILITY]: Parameters.SetCompanyCardTransactionLiability;
408414
[WRITE_COMMANDS.VERIFY_IDENTITY]: Parameters.VerifyIdentityParams;
409415
[WRITE_COMMANDS.ACCEPT_WALLET_TERMS]: Parameters.AcceptWalletTermsParams;
410416
[WRITE_COMMANDS.ANSWER_QUESTIONS_FOR_WALLET]: Parameters.AnswerQuestionsForWalletParams;

src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,8 @@ const SettingsModalStackNavigator = createModalStackNavigator<SettingsNavigatorP
431431
[SCREENS.WORKSPACE.EXPENSIFY_CARD_NAME]: () => require<ReactComponentModule>('../../../../pages/workspace/expensifyCard/WorkspaceEditCardNamePage').default,
432432
[SCREENS.WORKSPACE.EXPENSIFY_CARD_LIMIT]: () => require<ReactComponentModule>('../../../../pages/workspace/expensifyCard/WorkspaceEditCardLimitPage').default,
433433
[SCREENS.WORKSPACE.EXPENSIFY_CARD_LIMIT_TYPE]: () => require<ReactComponentModule>('../../../../pages/workspace/expensifyCard/WorkspaceEditCardLimitTypePage').default,
434+
[SCREENS.WORKSPACE.COMPANY_CARDS_SETTINGS]: () => require<ReactComponentModule>('../../../../pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage').default,
435+
[SCREENS.WORKSPACE.COMPANY_CARDS_SETTINGS_FEED_NAME]: () => require<ReactComponentModule>('../../../../pages/workspace/companyCards/WorkspaceCompanyCardsSettingsFeedNamePage').default,
434436
[SCREENS.SETTINGS.SAVE_THE_WORLD]: () => require<ReactComponentModule>('../../../../pages/TeachersUnite/SaveTheWorldPage').default,
435437
[SCREENS.SETTINGS.SUBSCRIPTION.CHANGE_PAYMENT_CURRENCY]: () => require<ReactComponentModule>('../../../../pages/settings/PaymentCard/ChangeCurrency').default,
436438
[SCREENS.SETTINGS.SUBSCRIPTION.CHANGE_BILLING_CURRENCY]: () => require<ReactComponentModule>('../../../../pages/settings/Subscription/PaymentCard/ChangeBillingCurrency').default,

src/libs/Navigation/linkingConfig/FULL_SCREEN_TO_RHP_MAPPING.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ const FULL_SCREEN_TO_RHP_MAPPING: Partial<Record<FullScreenName, string[]>> = {
160160
SCREENS.WORKSPACE.REPORT_FIELDS_EDIT_INITIAL_VALUE,
161161
],
162162
[SCREENS.WORKSPACE.INVOICES]: [SCREENS.WORKSPACE.INVOICES_COMPANY_NAME, SCREENS.WORKSPACE.INVOICES_COMPANY_WEBSITE],
163-
[SCREENS.WORKSPACE.COMPANY_CARDS]: [SCREENS.WORKSPACE.COMPANY_CARDS_SELECT_FEED],
163+
[SCREENS.WORKSPACE.COMPANY_CARDS]: [SCREENS.WORKSPACE.COMPANY_CARDS_SELECT_FEED, SCREENS.WORKSPACE.COMPANY_CARDS_SETTINGS, SCREENS.WORKSPACE.COMPANY_CARDS_SETTINGS_FEED_NAME],
164164
[SCREENS.WORKSPACE.EXPENSIFY_CARD]: [
165165
SCREENS.WORKSPACE.EXPENSIFY_CARD_ISSUE_NEW,
166166
SCREENS.WORKSPACE.EXPENSIFY_CARD_BANK_ACCOUNT,

src/libs/Navigation/linkingConfig/config.ts

+6
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,12 @@ const config: LinkingOptions<RootStackParamList>['config'] = {
508508
[SCREENS.WORKSPACE.EXPENSIFY_CARD_SETTINGS_ACCOUNT]: {
509509
path: ROUTES.WORKSPACE_EXPENSIFY_CARD_SETTINGS_ACCOUNT.route,
510510
},
511+
[SCREENS.WORKSPACE.COMPANY_CARDS_SETTINGS]: {
512+
path: ROUTES.WORKSPACE_COMPANY_CARDS_SETTINGS.route,
513+
},
514+
[SCREENS.WORKSPACE.COMPANY_CARDS_SETTINGS_FEED_NAME]: {
515+
path: ROUTES.WORKSPACE_COMPANY_CARDS_SETTINGS_FEED_NAME.route,
516+
},
511517
[SCREENS.WORKSPACE.EXPENSIFY_CARD_DETAILS]: {
512518
path: ROUTES.WORKSPACE_EXPENSIFY_CARD_DETAILS.route,
513519
},

src/libs/Navigation/types.ts

+6
Original file line numberDiff line numberDiff line change
@@ -689,6 +689,12 @@ type SettingsNavigatorParamList = {
689689
[SCREENS.WORKSPACE.EXPENSIFY_CARD_SETTINGS_FREQUENCY]: {
690690
policyID: string;
691691
};
692+
[SCREENS.WORKSPACE.COMPANY_CARDS_SETTINGS]: {
693+
policyID: string;
694+
};
695+
[SCREENS.WORKSPACE.COMPANY_CARDS_SETTINGS_FEED_NAME]: {
696+
policyID: string;
697+
};
692698
[SCREENS.WORKSPACE.EXPENSIFY_CARD_DETAILS]: {
693699
policyID: string;
694700
cardID: string;

src/libs/actions/Policy/Policy.ts

+82
Original file line numberDiff line numberDiff line change
@@ -3740,6 +3740,85 @@ function getAdminPoliciesConnectedToNetSuite(): Policy[] {
37403740
return Object.values(allPolicies ?? {}).filter<Policy>((policy): policy is Policy => !!policy && policy.role === CONST.POLICY.ROLE.ADMIN && !!policy?.connections?.netsuite);
37413741
}
37423742

3743+
function setWorkspaceCompanyCardFeedName(policyID: string, workspaceAccountID: number, bankName: string, userDefinedName: string) {
3744+
const authToken = NetworkStore.getAuthToken();
3745+
const onyxData: OnyxData = {
3746+
optimisticData: [
3747+
{
3748+
onyxMethod: Onyx.METHOD.MERGE,
3749+
key: `${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${workspaceAccountID}`,
3750+
value: {
3751+
companyCardNicknames: {
3752+
[bankName]: userDefinedName,
3753+
},
3754+
},
3755+
},
3756+
],
3757+
};
3758+
3759+
const parameters = {
3760+
authToken,
3761+
policyID,
3762+
bankName,
3763+
userDefinedName,
3764+
};
3765+
3766+
API.write(WRITE_COMMANDS.SET_COMPANY_CARD_FEED_NAME, parameters, onyxData);
3767+
}
3768+
3769+
function setWorkspaceCompanyCardTransactionLiability(workspaceAccountID: number, bankName: string, liabilityType: string) {
3770+
const authToken = NetworkStore.getAuthToken();
3771+
const onyxData: OnyxData = {
3772+
optimisticData: [
3773+
{
3774+
onyxMethod: Onyx.METHOD.MERGE,
3775+
key: `${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${workspaceAccountID}`,
3776+
value: {
3777+
companyCards: {
3778+
[bankName]: {liabilityType},
3779+
},
3780+
},
3781+
},
3782+
],
3783+
};
3784+
3785+
const parameters = {
3786+
authToken,
3787+
bankName,
3788+
liabilityType,
3789+
};
3790+
3791+
API.write(WRITE_COMMANDS.SET_COMPANY_CARD_TRANSACTION_LIABILITY, parameters, onyxData);
3792+
}
3793+
function deleteWorkspaceCompanyCardFeed(policyID: string, workspaceAccountID: number, bankName: string) {
3794+
const authToken = NetworkStore.getAuthToken();
3795+
3796+
const onyxData: OnyxData = {
3797+
optimisticData: [
3798+
{
3799+
onyxMethod: Onyx.METHOD.MERGE,
3800+
key: `${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${workspaceAccountID}`,
3801+
value: {
3802+
companyCards: {
3803+
[bankName]: null,
3804+
},
3805+
companyCardNicknames: {
3806+
[bankName]: null,
3807+
},
3808+
},
3809+
},
3810+
],
3811+
};
3812+
3813+
const parameters = {
3814+
authToken,
3815+
policyID,
3816+
bankName,
3817+
};
3818+
3819+
API.write(WRITE_COMMANDS.DELETE_COMPANY_CARD_FEED, parameters, onyxData);
3820+
}
3821+
37433822
function clearAllPolicies() {
37443823
if (!allPolicies) {
37453824
return;
@@ -3831,6 +3910,9 @@ export {
38313910
setPolicyMaxExpenseAge,
38323911
setPolicyBillableMode,
38333912
setWorkspaceEReceiptsEnabled,
3913+
setWorkspaceCompanyCardFeedName,
3914+
deleteWorkspaceCompanyCardFeed,
3915+
setWorkspaceCompanyCardTransactionLiability,
38343916
};
38353917

38363918
export type {NewCustomUnit};

0 commit comments

Comments
 (0)