Merge branch 'feature/america' into rome/test

This commit is contained in:
Patrick Fic
2023-11-06 14:55:49 -08:00
16 changed files with 62 additions and 28 deletions

View File

@@ -50,6 +50,7 @@ export function BillFormComponent({
job, job,
loadOutstandingReturns, loadOutstandingReturns,
loadInventory, loadInventory,
preferredMake,
}) { }) {
const { t } = useTranslation(); const { t } = useTranslation();
const client = useApolloClient(); const client = useApolloClient();
@@ -185,6 +186,7 @@ export function BillFormComponent({
<VendorSearchSelect <VendorSearchSelect
disabled={disabled} disabled={disabled}
options={vendorAutoCompleteOptions} options={vendorAutoCompleteOptions}
preferredMake={preferredMake}
onSelect={handleVendorSelect} onSelect={handleVendorSelect}
/> />
</Form.Item> </Form.Item>

View File

@@ -1,16 +1,16 @@
import { useLazyQuery, useQuery } from "@apollo/client"; import { useLazyQuery, useQuery } from "@apollo/client";
import { useTreatments } from "@splitsoftware/splitio-react";
import React from "react"; import React from "react";
import { connect } from "react-redux"; import { connect } from "react-redux";
import { createStructuredSelector } from "reselect"; import { createStructuredSelector } from "reselect";
import { QUERY_OUTSTANDING_INVENTORY } from "../../graphql/inventory.queries";
import { GET_JOB_LINES_TO_ENTER_BILL } from "../../graphql/jobs-lines.queries"; import { GET_JOB_LINES_TO_ENTER_BILL } from "../../graphql/jobs-lines.queries";
import { QUERY_UNRECEIVED_LINES } from "../../graphql/parts-orders.queries";
import { SEARCH_VENDOR_AUTOCOMPLETE } from "../../graphql/vendors.queries"; import { SEARCH_VENDOR_AUTOCOMPLETE } from "../../graphql/vendors.queries";
import { selectBodyshop } from "../../redux/user/user.selectors"; import { selectBodyshop } from "../../redux/user/user.selectors";
import BillFormComponent from "./bill-form.component";
import BillCmdReturnsTableComponent from "../bill-cm-returns-table/bill-cm-returns-table.component"; import BillCmdReturnsTableComponent from "../bill-cm-returns-table/bill-cm-returns-table.component";
import { QUERY_UNRECEIVED_LINES } from "../../graphql/parts-orders.queries";
import BillInventoryTable from "../bill-inventory-table/bill-inventory-table.component"; import BillInventoryTable from "../bill-inventory-table/bill-inventory-table.component";
import { QUERY_OUTSTANDING_INVENTORY } from "../../graphql/inventory.queries"; import BillFormComponent from "./bill-form.component";
import { useTreatments } from "@splitsoftware/splitio-react";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop, bodyshop: selectBodyshop,
@@ -59,6 +59,7 @@ export function BillFormContainer({
disableInvNumber={disableInvNumber} disableInvNumber={disableInvNumber}
loadOutstandingReturns={loadOutstandingReturns} loadOutstandingReturns={loadOutstandingReturns}
loadInventory={loadInventory} loadInventory={loadInventory}
preferredMake={lineData ? lineData.jobs_by_pk.v_make_desc : null}
/> />
{!billEdit && ( {!billEdit && (
<BillCmdReturnsTableComponent <BillCmdReturnsTableComponent

View File

@@ -1,5 +1,6 @@
import { useMutation } from "@apollo/client"; import { useMutation } from "@apollo/client";
import { Button, Card, Form, Input, notification, Switch } from "antd"; import { Button, Card, Form, Input, notification, Switch } from "antd";
import moment from "moment-business-days";
import queryString from "query-string"; import queryString from "query-string";
import React, { useState } from "react"; import React, { useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
@@ -12,16 +13,15 @@ import {
MARK_LATEST_APPOINTMENT_ARRIVED, MARK_LATEST_APPOINTMENT_ARRIVED,
} from "../../../../graphql/appointments.queries"; } from "../../../../graphql/appointments.queries";
import { UPDATE_JOB } from "../../../../graphql/jobs.queries"; import { UPDATE_JOB } from "../../../../graphql/jobs.queries";
import { UPDATE_OWNER } from "../../../../graphql/owners.queries";
import { insertAuditTrail } from "../../../../redux/application/application.actions";
import { import {
selectBodyshop, selectBodyshop,
selectCurrentUser, selectCurrentUser,
} from "../../../../redux/user/user.selectors"; } from "../../../../redux/user/user.selectors";
import AuditTrailMapping from "../../../../utils/AuditTrailMappings";
import ConfigFormComponents from "../../../config-form-components/config-form-components.component"; import ConfigFormComponents from "../../../config-form-components/config-form-components.component";
import DateTimePicker from "../../../form-date-time-picker/form-date-time-picker.component"; import DateTimePicker from "../../../form-date-time-picker/form-date-time-picker.component";
import moment from "moment-business-days";
import { insertAuditTrail } from "../../../../redux/application/application.actions";
import AuditTrailMapping from "../../../../utils/AuditTrailMappings";
import { UPDATE_OWNER } from "../../../../graphql/owners.queries";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop, bodyshop: selectBodyshop,
@@ -230,6 +230,7 @@ export function JobChecklistForm({
)), )),
scheduled_delivery: scheduled_delivery:
job.scheduled_delivery && moment(job.scheduled_delivery), job.scheduled_delivery && moment(job.scheduled_delivery),
production_vars: job.production_vars,
}), }),
...(type === "deliver" && { ...(type === "deliver" && {
removeFromProduction: true, removeFromProduction: true,

View File

@@ -1,7 +1,7 @@
import React, { useEffect } from "react"; import React, { useEffect } from "react";
import { Gallery } from "react-grid-gallery"; import { Gallery } from "react-grid-gallery";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { GenerateThumbUrl } from "./job-documents.utility"; import { GenerateSrcUrl, GenerateThumbUrl } from "./job-documents.utility";
function JobsDocumentGalleryExternal({ function JobsDocumentGalleryExternal({
data, data,
@@ -15,7 +15,7 @@ function JobsDocumentGalleryExternal({
let documents = data.reduce((acc, value) => { let documents = data.reduce((acc, value) => {
if (value.type.startsWith("image")) { if (value.type.startsWith("image")) {
acc.push({ acc.push({
//src: GenerateSrcUrl(value), fullsize: GenerateSrcUrl(value),
src: GenerateThumbUrl(value), src: GenerateThumbUrl(value),
thumbnailHeight: 225, thumbnailHeight: 225,
thumbnailWidth: 225, thumbnailWidth: 225,

View File

@@ -16,13 +16,17 @@ import { QUERY_LBR_HRS_BY_PK, UPDATE_JOBS } from "../../graphql/jobs.queries";
import { setEmailOptions } from "../../redux/email/email.actions"; import { setEmailOptions } from "../../redux/email/email.actions";
import { toggleModalVisible } from "../../redux/modals/modals.actions"; import { toggleModalVisible } from "../../redux/modals/modals.actions";
import { selectSchedule } from "../../redux/modals/modals.selectors"; import { selectSchedule } from "../../redux/modals/modals.selectors";
import { selectBodyshop } from "../../redux/user/user.selectors"; import {
selectBodyshop,
selectCurrentUser,
} from "../../redux/user/user.selectors";
import { TemplateList } from "../../utils/TemplateConstants"; import { TemplateList } from "../../utils/TemplateConstants";
import ScheduleJobModalComponent from "./schedule-job-modal.component"; import ScheduleJobModalComponent from "./schedule-job-modal.component";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop, bodyshop: selectBodyshop,
scheduleModal: selectSchedule, scheduleModal: selectSchedule,
currentUser: selectCurrentUser,
}); });
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
toggleModalVisible: () => dispatch(toggleModalVisible("schedule")), toggleModalVisible: () => dispatch(toggleModalVisible("schedule")),
@@ -34,6 +38,7 @@ export function ScheduleJobModalContainer({
bodyshop, bodyshop,
toggleModalVisible, toggleModalVisible,
setEmailOptions, setEmailOptions,
currentUser,
}) { }) {
const { visible, context, actions } = scheduleModal; const { visible, context, actions } = scheduleModal;
const { jobId, job, previousEvent } = context; const { jobId, job, previousEvent } = context;
@@ -122,6 +127,7 @@ export function ScheduleJobModalContainer({
end: moment(values.start).add(bodyshop.appt_length || 60, "minutes"), end: moment(values.start).add(bodyshop.appt_length || 60, "minutes"),
color: values.color, color: values.color,
note: values.note, note: values.note,
created_by: currentUser.email,
}, },
jobId: jobId, jobId: jobId,
altTransport: values.alt_transport, altTransport: values.alt_transport,

View File

@@ -283,6 +283,7 @@ export const GET_JOB_LINES_TO_ENTER_BILL = gql`
id id
ro_number ro_number
} }
v_make_desc
} }
} }
`; `;

View File

@@ -104,6 +104,7 @@ export const SEARCH_VENDOR_AUTOCOMPLETE = gql`
id id
cost_center cost_center
active active
favorite
} }
} }
`; `;

View File

@@ -2692,6 +2692,7 @@
"open_orders_csr": "Open Orders by CSR", "open_orders_csr": "Open Orders by CSR",
"open_orders_estimator": "Open Orders by Estimator", "open_orders_estimator": "Open Orders by Estimator",
"open_orders_ins_co": "Open Orders by Insurance Company", "open_orders_ins_co": "Open Orders by Insurance Company",
"open_orders_referral": "Open Orders by Referral Source",
"open_orders_specific_csr": "Open Orders filtered by CSR", "open_orders_specific_csr": "Open Orders filtered by CSR",
"open_orders_status": "Open Orders by Status", "open_orders_status": "Open Orders by Status",
"parts_backorder": "IOU Parts List", "parts_backorder": "IOU Parts List",

View File

@@ -2692,6 +2692,7 @@
"open_orders_csr": "", "open_orders_csr": "",
"open_orders_estimator": "", "open_orders_estimator": "",
"open_orders_ins_co": "", "open_orders_ins_co": "",
"open_orders_referral": "",
"open_orders_specific_csr": "", "open_orders_specific_csr": "",
"open_orders_status": "", "open_orders_status": "",
"parts_backorder": "", "parts_backorder": "",

View File

@@ -2692,6 +2692,7 @@
"open_orders_csr": "", "open_orders_csr": "",
"open_orders_estimator": "", "open_orders_estimator": "",
"open_orders_ins_co": "", "open_orders_ins_co": "",
"open_orders_referral": "",
"open_orders_specific_csr": "", "open_orders_specific_csr": "",
"open_orders_status": "", "open_orders_status": "",
"parts_backorder": "", "parts_backorder": "",

View File

@@ -1591,6 +1591,19 @@ export const TemplateList = (type, context) => {
}, },
group: "jobs", group: "jobs",
}, },
open_orders_specific_csr: {
title: i18n.t("reportcenter.templates.open_orders_specific_csr"),
description: "",
subject: i18n.t("reportcenter.templates.open_orders_specific_csr"),
key: "open_orders_specific_csr",
idtype: "employee",
disabled: false,
rangeFilter: {
object: i18n.t("reportcenter.labels.objects.jobs"),
field: i18n.t("jobs.fields.date_open"),
},
group: "jobs",
},
open_orders_estimator: { open_orders_estimator: {
title: i18n.t("reportcenter.templates.open_orders_estimator"), title: i18n.t("reportcenter.templates.open_orders_estimator"),
description: "", description: "",
@@ -1617,12 +1630,12 @@ export const TemplateList = (type, context) => {
}, },
group: "jobs", group: "jobs",
}, },
open_orders_specific_csr: { open_orders_referral: {
title: i18n.t("reportcenter.templates.open_orders_specific_csr"), title: i18n.t("reportcenter.templates.open_orders_referral"),
description: "", description: "",
subject: i18n.t("reportcenter.templates.open_orders_specific_csr"), subject: i18n.t("reportcenter.templates.open_orders_referral"),
key: "open_orders_specific_csr", key: "open_orders_referral",
idtype: "employee", //idtype: "vendor",
disabled: false, disabled: false,
rangeFilter: { rangeFilter: {
object: i18n.t("reportcenter.labels.objects.jobs"), object: i18n.t("reportcenter.labels.objects.jobs"),

View File

@@ -110,6 +110,7 @@
- canceled - canceled
- color - color
- created_at - created_at
- created_by
- end - end
- id - id
- isintake - isintake
@@ -128,6 +129,7 @@
- canceled - canceled
- color - color
- created_at - created_at
- created_by
- end - end
- id - id
- isintake - isintake
@@ -156,6 +158,7 @@
- canceled - canceled
- color - color
- created_at - created_at
- created_by
- end - end
- id - id
- isintake - isintake

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"."appointments" add column "created_by" text
-- null;

View File

@@ -0,0 +1,2 @@
alter table "public"."appointments" add column "created_by" text
null;

View File

@@ -17,7 +17,7 @@ let Client = require("ssh2-sftp-client");
const client = require("../graphql-client/graphql-client").client; const client = require("../graphql-client/graphql-client").client;
const { sendServerEmail } = require("../email/sendemail"); const { sendServerEmail } = require("../email/sendemail");
const CCDineroFormat = "0,0.00"; const CCDineroFormat = "0,0.00";
const AhDateFormat = "MMDDYYYY"; const AhDateFormat = "MM/DD/YYYY";
const repairOpCodes = ["OP4", "OP9", "OP10"]; const repairOpCodes = ["OP4", "OP9", "OP10"];
const replaceOpCodes = ["OP2", "OP5", "OP11", "OP12"]; const replaceOpCodes = ["OP2", "OP5", "OP11", "OP12"];
@@ -104,7 +104,7 @@ exports.default = async (req, res) => {
allxmlsToUpload.push({ allxmlsToUpload.push({
count: claimsCorpObject.DataFeed.ShopInfo.RO.length, count: claimsCorpObject.DataFeed.ShopInfo.RO.length,
xml: ret, xml: ret,
filename: `${bodyshop.claimscorpid}-MIS-${moment().format( filename: `${bodyshop.claimscorpid}-${moment().format(
"YYYYMMDDTHHMMss" "YYYYMMDDTHHMMss"
)}.xml`, )}.xml`,
}); });
@@ -245,7 +245,7 @@ const CreateRepairOrderTag = (job, errorCallback) => {
try { try {
const ret = { const ret = {
RONumber: job.ro_number, RoNumber: job.ro_number,
Customer: { Customer: {
CustomerZip: (job.ownr_zip && job.ownr_zip.substring(0, 3)) || "", CustomerZip: (job.ownr_zip && job.ownr_zip.substring(0, 3)) || "",
CustomerState: job.ownr_st || "", CustomerState: job.ownr_st || "",
@@ -312,7 +312,7 @@ const CreateRepairOrderTag = (job, errorCallback) => {
(job.date_estimated && (job.date_estimated &&
moment(job.date_estimated).format(AhDateFormat)) || moment(job.date_estimated).format(AhDateFormat)) ||
"", "",
DateofLoss: DateLoss:
(job.loss_date && moment(job.loss_date).format(AhDateFormat)) || "", (job.loss_date && moment(job.loss_date).format(AhDateFormat)) || "",
DateFNOL: "", DateFNOL: "",
DateContact: "", DateContact: "",
@@ -384,7 +384,7 @@ const CreateRepairOrderTag = (job, errorCallback) => {
"", "",
BilledDate: "", BilledDate: "",
PaidInFullDate: "", PaidInFullDate: "",
RoStatus: job.tlos_ind ROStatus: job.tlos_ind
? "TOT" ? "TOT"
: StatusMapping(job.status, job.bodyshop.md_ro_statuses), : StatusMapping(job.status, job.bodyshop.md_ro_statuses),
}, },
@@ -397,9 +397,7 @@ const CreateRepairOrderTag = (job, errorCallback) => {
Paint: Dinero(job.job_totals.rates.lar.total).toFormat(CCDineroFormat), Paint: Dinero(job.job_totals.rates.lar.total).toFormat(CCDineroFormat),
Prep: Dinero().toFormat(CCDineroFormat), Prep: Dinero().toFormat(CCDineroFormat),
Frame: Dinero(job.job_totals.rates.laf.total).toFormat(CCDineroFormat), Frame: Dinero(job.job_totals.rates.laf.total).toFormat(CCDineroFormat),
Mechanical: Dinero(job.job_totals.rates.lam.total).toFormat( Mech: Dinero(job.job_totals.rates.lam.total).toFormat(CCDineroFormat),
CCDineroFormat
),
Glass: Dinero(job.job_totals.rates.lag.total).toFormat(CCDineroFormat), Glass: Dinero(job.job_totals.rates.lag.total).toFormat(CCDineroFormat),
Elec: Dinero(job.job_totals.rates.lae.total).toFormat(CCDineroFormat), Elec: Dinero(job.job_totals.rates.lae.total).toFormat(CCDineroFormat),
Detail: detailAdjustments.amount.toFormat(CCDineroFormat), Detail: detailAdjustments.amount.toFormat(CCDineroFormat),
@@ -481,7 +479,7 @@ const CreateRepairOrderTag = (job, errorCallback) => {
.filter((line) => repairOpCodes.includes(line.lbr_op)) .filter((line) => repairOpCodes.includes(line.lbr_op))
.reduce((acc, val) => acc + val.mod_lb_hrs, 0) .reduce((acc, val) => acc + val.mod_lb_hrs, 0)
.toFixed(2), .toFixed(2),
BodyReplaceHours: job.joblines BodyReplacehours: job.joblines
.filter((line) => replaceOpCodes.includes(line.lbr_op)) .filter((line) => replaceOpCodes.includes(line.lbr_op))
.reduce((acc, val) => acc + val.mod_lb_hrs, 0) .reduce((acc, val) => acc + val.mod_lb_hrs, 0)
.toFixed(2), .toFixed(2),
@@ -523,7 +521,7 @@ const CreateRepairOrderTag = (job, errorCallback) => {
AM: repairCosts.PartsAMCost.toFormat(CCDineroFormat), AM: repairCosts.PartsAMCost.toFormat(CCDineroFormat),
MechParts: Dinero().toFormat(CCDineroFormat), MechParts: Dinero().toFormat(CCDineroFormat),
OtherParts: Dinero().toFormat(CCDineroFormat), //Check Synergy OtherParts: Dinero().toFormat(CCDineroFormat), //Check Synergy
OtherCosts: repairCosts.PartsOtherCost.toFormat(CCDineroFormat), OtherCost: repairCosts.PartsOtherCost.toFormat(CCDineroFormat),
Sublet: repairCosts.SubletTotalCost.toFormat(CCDineroFormat), Sublet: repairCosts.SubletTotalCost.toFormat(CCDineroFormat),
Towing: repairCosts.TowingTotalCost.toFormat(CCDineroFormat), Towing: repairCosts.TowingTotalCost.toFormat(CCDineroFormat),
Storage: repairCosts.StorageTotalCost.toFormat(CCDineroFormat), Storage: repairCosts.StorageTotalCost.toFormat(CCDineroFormat),

View File

@@ -1949,8 +1949,7 @@ exports.ACTIVE_SHOP_BY_USER = `query ACTIVE_SHOP_BY_USER($user: String) {
id id
shopid shopid
} }
} }`;
`;
exports.QUERY_JOB_PAYROLL_DATA = `query QUERY_JOB_PAYROLL_DATA($id: uuid!) { exports.QUERY_JOB_PAYROLL_DATA = `query QUERY_JOB_PAYROLL_DATA($id: uuid!) {
jobs_by_pk(id: $id) { jobs_by_pk(id: $id) {