diff --git a/client/src/components/job-totals-table/job-totals.table.totals.component.jsx b/client/src/components/job-totals-table/job-totals.table.totals.component.jsx
index a8b5e0604..be92d5994 100644
--- a/client/src/components/job-totals-table/job-totals.table.totals.component.jsx
+++ b/client/src/components/job-totals-table/job-totals.table.totals.component.jsx
@@ -102,7 +102,7 @@ export function JobTotalsTableTotals({ bodyshop, job }) {
total: job.job_totals.totals.us_sales_tax_breakdown.ty4Tax
},
{
- key: `${bodyshop.md_responsibility_centers.taxes.tax_ty5?.tax_type5 || "TT"} - ${[
+ key: `${bodyshop.md_responsibility_centers.taxes.tax_ty5?.tax_type5 || "Adj."} - ${[
job.cieca_pft.ty5_rate1,
job.cieca_pft.ty5_rate2,
job.cieca_pft.ty5_rate3,
@@ -113,6 +113,14 @@ export function JobTotalsTableTotals({ bodyshop, job }) {
.join(", ")}%`,
total: job.job_totals.totals.us_sales_tax_breakdown.ty5Tax
},
+ ...(job.job_totals?.totals?.ttl_tax_adjustment
+ ? [
+ {
+ key: `Adj.`,
+ total: job.job_totals?.totals?.ttl_tax_adjustment
+ }
+ ]
+ : []),
{
key: t("jobs.labels.total_sales_tax"),
bold: true,
@@ -121,6 +129,7 @@ export function JobTotalsTableTotals({ bodyshop, job }) {
.add(Dinero(job.job_totals.totals.us_sales_tax_breakdown.ty3Tax))
.add(Dinero(job.job_totals.totals.us_sales_tax_breakdown.ty4Tax))
.add(Dinero(job.job_totals.totals.us_sales_tax_breakdown.ty5Tax))
+ .add(Dinero(job.job_totals.totals.ttl_tax_adjustment))
.toJSON()
}
].filter((item) => item.total.amount !== 0)
@@ -141,14 +150,16 @@ export function JobTotalsTableTotals({ bodyshop, job }) {
key: t("jobs.fields.ded_amt"),
total: job.job_totals.totals.custPayable.deductible
},
- ...(InstanceRenderManager({
- imex: [{
- key: t("jobs.fields.federal_tax_payable"),
- total: job.job_totals.totals.custPayable.federal_tax
- }],
+ ...InstanceRenderManager({
+ imex: [
+ {
+ key: t("jobs.fields.federal_tax_payable"),
+ total: job.job_totals.totals.custPayable.federal_tax
+ }
+ ],
rome: [],
promanager: "USE_ROME"
- })),
+ }),
{
key: t("jobs.fields.other_amount_payable"),
total: job.job_totals.totals.custPayable.other_customer_amount
diff --git a/client/src/components/jobs-available-table/jobs-available-table.container.jsx b/client/src/components/jobs-available-table/jobs-available-table.container.jsx
index d9964d090..3a3b0d7e8 100644
--- a/client/src/components/jobs-available-table/jobs-available-table.container.jsx
+++ b/client/src/components/jobs-available-table/jobs-available-table.container.jsx
@@ -1,6 +1,6 @@
import { gql, useApolloClient, useLazyQuery, useMutation, useQuery } from "@apollo/client";
import { useSplitTreatments } from "@splitsoftware/splitio-react";
-import { Col, Row, notification } from "antd";
+import { Button, Col, Row, notification } from "antd";
import Axios from "axios";
import _ from "lodash";
import queryString from "query-string";
@@ -409,24 +409,24 @@ export function JobsAvailableContainer({ bodyshop, currentUser, insertAuditTrail
setSchComp={setSchComp}
/>
{
- // currentUser.email.includes("@rome.") ||
- // currentUser.email.includes("@imex.") ? (
- //
- // ) : null
+ currentUser.email.includes("@rome.") ||
+ currentUser.email.includes("@imex.") ? (
+
+ ) : null
}
@@ -617,6 +617,7 @@ function ResolveCCCLineIssues(estData, bodyshop) {
// ` | Act Price delete. (prev act price = ${estData.joblines.data[indexInEstData].act_price})`;
estData.joblines.data[indexInEstData].act_price = 0;
estData.joblines.data[indexInEstData].db_price = 0;
+ estData.joblines.data[indexInEstData].part_type = null;
});
});
}
diff --git a/job-totals-testing-util.js b/job-totals-testing-util.js
index e2018661f..b2615b485 100644
--- a/job-totals-testing-util.js
+++ b/job-totals-testing-util.js
@@ -1,9 +1,7 @@
const path = require("path");
const Dinero = require("dinero.js");
const { gql } = require("graphql-request");
-const queries = require("./server/graphql-client/queries");
-const GraphQLClient = require("graphql-request").GraphQLClient;
-const logger = require("./server/utils/logger");
+
const AxiosLib = require("axios").default;
const axios = AxiosLib.create();
@@ -16,8 +14,9 @@ require("dotenv").config({
});
async function RunTheTest() {
- const bodyshopids = ["b501bb82-22b2-493a-8a0f-152938194869"];
- const bearerToken = `Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6ImJhNjI1OTZmNTJmNTJlZDQ0MDQ5Mzk2YmU3ZGYzNGQyYzY0ZjQ1M2UiLCJ0eXAiOiJKV1QifQ.eyJuYW1lIjoiUm9tZSBEZXZlbG9wbWVudCIsImh0dHBzOi8vaGFzdXJhLmlvL2p3dC9jbGFpbXMiOnsieC1oYXN1cmEtZGVmYXVsdC1yb2xlIjoidXNlciIsIngtaGFzdXJhLWFsbG93ZWQtcm9sZXMiOlsidXNlciJdLCJ4LWhhc3VyYS11c2VyLWlkIjoidDZZbTFORGxDRE9QWnIzRjliZ3VXSDRMaFNYMiJ9LCJpb2FkbWluIjp0cnVlLCJpc3MiOiJodHRwczovL3NlY3VyZXRva2VuLmdvb2dsZS5jb20vcm9tZS1wcm9kLTEiLCJhdWQiOiJyb21lLXByb2QtMSIsImF1dGhfdGltZSI6MTcxMDk1MTg1MCwidXNlcl9pZCI6InQ2WW0xTkRsQ0RPUFpyM0Y5Ymd1V0g0TGhTWDIiLCJzdWIiOiJ0NlltMU5EbENET1BacjNGOWJndVdINExoU1gyIiwiaWF0IjoxNzExNTczODI1LCJleHAiOjE3MTE1Nzc0MjUsImVtYWlsIjoicGF0cmlja0Byb21lLmRldiIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwiZmlyZWJhc2UiOnsiaWRlbnRpdGllcyI6eyJlbWFpbCI6WyJwYXRyaWNrQHJvbWUuZGV2Il19LCJzaWduX2luX3Byb3ZpZGVyIjoicGFzc3dvcmQifX0.0kBySA9tJznLYj8TtncHGVWJO0IcmLKP2G1UyyXwaj45kTa25bjT9RWjM-NslX_zjOvrvmQZzisFAb6M1Jf6geNjOMLIqb8bhihhzEZK4CcRfvjT6cpZxnOO2Dp_1Y5OePbvOBS_GlfdsovVWa84OLuhYC5G_3QwHT8_2Cttz4CbrC6M_vd7QsGODJYBbVKMhOdZhzpNq7AbOUh3749WRjLMMobpnZDrmQlsyg3PAqtX1FHO25WQS2rma9QahGDSY736JfbkuZJ2XbNn0axEGpK7RQLUcuRkFUlfKqYplNbR_e1Q3kEfRAZpxBPXZysrDcbDNhbkWCoTmJ3fle55OA`;
+ const bodyshopids = ["71f8494c-89f0-43e0-8eb2-820b52d723bc"];
+ const bearerToken = `Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6ImU2YWMzNTcyNzY3ZGUyNjE0ZmM1MTA4NjMzMDg3YTQ5MjMzMDNkM2IiLCJ0eXAiOiJKV1QifQ.eyJuYW1lIjoiUGF0cmljayBGaWMgKERFVikiLCJodHRwczovL2hhc3VyYS5pby9qd3QvY2xhaW1zIjp7IngtaGFzdXJhLWRlZmF1bHQtcm9sZSI6InVzZXIiLCJ4LWhhc3VyYS1hbGxvd2VkLXJvbGVzIjpbInVzZXIiXSwieC1oYXN1cmEtdXNlci1pZCI6ImhOSjhBRHB0REhRQkRFcXNCOFFNWVRqaURuZjEifSwiaXNzIjoiaHR0cHM6Ly9zZWN1cmV0b2tlbi5nb29nbGUuY29tL2ltZXgtZGV2IiwiYXVkIjoiaW1leC1kZXYiLCJhdXRoX3RpbWUiOjE3MzAxMzIwMjksInVzZXJfaWQiOiJoTko4QURwdERIUUJERXFzQjhRTVlUamlEbmYxIiwic3ViIjoiaE5KOEFEcHRESFFCREVxc0I4UU1ZVGppRG5mMSIsImlhdCI6MTczMDE1MjI5NiwiZXhwIjoxNzMwMTU1ODk2LCJlbWFpbCI6InBhdHJpY2tAaW1leC5kZXYiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsImZpcmViYXNlIjp7ImlkZW50aXRpZXMiOnsiZW1haWwiOlsicGF0cmlja0BpbWV4LmRldiJdfSwic2lnbl9pbl9wcm92aWRlciI6InBhc3N3b3JkIn19.Fgf_itlA2-CMd2sTYBNjD-g8Jt3wPLW_YWbDtMn8tm-doSPhU7-RHSHON7Vz6o1m6S3x88RODt2uxSifxfgjqXYC_yJiUVEnHp7xokI1X-7EIbv6S_jfD1gKq7gNehkKkm0QETvAX_wmL0hEZyZnBacxjkSZzDZgbfKfj8U2CAU1nY6O5vk90q0HdTrt98RL37Uiz62ftAdBZCLSpZ1AS1hGa1S3NDMhWbWvBVCMY59bhM8lreH-Q1znlSe9jNXbElvrKofSc3Jz2WeTIj3Ifq5Ev-p4rIOoILww8kE9ZKp4s28JXMdrpRnqFM7tufggjZaKx5g1_rwRnzl-dk50RQ`;
+
const { jobs } = await client.request(
gql`
query GET_JOBS($bodyshopids: [uuid!]!) {
@@ -86,6 +85,16 @@ async function RunTheTest() {
} else {
result.result = "PASS";
}
+ const subcalcTotal = newjob.job_totals.totals.subtotal.amount;
+ const subttlTotal = newjob.cieca_ttl.data.n_ttl_amt * 100;
+ result.subdifference = (subcalcTotal - subttlTotal) / 100;
+
+ if (Math.abs(subcalcTotal - subttlTotal) > 3) {
+ //Diff is greater than 5 cents. Fail it.
+ result.subresult = "***FAIL***";
+ } else {
+ result.subresult = "PASS";
+ }
// console.log(`${result.result} => RO ${job.ro_number} - ${job.id} `);
results.push(result);
diff --git a/server/graphql-client/queries.js b/server/graphql-client/queries.js
index 99e37bebe..e5b83720d 100644
--- a/server/graphql-client/queries.js
+++ b/server/graphql-client/queries.js
@@ -1365,6 +1365,7 @@ exports.GET_JOB_BY_PK = `query GET_JOB_BY_PK($id: uuid!) {
cieca_pfl
cieca_pft
cieca_pfo
+ cieca_ttl
vehicle {
id
notes
diff --git a/server/job/job-totals-USA.js b/server/job/job-totals-USA.js
index 4e123850e..d65ed80ef 100644
--- a/server/job/job-totals-USA.js
+++ b/server/job/job-totals-USA.js
@@ -68,6 +68,45 @@ async function TotalsServerSide(req, res) {
ret.additional = CalculateAdditional(job);
ret.totals = CalculateTaxesTotals(job, ret);
+ // Sub total scrubbbing.
+ const emsTotal =
+ job.cieca_ttl.data.n_ttl_amt === job.cieca_ttl.data.g_ttl_amt //It looks like sometimes, gross and net are the same, but they shouldn't be.
+ ? job.cieca_ttl.data.g_ttl_amt - job.cieca_ttl.data.g_tax //If they are, adjust the gross total down by the tax amount.
+ : job.cieca_ttl.data.n_ttl_amt;
+ const ttlDifference = emsTotal - ret.totals.subtotal.getAmount() / 100;
+
+ if (Math.abs(ttlDifference) > 0.01) {
+ //If difference is greater than a pennny, we need to adjust it.
+ ret.totals.ttl_adjustment = Dinero({ amount: Math.round(ttlDifference * 100) });
+ ret.totals.subtotal = ret.totals.subtotal.add(ret.totals.ttl_adjustment);
+ ret.totals.total_repairs = ret.totals.total_repairs.add(ret.totals.ttl_adjustment);
+ ret.totals.net_repairs = ret.totals.net_repairs.add(ret.totals.ttl_adjustment);
+ logger.log("job-totals-USA-ttl-adj", "DEBUG", null, job.id, {
+ adjAmount: ttlDifference
+ });
+ }
+
+ //Taxes Scrubbing
+ const emsTaxTotal = job.cieca_ttl.data.g_tax;
+ const totalUsTaxes =
+ (ret.totals.us_sales_tax_breakdown.ty1Tax.getAmount() +
+ ret.totals.us_sales_tax_breakdown.ty2Tax.getAmount() +
+ ret.totals.us_sales_tax_breakdown.ty3Tax.getAmount() +
+ ret.totals.us_sales_tax_breakdown.ty4Tax.getAmount() +
+ ret.totals.us_sales_tax_breakdown.ty5Tax.getAmount()) /
+ 100;
+ const ttlTaxDifference = emsTaxTotal - totalUsTaxes;
+
+ if (Math.abs(ttlTaxDifference) > 0.01) {
+ //If difference is greater than a pennny, we need to adjust it.
+ ret.totals.ttl_tax_adjustment = Dinero({ amount: Math.round(ttlTaxDifference * 100) });
+ ret.totals.total_repairs = ret.totals.total_repairs.add(ret.totals.ttl_tax_adjustment);
+ ret.totals.net_repairs = ret.totals.net_repairs.add(ret.totals.ttl_tax_adjustment);
+ logger.log("job-totals-USA-ttl-tax-adj", "DEBUG", null, job.id, {
+ adjAmount: ttlTaxDifference
+ });
+ }
+
return ret;
} catch (error) {
logger.log("job-totals-ssu-USA-error", "ERROR", req.user?.email, job.id, {