diff --git a/client/src/components/bill-enter-modal/bill-enter-modal.container.jsx b/client/src/components/bill-enter-modal/bill-enter-modal.container.jsx index 8073cc2f0..27dc0a1b0 100644 --- a/client/src/components/bill-enter-modal/bill-enter-modal.container.jsx +++ b/client/src/components/bill-enter-modal/bill-enter-modal.container.jsx @@ -25,6 +25,7 @@ import BillFormContainer from "../bill-form/bill-form.container"; import { CalculateBillTotal } from "../bill-form/bill-form.totals.utility"; import { handleUpload as handleLocalUpload } from "../documents-local-upload/documents-local-upload.utility"; import { handleUpload } from "../documents-upload/documents-upload.utility"; +import { handleUpload as handleUploadToImageProxy } from "../documents-upload-imgproxy/documents-upload-imgproxy.utility"; const mapStateToProps = createStructuredSelector({ billEnterModal: selectBillEnterModal, @@ -53,10 +54,10 @@ function BillEnterModalContainer({ billEnterModal, toggleModalVisible, bodyshop, const notification = useNotification(); const { - treatments: { Enhanced_Payroll } + treatments: { Enhanced_Payroll, Imgproxy } } = useSplitTreatments({ attributes: {}, - names: ["Enhanced_Payroll"], + names: ["Enhanced_Payroll", "Imgproxy"], splitKey: bodyshop.imexshopid }); @@ -298,20 +299,39 @@ function BillEnterModalContainer({ billEnterModal, toggleModalVisible, bodyshop, }); }); } else { - upload.forEach((u) => { - handleUpload( - { file: u.originFileObj }, - { - bodyshop: bodyshop, - uploaded_by: currentUser.email, - jobId: values.jobid, - billId: billId, - tagsArray: null, - callback: null - }, - notification - ); - }); + //Check if using Imgproxy or cloudinary + + if (Imgproxy.treatment === "on") { + upload.forEach((u) => { + handleUploadToImageProxy( + { file: u.originFileObj }, + { + bodyshop: bodyshop, + uploaded_by: currentUser.email, + jobId: values.jobid, + billId: billId, + tagsArray: null, + callback: null + }, + notification + ); + }); + } else { + upload.forEach((u) => { + handleUpload( + { file: u.originFileObj }, + { + bodyshop: bodyshop, + uploaded_by: currentUser.email, + jobId: values.jobid, + billId: billId, + tagsArray: null, + callback: null + }, + notification + ); + }); + } } } /////////////////////////// diff --git a/client/src/components/dashboard-components/scheduled-delivery-today/scheduled-delivery-today.component.jsx b/client/src/components/dashboard-components/scheduled-delivery-today/scheduled-delivery-today.component.jsx new file mode 100644 index 000000000..12c2f6569 --- /dev/null +++ b/client/src/components/dashboard-components/scheduled-delivery-today/scheduled-delivery-today.component.jsx @@ -0,0 +1,411 @@ +import { BranchesOutlined, ExclamationCircleFilled, PauseCircleOutlined } from "@ant-design/icons"; +import { Card, Space, Switch, Table, Tooltip, Typography } from "antd"; +import { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { Link } from "react-router-dom"; +import { TimeFormatter } from "../../../utils/DateFormatter"; +import { onlyUnique } from "../../../utils/arrayHelper"; +import dayjs from "../../../utils/day"; +import { alphaSort, dateSort } from "../../../utils/sorters"; +import useLocalStorage from "../../../utils/useLocalStorage"; +import ChatOpenButton from "../../chat-open-button/chat-open-button.component"; +import OwnerNameDisplay, { OwnerNameDisplayFunction } from "../../owner-name-display/owner-name-display.component"; +import DashboardRefreshRequired from "../refresh-required.component"; + +export default function DashboardScheduledDeliveryToday({ data, ...cardProps }) { + const { t } = useTranslation(); + const [state, setState] = useState({ + sortedInfo: {}, + filteredInfo: {} + }); + const [isTvModeScheduledDelivery, setIsTvModeScheduledDelivery] = useLocalStorage("isTvModeScheduledDelivery", false); + if (!data) return null; + if (!data.scheduled_delivery_today) return ; + + const scheduledDeliveryToday = data.scheduled_delivery_today.map((item) => { + const joblines_body = item.joblines + ? item.joblines.filter((l) => l.mod_lbr_ty !== "LAR").reduce((acc, val) => acc + val.mod_lb_hrs, 0) + : 0; + const joblines_ref = item.joblines + ? item.joblines.filter((l) => l.mod_lbr_ty === "LAR").reduce((acc, val) => acc + val.mod_lb_hrs, 0) + : 0; + return { + ...item, + joblines_body, + joblines_ref + }; + }); + + const tvFontSize = 18; + const tvFontWeight = "bold"; + + const tvColumns = [ + { + title: t("jobs.fields.scheduled_delivery"), + dataIndex: "scheduled_delivery", + key: "scheduled_delivery", + ellipsis: true, + sorter: (a, b) => dateSort(a.scheduled_delivery, b.scheduled_delivery), + sortOrder: state.sortedInfo.columnKey === "scheduled_delivery" && state.sortedInfo.order, + render: (text, record) => ( + + {record.scheduled_delivery} + + ) + }, + { + title: t("jobs.fields.ro_number"), + dataIndex: "ro_number", + key: "ro_number", + sorter: (a, b) => alphaSort(a.ro_number, b.ro_number), + sortOrder: state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, + render: (text, record) => ( + e.stopPropagation()}> + + + {record.ro_number || t("general.labels.na")} + {record.production_vars && record.production_vars.alert ? ( + + ) : null} + {record.suspended && } + {record.iouparent && ( + + + + )} + + + + ) + }, + { + title: t("jobs.fields.owner"), + dataIndex: "owner", + key: "owner", + ellipsis: true, + sorter: (a, b) => alphaSort(OwnerNameDisplayFunction(a), OwnerNameDisplayFunction(b)), + sortOrder: state.sortedInfo.columnKey === "owner" && state.sortedInfo.order, + render: (text, record) => { + return record.ownerid ? ( + e.stopPropagation()}> + + + + + ) : ( + + + + ); + } + }, + { + title: t("jobs.fields.vehicle"), + dataIndex: "vehicle", + key: "vehicle", + ellipsis: true, + sorter: (a, b) => + alphaSort( + `${a.v_model_yr || ""} ${a.v_make_desc || ""} ${a.v_model_desc || ""}`, + `${b.v_model_yr || ""} ${b.v_make_desc || ""} ${b.v_model_desc || ""}` + ), + sortOrder: state.sortedInfo.columnKey === "vehicle" && state.sortedInfo.order, + render: (text, record) => { + return record.vehicleid ? ( + e.stopPropagation()}> + + {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${record.v_model_desc || ""}`} + + + ) : ( + {`${ + record.v_model_yr || "" + } ${record.v_make_desc || ""} ${record.v_model_desc || ""}`} + ); + } + }, + { + title: t("appointments.fields.alt_transport"), + dataIndex: "alt_transport", + key: "alt_transport", + ellipsis: true, + sorter: (a, b) => alphaSort(a.alt_transport, b.alt_transport), + sortOrder: state.sortedInfo.columnKey === "alt_transport" && state.sortedInfo.order, + filters: + (scheduledDeliveryToday && + scheduledDeliveryToday + .map((j) => j.alt_transport) + .filter(onlyUnique) + .map((s) => { + return { + text: s || t("dashboard.errors.atp"), + value: [s] + }; + }) + .sort((a, b) => alphaSort(a.text, b.text))) || + [], + onFilter: (value, record) => value.includes(record.alt_transport), + render: (text, record) => ( + {record.alt_transport} + ) + }, + { + title: t("jobs.fields.status"), + dataIndex: "status", + key: "status", + ellipsis: true, + sorter: (a, b) => alphaSort(a.status, b.status), + sortOrder: state.sortedInfo.columnKey === "status" && state.sortedInfo.order, + filters: + (scheduledDeliveryToday && + scheduledDeliveryToday + .map((j) => j.status) + .filter(onlyUnique) + .map((s) => { + return { + text: s || t("dashboard.errors.status"), + value: [s] + }; + }) + .sort((a, b) => alphaSort(a.text, b.text))) || + [], + onFilter: (value, record) => value.includes(record.status), + render: (text, record) => {record.status} + }, + { + title: t("jobs.fields.lab"), + dataIndex: "joblines_body", + key: "joblines_body", + sorter: (a, b) => a.joblines_body - b.joblines_body, + sortOrder: state.sortedInfo.columnKey === "joblines_body" && state.sortedInfo.order, + align: "right", + render: (text, record) => ( + {record.joblines_body.toFixed(1)} + ) + }, + { + title: t("jobs.fields.lar"), + dataIndex: "joblines_ref", + key: "joblines_ref", + sorter: (a, b) => a.joblines_ref - b.joblines_ref, + sortOrder: state.sortedInfo.columnKey === "joblines_ref" && state.sortedInfo.order, + align: "right", + render: (text, record) => ( + {record.joblines_ref.toFixed(1)} + ) + } + ]; + + const columns = [ + { + title: t("jobs.fields.scheduled_delivery"), + dataIndex: "scheduled_delivery", + key: "scheduled_delivery", + ellipsis: true, + sorter: (a, b) => dateSort(a.scheduled_delivery, b.scheduled_delivery), + sortOrder: state.sortedInfo.columnKey === "scheduled_delivery" && state.sortedInfo.order, + render: (text, record) => {record.scheduled_delivery} + }, + { + title: t("jobs.fields.ro_number"), + dataIndex: "ro_number", + key: "ro_number", + sorter: (a, b) => alphaSort(a.ro_number, b.ro_number), + sortOrder: state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, + render: (text, record) => ( + e.stopPropagation()}> + + {record.ro_number || t("general.labels.na")} + {record.production_vars && record.production_vars.alert ? ( + + ) : null} + {record.suspended && } + {record.iouparent && ( + + + + )} + + + ) + }, + { + title: t("jobs.fields.owner"), + dataIndex: "owner", + key: "owner", + ellipsis: true, + sorter: (a, b) => alphaSort(OwnerNameDisplayFunction(a), OwnerNameDisplayFunction(b)), + sortOrder: state.sortedInfo.columnKey === "owner" && state.sortedInfo.order, + render: (text, record) => { + return record.ownerid ? ( + e.stopPropagation()}> + + + ) : ( + + + + ); + } + }, + { + title: t("dashboard.labels.phone"), + dataIndex: "ownr_ph", + key: "ownr_ph", + ellipsis: true, + responsive: ["md"], + render: (text, record) => ( + + + + + + ) + }, + { + title: t("jobs.fields.ownr_ea"), + dataIndex: "ownr_ea", + key: "ownr_ea", + ellipsis: true, + responsive: ["md"], + render: (text, record) => {record.ownr_ea} + }, + { + title: t("jobs.fields.vehicle"), + dataIndex: "vehicle", + key: "vehicle", + ellipsis: true, + sorter: (a, b) => + alphaSort( + `${a.v_model_yr || ""} ${a.v_make_desc || ""} ${a.v_model_desc || ""}`, + `${b.v_model_yr || ""} ${b.v_make_desc || ""} ${b.v_model_desc || ""}` + ), + sortOrder: state.sortedInfo.columnKey === "vehicle" && state.sortedInfo.order, + render: (text, record) => { + return record.vehicleid ? ( + e.stopPropagation()}> + {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${record.v_model_desc || ""}`} + + ) : ( + {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${record.v_model_desc || ""}`} + ); + } + }, + { + title: t("jobs.fields.ins_co_nm"), + dataIndex: "ins_co_nm", + key: "ins_co_nm", + ellipsis: true, + responsive: ["md"], + sorter: (a, b) => alphaSort(a.ins_co_nm, b.ins_co_nm), + sortOrder: state.sortedInfo.columnKey === "ins_co_nm" && state.sortedInfo.order, + filters: + (scheduledDeliveryToday && + scheduledDeliveryToday + .map((j) => j.ins_co_nm) + .filter(onlyUnique) + .map((s) => { + return { + text: s || t("dashboard.errors.insco"), + value: [s] + }; + }) + .sort((a, b) => alphaSort(a.text, b.text))) || + [], + onFilter: (value, record) => value.includes(record.ins_co_nm) + }, + { + title: t("appointments.fields.alt_transport"), + dataIndex: "alt_transport", + key: "alt_transport", + ellipsis: true, + sorter: (a, b) => alphaSort(a.alt_transport, b.alt_transport), + sortOrder: state.sortedInfo.columnKey === "alt_transport" && state.sortedInfo.order, + filters: + (scheduledDeliveryToday && + scheduledDeliveryToday + .map((j) => j.alt_transport) + .filter(onlyUnique) + .map((s) => { + return { + text: s || t("dashboard.errors.atp"), + value: [s] + }; + }) + .sort((a, b) => alphaSort(a.text, b.text))) || + [], + onFilter: (value, record) => value.includes(record.alt_transport) + } + ]; + + const handleTableChange = (pagination, filters, sorter) => { + setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); + }; + + return ( + + {t("general.labels.tvmode")} + setIsTvModeScheduledDelivery(!isTvModeScheduledDelivery)} + defaultChecked={isTvModeScheduledDelivery} + /> + + } + {...cardProps} + > +
+ + + + ); +} + +export const DashboardScheduledDeliveryTodayGql = ` + scheduled_delivery_today: jobs(where: { + date_invoiced: {_is_null: true}, + ro_number: {_is_null: false}, + voided: {_eq: false}, + scheduled_delivery: {_gte: "${dayjs().startOf("day").toISOString()}", + _lte: "${dayjs().endOf("day").toISOString()}"}}) { + alt_transport + clm_no + jobid: id + joblines(where: {removed: {_eq: false}}) { + mod_lb_hrs + mod_lbr_ty + } + ins_co_nm + iouparent + ownerid + ownr_co_nm + ownr_ea + ownr_fn + ownr_ln + ownr_ph1 + ownr_ph2 + production_vars + ro_number + scheduled_delivery + status + suspended + v_make_desc + v_model_desc + v_model_yr + v_vin + vehicleid + } +`; diff --git a/client/src/components/dashboard-components/scheduled-in-today/scheduled-in-today.component.jsx b/client/src/components/dashboard-components/scheduled-in-today/scheduled-in-today.component.jsx index d3caeaca2..05d76983e 100644 --- a/client/src/components/dashboard-components/scheduled-in-today/scheduled-in-today.component.jsx +++ b/client/src/components/dashboard-components/scheduled-in-today/scheduled-in-today.component.jsx @@ -1,11 +1,11 @@ import { BranchesOutlined, ExclamationCircleFilled, PauseCircleOutlined } from "@ant-design/icons"; import { Card, Space, Switch, Table, Tooltip, Typography } from "antd"; -import dayjs from "../../../utils/day"; -import React, { useState } from "react"; +import { useState } from "react"; import { useTranslation } from "react-i18next"; import { Link } from "react-router-dom"; import { TimeFormatter } from "../../../utils/DateFormatter"; import { onlyUnique } from "../../../utils/arrayHelper"; +import dayjs from "../../../utils/day"; import { alphaSort, dateSort } from "../../../utils/sorters"; import useLocalStorage from "../../../utils/useLocalStorage"; import ChatOpenButton from "../../chat-open-button/chat-open-button.component"; @@ -169,7 +169,7 @@ export default function DashboardScheduledInToday({ data, ...cardProps }) { .filter(onlyUnique) .map((s) => { return { - text: s || "No Alt. Transport", + text: s || t("dashboard.errors.atp"), value: [s] }; }) @@ -313,7 +313,7 @@ export default function DashboardScheduledInToday({ data, ...cardProps }) { .filter(onlyUnique) .map((s) => { return { - text: s || "No Ins. Co.*", + text: s || t("dashboard.errors.insco"), value: [s] }; }) @@ -335,7 +335,7 @@ export default function DashboardScheduledInToday({ data, ...cardProps }) { .filter(onlyUnique) .map((s) => { return { - text: s || "No Alt. Transport", + text: s || t("dashboard.errors.atp"), value: [s] }; }) diff --git a/client/src/components/dashboard-components/scheduled-out-today/scheduled-out-today.component.jsx b/client/src/components/dashboard-components/scheduled-out-today/scheduled-out-today.component.jsx index f83e2df5d..fdfcc53a5 100644 --- a/client/src/components/dashboard-components/scheduled-out-today/scheduled-out-today.component.jsx +++ b/client/src/components/dashboard-components/scheduled-out-today/scheduled-out-today.component.jsx @@ -1,11 +1,11 @@ import { BranchesOutlined, ExclamationCircleFilled, PauseCircleOutlined } from "@ant-design/icons"; import { Card, Space, Switch, Table, Tooltip, Typography } from "antd"; -import dayjs from "../../../utils/day"; -import React, { useState } from "react"; +import { useState } from "react"; import { useTranslation } from "react-i18next"; import { Link } from "react-router-dom"; import { TimeFormatter } from "../../../utils/DateFormatter"; import { onlyUnique } from "../../../utils/arrayHelper"; +import dayjs from "../../../utils/day"; import { alphaSort, dateSort } from "../../../utils/sorters"; import useLocalStorage from "../../../utils/useLocalStorage"; import ChatOpenButton from "../../chat-open-button/chat-open-button.component"; @@ -138,7 +138,7 @@ export default function DashboardScheduledOutToday({ data, ...cardProps }) { .filter(onlyUnique) .map((s) => { return { - text: s || "No Alt. Transport*", + text: s || t("dashboard.errors.atp"), value: [s] }; }) @@ -154,7 +154,7 @@ export default function DashboardScheduledOutToday({ data, ...cardProps }) { dataIndex: "status", key: "status", ellipsis: true, - sorter: (a, b) => alphaSort(a.alt_transport, b.alt_transport), + sorter: (a, b) => alphaSort(a.status, b.status), sortOrder: state.sortedInfo.columnKey === "status" && state.sortedInfo.order, filters: (scheduledOutToday && @@ -163,7 +163,7 @@ export default function DashboardScheduledOutToday({ data, ...cardProps }) { .filter(onlyUnique) .map((s) => { return { - text: s || "No Status*", + text: s || t("dashboard.errors.status"), value: [s] }; }) @@ -306,7 +306,7 @@ export default function DashboardScheduledOutToday({ data, ...cardProps }) { .filter(onlyUnique) .map((s) => { return { - text: s || "No Ins. Co.*", + text: s || t("dashboard.errors.insco"), value: [s] }; }) @@ -328,7 +328,7 @@ export default function DashboardScheduledOutToday({ data, ...cardProps }) { .filter(onlyUnique) .map((s) => { return { - text: s || "No Alt. Transport*", + text: s || t("dashboard.errors.atp"), value: [s] }; }) diff --git a/client/src/components/dashboard-grid/componentList.js b/client/src/components/dashboard-grid/componentList.js index 015d3509e..5bd866927 100644 --- a/client/src/components/dashboard-grid/componentList.js +++ b/client/src/components/dashboard-grid/componentList.js @@ -1,30 +1,33 @@ import i18next from "i18next"; -import DashboardTotalProductionDollars from "../dashboard-components/total-production-dollars/total-production-dollars.component.jsx"; -import { - DashboardTotalProductionHours, - DashboardTotalProductionHoursGql -} from "../dashboard-components/total-production-hours/total-production-hours.component.jsx"; -import DashboardProjectedMonthlySales, { - DashboardProjectedMonthlySalesGql -} from "../dashboard-components/pojected-monthly-sales/projected-monthly-sales.component.jsx"; -import DashboardMonthlyRevenueGraph, { - DashboardMonthlyRevenueGraphGql -} from "../dashboard-components/monthly-revenue-graph/monthly-revenue-graph.component.jsx"; -import DashboardMonthlyJobCosting from "../dashboard-components/monthly-job-costing/monthly-job-costing.component.jsx"; -import DashboardMonthlyPartsSales from "../dashboard-components/monthly-parts-sales/monthly-parts-sales.component.jsx"; -import DashboardMonthlyLaborSales from "../dashboard-components/monthly-labor-sales/monthly-labor-sales.component.jsx"; +import JobLifecycleDashboardComponent, { + JobLifecycleDashboardGQL +} from "../dashboard-components/job-lifecycle/job-lifecycle-dashboard.component.jsx"; import DashboardMonthlyEmployeeEfficiency, { DashboardMonthlyEmployeeEfficiencyGql } from "../dashboard-components/monthly-employee-efficiency/monthly-employee-efficiency.component.jsx"; +import DashboardMonthlyJobCosting from "../dashboard-components/monthly-job-costing/monthly-job-costing.component.jsx"; +import DashboardMonthlyLaborSales from "../dashboard-components/monthly-labor-sales/monthly-labor-sales.component.jsx"; +import DashboardMonthlyPartsSales from "../dashboard-components/monthly-parts-sales/monthly-parts-sales.component.jsx"; +import DashboardMonthlyRevenueGraph, { + DashboardMonthlyRevenueGraphGql +} from "../dashboard-components/monthly-revenue-graph/monthly-revenue-graph.component.jsx"; +import DashboardProjectedMonthlySales, { + DashboardProjectedMonthlySalesGql +} from "../dashboard-components/pojected-monthly-sales/projected-monthly-sales.component.jsx"; +import DashboardScheduledDeliveryToday, { + DashboardScheduledDeliveryTodayGql +} from "../dashboard-components/scheduled-delivery-today/scheduled-delivery-today.component.jsx"; import DashboardScheduledInToday, { DashboardScheduledInTodayGql } from "../dashboard-components/scheduled-in-today/scheduled-in-today.component.jsx"; import DashboardScheduledOutToday, { DashboardScheduledOutTodayGql } from "../dashboard-components/scheduled-out-today/scheduled-out-today.component.jsx"; -import JobLifecycleDashboardComponent, { - JobLifecycleDashboardGQL -} from "../dashboard-components/job-lifecycle/job-lifecycle-dashboard.component.jsx"; +import DashboardTotalProductionDollars from "../dashboard-components/total-production-dollars/total-production-dollars.component.jsx"; +import { + DashboardTotalProductionHours, + DashboardTotalProductionHoursGql +} from "../dashboard-components/total-production-hours/total-production-hours.component.jsx"; const componentList = { ProductionDollars: { @@ -118,6 +121,15 @@ const componentList = { w: 10, h: 3 }, + ScheduleDeliveryToday: { + label: i18next.t("dashboard.titles.scheduleddeliverytoday"), + component: DashboardScheduledDeliveryToday, + gqlFragment: DashboardScheduledDeliveryTodayGql, + minW: 6, + minH: 2, + w: 10, + h: 3 + }, JobLifecycle: { label: i18next.t("dashboard.titles.joblifecycle"), component: JobLifecycleDashboardComponent, diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json index b56a6e5ee..6ddb4b631 100644 --- a/client/src/translations/en_us/common.json +++ b/client/src/translations/en_us/common.json @@ -975,7 +975,10 @@ "addcomponent": "Add Component" }, "errors": { + "atp": "No Alt. Transport*", + "insco": "No Ins. Co.*", "refreshrequired": "You must refresh the dashboard data to see this component.", + "status": "No Status*", "updatinglayout": "Error saving updated layout {{message}}" }, "labels": { @@ -998,6 +1001,8 @@ "productiondollars": "Total Dollars in Production", "productionhours": "Total Hours in Production", "projectedmonthlysales": "Projected Monthly Sales", + "scheduleddeliverydate": "Scheduled Delivery Date: {{date}}", + "scheduleddeliverytoday": "Scheduled Delivery Today", "scheduledindate": "Scheduled In Today: {{date}}", "scheduledintoday": "Scheduled In Today", "scheduledoutdate": "Scheduled Out Today: {{date}}", diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json index 15c9cabbc..b67df8cd7 100644 --- a/client/src/translations/es/common.json +++ b/client/src/translations/es/common.json @@ -975,7 +975,10 @@ "addcomponent": "" }, "errors": { + "atp": "", + "insco": "", "refreshrequired": "", + "status": "", "updatinglayout": "" }, "labels": { @@ -998,6 +1001,8 @@ "productiondollars": "", "productionhours": "", "projectedmonthlysales": "", + "scheduleddeliverydate": "", + "scheduleddeliverytoday": "", "scheduledindate": "", "scheduledintoday": "", "scheduledoutdate": "", diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json index 65c20f2da..1302c4606 100644 --- a/client/src/translations/fr/common.json +++ b/client/src/translations/fr/common.json @@ -975,7 +975,10 @@ "addcomponent": "" }, "errors": { + "atp": "", + "insco": "", "refreshrequired": "", + "status": "", "updatinglayout": "" }, "labels": { @@ -998,6 +1001,8 @@ "productiondollars": "", "productionhours": "", "projectedmonthlysales": "", + "scheduleddeliverydate": "", + "scheduleddeliverytoday": "", "scheduledindate": "", "scheduledintoday": "", "scheduledoutdate": "",