Merge branch 'release/2023-04-21' into feature/payroll

This commit is contained in:
Patrick Fic
2023-04-20 15:05:48 -07:00
15 changed files with 280 additions and 55 deletions

View File

@@ -34,8 +34,8 @@ function JobsDocumentsComponent({
const fileType = DetermineFileType(value.type); const fileType = DetermineFileType(value.type);
if (value.type.startsWith("image")) { if (value.type.startsWith("image")) {
acc.images.push({ acc.images.push({
src: GenerateSrcUrl(value), // src: GenerateSrcUrl(value),
thumbnail: GenerateThumbUrl(value), src: GenerateThumbUrl(value),
// src: GenerateSrcUrl(value), // src: GenerateSrcUrl(value),
// thumbnail: GenerateThumbUrl(value), // thumbnail: GenerateThumbUrl(value),
fullsize: GenerateSrcUrl(value), fullsize: GenerateSrcUrl(value),

View File

@@ -1,7 +1,7 @@
import React, { useEffect } from "react"; import React, { useEffect } from "react";
import { Gallery } from "react-grid-gallery"; import { Gallery } from "react-grid-gallery";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { GenerateSrcUrl, GenerateThumbUrl } from "./job-documents.utility"; import { GenerateThumbUrl } from "./job-documents.utility";
function JobsDocumentGalleryExternal({ function JobsDocumentGalleryExternal({
data, data,
@@ -15,8 +15,8 @@ function JobsDocumentGalleryExternal({
let documents = data.reduce((acc, value) => { let documents = data.reduce((acc, value) => {
if (value.type.startsWith("image")) { if (value.type.startsWith("image")) {
acc.push({ acc.push({
src: GenerateSrcUrl(value), //src: GenerateSrcUrl(value),
thumbnail: GenerateThumbUrl(value), src: GenerateThumbUrl(value),
thumbnailHeight: 225, thumbnailHeight: 225,
thumbnailWidth: 225, thumbnailWidth: 225,
isSelected: false, isSelected: false,

View File

@@ -92,7 +92,11 @@ export function ReportCenterModalComponent({ reportCenterModal }) {
to: values.to, to: values.to,
subject: Templates[values.key]?.subject, subject: Templates[values.key]?.subject,
}, },
values.sendby === "email" ? "e" : "p", values.sendbyexcel === "excel"
? "x"
: values.sendby === "email"
? "e"
: "p",
id id
); );
setLoading(false); setLoading(false);
@@ -250,15 +254,38 @@ export function ReportCenterModalComponent({ reportCenterModal }) {
ranges={DatePIckerRanges} ranges={DatePIckerRanges}
/> />
</Form.Item> </Form.Item>
<Form.Item <Form.Item style={{ margin: 0, padding: 0 }} dependencies={["key"]}>
label={t("general.labels.sendby")} {() => {
name="sendby" const key = form.getFieldValue("key");
initialValue="print" //Kind of Id
> const reporttype = Templates[key] && Templates[key].reporttype;
<Radio.Group>
<Radio value="email">{t("general.labels.email")}</Radio> if (reporttype === "excel")
<Radio value="print">{t("general.labels.print")}</Radio> return (
</Radio.Group> <Form.Item
label={t("general.labels.sendby")}
name="sendbyexcel"
initialValue="excel"
>
<Radio.Group>
<Radio value="excel">{t("general.labels.excel")}</Radio>
</Radio.Group>
</Form.Item>
);
if (reporttype !== "excel")
return (
<Form.Item
label={t("general.labels.sendby")}
name="sendby"
initialValue="print"
>
<Radio.Group>
<Radio value="email">{t("general.labels.email")}</Radio>
<Radio value="print">{t("general.labels.print")}</Radio>
</Radio.Group>
</Form.Item>
);
}}
</Form.Item> </Form.Item>
<div <div

View File

@@ -1278,7 +1278,7 @@ export const SEARCH_JOBS_BY_ID_FOR_AUTOCOMPLETE = gql`
export const SEARCH_FOR_JOBS = gql` export const SEARCH_FOR_JOBS = gql`
query SEARCH_FOR_JOBS($search: String!) { query SEARCH_FOR_JOBS($search: String!) {
search_jobs(args: { search: $search }) { search_jobs(args: { search: $search }, limit: 25) {
id id
ro_number ro_number
ownr_fn ownr_fn

View File

@@ -2,22 +2,20 @@ import { gql } from "@apollo/client";
export const GLOBAL_SEARCH_QUERY = gql` export const GLOBAL_SEARCH_QUERY = gql`
query GLOBAL_SEARCH_QUERY($search: String) { query GLOBAL_SEARCH_QUERY($search: String) {
search_jobs(args: { search: $search }) { search_jobs(args: { search: $search }, limit: 25) {
id id
ro_number ro_number
status status
clm_no clm_no
v_model_yr v_model_yr
v_model_desc v_model_desc
v_make_desc v_make_desc
v_color v_color
ownr_fn ownr_fn
ownr_ln ownr_ln
ownr_co_nm ownr_co_nm
} }
search_owners(args: { search: $search }) { search_owners(args: { search: $search }, limit: 25) {
id id
ownr_fn ownr_fn
ownr_ln ownr_ln
@@ -25,7 +23,7 @@ export const GLOBAL_SEARCH_QUERY = gql`
ownr_ph1 ownr_ph1
ownr_ph2 ownr_ph2
} }
search_vehicles(args: { search: $search }) { search_vehicles(args: { search: $search }, limit: 25) {
id id
v_model_yr v_model_yr
v_model_desc v_model_desc
@@ -34,7 +32,7 @@ export const GLOBAL_SEARCH_QUERY = gql`
v_vin v_vin
plate_no plate_no
} }
search_payments(args: { search: $search }) { search_payments(args: { search: $search }, limit: 25) {
id id
amount amount
paymentnum paymentnum
@@ -45,7 +43,7 @@ export const GLOBAL_SEARCH_QUERY = gql`
memo memo
transactionid transactionid
} }
search_bills(args: { search: $search }) { search_bills(args: { search: $search }, limit: 25) {
id id
date date
invoice_number invoice_number
@@ -54,7 +52,7 @@ export const GLOBAL_SEARCH_QUERY = gql`
name name
} }
} }
search_phonebook(args: { search: $search }) { search_phonebook(args: { search: $search }, limit: 25) {
id id
firstname firstname
lastname lastname

View File

@@ -1028,6 +1028,7 @@
"created_at": "Created At", "created_at": "Created At",
"email": "Email", "email": "Email",
"errors": "Errors", "errors": "Errors",
"excel": "Excel",
"exceptiontitle": "An error has occurred.", "exceptiontitle": "An error has occurred.",
"friday": "Friday", "friday": "Friday",
"globalsearch": "Global Search", "globalsearch": "Global Search",
@@ -2239,6 +2240,7 @@
"csi_invitation": "CSI Invitation", "csi_invitation": "CSI Invitation",
"csi_invitation_action": "CSI Invite", "csi_invitation_action": "CSI Invite",
"diagnostic_authorization": "Diagnostic Authorization", "diagnostic_authorization": "Diagnostic Authorization",
"dms_posting_sheet": "DMS Posting Sheet",
"envelope_return_address": "#10 Envelope Return Address Label", "envelope_return_address": "#10 Envelope Return Address Label",
"estimate": "Estimate Only", "estimate": "Estimate Only",
"estimate_detail": "Estimate Details", "estimate_detail": "Estimate Details",
@@ -2457,6 +2459,8 @@
"export_payables": "Export Log - Payables", "export_payables": "Export Log - Payables",
"export_payments": "Export Log - Payments", "export_payments": "Export Log - Payments",
"export_receivables": "Export Log - Receivables", "export_receivables": "Export Log - Receivables",
"exported_gsr_by_ro": "Exported Gross Sales - Excel",
"exported_gsr_by_ro_labor": "Exported Gross Sales (Labor) - Excel",
"gsr_by_atp": "", "gsr_by_atp": "",
"gsr_by_ats": "Gross Sales by ATS", "gsr_by_ats": "Gross Sales by ATS",
"gsr_by_category": "Gross Sales by Category", "gsr_by_category": "Gross Sales by Category",

View File

@@ -1028,6 +1028,7 @@
"created_at": "", "created_at": "",
"email": "", "email": "",
"errors": "", "errors": "",
"excel": "",
"exceptiontitle": "", "exceptiontitle": "",
"friday": "", "friday": "",
"globalsearch": "", "globalsearch": "",
@@ -2239,6 +2240,7 @@
"csi_invitation": "", "csi_invitation": "",
"csi_invitation_action": "", "csi_invitation_action": "",
"diagnostic_authorization": "", "diagnostic_authorization": "",
"dms_posting_sheet": "",
"envelope_return_address": "", "envelope_return_address": "",
"estimate": "", "estimate": "",
"estimate_detail": "", "estimate_detail": "",
@@ -2457,6 +2459,8 @@
"export_payables": "", "export_payables": "",
"export_payments": "", "export_payments": "",
"export_receivables": "", "export_receivables": "",
"exported_gsr_by_ro": "",
"exported_gsr_by_ro_labor": "",
"gsr_by_atp": "", "gsr_by_atp": "",
"gsr_by_ats": "", "gsr_by_ats": "",
"gsr_by_category": "", "gsr_by_category": "",

View File

@@ -1028,6 +1028,7 @@
"created_at": "", "created_at": "",
"email": "", "email": "",
"errors": "", "errors": "",
"excel": "",
"exceptiontitle": "", "exceptiontitle": "",
"friday": "", "friday": "",
"globalsearch": "", "globalsearch": "",
@@ -2239,6 +2240,7 @@
"csi_invitation": "", "csi_invitation": "",
"csi_invitation_action": "", "csi_invitation_action": "",
"diagnostic_authorization": "", "diagnostic_authorization": "",
"dms_posting_sheet": "",
"envelope_return_address": "", "envelope_return_address": "",
"estimate": "", "estimate": "",
"estimate_detail": "", "estimate_detail": "",
@@ -2457,6 +2459,8 @@
"export_payables": "", "export_payables": "",
"export_payments": "", "export_payments": "",
"export_receivables": "", "export_receivables": "",
"exported_gsr_by_ro": "",
"exported_gsr_by_ro_labor": "",
"gsr_by_atp": "", "gsr_by_atp": "",
"gsr_by_ats": "", "gsr_by_ats": "",
"gsr_by_category": "", "gsr_by_category": "",

View File

@@ -20,7 +20,6 @@ export const TemplateList = (type, context) => {
disabled: false, disabled: false,
group: "authorization", group: "authorization",
}, },
fippa_authorization: { fippa_authorization: {
title: i18n.t("printcenter.jobs.fippa_authorization"), title: i18n.t("printcenter.jobs.fippa_authorization"),
description: "CASL Authorization", description: "CASL Authorization",
@@ -101,7 +100,6 @@ export const TemplateList = (type, context) => {
disabled: false, disabled: false,
group: "ro", group: "ro",
}, },
job_notes: { job_notes: {
title: i18n.t("printcenter.jobs.job_notes"), title: i18n.t("printcenter.jobs.job_notes"),
description: "All Jobs Notes", description: "All Jobs Notes",
@@ -330,7 +328,6 @@ export const TemplateList = (type, context) => {
disabled: false, disabled: false,
group: "post", group: "post",
}, },
vehicle_delivery_check: { vehicle_delivery_check: {
title: i18n.t("printcenter.jobs.vehicle_delivery_check"), title: i18n.t("printcenter.jobs.vehicle_delivery_check"),
description: "All Jobs Notes", description: "All Jobs Notes",
@@ -339,7 +336,6 @@ export const TemplateList = (type, context) => {
disabled: false, disabled: false,
group: "post", group: "post",
}, },
guarantee: { guarantee: {
title: i18n.t("printcenter.jobs.guarantee"), title: i18n.t("printcenter.jobs.guarantee"),
description: "All Jobs Notes", description: "All Jobs Notes",
@@ -496,6 +492,14 @@ export const TemplateList = (type, context) => {
disabled: false, disabled: false,
group: "financial", 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" ...(!type || type === "job_special"
@@ -622,7 +626,6 @@ export const TemplateList = (type, context) => {
}, },
group: "sales", group: "sales",
}, },
hours_sold_detail_closed_ins_co: { hours_sold_detail_closed_ins_co: {
title: i18n.t( title: i18n.t(
"reportcenter.templates.hours_sold_detail_closed_ins_co" "reportcenter.templates.hours_sold_detail_closed_ins_co"
@@ -640,7 +643,6 @@ export const TemplateList = (type, context) => {
}, },
group: "sales", group: "sales",
}, },
hours_sold_summary_closed: { hours_sold_summary_closed: {
title: i18n.t("reportcenter.templates.hours_sold_summary_closed"), title: i18n.t("reportcenter.templates.hours_sold_summary_closed"),
description: "", description: "",
@@ -654,7 +656,6 @@ export const TemplateList = (type, context) => {
}, },
group: "sales", group: "sales",
}, },
hours_sold_summary_closed_ins_co: { hours_sold_summary_closed_ins_co: {
title: i18n.t( title: i18n.t(
"reportcenter.templates.hours_sold_summary_closed_ins_co" "reportcenter.templates.hours_sold_summary_closed_ins_co"
@@ -672,7 +673,6 @@ export const TemplateList = (type, context) => {
}, },
group: "sales", group: "sales",
}, },
hours_sold_detail_open: { hours_sold_detail_open: {
title: i18n.t("reportcenter.templates.hours_sold_detail_open"), title: i18n.t("reportcenter.templates.hours_sold_detail_open"),
description: "", description: "",
@@ -686,7 +686,6 @@ export const TemplateList = (type, context) => {
}, },
group: "sales", group: "sales",
}, },
hours_sold_detail_open_ins_co: { hours_sold_detail_open_ins_co: {
title: i18n.t( title: i18n.t(
"reportcenter.templates.hours_sold_detail_open_ins_co" "reportcenter.templates.hours_sold_detail_open_ins_co"
@@ -704,7 +703,6 @@ export const TemplateList = (type, context) => {
}, },
group: "sales", group: "sales",
}, },
hours_sold_summary_open: { hours_sold_summary_open: {
title: i18n.t("reportcenter.templates.hours_sold_summary_open"), title: i18n.t("reportcenter.templates.hours_sold_summary_open"),
description: "", description: "",
@@ -718,7 +716,6 @@ export const TemplateList = (type, context) => {
}, },
group: "sales", group: "sales",
}, },
hours_sold_summary_open_ins_co: { hours_sold_summary_open_ins_co: {
title: i18n.t( title: i18n.t(
"reportcenter.templates.hours_sold_summary_open_ins_co" "reportcenter.templates.hours_sold_summary_open_ins_co"
@@ -736,7 +733,6 @@ export const TemplateList = (type, context) => {
}, },
group: "sales", group: "sales",
}, },
hours_sold_detail_closed_csr: { hours_sold_detail_closed_csr: {
title: i18n.t( title: i18n.t(
"reportcenter.templates.hours_sold_detail_closed_csr" "reportcenter.templates.hours_sold_detail_closed_csr"
@@ -1090,7 +1086,6 @@ export const TemplateList = (type, context) => {
}, },
group: "customers", group: "customers",
}, },
schedule: { schedule: {
title: i18n.t("reportcenter.templates.schedule"), title: i18n.t("reportcenter.templates.schedule"),
subject: i18n.t("reportcenter.templates.schedule"), subject: i18n.t("reportcenter.templates.schedule"),
@@ -1102,7 +1097,6 @@ export const TemplateList = (type, context) => {
}, },
group: "customers", group: "customers",
}, },
timetickets: { timetickets: {
title: i18n.t("reportcenter.templates.timetickets"), title: i18n.t("reportcenter.templates.timetickets"),
subject: 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"), title: i18n.t("reportcenter.templates.attendance_detail"),
subject: i18n.t("reportcenter.templates.attendance_detail"), subject: i18n.t("reportcenter.templates.attendance_detail"),
key: "attendance_detail", key: "attendance_detail",
disabled: false, disabled: false,
rangeFilter: { rangeFilter: {
object: i18n.t("reportcenter.labels.objects.timetickets"), object: i18n.t("reportcenter.labels.objects.timetickets"),
@@ -1138,7 +1131,6 @@ export const TemplateList = (type, context) => {
title: i18n.t("reportcenter.templates.attendance_summary"), title: i18n.t("reportcenter.templates.attendance_summary"),
subject: i18n.t("reportcenter.templates.attendance_summary"), subject: i18n.t("reportcenter.templates.attendance_summary"),
key: "attendance_summary", key: "attendance_summary",
disabled: false, disabled: false,
rangeFilter: { rangeFilter: {
object: i18n.t("reportcenter.labels.objects.timetickets"), object: i18n.t("reportcenter.labels.objects.timetickets"),
@@ -1158,7 +1150,6 @@ export const TemplateList = (type, context) => {
}, },
group: "payroll", group: "payroll",
}, },
timetickets_summary: { timetickets_summary: {
title: i18n.t("reportcenter.templates.timetickets_summary"), title: i18n.t("reportcenter.templates.timetickets_summary"),
subject: i18n.t("reportcenter.templates.timetickets_summary"), subject: i18n.t("reportcenter.templates.timetickets_summary"),
@@ -1171,7 +1162,6 @@ export const TemplateList = (type, context) => {
}, },
group: "payroll", group: "payroll",
}, },
estimator_detail: { estimator_detail: {
title: i18n.t("reportcenter.templates.estimator_detail"), title: i18n.t("reportcenter.templates.estimator_detail"),
description: "", description: "",
@@ -1224,7 +1214,6 @@ export const TemplateList = (type, context) => {
}, },
group: "purchases", group: "purchases",
}, },
void_ros: { void_ros: {
title: i18n.t("reportcenter.templates.void_ros"), title: i18n.t("reportcenter.templates.void_ros"),
description: "", description: "",
@@ -1329,7 +1318,6 @@ export const TemplateList = (type, context) => {
}, },
group: "sales", group: "sales",
}, },
gsr_by_estimator: { gsr_by_estimator: {
title: i18n.t("reportcenter.templates.gsr_by_estimator"), title: i18n.t("reportcenter.templates.gsr_by_estimator"),
description: "", description: "",
@@ -1814,7 +1802,9 @@ export const TemplateList = (type, context) => {
group: "jobs", group: "jobs",
}, },
purchase_return_ratio_grouped_by_vendor_detail: { 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( subject: i18n.t(
"reportcenter.templates.purchase_return_ratio_grouped_by_vendor_detail" "reportcenter.templates.purchase_return_ratio_grouped_by_vendor_detail"
), ),
@@ -1828,7 +1818,9 @@ export const TemplateList = (type, context) => {
group: "purchases", group: "purchases",
}, },
purchase_return_ratio_grouped_by_vendor_summary: { 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( subject: i18n.t(
"reportcenter.templates.purchase_return_ratio_grouped_by_vendor_summary" "reportcenter.templates.purchase_return_ratio_grouped_by_vendor_summary"
), ),
@@ -1843,9 +1835,7 @@ export const TemplateList = (type, context) => {
}, },
production_over_time: { production_over_time: {
title: i18n.t("reportcenter.templates.production_over_time"), title: i18n.t("reportcenter.templates.production_over_time"),
subject: i18n.t( subject: i18n.t("reportcenter.templates.production_over_time"),
"reportcenter.templates.production_over_time"
),
key: "production_over_time", key: "production_over_time",
//idtype: "vendor", //idtype: "vendor",
disabled: false, disabled: false,
@@ -1857,9 +1847,7 @@ export const TemplateList = (type, context) => {
}, },
customer_list: { customer_list: {
title: i18n.t("reportcenter.templates.customer_list"), title: i18n.t("reportcenter.templates.customer_list"),
subject: i18n.t( subject: i18n.t("reportcenter.templates.customer_list"),
"reportcenter.templates.customer_list"
),
key: "customer_list", key: "customer_list",
//idtype: "vendor", //idtype: "vendor",
disabled: false, disabled: false,
@@ -1869,6 +1857,32 @@ export const TemplateList = (type, context) => {
}, },
group: "customers", 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" ...(!type || type === "courtesycarcontract"
@@ -1963,7 +1977,6 @@ export const TemplateList = (type, context) => {
}, },
} }
: {}), : {}),
...(!type || type === "production" ...(!type || type === "production"
? { ? {
production_by_last_name: { production_by_last_name: {

View File

@@ -831,6 +831,13 @@
table: table:
name: transitions name: transitions
schema: public schema: public
- name: tt_approval_queues
using:
foreign_key_constraint_on:
column: bodyshopid
table:
name: tt_approval_queue
schema: public
- name: vehicles - name: vehicles
using: using:
foreign_key_constraint_on: foreign_key_constraint_on:
@@ -2262,6 +2269,13 @@
table: table:
name: timetickets name: timetickets
schema: public schema: public
- name: tt_approval_queues
using:
foreign_key_constraint_on:
column: employeeid
table:
name: tt_approval_queue
schema: public
insert_permissions: insert_permissions:
- role: user - role: user
permission: permission:
@@ -3145,6 +3159,13 @@
table: table:
name: transitions name: transitions
schema: public schema: public
- name: tt_approval_queues
using:
foreign_key_constraint_on:
column: jobid
table:
name: tt_approval_queue
schema: public
insert_permissions: insert_permissions:
- role: user - role: user
permission: permission:
@@ -5210,6 +5231,14 @@
- name: job - name: job
using: using:
foreign_key_constraint_on: jobid 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: insert_permissions:
- role: user - role: user
permission: permission:
@@ -5228,6 +5257,7 @@
- ciecacode - ciecacode
- clockoff - clockoff
- clockon - clockon
- committed_at
- cost_center - cost_center
- created_at - created_at
- date - date
@@ -5248,6 +5278,7 @@
- ciecacode - ciecacode
- clockoff - clockoff
- clockon - clockon
- committed_at
- cost_center - cost_center
- created_at - created_at
- date - date
@@ -5277,6 +5308,7 @@
- ciecacode - ciecacode
- clockoff - clockoff
- clockon - clockon
- committed_at
- cost_center - cost_center
- created_at - created_at
- date - date
@@ -5397,6 +5429,116 @@
authid: authid:
_eq: X-Hasura-User-Id _eq: X-Hasura-User-Id
check: {} 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: - table:
name: users name: users
schema: public schema: public
@@ -5467,6 +5609,13 @@
table: table:
name: parts_orders name: parts_orders
schema: public schema: public
- name: tt_approval_queues
using:
foreign_key_constraint_on:
column: approved_by
table:
name: tt_approval_queue
schema: public
insert_permissions: insert_permissions:
- role: user - role: user
permission: permission:

View File

@@ -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;

View File

@@ -0,0 +1,2 @@
alter table "public"."timetickets" add column "committed_at" timestamptz
null;

View File

@@ -0,0 +1 @@
DROP TABLE "public"."tt_approval_queue";

View File

@@ -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;

View File

@@ -20,7 +20,8 @@ async function StatusTransition(req, res) {
res.status(403).send("Unauthorized"); res.status(403).send("Unauthorized");
return; return;
} }
res.sendStatus(200);
return;
const { const {
id: jobid, id: jobid,
status: value, status: value,
@@ -78,7 +79,7 @@ async function StatusTransition(req, res) {
res.sendStatus(200); //.json(ret); res.sendStatus(200); //.json(ret);
} catch (error) { } 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, message: error.message,
stack: error.stack, stack: error.stack,
}); });