General gendoc function & reprint parts orders IO-411
This commit is contained in:
@@ -1,15 +1,13 @@
|
|||||||
import React from "react";
|
|
||||||
import JobIntakeTemplateItem from "../job-checklist-template-item/job-checklist-template-item.component";
|
|
||||||
import { useParams } from "react-router-dom";
|
|
||||||
import RenderTemplate, {
|
|
||||||
displayTemplateInWindow,
|
|
||||||
} from "../../../../utils/RenderTemplate";
|
|
||||||
import { Button } from "antd";
|
import { Button } from "antd";
|
||||||
import { selectBodyshop } from "../../../../redux/user/user.selectors";
|
import React from "react";
|
||||||
import { connect } from "react-redux";
|
|
||||||
import { createStructuredSelector } from "reselect";
|
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { connect } from "react-redux";
|
||||||
|
import { useParams } from "react-router-dom";
|
||||||
|
import { createStructuredSelector } from "reselect";
|
||||||
import { logImEXEvent } from "../../../../firebase/firebase.utils";
|
import { logImEXEvent } from "../../../../firebase/firebase.utils";
|
||||||
|
import { selectBodyshop } from "../../../../redux/user/user.selectors";
|
||||||
|
import { GenerateDocument } from "../../../../utils/RenderTemplate";
|
||||||
|
import JobIntakeTemplateItem from "../job-checklist-template-item/job-checklist-template-item.component";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
//currentUser: selectCurrentUser
|
//currentUser: selectCurrentUser
|
||||||
@@ -25,14 +23,14 @@ export function JobIntakeTemplateList({ bodyshop, templates }) {
|
|||||||
const renderTemplate = async (templateKey) => {
|
const renderTemplate = async (templateKey) => {
|
||||||
logImEXEvent("job_checklist_template_render");
|
logImEXEvent("job_checklist_template_render");
|
||||||
|
|
||||||
const html = await RenderTemplate(
|
GenerateDocument(
|
||||||
{
|
{
|
||||||
name: templateKey,
|
name: templateKey,
|
||||||
variables: { id: jobId },
|
variables: { id: jobId },
|
||||||
},
|
},
|
||||||
bodyshop
|
{},
|
||||||
|
"p"
|
||||||
);
|
);
|
||||||
displayTemplateInWindow(html);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const renderAllTemplates = () => {
|
const renderAllTemplates = () => {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { SyncOutlined } from "@ant-design/icons";
|
import { MailFilled, PrinterFilled, SyncOutlined } from "@ant-design/icons";
|
||||||
import { Button, Input, Table, Typography } from "antd";
|
import { Button, Input, Space, Table, Typography } from "antd";
|
||||||
import queryString from "query-string";
|
import queryString from "query-string";
|
||||||
import React, { useState } from "react";
|
import React, { useState } from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
@@ -7,13 +7,15 @@ import { connect } from "react-redux";
|
|||||||
import { useLocation } from "react-router-dom";
|
import { useLocation } from "react-router-dom";
|
||||||
import { createStructuredSelector } from "reselect";
|
import { createStructuredSelector } from "reselect";
|
||||||
import { logImEXEvent } from "../../firebase/firebase.utils";
|
import { logImEXEvent } from "../../firebase/firebase.utils";
|
||||||
|
import { selectJobReadOnly } from "../../redux/application/application.selectors";
|
||||||
import { setModalContext } from "../../redux/modals/modals.actions";
|
import { setModalContext } from "../../redux/modals/modals.actions";
|
||||||
|
import { selectBodyshop } from "../../redux/user/user.selectors";
|
||||||
import CurrencyFormatter from "../../utils/CurrencyFormatter";
|
import CurrencyFormatter from "../../utils/CurrencyFormatter";
|
||||||
import { DateFormatter } from "../../utils/DateFormatter";
|
import { DateFormatter } from "../../utils/DateFormatter";
|
||||||
|
import { GenerateDocument } from "../../utils/RenderTemplate";
|
||||||
import { alphaSort } from "../../utils/sorters";
|
import { alphaSort } from "../../utils/sorters";
|
||||||
|
import { TemplateList } from "../../utils/TemplateConstants";
|
||||||
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 { selectBodyshop } from "../../redux/user/user.selectors";
|
|
||||||
import { selectJobReadOnly } from "../../redux/application/application.selectors";
|
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
jobRO: selectJobReadOnly,
|
jobRO: selectJobReadOnly,
|
||||||
@@ -90,37 +92,67 @@ export function PartsOrderListTableComponent({
|
|||||||
dataIndex: "actions",
|
dataIndex: "actions",
|
||||||
key: "actions",
|
key: "actions",
|
||||||
render: (text, record) => (
|
render: (text, record) => (
|
||||||
<Button
|
<Space>
|
||||||
disabled={jobRO}
|
<Button
|
||||||
onClick={() => {
|
disabled={jobRO}
|
||||||
logImEXEvent("parts_order_receive_bill");
|
onClick={() => {
|
||||||
|
logImEXEvent("parts_order_receive_bill");
|
||||||
|
|
||||||
setBillEnterContext({
|
setBillEnterContext({
|
||||||
actions: { refetch: refetch },
|
actions: { refetch: refetch },
|
||||||
context: {
|
context: {
|
||||||
job: job,
|
job: job,
|
||||||
bill: {
|
bill: {
|
||||||
vendorid: record.vendor.id,
|
vendorid: record.vendor.id,
|
||||||
billlines: record.parts_order_lines.map((pol) => {
|
billlines: record.parts_order_lines.map((pol) => {
|
||||||
return {
|
return {
|
||||||
joblineid: pol.job_line_id,
|
joblineid: pol.job_line_id,
|
||||||
line_desc: pol.line_desc,
|
line_desc: pol.line_desc,
|
||||||
quantity: pol.quantity,
|
quantity: pol.quantity,
|
||||||
actual_price: pol.act_price,
|
actual_price: pol.act_price,
|
||||||
cost_center: pol.jobline.part_type
|
cost_center: pol.jobline.part_type
|
||||||
? responsibilityCenters.defaults.costs[
|
? responsibilityCenters.defaults.costs[
|
||||||
pol.jobline.part_type
|
pol.jobline.part_type
|
||||||
] || null
|
] || null
|
||||||
: null,
|
: null,
|
||||||
};
|
};
|
||||||
}),
|
}),
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
});
|
||||||
});
|
}}
|
||||||
}}
|
>
|
||||||
>
|
{t("parts_orders.actions.receivebill")}
|
||||||
{t("parts_orders.actions.receivebill")}
|
</Button>
|
||||||
</Button>
|
<PrinterFilled
|
||||||
|
onClick={() =>
|
||||||
|
GenerateDocument(
|
||||||
|
{
|
||||||
|
name: record.isReturn
|
||||||
|
? TemplateList().parts_return_confirmation.key
|
||||||
|
: TemplateList().parts_order_confirmation.key,
|
||||||
|
variables: { id: record.id },
|
||||||
|
},
|
||||||
|
{},
|
||||||
|
"p"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
<MailFilled
|
||||||
|
onClick={() =>
|
||||||
|
GenerateDocument(
|
||||||
|
{
|
||||||
|
name: record.isReturn
|
||||||
|
? TemplateList().parts_return_confirmation.key
|
||||||
|
: TemplateList().parts_order_confirmation.key,
|
||||||
|
variables: { id: record.id },
|
||||||
|
},
|
||||||
|
{},
|
||||||
|
"e"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
</Space>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -12,16 +12,14 @@ import { QUERY_ALL_VENDORS_FOR_ORDER } from "../../graphql/vendors.queries";
|
|||||||
import { setEmailOptions } from "../../redux/email/email.actions";
|
import { setEmailOptions } from "../../redux/email/email.actions";
|
||||||
import {
|
import {
|
||||||
setModalContext,
|
setModalContext,
|
||||||
toggleModalVisible,
|
toggleModalVisible
|
||||||
} from "../../redux/modals/modals.actions";
|
} from "../../redux/modals/modals.actions";
|
||||||
import { selectPartsOrder } from "../../redux/modals/modals.selectors";
|
import { selectPartsOrder } from "../../redux/modals/modals.selectors";
|
||||||
import {
|
import {
|
||||||
selectBodyshop,
|
selectBodyshop,
|
||||||
selectCurrentUser,
|
selectCurrentUser
|
||||||
} from "../../redux/user/user.selectors";
|
} from "../../redux/user/user.selectors";
|
||||||
import RenderTemplate, {
|
import { GenerateDocument } from "../../utils/RenderTemplate";
|
||||||
displayTemplateInWindow,
|
|
||||||
} 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 LoadingSpinner from "../loading-spinner/loading-spinner.component";
|
||||||
@@ -157,14 +155,9 @@ export function PartsOrderModalContainer({
|
|||||||
const matchingVendor = data.vendors.filter(
|
const matchingVendor = data.vendors.filter(
|
||||||
(item) => item.id === values.vendorid
|
(item) => item.id === values.vendorid
|
||||||
)[0];
|
)[0];
|
||||||
setEmailOptions({
|
|
||||||
messageOptions: {
|
GenerateDocument(
|
||||||
to: matchingVendor ? [matchingVendor.email] : null,
|
{
|
||||||
replyTo: bodyshop.email,
|
|
||||||
subject: TemplateList("job", bodyshop.shopname)
|
|
||||||
.parts_order_confirmation.subject,
|
|
||||||
},
|
|
||||||
template: {
|
|
||||||
name: isReturn
|
name: isReturn
|
||||||
? TemplateList().parts_return_confirmation.key
|
? TemplateList().parts_return_confirmation.key
|
||||||
: TemplateList().parts_order_confirmation.key,
|
: TemplateList().parts_order_confirmation.key,
|
||||||
@@ -172,20 +165,26 @@ export function PartsOrderModalContainer({
|
|||||||
id: insertResult.data.insert_parts_orders.returning[0].id,
|
id: insertResult.data.insert_parts_orders.returning[0].id,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
{
|
||||||
|
to: matchingVendor ? [matchingVendor.email] : null,
|
||||||
|
replyTo: bodyshop.email,
|
||||||
|
subject: TemplateList("job", bodyshop.shopname)
|
||||||
|
.parts_order_confirmation.subject,
|
||||||
|
},
|
||||||
|
"e"
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
displayTemplateInWindow(
|
GenerateDocument(
|
||||||
await RenderTemplate(
|
{
|
||||||
{
|
name: isReturn
|
||||||
name: isReturn
|
? TemplateList().parts_return_confirmation.key
|
||||||
? TemplateList().parts_return_confirmation.key
|
: TemplateList().parts_order_confirmation.key,
|
||||||
: TemplateList().parts_order_confirmation.key,
|
variables: {
|
||||||
variables: {
|
id: insertResult.data.insert_parts_orders.returning[0].id,
|
||||||
id: insertResult.data.insert_parts_orders.returning[0].id,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
bodyshop
|
},
|
||||||
)
|
{},
|
||||||
|
"p"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -9,18 +9,16 @@ import { createStructuredSelector } from "reselect";
|
|||||||
import { logImEXEvent } from "../../firebase/firebase.utils";
|
import { logImEXEvent } from "../../firebase/firebase.utils";
|
||||||
import {
|
import {
|
||||||
INSERT_NEW_PAYMENT,
|
INSERT_NEW_PAYMENT,
|
||||||
UPDATE_PAYMENT
|
UPDATE_PAYMENT,
|
||||||
} from "../../graphql/payments.queries";
|
} from "../../graphql/payments.queries";
|
||||||
import { setEmailOptions } from "../../redux/email/email.actions";
|
import { setEmailOptions } from "../../redux/email/email.actions";
|
||||||
import { toggleModalVisible } from "../../redux/modals/modals.actions";
|
import { toggleModalVisible } from "../../redux/modals/modals.actions";
|
||||||
import { selectPayment } from "../../redux/modals/modals.selectors";
|
import { selectPayment } from "../../redux/modals/modals.selectors";
|
||||||
import {
|
import {
|
||||||
selectBodyshop,
|
selectBodyshop,
|
||||||
selectCurrentUser
|
selectCurrentUser,
|
||||||
} from "../../redux/user/user.selectors";
|
} from "../../redux/user/user.selectors";
|
||||||
import RenderTemplate, {
|
import { GenerateDocument } from "../../utils/RenderTemplate";
|
||||||
displayTemplateInWindow
|
|
||||||
} from "../../utils/RenderTemplate";
|
|
||||||
import { TemplateList } from "../../utils/TemplateConstants";
|
import { TemplateList } from "../../utils/TemplateConstants";
|
||||||
import PaymentForm from "../payment-form/payment-form.component";
|
import PaymentForm from "../payment-form/payment-form.component";
|
||||||
|
|
||||||
@@ -121,32 +119,19 @@ function BillEnterModalContainer({
|
|||||||
notification["error"]({ message: t("payments.errors.payment") });
|
notification["error"]({ message: t("payments.errors.payment") });
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sendby === "email") {
|
GenerateDocument(
|
||||||
setEmailOptions({
|
{
|
||||||
messageOptions: {
|
name: TemplateList().payment_receipt.key,
|
||||||
// to: [appData.email],
|
variables: {
|
||||||
replyTo: bodyshop.email,
|
id: newPayment.data.insert_payments.returning[0].id,
|
||||||
},
|
},
|
||||||
template: {
|
},
|
||||||
name: TemplateList().payment_receipt.key,
|
{
|
||||||
variables: {
|
// to: [appData.email],
|
||||||
id: newPayment.data.insert_payments.returning[0].id,
|
replyTo: bodyshop.email,
|
||||||
},
|
},
|
||||||
},
|
sendby === "email" ? "e" : "p"
|
||||||
});
|
);
|
||||||
} else {
|
|
||||||
displayTemplateInWindow(
|
|
||||||
await RenderTemplate(
|
|
||||||
{
|
|
||||||
name: TemplateList().payment_receipt.key,
|
|
||||||
variables: {
|
|
||||||
id: newPayment.data.insert_payments.returning[0].id,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
bodyshop
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
const updatedPayment = await updatePayment({
|
const updatedPayment = await updatePayment({
|
||||||
variables: {
|
variables: {
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import { createStructuredSelector } from "reselect";
|
|||||||
import { setEmailOptions } from "../../redux/email/email.actions";
|
import { setEmailOptions } from "../../redux/email/email.actions";
|
||||||
import { selectPrintCenter } from "../../redux/modals/modals.selectors";
|
import { selectPrintCenter } from "../../redux/modals/modals.selectors";
|
||||||
import { selectBodyshop } from "../../redux/user/user.selectors";
|
import { selectBodyshop } from "../../redux/user/user.selectors";
|
||||||
import RenderTemplate from "../../utils/RenderTemplate";
|
import { GenerateDocument } from "../../utils/RenderTemplate";
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
printCenterModal: selectPrintCenter,
|
printCenterModal: selectPrintCenter,
|
||||||
bodyshop: selectBodyshop,
|
bodyshop: selectBodyshop,
|
||||||
@@ -23,14 +23,14 @@ export function PrintCenterItemComponent({
|
|||||||
disabled,
|
disabled,
|
||||||
}) {
|
}) {
|
||||||
const renderToNewWindow = async () => {
|
const renderToNewWindow = async () => {
|
||||||
await RenderTemplate(
|
await GenerateDocument(
|
||||||
{
|
{
|
||||||
name: item.key,
|
name: item.key,
|
||||||
variables: { id: id },
|
variables: { id: id },
|
||||||
},
|
},
|
||||||
bodyshop
|
{},
|
||||||
|
"p"
|
||||||
);
|
);
|
||||||
// displayTemplateInWindow(html);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
if (disabled) return <li className="print-center-item">{item.title} </li>;
|
if (disabled) return <li className="print-center-item">{item.title} </li>;
|
||||||
@@ -40,15 +40,14 @@ export function PrintCenterItemComponent({
|
|||||||
<PrinterOutlined onClick={renderToNewWindow} />
|
<PrinterOutlined onClick={renderToNewWindow} />
|
||||||
<MailOutlined
|
<MailOutlined
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setEmailOptions({
|
GenerateDocument(
|
||||||
messageOptions: {
|
{
|
||||||
Subject: "",
|
|
||||||
},
|
|
||||||
template: {
|
|
||||||
name: item.key,
|
name: item.key,
|
||||||
variables: { id: id },
|
variables: { id: id },
|
||||||
},
|
},
|
||||||
});
|
{},
|
||||||
|
"e"
|
||||||
|
);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</li>
|
</li>
|
||||||
|
|||||||
@@ -1,13 +1,11 @@
|
|||||||
import { Button, Typography, List } from "antd";
|
import { Button, List, Typography } from "antd";
|
||||||
import React from "react";
|
import React 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 { logImEXEvent } from "../../firebase/firebase.utils";
|
import { logImEXEvent } from "../../firebase/firebase.utils";
|
||||||
import { selectBodyshop } from "../../redux/user/user.selectors";
|
import { selectBodyshop } from "../../redux/user/user.selectors";
|
||||||
import RenderTemplate, {
|
import { GenerateDocument } from "../../utils/RenderTemplate";
|
||||||
displayTemplateInWindow,
|
|
||||||
} from "../../utils/RenderTemplate";
|
|
||||||
import { TemplateList } from "../../utils/TemplateConstants";
|
import { TemplateList } from "../../utils/TemplateConstants";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
@@ -20,17 +18,18 @@ const mapDispatchToProps = (dispatch) => ({
|
|||||||
export function PrintCenterSpeedPrint({ bodyshop, jobId }) {
|
export function PrintCenterSpeedPrint({ bodyshop, jobId }) {
|
||||||
const { speedprint } = bodyshop;
|
const { speedprint } = bodyshop;
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
const renderTemplate = async (templateKey) => {
|
const renderTemplate = async (templateKey) => {
|
||||||
logImEXEvent("speed_print_template_render");
|
logImEXEvent("speed_print_template_render");
|
||||||
|
|
||||||
const html = await RenderTemplate(
|
GenerateDocument(
|
||||||
{
|
{
|
||||||
name: templateKey,
|
name: templateKey,
|
||||||
variables: { id: jobId },
|
variables: { id: jobId },
|
||||||
},
|
},
|
||||||
bodyshop
|
{},
|
||||||
|
"p"
|
||||||
);
|
);
|
||||||
displayTemplateInWindow(html);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const renderAllTemplates = (templateKeys) => {
|
const renderAllTemplates = (templateKeys) => {
|
||||||
|
|||||||
@@ -3,6 +3,9 @@ import jsreport from "jsreport-browser-client-dist";
|
|||||||
import client from "../utils/GraphQLClient";
|
import client from "../utils/GraphQLClient";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import { auth } from "../firebase/firebase.utils";
|
import { auth } from "../firebase/firebase.utils";
|
||||||
|
import { TemplateList } from "./TemplateConstants";
|
||||||
|
import { store } from "../redux/store";
|
||||||
|
import { setEmailOptions } from "../redux/email/email.actions";
|
||||||
const server = process.env.REACT_APP_REPORTS_SERVER_URL;
|
const server = process.env.REACT_APP_REPORTS_SERVER_URL;
|
||||||
jsreport.serverUrl = server;
|
jsreport.serverUrl = server;
|
||||||
|
|
||||||
@@ -120,3 +123,17 @@ export const displayTemplateInWindowNoprint = (html) => {
|
|||||||
console.log("Unable to write to new window.", error);
|
console.log("Unable to write to new window.", error);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const GenerateDocument = async (template, messageOptions, sendType) => {
|
||||||
|
const bodyshop = store.getState().user.bodyshop;
|
||||||
|
if (sendType === "e") {
|
||||||
|
store.dispatch(
|
||||||
|
setEmailOptions({
|
||||||
|
messageOptions,
|
||||||
|
template,
|
||||||
|
})
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
displayTemplateInWindow(await RenderTemplate(template, bodyshop));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user