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 d2d0d928a..d50c17433 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 @@ -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"); @@ -316,7 +316,7 @@ 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/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/job-search-select/job-search-select.component.jsx b/client/src/components/job-search-select/job-search-select.component.jsx index 180fb93dc..64ca39e07 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,7 @@ const JobSearchSelect = ( useLazyQuery(SEARCH_JOBS_BY_ID_FOR_AUTOCOMPLETE); const executeSearch = (v) => { - if (v && v !== "") callSearch(v); + if (v && v !== "" && v.length >= 3) callSearch(v); }; const debouncedExecuteSearch = _.debounce(executeSearch, 500); 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..c243e313e 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,7 @@ const OwnerSearchSelect = ({ value, onChange, onBlur, disabled }, ref) => { useLazyQuery(SEARCH_OWNERS_BY_ID_FOR_AUTOCOMPLETE); const executeSearch = (v) => { - callSearch(v); + if (v && v !== "" && v.length >= 3) 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/vehicle-search-select/vehicle-search-select.component.jsx b/client/src/components/vehicle-search-select/vehicle-search-select.component.jsx index 4d8d49894..8f187b77b 100644 --- a/client/src/components/vehicle-search-select/vehicle-search-select.component.jsx +++ b/client/src/components/vehicle-search-select/vehicle-search-select.component.jsx @@ -22,7 +22,7 @@ const VehicleSearchSelect = ({ value, onChange, onBlur, disabled }, ref) => { ] = useLazyQuery(SEARCH_VEHICLES_BY_ID_FOR_AUTOCOMPLETE); const executeSearch = (v) => { - callSearch(v); + if (v && v !== "" && v.length >= 3) callSearch(v); }; const debouncedExecuteSearch = _.debounce(executeSearch, 500); diff --git a/client/src/graphql/bills.queries.js b/client/src/graphql/bills.queries.js index 6406edfe1..07e1a3cc9 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 60846e2fa..ad965bd74 100644 --- a/client/src/graphql/jobs.queries.js +++ b/client/src/graphql/jobs.queries.js @@ -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 } 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/translations/en_us/common.json b/client/src/translations/en_us/common.json index 43321060f..978bc7ccd 100644 --- a/client/src/translations/en_us/common.json +++ b/client/src/translations/en_us/common.json @@ -2565,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", diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json index 11e00e638..c687b79d5 100644 --- a/client/src/translations/es/common.json +++ b/client/src/translations/es/common.json @@ -2565,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": "", diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json index c386076df..d11d96044 100644 --- a/client/src/translations/fr/common.json +++ b/client/src/translations/fr/common.json @@ -2565,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": "", 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 3467027c6..cc1c4011a 100644 --- a/client/src/utils/TemplateConstants.js +++ b/client/src/utils/TemplateConstants.js @@ -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"