Merged in release/2021-12/31 (pull request #321)

release/2021-12/31

Approved-by: Patrick Fic
This commit is contained in:
Patrick Fic
2021-12-28 19:04:38 +00:00
18 changed files with 209 additions and 258 deletions

View File

@@ -1,4 +1,4 @@
<babeledit_project be_version="2.7.1" version="1.2"> <babeledit_project version="1.2" be_version="2.7.1">
<!-- <!--
BabelEdit project file BabelEdit project file
@@ -4000,6 +4000,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>ignoreblockeddays</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node> <concept_node>
<name>inhousevendorid</name> <name>inhousevendorid</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -4045,6 +4066,27 @@
<folder_node> <folder_node>
<name>intake</name> <name>intake</name>
<children> <children>
<concept_node>
<name>next_contact_hours</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node> <concept_node>
<name>templates</name> <name>templates</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -9990,6 +10032,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>length</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node> <concept_node>
<name>localtax</name> <name>localtax</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>

View File

@@ -1,232 +1 @@
[ []
{
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"email": "Sincere@april.biz",
"address": {
"street": "Kulas Light",
"suite": "Apt. 556",
"city": "Gwenborough",
"zipcode": "92998-3874",
"geo": {
"lat": "-37.3159",
"lng": "81.1496"
}
},
"phone": "1-770-736-8031 x56442",
"website": "hildegard.org",
"company": {
"name": "Romaguera-Crona",
"catchPhrase": "Multi-layered client-server neural-net",
"bs": "harness real-time e-markets"
}
},
{
"id": 2,
"name": "Ervin Howell",
"username": "Antonette",
"email": "Shanna@melissa.tv",
"address": {
"street": "Victor Plains",
"suite": "Suite 879",
"city": "Wisokyburgh",
"zipcode": "90566-7771",
"geo": {
"lat": "-43.9509",
"lng": "-34.4618"
}
},
"phone": "010-692-6593 x09125",
"website": "anastasia.net",
"company": {
"name": "Deckow-Crist",
"catchPhrase": "Proactive didactic contingency",
"bs": "synergize scalable supply-chains"
}
},
{
"id": 3,
"name": "Clementine Bauch",
"username": "Samantha",
"email": "Nathan@yesenia.net",
"address": {
"street": "Douglas Extension",
"suite": "Suite 847",
"city": "McKenziehaven",
"zipcode": "59590-4157",
"geo": {
"lat": "-68.6102",
"lng": "-47.0653"
}
},
"phone": "1-463-123-4447",
"website": "ramiro.info",
"company": {
"name": "Romaguera-Jacobson",
"catchPhrase": "Face to face bifurcated interface",
"bs": "e-enable strategic applications"
}
},
{
"id": 4,
"name": "Patricia Lebsack",
"username": "Karianne",
"email": "Julianne.OConner@kory.org",
"address": {
"street": "Hoeger Mall",
"suite": "Apt. 692",
"city": "South Elvis",
"zipcode": "53919-4257",
"geo": {
"lat": "29.4572",
"lng": "-164.2990"
}
},
"phone": "493-170-9623 x156",
"website": "kale.biz",
"company": {
"name": "Robel-Corkery",
"catchPhrase": "Multi-tiered zero tolerance productivity",
"bs": "transition cutting-edge web services"
}
},
{
"id": 5,
"name": "Chelsey Dietrich",
"username": "Kamren",
"email": "Lucio_Hettinger@annie.ca",
"address": {
"street": "Skiles Walks",
"suite": "Suite 351",
"city": "Roscoeview",
"zipcode": "33263",
"geo": {
"lat": "-31.8129",
"lng": "62.5342"
}
},
"phone": "(254)954-1289",
"website": "demarco.info",
"company": {
"name": "Keebler LLC",
"catchPhrase": "User-centric fault-tolerant solution",
"bs": "revolutionize end-to-end systems"
}
},
{
"id": 6,
"name": "Mrs. Dennis Schulist",
"username": "Leopoldo_Corkery",
"email": "Karley_Dach@jasper.info",
"address": {
"street": "Norberto Crossing",
"suite": "Apt. 950",
"city": "South Christy",
"zipcode": "23505-1337",
"geo": {
"lat": "-71.4197",
"lng": "71.7478"
}
},
"phone": "1-477-935-8478 x6430",
"website": "ola.org",
"company": {
"name": "Considine-Lockman",
"catchPhrase": "Synchronised bottom-line interface",
"bs": "e-enable innovative applications"
}
},
{
"id": 7,
"name": "Kurtis Weissnat",
"username": "Elwyn.Skiles",
"email": "Telly.Hoeger@billy.biz",
"address": {
"street": "Rex Trail",
"suite": "Suite 280",
"city": "Howemouth",
"zipcode": "58804-1099",
"geo": {
"lat": "24.8918",
"lng": "21.8984"
}
},
"phone": "210.067.6132",
"website": "elvis.io",
"company": {
"name": "Johns Group",
"catchPhrase": "Configurable multimedia task-force",
"bs": "generate enterprise e-tailers"
}
},
{
"id": 8,
"name": "Nicholas Runolfsdottir V",
"username": "Maxime_Nienow",
"email": "Sherwood@rosamond.me",
"address": {
"street": "Ellsworth Summit",
"suite": "Suite 729",
"city": "Aliyaview",
"zipcode": "45169",
"geo": {
"lat": "-14.3990",
"lng": "-120.7677"
}
},
"phone": "586.493.6943 x140",
"website": "jacynthe.com",
"company": {
"name": "Abernathy Group",
"catchPhrase": "Implemented secondary concept",
"bs": "e-enable extensible e-tailers"
}
},
{
"id": 9,
"name": "Glenna Reichert",
"username": "Delphine",
"email": "Chaim_McDermott@dana.io",
"address": {
"street": "Dayna Park",
"suite": "Suite 449",
"city": "Bartholomebury",
"zipcode": "76495-3109",
"geo": {
"lat": "24.6463",
"lng": "-168.8889"
}
},
"phone": "(775)976-6794 x41206",
"website": "conrad.com",
"company": {
"name": "Yost and Sons",
"catchPhrase": "Switchable contextually-based project",
"bs": "aggregate real-time technologies"
}
},
{
"id": 10,
"name": "Clementina DuBuque",
"username": "Moriah.Stanton",
"email": "Rey.Padberg@karina.biz",
"address": {
"street": "Kattie Turnpike",
"suite": "Suite 198",
"city": "Lebsackbury",
"zipcode": "31428-2261",
"geo": {
"lat": "-38.2386",
"lng": "57.2232"
}
},
"phone": "024-648-3804",
"website": "ambrose.net",
"company": {
"name": "Hoeger LLC",
"catchPhrase": "Centralized empowering task-force",
"bs": "target end-to-end models"
}
}
]

View File

@@ -11,6 +11,7 @@ import { setModalContext } from "../../redux/modals/modals.actions";
import { connect } from "react-redux"; import { connect } from "react-redux";
import { createStructuredSelector } from "reselect"; import { createStructuredSelector } from "reselect";
import moment from "moment";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
//currentUser: selectCurrentUser //currentUser: selectCurrentUser
}); });
@@ -86,7 +87,9 @@ export function ContractsList({
} ${record.courtesycar.make} ${record.courtesycar.model}${ } ${record.courtesycar.make} ${record.courtesycar.model}${
record.courtesycar.plate ? ` (${record.courtesycar.plate})` : "" record.courtesycar.plate ? ` (${record.courtesycar.plate})` : ""
}${ }${
record.courtesycar.fleetnumber ? ` (${record.courtesycar.fleetnumber})` : "" record.courtesycar.fleetnumber
? ` (${record.courtesycar.fleetnumber})`
: ""
}`}</Link> }`}</Link>
), ),
}, },
@@ -133,6 +136,19 @@ export function ContractsList({
<DateTimeFormatter>{record.actualreturn}</DateTimeFormatter> <DateTimeFormatter>{record.actualreturn}</DateTimeFormatter>
), ),
}, },
{
title: t("contracts.fields.length"),
dataIndex: "length",
key: "length",
render: (text, record) =>
(record.actualreturn &&
record.start &&
`${moment(record.actualreturn)
.diff(moment(record.start), "days", true)
.toFixed(1)} days`) ||
"",
},
]; ];
const handleTableChange = (pagination, filters, sorter) => { const handleTableChange = (pagination, filters, sorter) => {

View File

@@ -21,9 +21,9 @@ export const handleUpload = (ev, context) => {
const fileName = ev.file.name || ev.filename; const fileName = ev.file.name || ev.filename;
let key = `${bodyshop.id}/${jobId}/${fileName.replace( let key = `${bodyshop.id}/${jobId}/${replaceAccents(fileName).replace(
/\.[^/.]+$/, /[^A-Z0-9]+/gi,
"" "_"
)}-${new Date().getTime()}`; )}-${new Date().getTime()}`;
let extension = fileName.split(".").pop(); let extension = fileName.split(".").pop();
uploadToCloudinary( uploadToCloudinary(
@@ -187,3 +187,33 @@ export function DetermineFileType(filetype) {
return "auto"; return "auto";
} }
function replaceAccents(str) {
// Verifies if the String has accents and replace them
if (str.search(/[\xC0-\xFF]/g) > -1) {
str = str
.replace(/[\xC0-\xC5]/g, "A")
.replace(/[\xC6]/g, "AE")
.replace(/[\xC7]/g, "C")
.replace(/[\xC8-\xCB]/g, "E")
.replace(/[\xCC-\xCF]/g, "I")
.replace(/[\xD0]/g, "D")
.replace(/[\xD1]/g, "N")
.replace(/[\xD2-\xD6\xD8]/g, "O")
.replace(/[\xD9-\xDC]/g, "U")
.replace(/[\xDD]/g, "Y")
.replace(/[\xDE]/g, "P")
.replace(/[\xE0-\xE5]/g, "a")
.replace(/[\xE6]/g, "ae")
.replace(/[\xE7]/g, "c")
.replace(/[\xE8-\xEB]/g, "e")
.replace(/[\xEC-\xEF]/g, "i")
.replace(/[\xF1]/g, "n")
.replace(/[\xF2-\xF6\xF8]/g, "o")
.replace(/[\xF9-\xFC]/g, "u")
.replace(/[\xFE]/g, "p")
.replace(/[\xFD\xFF]/g, "y");
}
return str;
}

View File

@@ -79,9 +79,19 @@ export function JobChecklistForm({
...(type === "intake" && { ...(type === "intake" && {
scheduled_completion: values.scheduled_completion, scheduled_completion: values.scheduled_completion,
}), }),
...(type === "intake" &&
bodyshop.intakechecklist &&
bodyshop.intakechecklist.next_contact_hours &&
bodyshop.intakechecklist.next_contact_hours > 0 && {
date_next_contact: moment().add(
bodyshop.intakechecklist.next_contact_hours,
"hours"
),
}),
...(type === "deliver" && { ...(type === "deliver" && {
actual_completion: values.actual_completion, actual_completion: values.actual_completion,
}), }),
[(type === "intake" && "intakechecklist") || [(type === "intake" && "intakechecklist") ||
(type === "deliver" && "deliverchecklist")]: { (type === "deliver" && "deliverchecklist")]: {
...values, ...values,

View File

@@ -33,6 +33,7 @@ export function ProductionColumnsComponent({
setColumns([ setColumns([
...columns, ...columns,
...dataSource({ ...dataSource({
bodyshop,
technician, technician,
state: tableState, state: tableState,
activeStatuses: bodyshop.md_ro_statuses.active_statuses, activeStatuses: bodyshop.md_ro_statuses.active_statuses,

View File

@@ -18,7 +18,7 @@ import ProductionListColumnNote from "./production-list-columns.productionnote.c
import ProductionListColumnStatus from "./production-list-columns.status.component"; import ProductionListColumnStatus from "./production-list-columns.status.component";
import ProductionlistColumnTouchTime from "./prodution-list-columns.touchtime.component"; import ProductionlistColumnTouchTime from "./prodution-list-columns.touchtime.component";
const r = ({ technician, state, activeStatuses }) => { const r = ({ technician, state, activeStatuses, bodyshop }) => {
return [ return [
{ {
title: i18n.t("jobs.actions.viewdetail"), title: i18n.t("jobs.actions.viewdetail"),
@@ -353,6 +353,14 @@ const r = ({ technician, state, activeStatuses }) => {
title: i18n.t("jobs.fields.employee_body"), title: i18n.t("jobs.fields.employee_body"),
dataIndex: "employee_body", dataIndex: "employee_body",
key: "employee_body", key: "employee_body",
sortOrder:
state.sortedInfo.columnKey === "employee_body" &&
state.sortedInfo.order,
sorter: (a, b) =>
alphaSort(
bodyshop.employees.find((e) => e.id === a.employee_body)?.first_name,
bodyshop.employees.find((e) => e.id === b.employee_body)?.first_name
),
render: (text, record) => ( render: (text, record) => (
<ProductionListEmployeeAssignment <ProductionListEmployeeAssignment
record={record} record={record}
@@ -364,6 +372,14 @@ const r = ({ technician, state, activeStatuses }) => {
title: i18n.t("jobs.fields.employee_prep"), title: i18n.t("jobs.fields.employee_prep"),
dataIndex: "employee_prep", dataIndex: "employee_prep",
key: "employee_prep", key: "employee_prep",
sortOrder:
state.sortedInfo.columnKey === "employee_prep" &&
state.sortedInfo.order,
sorter: (a, b) =>
alphaSort(
bodyshop.employees.find((e) => e.id === a.employee_prep)?.first_name,
bodyshop.employees.find((e) => e.id === b.employee_prep)?.first_name
),
render: (text, record) => ( render: (text, record) => (
<ProductionListEmployeeAssignment <ProductionListEmployeeAssignment
record={record} record={record}
@@ -375,6 +391,13 @@ const r = ({ technician, state, activeStatuses }) => {
title: i18n.t("jobs.fields.employee_csr"), title: i18n.t("jobs.fields.employee_csr"),
dataIndex: "employee_csr", dataIndex: "employee_csr",
key: "employee_csr", key: "employee_csr",
sortOrder:
state.sortedInfo.columnKey === "employee_csr" && state.sortedInfo.order,
sorter: (a, b) =>
alphaSort(
bodyshop.employees.find((e) => e.id === a.employee_csr)?.first_name,
bodyshop.employees.find((e) => e.id === b.employee_csr)?.first_name
),
render: (text, record) => ( render: (text, record) => (
<ProductionListEmployeeAssignment record={record} type="employee_csr" /> <ProductionListEmployeeAssignment record={record} type="employee_csr" />
), ),
@@ -383,6 +406,16 @@ const r = ({ technician, state, activeStatuses }) => {
title: i18n.t("jobs.fields.employee_refinish"), title: i18n.t("jobs.fields.employee_refinish"),
dataIndex: "employee_refinish", dataIndex: "employee_refinish",
key: "employee_refinish", key: "employee_refinish",
sortOrder:
state.sortedInfo.columnKey === "employee_refinish" &&
state.sortedInfo.order,
sorter: (a, b) =>
alphaSort(
bodyshop.employees.find((e) => e.id === a.employee_refinish)
?.first_name,
bodyshop.employees.find((e) => e.id === b.employee_refinish)
?.first_name
),
render: (text, record) => ( render: (text, record) => (
<ProductionListEmployeeAssignment <ProductionListEmployeeAssignment
record={record} record={record}

View File

@@ -38,6 +38,7 @@ export function ProductionListTable({
.columns.columnKeys.map((k) => { .columns.columnKeys.map((k) => {
return { return {
...ProductionListColumns({ ...ProductionListColumns({
bodyshop,
technician, technician,
state, state,
activeStatuses: bodyshop.md_ro_statuses.active_statuses, activeStatuses: bodyshop.md_ro_statuses.active_statuses,

View File

@@ -76,6 +76,7 @@ export function ProductionListTable({
matchingColumnConfig.columns.columnKeys.map((k) => { matchingColumnConfig.columns.columnKeys.map((k) => {
return { return {
...ProductionListColumns({ ...ProductionListColumns({
bodyshop,
technician, technician,
state, state,
activeStatuses: bodyshop.md_ro_statuses.active_statuses, activeStatuses: bodyshop.md_ro_statuses.active_statuses,

View File

@@ -43,19 +43,28 @@ export function ScoreboardDisplayComponent({
useEffect(() => { useEffect(() => {
//Update the locals. //Update the locals.
async function setMomentSettings() { async function setMomentSettings() {
const { let appointments;
data: { appointments },
} = await client.query({ if (!bodyshop.scoreboard_target.ignoreblockeddays) {
query: GET_BLOCKED_DAYS, const { data } = await client.query({
variables: { query: GET_BLOCKED_DAYS,
start: moment().startOf("month"), variables: {
end: moment().endOf("month"), start: moment().startOf("month"),
}, end: moment().endOf("month"),
}); },
});
appointments = data.appointments;
}
moment.updateLocale("ca", { moment.updateLocale("ca", {
workingWeekdays: translateSettingsToWorkingDays(bodyshop.workingdays), workingWeekdays: translateSettingsToWorkingDays(bodyshop.workingdays),
holidays: appointments.map((h) => moment(h.start).format("MM-DD-YYYY")), ...(appointments
? {
holidays: appointments.map((h) =>
moment(h.start).format("MM-DD-YYYY")
),
}
: {}),
holidayFormat: "MM-DD-YYYY", holidayFormat: "MM-DD-YYYY",
}); });
} }

View File

@@ -354,6 +354,13 @@ export default function ShopInfoGeneral({ form }) {
> >
<InputNumber min={0} max={12} precision={0} /> <InputNumber min={0} max={12} precision={0} />
</Form.Item> </Form.Item>
<Form.Item
label={t("bodyshop.fields.ignoreblockeddays")}
name={["scoreboard_target", "ignoreblockeddays"]}
valuePropName="checked"
>
<Switch />
</Form.Item>
<Form.Item <Form.Item
label={t("bodyshop.fields.prodtargethrs")} label={t("bodyshop.fields.prodtargethrs")}
name={["prodtargethrs"]} name={["prodtargethrs"]}
@@ -472,7 +479,6 @@ export default function ShopInfoGeneral({ form }) {
label={t("bodyshop.fields.md_email_cc", { template: "parts_order" })} label={t("bodyshop.fields.md_email_cc", { template: "parts_order" })}
rules={[ rules={[
{ {
//message: t("general.validation.required"), //message: t("general.validation.required"),
type: "array", type: "array",
}, },
@@ -492,7 +498,6 @@ export default function ShopInfoGeneral({ form }) {
label={t("bodyshop.fields.md_ded_notes")} label={t("bodyshop.fields.md_ded_notes")}
rules={[ rules={[
{ {
//message: t("general.validation.required"), //message: t("general.validation.required"),
type: "array", type: "array",
}, },

View File

@@ -180,6 +180,12 @@ export default function ShopInfoIntakeChecklistComponent({ form }) {
))} ))}
</Select> </Select>
</Form.Item> </Form.Item>
<Form.Item
name={["intakechecklist", "next_contact_hours"]}
label={t("bodyshop.fields.intake.next_contact_hours")}
>
<InputNumber min={0} precision={0} />
</Form.Item>
</SelectorDiv> </SelectorDiv>
<LayoutFormRow header={t("bodyshop.labels.deliverchecklist")}> <LayoutFormRow header={t("bodyshop.labels.deliverchecklist")}>

View File

@@ -124,6 +124,7 @@ export const Banner00DataSource = {
button: { button: {
className: "banner0-button", className: "banner0-button",
children: i18n.t("landing.hero.button"), children: i18n.t("landing.hero.button"),
href: "https://imexsystems.ca",
}, },
}; };
export const Content40DataSource = { export const Content40DataSource = {

View File

@@ -58,13 +58,6 @@ export default class Home extends React.Component {
}, 500); }, 500);
} }
/* 如果不是 dva 2.0 请删除 end */ /* 如果不是 dva 2.0 请删除 end */
window.$crisp.push(["set", "session:segments", [["lead"]]]);
window.$crisp.push([
"set",
"session:event",
[[["landing-page", {}, "green"]]],
]);
} }
render() { render() {

View File

@@ -48,3 +48,7 @@ initMessageListener(store);
export const persistor = persistStore(store); export const persistor = persistStore(store);
const e = { store, persistStore }; const e = { store, persistStore };
export default e; export default e;
if (window.Cypress) {
window.store = store;
}

View File

@@ -253,9 +253,11 @@
"enforce_class": "Enforce Class on Conversion?", "enforce_class": "Enforce Class on Conversion?",
"enforce_referral": "Enforce Referrals", "enforce_referral": "Enforce Referrals",
"federal_tax_id": "Federal Tax ID (GST/HST)", "federal_tax_id": "Federal Tax ID (GST/HST)",
"ignoreblockeddays": "Scoreboard - Ignore Blocked Days",
"inhousevendorid": "In House Vendor ID", "inhousevendorid": "In House Vendor ID",
"insurance_vendor_id": "Insurance Vendor ID", "insurance_vendor_id": "Insurance Vendor ID",
"intake": { "intake": {
"next_contact_hours": "Automatic Next Contact Date - Hours from Intake",
"templates": "Intake Templates" "templates": "Intake Templates"
}, },
"invoice_federal_tax_rate": "Invoices - Federal Tax Rate", "invoice_federal_tax_rate": "Invoices - Federal Tax Rate",
@@ -614,6 +616,7 @@
"fuelout": "Fuel Out", "fuelout": "Fuel Out",
"kmend": "Mileage End", "kmend": "Mileage End",
"kmstart": "Mileage Start", "kmstart": "Mileage Start",
"length": "Length",
"localtax": "Local Taxes", "localtax": "Local Taxes",
"refuelcharge": "Refuel Charge (per liter/gallon)", "refuelcharge": "Refuel Charge (per liter/gallon)",
"scheduledreturn": "Scheduled Return", "scheduledreturn": "Scheduled Return",
@@ -1628,7 +1631,7 @@
"slogan": "A whole new kind of shop management system." "slogan": "A whole new kind of shop management system."
}, },
"hero": { "hero": {
"button": "Coming Soon", "button": "Learn More",
"title": "A whole new kind of shop management system." "title": "A whole new kind of shop management system."
}, },
"labels": { "labels": {

View File

@@ -253,9 +253,11 @@
"enforce_class": "", "enforce_class": "",
"enforce_referral": "", "enforce_referral": "",
"federal_tax_id": "", "federal_tax_id": "",
"ignoreblockeddays": "",
"inhousevendorid": "", "inhousevendorid": "",
"insurance_vendor_id": "", "insurance_vendor_id": "",
"intake": { "intake": {
"next_contact_hours": "",
"templates": "" "templates": ""
}, },
"invoice_federal_tax_rate": "", "invoice_federal_tax_rate": "",
@@ -614,6 +616,7 @@
"fuelout": "", "fuelout": "",
"kmend": "", "kmend": "",
"kmstart": "", "kmstart": "",
"length": "",
"localtax": "", "localtax": "",
"refuelcharge": "", "refuelcharge": "",
"scheduledreturn": "", "scheduledreturn": "",

View File

@@ -253,9 +253,11 @@
"enforce_class": "", "enforce_class": "",
"enforce_referral": "", "enforce_referral": "",
"federal_tax_id": "", "federal_tax_id": "",
"ignoreblockeddays": "",
"inhousevendorid": "", "inhousevendorid": "",
"insurance_vendor_id": "", "insurance_vendor_id": "",
"intake": { "intake": {
"next_contact_hours": "",
"templates": "" "templates": ""
}, },
"invoice_federal_tax_rate": "", "invoice_federal_tax_rate": "",
@@ -614,6 +616,7 @@
"fuelout": "", "fuelout": "",
"kmend": "", "kmend": "",
"kmstart": "", "kmstart": "",
"length": "",
"localtax": "", "localtax": "",
"refuelcharge": "", "refuelcharge": "",
"scheduledreturn": "", "scheduledreturn": "",