@@ -8927,6 +8927,48 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>md_to_emails</name>
|
||||||
|
<definition_loaded>false</definition_loaded>
|
||||||
|
<description></description>
|
||||||
|
<comment></comment>
|
||||||
|
<default_text></default_text>
|
||||||
|
<translations>
|
||||||
|
<translation>
|
||||||
|
<language>en-US</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>es-MX</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>fr-CA</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
</translations>
|
||||||
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>md_to_emails_emails</name>
|
||||||
|
<definition_loaded>false</definition_loaded>
|
||||||
|
<description></description>
|
||||||
|
<comment></comment>
|
||||||
|
<default_text></default_text>
|
||||||
|
<translations>
|
||||||
|
<translation>
|
||||||
|
<language>en-US</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>es-MX</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>fr-CA</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
</translations>
|
||||||
|
</concept_node>
|
||||||
<concept_node>
|
<concept_node>
|
||||||
<name>messagingpresets</name>
|
<name>messagingpresets</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
@@ -13996,6 +14038,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>external_id</name>
|
||||||
|
<definition_loaded>false</definition_loaded>
|
||||||
|
<description></description>
|
||||||
|
<comment></comment>
|
||||||
|
<default_text></default_text>
|
||||||
|
<translations>
|
||||||
|
<translation>
|
||||||
|
<language>en-US</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>es-MX</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>fr-CA</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
</translations>
|
||||||
|
</concept_node>
|
||||||
<concept_node>
|
<concept_node>
|
||||||
<name>first_name</name>
|
<name>first_name</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
@@ -36674,6 +36737,32 @@
|
|||||||
</concept_node>
|
</concept_node>
|
||||||
</children>
|
</children>
|
||||||
</folder_node>
|
</folder_node>
|
||||||
|
<folder_node>
|
||||||
|
<name>special</name>
|
||||||
|
<children>
|
||||||
|
<concept_node>
|
||||||
|
<name>attendance_detail_csv</name>
|
||||||
|
<definition_loaded>false</definition_loaded>
|
||||||
|
<description></description>
|
||||||
|
<comment></comment>
|
||||||
|
<default_text></default_text>
|
||||||
|
<translations>
|
||||||
|
<translation>
|
||||||
|
<language>en-US</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>es-MX</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>fr-CA</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
</translations>
|
||||||
|
</concept_node>
|
||||||
|
</children>
|
||||||
|
</folder_node>
|
||||||
<folder_node>
|
<folder_node>
|
||||||
<name>subjects</name>
|
<name>subjects</name>
|
||||||
<children>
|
<children>
|
||||||
|
|||||||
@@ -42,7 +42,12 @@ export function EmailOverlayComponent({
|
|||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const handleClick = ({ item, key, keyPath }) => {
|
const handleClick = ({ item, key, keyPath }) => {
|
||||||
const email = item.props.value;
|
const email = item.props.value;
|
||||||
form.setFieldsValue({ to: _.uniq([...form.getFieldValue("to"), email]) });
|
form.setFieldsValue({
|
||||||
|
to: _.uniq([
|
||||||
|
...form.getFieldValue("to"),
|
||||||
|
...(typeof email === "string" ? [email] : email),
|
||||||
|
]),
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const menu = (
|
const menu = (
|
||||||
@@ -55,6 +60,11 @@ export function EmailOverlayComponent({
|
|||||||
{`${e.first_name} ${e.last_name}`}
|
{`${e.first_name} ${e.last_name}`}
|
||||||
</Menu.Item>
|
</Menu.Item>
|
||||||
))}
|
))}
|
||||||
|
{bodyshop.md_to_emails.map((e, idx) => (
|
||||||
|
<Menu.Item value={e.emails} key={idx + "group"}>
|
||||||
|
{e.label}
|
||||||
|
</Menu.Item>
|
||||||
|
))}
|
||||||
</Menu>
|
</Menu>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -0,0 +1,47 @@
|
|||||||
|
import React from "react";
|
||||||
|
import { Button, Popconfirm } from "antd";
|
||||||
|
import { DeleteFilled } from "@ant-design/icons";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { DELETE_PARTS_ORDER_LINE } from "../../graphql/parts-orders.queries";
|
||||||
|
import { useMutation } from "@apollo/client";
|
||||||
|
|
||||||
|
export default function PartsOrderDeleteLine({
|
||||||
|
disabled,
|
||||||
|
partsLineId,
|
||||||
|
partsOrderId,
|
||||||
|
}) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const [deletePartsOrderLine] = useMutation(DELETE_PARTS_ORDER_LINE);
|
||||||
|
return (
|
||||||
|
<Popconfirm
|
||||||
|
title={t("parts_orders.labels.confirmdelete")}
|
||||||
|
disabled={disabled}
|
||||||
|
onConfirm={async () => {
|
||||||
|
//Delete the parts return.!
|
||||||
|
|
||||||
|
await deletePartsOrderLine({
|
||||||
|
variables: { partsOrderLineId: partsLineId },
|
||||||
|
update(cache) {
|
||||||
|
cache.modify({
|
||||||
|
id: cache.identify({
|
||||||
|
__typename: "parts_orders",
|
||||||
|
id: partsOrderId,
|
||||||
|
}),
|
||||||
|
fields: {
|
||||||
|
parts_order_lines(cached, { readField }) {
|
||||||
|
return cached.filter((c) => {
|
||||||
|
return readField("id", c) !== partsLineId;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Button disabled={disabled}>
|
||||||
|
<DeleteFilled />
|
||||||
|
</Button>
|
||||||
|
</Popconfirm>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -30,6 +30,7 @@ import { TemplateList } from "../../utils/TemplateConstants";
|
|||||||
import DataLabel from "../data-label/data-label.component";
|
import DataLabel from "../data-label/data-label.component";
|
||||||
import PartsOrderBackorderEta from "../parts-order-backorder-eta/parts-order-backorder-eta.component";
|
import PartsOrderBackorderEta from "../parts-order-backorder-eta/parts-order-backorder-eta.component";
|
||||||
import PartsOrderCmReceived from "../parts-order-cm-received/parts-order-cm-received.component";
|
import PartsOrderCmReceived from "../parts-order-cm-received/parts-order-cm-received.component";
|
||||||
|
import PartsOrderDeleteLine from "../parts-order-delete-line/parts-order-delete-line.component";
|
||||||
import PartsOrderLineBackorderButton from "../parts-order-line-backorder-button/parts-order-line-backorder-button.component";
|
import PartsOrderLineBackorderButton from "../parts-order-line-backorder-button/parts-order-line-backorder-button.component";
|
||||||
import PartsReceiveModalContainer from "../parts-receive-modal/parts-receive-modal.container";
|
import PartsReceiveModalContainer from "../parts-receive-modal/parts-receive-modal.container";
|
||||||
import PrintWrapper from "../print-wrapper/print-wrapper.component";
|
import PrintWrapper from "../print-wrapper/print-wrapper.component";
|
||||||
@@ -391,12 +392,21 @@ export function PartsOrderListTableComponent({
|
|||||||
dataIndex: "actions",
|
dataIndex: "actions",
|
||||||
key: "actions",
|
key: "actions",
|
||||||
render: (text, record) => (
|
render: (text, record) => (
|
||||||
<PartsOrderLineBackorderButton
|
<Space wrap>
|
||||||
disabled={jobRO}
|
<PartsOrderDeleteLine
|
||||||
partsOrderStatus={record.status}
|
disabled={jobRO}
|
||||||
partsLineId={record.id}
|
partsOrderStatus={record.status}
|
||||||
jobLineId={record.job_line_id}
|
partsLineId={record.id}
|
||||||
/>
|
partsOrderId={selectedpartsorder}
|
||||||
|
jobLineId={record.job_line_id}
|
||||||
|
/>
|
||||||
|
<PartsOrderLineBackorderButton
|
||||||
|
disabled={jobRO}
|
||||||
|
partsOrderStatus={record.status}
|
||||||
|
partsLineId={record.id}
|
||||||
|
jobLineId={record.job_line_id}
|
||||||
|
/>
|
||||||
|
</Space>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -328,6 +328,12 @@ export function ShopEmployeesFormComponent({ bodyshop }) {
|
|||||||
>
|
>
|
||||||
<Input />
|
<Input />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
|
label={t("employees.fields.external_id")}
|
||||||
|
name="external_id"
|
||||||
|
>
|
||||||
|
<Input />
|
||||||
|
</Form.Item>
|
||||||
</LayoutFormRow>
|
</LayoutFormRow>
|
||||||
<Form.List name={["rates"]}>
|
<Form.List name={["rates"]}>
|
||||||
{(fields, { add, remove, move }) => {
|
{(fields, { add, remove, move }) => {
|
||||||
|
|||||||
@@ -1393,6 +1393,60 @@ export default function ShopInfoGeneral({ form }) {
|
|||||||
}}
|
}}
|
||||||
</Form.List>
|
</Form.List>
|
||||||
</LayoutFormRow>
|
</LayoutFormRow>
|
||||||
|
<LayoutFormRow grow header={t("bodyshop.labels.md_to_emails")}>
|
||||||
|
<Form.List name={["md_to_emails"]}>
|
||||||
|
{(fields, { add, remove, move }) => {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
{fields.map((field, index) => (
|
||||||
|
<Form.Item key={field.key}>
|
||||||
|
<LayoutFormRow noDivider>
|
||||||
|
<Form.Item
|
||||||
|
label={t("general.labels.label")}
|
||||||
|
key={`${index}label`}
|
||||||
|
name={[field.name, "label"]}
|
||||||
|
>
|
||||||
|
<Input />
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
|
label={t("bodyshop.labels.md_to_emails_emails")}
|
||||||
|
key={`${index}emails`}
|
||||||
|
name={[field.name, "emails"]}
|
||||||
|
>
|
||||||
|
<Select mode="tags" tokenSeparators={[",", ";"]} />
|
||||||
|
</Form.Item>
|
||||||
|
|
||||||
|
<Space>
|
||||||
|
<DeleteFilled
|
||||||
|
onClick={() => {
|
||||||
|
remove(field.name);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<FormListMoveArrows
|
||||||
|
move={move}
|
||||||
|
index={index}
|
||||||
|
total={fields.length}
|
||||||
|
/>
|
||||||
|
</Space>
|
||||||
|
</LayoutFormRow>
|
||||||
|
</Form.Item>
|
||||||
|
))}
|
||||||
|
<Form.Item>
|
||||||
|
<Button
|
||||||
|
type="dashed"
|
||||||
|
onClick={() => {
|
||||||
|
add();
|
||||||
|
}}
|
||||||
|
style={{ width: "100%" }}
|
||||||
|
>
|
||||||
|
{t("general.actions.add")}
|
||||||
|
</Button>
|
||||||
|
</Form.Item>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
</Form.List>
|
||||||
|
</LayoutFormRow>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,42 @@
|
|||||||
|
import { Button } from "antd";
|
||||||
|
import queryString from "query-string";
|
||||||
|
import React, { useState } from "react";
|
||||||
|
import { useLocation } from "react-router-dom";
|
||||||
|
import { GenerateDocument } from "../../utils/RenderTemplate";
|
||||||
|
import { TemplateList } from "../../utils/TemplateConstants";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
import moment from "moment";
|
||||||
|
const AttendanceCsv = TemplateList("special").attendance_detail_csv;
|
||||||
|
|
||||||
|
export default function TimeTicketsAttendanceTable() {
|
||||||
|
const searchParams = queryString.parse(useLocation().search);
|
||||||
|
const { start, end } = searchParams;
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const [loading, setLoading] = useState(false);
|
||||||
|
|
||||||
|
const handleClick = async () => {
|
||||||
|
setLoading(true);
|
||||||
|
|
||||||
|
await GenerateDocument(
|
||||||
|
{
|
||||||
|
name: AttendanceCsv.key,
|
||||||
|
variables: {
|
||||||
|
start: start
|
||||||
|
? start
|
||||||
|
: moment().startOf("week").subtract(7, "days").format("YYYY-MM-DD"),
|
||||||
|
end: end ? end : moment().endOf("week").format("YYYY-MM-DD"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{},
|
||||||
|
"text"
|
||||||
|
);
|
||||||
|
|
||||||
|
setLoading(false);
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Button loading={loading} onClick={handleClick}>
|
||||||
|
{t("printcenter.special.attendance_detail_csv")}
|
||||||
|
</Button>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -106,6 +106,7 @@ export const QUERY_BODYSHOP = gql`
|
|||||||
last_name_first
|
last_name_first
|
||||||
md_parts_order_comment
|
md_parts_order_comment
|
||||||
bill_allow_post_to_closed
|
bill_allow_post_to_closed
|
||||||
|
md_to_emails
|
||||||
employees {
|
employees {
|
||||||
user_email
|
user_email
|
||||||
id
|
id
|
||||||
@@ -114,6 +115,7 @@ export const QUERY_BODYSHOP = gql`
|
|||||||
last_name
|
last_name
|
||||||
employee_number
|
employee_number
|
||||||
rates
|
rates
|
||||||
|
external_id
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -209,6 +211,7 @@ export const UPDATE_SHOP = gql`
|
|||||||
last_name_first
|
last_name_first
|
||||||
md_parts_order_comment
|
md_parts_order_comment
|
||||||
bill_allow_post_to_closed
|
bill_allow_post_to_closed
|
||||||
|
md_to_emails
|
||||||
employees {
|
employees {
|
||||||
id
|
id
|
||||||
first_name
|
first_name
|
||||||
@@ -217,6 +220,7 @@ export const UPDATE_SHOP = gql`
|
|||||||
employee_number
|
employee_number
|
||||||
rates
|
rates
|
||||||
user_email
|
user_email
|
||||||
|
external_id
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ export const QUERY_EMPLOYEE_BY_ID = gql`
|
|||||||
rates
|
rates
|
||||||
pin
|
pin
|
||||||
user_email
|
user_email
|
||||||
|
external_id
|
||||||
employee_vacations(order_by: { start: desc }) {
|
employee_vacations(order_by: { start: desc }) {
|
||||||
id
|
id
|
||||||
start
|
start
|
||||||
|
|||||||
@@ -292,6 +292,14 @@ export const DELETE_PARTS_ORDER = gql`
|
|||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
export const DELETE_PARTS_ORDER_LINE = gql`
|
||||||
|
mutation DELETE_PARTS_ORDER_LINE($partsOrderLineId: uuid!) {
|
||||||
|
delete_parts_order_lines_by_pk(id: $partsOrderLineId) {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
export const MUTATION_UPDATE_PO_CM_REECEIVED = gql`
|
export const MUTATION_UPDATE_PO_CM_REECEIVED = gql`
|
||||||
mutation MUTATION_UPDATE_PO_CM_REECEIVED(
|
mutation MUTATION_UPDATE_PO_CM_REECEIVED(
|
||||||
$partsLineId: uuid!
|
$partsLineId: uuid!
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import TimeTicketList from "../../components/time-ticket-list/time-ticket-list.c
|
|||||||
import TimeTicketsPayrollTable from "../../components/time-tickets-payroll-table/time-tickets-payroll-table.component";
|
import TimeTicketsPayrollTable from "../../components/time-tickets-payroll-table/time-tickets-payroll-table.component";
|
||||||
import TimeTicketsSummaryEmployees from "../../components/time-tickets-summary-employees/time-tickets-summary-employees.component";
|
import TimeTicketsSummaryEmployees from "../../components/time-tickets-summary-employees/time-tickets-summary-employees.component";
|
||||||
import { QUERY_TIME_TICKETS_IN_RANGE } from "../../graphql/timetickets.queries";
|
import { QUERY_TIME_TICKETS_IN_RANGE } from "../../graphql/timetickets.queries";
|
||||||
|
import TimeTicketsAttendanceTable from "../../components/time-tickets-attendance-table/time-tickets-attendance-table.component";
|
||||||
import {
|
import {
|
||||||
setBreadcrumbs,
|
setBreadcrumbs,
|
||||||
setSelectedHeader,
|
setSelectedHeader,
|
||||||
@@ -71,6 +72,7 @@ export function TimeTicketsContainer({
|
|||||||
timetickets={data ? data.timetickets : []}
|
timetickets={data ? data.timetickets : []}
|
||||||
extra={
|
extra={
|
||||||
<Space wrap>
|
<Space wrap>
|
||||||
|
<TimeTicketsAttendanceTable />
|
||||||
<TimeTicketsPayrollTable />
|
<TimeTicketsPayrollTable />
|
||||||
<TimeTicketsDatesSelector />
|
<TimeTicketsDatesSelector />
|
||||||
</Space>
|
</Space>
|
||||||
|
|||||||
@@ -544,6 +544,8 @@
|
|||||||
"jobstatuses": "Job Statuses",
|
"jobstatuses": "Job Statuses",
|
||||||
"laborrates": "Labor Rates",
|
"laborrates": "Labor Rates",
|
||||||
"licensing": "Licensing",
|
"licensing": "Licensing",
|
||||||
|
"md_to_emails": "Preset To Emails",
|
||||||
|
"md_to_emails_emails": "Emails",
|
||||||
"messagingpresets": "Messaging Presets",
|
"messagingpresets": "Messaging Presets",
|
||||||
"notemplatesavailable": "No templates available to add.",
|
"notemplatesavailable": "No templates available to add.",
|
||||||
"notespresets": "Notes Presets",
|
"notespresets": "Notes Presets",
|
||||||
@@ -877,6 +879,7 @@
|
|||||||
"base_rate": "Base Rate",
|
"base_rate": "Base Rate",
|
||||||
"cost_center": "Cost Center",
|
"cost_center": "Cost Center",
|
||||||
"employee_number": "Employee Number",
|
"employee_number": "Employee Number",
|
||||||
|
"external_id": "External Employee ID",
|
||||||
"first_name": "First Name",
|
"first_name": "First Name",
|
||||||
"flat_rate": "Flat Rate (Disabled is Straight Time)",
|
"flat_rate": "Flat Rate (Disabled is Straight Time)",
|
||||||
"hire_date": "Hire Date",
|
"hire_date": "Hire Date",
|
||||||
@@ -2171,6 +2174,9 @@
|
|||||||
"ca_bc_etf_table": "ICBC ETF Table",
|
"ca_bc_etf_table": "ICBC ETF Table",
|
||||||
"exported_payroll": "Payroll Table"
|
"exported_payroll": "Payroll Table"
|
||||||
},
|
},
|
||||||
|
"special": {
|
||||||
|
"attendance_detail_csv": "Attendance Table"
|
||||||
|
},
|
||||||
"subjects": {
|
"subjects": {
|
||||||
"jobs": {
|
"jobs": {
|
||||||
"parts_order": "Parts Order PO: {{ro_number}} - {{name}}"
|
"parts_order": "Parts Order PO: {{ro_number}} - {{name}}"
|
||||||
|
|||||||
@@ -544,6 +544,8 @@
|
|||||||
"jobstatuses": "",
|
"jobstatuses": "",
|
||||||
"laborrates": "",
|
"laborrates": "",
|
||||||
"licensing": "",
|
"licensing": "",
|
||||||
|
"md_to_emails": "",
|
||||||
|
"md_to_emails_emails": "",
|
||||||
"messagingpresets": "",
|
"messagingpresets": "",
|
||||||
"notemplatesavailable": "",
|
"notemplatesavailable": "",
|
||||||
"notespresets": "",
|
"notespresets": "",
|
||||||
@@ -877,6 +879,7 @@
|
|||||||
"base_rate": "Tasa básica",
|
"base_rate": "Tasa básica",
|
||||||
"cost_center": "Centro de costos",
|
"cost_center": "Centro de costos",
|
||||||
"employee_number": "Numero de empleado",
|
"employee_number": "Numero de empleado",
|
||||||
|
"external_id": "",
|
||||||
"first_name": "Nombre de pila",
|
"first_name": "Nombre de pila",
|
||||||
"flat_rate": "Tarifa plana (deshabilitado es tiempo recto)",
|
"flat_rate": "Tarifa plana (deshabilitado es tiempo recto)",
|
||||||
"hire_date": "Fecha de contratación",
|
"hire_date": "Fecha de contratación",
|
||||||
@@ -2171,6 +2174,9 @@
|
|||||||
"ca_bc_etf_table": "",
|
"ca_bc_etf_table": "",
|
||||||
"exported_payroll": ""
|
"exported_payroll": ""
|
||||||
},
|
},
|
||||||
|
"special": {
|
||||||
|
"attendance_detail_csv": ""
|
||||||
|
},
|
||||||
"subjects": {
|
"subjects": {
|
||||||
"jobs": {
|
"jobs": {
|
||||||
"parts_order": ""
|
"parts_order": ""
|
||||||
|
|||||||
@@ -544,6 +544,8 @@
|
|||||||
"jobstatuses": "",
|
"jobstatuses": "",
|
||||||
"laborrates": "",
|
"laborrates": "",
|
||||||
"licensing": "",
|
"licensing": "",
|
||||||
|
"md_to_emails": "",
|
||||||
|
"md_to_emails_emails": "",
|
||||||
"messagingpresets": "",
|
"messagingpresets": "",
|
||||||
"notemplatesavailable": "",
|
"notemplatesavailable": "",
|
||||||
"notespresets": "",
|
"notespresets": "",
|
||||||
@@ -877,6 +879,7 @@
|
|||||||
"base_rate": "Taux de base",
|
"base_rate": "Taux de base",
|
||||||
"cost_center": "Centre de coûts",
|
"cost_center": "Centre de coûts",
|
||||||
"employee_number": "Numéro d'employé",
|
"employee_number": "Numéro d'employé",
|
||||||
|
"external_id": "",
|
||||||
"first_name": "Prénom",
|
"first_name": "Prénom",
|
||||||
"flat_rate": "Taux fixe (désactivé est le temps normal)",
|
"flat_rate": "Taux fixe (désactivé est le temps normal)",
|
||||||
"hire_date": "Date d'embauche",
|
"hire_date": "Date d'embauche",
|
||||||
@@ -2171,6 +2174,9 @@
|
|||||||
"ca_bc_etf_table": "",
|
"ca_bc_etf_table": "",
|
||||||
"exported_payroll": ""
|
"exported_payroll": ""
|
||||||
},
|
},
|
||||||
|
"special": {
|
||||||
|
"attendance_detail_csv": ""
|
||||||
|
},
|
||||||
"subjects": {
|
"subjects": {
|
||||||
"jobs": {
|
"jobs": {
|
||||||
"parts_order": ""
|
"parts_order": ""
|
||||||
|
|||||||
@@ -18,7 +18,8 @@ export default async function RenderTemplate(
|
|||||||
templateObject,
|
templateObject,
|
||||||
bodyshop,
|
bodyshop,
|
||||||
renderAsHtml = false,
|
renderAsHtml = false,
|
||||||
renderAsExcel = false
|
renderAsExcel = false,
|
||||||
|
renderAsText = false
|
||||||
) {
|
) {
|
||||||
//Query assets that match the template name. Must be in format <<templateName>>.query
|
//Query assets that match the template name. Must be in format <<templateName>>.query
|
||||||
let { contextData, useShopSpecificTemplate } = await fetchContextData(
|
let { contextData, useShopSpecificTemplate } = await fetchContextData(
|
||||||
@@ -54,6 +55,7 @@ export default async function RenderTemplate(
|
|||||||
}),
|
}),
|
||||||
}),
|
}),
|
||||||
...(renderAsExcel ? { recipe: "html-to-xlsx" } : {}),
|
...(renderAsExcel ? { recipe: "html-to-xlsx" } : {}),
|
||||||
|
...(renderAsText ? { recipe: "text" } : {}),
|
||||||
},
|
},
|
||||||
data: {
|
data: {
|
||||||
...contextData,
|
...contextData,
|
||||||
@@ -254,6 +256,8 @@ export const GenerateDocument = async (
|
|||||||
} else if (sendType === "x") {
|
} else if (sendType === "x") {
|
||||||
console.log("excel");
|
console.log("excel");
|
||||||
await RenderTemplate(template, bodyshop, false, true);
|
await RenderTemplate(template, bodyshop, false, true);
|
||||||
|
} else if (sendType === "text") {
|
||||||
|
await RenderTemplate(template, bodyshop, false, false, true);
|
||||||
} else {
|
} else {
|
||||||
await RenderTemplate(template, bodyshop);
|
await RenderTemplate(template, bodyshop);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1668,6 +1668,13 @@ export const TemplateList = (type, context) => {
|
|||||||
key: "exported_payroll",
|
key: "exported_payroll",
|
||||||
disabled: false,
|
disabled: false,
|
||||||
},
|
},
|
||||||
|
attendance_detail_csv: {
|
||||||
|
title: i18n.t("printcenter.special.attendance_detail_csv"),
|
||||||
|
description: "Est Detail",
|
||||||
|
subject: i18n.t("printcenter.special.attendance_detail_csv"),
|
||||||
|
key: "attendance_detail_csv",
|
||||||
|
disabled: false,
|
||||||
|
},
|
||||||
production_by_technician_one: {
|
production_by_technician_one: {
|
||||||
title: i18n.t(
|
title: i18n.t(
|
||||||
"reportcenter.templates.production_by_technician_one"
|
"reportcenter.templates.production_by_technician_one"
|
||||||
|
|||||||
@@ -858,6 +858,7 @@
|
|||||||
- md_referral_sources
|
- md_referral_sources
|
||||||
- md_responsibility_centers
|
- md_responsibility_centers
|
||||||
- md_ro_statuses
|
- md_ro_statuses
|
||||||
|
- md_to_emails
|
||||||
- messagingservicesid
|
- messagingservicesid
|
||||||
- pbs_configuration
|
- pbs_configuration
|
||||||
- pbs_serialnumber
|
- pbs_serialnumber
|
||||||
@@ -944,6 +945,7 @@
|
|||||||
- md_referral_sources
|
- md_referral_sources
|
||||||
- md_responsibility_centers
|
- md_responsibility_centers
|
||||||
- md_ro_statuses
|
- md_ro_statuses
|
||||||
|
- md_to_emails
|
||||||
- pbs_configuration
|
- pbs_configuration
|
||||||
- phone
|
- phone
|
||||||
- prodtargethrs
|
- prodtargethrs
|
||||||
@@ -1953,6 +1955,7 @@
|
|||||||
- active
|
- active
|
||||||
- created_at
|
- created_at
|
||||||
- employee_number
|
- employee_number
|
||||||
|
- external_id
|
||||||
- first_name
|
- first_name
|
||||||
- flat_rate
|
- flat_rate
|
||||||
- hire_date
|
- hire_date
|
||||||
@@ -1971,6 +1974,7 @@
|
|||||||
- active
|
- active
|
||||||
- created_at
|
- created_at
|
||||||
- employee_number
|
- employee_number
|
||||||
|
- external_id
|
||||||
- first_name
|
- first_name
|
||||||
- flat_rate
|
- flat_rate
|
||||||
- hire_date
|
- hire_date
|
||||||
@@ -1999,6 +2003,7 @@
|
|||||||
- active
|
- active
|
||||||
- created_at
|
- created_at
|
||||||
- employee_number
|
- employee_number
|
||||||
|
- external_id
|
||||||
- first_name
|
- first_name
|
||||||
- flat_rate
|
- flat_rate
|
||||||
- hire_date
|
- hire_date
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
-- Could not auto-generate a down migration.
|
||||||
|
-- Please write an appropriate down migration for the SQL below:
|
||||||
|
-- alter table "public"."bodyshops" add column "md_to_emails" jsonb
|
||||||
|
-- null default jsonb_build_array();
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
alter table "public"."bodyshops" add column "md_to_emails" jsonb
|
||||||
|
null default jsonb_build_array();
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
-- Could not auto-generate a down migration.
|
||||||
|
-- Please write an appropriate down migration for the SQL below:
|
||||||
|
-- alter table "public"."employees" add column "external_id" text
|
||||||
|
-- null;
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
alter table "public"."employees" add column "external_id" text
|
||||||
|
null;
|
||||||
@@ -239,6 +239,7 @@ async function InsertInsuranceCo(oauthClient, qbo_realmId, req, job, bodyshop) {
|
|||||||
|
|
||||||
const Customer = {
|
const Customer = {
|
||||||
DisplayName: job.ins_co_nm,
|
DisplayName: job.ins_co_nm,
|
||||||
|
BillWithParent: true,
|
||||||
BillAddr: {
|
BillAddr: {
|
||||||
City: job.ownr_city,
|
City: job.ownr_city,
|
||||||
Line1: insCo.street1,
|
Line1: insCo.street1,
|
||||||
@@ -302,6 +303,7 @@ async function InsertOwner(
|
|||||||
const ownerName = generateOwnerTier(job, true, null);
|
const ownerName = generateOwnerTier(job, true, null);
|
||||||
const Customer = {
|
const Customer = {
|
||||||
DisplayName: ownerName,
|
DisplayName: ownerName,
|
||||||
|
BillWithParent: true,
|
||||||
BillAddr: {
|
BillAddr: {
|
||||||
City: job.ownr_city,
|
City: job.ownr_city,
|
||||||
Line1: job.ownr_addr1,
|
Line1: job.ownr_addr1,
|
||||||
@@ -362,6 +364,7 @@ exports.QueryJob = QueryJob;
|
|||||||
async function InsertJob(oauthClient, qbo_realmId, req, job, parentTierRef) {
|
async function InsertJob(oauthClient, qbo_realmId, req, job, parentTierRef) {
|
||||||
const Customer = {
|
const Customer = {
|
||||||
DisplayName: job.ro_number,
|
DisplayName: job.ro_number,
|
||||||
|
BillWithParent: true,
|
||||||
BillAddr: {
|
BillAddr: {
|
||||||
City: job.ownr_city,
|
City: job.ownr_city,
|
||||||
Line1: job.ownr_addr1,
|
Line1: job.ownr_addr1,
|
||||||
|
|||||||
Reference in New Issue
Block a user