From 6efa08fee366bc362a6f71c9ba7012b3819a0084 Mon Sep 17 00:00:00 2001 From: Patrick Fic Date: Mon, 16 Oct 2023 09:34:53 -0700 Subject: [PATCH 01/10] IO-2411 filter inactive employees on prod. print button --- .../production-list-print.component.jsx | 40 ++++++++++--------- 1 file changed, 21 insertions(+), 19 deletions(-) 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} + + ))} Date: Mon, 16 Oct 2023 11:40:23 -0700 Subject: [PATCH 02/10] IO-2414 add null handling in case employee records are null. --- .../production-list-columns.data.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) 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 7d122200d..a93e0f3e6 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 @@ -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) => ( { 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) => ( @@ -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) => ( From ffebbe3b2ab8e61740dec67210ac00aa25c909a4 Mon Sep 17 00:00:00 2001 From: Patrick Fic Date: Mon, 16 Oct 2023 12:00:11 -0700 Subject: [PATCH 03/10] IO-2401 Add prevention of duplicate chat creation by adding loading tracking. --- .../chat-open-button/chat-open-button.component.jsx | 12 ++++++++++-- client/src/redux/messaging/messaging.reducer.js | 7 +++++++ client/src/redux/messaging/messaging.selectors.js | 5 +++++ 3 files changed, 22 insertions(+), 2 deletions(-) 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/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.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 +); From 9114abd3ef0bb190dadb2812e6a0d8235cca714a Mon Sep 17 00:00:00 2001 From: Allan Carr Date: Wed, 18 Oct 2023 10:48:47 -0700 Subject: [PATCH 04/10] IO-1559 Add in extra required tag --- server/data/claimscorp.js | 49 ++++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/server/data/claimscorp.js b/server/data/claimscorp.js index 9ea8341dc..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 = { DataFeed: { - 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() }); - } - ) - ), + 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.DataFeed.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 + From 60a0222dd0851331c429b769374d723f60f98ebf Mon Sep 17 00:00:00 2001 From: Allan Carr Date: Wed, 18 Oct 2023 10:55:08 -0700 Subject: [PATCH 05/10] IO-2416 Filter out "" from ClaimsCorp and Autohouse get shop queries --- server/data/autohouse.js | 2 +- server/graphql-client/queries.js | 269 ++++++++++++------------------- 2 files changed, 106 insertions(+), 165 deletions(-) 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/graphql-client/queries.js b/server/graphql-client/queries.js index eb71fae42..a27ac8bd0 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!]!) { @@ -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 } -} -`; +}`; From 802dd696f453118470b2945633adb53bd6e180d8 Mon Sep 17 00:00:00 2001 From: Patrick Fic Date: Thu, 19 Oct 2023 09:20:29 -0700 Subject: [PATCH 06/10] IO-2418 Adjust latest bill amount --- .../job-lines-bill-reference.component.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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})`}
From 02fd8097a853af98fc3f8c97e5f820f77d207528 Mon Sep 17 00:00:00 2001 From: Allan Carr Date: Thu, 19 Oct 2023 09:30:29 -0700 Subject: [PATCH 07/10] IO-2419 Thumbnails being emailed instead of Full Size Image --- client/src/components/email-overlay/email-overlay.container.jsx | 2 +- .../jobs-documents-local-gallery.external.component.jsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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/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; }, []) From 2d2190e4fa91129b3d90550700c44cd31a3aad94 Mon Sep 17 00:00:00 2001 From: Patrick Fic Date: Thu, 19 Oct 2023 09:34:35 -0700 Subject: [PATCH 08/10] Add refetch of job when posting bill. --- .../bill-enter-modal/bill-enter-modal.container.jsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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 d50c17433..617b9e603 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 @@ -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(r1.data.insert_bills.returning[0].invoice_number), + operation: AuditTrailMapping.billposted( + r1.data.insert_bills.returning[0].invoice_number + ), }); if (enterAgain) { From 5b29aec14ba07e319eedb70c0c32d7384aa11f74 Mon Sep 17 00:00:00 2001 From: Patrick Fic Date: Thu, 19 Oct 2023 15:17:22 -0700 Subject: [PATCH 09/10] Resolve vehicle search select issue. --- .../vehicle-search-select.component.jsx | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) 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 8f187b77b..7cc506ed3 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 @@ -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) => { - if (v && v !== "" && v.length >= 3) callSearch(v); + if (v && v.variables?.search !== "" && v.variables.search.length >= 2) + callSearch(v); }; const debouncedExecuteSearch = _.debounce(executeSearch, 500); From c0086600234482c409673692dc3aebebd63cb6a1 Mon Sep 17 00:00:00 2001 From: Patrick Fic Date: Fri, 20 Oct 2023 08:50:31 -0700 Subject: [PATCH 10/10] Resolve error on multiple conversations found saga. --- client/src/redux/messaging/messaging.sagas.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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);