Skip to content

Commit 733010e

Browse files
authored
Merge pull request Expensify#62684 from allroundexperts/fix-50802
Attendees Tracking - Add toggle and the backend command for enabling attendee tracking
2 parents d6d25e6 + db473b9 commit 733010e

File tree

9 files changed

+88
-1
lines changed

9 files changed

+88
-1
lines changed

src/languages/en.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4971,6 +4971,8 @@ const translations = {
49714971
eReceipts: 'eReceipts',
49724972
eReceiptsHint: 'eReceipts are auto-created',
49734973
eReceiptsHintLink: 'for most USD credit transactions',
4974+
attendeeTracking: 'Attendee tracking',
4975+
attendeeTrackingHint: 'Track the per-person cost for every expense.',
49744976
prohibitedDefaultDescription:
49754977
'Flag any receipts where alcohol, gambling, or other restricted items appear. Expenses with receipts where these line items appear will require manual review.',
49764978
prohibitedExpenses: 'Prohibited expenses',

src/languages/es.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5041,6 +5041,8 @@ const translations = {
50415041
eReceipts: 'Recibos electrónicos',
50425042
eReceiptsHint: 'Los recibos electrónicos se crean automáticamente',
50435043
eReceiptsHintLink: 'para la mayoría de las transacciones en USD',
5044+
attendeeTracking: 'Seguimiento de asistentes',
5045+
attendeeTrackingHint: 'Haz un seguimiento del coste por persona para cada gasto.',
50445046
prohibitedDefaultDescription:
50455047
'Marque cualquier recibo donde aparezcan alcohol, apuestas u otros artículos restringidos. Los gastos con recibos que incluyan estos conceptos requerirán una revisión manual.',
50465048
prohibitedExpenses: 'Gastos prohibidos',
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
type SetPolicyAttendeeTrackingEnabledParams = {
2+
enabled: boolean;
3+
policyID: string;
4+
};
5+
6+
export default SetPolicyAttendeeTrackingEnabledParams;

src/libs/API/parameters/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,7 @@ export type {default as UpdateCustomRules} from './UpdateCustomRules';
308308
export type {default as SetPolicyBillableModeParams} from './SetPolicyBillableModeParams';
309309
export type {default as DisablePolicyBillableModeParams} from './DisablePolicyBillableModeParams';
310310
export type {default as SetWorkspaceEReceiptsEnabled} from './SetWorkspaceEReceiptsEnabled';
311+
export type {default as SetPolicyAttendeeTrackingEnabledParams} from './SetPolicyAttendeeTrackingEnabledParams';
311312
export type {default as ConfigureExpensifyCardsForPolicyParams} from './ConfigureExpensifyCardsForPolicyParams';
312313
export type {default as CreateExpensifyCardParams} from './CreateExpensifyCardParams';
313314
export type {default as UpdateExpensifyCardTitleParams} from './UpdateExpensifyCardTitleParams';

src/libs/API/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,7 @@ const WRITE_COMMANDS = {
242242
SET_POLICY_BILLABLE_MODE: ' SetPolicyBillableMode',
243243
DISABLE_POLICY_BILLABLE_MODE: 'DisablePolicyBillableExpenses',
244244
SET_WORKSPACE_ERECEIPTS_ENABLED: 'SetWorkspaceEReceiptsEnabled',
245+
SET_POLICY_ATTENDEE_TRACKING_ENABLED: 'SetPolicyAttendeeTrackingEnabled',
245246
SET_POLICY_CATEGORY_DESCRIPTION_REQUIRED: 'SetPolicyCategoryDescriptionRequired',
246247
SET_WORKSPACE_CATEGORY_DESCRIPTION_HINT: 'SetWorkspaceCategoryDescriptionHint',
247248
SET_POLICY_CATEGORY_RECEIPTS_REQUIRED: 'SetPolicyCategoryReceiptsRequired',
@@ -759,6 +760,7 @@ type WriteCommandParameters = {
759760
[WRITE_COMMANDS.SET_POLICY_BILLABLE_MODE]: Parameters.SetPolicyBillableModeParams;
760761
[WRITE_COMMANDS.DISABLE_POLICY_BILLABLE_MODE]: Parameters.DisablePolicyBillableModeParams;
761762
[WRITE_COMMANDS.SET_WORKSPACE_ERECEIPTS_ENABLED]: Parameters.SetWorkspaceEReceiptsEnabled;
763+
[WRITE_COMMANDS.SET_POLICY_ATTENDEE_TRACKING_ENABLED]: Parameters.SetPolicyAttendeeTrackingEnabledParams;
762764
[WRITE_COMMANDS.UPDATE_QUICKBOOKS_ONLINE_ENABLE_NEW_CATEGORIES]: Parameters.UpdateQuickbooksOnlineGenericTypeParams;
763765
[WRITE_COMMANDS.UPDATE_QUICKBOOKS_ONLINE_AUTO_CREATE_VENDOR]: Parameters.UpdateQuickbooksOnlineAutoCreateVendorParams;
764766
[WRITE_COMMANDS.UPDATE_QUICKBOOKS_ONLINE_SYNC_TAX]: Parameters.UpdateQuickbooksOnlineGenericTypeParams;

src/libs/TransactionUtils/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,10 @@ function isMerchantMissing(transaction: OnyxEntry<Transaction>) {
344344

345345
// eslint-disable-next-line @typescript-eslint/no-unused-vars
346346
function shouldShowAttendees(iouType: IOUType, policy: OnyxEntry<Policy>): boolean {
347+
if (!policy?.isAttendeeTrackingEnabled) {
348+
return false;
349+
}
350+
347351
return (
348352
(iouType === CONST.IOU.TYPE.SUBMIT || iouType === CONST.IOU.TYPE.CREATE) && !!policy?.id && (policy?.type === CONST.POLICY.TYPE.CORPORATE || policy?.type === CONST.POLICY.TYPE.TEAM)
349353
);

src/libs/actions/Policy/Policy.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4344,6 +4344,57 @@ function setWorkspaceEReceiptsEnabled(policyID: string, eReceipts: boolean) {
43444344
API.write(WRITE_COMMANDS.SET_WORKSPACE_ERECEIPTS_ENABLED, parameters, onyxData);
43454345
}
43464346

4347+
function setPolicyAttendeeTrackingEnabled(policyID: string, isAttendeeTrackingEnabled: boolean) {
4348+
const policy = getPolicy(policyID);
4349+
4350+
const originalIsAttendeeTrackingEnabled = !!policy?.isAttendeeTrackingEnabled;
4351+
4352+
const onyxData: OnyxData = {
4353+
optimisticData: [
4354+
{
4355+
onyxMethod: Onyx.METHOD.MERGE,
4356+
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
4357+
value: {
4358+
isAttendeeTrackingEnabled,
4359+
pendingFields: {
4360+
isAttendeeTrackingEnabled: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE,
4361+
},
4362+
},
4363+
},
4364+
],
4365+
successData: [
4366+
{
4367+
onyxMethod: Onyx.METHOD.MERGE,
4368+
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
4369+
value: {
4370+
pendingFields: {
4371+
isAttendeeTrackingEnabled: null,
4372+
},
4373+
errorFields: null,
4374+
},
4375+
},
4376+
],
4377+
failureData: [
4378+
{
4379+
onyxMethod: Onyx.METHOD.MERGE,
4380+
key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
4381+
value: {
4382+
isAttendeeTrackingEnabled: originalIsAttendeeTrackingEnabled,
4383+
pendingFields: {isAttendeeTrackingEnabled: null},
4384+
errorFields: {isAttendeeTrackingEnabled: ErrorUtils.getMicroSecondOnyxErrorWithTranslationKey('common.genericErrorMessage')},
4385+
},
4386+
},
4387+
],
4388+
};
4389+
4390+
const parameters = {
4391+
policyID,
4392+
enabled: isAttendeeTrackingEnabled,
4393+
};
4394+
4395+
API.write(WRITE_COMMANDS.SET_POLICY_ATTENDEE_TRACKING_ENABLED, parameters, onyxData);
4396+
}
4397+
43474398
function getAdminPolicies(): Policy[] {
43484399
return Object.values(allPolicies ?? {}).filter<Policy>((policy): policy is Policy => !!policy && policy.role === CONST.POLICY.ROLE.ADMIN && policy.type !== CONST.POLICY.TYPE.PERSONAL);
43494400
}
@@ -5295,4 +5346,5 @@ export {
52955346
clearQuickbooksOnlineAutoSyncErrorField,
52965347
setIsForcedToChangeCurrency,
52975348
setIsComingFromGlobalReimbursementsFlow,
5349+
setPolicyAttendeeTrackingEnabled,
52985350
};

src/pages/workspace/rules/IndividualExpenseRulesSection.tsx

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import useLocalize from '@hooks/useLocalize';
1111
import usePolicy from '@hooks/usePolicy';
1212
import useThemeStyles from '@hooks/useThemeStyles';
1313
import {openExternalLink} from '@libs/actions/Link';
14-
import {setWorkspaceEReceiptsEnabled} from '@libs/actions/Policy/Policy';
14+
import {setPolicyAttendeeTrackingEnabled, setWorkspaceEReceiptsEnabled} from '@libs/actions/Policy/Policy';
1515
import {convertToDisplayString} from '@libs/CurrencyUtils';
1616
import Navigation from '@libs/Navigation/Navigation';
1717
import type {ThemeStyles} from '@styles/index';
@@ -234,6 +234,21 @@ function IndividualExpenseRulesSection({policyID}: IndividualExpenseRulesSection
234234
.
235235
</Text>
236236
</View>
237+
<View style={[styles.mt3]}>
238+
<OfflineWithFeedback pendingAction={policy?.pendingFields?.isAttendeeTrackingEnabled}>
239+
<View style={[styles.flexRow, styles.mb1, styles.mr2, styles.alignItemsCenter, styles.justifyContentBetween]}>
240+
<Text style={[styles.flexShrink1, styles.mr2]}>{translate('workspace.rules.individualExpenseRules.attendeeTracking')}</Text>
241+
<Switch
242+
isOn={!!policy?.isAttendeeTrackingEnabled}
243+
accessibilityLabel={translate('workspace.rules.individualExpenseRules.attendeeTracking')}
244+
onToggle={() => setPolicyAttendeeTrackingEnabled(policyID, !policy?.isAttendeeTrackingEnabled)}
245+
/>
246+
</View>
247+
</OfflineWithFeedback>
248+
<Text style={[styles.flexRow, styles.alignItemsCenter, styles.w100]}>
249+
<Text style={[styles.textLabel, styles.colorMuted]}>{translate('workspace.rules.individualExpenseRules.attendeeTrackingHint')}</Text>
250+
</Text>
251+
</View>
237252
</View>
238253
</Section>
239254
);

src/types/onyx/Policy.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1893,6 +1893,9 @@ type Policy = OnyxCommon.OnyxValueWithOfflineFeedback<
18931893

18941894
/** Indicate whether the Workspace plan can be downgraded */
18951895
canDowngrade?: boolean;
1896+
1897+
/** Whether Attendee Tracking is enabled */
1898+
isAttendeeTrackingEnabled?: boolean;
18961899
} & Partial<PendingJoinRequestPolicy>,
18971900
'addWorkspaceRoom' | keyof ACHAccount | keyof Attributes
18981901
>;

0 commit comments

Comments
 (0)