diff --git a/client/src/components/jobs-documents-gallery/jobs-documents-gallery.component.jsx b/client/src/components/jobs-documents-gallery/jobs-documents-gallery.component.jsx index 2e343ea44..d7e930e8b 100644 --- a/client/src/components/jobs-documents-gallery/jobs-documents-gallery.component.jsx +++ b/client/src/components/jobs-documents-gallery/jobs-documents-gallery.component.jsx @@ -34,8 +34,8 @@ function JobsDocumentsComponent({ const fileType = DetermineFileType(value.type); if (value.type.startsWith("image")) { acc.images.push({ - src: GenerateSrcUrl(value), - thumbnail: GenerateThumbUrl(value), + // src: GenerateSrcUrl(value), + src: GenerateThumbUrl(value), // src: GenerateSrcUrl(value), // thumbnail: GenerateThumbUrl(value), fullsize: GenerateSrcUrl(value), diff --git a/client/src/components/jobs-documents-gallery/jobs-documents-gallery.external.component.jsx b/client/src/components/jobs-documents-gallery/jobs-documents-gallery.external.component.jsx index 5465bbf5c..2ff912930 100644 --- a/client/src/components/jobs-documents-gallery/jobs-documents-gallery.external.component.jsx +++ b/client/src/components/jobs-documents-gallery/jobs-documents-gallery.external.component.jsx @@ -1,7 +1,7 @@ import React, { useEffect } from "react"; import { Gallery } from "react-grid-gallery"; import { useTranslation } from "react-i18next"; -import { GenerateSrcUrl, GenerateThumbUrl } from "./job-documents.utility"; +import { GenerateThumbUrl } from "./job-documents.utility"; function JobsDocumentGalleryExternal({ data, @@ -15,8 +15,8 @@ function JobsDocumentGalleryExternal({ let documents = data.reduce((acc, value) => { if (value.type.startsWith("image")) { acc.push({ - src: GenerateSrcUrl(value), - thumbnail: GenerateThumbUrl(value), + //src: GenerateSrcUrl(value), + src: GenerateThumbUrl(value), thumbnailHeight: 225, thumbnailWidth: 225, isSelected: false, 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 e0db4f516..913d27282 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 @@ -92,7 +92,11 @@ export function ReportCenterModalComponent({ reportCenterModal }) { to: values.to, subject: Templates[values.key]?.subject, }, - values.sendby === "email" ? "e" : "p", + values.sendbyexcel === "excel" + ? "x" + : values.sendby === "email" + ? "e" + : "p", id ); setLoading(false); @@ -250,15 +254,38 @@ export function ReportCenterModalComponent({ reportCenterModal }) { ranges={DatePIckerRanges} /> - - - {t("general.labels.email")} - {t("general.labels.print")} - + + {() => { + const key = form.getFieldValue("key"); + //Kind of Id + const reporttype = Templates[key] && Templates[key].reporttype; + + if (reporttype === "excel") + return ( + + + {t("general.labels.excel")} + + + ); + if (reporttype !== "excel") + return ( + + + {t("general.labels.email")} + {t("general.labels.print")} + + + ); + }}
{ disabled: false, group: "authorization", }, - fippa_authorization: { title: i18n.t("printcenter.jobs.fippa_authorization"), description: "CASL Authorization", @@ -101,7 +100,6 @@ export const TemplateList = (type, context) => { disabled: false, group: "ro", }, - job_notes: { title: i18n.t("printcenter.jobs.job_notes"), description: "All Jobs Notes", @@ -330,7 +328,6 @@ export const TemplateList = (type, context) => { disabled: false, group: "post", }, - vehicle_delivery_check: { title: i18n.t("printcenter.jobs.vehicle_delivery_check"), description: "All Jobs Notes", @@ -339,7 +336,6 @@ export const TemplateList = (type, context) => { disabled: false, group: "post", }, - guarantee: { title: i18n.t("printcenter.jobs.guarantee"), description: "All Jobs Notes", @@ -496,6 +492,14 @@ export const TemplateList = (type, context) => { disabled: false, group: "financial", }, + dms_posting_sheet: { + title: i18n.t("printcenter.jobs.dms_posting_sheet"), + description: "DMS Posting Sheet", + subject: i18n.t("printcenter.jobs.dms_posting_sheet"), + key: "dms_posting_sheet", + disabled: false, + group: "financial", + }, } : {}), ...(!type || type === "job_special" @@ -622,7 +626,6 @@ export const TemplateList = (type, context) => { }, group: "sales", }, - hours_sold_detail_closed_ins_co: { title: i18n.t( "reportcenter.templates.hours_sold_detail_closed_ins_co" @@ -640,7 +643,6 @@ export const TemplateList = (type, context) => { }, group: "sales", }, - hours_sold_summary_closed: { title: i18n.t("reportcenter.templates.hours_sold_summary_closed"), description: "", @@ -654,7 +656,6 @@ export const TemplateList = (type, context) => { }, group: "sales", }, - hours_sold_summary_closed_ins_co: { title: i18n.t( "reportcenter.templates.hours_sold_summary_closed_ins_co" @@ -672,7 +673,6 @@ export const TemplateList = (type, context) => { }, group: "sales", }, - hours_sold_detail_open: { title: i18n.t("reportcenter.templates.hours_sold_detail_open"), description: "", @@ -686,7 +686,6 @@ export const TemplateList = (type, context) => { }, group: "sales", }, - hours_sold_detail_open_ins_co: { title: i18n.t( "reportcenter.templates.hours_sold_detail_open_ins_co" @@ -704,7 +703,6 @@ export const TemplateList = (type, context) => { }, group: "sales", }, - hours_sold_summary_open: { title: i18n.t("reportcenter.templates.hours_sold_summary_open"), description: "", @@ -718,7 +716,6 @@ export const TemplateList = (type, context) => { }, group: "sales", }, - hours_sold_summary_open_ins_co: { title: i18n.t( "reportcenter.templates.hours_sold_summary_open_ins_co" @@ -736,7 +733,6 @@ export const TemplateList = (type, context) => { }, group: "sales", }, - hours_sold_detail_closed_csr: { title: i18n.t( "reportcenter.templates.hours_sold_detail_closed_csr" @@ -1090,7 +1086,6 @@ export const TemplateList = (type, context) => { }, group: "customers", }, - schedule: { title: i18n.t("reportcenter.templates.schedule"), subject: i18n.t("reportcenter.templates.schedule"), @@ -1102,7 +1097,6 @@ export const TemplateList = (type, context) => { }, group: "customers", }, - timetickets: { title: i18n.t("reportcenter.templates.timetickets"), subject: i18n.t("reportcenter.templates.timetickets"), @@ -1126,7 +1120,6 @@ export const TemplateList = (type, context) => { title: i18n.t("reportcenter.templates.attendance_detail"), subject: i18n.t("reportcenter.templates.attendance_detail"), key: "attendance_detail", - disabled: false, rangeFilter: { object: i18n.t("reportcenter.labels.objects.timetickets"), @@ -1138,7 +1131,6 @@ export const TemplateList = (type, context) => { title: i18n.t("reportcenter.templates.attendance_summary"), subject: i18n.t("reportcenter.templates.attendance_summary"), key: "attendance_summary", - disabled: false, rangeFilter: { object: i18n.t("reportcenter.labels.objects.timetickets"), @@ -1158,7 +1150,6 @@ export const TemplateList = (type, context) => { }, group: "payroll", }, - timetickets_summary: { title: i18n.t("reportcenter.templates.timetickets_summary"), subject: i18n.t("reportcenter.templates.timetickets_summary"), @@ -1171,7 +1162,6 @@ export const TemplateList = (type, context) => { }, group: "payroll", }, - estimator_detail: { title: i18n.t("reportcenter.templates.estimator_detail"), description: "", @@ -1224,7 +1214,6 @@ export const TemplateList = (type, context) => { }, group: "purchases", }, - void_ros: { title: i18n.t("reportcenter.templates.void_ros"), description: "", @@ -1329,7 +1318,6 @@ export const TemplateList = (type, context) => { }, group: "sales", }, - gsr_by_estimator: { title: i18n.t("reportcenter.templates.gsr_by_estimator"), description: "", @@ -1814,7 +1802,9 @@ export const TemplateList = (type, context) => { group: "jobs", }, purchase_return_ratio_grouped_by_vendor_detail: { - title: i18n.t("reportcenter.templates.purchase_return_ratio_grouped_by_vendor_detail"), + title: i18n.t( + "reportcenter.templates.purchase_return_ratio_grouped_by_vendor_detail" + ), subject: i18n.t( "reportcenter.templates.purchase_return_ratio_grouped_by_vendor_detail" ), @@ -1828,7 +1818,9 @@ export const TemplateList = (type, context) => { group: "purchases", }, purchase_return_ratio_grouped_by_vendor_summary: { - title: i18n.t("reportcenter.templates.purchase_return_ratio_grouped_by_vendor_summary"), + title: i18n.t( + "reportcenter.templates.purchase_return_ratio_grouped_by_vendor_summary" + ), subject: i18n.t( "reportcenter.templates.purchase_return_ratio_grouped_by_vendor_summary" ), @@ -1843,9 +1835,7 @@ export const TemplateList = (type, context) => { }, production_over_time: { title: i18n.t("reportcenter.templates.production_over_time"), - subject: i18n.t( - "reportcenter.templates.production_over_time" - ), + subject: i18n.t("reportcenter.templates.production_over_time"), key: "production_over_time", //idtype: "vendor", disabled: false, @@ -1857,9 +1847,7 @@ export const TemplateList = (type, context) => { }, customer_list: { title: i18n.t("reportcenter.templates.customer_list"), - subject: i18n.t( - "reportcenter.templates.customer_list" - ), + subject: i18n.t("reportcenter.templates.customer_list"), key: "customer_list", //idtype: "vendor", disabled: false, @@ -1869,6 +1857,32 @@ export const TemplateList = (type, context) => { }, group: "customers", }, + exported_gsr_by_ro: { + title: i18n.t("reportcenter.templates.exported_gsr_by_ro"), + subject: i18n.t("reportcenter.templates.exported_gsr_by_ro"), + key: "exported_gsr_by_ro", + //idtype: "vendor", + reporttype: "excel", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_exported"), + }, + group: "sales", + }, + exported_gsr_by_ro_labor: { + title: i18n.t("reportcenter.templates.exported_gsr_by_ro_labor"), + subject: i18n.t("reportcenter.templates.exported_gsr_by_ro_labor"), + key: "exported_gsr_by_ro_labor", + //idtype: "vendor", + reporttype: "excel", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.jobs"), + field: i18n.t("jobs.fields.date_exported"), + }, + group: "sales", + }, } : {}), ...(!type || type === "courtesycarcontract" @@ -1963,7 +1977,6 @@ export const TemplateList = (type, context) => { }, } : {}), - ...(!type || type === "production" ? { production_by_last_name: { diff --git a/hasura/metadata/tables.yaml b/hasura/metadata/tables.yaml index a456a9a0f..5a3212f7c 100644 --- a/hasura/metadata/tables.yaml +++ b/hasura/metadata/tables.yaml @@ -831,6 +831,13 @@ table: name: transitions schema: public + - name: tt_approval_queues + using: + foreign_key_constraint_on: + column: bodyshopid + table: + name: tt_approval_queue + schema: public - name: vehicles using: foreign_key_constraint_on: @@ -2262,6 +2269,13 @@ table: name: timetickets schema: public + - name: tt_approval_queues + using: + foreign_key_constraint_on: + column: employeeid + table: + name: tt_approval_queue + schema: public insert_permissions: - role: user permission: @@ -3145,6 +3159,13 @@ table: name: transitions schema: public + - name: tt_approval_queues + using: + foreign_key_constraint_on: + column: jobid + table: + name: tt_approval_queue + schema: public insert_permissions: - role: user permission: @@ -5210,6 +5231,14 @@ - name: job using: foreign_key_constraint_on: jobid + array_relationships: + - name: tt_approval_queues + using: + foreign_key_constraint_on: + column: timeticketid + table: + name: tt_approval_queue + schema: public insert_permissions: - role: user permission: @@ -5228,6 +5257,7 @@ - ciecacode - clockoff - clockon + - committed_at - cost_center - created_at - date @@ -5248,6 +5278,7 @@ - ciecacode - clockoff - clockon + - committed_at - cost_center - created_at - date @@ -5277,6 +5308,7 @@ - ciecacode - clockoff - clockon + - committed_at - cost_center - created_at - date @@ -5397,6 +5429,116 @@ authid: _eq: X-Hasura-User-Id check: {} +- table: + name: tt_approval_queue + schema: public + object_relationships: + - name: bodyshop + using: + foreign_key_constraint_on: bodyshopid + - name: employee + using: + foreign_key_constraint_on: employeeid + - name: job + using: + foreign_key_constraint_on: jobid + - name: timeticket + using: + foreign_key_constraint_on: timeticketid + - name: user + using: + foreign_key_constraint_on: approved_by + insert_permissions: + - role: user + permission: + check: + bodyshop: + associations: + _and: + - active: + _eq: true + - user: + authid: + _eq: X-Hasura-User-Id + columns: + - id + - created_at + - updated_at + - bodyshopid + - jobid + - employeeid + - timeticketid + - approved_by + - approved_at + - actualhrs + - productivehrs + - rate + - flat_rate + - ciecacode + - cost_center + - date + - memo + select_permissions: + - role: user + permission: + columns: + - flat_rate + - date + - actualhrs + - productivehrs + - rate + - approved_by + - ciecacode + - cost_center + - memo + - approved_at + - created_at + - updated_at + - bodyshopid + - employeeid + - id + - jobid + - timeticketid + filter: + bodyshop: + associations: + _and: + - active: + _eq: true + - user: + authid: + _eq: X-Hasura-User-Id + update_permissions: + - role: user + permission: + columns: + - flat_rate + - date + - actualhrs + - productivehrs + - rate + - approved_by + - ciecacode + - cost_center + - memo + - approved_at + - created_at + - updated_at + - bodyshopid + - employeeid + - id + - jobid + - timeticketid + filter: + bodyshop: + associations: + _and: + - active: + _eq: true + - user: + authid: + _eq: X-Hasura-User-Id + check: null - table: name: users schema: public @@ -5467,6 +5609,13 @@ table: name: parts_orders schema: public + - name: tt_approval_queues + using: + foreign_key_constraint_on: + column: approved_by + table: + name: tt_approval_queue + schema: public insert_permissions: - role: user permission: diff --git a/hasura/migrations/1682027512494_alter_table_public_timetickets_add_column_committed_at/down.sql b/hasura/migrations/1682027512494_alter_table_public_timetickets_add_column_committed_at/down.sql new file mode 100644 index 000000000..7a27fe19f --- /dev/null +++ b/hasura/migrations/1682027512494_alter_table_public_timetickets_add_column_committed_at/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 "committed_at" timestamptz +-- null; diff --git a/hasura/migrations/1682027512494_alter_table_public_timetickets_add_column_committed_at/up.sql b/hasura/migrations/1682027512494_alter_table_public_timetickets_add_column_committed_at/up.sql new file mode 100644 index 000000000..755139538 --- /dev/null +++ b/hasura/migrations/1682027512494_alter_table_public_timetickets_add_column_committed_at/up.sql @@ -0,0 +1,2 @@ +alter table "public"."timetickets" add column "committed_at" timestamptz + null; diff --git a/hasura/migrations/1682028025082_create_table_public_tt_approval_queue/down.sql b/hasura/migrations/1682028025082_create_table_public_tt_approval_queue/down.sql new file mode 100644 index 000000000..624fb0e17 --- /dev/null +++ b/hasura/migrations/1682028025082_create_table_public_tt_approval_queue/down.sql @@ -0,0 +1 @@ +DROP TABLE "public"."tt_approval_queue"; diff --git a/hasura/migrations/1682028025082_create_table_public_tt_approval_queue/up.sql b/hasura/migrations/1682028025082_create_table_public_tt_approval_queue/up.sql new file mode 100644 index 000000000..96ba736a7 --- /dev/null +++ b/hasura/migrations/1682028025082_create_table_public_tt_approval_queue/up.sql @@ -0,0 +1,18 @@ +CREATE TABLE "public"."tt_approval_queue" ("id" uuid NOT NULL DEFAULT gen_random_uuid(), "created_at" timestamptz NOT NULL DEFAULT now(), "updated_at" timestamptz NOT NULL DEFAULT now(), "bodyshopid" uuid NOT NULL, "jobid" uuid NOT NULL, "employeeid" uuid NOT NULL, "timeticketid" uuid, "approved_by" text, "approved_at" timestamptz NOT NULL, "actualhrs" numeric NOT NULL DEFAULT 0, "productivehrs" numeric NOT NULL DEFAULT 0, "rate" numeric NOT NULL DEFAULT 0, "flat_rate" boolean NOT NULL DEFAULT true, "ciecacode" text, "cost_center" text NOT NULL, "date" date NOT NULL DEFAULT now(), "memo" text NOT NULL, PRIMARY KEY ("id") , FOREIGN KEY ("bodyshopid") REFERENCES "public"."bodyshops"("id") ON UPDATE cascade ON DELETE cascade, FOREIGN KEY ("jobid") REFERENCES "public"."jobs"("id") ON UPDATE cascade ON DELETE cascade, FOREIGN KEY ("employeeid") REFERENCES "public"."employees"("id") ON UPDATE cascade ON DELETE cascade, FOREIGN KEY ("timeticketid") REFERENCES "public"."timetickets"("id") ON UPDATE cascade ON DELETE cascade, FOREIGN KEY ("approved_by") REFERENCES "public"."users"("email") ON UPDATE restrict ON DELETE restrict); +CREATE OR REPLACE FUNCTION "public"."set_current_timestamp_updated_at"() +RETURNS TRIGGER AS $$ +DECLARE + _new record; +BEGIN + _new := NEW; + _new."updated_at" = NOW(); + RETURN _new; +END; +$$ LANGUAGE plpgsql; +CREATE TRIGGER "set_public_tt_approval_queue_updated_at" +BEFORE UPDATE ON "public"."tt_approval_queue" +FOR EACH ROW +EXECUTE PROCEDURE "public"."set_current_timestamp_updated_at"(); +COMMENT ON TRIGGER "set_public_tt_approval_queue_updated_at" ON "public"."tt_approval_queue" +IS 'trigger to set value of column "updated_at" to current timestamp on row update'; +CREATE EXTENSION IF NOT EXISTS pgcrypto; diff --git a/server/job/job-status-transition.js b/server/job/job-status-transition.js index 8ac622bef..4b6a7db76 100644 --- a/server/job/job-status-transition.js +++ b/server/job/job-status-transition.js @@ -20,7 +20,8 @@ async function StatusTransition(req, res) { res.status(403).send("Unauthorized"); return; } - + res.sendStatus(200); + return; const { id: jobid, status: value, @@ -78,7 +79,7 @@ async function StatusTransition(req, res) { res.sendStatus(200); //.json(ret); } catch (error) { - logger.log("job-costing-error", "ERROR", req.user.email, jobid, { + logger.log("job-status-transition-error", "ERROR", req.user?.email, jobid, { message: error.message, stack: error.stack, });