Skip to content

[HOLD for payment 2024-07-10] [#Wave-Control: Add NetSuite] Settings Configuration in NewDot: Top-Level Subsidiary Selector #43435

@yuwenmemon

Description

@yuwenmemon

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

AD_4nXcY-wNB2ht40Cb61Cn42fRiPYRnM-dx6O8_P5Qvr00KKpFEnPQ2My0nMzymympXv3tKR1IXeS0G8H6X9hhW1pIR6KNWXBvtpe75f-DI_gg2aSVlYy-58GY2

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 OwnerCurrent Issue Owner: @
Issue OwnerCurrent Issue Owner: @JmillsExpensify

Metadata

Metadata

Labels

Awaiting PaymentAuto-added when associated PR is deployed to productionExternalAdded to denote the issue can be worked on by a contributorNewFeatureSomething to build that is a new item.WeeklyKSv2

Type

No type

Projects

Status

Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions