diff --git a/client/src/components/header/header.component.jsx b/client/src/components/header/header.component.jsx index 81f11c338..bc5b4c795 100644 --- a/client/src/components/header/header.component.jsx +++ b/client/src/components/header/header.component.jsx @@ -1,10 +1,9 @@ -import { useTreatments } from "@splitsoftware/splitio-react"; import Icon, { BankFilled, BarChartOutlined, CarFilled, - ClockCircleFilled, CheckCircleOutlined, + ClockCircleFilled, DashboardFilled, DollarCircleFilled, ExportOutlined, @@ -26,6 +25,7 @@ import Icon, { UnorderedListOutlined, UserOutlined, } from "@ant-design/icons"; +import { useTreatments } from "@splitsoftware/splitio-react"; import { Layout, Menu } from "antd"; import React from "react"; import { useTranslation } from "react-i18next"; @@ -275,7 +275,11 @@ function Header({ onClick={() => { setTimeTicketContext({ actions: {}, - context: {}, + context: { + created_by: currentUser.displayName + ? currentUser.email.concat(" | ", currentUser.displayName) + : currentUser.email, + }, }); }} > diff --git a/client/src/components/tech-job-clock-in-form/tech-job-clock-in-form.container.jsx b/client/src/components/tech-job-clock-in-form/tech-job-clock-in-form.container.jsx index 838c83851..693c685a9 100644 --- a/client/src/components/tech-job-clock-in-form/tech-job-clock-in-form.container.jsx +++ b/client/src/components/tech-job-clock-in-form/tech-job-clock-in-form.container.jsx @@ -1,22 +1,26 @@ import { useMutation } from "@apollo/client"; import { Button, Card, Form, notification, Space } from "antd"; import axios from "axios"; +import moment from "moment"; import React, { useState } from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; import { INSERT_NEW_TIME_TICKET } from "../../graphql/timetickets.queries"; -import { selectTechnician } from "../../redux/tech/tech.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import TechClockInComponent from "./tech-job-clock-in-form.component"; -import TechJobPrintTickets from "../tech-job-print-tickets/tech-job-print-tickets.component"; -import moment from "moment"; import { setModalContext } from "../../redux/modals/modals.actions"; +import { selectTechnician } from "../../redux/tech/tech.selectors"; +import { + selectBodyshop, + selectCurrentUser, +} from "../../redux/user/user.selectors"; +import TechJobPrintTickets from "../tech-job-print-tickets/tech-job-print-tickets.component"; +import TechClockInComponent from "./tech-job-clock-in-form.component"; import { useTreatments } from "@splitsoftware/splitio-react"; const mapStateToProps = createStructuredSelector({ technician: selectTechnician, bodyshop: selectBodyshop, + currentUser: selectCurrentUser, }); const mapDispatchToProps = (dispatch) => ({ setTimeTicketContext: (context) => @@ -26,6 +30,7 @@ export function TechClockInContainer({ setTimeTicketContext, technician, bodyshop, + currentUser, }) { const { Enhanced_Payroll } = useTreatments( ["Enhanced_Payroll"], @@ -68,6 +73,12 @@ export function TechClockInContainer({ values.cost_center ); }), + created_by: currentUser.email.concat( + " | ", + technician.employee_number + .concat(" ", technician.first_name, " ", technician.last_name) + .trim() + ), }, ], }, @@ -102,6 +113,17 @@ export function TechClockInContainer({ employeeid: technician.id, flat_rate: emps.flat_rate, }, + created_by: currentUser.email.concat( + " | ", + technician.employee_number + .concat( + " ", + technician.first_name, + " ", + technician.last_name + ) + .trim() + ), }, }); }} diff --git a/client/src/components/time-ticket-list/time-ticket-list.component.jsx b/client/src/components/time-ticket-list/time-ticket-list.component.jsx index bec365c54..9bb6c00f9 100644 --- a/client/src/components/time-ticket-list/time-ticket-list.component.jsx +++ b/client/src/components/time-ticket-list/time-ticket-list.component.jsx @@ -10,6 +10,7 @@ import { setModalContext } from "../../redux/modals/modals.actions"; import { selectAuthLevel, selectBodyshop, + selectCurrentUser, } from "../../redux/user/user.selectors"; import { DateFormatter, DateTimeFormatter } from "../../utils/DateFormatter"; import { onlyUnique } from "../../utils/arrayHelper"; @@ -23,6 +24,7 @@ import { useTreatments } from "@splitsoftware/splitio-react"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, authLevel: selectAuthLevel, + currentUser: selectCurrentUser, }); const mapDispatchToProps = (dispatch) => ({ setTimeTicketTaskContext: (context) => @@ -34,6 +36,7 @@ export function TimeTicketList({ bodyshop, setTimeTicketTaskContext, authLevel, + currentUser, disabled, loading, timetickets, @@ -238,7 +241,15 @@ export function TimeTicketList({ }, }, ]), - + { + title: t("timetickets.fields.created_by"), + dataIndex: "created_by", + key: "created_by", + sorter: (a, b) => alphaSort(a.created_by, b.created_by), + sortOrder: + state.sortedInfo.columnKey === "created_by" && state.sortedInfo.order, + render: (text, record) => record.created_by, + }, // { // title: "Pay", // dataIndex: "pay", @@ -326,7 +337,12 @@ export function TimeTicketList({ (techConsole ? null : ( {t("timetickets.actions.enter")} diff --git a/client/src/components/time-ticket-modal/time-ticket-modal.container.jsx b/client/src/components/time-ticket-modal/time-ticket-modal.container.jsx index e70cc4e5c..ca8726893 100644 --- a/client/src/components/time-ticket-modal/time-ticket-modal.container.jsx +++ b/client/src/components/time-ticket-modal/time-ticket-modal.container.jsx @@ -1,5 +1,5 @@ import { useMutation, useQuery } from "@apollo/client"; -import { Button, Form, Modal, notification, PageHeader, Space } from "antd"; +import { Button, Form, Modal, PageHeader, Space, notification } from "antd"; import moment from "moment"; import React, { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; @@ -83,6 +83,7 @@ export function TimeTicketModalContainer({ )[0].rate : null, bodyshopid: bodyshop.id, + created_by: timeTicketModal.context.created_by, }, ], }, diff --git a/client/src/components/time-ticket-shift-form/time-ticket-shift-form.container.jsx b/client/src/components/time-ticket-shift-form/time-ticket-shift-form.container.jsx index 3234039f9..4ec7ae140 100644 --- a/client/src/components/time-ticket-shift-form/time-ticket-shift-form.container.jsx +++ b/client/src/components/time-ticket-shift-form/time-ticket-shift-form.container.jsx @@ -65,6 +65,21 @@ export function TimeTicektShiftContainer({ clockon: theTime, date: theTime, memo: values.memo, + created_by: isTechConsole + ? currentUser.email.concat( + " | ", + technician.employee_number + .concat( + " ", + technician.first_name, + " ", + technician.last_name + ) + .trim() + ) + : currentUser.displayName + ? currentUser.email.concat(" | ", currentUser.displayName) + : currentUser.email, }, ], }, diff --git a/client/src/graphql/jobs-lines.queries.js b/client/src/graphql/jobs-lines.queries.js index 13fd03412..47c382054 100644 --- a/client/src/graphql/jobs-lines.queries.js +++ b/client/src/graphql/jobs-lines.queries.js @@ -57,6 +57,7 @@ export const GET_LINE_TICKET_BY_PK = gql` actualhrs ciecacode cost_center + created_by date id jobid diff --git a/client/src/graphql/timetickets.queries.js b/client/src/graphql/timetickets.queries.js index 969b3ec18..35c54f28f 100644 --- a/client/src/graphql/timetickets.queries.js +++ b/client/src/graphql/timetickets.queries.js @@ -39,6 +39,7 @@ export const QUERY_TIME_TICKETS_IN_RANGE = gql` clockon cost_center created_at + created_by date id rate @@ -85,6 +86,7 @@ export const QUERY_TIME_TICKETS_TECHNICIAN_IN_RANGE = gql` clockon cost_center created_at + created_by date id rate @@ -119,6 +121,7 @@ export const QUERY_TIME_TICKETS_TECHNICIAN_IN_RANGE = gql` clockon cost_center created_at + created_by date id rate @@ -160,6 +163,7 @@ export const QUERY_TIME_TICKETS_IN_RANGE_SB = gql` clockon cost_center created_at + created_by date id rate @@ -194,6 +198,7 @@ export const QUERY_TIME_TICKETS_IN_RANGE_SB = gql` clockon cost_center created_at + created_by date id rate @@ -223,6 +228,7 @@ export const INSERT_NEW_TIME_TICKET = gql` insert_timetickets(objects: $timeTicketInput) { returning { id + created_by clockon clockoff employeeid diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json index 295562f11..beafdd55a 100644 --- a/client/src/translations/en_us/common.json +++ b/client/src/translations/en_us/common.json @@ -2766,6 +2766,7 @@ "clockon": "Clocked In", "committed": "Committed", "cost_center": "Cost Center", + "created_by": "Created By", "date": "Ticket Date", "efficiency": "Efficiency", "employee": "Employee", diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json index 13077359b..0239ac1d0 100644 --- a/client/src/translations/es/common.json +++ b/client/src/translations/es/common.json @@ -2766,6 +2766,7 @@ "clockon": "", "committed": "", "cost_center": "", + "created_by": "", "date": "", "efficiency": "", "employee": "", diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json index aaa786ee7..a017932ac 100644 --- a/client/src/translations/fr/common.json +++ b/client/src/translations/fr/common.json @@ -2766,6 +2766,7 @@ "clockon": "", "committed": "", "cost_center": "", + "created_by": "", "date": "", "efficiency": "", "employee": "", diff --git a/client/src/utils/TemplateConstants.js b/client/src/utils/TemplateConstants.js index e9e8e9b6a..65989ac84 100644 --- a/client/src/utils/TemplateConstants.js +++ b/client/src/utils/TemplateConstants.js @@ -1049,7 +1049,7 @@ export const TemplateList = (type, context) => { disabled: false, rangeFilter: { object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_open"), + field: i18n.t("jobs.fields.date_invoiced"), }, group: "jobs", }, diff --git a/hasura/metadata/tables.yaml b/hasura/metadata/tables.yaml index a24db9297..2e44c4b14 100644 --- a/hasura/metadata/tables.yaml +++ b/hasura/metadata/tables.yaml @@ -5556,6 +5556,7 @@ - committed_at - cost_center - created_at + - created_by - date - employeeid - flat_rate @@ -5580,6 +5581,7 @@ - committed_at - cost_center - created_at + - created_by - date - employeeid - flat_rate @@ -5613,6 +5615,7 @@ - committed_at - cost_center - created_at + - created_by - date - employeeid - flat_rate diff --git a/hasura/migrations/1691614820968_alter_table_public_timetickets_add_column_created_by/down.sql b/hasura/migrations/1691614820968_alter_table_public_timetickets_add_column_created_by/down.sql new file mode 100644 index 000000000..1877b51f0 --- /dev/null +++ b/hasura/migrations/1691614820968_alter_table_public_timetickets_add_column_created_by/down.sql @@ -0,0 +1,4 @@ +-- Could not auto-generate a down migration. +-- Please write an appropriate down migration for the SQL below: +-- alter table "public"."timetickets" add column "created_by" text +-- null; diff --git a/hasura/migrations/1691614820968_alter_table_public_timetickets_add_column_created_by/up.sql b/hasura/migrations/1691614820968_alter_table_public_timetickets_add_column_created_by/up.sql new file mode 100644 index 000000000..927b24b87 --- /dev/null +++ b/hasura/migrations/1691614820968_alter_table_public_timetickets_add_column_created_by/up.sql @@ -0,0 +1,2 @@ +alter table "public"."timetickets" add column "created_by" text + null; diff --git a/server/graphql-client/queries.js b/server/graphql-client/queries.js index 731d317ff..413855caf 100644 --- a/server/graphql-client/queries.js +++ b/server/graphql-client/queries.js @@ -656,6 +656,7 @@ exports.QUERY_EMPLOYEE_PIN = `query QUERY_EMPLOYEE_PIN($shopId: uuid!, $employee employee_number id pin + active } }`; diff --git a/server/tech/tech.js b/server/tech/tech.js index 6709deffc..51839e186 100644 --- a/server/tech/tech.js +++ b/server/tech/tech.js @@ -23,7 +23,7 @@ exports.techLogin = async (req, res) => { let technician; if (result.employees && result.employees[0]) { const dbRecord = result.employees[0]; - if (dbRecord.pin === pin) { + if (dbRecord.pin === pin && dbRecord.active === true) { valid = true; delete dbRecord.pin; technician = dbRecord;