diff --git a/client/src/App/App.styles.scss b/client/src/App/App.styles.scss index bb4824cd0..2ed11cbc6 100644 --- a/client/src/App/App.styles.scss +++ b/client/src/App/App.styles.scss @@ -143,13 +143,16 @@ } } - -//Update row highlighting on production board. +//Update row highlighting on production board. .ant-table-tbody > tr.ant-table-row:hover > td { background: #eaeaea !important; } -.job-line-manual{ +.job-line-manual { color: tomato; font-style: italic; } + +td.ant-table-column-sort { + background-color: transparent; +} diff --git a/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.external.component.jsx b/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.external.component.jsx index 49fef085e..ce8622713 100644 --- a/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.external.component.jsx +++ b/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.external.component.jsx @@ -52,11 +52,15 @@ function JobDocumentsLocalGalleryExternal({ val.type.mime && val.type.mime.startsWith("image") ) { - acc.push(val); + acc.push({ ...val, src: val.thumbnail }); } return acc; }, []) : []; + console.log( + "🚀 ~ file: jobs-documents-local-gallery.external.component.jsx:48 ~ useEffect ~ documents:", + documents + ); setgalleryImages(documents); }, [allMedia, jobId, setgalleryImages, t]); diff --git a/client/src/components/parts-order-list-table/parts-order-list-table.component.jsx b/client/src/components/parts-order-list-table/parts-order-list-table.component.jsx index 84d73d401..ffb95adcc 100644 --- a/client/src/components/parts-order-list-table/parts-order-list-table.component.jsx +++ b/client/src/components/parts-order-list-table/parts-order-list-table.component.jsx @@ -201,6 +201,7 @@ export function PartsOrderListTableComponent({ subject: record.return ? Templates.parts_return_slip.subject : Templates.parts_order.subject, + to: record.vendor.email, }} id={job.id} /> @@ -296,7 +297,6 @@ export function PartsOrderListTableComponent({ sortOrder: state.sortedInfo.columnKey === "quantity" && state.sortedInfo.order, }, - { title: t("parts_orders.fields.act_price"), dataIndex: "act_price", 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..22d75a0e8 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,117 @@ 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 + allow_aggregations: true + 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 +5610,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/hasura/migrations/1682031429191_alter_table_public_tt_approval_queue_alter_column_approved_at/down.sql b/hasura/migrations/1682031429191_alter_table_public_tt_approval_queue_alter_column_approved_at/down.sql new file mode 100644 index 000000000..e5306a3a4 --- /dev/null +++ b/hasura/migrations/1682031429191_alter_table_public_tt_approval_queue_alter_column_approved_at/down.sql @@ -0,0 +1 @@ +alter table "public"."tt_approval_queue" alter column "approved_at" set not null; diff --git a/hasura/migrations/1682031429191_alter_table_public_tt_approval_queue_alter_column_approved_at/up.sql b/hasura/migrations/1682031429191_alter_table_public_tt_approval_queue_alter_column_approved_at/up.sql new file mode 100644 index 000000000..8f899317b --- /dev/null +++ b/hasura/migrations/1682031429191_alter_table_public_tt_approval_queue_alter_column_approved_at/up.sql @@ -0,0 +1 @@ +alter table "public"."tt_approval_queue" alter column "approved_at" drop not null; diff --git a/hasura/migrations/1682031447950_alter_table_public_tt_approval_queue_alter_column_memo/down.sql b/hasura/migrations/1682031447950_alter_table_public_tt_approval_queue_alter_column_memo/down.sql new file mode 100644 index 000000000..82d12df19 --- /dev/null +++ b/hasura/migrations/1682031447950_alter_table_public_tt_approval_queue_alter_column_memo/down.sql @@ -0,0 +1 @@ +alter table "public"."tt_approval_queue" alter column "memo" set not null; diff --git a/hasura/migrations/1682031447950_alter_table_public_tt_approval_queue_alter_column_memo/up.sql b/hasura/migrations/1682031447950_alter_table_public_tt_approval_queue_alter_column_memo/up.sql new file mode 100644 index 000000000..b83aa38f0 --- /dev/null +++ b/hasura/migrations/1682031447950_alter_table_public_tt_approval_queue_alter_column_memo/up.sql @@ -0,0 +1 @@ +alter table "public"."tt_approval_queue" alter column "memo" drop not null;