diff --git a/client/src/components/payment-form/payment-form.component.jsx b/client/src/components/payment-form/payment-form.component.jsx
index 57a3ce4a7..9458aece3 100644
--- a/client/src/components/payment-form/payment-form.component.jsx
+++ b/client/src/components/payment-form/payment-form.component.jsx
@@ -1,3 +1,4 @@
+import { useTreatments } from "@splitsoftware/splitio-react";
import { CardElement } from "@stripe/react-stripe-js";
import { Checkbox, Form, Input, Radio, Select } from "antd";
import React from "react";
@@ -23,6 +24,11 @@ export function PaymentFormComponent({
disabled,
}) {
const [stripeState, setStripeState] = stripeStateArr;
+ const { Qb_Multi_Ar } = useTreatments(
+ ["Qb_Multi_Ar"],
+ {},
+ bodyshop && bodyshop.imexshopid
+ );
const { t } = useTranslation();
const handleStripeChange = (e) => {
@@ -106,9 +112,21 @@ export function PaymentFormComponent({
{t("payments.labels.customer")}
-
- {t("payments.labels.insurance")}
-
+ {Qb_Multi_Ar.treatment === "on" ? (
+ <>
+
+ {bodyshop.md_ins_cos.map((i, idx) => (
+
+ {i.name}
+
+ ))}
+
+ >
+ ) : (
+
+ {t("payments.labels.insurance")}
+
+ )}
diff --git a/client/src/pages/jobs-create/jobs-create.container.jsx b/client/src/pages/jobs-create/jobs-create.container.jsx
index b7ffad7b2..15af524ed 100644
--- a/client/src/pages/jobs-create/jobs-create.container.jsx
+++ b/client/src/pages/jobs-create/jobs-create.container.jsx
@@ -89,6 +89,7 @@ function JobsCreateContainer({ bodyshop, setBreadcrumbs, setSelectedHeader }) {
let job = Object.assign(
{},
values,
+ { date_open: new Date() },
{
vehicle:
state.vehicle.selectedid || state.vehicle.none
diff --git a/server/accounting/qbo/qbo-payments.js b/server/accounting/qbo/qbo-payments.js
index c903c0a43..c4f58079f 100644
--- a/server/accounting/qbo/qbo-payments.js
+++ b/server/accounting/qbo/qbo-payments.js
@@ -73,11 +73,19 @@ exports.default = async (req, res) => {
for (const payment of payments) {
try {
- const isThreeTier = bodyshop.accountingconfig.tiers === 3;
- const twoTierPref = bodyshop.accountingconfig.twotierpref;
+ let isThreeTier = bodyshop.accountingconfig.tiers === 3;
+ let twoTierPref = bodyshop.accountingconfig.twotierpref;
//Replace this with a for-each loop to check every single Job that's included in the list.
+ //QB Multi AR - If it is in this scenario, overwrite whatever defaults are set since multi AR
+ //will always go Source => RO
+ if (payment.payer !== "Customer") {
+ payment.job.ins_co_nm = payment.payer;
+ twoTierPref = "source";
+ isThreeTier = false;
+ }
+
let insCoCustomerTier, ownerCustomerTier, jobTier;
if (isThreeTier || (!isThreeTier && twoTierPref === "source")) {
//Insert the insurance company tier.
@@ -106,7 +114,9 @@ exports.default = async (req, res) => {
oauthClient,
qbo_realmId,
req,
- payment.job
+ payment.job,
+ isThreeTier,
+ insCoCustomerTier
);
//Query for the owner itself.
if (!ownerCustomerTier) {
@@ -122,7 +132,17 @@ exports.default = async (req, res) => {
}
//Query for the Job or Create it.
- jobTier = await QueryJob(oauthClient, qbo_realmId, req, payment.job);
+ jobTier = await QueryJob(
+ oauthClient,
+ qbo_realmId,
+ req,
+ payment.job,
+ isThreeTier
+ ? ownerCustomerTier
+ : twoTierPref === "source"
+ ? insCoCustomerTier
+ : ownerCustomerTier
+ );
// Need to validate that the job tier is associated to the right individual?
@@ -237,7 +257,8 @@ async function InsertPayment(
qbo_realmId,
req,
payment.job.ro_number,
- false
+ false,
+ parentRef
);
if (invoices && invoices.length !== 1) {
@@ -260,7 +281,7 @@ async function InsertPayment(
PaymentMethodRef: {
value: paymentMethods[payment.type],
},
- ...(invoices && invoices.length === 1
+ ...(invoices && invoices.length === 1 && invoices[0]
? {
Line: [
{
@@ -305,13 +326,14 @@ async function QueryMetaData(
qbo_realmId,
req,
ro_number,
- isCreditMemo
+ isCreditMemo,
+ parentTierRef
) {
const invoice = await oauthClient.makeApiCall({
url: urlBuilder(
qbo_realmId,
"query",
- `select * From Invoice where DocNumber = '${ro_number}'`
+ `select * From Invoice where DocNumber like '${ro_number}%'`
),
method: "POST",
headers: {
@@ -407,7 +429,13 @@ async function QueryMetaData(
invoices:
invoice.json &&
invoice.json.QueryResponse &&
- invoice.json.QueryResponse.Invoice,
+ (parentTierRef
+ ? [
+ invoice.json.QueryResponse.Invoice.find(
+ (x) => x.CustomerRef.value === parentTierRef.Id
+ ),
+ ]
+ : [invoice.json.QueryResponse.Invoice[0]]),
};
}
async function InsertCreditMemo(
@@ -423,7 +451,8 @@ async function InsertCreditMemo(
qbo_realmId,
req,
payment.job.ro_number,
- true
+ true,
+ parentRef
);
if (invoices && invoices.length !== 1) {
diff --git a/server/data/autohouse.js b/server/data/autohouse.js
index 265187796..679a455b9 100644
--- a/server/data/autohouse.js
+++ b/server/data/autohouse.js
@@ -57,7 +57,7 @@ exports.default = async (req, res) => {
bodyshopid: bodyshop.id,
start: start
? moment(start).startOf("day")
- : moment().subtract(3, "days").startOf("day"),
+ : moment().subtract(5, "days").startOf("day"),
...(end && { end: moment(end).startOf("day") }),
}
);
@@ -316,6 +316,10 @@ const CreateRepairOrderTag = (job, errorCallback) => {
moment(job.date_open)
.tz(job.bodyshop.timezone)
.format(AhDateFormat)) ||
+ (job.created_at &&
+ moment(job.created_at)
+ .tz(job.bodyshop.timezone)
+ .format(AhDateFormat)) ||
"",
ScheduledArrivalDate:
(job.scheduled_in &&
diff --git a/server/graphql-client/queries.js b/server/graphql-client/queries.js
index 1f984cde5..fdae6eb5e 100644
--- a/server/graphql-client/queries.js
+++ b/server/graphql-client/queries.js
@@ -623,6 +623,7 @@ exports.AUTOHOUSE_QUERY = `query AUTOHOUSE_EXPORT($start: timestamptz, $bodyshop
}
jobs(where: {_and: [{converted: {_eq: true}}, {updated_at: {_gt: $start}}, {updated_at: {_lte: $end}}, {shopid: {_eq: $bodyshopid}}]}) {
id
+ created_at
ro_number
status
est_ct_fn