From d646e5f285153609a69437de570f83adf80e1b29 Mon Sep 17 00:00:00 2001 From: swtmply Date: Wed, 16 Aug 2023 11:43:21 +0800 Subject: [PATCH 1/9] IO-2380 added part number and price --- .../parts-order-list-table.component.jsx | 2 ++ .../parts-receive-modal.component.jsx | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/client/src/components/parts-order-list-table/parts-order-list-table.component.jsx b/client/src/components/parts-order-list-table/parts-order-list-table.component.jsx index ffb95adcc..e27d6ee4f 100644 --- a/client/src/components/parts-order-list-table/parts-order-list-table.component.jsx +++ b/client/src/components/parts-order-list-table/parts-order-list-table.component.jsx @@ -113,6 +113,8 @@ export function PartsOrderListTableComponent({ id: pol.id, line_desc: pol.line_desc, quantity: pol.quantity, + act_price: pol.act_price, + oem_partno: pol.oem_partno, }; }), }, diff --git a/client/src/components/parts-receive-modal/parts-receive-modal.component.jsx b/client/src/components/parts-receive-modal/parts-receive-modal.component.jsx index 92aaffd56..e707b234c 100644 --- a/client/src/components/parts-receive-modal/parts-receive-modal.component.jsx +++ b/client/src/components/parts-receive-modal/parts-receive-modal.component.jsx @@ -66,6 +66,13 @@ export function PartsReceiveModalComponent({ bodyshop, form }) { + + + + + + Date: Thu, 17 Aug 2023 06:15:46 +0800 Subject: [PATCH 2/9] IO-2380 added translation to fields --- .../parts-receive-modal.component.jsx | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/client/src/components/parts-receive-modal/parts-receive-modal.component.jsx b/client/src/components/parts-receive-modal/parts-receive-modal.component.jsx index e707b234c..2fe6ac418 100644 --- a/client/src/components/parts-receive-modal/parts-receive-modal.component.jsx +++ b/client/src/components/parts-receive-modal/parts-receive-modal.component.jsx @@ -66,13 +66,6 @@ export function PartsReceiveModalComponent({ bodyshop, form }) { - - - + + + + + + - - - Date: Wed, 16 Aug 2023 17:25:32 -0700 Subject: [PATCH 3/9] IO-2383 TimeTicket Employee Range Filter --- client/src/utils/TemplateConstants.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/client/src/utils/TemplateConstants.js b/client/src/utils/TemplateConstants.js index 519624aad..3467027c6 100644 --- a/client/src/utils/TemplateConstants.js +++ b/client/src/utils/TemplateConstants.js @@ -1135,6 +1135,10 @@ export const TemplateList = (type, context) => { key: "timetickets_employee", idtype: "employee", disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.timetickets"), + field: i18n.t("timetickets.fields.date"), + }, group: "payroll", }, attendance_detail: { From 9c408d8bf5e558f04ec7e7c40b6cdefcefbf49c8 Mon Sep 17 00:00:00 2001 From: Allan Carr Date: Wed, 16 Aug 2023 18:37:19 -0700 Subject: [PATCH 4/9] IO-2381 Disabled Cancel Appt Button --- .../schedule-event.component.jsx | 80 +++++++------ .../jobs-detail-header-actions.component.jsx | 112 +++++++++--------- 2 files changed, 103 insertions(+), 89 deletions(-) diff --git a/client/src/components/job-at-change/schedule-event.component.jsx b/client/src/components/job-at-change/schedule-event.component.jsx index 612f03421..890786d40 100644 --- a/client/src/components/job-at-change/schedule-event.component.jsx +++ b/client/src/components/job-at-change/schedule-event.component.jsx @@ -29,11 +29,11 @@ import { GenerateDocument } from "../../utils/RenderTemplate"; import { TemplateList } from "../../utils/TemplateConstants"; import ChatOpenButton from "../chat-open-button/chat-open-button.component"; import DataLabel from "../data-label/data-label.component"; +import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; import ScheduleManualEvent from "../schedule-manual-event/schedule-manual-event.component"; import ScheduleAtChange from "./job-at-change.component"; import ScheduleEventColor from "./schedule-event.color.component"; import ScheduleEventNote from "./schedule-event.note.component"; -import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, @@ -208,46 +208,56 @@ export function ScheduleEventComponent({ ) : null} - { - handleCancel({ id: event.id, lost_sale_reason }); - }} - > - - ({ + label: lsr, + value: lsr, + }))} + /> + + + + } + > + + + )} + {event.isintake ? ( + + } + > + {t("menus.jobsactions.cancelallappointments")} + + )} Date: Thu, 17 Aug 2023 09:32:32 -0700 Subject: [PATCH 5/9] IO-2247 Don't push manual appointments into component if they don't have a job associated. --- .../scheduled-in-today.component.jsx | 69 +++++++++++-------- 1 file changed, 39 insertions(+), 30 deletions(-) diff --git a/client/src/components/dashboard-components/scheduled-in-today/scheduled-in-today.component.jsx b/client/src/components/dashboard-components/scheduled-in-today/scheduled-in-today.component.jsx index 87d1980a1..fca46457a 100644 --- a/client/src/components/dashboard-components/scheduled-in-today/scheduled-in-today.component.jsx +++ b/client/src/components/dashboard-components/scheduled-in-today/scheduled-in-today.component.jsx @@ -23,36 +23,40 @@ export default function DashboardScheduledInToday({ data, ...cardProps }) { const appt = []; // Flatten Data data.scheduled_in_today.forEach((item) => { - var i = { - canceled: item.canceled, - id: item.id, - alt_transport: item.job.alt_transport, - clm_no: item.job.clm_no, - jobid: item.job.jobid, - ins_co_nm: item.job.ins_co_nm, - iouparent: item.job.iouparent, - ownerid: item.job.ownerid, - ownr_co_nm: item.job.ownr_co_nm, - ownr_ea: item.job.ownr_ea, - ownr_fn: item.job.ownr_fn, - ownr_ln: item.job.ownr_ln, - ownr_ph1: item.job.ownr_ph1, - ownr_ph2: item.job.ownr_ph2, - production_vars: item.job.production_vars, - ro_number: item.job.ro_number, - suspended: item.job.suspended, - v_make_desc: item.job.v_make_desc, - v_model_desc: item.job.v_model_desc, - v_model_yr: item.job.v_model_yr, - v_vin: item.job.v_vin, - vehicleid: item.job.vehicleid, - note: item.note, - start: moment(item.start).format("hh:mm a"), - title: item.title, - }; - appt.push(i); + if (item.job) { + var i = { + canceled: item.canceled, + id: item.id, + alt_transport: item.job.alt_transport, + clm_no: item.job.clm_no, + jobid: item.job.jobid, + ins_co_nm: item.job.ins_co_nm, + iouparent: item.job.iouparent, + ownerid: item.job.ownerid, + ownr_co_nm: item.job.ownr_co_nm, + ownr_ea: item.job.ownr_ea, + ownr_fn: item.job.ownr_fn, + ownr_ln: item.job.ownr_ln, + ownr_ph1: item.job.ownr_ph1, + ownr_ph2: item.job.ownr_ph2, + production_vars: item.job.production_vars, + ro_number: item.job.ro_number, + suspended: item.job.suspended, + v_make_desc: item.job.v_make_desc, + v_model_desc: item.job.v_model_desc, + v_model_yr: item.job.v_model_yr, + v_vin: item.job.v_vin, + vehicleid: item.job.vehicleid, + note: item.note, + start: moment(item.start).format("hh:mm a"), + title: item.title, + }; + appt.push(i); + } + }); + appt.sort(function (a, b) { + return new moment(a.start) - new moment(b.start); }); - appt.sort ( function (a, b) { return new Date(a.start) - new Date(b.start); }); const columns = [ { @@ -182,7 +186,12 @@ export default function DashboardScheduledInToday({ data, ...cardProps }) { }; return ( - +
Date: Thu, 17 Aug 2023 16:05:33 -0700 Subject: [PATCH 6/9] IO-2384 Default Sort Order for Related Jobs --- .../owner-detail-jobs.component.jsx | 23 +++++++++++++++++++ client/src/graphql/owners.queries.js | 2 +- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/client/src/components/owner-detail-jobs/owner-detail-jobs.component.jsx b/client/src/components/owner-detail-jobs/owner-detail-jobs.component.jsx index c69712a0b..aae0633e1 100644 --- a/client/src/components/owner-detail-jobs/owner-detail-jobs.component.jsx +++ b/client/src/components/owner-detail-jobs/owner-detail-jobs.component.jsx @@ -6,6 +6,7 @@ import { Link } from "react-router-dom"; import { createStructuredSelector } from "reselect"; import { selectBodyshop } from "../../redux/user/user.selectors"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; +import { alphaSort, statusSort } from "../../utils/sorters"; import OwnerDetailUpdateJobsComponent from "../owner-detail-update-jobs/owner-detail-update-jobs.component"; const mapStateToProps = createStructuredSelector({ @@ -15,6 +16,15 @@ const mapStateToProps = createStructuredSelector({ function OwnerDetailJobsComponent({ bodyshop, owner }) { const { t } = useTranslation(); const [selectedJobs, setSelectedJobs] = useState([]); + const [state, setState] = useState({ + sortedInfo: {}, + filteredInfo: { text: "" }, + }); + + const handleTableChange = (pagination, filters, sorter) => { + setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); + }; + const columns = [ { title: t("jobs.fields.ro_number"), @@ -26,6 +36,9 @@ function OwnerDetailJobsComponent({ bodyshop, owner }) { {record.ro_number || t("general.labels.na")} ), + sorter: (a, b) => alphaSort(a.ro_number, b.ro_number), + sortOrder: + state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, }, { title: t("jobs.fields.vehicle"), @@ -46,11 +59,17 @@ function OwnerDetailJobsComponent({ bodyshop, owner }) { title: t("jobs.fields.clm_no"), dataIndex: "clm_no", key: "clm_no", + sorter: (a, b) => alphaSort(a.clm_no, b.clm_no), + sortOrder: + state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order, }, { title: t("jobs.fields.status"), dataIndex: "status", key: "status", + sorter: (a, b) => statusSort(a.status, b.status), + sortOrder: + state.sortedInfo.columnKey === "status" && state.sortedInfo.order, }, { @@ -60,6 +79,9 @@ function OwnerDetailJobsComponent({ bodyshop, owner }) { render: (text, record) => ( {record.clm_total} ), + sorter: (a, b) => a.clm_total - b.clm_total, + sortOrder: + state.sortedInfo.columnKey === "clm_total" && state.sortedInfo.order, }, ]; @@ -80,6 +102,7 @@ function OwnerDetailJobsComponent({ bodyshop, owner }) { scroll={{ x: true }} rowKey="id" dataSource={owner.jobs} + onChange={handleTableChange} rowSelection={{ onSelect: (record, selected, selectedRows) => { setSelectedJobs(selectedRows ? selectedRows.map((i) => i.id) : []); diff --git a/client/src/graphql/owners.queries.js b/client/src/graphql/owners.queries.js index 440dc3011..7dee25738 100644 --- a/client/src/graphql/owners.queries.js +++ b/client/src/graphql/owners.queries.js @@ -69,7 +69,7 @@ export const QUERY_OWNER_BY_ID = gql` preferred_contact note tax_number - jobs { + jobs(order_by: {date_open: desc}) { id ro_number clm_no From 10fceb7ddfad2d37a47e4757524c54d2e06af120 Mon Sep 17 00:00:00 2001 From: Allan Carr Date: Thu, 17 Aug 2023 16:18:56 -0700 Subject: [PATCH 7/9] IO-2384 Extend to Vehicle Related ROs --- .../owner-detail-jobs.component.jsx | 2 +- .../vehicle-detail-jobs.component.jsx | 24 ++++++++++++++++++- client/src/graphql/owners.queries.js | 2 +- client/src/graphql/vehicles.queries.js | 3 +-- 4 files changed, 26 insertions(+), 5 deletions(-) diff --git a/client/src/components/owner-detail-jobs/owner-detail-jobs.component.jsx b/client/src/components/owner-detail-jobs/owner-detail-jobs.component.jsx index aae0633e1..360954101 100644 --- a/client/src/components/owner-detail-jobs/owner-detail-jobs.component.jsx +++ b/client/src/components/owner-detail-jobs/owner-detail-jobs.component.jsx @@ -67,7 +67,7 @@ function OwnerDetailJobsComponent({ bodyshop, owner }) { title: t("jobs.fields.status"), dataIndex: "status", key: "status", - sorter: (a, b) => statusSort(a.status, b.status), + sorter: (a, b) => statusSort(a.status, b.status, bodyshop.md_ro_statuses.statuses), sortOrder: state.sortedInfo.columnKey === "status" && state.sortedInfo.order, }, diff --git a/client/src/components/vehicle-detail-jobs/vehicle-detail-jobs.component.jsx b/client/src/components/vehicle-detail-jobs/vehicle-detail-jobs.component.jsx index 490e2b5ba..403d223bf 100644 --- a/client/src/components/vehicle-detail-jobs/vehicle-detail-jobs.component.jsx +++ b/client/src/components/vehicle-detail-jobs/vehicle-detail-jobs.component.jsx @@ -6,8 +6,9 @@ import { Link } from "react-router-dom"; import { createStructuredSelector } from "reselect"; import { selectBodyshop } from "../../redux/user/user.selectors"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; -import VehicleDetailUpdateJobsComponent from "../vehicle-detail-update-jobs/vehicle-detail-update-jobs.component"; +import { alphaSort, statusSort } from "../../utils/sorters"; import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; +import VehicleDetailUpdateJobsComponent from "../vehicle-detail-update-jobs/vehicle-detail-update-jobs.component"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, @@ -16,6 +17,14 @@ const mapStateToProps = createStructuredSelector({ export function VehicleDetailJobsComponent({ vehicle, bodyshop }) { const { t } = useTranslation(); const [selectedJobs, setSelectedJobs] = useState([]); + const [state, setState] = useState({ + sortedInfo: {}, + filteredInfo: { text: "" }, + }); + + const handleTableChange = (pagination, filters, sorter) => { + setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); + }; const columns = [ { @@ -28,6 +37,9 @@ export function VehicleDetailJobsComponent({ vehicle, bodyshop }) { {record.ro_number || t("general.labels.na")} ), + sorter: (a, b) => alphaSort(a.ro_number, b.ro_number), + sortOrder: + state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, }, { title: t("jobs.fields.owner"), @@ -43,11 +55,17 @@ export function VehicleDetailJobsComponent({ vehicle, bodyshop }) { title: t("jobs.fields.clm_no"), dataIndex: "clm_no", key: "clm_no", + sorter: (a, b) => alphaSort(a.clm_no, b.clm_no), + sortOrder: + state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order, }, { title: t("jobs.fields.status"), dataIndex: "status", key: "status", + sorter: (a, b) => statusSort(a.status, b.status, bodyshop.md_ro_statuses.statuses), + sortOrder: + state.sortedInfo.columnKey === "status" && state.sortedInfo.order, }, { @@ -57,6 +75,9 @@ export function VehicleDetailJobsComponent({ vehicle, bodyshop }) { render: (text, record) => ( {record.clm_total} ), + sorter: (a, b) => a.clm_total - b.clm_total, + sortOrder: + state.sortedInfo.columnKey === "clm_total" && state.sortedInfo.order, }, ]; @@ -76,6 +97,7 @@ export function VehicleDetailJobsComponent({ vehicle, bodyshop }) { rowKey="id" scroll={{ x: true }} dataSource={vehicle.jobs} + onChange={handleTableChange} rowSelection={{ onSelect: (record, selected, selectedRows) => { setSelectedJobs(selectedRows ? selectedRows.map((i) => i.id) : []); diff --git a/client/src/graphql/owners.queries.js b/client/src/graphql/owners.queries.js index 7dee25738..a4e5d1c80 100644 --- a/client/src/graphql/owners.queries.js +++ b/client/src/graphql/owners.queries.js @@ -69,7 +69,7 @@ export const QUERY_OWNER_BY_ID = gql` preferred_contact note tax_number - jobs(order_by: {date_open: desc}) { + jobs(order_by: { date_open: desc }) { id ro_number clm_no diff --git a/client/src/graphql/vehicles.queries.js b/client/src/graphql/vehicles.queries.js index 9fa2dd837..9df3c4238 100644 --- a/client/src/graphql/vehicles.queries.js +++ b/client/src/graphql/vehicles.queries.js @@ -28,11 +28,10 @@ export const QUERY_VEHICLE_BY_ID = gql` updated_at trim_color notes - jobs { + jobs(order_by: { date_open: desc }) { id ro_number ownr_fn - ownr_ln owner { id From 4e69fe819ea1c516baaa29f5fd669e3b38ff83c7 Mon Sep 17 00:00:00 2001 From: Allan Carr Date: Fri, 18 Aug 2023 09:03:13 -0700 Subject: [PATCH 8/9] IO-2325 Add in Created by from Action menu --- .../jobs-detail-header-actions.component.jsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.component.jsx b/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.component.jsx index 4565864f5..54962ea73 100644 --- a/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.component.jsx +++ b/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.component.jsx @@ -239,7 +239,12 @@ export function JobsDetailHeaderActions({ setTimeTicketContext({ actions: {}, - context: { jobId: job.id }, + context: { + jobId: job.id, + created_by: currentUser.displayName + ? currentUser.email.concat(" | ", currentUser.displayName) + : currentUser.email, + }, }); }} > From a2150009db559736581671d19ac2588dd81dffea Mon Sep 17 00:00:00 2001 From: Allan Carr Date: Fri, 18 Aug 2023 13:59:42 -0700 Subject: [PATCH 9/9] IO-2385 Tech Console to print Attendance Report from Shift Clock --- .../tech-job-clock-in-form.container.jsx | 4 +- .../tech-job-print-tickets.component.jsx | 13 ++- .../time-ticket-shift-active.component.jsx | 91 +++++++++++-------- .../time-ticket-shift-form.container.jsx | 18 +++- .../time-ticket-shift.container.jsx | 1 + 5 files changed, 82 insertions(+), 45 deletions(-) diff --git a/client/src/components/tech-job-clock-in-form/tech-job-clock-in-form.container.jsx b/client/src/components/tech-job-clock-in-form/tech-job-clock-in-form.container.jsx index 139a30cbf..b3f3046f4 100644 --- a/client/src/components/tech-job-clock-in-form/tech-job-clock-in-form.container.jsx +++ b/client/src/components/tech-job-clock-in-form/tech-job-clock-in-form.container.jsx @@ -32,7 +32,7 @@ export function TechClockInContainer({ currentUser, }) { console.log( - "🚀 ~ file: tech-job-clock-in-form.container.jsx:29 ~ technician:", + "🚀 ~ file: tech-job-clock-in-form.container.jsx:30 ~ technician:", technician ); const [form] = Form.useForm(); @@ -128,7 +128,7 @@ export function TechClockInContainer({ > {t("timetickets.actions.enter")} - + + + + {isTechConsole === true ? ( + + ) : null} + ); diff --git a/client/src/components/time-ticket-shift/time-ticket-shift.container.jsx b/client/src/components/time-ticket-shift/time-ticket-shift.container.jsx index 9f0fec612..a6939e2e7 100644 --- a/client/src/components/time-ticket-shift/time-ticket-shift.container.jsx +++ b/client/src/components/time-ticket-shift/time-ticket-shift.container.jsx @@ -76,6 +76,7 @@ export function TimeTicketShiftContainer({ ) : (