Merged in feature/IO-3285-Shop-Config-Lite-Basic (pull request #2456)

IO-3285 Shop Config Lite-Basic

Approved-by: Dave Richer
This commit is contained in:
Allan Carr
2025-08-11 17:50:02 +00:00
committed by Dave Richer

View File

@@ -145,14 +145,20 @@ export function ShopInfoGeneral({ form, bodyshop }) {
</Form.Item> </Form.Item>
</LayoutFormRow> </LayoutFormRow>
<LayoutFormRow header={t("bodyshop.labels.accountingsetup")} id="accountingsetup"> <LayoutFormRow header={t("bodyshop.labels.accountingsetup")} id="accountingsetup">
{HasFeatureAccess({ featureName: "export", bodyshop }) && ( {[
<> ...(HasFeatureAccess({ featureName: "export", bodyshop })
<Form.Item label={t("bodyshop.labels.qbo")} valuePropName="checked" name={["accountingconfig", "qbo"]}> ? [
<Form.Item
key="qbo"
label={t("bodyshop.labels.qbo")}
valuePropName="checked"
name={["accountingconfig", "qbo"]}
>
<Switch /> <Switch />
</Form.Item> </Form.Item>,
{InstanceRenderManager({ InstanceRenderManager({
imex: ( imex: (
<Form.Item shouldUpdate noStyle> <Form.Item key="qbo_usa_wrapper" shouldUpdate noStyle>
{() => ( {() => (
<Form.Item <Form.Item
label={t("bodyshop.labels.qbo_usa")} label={t("bodyshop.labels.qbo_usa")}
@@ -165,11 +171,16 @@ export function ShopInfoGeneral({ form, bodyshop }) {
)} )}
</Form.Item> </Form.Item>
) )
})} }),
<Form.Item label={t("bodyshop.labels.qbo_departmentid")} name={["accountingconfig", "qbo_departmentid"]}>
<Input />
</Form.Item>
<Form.Item <Form.Item
key="qbo_departmentid"
label={t("bodyshop.labels.qbo_departmentid")}
name={["accountingconfig", "qbo_departmentid"]}
>
<Input />
</Form.Item>,
<Form.Item
key="accountingtiers"
label={t("bodyshop.labels.accountingtiers")} label={t("bodyshop.labels.accountingtiers")}
rules={[ rules={[
{ {
@@ -183,8 +194,8 @@ export function ShopInfoGeneral({ form, bodyshop }) {
<Radio value={2}>2</Radio> <Radio value={2}>2</Radio>
<Radio value={3}>3</Radio> <Radio value={3}>3</Radio>
</Radio.Group> </Radio.Group>
</Form.Item> </Form.Item>,
<Form.Item shouldUpdate> <Form.Item key="twotierpref_wrapper" shouldUpdate>
{() => { {() => {
return ( return (
<Form.Item <Form.Item
@@ -205,24 +216,27 @@ export function ShopInfoGeneral({ form, bodyshop }) {
</Form.Item> </Form.Item>
); );
}} }}
</Form.Item> </Form.Item>,
<Form.Item <Form.Item
key="printlater"
label={t("bodyshop.labels.printlater")} label={t("bodyshop.labels.printlater")}
valuePropName="checked" valuePropName="checked"
name={["accountingconfig", "printlater"]} name={["accountingconfig", "printlater"]}
> >
<Switch /> <Switch />
</Form.Item> </Form.Item>,
<Form.Item <Form.Item
key="emaillater"
label={t("bodyshop.labels.emaillater")} label={t("bodyshop.labels.emaillater")}
valuePropName="checked" valuePropName="checked"
name={["accountingconfig", "emaillater"]} name={["accountingconfig", "emaillater"]}
> >
<Switch /> <Switch />
</Form.Item> </Form.Item>
</> ]
)} : []),
<Form.Item <Form.Item
key="inhousevendorid"
label={t("bodyshop.fields.inhousevendorid")} label={t("bodyshop.fields.inhousevendorid")}
name={"inhousevendorid"} name={"inhousevendorid"}
rules={[ rules={[
@@ -233,8 +247,9 @@ export function ShopInfoGeneral({ form, bodyshop }) {
]} ]}
> >
<Input /> <Input />
</Form.Item> </Form.Item>,
<Form.Item <Form.Item
key="default_adjustment_rate"
label={t("bodyshop.fields.default_adjustment_rate")} label={t("bodyshop.fields.default_adjustment_rate")}
name={"default_adjustment_rate"} name={"default_adjustment_rate"}
rules={[ rules={[
@@ -245,22 +260,23 @@ export function ShopInfoGeneral({ form, bodyshop }) {
]} ]}
> >
<InputNumber min={0} precision={2} /> <InputNumber min={0} precision={2} />
</Form.Item> </Form.Item>,
{InstanceRenderManager({ InstanceRenderManager({
imex: ( imex: (
<Form.Item label={t("bodyshop.fields.federal_tax_id")} name="federal_tax_id"> <Form.Item key="federal_tax_id" label={t("bodyshop.fields.federal_tax_id")} name="federal_tax_id">
<Input /> <Input />
</Form.Item> </Form.Item>
) )
})} }),
<Form.Item label={t("bodyshop.fields.state_tax_id")} name="state_tax_id"> <Form.Item key="state_tax_id" label={t("bodyshop.fields.state_tax_id")} name="state_tax_id">
<Input /> <Input />
</Form.Item> </Form.Item>,
{HasFeatureAccess({ featureName: "bills", bodyshop }) && ( ...(HasFeatureAccess({ featureName: "bills", bodyshop })
<> ? [
{InstanceRenderManager({ InstanceRenderManager({
imex: ( imex: (
<Form.Item <Form.Item
key="invoice_federal_tax_rate"
label={t("bodyshop.fields.invoice_federal_tax_rate")} label={t("bodyshop.fields.invoice_federal_tax_rate")}
name={["bill_tax_rates", "federal_tax_rate"]} name={["bill_tax_rates", "federal_tax_rate"]}
rules={[ rules={[
@@ -273,8 +289,9 @@ export function ShopInfoGeneral({ form, bodyshop }) {
<InputNumber /> <InputNumber />
</Form.Item> </Form.Item>
) )
})} }),
<Form.Item <Form.Item
key="invoice_state_tax_rate"
label={t("bodyshop.fields.invoice_state_tax_rate")} label={t("bodyshop.fields.invoice_state_tax_rate")}
name={["bill_tax_rates", "state_tax_rate"]} name={["bill_tax_rates", "state_tax_rate"]}
rules={[ rules={[
@@ -285,8 +302,9 @@ export function ShopInfoGeneral({ form, bodyshop }) {
]} ]}
> >
<InputNumber /> <InputNumber />
</Form.Item> </Form.Item>,
<Form.Item <Form.Item
key="invoice_local_tax_rate"
label={t("bodyshop.fields.invoice_local_tax_rate")} label={t("bodyshop.fields.invoice_local_tax_rate")}
name={["bill_tax_rates", "local_tax_rate"]} name={["bill_tax_rates", "local_tax_rate"]}
rules={[ rules={[
@@ -298,9 +316,10 @@ export function ShopInfoGeneral({ form, bodyshop }) {
> >
<InputNumber /> <InputNumber />
</Form.Item> </Form.Item>
</> ]
)} : []),
<Form.Item <Form.Item
key="md_payment_types"
name={["md_payment_types"]} name={["md_payment_types"]}
label={t("bodyshop.fields.md_payment_types")} label={t("bodyshop.fields.md_payment_types")}
rules={[ rules={[
@@ -312,8 +331,9 @@ export function ShopInfoGeneral({ form, bodyshop }) {
]} ]}
> >
<Select mode="tags" /> <Select mode="tags" />
</Form.Item> </Form.Item>,
<Form.Item <Form.Item
key="md_categories"
name={["md_categories"]} name={["md_categories"]}
label={t("bodyshop.fields.md_categories")} label={t("bodyshop.fields.md_categories")}
rules={[ rules={[
@@ -324,28 +344,32 @@ export function ShopInfoGeneral({ form, bodyshop }) {
]} ]}
> >
<Select mode="tags" /> <Select mode="tags" />
</Form.Item> </Form.Item>,
{HasFeatureAccess({ featureName: "export", bodyshop }) && ( ...(HasFeatureAccess({ featureName: "export", bodyshop })
<> ? [
<Form.Item <Form.Item
key="ReceivableCustomField1"
name={["accountingconfig", "ReceivableCustomField1"]} name={["accountingconfig", "ReceivableCustomField1"]}
label={t("bodyshop.fields.ReceivableCustomField", { number: 1 })} label={t("bodyshop.fields.ReceivableCustomField", { number: 1 })}
> >
{ReceivableCustomFieldSelect} {ReceivableCustomFieldSelect}
</Form.Item> </Form.Item>,
<Form.Item <Form.Item
key="ReceivableCustomField2"
name={["accountingconfig", "ReceivableCustomField2"]} name={["accountingconfig", "ReceivableCustomField2"]}
label={t("bodyshop.fields.ReceivableCustomField", { number: 2 })} label={t("bodyshop.fields.ReceivableCustomField", { number: 2 })}
> >
{ReceivableCustomFieldSelect} {ReceivableCustomFieldSelect}
</Form.Item> </Form.Item>,
<Form.Item <Form.Item
key="ReceivableCustomField3"
name={["accountingconfig", "ReceivableCustomField3"]} name={["accountingconfig", "ReceivableCustomField3"]}
label={t("bodyshop.fields.ReceivableCustomField", { number: 3 })} label={t("bodyshop.fields.ReceivableCustomField", { number: 3 })}
> >
{ReceivableCustomFieldSelect} {ReceivableCustomFieldSelect}
</Form.Item> </Form.Item>,
<Form.Item <Form.Item
key="md_classes"
name={["md_classes"]} name={["md_classes"]}
label={t("bodyshop.fields.md_classes")} label={t("bodyshop.fields.md_classes")}
rules={[ rules={[
@@ -359,30 +383,51 @@ export function ShopInfoGeneral({ form, bodyshop }) {
]} ]}
> >
<Select mode="tags" /> <Select mode="tags" />
</Form.Item> </Form.Item>,
<Form.Item name={["enforce_class"]} label={t("bodyshop.fields.enforce_class")} valuePropName="checked">
<Switch />
</Form.Item>
{ClosingPeriod.treatment === "on" && (
<Form.Item <Form.Item
key="enforce_class"
name={["enforce_class"]}
label={t("bodyshop.fields.enforce_class")}
valuePropName="checked"
>
<Switch />
</Form.Item>,
...(ClosingPeriod.treatment === "on"
? [
<Form.Item
key="ClosingPeriod"
name={["accountingconfig", "ClosingPeriod"]} name={["accountingconfig", "ClosingPeriod"]}
label={t("bodyshop.fields.closingperiod")} //{t("reportcenter.labels.dates")} label={t("bodyshop.fields.closingperiod")} //{t("reportcenter.labels.dates")}
> >
<DatePicker.RangePicker format="MM/DD/YYYY" presets={DatePickerRanges} /> <DatePicker.RangePicker format="MM/DD/YYYY" presets={DatePickerRanges} />
</Form.Item> </Form.Item>
)} ]
{ADPPayroll.treatment === "on" && ( : []),
<Form.Item name={["accountingconfig", "companyCode"]} label={t("bodyshop.fields.companycode")}> ...(ADPPayroll.treatment === "on"
? [
<Form.Item
key="companyCode"
name={["accountingconfig", "companyCode"]}
label={t("bodyshop.fields.companycode")}
>
<Input /> <Input />
</Form.Item> </Form.Item>
)} ]
{ADPPayroll.treatment === "on" && ( : []),
<Form.Item name={["accountingconfig", "batchID"]} label={t("bodyshop.fields.batchid")}> ...(ADPPayroll.treatment === "on"
? [
<Form.Item
key="batchID"
name={["accountingconfig", "batchID"]}
label={t("bodyshop.fields.batchid")}
>
<Input /> <Input />
</Form.Item> </Form.Item>
)} ]
</> : [])
)} ]
: [])
]}
</LayoutFormRow> </LayoutFormRow>
<FeatureWrapper featureName="scoreboard" noauth={() => null}> <FeatureWrapper featureName="scoreboard" noauth={() => null}>
<LayoutFormRow header={t("bodyshop.labels.scoreboardsetup")} id="scoreboardsetup"> <LayoutFormRow header={t("bodyshop.labels.scoreboardsetup")} id="scoreboardsetup">
@@ -446,7 +491,9 @@ export function ShopInfoGeneral({ form, bodyshop }) {
</LayoutFormRow> </LayoutFormRow>
</FeatureWrapper> </FeatureWrapper>
<LayoutFormRow header={t("bodyshop.labels.systemsettings")} id="systemsettings"> <LayoutFormRow header={t("bodyshop.labels.systemsettings")} id="systemsettings">
{[
<Form.Item <Form.Item
key="md_referral_sources"
name={["md_referral_sources"]} name={["md_referral_sources"]}
label={t("bodyshop.fields.md_referral_sources")} label={t("bodyshop.fields.md_referral_sources")}
rules={[ rules={[
@@ -458,25 +505,33 @@ export function ShopInfoGeneral({ form, bodyshop }) {
]} ]}
> >
<Select mode="tags" /> <Select mode="tags" />
</Form.Item> </Form.Item>,
<Form.Item name={["enforce_referral"]} label={t("bodyshop.fields.enforce_referral")} valuePropName="checked">
<Switch />
</Form.Item>
<Form.Item <Form.Item
key="enforce_referral"
name={["enforce_referral"]}
label={t("bodyshop.fields.enforce_referral")}
valuePropName="checked"
>
<Switch />
</Form.Item>,
<Form.Item
key="enforce_conversion_csr"
name={["enforce_conversion_csr"]} name={["enforce_conversion_csr"]}
label={t("bodyshop.fields.enforce_conversion_csr")} label={t("bodyshop.fields.enforce_conversion_csr")}
valuePropName="checked" valuePropName="checked"
> >
<Switch /> <Switch />
</Form.Item> </Form.Item>,
<Form.Item <Form.Item
key="enforce_conversion_category"
name={["enforce_conversion_category"]} name={["enforce_conversion_category"]}
label={t("bodyshop.fields.enforce_conversion_category")} label={t("bodyshop.fields.enforce_conversion_category")}
valuePropName="checked" valuePropName="checked"
> >
<Switch /> <Switch />
</Form.Item> </Form.Item>,
<Form.Item <Form.Item
key="target_touchtime"
name={["target_touchtime"]} name={["target_touchtime"]}
label={t("bodyshop.fields.target_touchtime")} label={t("bodyshop.fields.target_touchtime")}
rules={[ rules={[
@@ -487,11 +542,12 @@ export function ShopInfoGeneral({ form, bodyshop }) {
]} ]}
> >
<InputNumber min={0.1} precision={1} /> <InputNumber min={0.1} precision={1} />
</Form.Item> </Form.Item>,
<Form.Item label={t("bodyshop.fields.use_fippa")} name={["use_fippa"]} valuePropName="checked"> <Form.Item key="use_fippa" label={t("bodyshop.fields.use_fippa")} name={["use_fippa"]} valuePropName="checked">
<Switch /> <Switch />
</Form.Item> </Form.Item>,
<Form.Item <Form.Item
key="md_hour_split_prep"
label={t("bodyshop.fields.md_hour_split.prep")} label={t("bodyshop.fields.md_hour_split.prep")}
name={["md_hour_split", "prep"]} name={["md_hour_split", "prep"]}
dependencies={[["md_hour_split", "paint"]]} dependencies={[["md_hour_split", "paint"]]}
@@ -510,8 +566,9 @@ export function ShopInfoGeneral({ form, bodyshop }) {
]} ]}
> >
<InputNumber min={0} max={1} precision={2} /> <InputNumber min={0} max={1} precision={2} />
</Form.Item> </Form.Item>,
<Form.Item <Form.Item
key="md_hour_split_paint"
label={t("bodyshop.fields.md_hour_split.paint")} label={t("bodyshop.fields.md_hour_split.paint")}
name={["md_hour_split", "paint"]} name={["md_hour_split", "paint"]}
dependencies={[["md_hour_split", "prep"]]} dependencies={[["md_hour_split", "prep"]]}
@@ -530,28 +587,39 @@ export function ShopInfoGeneral({ form, bodyshop }) {
]} ]}
> >
<InputNumber min={0} max={1} precision={2} /> <InputNumber min={0} max={1} precision={2} />
</Form.Item> </Form.Item>,
<Form.Item label={t("bodyshop.fields.jc_hourly_rates.mapa")} name={["jc_hourly_rates", "mapa"]}>
<CurrencyInput />
</Form.Item>
<Form.Item label={t("bodyshop.fields.jc_hourly_rates.mash")} name={["jc_hourly_rates", "mash"]}>
<CurrencyInput />
</Form.Item>
<Form.Item <Form.Item
key="jc_hourly_rates_mapa"
label={t("bodyshop.fields.jc_hourly_rates.mapa")}
name={["jc_hourly_rates", "mapa"]}
>
<CurrencyInput />
</Form.Item>,
<Form.Item
key="jc_hourly_rates_mash"
label={t("bodyshop.fields.jc_hourly_rates.mash")}
name={["jc_hourly_rates", "mash"]}
>
<CurrencyInput />
</Form.Item>,
<Form.Item
key="use_paint_scale_data"
name={["use_paint_scale_data"]} name={["use_paint_scale_data"]}
label={t("bodyshop.fields.use_paint_scale_data")} label={t("bodyshop.fields.use_paint_scale_data")}
valuePropName="checked" valuePropName="checked"
> >
<Switch /> <Switch />
</Form.Item> </Form.Item>,
<Form.Item <Form.Item
key="attach_pdf_to_email"
name={["attach_pdf_to_email"]} name={["attach_pdf_to_email"]}
label={t("bodyshop.fields.attach_pdf_to_email")} label={t("bodyshop.fields.attach_pdf_to_email")}
valuePropName="checked" valuePropName="checked"
> >
<Switch /> <Switch />
</Form.Item> </Form.Item>,
<Form.Item <Form.Item
key="md_from_emails"
name={["md_from_emails"]} name={["md_from_emails"]}
label={t("bodyshop.fields.md_from_emails")} label={t("bodyshop.fields.md_from_emails")}
// rules={[ // rules={[
@@ -562,8 +630,9 @@ export function ShopInfoGeneral({ form, bodyshop }) {
// ]} // ]}
> >
<Select mode="tags" /> <Select mode="tags" />
</Form.Item> </Form.Item>,
<Form.Item <Form.Item
key="md_email_cc_parts_order"
name={["md_email_cc", "parts_order"]} name={["md_email_cc", "parts_order"]}
label={t("bodyshop.fields.md_email_cc", { template: "parts_orders" })} label={t("bodyshop.fields.md_email_cc", { template: "parts_orders" })}
rules={[ rules={[
@@ -574,8 +643,9 @@ export function ShopInfoGeneral({ form, bodyshop }) {
]} ]}
> >
<Select mode="tags" /> <Select mode="tags" />
</Form.Item> </Form.Item>,
<Form.Item <Form.Item
key="md_email_cc_parts_return_slip"
name={["md_email_cc", "parts_return_slip"]} name={["md_email_cc", "parts_return_slip"]}
label={t("bodyshop.fields.md_email_cc", { template: "parts_returns" })} label={t("bodyshop.fields.md_email_cc", { template: "parts_returns" })}
rules={[ rules={[
@@ -586,34 +656,37 @@ export function ShopInfoGeneral({ form, bodyshop }) {
]} ]}
> >
<Select mode="tags" /> <Select mode="tags" />
</Form.Item> </Form.Item>,
...(HasFeatureAccess({ featureName: "timetickets", bodyshop })
{HasFeatureAccess({ featureName: "timetickets", bodyshop }) && ( ? [
<>
<Form.Item <Form.Item
key="tt_allow_post_to_invoiced"
name={["tt_allow_post_to_invoiced"]} name={["tt_allow_post_to_invoiced"]}
label={t("bodyshop.fields.tt_allow_post_to_invoiced")} label={t("bodyshop.fields.tt_allow_post_to_invoiced")}
valuePropName="checked" valuePropName="checked"
> >
<Switch /> <Switch />
</Form.Item> </Form.Item>,
<Form.Item <Form.Item
key="tt_enforce_hours_for_tech_console"
name={["tt_enforce_hours_for_tech_console"]} name={["tt_enforce_hours_for_tech_console"]}
label={t("bodyshop.fields.tt_enforce_hours_for_tech_console")} label={t("bodyshop.fields.tt_enforce_hours_for_tech_console")}
valuePropName="checked" valuePropName="checked"
> >
<Switch /> <Switch />
</Form.Item> </Form.Item>,
<Form.Item <Form.Item
key="bill_allow_post_to_closed"
name={["bill_allow_post_to_closed"]} name={["bill_allow_post_to_closed"]}
label={t("bodyshop.fields.bill_allow_post_to_closed")} label={t("bodyshop.fields.bill_allow_post_to_closed")}
valuePropName="checked" valuePropName="checked"
> >
<Switch /> <Switch />
</Form.Item> </Form.Item>
</> ]
)} : []),
<Form.Item <Form.Item
key="md_ded_notes"
name={["md_ded_notes"]} name={["md_ded_notes"]}
label={t("bodyshop.fields.md_ded_notes")} label={t("bodyshop.fields.md_ded_notes")}
rules={[ rules={[
@@ -624,33 +697,49 @@ export function ShopInfoGeneral({ form, bodyshop }) {
]} ]}
> >
<Select mode="tags" /> <Select mode="tags" />
</Form.Item> </Form.Item>,
<Form.Item <Form.Item
key="parts_queue_toggle"
label={t("bodyshop.fields.md_functionality_toggles.parts_queue_toggle")} label={t("bodyshop.fields.md_functionality_toggles.parts_queue_toggle")}
name={["md_functionality_toggles", "parts_queue_toggle"]} name={["md_functionality_toggles", "parts_queue_toggle"]}
valuePropName="checked" valuePropName="checked"
> >
<Switch /> <Switch />
</Form.Item> </Form.Item>,
<Form.Item name={["last_name_first"]} label={t("bodyshop.fields.last_name_first")} valuePropName="checked">
<Switch />
</Form.Item>
<Form.Item <Form.Item
key="last_name_first"
name={["last_name_first"]}
label={t("bodyshop.fields.last_name_first")}
valuePropName="checked"
>
<Switch />
</Form.Item>,
<Form.Item
key="uselocalmediaserver"
name={["uselocalmediaserver"]} name={["uselocalmediaserver"]}
label={t("bodyshop.fields.uselocalmediaserver")} label={t("bodyshop.fields.uselocalmediaserver")}
valuePropName="checked" valuePropName="checked"
> >
<Switch /> <Switch />
</Form.Item> </Form.Item>,
<Form.Item name={["localmediaserverhttp"]} label={t("bodyshop.fields.localmediaserverhttp")}> <Form.Item
<Input /> key="localmediaserverhttp"
</Form.Item> name={["localmediaserverhttp"]}
<Form.Item name={["localmediaservernetwork"]} label={t("bodyshop.fields.localmediaservernetwork")}> label={t("bodyshop.fields.localmediaserverhttp")}
<Input /> >
</Form.Item> <Input />
<Form.Item name={["localmediatoken"]} label={t("bodyshop.fields.localmediatoken")}> </Form.Item>,
<Form.Item
key="localmediaservernetwork"
name={["localmediaservernetwork"]}
label={t("bodyshop.fields.localmediaservernetwork")}
>
<Input />
</Form.Item>,
<Form.Item key="localmediatoken" name={["localmediatoken"]} label={t("bodyshop.fields.localmediatoken")}>
<Input /> <Input />
</Form.Item> </Form.Item>
]}
</LayoutFormRow> </LayoutFormRow>
<LayoutFormRow header={t("bodyshop.labels.shop_enabled_features")} id="sharing"> <LayoutFormRow header={t("bodyshop.labels.shop_enabled_features")} id="sharing">
<Form.Item <Form.Item