General gendoc function & reprint parts orders IO-411

This commit is contained in:
Patrick Fic
2021-01-14 16:40:16 -08:00
parent ffbe670499
commit 5a6991dad6
7 changed files with 146 additions and 117 deletions

View File

@@ -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 = () => {

View File

@@ -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>
), ),
}, },
]; ];

View File

@@ -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"
); );
} }
}; };

View File

@@ -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: {

View File

@@ -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>

View File

@@ -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) => {

View File

@@ -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));
}
};