diff --git a/client/src/components/job-close-ro-guard/job-close-ro-guard.bills.jsx b/client/src/components/job-close-ro-guard/job-close-ro-guard.bills.jsx index 4bf03ea46..a6dcf7b35 100644 --- a/client/src/components/job-close-ro-guard/job-close-ro-guard.bills.jsx +++ b/client/src/components/job-close-ro-guard/job-close-ro-guard.bills.jsx @@ -3,7 +3,7 @@ import React from "react"; import { useQuery } from "@apollo/client"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; -import { QUERY_BILLS_BY_JOBID } from "../../graphql/bills.queries"; +import { QUERY_PARTS_BILLS_BY_JOBID } from "../../graphql/bills.queries"; import { selectJobReadOnly } from "../../redux/application/application.selectors"; import { selectBodyshop } from "../../redux/user/user.selectors"; import AlertComponent from "../alert/alert.component"; @@ -19,7 +19,7 @@ const mapDispatchToProps = (dispatch) => ({ export default connect(mapStateToProps, mapDispatchToProps)(JobCloseRoGuardBills); export function JobCloseRoGuardBills({ job, jobRO, bodyshop, form, warningCallback }) { - const { loading, error, data } = useQuery(QUERY_BILLS_BY_JOBID, { + const { loading, error, data } = useQuery(QUERY_PARTS_BILLS_BY_JOBID, { variables: { jobid: job.id }, fetchPolicy: "network-only", nextFetchPolicy: "network-only" diff --git a/client/src/components/job-detail-lines/job-lines-expander.component.jsx b/client/src/components/job-detail-lines/job-lines-expander.component.jsx index 22f0f8616..64e3f023f 100644 --- a/client/src/components/job-detail-lines/job-lines-expander.component.jsx +++ b/client/src/components/job-detail-lines/job-lines-expander.component.jsx @@ -2,17 +2,17 @@ import { useQuery } from "@apollo/client"; import { Col, Row, Skeleton, Space, Timeline, Typography } from "antd"; import React from "react"; import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; import { Link } from "react-router-dom"; +import { createStructuredSelector } from "reselect"; import { GET_JOB_LINE_ORDERS } from "../../graphql/jobs.queries"; +import { QUERY_JOBLINE_TASKS_PAGINATED } from "../../graphql/tasks.queries.js"; +import { selectBodyshop } from "../../redux/user/user.selectors"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; import { DateFormatter } from "../../utils/DateFormatter"; import AlertComponent from "../alert/alert.component"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { QUERY_JOBLINE_TASKS_PAGINATED } from "../../graphql/tasks.queries.js"; -import TaskListContainer from "../task-list/task-list.container.jsx"; import FeatureWrapper from "../feature-wrapper/feature-wrapper.component.jsx"; +import TaskListContainer from "../task-list/task-list.container.jsx"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop @@ -84,17 +84,17 @@ export function JobLinesExpander({ jobline, jobid, bodyshop }) { key: line.id, children: ( - - {line.parts_dispatch.number} - + {line.parts_dispatch.number} {bodyshop.employees.find((e) => e.id === line.parts_dispatch.employeeid)?.first_name} - - {t("parts_dispatch_lines.fields.accepted_at")} - {line.accepted_at} - + {line.accepted_at ? ( + + {t("parts_dispatch_lines.fields.accepted_at")} + {line.accepted_at} + + ) : null} ) diff --git a/client/src/components/jobs-detail-pli/jobs-detail-pli.container.jsx b/client/src/components/jobs-detail-pli/jobs-detail-pli.container.jsx index f968b1da7..25b8081d0 100644 --- a/client/src/components/jobs-detail-pli/jobs-detail-pli.container.jsx +++ b/client/src/components/jobs-detail-pli/jobs-detail-pli.container.jsx @@ -1,17 +1,9 @@ -import { useQuery } from "@apollo/client"; import queryString from "query-string"; import React from "react"; import { useLocation, useNavigate } from "react-router-dom"; -import { QUERY_BILLS_BY_JOBID } from "../../graphql/bills.queries"; import JobsDetailPliComponent from "./jobs-detail-pli.component"; -export default function JobsDetailPliContainer({ job }) { - const billsQuery = useQuery(QUERY_BILLS_BY_JOBID, { - variables: { jobid: job.id }, - fetchPolicy: "network-only", - nextFetchPolicy: "network-only" - }); - +export default function JobsDetailPliContainer({ job, billsQuery }) { const search = queryString.parse(useLocation().search); const history = useNavigate(); diff --git a/client/src/components/shop-info/shop-info.responsibilitycenters.taxes.component.jsx b/client/src/components/shop-info/shop-info.responsibilitycenters.taxes.component.jsx index 13ce11d7b..e52a70b46 100644 --- a/client/src/components/shop-info/shop-info.responsibilitycenters.taxes.component.jsx +++ b/client/src/components/shop-info/shop-info.responsibilitycenters.taxes.component.jsx @@ -1765,25 +1765,28 @@ export function ShopInfoResponsibilityCenters({ bodyshop, form }) { - + - + - + - + - + - + - + diff --git a/client/src/graphql/bills.queries.js b/client/src/graphql/bills.queries.js index 3a38031ba..7a7fd2d8a 100644 --- a/client/src/graphql/bills.queries.js +++ b/client/src/graphql/bills.queries.js @@ -50,7 +50,7 @@ export const QUERY_ALL_BILLS_PAGINATED = gql` } `; -export const QUERY_BILLS_BY_JOBID = gql` +export const QUERY_PARTS_BILLS_BY_JOBID = gql` query QUERY_PARTS_BILLS_BY_JOBID($jobid: uuid!) { parts_orders(where: { jobid: { _eq: $jobid } }, order_by: { order_date: desc }) { id diff --git a/client/src/graphql/jobs.queries.js b/client/src/graphql/jobs.queries.js index 15f670f20..89dc8a726 100644 --- a/client/src/graphql/jobs.queries.js +++ b/client/src/graphql/jobs.queries.js @@ -1138,6 +1138,7 @@ export const UPDATE_JOB = gql` suspended queued_for_parts scheduled_completion + scheduled_delivery actual_in date_repairstarted date_void diff --git a/client/src/pages/jobs-create/jobs-create.container.jsx b/client/src/pages/jobs-create/jobs-create.container.jsx index d919bcb46..2347f8f9a 100644 --- a/client/src/pages/jobs-create/jobs-create.container.jsx +++ b/client/src/pages/jobs-create/jobs-create.container.jsx @@ -10,9 +10,9 @@ import { INSERT_NEW_JOB } from "../../graphql/jobs.queries"; import { QUERY_OWNER_FOR_JOB_CREATION } from "../../graphql/owners.queries"; import { setBreadcrumbs, setSelectedHeader } from "../../redux/application/application.actions"; import { selectBodyshop } from "../../redux/user/user.selectors"; +import InstanceRenderManager from "../../utils/instanceRenderMgr"; import JobsCreateComponent from "./jobs-create.component"; import JobCreateContext from "./jobs-create.context"; -import InstanceRenderManager from "../../utils/instanceRenderMgr"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop @@ -159,13 +159,6 @@ function JobsCreateContainer({ bodyshop, setBreadcrumbs, setSelectedHeader }) { layout="vertical" autoComplete={"off"} initialValues={{ - tax_tow_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, - tax_str_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, - tax_paint_mat_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, - tax_shop_mat_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, - tax_sub_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, - tax_lbr_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, - tax_levies_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, federal_tax_rate: bodyshop.bill_tax_rates.federal_tax_rate / 100, state_tax_rate: bodyshop.bill_tax_rates.state_tax_rate / 100, local_tax_rate: bodyshop.bill_tax_rates.local_tax_rate / 100, @@ -261,19 +254,34 @@ function JobsCreateContainer({ bodyshop, setBreadcrumbs, setSelectedHeader }) { prt_tax_rt: bodyshop.bill_tax_rates.state_tax_rate / 100 } }, - rome: { - cieca_pft: { - ...bodyshop.md_responsibility_centers.taxes.tax_ty1, - ...bodyshop.md_responsibility_centers.taxes.tax_ty2, - ...bodyshop.md_responsibility_centers.taxes.tax_ty3, - ...bodyshop.md_responsibility_centers.taxes.tax_ty4, - ...bodyshop.md_responsibility_centers.taxes.tax_ty5 - }, - materials: bodyshop.md_responsibility_centers.cieca_pfm, - cieca_pfl: bodyshop.md_responsibility_centers.cieca_pfl, - parts_tax_rates: bodyshop.md_responsibility_centers.parts_tax_rates - } - } + tax_tow_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, + tax_str_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, + tax_paint_mat_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, + tax_shop_mat_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, + tax_sub_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, + tax_lbr_rt: bodyshop.bill_tax_rates.state_tax_rate / 100, + tax_levies_rt: bodyshop.bill_tax_rates.state_tax_rate / 100 + }, + rome: { + cieca_pft: { + ...bodyshop.md_responsibility_centers.taxes.tax_ty1, + ...bodyshop.md_responsibility_centers.taxes.tax_ty2, + ...bodyshop.md_responsibility_centers.taxes.tax_ty3, + ...bodyshop.md_responsibility_centers.taxes.tax_ty4, + ...bodyshop.md_responsibility_centers.taxes.tax_ty5 + }, + materials: bodyshop.md_responsibility_centers.cieca_pfm, + cieca_pfl: bodyshop.md_responsibility_centers.cieca_pfl, + parts_tax_rates: bodyshop.md_responsibility_centers.parts_tax_rates, + tax_tow_rt: bodyshop.md_responsibility_centers.tax_tow_rt, + tax_str_rt: bodyshop.md_responsibility_centers.tax_str_rt, + tax_paint_mat_rt: bodyshop.md_responsibility_centers.tax_paint_mat_rt, + tax_shop_mat_rt: bodyshop.md_responsibility_centers.tax_shop_mat_rt, + tax_sub_rt: bodyshop.md_responsibility_centers.tax_sub_rt, + tax_lbr_rt: bodyshop.md_responsibility_centers.tax_lbr_rt, + tax_levies_rt: bodyshop.md_responsibility_centers.tax_levies_rt + }, + promanager: "USE_ROME" }) }} > diff --git a/client/src/pages/jobs-detail/jobs-detail.page.component.jsx b/client/src/pages/jobs-detail/jobs-detail.page.component.jsx index 79ce401bc..e2f251b79 100644 --- a/client/src/pages/jobs-detail/jobs-detail.page.component.jsx +++ b/client/src/pages/jobs-detail/jobs-detail.page.component.jsx @@ -8,11 +8,12 @@ import Icon, { SyncOutlined, ToolFilled } from "@ant-design/icons"; -import { Badge, Button, Divider, Form, notification, Space, Tabs } from "antd"; import { PageHeader } from "@ant-design/pro-layout"; +import { Badge, Button, Divider, Form, notification, Space, Tabs } from "antd"; +import { useQuery } from "@apollo/client"; import Axios from "axios"; -import dayjs from "../../utils/day"; +import _ from "lodash"; import queryString from "query-string"; import React, { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; @@ -20,11 +21,13 @@ import { FaHardHat, FaRegStickyNote, FaShieldAlt, FaTasks } from "react-icons/fa import { connect } from "react-redux"; import { useLocation, useNavigate } from "react-router-dom"; import { createStructuredSelector } from "reselect"; +import { HasFeatureAccess } from "../../components/feature-wrapper/feature-wrapper.component"; import FormFieldsChanged from "../../components/form-fields-changed-alert/form-fields-changed-alert.component"; import JobAuditTrail from "../../components/job-audit-trail/job-audit-trail.component"; import JobsLinesContainer from "../../components/job-detail-lines/job-lines.container"; import JobLifecycleComponent from "../../components/job-lifecycle/job-lifecycle.component"; import JobLineUpsertModalContainer from "../../components/job-lines-upsert-modal/job-lines-upsert-modal.container"; +import JobProfileDataWarning from "../../components/job-profile-data-warning/job-profile-data-warning.component"; import JobReconciliationModal from "../../components/job-reconciliation-modal/job-reconciliation.modal.container"; import JobSyncButton from "../../components/job-sync-button/job-sync-button.component"; import JobsChangeStatus from "../../components/jobs-change-status/jobs-change-status.component"; @@ -42,19 +45,18 @@ import JobsDocumentsLocalGallery from "../../components/jobs-documents-local-gal import JobNotesContainer from "../../components/jobs-notes/jobs-notes.container"; import NoteUpsertModalComponent from "../../components/note-upsert-modal/note-upsert-modal.container"; import ScheduleJobModalContainer from "../../components/schedule-job-modal/schedule-job-modal.container"; +import TaskListContainer from "../../components/task-list/task-list.container.jsx"; +import { QUERY_PARTS_BILLS_BY_JOBID } from "../../graphql/bills.queries.js"; +import { QUERY_JOB_TASKS_PAGINATED } from "../../graphql/tasks.queries.js"; import { insertAuditTrail } from "../../redux/application/application.actions"; import { selectJobReadOnly } from "../../redux/application/application.selectors"; import { setModalContext } from "../../redux/modals/modals.actions"; import { selectBodyshop } from "../../redux/user/user.selectors"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; -import UndefinedToNull from "../../utils/undefinedtonull"; -import _ from "lodash"; -import JobProfileDataWarning from "../../components/job-profile-data-warning/job-profile-data-warning.component"; import { DateTimeFormat } from "../../utils/DateFormatter"; +import dayjs from "../../utils/day"; import InstanceRenderManager from "../../utils/instanceRenderMgr"; -import { HasFeatureAccess } from "../../components/feature-wrapper/feature-wrapper.component"; -import TaskListContainer from "../../components/task-list/task-list.container.jsx"; -import { QUERY_JOB_TASKS_PAGINATED } from "../../graphql/tasks.queries.js"; +import UndefinedToNull from "../../utils/undefinedtonull"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, @@ -96,6 +98,12 @@ export function JobsDetailPage({ layout: "vertical" }; + const billsQuery = useQuery(QUERY_PARTS_BILLS_BY_JOBID, { + variables: { jobid: job.id }, + fetchPolicy: "network-only", + nextFetchPolicy: "network-only" + }); + useEffect(() => { //form.setFieldsValue(transormJobToForm(job)); form.resetFields(); @@ -326,7 +334,7 @@ export function JobsDetailPage({ label: HasFeatureAccess({ featureName: "bills", bodyshop }) ? t("menus.jobsdetail.partssublet") : t("menus.jobsdetail.parts"), - children: + children: }, ...(InstanceRenderManager({ imex: true, diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json index 40dfdfd4b..05c6c6e92 100644 --- a/client/src/translations/en_us/common.json +++ b/client/src/translations/en_us/common.json @@ -1776,6 +1776,7 @@ "prt_tx_in3": "Tax 3 Indicator", "prt_tx_in4": "Tax 4 Indicator", "prt_tx_in5": "Tax 5 Indicator", + "prt_tx_ty1": "Parts Tax Type 1", "prt_type": "Part Type" }, "partsstatus": "Parts Status", diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json index 85ea723bd..a80e7a054 100644 --- a/client/src/translations/es/common.json +++ b/client/src/translations/es/common.json @@ -1776,6 +1776,7 @@ "prt_tx_in3": "", "prt_tx_in4": "", "prt_tx_in5": "", + "prt_tx_ty1": "", "prt_type": "" }, "partsstatus": "", diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json index 389871014..8d8c801ea 100644 --- a/client/src/translations/fr/common.json +++ b/client/src/translations/fr/common.json @@ -1776,6 +1776,7 @@ "prt_tx_in3": "", "prt_tx_in4": "", "prt_tx_in5": "", + "prt_tx_ty1": "", "prt_type": "" }, "partsstatus": "",