Tracking Issue: https://github.com/Expensify/Expensify/issues/377671
Design Doc Section: https://docs.google.com/document/d/1WubNv_VAv78IxG4FKsi9aS0pWESfWvUYbqBAAy5b4bc/edit#heading=h.ursdzd4yhqi0
(High-Level Section)
Route
- Route:
/settings/workspaces/{policyID}/accounting/netsuite/subsidiary
- PageComponent:
NetSuiteSubsidiarySelector
- Calls
UpdateNetSuiteSubsidiary
subsidiaryName: name of the selected subsidiary from options.data.subsidiaryList array.
- The pendingAction for the OfflineWithFeedback component will be
policy.pendingFields.subsidiary

We’ll have a NetSuiteSubsidiarySelectorPage, which will populate the list of subsidiaries from the data.subsidiaryList. The sample data shows the list of subsidiaries here.
The basic code for the page will look as follows:
function NetSuiteNetSuiteSubsidiarySelectorPage({policy}: WithPolicyConnectionsProps) {
const policyID = policy?.id ?? '';
const { subsidiary } = policy?.connections?.netsuite?.config ?? {};
const subsidiaryOptions = useMemo<SelectorType[]>(() => {
const subsidiaryList = policy?.connections?.netsuite?.options?.data.subsidiaryList ?? {} ?? [];
const isMatchFound = subsidiaryList?.some(({subsidiaryObj}) => subsidiaryObj === subsidiary); // toLowerCase() ?
return (subsidiaryList ?? []).map(({id, name}, index) => ({
value: name,
text: name,
keyForList: id,
isSelected: isMatchFound ? subsidiary === id : index === 0,
}));
});
const listHeaderComponent = useMemo( // Move this to another file as a standalone component.
() => (
<View style={[styles.pb2, styles.ph5]}>
<Text style={[styles.pb5, styles.textNormal]}>{translate('workspace.netsuite.subsidiary.description')}</Text>
</View>
),
[translate, styles.pb2, styles.ph5, styles.pb5, styles.textNormal],
);
const initiallyFocusedOptionKey = useMemo(() => subsidiaryList?.find((subsidiary) => subsidiary.isSelected)?.keyForList, [subsidiaryOptions]);
const updateSubsidiary = useCallback(
({value}: SelectorType) => {
Connections.updateNetSuiteSubsidiary(policyID, CONST.POLICY.CONNECTIONS.NAME.NET_SUITE, CONST.NET_SUITE_CONFIG, {
subsidiary: value,
subsidiaryID: //
});
Navigation.goBack(ROUTES.POLICY_ACCOUNTING.getRoute(policyID));
},
[policyID],
);
return (
<SelectionScreen
policyID={policyID}
accessVariants={[CONST.POLICY.ACCESS_VARIANTS.ADMIN, CONST.POLICY.ACCESS_VARIANTS.PAID]}
featureName={CONST.POLICY.MORE_FEATURES.ARE_CONNECTIONS_ENABLED}
displayName={NetSuiteNetSuiteSubsidiarySelectorPage.displayName}
sections={[{data: subsidiaryOptions}]}
listItem={RadioListItem}
onSelectRow={updateSubsidiary}
initiallyFocusedOptionKey={initiallyFocusedOptionKey}
headerContent={listHeaderComponent}
onBackButtonPress={() => Navigation.goBack(ROUTES.POLICY_ACCOUNTING.getRoute(policyID))}
title="workspace.netsuite.subsidiary.title"
/>
);
}
NetSuiteNetSuiteSubsidiarySelectorPage.displayName = 'NetSuiteNetSuiteSubsidiarySelectorPage';
export default withPolicyConnections(NetSuiteNetSuiteSubsidiarySelectorPage);
Upwork Automation - Do Not Edit
- Upwork Job URL: https://www.upwork.com/jobs/~01d62f33ad0e1e9fe6
- Upwork Job ID: 1800281430610989476
- Last Price Increase: 2024-06-10
Issue Owner
Current Issue Owner: @
Issue Owner
Current Issue Owner: @JmillsExpensify
Tracking Issue: https://github.com/Expensify/Expensify/issues/377671
Design Doc Section: https://docs.google.com/document/d/1WubNv_VAv78IxG4FKsi9aS0pWESfWvUYbqBAAy5b4bc/edit#heading=h.ursdzd4yhqi0
(High-Level Section)
Route
/settings/workspaces/{policyID}/accounting/netsuite/subsidiaryNetSuiteSubsidiarySelectorUpdateNetSuiteSubsidiarysubsidiaryName: name of the selected subsidiary fromoptions.data.subsidiaryListarray.policy.pendingFields.subsidiaryWe’ll have a NetSuiteSubsidiarySelectorPage, which will populate the list of subsidiaries from the
data.subsidiaryList. The sample data shows the list of subsidiaries here.The basic code for the page will look as follows:
Upwork Automation - Do Not Edit
Issue Owner
Current Issue Owner: @Issue Owner
Current Issue Owner: @JmillsExpensify