-
: null}
value={note}
diff --git a/client/src/components/job-lines-upsert-modal/job-lines-upsert-modal.component.jsx b/client/src/components/job-lines-upsert-modal/job-lines-upsert-modal.component.jsx
index e07c54606..668452b9a 100644
--- a/client/src/components/job-lines-upsert-modal/job-lines-upsert-modal.component.jsx
+++ b/client/src/components/job-lines-upsert-modal/job-lines-upsert-modal.component.jsx
@@ -1,10 +1,10 @@
+import { useSplitTreatments } from "@splitsoftware/splitio-react";
import { Form, Input, InputNumber, Modal, Select, Switch } from "antd";
import React, { useEffect } from "react";
import { useTranslation } from "react-i18next";
import InputCurrency from "../form-items-formatted/currency-form-item.component";
-import LayoutFormRow from "../layout-form-row/layout-form-row.component";
import JoblinesPreset from "../job-lines-preset-button/job-lines-preset-button.component";
-import { useSplitTreatments } from "@splitsoftware/splitio-react";
+import LayoutFormRow from "../layout-form-row/layout-form-row.component";
import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
@@ -61,7 +61,7 @@ export function JobLinesUpsertModalComponent({ bodyshop, open, jobLine, handleCa
]}
name="line_desc"
>
-
+
diff --git a/client/src/components/job-totals-table/job-totals.table.totals.component.jsx b/client/src/components/job-totals-table/job-totals.table.totals.component.jsx
index a8b5e0604..301fec91f 100644
--- a/client/src/components/job-totals-table/job-totals.table.totals.component.jsx
+++ b/client/src/components/job-totals-table/job-totals.table.totals.component.jsx
@@ -141,14 +141,16 @@ export function JobTotalsTableTotals({ bodyshop, job }) {
key: t("jobs.fields.ded_amt"),
total: job.job_totals.totals.custPayable.deductible
},
- ...(InstanceRenderManager({
- imex: [{
- key: t("jobs.fields.federal_tax_payable"),
- total: job.job_totals.totals.custPayable.federal_tax
- }],
+ ...InstanceRenderManager({
+ imex: [
+ {
+ key: t("jobs.fields.federal_tax_payable"),
+ total: job.job_totals.totals.custPayable.federal_tax
+ }
+ ],
rome: [],
promanager: "USE_ROME"
- })),
+ }),
{
key: t("jobs.fields.other_amount_payable"),
total: job.job_totals.totals.custPayable.other_customer_amount
@@ -158,11 +160,32 @@ export function JobTotalsTableTotals({ bodyshop, job }) {
total: job.job_totals.totals.custPayable.dep_taxes
},
- {
- key: t("jobs.labels.total_cust_payable"),
- total: job.job_totals.totals.custPayable.total,
- bold: true
- },
+ ...(bodyshop.intellipay_config?.enable_cash_discount
+ ? [
+ {
+ key: t("jobs.labels.total_cust_payable_cash_discount"),
+ total: job.job_totals.totals.custPayable.total,
+ bold: true
+ },
+ {
+ key: t("jobs.labels.total_cust_payable"),
+ total: Dinero(job.job_totals.totals.custPayable.total)
+ .add(
+ Dinero(job.job_totals.totals.custPayable.total).percentage(
+ bodyshop.intellipay_config?.cash_discount_percentage || 0
+ )
+ )
+ .toJSON(),
+ bold: true
+ }
+ ]
+ : [
+ {
+ key: t("jobs.labels.total_cust_payable"),
+ total: job.job_totals.totals.custPayable.total,
+ bold: true
+ }
+ ]),
{
key: t("jobs.labels.net_repairs"),
total: job.job_totals.totals.net_repairs,
diff --git a/client/src/components/jobs-detail-general/jobs-detail-general.component.jsx b/client/src/components/jobs-detail-general/jobs-detail-general.component.jsx
index 1fee1a6b5..f36269c83 100644
--- a/client/src/components/jobs-detail-general/jobs-detail-general.component.jsx
+++ b/client/src/components/jobs-detail-general/jobs-detail-general.component.jsx
@@ -5,6 +5,7 @@ import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
import { selectJobReadOnly } from "../../redux/application/application.selectors";
import { selectBodyshop } from "../../redux/user/user.selectors";
+import DateTimePicker from "../form-date-time-picker/form-date-time-picker.component.jsx";
import CurrencyInput from "../form-items-formatted/currency-form-item.component";
import FormItemEmail from "../form-items-formatted/email-form-item.component";
import FormItemPhone, { PhoneItemFormatterValidation } from "../form-items-formatted/phone-form-item.component";
@@ -12,7 +13,6 @@ import Car from "../job-damage-visual/job-damage-visual.component";
import JobsDetailChangeEstimator from "../jobs-detail-change-estimator/jobs-detail-change-estimator.component";
import JobsDetailChangeFileHandler from "../jobs-detail-change-filehandler/jobs-detail-change-filehandler.component";
import FormRow from "../layout-form-row/layout-form-row.component";
-import DateTimePicker from "../form-date-time-picker/form-date-time-picker.component.jsx";
const mapStateToProps = createStructuredSelector({
jobRO: selectJobReadOnly,
@@ -185,6 +185,9 @@ export function JobsDetailGeneral({ bodyshop, jobRO, job, form }) {
+
+
+
diff --git a/client/src/components/schedule-job-modal/schedule-job-modal.component.jsx b/client/src/components/schedule-job-modal/schedule-job-modal.component.jsx
index ea942e5d2..abc01afbd 100644
--- a/client/src/components/schedule-job-modal/schedule-job-modal.component.jsx
+++ b/client/src/components/schedule-job-modal/schedule-job-modal.component.jsx
@@ -1,6 +1,5 @@
import { Button, Col, Form, Input, Row, Select, Space, Switch, Typography } from "antd";
import axios from "axios";
-import dayjs from "../../utils/day";
import React, { useState } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
@@ -8,13 +7,14 @@ import { createStructuredSelector } from "reselect";
import { calculateScheduleLoad } from "../../redux/application/application.actions";
import { selectBodyshop } from "../../redux/user/user.selectors";
import { DateFormatter } from "../../utils/DateFormatter";
+import dayjs from "../../utils/day";
+import InstanceRenderManager from "../../utils/instanceRenderMgr";
import DateTimePicker from "../form-date-time-picker/form-date-time-picker.component";
import EmailInput from "../form-items-formatted/email-form-item.component";
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
import ScheduleDayViewContainer from "../schedule-day-view/schedule-day-view.container";
import ScheduleExistingAppointmentsList from "../schedule-existing-appointments-list/schedule-existing-appointments-list.component";
import "./schedule-job-modal.scss";
-import InstanceRenderManager from "../../utils/instanceRenderMgr";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop
@@ -84,7 +84,7 @@ export function ScheduleJobModalComponent({
}
]}
>
-
+
}
],
diff --git a/client/src/components/shop-info/shop-info.general.component.jsx b/client/src/components/shop-info/shop-info.general.component.jsx
index 2a62fdead..90a17b4b1 100644
--- a/client/src/components/shop-info/shop-info.general.component.jsx
+++ b/client/src/components/shop-info/shop-info.general.component.jsx
@@ -676,7 +676,7 @@ export function ShopInfoGeneral({ form, bodyshop }) {
}
]}
>
-
+
-
+
-
+
-
+
diff --git a/client/src/components/shop-info/shop-intellipay-config.component.jsx b/client/src/components/shop-info/shop-intellipay-config.component.jsx
index 3dbdee3ed..2b0a7c2cc 100644
--- a/client/src/components/shop-info/shop-intellipay-config.component.jsx
+++ b/client/src/components/shop-info/shop-intellipay-config.component.jsx
@@ -39,14 +39,13 @@ export function ShopInfoIntellipay({ bodyshop, form }) {
({ required: form.getFieldValue(["intellipay_config", "enable_cash_discount"]) })
]}
>
-
+
>
diff --git a/client/src/components/task-list/task-list.component.jsx b/client/src/components/task-list/task-list.component.jsx
index 0c01ef6a8..ba7d71b17 100644
--- a/client/src/components/task-list/task-list.component.jsx
+++ b/client/src/components/task-list/task-list.component.jsx
@@ -144,7 +144,7 @@ function TaskListComponent({
title: t("tasks.fields.created_by"),
dataIndex: "created_by",
key: "created_by",
- width: "10%",
+ width: "8%",
defaultSortOrder: "descend",
sorter: true,
sortOrder: sortcolumn === "created_by" && sortorder,
@@ -166,65 +166,70 @@ function TaskListComponent({
});
}
- if (showRo) {
- columns.push({
- title: t("tasks.fields.job.ro_number"),
- dataIndex: ["job", "ro_number"],
- key: "job.ro_number",
- width: "8%",
- render: (text, record) =>
- record.job ? (
- {record.job.ro_number || t("general.labels.na")}
- ) : (
- t("general.labels.na")
- )
- });
- }
+ columns.push({
+ title: t("tasks.fields.related_items"),
+ key: "related_items",
+ width: "12%",
+ render: (text, record) => {
+ const items = [];
+
+ // Job
+ if (showRo && record.job) {
+ items.push(
+
+ {t("tasks.fields.job.ro_number")}: {record.job.ro_number}
+
+ );
+ }
+ if (showRo && !record.job) {
+ items.push(`${t("tasks.fields.job.ro_number")}: ${t("general.labels.na")}`);
+ }
+
+ // Jobline
+ if (record.jobline?.line_desc) {
+ items.push(
+
+ {t("tasks.fields.jobline")}: {record.jobline.line_desc}
+
+ );
+ }
+
+ // Parts Order
+ if (record.parts_order) {
+ const { order_number, vendor } = record.parts_order;
+ const partsOrderText =
+ order_number && vendor?.name ? `${order_number} - ${vendor.name}` : t("general.labels.na");
+ items.push(
+
+ {t("tasks.fields.parts_order")}: {partsOrderText}
+
+ );
+ }
+
+ // Bill
+ if (record.bill) {
+ const { invoice_number, vendor } = record.bill;
+ const billText = invoice_number && vendor?.name ? `${invoice_number} - ${vendor.name}` : t("general.labels.na");
+ items.push(
+
+ {t("tasks.fields.bill")}: {billText}
+
+ );
+ }
+
+ return items.length > 0 ? {items} : null;
+ }
+ });
columns.push(
- {
- title: t("tasks.fields.jobline"),
- dataIndex: ["jobline", "id"],
- key: "jobline.id",
- width: "8%",
- render: (text, record) => record?.jobline?.line_desc || ""
- },
- {
- title: t("tasks.fields.parts_order"),
- dataIndex: ["parts_order", "id"],
- key: "part_order.id",
- width: "8%",
- render: (text, record) =>
- record.parts_order ? (
-
- {record.parts_order.order_number && record.parts_order.vendor && record.parts_order.vendor.name
- ? `${record.parts_order.order_number} - ${record.parts_order.vendor.name}`
- : t("general.labels.na")}
-
- ) : (
- ""
- )
- },
- {
- title: t("tasks.fields.bill"),
- dataIndex: ["bill", "id"],
- key: "bill.id",
- width: "10%",
- render: (text, record) =>
- record.bill ? (
-
- {record.bill.invoice_number && record.bill.vendor && record.bill.vendor.name
- ? `${record.bill.invoice_number} - ${record.bill.vendor.name}`
- : t("general.labels.na")}
-
- ) : (
- ""
- )
- },
{
title: t("tasks.fields.title"),
dataIndex: "title",
key: "title",
+ minWidth: "20%",
sorter: true,
sortOrder: sortcolumn === "title" && sortorder
},
@@ -258,7 +263,7 @@ function TaskListComponent({
{
title: t("tasks.fields.actions"),
key: "toggleCompleted",
- width: "5%",
+ width: "8%",
render: (text, record) => (