From 79a90bb9ee669c848eaacd4929da193d1a5bada1 Mon Sep 17 00:00:00 2001 From: Allan Carr Date: Thu, 27 Apr 2023 17:13:37 -0700 Subject: [PATCH 01/14] IO-2257 PBS Export of Credits Amounts less then 0 (ie all credits) would not get pushed to transactionObject. Expand to be both sides of zero to allow for credits within transactionObject --- server/accounting/pbs/pbs-ap-allocations.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/accounting/pbs/pbs-ap-allocations.js b/server/accounting/pbs/pbs-ap-allocations.js index 8c4ebad11..10b11cb9b 100644 --- a/server/accounting/pbs/pbs-ap-allocations.js +++ b/server/accounting/pbs/pbs-ap-allocations.js @@ -164,7 +164,7 @@ async function PbsCalculateAllocationsAp(socket, billids) { let APAmount = Dinero(); Object.keys(billHash).map((key) => { - if (billHash[key].Amount.getAmount() > 0) { + if (billHash[key].Amount.getAmount() > 0 || billHash[key].Amount.getAmount() < 0) { transactionObject.Posting.Lines.push({ ...billHash[key], Amount: billHash[key].Amount.toFormat("0.00"), From 51ebfd86e7a32492166663daf7aaf59b602dcae7 Mon Sep 17 00:00:00 2001 From: Patrick Fic Date: Fri, 28 Apr 2023 09:37:49 -0700 Subject: [PATCH 02/14] Additional database indexing. --- .../down.sql | 1 + .../1682698938644_create_index_job_conversations_jobid/up.sql | 2 ++ .../down.sql | 1 + .../up.sql | 2 ++ .../down.sql | 1 + .../up.sql | 2 ++ .../1682699225713_create_index_idx_payments_jobid/down.sql | 1 + .../1682699225713_create_index_idx_payments_jobid/up.sql | 2 ++ .../1682699247978_create_index_idx_mixdata_jobid/down.sql | 1 + .../1682699247978_create_index_idx_mixdata_jobid/up.sql | 2 ++ .../1682699275331_create_index_idx_notes_jobid/down.sql | 1 + .../1682699275331_create_index_idx_notes_jobid/up.sql | 2 ++ .../1682699340173_create_index_idx_users_authid/down.sql | 1 + .../1682699340173_create_index_idx_users_authid/up.sql | 2 ++ .../1682699384361_create_index_idx_employees_shopid/down.sql | 1 + .../1682699384361_create_index_idx_employees_shopid/up.sql | 2 ++ .../down.sql | 1 + .../up.sql | 2 ++ .../down.sql | 1 + .../1682699511254_create_index_idx_counters_shopid_type/up.sql | 2 ++ hasura/migrations/1682699741754_run_sql_migration/down.sql | 3 +++ hasura/migrations/1682699741754_run_sql_migration/up.sql | 1 + 22 files changed, 34 insertions(+) create mode 100644 hasura/migrations/1682698938644_create_index_job_conversations_jobid/down.sql create mode 100644 hasura/migrations/1682698938644_create_index_job_conversations_jobid/up.sql create mode 100644 hasura/migrations/1682698954457_create_index_job_conversations_conversationid/down.sql create mode 100644 hasura/migrations/1682698954457_create_index_job_conversations_conversationid/up.sql create mode 100644 hasura/migrations/1682699082565_create_index_job_conversations_job_and_conversation_id/down.sql create mode 100644 hasura/migrations/1682699082565_create_index_job_conversations_job_and_conversation_id/up.sql create mode 100644 hasura/migrations/1682699225713_create_index_idx_payments_jobid/down.sql create mode 100644 hasura/migrations/1682699225713_create_index_idx_payments_jobid/up.sql create mode 100644 hasura/migrations/1682699247978_create_index_idx_mixdata_jobid/down.sql create mode 100644 hasura/migrations/1682699247978_create_index_idx_mixdata_jobid/up.sql create mode 100644 hasura/migrations/1682699275331_create_index_idx_notes_jobid/down.sql create mode 100644 hasura/migrations/1682699275331_create_index_idx_notes_jobid/up.sql create mode 100644 hasura/migrations/1682699340173_create_index_idx_users_authid/down.sql create mode 100644 hasura/migrations/1682699340173_create_index_idx_users_authid/up.sql create mode 100644 hasura/migrations/1682699384361_create_index_idx_employees_shopid/down.sql create mode 100644 hasura/migrations/1682699384361_create_index_idx_employees_shopid/up.sql create mode 100644 hasura/migrations/1682699481332_create_index_idx_employee_vacation_employeeid/down.sql create mode 100644 hasura/migrations/1682699481332_create_index_idx_employee_vacation_employeeid/up.sql create mode 100644 hasura/migrations/1682699511254_create_index_idx_counters_shopid_type/down.sql create mode 100644 hasura/migrations/1682699511254_create_index_idx_counters_shopid_type/up.sql create mode 100644 hasura/migrations/1682699741754_run_sql_migration/down.sql create mode 100644 hasura/migrations/1682699741754_run_sql_migration/up.sql diff --git a/hasura/migrations/1682698938644_create_index_job_conversations_jobid/down.sql b/hasura/migrations/1682698938644_create_index_job_conversations_jobid/down.sql new file mode 100644 index 000000000..b6ccf8a39 --- /dev/null +++ b/hasura/migrations/1682698938644_create_index_job_conversations_jobid/down.sql @@ -0,0 +1 @@ +DROP INDEX IF EXISTS "public"."job_conversations_jobid"; diff --git a/hasura/migrations/1682698938644_create_index_job_conversations_jobid/up.sql b/hasura/migrations/1682698938644_create_index_job_conversations_jobid/up.sql new file mode 100644 index 000000000..2e943a718 --- /dev/null +++ b/hasura/migrations/1682698938644_create_index_job_conversations_jobid/up.sql @@ -0,0 +1,2 @@ +CREATE INDEX "job_conversations_jobid" on + "public"."job_conversations" using btree ("jobid"); diff --git a/hasura/migrations/1682698954457_create_index_job_conversations_conversationid/down.sql b/hasura/migrations/1682698954457_create_index_job_conversations_conversationid/down.sql new file mode 100644 index 000000000..5bf3f0081 --- /dev/null +++ b/hasura/migrations/1682698954457_create_index_job_conversations_conversationid/down.sql @@ -0,0 +1 @@ +DROP INDEX IF EXISTS "public"."job_conversations_conversationid"; diff --git a/hasura/migrations/1682698954457_create_index_job_conversations_conversationid/up.sql b/hasura/migrations/1682698954457_create_index_job_conversations_conversationid/up.sql new file mode 100644 index 000000000..327ed4001 --- /dev/null +++ b/hasura/migrations/1682698954457_create_index_job_conversations_conversationid/up.sql @@ -0,0 +1,2 @@ +CREATE INDEX "job_conversations_conversationid" on + "public"."job_conversations" using btree ("conversationid"); diff --git a/hasura/migrations/1682699082565_create_index_job_conversations_job_and_conversation_id/down.sql b/hasura/migrations/1682699082565_create_index_job_conversations_job_and_conversation_id/down.sql new file mode 100644 index 000000000..d7e025c85 --- /dev/null +++ b/hasura/migrations/1682699082565_create_index_job_conversations_job_and_conversation_id/down.sql @@ -0,0 +1 @@ +DROP INDEX IF EXISTS "public"."job_conversations_job_and_conversation_id"; diff --git a/hasura/migrations/1682699082565_create_index_job_conversations_job_and_conversation_id/up.sql b/hasura/migrations/1682699082565_create_index_job_conversations_job_and_conversation_id/up.sql new file mode 100644 index 000000000..1a40c8940 --- /dev/null +++ b/hasura/migrations/1682699082565_create_index_job_conversations_job_and_conversation_id/up.sql @@ -0,0 +1,2 @@ +CREATE INDEX "job_conversations_job_and_conversation_id" on + "public"."job_conversations" using btree ("conversationid", "jobid"); diff --git a/hasura/migrations/1682699225713_create_index_idx_payments_jobid/down.sql b/hasura/migrations/1682699225713_create_index_idx_payments_jobid/down.sql new file mode 100644 index 000000000..a2f068564 --- /dev/null +++ b/hasura/migrations/1682699225713_create_index_idx_payments_jobid/down.sql @@ -0,0 +1 @@ +DROP INDEX IF EXISTS "public"."idx_payments_jobid"; diff --git a/hasura/migrations/1682699225713_create_index_idx_payments_jobid/up.sql b/hasura/migrations/1682699225713_create_index_idx_payments_jobid/up.sql new file mode 100644 index 000000000..8cee7ac44 --- /dev/null +++ b/hasura/migrations/1682699225713_create_index_idx_payments_jobid/up.sql @@ -0,0 +1,2 @@ +CREATE INDEX "idx_payments_jobid" on + "public"."payments" using btree ("jobid"); diff --git a/hasura/migrations/1682699247978_create_index_idx_mixdata_jobid/down.sql b/hasura/migrations/1682699247978_create_index_idx_mixdata_jobid/down.sql new file mode 100644 index 000000000..f00184d19 --- /dev/null +++ b/hasura/migrations/1682699247978_create_index_idx_mixdata_jobid/down.sql @@ -0,0 +1 @@ +DROP INDEX IF EXISTS "public"."idx_mixdata_jobid"; diff --git a/hasura/migrations/1682699247978_create_index_idx_mixdata_jobid/up.sql b/hasura/migrations/1682699247978_create_index_idx_mixdata_jobid/up.sql new file mode 100644 index 000000000..611ff6c0f --- /dev/null +++ b/hasura/migrations/1682699247978_create_index_idx_mixdata_jobid/up.sql @@ -0,0 +1,2 @@ +CREATE INDEX "idx_mixdata_jobid" on + "public"."mixdata" using btree ("jobid"); diff --git a/hasura/migrations/1682699275331_create_index_idx_notes_jobid/down.sql b/hasura/migrations/1682699275331_create_index_idx_notes_jobid/down.sql new file mode 100644 index 000000000..a6ceecefa --- /dev/null +++ b/hasura/migrations/1682699275331_create_index_idx_notes_jobid/down.sql @@ -0,0 +1 @@ +DROP INDEX IF EXISTS "public"."idx_notes_jobid"; diff --git a/hasura/migrations/1682699275331_create_index_idx_notes_jobid/up.sql b/hasura/migrations/1682699275331_create_index_idx_notes_jobid/up.sql new file mode 100644 index 000000000..da3ee8f13 --- /dev/null +++ b/hasura/migrations/1682699275331_create_index_idx_notes_jobid/up.sql @@ -0,0 +1,2 @@ +CREATE INDEX "idx_notes_jobid" on + "public"."notes" using btree ("jobid"); diff --git a/hasura/migrations/1682699340173_create_index_idx_users_authid/down.sql b/hasura/migrations/1682699340173_create_index_idx_users_authid/down.sql new file mode 100644 index 000000000..599333576 --- /dev/null +++ b/hasura/migrations/1682699340173_create_index_idx_users_authid/down.sql @@ -0,0 +1 @@ +DROP INDEX IF EXISTS "public"."idx_users_authid"; diff --git a/hasura/migrations/1682699340173_create_index_idx_users_authid/up.sql b/hasura/migrations/1682699340173_create_index_idx_users_authid/up.sql new file mode 100644 index 000000000..bb33ff564 --- /dev/null +++ b/hasura/migrations/1682699340173_create_index_idx_users_authid/up.sql @@ -0,0 +1,2 @@ +CREATE INDEX "idx_users_authid" on + "public"."users" using btree ("authid"); diff --git a/hasura/migrations/1682699384361_create_index_idx_employees_shopid/down.sql b/hasura/migrations/1682699384361_create_index_idx_employees_shopid/down.sql new file mode 100644 index 000000000..cc9ed43f2 --- /dev/null +++ b/hasura/migrations/1682699384361_create_index_idx_employees_shopid/down.sql @@ -0,0 +1 @@ +DROP INDEX IF EXISTS "public"."idx_employees_shopid"; diff --git a/hasura/migrations/1682699384361_create_index_idx_employees_shopid/up.sql b/hasura/migrations/1682699384361_create_index_idx_employees_shopid/up.sql new file mode 100644 index 000000000..81d9f243d --- /dev/null +++ b/hasura/migrations/1682699384361_create_index_idx_employees_shopid/up.sql @@ -0,0 +1,2 @@ +CREATE INDEX "idx_employees_shopid" on + "public"."employees" using btree ("shopid"); diff --git a/hasura/migrations/1682699481332_create_index_idx_employee_vacation_employeeid/down.sql b/hasura/migrations/1682699481332_create_index_idx_employee_vacation_employeeid/down.sql new file mode 100644 index 000000000..0ba5b0383 --- /dev/null +++ b/hasura/migrations/1682699481332_create_index_idx_employee_vacation_employeeid/down.sql @@ -0,0 +1 @@ +DROP INDEX IF EXISTS "public"."idx_employee_vacation_employeeid"; diff --git a/hasura/migrations/1682699481332_create_index_idx_employee_vacation_employeeid/up.sql b/hasura/migrations/1682699481332_create_index_idx_employee_vacation_employeeid/up.sql new file mode 100644 index 000000000..0e4074dfa --- /dev/null +++ b/hasura/migrations/1682699481332_create_index_idx_employee_vacation_employeeid/up.sql @@ -0,0 +1,2 @@ +CREATE INDEX "idx_employee_vacation_employeeid" on + "public"."employee_vacation" using btree ("employeeid"); diff --git a/hasura/migrations/1682699511254_create_index_idx_counters_shopid_type/down.sql b/hasura/migrations/1682699511254_create_index_idx_counters_shopid_type/down.sql new file mode 100644 index 000000000..301722ce7 --- /dev/null +++ b/hasura/migrations/1682699511254_create_index_idx_counters_shopid_type/down.sql @@ -0,0 +1 @@ +DROP INDEX IF EXISTS "public"."idx_counters_shopid_type"; diff --git a/hasura/migrations/1682699511254_create_index_idx_counters_shopid_type/up.sql b/hasura/migrations/1682699511254_create_index_idx_counters_shopid_type/up.sql new file mode 100644 index 000000000..d12ab6b70 --- /dev/null +++ b/hasura/migrations/1682699511254_create_index_idx_counters_shopid_type/up.sql @@ -0,0 +1,2 @@ +CREATE INDEX "idx_counters_shopid_type" on + "public"."counters" using btree ("shopid", "countertype"); diff --git a/hasura/migrations/1682699741754_run_sql_migration/down.sql b/hasura/migrations/1682699741754_run_sql_migration/down.sql new file mode 100644 index 000000000..6d390e239 --- /dev/null +++ b/hasura/migrations/1682699741754_run_sql_migration/down.sql @@ -0,0 +1,3 @@ +-- Could not auto-generate a down migration. +-- Please write an appropriate down migration for the SQL below: +-- CREATE INDEX idx_jobs_inproduction_true ON jobs(inproduction) WHERE inproduction = true; diff --git a/hasura/migrations/1682699741754_run_sql_migration/up.sql b/hasura/migrations/1682699741754_run_sql_migration/up.sql new file mode 100644 index 000000000..60357ff67 --- /dev/null +++ b/hasura/migrations/1682699741754_run_sql_migration/up.sql @@ -0,0 +1 @@ +CREATE INDEX idx_jobs_inproduction_true ON jobs(inproduction) WHERE inproduction = true; From adf8cf9e8d00d7273bf797e00fec3b3e14821dae Mon Sep 17 00:00:00 2001 From: Patrick Fic Date: Mon, 1 May 2023 13:05:59 -0700 Subject: [PATCH 03/14] Additional hasura indexes. --- hasura/migrations/1682703406197_run_sql_migration/down.sql | 3 +++ hasura/migrations/1682703406197_run_sql_migration/up.sql | 1 + .../down.sql | 1 + .../up.sql | 2 ++ 4 files changed, 7 insertions(+) create mode 100644 hasura/migrations/1682703406197_run_sql_migration/down.sql create mode 100644 hasura/migrations/1682703406197_run_sql_migration/up.sql create mode 100644 hasura/migrations/1682703475365_create_index_idx_associations_shopid_user/down.sql create mode 100644 hasura/migrations/1682703475365_create_index_idx_associations_shopid_user/up.sql diff --git a/hasura/migrations/1682703406197_run_sql_migration/down.sql b/hasura/migrations/1682703406197_run_sql_migration/down.sql new file mode 100644 index 000000000..2143bd5a5 --- /dev/null +++ b/hasura/migrations/1682703406197_run_sql_migration/down.sql @@ -0,0 +1,3 @@ +-- Could not auto-generate a down migration. +-- Please write an appropriate down migration for the SQL below: +-- CREATE INDEX idx_associations_active_true ON associations(active) WHERE active = true; diff --git a/hasura/migrations/1682703406197_run_sql_migration/up.sql b/hasura/migrations/1682703406197_run_sql_migration/up.sql new file mode 100644 index 000000000..3b4be2f4e --- /dev/null +++ b/hasura/migrations/1682703406197_run_sql_migration/up.sql @@ -0,0 +1 @@ +CREATE INDEX idx_associations_active_true ON associations(active) WHERE active = true; diff --git a/hasura/migrations/1682703475365_create_index_idx_associations_shopid_user/down.sql b/hasura/migrations/1682703475365_create_index_idx_associations_shopid_user/down.sql new file mode 100644 index 000000000..cd3c0d006 --- /dev/null +++ b/hasura/migrations/1682703475365_create_index_idx_associations_shopid_user/down.sql @@ -0,0 +1 @@ +DROP INDEX IF EXISTS "public"."idx_associations_shopid_user"; diff --git a/hasura/migrations/1682703475365_create_index_idx_associations_shopid_user/up.sql b/hasura/migrations/1682703475365_create_index_idx_associations_shopid_user/up.sql new file mode 100644 index 000000000..21b9ca11b --- /dev/null +++ b/hasura/migrations/1682703475365_create_index_idx_associations_shopid_user/up.sql @@ -0,0 +1,2 @@ +CREATE INDEX "idx_associations_shopid_user" on + "public"."associations" using btree ("shopid", "useremail", "active"); From 2eb4e142ffea1ff768dd8249b4084226dfbc1ef0 Mon Sep 17 00:00:00 2001 From: Allan Carr Date: Mon, 1 May 2023 13:48:18 -0700 Subject: [PATCH 04/14] IO-2190 Correct lookup location for MAPA Hrs --- server/data/autohouse.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/data/autohouse.js b/server/data/autohouse.js index b4e29b086..94090c0f2 100644 --- a/server/data/autohouse.js +++ b/server/data/autohouse.js @@ -799,7 +799,7 @@ const CreateCosts = (job) => { (job.bodyshop.jc_hourly_rates && job.bodyshop.jc_hourly_rates.mapa * 100) || 0, - }).multiply(materialsHours.mapaHrs) + }).multiply(job.job_totals.rates.mapa.hours) ); } } From 5660de42afedcaa3e77d7dd4b4d2db650873d8bd Mon Sep 17 00:00:00 2001 From: Patrick Fic Date: Tue, 2 May 2023 12:31:18 -0700 Subject: [PATCH 05/14] Add support email to server side emails. --- server/email/sendemail.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/email/sendemail.js b/server/email/sendemail.js index 046ca16ee..cbe80c2a0 100644 --- a/server/email/sendemail.js +++ b/server/email/sendemail.js @@ -28,7 +28,7 @@ exports.sendServerEmail = async function ({ subject, text }) { transporter.sendMail( { from: `ImEX Online API - ${process.env.NODE_ENV} `, - to: ["patrick@imexsystems.ca"], + to: ["patrick@imexsystems.ca", "support@thinkimex.com"], subject: subject, text: text, ses: { From f66d9b8c099ebd4e136b4cbf80ec0ab1fdd53947 Mon Sep 17 00:00:00 2001 From: Allan Carr Date: Tue, 2 May 2023 14:51:47 -0700 Subject: [PATCH 06/14] IO-2190 Autohouse & Job Costing Insure that amount going into Dinero is Integer --- server/data/autohouse.js | 2 +- server/job/job-costing.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/data/autohouse.js b/server/data/autohouse.js index 94090c0f2..5e32c81de 100644 --- a/server/data/autohouse.js +++ b/server/data/autohouse.js @@ -772,7 +772,7 @@ const CreateCosts = (job) => { billTotalsByCostCenters[ job.bodyshop.md_responsibility_centers.defaults.costs.MAPA ] = Dinero({ - amount: (job.mixdata[0] && job.mixdata[0].totalliquidcost * 100) || 0, + amount: Math.round((job.mixdata[0] && job.mixdata[0].totalliquidcost || 0) * 100) }); } else { billTotalsByCostCenters[ diff --git a/server/job/job-costing.js b/server/job/job-costing.js index 935d37661..94af28402 100644 --- a/server/job/job-costing.js +++ b/server/job/job-costing.js @@ -626,7 +626,7 @@ function GenerateCostingData(job) { billTotalsByCostCenters.additionalCosts[ job.bodyshop.md_responsibility_centers.defaults.costs.MAPA ] = Dinero({ - amount: (job.mixdata[0] && job.mixdata[0].totalliquidcost * 100) || 0, + amount: Math.round((job.mixdata[0] && job.mixdata[0].totalliquidcost || 0) * 100) }); } else { billTotalsByCostCenters.additionalCosts[ From 0cabd80b9452243c5a865032c7b9c8a48cc72eb7 Mon Sep 17 00:00:00 2001 From: swtmply Date: Thu, 4 May 2023 00:39:50 +0800 Subject: [PATCH 07/14] IO-1722 job size color in production card --- ...ard-kanban-card-color-legend.component.jsx | 37 +++++++++++++++++++ ...production-board-kanban-card.component.jsx | 31 ++++++++++++++++ ...n-board-kanban.card-settings.component.jsx | 7 ++++ .../production-board-kanban.component.jsx | 7 ++++ .../shop-info.scheduling.component.jsx | 9 +++++ 5 files changed, 91 insertions(+) create mode 100644 client/src/components/production-board-kanban-card/production-board-kanban-card-color-legend.component.jsx diff --git a/client/src/components/production-board-kanban-card/production-board-kanban-card-color-legend.component.jsx b/client/src/components/production-board-kanban-card/production-board-kanban-card-color-legend.component.jsx new file mode 100644 index 000000000..bfdebaf45 --- /dev/null +++ b/client/src/components/production-board-kanban-card/production-board-kanban-card-color-legend.component.jsx @@ -0,0 +1,37 @@ +import { Col, List, Space, Typography } from "antd"; +import React from "react"; + +const CardColorLegend = ({ bodyshop, cardSettings }) => { + const data = bodyshop.ssbuckets.map((size) => ({ + label: size.label, + color: size.color?.hex ?? "white", + })); + + return ( + + Legend: + ( + + +
+
{item.label}
+
+
+ )} + /> + + ); +}; + +export default CardColorLegend; diff --git a/client/src/components/production-board-kanban-card/production-board-kanban-card.component.jsx b/client/src/components/production-board-kanban-card/production-board-kanban-card.component.jsx index 750204fb5..7a16ebdc0 100644 --- a/client/src/components/production-board-kanban-card/production-board-kanban-card.component.jsx +++ b/client/src/components/production-board-kanban-card/production-board-kanban-card.component.jsx @@ -18,6 +18,26 @@ import moment from "moment"; import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; import JobPartsQueueCount from "../job-parts-queue-count/job-parts-queue-count.component"; +const cardColor = (job_sizes, totalHrs) => { + for (const size of job_sizes) { + if (totalHrs <= (size.lt || 999) && totalHrs >= size.gte) { + if (size.color) { + return size.color.hex; + } + } + } + return ""; +}; + +function getContrastYIQ(hexColor) { + const r = parseInt(hexColor.substr(1, 2), 16); + const g = parseInt(hexColor.substr(3, 2), 16); + const b = parseInt(hexColor.substr(5, 2), 16); + const yiq = (r * 299 + g * 587 + b * 114) / 1000; + + return yiq >= 128 ? "black" : "white"; +} + export default function ProductionBoardCard( technician, card, @@ -54,10 +74,21 @@ export default function ProductionBoardCard( .isSame(moment(card.scheduled_completion), "day") && "production-completion-soon")); + const totalHrs = + card.labhrs.aggregate.sum.mod_lb_hrs + card.larhrs.aggregate.sum.mod_lb_hrs; + return ( diff --git a/client/src/components/production-board-kanban/production-board-kanban.card-settings.component.jsx b/client/src/components/production-board-kanban/production-board-kanban.card-settings.component.jsx index 25c77e307..a89158da1 100644 --- a/client/src/components/production-board-kanban/production-board-kanban.card-settings.component.jsx +++ b/client/src/components/production-board-kanban/production-board-kanban.card-settings.component.jsx @@ -104,6 +104,13 @@ export default function ProductionBoardKanbanCardSettings({ > + + + } /> + + {cardSettings.cardcolor && ( + + )} + + + + + + { From add1eddbc1b0a9e79b073e034cbc8e9a852ae93e Mon Sep 17 00:00:00 2001 From: swtmply Date: Thu, 4 May 2023 01:18:16 +0800 Subject: [PATCH 08/14] IO-1722 added translations --- ...ard-kanban-card-color-legend.component.jsx | 4 +- ...n-board-kanban.card-settings.component.jsx | 2 +- .../shop-info.scheduling.component.jsx | 2 +- client/src/translations/en_us/common.json | 5805 +++++++++-------- 4 files changed, 2909 insertions(+), 2904 deletions(-) diff --git a/client/src/components/production-board-kanban-card/production-board-kanban-card-color-legend.component.jsx b/client/src/components/production-board-kanban-card/production-board-kanban-card-color-legend.component.jsx index bfdebaf45..e9cc0f4e0 100644 --- a/client/src/components/production-board-kanban-card/production-board-kanban-card-color-legend.component.jsx +++ b/client/src/components/production-board-kanban-card/production-board-kanban-card-color-legend.component.jsx @@ -1,7 +1,9 @@ import { Col, List, Space, Typography } from "antd"; import React from "react"; +import { useTranslation } from "react-i18next"; const CardColorLegend = ({ bodyshop, cardSettings }) => { + const { t } = useTranslation(); const data = bodyshop.ssbuckets.map((size) => ({ label: size.label, color: size.color?.hex ?? "white", @@ -9,7 +11,7 @@ const CardColorLegend = ({ bodyshop, cardSettings }) => { return ( - Legend: + {t("production.labels.legend")} diff --git a/client/src/components/shop-info/shop-info.scheduling.component.jsx b/client/src/components/shop-info/shop-info.scheduling.component.jsx index 6588843bd..49145aed9 100644 --- a/client/src/components/shop-info/shop-info.scheduling.component.jsx +++ b/client/src/components/shop-info/shop-info.scheduling.component.jsx @@ -279,7 +279,7 @@ export default function ShopInfoSchedulingComponent({ form }) { diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json index f52178267..95e7433c2 100644 --- a/client/src/translations/en_us/common.json +++ b/client/src/translations/en_us/common.json @@ -1,2903 +1,2906 @@ { - "translation": { - "allocations": { - "actions": { - "assign": "Assign" - }, - "errors": { - "deleting": "Error encountered while deleting allocation. {{message}}", - "saving": "Error while allocating. {{message}}", - "validation": "Please ensure all fields are entered correctly. " - }, - "fields": { - "employee": "Allocated To" - }, - "successes": { - "deleted": "Allocation deleted successfully.", - "save": "Allocated successfully. " - } - }, - "appointments": { - "actions": { - "block": "Block Day", - "calculate": "Calculate SMART Dates", - "cancel": "Cancel Appointment", - "intake": "Intake", - "new": "New Appointment", - "preview": "Preview", - "reschedule": "Reschedule", - "sendreminder": "Send Reminder", - "viewjob": "View Job" - }, - "errors": { - "blocking": "Error creating block {{message}}.", - "canceling": "Error canceling appointment. {{message}}", - "saving": "Error scheduling appointment. {{message}}" - }, - "fields": { - "alt_transport": "Alt. Trans.", - "color": "Appointment Color", - "end": "End", - "note": "Note", - "start": "Start", - "time": "Appointment Time", - "title": "Title" - }, - "labels": { - "arrivedon": "Arrived on: ", - "arrivingjobs": "Arriving Jobs", - "blocked": "Blocked", - "cancelledappointment": "Canceled appointment for: ", - "completingjobs": "Completing Jobs", - "dataconsistency": "{{ro_number}} has a data consistency issue. It may have been excluded for scheduling purposes. CODE: {{code}}.", - "expectedjobs": "Expected Jobs in Production: ", - "expectedprodhrs": "Expected Production Hours:", - "history": "History", - "inproduction": "Jobs In Production", - "manualevent": "Add Manual Appointment", - "noarrivingjobs": "No jobs are arriving.", - "nocompletingjobs": "No jobs scheduled for completion.", - "nodateselected": "No date has been selected.", - "priorappointments": "Previous Appointments", - "reminder": "This is {{shopname}} reminding you about an appointment on {{date}} at {{time}}. Please let us know if you are not able to make the appointment. We look forward to seeing you soon. ", - "scheduledfor": "Scheduled appointment for: ", - "severalerrorsfound": "Several jobs have issues which may prevent accurate smart scheduling. Click to expand.", - "smartscheduling": "Smart Scheduling", - "suggesteddates": "Suggested Dates" - }, - "successes": { - "canceled": "Appointment canceled successfully.", - "created": "Appointment scheduled successfully.", - "saved": "Appointment saved successfully." - } - }, - "associations": { - "actions": { - "activate": "Activate" - }, - "fields": { - "active": "Active?", - "shopname": "Shop Name" - }, - "labels": { - "actions": "Actions" - } - }, - "audit": { - "fields": { - "cc": "CC", - "contents": "Contents", - "created": "Time", - "operation": "Operation", - "status": "Status", - "subject": "Subject", - "to": "To", - "useremail": "User", - "values": "Values" - } - }, - "audit_trail": { - "messages": { - "admin_jobmarkexported": "ADMIN: Job marked as exported.", - "admin_jobmarkforreexport": "ADMIN: Job marked for re-export.", - "admin_jobunvoid": "ADMIN: Job has been unvoided.", - "billposted": "Bill with invoice number {{invoice_number}} posted.", - "billupdated": "Bill with invoice number {{invoice_number}} updated.", - "jobassignmentchange": "Employee {{name}} assigned to {{operation}}", - "jobassignmentremoved": "Employee assignment removed for {{operation}}", - "jobchecklist": "Checklist type \"{{type}}\" completed. In production set to {{inproduction}}. Status set to {{status}}.", - "jobconverted": "Job converted and assigned number {{ro_number}}.", - "jobfieldchanged": "Job field $t(jobs.fields.{{field}}) changed to {{value}}.", - "jobimported": "Job imported.", - "jobinproductionchange": "Job production status set to {{inproduction}}", - "jobioucreated": "IOU Created.", - "jobmodifylbradj": "Labor adjustments modified {{mod_lbr_ty}} / {{hours}}.", - "jobnoteadded": "Note added to job.", - "jobnotedeleted": "Note deleted from job.", - "jobnoteupdated": "Note updated on job.", - "jobspartsorder": "Parts order {{order_number}} added to job.", - "jobspartsreturn": "Parts return {{order_number}} added to job.", - "jobstatuschange": "Job status changed to {{status}}.", - "jobsupplement": "Job supplement imported." - } - }, - "billlines": { - "actions": { - "newline": "New Line" - }, - "fields": { - "actual_cost": "Actual Cost", - "actual_price": "Retail", - "cost_center": "Cost Center", - "federal_tax_applicable": "Fed. Tax?", - "jobline": "Job Line", - "line_desc": "Line Description", - "local_tax_applicable": "Loc. Tax?", - "location": "Location", - "quantity": "Quantity", - "state_tax_applicable": "St. Tax?" - }, - "labels": { - "deductedfromlbr": "Deduct from Labor?", - "entered": "Entered", - "from": "From", - "other": "-- Not On Estimate --", - "reconciled": "Reconciled!", - "unreconciled": "Unreconciled" - }, - "validation": { - "atleastone": "At least one bill line must be entered." - } - }, - "bills": { - "actions": { - "edit": "Edit", - "receive": "Receive Part", - "return": "Return Items" - }, - "errors": { - "creating": "Error adding bill. {{error}}", - "deleting": "Error deleting bill. {{error}}", - "existinginventoryline": "This bill cannot be deleted as it is tied to items in inventory.", - "exporting": "Error exporting payable(s). {{error}}", - "exporting-partner": "Unable to connect to ImEX Partner. Please ensure it is running and logged in.", - "invalidro": "Not a valid RO.", - "invalidvendor": "Not a valid vendor.", - "validation": "Please ensure all fields are entered correctly. " - }, - "fields": { - "allpartslocation": "Parts Bin", - "date": "Bill Date", - "exported": "Exported", - "federal_tax_rate": "Federal Tax Rate", - "invoice_number": "Invoice Number", - "is_credit_memo": "Credit Memo?", - "is_credit_memo_short": "CM", - "local_tax_rate": "Local Tax Rate", - "ro_number": "RO Number", - "state_tax_rate": "Provincial/State Tax Rate", - "total": "Bill Total", - "vendor": "Vendor", - "vendorname": "Vendor Name" - }, - "labels": { - "actions": "Actions", - "bill_lines": "Bill Lines", - "bill_total": "Bill Total Amount", - "billcmtotal": "Credit Memos", - "bills": "Bills", - "calculatedcreditsnotreceived": "Calculated CNR", - "creditsnotreceived": "Credits Not Marked Received", - "creditsreceived": "Credits Received", - "dedfromlbr": "Labor Adjustments", - "deleteconfirm": "Are you sure you want to delete this bill? It cannot be undone. If this bill has deductions from labors, manual changes may be required.", - "discrepancy": "Discrepancy", - "discrepwithcms": "Discrepancy including Credit Memos", - "discrepwithlbradj": "Discrepancy including Lbr. Adj.", - "editadjwarning": "This bill had lines which resulted in labor adjustments. Manual correction to adjustments may be required.", - "entered_total": "Total of Entered Lines", - "enteringcreditmemo": "You are entering a credit memo. Please ensure you are also entering positive values.", - "federal_tax": "Federal Tax", - "generatepartslabel": "Generate Parts Labels after Saving?", - "iouexists": "An IOU exists that is associated to this RO.", - "local_tax": "Local Tax", - "markexported": "Mark Exported", - "markforreexport": "Mark for Re-export", - "new": "New Bill", - "noneselected": "No bill selected.", - "onlycmforinvoiced": "Only credit memos can be entered for any job that has been invoiced, exported, or voided.", - "retailtotal": "Bills Retail Total", - "savewithdiscrepancy": "You are about to save this bill with a discrepancy. The system will continue to use the calculated amount using the bill lines. Press cancel to return to the bill.", - "state_tax": "Provincial/State Tax", - "subtotal": "Subtotal", - "totalreturns": "Total Returns" - }, - "successes": { - "created": "Invoice added successfully.", - "deleted": "Bill deleted successfully.", - "exported": "Bill(s) exported successfully.", - "markexported": "Bill marked as exported.", - "reexport": "Bill marked for re-export." - }, - "validation": { - "inventoryquantity": "Quantity must be greater than or equal to what has been added to inventory ({{number}}).", - "manualinhouse": "Manual posting to the in house vendor is restricted. ", - "unique_invoice_number": "This invoice number has already been entered for this vendor." - } - }, - "bodyshop": { - "actions": { - "addapptcolor": "Add Appointment Color", - "addbucket": "Add Definition", - "addpartslocation": "Add Parts Location", - "addpartsrule": "Add Parts Scan Rule", - "addspeedprint": "Add Speed Print", - "addtemplate": "Add Template", - "newlaborrate": "New Labor Rate", - "newsalestaxcode": "New Sales Tax Code", - "newstatus": "Add Status", - "testrender": "Test Render" - }, - "errors": { - "loading": "Unable to load shop details. Please call technical support.", - "saving": "Error encountered while saving. {{message}}" - }, - "fields": { - "ReceivableCustomField": "QBO Receivable Custom Field {{number}}", - "address1": "Address 1", - "address2": "Address 2", - "appt_alt_transport": "Appointment Alternative Transportation Options", - "appt_colors": { - "color": "Color", - "label": "Label" - }, - "appt_length": "Default Appointment Length", - "attach_pdf_to_email": "Attach PDF copy to sent emails?", - "bill_allow_post_to_closed": "Allow Bills to be posted to Closed Jobs", - "bill_federal_tax_rate": "Bills - Federal Tax Rate %", - "bill_local_tax_rate": "Bill - Provincial/State Tax Rate %", - "bill_state_tax_rate": "Bill - Provincial/State Tax Rate %", - "city": "City", - "country": "Country", - "dailybodytarget": "Scoreboard - Daily Body Target", - "dailypainttarget": "Scoreboard - Daily Paint Target", - "default_adjustment_rate": "Default Labor Deduction Adjustment Rate", - "deliver": { - "templates": "Delivery Templates" - }, - "dms": { - "cashierid": "Cashier ID", - "default_journal": "Default Journal", - "disablebillwip": "Disable bill WIP for A/P Posting", - "disablecontactvehiclecreation": "Disable Contact & Vehicle Updates/Creation", - "dms_acctnumber": "DMS Account #", - "dms_control_override": "Static Control # Override", - "dms_wip_acctnumber": "DMS W.I.P. Account #", - "generic_customer_number": "Generic Customer Number", - "itc_federal": "Federal Tax is ITC?", - "itc_local": "Local Tax is ITC?", - "itc_state": "State Tax is ITC?", - "mappingname": "DMS Mapping Name", - "sendmaterialscosting": "Materials Cost as % of Sale", - "srcco": "Source Company #/Dealer #" - }, - "email": "General Shop Email", - "enforce_class": "Enforce Class on Conversion?", - "enforce_conversion_category": "Enforce Category on Conversion?", - "enforce_conversion_csr": "Enforce CSR on Conversion?", - "enforce_referral": "Enforce Referrals", - "federal_tax_id": "Federal Tax ID (GST/HST)", - "ignoreblockeddays": "Scoreboard - Ignore Blocked Days", - "inhousevendorid": "In House Vendor ID", - "insurance_vendor_id": "Insurance Vendor ID", - "intake": { - "next_contact_hours": "Automatic Next Contact Date - Hours from Intake", - "templates": "Intake Templates" - }, - "invoice_federal_tax_rate": "Invoices - Federal Tax Rate", - "invoice_local_tax_rate": "Invoices - Local Tax Rate", - "invoice_state_tax_rate": "Invoices - Provincial/State Tax Rate", - "jc_hourly_rates": { - "mapa": "Job Costing - Paint Materials Hourly Cost Rate", - "mash": "Job Costing - Shop Materials Hourly Cost Rate" - }, - "last_name_first": "Display Owner Info as , ", - "lastnumberworkingdays": "Scoreboard - Last Number of Working Days", - "localmediaserverhttp": "Local Media Server - HTTP Path", - "localmediaservernetwork": "Local Media Server - Network Path", - "localmediatoken": "Local Media Server - Token", - "logo_img_footer_margin": "Footer Margin (px)", - "logo_img_header_margin": "Header Margin (px)", - "logo_img_path": "Shop Logo", - "logo_img_path_height": "Logo Image Height", - "logo_img_path_width": "Logo Image Width", - "md_categories": "Categories", - "md_ccc_rates": "Courtesy Car Contract Rate Presets", - "md_classes": "Classes", - "md_ded_notes": "Deductible Notes", - "md_email_cc": "Auto Email CC: $t(printcenter.subjects.jobs.{{template}})", - "md_from_emails": "Additional From Emails", - "md_hour_split": { - "paint": "Paint Hour Split", - "prep": "Prep Hour Split" - }, - "md_ins_co": { - "city": "City", - "name": "Insurance Company Name", - "private": "Private", - "state": "Province/State", - "street1": "Street 1", - "street2": "Street 2", - "zip": "Zip/Postal Code" - }, - "md_jobline_presets": "Jobline Presets", - "md_lost_sale_reasons": "Lost Sale Reasons", - "md_parts_order_comment": "Parts Orders Comments", - "md_parts_scan": { - "expression": "RegEX Expression", - "flags": "Flags" - }, - "md_payment_types": "Payment Types", - "md_referral_sources": "Referral Sources", - "messaginglabel": "Messaging Preset Label", - "messagingtext": "Messaging Preset Text", - "noteslabel": "Note Label", - "notestext": "Note Text", - "partslocation": "Parts Location", - "phone": "Phone", - "prodtargethrs": "Production Target Hours", - "rbac": { - "accounting": { - "exportlog": "Accounting -> Export Log", - "payables": "Accounting -> Payables", - "payments": "Accounting -> Payments", - "receivables": "Accounting -> Receivables" - }, - "bills": { - "delete": "Bills -> Delete", - "enter": "Bills -> Enter", - "list": "Bills -> List", - "reexport": "Bills -> Re-export", - "view": "Bills -> View" - }, - "contracts": { - "create": "Contracts -> Create", - "detail": "Contracts -> Detail", - "list": "Contracts -> List" - }, - "courtesycar": { - "create": "Courtesy Car -> Create", - "detail": "Courtesy Car -> Detail", - "list": "Courtesy Car -> List" - }, - "csi": { - "export": "CSI -> Export", - "page": "CSI -> Page" - }, - "employees": { - "page": "Employees -> List" - }, - "inventory": { - "delete": "Inventory -> Delete", - "list": "Inventory -> List" - }, - "jobs": { - "admin": "Jobs -> Admin", - "available-list": "Jobs -> Available List", - "checklist-view": "Jobs -> Checklist View", - "close": "Jobs -> Close", - "create": "Jobs -> Create", - "deliver": "Jobs -> Deliver", - "detail": "Jobs -> Detail", - "intake": "Jobs -> Intake", - "list-active": "Jobs -> List Active", - "list-all": "Jobs -> List All", - "list-ready": "Jobs -> List Ready", - "partsqueue": "Jobs -> Parts Queue" - }, - "owners": { - "detail": "Owners -> Detail", - "list": "Owners -> List" - }, - "payments": { - "enter": "Payments -> Enter", - "list": "Payments -> List" - }, - "phonebook": { - "edit": "Phonebook -> Edit", - "view": "Phonebook -> View" - }, - "production": { - "board": "Production -> Board", - "list": "Production -> List" - }, - "schedule": { - "view": "Schedule -> View" - }, - "scoreboard": { - "view": "Scoreboard -> View" - }, - "shiftclock": { - "view": "Shift Clock -> View" - }, - "shop": { - "config": "Shop -> Config", - "dashboard": "Shop -> Dashboard", - "rbac": "Shop -> RBAC", - "templates": "Shop -> Templates", - "vendors": "Shop -> Vendors" - }, - "temporarydocs": { - "view": "Temporary Docs -> View" - }, - "timetickets": { - "edit": "Time Tickets -> Edit", - "enter": "Time Tickets -> Enter", - "list": "Time Tickets -> List", - "shiftedit": "Time Tickets -> Shift Edit" - }, - "users": { - "editaccess": "Users -> Edit access" - } - }, - "responsibilitycenter": "Responsibility Center", - "responsibilitycenter_accountdesc": "Account Description", - "responsibilitycenter_accountitem": "Item", - "responsibilitycenter_accountname": "Account Name", - "responsibilitycenter_accountnumber": "Account Number", - "responsibilitycenter_rate": "Rate", - "responsibilitycenters": { - "ap": "Accounts Payable", - "ar": "Accounts Receivable", - "ats": "ATS", - "federal_tax": "Federal Tax", - "federal_tax_itc": "Federal Tax Credit", - "gst_override": "GST Override Account #", - "la1": "LA1", - "la2": "LA2", - "la3": "LA3", - "la4": "LA4", - "laa": "Aluminum", - "lab": "Body", - "lad": "Diagnostic", - "lae": "Electrical", - "laf": "Frame", - "lag": "Glass", - "lam": "Mechanical", - "lar": "Refinish", - "las": "Structural", - "lau": "Detail", - "local_tax": "Local Tax", - "mapa": "Paint Materials", - "mash": "Shop Materials", - "paa": "Aftermarket", - "pac": "Chrome", - "pag": "Glass", - "pal": "LKQ", - "pam": "Remanufactured", - "pan": "OEM", - "pao": "Other", - "pap": "OEM Partial", - "par": "Recored", - "pas": "Sublet", - "pasl": "Sublet (L)", - "refund": "Refund", - "sales_tax_codes": { - "code": "Code", - "description": "Description", - "federal": "Federal Tax Applies", - "local": "Local Tax Applies", - "state": "Provincial/State Tax Applies" - }, - "state_tax": "Provincial/State Tax", - "tow": "Towing" - }, - "schedule_end_time": "Schedule Ending Time", - "schedule_start_time": "Schedule Starting Time", - "shopname": "Shop Name", - "speedprint": { - "id": "Id", - "label": "Label", - "templates": "Templates" - }, - "ss_configuration": { - "dailyhrslimit": "Daily Incoming Hours Limit" - }, - "ssbuckets": { - "gte": "Greater Than/Equal to (hrs)", - "id": "ID", - "label": "Label", - "lt": "Less than (hrs)", - "target": "Target (count)" - }, - "state": "Province/State", - "state_tax_id": "Provincial/State Tax ID (PST, QST)", - "status": "Status Label", - "statuses": { - "active_statuses": "Active Statuses (Filtering for Active Jobs throughout system)", - "additional_board_statuses": "Additional Status to Display on Production Board", - "color": "Color", - "default_arrived": "Default Arrived Status (Transition to Production)", - "default_bo": "Default Backordered Status", - "default_canceled": "Default Canceled Status", - "default_completed": "Default Completed Status", - "default_delivered": "Default Delivered Status (Transition to Post-Production)", - "default_exported": "Default Exported Status", - "default_imported": "Default Imported Status", - "default_invoiced": "Default Invoiced Status", - "default_ordered": "Default Ordered Status", - "default_quote": "Default Quote Status", - "default_received": "Default Received Status", - "default_returned": "Default Returned", - "default_scheduled": "Default Scheduled Status", - "default_void": "Default Void", - "open_statuses": "Open Statuses", - "post_production_statuses": "Post-Production Statuses", - "pre_production_statuses": "Pre-Production Statuses", - "production_colors": "Production Status Colors", - "production_statuses": "Production Statuses", - "ready_statuses": "Ready Statuses" - }, - "target_touchtime": "Target Touch Time", - "timezone": "Timezone", - "tt_allow_post_to_invoiced": "Allow Time Tickets to be posted to Invoiced & Exported Jobs", - "tt_enforce_hours_for_tech_console": "Restrict Claimable hours from Tech Console", - "use_fippa": "Use FIPPA for Names on Generated Documents?", - "use_paint_scale_data": "Use Paint Scale Data for Job Costing?", - "uselocalmediaserver": "Use Local Media Server?", - "website": "Website", - "zip_post": "Zip/Postal Code" - }, - "labels": { - "2tiername": "Name => RO", - "2tiersetup": "2 Tier Setup", - "2tiersource": "Source => RO", - "accountingsetup": "Accounting Setup", - "accountingtiers": "Number of Tiers to Use for Export", - "alljobstatuses": "All Job Statuses", - "allopenjobstatuses": "All Open Job Statuses", - "apptcolors": "Appointment Colors", - "businessinformation": "Business Information", - "checklists": "Checklists", - "csiq": "CSI Questions", - "customtemplates": "Custom Templates", - "defaultcostsmapping": "Default Costs Mapping", - "defaultprofitsmapping": "Default Profits Mapping", - "deliverchecklist": "Delivery Checklist", - "dms": { - "cdk": { - "controllist": "Control Number List", - "payers": "CDK Payers" - }, - "cdk_dealerid": "CDK Dealer ID", - "pbs_serialnumber": "PBS Serial Number", - "title": "DMS" - }, - "emaillater": "Email Later", - "employees": "Employees", - "estimators": "Estimators", - "filehandlers": "File Handlers", - "insurancecos": "Insurance Companies", - "intakechecklist": "Intake Checklist", - "jobstatuses": "Job Statuses", - "laborrates": "Labor Rates", - "licensing": "Licensing", - "md_to_emails": "Preset To Emails", - "md_to_emails_emails": "Emails", - "messagingpresets": "Messaging Presets", - "notemplatesavailable": "No templates available to add.", - "notespresets": "Notes Presets", - "orderstatuses": "Order Statuses", - "partslocations": "Parts Locations", - "partsscan": "Critical Parts Scanning", - "printlater": "Print Later", - "qbo": "Use QuickBooks Online?", - "qbo_departmentid": "QBO Department ID", - "qbo_usa": "QBO USA Compatibility", - "rbac": "Role Based Access Control", - "responsibilitycenters": { - "costs": "Cost Centers", - "profits": "Profit Centers", - "sales_tax_codes": "Sales Tax Codes", - "tax_accounts": "Tax Accounts", - "title": "Responsibility Centers" - }, - "scheduling": "SMART Scheduling", - "scoreboardsetup": "Scoreboard Setup", - "shopinfo": "Shop Information", - "speedprint": "Speed Print Configuration", - "ssbuckets": "Job Size Definitions", - "systemsettings": "System Settings", - "workingdays": "Working Days" - }, - "successes": { - "save": "Shop configuration saved successfully. " - }, - "validation": { - "centermustexist": "The chosen responsibility center does not exist.", - "larsplit": "Refinish hour split must add up to 1.", - "useremailmustexist": "This email is not a valid user." - } - }, - "checklist": { - "actions": { - "printall": "Print All Documents" - }, - "errors": { - "complete": "Error during job checklist completion. {{error}}", - "nochecklist": "No checklist has been configured for your shop. " - }, - "labels": { - "addtoproduction": "Add Job to Production?", - "allow_text_message": "Permission to Text?", - "checklist": "Checklist", - "printpack": "Job Intake Print Pack", - "removefromproduction": "Remove job from production?" - }, - "successes": { - "completed": "Job checklist completed." - } - }, - "contracts": { - "actions": { - "changerate": "Change Contract Rates", - "convertoro": "Convert to RO", - "decodelicense": "Decode License", - "find": "Find Contract", - "printcontract": "Print Contract", - "senddltoform": "Insert Driver's License Information" - }, - "errors": { - "fetchingjobinfo": "Error fetching job info. {{error}}.", - "returning": "Error returning courtesy car. {{error}}", - "saving": "Error saving contract. {{error}}", - "selectjobandcar": "Please ensure both a car and job are selected." - }, - "fields": { - "actax": "A/C Tax", - "actualreturn": "Actual Return Date", - "agreementnumber": "Agreement Number", - "cc_cardholder": "Cardholder Name", - "cc_expiry": "Credit Card Expiry Date", - "cc_num": "Credit Card Number", - "cleanupcharge": "Clean Up Charge", - "coverage": "Coverage", - "dailyfreekm": "Daily Free Mileage", - "dailyrate": "Daily Rate", - "damage": "Existing Damage", - "damagewaiver": "Damage Waiver", - "driver": "Driver", - "driver_addr1": "Driver Address 1", - "driver_addr2": "Driver Address 2", - "driver_city": "Driver City", - "driver_dlexpiry": "Driver's License Expiration Date", - "driver_dlnumber": "Driver's License Number", - "driver_dlst": "Driver's License Province/State", - "driver_dob": "Driver's DOB", - "driver_fn": "Driver's First Name", - "driver_ln": "Driver's Last Name", - "driver_ph1": "Driver's Phone", - "driver_state": "Driver's Province/State ", - "driver_zip": "Driver's Postal/ZIP Code", - "excesskmrate": "Excess Mileage", - "federaltax": "Federal Taxes", - "fuelin": "Fuel In", - "fuelout": "Fuel Out", - "kmend": "Mileage End", - "kmstart": "Mileage Start", - "length": "Length", - "localtax": "Local Taxes", - "refuelcharge": "Refuel Charge (per liter/gallon)", - "scheduledreturn": "Scheduled Return", - "start": "Contract Start", - "statetax": "Provincial/State Taxes", - "status": "Status" - }, - "labels": { - "agreement": "Agreement {{agreement_num}} - {{status}}", - "availablecars": "Available Cars", - "cardueforservice": "The courtesy car is due for servicing.", - "convertform": { - "applycleanupcharge": "Apply cleanup charge?", - "refuelqty": "Refuel qty.?" - }, - "correctdataonform": "Please review the information above. If any of it is not correct, you can fix it later.", - "dateinpast": "Date is in the past.", - "dlexpirebeforereturn": "The driver's license expires before the car is expected to return. ", - "driverinformation": "Driver's Information", - "findcontract": "Find Contract", - "findermodal": "Contract Finder", - "noteconvertedfrom": "R.O. created from converted Courtesy Car Contract {{agreementnumber}}.", - "populatefromjob": "Populate from Job", - "rates": "Contract Rates", - "time": "Time", - "vehicle": "Vehicle", - "waitingforscan": "Please scan driver's license barcode..." - }, - "status": { - "new": "New Contract", - "out": "Out", - "returned": "Returned" - }, - "successes": { - "saved": "Contract saved successfully. " - } - }, - "courtesycars": { - "actions": { - "new": "New Courtesy Car", - "return": "Return Car" - }, - "errors": { - "saving": "Error saving courtesy card. {{error}}" - }, - "fields": { - "color": "Color", - "dailycost": "Daily Cost to Rent", - "damage": "Damage", - "fleetnumber": "Fleet Number", - "fuel": "Fuel Level", - "insuranceexpires": "Insurance Expires On", - "leaseenddate": "Lease Ends On", - "make": "Make", - "mileage": "Mileage", - "model": "Model", - "nextservicedate": "Next Service Date", - "nextservicekm": "Next Service KMs", - "notes": "Notes", - "plate": "Plate Number", - "purchasedate": "Purchase Date", - "registrationexpires": "Registration Expires On", - "serviceenddate": "Usage End Date", - "servicestartdate": "Usage Start Date", - "status": "Status", - "vin": "VIN", - "year": "Year" - }, - "labels": { - "courtesycar": "Courtesy Car", - "fuel": { - "12": "1/2", - "14": "1/4", - "18": "1/8", - "34": "3/4", - "38": "3/8", - "58": "5/8", - "78": "7/8", - "empty": "Empty", - "full": "Full" - }, - "outwith": "Out With", - "return": "Return Courtesy Car", - "status": "Status", - "uniquefleet": "Enter a unique fleet number.", - "usage": "Usage", - "vehicle": "Vehicle Description" - }, - "status": { - "in": "Available", - "inservice": "In Service", - "leasereturn": "Lease Returned", - "out": "Rented", - "sold": "Sold" - }, - "successes": { - "saved": "Courtesy Car saved successfully." - } - }, - "csi": { - "actions": { - "activate": "Activate" - }, - "errors": { - "creating": "Error creating survey {{message}}", - "notconfigured": "You do not have any current CSI Question Sets configured.", - "notfoundsubtitle": "We were unable to find a survey using the link you provided. Please ensure the URL is correct or reach out to your shop for more help.", - "notfoundtitle": "No survey found." - }, - "fields": { - "completedon": "Completed On", - "created_at": "Created At" - }, - "labels": { - "nologgedinuser": "Please log out of ImEX Online", - "nologgedinuser_sub": "Users of ImEX Online cannot complete CSI surveys while logged in. Please log out and try again.", - "noneselected": "No response selected.", - "title": "Customer Satisfaction Survey" - }, - "successes": { - "created": "CSI created successfully. ", - "submitted": "Your responses have been submitted successfully.", - "submittedsub": "Your input is highly appreciated." - } - }, - "dashboard": { - "actions": { - "addcomponent": "Add Component" - }, - "errors": { - "refreshrequired": "You must refresh the dashboard data to see this component.", - "updatinglayout": "Error saving updated layout {{message}}" - }, - "labels": { - "bodyhrs": "Body Hrs", - "dollarsinproduction": "Dollars in Production", - "prodhrs": "Production Hrs", - "refhrs": "Refinish Hrs" - }, - "titles": { - "monthlyemployeeefficiency": "Monthly Employee Efficiency", - "monthlyjobcosting": "Monthly Job Costing ", - "monthlylaborsales": "Monthly Labor Sales", - "monthlypartssales": "Monthly Parts Sales", - "monthlyrevenuegraph": "Monthly Revenue Graph", - "prodhrssummary": "Production Hours Summary", - "productiondollars": "Total dollars in Production", - "productionhours": "Total hours in Production", - "projectedmonthlysales": "Projected Monthly Sales" - } - }, - "dms": { - "errors": { - "alreadyexported": "This job has already been sent to the DMS. If you need to resend it, please use admin permissions to mark the job for re-export." - }, - "labels": { - "refreshallocations": "Refresh to see DMS Allocataions." - } - }, - "documents": { - "actions": { - "delete": "Delete Selected Documents", - "download": "Download Selected Images", - "reassign": "Reassign to another Job", - "selectallimages": "Select All Images", - "selectallotherdocuments": "Select All Other Documents" - }, - "errors": { - "deletes3": "Error deleting document from storage. ", - "deleting": "Error deleting documents {{error}}", - "deleting_cloudinary": "Error deleting document from storage. {{message}}", - "getpresignurl": "Error obtaining presigned URL for document. {{message}}", - "insert": "Unable to upload file. {{message}}", - "nodocuments": "There are no documents.", - "updating": "Error updating document. {{error}}" - }, - "labels": { - "confirmdelete": "Are you sure you want to delete these documents. This CANNOT be undone.", - "doctype": "Document Type", - "newjobid": "Assign to Job", - "openinexplorer": "Open in Explorer", - "optimizedimage": "The below image is optimized. Click on the picture below to open in a new window and view it full size, or open it in explorer.", - "reassign_limitexceeded": "Reassigning all selected documents will exceed the job storage limit for your shop. ", - "reassign_limitexceeded_title": "Unable to reassign document(s)", - "storageexceeded": "You've exceeded your storage limit for this job. Please remove documents, or increase your storage plan.", - "storageexceeded_title": "Storage Limit Exceeded", - "upload": "Upload", - "upload_limitexceeded": "Uploading all selected documents will exceed the job storage limit for your shop. ", - "upload_limitexceeded_title": "Unable to upload document(s)", - "uploading": "Uploading...", - "usage": "of job storage used. ({{used}} / {{total}})" - }, - "successes": { - "delete": "Document(s) deleted successfully.", - "edituploaded": "Edited document uploaded successfully. Please close this window and refresh the documents list.", - "insert": "Uploaded document successfully. ", - "updated": "Document updated successfully. " - } - }, - "emails": { - "errors": { - "notsent": "Email not sent. Error encountered while sending {{message}}" - }, - "fields": { - "cc": "CC", - "from": "From", - "subject": "Subject", - "to": "To" - }, - "labels": { - "attachments": "Attachments", - "documents": "Documents", - "emailpreview": "Email Preview", - "generatingemail": "Generating email...", - "pdfcopywillbeattached": "A PDF copy of this email will be attached when it is sent.", - "preview": "Email Preview" - }, - "successes": { - "sent": "Email sent successfully." - } - }, - "employees": { - "actions": { - "addvacation": "Add Vacation", - "new": "New Employee", - "newrate": "New Rate" - }, - "errors": { - "delete": "Error encountered while deleting employee. {{message}}", - "save": "Error encountered saving employee. {{message}}", - "validation": "Please check all fields.", - "validationtitle": "Unable to save employee." - }, - "fields": { - "active": "Active?", - "base_rate": "Base Rate", - "cost_center": "Cost Center", - "employee_number": "Employee Number", - "external_id": "External Employee ID", - "first_name": "First Name", - "flat_rate": "Flat Rate (Disabled is Straight Time)", - "hire_date": "Hire Date", - "last_name": "Last Name", - "pin": "Tech Console PIN", - "rate": "Rate", - "termination_date": "Termination Date", - "user_email": "User Email", - "vacation": { - "end": "Vacation End", - "length": "Vacation Length", - "start": "Vacation Start" - } - }, - "labels": { - "actions": "Actions", - "endmustbeafterstart": "End date must be after start date.", - "flat_rate": "Flat Rate", - "name": "Name", - "rate_type": "Rate Type", - "straight_time": "Straight Time" - }, - "successes": { - "delete": "Employee deleted successfully.", - "save": "Employee saved successfully.", - "vacationadded": "Employee vacation added." - }, - "validation": { - "unique_employee_number": "You must enter a unique employee number." - } - }, - "exportlogs": { - "fields": { - "createdat": "Created At" - }, - "labels": { - "attempts": "Export Attempts", - "priorsuccesfulexport": "This record has previously been exported successfully. Please make sure it has already been deleted in the target system." - } - }, - "general": { - "actions": { - "add": "Add", - "calculate": "Calculate", - "cancel": "Cancel", - "clear": "Clear", - "close": "Close", - "copylink": "Copy Link", - "create": "Create", - "delete": "Delete", - "deleteall": "Delete All", - "deselectall": "Deselect All", - "edit": "Edit", - "login": "Login", - "print": "Print", - "refresh": "Refresh", - "remove": "Remove", - "reset": "Reset your changes.", - "resetpassword": "Reset Password", - "save": "Save", - "saveandnew": "Save and New", - "selectall": "Select All", - "send": "Send", - "senderrortosupport": "Send Error to Support", - "submit": "Submit", - "tryagain": "Try Again", - "view": "View", - "viewreleasenotes": "See What's Changed" - }, - "errors": { - "fcm": "You must allow notification permissions to have real time messaging. Click to try again.", - "notfound": "No record was found.", - "sizelimit": "The selected items exceed the size limit." - }, - "itemtypes": { - "contract": "CC Contract", - "courtesycar": "Courtesy Car", - "job": "Job", - "owner": "Owner", - "vehicle": "Vehicle" - }, - "labels": { - "actions": "Actions", - "areyousure": "Are you sure?", - "barcode": "Barcode", - "cancel": "Are you sure you want to cancel? Your changes will not be saved.", - "clear": "Clear", - "confirmpassword": "Confirm Password", - "created_at": "Created At", - "email": "Email", - "errors": "Errors", - "excel": "Excel", - "exceptiontitle": "An error has occurred.", - "friday": "Friday", - "globalsearch": "Global Search", - "help": "Help", - "hours": "hrs", - "in": "In", - "instanceconflictext": "Your $t(titles.app) account can only be used on one device at any given time. Refresh your session to take control.", - "instanceconflictitle": "Your account is being used elsewhere.", - "item": "Item", - "label": "Label", - "loading": "Loading...", - "loadingapp": "Loading $t(titles.app)", - "loadingshop": "Loading shop data...", - "loggingin": "Authorizing...", - "markedexported": "Manually marked as exported.", - "message": "Message", - "monday": "Monday", - "na": "N/A", - "newpassword": "New Password", - "no": "No", - "nointernet": "It looks like you're not connected to the internet.", - "nointernet_sub": "Please check your connection and try again. ", - "none": "None", - "out": "Out", - "password": "Password", - "passwordresetsuccess": "A password reset link has been sent to you.", - "passwordresetsuccess_sub": "You should receive this email in the next few minutes. Please check your email including any junk or spam folders. ", - "passwordresetvalidatesuccess": "Password successfully reset. ", - "passwordresetvalidatesuccess_sub": "You may now sign in again using your new password. ", - "passwordsdonotmatch": "The passwords you have entered do not match.", - "print": "Print", - "refresh": "Refresh", - "required": "Required", - "saturday": "Saturday", - "search": "Search...", - "searchresults": "Results for {{search}}", - "selectdate": "Select date...", - "sendagain": "Send Again", - "sendby": "Send By", - "signin": "Sign In", - "sms": "SMS", - "status": "Status", - "sub_status": { - "expired": "The subscription for this shop has expired. Please contact technical support to reactivate the subscription. " - }, - "successful": "Successful", - "sunday": "Sunday", - "text": "Text", - "thursday": "Thursday", - "total": "Total", - "totals": "Totals", - "tuesday": "Tuesday", - "unknown": "Unknown", - "username": "Username", - "view": "View", - "wednesday": "Wednesday", - "yes": "Yes" - }, - "languages": { - "english": "English", - "french": "French", - "spanish": "Spanish" - }, - "messages": { - "exception": "$t(titles.app) has encountered an error. Please try again. If the problem persists, please submit a support ticket or contact us.", - "newversionmessage": "Click refresh below to update to the latest available version of ImEX Online. Please make sure all other tabs and windows are closed.", - "newversiontitle": "New version of ImEX Online Available", - "noacctfilepath": "There is no accounting file path set. You will not be able to export any items.", - "nofeatureaccess": "You do not have access to this feature of ImEX Online. Please contact support to request a license for this feature.", - "noshop": "You do not have access to any shops. Please reach out to your shop manager or technical support. ", - "notfoundsub": "Please make sure that you have access to the data or that the link is correct.", - "notfoundtitle": "We couldn't find what you're looking for...", - "partnernotrunning": "ImEX Online has detected that the partner is not running. Please ensure it is running to enable full functionality.", - "rbacunauth": "You are not authorized to view this content. Please reach out to your shop manager to change your access level.", - "unsavedchanges": "You have unsaved changes.", - "unsavedchangespopup": "You have unsaved changes. Are you sure you want to leave?" - }, - "validation": { - "invalidemail": "Please enter a valid email.", - "invalidphone": "Please enter a valid phone number.", - "required": "{{label}} is required. " - } - }, - "help": { - "actions": { - "connect": "Connect" - }, - "labels": { - "codeplacholder": "6 digit PIN code", - "rescuedesc": "Enter the 6 digit code provided by ImEX Online Support below and click connect.", - "rescuetitle": "Rescue Me!" - } - }, - "intake": { - "labels": { - "printpack": "Intake Print Pack" - } - }, - "inventory": { - "actions": { - "addtoinventory": "Add to Inventory", - "addtoro": "Add to RO", - "consumefrominventory": "Consume from Inventory?", - "edit": "Edit Inventory LIne", - "new": "New Inventory Line" - }, - "errors": { - "inserting": "Error inserting inventory item. {{error}}" - }, - "fields": { - "comment": "Comment", - "manualinvoicenumber": "Invoice Number", - "manualvendor": "Vendor" - }, - "labels": { - "consumedbyjob": "Consumed by Job", - "deleteconfirm": "Are you sure you want to delete this from inventory? The associated bill will not be modified or deleted. ", - "frombillinvoicenumber": "Original Bill Invoice Number", - "fromvendor": "Original Bill Vendor", - "inventory": "Inventory", - "showall": "Show All Inventory", - "showavailable": "Show Only Available Inventory" - }, - "successes": { - "deleted": "Inventory lined deleted.", - "inserted": "Added line to inventory.", - "updated": "Inventory line updated." - } - }, - "joblines": { - "actions": { - "converttolabor": "Convert amount to Labor.", - "new": "New Line" - }, - "errors": { - "creating": "Error encountered while creating job line. {{message}}", - "updating": "Error encountered updating job line. {{message}}" - }, - "fields": { - "act_price": "Retail Price", - "ah_detail_line": "Mark as Detail Labor Line (Autohouse Only)", - "db_price": "List Price", - "lbr_types": { - "LA1": "LA1", - "LA2": "LA2", - "LA3": "LA3", - "LA4": "LA4", - "LAA": "Aluminum", - "LAB": "Body", - "LAD": "Diagnostic", - "LAE": "Electrical", - "LAF": "Frame", - "LAG": "Glass", - "LAM": "Mechanical", - "LAR": "Refinish", - "LAS": "Structural", - "LAU": "User Defined" - }, - "line_desc": "Line Desc.", - "line_ind": "S#", - "line_no": "Line #", - "location": "Location", - "mod_lb_hrs": "Hrs", - "mod_lbr_ty": "Labor Type", - "notes": "Notes", - "oem_partno": "OEM Part #", - "op_code_desc": "Op Code Description", - "part_qty": "Qty.", - "part_type": "Part Type", - "part_types": { - "CCC": "CC Cleaning", - "CCD": "CC Damage Waiver", - "CCDR": "CC Daily Rate", - "CCF": "CC Refuel", - "CCM": "CC Mileage", - "PAA": "Aftermarket", - "PAC": "Rechromed", - "PAE": "Existing", - "PAG": "Glass", - "PAL": "LKQ", - "PAM": "Remanufactured", - "PAN": "New/OEM", - "PAO": "Other", - "PAP": "OEM Partial", - "PAR": "Recored", - "PAS": "Sublet", - "PASL": "Sublet (L)" - }, - "profitcenter_labor": "Profit Center: Labor", - "profitcenter_part": "Profit Center: Part", - "prt_dsmk_m": "Line Discount/Markup $", - "prt_dsmk_p": "Line Discount/Markup %", - "status": "Status", - "tax_part": "Tax Part", - "total": "Total", - "unq_seq": "Seq #" - }, - "labels": { - "adjustmenttobeadded": "Adjustment to be added: {{adjustment}}", - "billref": "Latest Bill", - "convertedtolabor": "This line has been converted to labor. Ensure you adjust the profit center for the amount accordingly.", - "edit": "Edit Line", - "ioucreated": "IOU", - "new": "New Line", - "nostatus": "No Status", - "presets": "Jobline Presets" - }, - "successes": { - "created": "Job line created successfully.", - "saved": "Job line saved.", - "updated": "Job line updated successfully." - }, - "validations": { - "ahdetailonlyonuserdefinedtypes": "Detail line indicator can only be set for LA1, LA2, LA3, LA4, and LAU labor types.", - "hrsrequirediflbrtyp": "Labor hours are required if a labor type is selected. Clear the labor type if there are no labor hours.", - "requiredifparttype": "Required if a part type has been specified.", - "zeropriceexistingpart": "This line cannot have any price since it uses an existing part." - } - }, - "jobs": { - "actions": { - "addDocuments": "Add Job Documents", - "addNote": "Add Note", - "addtopartsqueue": "Add to Parts Queue", - "addtoproduction": "Add to Production", - "addtoscoreboard": "Add to Scoreboard", - "allocate": "Allocate", - "autoallocate": "Auto Allocate", - "changefilehandler": "Change File Handler", - "changelaborrate": "Change Labor Rate", - "changestatus": "Change Status", - "changestimator": "Change Estimator", - "convert": "Convert", - "createiou": "Create IOU", - "deliver": "Deliver", - "dms": { - "addpayer": "Add Payer", - "createnewcustomer": "Create New Customer", - "findmakemodelcode": "Find Make/Model Code", - "getmakes": "", - "labels": { - "refreshallocations": "Refresh this component to see the DMS allocations." - }, - "post": "Post", - "refetchmakesmodels": "Refetch Make and Model Codes", - "usegeneric": "Use Generic Customer", - "useselected": "Use Selected Customer" - }, - "dmsautoallocate": "DMS Auto Allocate", - "export": "Export", - "exportcustdata": "Export Customer Data", - "exportselected": "Export Selected", - "filterpartsonly": "Filter Parts Only", - "generatecsi": "Generate CSI & Copy Link", - "gotojob": "Go to Job", - "intake": "Intake", - "manualnew": "Create New Job Manually", - "mark": "Mark", - "markasexported": "Mark as Exported", - "markpstexempt": "Mark Job PST Exempt", - "markpstexemptconfirm": "Are you sure you want to do this? To undo this, you must manually update all PST rates.", - "postbills": "Post Bills", - "printCenter": "Print Center", - "recalculate": "Recalculate", - "reconcile": "Reconcile", - "removefromproduction": "Remove from Production", - "schedule": "Schedule", - "sendcsi": "Send CSI", - "sendpartspricechange": "", - "sendtodms": "Send to DMS", - "sync": "Sync", - "uninvoice": "Uninvoice", - "unvoid": "Unvoid Job", - "viewchecklist": "View Checklists", - "viewdetail": "View Details" - }, - "errors": { - "addingtoproduction": "Error adding to production. {{error}}", - "cannotintake": "Intake cannot be completed for this job. It has either already been completed or the job is already here.", - "closing": "Error closing job. {{error}}", - "creating": "Error encountered while creating job. {{error}}", - "deleted": "Error deleting job. {{error}}", - "exporting": "Error exporting job. {{error}}", - "exporting-partner": "Unable to connect to ImEX Partner. Please ensure it is running and logged in.", - "invoicing": "Error invoicing job. {{error}}", - "noaccess": "This job does not exist or you do not have access to it.", - "nodamage": "No damage points on estimate.", - "nodates": "No dates specified for this job.", - "nofinancial": "No financial data has been calculated yet for this job. Please save it again.", - "nojobselected": "No job is selected.", - "noowner": "No owner associated.", - "novehicle": "No vehicle associated.", - "partspricechange": "", - "saving": "Error encountered while saving record.", - "scanimport": "Error importing job. {{message}}", - "totalscalc": "Error while calculating new job totals.", - "updating": "Error while updating job(s). {{error}}", - "validation": "Please ensure all fields are entered correctly.", - "validationtitle": "Validation Error", - "voiding": "Error voiding job. {{error}}" - }, - "fields": { - "actual_completion": "Actual Completion", - "actual_delivery": "Actual Delivery", - "actual_in": "Actual In", - "adjustment_bottom_line": "Adjustments", - "adjustmenthours": "Adjustment Hours", - "alt_transport": "Alt. Trans.", - "area_of_damage_impact": { - "10": "Left Front Side", - "11": "Left Front Corner", - "12": "Front", - "13": "Rollover", - "14": "Unknown", - "15": "Total Loss", - "16": "Non-collision", - "25": "Hood", - "26": "Deck-lid", - "27": "Roof", - "28": "Undercarriage", - "34": "All Over", - "01": "Right Front Corner", - "02": "Right Front Side", - "03": "Right Side", - "04": "Right Rear Side", - "05": "Right Rear Corner", - "06": "Rear", - "07": "Left Rear Corner", - "08": "Left Rear Side", - "09": "Left Side" - }, - "auto_add_ats": "Automatically Add/Update ATS", - "ca_bc_pvrt": "PVRT", - "ca_customer_gst": "Customer Portion of GST", - "ca_gst_registrant": "GST Registrant", - "category": "Category", - "ccc": "CC Cleaning", - "ccd": "CC Damage Waiver", - "ccdr": "CC Daily Rate", - "ccf": "CC Refuel", - "ccm": "CC Mileage", - "cieca_id": "CIECA ID", - "claim_total": "Claim Total", - "class": "Class", - "clm_no": "Claim #", - "clm_total": "Claim Total", - "comment": "Comment", - "customerowing": "Customer Owing", - "date_estimated": "Date Estimated", - "date_exported": "Exported", - "date_invoiced": "Invoiced", - "date_last_contacted": "Last Contacted Date", - "date_next_contact": "Next Contact Date", - "date_open": "Open", - "date_rentalresp": "Shop Rental Responsibility Start", - "date_repairstarted": "Repairs Started", - "date_scheduled": "Scheduled", - "date_towin": "Towed In", - "ded_amt": "Deductible", - "ded_note": "Deductible Note", - "ded_status": "Deductible Status", - "depreciation_taxes": "Depreciation/Taxes", - "dms": { - "address": "Customer Address", - "amount": "Amount", - "center": "Center", - "control_type": { - "account_number": "Account Number" - }, - "cost": "Cost", - "cost_dms_acctnumber": "Cost DMS Acct #", - "dms_make": "DMS Make", - "dms_model": "DMS Model", - "dms_wip_acctnumber": "Cost WIP DMS Acct #", - "id": "DMS ID", - "inservicedate": "In Service Date", - "journal": "Journal #", - "lines": "Posting Lines", - "name1": "Customer Name", - "payer": { - "amount": "Amount", - "control_type": "Control Type", - "controlnumber": "Control Number", - "dms_acctnumber": "DMS Account #", - "name": "Payer Name" - }, - "sale": "Sale", - "sale_dms_acctnumber": "Sale DMS Acct #", - "story": "Story", - "vinowner": "VIN Owner" - }, - "dms_allocation": "DMS Allocation", - "driveable": "Driveable", - "employee_body": "Body", - "employee_csr": "Customer Service Rep.", - "employee_prep": "Prep", - "employee_refinish": "Refinish", - "est_addr1": "Estimator Address", - "est_co_nm": "Estimator Company", - "est_ct_fn": "Estimator First Name", - "est_ct_ln": "Estimator Last Name", - "est_ea": "Estimator Email", - "est_ph1": "Estimator Phone #", - "federal_tax_payable": "Federal Tax Payable", - "federal_tax_rate": "Federal Tax Rate", - "ins_addr1": "Insurance Co. Address", - "ins_city": "Insurance City", - "ins_co_id": "Insurance Co. ID", - "ins_co_nm": "Insurance Company Name", - "ins_co_nm_short": "Ins. Co.", - "ins_ct_fn": "File Handler First Name", - "ins_ct_ln": "File Handler Last Name", - "ins_ea": "File Handler Email", - "ins_ph1": "File Handler Phone #", - "intake": { - "label": "Label", - "max": "Maximum", - "min": "Minimum", - "name": "Name", - "required": "Required?", - "type": "Type" - }, - "invoice_final_note": "Note to Display on Final Invoice", - "kmin": "Mileage In", - "kmout": "Mileage Out", - "la1": "LA1", - "la2": "LA2", - "la3": "LA3", - "la4": "LA4", - "laa": "Aluminum ", - "lab": "Body", - "labor_rate_desc": "Labor Rate Name", - "lad": "Diagnostic", - "lae": "Electrical", - "laf": "Frame", - "lag": "Glass", - "lam": "Mechanical", - "lar": "Refinish", - "las": "Structural", - "lau": "User Defined", - "local_tax_rate": "Local Tax Rate", - "loss_date": "Loss Date", - "loss_desc": "Loss Description", - "loss_of_use": "Loss of Use", - "lost_sale_reason": "Lost Sale Reason", - "ma2s": "2 Stage Paint", - "ma3s": "3 Stage Pain", - "mabl": "MABL?", - "macs": "MACS?", - "mahw": "Hazardous Waste", - "mapa": "Paint Materials", - "mash": "Shop Materials", - "matd": "Tire Disposal", - "other_amount_payable": "Other Amount Payable", - "owner": "Owner", - "owner_owing": "Cust. Owes", - "ownr_ea": "Email", - "ownr_ph1": "Phone 1", - "ownr_ph2": "Phone 2", - "paa": "Aftermarket", - "pac": "Rechromed", - "pae": "Existing", - "pag": "Glass", - "pal": "LKQ", - "pam": "Remanufactured", - "pan": "OEM/New", - "pao": "Other", - "pap": "OEM Partial", - "par": "Re-cored", - "parts_tax_rates": { - "prt_discp": "Discount %", - "prt_mktyp": "Markup Type", - "prt_mkupp": "Markup %", - "prt_tax_in": "Tax Indicator", - "prt_tax_rt": "Part Tax Rate", - "prt_type": "Part Type" - }, - "partsstatus": "Parts Status", - "pas": "Sublet", - "pay_date": "Pay Date", - "phoneshort": "PH", - "po_number": "PO Number", - "policy_no": "Policy #", - "ponumber": "PO Number", - "production_vars": { - "note": "Production Note" - }, - "qb_multiple_payers": { - "amount": "Amount", - "name": "Name" - }, - "queued_for_parts": "Queued for Parts", - "rate_ats": "ATS Rate", - "rate_la1": "LA1", - "rate_la2": "LA2", - "rate_la3": "LA3", - "rate_la4": "LA4", - "rate_laa": "Aluminum", - "rate_lab": "Body", - "rate_lad": "Diagnostic", - "rate_lae": "Electrical", - "rate_laf": "Frame", - "rate_lag": "Glass", - "rate_lam": "Mechanical", - "rate_lar": "Refinish", - "rate_las": "Structural", - "rate_lau": "User Defined", - "rate_ma2s": "2 Stage Paint", - "rate_ma3s": "3 Stage Paint", - "rate_mabl": "MABL??", - "rate_macs": "MACS??", - "rate_mahw": "Hazardous Waste", - "rate_mapa": "Paint Materials", - "rate_mash": "Shop Material", - "rate_matd": "Tire Disposal", - "referral_source_extra": "Other Referral Source", - "referral_source_other": "", - "referralsource": "Referral Source", - "regie_number": "Registration #", - "repairtotal": "Repair Total", - "ro_number": "RO #", - "scheduled_completion": "Scheduled Completion", - "scheduled_delivery": "Scheduled Delivery", - "scheduled_in": "Scheduled In", - "selling_dealer": "Selling Dealer", - "selling_dealer_contact": "Selling Dealer Contact", - "servicecar": "Service Car", - "servicing_dealer": "Servicing Dealer", - "servicing_dealer_contact": "Servicing Dealer Contact", - "special_coverage_policy": "Special Coverage Policy", - "specialcoveragepolicy": "Special Coverage Policy", - "state_tax_rate": "Provincial/State Tax Rate", - "status": "Job Status", - "storage_payable": "Storage", - "tax_lbr_rt": "Labor Tax Rate", - "tax_levies_rt": "Levies Tax Rate", - "tax_paint_mat_rt": "Paint Material Tax Rate", - "tax_registration_number": "Tax Registration Number", - "tax_shop_mat_rt": "Shop Material Tax Rate", - "tax_str_rt": "Storage Tax Rate", - "tax_sub_rt": "Sublet Tax Rate", - "tax_tow_rt": "Towing Tax Rate", - "towin": "Tow In", - "towing_payable": "Towing Payable", - "unitnumber": "Unit #", - "updated_at": "Updated At", - "uploaded_by": "Uploaded By", - "vehicle": "Vehicle" - }, - "forms": { - "admindates": "Administrative Dates", - "appraiserinfo": "Estimator Info", - "claiminfo": "Claim Information", - "estdates": "Estimate Dates", - "laborrates": "Labor Rates", - "lossinfo": "Loss Information", - "other": "Other", - "repairdates": "Repair Dates", - "scheddates": "Schedule Dates" - }, - "labels": { - "actual_completion_inferred": "$t(jobs.fields.actual_completion) inferred using $t(jobs.fields.scheduled_completion).", - "actual_delivery_inferred": "$t(jobs.fields.actual_delivery) inferred using $t(jobs.fields.scheduled_delivery).", - "actual_in_inferred": "$t(jobs.fields.actual_in) inferred using $t(jobs.fields.scheduled_in).", - "additionalpayeroverallocation": "You have allocated more than the sale of the Job to additional payers.", - "additionaltotal": "Additional Total", - "adjustmentrate": "Adjustment Rate", - "adjustments": "Adjustments", - "adminwarning": "Use the functionality on this page at your own risk. You are responsible for any and all changes to your data.", - "allocations": "Allocations", - "alreadyaddedtoscoreboard": "Job has already been added to scoreboard. Saving will update the previous entry.", - "alreadyclosed": "This job has already been closed.", - "appointmentconfirmation": "Send confirmation to customer?", - "associationwarning": "Any changes to associations will require updating the data from the new parent record to the job.", - "audit": "Audit Trail", - "available": "Available", - "availablejobs": "Available Jobs", - "ca_bc_pvrt": { - "days": "Days", - "rate": "PVRT Rate" - }, - "ca_gst_all_if_null": "If the job is marked as a \"GST Registrant\" and this value is set to $0, the customer will be responsible for paying all of the GST by default. ", - "calc_repair_days": "Calculated Repair Days", - "calc_repair_days_tt": "This is the approximate number of days required to complete the repair according to the target touch time in your shop configuration (current set to {{target_touchtime}}).", - "cards": { - "customer": "Customer Information", - "damage": "Area of Damage", - "dates": "Dates", - "documents": "Recent Documents", - "estimator": "Estimator", - "filehandler": "File Handler", - "insurance": "Insurance Details", - "notes": "Notes", - "parts": "Parts", - "totals": "Totals", - "vehicle": "Vehicle" - }, - "changeclass": "Changing the job's class can have fundamental impacts to already exported accounting items. Are you sure you want to do this?", - "checklistcompletedby": "Checklist completed by {{by}} at {{at}}", - "checklistdocuments": "Checklist Documents", - "checklists": "Checklists", - "closeconfirm": "Are you sure you want to close this job? This cannot be easily undone.", - "closejob": "Close Job {{ro_number}}", - "contracts": "CC Contracts", - "convertedtolabor": "Lines Converted to Labor", - "cost": "Cost", - "cost_Additional": "Cost - Additional", - "cost_labor": "Cost - Labor", - "cost_parts": "Cost - Parts", - "cost_sublet": "Cost - Sublet", - "costs": "Costs", - "create": { - "jobinfo": "Job Info", - "newowner": "Create a new Owner instead. ", - "newvehicle": "Create a new Vehicle Instead", - "novehicle": "No vehicle (only for ROs to track parts/labor only work).", - "ownerinfo": "Owner Info", - "vehicleinfo": "Vehicle Info" - }, - "createiouwarning": "Are you sure you want to create an IOU for these lines? A new RO will be created based on those lines for this customer.", - "creating_new_job": "Creating new job...", - "deductible": { - "stands": "Stands", - "waived": "Waived" - }, - "deleteconfirm": "Are you sure you want to delete this job? This cannot be undone. ", - "deletedelivery": "Delete Delivery Checklist", - "deleteintake": "Delete Intake Checklist", - "deliverchecklist": "Deliver Checklist", - "difference": "Difference", - "diskscan": "Scan Disk for Estimates", - "dms": { - "apexported": "AP export completed. See logs for details.", - "damageto": "Damage to $t(jobs.fields.area_of_damage_impact.{{area_of_damage}}).", - "defaultstory": "B/S RO: {{ro_number}}. Owner: {{ownr_nm}}. Insurance Co: {{ins_co_nm}}. Claim/PO #: {{clm_po}}", - "disablebillwip": "Cost and WIP for bills has been ignored per shop configuration.", - "invoicedatefuture": "Invoice date must be today or in the future for CDK posting.", - "kmoutnotgreaterthankmin": "Mileage out must be greater than mileage in.", - "logs": "Logs", - "notallocated": "Not Allocated", - "postingform": "Posting Form", - "totalallocated": "Total Amount Allocated" - }, - "documents": "Documents", - "documents-images": "Images", - "documents-other": "Other Documents", - "duplicateconfirm": "Are you sure you want to duplicate this job? Some elements of this job will not be duplicated.", - "emailaudit": "Email Audit Trail", - "employeeassignments": "Employee Assignments", - "estimatelines": "Estimate Lines", - "estimator": "Estimator", - "existing_jobs": "Existing Jobs", - "federal_tax_amt": "Federal Taxes", - "gpdollars": "$ G.P.", - "gppercent": "% G.P.", - "hrs_claimed": "Hours Claimed", - "hrs_total": "Hours Total", - "importnote": "The job was initially imported.", - "inproduction": "In Production", - "intakechecklist": "Intake Checklist", - "iou": "IOU", - "job": "Job Details", - "jobcosting": "Job Costing", - "jobtotals": "Job Totals", - "labor_rates_subtotal": "Labor Rates Subtotal", - "laborallocations": "Labor Allocations", - "labortotals": "Labor Totals", - "lines": "Estimate Lines", - "local_tax_amt": "Local Taxes", - "mapa": "Paint Materials", - "markforreexport": "Mark for Re-export", - "mash": "Shop Materials", - "multipayers": "Additional Payers", - "net_repairs": "Net Repairs", - "notes": "Notes", - "othertotal": "Other Totals", - "override_header": "Override estimate header on import?", - "ownerassociation": "Owner Association", - "parts": "Parts", - "parts_received": "Parts Rec.", - "parts_tax_rates": "Parts Tax rates", - "partsfilter": "Parts Only", - "partssubletstotal": "Parts & Sublets Total", - "partstotal": "Parts Total (ex. Taxes)", - "pimraryamountpayable": "Total Primary Payable", - "plitooltips": { - "billtotal": "The total amount of all bill lines that have been posted against this RO (not including credits, taxes, or labor adjustments).", - "calculatedcreditsnotreceived": "The calculated credits not received is derived by subtracting the amount of credit memos entered from the retail total of returns created. This does not take into account whether the credit was marked as received. You can find more information here.", - "creditmemos": "The total retail amount of all returns created. This amount does not reflect credit memos that have been posted.", - "creditsnotreceived": "This total reflects the total retail of parts returns lines that have not been explicitly marked as returned when posting a credit memo. You can learn more about this here here. ", - "discrep1": "If the discrepancy is not $0, you may have one of the following:

\n\n
    \n
  • Too many bills/bill lines that have been posted against this RO. Check to make sure every bill posted on this RO is correctly posted and assigned.
  • \n
  • You do not have the latest supplement imported, or, a supplement must be submitted and then imported.
  • \n
  • You have posted a bill line to labor.
  • \n
\n
\nThere may be additional issues not listed above that prevent this job from reconciling.", - "discrep2": "If the discrepancy is not $0, you may have one of the following:

\n\n
    \n
  • Used an incorrect rate when deducting from labor.
  • \n
  • An outstanding imbalance higher in the reconciliation process.
  • \n
\n
\nThere may be additional issues not listed above that prevent this job from reconciling.", - "discrep3": "If the discrepancy is not $0, you may have one of the following:

\n\n
    \n
  • A parts order return has not been created.
  • \n
  • An outstanding imbalance higher in the reconciliation process.
  • \n
\n
\nThere may be additional issues not listed above that prevent this job from reconciling.", - "laboradj": "The sum of all bill lines that deducted from labor hours, rather than part prices.", - "partstotal": "This is the total of all parts and sublet amounts on the vehicle (some of these may require an in-house invoice).
\nItems such as shop and paint materials, labor online lines, etc. are not included in this total.", - "totalreturns": "The total retail amount of returns created for this job." - }, - "profileadjustments": "", - "prt_dsmk_total": "Line Item Adjustment", - "rates": "Rates", - "rates_subtotal": "All Rates Subtotal", - "reconciliation": { - "billlinestotal": "Bill Lines Total", - "byassoc": "By Line Association", - "byprice": "By Price", - "clear": "Clear All", - "discrepancy": "Discrepancy", - "joblinestotal": "Job Lines Total", - "multipleactprices": "${{act_price}} is the price for multiple job lines.", - "multiplebilllines": "{{line_desc}} has 2 or more bill lines associated to it.", - "multiplebillsforactprice": "Found more than 1 bill matching ${{act_price}} retail price.", - "removedpartsstrikethrough": "Strike through lines represent parts that have been removed from the estimate. They are included for completeness of reconciliation." - }, - "reconciliationheader": "Parts & Sublet Reconciliation", - "relatedros": "Related ROs", - "returntotals": "Return Totals", - "rosaletotal": "RO Parts Total", - "sale_additional": "Sales - Additional", - "sale_labor": "Sales - Labor", - "sale_parts": "Sales - Parts", - "sale_sublet": "Sales - Sublet", - "sales": "Sales", - "savebeforeconversion": "You have unsaved changes on the job. Please save them before converting it. ", - "scheduledinchange": "The scheduled in is based off the latest appointment. To change this date, please schedule or reschedule the job. ", - "specialcoveragepolicy": "Special Coverage Policy Applies", - "state_tax_amt": "Provincial/State Taxes", - "subletstotal": "Sublets Total", - "subtotal": "Subtotal", - "supplementnote": "The job had a supplement imported.", - "suspended": "SUSPENDED", - "suspense": "Suspense", - "threshhold": "Max Threshold: ${{amount}}", - "total_cost": "Total Cost", - "total_cust_payable": "Total Customer Amount Payable", - "total_repairs": "Total Repairs", - "total_sales": "Total Sales", - "totals": "Totals", - "unvoidnote": "This job was unvoided.", - "vehicle_info": "Vehicle", - "vehicleassociation": "Vehicle Association", - "viewallocations": "View Allocations", - "voidjob": "Are you sure you want to void this job? This cannot be easily undone. ", - "voidnote": "This job was voided." - }, - "successes": { - "addedtoproduction": "Job added to production board.", - "all_deleted": "{{count}} jobs deleted successfully.", - "closed": "Job closed successfully.", - "converted": "Job converted successfully.", - "created": "Job created successfully. Click to view.", - "creatednoclick": "Job created successfully. ", - "delete": "Job deleted successfully.", - "deleted": "Job deleted successfully.", - "duplicated": "Job duplicated successfully. ", - "exported": "Job(s) exported successfully. ", - "invoiced": "Job closed and invoiced successfully.", - "ioucreated": "IOU created successfully. Click to see.", - "partsqueue": "Job added to parts queue.", - "save": "Job saved successfully.", - "savetitle": "Record saved successfully.", - "supplemented": "Job supplemented successfully. ", - "updated": "Job(s) updated successfully.", - "voided": "Job voided successfully." - } - }, - "landing": { - "bigfeature": { - "subtitle": "ImEX Online is built using world class technology by experts in the collision repair industry. This translates to software that is tailor made for the unique challenges faced by repair facilities with no compromises. ", - "title": "Bringing the latest technology to the automotive repair industry. " - }, - "footer": { - "company": { - "about": "About Us", - "contact": "Contact", - "disclaimers": "Disclaimers", - "name": "Company", - "privacypolicy": "Privacy Policy" - }, - "io": { - "help": "Help", - "name": "ImEX Online", - "status": "System Status" - }, - "slogan": "ImEX Systems Inc. is a technology leader in the collision repair industry. We specialize in creating collision repair management systems and bodyshop management systems that lower cycle times and promote efficiency." - }, - "hero": { - "button": "Learn More", - "title": "Shop management reimagined." - }, - "labels": { - "features": "Features", - "managemyshop": "Sign In", - "pricing": "Pricing" - }, - "pricing": { - "basic": { - "name": "Basic", - "sub": "Best suited for shops looking to increase their volume." - }, - "essentials": { - "name": "Essentials", - "sub": "Best suited for small and low volume shops." - }, - "pricingtitle": "Features", - "pro": { - "name": "Pro", - "sub": "Empower your shop with the tools to operate at peak capacity." - }, - "title": "Features", - "unlimited": { - "name": "Unlimited", - "sub": "Everything you need and more for the high volume shop." - } - } - }, - "menus": { - "currentuser": { - "languageselector": "Language", - "profile": "Profile" - }, - "header": { - "accounting": "Accounting", - "accounting-payables": "Payables", - "accounting-payments": "Payments", - "accounting-receivables": "Receivables", - "activejobs": "Active Jobs", - "alljobs": "All Jobs", - "allpayments": "All Payments", - "availablejobs": "Available Jobs", - "bills": "Bills", - "courtesycars": "Courtesy Cars", - "courtesycars-all": "All Courtesy Cars", - "courtesycars-contracts": "Contracts", - "courtesycars-newcontract": "New Contract", - "customers": "Customers", - "dashboard": "Dashboard", - "enterbills": "Enter Bills", - "enterpayment": "Enter Payments", - "entertimeticket": "Enter Time Tickets", - "export": "Export", - "export-logs": "Export Logs", - "help": "Help", - "home": "Home", - "inventory": "Inventory", - "jobs": "Jobs", - "newjob": "Create New Job", - "owners": "Owners", - "parts-queue": "Parts Queue", - "phonebook": "Phonebook", - "productionboard": "Production Board - Visual", - "productionlist": "Production Board - List", - "readyjobs": "Ready Jobs", - "recent": "Recent Items", - "reportcenter": "Report Center", - "rescueme": "Rescue me!", - "schedule": "Schedule", - "scoreboard": "Scoreboard", - "search": { - "bills": "Bills", - "jobs": "Jobs", - "owners": "Owners", - "payments": "Payments", - "phonebook": "Phonebook", - "vehicles": "Vehicles" - }, - "shiftclock": "Shift Clock", - "shop": "My Shop", - "shop_config": "Configuration", - "shop_csi": "CSI", - "shop_templates": "Templates", - "shop_vendors": "Vendors", - "temporarydocs": "Temporary Documents", - "timetickets": "Time Tickets", - "vehicles": "Vehicles" - }, - "jobsactions": { - "admin": "Admin", - "cancelallappointments": "Cancel all appointments", - "closejob": "Close Job", - "deletejob": "Delete Job", - "duplicate": "Duplicate this Job", - "duplicatenolines": "Duplicate this Job without Repair Data", - "newcccontract": "Create Courtesy Car Contract", - "void": "Void Job" - }, - "jobsdetail": { - "claimdetail": "Claim Details", - "dates": "Dates", - "financials": "Financial Information", - "general": "General", - "insurance": "Insurance Information", - "labor": "Labor", - "partssublet": "Parts & Bills", - "rates": "Rates", - "repairdata": "Repair Data", - "totals": "Totals" - }, - "profilesidebar": { - "profile": "My Profile", - "shops": "My Shops" - }, - "tech": { - "home": "Home", - "jobclockin": "Job Clock In", - "jobclockout": "Job Clock Out", - "joblookup": "Job Lookup", - "login": "Login", - "logout": "Logout", - "productionboard": "Production Board - Visual", - "productionlist": "Production List", - "shiftclockin": "Shift Clock" - } - }, - "messaging": { - "actions": { - "link": "Link to Job", - "new": "New Conversation" - }, - "errors": { - "invalidphone": "The phone number is invalid. Unable to open conversation. ", - "noattachedjobs": "No jobs have been associated to this conversation. ", - "updatinglabel": "Error updating label. {{error}}" - }, - "labels": { - "addlabel": "Add a label to this conversation.", - "archive": "Archive", - "maxtenimages": "You can only select up to a maximum of 10 images at a time.", - "messaging": "Messaging", - "noallowtxt": "This customer has not indicated their permission to be messaged.", - "nojobs": "Not associated to any job.", - "nopush": "Polling Mode Enabled", - "phonenumber": "Phone #", - "presets": "Presets", - "recentonly": "Only your most recent 50 conversations will be shown here. If you are looking for an older conversation, find the related contact and click their phone number to view the conversation.", - "selectmedia": "Select Media", - "sentby": "Sent by {{by}} at {{time}}", - "typeamessage": "Send a message...", - "unarchive": "Unarchive" - } - }, - "notes": { - "actions": { - "actions": "Actions", - "deletenote": "Delete Note", - "edit": "Edit Note", - "new": "New Note", - "savetojobnotes": "Save to Job Notes" - }, - "errors": { - "inserting": "Error inserting note. {{error}}" - }, - "fields": { - "createdby": "Created By", - "critical": "Critical", - "private": "Private", - "text": "Contents", - "updatedat": "Updated At" - }, - "labels": { - "addtorelatedro": "Add to Related ROs", - "newnoteplaceholder": "Add a note...", - "notetoadd": "Note to Add", - "systemnotes": "System Notes", - "usernotes": "User Notes" - }, - "successes": { - "create": "Note created successfully.", - "deleted": "Note deleted successfully.", - "updated": "Note updated successfully." - } - }, - "owner": { - "labels": { - "noownerinfo": "No owner information." - } - }, - "owners": { - "actions": { - "update": "Update Selected Records" - }, - "errors": { - "deleting": "Error deleting owner. {{error}}.", - "noaccess": "The record does not exist or you do not have access to it. ", - "saving": "Error saving owner. {{error}}.", - "selectexistingornew": "Select an existing owner record or create a new one. " - }, - "fields": { - "address": "Address", - "allow_text_message": "Permission to Text?", - "name": "Name", - "note": "Owner Note", - "ownr_addr1": "Address", - "ownr_addr2": "Address 2", - "ownr_city": "City", - "ownr_co_nm": "Owner Co. Name", - "ownr_ctry": "Country", - "ownr_ea": "Email", - "ownr_fn": "First Name", - "ownr_ln": "Last Name", - "ownr_ph1": "Phone 1", - "ownr_ph2": "Phone 2", - "ownr_st": "Province/State", - "ownr_title": "Title", - "ownr_zip": "Zip/Postal Code", - "preferred_contact": "Preferred Contact Method", - "tax_number": "Tax Number" - }, - "forms": { - "address": "Address", - "contact": "Contact Information", - "name": "Owner Details" - }, - "labels": { - "create_new": "Create a new owner record.", - "deleteconfirm": "Are you sure you want to delete this owner? This cannot be undone.", - "existing_owners": "Existing Owners", - "fromclaim": "Current Claim", - "fromowner": "Historical Owner Record", - "relatedjobs": "Related Jobs", - "updateowner": "Update Owner" - }, - "successes": { - "delete": "Owner deleted successfully.", - "save": "Owner saved successfully." - } - }, - "parts": { - "actions": { - "order": "Order Parts", - "orderinhouse": "Order as In House" - } - }, - "parts_orders": { - "actions": { - "backordered": "Mark Backordered", - "receive": "Receive", - "receivebill": "Receive Bill" - }, - "errors": { - "associatedbills": "This parts order cannot", - "backordering": "Error backordering part {{message}}.", - "creating": "Error encountered when creating parts order. ", - "oec": "Error creating EMS files for OEC. {{error}}", - "saving": "Error saving parts order. {{error}}.", - "updating": "Error updating parts order/parts order line. {{error}}." - }, - "fields": { - "act_price": "Price", - "backordered_eta": "B.O. ETA", - "backordered_on": "B.O. On", - "cm_received": "CM Received?", - "comments": "Comments", - "cost": "Cost", - "db_price": "List Price", - "deliver_by": "Deliver By", - "job_line_id": "Job Line Id", - "line_desc": "Line Description", - "line_remarks": "Remarks", - "lineremarks": "Line Remarks", - "oem_partno": "Part #", - "order_date": "Order Date", - "order_number": "Order Number", - "orderedby": "Ordered By", - "part_type": "Type", - "quantity": "Qty.", - "return": "Return", - "status": "Status" - }, - "labels": { - "allpartsto": "All Parts Location", - "confirmdelete": "Are you sure you want to delete this item? It cannot be recovered. Job line statuses will not be updated and may require manual review. ", - "custompercent": "Custom %", - "discount": "Discount {{percent}}", - "email": "Send by Email", - "inthisorder": "Parts in this Order", - "is_quote": "Parts Quote?", - "mark_as_received": "Mark as Received?", - "newpartsorder": "New Parts Order", - "notyetordered": "This part has not yet been ordered.", - "oec": "Order via OEC", - "order_type": "Order Type", - "orderhistory": "Order History", - "parts_order": "Parts Order", - "parts_orders": "Parts Orders", - "print": "Show Printed Form", - "receive": "Receive Parts Order", - "removefrompartsqueue": "Remove from Parts Queue?", - "returnpartsorder": "Return Parts Order", - "sublet_order": "Sublet Order" - }, - "successes": { - "created": "Parts order created successfully. ", - "line_updated": "Parts return line updated.", - "received": "Parts order received.", - "return_created": "Parts return created successfully." - } - }, - "payments": { - "errors": { - "exporting": "Error exporting payment(s). {{error}}", - "exporting-partner": "Error exporting to partner. Please check the partner interaction log for more errors." - }, - "fields": { - "amount": "Amount", - "created_at": "Created At", - "date": "Payment Date", - "exportedat": "Exported At", - "memo": "Memo", - "payer": "Payer", - "paymentnum": "Payment Number", - "stripeid": "Stripe ID", - "transactionid": "Transaction ID", - "type": "Type" - }, - "labels": { - "balance": "Balance", - "ca_bc_etf_table": "ICBC EFT Table Converter", - "customer": "Customer", - "edit": "Edit Payment", - "electronicpayment": "Use Electronic Payment Processing?", - "external": "External", - "findermodal": "ICBC Payment Finder", - "insurance": "Insurance", - "new": "New Payment", - "signup": "Please contact support to sign up for electronic payments.", - "title": "Payments", - "totalpayments": "Total Payments" - }, - "successes": { - "exported": "Payment(s) exported successfully.", - "markexported": "Payment(s) marked exported.", - "payment": "Payment created successfully. ", - "stripe": "Credit card transaction charged successfully." - } - }, - "phonebook": { - "actions": { - "new": "New Phonebook Entry" - }, - "errors": { - "adding": "Error adding phonebook entry. {{error}}", - "saving": "Error saving phonebook entry. {{error}}" - }, - "fields": { - "address1": "Street 1", - "address2": "Street 2", - "category": "Category", - "city": "City", - "company": "Company", - "country": "Country", - "email": "Email", - "fax": "Fax", - "firstname": "First Name", - "lastname": "Last Name", - "phone1": "Phone 1", - "phone2": "Phone 2", - "state": "Province/State" - }, - "labels": { - "noneselected": "No phone book entry selected. ", - "onenamerequired": "At least one name related field is required.", - "vendorcategory": "Vendor" - }, - "successes": { - "added": "Phonebook entry added successfully. ", - "deleted": "Phonebook entry deleted successfully. ", - "saved": "Phonebook entry saved successfully. " - } - }, - "printcenter": { - "appointments": { - "appointment_confirmation": "Appointment Confirmation" - }, - "bills": { - "inhouse_invoice": "In House Invoice" - }, - "courtesycarcontract": { - "courtesy_car_contract": "Courtesy Car Contract", - "courtesy_car_impound": "Impound Charges", - "courtesy_car_inventory": "Courtesy Car Inventory", - "courtesy_car_terms": "Courtesy Car Terms" - }, - "errors": { - "nocontexttype": "No context type set." - }, - "jobs": { - "3rdpartyfields": { - "addr1": "Address 1", - "addr2": "Address 2", - "addr3": "Address 3", - "attn": "Attention", - "city": "City", - "custgst": "Customer Portion of GST", - "ded_amt": "Deductible", - "depreciation": "Depreciation", - "other": "Other", - "ponumber": "PO Number", - "refnumber": "Reference Number", - "sendtype": "Send by", - "state": "Province/State", - "zip": "Postal Code/Zip" - }, - "3rdpartypayer": "Invoice to Third Party Payer", - "ab_proof_of_loss": "AB - Proof of Loss", - "appointment_confirmation": "Appointment Confirmation", - "appointment_reminder": "Appointment Reminder", - "casl_authorization": "CASL Authorization", - "coversheet_landscape": "Coversheet (Landscape)", - "coversheet_portrait": "Coversheet Portrait", - "csi_invitation": "CSI Invitation", - "csi_invitation_action": "CSI Invite", - "diagnostic_authorization": "Diagnostic Authorization", - "dms_posting_sheet": "DMS Posting Sheet", - "envelope_return_address": "#10 Envelope Return Address Label", - "estimate": "Estimate Only", - "estimate_detail": "Estimate Details", - "estimate_followup": "Estimate Followup", - "express_repair_checklist": "Express Repair Checklist", - "filing_coversheet_landscape": "Filing Coversheet (Landscape)", - "filing_coversheet_portrait": "Filing Coversheet (Portrait)", - "final_invoice": "Final Invoice", - "fippa_authorization": "FIPPA Authorization", - "folder_label_multiple": "Folder Label - Multi", - "glass_express_checklist": "Glass Express Checklist", - "guarantee": "Repair Guarantee", - "individual_job_note": "Job Note RO # {{ro_number}}", - "invoice_customer_payable": "Invoice (Customer Payable)", - "invoice_total_payable": "Invoice (Total Payable)", - "iou_form": "IOU Form", - "job_costing_ro": "Job Costing", - "job_notes": "Job Notes", - "key_tag": "Key Tag", - "labels": { - "count": "Count", - "labels": "Labels", - "position": "Starting Position" - }, - "lag_time_ro": "Lag Time", - "mechanical_authorization": "Mechanical Authorization", - "mpi_animal_checklist": "MPI - Animal Checklist", - "mpi_eglass_auth": "MPI - eGlass Auth", - "mpi_final_acct_sheet": "MPI - Final Accounting Sheet", - "paint_grid": "Paint Grid", - "parts_invoice_label_single": "Parts Label Single", - "parts_label_multiple": "Parts Label - Multi", - "parts_label_single": "Parts Label - Single", - "parts_list": "Parts List", - "parts_order": "Parts Order Confirmation", - "parts_order_confirmation": "", - "parts_order_history": "Parts Order History", - "parts_return_slip": "Parts Return Slip", - "payment_receipt": "Payment Receipt", - "payment_request": "Payment Request", - "payments_by_job": "Job Payments", - "purchases_by_ro_detail": "Purchases - Detail", - "purchases_by_ro_summary": "Purchases - Summary", - "qc_sheet": "Quality Control Sheet", - "rental_reservation": "Rental Reservation", - "ro_totals": "RO Totals", - "ro_with_description": "RO Summary with Descriptions", - "sgi_certificate_of_repairs": "SGI - Certificate of Repairs", - "sgi_windshield_auth": "SGI - Windshield Authorization", - "stolen_recovery_checklist": "Stolen Recovery Checklist", - "sublet_order": "Sublet Order", - "supplement_request": "Supplement Request", - "thank_you_ro": "Thank You Letter", - "thirdpartypayer": "Third Party Payer", - "timetickets_ro": "Time Tickets", - "vehicle_check_in": "Vehicle Intake", - "vehicle_delivery_check": "Vehicle Delivery Checklist", - "window_tag": "Window Tag", - "window_tag_sublet": "Window Tag - Sublet", - "work_authorization": "Work Authorization", - "worksheet_by_line_number": "Worksheet by Line Number", - "worksheet_sorted_by_operation": "Worksheet by Operation", - "worksheet_sorted_by_operation_no_hours": "Worksheet by Operation (No Hours)", - "worksheet_sorted_by_operation_part_type": "Worksheet by Operation & Part Type", - "worksheet_sorted_by_operation_type": "Worksheet by Operation Type" - }, - "labels": { - "groups": { - "authorization": "Authorization", - "financial": "Financial", - "post": "Post-Production", - "pre": "Pre-Production", - "ro": "Repair Order", - "worksheet": "Worksheets" - }, - "misc": "Miscellaneous Documents", - "repairorder": "Repair Order Related", - "reportcentermodal": "Report Center", - "speedprint": "Speed Print", - "title": "Print Center" - }, - "payments": { - "ca_bc_etf_table": "ICBC EFT Table", - "exported_payroll": "Payroll Table" - }, - "special": { - "attendance_detail_csv": "Attendance Table" - }, - "subjects": { - "jobs": { - "parts_order": "Parts Order PO: {{ro_number}} - {{name}}", - "sublet_order": "Sublet Order PO: {{ro_number}} - {{name}}" - } - }, - "vendors": { - "purchases_by_vendor_detailed": "Purchases by Vendor - Detailed", - "purchases_by_vendor_summary": "Purchases by Vendor - Summary" - } - }, - "production": { - "actions": { - "addcolumns": "Add Columns", - "bodypriority-clear": "Clear Body Priority", - "bodypriority-set": "Set Body Priority", - "detailpriority-clear": "Clear Detail Priority", - "detailpriority-set": "Set Detail Priority", - "paintpriority-clear": "Clear Paint Priority", - "paintpriority-set": "Set Paint Priority", - "remove": "Remove from Production", - "removecolumn": "Remove Column", - "saveconfig": "Save Configuration", - "suspend": "Suspend", - "unsuspend": "Unsuspend" - }, - "errors": { - "boardupdate": "Error encountered updating job. {{message}}", - "removing": "Error removing from production board. {{error}}", - "settings": "Error saving board settings: {{error}}" - }, - "labels": { - "actual_in": "Actual In", - "alert": "Alert", - "alertoff": "Remove alert from job", - "alerton": "Add alert to job", - "ats": "Alternative Transportation", - "bodyhours": "B", - "bodypriority": "B/P", - "bodyshop": { - "labels": { - "qbo_departmentid": "QBO Department ID", - "qbo_usa": "QBO USA" - } - }, - "cardsettings": "Card Settings", - "clm_no": "Claim Number", - "comment": "Comment", - "compact": "Compact Cards", - "detailpriority": "D/P", - "employeeassignments": "Employee Assignments", - "employeesearch": "Employee Search", - "ins_co_nm": "Insurance Company Name", - "jobdetail": "Job Details", - "laborhrs": "Labor Hours", - "note": "Production Note", - "ownr_nm": "Owner Name", - "paintpriority": "P/P", - "partsstatus": "Parts Status", - "production_note": "Production Note", - "refinishhours": "R", - "scheduled_completion": "Scheduled Completion", - "selectview": "Select a View", - "stickyheader": "Sticky Header (BETA)", - "sublets": "Sublets", - "totalhours": "Total Hrs ", - "touchtime": "T/T", - "viewname": "View Name" - }, - "successes": { - "removed": "Job removed from production." - } - }, - "profile": { - "errors": { - "state": "Error reading page state. Please refresh." - }, - "labels": { - "activeshop": "Active Shop" - }, - "successes": { - "updated": "Profile updated successfully." - } - }, - "reportcenter": { - "actions": { - "generate": "Generate" - }, - "labels": { - "dates": "Dates", - "employee": "Employee", - "filterson": "Filters on {{object}}: {{field}}", - "generateasemail": "Generate as Email?", - "groups": { - "customers": "Customers", - "jobs": "Jobs & Costing", - "payroll": "Payroll", - "purchases": "Purchases", - "sales": "Sales" - }, - "key": "Report", - "objects": { - "appointments": "Appointments", - "bills": "Bills", - "csi": "CSI", - "exportlogs": "Export Logs", - "jobs": "Jobs", - "parts_orders": "Parts Orders", - "payments": "Payments", - "scoreboard": "Scoreboard", - "timetickets": "Timetickets" - }, - "vendor": "Vendor" - }, - "templates": { - "anticipated_revenue": "Anticipated Revenue", - "attendance_detail": "Attendance (All Employees)", - "attendance_employee": "Employee Attendance", - "attendance_summary": "Attendance Summary (All Employees)", - "credits_not_received_date": "Credits not Received by Date", - "credits_not_received_date_vendorid": "Credits not Received by Vendor", - "csi": "CSI Responses", - "customer_list": "Customer List", - "cycle_time_analysis": "Cycle Time Analysis", - "estimates_written_converted": "Estimates Written/Converted", - "estimator_detail": "Jobs by Estimator (Detail)", - "estimator_summary": "Jobs by Estimator (Summary)", - "export_payables": "Export Log - Payables", - "export_payments": "Export Log - Payments", - "export_receivables": "Export Log - Receivables", - "exported_gsr_by_ro": "Exported Gross Sales - Excel", - "exported_gsr_by_ro_labor": "Exported Gross Sales (Labor) - Excel", - "gsr_by_atp": "", - "gsr_by_ats": "Gross Sales by ATS", - "gsr_by_category": "Gross Sales by Category", - "gsr_by_csr": "Gross Sales by CSR", - "gsr_by_delivery_date": "Gross Sales by Delivery Date", - "gsr_by_estimator": "Gross Sales by Estimator", - "gsr_by_exported_date": "Exported Gross Sales", - "gsr_by_ins_co": "Gross Sales by Insurance Company", - "gsr_by_make": "Gross Sales by Vehicle Make", - "gsr_by_referral": "Gross Sales by Referral Source", - "gsr_by_ro": "Gross Sales by RO", - "gsr_labor_only": "Gross Sales - Labor Only", - "hours_sold_detail_closed": "Hours Sold Detail - Closed", - "hours_sold_detail_closed_csr": "Hours Sold Detail - Closed by CSR", - "hours_sold_detail_closed_ins_co": "Hours Sold Detail - Closed by Source", - "hours_sold_detail_closed_status": "Hours Sold Detail - Closed by Status", - "hours_sold_detail_open": "Hours Sold Detail - Open", - "hours_sold_detail_open_csr": "Hours Sold Detail - Open by CSR", - "hours_sold_detail_open_ins_co": "Hours Sold Detail - Open by Source", - "hours_sold_detail_open_status": "Hours Sold Detail - Open by Status", - "hours_sold_summary_closed": "Hours Sold Summary - Closed", - "hours_sold_summary_closed_csr": "Hours Sold Summary - Closed by CSR", - "hours_sold_summary_closed_ins_co": "Hours Sold Summary - Closed by Source", - "hours_sold_summary_closed_status": "Hours Sold Summary - Closed by Status", - "hours_sold_summary_open": "Hours Sold Summary - Open", - "hours_sold_summary_open_csr": "Hours Sold Summary - Open CSR", - "hours_sold_summary_open_ins_co": "Hours Sold Summary - Open by Source", - "hours_sold_summary_open_status": "Hours Sold Summary - Open by Status", - "job_costing_ro_csr": "Job Costing by CSR", - "job_costing_ro_date_detail": "Job Costing by RO - Detail", - "job_costing_ro_date_summary": "Job Costing by RO - Summary", - "job_costing_ro_estimator": "Job Costing by Estimator", - "job_costing_ro_ins_co": "Job Costing by RO Source", - "jobs_completed_not_invoiced": "Jobs Completed not Invoiced", - "jobs_invoiced_not_exported": "Jobs Invoiced not Exported", - "jobs_reconcile": "Parts/Sublet/Labor Reconciliation", - "lag_time": "Lag Time", - "open_orders": "Open Orders by Date", - "open_orders_csr": "Open Orders by CSR", - "open_orders_estimator": "Open Orders by Estimator", - "open_orders_ins_co": "Open Orders by Insurance Company", - "open_orders_specific_csr": "Open Orders filtered by CSR", - "open_orders_status": "Open Orders by Status", - "parts_backorder": "IOU Parts List", - "parts_not_recieved": "Parts Not Received", - "parts_not_recieved_vendor": "Parts Not Received by Vendor", - "parts_received_not_scheduled": "Parts Received for Jobs Not Scheduled", - "payments_by_date": "Payments by Date", - "payments_by_date_type": "Payments by Date and Type", - "production_by_category": "Production by Category", - "production_by_category_one": "Production filtered by Category", - "production_by_csr": "Production by CSR", - "production_by_last_name": "Production by Last Name", - "production_by_repair_status": "Production by Status", - "production_by_repair_status_one": "Production filtered by Status", - "production_by_ro": "Production by RO", - "production_by_target_date": "Production by Target Date", - "production_by_technician": "Production by Technician", - "production_by_technician_one": "Production filtered by Technician", - "production_over_time": "Production Level over Time", - "psr_by_make": "Percent of Sales by Vehicle Make", - "purchase_return_ratio_grouped_by_vendor_detail": "Purchase & Return Ratio by Vendor (Detail)", - "purchase_return_ratio_grouped_by_vendor_summary": "Purchase & Return Ratio by Vendor (Summary)", - "purchases_by_cost_center_detail": "Purchases by Cost Center (Detail)", - "purchases_by_cost_center_summary": "Purchases by Cost Center (Summary)", - "purchases_by_date_range_detail": "Purchases by Date - Detail", - "purchases_by_date_range_summary": "Purchases by Date - Summary", - "purchases_by_vendor_detailed_date_range": "Purchases By Vendor - Detailed", - "purchases_by_vendor_summary_date_range": "Purchases by Vendor - Summary", - "purchases_grouped_by_vendor_detailed": "Purchases Grouped by Vendor - Detailed", - "purchases_grouped_by_vendor_summary": "Purchases Grouped by Vendor - Summary", - "returns_grouped_by_vendor_detailed": "Returns Grouped by Vendor - Detailed", - "returns_grouped_by_vendor_summary": "Returns Grouped by Vendor - Summary", - "schedule": "Appointment Schedule", - "scheduled_parts_list": "Parts for Jobs Scheduled In", - "scoreboard_detail": "Scoreboard Detail", - "scoreboard_summary": "Scoreboard Summary", - "supplement_ratio_ins_co": "Supplement Ratio by Source", - "thank_you_date": "Thank You Letters", - "timetickets": "Time Tickets", - "timetickets_employee": "Employee Time Tickets", - "timetickets_summary": "Time Tickets Summary", - "unclaimed_hrs": "Unclaimed Hours", - "void_ros": "Void ROs", - "work_in_progress_labour": "Work in Progress - Labor", - "work_in_progress_payables": "Work in Progress - Payables" - } - }, - "schedule": { - "labels": { - "atssummary": "ATS Summary", - "employeevacation": "Employee Vacations", - "ins_co_nm_filter": "Filter by Insurance Company", - "intake": "Intake Events", - "manual": "Manual Events", - "manualevent": "Add Manual Event" - } - }, - "scoreboard": { - "actions": { - "edit": "Edit" - }, - "errors": { - "adding": "Error adding job to scoreboard. {{message}}", - "removing": "Error removing job from scoreboard. {{message}}", - "updating": "Error updating scoreboard. {{message}}" - }, - "fields": { - "bodyhrs": "Body Hours", - "date": "Date", - "painthrs": "Paint Hours" - }, - "labels": { - "asoftodaytarget": "As of Today", - "calendarperiod": "Periods based on calendar weeks/months.", - "dailyactual": "Actual (D)", - "dailytarget": "Daily", - "efficiencyoverperiod": "Efficiency over Selected Dates", - "entries": "Scoreboard Entries", - "jobs": "Jobs", - "lastmonth": "Last Month", - "lastweek": "Last Week", - "monthlytarget": "Monthly", - "productivestatistics": "Productive Hours Statistics", - "productivetimeticketsoverdate": "Productive Hours over Selected Dates", - "targets": "Targets", - "thismonth": "This Month", - "thisweek": "This Week", - "timetickets": "Timetickets", - "todateactual": "Actual (MTD)", - "totaloverperiod": "Total over Selected Dates", - "weeklyactual": "Actual (W)", - "weeklytarget": "Weekly", - "workingdays": "Working Days / Month" - }, - "successes": { - "added": "Job added to scoreboard.", - "removed": "Job removed from scoreboard.", - "updated": "Scoreboard updated." - } - }, - "tech": { - "fields": { - "employeeid": "Employee ID", - "pin": "PIN" - }, - "labels": { - "loggedin": "Logged in as {{name}}", - "notloggedin": "Not logged in." - } - }, - "templates": { - "errors": { - "updating": "Error updating template {{error}}." - }, - "successes": { - "updated": "Template updated successfully." - } - }, - "timetickets": { - "actions": { - "clockin": "Clock In", - "clockout": "Clock Out", - "enter": "Enter New Time Ticket", - "printemployee": "Print Time Tickets" - }, - "errors": { - "clockingin": "Error while clocking in. {{message}}", - "clockingout": "Error while clocking out. {{message}}", - "creating": "Error creating time ticket. {{message}}", - "deleting": "Error deleting time ticket. {{message}}", - "noemployeeforuser": "Unable to use Shift Clock", - "noemployeeforuser_sub": "An employee record has not been created for this user. Please create one before using the shift clock. ", - "shiftalreadyclockedon": "You are already clocked onto a shift. Unable to create shift entry." - }, - "fields": { - "actualhrs": "Actual Hours", - "ciecacode": "CIECA Code", - "clockhours": "Clock Hours", - "clockoff": "Clock Off", - "clockon": "Clocked In", - "cost_center": "Cost Center", - "date": "Ticket Date", - "efficiency": "Efficiency", - "employee": "Employee", - "flat_rate": "Flat Rate?", - "memo": "Memo", - "productivehrs": "Productive Hours", - "ro_number": "Job to Post Against" - }, - "labels": { - "alreadyclockedon": "You are already clocked in to the following job(s):", - "ambreak": "AM Break", - "amshift": "AM Shift", - "clockhours": "Shift Clock Hours Summary", - "clockintojob": "Clock In to Job", - "deleteconfirm": "Are you sure you want to delete this time ticket? This cannot be undone.", - "edit": "Edit Time Ticket", - "efficiency": "Efficiency", - "flat_rate": "Flat Rate", - "jobhours": "Job Related Time Tickets Summary", - "lunch": "Lunch", - "new": "New Time Ticket", - "pmbreak": "PM Break", - "pmshift": "PM Shift", - "shift": "Shift", - "shiftalreadyclockedon": "Active Shift Time Tickets", - "straight_time": "Straight Time", - "timetickets": "Time Tickets", - "zeroactualnegativeprod": "Actual hours must be 0 if entering negative productive hours." - }, - "successes": { - "clockedin": "Clocked in successfully.", - "clockedout": "Clocked out successfully.", - "created": "Time ticket entered successfully.", - "deleted": "Time ticket deleted successfully." - }, - "validation": { - "clockoffmustbeafterclockon": "Clock off time must be the same or after clock in time.", - "clockoffwithoutclockon": "Clock off time cannot be set without a clock in time.", - "hoursenteredmorethanavailable": "The number of hours entered is more than what is available for this cost center." - } - }, - "titles": { - "accounting-payables": "Payables | $t(titles.app)", - "accounting-payments": "Payments | $t(titles.app)", - "accounting-receivables": "Receivables | $t(titles.app)", - "app": "ImEX Online", - "bc": { - "accounting-payables": "Payables", - "accounting-payments": "Payments", - "accounting-receivables": "Receivables", - "availablejobs": "Available Jobs", - "bills-list": "Bills", - "contracts": "Contracts", - "contracts-create": "New Contract", - "contracts-detail": "Contract #{{number}}", - "courtesycars": "Courtesy Cars", - "courtesycars-detail": "Courtesy Car {{number}}", - "courtesycars-new": "New Courtesy Car", - "dashboard": "Dashboard", - "dms": "DMS Export", - "export-logs": "Export Logs", - "inventory": "Inventory", - "jobs": "Jobs", - "jobs-active": "Active Jobs", - "jobs-admin": "Admin", - "jobs-all": "All Jobs", - "jobs-checklist": "Checklist", - "jobs-close": "Close Job", - "jobs-deliver": "Deliver Job", - "jobs-detail": "Job {{number}}", - "jobs-intake": "Intake", - "jobs-new": "Create a New Job", - "jobs-ready": "Ready Jobs", - "owner-detail": "{{name}}", - "owners": "Owners", - "parts-queue": "Parts Queue", - "payments-all": "All Payments", - "phonebook": "Phonebook", - "productionboard": "Production Board - Visual", - "productionlist": "Production Board - List", - "profile": "My Profile", - "schedule": "Schedule", - "scoreboard": "Scoreboard", - "shop": "Manage my Shop ({{shopname}})", - "shop-csi": "CSI Responses", - "shop-templates": "Shop Templates", - "shop-vendors": "Vendors", - "temporarydocs": "Temporary Documents", - "timetickets": "Time Tickets", - "vehicle-details": "Vehicle: {{vehicle}}", - "vehicles": "Vehicles" - }, - "bills-list": "Bills | $t(titles.app)", - "contracts": "Courtesy Car Contracts | $t(titles.app)", - "contracts-create": "New Contract | $t(titles.app)", - "contracts-detail": "Contract {{id}} | $t(titles.app)", - "courtesycars": "Courtesy Cars | $t(titles.app)", - "courtesycars-create": "New Courtesy Car | $t(titles.app)", - "courtesycars-detail": "Courtesy Car {{id}} | $t(titles.app)", - "dashboard": "Dashboard | $t(titles.app)", - "dms": "DMS Export | $t(titles.app)", - "export-logs": "Export Logs | $t(titles.app)", - "inventory": "Inventory | $t(titles.app)", - "jobs": "Active Jobs | $t(titles.app)", - "jobs-admin": "Job {{ro_number}} - Admin | $t(titles.app)", - "jobs-all": "All Jobs | $t(titles.app)", - "jobs-checklist": "Job Checklist | $t(titles.app)", - "jobs-close": "Close Job {{number}} | $t(titles.app)", - "jobs-create": "Create a New Job | $t(titles.app)", - "jobs-deliver": "Deliver Job | $t(titles.app)", - "jobs-intake": "Intake | $t(titles.app)", - "jobsavailable": "Available Jobs | $t(titles.app)", - "jobsdetail": "Job {{ro_number}} | $t(titles.app)", - "jobsdocuments": "Job Documents {{ro_number}} | $t(titles.app)", - "manageroot": "Home | $t(titles.app)", - "owners": "All Owners | $t(titles.app)", - "owners-detail": "{{name}} | $t(titles.app)", - "parts-queue": "Parts Queue | $t(titles.app)", - "payments-all": "Payments | $t(titles.app)", - "phonebook": "Phonebook | $t(titles.app)", - "productionboard": "Production - Board", - "productionlist": "Production Board - List | $t(titles.app)", - "profile": "My Profile | $t(titles.app)", - "readyjobs": "Ready Jobs | $t(titles.app)", - "resetpassword": "Reset Password", - "resetpasswordvalidate": "Enter New Password", - "schedule": "Schedule | $t(titles.app)", - "scoreboard": "Scoreboard | $t(titles.app)", - "shop": "My Shop | $t(titles.app)", - "shop-csi": "CSI Responses | $t(titles.app)", - "shop-templates": "Shop Templates | $t(titles.app)", - "shop_vendors": "Vendors | $t(titles.app)", - "temporarydocs": "Temporary Documents | $t(titles.app)", - "timetickets": "Time Tickets | $t(titles.app)", - "vehicledetail": "Vehicle Details {{vehicle}} | $t(titles.app)", - "vehicles": "All Vehicles | $t(titles.app)" - }, - "user": { - "actions": { - "changepassword": "Change Password", - "signout": "Sign Out", - "updateprofile": "Update Profile" - }, - "errors": { - "updating": "Error updating user or association {{message}}" - }, - "fields": { - "authlevel": "Authorization Level", - "displayname": "Display Name", - "email": "Email", - "photourl": "Avatar URL" - }, - "labels": { - "actions": "Actions", - "changepassword": "Change Password", - "profileinfo": "Profile Info" - }, - "successess": { - "passwordchanged": "Password changed successfully. " - } - }, - "users": { - "errors": { - "signinerror": { - "auth/user-disabled": "User account disabled. ", - "auth/user-not-found": "A user with this email does not exist.", - "auth/wrong-password": "The email and password combination you provided is incorrect." - } - } - }, - "vehicles": { - "errors": { - "deleting": "Error deleting vehicle. {{error}}.", - "noaccess": "The vehicle does not exist or you do not have access to it.", - "selectexistingornew": "Select an existing vehicle record or create a new one. ", - "validation": "Please ensure all fields are entered correctly.", - "validationtitle": "Validation Error" - }, - "fields": { - "description": "Vehicle Description", - "notes": "Vehicle Notes", - "plate_no": "License Plate", - "plate_st": "Plate Jurisdiction", - "trim_color": "Trim Color", - "v_bstyle": "Body Style", - "v_color": "Color", - "v_cond": "Condition", - "v_engine": "Engine", - "v_make_desc": "Make", - "v_makecode": "Make Code", - "v_mldgcode": "Molding Code", - "v_model_desc": "Model", - "v_model_yr": "Year", - "v_options": "Options", - "v_paint_codes": "Paint Codes {{number}}", - "v_prod_dt": "Production Date", - "v_stage": "Stage", - "v_tone": "Tone", - "v_trimcode": "Trim Code", - "v_type": "Type", - "v_vin": "V.I.N." - }, - "forms": { - "detail": "Vehicle Details", - "misc": "Miscellaneous", - "registration": "Registration" - }, - "labels": { - "deleteconfirm": "Are you sure you want to delete this vehicle? This cannot be undone.", - "fromvehicle": "Historical Vehicle Record", - "novehinfo": "No Vehicle Information", - "relatedjobs": "Related Jobs", - "updatevehicle": "Update Vehicle Information" - }, - "successes": { - "delete": "Vehicle deleted successfully.", - "save": "Vehicle saved successfully." - } - }, - "vendors": { - "actions": { - "addtophonebook": "Add to Phonebook", - "new": "New Vendor", - "newpreferredmake": "New Preferred Make" - }, - "errors": { - "deleting": "Error encountered while deleting vendor. ", - "saving": "Error encountered while saving vendor. " - }, - "fields": { - "active": "Active", - "am": "Aftermarket", - "city": "City", - "cost_center": "Cost Center", - "country": "Country", - "discount": "Discount % (as decimal)", - "display_name": "Display Name", - "dmsid": "DMS ID", - "due_date": "Payment Due Date (# of days)", - "email": "Contact Email", - "favorite": "Favorite?", - "lkq": "LKQ", - "make": "Make", - "name": "Vendor Name", - "oem": "OEM", - "phone": "Phone", - "prompt_discount": "Prompt Discount %", - "state": "Province/State", - "street1": "Street", - "street2": "Address 2", - "taxid": "Tax ID", - "terms": "Payment Terms", - "zip": "Zip/Postal Code" - }, - "labels": { - "noneselected": "No vendor is selected.", - "preferredmakes": "Preferred Makes for Vendor", - "search": "Type a Vendor's Name" - }, - "successes": { - "deleted": "Vendor deleted successfully. ", - "saved": "Vendor saved successfully." - }, - "validation": { - "unique_vendor_name": "You must enter a unique vendor name." - } - } - } + "translation": { + "allocations": { + "actions": { + "assign": "Assign" + }, + "errors": { + "deleting": "Error encountered while deleting allocation. {{message}}", + "saving": "Error while allocating. {{message}}", + "validation": "Please ensure all fields are entered correctly. " + }, + "fields": { + "employee": "Allocated To" + }, + "successes": { + "deleted": "Allocation deleted successfully.", + "save": "Allocated successfully. " + } + }, + "appointments": { + "actions": { + "block": "Block Day", + "calculate": "Calculate SMART Dates", + "cancel": "Cancel Appointment", + "intake": "Intake", + "new": "New Appointment", + "preview": "Preview", + "reschedule": "Reschedule", + "sendreminder": "Send Reminder", + "viewjob": "View Job" + }, + "errors": { + "blocking": "Error creating block {{message}}.", + "canceling": "Error canceling appointment. {{message}}", + "saving": "Error scheduling appointment. {{message}}" + }, + "fields": { + "alt_transport": "Alt. Trans.", + "color": "Appointment Color", + "end": "End", + "note": "Note", + "start": "Start", + "time": "Appointment Time", + "title": "Title" + }, + "labels": { + "arrivedon": "Arrived on: ", + "arrivingjobs": "Arriving Jobs", + "blocked": "Blocked", + "cancelledappointment": "Canceled appointment for: ", + "completingjobs": "Completing Jobs", + "dataconsistency": "{{ro_number}} has a data consistency issue. It may have been excluded for scheduling purposes. CODE: {{code}}.", + "expectedjobs": "Expected Jobs in Production: ", + "expectedprodhrs": "Expected Production Hours:", + "history": "History", + "inproduction": "Jobs In Production", + "manualevent": "Add Manual Appointment", + "noarrivingjobs": "No jobs are arriving.", + "nocompletingjobs": "No jobs scheduled for completion.", + "nodateselected": "No date has been selected.", + "priorappointments": "Previous Appointments", + "reminder": "This is {{shopname}} reminding you about an appointment on {{date}} at {{time}}. Please let us know if you are not able to make the appointment. We look forward to seeing you soon. ", + "scheduledfor": "Scheduled appointment for: ", + "severalerrorsfound": "Several jobs have issues which may prevent accurate smart scheduling. Click to expand.", + "smartscheduling": "Smart Scheduling", + "suggesteddates": "Suggested Dates" + }, + "successes": { + "canceled": "Appointment canceled successfully.", + "created": "Appointment scheduled successfully.", + "saved": "Appointment saved successfully." + } + }, + "associations": { + "actions": { + "activate": "Activate" + }, + "fields": { + "active": "Active?", + "shopname": "Shop Name" + }, + "labels": { + "actions": "Actions" + } + }, + "audit": { + "fields": { + "cc": "CC", + "contents": "Contents", + "created": "Time", + "operation": "Operation", + "status": "Status", + "subject": "Subject", + "to": "To", + "useremail": "User", + "values": "Values" + } + }, + "audit_trail": { + "messages": { + "admin_jobmarkexported": "ADMIN: Job marked as exported.", + "admin_jobmarkforreexport": "ADMIN: Job marked for re-export.", + "admin_jobunvoid": "ADMIN: Job has been unvoided.", + "billposted": "Bill with invoice number {{invoice_number}} posted.", + "billupdated": "Bill with invoice number {{invoice_number}} updated.", + "jobassignmentchange": "Employee {{name}} assigned to {{operation}}", + "jobassignmentremoved": "Employee assignment removed for {{operation}}", + "jobchecklist": "Checklist type \"{{type}}\" completed. In production set to {{inproduction}}. Status set to {{status}}.", + "jobconverted": "Job converted and assigned number {{ro_number}}.", + "jobfieldchanged": "Job field $t(jobs.fields.{{field}}) changed to {{value}}.", + "jobimported": "Job imported.", + "jobinproductionchange": "Job production status set to {{inproduction}}", + "jobioucreated": "IOU Created.", + "jobmodifylbradj": "Labor adjustments modified {{mod_lbr_ty}} / {{hours}}.", + "jobnoteadded": "Note added to job.", + "jobnotedeleted": "Note deleted from job.", + "jobnoteupdated": "Note updated on job.", + "jobspartsorder": "Parts order {{order_number}} added to job.", + "jobspartsreturn": "Parts return {{order_number}} added to job.", + "jobstatuschange": "Job status changed to {{status}}.", + "jobsupplement": "Job supplement imported." + } + }, + "billlines": { + "actions": { + "newline": "New Line" + }, + "fields": { + "actual_cost": "Actual Cost", + "actual_price": "Retail", + "cost_center": "Cost Center", + "federal_tax_applicable": "Fed. Tax?", + "jobline": "Job Line", + "line_desc": "Line Description", + "local_tax_applicable": "Loc. Tax?", + "location": "Location", + "quantity": "Quantity", + "state_tax_applicable": "St. Tax?" + }, + "labels": { + "deductedfromlbr": "Deduct from Labor?", + "entered": "Entered", + "from": "From", + "other": "-- Not On Estimate --", + "reconciled": "Reconciled!", + "unreconciled": "Unreconciled" + }, + "validation": { + "atleastone": "At least one bill line must be entered." + } + }, + "bills": { + "actions": { + "edit": "Edit", + "receive": "Receive Part", + "return": "Return Items" + }, + "errors": { + "creating": "Error adding bill. {{error}}", + "deleting": "Error deleting bill. {{error}}", + "existinginventoryline": "This bill cannot be deleted as it is tied to items in inventory.", + "exporting": "Error exporting payable(s). {{error}}", + "exporting-partner": "Unable to connect to ImEX Partner. Please ensure it is running and logged in.", + "invalidro": "Not a valid RO.", + "invalidvendor": "Not a valid vendor.", + "validation": "Please ensure all fields are entered correctly. " + }, + "fields": { + "allpartslocation": "Parts Bin", + "date": "Bill Date", + "exported": "Exported", + "federal_tax_rate": "Federal Tax Rate", + "invoice_number": "Invoice Number", + "is_credit_memo": "Credit Memo?", + "is_credit_memo_short": "CM", + "local_tax_rate": "Local Tax Rate", + "ro_number": "RO Number", + "state_tax_rate": "Provincial/State Tax Rate", + "total": "Bill Total", + "vendor": "Vendor", + "vendorname": "Vendor Name" + }, + "labels": { + "actions": "Actions", + "bill_lines": "Bill Lines", + "bill_total": "Bill Total Amount", + "billcmtotal": "Credit Memos", + "bills": "Bills", + "calculatedcreditsnotreceived": "Calculated CNR", + "creditsnotreceived": "Credits Not Marked Received", + "creditsreceived": "Credits Received", + "dedfromlbr": "Labor Adjustments", + "deleteconfirm": "Are you sure you want to delete this bill? It cannot be undone. If this bill has deductions from labors, manual changes may be required.", + "discrepancy": "Discrepancy", + "discrepwithcms": "Discrepancy including Credit Memos", + "discrepwithlbradj": "Discrepancy including Lbr. Adj.", + "editadjwarning": "This bill had lines which resulted in labor adjustments. Manual correction to adjustments may be required.", + "entered_total": "Total of Entered Lines", + "enteringcreditmemo": "You are entering a credit memo. Please ensure you are also entering positive values.", + "federal_tax": "Federal Tax", + "generatepartslabel": "Generate Parts Labels after Saving?", + "iouexists": "An IOU exists that is associated to this RO.", + "local_tax": "Local Tax", + "markexported": "Mark Exported", + "markforreexport": "Mark for Re-export", + "new": "New Bill", + "noneselected": "No bill selected.", + "onlycmforinvoiced": "Only credit memos can be entered for any job that has been invoiced, exported, or voided.", + "retailtotal": "Bills Retail Total", + "savewithdiscrepancy": "You are about to save this bill with a discrepancy. The system will continue to use the calculated amount using the bill lines. Press cancel to return to the bill.", + "state_tax": "Provincial/State Tax", + "subtotal": "Subtotal", + "totalreturns": "Total Returns" + }, + "successes": { + "created": "Invoice added successfully.", + "deleted": "Bill deleted successfully.", + "exported": "Bill(s) exported successfully.", + "markexported": "Bill marked as exported.", + "reexport": "Bill marked for re-export." + }, + "validation": { + "inventoryquantity": "Quantity must be greater than or equal to what has been added to inventory ({{number}}).", + "manualinhouse": "Manual posting to the in house vendor is restricted. ", + "unique_invoice_number": "This invoice number has already been entered for this vendor." + } + }, + "bodyshop": { + "actions": { + "addapptcolor": "Add Appointment Color", + "addbucket": "Add Definition", + "addpartslocation": "Add Parts Location", + "addpartsrule": "Add Parts Scan Rule", + "addspeedprint": "Add Speed Print", + "addtemplate": "Add Template", + "newlaborrate": "New Labor Rate", + "newsalestaxcode": "New Sales Tax Code", + "newstatus": "Add Status", + "testrender": "Test Render" + }, + "errors": { + "loading": "Unable to load shop details. Please call technical support.", + "saving": "Error encountered while saving. {{message}}" + }, + "fields": { + "ReceivableCustomField": "QBO Receivable Custom Field {{number}}", + "address1": "Address 1", + "address2": "Address 2", + "appt_alt_transport": "Appointment Alternative Transportation Options", + "appt_colors": { + "color": "Color", + "label": "Label" + }, + "appt_length": "Default Appointment Length", + "attach_pdf_to_email": "Attach PDF copy to sent emails?", + "bill_allow_post_to_closed": "Allow Bills to be posted to Closed Jobs", + "bill_federal_tax_rate": "Bills - Federal Tax Rate %", + "bill_local_tax_rate": "Bill - Provincial/State Tax Rate %", + "bill_state_tax_rate": "Bill - Provincial/State Tax Rate %", + "city": "City", + "country": "Country", + "dailybodytarget": "Scoreboard - Daily Body Target", + "dailypainttarget": "Scoreboard - Daily Paint Target", + "default_adjustment_rate": "Default Labor Deduction Adjustment Rate", + "deliver": { + "templates": "Delivery Templates" + }, + "dms": { + "cashierid": "Cashier ID", + "default_journal": "Default Journal", + "disablebillwip": "Disable bill WIP for A/P Posting", + "disablecontactvehiclecreation": "Disable Contact & Vehicle Updates/Creation", + "dms_acctnumber": "DMS Account #", + "dms_control_override": "Static Control # Override", + "dms_wip_acctnumber": "DMS W.I.P. Account #", + "generic_customer_number": "Generic Customer Number", + "itc_federal": "Federal Tax is ITC?", + "itc_local": "Local Tax is ITC?", + "itc_state": "State Tax is ITC?", + "mappingname": "DMS Mapping Name", + "sendmaterialscosting": "Materials Cost as % of Sale", + "srcco": "Source Company #/Dealer #" + }, + "email": "General Shop Email", + "enforce_class": "Enforce Class on Conversion?", + "enforce_conversion_category": "Enforce Category on Conversion?", + "enforce_conversion_csr": "Enforce CSR on Conversion?", + "enforce_referral": "Enforce Referrals", + "federal_tax_id": "Federal Tax ID (GST/HST)", + "ignoreblockeddays": "Scoreboard - Ignore Blocked Days", + "inhousevendorid": "In House Vendor ID", + "insurance_vendor_id": "Insurance Vendor ID", + "intake": { + "next_contact_hours": "Automatic Next Contact Date - Hours from Intake", + "templates": "Intake Templates" + }, + "invoice_federal_tax_rate": "Invoices - Federal Tax Rate", + "invoice_local_tax_rate": "Invoices - Local Tax Rate", + "invoice_state_tax_rate": "Invoices - Provincial/State Tax Rate", + "jc_hourly_rates": { + "mapa": "Job Costing - Paint Materials Hourly Cost Rate", + "mash": "Job Costing - Shop Materials Hourly Cost Rate" + }, + "last_name_first": "Display Owner Info as , ", + "lastnumberworkingdays": "Scoreboard - Last Number of Working Days", + "localmediaserverhttp": "Local Media Server - HTTP Path", + "localmediaservernetwork": "Local Media Server - Network Path", + "localmediatoken": "Local Media Server - Token", + "logo_img_footer_margin": "Footer Margin (px)", + "logo_img_header_margin": "Header Margin (px)", + "logo_img_path": "Shop Logo", + "logo_img_path_height": "Logo Image Height", + "logo_img_path_width": "Logo Image Width", + "md_categories": "Categories", + "md_ccc_rates": "Courtesy Car Contract Rate Presets", + "md_classes": "Classes", + "md_ded_notes": "Deductible Notes", + "md_email_cc": "Auto Email CC: $t(printcenter.subjects.jobs.{{template}})", + "md_from_emails": "Additional From Emails", + "md_hour_split": { + "paint": "Paint Hour Split", + "prep": "Prep Hour Split" + }, + "md_ins_co": { + "city": "City", + "name": "Insurance Company Name", + "private": "Private", + "state": "Province/State", + "street1": "Street 1", + "street2": "Street 2", + "zip": "Zip/Postal Code" + }, + "md_jobline_presets": "Jobline Presets", + "md_lost_sale_reasons": "Lost Sale Reasons", + "md_parts_order_comment": "Parts Orders Comments", + "md_parts_scan": { + "expression": "RegEX Expression", + "flags": "Flags" + }, + "md_payment_types": "Payment Types", + "md_referral_sources": "Referral Sources", + "messaginglabel": "Messaging Preset Label", + "messagingtext": "Messaging Preset Text", + "noteslabel": "Note Label", + "notestext": "Note Text", + "partslocation": "Parts Location", + "phone": "Phone", + "prodtargethrs": "Production Target Hours", + "rbac": { + "accounting": { + "exportlog": "Accounting -> Export Log", + "payables": "Accounting -> Payables", + "payments": "Accounting -> Payments", + "receivables": "Accounting -> Receivables" + }, + "bills": { + "delete": "Bills -> Delete", + "enter": "Bills -> Enter", + "list": "Bills -> List", + "reexport": "Bills -> Re-export", + "view": "Bills -> View" + }, + "contracts": { + "create": "Contracts -> Create", + "detail": "Contracts -> Detail", + "list": "Contracts -> List" + }, + "courtesycar": { + "create": "Courtesy Car -> Create", + "detail": "Courtesy Car -> Detail", + "list": "Courtesy Car -> List" + }, + "csi": { + "export": "CSI -> Export", + "page": "CSI -> Page" + }, + "employees": { + "page": "Employees -> List" + }, + "inventory": { + "delete": "Inventory -> Delete", + "list": "Inventory -> List" + }, + "jobs": { + "admin": "Jobs -> Admin", + "available-list": "Jobs -> Available List", + "checklist-view": "Jobs -> Checklist View", + "close": "Jobs -> Close", + "create": "Jobs -> Create", + "deliver": "Jobs -> Deliver", + "detail": "Jobs -> Detail", + "intake": "Jobs -> Intake", + "list-active": "Jobs -> List Active", + "list-all": "Jobs -> List All", + "list-ready": "Jobs -> List Ready", + "partsqueue": "Jobs -> Parts Queue" + }, + "owners": { + "detail": "Owners -> Detail", + "list": "Owners -> List" + }, + "payments": { + "enter": "Payments -> Enter", + "list": "Payments -> List" + }, + "phonebook": { + "edit": "Phonebook -> Edit", + "view": "Phonebook -> View" + }, + "production": { + "board": "Production -> Board", + "list": "Production -> List" + }, + "schedule": { + "view": "Schedule -> View" + }, + "scoreboard": { + "view": "Scoreboard -> View" + }, + "shiftclock": { + "view": "Shift Clock -> View" + }, + "shop": { + "config": "Shop -> Config", + "dashboard": "Shop -> Dashboard", + "rbac": "Shop -> RBAC", + "templates": "Shop -> Templates", + "vendors": "Shop -> Vendors" + }, + "temporarydocs": { + "view": "Temporary Docs -> View" + }, + "timetickets": { + "edit": "Time Tickets -> Edit", + "enter": "Time Tickets -> Enter", + "list": "Time Tickets -> List", + "shiftedit": "Time Tickets -> Shift Edit" + }, + "users": { + "editaccess": "Users -> Edit access" + } + }, + "responsibilitycenter": "Responsibility Center", + "responsibilitycenter_accountdesc": "Account Description", + "responsibilitycenter_accountitem": "Item", + "responsibilitycenter_accountname": "Account Name", + "responsibilitycenter_accountnumber": "Account Number", + "responsibilitycenter_rate": "Rate", + "responsibilitycenters": { + "ap": "Accounts Payable", + "ar": "Accounts Receivable", + "ats": "ATS", + "federal_tax": "Federal Tax", + "federal_tax_itc": "Federal Tax Credit", + "gst_override": "GST Override Account #", + "la1": "LA1", + "la2": "LA2", + "la3": "LA3", + "la4": "LA4", + "laa": "Aluminum", + "lab": "Body", + "lad": "Diagnostic", + "lae": "Electrical", + "laf": "Frame", + "lag": "Glass", + "lam": "Mechanical", + "lar": "Refinish", + "las": "Structural", + "lau": "Detail", + "local_tax": "Local Tax", + "mapa": "Paint Materials", + "mash": "Shop Materials", + "paa": "Aftermarket", + "pac": "Chrome", + "pag": "Glass", + "pal": "LKQ", + "pam": "Remanufactured", + "pan": "OEM", + "pao": "Other", + "pap": "OEM Partial", + "par": "Recored", + "pas": "Sublet", + "pasl": "Sublet (L)", + "refund": "Refund", + "sales_tax_codes": { + "code": "Code", + "description": "Description", + "federal": "Federal Tax Applies", + "local": "Local Tax Applies", + "state": "Provincial/State Tax Applies" + }, + "state_tax": "Provincial/State Tax", + "tow": "Towing" + }, + "schedule_end_time": "Schedule Ending Time", + "schedule_start_time": "Schedule Starting Time", + "shopname": "Shop Name", + "speedprint": { + "id": "Id", + "label": "Label", + "templates": "Templates" + }, + "ss_configuration": { + "dailyhrslimit": "Daily Incoming Hours Limit" + }, + "ssbuckets": { + "gte": "Greater Than/Equal to (hrs)", + "id": "ID", + "label": "Label", + "lt": "Less than (hrs)", + "target": "Target (count)", + "color": "Job Color" + }, + "state": "Province/State", + "state_tax_id": "Provincial/State Tax ID (PST, QST)", + "status": "Status Label", + "statuses": { + "active_statuses": "Active Statuses (Filtering for Active Jobs throughout system)", + "additional_board_statuses": "Additional Status to Display on Production Board", + "color": "Color", + "default_arrived": "Default Arrived Status (Transition to Production)", + "default_bo": "Default Backordered Status", + "default_canceled": "Default Canceled Status", + "default_completed": "Default Completed Status", + "default_delivered": "Default Delivered Status (Transition to Post-Production)", + "default_exported": "Default Exported Status", + "default_imported": "Default Imported Status", + "default_invoiced": "Default Invoiced Status", + "default_ordered": "Default Ordered Status", + "default_quote": "Default Quote Status", + "default_received": "Default Received Status", + "default_returned": "Default Returned", + "default_scheduled": "Default Scheduled Status", + "default_void": "Default Void", + "open_statuses": "Open Statuses", + "post_production_statuses": "Post-Production Statuses", + "pre_production_statuses": "Pre-Production Statuses", + "production_colors": "Production Status Colors", + "production_statuses": "Production Statuses", + "ready_statuses": "Ready Statuses" + }, + "target_touchtime": "Target Touch Time", + "timezone": "Timezone", + "tt_allow_post_to_invoiced": "Allow Time Tickets to be posted to Invoiced & Exported Jobs", + "tt_enforce_hours_for_tech_console": "Restrict Claimable hours from Tech Console", + "use_fippa": "Use FIPPA for Names on Generated Documents?", + "use_paint_scale_data": "Use Paint Scale Data for Job Costing?", + "uselocalmediaserver": "Use Local Media Server?", + "website": "Website", + "zip_post": "Zip/Postal Code" + }, + "labels": { + "2tiername": "Name => RO", + "2tiersetup": "2 Tier Setup", + "2tiersource": "Source => RO", + "accountingsetup": "Accounting Setup", + "accountingtiers": "Number of Tiers to Use for Export", + "alljobstatuses": "All Job Statuses", + "allopenjobstatuses": "All Open Job Statuses", + "apptcolors": "Appointment Colors", + "businessinformation": "Business Information", + "checklists": "Checklists", + "csiq": "CSI Questions", + "customtemplates": "Custom Templates", + "defaultcostsmapping": "Default Costs Mapping", + "defaultprofitsmapping": "Default Profits Mapping", + "deliverchecklist": "Delivery Checklist", + "dms": { + "cdk": { + "controllist": "Control Number List", + "payers": "CDK Payers" + }, + "cdk_dealerid": "CDK Dealer ID", + "pbs_serialnumber": "PBS Serial Number", + "title": "DMS" + }, + "emaillater": "Email Later", + "employees": "Employees", + "estimators": "Estimators", + "filehandlers": "File Handlers", + "insurancecos": "Insurance Companies", + "intakechecklist": "Intake Checklist", + "jobstatuses": "Job Statuses", + "laborrates": "Labor Rates", + "licensing": "Licensing", + "md_to_emails": "Preset To Emails", + "md_to_emails_emails": "Emails", + "messagingpresets": "Messaging Presets", + "notemplatesavailable": "No templates available to add.", + "notespresets": "Notes Presets", + "orderstatuses": "Order Statuses", + "partslocations": "Parts Locations", + "partsscan": "Critical Parts Scanning", + "printlater": "Print Later", + "qbo": "Use QuickBooks Online?", + "qbo_departmentid": "QBO Department ID", + "qbo_usa": "QBO USA Compatibility", + "rbac": "Role Based Access Control", + "responsibilitycenters": { + "costs": "Cost Centers", + "profits": "Profit Centers", + "sales_tax_codes": "Sales Tax Codes", + "tax_accounts": "Tax Accounts", + "title": "Responsibility Centers" + }, + "scheduling": "SMART Scheduling", + "scoreboardsetup": "Scoreboard Setup", + "shopinfo": "Shop Information", + "speedprint": "Speed Print Configuration", + "ssbuckets": "Job Size Definitions", + "systemsettings": "System Settings", + "workingdays": "Working Days" + }, + "successes": { + "save": "Shop configuration saved successfully. " + }, + "validation": { + "centermustexist": "The chosen responsibility center does not exist.", + "larsplit": "Refinish hour split must add up to 1.", + "useremailmustexist": "This email is not a valid user." + } + }, + "checklist": { + "actions": { + "printall": "Print All Documents" + }, + "errors": { + "complete": "Error during job checklist completion. {{error}}", + "nochecklist": "No checklist has been configured for your shop. " + }, + "labels": { + "addtoproduction": "Add Job to Production?", + "allow_text_message": "Permission to Text?", + "checklist": "Checklist", + "printpack": "Job Intake Print Pack", + "removefromproduction": "Remove job from production?" + }, + "successes": { + "completed": "Job checklist completed." + } + }, + "contracts": { + "actions": { + "changerate": "Change Contract Rates", + "convertoro": "Convert to RO", + "decodelicense": "Decode License", + "find": "Find Contract", + "printcontract": "Print Contract", + "senddltoform": "Insert Driver's License Information" + }, + "errors": { + "fetchingjobinfo": "Error fetching job info. {{error}}.", + "returning": "Error returning courtesy car. {{error}}", + "saving": "Error saving contract. {{error}}", + "selectjobandcar": "Please ensure both a car and job are selected." + }, + "fields": { + "actax": "A/C Tax", + "actualreturn": "Actual Return Date", + "agreementnumber": "Agreement Number", + "cc_cardholder": "Cardholder Name", + "cc_expiry": "Credit Card Expiry Date", + "cc_num": "Credit Card Number", + "cleanupcharge": "Clean Up Charge", + "coverage": "Coverage", + "dailyfreekm": "Daily Free Mileage", + "dailyrate": "Daily Rate", + "damage": "Existing Damage", + "damagewaiver": "Damage Waiver", + "driver": "Driver", + "driver_addr1": "Driver Address 1", + "driver_addr2": "Driver Address 2", + "driver_city": "Driver City", + "driver_dlexpiry": "Driver's License Expiration Date", + "driver_dlnumber": "Driver's License Number", + "driver_dlst": "Driver's License Province/State", + "driver_dob": "Driver's DOB", + "driver_fn": "Driver's First Name", + "driver_ln": "Driver's Last Name", + "driver_ph1": "Driver's Phone", + "driver_state": "Driver's Province/State ", + "driver_zip": "Driver's Postal/ZIP Code", + "excesskmrate": "Excess Mileage", + "federaltax": "Federal Taxes", + "fuelin": "Fuel In", + "fuelout": "Fuel Out", + "kmend": "Mileage End", + "kmstart": "Mileage Start", + "length": "Length", + "localtax": "Local Taxes", + "refuelcharge": "Refuel Charge (per liter/gallon)", + "scheduledreturn": "Scheduled Return", + "start": "Contract Start", + "statetax": "Provincial/State Taxes", + "status": "Status" + }, + "labels": { + "agreement": "Agreement {{agreement_num}} - {{status}}", + "availablecars": "Available Cars", + "cardueforservice": "The courtesy car is due for servicing.", + "convertform": { + "applycleanupcharge": "Apply cleanup charge?", + "refuelqty": "Refuel qty.?" + }, + "correctdataonform": "Please review the information above. If any of it is not correct, you can fix it later.", + "dateinpast": "Date is in the past.", + "dlexpirebeforereturn": "The driver's license expires before the car is expected to return. ", + "driverinformation": "Driver's Information", + "findcontract": "Find Contract", + "findermodal": "Contract Finder", + "noteconvertedfrom": "R.O. created from converted Courtesy Car Contract {{agreementnumber}}.", + "populatefromjob": "Populate from Job", + "rates": "Contract Rates", + "time": "Time", + "vehicle": "Vehicle", + "waitingforscan": "Please scan driver's license barcode..." + }, + "status": { + "new": "New Contract", + "out": "Out", + "returned": "Returned" + }, + "successes": { + "saved": "Contract saved successfully. " + } + }, + "courtesycars": { + "actions": { + "new": "New Courtesy Car", + "return": "Return Car" + }, + "errors": { + "saving": "Error saving courtesy card. {{error}}" + }, + "fields": { + "color": "Color", + "dailycost": "Daily Cost to Rent", + "damage": "Damage", + "fleetnumber": "Fleet Number", + "fuel": "Fuel Level", + "insuranceexpires": "Insurance Expires On", + "leaseenddate": "Lease Ends On", + "make": "Make", + "mileage": "Mileage", + "model": "Model", + "nextservicedate": "Next Service Date", + "nextservicekm": "Next Service KMs", + "notes": "Notes", + "plate": "Plate Number", + "purchasedate": "Purchase Date", + "registrationexpires": "Registration Expires On", + "serviceenddate": "Usage End Date", + "servicestartdate": "Usage Start Date", + "status": "Status", + "vin": "VIN", + "year": "Year" + }, + "labels": { + "courtesycar": "Courtesy Car", + "fuel": { + "12": "1/2", + "14": "1/4", + "18": "1/8", + "34": "3/4", + "38": "3/8", + "58": "5/8", + "78": "7/8", + "empty": "Empty", + "full": "Full" + }, + "outwith": "Out With", + "return": "Return Courtesy Car", + "status": "Status", + "uniquefleet": "Enter a unique fleet number.", + "usage": "Usage", + "vehicle": "Vehicle Description" + }, + "status": { + "in": "Available", + "inservice": "In Service", + "leasereturn": "Lease Returned", + "out": "Rented", + "sold": "Sold" + }, + "successes": { + "saved": "Courtesy Car saved successfully." + } + }, + "csi": { + "actions": { + "activate": "Activate" + }, + "errors": { + "creating": "Error creating survey {{message}}", + "notconfigured": "You do not have any current CSI Question Sets configured.", + "notfoundsubtitle": "We were unable to find a survey using the link you provided. Please ensure the URL is correct or reach out to your shop for more help.", + "notfoundtitle": "No survey found." + }, + "fields": { + "completedon": "Completed On", + "created_at": "Created At" + }, + "labels": { + "nologgedinuser": "Please log out of ImEX Online", + "nologgedinuser_sub": "Users of ImEX Online cannot complete CSI surveys while logged in. Please log out and try again.", + "noneselected": "No response selected.", + "title": "Customer Satisfaction Survey" + }, + "successes": { + "created": "CSI created successfully. ", + "submitted": "Your responses have been submitted successfully.", + "submittedsub": "Your input is highly appreciated." + } + }, + "dashboard": { + "actions": { + "addcomponent": "Add Component" + }, + "errors": { + "refreshrequired": "You must refresh the dashboard data to see this component.", + "updatinglayout": "Error saving updated layout {{message}}" + }, + "labels": { + "bodyhrs": "Body Hrs", + "dollarsinproduction": "Dollars in Production", + "prodhrs": "Production Hrs", + "refhrs": "Refinish Hrs" + }, + "titles": { + "monthlyemployeeefficiency": "Monthly Employee Efficiency", + "monthlyjobcosting": "Monthly Job Costing ", + "monthlylaborsales": "Monthly Labor Sales", + "monthlypartssales": "Monthly Parts Sales", + "monthlyrevenuegraph": "Monthly Revenue Graph", + "prodhrssummary": "Production Hours Summary", + "productiondollars": "Total dollars in Production", + "productionhours": "Total hours in Production", + "projectedmonthlysales": "Projected Monthly Sales" + } + }, + "dms": { + "errors": { + "alreadyexported": "This job has already been sent to the DMS. If you need to resend it, please use admin permissions to mark the job for re-export." + }, + "labels": { + "refreshallocations": "Refresh to see DMS Allocataions." + } + }, + "documents": { + "actions": { + "delete": "Delete Selected Documents", + "download": "Download Selected Images", + "reassign": "Reassign to another Job", + "selectallimages": "Select All Images", + "selectallotherdocuments": "Select All Other Documents" + }, + "errors": { + "deletes3": "Error deleting document from storage. ", + "deleting": "Error deleting documents {{error}}", + "deleting_cloudinary": "Error deleting document from storage. {{message}}", + "getpresignurl": "Error obtaining presigned URL for document. {{message}}", + "insert": "Unable to upload file. {{message}}", + "nodocuments": "There are no documents.", + "updating": "Error updating document. {{error}}" + }, + "labels": { + "confirmdelete": "Are you sure you want to delete these documents. This CANNOT be undone.", + "doctype": "Document Type", + "newjobid": "Assign to Job", + "openinexplorer": "Open in Explorer", + "optimizedimage": "The below image is optimized. Click on the picture below to open in a new window and view it full size, or open it in explorer.", + "reassign_limitexceeded": "Reassigning all selected documents will exceed the job storage limit for your shop. ", + "reassign_limitexceeded_title": "Unable to reassign document(s)", + "storageexceeded": "You've exceeded your storage limit for this job. Please remove documents, or increase your storage plan.", + "storageexceeded_title": "Storage Limit Exceeded", + "upload": "Upload", + "upload_limitexceeded": "Uploading all selected documents will exceed the job storage limit for your shop. ", + "upload_limitexceeded_title": "Unable to upload document(s)", + "uploading": "Uploading...", + "usage": "of job storage used. ({{used}} / {{total}})" + }, + "successes": { + "delete": "Document(s) deleted successfully.", + "edituploaded": "Edited document uploaded successfully. Please close this window and refresh the documents list.", + "insert": "Uploaded document successfully. ", + "updated": "Document updated successfully. " + } + }, + "emails": { + "errors": { + "notsent": "Email not sent. Error encountered while sending {{message}}" + }, + "fields": { + "cc": "CC", + "from": "From", + "subject": "Subject", + "to": "To" + }, + "labels": { + "attachments": "Attachments", + "documents": "Documents", + "emailpreview": "Email Preview", + "generatingemail": "Generating email...", + "pdfcopywillbeattached": "A PDF copy of this email will be attached when it is sent.", + "preview": "Email Preview" + }, + "successes": { + "sent": "Email sent successfully." + } + }, + "employees": { + "actions": { + "addvacation": "Add Vacation", + "new": "New Employee", + "newrate": "New Rate" + }, + "errors": { + "delete": "Error encountered while deleting employee. {{message}}", + "save": "Error encountered saving employee. {{message}}", + "validation": "Please check all fields.", + "validationtitle": "Unable to save employee." + }, + "fields": { + "active": "Active?", + "base_rate": "Base Rate", + "cost_center": "Cost Center", + "employee_number": "Employee Number", + "external_id": "External Employee ID", + "first_name": "First Name", + "flat_rate": "Flat Rate (Disabled is Straight Time)", + "hire_date": "Hire Date", + "last_name": "Last Name", + "pin": "Tech Console PIN", + "rate": "Rate", + "termination_date": "Termination Date", + "user_email": "User Email", + "vacation": { + "end": "Vacation End", + "length": "Vacation Length", + "start": "Vacation Start" + } + }, + "labels": { + "actions": "Actions", + "endmustbeafterstart": "End date must be after start date.", + "flat_rate": "Flat Rate", + "name": "Name", + "rate_type": "Rate Type", + "straight_time": "Straight Time" + }, + "successes": { + "delete": "Employee deleted successfully.", + "save": "Employee saved successfully.", + "vacationadded": "Employee vacation added." + }, + "validation": { + "unique_employee_number": "You must enter a unique employee number." + } + }, + "exportlogs": { + "fields": { + "createdat": "Created At" + }, + "labels": { + "attempts": "Export Attempts", + "priorsuccesfulexport": "This record has previously been exported successfully. Please make sure it has already been deleted in the target system." + } + }, + "general": { + "actions": { + "add": "Add", + "calculate": "Calculate", + "cancel": "Cancel", + "clear": "Clear", + "close": "Close", + "copylink": "Copy Link", + "create": "Create", + "delete": "Delete", + "deleteall": "Delete All", + "deselectall": "Deselect All", + "edit": "Edit", + "login": "Login", + "print": "Print", + "refresh": "Refresh", + "remove": "Remove", + "reset": "Reset your changes.", + "resetpassword": "Reset Password", + "save": "Save", + "saveandnew": "Save and New", + "selectall": "Select All", + "send": "Send", + "senderrortosupport": "Send Error to Support", + "submit": "Submit", + "tryagain": "Try Again", + "view": "View", + "viewreleasenotes": "See What's Changed" + }, + "errors": { + "fcm": "You must allow notification permissions to have real time messaging. Click to try again.", + "notfound": "No record was found.", + "sizelimit": "The selected items exceed the size limit." + }, + "itemtypes": { + "contract": "CC Contract", + "courtesycar": "Courtesy Car", + "job": "Job", + "owner": "Owner", + "vehicle": "Vehicle" + }, + "labels": { + "actions": "Actions", + "areyousure": "Are you sure?", + "barcode": "Barcode", + "cancel": "Are you sure you want to cancel? Your changes will not be saved.", + "clear": "Clear", + "confirmpassword": "Confirm Password", + "created_at": "Created At", + "email": "Email", + "errors": "Errors", + "excel": "Excel", + "exceptiontitle": "An error has occurred.", + "friday": "Friday", + "globalsearch": "Global Search", + "help": "Help", + "hours": "hrs", + "in": "In", + "instanceconflictext": "Your $t(titles.app) account can only be used on one device at any given time. Refresh your session to take control.", + "instanceconflictitle": "Your account is being used elsewhere.", + "item": "Item", + "label": "Label", + "loading": "Loading...", + "loadingapp": "Loading $t(titles.app)", + "loadingshop": "Loading shop data...", + "loggingin": "Authorizing...", + "markedexported": "Manually marked as exported.", + "message": "Message", + "monday": "Monday", + "na": "N/A", + "newpassword": "New Password", + "no": "No", + "nointernet": "It looks like you're not connected to the internet.", + "nointernet_sub": "Please check your connection and try again. ", + "none": "None", + "out": "Out", + "password": "Password", + "passwordresetsuccess": "A password reset link has been sent to you.", + "passwordresetsuccess_sub": "You should receive this email in the next few minutes. Please check your email including any junk or spam folders. ", + "passwordresetvalidatesuccess": "Password successfully reset. ", + "passwordresetvalidatesuccess_sub": "You may now sign in again using your new password. ", + "passwordsdonotmatch": "The passwords you have entered do not match.", + "print": "Print", + "refresh": "Refresh", + "required": "Required", + "saturday": "Saturday", + "search": "Search...", + "searchresults": "Results for {{search}}", + "selectdate": "Select date...", + "sendagain": "Send Again", + "sendby": "Send By", + "signin": "Sign In", + "sms": "SMS", + "status": "Status", + "sub_status": { + "expired": "The subscription for this shop has expired. Please contact technical support to reactivate the subscription. " + }, + "successful": "Successful", + "sunday": "Sunday", + "text": "Text", + "thursday": "Thursday", + "total": "Total", + "totals": "Totals", + "tuesday": "Tuesday", + "unknown": "Unknown", + "username": "Username", + "view": "View", + "wednesday": "Wednesday", + "yes": "Yes" + }, + "languages": { + "english": "English", + "french": "French", + "spanish": "Spanish" + }, + "messages": { + "exception": "$t(titles.app) has encountered an error. Please try again. If the problem persists, please submit a support ticket or contact us.", + "newversionmessage": "Click refresh below to update to the latest available version of ImEX Online. Please make sure all other tabs and windows are closed.", + "newversiontitle": "New version of ImEX Online Available", + "noacctfilepath": "There is no accounting file path set. You will not be able to export any items.", + "nofeatureaccess": "You do not have access to this feature of ImEX Online. Please contact support to request a license for this feature.", + "noshop": "You do not have access to any shops. Please reach out to your shop manager or technical support. ", + "notfoundsub": "Please make sure that you have access to the data or that the link is correct.", + "notfoundtitle": "We couldn't find what you're looking for...", + "partnernotrunning": "ImEX Online has detected that the partner is not running. Please ensure it is running to enable full functionality.", + "rbacunauth": "You are not authorized to view this content. Please reach out to your shop manager to change your access level.", + "unsavedchanges": "You have unsaved changes.", + "unsavedchangespopup": "You have unsaved changes. Are you sure you want to leave?" + }, + "validation": { + "invalidemail": "Please enter a valid email.", + "invalidphone": "Please enter a valid phone number.", + "required": "{{label}} is required. " + } + }, + "help": { + "actions": { + "connect": "Connect" + }, + "labels": { + "codeplacholder": "6 digit PIN code", + "rescuedesc": "Enter the 6 digit code provided by ImEX Online Support below and click connect.", + "rescuetitle": "Rescue Me!" + } + }, + "intake": { + "labels": { + "printpack": "Intake Print Pack" + } + }, + "inventory": { + "actions": { + "addtoinventory": "Add to Inventory", + "addtoro": "Add to RO", + "consumefrominventory": "Consume from Inventory?", + "edit": "Edit Inventory LIne", + "new": "New Inventory Line" + }, + "errors": { + "inserting": "Error inserting inventory item. {{error}}" + }, + "fields": { + "comment": "Comment", + "manualinvoicenumber": "Invoice Number", + "manualvendor": "Vendor" + }, + "labels": { + "consumedbyjob": "Consumed by Job", + "deleteconfirm": "Are you sure you want to delete this from inventory? The associated bill will not be modified or deleted. ", + "frombillinvoicenumber": "Original Bill Invoice Number", + "fromvendor": "Original Bill Vendor", + "inventory": "Inventory", + "showall": "Show All Inventory", + "showavailable": "Show Only Available Inventory" + }, + "successes": { + "deleted": "Inventory lined deleted.", + "inserted": "Added line to inventory.", + "updated": "Inventory line updated." + } + }, + "joblines": { + "actions": { + "converttolabor": "Convert amount to Labor.", + "new": "New Line" + }, + "errors": { + "creating": "Error encountered while creating job line. {{message}}", + "updating": "Error encountered updating job line. {{message}}" + }, + "fields": { + "act_price": "Retail Price", + "ah_detail_line": "Mark as Detail Labor Line (Autohouse Only)", + "db_price": "List Price", + "lbr_types": { + "LA1": "LA1", + "LA2": "LA2", + "LA3": "LA3", + "LA4": "LA4", + "LAA": "Aluminum", + "LAB": "Body", + "LAD": "Diagnostic", + "LAE": "Electrical", + "LAF": "Frame", + "LAG": "Glass", + "LAM": "Mechanical", + "LAR": "Refinish", + "LAS": "Structural", + "LAU": "User Defined" + }, + "line_desc": "Line Desc.", + "line_ind": "S#", + "line_no": "Line #", + "location": "Location", + "mod_lb_hrs": "Hrs", + "mod_lbr_ty": "Labor Type", + "notes": "Notes", + "oem_partno": "OEM Part #", + "op_code_desc": "Op Code Description", + "part_qty": "Qty.", + "part_type": "Part Type", + "part_types": { + "CCC": "CC Cleaning", + "CCD": "CC Damage Waiver", + "CCDR": "CC Daily Rate", + "CCF": "CC Refuel", + "CCM": "CC Mileage", + "PAA": "Aftermarket", + "PAC": "Rechromed", + "PAE": "Existing", + "PAG": "Glass", + "PAL": "LKQ", + "PAM": "Remanufactured", + "PAN": "New/OEM", + "PAO": "Other", + "PAP": "OEM Partial", + "PAR": "Recored", + "PAS": "Sublet", + "PASL": "Sublet (L)" + }, + "profitcenter_labor": "Profit Center: Labor", + "profitcenter_part": "Profit Center: Part", + "prt_dsmk_m": "Line Discount/Markup $", + "prt_dsmk_p": "Line Discount/Markup %", + "status": "Status", + "tax_part": "Tax Part", + "total": "Total", + "unq_seq": "Seq #" + }, + "labels": { + "adjustmenttobeadded": "Adjustment to be added: {{adjustment}}", + "billref": "Latest Bill", + "convertedtolabor": "This line has been converted to labor. Ensure you adjust the profit center for the amount accordingly.", + "edit": "Edit Line", + "ioucreated": "IOU", + "new": "New Line", + "nostatus": "No Status", + "presets": "Jobline Presets" + }, + "successes": { + "created": "Job line created successfully.", + "saved": "Job line saved.", + "updated": "Job line updated successfully." + }, + "validations": { + "ahdetailonlyonuserdefinedtypes": "Detail line indicator can only be set for LA1, LA2, LA3, LA4, and LAU labor types.", + "hrsrequirediflbrtyp": "Labor hours are required if a labor type is selected. Clear the labor type if there are no labor hours.", + "requiredifparttype": "Required if a part type has been specified.", + "zeropriceexistingpart": "This line cannot have any price since it uses an existing part." + } + }, + "jobs": { + "actions": { + "addDocuments": "Add Job Documents", + "addNote": "Add Note", + "addtopartsqueue": "Add to Parts Queue", + "addtoproduction": "Add to Production", + "addtoscoreboard": "Add to Scoreboard", + "allocate": "Allocate", + "autoallocate": "Auto Allocate", + "changefilehandler": "Change File Handler", + "changelaborrate": "Change Labor Rate", + "changestatus": "Change Status", + "changestimator": "Change Estimator", + "convert": "Convert", + "createiou": "Create IOU", + "deliver": "Deliver", + "dms": { + "addpayer": "Add Payer", + "createnewcustomer": "Create New Customer", + "findmakemodelcode": "Find Make/Model Code", + "getmakes": "", + "labels": { + "refreshallocations": "Refresh this component to see the DMS allocations." + }, + "post": "Post", + "refetchmakesmodels": "Refetch Make and Model Codes", + "usegeneric": "Use Generic Customer", + "useselected": "Use Selected Customer" + }, + "dmsautoallocate": "DMS Auto Allocate", + "export": "Export", + "exportcustdata": "Export Customer Data", + "exportselected": "Export Selected", + "filterpartsonly": "Filter Parts Only", + "generatecsi": "Generate CSI & Copy Link", + "gotojob": "Go to Job", + "intake": "Intake", + "manualnew": "Create New Job Manually", + "mark": "Mark", + "markasexported": "Mark as Exported", + "markpstexempt": "Mark Job PST Exempt", + "markpstexemptconfirm": "Are you sure you want to do this? To undo this, you must manually update all PST rates.", + "postbills": "Post Bills", + "printCenter": "Print Center", + "recalculate": "Recalculate", + "reconcile": "Reconcile", + "removefromproduction": "Remove from Production", + "schedule": "Schedule", + "sendcsi": "Send CSI", + "sendpartspricechange": "", + "sendtodms": "Send to DMS", + "sync": "Sync", + "uninvoice": "Uninvoice", + "unvoid": "Unvoid Job", + "viewchecklist": "View Checklists", + "viewdetail": "View Details" + }, + "errors": { + "addingtoproduction": "Error adding to production. {{error}}", + "cannotintake": "Intake cannot be completed for this job. It has either already been completed or the job is already here.", + "closing": "Error closing job. {{error}}", + "creating": "Error encountered while creating job. {{error}}", + "deleted": "Error deleting job. {{error}}", + "exporting": "Error exporting job. {{error}}", + "exporting-partner": "Unable to connect to ImEX Partner. Please ensure it is running and logged in.", + "invoicing": "Error invoicing job. {{error}}", + "noaccess": "This job does not exist or you do not have access to it.", + "nodamage": "No damage points on estimate.", + "nodates": "No dates specified for this job.", + "nofinancial": "No financial data has been calculated yet for this job. Please save it again.", + "nojobselected": "No job is selected.", + "noowner": "No owner associated.", + "novehicle": "No vehicle associated.", + "partspricechange": "", + "saving": "Error encountered while saving record.", + "scanimport": "Error importing job. {{message}}", + "totalscalc": "Error while calculating new job totals.", + "updating": "Error while updating job(s). {{error}}", + "validation": "Please ensure all fields are entered correctly.", + "validationtitle": "Validation Error", + "voiding": "Error voiding job. {{error}}" + }, + "fields": { + "actual_completion": "Actual Completion", + "actual_delivery": "Actual Delivery", + "actual_in": "Actual In", + "adjustment_bottom_line": "Adjustments", + "adjustmenthours": "Adjustment Hours", + "alt_transport": "Alt. Trans.", + "area_of_damage_impact": { + "10": "Left Front Side", + "11": "Left Front Corner", + "12": "Front", + "13": "Rollover", + "14": "Unknown", + "15": "Total Loss", + "16": "Non-collision", + "25": "Hood", + "26": "Deck-lid", + "27": "Roof", + "28": "Undercarriage", + "34": "All Over", + "01": "Right Front Corner", + "02": "Right Front Side", + "03": "Right Side", + "04": "Right Rear Side", + "05": "Right Rear Corner", + "06": "Rear", + "07": "Left Rear Corner", + "08": "Left Rear Side", + "09": "Left Side" + }, + "auto_add_ats": "Automatically Add/Update ATS", + "ca_bc_pvrt": "PVRT", + "ca_customer_gst": "Customer Portion of GST", + "ca_gst_registrant": "GST Registrant", + "category": "Category", + "ccc": "CC Cleaning", + "ccd": "CC Damage Waiver", + "ccdr": "CC Daily Rate", + "ccf": "CC Refuel", + "ccm": "CC Mileage", + "cieca_id": "CIECA ID", + "claim_total": "Claim Total", + "class": "Class", + "clm_no": "Claim #", + "clm_total": "Claim Total", + "comment": "Comment", + "customerowing": "Customer Owing", + "date_estimated": "Date Estimated", + "date_exported": "Exported", + "date_invoiced": "Invoiced", + "date_last_contacted": "Last Contacted Date", + "date_next_contact": "Next Contact Date", + "date_open": "Open", + "date_rentalresp": "Shop Rental Responsibility Start", + "date_repairstarted": "Repairs Started", + "date_scheduled": "Scheduled", + "date_towin": "Towed In", + "ded_amt": "Deductible", + "ded_note": "Deductible Note", + "ded_status": "Deductible Status", + "depreciation_taxes": "Depreciation/Taxes", + "dms": { + "address": "Customer Address", + "amount": "Amount", + "center": "Center", + "control_type": { + "account_number": "Account Number" + }, + "cost": "Cost", + "cost_dms_acctnumber": "Cost DMS Acct #", + "dms_make": "DMS Make", + "dms_model": "DMS Model", + "dms_wip_acctnumber": "Cost WIP DMS Acct #", + "id": "DMS ID", + "inservicedate": "In Service Date", + "journal": "Journal #", + "lines": "Posting Lines", + "name1": "Customer Name", + "payer": { + "amount": "Amount", + "control_type": "Control Type", + "controlnumber": "Control Number", + "dms_acctnumber": "DMS Account #", + "name": "Payer Name" + }, + "sale": "Sale", + "sale_dms_acctnumber": "Sale DMS Acct #", + "story": "Story", + "vinowner": "VIN Owner" + }, + "dms_allocation": "DMS Allocation", + "driveable": "Driveable", + "employee_body": "Body", + "employee_csr": "Customer Service Rep.", + "employee_prep": "Prep", + "employee_refinish": "Refinish", + "est_addr1": "Estimator Address", + "est_co_nm": "Estimator Company", + "est_ct_fn": "Estimator First Name", + "est_ct_ln": "Estimator Last Name", + "est_ea": "Estimator Email", + "est_ph1": "Estimator Phone #", + "federal_tax_payable": "Federal Tax Payable", + "federal_tax_rate": "Federal Tax Rate", + "ins_addr1": "Insurance Co. Address", + "ins_city": "Insurance City", + "ins_co_id": "Insurance Co. ID", + "ins_co_nm": "Insurance Company Name", + "ins_co_nm_short": "Ins. Co.", + "ins_ct_fn": "File Handler First Name", + "ins_ct_ln": "File Handler Last Name", + "ins_ea": "File Handler Email", + "ins_ph1": "File Handler Phone #", + "intake": { + "label": "Label", + "max": "Maximum", + "min": "Minimum", + "name": "Name", + "required": "Required?", + "type": "Type" + }, + "invoice_final_note": "Note to Display on Final Invoice", + "kmin": "Mileage In", + "kmout": "Mileage Out", + "la1": "LA1", + "la2": "LA2", + "la3": "LA3", + "la4": "LA4", + "laa": "Aluminum ", + "lab": "Body", + "labor_rate_desc": "Labor Rate Name", + "lad": "Diagnostic", + "lae": "Electrical", + "laf": "Frame", + "lag": "Glass", + "lam": "Mechanical", + "lar": "Refinish", + "las": "Structural", + "lau": "User Defined", + "local_tax_rate": "Local Tax Rate", + "loss_date": "Loss Date", + "loss_desc": "Loss Description", + "loss_of_use": "Loss of Use", + "lost_sale_reason": "Lost Sale Reason", + "ma2s": "2 Stage Paint", + "ma3s": "3 Stage Pain", + "mabl": "MABL?", + "macs": "MACS?", + "mahw": "Hazardous Waste", + "mapa": "Paint Materials", + "mash": "Shop Materials", + "matd": "Tire Disposal", + "other_amount_payable": "Other Amount Payable", + "owner": "Owner", + "owner_owing": "Cust. Owes", + "ownr_ea": "Email", + "ownr_ph1": "Phone 1", + "ownr_ph2": "Phone 2", + "paa": "Aftermarket", + "pac": "Rechromed", + "pae": "Existing", + "pag": "Glass", + "pal": "LKQ", + "pam": "Remanufactured", + "pan": "OEM/New", + "pao": "Other", + "pap": "OEM Partial", + "par": "Re-cored", + "parts_tax_rates": { + "prt_discp": "Discount %", + "prt_mktyp": "Markup Type", + "prt_mkupp": "Markup %", + "prt_tax_in": "Tax Indicator", + "prt_tax_rt": "Part Tax Rate", + "prt_type": "Part Type" + }, + "partsstatus": "Parts Status", + "pas": "Sublet", + "pay_date": "Pay Date", + "phoneshort": "PH", + "po_number": "PO Number", + "policy_no": "Policy #", + "ponumber": "PO Number", + "production_vars": { + "note": "Production Note" + }, + "qb_multiple_payers": { + "amount": "Amount", + "name": "Name" + }, + "queued_for_parts": "Queued for Parts", + "rate_ats": "ATS Rate", + "rate_la1": "LA1", + "rate_la2": "LA2", + "rate_la3": "LA3", + "rate_la4": "LA4", + "rate_laa": "Aluminum", + "rate_lab": "Body", + "rate_lad": "Diagnostic", + "rate_lae": "Electrical", + "rate_laf": "Frame", + "rate_lag": "Glass", + "rate_lam": "Mechanical", + "rate_lar": "Refinish", + "rate_las": "Structural", + "rate_lau": "User Defined", + "rate_ma2s": "2 Stage Paint", + "rate_ma3s": "3 Stage Paint", + "rate_mabl": "MABL??", + "rate_macs": "MACS??", + "rate_mahw": "Hazardous Waste", + "rate_mapa": "Paint Materials", + "rate_mash": "Shop Material", + "rate_matd": "Tire Disposal", + "referral_source_extra": "Other Referral Source", + "referral_source_other": "", + "referralsource": "Referral Source", + "regie_number": "Registration #", + "repairtotal": "Repair Total", + "ro_number": "RO #", + "scheduled_completion": "Scheduled Completion", + "scheduled_delivery": "Scheduled Delivery", + "scheduled_in": "Scheduled In", + "selling_dealer": "Selling Dealer", + "selling_dealer_contact": "Selling Dealer Contact", + "servicecar": "Service Car", + "servicing_dealer": "Servicing Dealer", + "servicing_dealer_contact": "Servicing Dealer Contact", + "special_coverage_policy": "Special Coverage Policy", + "specialcoveragepolicy": "Special Coverage Policy", + "state_tax_rate": "Provincial/State Tax Rate", + "status": "Job Status", + "storage_payable": "Storage", + "tax_lbr_rt": "Labor Tax Rate", + "tax_levies_rt": "Levies Tax Rate", + "tax_paint_mat_rt": "Paint Material Tax Rate", + "tax_registration_number": "Tax Registration Number", + "tax_shop_mat_rt": "Shop Material Tax Rate", + "tax_str_rt": "Storage Tax Rate", + "tax_sub_rt": "Sublet Tax Rate", + "tax_tow_rt": "Towing Tax Rate", + "towin": "Tow In", + "towing_payable": "Towing Payable", + "unitnumber": "Unit #", + "updated_at": "Updated At", + "uploaded_by": "Uploaded By", + "vehicle": "Vehicle" + }, + "forms": { + "admindates": "Administrative Dates", + "appraiserinfo": "Estimator Info", + "claiminfo": "Claim Information", + "estdates": "Estimate Dates", + "laborrates": "Labor Rates", + "lossinfo": "Loss Information", + "other": "Other", + "repairdates": "Repair Dates", + "scheddates": "Schedule Dates" + }, + "labels": { + "actual_completion_inferred": "$t(jobs.fields.actual_completion) inferred using $t(jobs.fields.scheduled_completion).", + "actual_delivery_inferred": "$t(jobs.fields.actual_delivery) inferred using $t(jobs.fields.scheduled_delivery).", + "actual_in_inferred": "$t(jobs.fields.actual_in) inferred using $t(jobs.fields.scheduled_in).", + "additionalpayeroverallocation": "You have allocated more than the sale of the Job to additional payers.", + "additionaltotal": "Additional Total", + "adjustmentrate": "Adjustment Rate", + "adjustments": "Adjustments", + "adminwarning": "Use the functionality on this page at your own risk. You are responsible for any and all changes to your data.", + "allocations": "Allocations", + "alreadyaddedtoscoreboard": "Job has already been added to scoreboard. Saving will update the previous entry.", + "alreadyclosed": "This job has already been closed.", + "appointmentconfirmation": "Send confirmation to customer?", + "associationwarning": "Any changes to associations will require updating the data from the new parent record to the job.", + "audit": "Audit Trail", + "available": "Available", + "availablejobs": "Available Jobs", + "ca_bc_pvrt": { + "days": "Days", + "rate": "PVRT Rate" + }, + "ca_gst_all_if_null": "If the job is marked as a \"GST Registrant\" and this value is set to $0, the customer will be responsible for paying all of the GST by default. ", + "calc_repair_days": "Calculated Repair Days", + "calc_repair_days_tt": "This is the approximate number of days required to complete the repair according to the target touch time in your shop configuration (current set to {{target_touchtime}}).", + "cards": { + "customer": "Customer Information", + "damage": "Area of Damage", + "dates": "Dates", + "documents": "Recent Documents", + "estimator": "Estimator", + "filehandler": "File Handler", + "insurance": "Insurance Details", + "notes": "Notes", + "parts": "Parts", + "totals": "Totals", + "vehicle": "Vehicle" + }, + "changeclass": "Changing the job's class can have fundamental impacts to already exported accounting items. Are you sure you want to do this?", + "checklistcompletedby": "Checklist completed by {{by}} at {{at}}", + "checklistdocuments": "Checklist Documents", + "checklists": "Checklists", + "closeconfirm": "Are you sure you want to close this job? This cannot be easily undone.", + "closejob": "Close Job {{ro_number}}", + "contracts": "CC Contracts", + "convertedtolabor": "Lines Converted to Labor", + "cost": "Cost", + "cost_Additional": "Cost - Additional", + "cost_labor": "Cost - Labor", + "cost_parts": "Cost - Parts", + "cost_sublet": "Cost - Sublet", + "costs": "Costs", + "create": { + "jobinfo": "Job Info", + "newowner": "Create a new Owner instead. ", + "newvehicle": "Create a new Vehicle Instead", + "novehicle": "No vehicle (only for ROs to track parts/labor only work).", + "ownerinfo": "Owner Info", + "vehicleinfo": "Vehicle Info" + }, + "createiouwarning": "Are you sure you want to create an IOU for these lines? A new RO will be created based on those lines for this customer.", + "creating_new_job": "Creating new job...", + "deductible": { + "stands": "Stands", + "waived": "Waived" + }, + "deleteconfirm": "Are you sure you want to delete this job? This cannot be undone. ", + "deletedelivery": "Delete Delivery Checklist", + "deleteintake": "Delete Intake Checklist", + "deliverchecklist": "Deliver Checklist", + "difference": "Difference", + "diskscan": "Scan Disk for Estimates", + "dms": { + "apexported": "AP export completed. See logs for details.", + "damageto": "Damage to $t(jobs.fields.area_of_damage_impact.{{area_of_damage}}).", + "defaultstory": "B/S RO: {{ro_number}}. Owner: {{ownr_nm}}. Insurance Co: {{ins_co_nm}}. Claim/PO #: {{clm_po}}", + "disablebillwip": "Cost and WIP for bills has been ignored per shop configuration.", + "invoicedatefuture": "Invoice date must be today or in the future for CDK posting.", + "kmoutnotgreaterthankmin": "Mileage out must be greater than mileage in.", + "logs": "Logs", + "notallocated": "Not Allocated", + "postingform": "Posting Form", + "totalallocated": "Total Amount Allocated" + }, + "documents": "Documents", + "documents-images": "Images", + "documents-other": "Other Documents", + "duplicateconfirm": "Are you sure you want to duplicate this job? Some elements of this job will not be duplicated.", + "emailaudit": "Email Audit Trail", + "employeeassignments": "Employee Assignments", + "estimatelines": "Estimate Lines", + "estimator": "Estimator", + "existing_jobs": "Existing Jobs", + "federal_tax_amt": "Federal Taxes", + "gpdollars": "$ G.P.", + "gppercent": "% G.P.", + "hrs_claimed": "Hours Claimed", + "hrs_total": "Hours Total", + "importnote": "The job was initially imported.", + "inproduction": "In Production", + "intakechecklist": "Intake Checklist", + "iou": "IOU", + "job": "Job Details", + "jobcosting": "Job Costing", + "jobtotals": "Job Totals", + "labor_rates_subtotal": "Labor Rates Subtotal", + "laborallocations": "Labor Allocations", + "labortotals": "Labor Totals", + "lines": "Estimate Lines", + "local_tax_amt": "Local Taxes", + "mapa": "Paint Materials", + "markforreexport": "Mark for Re-export", + "mash": "Shop Materials", + "multipayers": "Additional Payers", + "net_repairs": "Net Repairs", + "notes": "Notes", + "othertotal": "Other Totals", + "override_header": "Override estimate header on import?", + "ownerassociation": "Owner Association", + "parts": "Parts", + "parts_received": "Parts Rec.", + "parts_tax_rates": "Parts Tax rates", + "partsfilter": "Parts Only", + "partssubletstotal": "Parts & Sublets Total", + "partstotal": "Parts Total (ex. Taxes)", + "pimraryamountpayable": "Total Primary Payable", + "plitooltips": { + "billtotal": "The total amount of all bill lines that have been posted against this RO (not including credits, taxes, or labor adjustments).", + "calculatedcreditsnotreceived": "The calculated credits not received is derived by subtracting the amount of credit memos entered from the retail total of returns created. This does not take into account whether the credit was marked as received. You can find more information here.", + "creditmemos": "The total retail amount of all returns created. This amount does not reflect credit memos that have been posted.", + "creditsnotreceived": "This total reflects the total retail of parts returns lines that have not been explicitly marked as returned when posting a credit memo. You can learn more about this here here. ", + "discrep1": "If the discrepancy is not $0, you may have one of the following:

\n\n
    \n
  • Too many bills/bill lines that have been posted against this RO. Check to make sure every bill posted on this RO is correctly posted and assigned.
  • \n
  • You do not have the latest supplement imported, or, a supplement must be submitted and then imported.
  • \n
  • You have posted a bill line to labor.
  • \n
\n
\nThere may be additional issues not listed above that prevent this job from reconciling.", + "discrep2": "If the discrepancy is not $0, you may have one of the following:

\n\n
    \n
  • Used an incorrect rate when deducting from labor.
  • \n
  • An outstanding imbalance higher in the reconciliation process.
  • \n
\n
\nThere may be additional issues not listed above that prevent this job from reconciling.", + "discrep3": "If the discrepancy is not $0, you may have one of the following:

\n\n
    \n
  • A parts order return has not been created.
  • \n
  • An outstanding imbalance higher in the reconciliation process.
  • \n
\n
\nThere may be additional issues not listed above that prevent this job from reconciling.", + "laboradj": "The sum of all bill lines that deducted from labor hours, rather than part prices.", + "partstotal": "This is the total of all parts and sublet amounts on the vehicle (some of these may require an in-house invoice).
\nItems such as shop and paint materials, labor online lines, etc. are not included in this total.", + "totalreturns": "The total retail amount of returns created for this job." + }, + "profileadjustments": "", + "prt_dsmk_total": "Line Item Adjustment", + "rates": "Rates", + "rates_subtotal": "All Rates Subtotal", + "reconciliation": { + "billlinestotal": "Bill Lines Total", + "byassoc": "By Line Association", + "byprice": "By Price", + "clear": "Clear All", + "discrepancy": "Discrepancy", + "joblinestotal": "Job Lines Total", + "multipleactprices": "${{act_price}} is the price for multiple job lines.", + "multiplebilllines": "{{line_desc}} has 2 or more bill lines associated to it.", + "multiplebillsforactprice": "Found more than 1 bill matching ${{act_price}} retail price.", + "removedpartsstrikethrough": "Strike through lines represent parts that have been removed from the estimate. They are included for completeness of reconciliation." + }, + "reconciliationheader": "Parts & Sublet Reconciliation", + "relatedros": "Related ROs", + "returntotals": "Return Totals", + "rosaletotal": "RO Parts Total", + "sale_additional": "Sales - Additional", + "sale_labor": "Sales - Labor", + "sale_parts": "Sales - Parts", + "sale_sublet": "Sales - Sublet", + "sales": "Sales", + "savebeforeconversion": "You have unsaved changes on the job. Please save them before converting it. ", + "scheduledinchange": "The scheduled in is based off the latest appointment. To change this date, please schedule or reschedule the job. ", + "specialcoveragepolicy": "Special Coverage Policy Applies", + "state_tax_amt": "Provincial/State Taxes", + "subletstotal": "Sublets Total", + "subtotal": "Subtotal", + "supplementnote": "The job had a supplement imported.", + "suspended": "SUSPENDED", + "suspense": "Suspense", + "threshhold": "Max Threshold: ${{amount}}", + "total_cost": "Total Cost", + "total_cust_payable": "Total Customer Amount Payable", + "total_repairs": "Total Repairs", + "total_sales": "Total Sales", + "totals": "Totals", + "unvoidnote": "This job was unvoided.", + "vehicle_info": "Vehicle", + "vehicleassociation": "Vehicle Association", + "viewallocations": "View Allocations", + "voidjob": "Are you sure you want to void this job? This cannot be easily undone. ", + "voidnote": "This job was voided." + }, + "successes": { + "addedtoproduction": "Job added to production board.", + "all_deleted": "{{count}} jobs deleted successfully.", + "closed": "Job closed successfully.", + "converted": "Job converted successfully.", + "created": "Job created successfully. Click to view.", + "creatednoclick": "Job created successfully. ", + "delete": "Job deleted successfully.", + "deleted": "Job deleted successfully.", + "duplicated": "Job duplicated successfully. ", + "exported": "Job(s) exported successfully. ", + "invoiced": "Job closed and invoiced successfully.", + "ioucreated": "IOU created successfully. Click to see.", + "partsqueue": "Job added to parts queue.", + "save": "Job saved successfully.", + "savetitle": "Record saved successfully.", + "supplemented": "Job supplemented successfully. ", + "updated": "Job(s) updated successfully.", + "voided": "Job voided successfully." + } + }, + "landing": { + "bigfeature": { + "subtitle": "ImEX Online is built using world class technology by experts in the collision repair industry. This translates to software that is tailor made for the unique challenges faced by repair facilities with no compromises. ", + "title": "Bringing the latest technology to the automotive repair industry. " + }, + "footer": { + "company": { + "about": "About Us", + "contact": "Contact", + "disclaimers": "Disclaimers", + "name": "Company", + "privacypolicy": "Privacy Policy" + }, + "io": { + "help": "Help", + "name": "ImEX Online", + "status": "System Status" + }, + "slogan": "ImEX Systems Inc. is a technology leader in the collision repair industry. We specialize in creating collision repair management systems and bodyshop management systems that lower cycle times and promote efficiency." + }, + "hero": { + "button": "Learn More", + "title": "Shop management reimagined." + }, + "labels": { + "features": "Features", + "managemyshop": "Sign In", + "pricing": "Pricing" + }, + "pricing": { + "basic": { + "name": "Basic", + "sub": "Best suited for shops looking to increase their volume." + }, + "essentials": { + "name": "Essentials", + "sub": "Best suited for small and low volume shops." + }, + "pricingtitle": "Features", + "pro": { + "name": "Pro", + "sub": "Empower your shop with the tools to operate at peak capacity." + }, + "title": "Features", + "unlimited": { + "name": "Unlimited", + "sub": "Everything you need and more for the high volume shop." + } + } + }, + "menus": { + "currentuser": { + "languageselector": "Language", + "profile": "Profile" + }, + "header": { + "accounting": "Accounting", + "accounting-payables": "Payables", + "accounting-payments": "Payments", + "accounting-receivables": "Receivables", + "activejobs": "Active Jobs", + "alljobs": "All Jobs", + "allpayments": "All Payments", + "availablejobs": "Available Jobs", + "bills": "Bills", + "courtesycars": "Courtesy Cars", + "courtesycars-all": "All Courtesy Cars", + "courtesycars-contracts": "Contracts", + "courtesycars-newcontract": "New Contract", + "customers": "Customers", + "dashboard": "Dashboard", + "enterbills": "Enter Bills", + "enterpayment": "Enter Payments", + "entertimeticket": "Enter Time Tickets", + "export": "Export", + "export-logs": "Export Logs", + "help": "Help", + "home": "Home", + "inventory": "Inventory", + "jobs": "Jobs", + "newjob": "Create New Job", + "owners": "Owners", + "parts-queue": "Parts Queue", + "phonebook": "Phonebook", + "productionboard": "Production Board - Visual", + "productionlist": "Production Board - List", + "readyjobs": "Ready Jobs", + "recent": "Recent Items", + "reportcenter": "Report Center", + "rescueme": "Rescue me!", + "schedule": "Schedule", + "scoreboard": "Scoreboard", + "search": { + "bills": "Bills", + "jobs": "Jobs", + "owners": "Owners", + "payments": "Payments", + "phonebook": "Phonebook", + "vehicles": "Vehicles" + }, + "shiftclock": "Shift Clock", + "shop": "My Shop", + "shop_config": "Configuration", + "shop_csi": "CSI", + "shop_templates": "Templates", + "shop_vendors": "Vendors", + "temporarydocs": "Temporary Documents", + "timetickets": "Time Tickets", + "vehicles": "Vehicles" + }, + "jobsactions": { + "admin": "Admin", + "cancelallappointments": "Cancel all appointments", + "closejob": "Close Job", + "deletejob": "Delete Job", + "duplicate": "Duplicate this Job", + "duplicatenolines": "Duplicate this Job without Repair Data", + "newcccontract": "Create Courtesy Car Contract", + "void": "Void Job" + }, + "jobsdetail": { + "claimdetail": "Claim Details", + "dates": "Dates", + "financials": "Financial Information", + "general": "General", + "insurance": "Insurance Information", + "labor": "Labor", + "partssublet": "Parts & Bills", + "rates": "Rates", + "repairdata": "Repair Data", + "totals": "Totals" + }, + "profilesidebar": { + "profile": "My Profile", + "shops": "My Shops" + }, + "tech": { + "home": "Home", + "jobclockin": "Job Clock In", + "jobclockout": "Job Clock Out", + "joblookup": "Job Lookup", + "login": "Login", + "logout": "Logout", + "productionboard": "Production Board - Visual", + "productionlist": "Production List", + "shiftclockin": "Shift Clock" + } + }, + "messaging": { + "actions": { + "link": "Link to Job", + "new": "New Conversation" + }, + "errors": { + "invalidphone": "The phone number is invalid. Unable to open conversation. ", + "noattachedjobs": "No jobs have been associated to this conversation. ", + "updatinglabel": "Error updating label. {{error}}" + }, + "labels": { + "addlabel": "Add a label to this conversation.", + "archive": "Archive", + "maxtenimages": "You can only select up to a maximum of 10 images at a time.", + "messaging": "Messaging", + "noallowtxt": "This customer has not indicated their permission to be messaged.", + "nojobs": "Not associated to any job.", + "nopush": "Polling Mode Enabled", + "phonenumber": "Phone #", + "presets": "Presets", + "recentonly": "Only your most recent 50 conversations will be shown here. If you are looking for an older conversation, find the related contact and click their phone number to view the conversation.", + "selectmedia": "Select Media", + "sentby": "Sent by {{by}} at {{time}}", + "typeamessage": "Send a message...", + "unarchive": "Unarchive" + } + }, + "notes": { + "actions": { + "actions": "Actions", + "deletenote": "Delete Note", + "edit": "Edit Note", + "new": "New Note", + "savetojobnotes": "Save to Job Notes" + }, + "errors": { + "inserting": "Error inserting note. {{error}}" + }, + "fields": { + "createdby": "Created By", + "critical": "Critical", + "private": "Private", + "text": "Contents", + "updatedat": "Updated At" + }, + "labels": { + "addtorelatedro": "Add to Related ROs", + "newnoteplaceholder": "Add a note...", + "notetoadd": "Note to Add", + "systemnotes": "System Notes", + "usernotes": "User Notes" + }, + "successes": { + "create": "Note created successfully.", + "deleted": "Note deleted successfully.", + "updated": "Note updated successfully." + } + }, + "owner": { + "labels": { + "noownerinfo": "No owner information." + } + }, + "owners": { + "actions": { + "update": "Update Selected Records" + }, + "errors": { + "deleting": "Error deleting owner. {{error}}.", + "noaccess": "The record does not exist or you do not have access to it. ", + "saving": "Error saving owner. {{error}}.", + "selectexistingornew": "Select an existing owner record or create a new one. " + }, + "fields": { + "address": "Address", + "allow_text_message": "Permission to Text?", + "name": "Name", + "note": "Owner Note", + "ownr_addr1": "Address", + "ownr_addr2": "Address 2", + "ownr_city": "City", + "ownr_co_nm": "Owner Co. Name", + "ownr_ctry": "Country", + "ownr_ea": "Email", + "ownr_fn": "First Name", + "ownr_ln": "Last Name", + "ownr_ph1": "Phone 1", + "ownr_ph2": "Phone 2", + "ownr_st": "Province/State", + "ownr_title": "Title", + "ownr_zip": "Zip/Postal Code", + "preferred_contact": "Preferred Contact Method", + "tax_number": "Tax Number" + }, + "forms": { + "address": "Address", + "contact": "Contact Information", + "name": "Owner Details" + }, + "labels": { + "create_new": "Create a new owner record.", + "deleteconfirm": "Are you sure you want to delete this owner? This cannot be undone.", + "existing_owners": "Existing Owners", + "fromclaim": "Current Claim", + "fromowner": "Historical Owner Record", + "relatedjobs": "Related Jobs", + "updateowner": "Update Owner" + }, + "successes": { + "delete": "Owner deleted successfully.", + "save": "Owner saved successfully." + } + }, + "parts": { + "actions": { + "order": "Order Parts", + "orderinhouse": "Order as In House" + } + }, + "parts_orders": { + "actions": { + "backordered": "Mark Backordered", + "receive": "Receive", + "receivebill": "Receive Bill" + }, + "errors": { + "associatedbills": "This parts order cannot", + "backordering": "Error backordering part {{message}}.", + "creating": "Error encountered when creating parts order. ", + "oec": "Error creating EMS files for OEC. {{error}}", + "saving": "Error saving parts order. {{error}}.", + "updating": "Error updating parts order/parts order line. {{error}}." + }, + "fields": { + "act_price": "Price", + "backordered_eta": "B.O. ETA", + "backordered_on": "B.O. On", + "cm_received": "CM Received?", + "comments": "Comments", + "cost": "Cost", + "db_price": "List Price", + "deliver_by": "Deliver By", + "job_line_id": "Job Line Id", + "line_desc": "Line Description", + "line_remarks": "Remarks", + "lineremarks": "Line Remarks", + "oem_partno": "Part #", + "order_date": "Order Date", + "order_number": "Order Number", + "orderedby": "Ordered By", + "part_type": "Type", + "quantity": "Qty.", + "return": "Return", + "status": "Status" + }, + "labels": { + "allpartsto": "All Parts Location", + "confirmdelete": "Are you sure you want to delete this item? It cannot be recovered. Job line statuses will not be updated and may require manual review. ", + "custompercent": "Custom %", + "discount": "Discount {{percent}}", + "email": "Send by Email", + "inthisorder": "Parts in this Order", + "is_quote": "Parts Quote?", + "mark_as_received": "Mark as Received?", + "newpartsorder": "New Parts Order", + "notyetordered": "This part has not yet been ordered.", + "oec": "Order via OEC", + "order_type": "Order Type", + "orderhistory": "Order History", + "parts_order": "Parts Order", + "parts_orders": "Parts Orders", + "print": "Show Printed Form", + "receive": "Receive Parts Order", + "removefrompartsqueue": "Remove from Parts Queue?", + "returnpartsorder": "Return Parts Order", + "sublet_order": "Sublet Order" + }, + "successes": { + "created": "Parts order created successfully. ", + "line_updated": "Parts return line updated.", + "received": "Parts order received.", + "return_created": "Parts return created successfully." + } + }, + "payments": { + "errors": { + "exporting": "Error exporting payment(s). {{error}}", + "exporting-partner": "Error exporting to partner. Please check the partner interaction log for more errors." + }, + "fields": { + "amount": "Amount", + "created_at": "Created At", + "date": "Payment Date", + "exportedat": "Exported At", + "memo": "Memo", + "payer": "Payer", + "paymentnum": "Payment Number", + "stripeid": "Stripe ID", + "transactionid": "Transaction ID", + "type": "Type" + }, + "labels": { + "balance": "Balance", + "ca_bc_etf_table": "ICBC EFT Table Converter", + "customer": "Customer", + "edit": "Edit Payment", + "electronicpayment": "Use Electronic Payment Processing?", + "external": "External", + "findermodal": "ICBC Payment Finder", + "insurance": "Insurance", + "new": "New Payment", + "signup": "Please contact support to sign up for electronic payments.", + "title": "Payments", + "totalpayments": "Total Payments" + }, + "successes": { + "exported": "Payment(s) exported successfully.", + "markexported": "Payment(s) marked exported.", + "payment": "Payment created successfully. ", + "stripe": "Credit card transaction charged successfully." + } + }, + "phonebook": { + "actions": { + "new": "New Phonebook Entry" + }, + "errors": { + "adding": "Error adding phonebook entry. {{error}}", + "saving": "Error saving phonebook entry. {{error}}" + }, + "fields": { + "address1": "Street 1", + "address2": "Street 2", + "category": "Category", + "city": "City", + "company": "Company", + "country": "Country", + "email": "Email", + "fax": "Fax", + "firstname": "First Name", + "lastname": "Last Name", + "phone1": "Phone 1", + "phone2": "Phone 2", + "state": "Province/State" + }, + "labels": { + "noneselected": "No phone book entry selected. ", + "onenamerequired": "At least one name related field is required.", + "vendorcategory": "Vendor" + }, + "successes": { + "added": "Phonebook entry added successfully. ", + "deleted": "Phonebook entry deleted successfully. ", + "saved": "Phonebook entry saved successfully. " + } + }, + "printcenter": { + "appointments": { + "appointment_confirmation": "Appointment Confirmation" + }, + "bills": { + "inhouse_invoice": "In House Invoice" + }, + "courtesycarcontract": { + "courtesy_car_contract": "Courtesy Car Contract", + "courtesy_car_impound": "Impound Charges", + "courtesy_car_inventory": "Courtesy Car Inventory", + "courtesy_car_terms": "Courtesy Car Terms" + }, + "errors": { + "nocontexttype": "No context type set." + }, + "jobs": { + "3rdpartyfields": { + "addr1": "Address 1", + "addr2": "Address 2", + "addr3": "Address 3", + "attn": "Attention", + "city": "City", + "custgst": "Customer Portion of GST", + "ded_amt": "Deductible", + "depreciation": "Depreciation", + "other": "Other", + "ponumber": "PO Number", + "refnumber": "Reference Number", + "sendtype": "Send by", + "state": "Province/State", + "zip": "Postal Code/Zip" + }, + "3rdpartypayer": "Invoice to Third Party Payer", + "ab_proof_of_loss": "AB - Proof of Loss", + "appointment_confirmation": "Appointment Confirmation", + "appointment_reminder": "Appointment Reminder", + "casl_authorization": "CASL Authorization", + "coversheet_landscape": "Coversheet (Landscape)", + "coversheet_portrait": "Coversheet Portrait", + "csi_invitation": "CSI Invitation", + "csi_invitation_action": "CSI Invite", + "diagnostic_authorization": "Diagnostic Authorization", + "dms_posting_sheet": "DMS Posting Sheet", + "envelope_return_address": "#10 Envelope Return Address Label", + "estimate": "Estimate Only", + "estimate_detail": "Estimate Details", + "estimate_followup": "Estimate Followup", + "express_repair_checklist": "Express Repair Checklist", + "filing_coversheet_landscape": "Filing Coversheet (Landscape)", + "filing_coversheet_portrait": "Filing Coversheet (Portrait)", + "final_invoice": "Final Invoice", + "fippa_authorization": "FIPPA Authorization", + "folder_label_multiple": "Folder Label - Multi", + "glass_express_checklist": "Glass Express Checklist", + "guarantee": "Repair Guarantee", + "individual_job_note": "Job Note RO # {{ro_number}}", + "invoice_customer_payable": "Invoice (Customer Payable)", + "invoice_total_payable": "Invoice (Total Payable)", + "iou_form": "IOU Form", + "job_costing_ro": "Job Costing", + "job_notes": "Job Notes", + "key_tag": "Key Tag", + "labels": { + "count": "Count", + "labels": "Labels", + "position": "Starting Position" + }, + "lag_time_ro": "Lag Time", + "mechanical_authorization": "Mechanical Authorization", + "mpi_animal_checklist": "MPI - Animal Checklist", + "mpi_eglass_auth": "MPI - eGlass Auth", + "mpi_final_acct_sheet": "MPI - Final Accounting Sheet", + "paint_grid": "Paint Grid", + "parts_invoice_label_single": "Parts Label Single", + "parts_label_multiple": "Parts Label - Multi", + "parts_label_single": "Parts Label - Single", + "parts_list": "Parts List", + "parts_order": "Parts Order Confirmation", + "parts_order_confirmation": "", + "parts_order_history": "Parts Order History", + "parts_return_slip": "Parts Return Slip", + "payment_receipt": "Payment Receipt", + "payment_request": "Payment Request", + "payments_by_job": "Job Payments", + "purchases_by_ro_detail": "Purchases - Detail", + "purchases_by_ro_summary": "Purchases - Summary", + "qc_sheet": "Quality Control Sheet", + "rental_reservation": "Rental Reservation", + "ro_totals": "RO Totals", + "ro_with_description": "RO Summary with Descriptions", + "sgi_certificate_of_repairs": "SGI - Certificate of Repairs", + "sgi_windshield_auth": "SGI - Windshield Authorization", + "stolen_recovery_checklist": "Stolen Recovery Checklist", + "sublet_order": "Sublet Order", + "supplement_request": "Supplement Request", + "thank_you_ro": "Thank You Letter", + "thirdpartypayer": "Third Party Payer", + "timetickets_ro": "Time Tickets", + "vehicle_check_in": "Vehicle Intake", + "vehicle_delivery_check": "Vehicle Delivery Checklist", + "window_tag": "Window Tag", + "window_tag_sublet": "Window Tag - Sublet", + "work_authorization": "Work Authorization", + "worksheet_by_line_number": "Worksheet by Line Number", + "worksheet_sorted_by_operation": "Worksheet by Operation", + "worksheet_sorted_by_operation_no_hours": "Worksheet by Operation (No Hours)", + "worksheet_sorted_by_operation_part_type": "Worksheet by Operation & Part Type", + "worksheet_sorted_by_operation_type": "Worksheet by Operation Type" + }, + "labels": { + "groups": { + "authorization": "Authorization", + "financial": "Financial", + "post": "Post-Production", + "pre": "Pre-Production", + "ro": "Repair Order", + "worksheet": "Worksheets" + }, + "misc": "Miscellaneous Documents", + "repairorder": "Repair Order Related", + "reportcentermodal": "Report Center", + "speedprint": "Speed Print", + "title": "Print Center" + }, + "payments": { + "ca_bc_etf_table": "ICBC EFT Table", + "exported_payroll": "Payroll Table" + }, + "special": { + "attendance_detail_csv": "Attendance Table" + }, + "subjects": { + "jobs": { + "parts_order": "Parts Order PO: {{ro_number}} - {{name}}", + "sublet_order": "Sublet Order PO: {{ro_number}} - {{name}}" + } + }, + "vendors": { + "purchases_by_vendor_detailed": "Purchases by Vendor - Detailed", + "purchases_by_vendor_summary": "Purchases by Vendor - Summary" + } + }, + "production": { + "actions": { + "addcolumns": "Add Columns", + "bodypriority-clear": "Clear Body Priority", + "bodypriority-set": "Set Body Priority", + "detailpriority-clear": "Clear Detail Priority", + "detailpriority-set": "Set Detail Priority", + "paintpriority-clear": "Clear Paint Priority", + "paintpriority-set": "Set Paint Priority", + "remove": "Remove from Production", + "removecolumn": "Remove Column", + "saveconfig": "Save Configuration", + "suspend": "Suspend", + "unsuspend": "Unsuspend" + }, + "errors": { + "boardupdate": "Error encountered updating job. {{message}}", + "removing": "Error removing from production board. {{error}}", + "settings": "Error saving board settings: {{error}}" + }, + "labels": { + "actual_in": "Actual In", + "alert": "Alert", + "alertoff": "Remove alert from job", + "alerton": "Add alert to job", + "ats": "Alternative Transportation", + "bodyhours": "B", + "bodypriority": "B/P", + "bodyshop": { + "labels": { + "qbo_departmentid": "QBO Department ID", + "qbo_usa": "QBO USA" + } + }, + "cardsettings": "Card Settings", + "clm_no": "Claim Number", + "comment": "Comment", + "compact": "Compact Cards", + "detailpriority": "D/P", + "employeeassignments": "Employee Assignments", + "employeesearch": "Employee Search", + "ins_co_nm": "Insurance Company Name", + "jobdetail": "Job Details", + "laborhrs": "Labor Hours", + "note": "Production Note", + "ownr_nm": "Owner Name", + "paintpriority": "P/P", + "partsstatus": "Parts Status", + "production_note": "Production Note", + "refinishhours": "R", + "scheduled_completion": "Scheduled Completion", + "selectview": "Select a View", + "stickyheader": "Sticky Header (BETA)", + "sublets": "Sublets", + "totalhours": "Total Hrs ", + "touchtime": "T/T", + "viewname": "View Name", + "legend": "Legend:", + "cardcolor": "Card Colors" + }, + "successes": { + "removed": "Job removed from production." + } + }, + "profile": { + "errors": { + "state": "Error reading page state. Please refresh." + }, + "labels": { + "activeshop": "Active Shop" + }, + "successes": { + "updated": "Profile updated successfully." + } + }, + "reportcenter": { + "actions": { + "generate": "Generate" + }, + "labels": { + "dates": "Dates", + "employee": "Employee", + "filterson": "Filters on {{object}}: {{field}}", + "generateasemail": "Generate as Email?", + "groups": { + "customers": "Customers", + "jobs": "Jobs & Costing", + "payroll": "Payroll", + "purchases": "Purchases", + "sales": "Sales" + }, + "key": "Report", + "objects": { + "appointments": "Appointments", + "bills": "Bills", + "csi": "CSI", + "exportlogs": "Export Logs", + "jobs": "Jobs", + "parts_orders": "Parts Orders", + "payments": "Payments", + "scoreboard": "Scoreboard", + "timetickets": "Timetickets" + }, + "vendor": "Vendor" + }, + "templates": { + "anticipated_revenue": "Anticipated Revenue", + "attendance_detail": "Attendance (All Employees)", + "attendance_employee": "Employee Attendance", + "attendance_summary": "Attendance Summary (All Employees)", + "credits_not_received_date": "Credits not Received by Date", + "credits_not_received_date_vendorid": "Credits not Received by Vendor", + "csi": "CSI Responses", + "customer_list": "Customer List", + "cycle_time_analysis": "Cycle Time Analysis", + "estimates_written_converted": "Estimates Written/Converted", + "estimator_detail": "Jobs by Estimator (Detail)", + "estimator_summary": "Jobs by Estimator (Summary)", + "export_payables": "Export Log - Payables", + "export_payments": "Export Log - Payments", + "export_receivables": "Export Log - Receivables", + "exported_gsr_by_ro": "Exported Gross Sales - Excel", + "exported_gsr_by_ro_labor": "Exported Gross Sales (Labor) - Excel", + "gsr_by_atp": "", + "gsr_by_ats": "Gross Sales by ATS", + "gsr_by_category": "Gross Sales by Category", + "gsr_by_csr": "Gross Sales by CSR", + "gsr_by_delivery_date": "Gross Sales by Delivery Date", + "gsr_by_estimator": "Gross Sales by Estimator", + "gsr_by_exported_date": "Exported Gross Sales", + "gsr_by_ins_co": "Gross Sales by Insurance Company", + "gsr_by_make": "Gross Sales by Vehicle Make", + "gsr_by_referral": "Gross Sales by Referral Source", + "gsr_by_ro": "Gross Sales by RO", + "gsr_labor_only": "Gross Sales - Labor Only", + "hours_sold_detail_closed": "Hours Sold Detail - Closed", + "hours_sold_detail_closed_csr": "Hours Sold Detail - Closed by CSR", + "hours_sold_detail_closed_ins_co": "Hours Sold Detail - Closed by Source", + "hours_sold_detail_closed_status": "Hours Sold Detail - Closed by Status", + "hours_sold_detail_open": "Hours Sold Detail - Open", + "hours_sold_detail_open_csr": "Hours Sold Detail - Open by CSR", + "hours_sold_detail_open_ins_co": "Hours Sold Detail - Open by Source", + "hours_sold_detail_open_status": "Hours Sold Detail - Open by Status", + "hours_sold_summary_closed": "Hours Sold Summary - Closed", + "hours_sold_summary_closed_csr": "Hours Sold Summary - Closed by CSR", + "hours_sold_summary_closed_ins_co": "Hours Sold Summary - Closed by Source", + "hours_sold_summary_closed_status": "Hours Sold Summary - Closed by Status", + "hours_sold_summary_open": "Hours Sold Summary - Open", + "hours_sold_summary_open_csr": "Hours Sold Summary - Open CSR", + "hours_sold_summary_open_ins_co": "Hours Sold Summary - Open by Source", + "hours_sold_summary_open_status": "Hours Sold Summary - Open by Status", + "job_costing_ro_csr": "Job Costing by CSR", + "job_costing_ro_date_detail": "Job Costing by RO - Detail", + "job_costing_ro_date_summary": "Job Costing by RO - Summary", + "job_costing_ro_estimator": "Job Costing by Estimator", + "job_costing_ro_ins_co": "Job Costing by RO Source", + "jobs_completed_not_invoiced": "Jobs Completed not Invoiced", + "jobs_invoiced_not_exported": "Jobs Invoiced not Exported", + "jobs_reconcile": "Parts/Sublet/Labor Reconciliation", + "lag_time": "Lag Time", + "open_orders": "Open Orders by Date", + "open_orders_csr": "Open Orders by CSR", + "open_orders_estimator": "Open Orders by Estimator", + "open_orders_ins_co": "Open Orders by Insurance Company", + "open_orders_specific_csr": "Open Orders filtered by CSR", + "open_orders_status": "Open Orders by Status", + "parts_backorder": "IOU Parts List", + "parts_not_recieved": "Parts Not Received", + "parts_not_recieved_vendor": "Parts Not Received by Vendor", + "parts_received_not_scheduled": "Parts Received for Jobs Not Scheduled", + "payments_by_date": "Payments by Date", + "payments_by_date_type": "Payments by Date and Type", + "production_by_category": "Production by Category", + "production_by_category_one": "Production filtered by Category", + "production_by_csr": "Production by CSR", + "production_by_last_name": "Production by Last Name", + "production_by_repair_status": "Production by Status", + "production_by_repair_status_one": "Production filtered by Status", + "production_by_ro": "Production by RO", + "production_by_target_date": "Production by Target Date", + "production_by_technician": "Production by Technician", + "production_by_technician_one": "Production filtered by Technician", + "production_over_time": "Production Level over Time", + "psr_by_make": "Percent of Sales by Vehicle Make", + "purchase_return_ratio_grouped_by_vendor_detail": "Purchase & Return Ratio by Vendor (Detail)", + "purchase_return_ratio_grouped_by_vendor_summary": "Purchase & Return Ratio by Vendor (Summary)", + "purchases_by_cost_center_detail": "Purchases by Cost Center (Detail)", + "purchases_by_cost_center_summary": "Purchases by Cost Center (Summary)", + "purchases_by_date_range_detail": "Purchases by Date - Detail", + "purchases_by_date_range_summary": "Purchases by Date - Summary", + "purchases_by_vendor_detailed_date_range": "Purchases By Vendor - Detailed", + "purchases_by_vendor_summary_date_range": "Purchases by Vendor - Summary", + "purchases_grouped_by_vendor_detailed": "Purchases Grouped by Vendor - Detailed", + "purchases_grouped_by_vendor_summary": "Purchases Grouped by Vendor - Summary", + "returns_grouped_by_vendor_detailed": "Returns Grouped by Vendor - Detailed", + "returns_grouped_by_vendor_summary": "Returns Grouped by Vendor - Summary", + "schedule": "Appointment Schedule", + "scheduled_parts_list": "Parts for Jobs Scheduled In", + "scoreboard_detail": "Scoreboard Detail", + "scoreboard_summary": "Scoreboard Summary", + "supplement_ratio_ins_co": "Supplement Ratio by Source", + "thank_you_date": "Thank You Letters", + "timetickets": "Time Tickets", + "timetickets_employee": "Employee Time Tickets", + "timetickets_summary": "Time Tickets Summary", + "unclaimed_hrs": "Unclaimed Hours", + "void_ros": "Void ROs", + "work_in_progress_labour": "Work in Progress - Labor", + "work_in_progress_payables": "Work in Progress - Payables" + } + }, + "schedule": { + "labels": { + "atssummary": "ATS Summary", + "employeevacation": "Employee Vacations", + "ins_co_nm_filter": "Filter by Insurance Company", + "intake": "Intake Events", + "manual": "Manual Events", + "manualevent": "Add Manual Event" + } + }, + "scoreboard": { + "actions": { + "edit": "Edit" + }, + "errors": { + "adding": "Error adding job to scoreboard. {{message}}", + "removing": "Error removing job from scoreboard. {{message}}", + "updating": "Error updating scoreboard. {{message}}" + }, + "fields": { + "bodyhrs": "Body Hours", + "date": "Date", + "painthrs": "Paint Hours" + }, + "labels": { + "asoftodaytarget": "As of Today", + "calendarperiod": "Periods based on calendar weeks/months.", + "dailyactual": "Actual (D)", + "dailytarget": "Daily", + "efficiencyoverperiod": "Efficiency over Selected Dates", + "entries": "Scoreboard Entries", + "jobs": "Jobs", + "lastmonth": "Last Month", + "lastweek": "Last Week", + "monthlytarget": "Monthly", + "productivestatistics": "Productive Hours Statistics", + "productivetimeticketsoverdate": "Productive Hours over Selected Dates", + "targets": "Targets", + "thismonth": "This Month", + "thisweek": "This Week", + "timetickets": "Timetickets", + "todateactual": "Actual (MTD)", + "totaloverperiod": "Total over Selected Dates", + "weeklyactual": "Actual (W)", + "weeklytarget": "Weekly", + "workingdays": "Working Days / Month" + }, + "successes": { + "added": "Job added to scoreboard.", + "removed": "Job removed from scoreboard.", + "updated": "Scoreboard updated." + } + }, + "tech": { + "fields": { + "employeeid": "Employee ID", + "pin": "PIN" + }, + "labels": { + "loggedin": "Logged in as {{name}}", + "notloggedin": "Not logged in." + } + }, + "templates": { + "errors": { + "updating": "Error updating template {{error}}." + }, + "successes": { + "updated": "Template updated successfully." + } + }, + "timetickets": { + "actions": { + "clockin": "Clock In", + "clockout": "Clock Out", + "enter": "Enter New Time Ticket", + "printemployee": "Print Time Tickets" + }, + "errors": { + "clockingin": "Error while clocking in. {{message}}", + "clockingout": "Error while clocking out. {{message}}", + "creating": "Error creating time ticket. {{message}}", + "deleting": "Error deleting time ticket. {{message}}", + "noemployeeforuser": "Unable to use Shift Clock", + "noemployeeforuser_sub": "An employee record has not been created for this user. Please create one before using the shift clock. ", + "shiftalreadyclockedon": "You are already clocked onto a shift. Unable to create shift entry." + }, + "fields": { + "actualhrs": "Actual Hours", + "ciecacode": "CIECA Code", + "clockhours": "Clock Hours", + "clockoff": "Clock Off", + "clockon": "Clocked In", + "cost_center": "Cost Center", + "date": "Ticket Date", + "efficiency": "Efficiency", + "employee": "Employee", + "flat_rate": "Flat Rate?", + "memo": "Memo", + "productivehrs": "Productive Hours", + "ro_number": "Job to Post Against" + }, + "labels": { + "alreadyclockedon": "You are already clocked in to the following job(s):", + "ambreak": "AM Break", + "amshift": "AM Shift", + "clockhours": "Shift Clock Hours Summary", + "clockintojob": "Clock In to Job", + "deleteconfirm": "Are you sure you want to delete this time ticket? This cannot be undone.", + "edit": "Edit Time Ticket", + "efficiency": "Efficiency", + "flat_rate": "Flat Rate", + "jobhours": "Job Related Time Tickets Summary", + "lunch": "Lunch", + "new": "New Time Ticket", + "pmbreak": "PM Break", + "pmshift": "PM Shift", + "shift": "Shift", + "shiftalreadyclockedon": "Active Shift Time Tickets", + "straight_time": "Straight Time", + "timetickets": "Time Tickets", + "zeroactualnegativeprod": "Actual hours must be 0 if entering negative productive hours." + }, + "successes": { + "clockedin": "Clocked in successfully.", + "clockedout": "Clocked out successfully.", + "created": "Time ticket entered successfully.", + "deleted": "Time ticket deleted successfully." + }, + "validation": { + "clockoffmustbeafterclockon": "Clock off time must be the same or after clock in time.", + "clockoffwithoutclockon": "Clock off time cannot be set without a clock in time.", + "hoursenteredmorethanavailable": "The number of hours entered is more than what is available for this cost center." + } + }, + "titles": { + "accounting-payables": "Payables | $t(titles.app)", + "accounting-payments": "Payments | $t(titles.app)", + "accounting-receivables": "Receivables | $t(titles.app)", + "app": "ImEX Online", + "bc": { + "accounting-payables": "Payables", + "accounting-payments": "Payments", + "accounting-receivables": "Receivables", + "availablejobs": "Available Jobs", + "bills-list": "Bills", + "contracts": "Contracts", + "contracts-create": "New Contract", + "contracts-detail": "Contract #{{number}}", + "courtesycars": "Courtesy Cars", + "courtesycars-detail": "Courtesy Car {{number}}", + "courtesycars-new": "New Courtesy Car", + "dashboard": "Dashboard", + "dms": "DMS Export", + "export-logs": "Export Logs", + "inventory": "Inventory", + "jobs": "Jobs", + "jobs-active": "Active Jobs", + "jobs-admin": "Admin", + "jobs-all": "All Jobs", + "jobs-checklist": "Checklist", + "jobs-close": "Close Job", + "jobs-deliver": "Deliver Job", + "jobs-detail": "Job {{number}}", + "jobs-intake": "Intake", + "jobs-new": "Create a New Job", + "jobs-ready": "Ready Jobs", + "owner-detail": "{{name}}", + "owners": "Owners", + "parts-queue": "Parts Queue", + "payments-all": "All Payments", + "phonebook": "Phonebook", + "productionboard": "Production Board - Visual", + "productionlist": "Production Board - List", + "profile": "My Profile", + "schedule": "Schedule", + "scoreboard": "Scoreboard", + "shop": "Manage my Shop ({{shopname}})", + "shop-csi": "CSI Responses", + "shop-templates": "Shop Templates", + "shop-vendors": "Vendors", + "temporarydocs": "Temporary Documents", + "timetickets": "Time Tickets", + "vehicle-details": "Vehicle: {{vehicle}}", + "vehicles": "Vehicles" + }, + "bills-list": "Bills | $t(titles.app)", + "contracts": "Courtesy Car Contracts | $t(titles.app)", + "contracts-create": "New Contract | $t(titles.app)", + "contracts-detail": "Contract {{id}} | $t(titles.app)", + "courtesycars": "Courtesy Cars | $t(titles.app)", + "courtesycars-create": "New Courtesy Car | $t(titles.app)", + "courtesycars-detail": "Courtesy Car {{id}} | $t(titles.app)", + "dashboard": "Dashboard | $t(titles.app)", + "dms": "DMS Export | $t(titles.app)", + "export-logs": "Export Logs | $t(titles.app)", + "inventory": "Inventory | $t(titles.app)", + "jobs": "Active Jobs | $t(titles.app)", + "jobs-admin": "Job {{ro_number}} - Admin | $t(titles.app)", + "jobs-all": "All Jobs | $t(titles.app)", + "jobs-checklist": "Job Checklist | $t(titles.app)", + "jobs-close": "Close Job {{number}} | $t(titles.app)", + "jobs-create": "Create a New Job | $t(titles.app)", + "jobs-deliver": "Deliver Job | $t(titles.app)", + "jobs-intake": "Intake | $t(titles.app)", + "jobsavailable": "Available Jobs | $t(titles.app)", + "jobsdetail": "Job {{ro_number}} | $t(titles.app)", + "jobsdocuments": "Job Documents {{ro_number}} | $t(titles.app)", + "manageroot": "Home | $t(titles.app)", + "owners": "All Owners | $t(titles.app)", + "owners-detail": "{{name}} | $t(titles.app)", + "parts-queue": "Parts Queue | $t(titles.app)", + "payments-all": "Payments | $t(titles.app)", + "phonebook": "Phonebook | $t(titles.app)", + "productionboard": "Production - Board", + "productionlist": "Production Board - List | $t(titles.app)", + "profile": "My Profile | $t(titles.app)", + "readyjobs": "Ready Jobs | $t(titles.app)", + "resetpassword": "Reset Password", + "resetpasswordvalidate": "Enter New Password", + "schedule": "Schedule | $t(titles.app)", + "scoreboard": "Scoreboard | $t(titles.app)", + "shop": "My Shop | $t(titles.app)", + "shop-csi": "CSI Responses | $t(titles.app)", + "shop-templates": "Shop Templates | $t(titles.app)", + "shop_vendors": "Vendors | $t(titles.app)", + "temporarydocs": "Temporary Documents | $t(titles.app)", + "timetickets": "Time Tickets | $t(titles.app)", + "vehicledetail": "Vehicle Details {{vehicle}} | $t(titles.app)", + "vehicles": "All Vehicles | $t(titles.app)" + }, + "user": { + "actions": { + "changepassword": "Change Password", + "signout": "Sign Out", + "updateprofile": "Update Profile" + }, + "errors": { + "updating": "Error updating user or association {{message}}" + }, + "fields": { + "authlevel": "Authorization Level", + "displayname": "Display Name", + "email": "Email", + "photourl": "Avatar URL" + }, + "labels": { + "actions": "Actions", + "changepassword": "Change Password", + "profileinfo": "Profile Info" + }, + "successess": { + "passwordchanged": "Password changed successfully. " + } + }, + "users": { + "errors": { + "signinerror": { + "auth/user-disabled": "User account disabled. ", + "auth/user-not-found": "A user with this email does not exist.", + "auth/wrong-password": "The email and password combination you provided is incorrect." + } + } + }, + "vehicles": { + "errors": { + "deleting": "Error deleting vehicle. {{error}}.", + "noaccess": "The vehicle does not exist or you do not have access to it.", + "selectexistingornew": "Select an existing vehicle record or create a new one. ", + "validation": "Please ensure all fields are entered correctly.", + "validationtitle": "Validation Error" + }, + "fields": { + "description": "Vehicle Description", + "notes": "Vehicle Notes", + "plate_no": "License Plate", + "plate_st": "Plate Jurisdiction", + "trim_color": "Trim Color", + "v_bstyle": "Body Style", + "v_color": "Color", + "v_cond": "Condition", + "v_engine": "Engine", + "v_make_desc": "Make", + "v_makecode": "Make Code", + "v_mldgcode": "Molding Code", + "v_model_desc": "Model", + "v_model_yr": "Year", + "v_options": "Options", + "v_paint_codes": "Paint Codes {{number}}", + "v_prod_dt": "Production Date", + "v_stage": "Stage", + "v_tone": "Tone", + "v_trimcode": "Trim Code", + "v_type": "Type", + "v_vin": "V.I.N." + }, + "forms": { + "detail": "Vehicle Details", + "misc": "Miscellaneous", + "registration": "Registration" + }, + "labels": { + "deleteconfirm": "Are you sure you want to delete this vehicle? This cannot be undone.", + "fromvehicle": "Historical Vehicle Record", + "novehinfo": "No Vehicle Information", + "relatedjobs": "Related Jobs", + "updatevehicle": "Update Vehicle Information" + }, + "successes": { + "delete": "Vehicle deleted successfully.", + "save": "Vehicle saved successfully." + } + }, + "vendors": { + "actions": { + "addtophonebook": "Add to Phonebook", + "new": "New Vendor", + "newpreferredmake": "New Preferred Make" + }, + "errors": { + "deleting": "Error encountered while deleting vendor. ", + "saving": "Error encountered while saving vendor. " + }, + "fields": { + "active": "Active", + "am": "Aftermarket", + "city": "City", + "cost_center": "Cost Center", + "country": "Country", + "discount": "Discount % (as decimal)", + "display_name": "Display Name", + "dmsid": "DMS ID", + "due_date": "Payment Due Date (# of days)", + "email": "Contact Email", + "favorite": "Favorite?", + "lkq": "LKQ", + "make": "Make", + "name": "Vendor Name", + "oem": "OEM", + "phone": "Phone", + "prompt_discount": "Prompt Discount %", + "state": "Province/State", + "street1": "Street", + "street2": "Address 2", + "taxid": "Tax ID", + "terms": "Payment Terms", + "zip": "Zip/Postal Code" + }, + "labels": { + "noneselected": "No vendor is selected.", + "preferredmakes": "Preferred Makes for Vendor", + "search": "Type a Vendor's Name" + }, + "successes": { + "deleted": "Vendor deleted successfully. ", + "saved": "Vendor saved successfully." + }, + "validation": { + "unique_vendor_name": "You must enter a unique vendor name." + } + } + } } From 889ef611850a1f078b997d377aa624678c0df898 Mon Sep 17 00:00:00 2001 From: swtmply Date: Thu, 4 May 2023 01:25:17 +0800 Subject: [PATCH 09/14] IO-1722 fixed spacing on translations --- client/src/translations/en_us/common.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json index f52178267..1819fadbe 100644 --- a/client/src/translations/en_us/common.json +++ b/client/src/translations/en_us/common.json @@ -508,7 +508,8 @@ "id": "ID", "label": "Label", "lt": "Less than (hrs)", - "target": "Target (count)" + "target": "Target (count)", + "color": "Job Color" }, "state": "Province/State", "state_tax_id": "Provincial/State Tax ID (PST, QST)", @@ -2385,7 +2386,9 @@ "sublets": "Sublets", "totalhours": "Total Hrs ", "touchtime": "T/T", - "viewname": "View Name" + "viewname": "View Name", + "legend": "Legend:", + "cardcolor": "Card Colors" }, "successes": { "removed": "Job removed from production." From 2bf24ff5a1fcac0dd01dd0d62bd123b33d4aff47 Mon Sep 17 00:00:00 2001 From: swtmply Date: Thu, 4 May 2023 23:00:37 +0800 Subject: [PATCH 10/14] IO-1722 refactor color function --- ...production-board-kanban-card.component.jsx | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/client/src/components/production-board-kanban-card/production-board-kanban-card.component.jsx b/client/src/components/production-board-kanban-card/production-board-kanban-card.component.jsx index 7a16ebdc0..cb955a9c6 100644 --- a/client/src/components/production-board-kanban-card/production-board-kanban-card.component.jsx +++ b/client/src/components/production-board-kanban-card/production-board-kanban-card.component.jsx @@ -18,14 +18,16 @@ import moment from "moment"; import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; import JobPartsQueueCount from "../job-parts-queue-count/job-parts-queue-count.component"; -const cardColor = (job_sizes, totalHrs) => { - for (const size of job_sizes) { - if (totalHrs <= (size.lt || 999) && totalHrs >= size.gte) { - if (size.color) { - return size.color.hex; - } - } +const cardColor = (ssbuckets, totalHrs) => { + const bucket = ssbuckets.filter( + (bucket) => + bucket.gte <= totalHrs && (!!bucket.lt ? bucket.lt > totalHrs : true) + )[0]; + + if (bucket.color) { + return bucket.color.hex; } + return ""; }; @@ -76,18 +78,16 @@ export default function ProductionBoardCard( const totalHrs = card.labhrs.aggregate.sum.mod_lb_hrs + card.larhrs.aggregate.sum.mod_lb_hrs; + const bgColor = cardColor(bodyshop.ssbuckets, totalHrs); return ( From b8619573422255051886b3419b264fc4a250ed25 Mon Sep 17 00:00:00 2001 From: Patrick Fic Date: Thu, 4 May 2023 11:59:39 -0700 Subject: [PATCH 11/14] Additional security hardening. --- client/.env.production | 1 + client/src/utils/RenderTemplate.js | 33 ++++++++++++++------- hasura/metadata/tables.yaml | 15 ++++++++++ server.js | 46 ++++++++++++++++------------- server/data/arms.js | 2 +- server/data/autohouse.js | 12 +++++++- server/job/job-status-transition.js | 2 +- server/opensearch/os-handler.js | 4 +++ server/utils/utils.js | 9 ++++++ 9 files changed, 89 insertions(+), 35 deletions(-) diff --git a/client/.env.production b/client/.env.production index 7a58e4591..a4cdecee5 100644 --- a/client/.env.production +++ b/client/.env.production @@ -1,3 +1,4 @@ +GENERATE_SOURCEMAP=false REACT_APP_GRAPHQL_ENDPOINT=https://db.imex.online/v1/graphql REACT_APP_GRAPHQL_ENDPOINT_WS=wss://db.imex.online/v1/graphql REACT_APP_GA_CODE=231103507 diff --git a/client/src/utils/RenderTemplate.js b/client/src/utils/RenderTemplate.js index acdfe1bf2..21ad1e30b 100644 --- a/client/src/utils/RenderTemplate.js +++ b/client/src/utils/RenderTemplate.js @@ -1,15 +1,15 @@ import { gql } from "@apollo/client"; import { notification } from "antd"; -import axios from "axios"; import jsreport from "@jsreport/browser-client"; import _ from "lodash"; import moment from "moment"; -import { auth } from "../firebase/firebase.utils"; +//import { auth } from "../firebase/firebase.utils"; import { setEmailOptions } from "../redux/email/email.actions"; import { store } from "../redux/store"; import client from "../utils/GraphQLClient"; import { TemplateList } from "./TemplateConstants"; - +import cleanAxios from "./CleanAxios"; +import axios from "axios"; const server = process.env.REACT_APP_REPORTS_SERVER_URL; jsreport.serverUrl = server; @@ -26,10 +26,14 @@ export default async function RenderTemplate( if (window.jsr3) { jsreport.serverUrl = "https://reports3.test.imex.online/"; } + const jsrAuth = (await axios.post("/utils/jsr")).data; + console.log("🚀 ~ file: RenderTemplate.js:30 ~ jsrAuth:", jsrAuth); + jsreport.headers["Authorization"] = jsrAuth; //Query assets that match the template name. Must be in format <>.query let { contextData, useShopSpecificTemplate } = await fetchContextData( - templateObject + templateObject, + jsrAuth ); const { ignoreCustomMargins } = Templates[templateObject.name]; @@ -137,11 +141,15 @@ export async function RenderTemplates( //Query assets that match the template name. Must be in format <>.query let unsortedTemplatesAndData = []; let proms = []; + const jsrAuth = (await axios.post("/utils/jsr")).data; + jsreport.headers["Authorization"] = jsrAuth; + templateObjects.forEach((template) => { proms.push( (async () => { let { contextData, useShopSpecificTemplate } = await fetchContextData( - template + template, + jsrAuth ); unsortedTemplatesAndData.push({ templateObject: template, @@ -298,19 +306,22 @@ export const GenerateDocuments = async (templates) => { await RenderTemplates(templates, bodyshop); }; -const fetchContextData = async (templateObject) => { +const fetchContextData = async (templateObject, jsrAuth) => { const bodyshop = store.getState().user.bodyshop; - jsreport.headers["Authorization"] = - "Bearer " + (await auth.currentUser.getIdToken()); + // jsreport.headers["Authorization"] = + // "Bearer " + (await auth.currentUser.getIdToken()); - const folders = await axios.get(`${server}/odata/folders`); + const folders = await cleanAxios.get(`${server}/odata/folders`, { + headers: { Authorization: jsrAuth }, + }); const shopSpecificFolder = folders.data.value.find( (f) => f.name === bodyshop.imexshopid ); - const jsReportQueries = await axios.get( - `${server}/odata/assets?$filter=name eq '${templateObject.name}.query'` + const jsReportQueries = await cleanAxios.get( + `${server}/odata/assets?$filter=name eq '${templateObject.name}.query'`, + { headers: { Authorization: jsrAuth } } ); let templateQueryToExecute; diff --git a/hasura/metadata/tables.yaml b/hasura/metadata/tables.yaml index 2d36a544e..23aefaa8e 100644 --- a/hasura/metadata/tables.yaml +++ b/hasura/metadata/tables.yaml @@ -694,6 +694,9 @@ num_retries: 3 timeout_sec: 60 webhook_from_env: HASURA_API_URL + headers: + - name: event-secret + value_from_env: EVENT_SECRET request_transform: method: POST query_params: {} @@ -4112,6 +4115,9 @@ num_retries: 3 timeout_sec: 60 webhook_from_env: HASURA_API_URL + headers: + - name: event-secret + value_from_env: EVENT_SECRET request_transform: method: POST query_params: {} @@ -4562,6 +4568,9 @@ num_retries: 3 timeout_sec: 60 webhook_from_env: HASURA_API_URL + headers: + - name: event-secret + value_from_env: EVENT_SECRET request_transform: method: POST query_params: {} @@ -5015,6 +5024,9 @@ num_retries: 3 timeout_sec: 60 webhook_from_env: HASURA_API_URL + headers: + - name: event-secret + value_from_env: EVENT_SECRET request_transform: method: POST query_params: {} @@ -5957,6 +5969,9 @@ num_retries: 3 timeout_sec: 60 webhook_from_env: HASURA_API_URL + headers: + - name: event-secret + value_from_env: EVENT_SECRET request_transform: method: POST query_params: {} diff --git a/server.js b/server.js index 273676bb9..6a0c9e20a 100644 --- a/server.js +++ b/server.js @@ -123,7 +123,11 @@ app.post( twilio.webhook({ validate: process.env.NODE_ENV === "PRODUCTION" }), smsStatus.status ); -app.post("/sms/markConversationRead", smsStatus.markConversationRead); +app.post( + "/sms/markConversationRead", + fb.validateFirebaseIdToken, + smsStatus.markConversationRead +); var job = require("./server/job/job"); app.post("/job/totals", fb.validateFirebaseIdToken, job.totals); @@ -147,11 +151,11 @@ app.post("/scheduling/job", fb.validateFirebaseIdToken, scheduling.job); var inlineCss = require("./server/render/inlinecss"); app.post("/render/inlinecss", fb.validateFirebaseIdToken, inlineCss.inlinecss); -app.post( - "/notifications/send", +// app.post( +// "/notifications/send", - fb.sendNotification -); +// fb.sendNotification +// ); app.post("/notifications/subscribe", fb.validateFirebaseIdToken, fb.subscribe); app.post( "/notifications/unsubscribe", @@ -188,13 +192,13 @@ app.post( ); //Stripe Processing -var stripe = require("./server/stripe/payment"); -app.post("/stripe/payment", fb.validateFirebaseIdToken, stripe.payment); -app.post( - "/stripe/mobilepayment", - fb.validateFirebaseIdToken, - stripe.mobile_payment -); +// var stripe = require("./server/stripe/payment"); +// app.post("/stripe/payment", fb.validateFirebaseIdToken, stripe.payment); +// app.post( +// "/stripe/mobilepayment", +// fb.validateFirebaseIdToken, +// stripe.mobile_payment +// ); //Tech Console var tech = require("./server/tech/tech"); @@ -202,7 +206,7 @@ app.post("/tech/login", fb.validateFirebaseIdToken, tech.techLogin); var utils = require("./server/utils/utils"); app.post("/utils/time", utils.servertime); - +app.post("/utils/jsr", fb.validateFirebaseIdToken, utils.jsrAuth); var qbo = require("./server/accounting/qbo/qbo"); app.post("/qbo/authorize", fb.validateFirebaseIdToken, qbo.authorize); app.get("/qbo/callback", qbo.callback); @@ -215,7 +219,7 @@ app.post("/data/ah", data.autohouse); app.post("/record-handler/arms", data.arms); var taskHandler = require("./server/tasks/tasks"); -app.post("/taskHandler", taskHandler.taskHandler); +app.post("/taskHandler", fb.validateFirebaseIdToken, taskHandler.taskHandler); var mixdataUpload = require("./server/mixdata/mixdata"); @@ -228,10 +232,10 @@ app.post( var ioevent = require("./server/ioevent/ioevent"); app.post("/ioevent", ioevent.default); -app.post("/newlog", (req, res) => { - const { message, type, user, record, object } = req.body; - logger.log(message, type, user, record, object); -}); +// app.post("/newlog", (req, res) => { +// const { message, type, user, record, object } = req.body; +// logger.log(message, type, user, record, object); +// }); var os = require("./server/opensearch/os-handler"); app.post( @@ -243,9 +247,9 @@ app.post("/search", fb.validateFirebaseIdToken, os.search); var cdkGetMake = require("./server/cdk/cdk-get-makes"); app.post("/cdk/getvehicles", fb.validateFirebaseIdToken, cdkGetMake.default); -app.get("/", async function (req, res) { - res.status(200).send("Access Forbidden."); -}); +// app.get("/", async function (req, res) { +// res.status(200).send("Access Forbidden."); +// }); server.listen(port, (error) => { if (error) throw error; diff --git a/server/data/arms.js b/server/data/arms.js index ec5f337f8..382f2437b 100644 --- a/server/data/arms.js +++ b/server/data/arms.js @@ -50,7 +50,7 @@ async function getEntegralShopData() { } exports.default = async (req, res) => { - res.sendStatus(200); + res.sendStatus(401); return; //Query for the List of Bodyshop Clients. const job = req.body.event.data.new; diff --git a/server/data/autohouse.js b/server/data/autohouse.js index 5e32c81de..bce69ec0f 100644 --- a/server/data/autohouse.js +++ b/server/data/autohouse.js @@ -40,6 +40,14 @@ exports.default = async (req, res) => { const specificShopIds = req.body.bodyshopIds; // ['uuid] const { start, end, skipUpload } = req.body; //YYYY-MM-DD + if ( + !start || + !moment(start).isValid || + req.headers["x-imex-auth"] !== process.env.AUTOHOUSE_AUTH_TOKEN + ) { + res.sendStatus(401); + return; + } const allxmlsToUpload = []; const allErrors = []; try { @@ -772,7 +780,9 @@ const CreateCosts = (job) => { billTotalsByCostCenters[ job.bodyshop.md_responsibility_centers.defaults.costs.MAPA ] = 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 { billTotalsByCostCenters[ diff --git a/server/job/job-status-transition.js b/server/job/job-status-transition.js index 4b6a7db76..fd74a2ec3 100644 --- a/server/job/job-status-transition.js +++ b/server/job/job-status-transition.js @@ -17,7 +17,7 @@ require("dotenv").config({ }); async function StatusTransition(req, res) { if (req.headers["event-secret"] !== process.env.EVENT_SECRET) { - res.status(403).send("Unauthorized"); + res.status(401).send("Unauthorized"); return; } res.sendStatus(200); diff --git a/server/opensearch/os-handler.js b/server/opensearch/os-handler.js index 6bb2adcdc..016e9530e 100644 --- a/server/opensearch/os-handler.js +++ b/server/opensearch/os-handler.js @@ -45,6 +45,10 @@ const getClient = async () => { }; async function OpenSearchUpdateHandler(req, res) { + if (req.headers["event-secret"] !== process.env.EVENT_SECRET) { + res.status(401).send("Unauthorized"); + return; + } try { var osClient = await getClient(); // const osClient = new Client({ diff --git a/server/utils/utils.js b/server/utils/utils.js index 4587106be..ad3a06d24 100644 --- a/server/utils/utils.js +++ b/server/utils/utils.js @@ -1,3 +1,12 @@ exports.servertime = (req, res) => { res.status(200).send(new Date()); }; + +exports.jsrAuth = async (req, res) => { + res.send( + "Basic " + + Buffer.from( + `${process.env.JSR_USER}:${process.env.JSR_PASSWORD}` + ).toString("base64") + ); +}; From 7dc3c006287f1be1a78a3d80732589236ceae592 Mon Sep 17 00:00:00 2001 From: Patrick Fic Date: Thu, 4 May 2023 12:50:28 -0700 Subject: [PATCH 12/14] Revert "Merged in feature/IO-1722-job-size-color (pull request #746)" This reverts commit 7594f53e88ed44552bd2becec848bad81da37592, reversing changes made to b8619573422255051886b3419b264fc4a250ed25. --- ...ard-kanban-card-color-legend.component.jsx | 39 ------------------- ...production-board-kanban-card.component.jsx | 31 --------------- ...n-board-kanban.card-settings.component.jsx | 7 ---- .../production-board-kanban.component.jsx | 7 ---- .../shop-info.scheduling.component.jsx | 9 ----- client/src/translations/en_us/common.json | 7 +--- 6 files changed, 2 insertions(+), 98 deletions(-) delete mode 100644 client/src/components/production-board-kanban-card/production-board-kanban-card-color-legend.component.jsx diff --git a/client/src/components/production-board-kanban-card/production-board-kanban-card-color-legend.component.jsx b/client/src/components/production-board-kanban-card/production-board-kanban-card-color-legend.component.jsx deleted file mode 100644 index e9cc0f4e0..000000000 --- a/client/src/components/production-board-kanban-card/production-board-kanban-card-color-legend.component.jsx +++ /dev/null @@ -1,39 +0,0 @@ -import { Col, List, Space, Typography } from "antd"; -import React from "react"; -import { useTranslation } from "react-i18next"; - -const CardColorLegend = ({ bodyshop, cardSettings }) => { - const { t } = useTranslation(); - const data = bodyshop.ssbuckets.map((size) => ({ - label: size.label, - color: size.color?.hex ?? "white", - })); - - return ( - - {t("production.labels.legend")} - ( - - -
-
{item.label}
-
-
- )} - /> - - ); -}; - -export default CardColorLegend; diff --git a/client/src/components/production-board-kanban-card/production-board-kanban-card.component.jsx b/client/src/components/production-board-kanban-card/production-board-kanban-card.component.jsx index cb955a9c6..750204fb5 100644 --- a/client/src/components/production-board-kanban-card/production-board-kanban-card.component.jsx +++ b/client/src/components/production-board-kanban-card/production-board-kanban-card.component.jsx @@ -18,28 +18,6 @@ import moment from "moment"; import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; import JobPartsQueueCount from "../job-parts-queue-count/job-parts-queue-count.component"; -const cardColor = (ssbuckets, totalHrs) => { - const bucket = ssbuckets.filter( - (bucket) => - bucket.gte <= totalHrs && (!!bucket.lt ? bucket.lt > totalHrs : true) - )[0]; - - if (bucket.color) { - return bucket.color.hex; - } - - return ""; -}; - -function getContrastYIQ(hexColor) { - const r = parseInt(hexColor.substr(1, 2), 16); - const g = parseInt(hexColor.substr(3, 2), 16); - const b = parseInt(hexColor.substr(5, 2), 16); - const yiq = (r * 299 + g * 587 + b * 114) / 1000; - - return yiq >= 128 ? "black" : "white"; -} - export default function ProductionBoardCard( technician, card, @@ -76,19 +54,10 @@ export default function ProductionBoardCard( .isSame(moment(card.scheduled_completion), "day") && "production-completion-soon")); - const totalHrs = - card.labhrs.aggregate.sum.mod_lb_hrs + card.larhrs.aggregate.sum.mod_lb_hrs; - const bgColor = cardColor(bodyshop.ssbuckets, totalHrs); - return ( diff --git a/client/src/components/production-board-kanban/production-board-kanban.card-settings.component.jsx b/client/src/components/production-board-kanban/production-board-kanban.card-settings.component.jsx index bc7f83494..25c77e307 100644 --- a/client/src/components/production-board-kanban/production-board-kanban.card-settings.component.jsx +++ b/client/src/components/production-board-kanban/production-board-kanban.card-settings.component.jsx @@ -104,13 +104,6 @@ export default function ProductionBoardKanbanCardSettings({ >
- - - } /> - - {cardSettings.cardcolor && ( - - )} - - - - - - { diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json index 1819fadbe..f52178267 100644 --- a/client/src/translations/en_us/common.json +++ b/client/src/translations/en_us/common.json @@ -508,8 +508,7 @@ "id": "ID", "label": "Label", "lt": "Less than (hrs)", - "target": "Target (count)", - "color": "Job Color" + "target": "Target (count)" }, "state": "Province/State", "state_tax_id": "Provincial/State Tax ID (PST, QST)", @@ -2386,9 +2385,7 @@ "sublets": "Sublets", "totalhours": "Total Hrs ", "touchtime": "T/T", - "viewname": "View Name", - "legend": "Legend:", - "cardcolor": "Card Colors" + "viewname": "View Name" }, "successes": { "removed": "Job removed from production." From abe5fadeeaa705a19755b8e4c202da883bbedc91 Mon Sep 17 00:00:00 2001 From: Patrick Fic Date: Thu, 4 May 2023 13:25:45 -0700 Subject: [PATCH 13/14] Resolve health check --- client/src/utils/RenderTemplate.js | 2 +- server.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/client/src/utils/RenderTemplate.js b/client/src/utils/RenderTemplate.js index 21ad1e30b..f8b837817 100644 --- a/client/src/utils/RenderTemplate.js +++ b/client/src/utils/RenderTemplate.js @@ -27,7 +27,7 @@ export default async function RenderTemplate( jsreport.serverUrl = "https://reports3.test.imex.online/"; } const jsrAuth = (await axios.post("/utils/jsr")).data; - console.log("🚀 ~ file: RenderTemplate.js:30 ~ jsrAuth:", jsrAuth); + jsreport.headers["Authorization"] = jsrAuth; //Query assets that match the template name. Must be in format <>.query diff --git a/server.js b/server.js index 6a0c9e20a..e30d4ec07 100644 --- a/server.js +++ b/server.js @@ -247,9 +247,9 @@ app.post("/search", fb.validateFirebaseIdToken, os.search); var cdkGetMake = require("./server/cdk/cdk-get-makes"); app.post("/cdk/getvehicles", fb.validateFirebaseIdToken, cdkGetMake.default); -// app.get("/", async function (req, res) { -// res.status(200).send("Access Forbidden."); -// }); +app.get("/", async function (req, res) { + res.status(200).send("Access Forbidden."); +}); server.listen(port, (error) => { if (error) throw error; From 2586855f111553ae153d6e1116be7a69d0321bf7 Mon Sep 17 00:00:00 2001 From: Patrick Fic Date: Thu, 4 May 2023 13:33:16 -0700 Subject: [PATCH 14/14] Add firebase auth to JSR call. --- client/src/utils/RenderTemplate.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/src/utils/RenderTemplate.js b/client/src/utils/RenderTemplate.js index f8b837817..f103111cf 100644 --- a/client/src/utils/RenderTemplate.js +++ b/client/src/utils/RenderTemplate.js @@ -3,7 +3,7 @@ import { notification } from "antd"; import jsreport from "@jsreport/browser-client"; import _ from "lodash"; import moment from "moment"; -//import { auth } from "../firebase/firebase.utils"; +import { auth } from "../firebase/firebase.utils"; import { setEmailOptions } from "../redux/email/email.actions"; import { store } from "../redux/store"; import client from "../utils/GraphQLClient"; @@ -309,8 +309,8 @@ export const GenerateDocuments = async (templates) => { const fetchContextData = async (templateObject, jsrAuth) => { const bodyshop = store.getState().user.bodyshop; - // jsreport.headers["Authorization"] = - // "Bearer " + (await auth.currentUser.getIdToken()); + jsreport.headers["FirebaseAuthorization"] = + "Bearer " + (await auth.currentUser.getIdToken()); const folders = await cleanAxios.get(`${server}/odata/folders`, { headers: { Authorization: jsrAuth },