Merged in feature/IO-2304-Auto-Parts-Toggle (pull request #1066)

Add toggles to two modals to allow for auto parts queue toggle

Approved-by: Patrick Fic
This commit is contained in:
Dave Richer
2023-11-22 23:02:09 +00:00
committed by Patrick Fic
13 changed files with 110 additions and 38 deletions

View File

@@ -73,6 +73,8 @@ export function JobsAvailableContainer({
const [selectedJob, setSelectedJob] = useState(null); const [selectedJob, setSelectedJob] = useState(null);
const [selectedOwner, setSelectedOwner] = useState(null); const [selectedOwner, setSelectedOwner] = useState(null);
const [partsQueueToggle, setPartsQueueToggle] = useState(bodyshop.md_functionality_toggles.parts_queue_toggle);
const [insertLoading, setInsertLoading] = useState(false); const [insertLoading, setInsertLoading] = useState(false);
const [insertNote] = useMutation(INSERT_NEW_NOTE); const [insertNote] = useMutation(INSERT_NEW_NOTE);
@@ -94,6 +96,7 @@ export function JobsAvailableContainer({
logImEXEvent("job_import_new"); logImEXEvent("job_import_new");
setOwnerModalVisible(false); setOwnerModalVisible(false);
setInsertLoading(true); setInsertLoading(true);
const estData = replaceEmpty(estDataRaw.data.available_jobs_by_pk); const estData = replaceEmpty(estDataRaw.data.available_jobs_by_pk);
@@ -120,7 +123,7 @@ export function JobsAvailableContainer({
let existingVehicles; let existingVehicles;
if (estData.est_data.v_vin) { if (estData.est_data.v_vin) {
//There's vehicle data, need to double check the VIN. //There's vehicle data, need to double-check the VIN.
existingVehicles = await client.query({ existingVehicles = await client.query({
query: SEARCH_VEHICLE_BY_VIN, query: SEARCH_VEHICLE_BY_VIN,
variables: { variables: {
@@ -143,7 +146,7 @@ export function JobsAvailableContainer({
text: t("jobs.labels.importnote"), text: t("jobs.labels.importnote"),
}, },
}, },
queued_for_parts: true, queued_for_parts: partsQueueToggle,
...(existingVehicles && existingVehicles.data.vehicles.length > 0 ...(existingVehicles && existingVehicles.data.vehicles.length > 0
? { vehicleid: existingVehicles.data.vehicles[0].id, vehicle: null } ? { vehicleid: existingVehicles.data.vehicles[0].id, vehicle: null }
: {}), : {}),
@@ -157,46 +160,51 @@ export function JobsAvailableContainer({
delete newJob.vehicle; delete newJob.vehicle;
} }
insertNewJob({ try {
variables: { const r = await insertNewJob({
job: newJob, variables: {
}, job: newJob,
}) },
.then((r) => { });
if (CriticalPartsScanning.treatment === "on") {
CriticalPartsScan(r.data.insert_jobs.returning[0].id);
}
notification["success"]({
message: t("jobs.successes.created"),
onClick: () => {
history.push(`/manage/jobs/${r.data.insert_jobs.returning[0].id}`);
},
});
//Job has been inserted. Clean up the available jobs record.
insertAuditTrail({ if (CriticalPartsScanning.treatment === "on") {
jobid: r.data.insert_jobs.returning[0].id, CriticalPartsScan(r.data.insert_jobs.returning[0].id);
operation: AuditTrailMapping.jobimported(), }
});
deleteJob({ notification["success"]({
variables: { id: estData.id }, message: t("jobs.successes.created"),
}).then((r) => { onClick: () => {
refetch(); history.push(`/manage/jobs/${r.data.insert_jobs.returning[0].id}`);
setInsertLoading(false); },
}); });
}) //Job has been inserted. Clean up the available jobs record.
.catch((r) => {
//error while inserting insertAuditTrail({
notification["error"]({ jobid: r.data.insert_jobs.returning[0].id,
message: t("jobs.errors.creating", { error: r.message }), operation: AuditTrailMapping.jobimported(),
}); });
deleteJob({
variables: { id: estData.id },
}).then((r) => {
refetch(); refetch();
setInsertLoading(false); setInsertLoading(false);
}); });
setPartsQueueToggle(bodyshop.md_functionality_toggles.parts_queue_toggle);
} catch (err) {
//error while inserting
notification["error"]({
message: t("jobs.errors.creating", { error: err.message }),
});
refetch().catch(e => {console.error(`Something went wrong in jobs available table container - ${err.message || ''}`)});
setInsertLoading(false);
setPartsQueueToggle(bodyshop.md_functionality_toggles.parts_queue_toggle);
}
}; };
//Suplement scenario //Supplement scenario
const onJobFindModalOk = async () => { const onJobFindModalOk = async () => {
logImEXEvent("job_import_supplement"); logImEXEvent("job_import_supplement");
@@ -248,11 +256,14 @@ export function JobsAvailableContainer({
// "0.00" // "0.00"
// ), // ),
// job_totals: newTotals, // job_totals: newTotals,
// queued_for_parts: true, queued_for_parts: partsQueueToggle,
}, },
}, },
}); });
if (CriticalPartsScanning.treatment === "on") {
setPartsQueueToggle(bodyshop.md_functionality_toggles.parts_queue_toggle);
if (CriticalPartsScanning.treatment === "on") {
CriticalPartsScan(updateResult.data.update_jobs.returning[0].id); CriticalPartsScan(updateResult.data.update_jobs.returning[0].id);
} }
if (updateResult.errors) { if (updateResult.errors) {
@@ -327,12 +338,14 @@ export function JobsAvailableContainer({
const onOwnerModalCancel = () => { const onOwnerModalCancel = () => {
setOwnerModalVisible(false); setOwnerModalVisible(false);
setSelectedOwner(null); setSelectedOwner(null);
setPartsQueueToggle(bodyshop.md_functionality_toggles.parts_queue_toggle);
}; };
const onJobModalCancel = () => { const onJobModalCancel = () => {
setJobModalVisible(false); setJobModalVisible(false);
modalSearchState[1](""); modalSearchState[1]("");
setSelectedJob(null); setSelectedJob(null);
setPartsQueueToggle(bodyshop.md_functionality_toggles.parts_queue_toggle);
}; };
const addJobAsNew = (record) => { const addJobAsNew = (record) => {
@@ -353,6 +366,8 @@ export function JobsAvailableContainer({
}, [addJobAsSupp, availableJobId, clm_no]); }, [addJobAsSupp, availableJobId, clm_no]);
if (error) return <AlertComponent type="error" message={error.message} />; if (error) return <AlertComponent type="error" message={error.message} />;
return ( return (
<LoadingSpinner <LoadingSpinner
loading={insertLoading} loading={insertLoading}
@@ -362,11 +377,14 @@ export function JobsAvailableContainer({
loading={estDataRaw.loading} loading={estDataRaw.loading}
error={estDataRaw.error} error={estDataRaw.error}
owner={owner} owner={owner}
partsQueueToggle={partsQueueToggle}
setPartsQueueToggle={setPartsQueueToggle}
selectedOwner={selectedOwner} selectedOwner={selectedOwner}
setSelectedOwner={setSelectedOwner} setSelectedOwner={setSelectedOwner}
visible={ownerModalVisible} visible={ownerModalVisible}
onOk={onOwnerFindModalOk} onOk={onOwnerFindModalOk}
onCancel={onOwnerModalCancel} onCancel={onOwnerModalCancel}
/> />
<JobsFindModalContainer <JobsFindModalContainer
loading={estDataRaw.loading} loading={estDataRaw.loading}
@@ -378,6 +396,8 @@ export function JobsAvailableContainer({
onOk={onJobFindModalOk} onOk={onJobFindModalOk}
onCancel={onJobModalCancel} onCancel={onJobModalCancel}
modalSearchState={modalSearchState} modalSearchState={modalSearchState}
partsQueueToggle={partsQueueToggle}
setPartsQueueToggle={setPartsQueueToggle}
/> />
<Row gutter={[16, 16]}> <Row gutter={[16, 16]}>
<Col span={24}> <Col span={24}>

View File

@@ -14,6 +14,8 @@ export default function JobsFindModalComponent({
importOptionsState, importOptionsState,
modalSearchState, modalSearchState,
jobsListRefetch, jobsListRefetch,
partsQueueToggle,
setPartsQueueToggle,
}) { }) {
const { t } = useTranslation(); const { t } = useTranslation();
const [modalSearch, setModalSearch] = modalSearchState; const [modalSearch, setModalSearch] = modalSearchState;
@@ -199,6 +201,12 @@ export default function JobsFindModalComponent({
> >
{t("jobs.labels.override_header")} {t("jobs.labels.override_header")}
</Checkbox> </Checkbox>
<Checkbox
checked={partsQueueToggle}
onChange={(e) => setPartsQueueToggle(e.target.checked)}
>
{t("bodyshop.fields.md_functionality_toggles.parts_queue_toggle")}
</Checkbox>
</div> </div>
); );
} }

View File

@@ -24,6 +24,8 @@ export default connect(
setSelectedJob, setSelectedJob,
importOptionsState, importOptionsState,
modalSearchState, modalSearchState,
partsQueueToggle,
setPartsQueueToggle,
...modalProps ...modalProps
}) { }) {
const { t } = useTranslation(); const { t } = useTranslation();
@@ -91,6 +93,8 @@ export default connect(
jobsListRefetch={jobsList.refetch} jobsListRefetch={jobsList.refetch}
jobsList={jobsData} jobsList={jobsData}
modalSearchState={modalSearchState} modalSearchState={modalSearchState}
partsQueueToggle={partsQueueToggle}
setPartsQueueToggle={setPartsQueueToggle}
/> />
) : null} ) : null}
</Modal> </Modal>

View File

@@ -8,10 +8,11 @@ export default function OwnerFindModalComponent({
setSelectedOwner, setSelectedOwner,
ownersListLoading, ownersListLoading,
ownersList, ownersList,
partsQueueToggle,
setPartsQueueToggle,
}) { }) {
//setSelectedOwner is used to set the record id of the owner to use for adding the job. //setSelectedOwner is used to set the record id of the owner to use for adding the job.
const { t } = useTranslation(); const { t } = useTranslation();
const columns = [ const columns = [
{ {
title: t("owners.fields.ownr_ln"), title: t("owners.fields.ownr_ln"),
@@ -109,6 +110,12 @@ export default function OwnerFindModalComponent({
> >
{t("owners.labels.create_new")} {t("owners.labels.create_new")}
</Checkbox> </Checkbox>
<Checkbox
checked={partsQueueToggle}
onChange={(e) => setPartsQueueToggle(e.target.checked)}
>
{t("bodyshop.fields.md_functionality_toggles.parts_queue_toggle")}
</Checkbox>
</div> </div>
); );
} }

View File

@@ -14,6 +14,8 @@ export default function OwnerFindModalContainer({
owner, owner,
selectedOwner, selectedOwner,
setSelectedOwner, setSelectedOwner,
partsQueueToggle,
setPartsQueueToggle,
...modalProps ...modalProps
}) { }) {
//use owner object to run query and find what possible owners there are. //use owner object to run query and find what possible owners there are.
@@ -59,6 +61,8 @@ export default function OwnerFindModalContainer({
selectedOwner={selectedOwner} selectedOwner={selectedOwner}
setSelectedOwner={setSelectedOwner} setSelectedOwner={setSelectedOwner}
ownersListLoading={ownersList.loading} ownersListLoading={ownersList.loading}
partsQueueToggle={partsQueueToggle}
setPartsQueueToggle={setPartsQueueToggle}
ownersList={ ownersList={
ownersList.data && ownersList.data.search_owners ownersList.data && ownersList.data.search_owners
? ownersList.data.search_owners ? ownersList.data.search_owners

View File

@@ -42,12 +42,20 @@ export function ShopInfoGeneral({ form, bodyshop }) {
bodyshop && bodyshop.imexshopid bodyshop && bodyshop.imexshopid
); );
return ( return (
<div> <div>
<LayoutFormRow <LayoutFormRow
header={t("bodyshop.labels.businessinformation")} header={t("bodyshop.labels.businessinformation")}
id="businessinformation" id="businessinformation"
> >
<Form.Item
label={t("bodyshop.fields.md_functionality_toggles.parts_queue_toggle")}
name={["md_functionality_toggles","parts_queue_toggle"]}
valuePropName="checked"
>
<Switch />
</Form.Item>
<Form.Item <Form.Item
label={t("bodyshop.fields.shopname")} label={t("bodyshop.fields.shopname")}
name="shopname" name="shopname"

View File

@@ -39,6 +39,7 @@ export const QUERY_BODYSHOP = gql`
logo_img_path logo_img_path
md_ro_statuses md_ro_statuses
md_order_statuses md_order_statuses
md_functionality_toggles
shopname shopname
state state
state_tax_id state_tax_id
@@ -158,6 +159,7 @@ export const UPDATE_SHOP = gql`
logo_img_path logo_img_path
md_ro_statuses md_ro_statuses
md_order_statuses md_order_statuses
md_functionality_toggles
shopname shopname
state state
state_tax_id state_tax_id

View File

@@ -347,6 +347,9 @@
}, },
"md_payment_types": "Payment Types", "md_payment_types": "Payment Types",
"md_referral_sources": "Referral Sources", "md_referral_sources": "Referral Sources",
"md_functionality_toggles": {
"parts_queue_toggle": "Automatically Add Imported/Supplemented Jobs to Parts Queue"
},
"md_tasks_presets": { "md_tasks_presets": {
"hourstype": "", "hourstype": "",
"memo": "", "memo": "",

View File

@@ -252,6 +252,9 @@
"address1": "", "address1": "",
"address2": "", "address2": "",
"appt_alt_transport": "", "appt_alt_transport": "",
"md_functionality_toggles": {
"parts_queue_toggle": "Parts Queue Toggle"
},
"appt_colors": { "appt_colors": {
"color": "", "color": "",
"label": "" "label": ""

View File

@@ -329,6 +329,9 @@
"paint": "", "paint": "",
"prep": "" "prep": ""
}, },
"md_functionality_toggles": {
"parts_queue_toggle": "Parts Queue Toggle"
},
"md_ins_co": { "md_ins_co": {
"city": "", "city": "",
"name": "", "name": "",

View File

@@ -890,11 +890,13 @@
- appt_colors - appt_colors
- appt_length - appt_length
- attach_pdf_to_email - attach_pdf_to_email
- autohouseid
- bill_allow_post_to_closed - bill_allow_post_to_closed
- bill_tax_rates - bill_tax_rates
- cdk_configuration - cdk_configuration
- cdk_dealerid - cdk_dealerid
- city - city
- claimscorpid
- country - country
- created_at - created_at
- default_adjustment_rate - default_adjustment_rate
@@ -928,6 +930,7 @@
- md_estimators - md_estimators
- md_filehandlers - md_filehandlers
- md_from_emails - md_from_emails
- md_functionality_toggles
- md_hour_split - md_hour_split
- md_ins_cos - md_ins_cos
- md_jobline_presets - md_jobline_presets
@@ -1026,6 +1029,7 @@
- md_estimators - md_estimators
- md_filehandlers - md_filehandlers
- md_from_emails - md_from_emails
- md_functionality_toggles
- md_hour_split - md_hour_split
- md_ins_cos - md_ins_cos
- md_jobline_presets - md_jobline_presets

View File

@@ -0,0 +1,4 @@
-- Could not auto-generate a down migration.
-- Please write an appropriate down migration for the SQL below:
-- alter table "public"."bodyshops" add column "md_functionality_toggles" jsonb
-- null default jsonb_build_object();

View File

@@ -0,0 +1,2 @@
alter table "public"."bodyshops" add column "md_functionality_toggles" jsonb
null default jsonb_build_object();