import { useMutation, useQuery } from "@apollo/client/react"; import { Button, Card, Col, Form, Input, Modal, Result, Row, Select, Space, Switch, Typography } from "antd"; import { useEffect, useState, useCallback } from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import { useParams } from "react-router-dom"; import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react"; import { some } from "lodash"; import axios from "axios"; import AlertComponent from "../../components/alert/alert.component"; import JobCalculateTotals from "../../components/job-calculate-totals/job-calculate-totals.component"; import ScoreboardAddButton from "../../components/job-scoreboard-add-button/job-scoreboard-add-button.component"; import JobsAdminStatus from "../../components/jobs-admin-change-status/jobs-admin-change.status.component"; import JobsAdminClass from "../../components/jobs-admin-class/jobs-admin-class.component"; import JobsAdminDatesChange from "../../components/jobs-admin-dates/jobs-admin-dates.component"; import JobsAdminDeleteIntake from "../../components/jobs-admin-delete-intake/jobs-admin-delete-intake.component"; import JobsAdminMarkReexport from "../../components/jobs-admin-mark-reexport/jobs-admin-mark-reexport.component"; import JobAdminOwnerReassociate from "../../components/jobs-admin-owner-reassociate/jobs-admin-owner-reassociate.component"; import JobsAdminUnvoid from "../../components/jobs-admin-unvoid/jobs-admin-unvoid.component"; import JobAdminVehicleReassociate from "../../components/jobs-admin-vehicle-reassociate/jobs-admin-vehicle-reassociate.component"; import JobsAdminRemoveAR from "../../components/jobs-admin-remove-ar/jobs-admin-remove-ar.component"; import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; import NotFound from "../../components/not-found/not-found.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; import RREarlyROModal from "../../components/dms-post-form/rr-early-ro-modal"; import { GET_JOB_BY_PK, CONVERT_JOB_TO_RO } from "../../graphql/jobs.queries"; import { setBreadcrumbs, setSelectedHeader } from "../../redux/application/application.actions"; import { insertAuditTrail } from "../../redux/application/application.actions"; import { selectBodyshop } from "../../redux/user/user.selectors"; import { createStructuredSelector } from "reselect"; import { useSocket } from "../../contexts/SocketIO/useSocket"; import { useNotification } from "../../contexts/Notifications/notificationContext"; import { DMS_MAP, getDmsMode } from "../../utils/dmsUtils"; import InstanceRenderManager from "../../utils/instanceRenderMgr"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop }); const mapDispatchToProps = (dispatch) => ({ setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), setSelectedHeader: (key) => dispatch(setSelectedHeader(key)), insertAuditTrail: ({ jobid, operation, type }) => dispatch(insertAuditTrail({ jobid, operation, type })) }); const colSpan = { sm: { span: 24 }, md: { span: 12 }, lg: { span: 8 }, xl: { span: 6 } }; const cardStyle = { height: "100%" }; export function JobsCloseContainer({ setBreadcrumbs, setSelectedHeader, bodyshop, insertAuditTrail }) { const { jobId } = useParams(); const { loading, error, data, refetch } = useQuery(GET_JOB_BY_PK, { variables: { id: jobId }, fetchPolicy: "network-only", nextFetchPolicy: "network-only" }); const { t } = useTranslation(); const { socket } = useSocket(); // Extract socket from context const notification = useNotification(); const [showEarlyROModal, setShowEarlyROModal] = useState(false); const [showConvertModal, setShowConvertModal] = useState(false); const [convertLoading, setConvertLoading] = useState(false); const [form] = Form.useForm(); const [mutationConvertJob] = useMutation(CONVERT_JOB_TO_RO); const allFormValues = Form.useWatch([], form); // Get Fortellis treatment for proper DMS mode detection const { treatments: { Fortellis } } = useTreatmentsWithConfig({ attributes: {}, names: ["Fortellis"], splitKey: bodyshop?.imexshopid }); // Check if bodyshop has Reynolds integration using the proper getDmsMode function const dmsMode = getDmsMode(bodyshop, Fortellis.treatment); const isReynoldsMode = dmsMode === DMS_MAP.reynolds; const job = data?.jobs_by_pk; useEffect(() => { setSelectedHeader("activejobs"); document.title = t("titles.jobs-admin", { app: InstanceRenderManager({ imex: "$t(titles.imexonline)", rome: "$t(titles.romeonline)" }), ro_number: data ? data.jobs_by_pk && data.jobs_by_pk.ro_number : null }); setBreadcrumbs([ { link: `/manage/jobs/`, label: t("titles.bc.jobs") }, { link: `/manage/jobs/${jobId}/`, label: t("titles.bc.jobs-detail", { number: data ? data.jobs_by_pk && data.jobs_by_pk.ro_number : null }) }, { link: `/manage/jobs/${jobId}/admin`, label: t("titles.bc.jobs-admin") } ]); }, [setBreadcrumbs, t, jobId, data, setSelectedHeader]); const handleEarlyROSuccess = (result) => { notification.success({ title: t("jobs.successes.early_ro_created"), description: `RO Number: ${result.roNumber || "N/A"}` }); setShowEarlyROModal(false); refetch?.(); }; const handleConvert = async ({ employee_csr, category, ...values }) => { if (!job?.id) return; setConvertLoading(true); const res = await mutationConvertJob({ variables: { jobId: job.id, job: { converted: true, ...(bodyshop?.enforce_conversion_csr ? { employee_csr } : {}), ...(bodyshop?.enforce_conversion_category ? { category } : {}), ...values } } }); if (values.ca_gst_registrant) { await axios.post("/job/totalsssu", { id: job.id }); } if (!res.errors) { refetch(); notification.success({ title: t("jobs.successes.converted") }); insertAuditTrail({ jobid: job.id, operation: AuditTrailMapping.jobconverted(res.data.update_jobs.returning[0].ro_number), type: "jobconverted" }); setShowConvertModal(false); } setConvertLoading(false); }; const submitDisabled = useCallback(() => some(allFormValues, (v) => v === undefined), [allFormValues]); if (loading) return ; if (error) return ; if (!data.jobs_by_pk) return ; if (!data.jobs_by_pk.job_totals) return } />; return ( {t("jobs.labels.adminwarning")} {isReynoldsMode && job?.converted && !job?.dms_id && !job?.dms_customer_id && !job?.dms_advisor_id && ( )} {isReynoldsMode && !job?.converted && !job?.dms_id && ( )} {/* Early RO Modal */} setShowEarlyROModal(false)} onSuccess={handleEarlyROSuccess} bodyshop={bodyshop} socket={socket} job={job} /> {/* Convert without Early RO Modal */} setShowConvertModal(false)} title={t("jobs.actions.convertwithoutearlyro", "Convert without Early RO")} footer={null} width={700} destroyOnHidden >
{bodyshop?.enforce_class && ( )} {bodyshop?.enforce_referral && ( <> )} {bodyshop?.enforce_conversion_csr && ( )} {bodyshop?.enforce_conversion_category && ( )} {bodyshop?.region_config?.toLowerCase().startsWith("ca") && ( )}
); } export default connect(mapStateToProps, mapDispatchToProps)(JobsCloseContainer);