Refactored how in house invoices are created IO-460

This commit is contained in:
Patrick Fic
2021-01-08 11:40:32 -08:00
parent 3ca416c5cf
commit 6f96bcfa7e
15 changed files with 323 additions and 41 deletions

View File

@@ -81,6 +81,7 @@ export default function PartsOrderModalComponent({
>
<Input />
</Form.Item>
<Form.Item
label={t("parts_orders.fields.act_price")}
key={`${index}act_price`}

View File

@@ -1,29 +1,31 @@
import { useMutation, useQuery } from "@apollo/react-hooks";
import { Form, Modal, notification } from "antd";
import moment from "moment";
import React, { useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
import { INSERT_NEW_BILL } from "../../graphql/bills.queries";
import { logImEXEvent } from "../../firebase/firebase.utils";
import { UPDATE_JOB_LINE_STATUS } from "../../graphql/jobs-lines.queries";
import { INSERT_NEW_PARTS_ORDERS } from "../../graphql/parts-orders.queries";
import { QUERY_ALL_VENDORS_FOR_ORDER } from "../../graphql/vendors.queries";
import { setEmailOptions } from "../../redux/email/email.actions";
import { toggleModalVisible } from "../../redux/modals/modals.actions";
import {
setModalContext,
toggleModalVisible,
} from "../../redux/modals/modals.actions";
import { selectPartsOrder } from "../../redux/modals/modals.selectors";
import {
selectBodyshop,
selectCurrentUser,
} from "../../redux/user/user.selectors";
import AlertComponent from "../alert/alert.component";
import LoadingSpinner from "../loading-spinner/loading-spinner.component";
import PartsOrderModalComponent from "./parts-order-modal.component";
import RenderTemplate, {
displayTemplateInWindow,
} from "../../utils/RenderTemplate";
import moment from "moment";
import { TemplateList } from "../../utils/TemplateConstants";
import { logImEXEvent } from "../../firebase/firebase.utils";
import AlertComponent from "../alert/alert.component";
import LoadingSpinner from "../loading-spinner/loading-spinner.component";
import PartsOrderModalComponent from "./parts-order-modal.component";
const mapStateToProps = createStructuredSelector({
currentUser: selectCurrentUser,
@@ -34,6 +36,8 @@ const mapStateToProps = createStructuredSelector({
const mapDispatchToProps = (dispatch) => ({
setEmailOptions: (e) => dispatch(setEmailOptions(e)),
toggleModalVisible: () => dispatch(toggleModalVisible("partsOrder")),
setBillEnterContext: (context) =>
dispatch(setModalContext({ context: context, modal: "billEnter" })),
});
export function PartsOrderModalContainer({
@@ -42,6 +46,7 @@ export function PartsOrderModalContainer({
currentUser,
bodyshop,
setEmailOptions,
setBillEnterContext,
}) {
const { t } = useTranslation();
@@ -68,7 +73,6 @@ export function PartsOrderModalContainer({
const [insertPartOrder] = useMutation(INSERT_NEW_PARTS_ORDERS);
const [updateJobLines] = useMutation(UPDATE_JOB_LINE_STATUS);
const [insertBill] = useMutation(INSERT_NEW_BILL);
const handleFinish = async (values) => {
logImEXEvent("parts_order_insert");
@@ -113,37 +117,37 @@ export function PartsOrderModalContainer({
});
if (values.vendorid === bodyshop.inhousevendorid) {
logImEXEvent("parts_order_inhouse_invoice");
let invoiceToPost = {
vendorid: bodyshop.inhousevendorid,
isinhouse: true,
jobid: jobId,
total: 0,
invoice_number: "ih",
federal_tax_rate: bodyshop.bill_tax_rates.federal_tax_rate || 0,
state_tax_rate: bodyshop.bill_tax_rates.state_tax_rate || 0,
local_tax_rate: bodyshop.bill_tax_rates.local_tax_rate || 0,
billlines: {
data: values.parts_order_lines.data.map((p) => {
return {
joblineid: p.job_line_id,
actual_price: p.act_price,
actual_cost: p.act_price,
line_desc: p.line_desc,
line_remarks: p.line_remarks,
quantity: p.quantity || 1,
cost_center:
bodyshop.md_responsibility_centers.defaults.costs.PAO ||
"Other*",
};
}),
setBillEnterContext({
actions: { refetch: refetch },
context: {
disableInvNumber: true,
job: { id: jobId },
bill: {
vendorid: bodyshop.inhousevendorid,
invoice_number: "ih",
isinhouse: true,
date: new moment(),
billlines: values.parts_order_lines.data.map((p) => {
return {
joblineid: p.job_line_id,
actual_price: p.act_price,
actual_cost: p.act_price,
line_desc: p.line_desc,
line_remarks: p.line_remarks,
part_type: p.part_type,
quantity: p.quantity || 1,
applicable_taxes: {
local: false,
state: p.tax_part,
federal: true,
},
};
}),
},
},
};
await insertBill({
variables: { bill: invoiceToPost },
});
toggleModalVisible();
return;
}
if (refetch) refetch();