import { DeleteFilled, DownOutlined, ReloadOutlined } from "@ant-design/icons";
import {
Button,
Card,
Col,
Divider,
Dropdown,
Form,
Input,
InputNumber,
Row,
Select,
Space,
Statistic,
Switch,
Tooltip,
Typography
} from "antd";
import Dinero from "dinero.js";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
import { determineDmsType } from "../../utils/determineDMSType";
import { selectBodyshop } from "../../redux/user/user.selectors";
import i18n from "../../translations/i18n";
import dayjs from "../../utils/day";
import DmsCdkMakes from "../dms-cdk-makes/dms-cdk-makes.component";
import DmsCdkMakesRefetch from "../dms-cdk-makes/dms-cdk-makes.refetch.component";
import DateTimePicker from "../form-date-time-picker/form-date-time-picker.component.jsx";
import CurrencyInput from "../form-items-formatted/currency-form-item.component";
import { useSocket } from "../../contexts/SocketIO/useSocket";
import { useSplitTreatments } from "@splitsoftware/splitio-react";
import { useEffect, useMemo, useState } from "react";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop
});
const mapDispatchToProps = () => ({});
export default connect(mapStateToProps, mapDispatchToProps)(DmsPostForm);
export function DmsPostForm({ bodyshop, socket, job, logsRef }) {
const {
treatments: { Fortellis }
} = useSplitTreatments({
attributes: {},
names: ["Fortellis"],
splitKey: bodyshop.imexshopid
});
const [form] = Form.useForm();
const { t } = useTranslation();
const { socket: wsssocket } = useSocket();
// Figure out DMS once and reuse
const dms = useMemo(() => determineDmsType(bodyshop), [bodyshop]);
// ---------------- RR Advisors (unchanged behavior) ----------------
const [advisors, setAdvisors] = useState([]);
const [advLoading, setAdvLoading] = useState(false);
// Normalize advisor fields coming from various shapes
const getAdvisorNumber = (a) => a?.advisorId;
const getAdvisorLabel = (a) => `${a?.firstName || ""} ${a?.lastName || ""}`.trim();
const fetchRrAdvisors = (refresh = false) => {
if (!wsssocket) return;
setAdvLoading(true);
// Listen for the server's broadcast
const onResult = (payload) => {
try {
const list = payload?.result ?? payload ?? [];
setAdvisors(Array.isArray(list) ? list : []);
} finally {
setAdvLoading(false);
wsssocket.off("rr-get-advisors:result", onResult);
}
};
wsssocket.once("rr-get-advisors:result", onResult);
// Emit with refresh flag: server will bypass/rebuild cache when true
wsssocket.emit("rr-get-advisors", { departmentType: "B", refresh }, (ack) => {
if (ack?.ok) {
const list = ack.result ?? [];
setAdvisors(Array.isArray(list) ? list : []);
} else if (ack) {
// Preserve original logging semantics
console.error("Something went wrong fetching DMS Advisors");
}
setAdvLoading(false);
wsssocket.off("rr-get-advisors:result", onResult);
});
};
useEffect(() => {
if (dms === "rr") fetchRrAdvisors(false);
}, [dms, bodyshop?.id]);
// ---------------- Payers helpers (non-RR) ----------------
const handlePayerSelect = (value, index) => {
form.setFieldsValue({
payers: (form.getFieldValue("payers") || []).map((payer, mapIndex) => {
if (index !== mapIndex) return payer;
const cdkPayer =
bodyshop.cdk_configuration.payers && bodyshop.cdk_configuration.payers.find((i) => i.name === value);
if (!cdkPayer) return payer;
return {
...cdkPayer,
dms_acctnumber: cdkPayer.dms_acctnumber,
controlnumber: job?.[cdkPayer.control_type]
};
})
});
};
// ---------------- Submit (RR precedence preserved) ----------------
const handleFinish = (values) => {
// RR takes precedence regardless of Fortellis split
if (dms === "rr") {
// values will include advisorNo (and makeOverride if provided)
wsssocket.emit("rr-export-job", {
bodyshopId: bodyshop?.id,
jobId: job.id,
job,
txEnvelope: values
});
} else if (Fortellis.treatment === "on") {
// Fallback to existing Fortellis behavior
wsssocket.emit("fortellis-export-job", {
jobid: job.id,
txEnvelope: { ...values, SubscriptionID: bodyshop.cdk_dealerid }
});
} else {
// CDK/PBS/etc.
socket.emit(`${dms}-export-job`, { jobid: job.id, txEnvelope: values });
}
// Scroll logs into view (original behavior)
logsRef?.current?.scrollIntoView({ behavior: "smooth" });
};
return (