RO into IO merge as of 02/05/2024.

This commit is contained in:
Patrick Fic
2024-02-12 12:22:05 -08:00
211 changed files with 31134 additions and 25729 deletions

View File

@@ -16,6 +16,7 @@ import ShopInfoROStatusComponent from "./shop-info.rostatus.component";
import ShopInfoSchedulingComponent from "./shop-info.scheduling.component";
import ShopInfoSpeedPrint from "./shop-info.speedprint.component";
import {useLocation, useNavigate} from "react-router-dom";
import ShopInfoTaskPresets from "./shop-info.task-presets.component";
import queryString from "query-string";
const mapStateToProps = createStructuredSelector({
@@ -28,7 +29,7 @@ export default connect(mapStateToProps, mapDispatchToProps)(ShopInfoComponent);
export function ShopInfoComponent({bodyshop, form, saveLoading}) {
const {treatments: {CriticalPartsScanning}} = useSplitTreatments({
const {treatments: {CriticalPartsScanning, EnhancedPayroll}} = useSplitTreatments({
attributes: {},
names: ["CriticalPartsScanning"],
splitKey: bodyshop.imexshopid,
@@ -94,6 +95,12 @@ export function ShopInfoComponent({bodyshop, form, saveLoading}) {
},
]
: []),
...EnhancedPayroll.treatment === "on" ? [
{
key: 'task-presets',
label: t("bodyshop.labels.task-presets"),
children: <ShopInfoTaskPresets form={form}/>
}]: []
];
return (

View File

@@ -12,6 +12,7 @@ import FormItemEmail from "../form-items-formatted/email-form-item.component";
import PhoneFormItem, {PhoneItemFormatterValidation,} from "../form-items-formatted/phone-form-item.component";
import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component";
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
import InstanceRenderManager from '../../utils/instanceRenderMgr'
// TODO: Client Update, this might break
const timeZonesList = Intl.supportedValuesOf('timeZone');
const mapStateToProps = createStructuredSelector({
@@ -177,9 +178,10 @@ export function ShopInfoGeneral({form, bodyshop}) {
>
<Switch/>
</Form.Item>
<Form.Item shouldUpdate noStyle>
{() => (
{
InstanceRenderManager({imex:
<Form.Item shouldUpdate noStyle>
{() => (
<Form.Item
label={t("bodyshop.labels.qbo_usa")}
shouldUpdate
@@ -187,11 +189,13 @@ export function ShopInfoGeneral({form, bodyshop}) {
name={["accountingconfig", "qbo_usa"]}
>
<Switch
disabled={!form.getFieldValue(["accountingconfig", "qbo"])}
disabled={!form.getFieldValue(["accountingconfig", "qbo"])}
/>
</Form.Item>
)}
</Form.Item>
)}
</Form.Item>
})
}
<Form.Item
label={t("bodyshop.labels.qbo_departmentid")}
name={["accountingconfig", "qbo_departmentid"]}
@@ -280,36 +284,37 @@ export function ShopInfoGeneral({form, bodyshop}) {
>
<InputNumber min={0} precision={2}/>
</Form.Item>
<Form.Item
label={t("bodyshop.fields.federal_tax_id")}
name="federal_tax_id"
rules={[
{
required: true,
//message: t("general.validation.required"),
},
]}
>
<Input/>
</Form.Item>
{
InstanceRenderManager({imex:
<Form.Item
label={t("bodyshop.fields.federal_tax_id")}
name="federal_tax_id"
>
<Input />
</Form.Item> })
}
<Form.Item
label={t("bodyshop.fields.state_tax_id")}
name="state_tax_id"
>
<Input/>
</Form.Item>
<Form.Item
label={t("bodyshop.fields.invoice_federal_tax_rate")}
name={["bill_tax_rates", "federal_tax_rate"]}
rules={[
{
{
InstanceRenderManager({imex:
<Form.Item
label={t("bodyshop.fields.invoice_federal_tax_rate")}
name={["bill_tax_rates", "federal_tax_rate"]}
rules={[
{
required: true,
//message: t("general.validation.required"),
},
]}
>
<InputNumber/>
</Form.Item>
},
]}
>
<InputNumber />
</Form.Item>
})
}
<Form.Item
label={t("bodyshop.fields.invoice_state_tax_rate")}
name={["bill_tax_rates", "state_tax_rate"]}

View File

@@ -26,7 +26,7 @@ export function ShopInfoRbacComponent({form, bodyshop}) {
names: ["Simple_Inventory"],
splitKey: bodyshop && bodyshop.imexshopid,
});
//TODO:AIO Ensure that there are no duplicates here, it seems like there may be.
return (
<RbacWrapper action="shop:rbac">
<LayoutFormRow>
@@ -403,29 +403,66 @@ export function ShopInfoRbacComponent({form, bodyshop}) {
<InputNumber/>
</Form.Item>
<Form.Item
label={t("bodyshop.fields.rbac.owners.detail")}
label={t("bodyshop.fields.rbac.owners.detail")}
rules={[
{
required: true,
//message: t("general.validation.required"),
},
]}
name={["md_rbac", "owners:detail"]}
>
<InputNumber/>
</Form.Item>
<Form.Item
label={t("bodyshop.fields.rbac.owners.list")}
rules={[
{
required: true,
//message: t("general.validation.required"),
},
]}
name={["md_rbac", "owners:list"]}
>
<InputNumber/>
</Form.Item>
<Form.Item
label={t("bodyshop.fields.rbac.bills.list")}
rules={[
{
required: true,
//message: t("general.validation.required"),
},
]}
name={["md_rbac", "owners:detail"]}
name={["md_rbac", "bills:list"]}
>
<InputNumber/>
</Form.Item>
<Form.Item
label={t("bodyshop.fields.rbac.owners.list")}
label={t("bodyshop.fields.rbac.employees.page")}
rules={[
{
required: true,
//message: t("general.validation.required"),
},
]}
name={["md_rbac", "owners:list"]}
name={["md_rbac", "employees:page"]}
>
<InputNumber/>
</Form.Item>
<Form.Item
label={t("bodyshop.fields.rbac.employee_teams.page")}
rules={[
{
required: true,
//message: t("general.validation.required"),
},
]}
name={["md_rbac", "employee_teams:page"]}
>
<InputNumber/>
</Form.Item>
<Form.Item
label={t("bodyshop.fields.rbac.payments.enter")}
rules={[
@@ -535,14 +572,86 @@ export function ShopInfoRbacComponent({form, bodyshop}) {
<InputNumber/>
</Form.Item>
<Form.Item
label={t("bodyshop.fields.rbac.shop.config")}
label={t("bodyshop.fields.rbac.shop.config")}
rules={[
{
required: true,
//message: t("general.validation.required"),
},
]}
name={["md_rbac", "shop:config"]}
>
<InputNumber/>
</Form.Item>
<Form.Item
label={t("bodyshop.fields.rbac.timetickets.edit")}
rules={[
{
required: true,
//message: t("general.validation.required"),
},
]}
name={["md_rbac", "shop:config"]}
name={["md_rbac", "timetickets:edit"]}
>
<InputNumber/>
</Form.Item>
<Form.Item
label={t("bodyshop.fields.rbac.timetickets.shiftedit")}
rules={[
{
required: true,
//message: t("general.validation.required"),
},
]}
name={["md_rbac", "timetickets:shiftedit"]}
>
<InputNumber/>
</Form.Item>
<Form.Item
label={t("bodyshop.fields.rbac.timetickets.editcommitted")}
rules={[
{
required: true,
//message: t("general.validation.required"),
},
]}
name={["md_rbac", "timetickets:editcommitted"]}
>
<InputNumber/>
</Form.Item>
<Form.Item
label={t("bodyshop.fields.rbac.ttapprovals.view")}
rules={[
{
required: true,
//message: t("general.validation.required"),
},
]}
name={["md_rbac", "ttapprovals:view"]}
>
<InputNumber/>
</Form.Item>
<Form.Item
label={t("bodyshop.fields.rbac.ttapprovals.approve")}
rules={[
{
required: true,
//message: t("general.validation.required"),
},
]}
name={["md_rbac", "ttapprovals:approve"]}
>
<InputNumber/>
</Form.Item>
<Form.Item
label={t("bodyshop.fields.rbac.shop.vendors")}
rules={[
{
required: true,
//message: t("general.validation.required"),
},
]}
name={["md_rbac", "shop:vendors"]}
>
<InputNumber/>
</Form.Item>

View File

@@ -9,6 +9,8 @@ import {selectBodyshop} from "../../redux/user/user.selectors";
import {connect} from "react-redux";
import {createStructuredSelector} from "reselect";
import {useSplitTreatments} from "@splitsoftware/splitio-react";
import ShopInfoResponsibilitycentersTaxesComponent from "./shop-info.responsibilitycenters.taxes.component";
import InstanceRenderManager from '../../utils/instanceRenderMgr';
const SelectorDiv = styled.div`
.ant-form-item .ant-select {
@@ -4336,7 +4338,10 @@ export function ShopInfoResponsibilityCenterComponent({bodyshop, form}) {
</Form.Item>
</LayoutFormRow>
)}
<LayoutFormRow id="state_tax">
{
InstanceRenderManager({imex: <LayoutFormRow id="state_tax">
<Form.Item
label={t("bodyshop.fields.responsibilitycenters.state_tax")}
rules={[
@@ -4433,105 +4438,132 @@ export function ShopInfoResponsibilityCenterComponent({bodyshop, form}) {
>
<InputNumber precision={2}/>
</Form.Item>
</LayoutFormRow>
<LayoutFormRow id="local_tax">
<Form.Item
label={t("bodyshop.fields.responsibilitycenters.local_tax")}
rules={[
{
required: true,
//message: t("general.validation.required"),
},
]}
name={["md_responsibility_centers", "taxes", "local", "name"]}
>
<Input/>
</Form.Item>
{/* <Form.Item
label={t("bodyshop.fields.responsibilitycenter_accountnumber")}
rules={[
{
required: true,
//message: t("general.validation.required"),
},
]}
name={[
"md_responsibility_centers",
"taxes",
"local",
"accountnumber",
]}
>
<Input />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.responsibilitycenter_accountname")}
rules={[
{
required: true,
//message: t("general.validation.required"),
},
]}
name={["md_responsibility_centers", "taxes", "local", "accountname"]}
>
<Input />
</Form.Item> */}
<Form.Item
label={t("bodyshop.fields.responsibilitycenter_accountdesc")}
rules={[
{
required: true,
//message: t("general.validation.required"),
},
]}
name={["md_responsibility_centers", "taxes", "local", "accountdesc"]}
>
<Input/>
</Form.Item>
<Form.Item
label={t("bodyshop.fields.responsibilitycenter_accountitem")}
rules={[
{
required: true,
//message: t("general.validation.required"),
},
]}
name={["md_responsibility_centers", "taxes", "local", "accountitem"]}
>
<Input/>
</Form.Item>
{(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && (
<Form.Item
label={t("bodyshop.fields.dms.dms_acctnumber")}
rules={[
{
required: true,
//message: t("general.validation.required"),
},
]}
name={[
"md_responsibility_centers",
"taxes",
"local",
"dms_acctnumber",
]}
>
<Input/>
</Form.Item>
)}
<Form.Item
label={t("bodyshop.fields.responsibilitycenter_rate")}
rules={[
{
required: true,
//message: t("general.validation.required"),
},
]}
name={["md_responsibility_centers", "taxes", "local", "rate"]}
>
<InputNumber precision={2}/>
</Form.Item>
</LayoutFormRow>
</LayoutFormRow>,
rome: <ShopInfoResponsibilitycentersTaxesComponent form={form}/> })
}
<Form.Item
label={t("bodyshop.fields.responsibilitycenters.itemexemptcode")}
rules={[
{
required: true,
//message: t("general.validation.required"),
},
]}
name={["md_responsibility_centers", "taxes", "itemexemptcode"]}
>
<Input/>
</Form.Item>
<Form.Item
label={t("bodyshop.fields.responsibilitycenters.invoiceexemptcode")}
rules={[
{
required: true,
//message: t("general.validation.required"),
},
]}
name={["md_responsibility_centers", "taxes", "invoiceexemptcode"]}
>
<Input/>
</Form.Item>
{/*<LayoutFormRow id="local_tax">*/}
{/* <Form.Item*/}
{/* label={t("bodyshop.fields.responsibilitycenters.local_tax")}*/}
{/* rules={[*/}
{/* {*/}
{/* required: true,*/}
{/* //message: t("general.validation.required"),*/}
{/* },*/}
{/* ]}*/}
{/* name={["md_responsibility_centers", "taxes", "local", "name"]}*/}
{/* >*/}
{/* <Input />*/}
{/* </Form.Item>*/}
{/* /!* <Form.Item*/}
{/* label={t("bodyshop.fields.responsibilitycenter_accountnumber")}*/}
{/* rules={[*/}
{/* {*/}
{/* required: true,*/}
{/* //message: t("general.validation.required"),*/}
{/* },*/}
{/* ]}*/}
{/* name={[*/}
{/* "md_responsibility_centers",*/}
{/* "taxes",*/}
{/* "local",*/}
{/* "accountnumber",*/}
{/* ]}*/}
{/* >*/}
{/* <Input />*/}
{/* </Form.Item>*/}
{/* <Form.Item*/}
{/* label={t("bodyshop.fields.responsibilitycenter_accountname")}*/}
{/* rules={[*/}
{/* {*/}
{/* required: true,*/}
{/* //message: t("general.validation.required"),*/}
{/* },*/}
{/* ]}*/}
{/* name={["md_responsibility_centers", "taxes", "local", "accountname"]}*/}
{/* >*/}
{/* <Input />*/}
{/* </Form.Item> *!/*/}
{/* <Form.Item*/}
{/* label={t("bodyshop.fields.responsibilitycenter_accountdesc")}*/}
{/* rules={[*/}
{/* {*/}
{/* required: true,*/}
{/* //message: t("general.validation.required"),*/}
{/* },*/}
{/* ]}*/}
{/* name={["md_responsibility_centers", "taxes", "local", "accountdesc"]}*/}
{/* >*/}
{/* <Input />*/}
{/* </Form.Item>*/}
{/* <Form.Item*/}
{/* label={t("bodyshop.fields.responsibilitycenter_accountitem")}*/}
{/* rules={[*/}
{/* {*/}
{/* required: true,*/}
{/* //message: t("general.validation.required"),*/}
{/* },*/}
{/* ]}*/}
{/* name={["md_responsibility_centers", "taxes", "local", "accountitem"]}*/}
{/* >*/}
{/* <Input />*/}
{/* </Form.Item>*/}
{/* {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && (*/}
{/* <Form.Item*/}
{/* label={t("bodyshop.fields.dms.dms_acctnumber")}*/}
{/* rules={[*/}
{/* {*/}
{/* required: true,*/}
{/* //message: t("general.validation.required"),*/}
{/* },*/}
{/* ]}*/}
{/* name={[*/}
{/* "md_responsibility_centers",*/}
{/* "taxes",*/}
{/* "local",*/}
{/* "dms_acctnumber",*/}
{/* ]}*/}
{/* >*/}
{/* <Input />*/}
{/* </Form.Item>*/}
{/* )}*/}
{/* <Form.Item*/}
{/* label={t("bodyshop.fields.responsibilitycenter_rate")}*/}
{/* rules={[*/}
{/* {*/}
{/* required: true,*/}
{/* //message: t("general.validation.required"),*/}
{/* },*/}
{/* ]}*/}
{/* name={["md_responsibility_centers", "taxes", "local", "rate"]}*/}
{/* >*/}
{/* <InputNumber precision={2} />*/}
{/* </Form.Item>*/}
{/*</LayoutFormRow>*/}
<LayoutFormRow header={<div>AR</div>} id="AR">
{/* <Form.Item
label={t("bodyshop.fields.responsibilitycenters.ar")}

View File

@@ -0,0 +1,259 @@
import {DeleteFilled} from "@ant-design/icons";
import {Button, Checkbox, Col, Form, Input, InputNumber, Row, Select, Space, Switch,} from "antd";
import React from "react";
import {useTranslation} from "react-i18next";
import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component";
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
import {connect} from "react-redux";
import {createStructuredSelector} from "reselect";
import {selectBodyshop} from "../../redux/user/user.selectors";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop,
});
const mapDispatchToProps = (dispatch) => ({
//setUserLanguage: language => dispatch(setUserLanguage(language))
});
export default connect(
mapStateToProps,
mapDispatchToProps
)(ShopInfoTaskPresets);
export function ShopInfoTaskPresets({bodyshop, form}) {
const {t} = useTranslation();
return (
<>
<LayoutFormRow noDivider>
<Form.Item
label={t("bodyshop.fields.md_tasks_presets.enable_tasks")}
valuePropName="checked"
name={["md_tasks_presets", "enable_tasks"]}
>
<Switch/>
</Form.Item>
<Form.Item
label={t("bodyshop.fields.md_tasks_presets.use_approvals")}
valuePropName="checked"
name={["md_tasks_presets", "use_approvals"]}
>
<Switch/>
</Form.Item>
</LayoutFormRow>
<LayoutFormRow header={t("bodyshop.labels.md_tasks_presets")}>
<Form.List name={["md_tasks_presets", "presets"]}>
{(fields, {add, remove, move}) => {
return (
<div>
{fields.map((field, index) => (
<Form.Item key={field.key}>
<LayoutFormRow noDivider>
<Form.Item
label={t("bodyshop.fields.md_tasks_presets.name")}
key={`${index}name`}
name={[field.name, "name"]}
rules={[
{
required: true,
//message: t("general.validation.required"),
},
]}
>
<Input/>
</Form.Item>
<Form.Item
span={12}
label={t("bodyshop.fields.md_tasks_presets.hourstype")}
key={`${index}hourstype`}
name={[field.name, "hourstype"]}
rules={[
{
required: true,
//message: t("general.validation.required"),
},
]}
>
<Checkbox.Group>
<Row>
<Col span={4}>
<Checkbox
value="LAA"
style={{lineHeight: "32px"}}
>
{t("joblines.fields.lbr_types.LAA")}
</Checkbox>
</Col>
<Col span={4}>
<Checkbox
value="LAB"
style={{lineHeight: "32px"}}
>
{t("joblines.fields.lbr_types.LAB")}
</Checkbox>
</Col>
<Col span={4}>
<Checkbox
value="LAD"
style={{lineHeight: "32px"}}
>
{t("joblines.fields.lbr_types.LAD")}
</Checkbox>
</Col>
<Col span={4}>
<Checkbox
value="LAE"
style={{lineHeight: "32px"}}
>
{t("joblines.fields.lbr_types.LAE")}
</Checkbox>
</Col>
<Col span={4}>
<Checkbox
value="LAF"
style={{lineHeight: "32px"}}
>
{t("joblines.fields.lbr_types.LAF")}
</Checkbox>
</Col>
<Col span={4}>
<Checkbox
value="LAG"
style={{lineHeight: "32px"}}
>
{t("joblines.fields.lbr_types.LAG")}
</Checkbox>
</Col>
<Col span={4}>
<Checkbox
value="LAM"
style={{lineHeight: "32px"}}
>
{t("joblines.fields.lbr_types.LAM")}
</Checkbox>
</Col>
<Col span={4}>
<Checkbox
value="LAR"
style={{lineHeight: "32px"}}
>
{t("joblines.fields.lbr_types.LAR")}
</Checkbox>
</Col>
<Col span={4}>
<Checkbox
value="LAS"
style={{lineHeight: "32px"}}
>
{t("joblines.fields.lbr_types.LAS")}
</Checkbox>
</Col>
<Col span={4}>
<Checkbox
value="LAU"
style={{lineHeight: "32px"}}
>
{t("joblines.fields.lbr_types.LAU")}
</Checkbox>
</Col>
<Col span={4}>
<Checkbox
value="LA1"
style={{lineHeight: "32px"}}
>
{t("joblines.fields.lbr_types.LA1")}
</Checkbox>
</Col>
<Col span={4}>
<Checkbox
value="LA2"
style={{lineHeight: "32px"}}
>
{t("joblines.fields.lbr_types.LA2")}
</Checkbox>
</Col>
<Col span={4}>
<Checkbox
value="LA3"
style={{lineHeight: "32px"}}
>
{t("joblines.fields.lbr_types.LA3")}
</Checkbox>
</Col>
<Col span={4}>
<Checkbox
value="LA4"
style={{lineHeight: "32px"}}
>
{t("joblines.fields.lbr_types.LA4")}
</Checkbox>
</Col>
</Row>
</Checkbox.Group>
</Form.Item>
<Form.Item
label={t("bodyshop.fields.md_tasks_presets.percent")}
key={`${index}percent`}
rules={[
{
required: true,
//message: t("general.validation.required"),
},
]}
name={[field.name, "percent"]}
>
<InputNumber min={0} max={100}/>
</Form.Item>
<Form.Item
label={t("bodyshop.fields.md_tasks_presets.memo")}
key={`${index}memo`}
name={[field.name, "memo"]}
>
<Input/>
</Form.Item>
<Form.Item
label={t("bodyshop.fields.md_tasks_presets.nextstatus")}
key={`${index}nextstatus`}
name={[field.name, "nextstatus"]}
>
<Select
options={bodyshop.md_ro_statuses.production_statuses.map(
(o) => ({value: o, label: o})
)}
/>
</Form.Item>
<Space wrap>
<DeleteFilled
onClick={() => {
remove(field.name);
}}
/>
<FormListMoveArrows
move={move}
index={index}
total={fields.length}
/>
</Space>
</LayoutFormRow>
</Form.Item>
))}
<Form.Item>
<Button
type="dashed"
onClick={() => {
add();
}}
style={{width: "100%"}}
>
{t("bodyshop.actions.add_task_preset")}
</Button>
</Form.Item>
</div>
);
}}
</Form.List>
</LayoutFormRow>
</>
);
}