feature/Reynolds-and-Reynolds-DMS-API-Integration - Add dealer id / merge fortellis

This commit is contained in:
Dave
2025-09-12 14:59:42 -04:00
parent 2fec9fd16e
commit 7c8260685e
37 changed files with 124 additions and 83 deletions

View File

@@ -171,7 +171,7 @@ export function AccountingReceivablesTableComponent({ bodyshop, loading, jobs, r
<Card
extra={
<Space wrap>
{!bodyshop.cdk_dealerid && !bodyshop.pbs_serialnumber && (
{!bodyshop.cdk_dealerid && !bodyshop.pbs_serialnumber && !bodyshop.rr_dealerid && (
<>
<JobMarkSelectedExported
jobIds={selectedJobs}
@@ -189,7 +189,7 @@ export function AccountingReceivablesTableComponent({ bodyshop, loading, jobs, r
/>
</>
)}
{bodyshop.accountingconfig && bodyshop.accountingconfig.qbo && <QboAuthorizeComponent />}
{bodyshop.accountingconfig?.qbo && <QboAuthorizeComponent />}
<Input.Search
value={state.search}
onChange={handleSearch}

View File

@@ -44,7 +44,7 @@ export function BillFormItemsExtendedFormItem({
quantity: record.part_qty || 1,
actual_price: record.act_price,
cost_center: record.part_type
? bodyshop.pbs_serialnumber || bodyshop.cdk_dealerid
? bodyshop.pbs_serialnumber || bodyshop.cdk_dealerid || bodyshop.rr_dealerid
? record.part_type
: responsibilityCenters.defaults && (responsibilityCenters.defaults.costs[record.part_type] || null)
: null
@@ -100,7 +100,7 @@ export function BillFormItemsExtendedFormItem({
</Form.Item>
<Form.Item label={t("billlines.fields.cost_center")} name={["billlineskeys", record.id, "cost_center"]}>
<Select showSearch style={{ minWidth: "3rem" }} disabled={disabled}>
{bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber
{bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || bodyshop.rr_dealerid
? CiecaSelect(true, false)
: responsibilityCenters.costs.map((item) => <Select.Option key={item.name}>{item.name}</Select.Option>)}
</Select>

View File

@@ -354,7 +354,7 @@ export function BillFormComponent({
<Form.Item span={3} label={t("bills.fields.local_tax_rate")} name="local_tax_rate">
<CurrencyInput min={0} />
</Form.Item>
{bodyshop.pbs_serialnumber || bodyshop.cdk_dealerid ? (
{bodyshop.pbs_serialnumber || bodyshop.cdk_dealerid || bodyshop.rr_dealerid ? (
<Form.Item span={2} label={t("bills.labels.federal_tax_exempt")} name="federal_tax_exempt">
<Switch onChange={handleFederalTaxExemptSwitchToggle} />
</Form.Item>

View File

@@ -90,7 +90,7 @@ export function BillEnterModalLinesComponent({
actual_price: opt.cost,
original_actual_price: opt.cost,
cost_center: opt.part_type
? bodyshop.pbs_serialnumber || bodyshop.cdk_dealerid
? bodyshop.pbs_serialnumber || bodyshop.cdk_dealerid || bodyshop.rr_dealerid
? opt.part_type !== "PAE"
? opt.part_type
: null
@@ -322,7 +322,7 @@ export function BillEnterModalLinesComponent({
},
formInput: () => (
<Select showSearch style={{ minWidth: "3rem" }} disabled={disabled}>
{bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber
{bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || bodyshop.rr_dealerid
? CiecaSelect(true, false)
: responsibilityCenters.costs.map((item) => <Select.Option key={item.name}>{item.name}</Select.Option>)}
</Select>

View File

@@ -17,7 +17,7 @@ import Dinero from "dinero.js";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
import { determineDmsType } from "../../pages/dms/dms.container";
import { determineDmsType } from "../../utils/determineDMSType";
import { selectBodyshop } from "../../redux/user/user.selectors";
import i18n from "../../translations/i18n";
import dayjs from "../../utils/day";
@@ -257,8 +257,7 @@ export function DmsPostForm({ bodyshop, socket, job, logsRef }) {
]}
>
<Select style={{ minWidth: "15rem" }} onSelect={(value) => handlePayerSelect(value, index)}>
{bodyshop.cdk_configuration &&
bodyshop.cdk_configuration.payers &&
{bodyshop.cdk_configuration?.payers &&
bodyshop.cdk_configuration.payers.map((payer) => (
<Select.Option key={payer.name}>{payer.name}</Select.Option>
))}
@@ -335,7 +334,7 @@ export function DmsPostForm({ bodyshop, socket, job, logsRef }) {
{() => {
const payers = form.getFieldValue("payers");
const row = payers && payers[index];
const row = payers?.[index];
const cdkPayer =
bodyshop.cdk_configuration.payers &&
@@ -379,10 +378,9 @@ export function DmsPostForm({ bodyshop, socket, job, logsRef }) {
let totalAllocated = Dinero();
const payers = form.getFieldValue("payers");
payers &&
payers.forEach((payer) => {
totalAllocated = totalAllocated.add(Dinero({ amount: Math.round((payer?.amount || 0) * 100) }));
});
payers?.forEach((payer) => {
totalAllocated = totalAllocated.add(Dinero({ amount: Math.round((payer?.amount || 0) * 100) }));
});
const totals =
socket.allocationsSummary &&

View File

@@ -141,7 +141,7 @@ const buildAccountingChildren = ({
</Link>
)
},
...(!((bodyshop && bodyshop.cdk_dealerid) || (bodyshop && bodyshop.pbs_serialnumber)) || DmsAp.treatment === "on"
...(!(bodyshop?.cdk_dealerid || bodyshop?.pbs_serialnumber || bodyshop?.rr_dealerid) || DmsAp.treatment === "on"
? [
{
key: "payables",
@@ -156,7 +156,7 @@ const buildAccountingChildren = ({
}
]
: []),
...(!((bodyshop && bodyshop.cdk_dealerid) || (bodyshop && bodyshop.pbs_serialnumber))
...(!(bodyshop?.cdk_dealerid || bodyshop?.pbs_serialnumber || bodyshop?.rr_dealerid) || DmsAp.treatment === "on"
? [
{
key: "payments",

View File

@@ -65,7 +65,7 @@ export function JobsCloseAutoAllocate({ bodyshop, joblines, form, disabled }) {
};
const menu =
bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber
bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || bodyshop.rr_dealerid
? {
items: bodyshop.md_responsibility_centers.dms_defaults.map((mapping) => ({
key: mapping.name,
@@ -78,7 +78,7 @@ export function JobsCloseAutoAllocate({ bodyshop, joblines, form, disabled }) {
items: []
};
return bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber ? (
return bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || bodyshop.rr_dealerid ? (
<Dropdown menu={menu}>
<Button disabled={disabled}>{t("jobs.actions.dmsautoallocate")}</Button>
</Dropdown>

View File

@@ -45,7 +45,7 @@ export function JobsCloseExportButton({ bodyshop, currentUser, jobId, disabled,
const handleQbxml = async () => {
//Check if it's a CDK setup.
if (bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) {
if (bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || bodyshop.rr_dealerid) {
history(`/manage/dms?jobId=${jobId}`);
return;
}

View File

@@ -307,7 +307,7 @@ export function JobsDetailHeader({ job, bodyshop, disabled, insertAuditTrail, is
</DataLabel>
<DataLabel key="4" label={t("vehicles.fields.v_vin")}>
<VehicleVinDisplay>{`${job.v_vin || t("general.labels.na")}`}</VehicleVinDisplay>
{bodyshop.pbs_serialnumber || bodyshop.cdk_dealerid ? (
{bodyshop.pbs_serialnumber || bodyshop.cdk_dealerid || bodyshop.rr_dealerid ? (
job.v_vin?.length !== 17 ? (
<WarningFilled style={{ color: "tomato", marginLeft: ".3rem" }} />
) : null

View File

@@ -15,7 +15,7 @@ export const CalculateAllocationsTotals = (bodyshop, joblines, timetickets, adju
const r = {
opcode: value,
cost_center:
bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber
bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || bodyshop.rr_dealerid
? i18next.t(`joblines.fields.lbr_types.${value && value.toUpperCase()}`)
: responsibilitycenters.defaults.costs[value],
mod_lbr_ty: value,

View File

@@ -44,6 +44,7 @@ export async function checkPartnerStatus(bodyshop) {
// bodyshop &&
// (bodyshop.cdk_dealerid ||
// bodyshop.pbs_serialnumber ||
// bodyshop.rr_dealerid ||
// bodyshop.accountingconfig.qbo)
// )
// ) {

View File

@@ -196,7 +196,7 @@ export function PartsOrderListTableDrawerComponent({
quantity: pol.quantity,
actual_price: pol.act_price,
cost_center: pol.jobline?.part_type
? bodyshop.pbs_serialnumber || bodyshop.cdk_dealerid
? bodyshop.pbs_serialnumber || bodyshop.cdk_dealerid || bodyshop.rr_dealerid
? pol.jobline.part_type !== "PAE"
? pol.jobline.part_type
: null

View File

@@ -172,7 +172,7 @@ export function PartsOrderListTableComponent({
actual_price: pol.act_price,
cost_center: pol.jobline?.part_type
? bodyshop.pbs_serialnumber || bodyshop.cdk_dealerid
? bodyshop.pbs_serialnumber || bodyshop.cdk_dealerid || bodyshop.rr_dealerid
? pol.jobline.part_type !== "PAE"
? pol.jobline.part_type
: null

View File

@@ -331,7 +331,10 @@ export function ShopEmployeesFormComponent({ bodyshop }) {
{t("timetickets.labels.shift")}
</Select.Option>
{bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || Enhanced_Payroll.treatment === "on"
{bodyshop.cdk_dealerid ||
bodyshop.pbs_serialnumber ||
bodyshop.rr_dealerid ||
Enhanced_Payroll.treatment === "on"
? CiecaSelect(false, true)
: bodyshop.md_responsibility_centers.costs.map((c) => (
<Select.Option key={c.name} value={c.name}>

View File

@@ -61,7 +61,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) {
return (
<div>
<RbacWrapper action="shop:responsibilitycenter">
{(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && (
{(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || bodyshop.rr_dealerid) && (
<>
{bodyshop.cdk_dealerid && (
<DataLabel label={t("bodyshop.labels.dms.cdk_dealerid")}>{form.getFieldValue("cdk_dealerid")}</DataLabel>
@@ -384,7 +384,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) {
>
<Input onBlur={handleBlur} />
</Form.Item> */}
{(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && (
{(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || bodyshop.rr_dealerid) && (
<Form.Item
label={t("bodyshop.fields.dms.dms_acctnumber")}
key={`${index}dms_acctnumber`}
@@ -398,7 +398,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) {
<Input onBlur={handleBlur} />
</Form.Item>
)}
{(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && (
{(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || bodyshop.rr_dealerid) && (
<Form.Item
label={t("bodyshop.fields.dms.dms_wip_acctnumber")}
key={`${index}dms_wip_acctnumber`}
@@ -525,7 +525,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) {
>
<Input onBlur={handleBlur} />
</Form.Item>
{(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && (
{(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || bodyshop.rr_dealerid) && (
<Form.Item
label={t("bodyshop.fields.dms.dms_acctnumber")}
key={`${index}dms_acctnumber`}
@@ -576,7 +576,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) {
</Form.List>
</LayoutFormRow>
<SelectorDiv>
{(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && (
{(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || bodyshop.rr_dealerid) && (
<>
<LayoutFormRow id="mappingname" header={t("bodyshop.labels.dms.dms_allocations")}>
<Form.List name={["md_responsibility_centers", "dms_defaults"]}>
@@ -3790,7 +3790,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) {
>
<Input />
</Form.Item>
{(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && (
{(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || bodyshop.rr_dealerid) && (
<Form.Item
label={t("bodyshop.fields.dms.dms_acctnumber")}
rules={[
@@ -3889,7 +3889,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) {
>
<Input />
</Form.Item>
{(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && (
{(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || bodyshop.rr_dealerid) && (
<Form.Item
label={t("bodyshop.fields.dms.dms_acctnumber")}
rules={[
@@ -3985,7 +3985,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) {
>
<Input />
</Form.Item>
{(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && (
{(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || bodyshop.rr_dealerid) && (
<Form.Item
label={t("bodyshop.fields.dms.dms_acctnumber")}
rules={[
@@ -4113,7 +4113,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) {
{/* >*/}
{/* <Input />*/}
{/* </Form.Item>*/}
{/* {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && (*/}
{/* {(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || bodyshop.rr_dealerid) && (*/}
{/* <Form.Item*/}
{/* label={t("bodyshop.fields.dms.dms_acctnumber")}*/}
{/* rules={[*/}
@@ -4336,7 +4336,7 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) {
{InstanceRenderManager({
rome: (
<LayoutFormRow header={<div>Adjustments</div>} id="refund">
{bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber ? (
{bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || bodyshop.rr_dealerid ? (
<>
<Form.Item
label={t("bodyshop.labels.responsibilitycenters.ttl_adjustment")}

View File

@@ -2126,7 +2126,7 @@ function TaxFormItems({ typeNum, typeNumIterator, rootElements, bodyshop }) {
>
<Input />
</Form.Item>
{(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && (
{(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || bodyshop.rr_dealerid) && (
<Form.Item
label={t("bodyshop.fields.dms.dms_acctnumber")}
rules={[

View File

@@ -63,7 +63,10 @@ export function TechClockInComponent({ form, bodyshop, technician }) {
<Select.Option key={item.cost_center} value={item.cost_center}>
{item.cost_center === "timetickets.labels.shift"
? t(item.cost_center)
: bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || Enhanced_Payroll.treatment === "on"
: bodyshop.cdk_dealerid ||
bodyshop.pbs_serialnumber ||
bodyshop.rr_dealerid ||
Enhanced_Payroll.treatment === "on"
? t(`joblines.fields.lbr_types.${item.cost_center.toUpperCase()}`)
: item.cost_center}
</Select.Option>

View File

@@ -75,7 +75,10 @@ export function TechClockInContainer({ setTimeTicketContext, technician, bodysho
jobid: values.jobid,
cost_center: values.cost_center,
ciecacode:
bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || Enhanced_Payroll.treatment === "on"
bodyshop.cdk_dealerid ||
bodyshop.pbs_serialnumber ||
bodyshop.rr_dealerid ||
Enhanced_Payroll.treatment === "on"
? values.cost_center
: Object.keys(bodyshop.md_responsibility_centers.defaults.costs).find((key) => {
return bodyshop.md_responsibility_centers.defaults.costs[key] === values.cost_center;

View File

@@ -69,7 +69,10 @@ export function TechClockOffButton({
rate: emps && emps.rates.filter((r) => r.cost_center === values.cost_center)[0]?.rate,
flat_rate: emps && emps.flat_rate,
ciecacode:
bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || Enhanced_Payroll.treatment === "on"
bodyshop.cdk_dealerid ||
bodyshop.pbs_serialnumber ||
bodyshop.rr_dealerid ||
Enhanced_Payroll.treatment === "on"
? values.cost_center
: Object.keys(bodyshop.md_responsibility_centers.defaults.costs).find((key) => {
return bodyshop.md_responsibility_centers.defaults.costs[key] === values.cost_center;
@@ -165,7 +168,9 @@ export function TechClockOffButton({
);
const fieldTypeToCheck =
bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber ? "mod_lbr_ty" : "cost_center";
bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || bodyshop.rr_dealerid
? "mod_lbr_ty"
: "cost_center";
const costCenterDiff =
Math.round(
@@ -205,7 +210,7 @@ export function TechClockOffButton({
<Select.Option key={item.cost_center}>
{item.cost_center === "timetickets.labels.shift"
? t(item.cost_center)
: bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber
: bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || bodyshop.rr_dealerid
? t(`joblines.fields.lbr_types.${item.cost_center.toUpperCase()}`)
: item.cost_center}
</Select.Option>

View File

@@ -60,7 +60,10 @@ export function TimeTicketModalComponent({
<Select.Option key={item.cost_center} value={item.cost_center}>
{item.cost_center === "timetickets.labels.shift"
? t(item.cost_center)
: bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || Enhanced_Payroll.treatment === "on"
: bodyshop.cdk_dealerid ||
bodyshop.pbs_serialnumber ||
bodyshop.rr_dealerid ||
Enhanced_Payroll.treatment === "on"
? t(`joblines.fields.lbr_types.${item.cost_center.toUpperCase()}`)
: item.cost_center}
</Select.Option>
@@ -187,7 +190,9 @@ export function TimeTicketModalComponent({
);
const fieldTypeToCheck =
bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber ? "mod_lbr_ty" : "cost_center";
bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || bodyshop.rr_dealerid
? "mod_lbr_ty"
: "cost_center";
const costCenterDiff =
Math.round(

View File

@@ -137,7 +137,10 @@ export function TimeTicketModalContainer({ timeTicketModal, toggleModalVisible,
if (!!changedFields.cost_center && !!EmployeeAutoCompleteData) {
form.setFieldsValue({
ciecacode:
bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber || Enhanced_Payroll.treatment === "on"
bodyshop.cdk_dealerid ||
bodyshop.pbs_serialnumber ||
bodyshop.rr_dealerid ||
Enhanced_Payroll.treatment === "on"
? changedFields.cost_center
: Object.keys(bodyshop.md_responsibility_centers.defaults.costs).find(
(key) => bodyshop.md_responsibility_centers.defaults.costs[key] === changedFields.cost_center