Merged in release/2024-09-13 (pull request #1725)

Release/2024 09 13 - IO-2913 - IO-2915 - IO-2733 - IO-2923 - IO-2925 - IO-2928 - IO-2927 - IO-2928 - IO-2913 - IO-2733 - IO-2926
This commit is contained in:
Dave Richer
2024-09-16 16:28:40 +00:00
17 changed files with 2633 additions and 364 deletions

View File

@@ -226,7 +226,9 @@ jobs:
command: | command: |
curl -L https://github.com/hasura/graphql-engine/raw/stable/cli/get.sh | bash curl -L https://github.com/hasura/graphql-engine/raw/stable/cli/get.sh | bash
hasura migrate apply --endpoint https://db.test.romeonline.io/ --admin-secret << parameters.secret >> hasura migrate apply --endpoint https://db.test.romeonline.io/ --admin-secret << parameters.secret >>
sleep 5
hasura metadata apply --endpoint https://db.test.romeonline.io/ --admin-secret << parameters.secret >> hasura metadata apply --endpoint https://db.test.romeonline.io/ --admin-secret << parameters.secret >>
sleep 10
hasura metadata reload --endpoint https://db.test.romeonline.io/ --admin-secret << parameters.secret >> hasura metadata reload --endpoint https://db.test.romeonline.io/ --admin-secret << parameters.secret >>
- jira/notify: - jira/notify:
environment: Test (Rome) - Hasura environment: Test (Rome) - Hasura
@@ -313,7 +315,9 @@ jobs:
command: | command: |
curl -L https://github.com/hasura/graphql-engine/raw/stable/cli/get.sh | bash curl -L https://github.com/hasura/graphql-engine/raw/stable/cli/get.sh | bash
hasura migrate apply --endpoint https://db.test.bodyshop.app/ --admin-secret << parameters.secret >> hasura migrate apply --endpoint https://db.test.bodyshop.app/ --admin-secret << parameters.secret >>
sleep 15
hasura metadata apply --endpoint https://db.test.bodyshop.app/ --admin-secret << parameters.secret >> hasura metadata apply --endpoint https://db.test.bodyshop.app/ --admin-secret << parameters.secret >>
sleep 30
hasura metadata reload --endpoint https://db.test.bodyshop.app/ --admin-secret << parameters.secret >> hasura metadata reload --endpoint https://db.test.bodyshop.app/ --admin-secret << parameters.secret >>
- jira/notify: - jira/notify:
environment: Test (ImEX) - Hasura environment: Test (ImEX) - Hasura
@@ -423,7 +427,7 @@ workflows:
secret: ${HASURA_PROD_SECRET} secret: ${HASURA_PROD_SECRET}
filters: filters:
branches: branches:
only: master only: master-AIO
- rome-api-deploy: - rome-api-deploy:
filters: filters:
branches: branches:

File diff suppressed because it is too large Load Diff

View File

@@ -2,6 +2,9 @@
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="utf-8"/> <meta charset="utf-8"/>
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
<% if (env.VITE_APP_INSTANCE === 'IMEX') { %> <% if (env.VITE_APP_INSTANCE === 'IMEX') { %>
<link rel="icon" href="/favicon.png"/> <link rel="icon" href="/favicon.png"/>
<% } %> <% if (env.VITE_APP_INSTANCE === 'ROME') { %> <% } %> <% if (env.VITE_APP_INSTANCE === 'ROME') { %>

View File

@@ -98,7 +98,7 @@ export function BillDetailEditcontainer({ setPartsOrderContext, insertAuditTrail
}); });
billlines.forEach((billline) => { billlines.forEach((billline) => {
const { deductedfromlbr, inventories, jobline, ...il } = billline; const { deductedfromlbr, inventories, jobline, original_actual_price, create_ppc, ...il } = billline;
delete il.__typename; delete il.__typename;
if (il.id) { if (il.id) {

View File

@@ -141,10 +141,14 @@ export function JobTotalsTableTotals({ bodyshop, job }) {
key: t("jobs.fields.ded_amt"), key: t("jobs.fields.ded_amt"),
total: job.job_totals.totals.custPayable.deductible total: job.job_totals.totals.custPayable.deductible
}, },
// { ...(InstanceRenderManager({
// key: t("jobs.fields.federal_tax_payable"), imex: [{
// total: job.job_totals.totals.custPayable.federal_tax, key: t("jobs.fields.federal_tax_payable"),
// }, total: job.job_totals.totals.custPayable.federal_tax
}],
rome: [],
promanager: "USE_ROME"
})),
{ {
key: t("jobs.fields.other_amount_payable"), key: t("jobs.fields.other_amount_payable"),
total: job.job_totals.totals.custPayable.other_customer_amount total: job.job_totals.totals.custPayable.other_customer_amount

View File

@@ -27,6 +27,10 @@ export default function PartsOrderModalPriceChange({ form, field }) {
key: "25", key: "25",
label: t("parts_orders.labels.discount", { percent: "25%" }) label: t("parts_orders.labels.discount", { percent: "25%" })
}, },
{
key: "40",
label: t("parts_orders.labels.discount", { percent: "40%" })
},
{ {
key: "custom", key: "custom",
label: ( label: (

View File

@@ -34,28 +34,34 @@ export function ReportCenterModalComponent({ reportCenterModal, bodyshop }) {
const [form] = Form.useForm(); const [form] = Form.useForm();
const [search, setSearch] = useState(""); const [search, setSearch] = useState("");
const { const {
treatments: { Enhanced_Payroll } treatments: { Enhanced_Payroll, ADPPayroll }
} = useSplitTreatments({ } = useSplitTreatments({
attributes: {}, attributes: {},
names: ["Enhanced_Payroll"], names: ["Enhanced_Payroll", "ADPPayroll"],
splitKey: bodyshop.imexshopid splitKey: bodyshop.imexshopid
}); });
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const { t } = useTranslation(); const { t } = useTranslation();
const Templates = TemplateList("report_center"); const Templates = TemplateList("report_center");
const ReportsList = const ReportsList = Object.keys(Templates)
Enhanced_Payroll.treatment === "on" .map((key) => Templates[key])
? Object.keys(Templates) .filter((temp) => {
.map((key) => { const enhancedPayrollOn = Enhanced_Payroll.treatment === "on";
return Templates[key]; const adpPayrollOn = ADPPayroll.treatment === "on";
})
.filter((temp) => temp.enhanced_payroll === undefined || temp.enhanced_payroll === true) if (enhancedPayrollOn && adpPayrollOn) {
: Object.keys(Templates) return temp.enhanced_payroll !== false || temp.adp_payroll !== false;
.map((key) => { }
return Templates[key]; if (enhancedPayrollOn) {
}) return temp.enhanced_payroll !== false && temp.adp_payroll !== true;
.filter((temp) => temp.enhanced_payroll === undefined || temp.enhanced_payroll === false); }
if (adpPayrollOn) {
return temp.adp_payroll !== false && temp.enhanced_payroll !== true;
}
return temp.enhanced_payroll !== true && temp.adp_payroll !== true;
});
const { open } = reportCenterModal; const { open } = reportCenterModal;
@@ -104,7 +110,7 @@ export function ReportCenterModalComponent({ reportCenterModal, bodyshop }) {
to: values.to, to: values.to,
subject: Templates[values.key]?.subject subject: Templates[values.key]?.subject
}, },
values.sendbyexcel === "excel" ? "x" : values.sendby === "email" ? "e" : "p", values.sendbytext === "text" ? values.sendbytext : values.sendbyexcel === "excel" ? "x" : values.sendby === "email" ? "e" : "p",
id id
); );
setLoading(false); setLoading(false);
@@ -291,7 +297,15 @@ export function ReportCenterModalComponent({ reportCenterModal, bodyshop }) {
</Radio.Group> </Radio.Group>
</Form.Item> </Form.Item>
); );
if (reporttype !== "excel") if (reporttype === "text")
return (
<Form.Item label={t("general.labels.sendby")} name="sendbytext" initialValue="text">
<Radio.Group>
<Radio value="text">{t("general.labels.text")}</Radio>
</Radio.Group>
</Form.Item>
);
if (reporttype !== "excel" || reporttype !== "text")
return ( return (
<Form.Item label={t("general.labels.sendby")} name="sendby" initialValue="print"> <Form.Item label={t("general.labels.sendby")} name="sendby" initialValue="print">
<Radio.Group> <Radio.Group>

View File

@@ -7,13 +7,13 @@ 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 DatePickerRanges from "../../utils/DatePickerRanges"; import DatePickerRanges from "../../utils/DatePickerRanges";
import InstanceRenderManager from "../../utils/instanceRenderMgr";
import FeatureWrapper, { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component";
import CurrencyInput from "../form-items-formatted/currency-form-item.component"; import CurrencyInput from "../form-items-formatted/currency-form-item.component";
import FormItemEmail from "../form-items-formatted/email-form-item.component"; import FormItemEmail from "../form-items-formatted/email-form-item.component";
import PhoneFormItem, { PhoneItemFormatterValidation } from "../form-items-formatted/phone-form-item.component"; import PhoneFormItem, { PhoneItemFormatterValidation } from "../form-items-formatted/phone-form-item.component";
import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component"; import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component";
import LayoutFormRow from "../layout-form-row/layout-form-row.component"; import LayoutFormRow from "../layout-form-row/layout-form-row.component";
import InstanceRenderManager from "../../utils/instanceRenderMgr";
import FeatureWrapper, { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component";
// TODO: Client Update, this might break // TODO: Client Update, this might break
const timeZonesList = Intl.supportedValuesOf("timeZone"); const timeZonesList = Intl.supportedValuesOf("timeZone");
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
@@ -28,10 +28,10 @@ export function ShopInfoGeneral({ form, bodyshop }) {
const { t } = useTranslation(); const { t } = useTranslation();
const { const {
treatments: { ClosingPeriod } treatments: { ClosingPeriod, ADPPayroll }
} = useSplitTreatments({ } = useSplitTreatments({
attributes: {}, attributes: {},
names: ["ClosingPeriod"], names: ["ClosingPeriod", "ADPPayroll"],
splitKey: bodyshop && bodyshop.imexshopid splitKey: bodyshop && bodyshop.imexshopid
}); });
@@ -98,7 +98,6 @@ export function ShopInfoGeneral({ form, bodyshop }) {
<Form.Item label={t("bodyshop.fields.email")} name="email"> <Form.Item label={t("bodyshop.fields.email")} name="email">
<Input /> <Input />
</Form.Item> </Form.Item>
<Form.Item <Form.Item
label={t("bodyshop.fields.phone")} label={t("bodyshop.fields.phone")}
name="phone" name="phone"
@@ -356,14 +355,22 @@ export function ShopInfoGeneral({ form, bodyshop }) {
<Select mode="tags" /> <Select mode="tags" />
</Form.Item> </Form.Item>
{ClosingPeriod.treatment === "on" && ( {ClosingPeriod.treatment === "on" && (
<> <Form.Item
<Form.Item name={["accountingconfig", "ClosingPeriod"]}
name={["accountingconfig", "ClosingPeriod"]} label={t("bodyshop.fields.closingperiod")} //{t("reportcenter.labels.dates")}
label={t("bodyshop.fields.closingperiod")} //{t("reportcenter.labels.dates")} >
> <DatePicker.RangePicker format="MM/DD/YYYY" presets={DatePickerRanges} />
<DatePicker.RangePicker format="MM/DD/YYYY" presets={DatePickerRanges} /> </Form.Item>
</Form.Item> )}
</> {ADPPayroll.treatment === "on" && (
<Form.Item name={["accountingconfig", "companyCode"]} label={t("bodyshop.fields.companycode")}>
<Input />
</Form.Item>
)}
{ADPPayroll.treatment === "on" && (
<Form.Item name={["accountingconfig", "batchID"]} label={t("bodyshop.fields.batchid")}>
<Input />
</Form.Item>
)} )}
</LayoutFormRow> </LayoutFormRow>
</FeatureWrapper> </FeatureWrapper>

View File

@@ -1,13 +1,14 @@
import { AlertOutlined } from "@ant-design/icons"; import { AlertOutlined } from "@ant-design/icons";
import { Alert, Button, Col, Row, Space } from "antd"; import { Alert, Button, Col, notification, Row, Space } from "antd";
import i18n from "i18next"; import i18n from "i18next";
import React, { useEffect } from "react"; import React, { useCallback, useEffect, useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { connect } from "react-redux"; import { connect } from "react-redux";
import { createStructuredSelector } from "reselect"; import { createStructuredSelector } from "reselect";
import { selectUpdateAvailable } from "../../redux/application/application.selectors"; import { selectUpdateAvailable } from "../../redux/application/application.selectors";
import { useRegisterSW } from "virtual:pwa-register/react"; import { useRegisterSW } from "virtual:pwa-register/react";
import InstanceRenderManager from "../../utils/instanceRenderMgr"; import InstanceRenderManager from "../../utils/instanceRenderMgr";
import useCountDown from "../../utils/countdownHook";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
updateAvailable: selectUpdateAvailable updateAvailable: selectUpdateAvailable
@@ -19,6 +20,15 @@ const mapDispatchToProps = (dispatch) => ({
export function UpdateAlert({ updateAvailable }) { export function UpdateAlert({ updateAvailable }) {
const { t } = useTranslation(); const { t } = useTranslation();
const [timerStarted, setTimerStarted] = useState(false);
const [loading, setLoading] = useState(false);
const [
timeLeft,
{
start //pause, resume, reset
}
] = useCountDown(180000, 1000);
const { const {
offlineReady: [offlineReady], offlineReady: [offlineReady],
needRefresh: [needRefresh], needRefresh: [needRefresh],
@@ -40,11 +50,43 @@ export function UpdateAlert({ updateAvailable }) {
} }
}); });
const ReloadNewVersion = useCallback(() => {
setLoading(true);
updateServiceWorker(true);
setTimeout(() => {
window.location.reload(true);
}, 5000);
}, [updateServiceWorker]);
useEffect(() => { useEffect(() => {
if (import.meta.env.DEV) { if (needRefresh) {
console.log(`SW Status => Refresh? ${needRefresh} - offlineReady? ${offlineReady}`); start();
setTimerStarted(true);
} }
}, [needRefresh, offlineReady]); }, [start, needRefresh, offlineReady]);
useEffect(() => {
if (needRefresh && timerStarted && timeLeft < 60000) {
notification.open({
type: "warning",
closable: false,
duration: 65000,
key: "autoupdate",
message: t("general.actions.autoupdate", {
time: (timeLeft / 1000).toFixed(0),
app: InstanceRenderManager({
imex: "$t(titles.imexonline)",
rome: "$t(titles.romeonline)",
promanager: "$t(titles.promanager)"
})
}),
placement: "bottomRight"
});
}
if (needRefresh && timerStarted && timeLeft <= 0) {
ReloadNewVersion();
}
}, [timeLeft, t, needRefresh, ReloadNewVersion, timerStarted]);
if (!needRefresh) return null; if (!needRefresh) return null;
@@ -75,9 +117,10 @@ export function UpdateAlert({ updateAvailable }) {
<Button onClick={() => window.open("https://imex-online.noticeable.news/", "_blank")}> <Button onClick={() => window.open("https://imex-online.noticeable.news/", "_blank")}>
{i18n.t("general.actions.viewreleasenotes")} {i18n.t("general.actions.viewreleasenotes")}
</Button> </Button>
<Button type="primary" onClick={() => updateServiceWorker(true)}> <Button loading={loading} type="primary" onClick={() => ReloadNewVersion()}>
{i18n.t("general.actions.refresh")} {i18n.t("general.actions.refresh")} {`(${(timeLeft / 1000).toFixed(0)} s)`}
</Button> </Button>
<Button onClick={() => start(300000)}>{i18n.t("general.actions.delay")}</Button>
</Space> </Space>
</Col> </Col>
</Row> </Row>

View File

@@ -5,7 +5,7 @@ import PhoneNumberFormatter from "../../utils/PhoneFormatter";
const { Option } = Select; const { Option } = Select;
//To be used as a form element only. // To be used as a form element only.
const VendorSearchSelect = ({ value, onChange, options, onSelect, disabled, preferredMake, showPhone }, ref) => { const VendorSearchSelect = ({ value, onChange, options, onSelect, disabled, preferredMake, showPhone }, ref) => {
const [option, setOption] = useState(value); const [option, setOption] = useState(value);
@@ -33,9 +33,25 @@ const VendorSearchSelect = ({ value, onChange, options, onSelect, disabled, pref
if (!value || !options) return label; if (!value || !options) return label;
const discount = options?.find((o) => o.id === value)?.discount; const discount = options?.find((o) => o.id === value)?.discount;
return ( return (
<div className="imex-flex-row" style={{ width: "100%" }}> <div
<div style={{ flex: 1 }}>{label}</div> style={{
display: "flex",
alignItems: "center",
flexWrap: "nowrap",
width: "100%"
}}
>
<div
style={{
flex: 1,
minWidth: 0,
overflow: "hidden",
textOverflow: "ellipsis",
whiteSpace: "nowrap"
}}
>
{label}
</div>
{discount && discount !== 0 ? <Tag color="green">{`${discount * 100}%`}</Tag> : null} {discount && discount !== 0 ? <Tag color="green">{`${discount * 100}%`}</Tag> : null}
</div> </div>
); );
@@ -45,36 +61,67 @@ const VendorSearchSelect = ({ value, onChange, options, onSelect, disabled, pref
optionFilterProp="name" optionFilterProp="name"
onSelect={onSelect} onSelect={onSelect}
disabled={disabled || false} disabled={disabled || false}
optionLabelProp={"name"} optionLabelProp="name"
> >
{favorites {favorites &&
? favorites.map((o) => ( favorites.map((o) => (
<Option key={`favorite-${o.id}`} value={o.id} name={o.name} discount={o.discount}> <Option key={`favorite-${o.id}`} value={o.id} name={o.name} discount={o.discount}>
<div className="imex-flex-row"> <div
<div style={{ flex: 1 }}>{o.name}</div> style={{
<Space style={{ marginLeft: "1rem" }}> display: "flex",
<HeartOutlined style={{ color: "red" }} /> alignItems: "center",
{o.phone && showPhone && <PhoneNumberFormatter>{o.phone}</PhoneNumberFormatter>} flexWrap: "nowrap",
{o.discount && o.discount !== 0 ? <Tag color="green">{`${o.discount * 100}%`}</Tag> : null} width: "100%"
</Space> }}
>
<div
style={{
flex: 1,
minWidth: 0,
overflow: "hidden",
textOverflow: "ellipsis",
whiteSpace: "nowrap"
}}
>
{o.name}
</div> </div>
</Option> <Space style={{ marginLeft: "1rem" }}>
)) <HeartOutlined style={{ color: "red" }} />
: null} {o.phone && showPhone && <PhoneNumberFormatter>{o.phone}</PhoneNumberFormatter>}
{options {o.discount && o.discount !== 0 ? <Tag color="green">{`${o.discount * 100}%`}</Tag> : null}
? options.map((o) => ( </Space>
<Option key={o.id} value={o.id} name={o.name} discount={o.discount}> </div>
<div className="imex-flex-row" style={{ width: "100%" }}> </Option>
<div style={{ flex: 1 }}>{o.name}</div> ))}
{options &&
<Space style={{ marginLeft: "1rem" }}> options.map((o) => (
{o.phone && showPhone && <PhoneNumberFormatter>{o.phone}</PhoneNumberFormatter>} <Option key={o.id} value={o.id} name={o.name} discount={o.discount}>
{o.discount && o.discount !== 0 ? <Tag color="green">{`${o.discount * 100}%`}</Tag> : null} <div
</Space> style={{
display: "flex",
alignItems: "center",
flexWrap: "nowrap",
width: "100%"
}}
>
<div
style={{
flex: 1,
minWidth: 0,
overflow: "hidden",
textOverflow: "ellipsis",
whiteSpace: "nowrap"
}}
>
{o.name}
</div> </div>
</Option> <Space style={{ marginLeft: "1rem" }}>
)) {o.phone && showPhone && <PhoneNumberFormatter>{o.phone}</PhoneNumberFormatter>}
: null} {o.discount && o.discount !== 0 ? <Tag color="green">{`${o.discount * 100}%`}</Tag> : null}
</Space>
</div>
</Option>
))}
</Select> </Select>
); );
}; };

View File

@@ -230,7 +230,7 @@
"markexported": "Mark Exported", "markexported": "Mark Exported",
"markforreexport": "Mark for Re-export", "markforreexport": "Mark for Re-export",
"new": "New Bill", "new": "New Bill",
"nobilllines": "This part has not yet been recieved.", "nobilllines": "",
"noneselected": "No bill selected.", "noneselected": "No bill selected.",
"onlycmforinvoiced": "Only credit memos can be entered for any Job that has been invoiced, exported, or voided.", "onlycmforinvoiced": "Only credit memos can be entered for any Job that has been invoiced, exported, or voided.",
"printlabels": "Print Labels", "printlabels": "Print Labels",
@@ -270,9 +270,9 @@
"testrender": "Test Render" "testrender": "Test Render"
}, },
"errors": { "errors": {
"creatingdefaultview": "Error creating default view.",
"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}}"
"creatingdefaultview": "Error creating default view."
}, },
"fields": { "fields": {
"ReceivableCustomField": "QBO Receivable Custom Field {{number}}", "ReceivableCustomField": "QBO Receivable Custom Field {{number}}",
@@ -285,19 +285,21 @@
}, },
"appt_length": "Default Appointment Length", "appt_length": "Default Appointment Length",
"attach_pdf_to_email": "Attach PDF copy to sent emails?", "attach_pdf_to_email": "Attach PDF copy to sent emails?",
"batchid": "ADP Batch ID",
"bill_allow_post_to_closed": "Allow Bills to be posted to Closed Jobs", "bill_allow_post_to_closed": "Allow Bills to be posted to Closed Jobs",
"bill_federal_tax_rate": "Bills - Federal Tax Rate %", "bill_federal_tax_rate": "Bills - Federal Tax Rate %",
"bill_local_tax_rate": "Bill - Local Tax Rate %", "bill_local_tax_rate": "Bill - Local Tax Rate %",
"bill_state_tax_rate": "Bill - Provincial/State Tax Rate %", "bill_state_tax_rate": "Bill - Provincial/State Tax Rate %",
"city": "City", "city": "City",
"closingperiod": "Closing Period", "closingperiod": "Closing Period",
"companycode": "ADP Company Code",
"country": "Country", "country": "Country",
"dailybodytarget": "Scoreboard - Daily Body Target", "dailybodytarget": "Scoreboard - Daily Body Target",
"dailypainttarget": "Scoreboard - Daily Paint Target", "dailypainttarget": "Scoreboard - Daily Paint Target",
"default_adjustment_rate": "Default Labor Deduction Adjustment Rate", "default_adjustment_rate": "Default Labor Deduction Adjustment Rate",
"deliver": { "deliver": {
"templates": "Delivery Templates", "require_actual_delivery_date": "Require Actual Delivery",
"require_actual_delivery_date": "Require Actual Delivery" "templates": "Delivery Templates"
}, },
"dms": { "dms": {
"apcontrol": "AP Control Number", "apcontrol": "AP Control Number",
@@ -700,10 +702,10 @@
"workingdays": "Working Days" "workingdays": "Working Days"
}, },
"successes": { "successes": {
"save": "Shop configuration saved successfully. ",
"unsavedchanges": "Unsaved changes will be lost. Are you sure you want to continue?",
"areyousure": "Are you sure you want to continue?", "areyousure": "Are you sure you want to continue?",
"defaultviewcreated": "Default view created successfully." "defaultviewcreated": "Default view created successfully.",
"save": "Shop configuration saved successfully. ",
"unsavedchanges": "Unsaved changes will be lost. Are you sure you want to continue?"
}, },
"validation": { "validation": {
"centermustexist": "The chosen responsibility center does not exist.", "centermustexist": "The chosen responsibility center does not exist.",
@@ -1133,8 +1135,8 @@
}, },
"general": { "general": {
"actions": { "actions": {
"defaults": "Defaults",
"add": "Add", "add": "Add",
"autoupdate": "{{app}} will automatically update in {{time}} seconds. Please save all changes.",
"calculate": "Calculate", "calculate": "Calculate",
"cancel": "Cancel", "cancel": "Cancel",
"clear": "Clear", "clear": "Clear",
@@ -1142,6 +1144,8 @@
"copied": "Copied!", "copied": "Copied!",
"copylink": "Copy Link", "copylink": "Copy Link",
"create": "Create", "create": "Create",
"defaults": "Defaults",
"delay": "Delay Update (5 mins)",
"delete": "Delete", "delete": "Delete",
"deleteall": "Delete All", "deleteall": "Delete All",
"deselectall": "Deselect All", "deselectall": "Deselect All",
@@ -1153,10 +1157,12 @@
"print": "Print", "print": "Print",
"refresh": "Refresh", "refresh": "Refresh",
"remove": "Remove", "remove": "Remove",
"remove_alert": "Are you sure you want to dismiss the alert?",
"reset": "Reset your changes.", "reset": "Reset your changes.",
"resetpassword": "Reset Password", "resetpassword": "Reset Password",
"save": "Save", "save": "Save",
"saveandnew": "Save and New", "saveandnew": "Save and New",
"saveas": "Save As",
"selectall": "Select All", "selectall": "Select All",
"send": "Send", "send": "Send",
"sendbysms": "Send by SMS", "sendbysms": "Send by SMS",
@@ -1164,9 +1170,7 @@
"submit": "Submit", "submit": "Submit",
"tryagain": "Try Again", "tryagain": "Try Again",
"view": "View", "view": "View",
"viewreleasenotes": "See What's Changed", "viewreleasenotes": "See What's Changed"
"remove_alert": "Are you sure you want to dismiss the alert?",
"saveas": "Save As"
}, },
"errors": { "errors": {
"fcm": "You must allow notification permissions to have real time messaging. Click to try again.", "fcm": "You must allow notification permissions to have real time messaging. Click to try again.",
@@ -1181,7 +1185,6 @@
"vehicle": "Vehicle" "vehicle": "Vehicle"
}, },
"labels": { "labels": {
"unsavedchanges": "Unsaved changes.",
"actions": "Actions", "actions": "Actions",
"areyousure": "Are you sure?", "areyousure": "Are you sure?",
"barcode": "Barcode", "barcode": "Barcode",
@@ -1250,6 +1253,7 @@
"tuesday": "Tuesday", "tuesday": "Tuesday",
"tvmode": "TV Mode", "tvmode": "TV Mode",
"unknown": "Unknown", "unknown": "Unknown",
"unsavedchanges": "Unsaved changes.",
"username": "Username", "username": "Username",
"view": "View", "view": "View",
"wednesday": "Wednesday", "wednesday": "Wednesday",
@@ -2739,41 +2743,6 @@
} }
}, },
"production": { "production": {
"constants": {
"main_profile": "Default"
},
"options": {
"small": "Small",
"medium": "Medium",
"large": "Large",
"vertical": "Vertical",
"horizontal": "Horizontal"
},
"settings": {
"layout": "Layout",
"information": "Information",
"statistics_title": "Statistics",
"board_settings": "Board Settings",
"filters_title": "Filters",
"filters": {
"md_ins_cos": "Insurance Companies",
"md_estimators": "Estimators"
},
"statistics": {
"total_hours_in_production": "Hours in Production",
"total_lab_in_production": "Body Hours in Production",
"total_lar_in_production": "Refinish Hours in Production",
"total_amount_in_production": "Dollars in Production",
"jobs_in_production": "Jobs in Production",
"total_hours_on_board": "Hours on Board",
"total_lab_on_board": "Body Hours on Board",
"total_lar_on_board": "Refinish Hours on Board",
"total_amount_on_board": "Dollars on Board",
"total_jobs_on_board": "Jobs on Board",
"tasks_in_production": "Tasks in Production",
"tasks_on_board": "Tasks on Board"
}
},
"actions": { "actions": {
"addcolumns": "Add Columns", "addcolumns": "Add Columns",
"bodypriority-clear": "Clear Body Priority", "bodypriority-clear": "Clear Body Priority",
@@ -2788,29 +2757,23 @@
"suspend": "Suspend", "suspend": "Suspend",
"unsuspend": "Unsuspend" "unsuspend": "Unsuspend"
}, },
"constants": {
"main_profile": "Default"
},
"errors": { "errors": {
"boardupdate": "Error encountered updating Job. {{message}}", "boardupdate": "Error encountered updating Job. {{message}}",
"removing": "Error removing from production board. {{error}}",
"settings": "Error saving board settings: {{error}}",
"name_exists": "A Profile with this name already exists. Please choose a different name.", "name_exists": "A Profile with this name already exists. Please choose a different name.",
"name_required": "Profile name is required." "name_required": "Profile name is required.",
"removing": "Error removing from production board. {{error}}",
"settings": "Error saving board settings: {{error}}"
}, },
"labels": { "labels": {
"kiosk_mode": "Kiosk Mode",
"on": "On",
"off": "Off",
"wide": "Wide",
"tall": "Tall",
"vertical": "Vertical",
"horizontal": "Horizontal",
"orientation": "Board Orientation",
"card_size": "Card Size",
"model_info": "Vehicle Info",
"actual_in": "Actual In", "actual_in": "Actual In",
"addnewprofile": "Add New Profile",
"alert": "Alert", "alert": "Alert",
"tasks": "Tasks",
"alertoff": "Remove alert from Job", "alertoff": "Remove alert from Job",
"alerton": "Add alert to Job", "alerton": "Add alert to Job",
"alerts": "Alerts",
"ats": "Alternative Transportation", "ats": "Alternative Transportation",
"bodyhours": "B", "bodyhours": "B",
"bodypriority": "B/P", "bodypriority": "B/P",
@@ -2820,6 +2783,7 @@
"qbo_usa": "QBO USA" "qbo_usa": "QBO USA"
} }
}, },
"card_size": "Card Size",
"cardcolor": "Colored Cards", "cardcolor": "Colored Cards",
"cardsettings": "Card Settings", "cardsettings": "Card Settings",
"clm_no": "Claim Number", "clm_no": "Claim Number",
@@ -2828,48 +2792,88 @@
"detailpriority": "D/P", "detailpriority": "D/P",
"employeeassignments": "Employee Assignments", "employeeassignments": "Employee Assignments",
"employeesearch": "Employee Search", "employeesearch": "Employee Search",
"estimator": "Estimator",
"horizontal": "Horizontal",
"ins_co_nm": "Insurance Company Name", "ins_co_nm": "Insurance Company Name",
"jobdetail": "Job Details", "jobdetail": "Job Details",
"kiosk_mode": "Kiosk Mode",
"laborhrs": "Labor Hours", "laborhrs": "Labor Hours",
"legend": "Legend:", "legend": "Legend:",
"model_info": "Vehicle Info",
"note": "Production Note", "note": "Production Note",
"off": "Off",
"on": "On",
"orientation": "Board Orientation",
"ownr_nm": "Customer Name", "ownr_nm": "Customer Name",
"paintpriority": "P/P", "paintpriority": "P/P",
"partsstatus": "Parts Status", "partsstatus": "Parts Status",
"estimator": "Estimator",
"subtotal": "Subtotal",
"production_note": "Production Note", "production_note": "Production Note",
"refinishhours": "R", "refinishhours": "R",
"scheduled_completion": "Scheduled Completion", "scheduled_completion": "Scheduled Completion",
"selectview": "Select a View", "selectview": "Select a View",
"stickyheader": "Sticky Header (BETA)", "stickyheader": "Sticky Header (BETA)",
"sublets": "Sublets", "sublets": "Sublets",
"subtotal": "Subtotal",
"tall": "Tall",
"tasks": "Tasks",
"totalhours": "Total Hrs ", "totalhours": "Total Hrs ",
"touchtime": "T/T", "touchtime": "T/T",
"vertical": "Vertical",
"viewname": "View Name", "viewname": "View Name",
"alerts": "Alerts", "wide": "Wide"
"addnewprofile": "Add New Profile" },
"options": {
"horizontal": "Horizontal",
"large": "Large",
"medium": "Medium",
"small": "Small",
"vertical": "Vertical"
},
"settings": {
"board_settings": "Board Settings",
"filters": {
"md_estimators": "Estimators",
"md_ins_cos": "Insurance Companies"
},
"filters_title": "Filters",
"information": "Information",
"layout": "Layout",
"statistics": {
"jobs_in_production": "Jobs in Production",
"tasks_in_production": "Tasks in Production",
"tasks_on_board": "Tasks on Board",
"total_amount_in_production": "Dollars in Production",
"total_amount_on_board": "Dollars on Board",
"total_hours_in_production": "Hours in Production",
"total_hours_on_board": "Hours on Board",
"total_jobs_on_board": "Jobs on Board",
"total_lab_in_production": "Body Hours in Production",
"total_lab_on_board": "Body Hours on Board",
"total_lar_in_production": "Refinish Hours in Production",
"total_lar_on_board": "Refinish Hours on Board"
},
"statistics_title": "Statistics"
},
"statistics": {
"currency_symbol": "$",
"hours": "Hours",
"jobs": "Jobs",
"jobs_in_production": "Jobs in Production",
"tasks": "Tasks",
"tasks_in_production": "Tasks in Production",
"tasks_on_board": "Tasks on Board",
"total_amount_in_production": "Dollars in Production",
"total_amount_on_board": "Dollars on Board",
"total_hours_in_production": "Hours in Production",
"total_hours_on_board": "Hours on Board",
"total_jobs_on_board": "Jobs on Board",
"total_lab_in_production": "Body Hours in Production",
"total_lab_on_board": "Body Hours on Board",
"total_lar_in_production": "Refinish Hours in Production",
"total_lar_on_board": "Refinish Hours on Board"
}, },
"successes": { "successes": {
"removed": "Job removed from production." "removed": "Job removed from production."
},
"statistics": {
"total_hours_in_production": "Hours in Production",
"total_lab_in_production": "Body Hours in Production",
"total_lar_in_production": "Refinish Hours in Production",
"total_amount_in_production": "Dollars in Production",
"jobs_in_production": "Jobs in Production",
"total_hours_on_board": "Hours on Board",
"total_lab_on_board": "Body Hours on Board",
"total_lar_on_board": "Refinish Hours on Board",
"total_amount_on_board": "Dollars on Board",
"total_jobs_on_board": "Jobs on Board",
"tasks_in_production": "Tasks in Production",
"tasks_on_board": "Tasks on Board",
"tasks": "Tasks",
"hours": "Hours",
"currency_symbol": "$",
"jobs": "Jobs"
} }
}, },
"profile": { "profile": {
@@ -2927,6 +2931,8 @@
"vendor": "Vendor" "vendor": "Vendor"
}, },
"templates": { "templates": {
"adp_payroll_flat": "ADP Payroll - Flat Rate",
"adp_payroll_straight": "ADP Payroll - Straight Time",
"anticipated_revenue": "Anticipated Revenue", "anticipated_revenue": "Anticipated Revenue",
"ar_aging": "AR Aging", "ar_aging": "AR Aging",
"attendance_detail": "Attendance (All Employees)", "attendance_detail": "Attendance (All Employees)",
@@ -3418,6 +3424,18 @@
"vehicledetail": "Vehicle Details {{vehicle}} | {{app}}", "vehicledetail": "Vehicle Details {{vehicle}} | {{app}}",
"vehicles": "All Vehicles | {{app}}" "vehicles": "All Vehicles | {{app}}"
}, },
"trello": {
"labels": {
"add_card": "Add Card",
"add_lane": "Add Lane",
"cancel": "Cancel",
"delete_lane": "Delete Lane",
"description": "Description",
"label": "Label",
"lane_actions": "Lane Actions",
"title": "Title"
}
},
"tt_approvals": { "tt_approvals": {
"actions": { "actions": {
"approveselected": "Approve Selected" "approveselected": "Approve Selected"
@@ -3556,18 +3574,6 @@
"validation": { "validation": {
"unique_vendor_name": "You must enter a unique vendor name." "unique_vendor_name": "You must enter a unique vendor name."
} }
},
"trello": {
"labels": {
"add_card": "Add Card",
"add_lane": "Add Lane",
"delete_lane": "Delete Lane",
"lane_actions": "Lane Actions",
"title": "Title",
"description": "Description",
"label": "Label",
"cancel": "Cancel"
}
} }
} }
} }

View File

@@ -270,9 +270,9 @@
"testrender": "" "testrender": ""
}, },
"errors": { "errors": {
"creatingdefaultview": "",
"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": ""
"creatingdefaultview": ""
}, },
"fields": { "fields": {
"ReceivableCustomField": "", "ReceivableCustomField": "",
@@ -285,19 +285,21 @@
}, },
"appt_length": "", "appt_length": "",
"attach_pdf_to_email": "", "attach_pdf_to_email": "",
"batchid": "",
"bill_allow_post_to_closed": "", "bill_allow_post_to_closed": "",
"bill_federal_tax_rate": "", "bill_federal_tax_rate": "",
"bill_local_tax_rate": "", "bill_local_tax_rate": "",
"bill_state_tax_rate": "", "bill_state_tax_rate": "",
"city": "", "city": "",
"closingperiod": "", "closingperiod": "",
"companycode": "",
"country": "", "country": "",
"dailybodytarget": "", "dailybodytarget": "",
"dailypainttarget": "", "dailypainttarget": "",
"default_adjustment_rate": "", "default_adjustment_rate": "",
"deliver": { "deliver": {
"templates": "", "require_actual_delivery_date": "",
"require_actual_delivery_date": "" "templates": ""
}, },
"dms": { "dms": {
"apcontrol": "", "apcontrol": "",
@@ -700,10 +702,10 @@
"workingdays": "" "workingdays": ""
}, },
"successes": { "successes": {
"save": "",
"unsavedchanges": "",
"areyousure": "", "areyousure": "",
"defaultviewcreated": "" "defaultviewcreated": "",
"save": "",
"unsavedchanges": ""
}, },
"validation": { "validation": {
"centermustexist": "", "centermustexist": "",
@@ -1133,8 +1135,8 @@
}, },
"general": { "general": {
"actions": { "actions": {
"defaults": "defaults",
"add": "", "add": "",
"autoupdate": "",
"calculate": "", "calculate": "",
"cancel": "", "cancel": "",
"clear": "", "clear": "",
@@ -1142,6 +1144,8 @@
"copied": "", "copied": "",
"copylink": "", "copylink": "",
"create": "", "create": "",
"defaults": "defaults",
"delay": "",
"delete": "Borrar", "delete": "Borrar",
"deleteall": "", "deleteall": "",
"deselectall": "", "deselectall": "",
@@ -1153,10 +1157,12 @@
"print": "", "print": "",
"refresh": "", "refresh": "",
"remove": "", "remove": "",
"remove_alert": "",
"reset": " Restablecer a original.", "reset": " Restablecer a original.",
"resetpassword": "", "resetpassword": "",
"save": "Salvar", "save": "Salvar",
"saveandnew": "", "saveandnew": "",
"saveas": "",
"selectall": "", "selectall": "",
"send": "", "send": "",
"sendbysms": "", "sendbysms": "",
@@ -1164,9 +1170,7 @@
"submit": "", "submit": "",
"tryagain": "", "tryagain": "",
"view": "", "view": "",
"viewreleasenotes": "", "viewreleasenotes": ""
"remove_alert": "",
"saveas": ""
}, },
"errors": { "errors": {
"fcm": "", "fcm": "",
@@ -1181,7 +1185,6 @@
"vehicle": "" "vehicle": ""
}, },
"labels": { "labels": {
"unsavedchanges": "",
"actions": "Comportamiento", "actions": "Comportamiento",
"areyousure": "", "areyousure": "",
"barcode": "código de barras", "barcode": "código de barras",
@@ -1250,6 +1253,7 @@
"tuesday": "", "tuesday": "",
"tvmode": "", "tvmode": "",
"unknown": "Desconocido", "unknown": "Desconocido",
"unsavedchanges": "",
"username": "", "username": "",
"view": "", "view": "",
"wednesday": "", "wednesday": "",
@@ -2739,41 +2743,6 @@
} }
}, },
"production": { "production": {
"constants": {
"main_profile": ""
},
"options": {
"small": "",
"medium": "",
"large": "",
"vertical": "",
"horizontal": ""
},
"settings": {
"layout": "",
"information": "",
"statistics_title": "",
"board_settings": "",
"filters_title": "",
"filters": {
"md_ins_cos": "",
"md_estimators": ""
},
"statistics": {
"total_hours_in_production": "",
"total_lab_in_production": "",
"total_lar_in_production": "",
"total_amount_in_production": "",
"jobs_in_production": "",
"total_hours_on_board": "",
"total_lab_on_board": "",
"total_lar_on_board": "",
"total_amount_on_board": "",
"total_jobs_on_board": "",
"tasks_in_production": "",
"tasks_on_board": ""
}
},
"actions": { "actions": {
"addcolumns": "", "addcolumns": "",
"bodypriority-clear": "", "bodypriority-clear": "",
@@ -2788,29 +2757,23 @@
"suspend": "", "suspend": "",
"unsuspend": "" "unsuspend": ""
}, },
"constants": {
"main_profile": ""
},
"errors": { "errors": {
"boardupdate": "", "boardupdate": "",
"removing": "",
"settings": "",
"name_exists": "", "name_exists": "",
"name_required": "" "name_required": "",
"removing": "",
"settings": ""
}, },
"labels": { "labels": {
"kiosk_mode": "",
"on": "",
"off": "",
"wide": "",
"tall": "",
"vertical": "",
"horizontal": "",
"orientation": "",
"card_size": "",
"model_info": "",
"actual_in": "", "actual_in": "",
"addnewprofile": "",
"alert": "", "alert": "",
"tasks": "",
"alertoff": "", "alertoff": "",
"alerton": "", "alerton": "",
"alerts": "",
"ats": "", "ats": "",
"bodyhours": "", "bodyhours": "",
"bodypriority": "", "bodypriority": "",
@@ -2820,6 +2783,7 @@
"qbo_usa": "" "qbo_usa": ""
} }
}, },
"card_size": "",
"cardcolor": "", "cardcolor": "",
"cardsettings": "", "cardsettings": "",
"clm_no": "", "clm_no": "",
@@ -2828,48 +2792,88 @@
"detailpriority": "", "detailpriority": "",
"employeeassignments": "", "employeeassignments": "",
"employeesearch": "", "employeesearch": "",
"estimator": "",
"horizontal": "",
"ins_co_nm": "", "ins_co_nm": "",
"jobdetail": "", "jobdetail": "",
"kiosk_mode": "",
"laborhrs": "", "laborhrs": "",
"legend": "", "legend": "",
"model_info": "",
"note": "", "note": "",
"off": "",
"on": "",
"orientation": "",
"ownr_nm": "", "ownr_nm": "",
"paintpriority": "", "paintpriority": "",
"partsstatus": "", "partsstatus": "",
"estimator": "",
"subtotal": "",
"production_note": "", "production_note": "",
"refinishhours": "", "refinishhours": "",
"scheduled_completion": "", "scheduled_completion": "",
"selectview": "", "selectview": "",
"stickyheader": "", "stickyheader": "",
"sublets": "", "sublets": "",
"subtotal": "",
"tall": "",
"tasks": "",
"totalhours": "", "totalhours": "",
"touchtime": "", "touchtime": "",
"vertical": "",
"viewname": "", "viewname": "",
"alerts": "", "wide": ""
"addnewprofile": "" },
"options": {
"horizontal": "",
"large": "",
"medium": "",
"small": "",
"vertical": ""
},
"settings": {
"board_settings": "",
"filters": {
"md_estimators": "",
"md_ins_cos": ""
},
"filters_title": "",
"information": "",
"layout": "",
"statistics": {
"jobs_in_production": "",
"tasks_in_production": "",
"tasks_on_board": "",
"total_amount_in_production": "",
"total_amount_on_board": "",
"total_hours_in_production": "",
"total_hours_on_board": "",
"total_jobs_on_board": "",
"total_lab_in_production": "",
"total_lab_on_board": "",
"total_lar_in_production": "",
"total_lar_on_board": ""
},
"statistics_title": ""
},
"statistics": {
"currency_symbol": "",
"hours": "",
"jobs": "",
"jobs_in_production": "",
"tasks": "",
"tasks_in_production": "",
"tasks_on_board": "",
"total_amount_in_production": "",
"total_amount_on_board": "",
"total_hours_in_production": "",
"total_hours_on_board": "",
"total_jobs_on_board": "",
"total_lab_in_production": "",
"total_lab_on_board": "",
"total_lar_in_production": "",
"total_lar_on_board": ""
}, },
"successes": { "successes": {
"removed": "" "removed": ""
},
"statistics": {
"total_hours_in_production": "",
"total_lab_in_production": "",
"total_lar_in_production": "",
"total_amount_in_production": "",
"jobs_in_production": "",
"total_hours_on_board": "",
"total_lab_on_board": "",
"total_lar_on_board": "",
"total_amount_on_board": "",
"total_jobs_on_board": "",
"tasks_in_production": "",
"tasks_on_board": "",
"tasks": "",
"hours": "",
"currency_symbol": "",
"jobs": ""
} }
}, },
"profile": { "profile": {
@@ -2927,6 +2931,8 @@
"vendor": "" "vendor": ""
}, },
"templates": { "templates": {
"adp_payroll_flat": "",
"adp_payroll_straight": "",
"anticipated_revenue": "", "anticipated_revenue": "",
"ar_aging": "", "ar_aging": "",
"attendance_detail": "", "attendance_detail": "",
@@ -3418,6 +3424,18 @@
"vehicledetail": "Detalles del vehículo {{vehicle}} | {{app}}", "vehicledetail": "Detalles del vehículo {{vehicle}} | {{app}}",
"vehicles": "Todos los vehiculos | {{app}}" "vehicles": "Todos los vehiculos | {{app}}"
}, },
"trello": {
"labels": {
"add_card": "",
"add_lane": "",
"cancel": "",
"delete_lane": "",
"description": "",
"label": "",
"lane_actions": "",
"title": ""
}
},
"tt_approvals": { "tt_approvals": {
"actions": { "actions": {
"approveselected": "" "approveselected": ""
@@ -3556,18 +3574,6 @@
"validation": { "validation": {
"unique_vendor_name": "" "unique_vendor_name": ""
} }
},
"trello": {
"labels": {
"add_card": "",
"add_lane": "",
"delete_lane": "",
"lane_actions": "",
"title": "",
"description": "",
"label": "",
"cancel": ""
}
} }
} }
} }

View File

@@ -270,9 +270,9 @@
"testrender": "" "testrender": ""
}, },
"errors": { "errors": {
"creatingdefaultview": "",
"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": ""
"creatingdefaultview": ""
}, },
"fields": { "fields": {
"ReceivableCustomField": "", "ReceivableCustomField": "",
@@ -285,19 +285,21 @@
}, },
"appt_length": "", "appt_length": "",
"attach_pdf_to_email": "", "attach_pdf_to_email": "",
"batchid": "",
"bill_allow_post_to_closed": "", "bill_allow_post_to_closed": "",
"bill_federal_tax_rate": "", "bill_federal_tax_rate": "",
"bill_local_tax_rate": "", "bill_local_tax_rate": "",
"bill_state_tax_rate": "", "bill_state_tax_rate": "",
"city": "", "city": "",
"closingperiod": "", "closingperiod": "",
"companycode": "",
"country": "", "country": "",
"dailybodytarget": "", "dailybodytarget": "",
"dailypainttarget": "", "dailypainttarget": "",
"default_adjustment_rate": "", "default_adjustment_rate": "",
"deliver": { "deliver": {
"templates": "", "require_actual_delivery_date": "",
"require_actual_delivery_date": "" "templates": ""
}, },
"dms": { "dms": {
"apcontrol": "", "apcontrol": "",
@@ -700,10 +702,10 @@
"workingdays": "" "workingdays": ""
}, },
"successes": { "successes": {
"save": "",
"unsavedchanges": "",
"areyousure": "", "areyousure": "",
"defaultviewcreated": "" "defaultviewcreated": "",
"save": "",
"unsavedchanges": ""
}, },
"validation": { "validation": {
"centermustexist": "", "centermustexist": "",
@@ -1133,8 +1135,8 @@
}, },
"general": { "general": {
"actions": { "actions": {
"defaults": "",
"add": "", "add": "",
"autoupdate": "",
"calculate": "", "calculate": "",
"cancel": "", "cancel": "",
"clear": "", "clear": "",
@@ -1142,6 +1144,8 @@
"copied": "", "copied": "",
"copylink": "", "copylink": "",
"create": "", "create": "",
"defaults": "",
"delay": "",
"delete": "Effacer", "delete": "Effacer",
"deleteall": "", "deleteall": "",
"deselectall": "", "deselectall": "",
@@ -1153,10 +1157,12 @@
"print": "", "print": "",
"refresh": "", "refresh": "",
"remove": "", "remove": "",
"remove_alert": "",
"reset": " Rétablir l'original.", "reset": " Rétablir l'original.",
"resetpassword": "", "resetpassword": "",
"save": "sauvegarder", "save": "sauvegarder",
"saveandnew": "", "saveandnew": "",
"saveas": "",
"selectall": "", "selectall": "",
"send": "", "send": "",
"sendbysms": "", "sendbysms": "",
@@ -1164,9 +1170,7 @@
"submit": "", "submit": "",
"tryagain": "", "tryagain": "",
"view": "", "view": "",
"viewreleasenotes": "", "viewreleasenotes": ""
"remove_alert": "",
"saveas": ""
}, },
"errors": { "errors": {
"fcm": "", "fcm": "",
@@ -1181,7 +1185,6 @@
"vehicle": "" "vehicle": ""
}, },
"labels": { "labels": {
"unsavedchanges": "",
"actions": "actes", "actions": "actes",
"areyousure": "", "areyousure": "",
"barcode": "code à barre", "barcode": "code à barre",
@@ -1250,6 +1253,7 @@
"tuesday": "", "tuesday": "",
"tvmode": "", "tvmode": "",
"unknown": "Inconnu", "unknown": "Inconnu",
"unsavedchanges": "",
"username": "", "username": "",
"view": "", "view": "",
"wednesday": "", "wednesday": "",
@@ -2739,41 +2743,6 @@
} }
}, },
"production": { "production": {
"constants": {
"main_profile": ""
},
"options": {
"small": "",
"medium": "",
"large": "",
"vertical": "",
"horizontal": ""
},
"settings": {
"layout": "",
"information": "",
"statistics_title": "",
"board_settings": "",
"filters_title": "",
"filters": {
"md_ins_cos": "",
"md_estimators": ""
},
"statistics": {
"total_hours_in_production": "",
"total_lab_in_production": "",
"total_lar_in_production": "",
"total_amount_in_production": "",
"jobs_in_production": "",
"total_hours_on_board": "",
"total_lab_on_board": "",
"total_lar_on_board": "",
"total_amount_on_board": "",
"total_jobs_on_board": "",
"tasks_in_production": "",
"tasks_on_board": ""
}
},
"actions": { "actions": {
"addcolumns": "", "addcolumns": "",
"bodypriority-clear": "", "bodypriority-clear": "",
@@ -2788,29 +2757,23 @@
"suspend": "", "suspend": "",
"unsuspend": "" "unsuspend": ""
}, },
"constants": {
"main_profile": ""
},
"errors": { "errors": {
"boardupdate": "", "boardupdate": "",
"removing": "",
"settings": "",
"name_exists": "", "name_exists": "",
"name_required": "" "name_required": "",
"removing": "",
"settings": ""
}, },
"labels": { "labels": {
"kiosk_mode": "",
"on": "",
"off": "",
"wide": "",
"tall": "",
"vertical": "",
"horizontal": "",
"orientation": "",
"card_size": "",
"model_info": "",
"actual_in": "", "actual_in": "",
"addnewprofile": "",
"alert": "", "alert": "",
"tasks": "",
"alertoff": "", "alertoff": "",
"alerton": "", "alerton": "",
"alerts": "",
"ats": "", "ats": "",
"bodyhours": "", "bodyhours": "",
"bodypriority": "", "bodypriority": "",
@@ -2820,6 +2783,7 @@
"qbo_usa": "" "qbo_usa": ""
} }
}, },
"card_size": "",
"cardcolor": "", "cardcolor": "",
"cardsettings": "", "cardsettings": "",
"clm_no": "", "clm_no": "",
@@ -2828,48 +2792,88 @@
"detailpriority": "", "detailpriority": "",
"employeeassignments": "", "employeeassignments": "",
"employeesearch": "", "employeesearch": "",
"estimator": "",
"horizontal": "",
"ins_co_nm": "", "ins_co_nm": "",
"jobdetail": "", "jobdetail": "",
"kiosk_mode": "",
"laborhrs": "", "laborhrs": "",
"legend": "", "legend": "",
"model_info": "",
"note": "", "note": "",
"off": "",
"on": "",
"orientation": "",
"ownr_nm": "", "ownr_nm": "",
"paintpriority": "", "paintpriority": "",
"partsstatus": "", "partsstatus": "",
"estimator": "",
"subtotal": "",
"production_note": "", "production_note": "",
"refinishhours": "", "refinishhours": "",
"scheduled_completion": "", "scheduled_completion": "",
"selectview": "", "selectview": "",
"stickyheader": "", "stickyheader": "",
"sublets": "", "sublets": "",
"subtotal": "",
"tall": "",
"tasks": "",
"totalhours": "", "totalhours": "",
"touchtime": "", "touchtime": "",
"vertical": "",
"viewname": "", "viewname": "",
"alerts": "", "wide": ""
"addnewprofile": "" },
"options": {
"horizontal": "",
"large": "",
"medium": "",
"small": "",
"vertical": ""
},
"settings": {
"board_settings": "",
"filters": {
"md_estimators": "",
"md_ins_cos": ""
},
"filters_title": "",
"information": "",
"layout": "",
"statistics": {
"jobs_in_production": "",
"tasks_in_production": "",
"tasks_on_board": "",
"total_amount_in_production": "",
"total_amount_on_board": "",
"total_hours_in_production": "",
"total_hours_on_board": "",
"total_jobs_on_board": "",
"total_lab_in_production": "",
"total_lab_on_board": "",
"total_lar_in_production": "",
"total_lar_on_board": ""
},
"statistics_title": ""
},
"statistics": {
"currency_symbol": "",
"hours": "",
"jobs": "",
"jobs_in_production": "",
"tasks": "",
"tasks_in_production": "",
"tasks_on_board": "",
"total_amount_in_production": "",
"total_amount_on_board": "",
"total_hours_in_production": "",
"total_hours_on_board": "",
"total_jobs_on_board": "",
"total_lab_in_production": "",
"total_lab_on_board": "",
"total_lar_in_production": "",
"total_lar_on_board": ""
}, },
"successes": { "successes": {
"removed": "" "removed": ""
},
"statistics": {
"total_hours_in_production": "",
"total_lab_in_production": "",
"total_lar_in_production": "",
"total_amount_in_production": "",
"jobs_in_production": "",
"total_hours_on_board": "",
"total_lab_on_board": "",
"total_lar_on_board": "",
"total_amount_on_board": "",
"total_jobs_on_board": "",
"tasks_in_production": "",
"tasks_on_board": "",
"tasks": "",
"hours": "",
"currency_symbol": "",
"jobs": ""
} }
}, },
"profile": { "profile": {
@@ -2927,6 +2931,8 @@
"vendor": "" "vendor": ""
}, },
"templates": { "templates": {
"adp_payroll_flat": "",
"adp_payroll_straight": "",
"anticipated_revenue": "", "anticipated_revenue": "",
"ar_aging": "", "ar_aging": "",
"attendance_detail": "", "attendance_detail": "",
@@ -3418,6 +3424,18 @@
"vehicledetail": "Détails du véhicule {{vehicle} | {{app}}", "vehicledetail": "Détails du véhicule {{vehicle} | {{app}}",
"vehicles": "Tous les véhicules | {{app}}" "vehicles": "Tous les véhicules | {{app}}"
}, },
"trello": {
"labels": {
"add_card": "",
"add_lane": "",
"cancel": "",
"delete_lane": "",
"description": "",
"label": "",
"lane_actions": "",
"title": ""
}
},
"tt_approvals": { "tt_approvals": {
"actions": { "actions": {
"approveselected": "" "approveselected": ""
@@ -3556,18 +3574,6 @@
"validation": { "validation": {
"unique_vendor_name": "" "unique_vendor_name": ""
} }
},
"trello": {
"labels": {
"add_card": "",
"add_lane": "",
"delete_lane": "",
"lane_actions": "",
"title": "",
"description": "",
"label": "",
"cancel": ""
}
} }
} }
} }

