diff --git a/client/src/components/bill-enter-modal/bill-enter-modal.container.jsx b/client/src/components/bill-enter-modal/bill-enter-modal.container.jsx index 3fc134ce5..5377278ba 100644 --- a/client/src/components/bill-enter-modal/bill-enter-modal.container.jsx +++ b/client/src/components/bill-enter-modal/bill-enter-modal.container.jsx @@ -38,8 +38,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"); @@ -167,7 +167,7 @@ function BillEnterModalContainer({ }, ], }, - refetchQueries: ["QUERY_PARTS_BILLS_BY_JOBID"], + refetchQueries: ["QUERY_PARTS_BILLS_BY_JOBID", "GET_JOB_BY_PK"], }); await Promise.all( @@ -354,7 +354,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) { diff --git a/client/src/components/chat-open-button/chat-open-button.component.jsx b/client/src/components/chat-open-button/chat-open-button.component.jsx index ce357a962..71c037002 100644 --- a/client/src/components/chat-open-button/chat-open-button.component.jsx +++ b/client/src/components/chat-open-button/chat-open-button.component.jsx @@ -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 { diff --git a/client/src/components/courtesy-cars-list/courtesy-cars-list.component.jsx b/client/src/components/courtesy-cars-list/courtesy-cars-list.component.jsx index e16875af3..b2e3059f6 100644 --- a/client/src/components/courtesy-cars-list/courtesy-cars-list.component.jsx +++ b/client/src/components/courtesy-cars-list/courtesy-cars-list.component.jsx @@ -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", diff --git a/client/src/components/email-overlay/email-overlay.container.jsx b/client/src/components/email-overlay/email-overlay.container.jsx index 6c469c2d9..706fa6211 100644 --- a/client/src/components/email-overlay/email-overlay.container.jsx +++ b/client/src/components/email-overlay/email-overlay.container.jsx @@ -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") }); diff --git a/client/src/components/job-lines-bill-reference/job-lines-bill-reference.component.jsx b/client/src/components/job-lines-bill-reference/job-lines-bill-reference.component.jsx index 7866d88fa..e3b2ea5ae 100644 --- a/client/src/components/job-lines-bill-reference/job-lines-bill-reference.component.jsx +++ b/client/src/components/job-lines-bill-reference/job-lines-bill-reference.component.jsx @@ -8,7 +8,7 @@ export default function JobLinesBillRefernece({ jobline }) { return (
{subletRequired && } - {`${(billLine.actual_price * billLine.quantity).toFixed(2)} (${ + {`${billLine.actual_price.toFixed(2)} x ${billLine.quantity} (${ billLine.bill.vendor.name } #${billLine.bill.invoice_number})`}
diff --git a/client/src/components/job-search-select/job-search-select.component.jsx b/client/src/components/job-search-select/job-search-select.component.jsx index 180fb93dc..0ec418bca 100644 --- a/client/src/components/job-search-select/job-search-select.component.jsx +++ b/client/src/components/job-search-select/job-search-select.component.jsx @@ -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); diff --git a/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.external.component.jsx b/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.external.component.jsx index ce8622713..19e18be1e 100644 --- a/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.external.component.jsx +++ b/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.external.component.jsx @@ -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; }, []) diff --git a/client/src/components/labor-allocations-table/labor-allocations-table.component.jsx b/client/src/components/labor-allocations-table/labor-allocations-table.component.jsx index 3c264dafc..83f99d867 100644 --- a/client/src/components/labor-allocations-table/labor-allocations-table.component.jsx +++ b/client/src/components/labor-allocations-table/labor-allocations-table.component.jsx @@ -231,7 +231,14 @@ export function LaborAllocationsTable({ {summary.adjustments.toFixed(1)} - {summary.difference.toFixed(1)} + = 0 ? "green" : "red", + }} + > + {summary.difference.toFixed(1)} + )} diff --git a/client/src/components/owner-search-select/owner-search-select.component.jsx b/client/src/components/owner-search-select/owner-search-select.component.jsx index 85e4d9833..a9b956568 100644 --- a/client/src/components/owner-search-select/owner-search-select.component.jsx +++ b/client/src/components/owner-search-select/owner-search-select.component.jsx @@ -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); diff --git a/client/src/components/owners-list/owners-list.component.jsx b/client/src/components/owners-list/owners-list.component.jsx index 78e2c3cb3..d4c5f7e5c 100644 --- a/client/src/components/owners-list/owners-list.component.jsx +++ b/client/src/components/owners-list/owners-list.component.jsx @@ -106,7 +106,11 @@ export default function OwnersListComponent({ { - search.search = value; + if (value?.length >= 3) { + search.search = value; + } else { + delete search.search; + } history.push({ search: queryString.stringify(search) }); }} enterButton diff --git a/client/src/components/production-list-columns/production-list-columns.data.js b/client/src/components/production-list-columns/production-list-columns.data.js index fe9d8c7bb..426dbb6ed 100644 --- a/client/src/components/production-list-columns/production-list-columns.data.js +++ b/client/src/components/production-list-columns/production-list-columns.data.js @@ -480,8 +480,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) => ( { 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) => ( { 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) => ( @@ -533,9 +533,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) => ( diff --git a/client/src/components/production-list-table/production-list-print.component.jsx b/client/src/components/production-list-table/production-list-print.component.jsx index 4e31b33d0..547819061 100644 --- a/client/src/components/production-list-table/production-list-print.component.jsx +++ b/client/src/components/production-list-table/production-list-print.component.jsx @@ -55,25 +55,27 @@ export function ProductionListPrint({ bodyshop }) { - {bodyshop.employees.map((e) => ( - { - setLoading(true); - await GenerateDocument( - { - name: production_by_technician_one.key, - variables: { id: e.id }, - }, - {}, - "p" - ); - setLoading(false); - }} - > - {e.first_name} {e.last_name} - - ))} + {bodyshop.employees + .filter((e) => e.active) + .map((e) => ( + { + setLoading(true); + await GenerateDocument( + { + name: production_by_technician_one.key, + variables: { id: e.id }, + }, + {}, + "p" + ); + setLoading(false); + }} + > + {e.first_name} {e.last_name} + + ))} { 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); diff --git a/client/src/graphql/bills.queries.js b/client/src/graphql/bills.queries.js index de11c4265..dc0ac37f9 100644 --- a/client/src/graphql/bills.queries.js +++ b/client/src/graphql/bills.queries.js @@ -5,6 +5,7 @@ export const INSERT_NEW_BILL = gql` insert_bills(objects: $bill) { returning { id + invoice_number } } } diff --git a/client/src/graphql/jobs.queries.js b/client/src/graphql/jobs.queries.js index 4d656858f..c958d88af 100644 --- a/client/src/graphql/jobs.queries.js +++ b/client/src/graphql/jobs.queries.js @@ -1298,7 +1298,7 @@ export const SEARCH_JOBS_FOR_AUTOCOMPLETE = gql` ) { search_jobs( args: { search: $search } - limit: 50 + limit: 25 where: { _and: { converted: { _eq: $isConverted } diff --git a/client/src/graphql/owners.queries.js b/client/src/graphql/owners.queries.js index a4e5d1c80..ea0062cd5 100644 --- a/client/src/graphql/owners.queries.js +++ b/client/src/graphql/owners.queries.js @@ -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 diff --git a/client/src/graphql/vehicles.queries.js b/client/src/graphql/vehicles.queries.js index 9df3c4238..619ff8961 100644 --- a/client/src/graphql/vehicles.queries.js +++ b/client/src/graphql/vehicles.queries.js @@ -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 diff --git a/client/src/redux/messaging/messaging.reducer.js b/client/src/redux/messaging/messaging.reducer.js index e43bad872..d70048c5b 100644 --- a/client/src/redux/messaging/messaging.reducer.js +++ b/client/src/redux/messaging/messaging.reducer.js @@ -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: diff --git a/client/src/redux/messaging/messaging.sagas.js b/client/src/redux/messaging/messaging.sagas.js index f2684a171..9016047aa 100644 --- a/client/src/redux/messaging/messaging.sagas.js +++ b/client/src/redux/messaging/messaging.sagas.js @@ -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); diff --git a/client/src/redux/messaging/messaging.selectors.js b/client/src/redux/messaging/messaging.selectors.js index c46c20d74..84038cee7 100644 --- a/client/src/redux/messaging/messaging.selectors.js +++ b/client/src/redux/messaging/messaging.selectors.js @@ -26,3 +26,8 @@ export const selectMessage = createSelector( [selectMessaging], (messaging) => messaging.message ); + +export const searchingForConversation = createSelector( + [selectMessaging], + (messaging) => messaging.searchingForConversation +); diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json index df19c73d3..f98029cea 100644 --- a/client/src/translations/en_us/common.json +++ b/client/src/translations/en_us/common.json @@ -2660,18 +2660,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", diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json index cdc049ce3..a7a52d817 100644 --- a/client/src/translations/es/common.json +++ b/client/src/translations/es/common.json @@ -2660,18 +2660,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": "", diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json index 26d8ef275..0c08163c7 100644 --- a/client/src/translations/fr/common.json +++ b/client/src/translations/fr/common.json @@ -2660,18 +2660,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": "", diff --git a/client/src/utils/RenderTemplate.js b/client/src/utils/RenderTemplate.js index f103111cf..8cb4691fe 100644 --- a/client/src/utils/RenderTemplate.js +++ b/client/src/utils/RenderTemplate.js @@ -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, }, }; diff --git a/client/src/utils/TemplateConstants.js b/client/src/utils/TemplateConstants.js index 4f649d0e2..79e9a4945 100644 --- a/client/src/utils/TemplateConstants.js +++ b/client/src/utils/TemplateConstants.js @@ -907,6 +907,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" diff --git a/hasura/metadata/tables.yaml b/hasura/metadata/tables.yaml index 9b19c1777..701637a9c 100644 --- a/hasura/metadata/tables.yaml +++ b/hasura/metadata/tables.yaml @@ -4076,12 +4076,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 @@ -4097,23 +4092,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 diff --git a/server/data/autohouse.js b/server/data/autohouse.js index c0af1cef3..3ae74d6db 100644 --- a/server/data/autohouse.js +++ b/server/data/autohouse.js @@ -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") }), } ); diff --git a/server/data/claimscorp.js b/server/data/claimscorp.js index 50e49fd91..a854ff84f 100644 --- a/server/data/claimscorp.js +++ b/server/data/claimscorp.js @@ -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,7 +102,7 @@ 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( "YYYYMMDDTHHMMss" @@ -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 @@ -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) @@ -392,9 +394,7 @@ 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( @@ -446,6 +446,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" @@ -486,11 +487,11 @@ const CreateRepairOrderTag = (job, errorCallback) => { .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 + diff --git a/server/graphql-client/queries.js b/server/graphql-client/queries.js index b46a1a2ed..de50f7d93 100644 --- a/server/graphql-client/queries.js +++ b/server/graphql-client/queries.js @@ -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!]!) { @@ -230,7 +211,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 @@ -260,8 +241,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!) { @@ -321,19 +301,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 @@ -348,9 +328,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!) { @@ -413,24 +391,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 @@ -447,9 +425,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!]!) { @@ -493,18 +469,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 @@ -512,15 +487,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 @@ -528,7 +502,7 @@ exports.QUERY_PAYMENTS_FOR_EXPORT = ` ownr_fn ownr_ln ownr_co_nm - bodyshop{ + bodyshop { accountingconfig md_responsibility_centers md_ins_cos @@ -545,8 +519,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) { @@ -646,8 +619,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}}}) { @@ -838,8 +810,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){ @@ -1011,8 +982,7 @@ exports.CLAIMSCORP_QUERY = `query CLAIMSCORP_EXPORT($start: timestamptz, $bodysh totalliquidcost } } -} -`; +}`; exports.ENTEGRAL_EXPORT = ` query ENTEGRAL_EXPORT($bodyshopid: uuid!) { @@ -1101,8 +1071,7 @@ query ENTEGRAL_EXPORT($bodyshopid: uuid!) { cieca_ttl adjustment_bottom_line } -} -`; +}`; exports.UPDATE_JOB = ` mutation UPDATE_JOB($jobId: uuid!, $job: jobs_set_input!) { @@ -1117,8 +1086,7 @@ exports.UPDATE_JOB = ` lbr_adjustments } } - } -`; + }`; exports.GET_JOB_BY_PK = `query GET_JOB_BY_PK($id: uuid!) { jobs_by_pk(id: $id) { @@ -1131,7 +1099,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 @@ -1170,6 +1138,10 @@ exports.GET_JOB_BY_PK = `query GET_JOB_BY_PK($id: uuid!) { cieca_pfl cieca_pft cieca_pfo + vehicle { + id + notes + } est_ph1 est_ea selling_dealer @@ -1518,19 +1490,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 @@ -1546,11 +1516,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 @@ -1567,12 +1536,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 @@ -1588,22 +1556,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) { @@ -1720,8 +1685,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}}}){ @@ -1735,15 +1699,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!) { @@ -1762,10 +1724,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!]!) { @@ -1777,28 +1738,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 @@ -1822,9 +1780,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}}) { @@ -1834,9 +1790,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!]!) { @@ -1849,9 +1803,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) { @@ -1862,9 +1815,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!]!) { @@ -1879,19 +1830,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!]!) { @@ -1900,8 +1849,7 @@ mutation DELETE_DOCUMENTS($ids: [uuid!]!) { id } } -} -`; +}`; exports.UPDATE_EMAIL_AUDIT = ` mutation ($sesid: String!, $status: String, $context: jsonb) { @@ -1953,8 +1901,7 @@ query GET_PBS_AP_ALLOCATIONS($billids: [uuid!]) { quantity } } -} -`; +}`; exports.GET_JOB_FOR_PPC = `query GET_JOB_FOR_PPC($jobid: uuid!) { jobs_by_pk(id: $jobid) { @@ -1986,8 +1933,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}){