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 { selectBodyshop } from "../../../../redux/user/user.selectors";
import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
import React from "react";
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 { 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({
//currentUser: selectCurrentUser
@@ -25,14 +23,14 @@ export function JobIntakeTemplateList({ bodyshop, templates }) {
const renderTemplate = async (templateKey) => {
logImEXEvent("job_checklist_template_render");
const html = await RenderTemplate(
GenerateDocument(
{
name: templateKey,
variables: { id: jobId },
},
bodyshop
{},
"p"
);
displayTemplateInWindow(html);
};
const renderAllTemplates = () => {

View File

@@ -1,5 +1,5 @@
import { SyncOutlined } from "@ant-design/icons";
import { Button, Input, Table, Typography } from "antd";
import { MailFilled, PrinterFilled, SyncOutlined } from "@ant-design/icons";
import { Button, Input, Space, Table, Typography } from "antd";
import queryString from "query-string";
import React, { useState } from "react";
import { useTranslation } from "react-i18next";
@@ -7,13 +7,15 @@ import { connect } from "react-redux";
import { useLocation } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import { logImEXEvent } from "../../firebase/firebase.utils";
import { selectJobReadOnly } from "../../redux/application/application.selectors";
import { setModalContext } from "../../redux/modals/modals.actions";
import { selectBodyshop } from "../../redux/user/user.selectors";
import CurrencyFormatter from "../../utils/CurrencyFormatter";
import { DateFormatter } from "../../utils/DateFormatter";
import { GenerateDocument } from "../../utils/RenderTemplate";
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 { selectBodyshop } from "../../redux/user/user.selectors";
import { selectJobReadOnly } from "../../redux/application/application.selectors";
const mapStateToProps = createStructuredSelector({
jobRO: selectJobReadOnly,
@@ -90,37 +92,67 @@ export function PartsOrderListTableComponent({
dataIndex: "actions",
key: "actions",
render: (text, record) => (
<Button
disabled={jobRO}
onClick={() => {
logImEXEvent("parts_order_receive_bill");
<Space>
<Button
disabled={jobRO}
onClick={() => {
logImEXEvent("parts_order_receive_bill");
setBillEnterContext({
actions: { refetch: refetch },
context: {
job: job,
bill: {
vendorid: record.vendor.id,
billlines: record.parts_order_lines.map((pol) => {
return {
joblineid: pol.job_line_id,
line_desc: pol.line_desc,
quantity: pol.quantity,
actual_price: pol.act_price,
cost_center: pol.jobline.part_type
? responsibilityCenters.defaults.costs[
pol.jobline.part_type
] || null
: null,
};
}),
setBillEnterContext({
actions: { refetch: refetch },
context: {
job: job,
bill: {
vendorid: record.vendor.id,
billlines: record.parts_order_lines.map((pol) => {
return {
joblineid: pol.job_line_id,
line_desc: pol.line_desc,
quantity: pol.quantity,
actual_price: pol.act_price,
cost_center: pol.jobline.part_type
? responsibilityCenters.defaults.costs[
pol.jobline.part_type
] || null
: null,
};
}),
},
},
},
});
}}
>
{t("parts_orders.actions.receivebill")}
</Button>
});
}}
>
{t("parts_orders.actions.receivebill")}
</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 {
setModalContext,
toggleModalVisible,
toggleModalVisible
} from "../../redux/modals/modals.actions";
import { selectPartsOrder } from "../../redux/modals/modals.selectors";
import {
selectBodyshop,
selectCurrentUser,
selectCurrentUser
} from "../../redux/user/user.selectors";
import RenderTemplate, {
displayTemplateInWindow,
} from "../../utils/RenderTemplate";
import { GenerateDocument } from "../../utils/RenderTemplate";
import { TemplateList } from "../../utils/TemplateConstants";
import AlertComponent from "../alert/alert.component";
import LoadingSpinner from "../loading-spinner/loading-spinner.component";
@@ -157,14 +155,9 @@ export function PartsOrderModalContainer({
const matchingVendor = data.vendors.filter(
(item) => item.id === values.vendorid
)[0];
setEmailOptions({
messageOptions: {
to: matchingVendor ? [matchingVendor.email] : null,
replyTo: bodyshop.email,
subject: TemplateList("job", bodyshop.shopname)
.parts_order_confirmation.subject,
},
template: {
GenerateDocument(
{
name: isReturn
? TemplateList().parts_return_confirmation.key
: TemplateList().parts_order_confirmation.key,
@@ -172,20 +165,26 @@ export function PartsOrderModalContainer({
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 {
displayTemplateInWindow(
await RenderTemplate(
{
name: isReturn
? TemplateList().parts_return_confirmation.key
: TemplateList().parts_order_confirmation.key,
variables: {
id: insertResult.data.insert_parts_orders.returning[0].id,
},
GenerateDocument(
{
name: isReturn
? TemplateList().parts_return_confirmation.key
: TemplateList().parts_order_confirmation.key,
variables: {
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 {
INSERT_NEW_PAYMENT,
UPDATE_PAYMENT
UPDATE_PAYMENT,
} from "../../graphql/payments.queries";
import { setEmailOptions } from "../../redux/email/email.actions";
import { toggleModalVisible } from "../../redux/modals/modals.actions";
import { selectPayment } from "../../redux/modals/modals.selectors";
import {
selectBodyshop,
selectCurrentUser
selectCurrentUser,
} from "../../redux/user/user.selectors";
import RenderTemplate, {
displayTemplateInWindow
} from "../../utils/RenderTemplate";
import { GenerateDocument } from "../../utils/RenderTemplate";
import { TemplateList } from "../../utils/TemplateConstants";
import PaymentForm from "../payment-form/payment-form.component";
@@ -121,32 +119,19 @@ function BillEnterModalContainer({
notification["error"]({ message: t("payments.errors.payment") });
}
if (sendby === "email") {
setEmailOptions({
messageOptions: {
// to: [appData.email],
replyTo: bodyshop.email,
GenerateDocument(
{
name: TemplateList().payment_receipt.key,
variables: {
id: newPayment.data.insert_payments.returning[0].id,
},
template: {
name: TemplateList().payment_receipt.key,
variables: {
id: newPayment.data.insert_payments.returning[0].id,
},
},
});
} else {
displayTemplateInWindow(
await RenderTemplate(
{
name: TemplateList().payment_receipt.key,
variables: {
id: newPayment.data.insert_payments.returning[0].id,
},
},
bodyshop
)
);
}
},
{
// to: [appData.email],
replyTo: bodyshop.email,
},
sendby === "email" ? "e" : "p"
);
} else {
const updatedPayment = await updatePayment({
variables: {

View File

@@ -5,7 +5,7 @@ import { createStructuredSelector } from "reselect";
import { setEmailOptions } from "../../redux/email/email.actions";
import { selectPrintCenter } from "../../redux/modals/modals.selectors";
import { selectBodyshop } from "../../redux/user/user.selectors";
import RenderTemplate from "../../utils/RenderTemplate";
import { GenerateDocument } from "../../utils/RenderTemplate";
const mapStateToProps = createStructuredSelector({
printCenterModal: selectPrintCenter,
bodyshop: selectBodyshop,
@@ -23,14 +23,14 @@ export function PrintCenterItemComponent({
disabled,
}) {
const renderToNewWindow = async () => {
await RenderTemplate(
await GenerateDocument(
{
name: item.key,
variables: { id: id },
},
bodyshop
{},
"p"
);
// displayTemplateInWindow(html);
};
if (disabled) return <li className="print-center-item">{item.title} </li>;
@@ -40,15 +40,14 @@ export function PrintCenterItemComponent({
<PrinterOutlined onClick={renderToNewWindow} />
<MailOutlined
onClick={() => {
setEmailOptions({
messageOptions: {
Subject: "",
},
template: {
GenerateDocument(
{
name: item.key,
variables: { id: id },
},
});
{},
"e"
);
}}
/>
</li>

View File

@@ -1,13 +1,11 @@
import { Button, Typography, List } from "antd";
import { Button, List, Typography } from "antd";
import React from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
import { logImEXEvent } from "../../firebase/firebase.utils";
import { selectBodyshop } from "../../redux/user/user.selectors";
import RenderTemplate, {
displayTemplateInWindow,
} from "../../utils/RenderTemplate";
import { GenerateDocument } from "../../utils/RenderTemplate";
import { TemplateList } from "../../utils/TemplateConstants";
const mapStateToProps = createStructuredSelector({
@@ -20,17 +18,18 @@ const mapDispatchToProps = (dispatch) => ({
export function PrintCenterSpeedPrint({ bodyshop, jobId }) {
const { speedprint } = bodyshop;
const { t } = useTranslation();
const renderTemplate = async (templateKey) => {
logImEXEvent("speed_print_template_render");
const html = await RenderTemplate(
GenerateDocument(
{
name: templateKey,
variables: { id: jobId },
},
bodyshop
{},
"p"
);
displayTemplateInWindow(html);
};
const renderAllTemplates = (templateKeys) => {

View File

@@ -3,6 +3,9 @@ import jsreport from "jsreport-browser-client-dist";
import client from "../utils/GraphQLClient";
import axios from "axios";
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;
jsreport.serverUrl = server;
@@ -120,3 +123,17 @@ export const displayTemplateInWindowNoprint = (html) => {
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));
}
};