Modification to Credits not Received.
This commit is contained in:
@@ -32515,6 +32515,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>saving</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>
|
</children>
|
||||||
</folder_node>
|
</folder_node>
|
||||||
<folder_node>
|
<folder_node>
|
||||||
@@ -32583,6 +32604,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>cm_received</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>comments</name>
|
<name>comments</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
@@ -33008,6 +33050,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>mark_as_received</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>newpartsorder</name>
|
<name>newpartsorder</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
@@ -33202,6 +33265,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>line_updated</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>received</name>
|
<name>received</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
|
|||||||
@@ -0,0 +1,136 @@
|
|||||||
|
import { Checkbox, Form, Skeleton, Typography } from "antd";
|
||||||
|
import React, { useEffect } from "react";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
import ReadOnlyFormItemComponent from "../form-items-formatted/read-only-form-item.component";
|
||||||
|
import "./bill-cm-returns-table.styles.scss";
|
||||||
|
export default function BillCmdReturnsTableComponent({
|
||||||
|
form,
|
||||||
|
loadOutstandingReturns,
|
||||||
|
returnLoading,
|
||||||
|
returnData,
|
||||||
|
}) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (returnData) {
|
||||||
|
form.setFieldsValue({
|
||||||
|
outstanding_returns: returnData.parts_order_lines,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, [returnData, form]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Form.Item
|
||||||
|
shouldUpdate={(prev, cur) =>
|
||||||
|
prev.jobid !== cur.jobid ||
|
||||||
|
prev.is_credit_memo !== cur.is_credit_memo ||
|
||||||
|
prev.vendorid !== cur.vendorid
|
||||||
|
}
|
||||||
|
noStyle
|
||||||
|
>
|
||||||
|
{() => {
|
||||||
|
const isReturn = form.getFieldValue("is_credit_memo");
|
||||||
|
|
||||||
|
if (!isReturn) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (returnLoading) return <Skeleton />;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Form.List name="outstanding_returns">
|
||||||
|
{(fields, { add, remove, move }) => {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Typography.Title level={4}>
|
||||||
|
{t("bills.labels.creditsnotreceived")}
|
||||||
|
</Typography.Title>
|
||||||
|
<table className="bill-cm-returns-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>{t("parts_orders.fields.line_desc")}</th>
|
||||||
|
<th>{t("parts_orders.fields.part_type")}</th>
|
||||||
|
<th>{t("parts_orders.fields.quantity")}</th>
|
||||||
|
<th>{t("parts_orders.fields.act_price")}</th>
|
||||||
|
<th>{t("parts_orders.fields.cost")}</th>
|
||||||
|
<th>{t("parts_orders.labels.mark_as_received")}</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{fields.map((field, index) => (
|
||||||
|
<tr key={field.key}>
|
||||||
|
<td>
|
||||||
|
<Form.Item
|
||||||
|
// label={t("joblines.fields.line_desc")}
|
||||||
|
key={`${index}line_desc`}
|
||||||
|
name={[field.name, "line_desc"]}
|
||||||
|
>
|
||||||
|
<ReadOnlyFormItemComponent />
|
||||||
|
</Form.Item>
|
||||||
|
</td>
|
||||||
|
|
||||||
|
<td>
|
||||||
|
<Form.Item
|
||||||
|
span={2}
|
||||||
|
//label={t("joblines.fields.mod_lb_hrs")}
|
||||||
|
key={`${index}part_type`}
|
||||||
|
name={[field.name, "part_type"]}
|
||||||
|
>
|
||||||
|
<ReadOnlyFormItemComponent />
|
||||||
|
</Form.Item>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<Form.Item
|
||||||
|
span={2}
|
||||||
|
//label={t("joblines.fields.mod_lb_hrs")}
|
||||||
|
key={`${index}quantity`}
|
||||||
|
name={[field.name, "quantity"]}
|
||||||
|
>
|
||||||
|
<ReadOnlyFormItemComponent />
|
||||||
|
</Form.Item>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<Form.Item
|
||||||
|
span={2}
|
||||||
|
//label={t("joblines.fields.mod_lb_hrs")}
|
||||||
|
key={`${index}act_price`}
|
||||||
|
name={[field.name, "act_price"]}
|
||||||
|
>
|
||||||
|
<ReadOnlyFormItemComponent type="currency" />
|
||||||
|
</Form.Item>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<Form.Item
|
||||||
|
span={2}
|
||||||
|
//label={t("joblines.fields.mod_lb_hrs")}
|
||||||
|
key={`${index}cost`}
|
||||||
|
name={[field.name, "cost"]}
|
||||||
|
>
|
||||||
|
<ReadOnlyFormItemComponent type="currency" />
|
||||||
|
</Form.Item>
|
||||||
|
</td>
|
||||||
|
|
||||||
|
<td>
|
||||||
|
<Form.Item
|
||||||
|
span={2}
|
||||||
|
//label={t("joblines.fields.mod_lb_hrs")}
|
||||||
|
key={`${index}cm_received`}
|
||||||
|
name={[field.name, "cm_received"]}
|
||||||
|
valuePropName="checked"
|
||||||
|
>
|
||||||
|
<Checkbox />
|
||||||
|
</Form.Item>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
))}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
</Form.List>
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
</Form.Item>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
.bill-cm-returns-table {
|
||||||
|
table-layout: fixed;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
th,
|
||||||
|
td {
|
||||||
|
padding: 8px;
|
||||||
|
text-align: left;
|
||||||
|
border-bottom: 1px solid #ddd;
|
||||||
|
|
||||||
|
.ant-form-item {
|
||||||
|
margin-bottom: 0px !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tr:hover {
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -11,6 +11,7 @@ import {
|
|||||||
QUERY_JOB_LBR_ADJUSTMENTS,
|
QUERY_JOB_LBR_ADJUSTMENTS,
|
||||||
UPDATE_JOB,
|
UPDATE_JOB,
|
||||||
} from "../../graphql/jobs.queries";
|
} from "../../graphql/jobs.queries";
|
||||||
|
import { MUTATION_MARK_RETURN_RECEIVED } from "../../graphql/parts-orders.queries";
|
||||||
import { insertAuditTrail } from "../../redux/application/application.actions";
|
import { insertAuditTrail } from "../../redux/application/application.actions";
|
||||||
import { toggleModalVisible } from "../../redux/modals/modals.actions";
|
import { toggleModalVisible } from "../../redux/modals/modals.actions";
|
||||||
import { selectBillEnterModal } from "../../redux/modals/modals.selectors";
|
import { selectBillEnterModal } from "../../redux/modals/modals.selectors";
|
||||||
@@ -47,6 +48,7 @@ function BillEnterModalContainer({
|
|||||||
const [enterAgain, setEnterAgain] = useState(false);
|
const [enterAgain, setEnterAgain] = useState(false);
|
||||||
const [insertBill] = useMutation(INSERT_NEW_BILL);
|
const [insertBill] = useMutation(INSERT_NEW_BILL);
|
||||||
const [updateJobLines] = useMutation(UPDATE_JOB_LINE);
|
const [updateJobLines] = useMutation(UPDATE_JOB_LINE);
|
||||||
|
const [updatePartsOrderLines] = useMutation(MUTATION_MARK_RETURN_RECEIVED);
|
||||||
const [loading, setLoading] = useState(false);
|
const [loading, setLoading] = useState(false);
|
||||||
const client = useApolloClient();
|
const client = useApolloClient();
|
||||||
|
|
||||||
@@ -76,7 +78,8 @@ function BillEnterModalContainer({
|
|||||||
}
|
}
|
||||||
|
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
const { upload, location, ...remainingValues } = values;
|
const { upload, location, outstanding_returns, ...remainingValues } =
|
||||||
|
values;
|
||||||
|
|
||||||
let adjustmentsToInsert = {};
|
let adjustmentsToInsert = {};
|
||||||
|
|
||||||
@@ -156,6 +159,25 @@ function BillEnterModalContainer({
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const markPolReceived = outstanding_returns.filter(
|
||||||
|
(o) => o.cm_received === true
|
||||||
|
);
|
||||||
|
|
||||||
|
if (markPolReceived.length > 0) {
|
||||||
|
const r2 = await updatePartsOrderLines({
|
||||||
|
variables: { partsLineIds: markPolReceived.map((p) => p.id) },
|
||||||
|
});
|
||||||
|
if (!!r2.errors) {
|
||||||
|
setLoading(false);
|
||||||
|
setEnterAgain(false);
|
||||||
|
notification["error"]({
|
||||||
|
message: t("parts_orders.errors.updating", {
|
||||||
|
message: JSON.stringify(r2.errors),
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!!r1.errors) {
|
if (!!r1.errors) {
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
setEnterAgain(false);
|
setEnterAgain(false);
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ export function BillFormComponent({
|
|||||||
billEdit,
|
billEdit,
|
||||||
disableInvNumber,
|
disableInvNumber,
|
||||||
job,
|
job,
|
||||||
|
loadOutstandingReturns,
|
||||||
}) {
|
}) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const client = useApolloClient();
|
const client = useApolloClient();
|
||||||
@@ -58,6 +59,14 @@ export function BillFormComponent({
|
|||||||
);
|
);
|
||||||
const handleVendorSelect = (props, opt) => {
|
const handleVendorSelect = (props, opt) => {
|
||||||
setDiscount(opt.discount);
|
setDiscount(opt.discount);
|
||||||
|
|
||||||
|
opt &&
|
||||||
|
loadOutstandingReturns({
|
||||||
|
variables: {
|
||||||
|
jobId: form.getFieldValue("jobid"),
|
||||||
|
vendorId: opt.value,
|
||||||
|
},
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -65,8 +74,8 @@ export function BillFormComponent({
|
|||||||
}, [job, form]);
|
}, [job, form]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (form.getFieldValue("vendorid") && vendorAutoCompleteOptions) {
|
const vendorId = form.getFieldValue("vendorid");
|
||||||
const vendorId = form.getFieldValue("vendorid");
|
if (vendorId && vendorAutoCompleteOptions) {
|
||||||
const matchingVendors = vendorAutoCompleteOptions.filter(
|
const matchingVendors = vendorAutoCompleteOptions.filter(
|
||||||
(v) => v.id === vendorId
|
(v) => v.id === vendorId
|
||||||
);
|
);
|
||||||
@@ -74,10 +83,25 @@ export function BillFormComponent({
|
|||||||
setDiscount(matchingVendors[0].discount);
|
setDiscount(matchingVendors[0].discount);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (form.getFieldValue("jobid")) {
|
const jobId = form.getFieldValue("jobid");
|
||||||
loadLines({ variables: { id: form.getFieldValue("jobid") } });
|
if (jobId) {
|
||||||
|
loadLines({ variables: { id: jobId } });
|
||||||
|
if (form.getFieldValue("is_credit_memo") && vendorId) {
|
||||||
|
loadOutstandingReturns({
|
||||||
|
variables: {
|
||||||
|
jobId: jobId,
|
||||||
|
vendorId: vendorId,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}, [form, setDiscount, vendorAutoCompleteOptions, loadLines]);
|
}, [
|
||||||
|
form,
|
||||||
|
loadOutstandingReturns,
|
||||||
|
setDiscount,
|
||||||
|
vendorAutoCompleteOptions,
|
||||||
|
loadLines,
|
||||||
|
]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
@@ -107,6 +131,13 @@ export function BillFormComponent({
|
|||||||
onBlur={() => {
|
onBlur={() => {
|
||||||
if (form.getFieldValue("jobid") !== null) {
|
if (form.getFieldValue("jobid") !== null) {
|
||||||
loadLines({ variables: { id: form.getFieldValue("jobid") } });
|
loadLines({ variables: { id: form.getFieldValue("jobid") } });
|
||||||
|
if (form.getFieldValue("vendorid") !== null)
|
||||||
|
loadOutstandingReturns({
|
||||||
|
variables: {
|
||||||
|
jobId: form.getFieldValue("jobid"),
|
||||||
|
vendorId: form.getFieldValue("vendorid"),
|
||||||
|
},
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
@@ -228,8 +259,22 @@ export function BillFormComponent({
|
|||||||
rules={[
|
rules={[
|
||||||
({ getFieldValue }) => ({
|
({ getFieldValue }) => ({
|
||||||
validator(rule, value) {
|
validator(rule, value) {
|
||||||
|
if (
|
||||||
|
value === true &&
|
||||||
|
getFieldValue("jobid") &&
|
||||||
|
getFieldValue("vendorid")
|
||||||
|
) {
|
||||||
|
loadOutstandingReturns({
|
||||||
|
variables: {
|
||||||
|
jobId: form.getFieldValue("jobid"),
|
||||||
|
vendorId: form.getFieldValue("vendorid"),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
!bodyshop.bill_allow_post_to_closed &&
|
!bodyshop.bill_allow_post_to_closed &&
|
||||||
|
job &&
|
||||||
(job.status === bodyshop.md_ro_statuses.default_invoiced ||
|
(job.status === bodyshop.md_ro_statuses.default_invoiced ||
|
||||||
job.status === bodyshop.md_ro_statuses.default_exported ||
|
job.status === bodyshop.md_ro_statuses.default_exported ||
|
||||||
job.status === bodyshop.md_ro_statuses.default_void) &&
|
job.status === bodyshop.md_ro_statuses.default_void) &&
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ import { GET_JOB_LINES_TO_ENTER_BILL } from "../../graphql/jobs-lines.queries";
|
|||||||
import { SEARCH_VENDOR_AUTOCOMPLETE } from "../../graphql/vendors.queries";
|
import { SEARCH_VENDOR_AUTOCOMPLETE } from "../../graphql/vendors.queries";
|
||||||
import { selectBodyshop } from "../../redux/user/user.selectors";
|
import { selectBodyshop } from "../../redux/user/user.selectors";
|
||||||
import BillFormComponent from "./bill-form.component";
|
import BillFormComponent from "./bill-form.component";
|
||||||
|
import BillCmdReturnsTableComponent from "../bill-cm-returns-table/bill-cm-returns-table.component";
|
||||||
|
import { QUERY_UNRECEIVED_LINES } from "../../graphql/parts-orders.queries";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
bodyshop: selectBodyshop,
|
bodyshop: selectBodyshop,
|
||||||
@@ -27,20 +29,34 @@ export function BillFormContainer({
|
|||||||
GET_JOB_LINES_TO_ENTER_BILL
|
GET_JOB_LINES_TO_ENTER_BILL
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const [loadOutstandingReturns, { loading: returnLoading, data: returnData }] =
|
||||||
|
useLazyQuery(QUERY_UNRECEIVED_LINES);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<BillFormComponent
|
<>
|
||||||
disabled={disabled}
|
<BillFormComponent
|
||||||
form={form}
|
disabled={disabled}
|
||||||
billEdit={billEdit}
|
form={form}
|
||||||
vendorAutoCompleteOptions={
|
billEdit={billEdit}
|
||||||
VendorAutoCompleteData && VendorAutoCompleteData.vendors
|
vendorAutoCompleteOptions={
|
||||||
}
|
VendorAutoCompleteData && VendorAutoCompleteData.vendors
|
||||||
loadLines={loadLines}
|
}
|
||||||
lineData={lineData ? lineData.joblines : []}
|
loadLines={loadLines}
|
||||||
job={lineData ? lineData.jobs_by_pk : null}
|
lineData={lineData ? lineData.joblines : []}
|
||||||
responsibilityCenters={bodyshop.md_responsibility_centers || null}
|
job={lineData ? lineData.jobs_by_pk : null}
|
||||||
disableInvNumber={disableInvNumber}
|
responsibilityCenters={bodyshop.md_responsibility_centers || null}
|
||||||
/>
|
disableInvNumber={disableInvNumber}
|
||||||
|
loadOutstandingReturns={loadOutstandingReturns}
|
||||||
|
/>
|
||||||
|
{!billEdit && (
|
||||||
|
<BillCmdReturnsTableComponent
|
||||||
|
form={form}
|
||||||
|
loadOutstandingReturns={loadOutstandingReturns}
|
||||||
|
returnLoading={returnLoading}
|
||||||
|
returnData={returnData}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
export default connect(mapStateToProps, null)(BillFormContainer);
|
export default connect(mapStateToProps, null)(BillFormContainer);
|
||||||
|
|||||||
@@ -59,7 +59,6 @@ export function BillsListTableComponent({
|
|||||||
record.is_credit_memo || record.vendorid === bodyshop.inhousevendorid
|
record.is_credit_memo || record.vendorid === bodyshop.inhousevendorid
|
||||||
}
|
}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
console.log(record);
|
|
||||||
setPartsOrderContext({
|
setPartsOrderContext({
|
||||||
actions: {},
|
actions: {},
|
||||||
context: {
|
context: {
|
||||||
|
|||||||
@@ -0,0 +1,66 @@
|
|||||||
|
import { useMutation } from "@apollo/client";
|
||||||
|
import { Checkbox, notification, Space, Spin } from "antd";
|
||||||
|
import React, { useState } from "react";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { MUTATION_UPDATE_PO_CM_REECEIVED } from "../../graphql/parts-orders.queries";
|
||||||
|
|
||||||
|
export default function PartsOrderCmReceived({
|
||||||
|
checked,
|
||||||
|
orderLineId,
|
||||||
|
partsOrderId,
|
||||||
|
}) {
|
||||||
|
const [updateLine] = useMutation(MUTATION_UPDATE_PO_CM_REECEIVED);
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
const [loading, setLoading] = useState(false);
|
||||||
|
|
||||||
|
const handleChange = async (e) => {
|
||||||
|
setLoading(true);
|
||||||
|
const result = await updateLine({
|
||||||
|
variables: {
|
||||||
|
partsLineId: orderLineId,
|
||||||
|
partsOrder: { cm_received: e.target.checked },
|
||||||
|
},
|
||||||
|
update(cache) {
|
||||||
|
cache.modify({
|
||||||
|
id: cache.identify({
|
||||||
|
id: partsOrderId,
|
||||||
|
__typename: "parts_orders",
|
||||||
|
}),
|
||||||
|
|
||||||
|
fields: {
|
||||||
|
parts_order_lines(ex, { readField }) {
|
||||||
|
console.log(ex);
|
||||||
|
return ex.map((lineref) => {
|
||||||
|
if (orderLineId.id !== readField("id", lineref)) {
|
||||||
|
lineref.cm_received = e.target.checked;
|
||||||
|
}
|
||||||
|
return lineref;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!!!result.errors) {
|
||||||
|
notification["success"]({
|
||||||
|
message: t("parts_orders.successes.line_updated"),
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
notification["error"]({
|
||||||
|
message: t("parts_orders.errors.saving", {
|
||||||
|
error: JSON.stringify(result.errors),
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
setLoading(false);
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Space>
|
||||||
|
<Checkbox checked={checked} onChange={handleChange} />
|
||||||
|
{loading && <Spin size="small" />}
|
||||||
|
</Space>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -29,6 +29,7 @@ import { alphaSort } from "../../utils/sorters";
|
|||||||
import { TemplateList } from "../../utils/TemplateConstants";
|
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 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";
|
||||||
@@ -346,6 +347,23 @@ export function PartsOrderListTableComponent({
|
|||||||
dataIndex: "status",
|
dataIndex: "status",
|
||||||
key: "status",
|
key: "status",
|
||||||
},
|
},
|
||||||
|
|
||||||
|
...(selectedPartsOrderRecord && selectedPartsOrderRecord.return
|
||||||
|
? [
|
||||||
|
{
|
||||||
|
title: t("parts_orders.fields.cm_received"),
|
||||||
|
dataIndex: "cm_received",
|
||||||
|
key: "cm_received",
|
||||||
|
render: (text, record) => (
|
||||||
|
<PartsOrderCmReceived
|
||||||
|
orderLineId={record.id}
|
||||||
|
checked={record.cm_received}
|
||||||
|
partsorderid={selectedPartsOrderRecord.id}
|
||||||
|
/>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
]
|
||||||
|
: []),
|
||||||
{
|
{
|
||||||
title: t("parts_orders.fields.backordered_on"),
|
title: t("parts_orders.fields.backordered_on"),
|
||||||
dataIndex: "backordered_on",
|
dataIndex: "backordered_on",
|
||||||
|
|||||||
@@ -305,6 +305,7 @@ export function PartsOrderModalContainer({
|
|||||||
quantity: value.part_qty,
|
quantity: value.part_qty,
|
||||||
job_line_id: isReturn ? value.joblineid : value.id,
|
job_line_id: isReturn ? value.joblineid : value.id,
|
||||||
part_type: value.part_type,
|
part_type: value.part_type,
|
||||||
|
...(isReturn && { cm_received: false }),
|
||||||
});
|
});
|
||||||
return acc;
|
return acc;
|
||||||
}, [])
|
}, [])
|
||||||
|
|||||||
@@ -86,6 +86,7 @@ export const QUERY_BILLS_BY_JOBID = gql`
|
|||||||
job_line_id
|
job_line_id
|
||||||
part_type
|
part_type
|
||||||
cost
|
cost
|
||||||
|
cm_received
|
||||||
jobline {
|
jobline {
|
||||||
id
|
id
|
||||||
part_type
|
part_type
|
||||||
@@ -124,7 +125,7 @@ export const QUERY_BILLS_BY_JOBID = gql`
|
|||||||
applicable_taxes
|
applicable_taxes
|
||||||
deductedfromlbr
|
deductedfromlbr
|
||||||
lbr_adjustment
|
lbr_adjustment
|
||||||
jobline{
|
jobline {
|
||||||
oem_partno
|
oem_partno
|
||||||
part_type
|
part_type
|
||||||
}
|
}
|
||||||
@@ -164,7 +165,7 @@ export const QUERY_BILL_BY_PK = gql`
|
|||||||
cost_center
|
cost_center
|
||||||
quantity
|
quantity
|
||||||
joblineid
|
joblineid
|
||||||
jobline{
|
jobline {
|
||||||
oem_partno
|
oem_partno
|
||||||
part_type
|
part_type
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ export const QUERY_PARTS_ORDER_OEC = gql`
|
|||||||
part_type
|
part_type
|
||||||
}
|
}
|
||||||
job {
|
job {
|
||||||
bodyshop{
|
bodyshop {
|
||||||
shopname
|
shopname
|
||||||
bill_tax_rates
|
bill_tax_rates
|
||||||
}
|
}
|
||||||
@@ -292,6 +292,22 @@ export const DELETE_PARTS_ORDER = gql`
|
|||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
export const MUTATION_UPDATE_PO_CM_REECEIVED = gql`
|
||||||
|
mutation MUTATION_UPDATE_PO_CM_REECEIVED(
|
||||||
|
$partsLineId: uuid!
|
||||||
|
$partsOrder: parts_order_lines_set_input
|
||||||
|
) {
|
||||||
|
update_parts_order_lines(
|
||||||
|
where: { id: { _eq: $partsLineId } }
|
||||||
|
_set: $partsOrder
|
||||||
|
) {
|
||||||
|
returning {
|
||||||
|
id
|
||||||
|
cm_received
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
export const MUTATION_UPDATE_BO_ETA = gql`
|
export const MUTATION_UPDATE_BO_ETA = gql`
|
||||||
mutation MUTATION_UPDATE_BO_ETA(
|
mutation MUTATION_UPDATE_BO_ETA(
|
||||||
$partsLineId: uuid!
|
$partsLineId: uuid!
|
||||||
@@ -339,3 +355,36 @@ export const MUTATION_BACKORDER_PART_LINE = gql`
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
export const QUERY_UNRECEIVED_LINES = gql`
|
||||||
|
query QUERY_UNRECEIVED_LINES($jobId: uuid!, $vendorId: uuid!) {
|
||||||
|
parts_order_lines(
|
||||||
|
where: {
|
||||||
|
parts_order: { jobid: { _eq: $jobId }, vendorid: { _eq: $vendorId } }
|
||||||
|
cm_received: { _neq: true }
|
||||||
|
}
|
||||||
|
) {
|
||||||
|
cm_received
|
||||||
|
id
|
||||||
|
line_desc
|
||||||
|
quantity
|
||||||
|
act_price
|
||||||
|
cost
|
||||||
|
oem_partno
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
export const MUTATION_MARK_RETURN_RECEIVED = gql`
|
||||||
|
mutation MUTATION_MARK_RETURN_RECEIVED($partsLineIds: [uuid!]!) {
|
||||||
|
update_parts_order_lines(
|
||||||
|
where: { id: { _in: $partsLineIds } }
|
||||||
|
_set: { cm_received: true }
|
||||||
|
) {
|
||||||
|
returning {
|
||||||
|
id
|
||||||
|
cm_received
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|||||||
@@ -1927,12 +1927,14 @@
|
|||||||
"associatedbills": "This parts order cannot",
|
"associatedbills": "This parts order cannot",
|
||||||
"backordering": "Error backordering part {{message}}.",
|
"backordering": "Error backordering part {{message}}.",
|
||||||
"creating": "Error encountered when creating parts order. ",
|
"creating": "Error encountered when creating parts order. ",
|
||||||
"oec": "Error creating EMS files for OEC. {{error}}"
|
"oec": "Error creating EMS files for OEC. {{error}}",
|
||||||
|
"saving": "Error saving parts order. {{error}}."
|
||||||
},
|
},
|
||||||
"fields": {
|
"fields": {
|
||||||
"act_price": "Price",
|
"act_price": "Price",
|
||||||
"backordered_eta": "B.O. ETA",
|
"backordered_eta": "B.O. ETA",
|
||||||
"backordered_on": "B.O. On",
|
"backordered_on": "B.O. On",
|
||||||
|
"cm_received": "CM Received?",
|
||||||
"comments": "Comments",
|
"comments": "Comments",
|
||||||
"cost": "Cost",
|
"cost": "Cost",
|
||||||
"db_price": "List Price",
|
"db_price": "List Price",
|
||||||
@@ -1955,6 +1957,7 @@
|
|||||||
"confirmdelete": "Are you sure you want to delete this item? It cannot be recovered. Job line statuses will not be updated and may require manual review. ",
|
"confirmdelete": "Are you sure you want to delete this item? It cannot be recovered. Job line statuses will not be updated and may require manual review. ",
|
||||||
"email": "Send by Email",
|
"email": "Send by Email",
|
||||||
"inthisorder": "Parts in this Order",
|
"inthisorder": "Parts in this Order",
|
||||||
|
"mark_as_received": "Mark as Received?",
|
||||||
"newpartsorder": "New Parts Order",
|
"newpartsorder": "New Parts Order",
|
||||||
"notyetordered": "This part has not yet been ordered.",
|
"notyetordered": "This part has not yet been ordered.",
|
||||||
"oec": "Order via OEC",
|
"oec": "Order via OEC",
|
||||||
@@ -1966,6 +1969,7 @@
|
|||||||
},
|
},
|
||||||
"successes": {
|
"successes": {
|
||||||
"created": "Parts order created successfully. ",
|
"created": "Parts order created successfully. ",
|
||||||
|
"line_updated": "Parts return line updated.",
|
||||||
"received": "Parts order received.",
|
"received": "Parts order received.",
|
||||||
"return_created": "Parts return created successfully."
|
"return_created": "Parts return created successfully."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1927,12 +1927,14 @@
|
|||||||
"associatedbills": "",
|
"associatedbills": "",
|
||||||
"backordering": "",
|
"backordering": "",
|
||||||
"creating": "Se encontró un error al crear el pedido de piezas.",
|
"creating": "Se encontró un error al crear el pedido de piezas.",
|
||||||
"oec": ""
|
"oec": "",
|
||||||
|
"saving": ""
|
||||||
},
|
},
|
||||||
"fields": {
|
"fields": {
|
||||||
"act_price": "",
|
"act_price": "",
|
||||||
"backordered_eta": "",
|
"backordered_eta": "",
|
||||||
"backordered_on": "",
|
"backordered_on": "",
|
||||||
|
"cm_received": "",
|
||||||
"comments": "",
|
"comments": "",
|
||||||
"cost": "",
|
"cost": "",
|
||||||
"db_price": "",
|
"db_price": "",
|
||||||
@@ -1955,6 +1957,7 @@
|
|||||||
"confirmdelete": "",
|
"confirmdelete": "",
|
||||||
"email": "Enviar por correo electrónico",
|
"email": "Enviar por correo electrónico",
|
||||||
"inthisorder": "Partes en este pedido",
|
"inthisorder": "Partes en este pedido",
|
||||||
|
"mark_as_received": "",
|
||||||
"newpartsorder": "",
|
"newpartsorder": "",
|
||||||
"notyetordered": "",
|
"notyetordered": "",
|
||||||
"oec": "",
|
"oec": "",
|
||||||
@@ -1966,6 +1969,7 @@
|
|||||||
},
|
},
|
||||||
"successes": {
|
"successes": {
|
||||||
"created": "Pedido de piezas creado con éxito.",
|
"created": "Pedido de piezas creado con éxito.",
|
||||||
|
"line_updated": "",
|
||||||
"received": "",
|
"received": "",
|
||||||
"return_created": ""
|
"return_created": ""
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1927,12 +1927,14 @@
|
|||||||
"associatedbills": "",
|
"associatedbills": "",
|
||||||
"backordering": "",
|
"backordering": "",
|
||||||
"creating": "Erreur rencontrée lors de la création de la commande de pièces.",
|
"creating": "Erreur rencontrée lors de la création de la commande de pièces.",
|
||||||
"oec": ""
|
"oec": "",
|
||||||
|
"saving": ""
|
||||||
},
|
},
|
||||||
"fields": {
|
"fields": {
|
||||||
"act_price": "",
|
"act_price": "",
|
||||||
"backordered_eta": "",
|
"backordered_eta": "",
|
||||||
"backordered_on": "",
|
"backordered_on": "",
|
||||||
|
"cm_received": "",
|
||||||
"comments": "",
|
"comments": "",
|
||||||
"cost": "",
|
"cost": "",
|
||||||
"db_price": "",
|
"db_price": "",
|
||||||
@@ -1955,6 +1957,7 @@
|
|||||||
"confirmdelete": "",
|
"confirmdelete": "",
|
||||||
"email": "Envoyé par email",
|
"email": "Envoyé par email",
|
||||||
"inthisorder": "Pièces dans cette commande",
|
"inthisorder": "Pièces dans cette commande",
|
||||||
|
"mark_as_received": "",
|
||||||
"newpartsorder": "",
|
"newpartsorder": "",
|
||||||
"notyetordered": "",
|
"notyetordered": "",
|
||||||
"oec": "",
|
"oec": "",
|
||||||
@@ -1966,6 +1969,7 @@
|
|||||||
},
|
},
|
||||||
"successes": {
|
"successes": {
|
||||||
"created": "Commande de pièces créée avec succès.",
|
"created": "Commande de pièces créée avec succès.",
|
||||||
|
"line_updated": "",
|
||||||
"received": "",
|
"received": "",
|
||||||
"return_created": ""
|
"return_created": ""
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3839,6 +3839,7 @@
|
|||||||
- act_price
|
- act_price
|
||||||
- backordered_eta
|
- backordered_eta
|
||||||
- backordered_on
|
- backordered_on
|
||||||
|
- cm_received
|
||||||
- cost
|
- cost
|
||||||
- created_at
|
- created_at
|
||||||
- db_price
|
- db_price
|
||||||
@@ -3859,6 +3860,7 @@
|
|||||||
- act_price
|
- act_price
|
||||||
- backordered_eta
|
- backordered_eta
|
||||||
- backordered_on
|
- backordered_on
|
||||||
|
- cm_received
|
||||||
- cost
|
- cost
|
||||||
- created_at
|
- created_at
|
||||||
- db_price
|
- db_price
|
||||||
@@ -3890,6 +3892,7 @@
|
|||||||
- act_price
|
- act_price
|
||||||
- backordered_eta
|
- backordered_eta
|
||||||
- backordered_on
|
- backordered_on
|
||||||
|
- cm_received
|
||||||
- cost
|
- cost
|
||||||
- created_at
|
- created_at
|
||||||
- db_price
|
- db_price
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
-- Could not auto-generate a down migration.
|
||||||
|
-- Please write an appropriate down migration for the SQL below:
|
||||||
|
-- alter table "public"."parts_order_lines" add column "cm_received" boolean
|
||||||
|
-- null;
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
alter table "public"."parts_order_lines" add column "cm_received" boolean
|
||||||
|
null;
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
-- Could not auto-generate a down migration.
|
||||||
|
-- Please write an appropriate down migration for the SQL below:
|
||||||
|
-- CREATE INDEX idx_pol_cm_received ON parts_order_lines(cm_received);
|
||||||
|
-- CREATE INDEX idx_pol_orderid ON parts_order_lines(orderid);
|
||||||
|
-- CREATE INDEX idx_parts_order_jobid ON parts_orders(jobid);
|
||||||
3
hasura/migrations/1650565856092_run_sql_migration/up.sql
Normal file
3
hasura/migrations/1650565856092_run_sql_migration/up.sql
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
CREATE INDEX idx_pol_cm_received ON parts_order_lines(cm_received);
|
||||||
|
CREATE INDEX idx_pol_orderid ON parts_order_lines(orderid);
|
||||||
|
CREATE INDEX idx_parts_order_jobid ON parts_orders(jobid);
|
||||||
Reference in New Issue
Block a user