From a01019b1b32cf178dcd2ef9054e0a029eb6502b4 Mon Sep 17 00:00:00 2001
From: Patrick Fic <>
Date: Thu, 23 Sep 2021 10:29:35 -0700
Subject: [PATCH 1/3] IO-1366 Additional Audit Trail Functionality
---
bodyshop_translations.babel | 63 +++++++++++++++++++
.../jobs-notes/jobs-notes.container.jsx | 19 +++++-
.../note-upsert-modal.container.jsx | 13 ++++
client/src/translations/en_us/common.json | 3 +
client/src/translations/es/common.json | 3 +
client/src/translations/fr/common.json | 3 +
client/src/utils/AuditTrailMappings.js | 3 +
7 files changed, 106 insertions(+), 1 deletion(-)
diff --git a/bodyshop_translations.babel b/bodyshop_translations.babel
index 189eb825b..9348a53a0 100644
--- a/bodyshop_translations.babel
+++ b/bodyshop_translations.babel
@@ -1369,6 +1369,69 @@
+
+ jobnoteadded
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
+
+ jobnotedeleted
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
+
+ jobnoteupdated
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
jobspartsorder
false
diff --git a/client/src/components/jobs-notes/jobs-notes.container.jsx b/client/src/components/jobs-notes/jobs-notes.container.jsx
index 608c21ae4..7ac7af91c 100644
--- a/client/src/components/jobs-notes/jobs-notes.container.jsx
+++ b/client/src/components/jobs-notes/jobs-notes.container.jsx
@@ -10,8 +10,21 @@ import {
QUERY_NOTES_BY_JOB_PK,
} from "../../graphql/notes.queries";
import JobNotesComponent from "./jobs.notes.component";
+import { insertAuditTrail } from "../../redux/application/application.actions";
+import { connect } from "react-redux";
+import { createStructuredSelector } from "reselect";
+import AuditTrailMapping from "../../utils/AuditTrailMappings";
-export default function JobNotesContainer({ jobId }) {
+const mapStateToProps = createStructuredSelector({
+ //currentUser: selectCurrentUser
+});
+const mapDispatchToProps = (dispatch) => ({
+ insertAuditTrail: ({ jobid, operation }) =>
+ dispatch(insertAuditTrail({ jobid, operation })),
+});
+export default connect(mapStateToProps, mapDispatchToProps)(JobNotesContainer);
+
+export function JobNotesContainer({ jobId, insertAuditTrail }) {
const { loading, error, data, refetch } = useQuery(QUERY_NOTES_BY_JOB_PK, {
variables: { id: jobId },
fetchPolicy: "network-only",
@@ -32,6 +45,10 @@ export default function JobNotesContainer({ jobId }) {
notification["success"]({
message: t("notes.successes.deleted"),
});
+ insertAuditTrail({
+ jobid: jobId,
+ operation: AuditTrailMapping.jobnotedeleted(),
+ });
});
setDeleteLoading(false);
};
diff --git a/client/src/components/note-upsert-modal/note-upsert-modal.container.jsx b/client/src/components/note-upsert-modal/note-upsert-modal.container.jsx
index 487de84b4..38d83a302 100644
--- a/client/src/components/note-upsert-modal/note-upsert-modal.container.jsx
+++ b/client/src/components/note-upsert-modal/note-upsert-modal.container.jsx
@@ -10,6 +10,8 @@ import { selectNoteUpsert } from "../../redux/modals/modals.selectors";
import { selectCurrentUser } from "../../redux/user/user.selectors";
import NoteUpsertModalComponent from "./note-upsert-modal.component";
import { logImEXEvent } from "../../firebase/firebase.utils";
+import { insertAuditTrail } from "../../redux/application/application.actions";
+import AuditTrailMapping from "../../utils/AuditTrailMappings";
const mapStateToProps = createStructuredSelector({
currentUser: selectCurrentUser,
@@ -17,12 +19,15 @@ const mapStateToProps = createStructuredSelector({
});
const mapDispatchToProps = (dispatch) => ({
toggleModalVisible: () => dispatch(toggleModalVisible("noteUpsert")),
+ insertAuditTrail: ({ jobid, operation }) =>
+ dispatch(insertAuditTrail({ jobid, operation })),
});
export function NoteUpsertModalContainer({
currentUser,
noteUpsertModal,
toggleModalVisible,
+ insertAuditTrail,
}) {
const { t } = useTranslation();
const [insertNote] = useMutation(INSERT_NEW_NOTE);
@@ -56,6 +61,10 @@ export function NoteUpsertModalContainer({
notification["success"]({
message: t("notes.successes.updated"),
});
+ insertAuditTrail({
+ jobid: context.jobId,
+ operation: AuditTrailMapping.jobnoteupdated(),
+ });
});
if (refetch) refetch();
toggleModalVisible();
@@ -75,6 +84,10 @@ export function NoteUpsertModalContainer({
notification["success"]({
message: t("notes.successes.create"),
});
+ insertAuditTrail({
+ jobid: context.jobId,
+ operation: AuditTrailMapping.jobnoteadded(),
+ });
});
}
};
diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json
index be00088c6..5d11c4007 100644
--- a/client/src/translations/en_us/common.json
+++ b/client/src/translations/en_us/common.json
@@ -96,6 +96,9 @@
"jobimported": "Job imported.",
"jobinproductionchange": "Job production status set to {{inproduction}}",
"jobmodifylbradj": "Labor adjustments modified.",
+ "jobnoteadded": "Note added to job.",
+ "jobnotedeleted": "Note deleted from job.",
+ "jobnoteupdated": "Note updated on job.",
"jobspartsorder": "Parts order {{order_number}} added to job.",
"jobspartsreturn": "Parts return {{order_number}} added to job.",
"jobstatuschange": "Job status changed to {{status}}.",
diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json
index 41c153e0e..37a8f3555 100644
--- a/client/src/translations/es/common.json
+++ b/client/src/translations/es/common.json
@@ -96,6 +96,9 @@
"jobimported": "",
"jobinproductionchange": "",
"jobmodifylbradj": "",
+ "jobnoteadded": "",
+ "jobnotedeleted": "",
+ "jobnoteupdated": "",
"jobspartsorder": "",
"jobspartsreturn": "",
"jobstatuschange": "",
diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json
index e6df8c7cc..a54e9e66d 100644
--- a/client/src/translations/fr/common.json
+++ b/client/src/translations/fr/common.json
@@ -96,6 +96,9 @@
"jobimported": "",
"jobinproductionchange": "",
"jobmodifylbradj": "",
+ "jobnoteadded": "",
+ "jobnotedeleted": "",
+ "jobnoteupdated": "",
"jobspartsorder": "",
"jobspartsreturn": "",
"jobstatuschange": "",
diff --git a/client/src/utils/AuditTrailMappings.js b/client/src/utils/AuditTrailMappings.js
index 810c3ec86..e0d43b098 100644
--- a/client/src/utils/AuditTrailMappings.js
+++ b/client/src/utils/AuditTrailMappings.js
@@ -26,6 +26,9 @@ const AuditTrailMapping = {
i18n.t("audit_trail.messages.jobinproductionchange", { inproduction }),
jobchecklist: (type, inproduction, status) =>
i18n.t("audit_trail.messages.jobchecklist", { type, inproduction, status }),
+ jobnoteadded: () => i18n.t("audit_trail.messages.jobnoteadded"),
+ jobnoteupdated: () => i18n.t("audit_trail.messages.jobnoteupdated"),
+ jobnotedeleted: () => i18n.t("audit_trail.messages.jobnotedeleted"),
};
export default AuditTrailMapping;
From 637c718b05169d14ff9ffbb509812ad3ae48f04c Mon Sep 17 00:00:00 2001
From: Patrick Fic <>
Date: Thu, 23 Sep 2021 10:36:27 -0700
Subject: [PATCH 2/3] IO-1227 Add sold status to filter for CC
---
.../courtesy-cars-list/courtesy-cars-list.component.jsx | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/client/src/components/courtesy-cars-list/courtesy-cars-list.component.jsx b/client/src/components/courtesy-cars-list/courtesy-cars-list.component.jsx
index d531606e5..000f56a3a 100644
--- a/client/src/components/courtesy-cars-list/courtesy-cars-list.component.jsx
+++ b/client/src/components/courtesy-cars-list/courtesy-cars-list.component.jsx
@@ -45,6 +45,10 @@ export default function CourtesyCarsList({ loading, courtesycars, refetch }) {
text: t("courtesycars.status.out"),
value: "courtesycars.status.out",
},
+ {
+ text: t("courtesycars.status.sold"),
+ value: "courtesycars.status.sold",
+ },
],
onFilter: (value, record) => value.includes(record.status),
sortOrder:
From 0ba445aad26b83ce156fd571a7b1c82bd74e8fb8 Mon Sep 17 00:00:00 2001
From: Patrick Fic <>
Date: Thu, 23 Sep 2021 10:38:22 -0700
Subject: [PATCH 3/3] IO-1228 Report Center grouping change.
---
.../report-center-modal/report-center-modal.component.jsx | 2 +-
client/src/utils/TemplateConstants.js | 6 +++---
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/client/src/components/report-center-modal/report-center-modal.component.jsx b/client/src/components/report-center-modal/report-center-modal.component.jsx
index f49836380..d51a6333d 100644
--- a/client/src/components/report-center-modal/report-center-modal.component.jsx
+++ b/client/src/components/report-center-modal/report-center-modal.component.jsx
@@ -153,7 +153,7 @@ export function ReportCenterModalComponent({ reportCenterModal }) {
{t(`reportcenter.labels.groups.${key}`)}
-
+
{grouped[key].map((item) => (
-
diff --git a/client/src/utils/TemplateConstants.js b/client/src/utils/TemplateConstants.js
index 1892a6c07..8799a87ef 100644
--- a/client/src/utils/TemplateConstants.js
+++ b/client/src/utils/TemplateConstants.js
@@ -1226,7 +1226,7 @@ export const TemplateList = (type, context) => {
object: i18n.t("reportcenter.labels.objects.jobs"),
field: i18n.t("jobs.fields.date_open"),
},
- group: "jobs",
+ group: "payroll",
},
work_in_progress_labour: {
title: i18n.t("reportcenter.templates.work_in_progress_labour"),
@@ -1278,7 +1278,7 @@ export const TemplateList = (type, context) => {
object: i18n.t("reportcenter.labels.objects.parts_orders"),
field: i18n.t("parts_orders.fields.order_date"),
},
- group: "jobs",
+ group: "purchases",
},
scoreboard_detail: {
title: i18n.t("reportcenter.templates.scoreboard_detail"),
@@ -1330,7 +1330,7 @@ export const TemplateList = (type, context) => {
object: i18n.t("reportcenter.labels.objects.csi"),
field: i18n.t("csi.fields.created_at"), // Also date invoice.
},
- group: "jobs",
+ group: "customers",
},
}
: {}),