diff --git a/client/src/components/jobs-admin-change-status/jobs-admin-change.status.component.jsx b/client/src/components/jobs-admin-change-status/jobs-admin-change.status.component.jsx
new file mode 100644
index 000000000..a20c6ea20
--- /dev/null
+++ b/client/src/components/jobs-admin-change-status/jobs-admin-change.status.component.jsx
@@ -0,0 +1,57 @@
+import { DownCircleFilled } from "@ant-design/icons";
+import { useMutation } from "@apollo/client";
+import { Button, Dropdown, Menu, notification } from "antd";
+import React from "react";
+import { useTranslation } from "react-i18next";
+import { connect } from "react-redux";
+import { createStructuredSelector } from "reselect";
+import { UPDATE_JOB_STATUS } from "../../graphql/jobs.queries";
+import { selectBodyshop } from "../../redux/user/user.selectors";
+
+const mapStateToProps = createStructuredSelector({
+ bodyshop: selectBodyshop,
+});
+const mapDispatchToProps = (dispatch) => ({
+ //setUserLanguage: language => dispatch(setUserLanguage(language))
+});
+export default connect(mapStateToProps, mapDispatchToProps)(JobsAdminStatus);
+
+export function JobsAdminStatus({ bodyshop, job }) {
+ const { t } = useTranslation();
+
+ const [mutationUpdateJobstatus] = useMutation(UPDATE_JOB_STATUS);
+ const updateJobStatus = (status) => {
+ mutationUpdateJobstatus({
+ variables: { jobId: job.id, status: status },
+ })
+ .then((r) => {
+ notification["success"]({ message: t("jobs.successes.save") });
+ // refetch();
+ })
+ .catch((error) => {
+ notification["error"]({ message: t("jobs.errors.saving") });
+ });
+ };
+
+ const statusmenu = (
+
+ );
+
+ return (
+
+
+
+ );
+}
diff --git a/client/src/components/jobs-available-table/jobs-available-supplement.estlines.util.js b/client/src/components/jobs-available-table/jobs-available-supplement.estlines.util.js
index 43db00226..b424d2217 100644
--- a/client/src/components/jobs-available-table/jobs-available-supplement.estlines.util.js
+++ b/client/src/components/jobs-available-table/jobs-available-supplement.estlines.util.js
@@ -11,6 +11,7 @@ export const GetSupplementDelta = async (client, jobId, newLines) => {
query: GET_ALL_JOBLINES_BY_PK,
variables: { id: jobId },
});
+
const existingLines = _.cloneDeep(existingLinesFromDb);
const linesToInsert = [];
const linesToUpdate = [];
@@ -19,11 +20,14 @@ export const GetSupplementDelta = async (client, jobId, newLines) => {
const matchingIndex = existingLines.findIndex(
(eL) => eL.unq_seq === newLine.unq_seq
);
+
+ //Should do a check to make sure there is only 1 matching unq sequence number.
+
if (matchingIndex >= 0) {
//Found a relevant matching line. Add it to lines to update.
linesToUpdate.push({
id: existingLines[matchingIndex].id,
- newData: newLine,
+ newData: { ...newLine, removed: false },
});
//Splice out item we found for performance.
diff --git a/client/src/graphql/jobs-lines.queries.js b/client/src/graphql/jobs-lines.queries.js
index 90086e27c..2aeac31d8 100644
--- a/client/src/graphql/jobs-lines.queries.js
+++ b/client/src/graphql/jobs-lines.queries.js
@@ -23,19 +23,6 @@ export const GET_ALL_JOBLINES_BY_PK = gql`
notes
location
tax_part
- parts_order_lines {
- id
- parts_order {
- id
- order_number
- order_date
- user_email
- vendor {
- id
- name
- }
- }
- }
}
}
`;
diff --git a/client/src/pages/jobs-admin/jobs-admin.page.jsx b/client/src/pages/jobs-admin/jobs-admin.page.jsx
index d4bf941f8..b133e314e 100644
--- a/client/src/pages/jobs-admin/jobs-admin.page.jsx
+++ b/client/src/pages/jobs-admin/jobs-admin.page.jsx
@@ -15,6 +15,8 @@ import JobAdminOwnerReassociate from "../../components/jobs-admin-owner-reassoci
import JobsAdminUnvoid from "../../components/jobs-admin-unvoid/jobs-admin-unvoid.component";
import JobAdminVehicleReassociate from "../../components/jobs-admin-vehicle-reassociate/jobs-admin-vehicle-reassociate.component";
import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component";
+import JobsAdminStatus from "../../components/jobs-admin-change-status/jobs-admin-change.status.component";
+
import NotFound from "../../components/not-found/not-found.component";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import { GET_JOB_BY_PK } from "../../graphql/jobs.queries";
@@ -96,6 +98,7 @@ export function JobsCloseContainer({ setBreadcrumbs, setSelectedHeader }) {
+
diff --git a/server/accounting/qbxml/qbxml-receivables.js b/server/accounting/qbxml/qbxml-receivables.js
index 4d2c58672..aeb948ed9 100644
--- a/server/accounting/qbxml/qbxml-receivables.js
+++ b/server/accounting/qbxml/qbxml-receivables.js
@@ -288,7 +288,7 @@ const generateInvoiceQbxml = (
});
// console.log("Done creating hash", JSON.stringify(invoiceLineHash));
- if (!hasMapaLine) {
+ if (!hasMapaLine && jobs_by_pk.job_totals.rates.mapa.total.amount > 0) {
console.log("Adding MAPA Line Manually.");
const mapaAccountName = responsibilityCenters.defaults.profits.MAPA;
@@ -313,7 +313,7 @@ const generateInvoiceQbxml = (
}
}
- if (!hasMashLine) {
+ if (!hasMashLine && jobs_by_pk.job_totals.rates.mash.total.amount > 0) {
console.log("Adding MASH Line Manually.");
const mashAccountName = responsibilityCenters.defaults.profits.MASH;
@@ -424,9 +424,11 @@ const generateInvoiceQbxml = (
TxnDate: moment(jobs_by_pk.date_invoiced).format("YYYY-MM-DD"),
RefNumber: jobs_by_pk.ro_number,
ShipAddress: {
- Addr1: `${jobs_by_pk.ownr_fn || ""} ${jobs_by_pk.ownr_ln || ""} ${
- jobs_by_pk.ownr_co_nm || ""
- }`,
+ Addr1: jobs_by_pk.ownr_co_nm
+ ? jobs_by_pk.ownr_co_nm.substring(0, 30)
+ : `${`${jobs_by_pk.ownr_ln || ""} ${
+ jobs_by_pk.ownr_fn || ""
+ }`.substring(0, 30)}`,
Addr2: jobs_by_pk.ownr_addr1,
Addr3: jobs_by_pk.ownr_addr2,
City: jobs_by_pk.ownr_city,
diff --git a/server/accounting/qbxml/qbxml-utils.js b/server/accounting/qbxml/qbxml-utils.js
index cd47eced8..b012c9baf 100644
--- a/server/accounting/qbxml/qbxml-utils.js
+++ b/server/accounting/qbxml/qbxml-utils.js
@@ -17,12 +17,13 @@ exports.generateOwnerTier = (jobs_by_pk, isThreeTier, twotierpref) => {
if (isThreeTier) {
//It's always gonna be the owner now. Same as 2 tier by name
return jobs_by_pk.ownr_co_nm
- ? `${jobs_by_pk.ownr_co_nm} - ${jobs_by_pk.ownr_ln || ""} ${
- jobs_by_pk.ownr_fn || ""
- } #${jobs_by_pk.owner.accountingid || ""}`
- : `${jobs_by_pk.ownr_ln || ""} ${jobs_by_pk.ownr_fn || ""} #${
+ ? `${jobs_by_pk.ownr_co_nm.substring(0, 30)} #${
jobs_by_pk.owner.accountingid || ""
- }`;
+ }`
+ : `${`${jobs_by_pk.ownr_ln || ""} ${jobs_by_pk.ownr_fn || ""}`.substring(
+ 0,
+ 30
+ )} #${jobs_by_pk.owner.accountingid || ""}`;
} else {
//What's the 2 tier pref?
if (twotierpref === "source") {
@@ -31,12 +32,12 @@ exports.generateOwnerTier = (jobs_by_pk, isThreeTier, twotierpref) => {
} else {
//Same as 3 tier
return jobs_by_pk.ownr_co_nm
- ? `${jobs_by_pk.ownr_co_nm} - ${jobs_by_pk.ownr_ln || ""} ${
- jobs_by_pk.ownr_fn || ""
- } #${jobs_by_pk.owner.accountingid || ""}`
- : `${jobs_by_pk.ownr_ln || ""} ${jobs_by_pk.ownr_fn || ""} #${
+ ? `${jobs_by_pk.ownr_co_nm.substring(0, 30)} #${
jobs_by_pk.owner.accountingid || ""
- }`;
+ }`
+ : `${`${jobs_by_pk.ownr_ln || ""} ${
+ jobs_by_pk.ownr_fn || ""
+ }`.substring(0, 30)} #${jobs_by_pk.owner.accountingid || ""}`;
}
}
};
diff --git a/server/graphql-client/queries.js b/server/graphql-client/queries.js
index ef0501f62..32db12ae6 100644
--- a/server/graphql-client/queries.js
+++ b/server/graphql-client/queries.js
@@ -57,6 +57,7 @@ query QUERY_JOBS_FOR_RECEIVABLES_EXPORT($ids: [uuid!]!) {
ownerid
ownr_ln
ownr_fn
+ ownr_co_nm
ownr_addr1
ownr_addr2
ownr_zip