Compare commits

...

24 Commits

Author SHA1 Message Date
Allan Carr
ab84cb5ada IO-2419 Correct for Cloudinary to include fullsize on send 2023-10-23 12:32:32 -07:00
Allan Carr
02fd8097a8 IO-2419 Thumbnails being emailed instead of Full Size Image 2023-10-19 09:30:29 -07:00
Patrick Fic
e7c3be5231 Merged in release/2023-09-23 (pull request #1011)
Fix search select issues.
2023-10-16 17:24:46 +00:00
Patrick Fic
85e3c5a433 Fix search select issues. 2023-10-16 10:24:16 -07:00
Patrick Fic
636c13373c Merged in release/2023-09-23 (pull request #1009)
Release/2023 09 23
2023-10-16 16:19:04 +00:00
Patrick Fic
3659fbec84 Merged in 2023-09-29 (pull request #1004)
2023 09 29
2023-10-13 14:53:24 +00:00
Allan Carr
5884d5eba0 Merged in feature/IO-1559-ClaimsCorp-Datapump (pull request #1005)
IO-1559 Adjust count object to new field tag
2023-10-12 21:52:54 +00:00
Allan Carr
05f1a9b280 IO-1559 Adjust count object to new field tag 2023-10-12 14:54:58 -07:00
Allan Carr
4dd2137006 IO-1559 Change xml label as per Claimscorp 2023-10-12 11:24:24 -07:00
Allan Carr
03315836a6 Merged in feature/IO-1559-ClaimsCorp-Datapump (pull request #1002)
IO-1559 Change xml label as per Claimscorp
2023-10-12 18:23:39 +00:00
Patrick Fic
f703ba2cf9 Disable unnecessary events for Hasura. 2023-09-29 12:36:29 -07:00
Patrick Fic
dc05e4e166 Add CIECA PFO object to job. 2023-09-26 12:58:33 -07:00
Allan Carr
612e359d4c Merged in feature/IO-2408-Speedprint-TZ (pull request #990)
IO-2408 Remove unneeded library
2023-09-22 18:50:13 +00:00
Allan Carr
c8fb1ce302 IO-2408 Remove unneeded library 2023-09-22 11:51:41 -07:00
Allan Carr
b29d8e1912 IO-2408 Use bodyshop.timezone instead of UTCOffset in Speedprint 2023-09-22 11:34:09 -07:00
Allan Carr
74b6c2b6b5 Merged in feature/IO-2408-Speedprint-TZ (pull request #988)
IO-2408 Use bodyshop.timezone instead of UTCOffset in Speedprint
2023-09-22 18:33:25 +00:00
Allan Carr
fce8039dad Merged in feature/IO-2400-Courtesy-Car-Color-All-Cars (pull request #986)
IO-2400 Add Color column to All Courtesy Cars
2023-09-22 15:27:13 +00:00
Allan Carr
085ae141ae Merged in feature/IO-2407-InHouse-Audit-Log (pull request #984)
IO-2407 In House Invoice Audit Log correction for Invoice Number
2023-09-22 15:27:02 +00:00
Allan Carr
fbc9ccc018 Merged in feature/IO-2363-Labour-Allocation-Summary-Color-Coding (pull request #985)
IO-2363 Make Summary.Difference follow Color logic
2023-09-22 15:26:47 +00:00
Allan Carr
f2ede519d7 Merged in feature/IO-2398-Hours-Sold-By-Estimator (pull request #983)
IO-2398 Hours Sold by Estimator
2023-09-22 15:26:39 +00:00
Allan Carr
21c53473d3 IO-2400 Add Color column to All Courtesy Cars 2023-09-20 15:58:48 -07:00
Allan Carr
fbc622fa04 IO-2363 Make Summary.Difference follow Color logic 2023-09-20 14:30:53 -07:00
Allan Carr
c998e4901f IO-2398 Hours Sold by Estimator 2023-09-18 18:25:05 -07:00
Patrick Fic
06c35a4ff8 Add additonal query limits and restrictors for performance. 2023-09-18 16:08:20 -07:00
21 changed files with 134 additions and 45 deletions

View File

@@ -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",

View File

@@ -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") });

View File

@@ -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);

View File

@@ -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,

View File

@@ -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;
}, [])

View File

@@ -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>
)}

View File

@@ -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);

View File

@@ -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

View File

@@ -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);

View File

@@ -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 }

View File

@@ -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

View File

@@ -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

View File

@@ -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",

View File

@@ -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": "",

View File

@@ -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": "",

View File

@@ -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,
},
};

View File

@@ -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"

View File

@@ -3274,6 +3274,7 @@
- cat_no
- category
- cieca_pfl
- cieca_pfo
- cieca_pft
- cieca_stl
- cieca_ttl
@@ -3542,6 +3543,7 @@
- cat_no
- category
- cieca_pfl
- cieca_pfo
- cieca_pft
- cieca_stl
- cieca_ttl
@@ -3821,6 +3823,7 @@
- cat_no
- category
- cieca_pfl
- cieca_pfo
- cieca_pft
- cieca_stl
- cieca_ttl
@@ -4073,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
@@ -4094,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

View File

@@ -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();

View File

@@ -0,0 +1,2 @@
alter table "public"."jobs" add column "cieca_pfo" jsonb
null default jsonb_build_object();

View File

@@ -67,7 +67,7 @@ exports.default = async (req, res) => {
);
const claimsCorpObject = {
ClaimsCorpExport: {
DataFeed: {
ShopID: bodyshops_by_pk.claimscorpid,
ShopName: bodyshops_by_pk.shopname,
RO: jobs.map((j) =>
@@ -100,7 +100,7 @@ exports.default = async (req, res) => {
.end({ allowEmptyTags: true });
allxmlsToUpload.push({
count: claimsCorpObject.ClaimsCorpExport.RO.length,
count: claimsCorpObject.DataFeed.RO.length,
xml: ret,
filename: `${bodyshop.claimscorpid}-MIS-${moment().format(
"YYYYMMDDTHHMMss"