Compare commits
76 Commits
feature/IO
...
feature/IO
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f6bcc743d8 | ||
|
|
7472285641 | ||
|
|
67ff9f30c6 | ||
|
|
a27092dbcc | ||
|
|
ca41bff446 | ||
|
|
cf8280590c | ||
|
|
b649ca1f00 | ||
|
|
b441301007 | ||
|
|
2e93238b5c | ||
|
|
ce4fe84536 | ||
|
|
9b7c0af025 | ||
|
|
dfdaf36ed1 | ||
|
|
cc8d1b3793 | ||
|
|
eb359d83c5 | ||
|
|
ae13e9e36a | ||
|
|
4a62ac2a11 | ||
|
|
016a62b6d5 | ||
|
|
3e226b50ab | ||
|
|
ab84cb5ada | ||
|
|
7825aa4122 | ||
|
|
8d43fbfcd9 | ||
|
|
47a01628d3 | ||
|
|
c008660023 | ||
|
|
5b29aec14b | ||
|
|
ca6aa682f6 | ||
|
|
eb3786cebf | ||
|
|
53843e22a4 | ||
|
|
e1693674ca | ||
|
|
2d2190e4fa | ||
|
|
02fd8097a8 | ||
|
|
fcfbc85683 | ||
|
|
802dd696f4 | ||
|
|
60a0222dd0 | ||
|
|
9114abd3ef | ||
|
|
f7fc0e6a6d | ||
|
|
ffebbe3b2a | ||
|
|
25b8c1b1eb | ||
|
|
17f8625108 | ||
|
|
e3c21f0373 | ||
|
|
859ff00277 | ||
|
|
e7c3be5231 | ||
|
|
85e3c5a433 | ||
|
|
d8d5cde3f1 | ||
|
|
6efa08fee3 | ||
|
|
636c13373c | ||
|
|
3659fbec84 | ||
|
|
05f1a9b280 | ||
|
|
5884d5eba0 | ||
|
|
4dd2137006 | ||
|
|
03315836a6 | ||
|
|
f703ba2cf9 | ||
|
|
dc05e4e166 | ||
|
|
612e359d4c | ||
|
|
c8fb1ce302 | ||
|
|
b29d8e1912 | ||
|
|
74b6c2b6b5 | ||
|
|
fce8039dad | ||
|
|
085ae141ae | ||
|
|
fbc9ccc018 | ||
|
|
f2ede519d7 | ||
|
|
21c53473d3 | ||
|
|
fbc622fa04 | ||
|
|
6319fd20fa | ||
|
|
c998e4901f | ||
|
|
06c35a4ff8 | ||
|
|
64851047bf | ||
|
|
73fac34ef4 | ||
|
|
5ca34105ef | ||
|
|
fcfa1a9be8 | ||
|
|
41849644f3 | ||
|
|
f36fb06dd6 | ||
|
|
af4c4a4fa3 | ||
|
|
d6045a9334 | ||
|
|
638a9fc76b | ||
|
|
53e3b3fa03 | ||
|
|
56c1b6f992 |
@@ -37301,6 +37301,27 @@
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
<concept_node>
|
||||
<name>inserting</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>
|
||||
</folder_node>
|
||||
<folder_node>
|
||||
|
||||
@@ -37,8 +37,8 @@ const mapStateToProps = createStructuredSelector({
|
||||
});
|
||||
const mapDispatchToProps = (dispatch) => ({
|
||||
toggleModalVisible: () => dispatch(toggleModalVisible("billEnter")),
|
||||
insertAuditTrail: ({ jobid, operation }) =>
|
||||
dispatch(insertAuditTrail({ jobid, operation })),
|
||||
insertAuditTrail: ({ jobid, billid, operation }) =>
|
||||
dispatch(insertAuditTrail({ jobid, billid, operation })),
|
||||
});
|
||||
|
||||
const Templates = TemplateList("job_special");
|
||||
@@ -143,7 +143,7 @@ function BillEnterModalContainer({
|
||||
},
|
||||
],
|
||||
},
|
||||
refetchQueries: ["QUERY_PARTS_BILLS_BY_JOBID"],
|
||||
refetchQueries: ["QUERY_PARTS_BILLS_BY_JOBID", "GET_JOB_BY_PK"],
|
||||
});
|
||||
|
||||
const adjKeys = Object.keys(adjustmentsToInsert);
|
||||
@@ -316,7 +316,9 @@ function BillEnterModalContainer({
|
||||
insertAuditTrail({
|
||||
jobid: values.jobid,
|
||||
billid: billId,
|
||||
operation: AuditTrailMapping.billposted(remainingValues.invoice_number),
|
||||
operation: AuditTrailMapping.billposted(
|
||||
r1.data.insert_bills.returning[0].invoice_number
|
||||
),
|
||||
});
|
||||
|
||||
if (enterAgain) {
|
||||
|
||||
@@ -50,6 +50,7 @@ export function BillFormComponent({
|
||||
job,
|
||||
loadOutstandingReturns,
|
||||
loadInventory,
|
||||
preferredMake,
|
||||
}) {
|
||||
const { t } = useTranslation();
|
||||
const client = useApolloClient();
|
||||
@@ -185,6 +186,7 @@ export function BillFormComponent({
|
||||
<VendorSearchSelect
|
||||
disabled={disabled}
|
||||
options={vendorAutoCompleteOptions}
|
||||
preferredMake={preferredMake}
|
||||
onSelect={handleVendorSelect}
|
||||
/>
|
||||
</Form.Item>
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
import { useLazyQuery, useQuery } from "@apollo/client";
|
||||
import { useTreatments } from "@splitsoftware/splitio-react";
|
||||
import React from "react";
|
||||
import { connect } from "react-redux";
|
||||
import { createStructuredSelector } from "reselect";
|
||||
import { QUERY_OUTSTANDING_INVENTORY } from "../../graphql/inventory.queries";
|
||||
import { GET_JOB_LINES_TO_ENTER_BILL } from "../../graphql/jobs-lines.queries";
|
||||
import { QUERY_UNRECEIVED_LINES } from "../../graphql/parts-orders.queries";
|
||||
import { SEARCH_VENDOR_AUTOCOMPLETE } from "../../graphql/vendors.queries";
|
||||
import { selectBodyshop } from "../../redux/user/user.selectors";
|
||||
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";
|
||||
import BillInventoryTable from "../bill-inventory-table/bill-inventory-table.component";
|
||||
import { QUERY_OUTSTANDING_INVENTORY } from "../../graphql/inventory.queries";
|
||||
import { useTreatments } from "@splitsoftware/splitio-react";
|
||||
import BillFormComponent from "./bill-form.component";
|
||||
|
||||
const mapStateToProps = createStructuredSelector({
|
||||
bodyshop: selectBodyshop,
|
||||
@@ -59,6 +59,7 @@ export function BillFormContainer({
|
||||
disableInvNumber={disableInvNumber}
|
||||
loadOutstandingReturns={loadOutstandingReturns}
|
||||
loadInventory={loadInventory}
|
||||
preferredMake={lineData ? lineData.jobs_by_pk.v_make_desc : null}
|
||||
/>
|
||||
{!billEdit && (
|
||||
<BillCmdReturnsTableComponent
|
||||
|
||||
@@ -1,12 +1,15 @@
|
||||
import { useMutation, useQuery } from "@apollo/client";
|
||||
import { DeleteFilled } from "@ant-design/icons";
|
||||
import { useLazyQuery, useMutation } from "@apollo/client";
|
||||
import {
|
||||
Button,
|
||||
Card,
|
||||
Col,
|
||||
Form,
|
||||
Input,
|
||||
InputNumber,
|
||||
Row,
|
||||
Space,
|
||||
Spin,
|
||||
Statistic,
|
||||
notification,
|
||||
} from "antd";
|
||||
import axios from "axios";
|
||||
@@ -17,7 +20,7 @@ import { connect } from "react-redux";
|
||||
import { createStructuredSelector } from "reselect";
|
||||
import {
|
||||
INSERT_PAYMENT_RESPONSE,
|
||||
QUERY_RO_AND_OWNER_BY_JOB_PK,
|
||||
QUERY_RO_AND_OWNER_BY_JOB_PKS,
|
||||
} from "../../graphql/payment_response.queries";
|
||||
import { INSERT_NEW_PAYMENT } from "../../graphql/payments.queries";
|
||||
import { insertAuditTrail } from "../../redux/application/application.actions";
|
||||
@@ -25,9 +28,8 @@ import { toggleModalVisible } from "../../redux/modals/modals.actions";
|
||||
import { selectCardPayment } from "../../redux/modals/modals.selectors";
|
||||
import { selectBodyshop } from "../../redux/user/user.selectors";
|
||||
import AuditTrailMapping from "../../utils/AuditTrailMappings";
|
||||
import DataLabel from "../data-label/data-label.component";
|
||||
import CurrencyFormItemComponent from "../form-items-formatted/currency-form-item.component";
|
||||
import JobSearchSelectComponent from "../job-search-select/job-search-select.component";
|
||||
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
|
||||
|
||||
const mapStateToProps = createStructuredSelector({
|
||||
cardPaymentModal: selectCardPayment,
|
||||
@@ -49,18 +51,21 @@ const CardPaymentModalComponent = ({
|
||||
const { context } = cardPaymentModal;
|
||||
|
||||
const [form] = Form.useForm();
|
||||
const amount = Form.useWatch("amount", form);
|
||||
const jobid = Form.useWatch("jobid", form);
|
||||
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [insertPayment] = useMutation(INSERT_NEW_PAYMENT);
|
||||
const [insertPaymentResponse] = useMutation(INSERT_PAYMENT_RESPONSE);
|
||||
const { t } = useTranslation();
|
||||
|
||||
const { data, refetch } = useQuery(QUERY_RO_AND_OWNER_BY_JOB_PK, {
|
||||
variables: { jobid: context?.jobid ?? "" },
|
||||
skip: !context?.jobid,
|
||||
});
|
||||
const [, { data, refetch, queryLoading }] = useLazyQuery(
|
||||
QUERY_RO_AND_OWNER_BY_JOB_PKS,
|
||||
{
|
||||
variables: { jobids: [context.jobid] },
|
||||
skip: true,
|
||||
}
|
||||
);
|
||||
|
||||
console.log("🚀 ~ file: card-payment-modal.component..jsx:61 ~ data:", data);
|
||||
//Initialize the intellipay window.
|
||||
const SetIntellipayCallbackFunctions = () => {
|
||||
console.log("*** Set IntelliPay callback functions.");
|
||||
@@ -76,69 +81,68 @@ const CardPaymentModalComponent = ({
|
||||
|
||||
window.intellipay.runOnNonApproval(async function (response) {
|
||||
// Mutate unsuccessful payment
|
||||
|
||||
const { payments } = form.getFieldsValue();
|
||||
|
||||
await insertPaymentResponse({
|
||||
variables: {
|
||||
paymentResponse: {
|
||||
amount: response.amount,
|
||||
paymentResponse: payments.map((payment) => ({
|
||||
amount: payment.amount,
|
||||
bodyshopid: bodyshop.id,
|
||||
jobid: jobid || context.jobid,
|
||||
jobid: payment.jobid,
|
||||
declinereason: response.declinereason,
|
||||
ext_paymentid: response.paymentid.toString(),
|
||||
successful: false,
|
||||
response,
|
||||
},
|
||||
})),
|
||||
},
|
||||
});
|
||||
insertAuditTrail({
|
||||
jobid: jobid || context?.jobid,
|
||||
operation: AuditTrailMapping.failedpayment(),
|
||||
});
|
||||
|
||||
payments.forEach((payment) =>
|
||||
insertAuditTrail({
|
||||
jobid: payment.jobid,
|
||||
operation: AuditTrailMapping.failedpayment(),
|
||||
})
|
||||
);
|
||||
});
|
||||
};
|
||||
|
||||
const handleFinish = async (values) => {
|
||||
try {
|
||||
const paymentResult = await insertPayment({
|
||||
await insertPayment({
|
||||
variables: {
|
||||
paymentInput: {
|
||||
amount: values.amount,
|
||||
paymentInput: values.payments.map((payment) => ({
|
||||
amount: payment.amount,
|
||||
transactionid: (values.paymentResponse.paymentid || "").toString(),
|
||||
payer: t("payments.labels.customer"),
|
||||
type: values.paymentResponse.cardbrand,
|
||||
jobid: values.jobid,
|
||||
jobid: payment.jobid,
|
||||
date: moment(Date.now()),
|
||||
},
|
||||
payment_responses: {
|
||||
data: [
|
||||
{
|
||||
amount: payment.amount,
|
||||
bodyshopid: bodyshop.id,
|
||||
|
||||
jobid: payment.jobid,
|
||||
declinereason: values.paymentResponse.declinereason,
|
||||
ext_paymentid: values.paymentResponse.paymentid.toString(),
|
||||
successful: true,
|
||||
response: values.paymentResponse,
|
||||
},
|
||||
],
|
||||
},
|
||||
})),
|
||||
},
|
||||
refetchQueries: ["GET_JOB_BY_PK"],
|
||||
update(cache, { data }) {
|
||||
cache.modify({
|
||||
id: cache.identify({ id: values.jobid, __typename: "jobs" }),
|
||||
fields: {
|
||||
payments(cachedPayments) {
|
||||
return [...data.insert_payments.returning, ...cachedPayments];
|
||||
},
|
||||
},
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
await insertPaymentResponse({
|
||||
variables: {
|
||||
paymentResponse: {
|
||||
amount: values.amount,
|
||||
bodyshopid: bodyshop.id,
|
||||
paymentid: paymentResult.data.insert_payments.returning[0].id,
|
||||
jobid: values.jobid,
|
||||
declinereason: values.paymentResponse.declinereason,
|
||||
ext_paymentid: values.paymentResponse.paymentid.toString(),
|
||||
successful: true,
|
||||
response: values.paymentResponse,
|
||||
},
|
||||
},
|
||||
});
|
||||
toggleModalVisible();
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
notification.open({
|
||||
type: "error",
|
||||
message: t("payments.errors.inserting", { error: error.message }),
|
||||
});
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
@@ -146,9 +150,16 @@ const CardPaymentModalComponent = ({
|
||||
|
||||
const handleIntelliPayCharge = async () => {
|
||||
setLoading(true);
|
||||
try {
|
||||
console.warn("*** Window.Intellipay", !!window.intellipay);
|
||||
|
||||
//Validate
|
||||
try {
|
||||
await form.validateFields();
|
||||
} catch (error) {
|
||||
setLoading(false);
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await axios.post("/intellipay/lightbox_credentials", {
|
||||
bodyshop,
|
||||
refresh: !!window.intellipay,
|
||||
@@ -182,93 +193,175 @@ const CardPaymentModalComponent = ({
|
||||
<Form
|
||||
onFinish={handleFinish}
|
||||
form={form}
|
||||
initialValues={{ jobid: context?.jobid }}
|
||||
layout="vertical"
|
||||
initialValues={{
|
||||
payments: context.jobid ? [{ jobid: context.jobid }] : [],
|
||||
}}
|
||||
>
|
||||
<LayoutFormRow grow noDivider>
|
||||
<Form.Item
|
||||
name="jobid"
|
||||
label={t("bills.fields.ro_number")}
|
||||
rules={[
|
||||
{
|
||||
required: true,
|
||||
// message: t("general.validation.required"),
|
||||
},
|
||||
]}
|
||||
>
|
||||
<JobSearchSelectComponent
|
||||
disabled={context?.jobid}
|
||||
notExported={false}
|
||||
clm_no
|
||||
onChange={(e) => {
|
||||
refetch({ jobid: e });
|
||||
}}
|
||||
/>
|
||||
</Form.Item>
|
||||
</LayoutFormRow>
|
||||
<Form.List name={["payments"]}>
|
||||
{(fields, { add, remove, move }) => {
|
||||
return (
|
||||
<div>
|
||||
{fields.map((field, index) => (
|
||||
<Form.Item key={field.key}>
|
||||
<Row gutter={[16, 16]}>
|
||||
<Col span={16}>
|
||||
<Form.Item
|
||||
key={`${index}jobid`}
|
||||
label={t("jobs.fields.ro_number")}
|
||||
name={[field.name, "jobid"]}
|
||||
rules={[
|
||||
{
|
||||
required: true,
|
||||
//message: t("general.validation.required"),
|
||||
},
|
||||
]}
|
||||
>
|
||||
<JobSearchSelectComponent
|
||||
notExported={false}
|
||||
clm_no
|
||||
/>
|
||||
</Form.Item>
|
||||
</Col>
|
||||
<Col span={6}>
|
||||
<Form.Item
|
||||
key={`${index}amount`}
|
||||
label={t("payments.fields.amount")}
|
||||
name={[field.name, "amount"]}
|
||||
rules={[
|
||||
{
|
||||
required: true,
|
||||
//message: t("general.validation.required"),
|
||||
},
|
||||
]}
|
||||
>
|
||||
<CurrencyFormItemComponent />
|
||||
</Form.Item>
|
||||
</Col>
|
||||
<Col span={2}>
|
||||
<DeleteFilled
|
||||
style={{ margin: "1rem" }}
|
||||
onClick={() => {
|
||||
remove(field.name);
|
||||
}}
|
||||
/>
|
||||
</Col>
|
||||
</Row>
|
||||
</Form.Item>
|
||||
))}
|
||||
<Form.Item>
|
||||
<Button
|
||||
type="dashed"
|
||||
onClick={() => {
|
||||
add();
|
||||
}}
|
||||
style={{ width: "100%" }}
|
||||
>
|
||||
{t("general.actions.add")}
|
||||
</Button>
|
||||
</Form.Item>
|
||||
</div>
|
||||
);
|
||||
}}
|
||||
</Form.List>
|
||||
|
||||
{/* Lighbox Input amount needs to be hidden */}
|
||||
<Input
|
||||
className="ipayfield"
|
||||
data-ipayname="amount"
|
||||
type="hidden"
|
||||
value={amount}
|
||||
hidden
|
||||
/>
|
||||
<Input
|
||||
className="ipayfield"
|
||||
data-ipayname="account"
|
||||
type="hidden"
|
||||
value={data?.jobs_by_pk.ro_number}
|
||||
hidden
|
||||
/>
|
||||
<Input
|
||||
className="ipayfield"
|
||||
data-ipayname="email"
|
||||
type="hidden"
|
||||
value={data?.jobs_by_pk.owner.ownr_ea}
|
||||
hidden
|
||||
/>
|
||||
{/* Lightbox payment response when it is completed */}
|
||||
<Form.Item name="paymentResponse" hidden>
|
||||
<Input type="hidden" value={amount} />
|
||||
<Form.Item
|
||||
shouldUpdate={(prevValues, curValues) =>
|
||||
prevValues.payments?.map((p) => p?.jobid).join() !==
|
||||
curValues.payments?.map((p) => p?.jobid).join()
|
||||
}
|
||||
>
|
||||
{() => {
|
||||
console.log("Updating the owner info section.");
|
||||
//If all of the job ids have been fileld in, then query and update the IP field.
|
||||
const { payments } = form.getFieldsValue();
|
||||
if (
|
||||
payments?.length > 0 &&
|
||||
payments?.filter((p) => p?.jobid).length === payments?.length
|
||||
) {
|
||||
console.log("**Calling refetch.");
|
||||
refetch({ jobids: payments.map((p) => p.jobid) });
|
||||
}
|
||||
console.log(
|
||||
"Acc info",
|
||||
data,
|
||||
payments && data && data.jobs.length > 0
|
||||
? data.jobs.map((j) => j.ro_number).join(", ")
|
||||
: null
|
||||
);
|
||||
return (
|
||||
<>
|
||||
<Input
|
||||
className="ipayfield"
|
||||
data-ipayname="account"
|
||||
//type="hidden"
|
||||
value={
|
||||
payments && data && data.jobs.length > 0
|
||||
? data.jobs.map((j) => j.ro_number).join(", ")
|
||||
: null
|
||||
}
|
||||
hidden
|
||||
/>
|
||||
<Input
|
||||
className="ipayfield"
|
||||
data-ipayname="email"
|
||||
// type="hidden"
|
||||
value={
|
||||
payments && data && data.jobs.length > 0
|
||||
? data.jobs.filter((j) => j.ownr_ea)[0]?.ownr_ea
|
||||
: null
|
||||
}
|
||||
hidden
|
||||
/>
|
||||
</>
|
||||
);
|
||||
}}
|
||||
</Form.Item>
|
||||
<Form.Item
|
||||
shouldUpdate={(prevValues, curValues) =>
|
||||
prevValues.payments?.map((p) => p?.amount).join() !==
|
||||
curValues.payments?.map((p) => p?.amount).join()
|
||||
}
|
||||
>
|
||||
{() => {
|
||||
const { payments } = form.getFieldsValue();
|
||||
const totalAmountToCharge = payments?.reduce((acc, val) => {
|
||||
return acc + (val?.amount || 0);
|
||||
}, 0);
|
||||
|
||||
return (
|
||||
<Space style={{ float: "right" }}>
|
||||
<Statistic
|
||||
title="Amount To Charge"
|
||||
value={totalAmountToCharge}
|
||||
precision={2}
|
||||
/>
|
||||
<Input
|
||||
className="ipayfield"
|
||||
data-ipayname="amount"
|
||||
//type="hidden"
|
||||
value={totalAmountToCharge?.toFixed(2)}
|
||||
hidden
|
||||
/>
|
||||
<Button
|
||||
type="primary"
|
||||
// data-ipayname="submit"
|
||||
className="ipayfield"
|
||||
loading={queryLoading || loading}
|
||||
disabled={!(totalAmountToCharge > 0)}
|
||||
onClick={handleIntelliPayCharge}
|
||||
>
|
||||
{t("job_payments.buttons.proceedtopayment")}
|
||||
</Button>
|
||||
</Space>
|
||||
);
|
||||
}}
|
||||
</Form.Item>
|
||||
|
||||
<LayoutFormRow grow>
|
||||
<Form.Item
|
||||
label="Amount"
|
||||
name="amount"
|
||||
rules={[
|
||||
{
|
||||
required: true,
|
||||
// message: t("general.validation.required"),
|
||||
},
|
||||
]}
|
||||
>
|
||||
<InputNumber />
|
||||
</Form.Item>
|
||||
|
||||
<Row justify="space-around">
|
||||
<Button
|
||||
type="primary"
|
||||
// data-ipayname="submit"
|
||||
className="ipayfield"
|
||||
disabled={!amount || !jobid}
|
||||
onClick={handleIntelliPayCharge}
|
||||
>
|
||||
{t("job_payments.buttons.proceedtopayment")}
|
||||
</Button>
|
||||
{context?.balance && (
|
||||
<DataLabel
|
||||
valueStyle={{
|
||||
color: context?.balance.getAmount() !== 0 ? "red" : "green",
|
||||
}}
|
||||
label={t("payments.labels.balance")}
|
||||
>
|
||||
{context?.balance.toFormat()}
|
||||
</DataLabel>
|
||||
)}
|
||||
</Row>
|
||||
</LayoutFormRow>
|
||||
{/* Lightbox payment response when it is completed */}
|
||||
<Form.Item name="paymentResponse" hidden>
|
||||
<Input type="hidden" />
|
||||
</Form.Item>
|
||||
</Form>
|
||||
</Spin>
|
||||
</Card>
|
||||
|
||||
@@ -43,7 +43,7 @@ function CardPaymentModalContainer({
|
||||
{t("job_payments.buttons.goback")}
|
||||
</Button>,
|
||||
]}
|
||||
width="60%"
|
||||
width="80%"
|
||||
destroyOnClose
|
||||
>
|
||||
<CardPaymentModalComponent />
|
||||
|
||||
@@ -8,15 +8,23 @@ import PhoneNumberFormatter from "../../utils/PhoneFormatter";
|
||||
|
||||
import { createStructuredSelector } from "reselect";
|
||||
import { selectBodyshop } from "../../redux/user/user.selectors";
|
||||
import { searchingForConversation } from "../../redux/messaging/messaging.selectors";
|
||||
const mapStateToProps = createStructuredSelector({
|
||||
bodyshop: selectBodyshop,
|
||||
searchingForConversation: searchingForConversation,
|
||||
});
|
||||
|
||||
const mapDispatchToProps = (dispatch) => ({
|
||||
openChatByPhone: (phone) => dispatch(openChatByPhone(phone)),
|
||||
});
|
||||
|
||||
export function ChatOpenButton({ bodyshop, phone, jobid, openChatByPhone }) {
|
||||
export function ChatOpenButton({
|
||||
bodyshop,
|
||||
searchingForConversation,
|
||||
phone,
|
||||
jobid,
|
||||
openChatByPhone,
|
||||
}) {
|
||||
const { t } = useTranslation();
|
||||
if (!phone) return <></>;
|
||||
|
||||
@@ -29,7 +37,7 @@ export function ChatOpenButton({ bodyshop, phone, jobid, openChatByPhone }) {
|
||||
onClick={(e) => {
|
||||
e.stopPropagation();
|
||||
const p = parsePhoneNumber(phone, "CA");
|
||||
|
||||
if (searchingForConversation) return; //This is to prevent finding the same thing twice.
|
||||
if (p && p.isValid()) {
|
||||
openChatByPhone({ phone_num: p.formatInternational(), jobid: jobid });
|
||||
} else {
|
||||
|
||||
@@ -9,15 +9,15 @@ import {
|
||||
Table,
|
||||
Tooltip,
|
||||
} from "antd";
|
||||
import moment from "moment";
|
||||
import React, { useState } from "react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { Link } from "react-router-dom";
|
||||
import { DateTimeFormatter } from "../../utils/DateFormatter";
|
||||
import { alphaSort } from "../../utils/sorters";
|
||||
import { OwnerNameDisplayFunction } from "../owner-name-display/owner-name-display.component";
|
||||
import moment from "moment";
|
||||
import { GenerateDocument } from "../../utils/RenderTemplate";
|
||||
import { TemplateList } from "../../utils/TemplateConstants";
|
||||
import { alphaSort } from "../../utils/sorters";
|
||||
import { OwnerNameDisplayFunction } from "../owner-name-display/owner-name-display.component";
|
||||
export default function CourtesyCarsList({ loading, courtesycars, refetch }) {
|
||||
const [state, setState] = useState({
|
||||
sortedInfo: {},
|
||||
@@ -115,6 +115,14 @@ export default function CourtesyCarsList({ loading, courtesycars, refetch }) {
|
||||
sortOrder:
|
||||
state.sortedInfo.columnKey === "model" && state.sortedInfo.order,
|
||||
},
|
||||
{
|
||||
title: t("courtesycars.fields.color"),
|
||||
dataIndex: "color",
|
||||
key: "color",
|
||||
sorter: (a, b) => alphaSort(a.color, b.color),
|
||||
sortOrder:
|
||||
state.sortedInfo.columnKey === "color" && state.sortedInfo.order,
|
||||
},
|
||||
{
|
||||
title: t("courtesycars.fields.plate"),
|
||||
dataIndex: "plate",
|
||||
|
||||
@@ -109,7 +109,7 @@ export function EmailOverlayContainer({
|
||||
]
|
||||
: []),
|
||||
],
|
||||
media: selectedMedia.filter((m) => m.isSelected).map((m) => m.src),
|
||||
media: selectedMedia.filter((m) => m.isSelected).map((m) => m.fullsize),
|
||||
//attachments,
|
||||
});
|
||||
notification["success"]({ message: t("emails.successes.sent") });
|
||||
|
||||
@@ -254,7 +254,7 @@ function Header({
|
||||
onClick={() => {
|
||||
setCardPaymentContext({
|
||||
actions: {},
|
||||
context: null,
|
||||
context: {},
|
||||
});
|
||||
}}
|
||||
icon={<Icon component={FaCreditCard} />}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { useMutation } from "@apollo/client";
|
||||
import { Button, Card, Form, Input, notification, Switch } from "antd";
|
||||
import moment from "moment-business-days";
|
||||
import queryString from "query-string";
|
||||
import React, { useState } from "react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
@@ -12,16 +13,15 @@ import {
|
||||
MARK_LATEST_APPOINTMENT_ARRIVED,
|
||||
} from "../../../../graphql/appointments.queries";
|
||||
import { UPDATE_JOB } from "../../../../graphql/jobs.queries";
|
||||
import { UPDATE_OWNER } from "../../../../graphql/owners.queries";
|
||||
import { insertAuditTrail } from "../../../../redux/application/application.actions";
|
||||
import {
|
||||
selectBodyshop,
|
||||
selectCurrentUser,
|
||||
} from "../../../../redux/user/user.selectors";
|
||||
import AuditTrailMapping from "../../../../utils/AuditTrailMappings";
|
||||
import ConfigFormComponents from "../../../config-form-components/config-form-components.component";
|
||||
import DateTimePicker from "../../../form-date-time-picker/form-date-time-picker.component";
|
||||
import moment from "moment-business-days";
|
||||
import { insertAuditTrail } from "../../../../redux/application/application.actions";
|
||||
import AuditTrailMapping from "../../../../utils/AuditTrailMappings";
|
||||
import { UPDATE_OWNER } from "../../../../graphql/owners.queries";
|
||||
|
||||
const mapStateToProps = createStructuredSelector({
|
||||
bodyshop: selectBodyshop,
|
||||
@@ -230,6 +230,7 @@ export function JobChecklistForm({
|
||||
)),
|
||||
scheduled_delivery:
|
||||
job.scheduled_delivery && moment(job.scheduled_delivery),
|
||||
production_vars: job.production_vars,
|
||||
}),
|
||||
...(type === "deliver" && {
|
||||
removeFromProduction: true,
|
||||
|
||||
@@ -8,7 +8,7 @@ export default function JobLinesBillRefernece({ jobline }) {
|
||||
return (
|
||||
<div style={{ color: subletRequired && "tomato" }}>
|
||||
{subletRequired && <WarningFilled />}
|
||||
{`${(billLine.actual_price * billLine.quantity).toFixed(2)} (${
|
||||
{`${billLine.actual_price.toFixed(2)} x ${billLine.quantity} (${
|
||||
billLine.bill.vendor.name
|
||||
} #${billLine.bill.invoice_number})`}
|
||||
</div>
|
||||
|
||||
@@ -33,7 +33,9 @@ const JobSearchSelect = (
|
||||
useLazyQuery(SEARCH_JOBS_BY_ID_FOR_AUTOCOMPLETE);
|
||||
|
||||
const executeSearch = (v) => {
|
||||
if (v && v !== "") callSearch(v);
|
||||
console.log(v);
|
||||
if (v && v.variables?.search !== "" && v.variables.search.length >= 2)
|
||||
callSearch(v);
|
||||
};
|
||||
const debouncedExecuteSearch = _.debounce(executeSearch, 500);
|
||||
|
||||
|
||||
@@ -192,7 +192,7 @@ export function JobsCloseExportButton({
|
||||
});
|
||||
}
|
||||
}
|
||||
if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo) {
|
||||
if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo && successfulTransactions.length > 0) {
|
||||
notification.open({
|
||||
type: "success",
|
||||
key: "jobsuccessexport",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import React, { useEffect } from "react";
|
||||
import { Gallery } from "react-grid-gallery";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { GenerateThumbUrl } from "./job-documents.utility";
|
||||
import { GenerateSrcUrl, GenerateThumbUrl } from "./job-documents.utility";
|
||||
|
||||
function JobsDocumentGalleryExternal({
|
||||
data,
|
||||
@@ -15,7 +15,7 @@ function JobsDocumentGalleryExternal({
|
||||
let documents = data.reduce((acc, value) => {
|
||||
if (value.type.startsWith("image")) {
|
||||
acc.push({
|
||||
//src: GenerateSrcUrl(value),
|
||||
fullsize: GenerateSrcUrl(value),
|
||||
src: GenerateThumbUrl(value),
|
||||
thumbnailHeight: 225,
|
||||
thumbnailWidth: 225,
|
||||
|
||||
@@ -52,7 +52,7 @@ function JobDocumentsLocalGalleryExternal({
|
||||
val.type.mime &&
|
||||
val.type.mime.startsWith("image")
|
||||
) {
|
||||
acc.push({ ...val, src: val.thumbnail });
|
||||
acc.push({ ...val, src: val.thumbnail, fullsize: val.src });
|
||||
}
|
||||
return acc;
|
||||
}, [])
|
||||
|
||||
@@ -190,7 +190,7 @@ export function JobsExportAllButton({
|
||||
});
|
||||
}
|
||||
}
|
||||
if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo) {
|
||||
if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo && successfulTransactions.length > 0) {
|
||||
notification.open({
|
||||
type: "success",
|
||||
key: "jobsuccessexport",
|
||||
|
||||
@@ -231,7 +231,14 @@ export function LaborAllocationsTable({
|
||||
{summary.adjustments.toFixed(1)}
|
||||
</Table.Summary.Cell>
|
||||
<Table.Summary.Cell>
|
||||
{summary.difference.toFixed(1)}
|
||||
<Typography.Text
|
||||
style={{
|
||||
fontWeight: "bold",
|
||||
color: summary.difference >= 0 ? "green" : "red",
|
||||
}}
|
||||
>
|
||||
{summary.difference.toFixed(1)}
|
||||
</Typography.Text>
|
||||
</Table.Summary.Cell>
|
||||
</Table.Summary.Row>
|
||||
)}
|
||||
|
||||
@@ -21,7 +21,8 @@ const OwnerSearchSelect = ({ value, onChange, onBlur, disabled }, ref) => {
|
||||
useLazyQuery(SEARCH_OWNERS_BY_ID_FOR_AUTOCOMPLETE);
|
||||
|
||||
const executeSearch = (v) => {
|
||||
callSearch(v);
|
||||
if (v && v.variables?.search !== "" && v.variables.search.length >= 2)
|
||||
callSearch(v);
|
||||
};
|
||||
const debouncedExecuteSearch = _.debounce(executeSearch, 500);
|
||||
|
||||
|
||||
@@ -106,7 +106,11 @@ export default function OwnersListComponent({
|
||||
<Input.Search
|
||||
placeholder={search.search || t("general.labels.search")}
|
||||
onSearch={(value) => {
|
||||
search.search = value;
|
||||
if (value?.length >= 3) {
|
||||
search.search = value;
|
||||
} else {
|
||||
delete search.search;
|
||||
}
|
||||
history.push({ search: queryString.stringify(search) });
|
||||
}}
|
||||
enterButton
|
||||
|
||||
@@ -192,7 +192,7 @@ export function PayableExportAll({
|
||||
});
|
||||
}
|
||||
}
|
||||
if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo) {
|
||||
if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo && successfulTransactions.length > 0) {
|
||||
notification.open({
|
||||
type: "success",
|
||||
key: "billsuccessexport",
|
||||
|
||||
@@ -185,7 +185,7 @@ export function PayableExportButton({
|
||||
});
|
||||
}
|
||||
}
|
||||
if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo) {
|
||||
if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo && successfulTransactions.length > 0) {
|
||||
notification.open({
|
||||
type: "success",
|
||||
key: "billsuccessexport",
|
||||
|
||||
@@ -1,15 +1,24 @@
|
||||
import React, { useState } from "react";
|
||||
import { useMutation, useQuery } from "@apollo/client";
|
||||
import {
|
||||
Button,
|
||||
Descriptions,
|
||||
InputNumber,
|
||||
Modal,
|
||||
Space,
|
||||
notification,
|
||||
} from "antd";
|
||||
import axios from "axios";
|
||||
import moment from "moment";
|
||||
import React, { useState } from "react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import {
|
||||
GET_REFUNDABLE_AMOUNT_BY_JOBID,
|
||||
INSERT_PAYMENT_RESPONSE,
|
||||
QUERY_PAYMENT_RESPONSE_BY_PAYMENT_ID,
|
||||
} from "../../graphql/payment_response.queries";
|
||||
import { Button, Descriptions, InputNumber, Modal, notification } from "antd";
|
||||
import moment from "moment";
|
||||
import axios from "axios";
|
||||
import { INSERT_NEW_PAYMENT } from "../../graphql/payments.queries";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import CurrencyFormatter from "../../utils/CurrencyFormatter";
|
||||
import { DateTimeFormatter } from "../../utils/DateFormatter";
|
||||
|
||||
const { confirm } = Modal;
|
||||
|
||||
@@ -137,10 +146,10 @@ const PaymentExpandedRowComponent = ({ record, bodyshop }) => {
|
||||
{payment_response?.response?.nameOnCard ?? ""}
|
||||
</Descriptions.Item>
|
||||
<Descriptions.Item label={t("job_payments.titles.amount")}>
|
||||
{record.amount}
|
||||
<CurrencyFormatter>{record.amount}</CurrencyFormatter>
|
||||
</Descriptions.Item>
|
||||
<Descriptions.Item label={t("job_payments.titles.dateOfPayment")}>
|
||||
{moment(record.created_at).format("YYYY-MM-DD HH:mm:ss")}
|
||||
{<DateTimeFormatter>{record.created_at}</DateTimeFormatter>}
|
||||
</Descriptions.Item>
|
||||
<Descriptions.Item label={t("job_payments.titles.transactionid")}>
|
||||
{record.transactionid}
|
||||
@@ -151,17 +160,22 @@ const PaymentExpandedRowComponent = ({ record, bodyshop }) => {
|
||||
<Descriptions.Item label={t("job_payments.titles.paymenttype")}>
|
||||
{record.type}
|
||||
</Descriptions.Item>
|
||||
<Descriptions.Item label={t("job_payments.titles.paymentnum")}>
|
||||
{record.paymentnum}
|
||||
</Descriptions.Item>
|
||||
{payment_response && (
|
||||
<Descriptions.Item label={t("job_payments.titles.refundamount")}>
|
||||
<InputNumber
|
||||
onChange={setRefundAmount}
|
||||
max={max_refundable_amount}
|
||||
min={0}
|
||||
/>
|
||||
<Space>
|
||||
<InputNumber
|
||||
onChange={setRefundAmount}
|
||||
max={max_refundable_amount}
|
||||
min={0}
|
||||
/>
|
||||
|
||||
<Button onClick={() => showConfirm(payment_response)}>
|
||||
{t("job_payments.buttons.refundpayment")}
|
||||
</Button>
|
||||
<Button onClick={() => showConfirm(payment_response)}>
|
||||
{t("job_payments.buttons.refundpayment")}
|
||||
</Button>
|
||||
</Space>
|
||||
</Descriptions.Item>
|
||||
)}
|
||||
</Descriptions>
|
||||
|
||||
@@ -191,7 +191,7 @@ export function PaymentExportButton({
|
||||
});
|
||||
}
|
||||
}
|
||||
if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo) {
|
||||
if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo && successfulTransactions.length > 0) {
|
||||
notification.open({
|
||||
type: "success",
|
||||
key: "paymentsuccessexport",
|
||||
|
||||
@@ -179,7 +179,7 @@ export function PaymentsExportAllButton({
|
||||
});
|
||||
}
|
||||
}
|
||||
if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo) {
|
||||
if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo && successfulTransactions.length > 0) {
|
||||
notification.open({
|
||||
type: "success",
|
||||
key: "paymentsuccessexport",
|
||||
|
||||
@@ -455,8 +455,8 @@ const r = ({ technician, state, activeStatuses, bodyshop }) => {
|
||||
state.sortedInfo.order,
|
||||
sorter: (a, b) =>
|
||||
alphaSort(
|
||||
bodyshop.employees.find((e) => e.id === a.employee_body)?.first_name,
|
||||
bodyshop.employees.find((e) => e.id === b.employee_body)?.first_name
|
||||
bodyshop.employees?.find((e) => e.id === a.employee_body)?.first_name,
|
||||
bodyshop.employees?.find((e) => e.id === b.employee_body)?.first_name
|
||||
),
|
||||
render: (text, record) => (
|
||||
<ProductionListEmployeeAssignment
|
||||
@@ -474,8 +474,8 @@ const r = ({ technician, state, activeStatuses, bodyshop }) => {
|
||||
state.sortedInfo.order,
|
||||
sorter: (a, b) =>
|
||||
alphaSort(
|
||||
bodyshop.employees.find((e) => e.id === a.employee_prep)?.first_name,
|
||||
bodyshop.employees.find((e) => e.id === b.employee_prep)?.first_name
|
||||
bodyshop.employees?.find((e) => e.id === a.employee_prep)?.first_name,
|
||||
bodyshop.employees?.find((e) => e.id === b.employee_prep)?.first_name
|
||||
),
|
||||
render: (text, record) => (
|
||||
<ProductionListEmployeeAssignment
|
||||
@@ -492,8 +492,8 @@ const r = ({ technician, state, activeStatuses, bodyshop }) => {
|
||||
state.sortedInfo.columnKey === "employee_csr" && state.sortedInfo.order,
|
||||
sorter: (a, b) =>
|
||||
alphaSort(
|
||||
bodyshop.employees.find((e) => e.id === a.employee_csr)?.first_name,
|
||||
bodyshop.employees.find((e) => e.id === b.employee_csr)?.first_name
|
||||
bodyshop.employees?.find((e) => e.id === a.employee_csr)?.first_name,
|
||||
bodyshop.employees?.find((e) => e.id === b.employee_csr)?.first_name
|
||||
),
|
||||
render: (text, record) => (
|
||||
<ProductionListEmployeeAssignment record={record} type="employee_csr" />
|
||||
@@ -508,9 +508,9 @@ const r = ({ technician, state, activeStatuses, bodyshop }) => {
|
||||
state.sortedInfo.order,
|
||||
sorter: (a, b) =>
|
||||
alphaSort(
|
||||
bodyshop.employees.find((e) => e.id === a.employee_refinish)
|
||||
bodyshop.employees?.find((e) => e.id === a.employee_refinish)
|
||||
?.first_name,
|
||||
bodyshop.employees.find((e) => e.id === b.employee_refinish)
|
||||
bodyshop.employees?.find((e) => e.id === b.employee_refinish)
|
||||
?.first_name
|
||||
),
|
||||
render: (text, record) => (
|
||||
|
||||
@@ -55,25 +55,27 @@ export function ProductionListPrint({ bodyshop }) {
|
||||
<Menu.SubMenu
|
||||
title={t("reportcenter.templates.production_by_technician_one")}
|
||||
>
|
||||
{bodyshop.employees.map((e) => (
|
||||
<Menu.Item
|
||||
key={e.id}
|
||||
onClick={async () => {
|
||||
setLoading(true);
|
||||
await GenerateDocument(
|
||||
{
|
||||
name: production_by_technician_one.key,
|
||||
variables: { id: e.id },
|
||||
},
|
||||
{},
|
||||
"p"
|
||||
);
|
||||
setLoading(false);
|
||||
}}
|
||||
>
|
||||
{e.first_name} {e.last_name}
|
||||
</Menu.Item>
|
||||
))}
|
||||
{bodyshop.employees
|
||||
.filter((e) => e.active)
|
||||
.map((e) => (
|
||||
<Menu.Item
|
||||
key={e.id}
|
||||
onClick={async () => {
|
||||
setLoading(true);
|
||||
await GenerateDocument(
|
||||
{
|
||||
name: production_by_technician_one.key,
|
||||
variables: { id: e.id },
|
||||
},
|
||||
{},
|
||||
"p"
|
||||
);
|
||||
setLoading(false);
|
||||
}}
|
||||
>
|
||||
{e.first_name} {e.last_name}
|
||||
</Menu.Item>
|
||||
))}
|
||||
</Menu.SubMenu>
|
||||
<Menu.SubMenu
|
||||
title={t("reportcenter.templates.production_by_category_one")}
|
||||
|
||||
@@ -16,13 +16,17 @@ import { QUERY_LBR_HRS_BY_PK, UPDATE_JOBS } from "../../graphql/jobs.queries";
|
||||
import { setEmailOptions } from "../../redux/email/email.actions";
|
||||
import { toggleModalVisible } from "../../redux/modals/modals.actions";
|
||||
import { selectSchedule } from "../../redux/modals/modals.selectors";
|
||||
import { selectBodyshop } from "../../redux/user/user.selectors";
|
||||
import {
|
||||
selectBodyshop,
|
||||
selectCurrentUser,
|
||||
} from "../../redux/user/user.selectors";
|
||||
import { TemplateList } from "../../utils/TemplateConstants";
|
||||
import ScheduleJobModalComponent from "./schedule-job-modal.component";
|
||||
|
||||
const mapStateToProps = createStructuredSelector({
|
||||
bodyshop: selectBodyshop,
|
||||
scheduleModal: selectSchedule,
|
||||
currentUser: selectCurrentUser,
|
||||
});
|
||||
const mapDispatchToProps = (dispatch) => ({
|
||||
toggleModalVisible: () => dispatch(toggleModalVisible("schedule")),
|
||||
@@ -34,6 +38,7 @@ export function ScheduleJobModalContainer({
|
||||
bodyshop,
|
||||
toggleModalVisible,
|
||||
setEmailOptions,
|
||||
currentUser,
|
||||
}) {
|
||||
const { visible, context, actions } = scheduleModal;
|
||||
const { jobId, job, previousEvent } = context;
|
||||
@@ -122,6 +127,7 @@ export function ScheduleJobModalContainer({
|
||||
end: moment(values.start).add(bodyshop.appt_length || 60, "minutes"),
|
||||
color: values.color,
|
||||
note: values.note,
|
||||
created_by: currentUser.email,
|
||||
},
|
||||
jobId: jobId,
|
||||
altTransport: values.alt_transport,
|
||||
|
||||
@@ -16,13 +16,12 @@ const VehicleSearchSelect = ({ value, onChange, onBlur, disabled }, ref) => {
|
||||
SEARCH_VEHICLES_FOR_AUTOCOMPLETE
|
||||
);
|
||||
|
||||
const [
|
||||
callIdSearch,
|
||||
{ loading: idLoading, error: idError, data: idData },
|
||||
] = useLazyQuery(SEARCH_VEHICLES_BY_ID_FOR_AUTOCOMPLETE);
|
||||
const [callIdSearch, { loading: idLoading, error: idError, data: idData }] =
|
||||
useLazyQuery(SEARCH_VEHICLES_BY_ID_FOR_AUTOCOMPLETE);
|
||||
|
||||
const executeSearch = (v) => {
|
||||
callSearch(v);
|
||||
if (v && v.variables?.search !== "" && v.variables.search.length >= 2)
|
||||
callSearch(v);
|
||||
};
|
||||
const debouncedExecuteSearch = _.debounce(executeSearch, 500);
|
||||
|
||||
|
||||
@@ -154,7 +154,6 @@ export function VendorsFormComponent({
|
||||
label={t("vendors.fields.phone")}
|
||||
name="phone"
|
||||
rules={[
|
||||
{ required: true, message: t("general.validation.required") },
|
||||
({ getFieldValue }) =>
|
||||
PhoneItemFormatterValidation(getFieldValue, "phone"),
|
||||
]}
|
||||
|
||||
@@ -5,6 +5,7 @@ export const INSERT_NEW_BILL = gql`
|
||||
insert_bills(objects: $bill) {
|
||||
returning {
|
||||
id
|
||||
invoice_number
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -219,6 +219,7 @@ export const GET_JOB_LINES_TO_ENTER_BILL = gql`
|
||||
id
|
||||
ro_number
|
||||
}
|
||||
v_make_desc
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
@@ -574,7 +574,6 @@ export const GET_JOB_BY_PK = gql`
|
||||
est_co_nm
|
||||
est_ct_fn
|
||||
est_ct_ln
|
||||
|
||||
est_ph1
|
||||
est_ea
|
||||
selling_dealer
|
||||
@@ -746,6 +745,7 @@ export const GET_JOB_BY_PK = gql`
|
||||
jobid
|
||||
amount
|
||||
payer
|
||||
paymentnum
|
||||
created_at
|
||||
transactionid
|
||||
memo
|
||||
@@ -1242,7 +1242,7 @@ export const SEARCH_JOBS_FOR_AUTOCOMPLETE = gql`
|
||||
) {
|
||||
search_jobs(
|
||||
args: { search: $search }
|
||||
limit: 50
|
||||
limit: 25
|
||||
where: {
|
||||
_and: {
|
||||
converted: { _eq: $isConverted }
|
||||
|
||||
@@ -36,7 +36,7 @@ export const SEARCH_OWNERS_FOR_AUTOCOMPLETE = gql`
|
||||
query SEARCH_OWNERS_FOR_AUTOCOMPLETE($search: String) {
|
||||
search_owners(
|
||||
args: { search: $search }
|
||||
limit: 50
|
||||
limit: 25
|
||||
order_by: { ownr_ln: desc_nulls_last }
|
||||
) {
|
||||
id
|
||||
|
||||
@@ -28,16 +28,14 @@ export const QUERY_PAYMENT_RESPONSE_BY_PAYMENT_ID = gql`
|
||||
}
|
||||
`;
|
||||
|
||||
export const QUERY_RO_AND_OWNER_BY_JOB_PK = gql`
|
||||
query QUERY_RO_AND_OWNER_BY_JOB_PK($jobid: uuid!) {
|
||||
jobs_by_pk(id: $jobid) {
|
||||
export const QUERY_RO_AND_OWNER_BY_JOB_PKS = gql`
|
||||
query QUERY_RO_AND_OWNER_BY_JOB_PKS($jobids: [uuid!]!) {
|
||||
jobs(where: { id: { _in: $jobids } }) {
|
||||
ro_number
|
||||
owner {
|
||||
ownr_fn
|
||||
ownr_ln
|
||||
ownr_ea
|
||||
ownr_zip
|
||||
}
|
||||
ownr_fn
|
||||
ownr_ln
|
||||
ownr_ea
|
||||
ownr_zip
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
@@ -184,7 +184,7 @@ export const SEARCH_VEHICLES_BY_ID_FOR_AUTOCOMPLETE = gql`
|
||||
`;
|
||||
export const SEARCH_VEHICLES_FOR_AUTOCOMPLETE = gql`
|
||||
query SEARCH_VEHICLES_FOR_AUTOCOMPLETE($search: String) {
|
||||
search_vehicles(args: { search: $search }, limit: 50) {
|
||||
search_vehicles(args: { search: $search }, limit: 25) {
|
||||
id
|
||||
v_vin
|
||||
v_model_yr
|
||||
|
||||
@@ -104,6 +104,7 @@ export const SEARCH_VENDOR_AUTOCOMPLETE = gql`
|
||||
id
|
||||
cost_center
|
||||
active
|
||||
favorite
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
@@ -6,6 +6,7 @@ const INITIAL_STATE = {
|
||||
isSending: false,
|
||||
error: null,
|
||||
message: null,
|
||||
searchingForConversation: false,
|
||||
};
|
||||
|
||||
const messagingReducer = (state = INITIAL_STATE, action) => {
|
||||
@@ -17,10 +18,16 @@ const messagingReducer = (state = INITIAL_STATE, action) => {
|
||||
...state,
|
||||
visible: !state.visible,
|
||||
};
|
||||
case MessagingActionTypes.OPEN_CHAT_BY_PHONE:
|
||||
return {
|
||||
...state,
|
||||
searchingForConversation: true,
|
||||
};
|
||||
case MessagingActionTypes.SET_SELECTED_CONVERSATION:
|
||||
return {
|
||||
...state,
|
||||
visible: true,
|
||||
searchingForConversation: false,
|
||||
selectedConversationId: action.payload,
|
||||
};
|
||||
case MessagingActionTypes.SEND_MESSAGE:
|
||||
|
||||
@@ -4,7 +4,7 @@ import { all, call, put, select, takeLatest } from "redux-saga/effects";
|
||||
import { logImEXEvent } from "../../firebase/firebase.utils";
|
||||
import {
|
||||
CONVERSATION_ID_BY_PHONE,
|
||||
CREATE_CONVERSATION
|
||||
CREATE_CONVERSATION,
|
||||
} from "../../graphql/conversations.queries";
|
||||
import { INSERT_CONVERSATION_TAG } from "../../graphql/job-conversations.queries";
|
||||
import client from "../../utils/GraphQLClient";
|
||||
@@ -12,7 +12,7 @@ import { selectBodyshop } from "../user/user.selectors";
|
||||
import {
|
||||
sendMessageFailure,
|
||||
sendMessageSuccess,
|
||||
setSelectedConversation
|
||||
setSelectedConversation,
|
||||
} from "./messaging.actions";
|
||||
import MessagingActionTypes from "./messaging.types";
|
||||
|
||||
@@ -79,6 +79,7 @@ export function* openChatByPhone({ payload }) {
|
||||
});
|
||||
} else {
|
||||
console.log("ERROR: Multiple conversations found. ");
|
||||
yield put(setSelectedConversation(null));
|
||||
}
|
||||
} catch (error) {
|
||||
console.log("Error in sendMessage saga.", error);
|
||||
|
||||
@@ -26,3 +26,8 @@ export const selectMessage = createSelector(
|
||||
[selectMessaging],
|
||||
(messaging) => messaging.message
|
||||
);
|
||||
|
||||
export const searchingForConversation = createSelector(
|
||||
[selectMessaging],
|
||||
(messaging) => messaging.searchingForConversation
|
||||
);
|
||||
|
||||
@@ -1211,6 +1211,7 @@
|
||||
"payer": "Payer",
|
||||
"payername": "Payer Name",
|
||||
"paymentid": "Payment Reference ID",
|
||||
"paymentnum": "Payment Number",
|
||||
"paymenttype": "Payment Type",
|
||||
"refundamount": "Refund Amount",
|
||||
"transactionid": "Transaction ID"
|
||||
@@ -2207,7 +2208,8 @@
|
||||
},
|
||||
"errors": {
|
||||
"exporting": "Error exporting payment(s). {{error}}",
|
||||
"exporting-partner": "Error exporting to partner. Please check the partner interaction log for more errors."
|
||||
"exporting-partner": "Error exporting to partner. Please check the partner interaction log for more errors.",
|
||||
"inserting": "Error inserting payment. {{error}}"
|
||||
},
|
||||
"fields": {
|
||||
"amount": "Amount",
|
||||
@@ -2563,18 +2565,22 @@
|
||||
"gsr_labor_only": "Gross Sales - Labor Only",
|
||||
"hours_sold_detail_closed": "Hours Sold Detail - Closed",
|
||||
"hours_sold_detail_closed_csr": "Hours Sold Detail - Closed by CSR",
|
||||
"hours_sold_detail_closed_estimator": "Hours Sold Detail - Closed by Estimator",
|
||||
"hours_sold_detail_closed_ins_co": "Hours Sold Detail - Closed by Source",
|
||||
"hours_sold_detail_closed_status": "Hours Sold Detail - Closed by Status",
|
||||
"hours_sold_detail_open": "Hours Sold Detail - Open",
|
||||
"hours_sold_detail_open_csr": "Hours Sold Detail - Open by CSR",
|
||||
"hours_sold_detail_open_estimator": "Hours Sold Detail - Open by Estimator",
|
||||
"hours_sold_detail_open_ins_co": "Hours Sold Detail - Open by Source",
|
||||
"hours_sold_detail_open_status": "Hours Sold Detail - Open by Status",
|
||||
"hours_sold_summary_closed": "Hours Sold Summary - Closed",
|
||||
"hours_sold_summary_closed_csr": "Hours Sold Summary - Closed by CSR",
|
||||
"hours_sold_summary_closed_estimator": "Hours Sold Summary - Closed by Estimator",
|
||||
"hours_sold_summary_closed_ins_co": "Hours Sold Summary - Closed by Source",
|
||||
"hours_sold_summary_closed_status": "Hours Sold Summary - Closed by Status",
|
||||
"hours_sold_summary_open": "Hours Sold Summary - Open",
|
||||
"hours_sold_summary_open_csr": "Hours Sold Summary - Open CSR",
|
||||
"hours_sold_summary_open_estimator": "Hours Sold Summary - Open Estimator",
|
||||
"hours_sold_summary_open_ins_co": "Hours Sold Summary - Open by Source",
|
||||
"hours_sold_summary_open_status": "Hours Sold Summary - Open by Status",
|
||||
"job_costing_ro_csr": "Job Costing by CSR",
|
||||
@@ -2591,6 +2597,7 @@
|
||||
"open_orders_csr": "Open Orders by CSR",
|
||||
"open_orders_estimator": "Open Orders by Estimator",
|
||||
"open_orders_ins_co": "Open Orders by Insurance Company",
|
||||
"open_orders_referral": "Open Orders by Referral Source",
|
||||
"open_orders_specific_csr": "Open Orders filtered by CSR",
|
||||
"open_orders_status": "Open Orders by Status",
|
||||
"parts_backorder": "IOU Parts List",
|
||||
|
||||
@@ -1211,6 +1211,7 @@
|
||||
"payer": "",
|
||||
"payername": "",
|
||||
"paymentid": "",
|
||||
"paymentnum": "",
|
||||
"paymenttype": "",
|
||||
"refundamount": "",
|
||||
"transactionid": ""
|
||||
@@ -2207,7 +2208,8 @@
|
||||
},
|
||||
"errors": {
|
||||
"exporting": "",
|
||||
"exporting-partner": ""
|
||||
"exporting-partner": "",
|
||||
"inserting": ""
|
||||
},
|
||||
"fields": {
|
||||
"amount": "",
|
||||
@@ -2563,18 +2565,22 @@
|
||||
"gsr_labor_only": "",
|
||||
"hours_sold_detail_closed": "",
|
||||
"hours_sold_detail_closed_csr": "",
|
||||
"hours_sold_detail_closed_estimator": "",
|
||||
"hours_sold_detail_closed_ins_co": "",
|
||||
"hours_sold_detail_closed_status": "",
|
||||
"hours_sold_detail_open": "",
|
||||
"hours_sold_detail_open_csr": "",
|
||||
"hours_sold_detail_open_estimator": "",
|
||||
"hours_sold_detail_open_ins_co": "",
|
||||
"hours_sold_detail_open_status": "",
|
||||
"hours_sold_summary_closed": "",
|
||||
"hours_sold_summary_closed_csr": "",
|
||||
"hours_sold_summary_closed_estimator": "",
|
||||
"hours_sold_summary_closed_ins_co": "",
|
||||
"hours_sold_summary_closed_status": "",
|
||||
"hours_sold_summary_open": "",
|
||||
"hours_sold_summary_open_csr": "",
|
||||
"hours_sold_summary_open_estimator": "",
|
||||
"hours_sold_summary_open_ins_co": "",
|
||||
"hours_sold_summary_open_status": "",
|
||||
"job_costing_ro_csr": "",
|
||||
@@ -2591,6 +2597,7 @@
|
||||
"open_orders_csr": "",
|
||||
"open_orders_estimator": "",
|
||||
"open_orders_ins_co": "",
|
||||
"open_orders_referral": "",
|
||||
"open_orders_specific_csr": "",
|
||||
"open_orders_status": "",
|
||||
"parts_backorder": "",
|
||||
|
||||
@@ -1211,6 +1211,7 @@
|
||||
"payer": "",
|
||||
"payername": "",
|
||||
"paymentid": "",
|
||||
"paymentnum": "",
|
||||
"paymenttype": "",
|
||||
"refundamount": "",
|
||||
"transactionid": ""
|
||||
@@ -2207,7 +2208,8 @@
|
||||
},
|
||||
"errors": {
|
||||
"exporting": "",
|
||||
"exporting-partner": ""
|
||||
"exporting-partner": "",
|
||||
"inserting": ""
|
||||
},
|
||||
"fields": {
|
||||
"amount": "",
|
||||
@@ -2563,18 +2565,22 @@
|
||||
"gsr_labor_only": "",
|
||||
"hours_sold_detail_closed": "",
|
||||
"hours_sold_detail_closed_csr": "",
|
||||
"hours_sold_detail_closed_estimator": "",
|
||||
"hours_sold_detail_closed_ins_co": "",
|
||||
"hours_sold_detail_closed_status": "",
|
||||
"hours_sold_detail_open": "",
|
||||
"hours_sold_detail_open_csr": "",
|
||||
"hours_sold_detail_open_estimator": "",
|
||||
"hours_sold_detail_open_ins_co": "",
|
||||
"hours_sold_detail_open_status": "",
|
||||
"hours_sold_summary_closed": "",
|
||||
"hours_sold_summary_closed_csr": "",
|
||||
"hours_sold_summary_closed_estimator": "",
|
||||
"hours_sold_summary_closed_ins_co": "",
|
||||
"hours_sold_summary_closed_status": "",
|
||||
"hours_sold_summary_open": "",
|
||||
"hours_sold_summary_open_csr": "",
|
||||
"hours_sold_summary_open_estimator": "",
|
||||
"hours_sold_summary_open_ins_co": "",
|
||||
"hours_sold_summary_open_status": "",
|
||||
"job_costing_ro_csr": "",
|
||||
@@ -2591,6 +2597,7 @@
|
||||
"open_orders_csr": "",
|
||||
"open_orders_estimator": "",
|
||||
"open_orders_ins_co": "",
|
||||
"open_orders_referral": "",
|
||||
"open_orders_specific_csr": "",
|
||||
"open_orders_status": "",
|
||||
"parts_backorder": "",
|
||||
|
||||
@@ -1,15 +1,14 @@
|
||||
import { gql } from "@apollo/client";
|
||||
import { notification } from "antd";
|
||||
import jsreport from "@jsreport/browser-client";
|
||||
import { notification } from "antd";
|
||||
import axios from "axios";
|
||||
import _ from "lodash";
|
||||
import moment from "moment";
|
||||
import { auth } from "../firebase/firebase.utils";
|
||||
import { setEmailOptions } from "../redux/email/email.actions";
|
||||
import { store } from "../redux/store";
|
||||
import client from "../utils/GraphQLClient";
|
||||
import { TemplateList } from "./TemplateConstants";
|
||||
import cleanAxios from "./CleanAxios";
|
||||
import axios from "axios";
|
||||
import { TemplateList } from "./TemplateConstants";
|
||||
const server = process.env.REACT_APP_REPORTS_SERVER_URL;
|
||||
|
||||
jsreport.serverUrl = server;
|
||||
@@ -255,7 +254,7 @@ export async function RenderTemplates(
|
||||
headerpath: `/${bodyshop.imexshopid}/header.html`,
|
||||
footerpath: `/${bodyshop.imexshopid}/footer.html`,
|
||||
bodyshop: bodyshop,
|
||||
offset: moment().utcOffset(),
|
||||
offset: bodyshop.timezone,
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@@ -818,6 +818,74 @@ export const TemplateList = (type, context) => {
|
||||
},
|
||||
group: "sales",
|
||||
},
|
||||
hours_sold_detail_closed_estimator: {
|
||||
title: i18n.t(
|
||||
"reportcenter.templates.hours_sold_detail_closed_estimator"
|
||||
),
|
||||
description: "",
|
||||
subject: i18n.t(
|
||||
"reportcenter.templates.hours_sold_detail_closed_estimator"
|
||||
),
|
||||
key: "hours_sold_detail_closed_estimator",
|
||||
//idtype: "vendor",
|
||||
disabled: false,
|
||||
rangeFilter: {
|
||||
object: i18n.t("reportcenter.labels.objects.jobs"),
|
||||
field: i18n.t("jobs.fields.date_invoiced"),
|
||||
},
|
||||
group: "sales",
|
||||
},
|
||||
hours_sold_detail_open_estimator: {
|
||||
title: i18n.t(
|
||||
"reportcenter.templates.hours_sold_detail_open_estimator"
|
||||
),
|
||||
description: "",
|
||||
subject: i18n.t(
|
||||
"reportcenter.templates.hours_sold_detail_open_estimator"
|
||||
),
|
||||
key: "hours_sold_detail_open_estimator",
|
||||
//idtype: "vendor",
|
||||
disabled: false,
|
||||
rangeFilter: {
|
||||
object: i18n.t("reportcenter.labels.objects.jobs"),
|
||||
field: i18n.t("jobs.fields.date_open"),
|
||||
},
|
||||
group: "sales",
|
||||
},
|
||||
hours_sold_summary_closed_estimator: {
|
||||
title: i18n.t(
|
||||
"reportcenter.templates.hours_sold_summary_closed_estimator"
|
||||
),
|
||||
description: "",
|
||||
subject: i18n.t(
|
||||
"reportcenter.templates.hours_sold_summary_closed_estimator"
|
||||
),
|
||||
key: "hours_sold_summary_closed_estimator",
|
||||
//idtype: "vendor",
|
||||
disabled: false,
|
||||
rangeFilter: {
|
||||
object: i18n.t("reportcenter.labels.objects.jobs"),
|
||||
field: i18n.t("jobs.fields.date_invoiced"),
|
||||
},
|
||||
group: "sales",
|
||||
},
|
||||
hours_sold_summary_open_estimator: {
|
||||
title: i18n.t(
|
||||
"reportcenter.templates.hours_sold_summary_open_estimator"
|
||||
),
|
||||
description: "",
|
||||
subject: i18n.t(
|
||||
"reportcenter.templates.hours_sold_summary_open_estimator"
|
||||
),
|
||||
key: "hours_sold_summary_open_estimator",
|
||||
//idtype: "vendor",
|
||||
disabled: false,
|
||||
rangeFilter: {
|
||||
object: i18n.t("reportcenter.labels.objects.jobs"),
|
||||
field: i18n.t("jobs.fields.date_invoiced"),
|
||||
},
|
||||
group: "sales",
|
||||
},
|
||||
hours_sold_summary_open_status: {
|
||||
title: i18n.t(
|
||||
"reportcenter.templates.hours_sold_summary_open_status"
|
||||
@@ -1434,6 +1502,19 @@ export const TemplateList = (type, context) => {
|
||||
},
|
||||
group: "jobs",
|
||||
},
|
||||
open_orders_specific_csr: {
|
||||
title: i18n.t("reportcenter.templates.open_orders_specific_csr"),
|
||||
description: "",
|
||||
subject: i18n.t("reportcenter.templates.open_orders_specific_csr"),
|
||||
key: "open_orders_specific_csr",
|
||||
idtype: "employee",
|
||||
disabled: false,
|
||||
rangeFilter: {
|
||||
object: i18n.t("reportcenter.labels.objects.jobs"),
|
||||
field: i18n.t("jobs.fields.date_open"),
|
||||
},
|
||||
group: "jobs",
|
||||
},
|
||||
open_orders_estimator: {
|
||||
title: i18n.t("reportcenter.templates.open_orders_estimator"),
|
||||
description: "",
|
||||
@@ -1460,12 +1541,12 @@ export const TemplateList = (type, context) => {
|
||||
},
|
||||
group: "jobs",
|
||||
},
|
||||
open_orders_specific_csr: {
|
||||
title: i18n.t("reportcenter.templates.open_orders_specific_csr"),
|
||||
open_orders_referral: {
|
||||
title: i18n.t("reportcenter.templates.open_orders_referral"),
|
||||
description: "",
|
||||
subject: i18n.t("reportcenter.templates.open_orders_specific_csr"),
|
||||
key: "open_orders_specific_csr",
|
||||
idtype: "employee",
|
||||
subject: i18n.t("reportcenter.templates.open_orders_referral"),
|
||||
key: "open_orders_referral",
|
||||
//idtype: "vendor",
|
||||
disabled: false,
|
||||
rangeFilter: {
|
||||
object: i18n.t("reportcenter.labels.objects.jobs"),
|
||||
|
||||
@@ -110,6 +110,7 @@
|
||||
- canceled
|
||||
- color
|
||||
- created_at
|
||||
- created_by
|
||||
- end
|
||||
- id
|
||||
- isintake
|
||||
@@ -128,6 +129,7 @@
|
||||
- canceled
|
||||
- color
|
||||
- created_at
|
||||
- created_by
|
||||
- end
|
||||
- id
|
||||
- isintake
|
||||
@@ -156,6 +158,7 @@
|
||||
- canceled
|
||||
- color
|
||||
- created_at
|
||||
- created_by
|
||||
- end
|
||||
- id
|
||||
- isintake
|
||||
@@ -3274,6 +3277,8 @@
|
||||
- cat_no
|
||||
- category
|
||||
- cieca_pfl
|
||||
- cieca_pfo
|
||||
- cieca_pft
|
||||
- cieca_stl
|
||||
- cieca_ttl
|
||||
- ciecaid
|
||||
@@ -3541,6 +3546,8 @@
|
||||
- cat_no
|
||||
- category
|
||||
- cieca_pfl
|
||||
- cieca_pfo
|
||||
- cieca_pft
|
||||
- cieca_stl
|
||||
- cieca_ttl
|
||||
- ciecaid
|
||||
@@ -3819,6 +3826,8 @@
|
||||
- cat_no
|
||||
- category
|
||||
- cieca_pfl
|
||||
- cieca_pfo
|
||||
- cieca_pft
|
||||
- cieca_stl
|
||||
- cieca_ttl
|
||||
- ciecaid
|
||||
@@ -4070,12 +4079,7 @@
|
||||
event_triggers:
|
||||
- name: job_status_transition
|
||||
definition:
|
||||
enable_manual: false
|
||||
insert:
|
||||
columns: '*'
|
||||
update:
|
||||
columns:
|
||||
- status
|
||||
enable_manual: true
|
||||
retry_conf:
|
||||
interval_sec: 10
|
||||
num_retries: 0
|
||||
@@ -4091,23 +4095,7 @@
|
||||
version: 2
|
||||
- name: jobs_arms
|
||||
definition:
|
||||
enable_manual: false
|
||||
update:
|
||||
columns:
|
||||
- actual_delivery
|
||||
- scheduled_delivery
|
||||
- scheduled_completion
|
||||
- actual_completion
|
||||
- date_scheduled
|
||||
- inproduction
|
||||
- clm_total
|
||||
- suspended
|
||||
- job_totals
|
||||
- converted
|
||||
- employee_body
|
||||
- ro_number
|
||||
- actual_in
|
||||
- scheduled_in
|
||||
enable_manual: true
|
||||
retry_conf:
|
||||
interval_sec: 10
|
||||
num_retries: 0
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
-- Could not auto-generate a down migration.
|
||||
-- Please write an appropriate down migration for the SQL below:
|
||||
-- alter table "public"."jobs" add column "cieca_pft" jsonb
|
||||
-- null default jsonb_build_object();
|
||||
@@ -0,0 +1,2 @@
|
||||
alter table "public"."jobs" add column "cieca_pft" jsonb
|
||||
null default jsonb_build_object();
|
||||
@@ -0,0 +1,4 @@
|
||||
-- Could not auto-generate a down migration.
|
||||
-- Please write an appropriate down migration for the SQL below:
|
||||
-- alter table "public"."jobs" add column "cieca_pfo" jsonb
|
||||
-- null default jsonb_build_object();
|
||||
@@ -0,0 +1,2 @@
|
||||
alter table "public"."jobs" add column "cieca_pfo" jsonb
|
||||
null default jsonb_build_object();
|
||||
@@ -0,0 +1,4 @@
|
||||
-- Could not auto-generate a down migration.
|
||||
-- Please write an appropriate down migration for the SQL below:
|
||||
-- alter table "public"."appointments" add column "created_by" text
|
||||
-- null;
|
||||
@@ -0,0 +1,2 @@
|
||||
alter table "public"."appointments" add column "created_by" text
|
||||
null;
|
||||
@@ -62,7 +62,7 @@ exports.default = async (req, res) => {
|
||||
start: start
|
||||
? moment(start).startOf("day")
|
||||
: moment().subtract(5, "days").startOf("day"),
|
||||
...(end && { end: moment(end).startOf("day") }),
|
||||
...(end && { end: moment(end).endOf("day") }),
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ let Client = require("ssh2-sftp-client");
|
||||
const client = require("../graphql-client/graphql-client").client;
|
||||
const { sendServerEmail } = require("../email/sendemail");
|
||||
const CCDineroFormat = "0,0.00";
|
||||
const AhDateFormat = "MMDDYYYY";
|
||||
const AhDateFormat = "MM/DD/YYYY";
|
||||
|
||||
const repairOpCodes = ["OP4", "OP9", "OP10"];
|
||||
const replaceOpCodes = ["OP2", "OP5", "OP11", "OP12"];
|
||||
@@ -62,22 +62,24 @@ exports.default = async (req, res) => {
|
||||
start: start
|
||||
? moment(start).startOf("day")
|
||||
: moment().subtract(5, "days").startOf("day"),
|
||||
...(end && { end: moment(end).startOf("day") }),
|
||||
...(end && { end: moment(end).endOf("day") }),
|
||||
}
|
||||
);
|
||||
|
||||
const claimsCorpObject = {
|
||||
ClaimsCorpExport: {
|
||||
ShopID: bodyshops_by_pk.claimscorpid,
|
||||
ShopName: bodyshops_by_pk.shopname,
|
||||
RO: jobs.map((j) =>
|
||||
CreateRepairOrderTag(
|
||||
{ ...j, bodyshop: bodyshops_by_pk },
|
||||
function ({ job, error }) {
|
||||
erroredJobs.push({ job: job, error: error.toString() });
|
||||
}
|
||||
)
|
||||
),
|
||||
DataFeed: {
|
||||
ShopInfo: {
|
||||
ShopID: bodyshops_by_pk.claimscorpid,
|
||||
ShopName: bodyshops_by_pk.shopname,
|
||||
RO: jobs.map((j) =>
|
||||
CreateRepairOrderTag(
|
||||
{ ...j, bodyshop: bodyshops_by_pk },
|
||||
function ({ job, error }) {
|
||||
erroredJobs.push({ job: job, error: error.toString() });
|
||||
}
|
||||
)
|
||||
),
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -100,9 +102,9 @@ exports.default = async (req, res) => {
|
||||
.end({ allowEmptyTags: true });
|
||||
|
||||
allxmlsToUpload.push({
|
||||
count: claimsCorpObject.ClaimsCorpExport.RO.length,
|
||||
count: claimsCorpObject.DataFeed.ShopInfo.RO.length,
|
||||
xml: ret,
|
||||
filename: `${bodyshop.claimscorpid}-MIS-${moment().format(
|
||||
filename: `${bodyshop.claimscorpid}-${moment().format(
|
||||
"YYYYMMDDTHHMMss"
|
||||
)}.xml`,
|
||||
});
|
||||
@@ -243,7 +245,7 @@ const CreateRepairOrderTag = (job, errorCallback) => {
|
||||
|
||||
try {
|
||||
const ret = {
|
||||
RONumber: job.ro_number,
|
||||
RoNumber: job.ro_number,
|
||||
Customer: {
|
||||
CustomerZip: (job.ownr_zip && job.ownr_zip.substring(0, 3)) || "",
|
||||
CustomerState: job.ownr_st || "",
|
||||
@@ -261,8 +263,8 @@ const CreateRepairOrderTag = (job, errorCallback) => {
|
||||
VIN: job.v_vin || "",
|
||||
},
|
||||
Carrier: {
|
||||
InsuranceCo: job.ins_co_nm || "",
|
||||
CompanyName: job.ins_co_nm || "",
|
||||
UniqueID: job.ins_co_nm || "",
|
||||
InsuranceCompany: job.ins_co_nm || "",
|
||||
},
|
||||
Claim: job.clm_no || "",
|
||||
Contacts: {
|
||||
@@ -279,7 +281,7 @@ const CreateRepairOrderTag = (job, errorCallback) => {
|
||||
: "",
|
||||
Phone1: "",
|
||||
Phone2: "",
|
||||
EstimatorName: `${job.est_ct_ln ? job.est_ct_ln : ""}${
|
||||
Estimator: `${job.est_ct_ln ? job.est_ct_ln : ""}${
|
||||
job.est_ct_ln ? ", " : ""
|
||||
}${job.est_ct_fn ? job.est_ct_fn : ""}`,
|
||||
BodyTechnician: job.employee_body_rel
|
||||
@@ -310,7 +312,7 @@ const CreateRepairOrderTag = (job, errorCallback) => {
|
||||
(job.date_estimated &&
|
||||
moment(job.date_estimated).format(AhDateFormat)) ||
|
||||
"",
|
||||
DateofLoss:
|
||||
DateLoss:
|
||||
(job.loss_date && moment(job.loss_date).format(AhDateFormat)) || "",
|
||||
DateFNOL: "",
|
||||
DateContact: "",
|
||||
@@ -337,7 +339,7 @@ const CreateRepairOrderTag = (job, errorCallback) => {
|
||||
.tz(job.bodyshop.timezone)
|
||||
.format(AhDateFormat)) ||
|
||||
"",
|
||||
StartDate: job.date_repairstarted
|
||||
DateStart: job.date_repairstarted
|
||||
? (job.date_repairstarted &&
|
||||
moment(job.date_repairstarted)
|
||||
.tz(job.bodyshop.timezone)
|
||||
@@ -382,7 +384,7 @@ const CreateRepairOrderTag = (job, errorCallback) => {
|
||||
"",
|
||||
BilledDate: "",
|
||||
PaidInFullDate: "",
|
||||
RoStatus: job.tlos_ind
|
||||
ROStatus: job.tlos_ind
|
||||
? "TOT"
|
||||
: StatusMapping(job.status, job.bodyshop.md_ro_statuses),
|
||||
},
|
||||
@@ -392,14 +394,10 @@ const CreateRepairOrderTag = (job, errorCallback) => {
|
||||
.add(Dinero(job.job_totals.rates.lad.total))
|
||||
.add(Dinero(job.job_totals.rates.las.total))
|
||||
.toFormat(CCDineroFormat),
|
||||
Refinish: Dinero(job.job_totals.rates.lar.total).toFormat(
|
||||
CCDineroFormat
|
||||
),
|
||||
Paint: Dinero(job.job_totals.rates.lar.total).toFormat(CCDineroFormat),
|
||||
Prep: Dinero().toFormat(CCDineroFormat),
|
||||
Frame: Dinero(job.job_totals.rates.laf.total).toFormat(CCDineroFormat),
|
||||
Mechanical: Dinero(job.job_totals.rates.lam.total).toFormat(
|
||||
CCDineroFormat
|
||||
),
|
||||
Mech: Dinero(job.job_totals.rates.lam.total).toFormat(CCDineroFormat),
|
||||
Glass: Dinero(job.job_totals.rates.lag.total).toFormat(CCDineroFormat),
|
||||
Elec: Dinero(job.job_totals.rates.lae.total).toFormat(CCDineroFormat),
|
||||
Detail: detailAdjustments.amount.toFormat(CCDineroFormat),
|
||||
@@ -446,6 +444,7 @@ const CreateRepairOrderTag = (job, errorCallback) => {
|
||||
Towing: Dinero(job.job_totals.additional.towing).toFormat(
|
||||
CCDineroFormat
|
||||
),
|
||||
Storage: "0.00",
|
||||
Rental:
|
||||
job.job_totals.additional.additionalCostItems.includes(
|
||||
"ATS Amount"
|
||||
@@ -480,17 +479,17 @@ const CreateRepairOrderTag = (job, errorCallback) => {
|
||||
.filter((line) => repairOpCodes.includes(line.lbr_op))
|
||||
.reduce((acc, val) => acc + val.mod_lb_hrs, 0)
|
||||
.toFixed(2),
|
||||
BodyReplaceHours: job.joblines
|
||||
BodyReplacehours: job.joblines
|
||||
.filter((line) => replaceOpCodes.includes(line.lbr_op))
|
||||
.reduce((acc, val) => acc + val.mod_lb_hrs, 0)
|
||||
.toFixed(2),
|
||||
Paint: job.job_totals.rates.lar.hours.toFixed(2),
|
||||
Prep: "0.00",
|
||||
FrameHours: job.job_totals.rates.laf.hours.toFixed(2),
|
||||
MechanicalHours: job.job_totals.rates.lam.hours.toFixed(2),
|
||||
GlassHours: job.job_totals.rates.lag.hours.toFixed(2),
|
||||
ElectricalHours: job.job_totals.rates.lae.hours.toFixed(2),
|
||||
DetailHours: detailAdjustments.hours,
|
||||
Frame: job.job_totals.rates.laf.hours.toFixed(2),
|
||||
Mech: job.job_totals.rates.lam.hours.toFixed(2),
|
||||
Glass: job.job_totals.rates.lag.hours.toFixed(2),
|
||||
Elec: job.job_totals.rates.lae.hours.toFixed(2),
|
||||
Detail: detailAdjustments.hours,
|
||||
Reassem: "0.00",
|
||||
Other: (
|
||||
job.job_totals.rates.la1.hours +
|
||||
@@ -522,7 +521,7 @@ const CreateRepairOrderTag = (job, errorCallback) => {
|
||||
AM: repairCosts.PartsAMCost.toFormat(CCDineroFormat),
|
||||
MechParts: Dinero().toFormat(CCDineroFormat),
|
||||
OtherParts: Dinero().toFormat(CCDineroFormat), //Check Synergy
|
||||
OtherCosts: repairCosts.PartsOtherCost.toFormat(CCDineroFormat),
|
||||
OtherCost: repairCosts.PartsOtherCost.toFormat(CCDineroFormat),
|
||||
Sublet: repairCosts.SubletTotalCost.toFormat(CCDineroFormat),
|
||||
Towing: repairCosts.TowingTotalCost.toFormat(CCDineroFormat),
|
||||
Storage: repairCosts.StorageTotalCost.toFormat(CCDineroFormat),
|
||||
|
||||
@@ -1,16 +1,12 @@
|
||||
exports.FIND_BODYSHOP_BY_MESSAGING_SERVICE_SID = `
|
||||
query FIND_BODYSHOP_BY_MESSAGING_SERVICE_SID(
|
||||
$mssid: String!
|
||||
$phone: String!
|
||||
) {
|
||||
query FIND_BODYSHOP_BY_MESSAGING_SERVICE_SID($mssid: String!, $phone: String!) {
|
||||
bodyshops(where: { messagingservicesid: { _eq: $mssid } }) {
|
||||
id
|
||||
conversations(where: { phone_num: { _eq: $phone } }) {
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.GET_JOB_BY_RO_NUMBER = `
|
||||
query GET_JOB_BY_RO_NUMBER($ro_number: String!) {
|
||||
@@ -20,8 +16,7 @@ exports.GET_JOB_BY_RO_NUMBER = `
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.INSERT_NEW_PAYMENT = `
|
||||
mutation INSERT_NEW_PAYMENT($paymentInput: [payments_insert_input!]!) {
|
||||
@@ -30,28 +25,23 @@ exports.INSERT_NEW_PAYMENT = `
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.INSERT_PAYMENT_RESPONSE = `
|
||||
mutation INSERT_PAYMENT_RESPONSE(
|
||||
$paymentResponse: [payment_response_insert_input!]!
|
||||
) {
|
||||
mutation INSERT_PAYMENT_RESPONSE($paymentResponse: [payment_response_insert_input!]!) {
|
||||
insert_payment_response(objects: $paymentResponse) {
|
||||
returning {
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.UNARCHIVE_CONVERSATION = `
|
||||
mutation UNARCHIVE_CONVERSATION($id: uuid!) {
|
||||
update_conversations_by_pk(pk_columns: {id: $id}, _set: {archived: false}) {
|
||||
id
|
||||
}
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.INSERT_NEW_JOB_LINE = `
|
||||
mutation INSERT_NEW_JOB_LINE($lineInput: [joblines_insert_input!]!) {
|
||||
@@ -60,8 +50,7 @@ exports.INSERT_NEW_JOB_LINE = `
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.UPDATE_JOB_LINE = `
|
||||
mutation UPDATE_JOB_LINE($lineId: uuid!, $line: joblines_set_input!) {
|
||||
@@ -82,8 +71,7 @@ exports.UPDATE_JOB_LINE = `
|
||||
removed
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.RECEIVE_MESSAGE = `
|
||||
mutation RECEIVE_MESSAGE($msg: [messages_insert_input!]!) {
|
||||
@@ -92,7 +80,7 @@ mutation RECEIVE_MESSAGE($msg: [messages_insert_input!]!) {
|
||||
conversation {
|
||||
id
|
||||
archived
|
||||
bodyshop{
|
||||
bodyshop {
|
||||
imexshopid
|
||||
}
|
||||
created_at
|
||||
@@ -114,10 +102,7 @@ mutation RECEIVE_MESSAGE($msg: [messages_insert_input!]!) {
|
||||
userid
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.INSERT_MESSAGE = `
|
||||
mutation INSERT_MESSAGE($msg: [messages_insert_input!]!, $conversationid: uuid!) {
|
||||
@@ -130,7 +115,7 @@ mutation INSERT_MESSAGE($msg: [messages_insert_input!]!, $conversationid: uuid!)
|
||||
conversation {
|
||||
id
|
||||
archived
|
||||
bodyshop{
|
||||
bodyshop {
|
||||
imexshopid
|
||||
}
|
||||
created_at
|
||||
@@ -152,10 +137,7 @@ mutation INSERT_MESSAGE($msg: [messages_insert_input!]!, $conversationid: uuid!)
|
||||
userid
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.UPDATE_MESSAGE_STATUS = `
|
||||
mutation UPDATE_MESSAGE($msid: String!, $fields: messages_set_input!) {
|
||||
@@ -164,8 +146,7 @@ mutation UPDATE_MESSAGE($msid: String!, $fields: messages_set_input!) {
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.QUERY_JOBS_FOR_RECEIVABLES_EXPORT = `
|
||||
query QUERY_JOBS_FOR_RECEIVABLES_EXPORT($ids: [uuid!]!) {
|
||||
@@ -228,7 +209,7 @@ query QUERY_JOBS_FOR_RECEIVABLES_EXPORT($ids: [uuid!]!) {
|
||||
owner {
|
||||
accountingid
|
||||
}
|
||||
joblines(where:{removed: {_eq:false}}) {
|
||||
joblines(where:{removed: {_eq:false}}) {
|
||||
id
|
||||
line_desc
|
||||
part_type
|
||||
@@ -257,8 +238,7 @@ query QUERY_JOBS_FOR_RECEIVABLES_EXPORT($ids: [uuid!]!) {
|
||||
timezone
|
||||
md_ro_statuses
|
||||
}
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.QUERY_JOBS_FOR_CDK_EXPORT = `
|
||||
query QUERY_JOBS_FOR_CDK_EXPORT($id: uuid!) {
|
||||
@@ -318,19 +298,19 @@ query QUERY_JOBS_FOR_CDK_EXPORT($id: uuid!) {
|
||||
v_make_desc
|
||||
v_color
|
||||
ca_customer_gst
|
||||
bodyshop {
|
||||
id
|
||||
md_ro_statuses
|
||||
md_responsibility_centers
|
||||
accountingconfig
|
||||
cdk_dealerid
|
||||
cdk_configuration
|
||||
timezone
|
||||
}
|
||||
bodyshop {
|
||||
id
|
||||
md_ro_statuses
|
||||
md_responsibility_centers
|
||||
accountingconfig
|
||||
cdk_dealerid
|
||||
cdk_configuration
|
||||
timezone
|
||||
}
|
||||
owner {
|
||||
accountingid
|
||||
}
|
||||
joblines(where:{removed: {_eq:false}}) {
|
||||
joblines(where:{removed: {_eq:false}}) {
|
||||
id
|
||||
line_desc
|
||||
part_type
|
||||
@@ -345,9 +325,7 @@ query QUERY_JOBS_FOR_CDK_EXPORT($id: uuid!) {
|
||||
prt_dsmk_p
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.QUERY_JOBS_FOR_PBS_EXPORT = `
|
||||
query QUERY_JOBS_FOR_PBS_EXPORT($id: uuid!) {
|
||||
@@ -410,24 +388,24 @@ query QUERY_JOBS_FOR_PBS_EXPORT($id: uuid!) {
|
||||
v_make_desc
|
||||
v_color
|
||||
ca_customer_gst
|
||||
vehicle{
|
||||
vehicle {
|
||||
v_trimcode
|
||||
v_makecode
|
||||
}
|
||||
bodyshop {
|
||||
id
|
||||
md_ro_statuses
|
||||
md_responsibility_centers
|
||||
accountingconfig
|
||||
pbs_serialnumber
|
||||
pbs_configuration
|
||||
timezone
|
||||
}
|
||||
bodyshop {
|
||||
id
|
||||
md_ro_statuses
|
||||
md_responsibility_centers
|
||||
accountingconfig
|
||||
pbs_serialnumber
|
||||
pbs_configuration
|
||||
timezone
|
||||
}
|
||||
owner {
|
||||
id
|
||||
accountingid
|
||||
}
|
||||
joblines(where:{removed: {_eq:false}}) {
|
||||
joblines(where:{removed: {_eq:false}}) {
|
||||
id
|
||||
line_desc
|
||||
part_type
|
||||
@@ -444,9 +422,7 @@ query QUERY_JOBS_FOR_PBS_EXPORT($id: uuid!) {
|
||||
line_ref
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.QUERY_BILLS_FOR_PAYABLES_EXPORT = `
|
||||
query QUERY_BILLS_FOR_PAYABLES_EXPORT($bills: [uuid!]!) {
|
||||
@@ -490,18 +466,17 @@ query QUERY_BILLS_FOR_PAYABLES_EXPORT($bills: [uuid!]!) {
|
||||
due_date
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.QUERY_PAYMENTS_FOR_EXPORT = `
|
||||
query QUERY_PAYMENTS_FOR_EXPORT($payments: [uuid!]!)
|
||||
{ bodyshops(where: {associations: {active: {_eq: true}}}) {
|
||||
id
|
||||
md_responsibility_centers
|
||||
accountingconfig
|
||||
timezone
|
||||
md_ins_cos
|
||||
}
|
||||
query QUERY_PAYMENTS_FOR_EXPORT($payments: [uuid!]!) {
|
||||
bodyshops(where: {associations: {active: {_eq: true}}}) {
|
||||
id
|
||||
md_responsibility_centers
|
||||
accountingconfig
|
||||
timezone
|
||||
md_ins_cos
|
||||
}
|
||||
payments(where: {id: {_in: $payments}}) {
|
||||
id
|
||||
created_at
|
||||
@@ -509,15 +484,14 @@ exports.QUERY_PAYMENTS_FOR_EXPORT = `
|
||||
job {
|
||||
id
|
||||
ro_number
|
||||
ownerid
|
||||
ownr_ln
|
||||
ownr_fn
|
||||
ownr_addr1
|
||||
ownr_addr2
|
||||
ownr_zip
|
||||
ownr_city
|
||||
ownr_st
|
||||
|
||||
ownerid
|
||||
ownr_ln
|
||||
ownr_fn
|
||||
ownr_addr1
|
||||
ownr_addr2
|
||||
ownr_zip
|
||||
ownr_city
|
||||
ownr_st
|
||||
ins_co_nm
|
||||
owner{
|
||||
accountingid
|
||||
@@ -525,7 +499,7 @@ exports.QUERY_PAYMENTS_FOR_EXPORT = `
|
||||
ownr_fn
|
||||
ownr_ln
|
||||
ownr_co_nm
|
||||
bodyshop{
|
||||
bodyshop {
|
||||
accountingconfig
|
||||
md_responsibility_centers
|
||||
md_ins_cos
|
||||
@@ -542,8 +516,7 @@ exports.QUERY_PAYMENTS_FOR_EXPORT = `
|
||||
paymentnum
|
||||
date
|
||||
}
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.QUERY_UPCOMING_APPOINTMENTS = `query QUERY_UPCOMING_APPOINTMENTS($now: timestamptz!, $jobId: uuid!) {
|
||||
jobs_by_pk(id: $jobId) {
|
||||
@@ -643,8 +616,7 @@ exports.QUERY_UPCOMING_APPOINTMENTS = `query QUERY_UPCOMING_APPOINTMENTS($now: t
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.QUERY_EMPLOYEE_PIN = `query QUERY_EMPLOYEE_PIN($shopId: uuid!, $employeeId: String!) {
|
||||
employees(where: {_and: {shopid: {_eq: $shopId}, employee_number: {_eq: $employeeId}}}) {
|
||||
@@ -835,8 +807,7 @@ exports.AUTOHOUSE_QUERY = `query AUTOHOUSE_EXPORT($start: timestamptz, $bodyshop
|
||||
totalliquidcost
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.CLAIMSCORP_QUERY = `query CLAIMSCORP_EXPORT($start: timestamptz, $bodyshopid: uuid!, $end: timestamptz) {
|
||||
bodyshops_by_pk(id: $bodyshopid){
|
||||
@@ -1008,8 +979,7 @@ exports.CLAIMSCORP_QUERY = `query CLAIMSCORP_EXPORT($start: timestamptz, $bodysh
|
||||
totalliquidcost
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.ENTEGRAL_EXPORT = `
|
||||
query ENTEGRAL_EXPORT($bodyshopid: uuid!) {
|
||||
@@ -1098,8 +1068,7 @@ query ENTEGRAL_EXPORT($bodyshopid: uuid!) {
|
||||
cieca_ttl
|
||||
adjustment_bottom_line
|
||||
}
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.UPDATE_JOB = `
|
||||
mutation UPDATE_JOB($jobId: uuid!, $job: jobs_set_input!) {
|
||||
@@ -1114,8 +1083,7 @@ exports.UPDATE_JOB = `
|
||||
lbr_adjustments
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.GET_JOB_BY_PK = `query GET_JOB_BY_PK($id: uuid!) {
|
||||
jobs_by_pk(id: $id) {
|
||||
@@ -1127,7 +1095,7 @@ exports.GET_JOB_BY_PK = `query GET_JOB_BY_PK($id: uuid!) {
|
||||
kmout
|
||||
comment
|
||||
referral_source
|
||||
referral_source_extra
|
||||
referral_source_extra
|
||||
unit_number
|
||||
po_number
|
||||
special_coverage_policy
|
||||
@@ -1163,10 +1131,10 @@ exports.GET_JOB_BY_PK = `query GET_JOB_BY_PK($id: uuid!) {
|
||||
est_ct_fn
|
||||
shopid
|
||||
est_ct_ln
|
||||
vehicle{
|
||||
id
|
||||
notes
|
||||
}
|
||||
vehicle {
|
||||
id
|
||||
notes
|
||||
}
|
||||
est_ph1
|
||||
est_ea
|
||||
selling_dealer
|
||||
@@ -1526,19 +1494,17 @@ exports.QUERY_JOB_COSTING_DETAILS_MULTI = ` query QUERY_JOB_COSTING_DETAILS_MULT
|
||||
use_paint_scale_data
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.INSERT_IOEVENT = ` mutation INSERT_IOEVENT($event: ioevents_insert_input!) {
|
||||
insert_ioevents_one(object: $event) {
|
||||
id
|
||||
}
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.GET_AUTOHOUSE_SHOPS = `query GET_AUTOHOUSE_SHOPS {
|
||||
bodyshops(where: {autohouseid: {_is_null: false}}){
|
||||
id
|
||||
bodyshops(where: {autohouseid: {_is_null: false}, _or: {autohouseid: {_neq: ""}}}){
|
||||
id
|
||||
shopname
|
||||
address1
|
||||
city
|
||||
@@ -1554,11 +1520,10 @@ exports.GET_AUTOHOUSE_SHOPS = `query GET_AUTOHOUSE_SHOPS {
|
||||
imexshopid
|
||||
timezone
|
||||
}
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.GET_CLAIMSCORP_SHOPS = `query GET_CLAIMSCORP_SHOPS {
|
||||
bodyshops(where: {claimscorpid: {_is_null: false}}){
|
||||
bodyshops(where: {claimscorpid: {_is_null: false}, _or: {claimscorpid: {_neq: ""}}}){
|
||||
id
|
||||
shopname
|
||||
address1
|
||||
@@ -1575,12 +1540,11 @@ exports.GET_CLAIMSCORP_SHOPS = `query GET_CLAIMSCORP_SHOPS {
|
||||
imexshopid
|
||||
timezone
|
||||
}
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.GET_ENTEGRAL_SHOPS = `query GET_AUTOHOUSE_SHOPS {
|
||||
bodyshops(where: {entegral_id: {_is_null: false}}){
|
||||
id
|
||||
bodyshops(where: {entegral_id: {_is_null: false}, _or: {entegral_id: {_neq: ""}}}){
|
||||
id
|
||||
shopname
|
||||
address1
|
||||
city
|
||||
@@ -1596,22 +1560,19 @@ exports.GET_ENTEGRAL_SHOPS = `query GET_AUTOHOUSE_SHOPS {
|
||||
timezone
|
||||
features
|
||||
}
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.DELETE_ALL_DMS_VEHICLES = `mutation DELETE_ALL_DMS_VEHICLES{
|
||||
delete_dms_vehicles(where: {}) {
|
||||
affected_rows
|
||||
}
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.INSERT_DMS_VEHICLES = `mutation INSERT_DMS_VEHICLES($vehicles: [dms_vehicles_insert_input!]!) {
|
||||
insert_dms_vehicles(objects: $vehicles) {
|
||||
affected_rows
|
||||
}
|
||||
}
|
||||
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.GET_CDK_ALLOCATIONS = `query QUERY_JOB_CLOSE_DETAILS($id: uuid!) {
|
||||
jobs_by_pk(id: $id) {
|
||||
@@ -1728,8 +1689,7 @@ exports.GET_CDK_ALLOCATIONS = `query QUERY_JOB_CLOSE_DETAILS($id: uuid!) {
|
||||
unq_seq
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.GET_QBO_AUTH = `query GET_QBO_AUTH($email: String!) {
|
||||
associations(where: {_and: {active: {_eq: true}, useremail: {_eq: $email}}}){
|
||||
@@ -1743,15 +1703,13 @@ exports.SET_QBO_AUTH_WITH_REALM = `mutation SET_QBO_AUTH($email: String!, $qbo_a
|
||||
update_associations(_set: {qbo_auth: $qbo_auth, qbo_realmId: $qbo_realmId}, where: {_and: {active: {_eq: true}, useremail: {_eq: $email}}}){
|
||||
affected_rows
|
||||
}
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.SET_QBO_AUTH = `mutation SET_QBO_AUTH($email: String!, $qbo_auth: jsonb!) {
|
||||
update_associations(_set: {qbo_auth: $qbo_auth}, where: {_and: {active: {_eq: true}, useremail: {_eq: $email}}}){
|
||||
affected_rows
|
||||
}
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.MARK_JOB_EXPORTED = `
|
||||
mutation MARK_JOB_EXPORTED($jobId: uuid!, $job: jobs_set_input!, $log: exportlog_insert_input!, $bill: bills_set_input!) {
|
||||
@@ -1770,10 +1728,9 @@ mutation MARK_JOB_EXPORTED($jobId: uuid!, $job: jobs_set_input!, $log: exportlog
|
||||
id
|
||||
}
|
||||
update_bills(where:{jobid:{_eq :$jobId}}, _set:$bill){
|
||||
affected_rows
|
||||
affected_rows
|
||||
}
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.MARK_BILLS_EXPORTED = `
|
||||
mutation UPDATE_BILLS($billids: [uuid!]!, $bill: bills_set_input!, $logs: [exportlog_insert_input!]!) {
|
||||
@@ -1785,28 +1742,25 @@ mutation UPDATE_BILLS($billids: [uuid!]!, $bill: bills_set_input!, $logs: [expor
|
||||
}
|
||||
}
|
||||
insert_exportlog(objects: $logs) {
|
||||
returning{
|
||||
id
|
||||
}
|
||||
returning{
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.INSERT_EXPORT_LOG = `
|
||||
mutation INSERT_EXPORT_LOG($log: exportlog_insert_input!) {
|
||||
insert_exportlog_one(object: $log) {
|
||||
id
|
||||
}
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.QUERY_EXISTING_TRANSITION = `
|
||||
mutation INSERT_EXPORT_LOG($log: exportlog_insert_input!) {
|
||||
insert_exportlog_one(object: $log) {
|
||||
id
|
||||
}
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.UPDATE_OLD_TRANSITION = `mutation UPDATE_OLD_TRANSITION($jobid: uuid!, $existingTransition: transitions_set_input!){
|
||||
update_transitions(where:{jobid:{_eq:$jobid}, end:{_is_null:true
|
||||
@@ -1830,9 +1784,7 @@ exports.INSERT_NEW_TRANSITION = `mutation INSERT_NEW_TRANSITION($newTransition:
|
||||
update_transitions(where: {id: {_eq: $oldTransitionId}}, _set: {duration: $duration}) {
|
||||
affected_rows
|
||||
}
|
||||
}
|
||||
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.QUERY_JOB_ID_MIXDATA = `query QUERY_JOB_ID_MIXDATA($roNumbers: [String!]!) {
|
||||
jobs(where: {ro_number: {_in: $roNumbers}}) {
|
||||
@@ -1842,9 +1794,7 @@ exports.QUERY_JOB_ID_MIXDATA = `query QUERY_JOB_ID_MIXDATA($roNumbers: [String!]
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.QBO_MARK_JOB_EXPORTED = `
|
||||
mutation QBO_MARK_JOB_EXPORTED($jobId: uuid!, $job: jobs_set_input!, $logs: [exportlog_insert_input!]!) {
|
||||
@@ -1857,9 +1807,8 @@ mutation QBO_MARK_JOB_EXPORTED($jobId: uuid!, $job: jobs_set_input!, $logs: [exp
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}`;
|
||||
|
||||
`;
|
||||
exports.QBO_MARK_BILL_EXPORTED = `
|
||||
mutation QBO_MARK_BILL_EXPORTED($billId: uuid!, $bill: bills_set_input!, $logs: [exportlog_insert_input!]!) {
|
||||
insert_exportlog(objects: $logs) {
|
||||
@@ -1870,9 +1819,7 @@ mutation QBO_MARK_BILL_EXPORTED($billId: uuid!, $bill: bills_set_input!, $logs:
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.QBO_MARK_PAYMENT_EXPORTED = `
|
||||
mutation QBO_MARK_PAYMENT_EXPORTED($paymentId: uuid!, $payment: payments_set_input!, $logs: [exportlog_insert_input!]!) {
|
||||
@@ -1887,19 +1834,17 @@ mutation QBO_MARK_PAYMENT_EXPORTED($paymentId: uuid!, $payment: payments_set_inp
|
||||
}`;
|
||||
|
||||
exports.INSERT_EXPORT_LOG = `
|
||||
mutation INSERT_EXPORT_LOG($logs: [exportlog_insert_input!]!) {
|
||||
insert_exportlog(objects: $logs) {
|
||||
affected_rows
|
||||
}
|
||||
mutation INSERT_EXPORT_LOG($logs: [exportlog_insert_input!]!) {
|
||||
insert_exportlog(objects: $logs) {
|
||||
affected_rows
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.INSERT_EMAIL_AUDIT = `mutation INSERT_EMAIL_AUDIT($email: email_audit_trail_insert_input!) {
|
||||
insert_email_audit_trail_one(object: $email) {
|
||||
id
|
||||
}
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.DELETE_MEDIA_DOCUMENTS = `
|
||||
mutation DELETE_DOCUMENTS($ids: [uuid!]!) {
|
||||
@@ -1908,8 +1853,7 @@ mutation DELETE_DOCUMENTS($ids: [uuid!]!) {
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.UPDATE_EMAIL_AUDIT = `
|
||||
mutation ($sesid: String!, $status: String, $context: jsonb) {
|
||||
@@ -1961,8 +1905,7 @@ query GET_PBS_AP_ALLOCATIONS($billids: [uuid!]) {
|
||||
quantity
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.QUERY_PARTS_SCAN = `query QUERY_PARTS_SCAN ($id: uuid!) {
|
||||
jobs_by_pk(id: $id) {
|
||||
@@ -1976,8 +1919,7 @@ exports.QUERY_PARTS_SCAN = `query QUERY_PARTS_SCAN ($id: uuid!) {
|
||||
critical
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
exports.UPDATE_PARTS_CRITICAL = `mutation UPDATE_PARTS_CRITICAL ($IdsToMarkCritical:[uuid!]!, $jobid: uuid!){
|
||||
critical: update_joblines(where:{id:{_in:$IdsToMarkCritical}}, _set:{critical: true}){
|
||||
@@ -1993,5 +1935,4 @@ exports.ACTIVE_SHOP_BY_USER = `query ACTIVE_SHOP_BY_USER($user: String) {
|
||||
id
|
||||
shopid
|
||||
}
|
||||
}
|
||||
`;
|
||||
}`;
|
||||
|
||||
Reference in New Issue
Block a user