Merged in feature/america (pull request #790)

Feature/america
This commit is contained in:
Patrick Fic
2023-05-17 14:52:41 +00:00
22 changed files with 674 additions and 179 deletions

View File

@@ -3602,6 +3602,27 @@
<folder_node> <folder_node>
<name>actions</name> <name>actions</name>
<children> <children>
<concept_node>
<name>add_task_preset</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>addapptcolor</name> <name>addapptcolor</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -5584,6 +5605,95 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<folder_node>
<name>md_tasks_presets</name>
<children>
<concept_node>
<name>hourstype</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>
<name>memo</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>
<name>name</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>
<name>percent</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>
</children>
</folder_node>
<concept_node> <concept_node>
<name>messaginglabel</name> <name>messaginglabel</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -9771,6 +9881,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>md_tasks_presets</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>md_to_emails</name> <name>md_to_emails</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -10280,6 +10411,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>task-presets</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>workingdays</name> <name>workingdays</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -14809,6 +14961,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>newmember</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>
</children> </children>
</folder_node> </folder_node>
<folder_node> <folder_node>
@@ -14835,6 +15008,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>employeeid</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>name</name> <name>name</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -14856,6 +15050,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>percentage</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>
</children> </children>
</folder_node> </folder_node>
</children> </children>

View File

@@ -52,7 +52,7 @@ function PaymentModalContainer({
const { useStripe, sendby, ...paymentObj } = values; const { useStripe, sendby, ...paymentObj } = values;
setLoading(true); setLoading(true);
let updatedPayment; //Moved up from if statement for greater scope.
try { try {
if (!context || (context && !context.id)) { if (!context || (context && !context.id)) {
const newPayment = await insertPayment({ const newPayment = await insertPayment({
@@ -87,7 +87,7 @@ function PaymentModalContainer({
); );
} }
} else { } else {
const updatedPayment = await updatePayment({ updatedPayment = await updatePayment({
variables: { variables: {
paymentId: context.id, paymentId: context.id,
payment: paymentObj, payment: paymentObj,
@@ -101,7 +101,11 @@ function PaymentModalContainer({
} }
} }
if (actions.refetch) actions.refetch(); if (actions.refetch)
actions.refetch(
updatedPayment && updatedPayment.data.update_payments.returning[0]
);
if (enterAgain) { if (enterAgain) {
const prev = form.getFieldsValue(["date"]); const prev = form.getFieldsValue(["date"]);

View File

@@ -169,7 +169,20 @@ export function PaymentsListPaginated({
apolloResults = data.payments_by_pk; apolloResults = data.payments_by_pk;
} }
setPaymentContext({ setPaymentContext({
actions: { refetch: refetch }, actions: {
refetch: apolloResults
? (updatedRecord) => {
setOpenSearchResults((results) =>
results.map((result) => {
if (result.id !== record.id) {
return result;
}
return updatedRecord;
})
);
}
: refetch,
},
context: apolloResults ? apolloResults : record, context: apolloResults ? apolloResults : record,
}); });
}} }}

View File

@@ -29,7 +29,10 @@ export function PrintCenterJobsComponent({ printCenterModal, bodyshop }) {
}) })
.filter( .filter(
(temp) => (temp) =>
!temp.regions || (temp.regions && temp.regions[bodyshop.region_config]) !temp.regions ||
(temp.regions && temp.regions[bodyshop.region_config]) ||
(temp.regions &&
bodyshop.region_config.includes(Object.keys(temp.regions)) === true)
); );
const filteredJobsReportsList = const filteredJobsReportsList =

View File

@@ -1,5 +1,6 @@
import Dinero from "dinero.js";
import { Card } from "antd"; import { Card } from "antd";
import Dinero from "dinero.js";
import _ from "lodash";
import moment from "moment"; import moment from "moment";
import React from "react"; import React from "react";
import { connect } from "react-redux"; import { connect } from "react-redux";
@@ -18,7 +19,6 @@ import {
import { createStructuredSelector } from "reselect"; import { createStructuredSelector } from "reselect";
import { selectBodyshop } from "../../redux/user/user.selectors"; import { selectBodyshop } from "../../redux/user/user.selectors";
import * as Utils from "../scoreboard-targets-table/scoreboard-targets-table.util"; import * as Utils from "../scoreboard-targets-table/scoreboard-targets-table.util";
import _ from "lodash";
import CustomTooltip from "./chart-custom-tooltip"; import CustomTooltip from "./chart-custom-tooltip";
const graphProps = { const graphProps = {
@@ -71,7 +71,9 @@ export function ScoreboardChart({ sbEntriesByDate, bodyshop }) {
bodyshop.scoreboard_target.dailyBodyTarget + bodyshop.scoreboard_target.dailyBodyTarget +
bodyshop.scoreboard_target.dailyPaintTarget, bodyshop.scoreboard_target.dailyPaintTarget,
val val
), ) +
bodyshop.scoreboard_target.dailyBodyTarget +
bodyshop.scoreboard_target.dailyPaintTarget,
1 1
), ),
accHrs: _.round( accHrs: _.round(

View File

@@ -15,6 +15,7 @@ import ShopInfoResponsibilityCenterComponent from "./shop-info.responsibilitycen
import ShopInfoROStatusComponent from "./shop-info.rostatus.component"; import ShopInfoROStatusComponent from "./shop-info.rostatus.component";
import ShopInfoSchedulingComponent from "./shop-info.scheduling.component"; import ShopInfoSchedulingComponent from "./shop-info.scheduling.component";
import ShopInfoSpeedPrint from "./shop-info.speedprint.component"; import ShopInfoSpeedPrint from "./shop-info.speedprint.component";
import ShopInfoTaskPresets from "./shop-info.task-presets.component";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop, bodyshop: selectBodyshop,
@@ -83,6 +84,12 @@ export function ShopInfoComponent({ bodyshop, form, saveLoading }) {
<ShopInfoPartsScan form={form} /> <ShopInfoPartsScan form={form} />
</Tabs.TabPane> </Tabs.TabPane>
)} )}
<Tabs.TabPane
key="task-presets"
tab={t("bodyshop.labels.task-presets")}
>
<ShopInfoTaskPresets form={form} />
</Tabs.TabPane>
</Tabs> </Tabs>
</Card> </Card>
); );

View File

@@ -0,0 +1,144 @@
import { DeleteFilled } from "@ant-design/icons";
import {
Button,
Checkbox,
Col,
Form,
Input,
InputNumber,
Row,
Space,
} from "antd";
import React from "react";
import { useTranslation } from "react-i18next";
import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component";
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
export default function ShopInfoTaskPresets({ form }) {
const { t } = useTranslation();
return (
<LayoutFormRow header={t("bodyshop.labels.md_tasks_presets")}>
<Form.List name={["md_tasks_presets", "presets"]}>
{(fields, { add, remove, move }) => {
return (
<div>
{fields.map((field, index) => (
<Form.Item key={field.key}>
<LayoutFormRow noDivider>
<Form.Item
label={t("bodyshop.fields.md_tasks_presets.name")}
key={`${index}name`}
name={[field.name, "name"]}
rules={[
{
required: true,
//message: t("general.validation.required"),
},
]}
>
<Input />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.md_tasks_presets.hourstype")}
key={`${index}hourstype`}
name={[field.name, "hourstype"]}
rules={[
{
required: true,
//message: t("general.validation.required"),
},
]}
>
<Checkbox.Group>
<Row>
<Col span={8}>
<Checkbox
value="LAB"
style={{ lineHeight: "32px" }}
>
{t("joblines.fields.lbr_types.LAB")}
</Checkbox>
</Col>
<Col span={8}>
<Checkbox
value="LAR"
style={{ lineHeight: "32px" }}
>
{t("joblines.fields.lbr_types.LAR")}
</Checkbox>
</Col>
<Col span={8}>
<Checkbox
value="LAM"
style={{ lineHeight: "32px" }}
>
{t("joblines.fields.lbr_types.LAM")}
</Checkbox>
</Col>
<Col span={8}>
<Checkbox
value="LAF"
style={{ lineHeight: "32px" }}
>
{t("joblines.fields.lbr_types.LAF")}
</Checkbox>
</Col>
<Col span={8}>
<Checkbox
value="LAG"
style={{ lineHeight: "32px" }}
>
{t("joblines.fields.lbr_types.LAG")}
</Checkbox>
</Col>
</Row>
</Checkbox.Group>
</Form.Item>
<Form.Item
label={t("bodyshop.fields.md_tasks_presets.percent")}
key={`${index}percent`}
name={[field.name, "percent"]}
>
<InputNumber min={0} max={100} />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.md_tasks_presets.memo")}
key={`${index}memo`}
name={[field.name, "memo"]}
>
<Input />
</Form.Item>
<Space wrap>
<DeleteFilled
onClick={() => {
remove(field.name);
}}
/>
<FormListMoveArrows
move={move}
index={index}
total={fields.length}
/>
</Space>
</LayoutFormRow>
</Form.Item>
))}
<Form.Item>
<Button
type="dashed"
onClick={() => {
add();
}}
style={{ width: "100%" }}
>
{t("bodyshop.actions.add_task_preset")}
</Button>
</Form.Item>
</div>
);
}}
</Form.List>
</LayoutFormRow>
);
}

View File

@@ -52,6 +52,10 @@ export function TimeTickeTaskModalContainer({
}); });
async function handleFinish(values) { async function handleFinish(values) {
console.log(
"🚀 ~ file: time-ticket-task-modal.container.jsx:55 ~ handleFinish ~ values:",
values
);
try { try {
if (true) { if (true) {
const result = await insertTimeTicketApproval({ const result = await insertTimeTicketApproval({
@@ -112,7 +116,6 @@ export function TimeTickeTaskModalContainer({
}, [context.jobid, queryJobInfo, visible]); }, [context.jobid, queryJobInfo, visible]);
const calculateTimeTickets = (presetMemo) => { const calculateTimeTickets = (presetMemo) => {
console.log("🚀 ~ file: time-ticket-task-modal.container.jsx:115 ~ calculateTimeTickets ~ presetMemo:", presetMemo)
const formData = form.getFieldsValue(); const formData = form.getFieldsValue();
if ( if (
!formData.jobid || !formData.jobid ||
@@ -147,7 +150,7 @@ export function TimeTickeTaskModalContainer({
jobid: formData.jobid, jobid: formData.jobid,
rate: e.labor_rates[hourstype], rate: e.labor_rates[hourstype],
actualhrs: 0, actualhrs: 0,
memo: presetMemo, memo: typeof presetMemo === "string" ? presetMemo : "",
flat_rate: true, flat_rate: true,
ciecacode: hourstype, ciecacode: hourstype,
cost_center: cost_center:

View File

@@ -1,12 +1,28 @@
import { Button, Dropdown } from "antd"; import { Button, Dropdown } from "antd";
import React from "react"; import React from "react";
export default function TimeTicketsTasksPresets({ import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
import { selectBodyshop } from "../../redux/user/user.selectors";
const mapStateToProps = createStructuredSelector({
//currentUser: selectCurrentUser
bodyshop: selectBodyshop,
});
const mapDispatchToProps = (dispatch) => ({
//setUserLanguage: language => dispatch(setUserLanguage(language))
});
export default connect(
mapStateToProps,
mapDispatchToProps
)(TimeTicketsTasksPresets);
export function TimeTicketsTasksPresets({
bodyshop,
form, form,
calculateTimeTickets, calculateTimeTickets,
}) { }) {
const handleClick = (props) => { const handleClick = (props) => {
const preset = samplePresets.find((p) => { const preset = bodyshop.md_tasks_presets?.presets?.find((p) => {
return p.name === props.key; return p.name === props.key;
}); });
@@ -24,7 +40,12 @@ export default function TimeTicketsTasksPresets({
<Dropdown <Dropdown
trigger="click" trigger="click"
menu={{ menu={{
items: samplePresets.map((p) => ({ label: p.name, key: p.name })), items: bodyshop.md_tasks_presets?.presets
? bodyshop.md_tasks_presets?.presets?.map((p) => ({
label: p.name,
key: p.name,
}))
: [],
onClick: handleClick, onClick: handleClick,
}} }}
> >
@@ -33,19 +54,19 @@ export default function TimeTicketsTasksPresets({
); );
} }
const samplePresets = [ // const samplePresets = [
{ // {
name: "Teardown", // name: "Teardown",
hourstype: ["LAB", "LAM"], // hourstype: ["LAB", "LAM"],
percent: 10, // percent: 10,
memo: "Teardown Preset Task", // memo: "Teardown Preset Task",
}, // },
{ // {
name: "Disassembly", // name: "Disassembly",
hourstype: ["LAB", "LAD"], // hourstype: ["LAB", "LAD"],
percent: 20, // percent: 20,
memo: "Disassy Preset Claim", // memo: "Disassy Preset Claim",
}, // },
{ name: "Body", hourstype: ["LAB", "LAD"], percent: 20 }, // { name: "Body", hourstype: ["LAB", "LAD"], percent: 20 },
{ name: "Prep", hourstype: ["LAR"], percent: 20 }, // { name: "Prep", hourstype: ["LAR"], percent: 20 },
]; // ];

View File

@@ -117,6 +117,7 @@ export const QUERY_BODYSHOP = gql`
md_parts_scan md_parts_scan
enforce_conversion_category enforce_conversion_category
tt_enforce_hours_for_tech_console tt_enforce_hours_for_tech_console
md_tasks_presets
use_paint_scale_data use_paint_scale_data
employees { employees {
user_email user_email
@@ -233,6 +234,7 @@ export const UPDATE_SHOP = gql`
md_parts_scan md_parts_scan
enforce_conversion_category enforce_conversion_category
tt_enforce_hours_for_tech_console tt_enforce_hours_for_tech_console
md_tasks_presets
employees { employees {
id id
first_name first_name

View File

@@ -67,7 +67,7 @@ export const GET_LINE_TICKET_BY_PK = gql`
clockoff clockoff
rate rate
committed_at committed_at
committed_by commited_by
employee { employee {
id id
first_name first_name

View File

@@ -16,19 +16,15 @@ export const QUERY_ALL_PAYMENTS_PAGINATED = gql`
$limit: Int $limit: Int
$order: [payments_order_by!]! $order: [payments_order_by!]!
) { ) {
payments( payments(offset: $offset, limit: $limit, order_by: $order) {
offset: $offset
limit: $limit
order_by: $order
) {
id id
amount
created_at created_at
jobid
paymentnum
date date
exportedat
jobid
job { job {
id id
ro_number
ownerid ownerid
ownr_co_nm ownr_co_nm
ownr_fn ownr_fn
@@ -39,15 +35,14 @@ export const QUERY_ALL_PAYMENTS_PAGINATED = gql`
ownr_fn ownr_fn
ownr_ln ownr_ln
} }
ro_number
} }
transactionid
memo memo
type
amount
stripeid
exportedat
stripeid
payer payer
paymentnum
stripeid
transactionid
type
} }
payments_aggregate { payments_aggregate {
aggregate { aggregate {
@@ -62,16 +57,31 @@ export const UPDATE_PAYMENT = gql`
update_payments(where: { id: { _eq: $paymentId } }, _set: $payment) { update_payments(where: { id: { _eq: $paymentId } }, _set: $payment) {
returning { returning {
id id
transactionid
memo
type
amount amount
stripeid created_at
date
exportedat exportedat
stripeid jobid
job {
id
ownerid
ownr_co_nm
ownr_fn
ownr_ln
owner {
id
ownr_co_nm
ownr_fn
ownr_ln
}
ro_number
}
memo
payer payer
paymentnum paymentnum
date stripeid
transactionid
type
} }
} }
} }
@@ -85,17 +95,31 @@ export const UPDATE_PAYMENTS = gql`
update_payments(where: { id: { _in: $paymentIdList } }, _set: $payment) { update_payments(where: { id: { _in: $paymentIdList } }, _set: $payment) {
returning { returning {
id id
exportedat
transactionid
memo
type
amount amount
stripeid created_at
date
exportedat exportedat
stripeid jobid
job {
id
ownerid
ownr_co_nm
ownr_fn
ownr_ln
owner {
id
ownr_co_nm
ownr_fn
ownr_ln
}
ro_number
}
memo
payer payer
paymentnum paymentnum
date stripeid
transactionid
type
} }
} }
} }
@@ -115,36 +139,35 @@ export const QUERY_JOB_PAYMENT_TOTALS = gql`
} }
`; `;
export const QUERY_PAYMENT_BY_ID = gql`
export const QUERY_PAYMENT_BY_ID = gql`query QUERY_PAYMENT_BY_ID($paymentId: uuid!) { query QUERY_PAYMENT_BY_ID($paymentId: uuid!) {
payments_by_pk(id: $paymentId) { payments_by_pk(id: $paymentId) {
id
created_at
jobid
paymentnum
date
job {
id id
ro_number amount
ownerid created_at
ownr_co_nm exportedat
ownr_fn date
ownr_ln jobid
owner { job {
id id
ownerid
ownr_co_nm ownr_co_nm
ownr_fn ownr_fn
ownr_ln ownr_ln
owner {
id
ownr_co_nm
ownr_fn
ownr_ln
}
ro_number
} }
memo
payer
paymentnum
stripeid
transactionid
type
} }
transactionid
memo
type
amount
stripeid
exportedat
stripeid
payer
} }
} `;
`

View File

@@ -159,7 +159,7 @@ export const QUERY_TIME_TICKETS_IN_RANGE_SB = gql`
memo memo
jobid jobid
committed_at committed_at
committed_by commited_by
flat_rate flat_rate
job { job {
id id

View File

@@ -227,6 +227,7 @@
}, },
"bodyshop": { "bodyshop": {
"actions": { "actions": {
"add_task_preset": "Add Task Preset",
"addapptcolor": "Add Appointment Color", "addapptcolor": "Add Appointment Color",
"addbucket": "Add Definition", "addbucket": "Add Definition",
"addpartslocation": "Add Parts Location", "addpartslocation": "Add Parts Location",
@@ -339,6 +340,12 @@
}, },
"md_payment_types": "Payment Types", "md_payment_types": "Payment Types",
"md_referral_sources": "Referral Sources", "md_referral_sources": "Referral Sources",
"md_tasks_presets": {
"hourstype": "Hour Types",
"memo": "Time Ticket Memo",
"name": "Preset Name",
"percent": "Percent"
},
"messaginglabel": "Messaging Preset Label", "messaginglabel": "Messaging Preset Label",
"messagingtext": "Messaging Preset Text", "messagingtext": "Messaging Preset Text",
"noteslabel": "Note Label", "noteslabel": "Note Label",
@@ -594,6 +601,7 @@
"jobstatuses": "Job Statuses", "jobstatuses": "Job Statuses",
"laborrates": "Labor Rates", "laborrates": "Labor Rates",
"licensing": "Licensing", "licensing": "Licensing",
"md_tasks_presets": "Tasks Presets",
"md_to_emails": "Preset To Emails", "md_to_emails": "Preset To Emails",
"md_to_emails_emails": "Emails", "md_to_emails_emails": "Emails",
"messagingpresets": "Messaging Presets", "messagingpresets": "Messaging Presets",
@@ -620,6 +628,7 @@
"speedprint": "Speed Print Configuration", "speedprint": "Speed Print Configuration",
"ssbuckets": "Job Size Definitions", "ssbuckets": "Job Size Definitions",
"systemsettings": "System Settings", "systemsettings": "System Settings",
"task-presets": "Task Presets",
"workingdays": "Working Days" "workingdays": "Working Days"
}, },
"successes": { "successes": {
@@ -921,11 +930,14 @@
}, },
"employee_teams": { "employee_teams": {
"actions": { "actions": {
"new": "New Team" "new": "New Team",
"newmember": "New Team Member"
}, },
"fields": { "fields": {
"active": "Active", "active": "Active",
"name": "Team Name" "employeeid": "Employee",
"name": "Team Name",
"percentage": "Percent"
} }
}, },
"employees": { "employees": {

View File

@@ -227,6 +227,7 @@
}, },
"bodyshop": { "bodyshop": {
"actions": { "actions": {
"add_task_preset": "",
"addapptcolor": "", "addapptcolor": "",
"addbucket": "", "addbucket": "",
"addpartslocation": "", "addpartslocation": "",
@@ -339,6 +340,12 @@
}, },
"md_payment_types": "", "md_payment_types": "",
"md_referral_sources": "", "md_referral_sources": "",
"md_tasks_presets": {
"hourstype": "",
"memo": "",
"name": "",
"percent": ""
},
"messaginglabel": "", "messaginglabel": "",
"messagingtext": "", "messagingtext": "",
"noteslabel": "", "noteslabel": "",
@@ -593,6 +600,7 @@
"jobstatuses": "", "jobstatuses": "",
"laborrates": "", "laborrates": "",
"licensing": "", "licensing": "",
"md_tasks_presets": "",
"md_to_emails": "", "md_to_emails": "",
"md_to_emails_emails": "", "md_to_emails_emails": "",
"messagingpresets": "", "messagingpresets": "",
@@ -619,6 +627,7 @@
"speedprint": "", "speedprint": "",
"ssbuckets": "", "ssbuckets": "",
"systemsettings": "", "systemsettings": "",
"task-presets": "",
"workingdays": "" "workingdays": ""
}, },
"successes": { "successes": {
@@ -920,11 +929,14 @@
}, },
"employee_teams": { "employee_teams": {
"actions": { "actions": {
"new": "" "new": "",
"newmember": ""
}, },
"fields": { "fields": {
"active": "", "active": "",
"name": "" "employeeid": "",
"name": "",
"percentage": ""
} }
}, },
"employees": { "employees": {

View File

@@ -227,6 +227,7 @@
}, },
"bodyshop": { "bodyshop": {
"actions": { "actions": {
"add_task_preset": "",
"addapptcolor": "", "addapptcolor": "",
"addbucket": "", "addbucket": "",
"addpartslocation": "", "addpartslocation": "",
@@ -339,6 +340,12 @@
}, },
"md_payment_types": "", "md_payment_types": "",
"md_referral_sources": "", "md_referral_sources": "",
"md_tasks_presets": {
"hourstype": "",
"memo": "",
"name": "",
"percent": ""
},
"messaginglabel": "", "messaginglabel": "",
"messagingtext": "", "messagingtext": "",
"noteslabel": "", "noteslabel": "",
@@ -593,6 +600,7 @@
"jobstatuses": "", "jobstatuses": "",
"laborrates": "", "laborrates": "",
"licensing": "", "licensing": "",
"md_tasks_presets": "",
"md_to_emails": "", "md_to_emails": "",
"md_to_emails_emails": "", "md_to_emails_emails": "",
"messagingpresets": "", "messagingpresets": "",
@@ -619,6 +627,7 @@
"speedprint": "", "speedprint": "",
"ssbuckets": "", "ssbuckets": "",
"systemsettings": "", "systemsettings": "",
"task-presets": "",
"workingdays": "" "workingdays": ""
}, },
"successes": { "successes": {
@@ -920,11 +929,14 @@
}, },
"employee_teams": { "employee_teams": {
"actions": { "actions": {
"new": "" "new": "",
"newmember": ""
}, },
"fields": { "fields": {
"active": "", "active": "",
"name": "" "employeeid": "",
"name": "",
"percentage": ""
} }
}, },
"employees": { "employees": {

View File

@@ -7,22 +7,24 @@ export const EmailSettings = {
export const TemplateList = (type, context) => { export const TemplateList = (type, context) => {
//const { bodyshop } = store.getState().user; //const { bodyshop } = store.getState().user;
return { return {
//If there's no type or the type is job, send it back. //If there's no type or the type is job, send it back.
...(!type || type === "job" ...(!type || type === "job"
? { ? {
casl_authorization: { casl_authorization: {
title: i18n.t("printcenter.jobs.casl_authorization"), title: i18n.t("printcenter.jobs.casl_authorization"),
description: "CASL Authorization", description: "",
subject: i18n.t("printcenter.jobs.casl_authorization"), subject: i18n.t("printcenter.jobs.casl_authorization"),
key: "casl_authorization", key: "casl_authorization",
disabled: false, disabled: false,
group: "authorization", group: "authorization",
regions: {
CA: true,
},
}, },
fippa_authorization: { fippa_authorization: {
title: i18n.t("printcenter.jobs.fippa_authorization"), title: i18n.t("printcenter.jobs.fippa_authorization"),
description: "CASL Authorization", description: "",
subject: i18n.t("printcenter.jobs.fippa_authorization"), subject: i18n.t("printcenter.jobs.fippa_authorization"),
key: "fippa_authorization", key: "fippa_authorization",
disabled: false, disabled: false,
@@ -30,7 +32,7 @@ export const TemplateList = (type, context) => {
}, },
diagnostic_authorization: { diagnostic_authorization: {
title: i18n.t("printcenter.jobs.diagnostic_authorization"), title: i18n.t("printcenter.jobs.diagnostic_authorization"),
description: "Diagnostic Authorization", description: "",
subject: i18n.t("printcenter.jobs.diagnostic_authorization"), subject: i18n.t("printcenter.jobs.diagnostic_authorization"),
key: "diagnostic_authorization", key: "diagnostic_authorization",
disabled: false, disabled: false,
@@ -38,7 +40,7 @@ export const TemplateList = (type, context) => {
}, },
mechanical_authorization: { mechanical_authorization: {
title: i18n.t("printcenter.jobs.mechanical_authorization"), title: i18n.t("printcenter.jobs.mechanical_authorization"),
description: "Diagnostic Authorization", description: "",
subject: i18n.t("printcenter.jobs.mechanical_authorization"), subject: i18n.t("printcenter.jobs.mechanical_authorization"),
key: "mechanical_authorization", key: "mechanical_authorization",
disabled: false, disabled: false,
@@ -46,7 +48,7 @@ export const TemplateList = (type, context) => {
}, },
appointment_reminder: { appointment_reminder: {
title: i18n.t("printcenter.jobs.appointment_reminder"), title: i18n.t("printcenter.jobs.appointment_reminder"),
description: "All Jobs Notes", description: "",
subject: i18n.t("printcenter.jobs.appointment_reminder"), subject: i18n.t("printcenter.jobs.appointment_reminder"),
key: "appointment_reminder", key: "appointment_reminder",
disabled: false, disabled: false,
@@ -54,7 +56,7 @@ export const TemplateList = (type, context) => {
}, },
estimate_followup: { estimate_followup: {
title: i18n.t("printcenter.jobs.estimate_followup"), title: i18n.t("printcenter.jobs.estimate_followup"),
description: "All Jobs Notes", description: "",
subject: i18n.t("printcenter.jobs.estimate_followup"), subject: i18n.t("printcenter.jobs.estimate_followup"),
key: "estimate_followup", key: "estimate_followup",
disabled: false, disabled: false,
@@ -62,7 +64,7 @@ export const TemplateList = (type, context) => {
}, },
express_repair_checklist: { express_repair_checklist: {
title: i18n.t("printcenter.jobs.express_repair_checklist"), title: i18n.t("printcenter.jobs.express_repair_checklist"),
description: "All Jobs Notes", description: "",
subject: i18n.t("printcenter.jobs.express_repair_checklist"), subject: i18n.t("printcenter.jobs.express_repair_checklist"),
key: "express_repair_checklist", key: "express_repair_checklist",
disabled: false, disabled: false,
@@ -70,7 +72,7 @@ export const TemplateList = (type, context) => {
}, },
glass_express_checklist: { glass_express_checklist: {
title: i18n.t("printcenter.jobs.glass_express_checklist"), title: i18n.t("printcenter.jobs.glass_express_checklist"),
description: "All Jobs Notes", description: "",
subject: i18n.t("printcenter.jobs.glass_express_checklist"), subject: i18n.t("printcenter.jobs.glass_express_checklist"),
key: "glass_express_checklist", key: "glass_express_checklist",
disabled: false, disabled: false,
@@ -78,7 +80,7 @@ export const TemplateList = (type, context) => {
}, },
stolen_recovery_checklist: { stolen_recovery_checklist: {
title: i18n.t("printcenter.jobs.stolen_recovery_checklist"), title: i18n.t("printcenter.jobs.stolen_recovery_checklist"),
description: "All Jobs Notes", description: "",
subject: i18n.t("printcenter.jobs.stolen_recovery_checklist"), subject: i18n.t("printcenter.jobs.stolen_recovery_checklist"),
key: "stolen_recovery_checklist", key: "stolen_recovery_checklist",
disabled: false, disabled: false,
@@ -86,7 +88,7 @@ export const TemplateList = (type, context) => {
}, },
vehicle_check_in: { vehicle_check_in: {
title: i18n.t("printcenter.jobs.vehicle_check_in"), title: i18n.t("printcenter.jobs.vehicle_check_in"),
description: "All Jobs Notes", description: "",
subject: i18n.t("printcenter.jobs.vehicle_check_in"), subject: i18n.t("printcenter.jobs.vehicle_check_in"),
key: "vehicle_check_in", key: "vehicle_check_in",
disabled: false, disabled: false,
@@ -94,7 +96,7 @@ export const TemplateList = (type, context) => {
}, },
parts_order_history: { parts_order_history: {
title: i18n.t("printcenter.jobs.parts_order_history"), title: i18n.t("printcenter.jobs.parts_order_history"),
description: "All Jobs Notes", description: "",
subject: i18n.t("printcenter.jobs.parts_order_history"), subject: i18n.t("printcenter.jobs.parts_order_history"),
key: "parts_order_history", key: "parts_order_history",
disabled: false, disabled: false,
@@ -102,7 +104,7 @@ export const TemplateList = (type, context) => {
}, },
job_notes: { job_notes: {
title: i18n.t("printcenter.jobs.job_notes"), title: i18n.t("printcenter.jobs.job_notes"),
description: "All Jobs Notes", description: "",
subject: i18n.t("printcenter.jobs.job_notes"), subject: i18n.t("printcenter.jobs.job_notes"),
key: "job_notes", key: "job_notes",
disabled: false, disabled: false,
@@ -110,7 +112,7 @@ export const TemplateList = (type, context) => {
}, },
ro_with_description: { ro_with_description: {
title: i18n.t("printcenter.jobs.ro_with_description"), title: i18n.t("printcenter.jobs.ro_with_description"),
description: "All Jobs Notes", description: "",
subject: i18n.t("printcenter.jobs.ro_with_description"), subject: i18n.t("printcenter.jobs.ro_with_description"),
key: "ro_with_description", key: "ro_with_description",
disabled: false, disabled: false,
@@ -118,7 +120,7 @@ export const TemplateList = (type, context) => {
}, },
window_tag: { window_tag: {
title: i18n.t("printcenter.jobs.window_tag"), title: i18n.t("printcenter.jobs.window_tag"),
description: "All Jobs Notes", description: "",
subject: i18n.t("printcenter.jobs.window_tag"), subject: i18n.t("printcenter.jobs.window_tag"),
key: "window_tag", key: "window_tag",
disabled: false, disabled: false,
@@ -126,7 +128,7 @@ export const TemplateList = (type, context) => {
}, },
supplement_request: { supplement_request: {
title: i18n.t("printcenter.jobs.supplement_request"), title: i18n.t("printcenter.jobs.supplement_request"),
description: "All Jobs Notes", description: "",
subject: i18n.t("printcenter.jobs.supplement_request"), subject: i18n.t("printcenter.jobs.supplement_request"),
key: "supplement_request", key: "supplement_request",
disabled: false, disabled: false,
@@ -134,7 +136,7 @@ export const TemplateList = (type, context) => {
}, },
estimate: { estimate: {
title: i18n.t("printcenter.jobs.estimate"), title: i18n.t("printcenter.jobs.estimate"),
description: "All Jobs Notes", description: "",
subject: i18n.t("printcenter.jobs.estimate"), subject: i18n.t("printcenter.jobs.estimate"),
key: "estimate", key: "estimate",
disabled: false, disabled: false,
@@ -142,7 +144,7 @@ export const TemplateList = (type, context) => {
}, },
parts_list: { parts_list: {
title: i18n.t("printcenter.jobs.parts_list"), title: i18n.t("printcenter.jobs.parts_list"),
description: "All Jobs Notes", description: "",
subject: i18n.t("printcenter.jobs.parts_list"), subject: i18n.t("printcenter.jobs.parts_list"),
key: "parts_list", key: "parts_list",
disabled: false, disabled: false,
@@ -150,7 +152,7 @@ export const TemplateList = (type, context) => {
}, },
coversheet_portrait: { coversheet_portrait: {
title: i18n.t("printcenter.jobs.coversheet_portrait"), title: i18n.t("printcenter.jobs.coversheet_portrait"),
description: "All Jobs Notes", description: "",
subject: i18n.t("printcenter.jobs.coversheet_portrait"), subject: i18n.t("printcenter.jobs.coversheet_portrait"),
key: "coversheet_portrait", key: "coversheet_portrait",
disabled: false, disabled: false,
@@ -158,7 +160,7 @@ export const TemplateList = (type, context) => {
}, },
coversheet_landscape: { coversheet_landscape: {
title: i18n.t("printcenter.jobs.coversheet_landscape"), title: i18n.t("printcenter.jobs.coversheet_landscape"),
description: "All Jobs Notes", description: "",
subject: i18n.t("printcenter.jobs.coversheet_landscape"), subject: i18n.t("printcenter.jobs.coversheet_landscape"),
key: "coversheet_landscape", key: "coversheet_landscape",
disabled: false, disabled: false,
@@ -166,7 +168,7 @@ export const TemplateList = (type, context) => {
}, },
key_tag: { key_tag: {
title: i18n.t("printcenter.jobs.key_tag"), title: i18n.t("printcenter.jobs.key_tag"),
description: "All Jobs Notes", description: "",
subject: i18n.t("printcenter.jobs.key_tag"), subject: i18n.t("printcenter.jobs.key_tag"),
key: "key_tag", key: "key_tag",
disabled: false, disabled: false,
@@ -174,7 +176,7 @@ export const TemplateList = (type, context) => {
}, },
paint_grid: { paint_grid: {
title: i18n.t("printcenter.jobs.paint_grid"), title: i18n.t("printcenter.jobs.paint_grid"),
description: "All Jobs Notes", description: "",
subject: i18n.t("printcenter.jobs.paint_grid"), subject: i18n.t("printcenter.jobs.paint_grid"),
key: "paint_grid", key: "paint_grid",
disabled: false, disabled: false,
@@ -182,7 +184,7 @@ export const TemplateList = (type, context) => {
}, },
worksheet_by_line_number: { worksheet_by_line_number: {
title: i18n.t("printcenter.jobs.worksheet_by_line_number"), title: i18n.t("printcenter.jobs.worksheet_by_line_number"),
description: "All Jobs Notes", description: "",
subject: i18n.t("printcenter.jobs.worksheet_by_line_number"), subject: i18n.t("printcenter.jobs.worksheet_by_line_number"),
key: "worksheet_by_line_number", key: "worksheet_by_line_number",
disabled: false, disabled: false,
@@ -192,7 +194,7 @@ export const TemplateList = (type, context) => {
title: i18n.t( title: i18n.t(
"printcenter.jobs.worksheet_sorted_by_operation_type" "printcenter.jobs.worksheet_sorted_by_operation_type"
), ),
description: "All Jobs Notes", description: "",
subject: i18n.t( subject: i18n.t(
"printcenter.jobs.worksheet_sorted_by_operation_type" "printcenter.jobs.worksheet_sorted_by_operation_type"
), ),
@@ -202,7 +204,7 @@ export const TemplateList = (type, context) => {
}, },
worksheet_sorted_by_operation: { worksheet_sorted_by_operation: {
title: i18n.t("printcenter.jobs.worksheet_sorted_by_operation"), title: i18n.t("printcenter.jobs.worksheet_sorted_by_operation"),
description: "All Jobs Notes", description: "",
subject: i18n.t("printcenter.jobs.worksheet_sorted_by_operation"), subject: i18n.t("printcenter.jobs.worksheet_sorted_by_operation"),
key: "worksheet_sorted_by_operation", key: "worksheet_sorted_by_operation",
disabled: false, disabled: false,
@@ -212,7 +214,7 @@ export const TemplateList = (type, context) => {
title: i18n.t( title: i18n.t(
"printcenter.jobs.worksheet_sorted_by_operation_no_hours" "printcenter.jobs.worksheet_sorted_by_operation_no_hours"
), ),
description: "All Jobs Notes", description: "",
subject: i18n.t( subject: i18n.t(
"printcenter.jobs.worksheet_sorted_by_operation_no_hours" "printcenter.jobs.worksheet_sorted_by_operation_no_hours"
), ),
@@ -224,7 +226,7 @@ export const TemplateList = (type, context) => {
title: i18n.t( title: i18n.t(
"printcenter.jobs.worksheet_sorted_by_operation_part_type" "printcenter.jobs.worksheet_sorted_by_operation_part_type"
), ),
description: "All Jobs Notes", description: "",
subject: i18n.t( subject: i18n.t(
"printcenter.jobs.worksheet_sorted_by_operation_part_type" "printcenter.jobs.worksheet_sorted_by_operation_part_type"
), ),
@@ -234,7 +236,7 @@ export const TemplateList = (type, context) => {
}, },
payments_by_job: { payments_by_job: {
title: i18n.t("printcenter.jobs.payments_by_job"), title: i18n.t("printcenter.jobs.payments_by_job"),
description: "All Jobs Notes", description: "",
subject: i18n.t("printcenter.jobs.payments_by_job"), subject: i18n.t("printcenter.jobs.payments_by_job"),
key: "payments_by_job", key: "payments_by_job",
disabled: false, disabled: false,
@@ -242,7 +244,7 @@ export const TemplateList = (type, context) => {
}, },
final_invoice: { final_invoice: {
title: i18n.t("printcenter.jobs.final_invoice"), title: i18n.t("printcenter.jobs.final_invoice"),
description: "All Jobs Notes", description: "",
subject: i18n.t("printcenter.jobs.final_invoice"), subject: i18n.t("printcenter.jobs.final_invoice"),
key: "final_invoice", key: "final_invoice",
disabled: false, disabled: false,
@@ -250,7 +252,7 @@ export const TemplateList = (type, context) => {
}, },
payment_request: { payment_request: {
title: i18n.t("printcenter.jobs.payment_request"), title: i18n.t("printcenter.jobs.payment_request"),
description: "All Jobs Notes", description: "",
subject: i18n.t("printcenter.jobs.payment_request"), subject: i18n.t("printcenter.jobs.payment_request"),
key: "payment_request", key: "payment_request",
disabled: false, disabled: false,
@@ -258,7 +260,7 @@ export const TemplateList = (type, context) => {
}, },
invoice_total_payable: { invoice_total_payable: {
title: i18n.t("printcenter.jobs.invoice_total_payable"), title: i18n.t("printcenter.jobs.invoice_total_payable"),
description: "All Jobs Notes", description: "",
subject: i18n.t("printcenter.jobs.invoice_total_payable"), subject: i18n.t("printcenter.jobs.invoice_total_payable"),
key: "invoice_total_payable", key: "invoice_total_payable",
disabled: false, disabled: false,
@@ -266,7 +268,7 @@ export const TemplateList = (type, context) => {
}, },
invoice_customer_payable: { invoice_customer_payable: {
title: i18n.t("printcenter.jobs.invoice_customer_payable"), title: i18n.t("printcenter.jobs.invoice_customer_payable"),
description: "All Jobs Notes", description: "",
subject: i18n.t("printcenter.jobs.invoice_customer_payable"), subject: i18n.t("printcenter.jobs.invoice_customer_payable"),
key: "invoice_customer_payable", key: "invoice_customer_payable",
disabled: false, disabled: false,
@@ -274,7 +276,7 @@ export const TemplateList = (type, context) => {
}, },
ro_totals: { ro_totals: {
title: i18n.t("printcenter.jobs.ro_totals"), title: i18n.t("printcenter.jobs.ro_totals"),
description: "All Jobs Notes", description: "",
subject: i18n.t("printcenter.jobs.ro_totals"), subject: i18n.t("printcenter.jobs.ro_totals"),
key: "ro_totals", key: "ro_totals",
disabled: false, disabled: false,
@@ -282,7 +284,7 @@ export const TemplateList = (type, context) => {
}, },
job_costing_ro: { job_costing_ro: {
title: i18n.t("printcenter.jobs.job_costing_ro"), title: i18n.t("printcenter.jobs.job_costing_ro"),
description: "All Jobs Notes", description: "",
subject: i18n.t("printcenter.jobs.job_costing_ro"), subject: i18n.t("printcenter.jobs.job_costing_ro"),
key: "job_costing_ro", key: "job_costing_ro",
disabled: false, disabled: false,
@@ -290,7 +292,7 @@ export const TemplateList = (type, context) => {
}, },
purchases_by_ro_detail: { purchases_by_ro_detail: {
title: i18n.t("printcenter.jobs.purchases_by_ro_detail"), title: i18n.t("printcenter.jobs.purchases_by_ro_detail"),
description: "All Jobs Notes", description: "",
subject: i18n.t("printcenter.jobs.purchases_by_ro_detail"), subject: i18n.t("printcenter.jobs.purchases_by_ro_detail"),
key: "purchases_by_ro_detail", key: "purchases_by_ro_detail",
disabled: false, disabled: false,
@@ -298,7 +300,7 @@ export const TemplateList = (type, context) => {
}, },
purchases_by_ro_summary: { purchases_by_ro_summary: {
title: i18n.t("printcenter.jobs.purchases_by_ro_summary"), title: i18n.t("printcenter.jobs.purchases_by_ro_summary"),
description: "All Jobs Notes", description: "",
subject: i18n.t("printcenter.jobs.purchases_by_ro_summary"), subject: i18n.t("printcenter.jobs.purchases_by_ro_summary"),
key: "purchases_by_ro_summary", key: "purchases_by_ro_summary",
disabled: false, disabled: false,
@@ -306,7 +308,7 @@ export const TemplateList = (type, context) => {
}, },
filing_coversheet_portrait: { filing_coversheet_portrait: {
title: i18n.t("printcenter.jobs.filing_coversheet_portrait"), title: i18n.t("printcenter.jobs.filing_coversheet_portrait"),
description: "All Jobs Notes", description: "",
subject: i18n.t("printcenter.jobs.filing_coversheet_portrait"), subject: i18n.t("printcenter.jobs.filing_coversheet_portrait"),
key: "filing_coversheet_portrait", key: "filing_coversheet_portrait",
disabled: false, disabled: false,
@@ -314,7 +316,7 @@ export const TemplateList = (type, context) => {
}, },
filing_coversheet_landscape: { filing_coversheet_landscape: {
title: i18n.t("printcenter.jobs.filing_coversheet_landscape"), title: i18n.t("printcenter.jobs.filing_coversheet_landscape"),
description: "CASL Authorization", description: "",
subject: i18n.t("printcenter.jobs.filing_coversheet_landscape"), subject: i18n.t("printcenter.jobs.filing_coversheet_landscape"),
key: "filing_coversheet_landscape", key: "filing_coversheet_landscape",
disabled: false, disabled: false,
@@ -322,7 +324,7 @@ export const TemplateList = (type, context) => {
}, },
qc_sheet: { qc_sheet: {
title: i18n.t("printcenter.jobs.qc_sheet"), title: i18n.t("printcenter.jobs.qc_sheet"),
description: "All Jobs Notes", description: "",
subject: i18n.t("printcenter.jobs.qc_sheet"), subject: i18n.t("printcenter.jobs.qc_sheet"),
key: "qc_sheet", key: "qc_sheet",
disabled: false, disabled: false,
@@ -330,7 +332,7 @@ export const TemplateList = (type, context) => {
}, },
vehicle_delivery_check: { vehicle_delivery_check: {
title: i18n.t("printcenter.jobs.vehicle_delivery_check"), title: i18n.t("printcenter.jobs.vehicle_delivery_check"),
description: "All Jobs Notes", description: "",
subject: i18n.t("printcenter.jobs.vehicle_delivery_check"), subject: i18n.t("printcenter.jobs.vehicle_delivery_check"),
key: "vehicle_delivery_check", key: "vehicle_delivery_check",
disabled: false, disabled: false,
@@ -338,7 +340,7 @@ export const TemplateList = (type, context) => {
}, },
guarantee: { guarantee: {
title: i18n.t("printcenter.jobs.guarantee"), title: i18n.t("printcenter.jobs.guarantee"),
description: "All Jobs Notes", description: "",
subject: i18n.t("printcenter.jobs.guarantee"), subject: i18n.t("printcenter.jobs.guarantee"),
key: "guarantee", key: "guarantee",
disabled: false, disabled: false,
@@ -346,7 +348,7 @@ export const TemplateList = (type, context) => {
}, },
csi_invitation: { csi_invitation: {
title: i18n.t("printcenter.jobs.csi_invitation"), title: i18n.t("printcenter.jobs.csi_invitation"),
description: "CSI invite", description: "",
key: "csi_invitation", key: "csi_invitation",
subject: i18n.t("printcenter.jobs.csi_invitation"), subject: i18n.t("printcenter.jobs.csi_invitation"),
disabled: false, disabled: false,
@@ -354,7 +356,7 @@ export const TemplateList = (type, context) => {
}, },
window_tag_sublet: { window_tag_sublet: {
title: i18n.t("printcenter.jobs.window_tag_sublet"), title: i18n.t("printcenter.jobs.window_tag_sublet"),
description: "Window Tag Sublet", description: "",
key: "window_tag_sublet", key: "window_tag_sublet",
subject: i18n.t("printcenter.jobs.window_tag_sublet"), subject: i18n.t("printcenter.jobs.window_tag_sublet"),
disabled: false, disabled: false,
@@ -362,7 +364,7 @@ export const TemplateList = (type, context) => {
}, },
thank_you_ro: { thank_you_ro: {
title: i18n.t("printcenter.jobs.thank_you_ro"), title: i18n.t("printcenter.jobs.thank_you_ro"),
description: "Thank You Letter by RO", description: "",
key: "thank_you_ro", key: "thank_you_ro",
subject: i18n.t("printcenter.jobs.thank_you_ro"), subject: i18n.t("printcenter.jobs.thank_you_ro"),
disabled: false, disabled: false,
@@ -370,7 +372,7 @@ export const TemplateList = (type, context) => {
}, },
parts_label_single: { parts_label_single: {
title: i18n.t("printcenter.jobs.parts_label_single"), title: i18n.t("printcenter.jobs.parts_label_single"),
description: "Thank You Letter by RO", description: "",
key: "parts_label_single", key: "parts_label_single",
subject: i18n.t("printcenter.jobs.parts_label_single"), subject: i18n.t("printcenter.jobs.parts_label_single"),
disabled: false, disabled: false,
@@ -379,7 +381,7 @@ export const TemplateList = (type, context) => {
}, },
envelope_return_address: { envelope_return_address: {
title: i18n.t("printcenter.jobs.envelope_return_address"), title: i18n.t("printcenter.jobs.envelope_return_address"),
description: "All Jobs Notes", description: "",
subject: i18n.t("printcenter.jobs.envelope_return_address"), subject: i18n.t("printcenter.jobs.envelope_return_address"),
key: "envelope_return_address", key: "envelope_return_address",
disabled: false, disabled: false,
@@ -388,7 +390,7 @@ export const TemplateList = (type, context) => {
}, },
sgi_certificate_of_repairs: { sgi_certificate_of_repairs: {
title: i18n.t("printcenter.jobs.sgi_certificate_of_repairs"), title: i18n.t("printcenter.jobs.sgi_certificate_of_repairs"),
description: "Thank You Letter by RO", description: "",
key: "sgi_certificate_of_repairs", key: "sgi_certificate_of_repairs",
subject: i18n.t("printcenter.jobs.sgi_certificate_of_repairs"), subject: i18n.t("printcenter.jobs.sgi_certificate_of_repairs"),
disabled: false, disabled: false,
@@ -399,7 +401,7 @@ export const TemplateList = (type, context) => {
}, },
sgi_windshield_auth: { sgi_windshield_auth: {
title: i18n.t("printcenter.jobs.sgi_windshield_auth"), title: i18n.t("printcenter.jobs.sgi_windshield_auth"),
description: "Thank You Letter by RO", description: "",
key: "sgi_windshield_auth", key: "sgi_windshield_auth",
subject: i18n.t("printcenter.jobs.sgi_windshield_auth"), subject: i18n.t("printcenter.jobs.sgi_windshield_auth"),
disabled: false, disabled: false,
@@ -410,7 +412,7 @@ export const TemplateList = (type, context) => {
}, },
mpi_final_acct_sheet: { mpi_final_acct_sheet: {
title: i18n.t("printcenter.jobs.mpi_final_acct_sheet"), title: i18n.t("printcenter.jobs.mpi_final_acct_sheet"),
description: "Thank You Letter by RO", description: "",
key: "mpi_final_acct_sheet", key: "mpi_final_acct_sheet",
subject: i18n.t("printcenter.jobs.mpi_final_acct_sheet"), subject: i18n.t("printcenter.jobs.mpi_final_acct_sheet"),
disabled: false, disabled: false,
@@ -421,7 +423,7 @@ export const TemplateList = (type, context) => {
}, },
mpi_eglass_auth: { mpi_eglass_auth: {
title: i18n.t("printcenter.jobs.mpi_eglass_auth"), title: i18n.t("printcenter.jobs.mpi_eglass_auth"),
description: "Thank You Letter by RO", description: "",
key: "mpi_eglass_auth", key: "mpi_eglass_auth",
subject: i18n.t("printcenter.jobs.mpi_eglass_auth"), subject: i18n.t("printcenter.jobs.mpi_eglass_auth"),
disabled: false, disabled: false,
@@ -432,7 +434,7 @@ export const TemplateList = (type, context) => {
}, },
mpi_animal_checklist: { mpi_animal_checklist: {
title: i18n.t("printcenter.jobs.mpi_animal_checklist"), title: i18n.t("printcenter.jobs.mpi_animal_checklist"),
description: "Thank You Letter by RO", description: "",
key: "mpi_animal_checklist", key: "mpi_animal_checklist",
subject: i18n.t("printcenter.jobs.mpi_animal_checklist"), subject: i18n.t("printcenter.jobs.mpi_animal_checklist"),
disabled: false, disabled: false,
@@ -443,7 +445,7 @@ export const TemplateList = (type, context) => {
}, },
ab_proof_of_loss: { ab_proof_of_loss: {
title: i18n.t("printcenter.jobs.ab_proof_of_loss"), title: i18n.t("printcenter.jobs.ab_proof_of_loss"),
description: "Thank You Letter by RO", description: "",
key: "ab_proof_of_loss", key: "ab_proof_of_loss",
subject: i18n.t("printcenter.jobs.ab_proof_of_loss"), subject: i18n.t("printcenter.jobs.ab_proof_of_loss"),
disabled: false, disabled: false,
@@ -454,7 +456,7 @@ export const TemplateList = (type, context) => {
}, },
// parts_label_multi: { // parts_label_multi: {
// title: i18n.t("printcenter.jobs.parts_label_multi"), // title: i18n.t("printcenter.jobs.parts_label_multi"),
// description: "Thank You Letter by RO", // description: "",
// key: "parts_label_multi", // key: "parts_label_multi",
// subject: i18n.t("printcenter.jobs.parts_label_multi"), // subject: i18n.t("printcenter.jobs.parts_label_multi"),
// disabled: false, // disabled: false,
@@ -462,7 +464,7 @@ export const TemplateList = (type, context) => {
// }, // },
iou_form: { iou_form: {
title: i18n.t("printcenter.jobs.iou_form"), title: i18n.t("printcenter.jobs.iou_form"),
description: "CASL Authorization", description: "",
subject: i18n.t("printcenter.jobs.iou_form"), subject: i18n.t("printcenter.jobs.iou_form"),
key: "iou_form", key: "iou_form",
disabled: false, disabled: false,
@@ -470,7 +472,7 @@ export const TemplateList = (type, context) => {
}, },
lag_time_ro: { lag_time_ro: {
title: i18n.t("printcenter.jobs.lag_time_ro"), title: i18n.t("printcenter.jobs.lag_time_ro"),
description: "CASL Authorization", description: "",
subject: i18n.t("printcenter.jobs.lag_time_ro"), subject: i18n.t("printcenter.jobs.lag_time_ro"),
key: "lag_time_ro", key: "lag_time_ro",
disabled: false, disabled: false,
@@ -478,7 +480,7 @@ export const TemplateList = (type, context) => {
}, },
rental_reservation: { rental_reservation: {
title: i18n.t("printcenter.jobs.rental_reservation"), title: i18n.t("printcenter.jobs.rental_reservation"),
description: "CASL Authorization", description: "",
subject: i18n.t("printcenter.jobs.rental_reservation"), subject: i18n.t("printcenter.jobs.rental_reservation"),
key: "rental_reservation", key: "rental_reservation",
disabled: false, disabled: false,
@@ -486,7 +488,7 @@ export const TemplateList = (type, context) => {
}, },
timetickets_ro: { timetickets_ro: {
title: i18n.t("printcenter.jobs.timetickets_ro"), title: i18n.t("printcenter.jobs.timetickets_ro"),
description: "CASL Authorization", description: "",
subject: i18n.t("printcenter.jobs.timetickets_ro"), subject: i18n.t("printcenter.jobs.timetickets_ro"),
key: "timetickets_ro", key: "timetickets_ro",
disabled: false, disabled: false,
@@ -494,7 +496,7 @@ export const TemplateList = (type, context) => {
}, },
dms_posting_sheet: { dms_posting_sheet: {
title: i18n.t("printcenter.jobs.dms_posting_sheet"), title: i18n.t("printcenter.jobs.dms_posting_sheet"),
description: "DMS Posting Sheet", description: "",
subject: i18n.t("printcenter.jobs.dms_posting_sheet"), subject: i18n.t("printcenter.jobs.dms_posting_sheet"),
key: "dms_posting_sheet", key: "dms_posting_sheet",
disabled: false, disabled: false,
@@ -506,39 +508,39 @@ export const TemplateList = (type, context) => {
? { ? {
special_thirdpartypayer: { special_thirdpartypayer: {
title: i18n.t("printcenter.jobs.thirdpartypayer"), title: i18n.t("printcenter.jobs.thirdpartypayer"),
description: "CSI invite", description: "",
key: "special_thirdpartypayer", key: "special_thirdpartypayer",
disabled: false, disabled: false,
}, },
folder_label_multiple: { folder_label_multiple: {
title: i18n.t("printcenter.jobs.folder_label_multiple"), title: i18n.t("printcenter.jobs.folder_label_multiple"),
description: "Folder Label Multiple", description: "",
key: "folder_label_multiple", key: "folder_label_multiple",
disabled: false, disabled: false,
}, },
parts_label_multiple: { parts_label_multiple: {
title: i18n.t("printcenter.jobs.parts_label_multiple"), title: i18n.t("printcenter.jobs.parts_label_multiple"),
description: "Parts Label Multiple", description: "",
key: "parts_label_multiple", key: "parts_label_multiple",
disabled: false, disabled: false,
}, },
parts_invoice_label_single: { parts_invoice_label_single: {
title: i18n.t("printcenter.jobs.parts_invoice_label_single"), title: i18n.t("printcenter.jobs.parts_invoice_label_single"),
description: "Parts Label Multiple", description: "",
key: "parts_invoice_label_single", key: "parts_invoice_label_single",
disabled: false, disabled: false,
ignoreCustomMargins: true, ignoreCustomMargins: true,
}, },
csi_invitation_action: { csi_invitation_action: {
title: i18n.t("printcenter.jobs.csi_invitation_action"), title: i18n.t("printcenter.jobs.csi_invitation_action"),
description: "CSI invite", description: "",
key: "csi_invitation_action", key: "csi_invitation_action",
subject: i18n.t("printcenter.jobs.csi_invitation_action"), subject: i18n.t("printcenter.jobs.csi_invitation_action"),
disabled: false, disabled: false,
}, },
individual_job_note: { individual_job_note: {
title: i18n.t("printcenter.jobs.individual_job_note"), title: i18n.t("printcenter.jobs.individual_job_note"),
description: "CSI invite", description: "",
key: "individual_job_note", key: "individual_job_note",
subject: i18n.t("printcenter.jobs.individual_job_note", { subject: i18n.t("printcenter.jobs.individual_job_note", {
ro_number: (context && context.ro_number) || "", ro_number: (context && context.ro_number) || "",
@@ -551,7 +553,7 @@ export const TemplateList = (type, context) => {
? { ? {
appointment_confirmation: { appointment_confirmation: {
title: i18n.t("printcenter.appointments.appointment_confirmation"), title: i18n.t("printcenter.appointments.appointment_confirmation"),
description: "Appointment Confirmation", description: "",
subject: i18n.t( subject: i18n.t(
"printcenter.appointments.appointment_confirmation" "printcenter.appointments.appointment_confirmation"
), ),
@@ -564,7 +566,7 @@ export const TemplateList = (type, context) => {
? { ? {
parts_order: { parts_order: {
title: i18n.t("printcenter.jobs.parts_order"), title: i18n.t("printcenter.jobs.parts_order"),
description: "Parts Order", description: "",
key: "parts_order", key: "parts_order",
subject: i18n.t("printcenter.subjects.jobs.parts_order", { subject: i18n.t("printcenter.subjects.jobs.parts_order", {
ro_number: context && context.job && context.job.ro_number, ro_number: context && context.job && context.job.ro_number,
@@ -578,7 +580,7 @@ export const TemplateList = (type, context) => {
}, },
sublet_order: { sublet_order: {
title: i18n.t("printcenter.jobs.sublet_order"), title: i18n.t("printcenter.jobs.sublet_order"),
description: "Parts Order", description: "",
key: "sublet_order", key: "sublet_order",
subject: i18n.t("printcenter.subjects.jobs.sublet_order", { subject: i18n.t("printcenter.subjects.jobs.sublet_order", {
ro_number: context && context.job && context.job.ro_number, ro_number: context && context.job && context.job.ro_number,
@@ -593,7 +595,7 @@ export const TemplateList = (type, context) => {
parts_return_slip: { parts_return_slip: {
title: i18n.t("printcenter.jobs.parts_return_slip"), title: i18n.t("printcenter.jobs.parts_return_slip"),
subject: i18n.t("printcenter.jobs.parts_return_slip"), subject: i18n.t("printcenter.jobs.parts_return_slip"),
description: "Parts Return", description: "",
key: "parts_return_slip", key: "parts_return_slip",
disabled: false, disabled: false,
}, },
@@ -603,7 +605,7 @@ export const TemplateList = (type, context) => {
? { ? {
payment_receipt: { payment_receipt: {
title: i18n.t("printcenter.jobs.payment_receipt"), title: i18n.t("printcenter.jobs.payment_receipt"),
description: "Payment Receipt", description: "",
subject: i18n.t("printcenter.jobs.payment_receipt"), subject: i18n.t("printcenter.jobs.payment_receipt"),
key: "payment_receipt", key: "payment_receipt",
disabled: false, disabled: false,
@@ -1891,7 +1893,7 @@ export const TemplateList = (type, context) => {
title: i18n.t( title: i18n.t(
"printcenter.courtesycarcontract.courtesy_car_contract" "printcenter.courtesycarcontract.courtesy_car_contract"
), ),
description: "Est Detail", description: "",
subject: i18n.t( subject: i18n.t(
"printcenter.courtesycarcontract.courtesy_car_contract" "printcenter.courtesycarcontract.courtesy_car_contract"
), ),
@@ -1900,7 +1902,7 @@ export const TemplateList = (type, context) => {
}, },
courtesy_car_terms: { courtesy_car_terms: {
title: i18n.t("printcenter.courtesycarcontract.courtesy_car_terms"), title: i18n.t("printcenter.courtesycarcontract.courtesy_car_terms"),
description: "Est Detail", description: "",
subject: i18n.t( subject: i18n.t(
"printcenter.courtesycarcontract.courtesy_car_terms" "printcenter.courtesycarcontract.courtesy_car_terms"
), ),
@@ -1911,7 +1913,7 @@ export const TemplateList = (type, context) => {
title: i18n.t( title: i18n.t(
"printcenter.courtesycarcontract.courtesy_car_impound" "printcenter.courtesycarcontract.courtesy_car_impound"
), ),
description: "Est Detail", description: "",
subject: i18n.t( subject: i18n.t(
"printcenter.courtesycarcontract.courtesy_car_impound" "printcenter.courtesycarcontract.courtesy_car_impound"
), ),
@@ -1926,7 +1928,7 @@ export const TemplateList = (type, context) => {
title: i18n.t( title: i18n.t(
"printcenter.courtesycarcontract.courtesy_car_inventory" "printcenter.courtesycarcontract.courtesy_car_inventory"
), ),
description: "Est Detail", description: "",
subject: i18n.t( subject: i18n.t(
"printcenter.courtesycarcontract.courtesy_car_inventory" "printcenter.courtesycarcontract.courtesy_car_inventory"
), ),
@@ -1939,7 +1941,7 @@ export const TemplateList = (type, context) => {
? { ? {
inhouse_invoice: { inhouse_invoice: {
title: i18n.t("printcenter.bills.inhouse_invoice"), title: i18n.t("printcenter.bills.inhouse_invoice"),
description: "Est Detail", description: "",
subject: i18n.t("printcenter.bills.inhouse_invoice"), subject: i18n.t("printcenter.bills.inhouse_invoice"),
key: "inhouse_invoice", key: "inhouse_invoice",
disabled: false, disabled: false,
@@ -1950,7 +1952,7 @@ export const TemplateList = (type, context) => {
? { ? {
// timetickets: { // timetickets: {
// title: i18n.t("printcenter.timetickets.timetickets"), // title: i18n.t("printcenter.timetickets.timetickets"),
// description: "Est Detail", // description: "",
// subject: `${i18n.t("printcenter.timetickets.timetickets")} - ${ // subject: `${i18n.t("printcenter.timetickets.timetickets")} - ${
// context && context.job && context.job.ro_number // context && context.job && context.job.ro_number
// }`, // }`,
@@ -1963,14 +1965,14 @@ export const TemplateList = (type, context) => {
? { ? {
purchases_by_vendor_detailed: { purchases_by_vendor_detailed: {
title: i18n.t("printcenter.vendors.purchases_by_vendor_detailed"), title: i18n.t("printcenter.vendors.purchases_by_vendor_detailed"),
description: "Est Detail", description: "",
subject: i18n.t("printcenter.vendors.purchases_by_vendor_detailed"), subject: i18n.t("printcenter.vendors.purchases_by_vendor_detailed"),
key: "purchases_by_vendor_detailed", key: "purchases_by_vendor_detailed",
disabled: false, disabled: false,
}, },
purchases_by_vendor_summary: { purchases_by_vendor_summary: {
title: i18n.t("printcenter.vendors.purchases_by_vendor_summary"), title: i18n.t("printcenter.vendors.purchases_by_vendor_summary"),
description: "Est Detail", description: "",
subject: i18n.t("printcenter.vendors.purchases_by_vendor_summary"), subject: i18n.t("printcenter.vendors.purchases_by_vendor_summary"),
key: "purchases_by_vendor_summary", key: "purchases_by_vendor_summary",
disabled: false, disabled: false,
@@ -2043,21 +2045,21 @@ export const TemplateList = (type, context) => {
? { ? {
ca_bc_etf_table: { ca_bc_etf_table: {
title: i18n.t("printcenter.payments.ca_bc_etf_table"), title: i18n.t("printcenter.payments.ca_bc_etf_table"),
description: "Est Detail", description: "",
subject: i18n.t("printcenter.payments.ca_bc_etf_table"), subject: i18n.t("printcenter.payments.ca_bc_etf_table"),
key: "ca_bc_etf_table", key: "ca_bc_etf_table",
disabled: false, disabled: false,
}, },
exported_payroll: { exported_payroll: {
title: i18n.t("printcenter.payments.exported_payroll"), title: i18n.t("printcenter.payments.exported_payroll"),
description: "Est Detail", description: "",
subject: i18n.t("printcenter.payments.exported_payroll"), subject: i18n.t("printcenter.payments.exported_payroll"),
key: "exported_payroll", key: "exported_payroll",
disabled: false, disabled: false,
}, },
attendance_detail_csv: { attendance_detail_csv: {
title: i18n.t("printcenter.special.attendance_detail_csv"), title: i18n.t("printcenter.special.attendance_detail_csv"),
description: "Est Detail", description: "",
subject: i18n.t("printcenter.special.attendance_detail_csv"), subject: i18n.t("printcenter.special.attendance_detail_csv"),
key: "attendance_detail_csv", key: "attendance_detail_csv",
disabled: false, disabled: false,

View File

@@ -941,6 +941,7 @@
- md_referral_sources - md_referral_sources
- md_responsibility_centers - md_responsibility_centers
- md_ro_statuses - md_ro_statuses
- md_tasks_presets
- md_to_emails - md_to_emails
- messagingservicesid - messagingservicesid
- pbs_configuration - pbs_configuration
@@ -1038,6 +1039,7 @@
- md_referral_sources - md_referral_sources
- md_responsibility_centers - md_responsibility_centers
- md_ro_statuses - md_ro_statuses
- md_tasks_presets
- md_to_emails - md_to_emails
- pbs_configuration - pbs_configuration
- phone - phone

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_tasks_presets" jsonb
-- not null default jsonb_build_object();

View File

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

View File

@@ -265,20 +265,20 @@ const CreateRepairOrderTag = (job, errorCallback) => {
}${job.est_ct_fn ? job.est_ct_fn : ""}`, }${job.est_ct_fn ? job.est_ct_fn : ""}`,
}, },
CustomerInformation: { CustomerInformation: {
FirstName: job.ownr_fn || "", FirstName: "",
LastName: job.ownr_ln || "", LastName: "",
Street: job.ownr_addr1 || "", Street: "",
City: job.ownr_city || "", City: "",
State: job.ownr_st || "", State: "",
Zip: (job.ownr_zip && job.ownr_zip.substring(0, 3)) || "", Zip: (job.ownr_zip && job.ownr_zip.substring(0, 3)) || "",
Phone1: job.ownr_ph1 || "", Phone1: "",
Phone2: null, Phone2: null,
Phone2Extension: null, Phone2Extension: null,
Phone3: null, Phone3: null,
Phone3Extension: null, Phone3Extension: null,
FileComments: null, FileComments: null,
Source: null, Source: null,
Email: job.ownr_ea || "", Email: "",
RetWhsl: null, RetWhsl: null,
Cat: null, Cat: null,
InsuredorClaimantFlag: null, InsuredorClaimantFlag: null,
@@ -762,7 +762,12 @@ const CreateCosts = (job) => {
}, {}); }, {});
//If the hourly rates for job costing are set, add them in. //If the hourly rates for job costing are set, add them in.
if (job.bodyshop.jc_hourly_rates && job.bodyshop.jc_hourly_rates.mapa) { if (
job.bodyshop.jc_hourly_rates &&
(job.bodyshop.jc_hourly_rates.mapa ||
typeof job.bodyshop.jc_hourly_rates.mapa === "number" ||
isNaN(job.bodyshop.jc_hourly_rates.mapa) === false)
) {
if ( if (
!billTotalsByCostCenters[ !billTotalsByCostCenters[
job.bodyshop.md_responsibility_centers.defaults.costs.MAPA job.bodyshop.md_responsibility_centers.defaults.costs.MAPA

View File

@@ -612,7 +612,12 @@ function GenerateCostingData(job) {
//If the hourly rates for job costing are set, add them in. //If the hourly rates for job costing are set, add them in.
if (job.bodyshop.jc_hourly_rates && job.bodyshop.jc_hourly_rates.mapa) { if (
job.bodyshop.jc_hourly_rates &&
(job.bodyshop.jc_hourly_rates.mapa ||
typeof job.bodyshop.jc_hourly_rates.mapa === "number" ||
isNaN(job.bodyshop.jc_hourly_rates.mapa) === false)
) {
if ( if (
!billTotalsByCostCenters.additionalCosts[ !billTotalsByCostCenters.additionalCosts[
job.bodyshop.md_responsibility_centers.defaults.costs.MAPA job.bodyshop.md_responsibility_centers.defaults.costs.MAPA
@@ -626,7 +631,9 @@ function GenerateCostingData(job) {
billTotalsByCostCenters.additionalCosts[ billTotalsByCostCenters.additionalCosts[
job.bodyshop.md_responsibility_centers.defaults.costs.MAPA job.bodyshop.md_responsibility_centers.defaults.costs.MAPA
] = Dinero({ ] = Dinero({
amount: Math.round((job.mixdata[0] && job.mixdata[0].totalliquidcost || 0) * 100) amount: Math.round(
((job.mixdata[0] && job.mixdata[0].totalliquidcost) || 0) * 100
),
}); });
} else { } else {
billTotalsByCostCenters.additionalCosts[ billTotalsByCostCenters.additionalCosts[