File diff suppressed because it is too large
Load Diff
@@ -52,6 +52,9 @@ export default function BillCmdReturnsTableComponent({ form, returnLoading, retu
|
|||||||
{fields.map((field, index) => (
|
{fields.map((field, index) => (
|
||||||
<tr key={field.key}>
|
<tr key={field.key}>
|
||||||
<td>
|
<td>
|
||||||
|
<Form.Item hidden key={`${index}id`} name={[field.name, "id"]}>
|
||||||
|
<ReadOnlyFormItemComponent />
|
||||||
|
</Form.Item>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
// label={t("joblines.fields.line_desc")}
|
// label={t("joblines.fields.line_desc")}
|
||||||
key={`${index}line_desc`}
|
key={`${index}line_desc`}
|
||||||
|
|||||||
@@ -373,9 +373,11 @@ export function BillFormComponent({
|
|||||||
"local_tax_rate"
|
"local_tax_rate"
|
||||||
]);
|
]);
|
||||||
let totals;
|
let totals;
|
||||||
if (!!values.total && !!values.billlines && values.billlines.length > 0)
|
if (!!values.total && !!values.billlines && values.billlines.length > 0) {
|
||||||
totals = CalculateBillTotal(values);
|
totals = CalculateBillTotal(values);
|
||||||
if (totals)
|
}
|
||||||
|
|
||||||
|
if (totals) {
|
||||||
return (
|
return (
|
||||||
// TODO: Align is not correct
|
// TODO: Align is not correct
|
||||||
// eslint-disable-next-line react/no-unknown-property
|
// eslint-disable-next-line react/no-unknown-property
|
||||||
@@ -414,7 +416,7 @@ export function BillFormComponent({
|
|||||||
<Statistic
|
<Statistic
|
||||||
title={t("bills.labels.discrepancy")}
|
title={t("bills.labels.discrepancy")}
|
||||||
styles={{
|
styles={{
|
||||||
value: {
|
content: {
|
||||||
color: totals.discrepancy.getAmount() === 0 ? "green" : "red"
|
color: totals.discrepancy.getAmount() === 0 ? "green" : "red"
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
@@ -427,6 +429,7 @@ export function BillFormComponent({
|
|||||||
) : null}
|
) : null}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
}
|
||||||
return null;
|
return null;
|
||||||
}}
|
}}
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
|
|||||||
@@ -90,6 +90,7 @@ export function BillEnterModalLinesComponent({
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Only fill actual_cost when the user forward-tabs out of Retail (actual_price)
|
||||||
const autofillActualCost = (index) => {
|
const autofillActualCost = (index) => {
|
||||||
Promise.resolve().then(() => {
|
Promise.resolve().then(() => {
|
||||||
const retailRaw = form.getFieldValue(["billlines", index, "actual_price"]);
|
const retailRaw = form.getFieldValue(["billlines", index, "actual_price"]);
|
||||||
@@ -164,10 +165,9 @@ export function BillEnterModalLinesComponent({
|
|||||||
}}
|
}}
|
||||||
allowRemoved={form.getFieldValue("is_credit_memo") || false}
|
allowRemoved={form.getFieldValue("is_credit_memo") || false}
|
||||||
onSelect={(value, opt) => {
|
onSelect={(value, opt) => {
|
||||||
const d = normalizeDiscount(discount);
|
// IMPORTANT:
|
||||||
const retail = Number(opt.cost);
|
// Do NOT autofill actual_cost here. It should only fill when the user forward-tabs
|
||||||
const computedActual = Number.isFinite(retail) ? round2(retail * (1 - d)) : null;
|
// from Retail (actual_price) -> Actual Cost (actual_cost).
|
||||||
|
|
||||||
setFieldsValue({
|
setFieldsValue({
|
||||||
billlines: (getFieldValue("billlines") || []).map((item, idx) => {
|
billlines: (getFieldValue("billlines") || []).map((item, idx) => {
|
||||||
if (idx !== index) return item;
|
if (idx !== index) return item;
|
||||||
@@ -178,7 +178,7 @@ export function BillEnterModalLinesComponent({
|
|||||||
quantity: opt.part_qty || 1,
|
quantity: opt.part_qty || 1,
|
||||||
actual_price: opt.cost,
|
actual_price: opt.cost,
|
||||||
original_actual_price: opt.cost,
|
original_actual_price: opt.cost,
|
||||||
actual_cost: isBlank(item.actual_cost) ? computedActual : item.actual_cost,
|
// actual_cost intentionally untouched here
|
||||||
cost_center: opt.part_type
|
cost_center: opt.part_type
|
||||||
? bodyshopHasDmsKey(bodyshop)
|
? bodyshopHasDmsKey(bodyshop)
|
||||||
? opt.part_type !== "PAE"
|
? opt.part_type !== "PAE"
|
||||||
@@ -251,9 +251,9 @@ export function BillEnterModalLinesComponent({
|
|||||||
<CurrencyInput
|
<CurrencyInput
|
||||||
min={0}
|
min={0}
|
||||||
disabled={disabled}
|
disabled={disabled}
|
||||||
onBlur={() => autofillActualCost(index)}
|
// NOTE: Autofill should only happen on forward Tab out of Retail
|
||||||
onKeyDown={(e) => {
|
onKeyDown={(e) => {
|
||||||
if (e.key === "Tab") autofillActualCost(index);
|
if (e.key === "Tab" && !e.shiftKey) autofillActualCost(index);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
),
|
),
|
||||||
@@ -329,7 +329,7 @@ export function BillEnterModalLinesComponent({
|
|||||||
disabled={disabled}
|
disabled={disabled}
|
||||||
controls={false}
|
controls={false}
|
||||||
style={{ width: "100%", height: CONTROL_HEIGHT }}
|
style={{ width: "100%", height: CONTROL_HEIGHT }}
|
||||||
onFocus={() => autofillActualCost(index)}
|
// NOTE: No auto-fill on focus/blur; only triggered from Retail on Tab
|
||||||
/>
|
/>
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
</div>
|
</div>
|
||||||
@@ -517,7 +517,11 @@ export function BillEnterModalLinesComponent({
|
|||||||
formItemProps: (field) => ({
|
formItemProps: (field) => ({
|
||||||
key: `${field.name}fedtax`,
|
key: `${field.name}fedtax`,
|
||||||
valuePropName: "checked",
|
valuePropName: "checked",
|
||||||
name: [field.name, "applicable_taxes", "federal"]
|
name: [field.name, "applicable_taxes", "federal"],
|
||||||
|
initialValue: InstanceRenderManager({
|
||||||
|
imex: true,
|
||||||
|
rome: false
|
||||||
|
})
|
||||||
}),
|
}),
|
||||||
formInput: () => <Switch disabled={disabled} />
|
formInput: () => <Switch disabled={disabled} />
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,7 +57,6 @@ const CardPaymentModalComponent = ({
|
|||||||
QUERY_RO_AND_OWNER_BY_JOB_PKS,
|
QUERY_RO_AND_OWNER_BY_JOB_PKS,
|
||||||
{
|
{
|
||||||
fetchPolicy: "network-only",
|
fetchPolicy: "network-only",
|
||||||
notifyOnNetworkStatusChange: true
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -47,7 +47,6 @@ export function ChatPopupComponent({ chatVisible, selectedConversation, toggleCh
|
|||||||
const [getConversations, { loading, data, refetch, called }] = useLazyQuery(CONVERSATION_LIST_QUERY, {
|
const [getConversations, { loading, data, refetch, called }] = useLazyQuery(CONVERSATION_LIST_QUERY, {
|
||||||
fetchPolicy: "network-only",
|
fetchPolicy: "network-only",
|
||||||
nextFetchPolicy: "network-only",
|
nextFetchPolicy: "network-only",
|
||||||
notifyOnNetworkStatusChange: true,
|
|
||||||
...(pollInterval > 0 ? { pollInterval } : {})
|
...(pollInterval > 0 ? { pollInterval } : {})
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ export function DashboardTotalProductionHours({ bodyshop, data, ...cardProps })
|
|||||||
<Statistic
|
<Statistic
|
||||||
title={t("dashboard.labels.prodhrs")}
|
title={t("dashboard.labels.prodhrs")}
|
||||||
value={hours.total.toFixed(1)}
|
value={hours.total.toFixed(1)}
|
||||||
styles={{ value: { color: aboveTargetHours ? "green" : "red" } }}
|
styles={{ content: { color: aboveTargetHours ? "green" : "red" } }}
|
||||||
/>
|
/>
|
||||||
</Space>
|
</Space>
|
||||||
</Card>
|
</Card>
|
||||||
|
|||||||
@@ -404,7 +404,7 @@ export default function CdkLikePostForm({ bodyshop, socket, job, logsRef, mode,
|
|||||||
<Typography.Title>=</Typography.Title>
|
<Typography.Title>=</Typography.Title>
|
||||||
<Statistic
|
<Statistic
|
||||||
title={t("jobs.labels.dms.notallocated")}
|
title={t("jobs.labels.dms.notallocated")}
|
||||||
styles={{ value: { color: discrep.getAmount() === 0 ? "green" : "red" } }}
|
styles={{ content: { color: discrep.getAmount() === 0 ? "green" : "red" } }}
|
||||||
value={discrep.toFormat()}
|
value={discrep.toFormat()}
|
||||||
/>
|
/>
|
||||||
<Button disabled={disablePost} htmlType="submit">
|
<Button disabled={disablePost} htmlType="submit">
|
||||||
|
|||||||
@@ -14,8 +14,11 @@ export default function GlobalSearch() {
|
|||||||
const [callSearch, { loading, error, data }] = useLazyQuery(GLOBAL_SEARCH_QUERY);
|
const [callSearch, { loading, error, data }] = useLazyQuery(GLOBAL_SEARCH_QUERY);
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
const executeSearch = (v) => {
|
const executeSearch = (variables) => {
|
||||||
if (v && v.variables.search && v.variables.search !== "" && v.variables.search.length >= 3) callSearch(v);
|
if (variables?.search !== "" && variables?.search?.length >= 3)
|
||||||
|
callSearch({
|
||||||
|
variables
|
||||||
|
});
|
||||||
};
|
};
|
||||||
const debouncedExecuteSearch = _.debounce(executeSearch, 750);
|
const debouncedExecuteSearch = _.debounce(executeSearch, 750);
|
||||||
|
|
||||||
@@ -157,7 +160,9 @@ export default function GlobalSearch() {
|
|||||||
return (
|
return (
|
||||||
<AutoComplete
|
<AutoComplete
|
||||||
options={options}
|
options={options}
|
||||||
onSearch={handleSearch}
|
showSearch={{
|
||||||
|
onSearch: handleSearch
|
||||||
|
}}
|
||||||
defaultActiveFirstOption
|
defaultActiveFirstOption
|
||||||
onKeyDown={(e) => {
|
onKeyDown={(e) => {
|
||||||
if (e.key !== "Enter") return;
|
if (e.key !== "Enter") return;
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ export function Jobd3RdPartyModal({ bodyshop, jobId, job, technician }) {
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Button onClick={showModal}>{t("printcenter.jobs.3rdpartypayer")}</Button>
|
<Button onClick={showModal}>{t("printcenter.jobs.3rdpartypayer")}</Button>
|
||||||
<Modal open={isModalVisible} onOk={handleOk} onCancel={handleCancel}>
|
<Modal open={isModalVisible} onOk={handleOk} onCancel={handleCancel} getContainer={() => document.body}>
|
||||||
<Form onFinish={handleFinish} autoComplete={"off"} layout="vertical" form={form}>
|
<Form onFinish={handleFinish} autoComplete={"off"} layout="vertical" form={form}>
|
||||||
<Form.Item label={t("bills.fields.vendor")} name="vendorid">
|
<Form.Item label={t("bills.fields.vendor")} name="vendorid">
|
||||||
<VendorSearchSelect options={VendorAutoCompleteData?.vendors} onSelect={handleVendorSelect} />
|
<VendorSearchSelect options={VendorAutoCompleteData?.vendors} onSelect={handleVendorSelect} />
|
||||||
|
|||||||
@@ -1,29 +1,65 @@
|
|||||||
import { useMemo } from "react";
|
import { useMemo } from "react";
|
||||||
import { Tag, Tooltip } from "antd";
|
import { Tooltip } from "antd";
|
||||||
import { connect } from "react-redux";
|
import { connect } from "react-redux";
|
||||||
import { createStructuredSelector } from "reselect";
|
import { createStructuredSelector } from "reselect";
|
||||||
import { selectBodyshop } from "../../redux/user/user.selectors";
|
import { selectBodyshop } from "../../redux/user/user.selectors";
|
||||||
import { useTranslation } from "react-i18next";
|
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
bodyshop: selectBodyshop
|
bodyshop: selectBodyshop
|
||||||
});
|
});
|
||||||
const mapDispatchToProps = () => ({
|
const mapDispatchToProps = () => ({});
|
||||||
//setUserLanguage: language => dispatch(setUserLanguage(language))
|
|
||||||
});
|
const colorMap = {
|
||||||
|
gray: { bg: "#fafafa", border: "#d9d9d9", text: "#000000" },
|
||||||
|
gold: { bg: "#fffbe6", border: "#ffe58f", text: "#d48806" },
|
||||||
|
red: { bg: "#fff1f0", border: "#ffccc7", text: "#cf1322" },
|
||||||
|
blue: { bg: "#e6f7ff", border: "#91d5ff", text: "#0958d9" },
|
||||||
|
green: { bg: "#f6ffed", border: "#b7eb8f", text: "#389e0d" },
|
||||||
|
orange: { bg: "#fff7e6", border: "#ffd591", text: "#d46b08" }
|
||||||
|
};
|
||||||
|
|
||||||
|
function CompactTag({ color = "gray", children, tooltip = "" }) {
|
||||||
|
const colors = colorMap[color] || colorMap.gray;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<span
|
||||||
|
style={{
|
||||||
|
display: "inline-flex",
|
||||||
|
alignItems: "center",
|
||||||
|
justifyContent: "center",
|
||||||
|
padding: "0 2px",
|
||||||
|
fontSize: "12px",
|
||||||
|
lineHeight: "20px",
|
||||||
|
backgroundColor: colors.bg,
|
||||||
|
border: `1px solid ${colors.border}`,
|
||||||
|
borderRadius: "2px",
|
||||||
|
color: colors.text,
|
||||||
|
minWidth: "24px",
|
||||||
|
textAlign: "center"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Tooltip title={tooltip}>{children}</Tooltip>
|
||||||
|
</span>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
export default connect(mapStateToProps, mapDispatchToProps)(JobPartsQueueCount);
|
export default connect(mapStateToProps, mapDispatchToProps)(JobPartsQueueCount);
|
||||||
|
|
||||||
export function JobPartsQueueCount({ bodyshop, parts }) {
|
export function JobPartsQueueCount({ bodyshop, parts }) {
|
||||||
const { t } = useTranslation();
|
|
||||||
const partsStatus = useMemo(() => {
|
const partsStatus = useMemo(() => {
|
||||||
if (!parts) return null;
|
if (!parts) return null;
|
||||||
|
|
||||||
const statusKeys = ["default_bo", "default_ordered", "default_received", "default_returned"];
|
const statusKeys = ["default_bo", "default_ordered", "default_received", "default_returned"];
|
||||||
|
|
||||||
return parts.reduce(
|
return parts.reduce(
|
||||||
(acc, val) => {
|
(acc, val) => {
|
||||||
if (val.part_type === "PAS" || val.part_type === "PASL") return acc;
|
if (val.part_type === "PAS" || val.part_type === "PASL") return acc;
|
||||||
acc.total = acc.total + val.count;
|
|
||||||
acc[val.status] = acc[val.status] + val.count;
|
acc.total += val.count;
|
||||||
|
|
||||||
|
// NOTE: if val.status is null, object key becomes "null"
|
||||||
|
acc[val.status] = (acc[val.status] ?? 0) + val.count;
|
||||||
|
|
||||||
return acc;
|
return acc;
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -34,45 +70,38 @@ export function JobPartsQueueCount({ bodyshop, parts }) {
|
|||||||
);
|
);
|
||||||
}, [bodyshop, parts]);
|
}, [bodyshop, parts]);
|
||||||
|
|
||||||
if (!parts) return null;
|
if (!parts || !partsStatus) return null;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
style={{
|
style={{
|
||||||
display: "grid",
|
display: "inline-flex", // ✅ shrink-wraps, fixes the “extra box” to the right
|
||||||
gridTemplateColumns: "repeat(auto-fit, minmax(40px, 1fr))",
|
gap: 2,
|
||||||
gap: "8px",
|
alignItems: "center",
|
||||||
width: "100%",
|
whiteSpace: "nowrap"
|
||||||
justifyItems: "start"
|
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Tooltip title="Total">
|
<CompactTag tooltip="Total" color="gray">
|
||||||
<Tag style={{ minWidth: "40px", textAlign: "center" }}>{partsStatus.total}</Tag>
|
{partsStatus.total}
|
||||||
</Tooltip>
|
</CompactTag>
|
||||||
<Tooltip title={t("dashboard.errors.status_normal")}>
|
|
||||||
<Tag color="gold" style={{ minWidth: "40px", textAlign: "center" }}>
|
<CompactTag tooltip="No Status" color="gold">
|
||||||
{partsStatus["null"]}
|
{partsStatus["null"]}
|
||||||
</Tag>
|
</CompactTag>
|
||||||
</Tooltip>
|
|
||||||
<Tooltip title={bodyshop.md_order_statuses.default_bo}>
|
<CompactTag tooltip={bodyshop.md_order_statuses.default_bo} color="red">
|
||||||
<Tag color="red" style={{ minWidth: "40px", textAlign: "center" }}>
|
{partsStatus[bodyshop.md_order_statuses.default_bo]}
|
||||||
{partsStatus[bodyshop.md_order_statuses.default_bo]}
|
</CompactTag>
|
||||||
</Tag>
|
|
||||||
</Tooltip>
|
<CompactTag tooltip={bodyshop.md_order_statuses.default_ordered} color="blue">
|
||||||
<Tooltip title={bodyshop.md_order_statuses.default_ordered}>
|
{partsStatus[bodyshop.md_order_statuses.default_ordered]}
|
||||||
<Tag color="blue" style={{ minWidth: "40px", textAlign: "center" }}>
|
</CompactTag>
|
||||||
{partsStatus[bodyshop.md_order_statuses.default_ordered]}
|
<CompactTag tooltip={bodyshop.md_order_statuses.default_received} color="green">
|
||||||
</Tag>
|
{partsStatus[bodyshop.md_order_statuses.default_received]}
|
||||||
</Tooltip>
|
</CompactTag>
|
||||||
<Tooltip title={bodyshop.md_order_statuses.default_received}>
|
<CompactTag tooltip={bodyshop.md_order_statuses.default_returned} color="orange">
|
||||||
<Tag color="green" style={{ minWidth: "40px", textAlign: "center" }}>
|
{partsStatus[bodyshop.md_order_statuses.default_returned]}
|
||||||
{partsStatus[bodyshop.md_order_statuses.default_received]}
|
</CompactTag>
|
||||||
</Tag>
|
|
||||||
</Tooltip>
|
|
||||||
<Tooltip title={bodyshop.md_order_statuses.default_returned}>
|
|
||||||
<Tag color="orange" style={{ minWidth: "40px", textAlign: "center" }}>
|
|
||||||
{partsStatus[bodyshop.md_order_statuses.default_returned]}
|
|
||||||
</Tag>
|
|
||||||
</Tooltip>
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,10 +18,17 @@ const mapStateToProps = createStructuredSelector({
|
|||||||
* @param parts
|
* @param parts
|
||||||
* @param displayMode
|
* @param displayMode
|
||||||
* @param popoverPlacement
|
* @param popoverPlacement
|
||||||
|
* @param countsOnly
|
||||||
* @returns {JSX.Element}
|
* @returns {JSX.Element}
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
export function JobPartsReceived({ bodyshop, parts, displayMode = "full", popoverPlacement = "top" }) {
|
export function JobPartsReceived({
|
||||||
|
bodyshop,
|
||||||
|
parts,
|
||||||
|
displayMode = "full",
|
||||||
|
popoverPlacement = "top",
|
||||||
|
countsOnly = false
|
||||||
|
}) {
|
||||||
const [open, setOpen] = useState(false);
|
const [open, setOpen] = useState(false);
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
@@ -61,6 +68,8 @@ export function JobPartsReceived({ bodyshop, parts, displayMode = "full", popove
|
|||||||
[canOpen]
|
[canOpen]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if (countsOnly) return <JobPartsQueueCount parts={parts} />;
|
||||||
|
|
||||||
const displayText =
|
const displayText =
|
||||||
displayMode === "compact" ? summary.percentLabel : `${summary.percentLabel} (${summary.received}/${summary.total})`;
|
displayMode === "compact" ? summary.percentLabel : `${summary.percentLabel} (${summary.received}/${summary.total})`;
|
||||||
|
|
||||||
@@ -74,7 +83,7 @@ export function JobPartsReceived({ bodyshop, parts, displayMode = "full", popove
|
|||||||
trigger={["click"]}
|
trigger={["click"]}
|
||||||
placement={popoverPlacement}
|
placement={popoverPlacement}
|
||||||
content={
|
content={
|
||||||
<div onClick={stop} style={{ minWidth: 260 }}>
|
<div onClick={stop}>
|
||||||
<JobPartsQueueCount parts={parts} />
|
<JobPartsQueueCount parts={parts} />
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
@@ -99,7 +108,8 @@ JobPartsReceived.propTypes = {
|
|||||||
bodyshop: PropTypes.object,
|
bodyshop: PropTypes.object,
|
||||||
parts: PropTypes.array,
|
parts: PropTypes.array,
|
||||||
displayMode: PropTypes.oneOf(["full", "compact"]),
|
displayMode: PropTypes.oneOf(["full", "compact"]),
|
||||||
popoverPlacement: PropTypes.string
|
popoverPlacement: PropTypes.string,
|
||||||
|
countsOnly: PropTypes.bool
|
||||||
};
|
};
|
||||||
|
|
||||||
export default connect(mapStateToProps)(JobPartsReceived);
|
export default connect(mapStateToProps)(JobPartsReceived);
|
||||||
|
|||||||
@@ -157,7 +157,6 @@ export function JobsDetailHeaderActions({
|
|||||||
variables: watcherVars,
|
variables: watcherVars,
|
||||||
skip: !jobId,
|
skip: !jobId,
|
||||||
fetchPolicy: "cache-first",
|
fetchPolicy: "cache-first",
|
||||||
notifyOnNetworkStatusChange: true
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const jobWatchersCount = jobWatchersData?.job_watchers?.length ?? job?.job_watchers?.length ?? 0;
|
const jobWatchersCount = jobWatchersData?.job_watchers?.length ?? job?.job_watchers?.length ?? 0;
|
||||||
|
|||||||
@@ -56,7 +56,6 @@ const NotificationCenterContainer = ({ visible, onClose, bodyshop, unreadCount,
|
|||||||
where: whereClause
|
where: whereClause
|
||||||
},
|
},
|
||||||
fetchPolicy: "cache-and-network",
|
fetchPolicy: "cache-and-network",
|
||||||
notifyOnNetworkStatusChange: true,
|
|
||||||
errorPolicy: "all",
|
errorPolicy: "all",
|
||||||
pollInterval: isConnected ? 0 : day.duration(NOTIFICATION_POLL_INTERVAL_SECONDS, "seconds").asMilliseconds(),
|
pollInterval: isConnected ? 0 : day.duration(NOTIFICATION_POLL_INTERVAL_SECONDS, "seconds").asMilliseconds(),
|
||||||
skip: skipQuery
|
skip: skipQuery
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { connect } from "react-redux";
|
|||||||
import { createStructuredSelector } from "reselect";
|
import { createStructuredSelector } from "reselect";
|
||||||
import { store } from "../../redux/store";
|
import { store } from "../../redux/store";
|
||||||
import { selectBodyshop } from "../../redux/user/user.selectors";
|
import { selectBodyshop } from "../../redux/user/user.selectors";
|
||||||
|
import { Tooltip } from "antd";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
bodyshop: selectBodyshop
|
bodyshop: selectBodyshop
|
||||||
@@ -11,15 +12,27 @@ const mapDispatchToProps = () => ({
|
|||||||
});
|
});
|
||||||
export default connect(mapStateToProps, mapDispatchToProps)(OwnerNameDisplay);
|
export default connect(mapStateToProps, mapDispatchToProps)(OwnerNameDisplay);
|
||||||
|
|
||||||
export function OwnerNameDisplay({ bodyshop, ownerObject }) {
|
export function OwnerNameDisplay({ bodyshop, ownerObject, withToolTip = false }) {
|
||||||
const emptyTest = ownerObject?.ownr_fn + ownerObject?.ownr_ln + ownerObject?.ownr_co_nm;
|
const emptyTest = ownerObject?.ownr_fn + ownerObject?.ownr_ln + ownerObject?.ownr_co_nm;
|
||||||
|
|
||||||
if (!emptyTest || emptyTest === "null" || emptyTest.trim() === "") return "N/A";
|
if (!emptyTest || emptyTest === "null" || emptyTest.trim() === "") return "N/A";
|
||||||
|
|
||||||
if (bodyshop.last_name_first)
|
let returnString;
|
||||||
return `${ownerObject?.ownr_ln || ""}, ${ownerObject?.ownr_fn || ""} ${ownerObject?.ownr_co_nm || ""}`.trim();
|
if (bodyshop.last_name_first) {
|
||||||
|
returnString =
|
||||||
return `${ownerObject?.ownr_fn || ""} ${ownerObject?.ownr_ln || ""} ${ownerObject.ownr_co_nm || ""}`.trim();
|
`${ownerObject?.ownr_ln || ""}, ${ownerObject?.ownr_fn || ""} ${ownerObject?.ownr_co_nm || ""}`.trim();
|
||||||
|
} else {
|
||||||
|
returnString = `${ownerObject?.ownr_fn || ""} ${ownerObject?.ownr_ln || ""} ${ownerObject.ownr_co_nm || ""}`.trim();
|
||||||
|
}
|
||||||
|
if (withToolTip) {
|
||||||
|
return (
|
||||||
|
<Tooltip title={returnString} mouseEnterDelay={0.5}>
|
||||||
|
{returnString}
|
||||||
|
</Tooltip>
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
return returnString;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function OwnerNameDisplayFunction(ownerObject, forceFirstLast = false) {
|
export function OwnerNameDisplayFunction(ownerObject, forceFirstLast = false) {
|
||||||
|
|||||||
@@ -16,9 +16,10 @@ const OwnerSearchSelect = ({ value, onChange, onBlur, disabled, ref }) => {
|
|||||||
SEARCH_OWNERS_BY_ID_FOR_AUTOCOMPLETE
|
SEARCH_OWNERS_BY_ID_FOR_AUTOCOMPLETE
|
||||||
);
|
);
|
||||||
|
|
||||||
const executeSearch = (v) => {
|
const executeSearch = (variables) => {
|
||||||
if (v && v.variables?.search !== "" && v.variables.search.length >= 2) callSearch({ variables: v.variables });
|
if (variables?.search !== "" && variables?.search?.length >= 2) callSearch({ variables });
|
||||||
};
|
};
|
||||||
|
|
||||||
const debouncedExecuteSearch = _.debounce(executeSearch, 500);
|
const debouncedExecuteSearch = _.debounce(executeSearch, 500);
|
||||||
|
|
||||||
const handleSearch = (value) => {
|
const handleSearch = (value) => {
|
||||||
|
|||||||
@@ -1,94 +1,121 @@
|
|||||||
import { DownOutlined } from "@ant-design/icons";
|
import { DownOutlined } from "@ant-design/icons";
|
||||||
import { Dropdown, InputNumber, Space } from "antd";
|
import { Button, Divider, Dropdown, InputNumber, Space, theme } from "antd";
|
||||||
|
import { useState } from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { logImEXEvent } from "../../firebase/firebase.utils";
|
import { logImEXEvent } from "../../firebase/firebase.utils";
|
||||||
|
|
||||||
|
const DISCOUNT_PRESETS = [5, 10, 15, 20, 25, 40];
|
||||||
|
|
||||||
export default function PartsOrderModalPriceChange({ form, field }) {
|
export default function PartsOrderModalPriceChange({ form, field }) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const menu = {
|
const { token } = theme.useToken();
|
||||||
items: [
|
|
||||||
{
|
|
||||||
key: "5",
|
|
||||||
label: t("parts_orders.labels.discount", { percent: "5%" })
|
|
||||||
},
|
|
||||||
{
|
|
||||||
key: "10",
|
|
||||||
label: t("parts_orders.labels.discount", { percent: "10%" })
|
|
||||||
},
|
|
||||||
{
|
|
||||||
key: "15",
|
|
||||||
label: t("parts_orders.labels.discount", { percent: "15%" })
|
|
||||||
},
|
|
||||||
{
|
|
||||||
key: "20",
|
|
||||||
label: t("parts_orders.labels.discount", { percent: "20%" })
|
|
||||||
},
|
|
||||||
{
|
|
||||||
key: "25",
|
|
||||||
label: t("parts_orders.labels.discount", { percent: "25%" })
|
|
||||||
},
|
|
||||||
{
|
|
||||||
key: "40",
|
|
||||||
label: t("parts_orders.labels.discount", { percent: "40%" })
|
|
||||||
},
|
|
||||||
{
|
|
||||||
key: "custom",
|
|
||||||
label: (
|
|
||||||
<Space.Compact>
|
|
||||||
<InputNumber
|
|
||||||
onClick={(e) => e.stopPropagation()}
|
|
||||||
onKeyUp={(e) => {
|
|
||||||
if (e.key === "Enter") {
|
|
||||||
const values = form.getFieldsValue();
|
|
||||||
const { parts_order_lines } = values;
|
|
||||||
|
|
||||||
form.setFieldsValue({
|
const [open, setOpen] = useState(false);
|
||||||
parts_order_lines: {
|
const [customPercent, setCustomPercent] = useState(0);
|
||||||
data: parts_order_lines.data.map((p, idx) => {
|
|
||||||
if (idx !== field.name) return p;
|
const applyDiscountPercent = (percent) => {
|
||||||
console.log(p, e.target.value, (p.act_price || 0) * ((100 - (e.target.value || 0)) / 100));
|
const pct = Number(percent) || 0;
|
||||||
return {
|
|
||||||
...p,
|
const values = form.getFieldsValue();
|
||||||
act_price: (p.act_price || 0) * ((100 - (e.target.value || 0)) / 100)
|
const parts_order_lines = values?.parts_order_lines;
|
||||||
};
|
const data = Array.isArray(parts_order_lines?.data) ? parts_order_lines.data : [];
|
||||||
})
|
if (!data.length) return;
|
||||||
}
|
|
||||||
});
|
form.setFieldsValue({
|
||||||
e.target.value = 0;
|
parts_order_lines: {
|
||||||
}
|
data: data.map((p, idx) => {
|
||||||
}}
|
if (idx !== field.name) return p;
|
||||||
min={0}
|
return {
|
||||||
max={100}
|
...p,
|
||||||
/>
|
act_price: (p.act_price || 0) * ((100 - pct) / 100)
|
||||||
<span style={{ padding: "0 11px", backgroundColor: "#fafafa", border: "1px solid #d9d9d9", borderLeft: 0 }}>%</span>
|
};
|
||||||
</Space.Compact>
|
})
|
||||||
)
|
|
||||||
}
|
}
|
||||||
],
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const applyCustom = () => {
|
||||||
|
logImEXEvent("parts_order_manual_discount", {});
|
||||||
|
applyDiscountPercent(customPercent);
|
||||||
|
setCustomPercent(0);
|
||||||
|
setOpen(false);
|
||||||
|
};
|
||||||
|
|
||||||
|
const menu = {
|
||||||
|
// Kill the menu “card” styling so our wrapper becomes the single card.
|
||||||
|
style: {
|
||||||
|
background: "transparent",
|
||||||
|
boxShadow: "none"
|
||||||
|
},
|
||||||
|
items: DISCOUNT_PRESETS.map((pct) => ({
|
||||||
|
key: String(pct),
|
||||||
|
label: t("parts_orders.labels.discount", { percent: `${pct}%` })
|
||||||
|
})),
|
||||||
onClick: ({ key }) => {
|
onClick: ({ key }) => {
|
||||||
logImEXEvent("parts_order_manual_discount", {});
|
logImEXEvent("parts_order_manual_discount", {});
|
||||||
if (key === "custom") return;
|
applyDiscountPercent(key);
|
||||||
const values = form.getFieldsValue();
|
setOpen(false);
|
||||||
const { parts_order_lines } = values;
|
|
||||||
form.setFieldsValue({
|
|
||||||
parts_order_lines: {
|
|
||||||
data: parts_order_lines.data.map((p, idx) => {
|
|
||||||
if (idx !== field.name) return p;
|
|
||||||
return {
|
|
||||||
...p,
|
|
||||||
act_price: (p.act_price || 0) * ((100 - key) / 100)
|
|
||||||
};
|
|
||||||
})
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Dropdown menu={menu} trigger="click">
|
<Dropdown
|
||||||
|
menu={menu}
|
||||||
|
trigger={["click"]}
|
||||||
|
open={open}
|
||||||
|
onOpenChange={(nextOpen) => setOpen(nextOpen)}
|
||||||
|
getPopupContainer={(triggerNode) => triggerNode?.parentElement ?? document.body}
|
||||||
|
popupRender={(menus) => (
|
||||||
|
<div
|
||||||
|
// This makes the whole dropdown (menu + footer) look like one panel in both light/dark.
|
||||||
|
style={{
|
||||||
|
background: token.colorBgElevated,
|
||||||
|
borderRadius: token.borderRadiusLG,
|
||||||
|
boxShadow: token.boxShadowSecondary,
|
||||||
|
overflow: "hidden",
|
||||||
|
minWidth: 180
|
||||||
|
}}
|
||||||
|
onClick={(e) => e.stopPropagation()}
|
||||||
|
onKeyDown={(e) => e.stopPropagation()}
|
||||||
|
>
|
||||||
|
{menus}
|
||||||
|
|
||||||
|
<Divider style={{ margin: 0 }} />
|
||||||
|
|
||||||
|
<div style={{ padding: token.paddingXS }}>
|
||||||
|
<Space.Compact style={{ width: "100%" }}>
|
||||||
|
<InputNumber
|
||||||
|
value={customPercent}
|
||||||
|
min={0}
|
||||||
|
max={100}
|
||||||
|
precision={0}
|
||||||
|
controls={false}
|
||||||
|
style={{ width: "100%" }}
|
||||||
|
formatter={(v) => (v === null || v === undefined ? "" : `${v}%`)}
|
||||||
|
parser={(v) =>
|
||||||
|
String(v ?? "")
|
||||||
|
.replace("%", "")
|
||||||
|
.trim()
|
||||||
|
}
|
||||||
|
onChange={(v) => setCustomPercent(v ?? 0)}
|
||||||
|
onKeyDown={(e) => {
|
||||||
|
e.stopPropagation();
|
||||||
|
if (e.key === "Enter") {
|
||||||
|
e.preventDefault();
|
||||||
|
applyCustom();
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<Button type="primary" onClick={applyCustom}>
|
||||||
|
{t("general.labels.apply")}
|
||||||
|
</Button>
|
||||||
|
</Space.Compact>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
>
|
||||||
<Space>
|
<Space>
|
||||||
%
|
% <DownOutlined />
|
||||||
<DownOutlined />
|
|
||||||
</Space>
|
</Space>
|
||||||
</Dropdown>
|
</Dropdown>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ import AuditTrailMapping from "../../utils/AuditTrailMappings";
|
|||||||
import { GenerateDocument } from "../../utils/RenderTemplate";
|
import { GenerateDocument } from "../../utils/RenderTemplate";
|
||||||
import { TemplateList } from "../../utils/TemplateConstants";
|
import { TemplateList } from "../../utils/TemplateConstants";
|
||||||
import AlertComponent from "../alert/alert.component";
|
import AlertComponent from "../alert/alert.component";
|
||||||
import LoadingSpinner from "../loading-spinner/loading-spinner.component";
|
|
||||||
import PartsOrderModalComponent from "./parts-order-modal.component";
|
import PartsOrderModalComponent from "./parts-order-modal.component";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react";
|
import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react";
|
||||||
@@ -66,7 +65,7 @@ export function PartsOrderModalContainer({
|
|||||||
const sendTypeState = useState("e");
|
const sendTypeState = useState("e");
|
||||||
const sendType = sendTypeState[0];
|
const sendType = sendTypeState[0];
|
||||||
|
|
||||||
const { loading, error, data } = useQuery(QUERY_ALL_VENDORS_FOR_ORDER, {
|
const { error, data } = useQuery(QUERY_ALL_VENDORS_FOR_ORDER, {
|
||||||
skip: !open,
|
skip: !open,
|
||||||
variables: { jobId: jobId },
|
variables: { jobId: jobId },
|
||||||
fetchPolicy: "network-only",
|
fetchPolicy: "network-only",
|
||||||
@@ -94,16 +93,6 @@ export function PartsOrderModalContainer({
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
const missingIdx = forcedLines.findIndex((l) => !l?.job_line_id);
|
|
||||||
if (missingIdx !== -1) {
|
|
||||||
notification.error({
|
|
||||||
title: t("parts_orders.errors.creating"),
|
|
||||||
description: `Missing job_line_id for parts line #${missingIdx + 1}`
|
|
||||||
});
|
|
||||||
setSaving(false);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let insertResult;
|
let insertResult;
|
||||||
try {
|
try {
|
||||||
insertResult = await insertPartOrder({
|
insertResult = await insertPartOrder({
|
||||||
@@ -372,6 +361,7 @@ export function PartsOrderModalContainer({
|
|||||||
}
|
}
|
||||||
}, [open, linesToOrder, form]);
|
}, [open, linesToOrder, form]);
|
||||||
|
|
||||||
|
//This used to have a loading component spinner for the vendor data. With Apollo 4, the NetworkState isn't emitting correctly, so loading just gets set to true the second time, and no longer works as expected.
|
||||||
return (
|
return (
|
||||||
<Modal
|
<Modal
|
||||||
open={open}
|
open={open}
|
||||||
@@ -390,18 +380,14 @@ export function PartsOrderModalContainer({
|
|||||||
>
|
>
|
||||||
{error ? <AlertComponent title={error.message} type="error" /> : null}
|
{error ? <AlertComponent title={error.message} type="error" /> : null}
|
||||||
<Form form={form} layout="vertical" autoComplete="no" onFinish={handleFinish} initialValues={initialValues}>
|
<Form form={form} layout="vertical" autoComplete="no" onFinish={handleFinish} initialValues={initialValues}>
|
||||||
{loading ? (
|
<PartsOrderModalComponent
|
||||||
<LoadingSpinner />
|
form={form}
|
||||||
) : (
|
vendorList={data?.vendors || []}
|
||||||
<PartsOrderModalComponent
|
sendTypeState={sendTypeState}
|
||||||
form={form}
|
isReturn={isReturn}
|
||||||
vendorList={data?.vendors || []}
|
preferredMake={data && data.jobs[0] && data.jobs[0].v_make_desc}
|
||||||
sendTypeState={sendTypeState}
|
job={job}
|
||||||
isReturn={isReturn}
|
/>
|
||||||
preferredMake={data && data.jobs[0] && data.jobs[0].v_make_desc}
|
|
||||||
job={job}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
</Form>
|
</Form>
|
||||||
</Modal>
|
</Modal>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { SyncOutlined } from "@ant-design/icons";
|
import { SyncOutlined } from "@ant-design/icons";
|
||||||
import { useQuery } from "@apollo/client/react";
|
import { useQuery } from "@apollo/client/react";
|
||||||
import { Button, Card, Input, Space, Table } from "antd";
|
import { Button, Card, Checkbox, Input, Space, Table } from "antd";
|
||||||
import _ from "lodash";
|
import _ from "lodash";
|
||||||
import queryString from "query-string";
|
import queryString from "query-string";
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
@@ -31,6 +31,8 @@ export function PartsQueueListComponent({ bodyshop }) {
|
|||||||
const { selected, sortcolumn, sortorder, statusFilters } = searchParams;
|
const { selected, sortcolumn, sortorder, statusFilters } = searchParams;
|
||||||
const history = useNavigate();
|
const history = useNavigate();
|
||||||
const [filter, setFilter] = useLocalStorage("filter_parts_queue", null);
|
const [filter, setFilter] = useLocalStorage("filter_parts_queue", null);
|
||||||
|
const [viewTimeStamp, setViewTimeStamp] = useLocalStorage("parts_queue_timestamps", false);
|
||||||
|
const [countsOnly, setCountsOnly] = useLocalStorage("parts_queue_counts_only", false);
|
||||||
|
|
||||||
const { loading, error, data, refetch } = useQuery(QUERY_PARTS_QUEUE, {
|
const { loading, error, data, refetch } = useQuery(QUERY_PARTS_QUEUE, {
|
||||||
fetchPolicy: "network-only",
|
fetchPolicy: "network-only",
|
||||||
@@ -92,6 +94,7 @@ export function PartsQueueListComponent({ bodyshop }) {
|
|||||||
title: t("jobs.fields.ro_number"),
|
title: t("jobs.fields.ro_number"),
|
||||||
dataIndex: "ro_number",
|
dataIndex: "ro_number",
|
||||||
key: "ro_number",
|
key: "ro_number",
|
||||||
|
width: "110px",
|
||||||
sorter: (a, b) => alphaSort(a.ro_number, b.ro_number),
|
sorter: (a, b) => alphaSort(a.ro_number, b.ro_number),
|
||||||
sortOrder: sortcolumn === "ro_number" && sortorder,
|
sortOrder: sortcolumn === "ro_number" && sortorder,
|
||||||
|
|
||||||
@@ -103,16 +106,20 @@ export function PartsQueueListComponent({ bodyshop }) {
|
|||||||
title: t("jobs.fields.owner"),
|
title: t("jobs.fields.owner"),
|
||||||
dataIndex: "ownr_ln",
|
dataIndex: "ownr_ln",
|
||||||
key: "ownr_ln",
|
key: "ownr_ln",
|
||||||
|
width: "8%",
|
||||||
|
ellipsis: {
|
||||||
|
showTitle: true
|
||||||
|
},
|
||||||
sorter: (a, b) => alphaSort(OwnerNameDisplayFunction(a), OwnerNameDisplayFunction(b)),
|
sorter: (a, b) => alphaSort(OwnerNameDisplayFunction(a), OwnerNameDisplayFunction(b)),
|
||||||
sortOrder: sortcolumn === "ownr_ln" && sortorder,
|
sortOrder: sortcolumn === "ownr_ln" && sortorder,
|
||||||
render: (text, record) => {
|
render: (text, record) => {
|
||||||
return record.ownerid ? (
|
return record.ownerid ? (
|
||||||
<Link to={"/manage/owners/" + record.ownerid}>
|
<Link to={"/manage/owners/" + record.ownerid}>
|
||||||
<OwnerNameDisplay ownerObject={record} />
|
<OwnerNameDisplay ownerObject={record} withToolTip />
|
||||||
</Link>
|
</Link>
|
||||||
) : (
|
) : (
|
||||||
<span>
|
<span>
|
||||||
<OwnerNameDisplay ownerObject={record} />
|
<OwnerNameDisplay ownerObject={record} withToolTip />
|
||||||
</span>
|
</span>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -187,7 +194,7 @@ export function PartsQueueListComponent({ bodyshop }) {
|
|||||||
ellipsis: true,
|
ellipsis: true,
|
||||||
sorter: (a, b) => dateSort(a.scheduled_in, b.scheduled_in),
|
sorter: (a, b) => dateSort(a.scheduled_in, b.scheduled_in),
|
||||||
sortOrder: sortcolumn === "scheduled_in" && sortorder,
|
sortOrder: sortcolumn === "scheduled_in" && sortorder,
|
||||||
render: (text, record) => <DateTimeFormatter>{record.scheduled_in}</DateTimeFormatter>
|
render: (text, record) => <DateTimeFormatter hideTime={!viewTimeStamp}>{record.scheduled_in}</DateTimeFormatter>
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: t("jobs.fields.scheduled_completion"),
|
title: t("jobs.fields.scheduled_completion"),
|
||||||
@@ -196,7 +203,9 @@ export function PartsQueueListComponent({ bodyshop }) {
|
|||||||
ellipsis: true,
|
ellipsis: true,
|
||||||
sorter: (a, b) => dateSort(a.scheduled_completion, b.scheduled_completion),
|
sorter: (a, b) => dateSort(a.scheduled_completion, b.scheduled_completion),
|
||||||
sortOrder: sortcolumn === "scheduled_completion" && sortorder,
|
sortOrder: sortcolumn === "scheduled_completion" && sortorder,
|
||||||
render: (text, record) => <DateTimeFormatter>{record.scheduled_completion}</DateTimeFormatter>
|
render: (text, record) => (
|
||||||
|
<DateTimeFormatter hideTime={!viewTimeStamp}>{record.scheduled_completion}</DateTimeFormatter>
|
||||||
|
)
|
||||||
},
|
},
|
||||||
// {
|
// {
|
||||||
// title: t("vehicles.fields.plate_no"),
|
// title: t("vehicles.fields.plate_no"),
|
||||||
@@ -227,16 +236,23 @@ export function PartsQueueListComponent({ bodyshop }) {
|
|||||||
title: t("jobs.fields.updated_at"),
|
title: t("jobs.fields.updated_at"),
|
||||||
dataIndex: "updated_at",
|
dataIndex: "updated_at",
|
||||||
key: "updated_at",
|
key: "updated_at",
|
||||||
|
width: "110px",
|
||||||
sorter: (a, b) => dateSort(a.updated_at, b.updated_at),
|
sorter: (a, b) => dateSort(a.updated_at, b.updated_at),
|
||||||
sortOrder: sortcolumn === "updated_at" && sortorder,
|
sortOrder: sortcolumn === "updated_at" && sortorder,
|
||||||
render: (text, record) => <TimeAgoFormatter>{record.updated_at}</TimeAgoFormatter>
|
render: (text, record) => <TimeAgoFormatter removeAgoString>{record.updated_at}</TimeAgoFormatter>
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: t("jobs.fields.partsstatus"),
|
title: t("jobs.fields.partsstatus"),
|
||||||
dataIndex: "partsstatus",
|
dataIndex: "partsstatus",
|
||||||
key: "partsstatus",
|
key: "partsstatus",
|
||||||
|
width: countsOnly ? "180px" : "110px",
|
||||||
render: (text, record) => (
|
render: (text, record) => (
|
||||||
<JobPartsReceived parts={record.joblines_status} displayMode="full" popoverPlacement="topLeft" />
|
<JobPartsReceived
|
||||||
|
parts={record.joblines_status}
|
||||||
|
displayMode="full"
|
||||||
|
popoverPlacement="middle"
|
||||||
|
countsOnly={countsOnly}
|
||||||
|
/>
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -249,6 +265,7 @@ export function PartsQueueListComponent({ bodyshop }) {
|
|||||||
title: t("jobs.fields.queued_for_parts"),
|
title: t("jobs.fields.queued_for_parts"),
|
||||||
dataIndex: "queued_for_parts",
|
dataIndex: "queued_for_parts",
|
||||||
key: "queued_for_parts",
|
key: "queued_for_parts",
|
||||||
|
width: "120px",
|
||||||
sorter: (a, b) => a.queued_for_parts - b.queued_for_parts,
|
sorter: (a, b) => a.queued_for_parts - b.queued_for_parts,
|
||||||
sortOrder: sortcolumn === "queued_for_parts" && sortorder,
|
sortOrder: sortcolumn === "queued_for_parts" && sortorder,
|
||||||
filteredValue: filter?.queued_for_parts || null,
|
filteredValue: filter?.queued_for_parts || null,
|
||||||
@@ -275,6 +292,12 @@ export function PartsQueueListComponent({ bodyshop }) {
|
|||||||
<Button onClick={() => refetch()}>
|
<Button onClick={() => refetch()}>
|
||||||
<SyncOutlined />
|
<SyncOutlined />
|
||||||
</Button>
|
</Button>
|
||||||
|
<Checkbox checked={countsOnly} onChange={(e) => setCountsOnly(e.target.checked)}>
|
||||||
|
{t("parts.labels.view_counts_only")}
|
||||||
|
</Checkbox>
|
||||||
|
<Checkbox checked={viewTimeStamp} onChange={(e) => setViewTimeStamp(e.target.checked)}>
|
||||||
|
{t("parts.labels.view_timestamps")}
|
||||||
|
</Checkbox>
|
||||||
<Input.Search
|
<Input.Search
|
||||||
className="imex-table-header__search"
|
className="imex-table-header__search"
|
||||||
placeholder={t("general.labels.search")}
|
placeholder={t("general.labels.search")}
|
||||||
@@ -299,7 +322,7 @@ export function PartsQueueListComponent({ bodyshop }) {
|
|||||||
rowKey="id"
|
rowKey="id"
|
||||||
dataSource={jobs}
|
dataSource={jobs}
|
||||||
style={{ height: "100%" }}
|
style={{ height: "100%" }}
|
||||||
scroll={{ x: true }}
|
//scroll={{ x: true }}
|
||||||
onChange={handleTableChange}
|
onChange={handleTableChange}
|
||||||
rowSelection={{
|
rowSelection={{
|
||||||
onSelect: (record) => {
|
onSelect: (record) => {
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ export default function PaymentFormTotalPayments({ jobid }) {
|
|||||||
{balance && (
|
{balance && (
|
||||||
<Statistic
|
<Statistic
|
||||||
title={t("payments.labels.balance")}
|
title={t("payments.labels.balance")}
|
||||||
styles={{ value: { color: balance.getAmount() !== 0 ? "red" : "green" } }}
|
styles={{ content: { color: balance.getAmount() !== 0 ? "red" : "green" } }}
|
||||||
value={(balance && balance.toFormat()) || ""}
|
value={(balance && balance.toFormat()) || ""}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ export function PrintCenterJobsLabels({ jobId }) {
|
|||||||
</Card>
|
</Card>
|
||||||
);
|
);
|
||||||
return (
|
return (
|
||||||
<Popover content={content} open={isModalVisible}>
|
<Popover content={content} open={isModalVisible} getPopupContainer={(trigger) => trigger.parentElement}>
|
||||||
<Button onClick={() => setIsModalVisible(true)}>{t("printcenter.jobs.labels.labels")}</Button>
|
<Button onClick={() => setIsModalVisible(true)}>{t("printcenter.jobs.labels.labels")}</Button>
|
||||||
</Popover>
|
</Popover>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -18,9 +18,10 @@ const VehicleSearchSelect = ({ value, onChange, onBlur, disabled, ref }) => {
|
|||||||
SEARCH_VEHICLES_BY_ID_FOR_AUTOCOMPLETE
|
SEARCH_VEHICLES_BY_ID_FOR_AUTOCOMPLETE
|
||||||
);
|
);
|
||||||
|
|
||||||
const executeSearch = (v) => {
|
const executeSearch = (variables) => {
|
||||||
if (v && v.variables?.search !== "" && v.variables.search.length >= 2) callSearch({ variables: v.variables });
|
if (variables?.search !== "" && variables?.search?.length >= 2) callSearch({ variables });
|
||||||
};
|
};
|
||||||
|
|
||||||
const debouncedExecuteSearch = _.debounce(executeSearch, 500);
|
const debouncedExecuteSearch = _.debounce(executeSearch, 500);
|
||||||
|
|
||||||
const handleSearch = (value) => {
|
const handleSearch = (value) => {
|
||||||
|
|||||||
@@ -510,7 +510,7 @@ export function JobsCloseComponent({ job, bodyshop, jobRO, insertAuditTrail, set
|
|||||||
<Statistic
|
<Statistic
|
||||||
title={t("jobs.labels.pimraryamountpayable")}
|
title={t("jobs.labels.pimraryamountpayable")}
|
||||||
styles={{
|
styles={{
|
||||||
value: {
|
content: {
|
||||||
color: discrep.getAmount() >= 0 ? "green" : "red"
|
color: discrep.getAmount() >= 0 ? "green" : "red"
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
|
|||||||
@@ -17,7 +17,10 @@ import "./tech.page.styles.scss";
|
|||||||
import UpsellComponent, { upsellEnum } from "../../components/upsell/upsell.component.jsx";
|
import UpsellComponent, { upsellEnum } from "../../components/upsell/upsell.component.jsx";
|
||||||
import { lazyDev } from "../../utils/lazyWithPreload.jsx";
|
import { lazyDev } from "../../utils/lazyWithPreload.jsx";
|
||||||
|
|
||||||
const TimeTicketModalContainer = lazyDev(() => import("../../components/time-ticket-modal/time-ticket-modal.container"));
|
const NoteUpsertModal = lazyDev(() => import("../../components/note-upsert-modal/note-upsert-modal.container.jsx"));
|
||||||
|
const TimeTicketModalContainer = lazyDev(
|
||||||
|
() => import("../../components/time-ticket-modal/time-ticket-modal.container")
|
||||||
|
);
|
||||||
const EmailOverlayContainer = lazyDev(() => import("../../components/email-overlay/email-overlay.container.jsx"));
|
const EmailOverlayContainer = lazyDev(() => import("../../components/email-overlay/email-overlay.container.jsx"));
|
||||||
const PrintCenterModalContainer = lazyDev(
|
const PrintCenterModalContainer = lazyDev(
|
||||||
() => import("../../components/print-center-modal/print-center-modal.container")
|
() => import("../../components/print-center-modal/print-center-modal.container")
|
||||||
@@ -34,7 +37,9 @@ const TimeTicketModalTask = lazyDev(
|
|||||||
const TechAssignedProdJobs = lazyDev(() => import("../tech-assigned-prod-jobs/tech-assigned-prod-jobs.component"));
|
const TechAssignedProdJobs = lazyDev(() => import("../tech-assigned-prod-jobs/tech-assigned-prod-jobs.component"));
|
||||||
const TechDispatchedParts = lazyDev(() => import("../tech-dispatched-parts/tech-dispatched-parts.page"));
|
const TechDispatchedParts = lazyDev(() => import("../tech-dispatched-parts/tech-dispatched-parts.page"));
|
||||||
|
|
||||||
const TaskUpsertModalContainer = lazyDev(() => import("../../components/task-upsert-modal/task-upsert-modal.container"));
|
const TaskUpsertModalContainer = lazyDev(
|
||||||
|
() => import("../../components/task-upsert-modal/task-upsert-modal.container")
|
||||||
|
);
|
||||||
|
|
||||||
const { Content } = Layout;
|
const { Content } = Layout;
|
||||||
|
|
||||||
@@ -70,6 +75,8 @@ export function TechPage({ technician }) {
|
|||||||
<TechHeader />
|
<TechHeader />
|
||||||
|
|
||||||
<TaskUpsertModalContainer />
|
<TaskUpsertModalContainer />
|
||||||
|
<NoteUpsertModal />
|
||||||
|
|
||||||
<Content className="tech-content-container">
|
<Content className="tech-content-container">
|
||||||
<ErrorBoundary>
|
<ErrorBoundary>
|
||||||
<Suspense
|
<Suspense
|
||||||
|
|||||||
@@ -48,6 +48,7 @@
|
|||||||
"arrivedon": "Arrived on: ",
|
"arrivedon": "Arrived on: ",
|
||||||
"arrivingjobs": "Arriving Jobs",
|
"arrivingjobs": "Arriving Jobs",
|
||||||
"blocked": "Blocked",
|
"blocked": "Blocked",
|
||||||
|
"bp": "B/P",
|
||||||
"cancelledappointment": "Canceled appointment for: ",
|
"cancelledappointment": "Canceled appointment for: ",
|
||||||
"completingjobs": "Completing Jobs",
|
"completingjobs": "Completing Jobs",
|
||||||
"dataconsistency": "<0>{{ro_number}}</0> has a data consistency issue. It may have been excluded for scheduling purposes. CODE: {{code}}.",
|
"dataconsistency": "<0>{{ro_number}}</0> has a data consistency issue. It may have been excluded for scheduling purposes. CODE: {{code}}.",
|
||||||
@@ -59,18 +60,17 @@
|
|||||||
"noarrivingjobs": "No Jobs are arriving.",
|
"noarrivingjobs": "No Jobs are arriving.",
|
||||||
"nocompletingjobs": "No Jobs scheduled for completion.",
|
"nocompletingjobs": "No Jobs scheduled for completion.",
|
||||||
"nodateselected": "No date has been selected.",
|
"nodateselected": "No date has been selected.",
|
||||||
|
"owner": "Owner",
|
||||||
"priorappointments": "Previous Appointments",
|
"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. ",
|
"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. ",
|
||||||
|
"ro_number": "RO #",
|
||||||
|
"scheduled_completion": "Scheduled Completion",
|
||||||
"scheduledfor": "Scheduled appointment for: ",
|
"scheduledfor": "Scheduled appointment for: ",
|
||||||
"severalerrorsfound": "Several Jobs have issues which may prevent accurate smart scheduling. Click to expand.",
|
"severalerrorsfound": "Several Jobs have issues which may prevent accurate smart scheduling. Click to expand.",
|
||||||
"smartscheduling": "Smart Scheduling",
|
"smartscheduling": "Smart Scheduling",
|
||||||
"smspaymentreminder": "This is {{shopname}} reminding you about your remaining balance of {{amount}}. To pay for the said balance click the link {{payment_link}}.",
|
"smspaymentreminder": "This is {{shopname}} reminding you about your remaining balance of {{amount}}. To pay for the said balance click the link {{payment_link}}.",
|
||||||
"suggesteddates": "Suggested Dates",
|
"suggesteddates": "Suggested Dates",
|
||||||
"ro_number": "RO #",
|
"vehicle": "Vehicle"
|
||||||
"owner": "Owner",
|
|
||||||
"vehicle": "Vehicle",
|
|
||||||
"bp": "B/P",
|
|
||||||
"scheduled_completion": "Scheduled Completion"
|
|
||||||
},
|
},
|
||||||
"successes": {
|
"successes": {
|
||||||
"canceled": "Appointment canceled successfully.",
|
"canceled": "Appointment canceled successfully.",
|
||||||
@@ -90,6 +90,11 @@
|
|||||||
"actions": "Actions"
|
"actions": "Actions"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"audio": {
|
||||||
|
"manager": {
|
||||||
|
"description": "Click anywhere to enable the message ding."
|
||||||
|
}
|
||||||
|
},
|
||||||
"audit": {
|
"audit": {
|
||||||
"fields": {
|
"fields": {
|
||||||
"cc": "CC",
|
"cc": "CC",
|
||||||
@@ -149,11 +154,6 @@
|
|||||||
"tasks_updated": "Task '{{title}}' updated by {{updatedBy}}"
|
"tasks_updated": "Task '{{title}}' updated by {{updatedBy}}"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"audio": {
|
|
||||||
"manager": {
|
|
||||||
"description": "Click anywhere to enable the message ding."
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"billlines": {
|
"billlines": {
|
||||||
"actions": {
|
"actions": {
|
||||||
"newline": "New Line"
|
"newline": "New Line"
|
||||||
@@ -281,9 +281,9 @@
|
|||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"creatingdefaultview": "Error creating default view.",
|
"creatingdefaultview": "Error creating default view.",
|
||||||
|
"duplicate_insurance_company": "Duplicate insurance company name. Each insurance company name must be unique",
|
||||||
"loading": "Unable to load shop details. Please call technical support.",
|
"loading": "Unable to load shop details. Please call technical support.",
|
||||||
"saving": "Error encountered while saving. {{message}}",
|
"saving": "Error encountered while saving. {{message}}"
|
||||||
"duplicate_insurance_company": "Duplicate insurance company name. Each insurance company name must be unique"
|
|
||||||
},
|
},
|
||||||
"fields": {
|
"fields": {
|
||||||
"ReceivableCustomField": "QBO Receivable Custom Field {{number}}",
|
"ReceivableCustomField": "QBO Receivable Custom Field {{number}}",
|
||||||
@@ -564,21 +564,18 @@
|
|||||||
"responsibilitycenter_tax_tier": "Tax {{typeNum}} Tier {{typeNumIterator}}",
|
"responsibilitycenter_tax_tier": "Tax {{typeNum}} Tier {{typeNumIterator}}",
|
||||||
"responsibilitycenter_tax_type": "Tax {{typeNum}} Type",
|
"responsibilitycenter_tax_type": "Tax {{typeNum}} Type",
|
||||||
"responsibilitycenters": {
|
"responsibilitycenters": {
|
||||||
"gogcode": "GOG Code (BreakOut)",
|
|
||||||
"item_type": "Item Type",
|
|
||||||
"item_type_gog": "GOG",
|
|
||||||
"item_type_paint": "Paint Materials",
|
|
||||||
"item_type_freight": "Freight",
|
|
||||||
"taxable_flag": "Taxable?",
|
|
||||||
"taxable": "Taxable",
|
|
||||||
"nontaxable": "Non-taxable",
|
|
||||||
"ap": "Accounts Payable",
|
"ap": "Accounts Payable",
|
||||||
"ar": "Accounts Receivable",
|
"ar": "Accounts Receivable",
|
||||||
"ats": "ATS",
|
"ats": "ATS",
|
||||||
"federal_tax": "Federal Tax",
|
"federal_tax": "Federal Tax",
|
||||||
"federal_tax_itc": "Federal Tax Credit",
|
"federal_tax_itc": "Federal Tax Credit",
|
||||||
|
"gogcode": "GOG Code (BreakOut)",
|
||||||
"gst_override": "GST Override Account #",
|
"gst_override": "GST Override Account #",
|
||||||
"invoiceexemptcode": "QuickBooks US - Invoice Tax Exempt Code",
|
"invoiceexemptcode": "QuickBooks US - Invoice Tax Exempt Code",
|
||||||
|
"item_type": "Item Type",
|
||||||
|
"item_type_freight": "Freight",
|
||||||
|
"item_type_gog": "GOG",
|
||||||
|
"item_type_paint": "Paint Materials",
|
||||||
"itemexemptcode": "QuickBooks US - Line Item Tax Exempt Code",
|
"itemexemptcode": "QuickBooks US - Line Item Tax Exempt Code",
|
||||||
"la1": "LA1",
|
"la1": "LA1",
|
||||||
"la2": "LA2",
|
"la2": "LA2",
|
||||||
@@ -597,6 +594,7 @@
|
|||||||
"local_tax": "Local Tax",
|
"local_tax": "Local Tax",
|
||||||
"mapa": "Paint Materials",
|
"mapa": "Paint Materials",
|
||||||
"mash": "Shop Materials",
|
"mash": "Shop Materials",
|
||||||
|
"nontaxable": "Non-taxable",
|
||||||
"paa": "Aftermarket",
|
"paa": "Aftermarket",
|
||||||
"pac": "Chrome",
|
"pac": "Chrome",
|
||||||
"pag": "Glass",
|
"pag": "Glass",
|
||||||
@@ -617,6 +615,8 @@
|
|||||||
"state": "State Tax Applies"
|
"state": "State Tax Applies"
|
||||||
},
|
},
|
||||||
"state_tax": "State Tax",
|
"state_tax": "State Tax",
|
||||||
|
"taxable": "Taxable",
|
||||||
|
"taxable_flag": "Taxable?",
|
||||||
"tow": "Towing"
|
"tow": "Towing"
|
||||||
},
|
},
|
||||||
"schedule_end_time": "Schedule Ending Time",
|
"schedule_end_time": "Schedule Ending Time",
|
||||||
@@ -678,8 +678,6 @@
|
|||||||
"zip_post": "Zip/Postal Code"
|
"zip_post": "Zip/Postal Code"
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
"parts_shop_management": "Shop Management",
|
|
||||||
"parts_vendor_management": "Vendor Management",
|
|
||||||
"2tiername": "Name => RO",
|
"2tiername": "Name => RO",
|
||||||
"2tiersetup": "2 Tier Setup",
|
"2tiersetup": "2 Tier Setup",
|
||||||
"2tiersource": "Source => RO",
|
"2tiersource": "Source => RO",
|
||||||
@@ -702,11 +700,11 @@
|
|||||||
"payers": "Payers"
|
"payers": "Payers"
|
||||||
},
|
},
|
||||||
"cdk_dealerid": "CDK Dealer ID",
|
"cdk_dealerid": "CDK Dealer ID",
|
||||||
"rr_dealerid": "Reynolds Store Number",
|
|
||||||
"costsmapping": "Costs Mapping",
|
"costsmapping": "Costs Mapping",
|
||||||
"dms_allocations": "DMS Allocations",
|
"dms_allocations": "DMS Allocations",
|
||||||
"pbs_serialnumber": "PBS Serial Number",
|
"pbs_serialnumber": "PBS Serial Number",
|
||||||
"profitsmapping": "Profits Mapping",
|
"profitsmapping": "Profits Mapping",
|
||||||
|
"rr_dealerid": "Reynolds Store Number",
|
||||||
"title": "DMS"
|
"title": "DMS"
|
||||||
},
|
},
|
||||||
"emaillater": "Email Later",
|
"emaillater": "Email Later",
|
||||||
@@ -733,6 +731,8 @@
|
|||||||
"followers": "Notifications"
|
"followers": "Notifications"
|
||||||
},
|
},
|
||||||
"orderstatuses": "Order Statuses",
|
"orderstatuses": "Order Statuses",
|
||||||
|
"parts_shop_management": "Shop Management",
|
||||||
|
"parts_vendor_management": "Vendor Management",
|
||||||
"partslocations": "Parts Locations",
|
"partslocations": "Parts Locations",
|
||||||
"partsscan": "Parts Scanning",
|
"partsscan": "Parts Scanning",
|
||||||
"printlater": "Print Later",
|
"printlater": "Print Later",
|
||||||
@@ -1228,8 +1228,6 @@
|
|||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"actions": {
|
"actions": {
|
||||||
"select": "Select",
|
|
||||||
"optional": "Optional",
|
|
||||||
"add": "Add",
|
"add": "Add",
|
||||||
"autoupdate": "{{app}} will automatically update in {{time}} seconds. Please save all changes.",
|
"autoupdate": "{{app}} will automatically update in {{time}} seconds. Please save all changes.",
|
||||||
"calculate": "Calculate",
|
"calculate": "Calculate",
|
||||||
@@ -1249,6 +1247,7 @@
|
|||||||
"login": "Login",
|
"login": "Login",
|
||||||
"next": "Next",
|
"next": "Next",
|
||||||
"ok": "Ok",
|
"ok": "Ok",
|
||||||
|
"optional": "Optional",
|
||||||
"previous": "Previous",
|
"previous": "Previous",
|
||||||
"print": "Print",
|
"print": "Print",
|
||||||
"refresh": "Refresh",
|
"refresh": "Refresh",
|
||||||
@@ -1259,6 +1258,7 @@
|
|||||||
"save": "Save",
|
"save": "Save",
|
||||||
"saveandnew": "Save and New",
|
"saveandnew": "Save and New",
|
||||||
"saveas": "Save As",
|
"saveas": "Save As",
|
||||||
|
"select": "Select",
|
||||||
"selectall": "Select All",
|
"selectall": "Select All",
|
||||||
"send": "Send",
|
"send": "Send",
|
||||||
"sendbysms": "Send by SMS",
|
"sendbysms": "Send by SMS",
|
||||||
@@ -1288,8 +1288,7 @@
|
|||||||
"vehicle": "Vehicle"
|
"vehicle": "Vehicle"
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
"selected": "Selected",
|
"apply": "Apply",
|
||||||
"settings": "Settings",
|
|
||||||
"actions": "Actions",
|
"actions": "Actions",
|
||||||
"areyousure": "Are you sure?",
|
"areyousure": "Are you sure?",
|
||||||
"barcode": "Barcode",
|
"barcode": "Barcode",
|
||||||
@@ -1343,8 +1342,10 @@
|
|||||||
"search": "Search...",
|
"search": "Search...",
|
||||||
"searchresults": "Results for {{search}}",
|
"searchresults": "Results for {{search}}",
|
||||||
"selectdate": "Select date...",
|
"selectdate": "Select date...",
|
||||||
|
"selected": "Selected",
|
||||||
"sendagain": "Send Again",
|
"sendagain": "Send Again",
|
||||||
"sendby": "Send By",
|
"sendby": "Send By",
|
||||||
|
"settings": "Settings",
|
||||||
"signin": "Sign In",
|
"signin": "Sign In",
|
||||||
"sms": "SMS",
|
"sms": "SMS",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
@@ -1587,13 +1588,13 @@
|
|||||||
"labels": {
|
"labels": {
|
||||||
"adjustmenttobeadded": "Adjustment to be added: {{adjustment}}",
|
"adjustmenttobeadded": "Adjustment to be added: {{adjustment}}",
|
||||||
"billref": "Latest Bill",
|
"billref": "Latest Bill",
|
||||||
|
"bulk_location_help": "This will set the same location on all selected lines.",
|
||||||
"convertedtolabor": "This line has been converted to labor. Ensure you adjust the profit center for the amount accordingly.",
|
"convertedtolabor": "This line has been converted to labor. Ensure you adjust the profit center for the amount accordingly.",
|
||||||
"edit": "Edit Line",
|
"edit": "Edit Line",
|
||||||
"ioucreated": "IOU",
|
"ioucreated": "IOU",
|
||||||
"new": "New Line",
|
"new": "New Line",
|
||||||
"nostatus": "No Status",
|
"nostatus": "No Status",
|
||||||
"presets": "Jobline Presets",
|
"presets": "Jobline Presets"
|
||||||
"bulk_location_help": "This will set the same location on all selected lines."
|
|
||||||
},
|
},
|
||||||
"successes": {
|
"successes": {
|
||||||
"created": "Job line created successfully.",
|
"created": "Job line created successfully.",
|
||||||
@@ -1701,9 +1702,9 @@
|
|||||||
"actual_delivery": "Actual Delivery",
|
"actual_delivery": "Actual Delivery",
|
||||||
"actual_in": "Actual In",
|
"actual_in": "Actual In",
|
||||||
"acv_amount": "ACV Amount",
|
"acv_amount": "ACV Amount",
|
||||||
"admin_clerk": "Admin Clerk",
|
|
||||||
"adjustment_bottom_line": "Adjustments",
|
"adjustment_bottom_line": "Adjustments",
|
||||||
"adjustmenthours": "Adjustment Hours",
|
"adjustmenthours": "Adjustment Hours",
|
||||||
|
"admin_clerk": "Admin Clerk",
|
||||||
"alt_transport": "Alt. Trans.",
|
"alt_transport": "Alt. Trans.",
|
||||||
"area_of_damage_impact": {
|
"area_of_damage_impact": {
|
||||||
"10": "Left Front Side",
|
"10": "Left Front Side",
|
||||||
@@ -1784,9 +1785,8 @@
|
|||||||
"ded_status": "Deductible Status",
|
"ded_status": "Deductible Status",
|
||||||
"depreciation_taxes": "Betterment/Depreciation/Taxes",
|
"depreciation_taxes": "Betterment/Depreciation/Taxes",
|
||||||
"dms": {
|
"dms": {
|
||||||
"first_name": "First Name",
|
|
||||||
"last_name": "Last Name",
|
|
||||||
"address": "Customer Address",
|
"address": "Customer Address",
|
||||||
|
"advisor": "Advisor #",
|
||||||
"amount": "Amount",
|
"amount": "Amount",
|
||||||
"center": "Center",
|
"center": "Center",
|
||||||
"control_type": {
|
"control_type": {
|
||||||
@@ -1799,12 +1799,13 @@
|
|||||||
"dms_model_override": "Override DMS Make/Model",
|
"dms_model_override": "Override DMS Make/Model",
|
||||||
"dms_unsold": "New, Unsold Vehicle",
|
"dms_unsold": "New, Unsold Vehicle",
|
||||||
"dms_wip_acctnumber": "Cost WIP DMS Acct #",
|
"dms_wip_acctnumber": "Cost WIP DMS Acct #",
|
||||||
|
"first_name": "First Name",
|
||||||
"id": "DMS ID",
|
"id": "DMS ID",
|
||||||
"inservicedate": "In Service Date",
|
"inservicedate": "In Service Date",
|
||||||
"journal": "Journal #",
|
"journal": "Journal #",
|
||||||
"make_override": "Make Override",
|
"last_name": "Last Name",
|
||||||
"advisor": "Advisor #",
|
|
||||||
"lines": "Posting Lines",
|
"lines": "Posting Lines",
|
||||||
|
"make_override": "Make Override",
|
||||||
"name1": "Customer Name",
|
"name1": "Customer Name",
|
||||||
"payer": {
|
"payer": {
|
||||||
"amount": "Amount",
|
"amount": "Amount",
|
||||||
@@ -1945,7 +1946,7 @@
|
|||||||
"amount": "Amount",
|
"amount": "Amount",
|
||||||
"name": "Name"
|
"name": "Name"
|
||||||
},
|
},
|
||||||
"queued_for_parts": "Queued for Parts",
|
"queued_for_parts": "Queued",
|
||||||
"rate_ats": "ATS Rate",
|
"rate_ats": "ATS Rate",
|
||||||
"rate_ats_flat": "ATS Flat Rate",
|
"rate_ats_flat": "ATS Flat Rate",
|
||||||
"rate_la1": "LA1",
|
"rate_la1": "LA1",
|
||||||
@@ -2447,6 +2448,7 @@
|
|||||||
"labels": {
|
"labels": {
|
||||||
"addlabel": "Add a label to this conversation.",
|
"addlabel": "Add a label to this conversation.",
|
||||||
"archive": "Archive",
|
"archive": "Archive",
|
||||||
|
"mark_unread": "Mark as unread",
|
||||||
"maxtenimages": "You can only select up to a maximum of 10 images at a time.",
|
"maxtenimages": "You can only select up to a maximum of 10 images at a time.",
|
||||||
"messaging": "Messaging",
|
"messaging": "Messaging",
|
||||||
"no_consent": "Opted-out",
|
"no_consent": "Opted-out",
|
||||||
@@ -2459,8 +2461,7 @@
|
|||||||
"selectmedia": "Select Media",
|
"selectmedia": "Select Media",
|
||||||
"sentby": "Sent by {{by}} at {{time}}",
|
"sentby": "Sent by {{by}} at {{time}}",
|
||||||
"typeamessage": "Send a message...",
|
"typeamessage": "Send a message...",
|
||||||
"unarchive": "Unarchive",
|
"unarchive": "Unarchive"
|
||||||
"mark_unread": "Mark as unread"
|
|
||||||
},
|
},
|
||||||
"render": {
|
"render": {
|
||||||
"conversation_list": "Conversation List"
|
"conversation_list": "Conversation List"
|
||||||
@@ -2614,20 +2615,20 @@
|
|||||||
"name": "Owner Details"
|
"name": "Owner Details"
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
|
"cell": "Cell",
|
||||||
"create_new": "Create a new owner record.",
|
"create_new": "Create a new owner record.",
|
||||||
"deleteconfirm": "Are you sure you want to delete this owner? This cannot be undone.",
|
"deleteconfirm": "Are you sure you want to delete this owner? This cannot be undone.",
|
||||||
|
"email": "Email",
|
||||||
"existing_owners": "Existing Owners",
|
"existing_owners": "Existing Owners",
|
||||||
"fromclaim": "Current Claim",
|
"fromclaim": "Current Claim",
|
||||||
"fromowner": "Historical Owner Record",
|
"fromowner": "Historical Owner Record",
|
||||||
"relatedjobs": "Related Jobs",
|
|
||||||
"updateowner": "Update Owner",
|
|
||||||
"work": "Work",
|
|
||||||
"home": "Home",
|
"home": "Home",
|
||||||
"cell": "Cell",
|
|
||||||
"other": "Other",
|
"other": "Other",
|
||||||
"email": "Email",
|
|
||||||
"phone": "Phone",
|
"phone": "Phone",
|
||||||
"sms": "SMS"
|
"relatedjobs": "Related Jobs",
|
||||||
|
"sms": "SMS",
|
||||||
|
"updateowner": "Update Owner",
|
||||||
|
"work": "Work"
|
||||||
},
|
},
|
||||||
"successes": {
|
"successes": {
|
||||||
"delete": "Owner deleted successfully.",
|
"delete": "Owner deleted successfully.",
|
||||||
@@ -2638,6 +2639,10 @@
|
|||||||
"actions": {
|
"actions": {
|
||||||
"order": "Order Parts",
|
"order": "Order Parts",
|
||||||
"orderinhouse": "Order as In House"
|
"orderinhouse": "Order as In House"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"view_counts_only": "View Parts Counts Only",
|
||||||
|
"view_timestamps": "Show timestamps"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"parts_dispatch": {
|
"parts_dispatch": {
|
||||||
@@ -2987,8 +2992,6 @@
|
|||||||
"settings": "Error saving board settings: {{error}}"
|
"settings": "Error saving board settings: {{error}}"
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
"click_for_statuses": "Click to view parts statuses",
|
|
||||||
"partsreceived": "Parts Received",
|
|
||||||
"actual_in": "Actual In",
|
"actual_in": "Actual In",
|
||||||
"addnewprofile": "Add New Profile",
|
"addnewprofile": "Add New Profile",
|
||||||
"alert": "Alert",
|
"alert": "Alert",
|
||||||
@@ -3007,6 +3010,7 @@
|
|||||||
"card_size": "Card Size",
|
"card_size": "Card Size",
|
||||||
"cardcolor": "Colored Cards",
|
"cardcolor": "Colored Cards",
|
||||||
"cardsettings": "Card Settings",
|
"cardsettings": "Card Settings",
|
||||||
|
"click_for_statuses": "Click to view parts statuses",
|
||||||
"clm_no": "Claim Number",
|
"clm_no": "Claim Number",
|
||||||
"comment": "Comment",
|
"comment": "Comment",
|
||||||
"compact": "Compact Cards",
|
"compact": "Compact Cards",
|
||||||
@@ -3027,6 +3031,7 @@
|
|||||||
"orientation": "Board Orientation",
|
"orientation": "Board Orientation",
|
||||||
"ownr_nm": "Customer Name",
|
"ownr_nm": "Customer Name",
|
||||||
"paintpriority": "P/P",
|
"paintpriority": "P/P",
|
||||||
|
"partsreceived": "Parts Received",
|
||||||
"partsstatus": "Parts Status",
|
"partsstatus": "Parts Status",
|
||||||
"production_note": "Production Note",
|
"production_note": "Production Note",
|
||||||
"refinishhours": "R",
|
"refinishhours": "R",
|
||||||
@@ -3573,17 +3578,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"titles": {
|
"titles": {
|
||||||
"parts_settings": "Parts Management Settings | {{app}}",
|
|
||||||
"simplified-parts-jobs": "Parts Management | {{app}}",
|
|
||||||
"accounting-payables": "Payables | {{app}}",
|
"accounting-payables": "Payables | {{app}}",
|
||||||
"accounting-payments": "Payments | {{app}}",
|
"accounting-payments": "Payments | {{app}}",
|
||||||
"accounting-receivables": "Receivables | {{app}}",
|
"accounting-receivables": "Receivables | {{app}}",
|
||||||
"all_tasks": "All Tasks | {{app}}",
|
"all_tasks": "All Tasks | {{app}}",
|
||||||
"app": "",
|
"app": "",
|
||||||
"bc": {
|
"bc": {
|
||||||
"simplified-parts-jobs": "Jobs",
|
|
||||||
"parts": "Parts",
|
|
||||||
"parts_settings": "Settings",
|
|
||||||
"accounting-payables": "Payables",
|
"accounting-payables": "Payables",
|
||||||
"accounting-payments": "Payments",
|
"accounting-payments": "Payments",
|
||||||
"accounting-receivables": "Receivables",
|
"accounting-receivables": "Receivables",
|
||||||
@@ -3615,7 +3615,9 @@
|
|||||||
"my_tasks": "My Tasks",
|
"my_tasks": "My Tasks",
|
||||||
"owner-detail": "{{name}}",
|
"owner-detail": "{{name}}",
|
||||||
"owners": "Owners",
|
"owners": "Owners",
|
||||||
|
"parts": "Parts",
|
||||||
"parts-queue": "Parts Queue",
|
"parts-queue": "Parts Queue",
|
||||||
|
"parts_settings": "Settings",
|
||||||
"payments-all": "All Payments",
|
"payments-all": "All Payments",
|
||||||
"phonebook": "Phonebook",
|
"phonebook": "Phonebook",
|
||||||
"productionboard": "Production Board - Visual",
|
"productionboard": "Production Board - Visual",
|
||||||
@@ -3627,6 +3629,7 @@
|
|||||||
"shop-csi": "CSI Responses",
|
"shop-csi": "CSI Responses",
|
||||||
"shop-templates": "Shop Templates",
|
"shop-templates": "Shop Templates",
|
||||||
"shop-vendors": "Vendors",
|
"shop-vendors": "Vendors",
|
||||||
|
"simplified-parts-jobs": "Jobs",
|
||||||
"tasks": "Tasks",
|
"tasks": "Tasks",
|
||||||
"temporarydocs": "Temporary Documents",
|
"temporarydocs": "Temporary Documents",
|
||||||
"timetickets": "Time Tickets",
|
"timetickets": "Time Tickets",
|
||||||
@@ -3662,7 +3665,9 @@
|
|||||||
"my_tasks": "My Tasks | {{app}}",
|
"my_tasks": "My Tasks | {{app}}",
|
||||||
"owners": "All Owners | {{app}}",
|
"owners": "All Owners | {{app}}",
|
||||||
"owners-detail": "{{name}} | {{app}}",
|
"owners-detail": "{{name}} | {{app}}",
|
||||||
|
"parts": "",
|
||||||
"parts-queue": "Parts Queue | {{app}}",
|
"parts-queue": "Parts Queue | {{app}}",
|
||||||
|
"parts_settings": "Parts Management Settings | {{app}}",
|
||||||
"payments-all": "Payments | {{app}}",
|
"payments-all": "Payments | {{app}}",
|
||||||
"phonebook": "Phonebook | {{app}}",
|
"phonebook": "Phonebook | {{app}}",
|
||||||
"productionboard": "Production Board - Visual | {{app}}",
|
"productionboard": "Production Board - Visual | {{app}}",
|
||||||
@@ -3678,6 +3683,7 @@
|
|||||||
"shop-csi": "CSI Responses | {{app}}",
|
"shop-csi": "CSI Responses | {{app}}",
|
||||||
"shop-templates": "Shop Templates | {{app}}",
|
"shop-templates": "Shop Templates | {{app}}",
|
||||||
"shop_vendors": "Vendors | {{app}}",
|
"shop_vendors": "Vendors | {{app}}",
|
||||||
|
"simplified-parts-jobs": "Parts Management | {{app}}",
|
||||||
"tasks": "Tasks",
|
"tasks": "Tasks",
|
||||||
"techconsole": "Technician Console | {{app}}",
|
"techconsole": "Technician Console | {{app}}",
|
||||||
"techjobclock": "Technician Job Clock | {{app}}",
|
"techjobclock": "Technician Job Clock | {{app}}",
|
||||||
@@ -3838,10 +3844,10 @@
|
|||||||
"user": {
|
"user": {
|
||||||
"actions": {
|
"actions": {
|
||||||
"changepassword": "Change Password",
|
"changepassword": "Change Password",
|
||||||
"signout": "Sign Out",
|
"dark_theme": "Switch to Dark Theme",
|
||||||
"updateprofile": "Update Profile",
|
|
||||||
"light_theme": "Switch to Light Theme",
|
"light_theme": "Switch to Light Theme",
|
||||||
"dark_theme": "Switch to Dark Theme"
|
"signout": "Sign Out",
|
||||||
|
"updateprofile": "Update Profile"
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"updating": "Error updating user or association {{message}}"
|
"updating": "Error updating user or association {{message}}"
|
||||||
@@ -3855,14 +3861,14 @@
|
|||||||
"labels": {
|
"labels": {
|
||||||
"actions": "Actions",
|
"actions": "Actions",
|
||||||
"changepassword": "Change Password",
|
"changepassword": "Change Password",
|
||||||
"profileinfo": "Profile Info",
|
|
||||||
"user_settings": "User Settings",
|
|
||||||
"play_sound_for_new_messages": "Play a sound for new messages",
|
|
||||||
"notification_sound_on": "Sound is ON",
|
|
||||||
"notification_sound_off": "Sound is OFF",
|
|
||||||
"notification_sound_enabled": "Notification sound enabled",
|
|
||||||
"notification_sound_disabled": "Notification sound disabled",
|
"notification_sound_disabled": "Notification sound disabled",
|
||||||
"notification_sound_help": "Toggle the ding for incoming chat messages."
|
"notification_sound_enabled": "Notification sound enabled",
|
||||||
|
"notification_sound_help": "Toggle the ding for incoming chat messages.",
|
||||||
|
"notification_sound_off": "Sound is OFF",
|
||||||
|
"notification_sound_on": "Sound is ON",
|
||||||
|
"play_sound_for_new_messages": "Play a sound for new messages",
|
||||||
|
"profileinfo": "Profile Info",
|
||||||
|
"user_settings": "User Settings"
|
||||||
},
|
},
|
||||||
"successess": {
|
"successess": {
|
||||||
"passwordchanged": "Password changed successfully. "
|
"passwordchanged": "Password changed successfully. "
|
||||||
|
|||||||
@@ -48,6 +48,7 @@
|
|||||||
"arrivedon": "Llegado el:",
|
"arrivedon": "Llegado el:",
|
||||||
"arrivingjobs": "",
|
"arrivingjobs": "",
|
||||||
"blocked": "",
|
"blocked": "",
|
||||||
|
"bp": "",
|
||||||
"cancelledappointment": "Cita cancelada para:",
|
"cancelledappointment": "Cita cancelada para:",
|
||||||
"completingjobs": "",
|
"completingjobs": "",
|
||||||
"dataconsistency": "",
|
"dataconsistency": "",
|
||||||
@@ -59,18 +60,17 @@
|
|||||||
"noarrivingjobs": "",
|
"noarrivingjobs": "",
|
||||||
"nocompletingjobs": "",
|
"nocompletingjobs": "",
|
||||||
"nodateselected": "No se ha seleccionado ninguna fecha.",
|
"nodateselected": "No se ha seleccionado ninguna fecha.",
|
||||||
|
"owner": "",
|
||||||
"priorappointments": "Nombramientos previos",
|
"priorappointments": "Nombramientos previos",
|
||||||
"reminder": "",
|
"reminder": "",
|
||||||
|
"ro_number": "",
|
||||||
|
"scheduled_completion": "",
|
||||||
"scheduledfor": "Cita programada para:",
|
"scheduledfor": "Cita programada para:",
|
||||||
"severalerrorsfound": "",
|
"severalerrorsfound": "",
|
||||||
"smartscheduling": "",
|
"smartscheduling": "",
|
||||||
"smspaymentreminder": "",
|
"smspaymentreminder": "",
|
||||||
"suggesteddates": "",
|
"suggesteddates": "",
|
||||||
"ro_number": "",
|
"vehicle": ""
|
||||||
"owner": "",
|
|
||||||
"vehicle": "",
|
|
||||||
"bp": "",
|
|
||||||
"scheduled_completion": ""
|
|
||||||
},
|
},
|
||||||
"successes": {
|
"successes": {
|
||||||
"canceled": "Cita cancelada con éxito.",
|
"canceled": "Cita cancelada con éxito.",
|
||||||
@@ -90,6 +90,11 @@
|
|||||||
"actions": "Comportamiento"
|
"actions": "Comportamiento"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"audio": {
|
||||||
|
"manager": {
|
||||||
|
"description": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
"audit": {
|
"audit": {
|
||||||
"fields": {
|
"fields": {
|
||||||
"cc": "",
|
"cc": "",
|
||||||
@@ -149,11 +154,6 @@
|
|||||||
"tasks_updated": ""
|
"tasks_updated": ""
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"audio": {
|
|
||||||
"manager": {
|
|
||||||
"description": ""
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"billlines": {
|
"billlines": {
|
||||||
"actions": {
|
"actions": {
|
||||||
"newline": ""
|
"newline": ""
|
||||||
@@ -281,9 +281,9 @@
|
|||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"creatingdefaultview": "",
|
"creatingdefaultview": "",
|
||||||
|
"duplicate_insurance_company": "",
|
||||||
"loading": "No se pueden cargar los detalles de la tienda. Por favor llame al soporte técnico.",
|
"loading": "No se pueden cargar los detalles de la tienda. Por favor llame al soporte técnico.",
|
||||||
"saving": "",
|
"saving": ""
|
||||||
"duplicate_insurance_company": ""
|
|
||||||
},
|
},
|
||||||
"fields": {
|
"fields": {
|
||||||
"ReceivableCustomField": "",
|
"ReceivableCustomField": "",
|
||||||
@@ -564,21 +564,18 @@
|
|||||||
"responsibilitycenter_tax_tier": "",
|
"responsibilitycenter_tax_tier": "",
|
||||||
"responsibilitycenter_tax_type": "",
|
"responsibilitycenter_tax_type": "",
|
||||||
"responsibilitycenters": {
|
"responsibilitycenters": {
|
||||||
"gogcode": "",
|
|
||||||
"item_type": "Item Type",
|
|
||||||
"item_type_gog": "",
|
|
||||||
"item_type_paint": "",
|
|
||||||
"item_type_freight": "",
|
|
||||||
"taxable_flag": "",
|
|
||||||
"taxable": "",
|
|
||||||
"nontaxable": "",
|
|
||||||
"ap": "",
|
"ap": "",
|
||||||
"ar": "",
|
"ar": "",
|
||||||
"ats": "",
|
"ats": "",
|
||||||
"federal_tax": "",
|
"federal_tax": "",
|
||||||
"federal_tax_itc": "",
|
"federal_tax_itc": "",
|
||||||
|
"gogcode": "",
|
||||||
"gst_override": "",
|
"gst_override": "",
|
||||||
"invoiceexemptcode": "",
|
"invoiceexemptcode": "",
|
||||||
|
"item_type": "Item Type",
|
||||||
|
"item_type_freight": "",
|
||||||
|
"item_type_gog": "",
|
||||||
|
"item_type_paint": "",
|
||||||
"itemexemptcode": "",
|
"itemexemptcode": "",
|
||||||
"la1": "",
|
"la1": "",
|
||||||
"la2": "",
|
"la2": "",
|
||||||
@@ -597,6 +594,7 @@
|
|||||||
"local_tax": "",
|
"local_tax": "",
|
||||||
"mapa": "",
|
"mapa": "",
|
||||||
"mash": "",
|
"mash": "",
|
||||||
|
"nontaxable": "",
|
||||||
"paa": "",
|
"paa": "",
|
||||||
"pac": "",
|
"pac": "",
|
||||||
"pag": "",
|
"pag": "",
|
||||||
@@ -617,6 +615,8 @@
|
|||||||
"state": ""
|
"state": ""
|
||||||
},
|
},
|
||||||
"state_tax": "",
|
"state_tax": "",
|
||||||
|
"taxable": "",
|
||||||
|
"taxable_flag": "",
|
||||||
"tow": ""
|
"tow": ""
|
||||||
},
|
},
|
||||||
"schedule_end_time": "",
|
"schedule_end_time": "",
|
||||||
@@ -678,8 +678,6 @@
|
|||||||
"zip_post": ""
|
"zip_post": ""
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
"parts_shop_management": "",
|
|
||||||
"parts_vendor_management": "",
|
|
||||||
"2tiername": "",
|
"2tiername": "",
|
||||||
"2tiersetup": "",
|
"2tiersetup": "",
|
||||||
"2tiersource": "",
|
"2tiersource": "",
|
||||||
@@ -702,11 +700,11 @@
|
|||||||
"payers": ""
|
"payers": ""
|
||||||
},
|
},
|
||||||
"cdk_dealerid": "",
|
"cdk_dealerid": "",
|
||||||
"rr_dealerid": "",
|
|
||||||
"costsmapping": "",
|
"costsmapping": "",
|
||||||
"dms_allocations": "",
|
"dms_allocations": "",
|
||||||
"pbs_serialnumber": "",
|
"pbs_serialnumber": "",
|
||||||
"profitsmapping": "",
|
"profitsmapping": "",
|
||||||
|
"rr_dealerid": "",
|
||||||
"title": ""
|
"title": ""
|
||||||
},
|
},
|
||||||
"emaillater": "",
|
"emaillater": "",
|
||||||
@@ -733,6 +731,8 @@
|
|||||||
"followers": ""
|
"followers": ""
|
||||||
},
|
},
|
||||||
"orderstatuses": "",
|
"orderstatuses": "",
|
||||||
|
"parts_shop_management": "",
|
||||||
|
"parts_vendor_management": "",
|
||||||
"partslocations": "",
|
"partslocations": "",
|
||||||
"partsscan": "",
|
"partsscan": "",
|
||||||
"printlater": "",
|
"printlater": "",
|
||||||
@@ -1247,6 +1247,7 @@
|
|||||||
"login": "",
|
"login": "",
|
||||||
"next": "",
|
"next": "",
|
||||||
"ok": "",
|
"ok": "",
|
||||||
|
"optional": "",
|
||||||
"previous": "",
|
"previous": "",
|
||||||
"print": "",
|
"print": "",
|
||||||
"refresh": "",
|
"refresh": "",
|
||||||
@@ -1257,6 +1258,7 @@
|
|||||||
"save": "Salvar",
|
"save": "Salvar",
|
||||||
"saveandnew": "",
|
"saveandnew": "",
|
||||||
"saveas": "",
|
"saveas": "",
|
||||||
|
"select": "",
|
||||||
"selectall": "",
|
"selectall": "",
|
||||||
"send": "",
|
"send": "",
|
||||||
"sendbysms": "",
|
"sendbysms": "",
|
||||||
@@ -1286,9 +1288,8 @@
|
|||||||
"vehicle": ""
|
"vehicle": ""
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
"selected": "",
|
"apply": "",
|
||||||
"actions": "Comportamiento",
|
"actions": "Comportamiento",
|
||||||
"settings": "",
|
|
||||||
"areyousure": "",
|
"areyousure": "",
|
||||||
"barcode": "código de barras",
|
"barcode": "código de barras",
|
||||||
"cancel": "",
|
"cancel": "",
|
||||||
@@ -1341,8 +1342,10 @@
|
|||||||
"search": "Buscar...",
|
"search": "Buscar...",
|
||||||
"searchresults": "",
|
"searchresults": "",
|
||||||
"selectdate": "",
|
"selectdate": "",
|
||||||
|
"selected": "",
|
||||||
"sendagain": "",
|
"sendagain": "",
|
||||||
"sendby": "",
|
"sendby": "",
|
||||||
|
"settings": "",
|
||||||
"signin": "",
|
"signin": "",
|
||||||
"sms": "",
|
"sms": "",
|
||||||
"status": "",
|
"status": "",
|
||||||
@@ -1585,13 +1588,13 @@
|
|||||||
"labels": {
|
"labels": {
|
||||||
"adjustmenttobeadded": "",
|
"adjustmenttobeadded": "",
|
||||||
"billref": "",
|
"billref": "",
|
||||||
|
"bulk_location_help": "",
|
||||||
"convertedtolabor": "",
|
"convertedtolabor": "",
|
||||||
"edit": "Línea de edición",
|
"edit": "Línea de edición",
|
||||||
"ioucreated": "",
|
"ioucreated": "",
|
||||||
"new": "Nueva línea",
|
"new": "Nueva línea",
|
||||||
"nostatus": "",
|
"nostatus": "",
|
||||||
"presets": "",
|
"presets": ""
|
||||||
"bulk_location_help": ""
|
|
||||||
},
|
},
|
||||||
"successes": {
|
"successes": {
|
||||||
"created": "",
|
"created": "",
|
||||||
@@ -1700,8 +1703,8 @@
|
|||||||
"actual_in": "Real en",
|
"actual_in": "Real en",
|
||||||
"acv_amount": "",
|
"acv_amount": "",
|
||||||
"adjustment_bottom_line": "Ajustes",
|
"adjustment_bottom_line": "Ajustes",
|
||||||
"admin_clerk": "",
|
|
||||||
"adjustmenthours": "",
|
"adjustmenthours": "",
|
||||||
|
"admin_clerk": "",
|
||||||
"alt_transport": "",
|
"alt_transport": "",
|
||||||
"area_of_damage_impact": {
|
"area_of_damage_impact": {
|
||||||
"10": "",
|
"10": "",
|
||||||
@@ -1782,9 +1785,8 @@
|
|||||||
"ded_status": "Estado deducible",
|
"ded_status": "Estado deducible",
|
||||||
"depreciation_taxes": "Depreciación / Impuestos",
|
"depreciation_taxes": "Depreciación / Impuestos",
|
||||||
"dms": {
|
"dms": {
|
||||||
"first_name": "",
|
|
||||||
"last_name": "",
|
|
||||||
"address": "",
|
"address": "",
|
||||||
|
"advisor": "",
|
||||||
"amount": "",
|
"amount": "",
|
||||||
"center": "",
|
"center": "",
|
||||||
"control_type": {
|
"control_type": {
|
||||||
@@ -1795,21 +1797,23 @@
|
|||||||
"dms_make": "",
|
"dms_make": "",
|
||||||
"dms_model": "",
|
"dms_model": "",
|
||||||
"dms_model_override": "",
|
"dms_model_override": "",
|
||||||
"make_override": "",
|
|
||||||
"advisor": "",
|
|
||||||
"dms_unsold": "",
|
"dms_unsold": "",
|
||||||
"dms_wip_acctnumber": "",
|
"dms_wip_acctnumber": "",
|
||||||
|
"first_name": "",
|
||||||
"id": "",
|
"id": "",
|
||||||
"inservicedate": "",
|
"inservicedate": "",
|
||||||
"journal": "",
|
"journal": "",
|
||||||
|
"last_name": "",
|
||||||
"lines": "",
|
"lines": "",
|
||||||
|
"make_override": "",
|
||||||
"name1": "",
|
"name1": "",
|
||||||
"payer": {
|
"payer": {
|
||||||
"amount": "",
|
"amount": "",
|
||||||
"control_type": "",
|
"control_type": "",
|
||||||
"controlnumber": "",
|
"controlnumber": "",
|
||||||
"dms_acctnumber": "",
|
"dms_acctnumber": "",
|
||||||
"name": ""
|
"name": "",
|
||||||
|
"payer_type": ""
|
||||||
},
|
},
|
||||||
"sale": "",
|
"sale": "",
|
||||||
"sale_dms_acctnumber": "",
|
"sale_dms_acctnumber": "",
|
||||||
@@ -2444,6 +2448,7 @@
|
|||||||
"labels": {
|
"labels": {
|
||||||
"addlabel": "",
|
"addlabel": "",
|
||||||
"archive": "",
|
"archive": "",
|
||||||
|
"mark_unread": "",
|
||||||
"maxtenimages": "",
|
"maxtenimages": "",
|
||||||
"messaging": "Mensajería",
|
"messaging": "Mensajería",
|
||||||
"no_consent": "",
|
"no_consent": "",
|
||||||
@@ -2456,8 +2461,7 @@
|
|||||||
"selectmedia": "",
|
"selectmedia": "",
|
||||||
"sentby": "",
|
"sentby": "",
|
||||||
"typeamessage": "Enviar un mensaje...",
|
"typeamessage": "Enviar un mensaje...",
|
||||||
"unarchive": "",
|
"unarchive": ""
|
||||||
"mark_unread": ""
|
|
||||||
},
|
},
|
||||||
"render": {
|
"render": {
|
||||||
"conversation_list": ""
|
"conversation_list": ""
|
||||||
@@ -2611,20 +2615,20 @@
|
|||||||
"name": ""
|
"name": ""
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
|
"cell": "",
|
||||||
"create_new": "Crea un nuevo registro de propietario.",
|
"create_new": "Crea un nuevo registro de propietario.",
|
||||||
"deleteconfirm": "",
|
"deleteconfirm": "",
|
||||||
|
"email": "",
|
||||||
"existing_owners": "Propietarios existentes",
|
"existing_owners": "Propietarios existentes",
|
||||||
"fromclaim": "",
|
"fromclaim": "",
|
||||||
"fromowner": "",
|
"fromowner": "",
|
||||||
"relatedjobs": "",
|
|
||||||
"updateowner": "",
|
|
||||||
"work": "",
|
|
||||||
"home": "",
|
"home": "",
|
||||||
"cell": "",
|
|
||||||
"other": "",
|
"other": "",
|
||||||
"email": "",
|
|
||||||
"phone": "",
|
"phone": "",
|
||||||
"sms": ""
|
"relatedjobs": "",
|
||||||
|
"sms": "",
|
||||||
|
"updateowner": "",
|
||||||
|
"work": ""
|
||||||
},
|
},
|
||||||
"successes": {
|
"successes": {
|
||||||
"delete": "",
|
"delete": "",
|
||||||
@@ -2635,6 +2639,10 @@
|
|||||||
"actions": {
|
"actions": {
|
||||||
"order": "Pedido de piezas",
|
"order": "Pedido de piezas",
|
||||||
"orderinhouse": ""
|
"orderinhouse": ""
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"view_counts_only": "",
|
||||||
|
"view_timestamps": ""
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"parts_dispatch": {
|
"parts_dispatch": {
|
||||||
@@ -2984,8 +2992,6 @@
|
|||||||
"settings": ""
|
"settings": ""
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
"click_for_statuses": "",
|
|
||||||
"partsreceived": "",
|
|
||||||
"actual_in": "",
|
"actual_in": "",
|
||||||
"addnewprofile": "",
|
"addnewprofile": "",
|
||||||
"alert": "",
|
"alert": "",
|
||||||
@@ -3004,6 +3010,7 @@
|
|||||||
"card_size": "",
|
"card_size": "",
|
||||||
"cardcolor": "",
|
"cardcolor": "",
|
||||||
"cardsettings": "",
|
"cardsettings": "",
|
||||||
|
"click_for_statuses": "",
|
||||||
"clm_no": "",
|
"clm_no": "",
|
||||||
"comment": "",
|
"comment": "",
|
||||||
"compact": "",
|
"compact": "",
|
||||||
@@ -3024,6 +3031,7 @@
|
|||||||
"orientation": "",
|
"orientation": "",
|
||||||
"ownr_nm": "",
|
"ownr_nm": "",
|
||||||
"paintpriority": "",
|
"paintpriority": "",
|
||||||
|
"partsreceived": "",
|
||||||
"partsstatus": "",
|
"partsstatus": "",
|
||||||
"production_note": "",
|
"production_note": "",
|
||||||
"refinishhours": "",
|
"refinishhours": "",
|
||||||
@@ -3570,18 +3578,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"titles": {
|
"titles": {
|
||||||
"simplified-parts-jobs": "",
|
|
||||||
"parts": "",
|
|
||||||
"parts_settings": "",
|
|
||||||
"accounting-payables": "",
|
"accounting-payables": "",
|
||||||
"accounting-payments": "",
|
"accounting-payments": "",
|
||||||
"accounting-receivables": "",
|
"accounting-receivables": "",
|
||||||
"all_tasks": "",
|
"all_tasks": "",
|
||||||
"app": "",
|
"app": "",
|
||||||
"bc": {
|
"bc": {
|
||||||
"simplified-parts-jobs": "",
|
|
||||||
"parts": "",
|
|
||||||
"parts_settings": "",
|
|
||||||
"accounting-payables": "",
|
"accounting-payables": "",
|
||||||
"accounting-payments": "",
|
"accounting-payments": "",
|
||||||
"accounting-receivables": "",
|
"accounting-receivables": "",
|
||||||
@@ -3613,7 +3615,9 @@
|
|||||||
"my_tasks": "",
|
"my_tasks": "",
|
||||||
"owner-detail": "",
|
"owner-detail": "",
|
||||||
"owners": "",
|
"owners": "",
|
||||||
|
"parts": "",
|
||||||
"parts-queue": "",
|
"parts-queue": "",
|
||||||
|
"parts_settings": "",
|
||||||
"payments-all": "",
|
"payments-all": "",
|
||||||
"phonebook": "",
|
"phonebook": "",
|
||||||
"productionboard": "",
|
"productionboard": "",
|
||||||
@@ -3625,6 +3629,7 @@
|
|||||||
"shop-csi": "",
|
"shop-csi": "",
|
||||||
"shop-templates": "",
|
"shop-templates": "",
|
||||||
"shop-vendors": "",
|
"shop-vendors": "",
|
||||||
|
"simplified-parts-jobs": "",
|
||||||
"tasks": "",
|
"tasks": "",
|
||||||
"temporarydocs": "",
|
"temporarydocs": "",
|
||||||
"timetickets": "",
|
"timetickets": "",
|
||||||
@@ -3660,7 +3665,9 @@
|
|||||||
"my_tasks": "",
|
"my_tasks": "",
|
||||||
"owners": "Todos los propietarios | {{app}}",
|
"owners": "Todos los propietarios | {{app}}",
|
||||||
"owners-detail": "",
|
"owners-detail": "",
|
||||||
|
"parts": "",
|
||||||
"parts-queue": "",
|
"parts-queue": "",
|
||||||
|
"parts_settings": "",
|
||||||
"payments-all": "",
|
"payments-all": "",
|
||||||
"phonebook": "",
|
"phonebook": "",
|
||||||
"productionboard": "",
|
"productionboard": "",
|
||||||
@@ -3676,6 +3683,7 @@
|
|||||||
"shop-csi": "",
|
"shop-csi": "",
|
||||||
"shop-templates": "",
|
"shop-templates": "",
|
||||||
"shop_vendors": "Vendedores | {{app}}",
|
"shop_vendors": "Vendedores | {{app}}",
|
||||||
|
"simplified-parts-jobs": "",
|
||||||
"tasks": "",
|
"tasks": "",
|
||||||
"techconsole": "{{app}}",
|
"techconsole": "{{app}}",
|
||||||
"techjobclock": "{{app}}",
|
"techjobclock": "{{app}}",
|
||||||
@@ -3836,10 +3844,10 @@
|
|||||||
"user": {
|
"user": {
|
||||||
"actions": {
|
"actions": {
|
||||||
"changepassword": "",
|
"changepassword": "",
|
||||||
"signout": "desconectar",
|
"dark_theme": "",
|
||||||
"updateprofile": "Actualización del perfil",
|
|
||||||
"light_theme": "",
|
"light_theme": "",
|
||||||
"dark_theme": ""
|
"signout": "desconectar",
|
||||||
|
"updateprofile": "Actualización del perfil"
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"updating": ""
|
"updating": ""
|
||||||
@@ -3853,14 +3861,14 @@
|
|||||||
"labels": {
|
"labels": {
|
||||||
"actions": "",
|
"actions": "",
|
||||||
"changepassword": "",
|
"changepassword": "",
|
||||||
"profileinfo": "",
|
|
||||||
"user_settings": "",
|
|
||||||
"play_sound_for_new_messages": "",
|
|
||||||
"notification_sound_on": "",
|
|
||||||
"notification_sound_off": "",
|
|
||||||
"notification_sound_enabled": "",
|
|
||||||
"notification_sound_disabled": "",
|
"notification_sound_disabled": "",
|
||||||
"notification_sound_help": ""
|
"notification_sound_enabled": "",
|
||||||
|
"notification_sound_help": "",
|
||||||
|
"notification_sound_off": "",
|
||||||
|
"notification_sound_on": "",
|
||||||
|
"play_sound_for_new_messages": "",
|
||||||
|
"profileinfo": "",
|
||||||
|
"user_settings": ""
|
||||||
},
|
},
|
||||||
"successess": {
|
"successess": {
|
||||||
"passwordchanged": ""
|
"passwordchanged": ""
|
||||||
|
|||||||
@@ -48,6 +48,7 @@
|
|||||||
"arrivedon": "Arrivé le:",
|
"arrivedon": "Arrivé le:",
|
||||||
"arrivingjobs": "",
|
"arrivingjobs": "",
|
||||||
"blocked": "",
|
"blocked": "",
|
||||||
|
"bp": "",
|
||||||
"cancelledappointment": "Rendez-vous annulé pour:",
|
"cancelledappointment": "Rendez-vous annulé pour:",
|
||||||
"completingjobs": "",
|
"completingjobs": "",
|
||||||
"dataconsistency": "",
|
"dataconsistency": "",
|
||||||
@@ -59,18 +60,17 @@
|
|||||||
"noarrivingjobs": "",
|
"noarrivingjobs": "",
|
||||||
"nocompletingjobs": "",
|
"nocompletingjobs": "",
|
||||||
"nodateselected": "Aucune date n'a été sélectionnée.",
|
"nodateselected": "Aucune date n'a été sélectionnée.",
|
||||||
|
"owner": "",
|
||||||
"priorappointments": "Rendez-vous précédents",
|
"priorappointments": "Rendez-vous précédents",
|
||||||
"reminder": "",
|
"reminder": "",
|
||||||
|
"ro_number": "",
|
||||||
|
"scheduled_completion": "",
|
||||||
"scheduledfor": "Rendez-vous prévu pour:",
|
"scheduledfor": "Rendez-vous prévu pour:",
|
||||||
"severalerrorsfound": "",
|
"severalerrorsfound": "",
|
||||||
"smartscheduling": "",
|
"smartscheduling": "",
|
||||||
"smspaymentreminder": "",
|
"smspaymentreminder": "",
|
||||||
"suggesteddates": "",
|
"suggesteddates": "",
|
||||||
"ro_number": "",
|
"vehicle": ""
|
||||||
"owner": "",
|
|
||||||
"vehicle": "",
|
|
||||||
"bp": "",
|
|
||||||
"scheduled_completion": ""
|
|
||||||
},
|
},
|
||||||
"successes": {
|
"successes": {
|
||||||
"canceled": "Rendez-vous annulé avec succès.",
|
"canceled": "Rendez-vous annulé avec succès.",
|
||||||
@@ -90,6 +90,11 @@
|
|||||||
"actions": "actes"
|
"actions": "actes"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"audio": {
|
||||||
|
"manager": {
|
||||||
|
"description": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
"audit": {
|
"audit": {
|
||||||
"fields": {
|
"fields": {
|
||||||
"cc": "",
|
"cc": "",
|
||||||
@@ -149,11 +154,6 @@
|
|||||||
"tasks_updated": ""
|
"tasks_updated": ""
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"audio": {
|
|
||||||
"manager": {
|
|
||||||
"description": ""
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"billlines": {
|
"billlines": {
|
||||||
"actions": {
|
"actions": {
|
||||||
"newline": ""
|
"newline": ""
|
||||||
@@ -281,9 +281,9 @@
|
|||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"creatingdefaultview": "",
|
"creatingdefaultview": "",
|
||||||
|
"duplicate_insurance_company": "",
|
||||||
"loading": "Impossible de charger les détails de la boutique. Veuillez appeler le support technique.",
|
"loading": "Impossible de charger les détails de la boutique. Veuillez appeler le support technique.",
|
||||||
"saving": "",
|
"saving": ""
|
||||||
"duplicate_insurance_company": ""
|
|
||||||
},
|
},
|
||||||
"fields": {
|
"fields": {
|
||||||
"ReceivableCustomField": "",
|
"ReceivableCustomField": "",
|
||||||
@@ -564,21 +564,18 @@
|
|||||||
"responsibilitycenter_tax_tier": "",
|
"responsibilitycenter_tax_tier": "",
|
||||||
"responsibilitycenter_tax_type": "",
|
"responsibilitycenter_tax_type": "",
|
||||||
"responsibilitycenters": {
|
"responsibilitycenters": {
|
||||||
"gogcode": "",
|
|
||||||
"item_type": "Item Type",
|
|
||||||
"item_type_gog": "",
|
|
||||||
"item_type_paint": "",
|
|
||||||
"item_type_freight": "",
|
|
||||||
"taxable_flag": "",
|
|
||||||
"taxable": "",
|
|
||||||
"nontaxable": "",
|
|
||||||
"ap": "",
|
"ap": "",
|
||||||
"ar": "",
|
"ar": "",
|
||||||
"ats": "",
|
"ats": "",
|
||||||
"federal_tax": "",
|
"federal_tax": "",
|
||||||
"federal_tax_itc": "",
|
"federal_tax_itc": "",
|
||||||
|
"gogcode": "",
|
||||||
"gst_override": "",
|
"gst_override": "",
|
||||||
"invoiceexemptcode": "",
|
"invoiceexemptcode": "",
|
||||||
|
"item_type": "Item Type",
|
||||||
|
"item_type_freight": "",
|
||||||
|
"item_type_gog": "",
|
||||||
|
"item_type_paint": "",
|
||||||
"itemexemptcode": "",
|
"itemexemptcode": "",
|
||||||
"la1": "",
|
"la1": "",
|
||||||
"la2": "",
|
"la2": "",
|
||||||
@@ -597,6 +594,7 @@
|
|||||||
"local_tax": "",
|
"local_tax": "",
|
||||||
"mapa": "",
|
"mapa": "",
|
||||||
"mash": "",
|
"mash": "",
|
||||||
|
"nontaxable": "",
|
||||||
"paa": "",
|
"paa": "",
|
||||||
"pac": "",
|
"pac": "",
|
||||||
"pag": "",
|
"pag": "",
|
||||||
@@ -617,6 +615,8 @@
|
|||||||
"state": ""
|
"state": ""
|
||||||
},
|
},
|
||||||
"state_tax": "",
|
"state_tax": "",
|
||||||
|
"taxable": "",
|
||||||
|
"taxable_flag": "",
|
||||||
"tow": ""
|
"tow": ""
|
||||||
},
|
},
|
||||||
"schedule_end_time": "",
|
"schedule_end_time": "",
|
||||||
@@ -678,8 +678,6 @@
|
|||||||
"zip_post": ""
|
"zip_post": ""
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
"parts_shop_management": "",
|
|
||||||
"parts_vendor_management": "",
|
|
||||||
"2tiername": "",
|
"2tiername": "",
|
||||||
"2tiersetup": "",
|
"2tiersetup": "",
|
||||||
"2tiersource": "",
|
"2tiersource": "",
|
||||||
@@ -702,11 +700,11 @@
|
|||||||
"payers": ""
|
"payers": ""
|
||||||
},
|
},
|
||||||
"cdk_dealerid": "",
|
"cdk_dealerid": "",
|
||||||
"rr_dealerid": "",
|
|
||||||
"costsmapping": "",
|
"costsmapping": "",
|
||||||
"dms_allocations": "",
|
"dms_allocations": "",
|
||||||
"pbs_serialnumber": "",
|
"pbs_serialnumber": "",
|
||||||
"profitsmapping": "",
|
"profitsmapping": "",
|
||||||
|
"rr_dealerid": "",
|
||||||
"title": ""
|
"title": ""
|
||||||
},
|
},
|
||||||
"emaillater": "",
|
"emaillater": "",
|
||||||
@@ -733,6 +731,8 @@
|
|||||||
"followers": ""
|
"followers": ""
|
||||||
},
|
},
|
||||||
"orderstatuses": "",
|
"orderstatuses": "",
|
||||||
|
"parts_shop_management": "",
|
||||||
|
"parts_vendor_management": "",
|
||||||
"partslocations": "",
|
"partslocations": "",
|
||||||
"partsscan": "",
|
"partsscan": "",
|
||||||
"printlater": "",
|
"printlater": "",
|
||||||
@@ -1247,6 +1247,7 @@
|
|||||||
"login": "",
|
"login": "",
|
||||||
"next": "",
|
"next": "",
|
||||||
"ok": "",
|
"ok": "",
|
||||||
|
"optional": "",
|
||||||
"previous": "",
|
"previous": "",
|
||||||
"print": "",
|
"print": "",
|
||||||
"refresh": "",
|
"refresh": "",
|
||||||
@@ -1257,6 +1258,7 @@
|
|||||||
"save": "sauvegarder",
|
"save": "sauvegarder",
|
||||||
"saveandnew": "",
|
"saveandnew": "",
|
||||||
"saveas": "",
|
"saveas": "",
|
||||||
|
"select": "",
|
||||||
"selectall": "",
|
"selectall": "",
|
||||||
"send": "",
|
"send": "",
|
||||||
"sendbysms": "",
|
"sendbysms": "",
|
||||||
@@ -1286,8 +1288,7 @@
|
|||||||
"vehicle": ""
|
"vehicle": ""
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
"selected": "",
|
"apply": "",
|
||||||
"settings": "",
|
|
||||||
"actions": "actes",
|
"actions": "actes",
|
||||||
"areyousure": "",
|
"areyousure": "",
|
||||||
"barcode": "code à barre",
|
"barcode": "code à barre",
|
||||||
@@ -1341,8 +1342,10 @@
|
|||||||
"search": "Chercher...",
|
"search": "Chercher...",
|
||||||
"searchresults": "",
|
"searchresults": "",
|
||||||
"selectdate": "",
|
"selectdate": "",
|
||||||
|
"selected": "",
|
||||||
"sendagain": "",
|
"sendagain": "",
|
||||||
"sendby": "",
|
"sendby": "",
|
||||||
|
"settings": "",
|
||||||
"signin": "",
|
"signin": "",
|
||||||
"sms": "",
|
"sms": "",
|
||||||
"status": "",
|
"status": "",
|
||||||
@@ -1585,13 +1588,13 @@
|
|||||||
"labels": {
|
"labels": {
|
||||||
"adjustmenttobeadded": "",
|
"adjustmenttobeadded": "",
|
||||||
"billref": "",
|
"billref": "",
|
||||||
|
"bulk_location_help": "",
|
||||||
"convertedtolabor": "",
|
"convertedtolabor": "",
|
||||||
"edit": "Ligne d'édition",
|
"edit": "Ligne d'édition",
|
||||||
"ioucreated": "",
|
"ioucreated": "",
|
||||||
"new": "Nouvelle ligne",
|
"new": "Nouvelle ligne",
|
||||||
"nostatus": "",
|
"nostatus": "",
|
||||||
"presets": "",
|
"presets": ""
|
||||||
"bulk_location_help": ""
|
|
||||||
},
|
},
|
||||||
"successes": {
|
"successes": {
|
||||||
"created": "",
|
"created": "",
|
||||||
@@ -1699,9 +1702,9 @@
|
|||||||
"actual_delivery": "Livraison réelle",
|
"actual_delivery": "Livraison réelle",
|
||||||
"actual_in": "En réel",
|
"actual_in": "En réel",
|
||||||
"acv_amount": "",
|
"acv_amount": "",
|
||||||
"admin_clerk": "",
|
|
||||||
"adjustment_bottom_line": "Ajustements",
|
"adjustment_bottom_line": "Ajustements",
|
||||||
"adjustmenthours": "",
|
"adjustmenthours": "",
|
||||||
|
"admin_clerk": "",
|
||||||
"alt_transport": "",
|
"alt_transport": "",
|
||||||
"area_of_damage_impact": {
|
"area_of_damage_impact": {
|
||||||
"10": "",
|
"10": "",
|
||||||
@@ -1782,9 +1785,8 @@
|
|||||||
"ded_status": "Statut de franchise",
|
"ded_status": "Statut de franchise",
|
||||||
"depreciation_taxes": "Amortissement / taxes",
|
"depreciation_taxes": "Amortissement / taxes",
|
||||||
"dms": {
|
"dms": {
|
||||||
"first_name": "",
|
|
||||||
"last_name": "",
|
|
||||||
"address": "",
|
"address": "",
|
||||||
|
"advisor": "",
|
||||||
"amount": "",
|
"amount": "",
|
||||||
"center": "",
|
"center": "",
|
||||||
"control_type": {
|
"control_type": {
|
||||||
@@ -1795,21 +1797,23 @@
|
|||||||
"dms_make": "",
|
"dms_make": "",
|
||||||
"dms_model": "",
|
"dms_model": "",
|
||||||
"dms_model_override": "",
|
"dms_model_override": "",
|
||||||
"make_override": "",
|
|
||||||
"advisor": "",
|
|
||||||
"dms_unsold": "",
|
"dms_unsold": "",
|
||||||
"dms_wip_acctnumber": "",
|
"dms_wip_acctnumber": "",
|
||||||
|
"first_name": "",
|
||||||
"id": "",
|
"id": "",
|
||||||
"inservicedate": "",
|
"inservicedate": "",
|
||||||
"journal": "",
|
"journal": "",
|
||||||
|
"last_name": "",
|
||||||
"lines": "",
|
"lines": "",
|
||||||
|
"make_override": "",
|
||||||
"name1": "",
|
"name1": "",
|
||||||
"payer": {
|
"payer": {
|
||||||
"amount": "",
|
"amount": "",
|
||||||
"control_type": "",
|
"control_type": "",
|
||||||
"controlnumber": "",
|
"controlnumber": "",
|
||||||
"dms_acctnumber": "",
|
"dms_acctnumber": "",
|
||||||
"name": ""
|
"name": "",
|
||||||
|
"payer_type": ""
|
||||||
},
|
},
|
||||||
"sale": "",
|
"sale": "",
|
||||||
"sale_dms_acctnumber": "",
|
"sale_dms_acctnumber": "",
|
||||||
@@ -2433,7 +2437,6 @@
|
|||||||
"actions": {
|
"actions": {
|
||||||
"link": "",
|
"link": "",
|
||||||
"new": "",
|
"new": "",
|
||||||
|
|
||||||
"openchat": ""
|
"openchat": ""
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
@@ -2445,6 +2448,7 @@
|
|||||||
"labels": {
|
"labels": {
|
||||||
"addlabel": "",
|
"addlabel": "",
|
||||||
"archive": "",
|
"archive": "",
|
||||||
|
"mark_unread": "",
|
||||||
"maxtenimages": "",
|
"maxtenimages": "",
|
||||||
"messaging": "Messagerie",
|
"messaging": "Messagerie",
|
||||||
"no_consent": "",
|
"no_consent": "",
|
||||||
@@ -2457,8 +2461,7 @@
|
|||||||
"selectmedia": "",
|
"selectmedia": "",
|
||||||
"sentby": "",
|
"sentby": "",
|
||||||
"typeamessage": "Envoyer un message...",
|
"typeamessage": "Envoyer un message...",
|
||||||
"unarchive": "",
|
"unarchive": ""
|
||||||
"mark_unread": ""
|
|
||||||
},
|
},
|
||||||
"render": {
|
"render": {
|
||||||
"conversation_list": ""
|
"conversation_list": ""
|
||||||
@@ -2612,20 +2615,20 @@
|
|||||||
"name": ""
|
"name": ""
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
|
"cell": "",
|
||||||
"create_new": "Créez un nouvel enregistrement de propriétaire.",
|
"create_new": "Créez un nouvel enregistrement de propriétaire.",
|
||||||
"deleteconfirm": "",
|
"deleteconfirm": "",
|
||||||
|
"email": "",
|
||||||
"existing_owners": "Propriétaires existants",
|
"existing_owners": "Propriétaires existants",
|
||||||
"fromclaim": "",
|
"fromclaim": "",
|
||||||
"fromowner": "",
|
"fromowner": "",
|
||||||
"relatedjobs": "",
|
|
||||||
"updateowner": "",
|
|
||||||
"work": "",
|
|
||||||
"home": "",
|
"home": "",
|
||||||
"cell": "",
|
|
||||||
"other": "",
|
"other": "",
|
||||||
"email": "",
|
|
||||||
"phone": "",
|
"phone": "",
|
||||||
"sms": ""
|
"relatedjobs": "",
|
||||||
|
"sms": "",
|
||||||
|
"updateowner": "",
|
||||||
|
"work": ""
|
||||||
},
|
},
|
||||||
"successes": {
|
"successes": {
|
||||||
"delete": "",
|
"delete": "",
|
||||||
@@ -2636,6 +2639,10 @@
|
|||||||
"actions": {
|
"actions": {
|
||||||
"order": "Commander des pièces",
|
"order": "Commander des pièces",
|
||||||
"orderinhouse": ""
|
"orderinhouse": ""
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"view_counts_only": "",
|
||||||
|
"view_timestamps": ""
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"parts_dispatch": {
|
"parts_dispatch": {
|
||||||
@@ -2985,8 +2992,6 @@
|
|||||||
"settings": ""
|
"settings": ""
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
"click_for_statuses": "",
|
|
||||||
"partsreceived": "",
|
|
||||||
"actual_in": "",
|
"actual_in": "",
|
||||||
"addnewprofile": "",
|
"addnewprofile": "",
|
||||||
"alert": "",
|
"alert": "",
|
||||||
@@ -3005,6 +3010,7 @@
|
|||||||
"card_size": "",
|
"card_size": "",
|
||||||
"cardcolor": "",
|
"cardcolor": "",
|
||||||
"cardsettings": "",
|
"cardsettings": "",
|
||||||
|
"click_for_statuses": "",
|
||||||
"clm_no": "",
|
"clm_no": "",
|
||||||
"comment": "",
|
"comment": "",
|
||||||
"compact": "",
|
"compact": "",
|
||||||
@@ -3025,6 +3031,7 @@
|
|||||||
"orientation": "",
|
"orientation": "",
|
||||||
"ownr_nm": "",
|
"ownr_nm": "",
|
||||||
"paintpriority": "",
|
"paintpriority": "",
|
||||||
|
"partsreceived": "",
|
||||||
"partsstatus": "",
|
"partsstatus": "",
|
||||||
"production_note": "",
|
"production_note": "",
|
||||||
"refinishhours": "",
|
"refinishhours": "",
|
||||||
@@ -3571,18 +3578,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"titles": {
|
"titles": {
|
||||||
"simplified-parts-jobs": "",
|
|
||||||
"parts": "",
|
|
||||||
"parts_settings": "",
|
|
||||||
"accounting-payables": "",
|
"accounting-payables": "",
|
||||||
"accounting-payments": "",
|
"accounting-payments": "",
|
||||||
"accounting-receivables": "",
|
"accounting-receivables": "",
|
||||||
"all_tasks": "",
|
"all_tasks": "",
|
||||||
"app": "",
|
"app": "",
|
||||||
"bc": {
|
"bc": {
|
||||||
"simplified-parts-jobs": "",
|
|
||||||
"parts": "",
|
|
||||||
"parts_settings": "",
|
|
||||||
"accounting-payables": "",
|
"accounting-payables": "",
|
||||||
"accounting-payments": "",
|
"accounting-payments": "",
|
||||||
"accounting-receivables": "",
|
"accounting-receivables": "",
|
||||||
@@ -3614,7 +3615,9 @@
|
|||||||
"my_tasks": "",
|
"my_tasks": "",
|
||||||
"owner-detail": "",
|
"owner-detail": "",
|
||||||
"owners": "",
|
"owners": "",
|
||||||
|
"parts": "",
|
||||||
"parts-queue": "",
|
"parts-queue": "",
|
||||||
|
"parts_settings": "",
|
||||||
"payments-all": "",
|
"payments-all": "",
|
||||||
"phonebook": "",
|
"phonebook": "",
|
||||||
"productionboard": "",
|
"productionboard": "",
|
||||||
@@ -3626,6 +3629,7 @@
|
|||||||
"shop-csi": "",
|
"shop-csi": "",
|
||||||
"shop-templates": "",
|
"shop-templates": "",
|
||||||
"shop-vendors": "",
|
"shop-vendors": "",
|
||||||
|
"simplified-parts-jobs": "",
|
||||||
"tasks": "",
|
"tasks": "",
|
||||||
"temporarydocs": "",
|
"temporarydocs": "",
|
||||||
"timetickets": "",
|
"timetickets": "",
|
||||||
@@ -3661,7 +3665,9 @@
|
|||||||
"my_tasks": "",
|
"my_tasks": "",
|
||||||
"owners": "Tous les propriétaires | {{app}}",
|
"owners": "Tous les propriétaires | {{app}}",
|
||||||
"owners-detail": "",
|
"owners-detail": "",
|
||||||
|
"parts": "",
|
||||||
"parts-queue": "",
|
"parts-queue": "",
|
||||||
|
"parts_settings": "",
|
||||||
"payments-all": "",
|
"payments-all": "",
|
||||||
"phonebook": "",
|
"phonebook": "",
|
||||||
"productionboard": "",
|
"productionboard": "",
|
||||||
@@ -3677,6 +3683,7 @@
|
|||||||
"shop-csi": "",
|
"shop-csi": "",
|
||||||
"shop-templates": "",
|
"shop-templates": "",
|
||||||
"shop_vendors": "Vendeurs | {{app}}",
|
"shop_vendors": "Vendeurs | {{app}}",
|
||||||
|
"simplified-parts-jobs": "",
|
||||||
"tasks": "",
|
"tasks": "",
|
||||||
"techconsole": "{{app}}",
|
"techconsole": "{{app}}",
|
||||||
"techjobclock": "{{app}}",
|
"techjobclock": "{{app}}",
|
||||||
@@ -3837,10 +3844,10 @@
|
|||||||
"user": {
|
"user": {
|
||||||
"actions": {
|
"actions": {
|
||||||
"changepassword": "",
|
"changepassword": "",
|
||||||
"signout": "Déconnexion",
|
"dark_theme": "",
|
||||||
"updateprofile": "Mettre à jour le profil",
|
|
||||||
"light_theme": "",
|
"light_theme": "",
|
||||||
"dark_theme": ""
|
"signout": "Déconnexion",
|
||||||
|
"updateprofile": "Mettre à jour le profil"
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"updating": ""
|
"updating": ""
|
||||||
@@ -3854,14 +3861,14 @@
|
|||||||
"labels": {
|
"labels": {
|
||||||
"actions": "",
|
"actions": "",
|
||||||
"changepassword": "",
|
"changepassword": "",
|
||||||
"profileinfo": "",
|
|
||||||
"user_settings": "",
|
|
||||||
"play_sound_for_new_messages": "",
|
|
||||||
"notification_sound_on": "",
|
|
||||||
"notification_sound_off": "",
|
|
||||||
"notification_sound_enabled": "",
|
|
||||||
"notification_sound_disabled": "",
|
"notification_sound_disabled": "",
|
||||||
"notification_sound_help": ""
|
"notification_sound_enabled": "",
|
||||||
|
"notification_sound_help": "",
|
||||||
|
"notification_sound_off": "",
|
||||||
|
"notification_sound_on": "",
|
||||||
|
"play_sound_for_new_messages": "",
|
||||||
|
"profileinfo": "",
|
||||||
|
"user_settings": ""
|
||||||
},
|
},
|
||||||
"successess": {
|
"successess": {
|
||||||
"passwordchanged": ""
|
"passwordchanged": ""
|
||||||
|
|||||||
@@ -5,8 +5,10 @@ export function DateFormatter(props) {
|
|||||||
return props.children ? dayjs(props.children).format(props.includeDay ? "ddd MM/DD/YYYY" : "MM/DD/YYYY") : null;
|
return props.children ? dayjs(props.children).format(props.includeDay ? "ddd MM/DD/YYYY" : "MM/DD/YYYY") : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function DateTimeFormatter(props) {
|
export function DateTimeFormatter({ hideTime, ...props }) {
|
||||||
return props.children ? dayjs(props.children).format(props.format ? props.format : "MM/DD/YYYY hh:mm a") : null;
|
return props.children
|
||||||
|
? dayjs(props.children).format(props.format ? props.format : `MM/DD/YYYY${hideTime ? "" : " hh:mm a"}`)
|
||||||
|
: null;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function DateTimeFormatterFunction(date) {
|
export function DateTimeFormatterFunction(date) {
|
||||||
@@ -17,11 +19,11 @@ export function TimeFormatter(props) {
|
|||||||
return props.children ? dayjs(props.children).format(props.format ? props.format : "hh:mm a") : null;
|
return props.children ? dayjs(props.children).format(props.format ? props.format : "hh:mm a") : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function TimeAgoFormatter(props) {
|
export function TimeAgoFormatter({ removeAgoString = false, ...props }) {
|
||||||
const m = dayjs(props.children);
|
const m = dayjs(props.children);
|
||||||
return props.children ? (
|
return props.children ? (
|
||||||
<Tooltip placement="top" title={m.format("MM/DD/YYY hh:mm A")}>
|
<Tooltip placement="top" title={m.format("MM/DD/YYYY hh:mm A")}>
|
||||||
{m.fromNow()}
|
{m.fromNow(removeAgoString)}
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
) : null;
|
) : null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -248,7 +248,8 @@ const client = new ApolloClient({
|
|||||||
watchQuery: {
|
watchQuery: {
|
||||||
fetchPolicy: "network-only",
|
fetchPolicy: "network-only",
|
||||||
nextFetchPolicy: "network-only",
|
nextFetchPolicy: "network-only",
|
||||||
errorPolicy: "ignore"
|
errorPolicy: "ignore",
|
||||||
|
notifyOnNetworkStatusChange: false
|
||||||
},
|
},
|
||||||
query: {
|
query: {
|
||||||
fetchPolicy: "network-only",
|
fetchPolicy: "network-only",
|
||||||
|
|||||||
Reference in New Issue
Block a user