View File

@@ -2158,6 +2158,32 @@ export const TemplateList = (type, context) => {
field: i18n.t("tasks.fields.created_at") field: i18n.t("tasks.fields.created_at")
}, },
group: "jobs" group: "jobs"
},
adp_payroll_flat: {
title: i18n.t("reportcenter.templates.adp_payroll_flat"),
subject: i18n.t("reportcenter.templates.adp_payroll_flat"),
key: "adp_payroll_flat",
reporttype: "text",
disabled: false,
rangeFilter: {
object: i18n.t("reportcenter.labels.objects.timetickets"),
field: i18n.t("timetickets.fields.committed_at")
},
group: "payroll",
adp_payroll: true
},
adp_payroll_straight: {
title: i18n.t("reportcenter.templates.adp_payroll_straight"),
subject: i18n.t("reportcenter.templates.adp_payroll_straight"),
key: "adp_payroll_straight",
reporttype: "text",
disabled: false,
rangeFilter: {
object: i18n.t("reportcenter.labels.objects.timetickets"),
field: i18n.t("timetickets.fields.date")
},
group: "payroll",
adp_payroll: true
} }
} }
: {}), : {}),

View File

@@ -0,0 +1,84 @@
import React from "react";
const useCountDown = (timeToCount = 60 * 1000, interval = 1000) => {
const [timeLeft, setTimeLeft] = React.useState(0);
const timer = React.useRef({});
const run = (ts) => {
if (!timer.current.started) {
timer.current.started = ts;
timer.current.lastInterval = ts;
}
const localInterval = Math.min(interval, timer.current.timeLeft || Infinity);
if (ts - timer.current.lastInterval >= localInterval) {
timer.current.lastInterval += localInterval;
setTimeLeft((timeLeft) => {
timer.current.timeLeft = timeLeft - localInterval;
return timer.current.timeLeft;
});
}
if (ts - timer.current.started < timer.current.timeToCount) {
timer.current.requestId = window.requestAnimationFrame(run);
} else {
timer.current = {};
setTimeLeft(0);
}
};
const start = React.useCallback(
(ttc) => {
window.cancelAnimationFrame(timer.current.requestId);
const newTimeToCount = ttc !== undefined ? ttc : timeToCount;
timer.current.started = null;
timer.current.lastInterval = null;
timer.current.timeToCount = newTimeToCount;
timer.current.requestId = window.requestAnimationFrame(run);
setTimeLeft(newTimeToCount);
},
// eslint-disable-next-line react-hooks/exhaustive-deps
[]
);
const pause = React.useCallback(() => {
window.cancelAnimationFrame(timer.current.requestId);
timer.current.started = null;
timer.current.lastInterval = null;
timer.current.timeToCount = timer.current.timeLeft;
}, []);
const resume = React.useCallback(
() => {
if (!timer.current.started && timer.current.timeLeft > 0) {
window.cancelAnimationFrame(timer.current.requestId);
timer.current.requestId = window.requestAnimationFrame(run);
}
},
// eslint-disable-next-line react-hooks/exhaustive-deps
[]
);
const reset = React.useCallback(() => {
if (timer.current.timeLeft) {
window.cancelAnimationFrame(timer.current.requestId);
timer.current = {};
setTimeLeft(0);
}
}, []);
const actions = React.useMemo(
() => ({ start, pause, resume, reset }), // eslint-disable-next-line react-hooks/exhaustive-deps
[]
);
React.useEffect(() => {
return () => window.cancelAnimationFrame(timer.current.requestId);
}, []);
return [timeLeft, actions];
};
export default useCountDown;

View File

@@ -219,7 +219,7 @@ async function InsertBill(oauthClient, qbo_realmId, req, bill, vendor, bodyshop)
Amount: Dinero({ Amount: Dinero({
amount: Math.round( amount: Math.round(
bill.billlines.reduce((acc, val) => { bill.billlines.reduce((acc, val) => {
return acc + val.actual_cost * val.quantity; return acc + val.applicable_taxes?.federal ? (val.actual_cost * val.quantity ?? 0) : 0;
}, 0) * 100 }, 0) * 100
) )
}) })

View File

@@ -180,9 +180,10 @@ exports.default = async (req, res) => {
jobid: job.id, jobid: job.id,
success: false, success: false,
errorMessage: errorMessage:
(error && error.authResponse && error.authResponse.body) || error?.authResponse?.body ||
error.response?.data?.Fault?.Error.map((e) => e.Detail).join(", ") || error?.response?.data?.Fault?.Error.map((e) => e.Detail).join(", ") ||
(error && error.message) error?.response?.data ||
error?.message
}); });
console.log(error); console.log(error);
logger.log("qbo-receivable-create-error", "ERROR", req.user.email, { logger.log("qbo-receivable-create-error", "ERROR", req.user.email, {