diff --git a/bodyshop_translations.babel b/bodyshop_translations.babel
index 8d90d4760..a7de63bcb 100644
--- a/bodyshop_translations.babel
+++ b/bodyshop_translations.babel
@@ -14493,6 +14493,27 @@
+
+ priorsuccesfulexport
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
@@ -32395,6 +32416,27 @@
+
+ orderinhouse
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
diff --git a/client/src/components/accounting-payables-table/accounting-payables-table.component.jsx b/client/src/components/accounting-payables-table/accounting-payables-table.component.jsx
index 8b017991a..ed3a7b24c 100644
--- a/client/src/components/accounting-payables-table/accounting-payables-table.component.jsx
+++ b/client/src/components/accounting-payables-table/accounting-payables-table.component.jsx
@@ -13,6 +13,7 @@ import QboAuthorizeComponent from "../qbo-authorize/qbo-authorize.component";
import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
import { selectBodyshop } from "../../redux/user/user.selectors";
+import ExportLogsCountDisplay from "../export-logs-count-display/export-logs-count-display.component";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop,
@@ -131,11 +132,9 @@ export function AccountingPayablesTableComponent({ bodyshop, loading, bills }) {
dataIndex: "attempts",
key: "attempts",
- render: (text, record) => {
- const success = record.exportlogs.filter((e) => e.successful).length;
- const attempts = record.exportlogs.length;
- return `${success}/${attempts}`;
- },
+ render: (text, record) => (
+
+ ),
},
{
title: t("general.labels.actions"),
diff --git a/client/src/components/accounting-payments-table/accounting-payments-table.component.jsx b/client/src/components/accounting-payments-table/accounting-payments-table.component.jsx
index 30ac03db3..3a8c0c6b4 100644
--- a/client/src/components/accounting-payments-table/accounting-payments-table.component.jsx
+++ b/client/src/components/accounting-payments-table/accounting-payments-table.component.jsx
@@ -13,6 +13,7 @@ import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
import { selectBodyshop } from "../../redux/user/user.selectors";
import OwnerNameDisplay from "../owner-name-display/owner-name-display.component";
+import ExportLogsCountDisplay from "../export-logs-count-display/export-logs-count-display.component";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop,
@@ -130,11 +131,9 @@ export function AccountingPayablesTableComponent({
dataIndex: "attempts",
key: "attempts",
- render: (text, record) => {
- const success = record.exportlogs.filter((e) => e.successful).length;
- const attempts = record.exportlogs.length;
- return `${success}/${attempts}`;
- },
+ render: (text, record) => (
+
+ ),
},
{
title: t("general.labels.actions"),
diff --git a/client/src/components/accounting-receivables-table/accounting-receivables-table.component.jsx b/client/src/components/accounting-receivables-table/accounting-receivables-table.component.jsx
index d49edecf7..d954448d4 100644
--- a/client/src/components/accounting-receivables-table/accounting-receivables-table.component.jsx
+++ b/client/src/components/accounting-receivables-table/accounting-receivables-table.component.jsx
@@ -14,6 +14,7 @@ import { selectBodyshop } from "../../redux/user/user.selectors";
import QboAuthorizeComponent from "../qbo-authorize/qbo-authorize.component";
import { DateFormatter } from "../../utils/DateFormatter";
import OwnerNameDisplay from "../owner-name-display/owner-name-display.component";
+import ExportLogsCountDisplay from "../export-logs-count-display/export-logs-count-display.component";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop,
@@ -139,12 +140,9 @@ export function AccountingReceivablesTableComponent({
title: t("exportlogs.labels.attempts"),
dataIndex: "attempts",
key: "attempts",
-
- render: (text, record) => {
- const success = record.exportlogs.filter((e) => e.successful).length;
- const attempts = record.exportlogs.length;
- return `${success}/${attempts}`;
- },
+ render: (text, record) => (
+
+ ),
},
{
title: t("general.labels.actions"),
diff --git a/client/src/components/export-logs-count-display/export-logs-count-display.component.jsx b/client/src/components/export-logs-count-display/export-logs-count-display.component.jsx
new file mode 100644
index 000000000..d0ad34dc5
--- /dev/null
+++ b/client/src/components/export-logs-count-display/export-logs-count-display.component.jsx
@@ -0,0 +1,25 @@
+import React from "react";
+import { WarningOutlined } from "@ant-design/icons";
+import { Space, Tooltip } from "antd";
+import { useTranslation } from "react-i18next";
+
+const style = {
+ fontWeight: "bold",
+ color: "green",
+};
+
+export default function ExportLogsCountDisplay({ logs }) {
+ const success = logs.filter((e) => e.successful).length;
+ const attempts = logs.length;
+ const { t } = useTranslation();
+ return (
+ 0 ? style : {}}>
+ {`${success}/${attempts}`}
+ {success > 0 && (
+
+
+
+ )}
+
+ );
+}
diff --git a/client/src/components/job-detail-lines/job-lines.component.jsx b/client/src/components/job-detail-lines/job-lines.component.jsx
index e6bff1185..401a5bba6 100644
--- a/client/src/components/job-detail-lines/job-lines.component.jsx
+++ b/client/src/components/job-detail-lines/job-lines.component.jsx
@@ -6,6 +6,7 @@ import {
EditFilled,
PlusCircleTwoTone,
MinusCircleTwoTone,
+ HomeOutlined,
} from "@ant-design/icons";
import { useMutation } from "@apollo/client";
import {
@@ -42,6 +43,7 @@ import _ from "lodash";
import JobCreateIOU from "../job-create-iou/job-create-iou.component";
import JobLinesExpander from "./job-lines-expander.component";
import { selectBodyshop } from "../../redux/user/user.selectors";
+import moment from "moment";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop,
@@ -54,6 +56,8 @@ const mapDispatchToProps = (dispatch) => ({
dispatch(setModalContext({ context: context, modal: "jobLineEdit" })),
setPartsOrderContext: (context) =>
dispatch(setModalContext({ context: context, modal: "partsOrder" })),
+ setBillEnterContext: (context) =>
+ dispatch(setModalContext({ context: context, modal: "billEnter" })),
});
export function JobLinesComponent({
@@ -68,6 +72,7 @@ export function JobLinesComponent({
job,
setJobLineEditContext,
form,
+ setBillEnterContext,
}) {
const [deleteJobLine] = useMutation(DELETE_JOB_LINE_BY_PK);
@@ -386,6 +391,62 @@ export function JobLinesComponent({
)}
+