diff --git a/client/src/components/bill-enter-modal/bill-enter-modal.container.jsx b/client/src/components/bill-enter-modal/bill-enter-modal.container.jsx
index f18f1123a..123969389 100644
--- a/client/src/components/bill-enter-modal/bill-enter-modal.container.jsx
+++ b/client/src/components/bill-enter-modal/bill-enter-modal.container.jsx
@@ -26,6 +26,7 @@ import { CalculateBillTotal } from "../bill-form/bill-form.totals.utility";
import { handleUpload as handleLocalUpload } from "../documents-local-upload/documents-local-upload.utility";
import { handleUpload } from "../documents-upload/documents-upload.utility";
import { handleUpload as handleUploadToImageProxy } from "../documents-upload-imgproxy/documents-upload-imgproxy.utility";
+import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
const mapStateToProps = createStructuredSelector({
billEnterModal: selectBillEnterModal,
@@ -450,7 +451,9 @@ function BillEnterModalContainer({ billEnterModal, toggleModalVisible, bodyshop,
setEnterAgain(false);
}}
>
-
+
+
+
);
diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json
index fdd15751e..f5d38f45a 100644
--- a/client/src/translations/en_us/common.json
+++ b/client/src/translations/en_us/common.json
@@ -3223,6 +3223,7 @@
"parts_not_recieved_vendor": "Parts Not Received by Vendor",
"parts_received_not_scheduled": "Parts Received for Jobs Not Scheduled",
"payments_by_date": "Payments by Date",
+ "payments_by_date_excel": "Payments by Date - Excel",
"payments_by_date_payment": "Payments by Date and Payment Type",
"payments_by_date_type": "Payments by Date and Customer Type",
"production_by_category": "Production by Category",
diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json
index 0a034686c..dd92265ab 100644
--- a/client/src/translations/es/common.json
+++ b/client/src/translations/es/common.json
@@ -3220,6 +3220,7 @@
"parts_not_recieved_vendor": "",
"parts_received_not_scheduled": "",
"payments_by_date": "",
+ "payments_by_date_excel": "",
"payments_by_date_payment": "",
"payments_by_date_type": "",
"production_by_category": "",
diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json
index 050f10a46..e9e22425c 100644
--- a/client/src/translations/fr/common.json
+++ b/client/src/translations/fr/common.json
@@ -3220,6 +3220,7 @@
"parts_not_recieved_vendor": "",
"parts_received_not_scheduled": "",
"payments_by_date": "",
+ "payments_by_date_excel": "",
"payments_by_date_payment": "",
"payments_by_date_type": "",
"production_by_category": "",
diff --git a/client/src/utils/TemplateConstants.js b/client/src/utils/TemplateConstants.js
index d91c1097e..620370169 100644
--- a/client/src/utils/TemplateConstants.js
+++ b/client/src/utils/TemplateConstants.js
@@ -1218,6 +1218,18 @@ export const TemplateList = (type, context) => {
},
group: "customers"
},
+ payments_by_date_excel: {
+ title: i18n.t("reportcenter.templates.payments_by_date_excel"),
+ subject: i18n.t("reportcenter.templates.payments_by_date_excel"),
+ key: "payments_by_date",
+ reporttype: "excel",
+ disabled: false,
+ rangeFilter: {
+ object: i18n.t("reportcenter.labels.objects.payments"),
+ field: i18n.t("payments.fields.date")
+ },
+ group: "customers"
+ },
schedule: {
title: i18n.t("reportcenter.templates.schedule"),
subject: i18n.t("reportcenter.templates.schedule"),
diff --git a/hasura/migrations/1763425916748_alter_table_public_media_analytics_add_column_unique_documents/down.sql b/hasura/migrations/1763425916748_alter_table_public_media_analytics_add_column_unique_documents/down.sql
new file mode 100644
index 000000000..05d67edc9
--- /dev/null
+++ b/hasura/migrations/1763425916748_alter_table_public_media_analytics_add_column_unique_documents/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"."media_analytics" add column "unique_documents" numeric
+-- null;
diff --git a/hasura/migrations/1763425916748_alter_table_public_media_analytics_add_column_unique_documents/up.sql b/hasura/migrations/1763425916748_alter_table_public_media_analytics_add_column_unique_documents/up.sql
new file mode 100644
index 000000000..94e209f63
--- /dev/null
+++ b/hasura/migrations/1763425916748_alter_table_public_media_analytics_add_column_unique_documents/up.sql
@@ -0,0 +1,2 @@
+alter table "public"."media_analytics" add column "unique_documents" numeric
+ null;
diff --git a/hasura/migrations/1763425927136_alter_table_public_media_analytics_add_column_duplicate_documents/down.sql b/hasura/migrations/1763425927136_alter_table_public_media_analytics_add_column_duplicate_documents/down.sql
new file mode 100644
index 000000000..645c5962f
--- /dev/null
+++ b/hasura/migrations/1763425927136_alter_table_public_media_analytics_add_column_duplicate_documents/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"."media_analytics" add column "duplicate_documents" numeric
+-- null;
diff --git a/hasura/migrations/1763425927136_alter_table_public_media_analytics_add_column_duplicate_documents/up.sql b/hasura/migrations/1763425927136_alter_table_public_media_analytics_add_column_duplicate_documents/up.sql
new file mode 100644
index 000000000..c248607b8
--- /dev/null
+++ b/hasura/migrations/1763425927136_alter_table_public_media_analytics_add_column_duplicate_documents/up.sql
@@ -0,0 +1,2 @@
+alter table "public"."media_analytics" add column "duplicate_documents" numeric
+ null;
diff --git a/hasura/migrations/1763425947348_alter_table_public_media_analytics_detail_add_column_unique_documents/down.sql b/hasura/migrations/1763425947348_alter_table_public_media_analytics_detail_add_column_unique_documents/down.sql
new file mode 100644
index 000000000..77b5177c9
--- /dev/null
+++ b/hasura/migrations/1763425947348_alter_table_public_media_analytics_detail_add_column_unique_documents/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"."media_analytics_detail" add column "unique_documents" numeric
+-- null;
diff --git a/hasura/migrations/1763425947348_alter_table_public_media_analytics_detail_add_column_unique_documents/up.sql b/hasura/migrations/1763425947348_alter_table_public_media_analytics_detail_add_column_unique_documents/up.sql
new file mode 100644
index 000000000..8b5f05211
--- /dev/null
+++ b/hasura/migrations/1763425947348_alter_table_public_media_analytics_detail_add_column_unique_documents/up.sql
@@ -0,0 +1,2 @@
+alter table "public"."media_analytics_detail" add column "unique_documents" numeric
+ null;
diff --git a/hasura/migrations/1763425960252_alter_table_public_media_analytics_detail_add_column_duplicate_documents/down.sql b/hasura/migrations/1763425960252_alter_table_public_media_analytics_detail_add_column_duplicate_documents/down.sql
new file mode 100644
index 000000000..2b2bd3d50
--- /dev/null
+++ b/hasura/migrations/1763425960252_alter_table_public_media_analytics_detail_add_column_duplicate_documents/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"."media_analytics_detail" add column "duplicate_documents" numeric
+-- null;
diff --git a/hasura/migrations/1763425960252_alter_table_public_media_analytics_detail_add_column_duplicate_documents/up.sql b/hasura/migrations/1763425960252_alter_table_public_media_analytics_detail_add_column_duplicate_documents/up.sql
new file mode 100644
index 000000000..e2c65107c
--- /dev/null
+++ b/hasura/migrations/1763425960252_alter_table_public_media_analytics_detail_add_column_duplicate_documents/up.sql
@@ -0,0 +1,2 @@
+alter table "public"."media_analytics_detail" add column "duplicate_documents" numeric
+ null;
diff --git a/hasura/migrations/1763426307543_alter_table_public_media_analytics_detail_alter_column_unique_documents/down.sql b/hasura/migrations/1763426307543_alter_table_public_media_analytics_detail_alter_column_unique_documents/down.sql
new file mode 100644
index 000000000..a38d16858
--- /dev/null
+++ b/hasura/migrations/1763426307543_alter_table_public_media_analytics_detail_alter_column_unique_documents/down.sql
@@ -0,0 +1 @@
+alter table "public"."media_analytics_detail" rename column "unique_document_count" to "unique_documents";
diff --git a/hasura/migrations/1763426307543_alter_table_public_media_analytics_detail_alter_column_unique_documents/up.sql b/hasura/migrations/1763426307543_alter_table_public_media_analytics_detail_alter_column_unique_documents/up.sql
new file mode 100644
index 000000000..b0a9c3979
--- /dev/null
+++ b/hasura/migrations/1763426307543_alter_table_public_media_analytics_detail_alter_column_unique_documents/up.sql
@@ -0,0 +1 @@
+alter table "public"."media_analytics_detail" rename column "unique_documents" to "unique_document_count";
diff --git a/hasura/migrations/1763426323408_alter_table_public_media_analytics_detail_alter_column_duplicate_documents/down.sql b/hasura/migrations/1763426323408_alter_table_public_media_analytics_detail_alter_column_duplicate_documents/down.sql
new file mode 100644
index 000000000..0208e4b53
--- /dev/null
+++ b/hasura/migrations/1763426323408_alter_table_public_media_analytics_detail_alter_column_duplicate_documents/down.sql
@@ -0,0 +1 @@
+alter table "public"."media_analytics_detail" rename column "duplicate_count" to "duplicate_documents";
diff --git a/hasura/migrations/1763426323408_alter_table_public_media_analytics_detail_alter_column_duplicate_documents/up.sql b/hasura/migrations/1763426323408_alter_table_public_media_analytics_detail_alter_column_duplicate_documents/up.sql
new file mode 100644
index 000000000..c0f85a38e
--- /dev/null
+++ b/hasura/migrations/1763426323408_alter_table_public_media_analytics_detail_alter_column_duplicate_documents/up.sql
@@ -0,0 +1 @@
+alter table "public"."media_analytics_detail" rename column "duplicate_documents" to "duplicate_count";
diff --git a/server/data/kaizen.js b/server/data/kaizen.js
index 7bdccdac1..8b95044e7 100644
--- a/server/data/kaizen.js
+++ b/server/data/kaizen.js
@@ -219,8 +219,6 @@ const CreateRepairOrderTag = (job, errorCallback) => {
}
const repairCosts = CreateCosts(job);
- const jobline = CreateJobLines(job.joblines);
- const timeticket = CreateTimeTickets(job.timetickets);
try {
const ret = {
@@ -290,8 +288,100 @@ const CreateRepairOrderTag = (job, errorCallback) => {
(job.date_exported && moment(job.date_exported).tz(job.bodyshop.timezone).format(DateFormat)) || "",
DateVoid: (job.date_void && moment(job.date_void).tz(job.bodyshop.timezone).format(DateFormat)) || ""
},
- JobLineDetails: { jobline },
- TimeTicketDetails: { timeticket },
+ JobLineDetails: (function () {
+ const joblineSource = Array.isArray(job.joblines) ? job.joblines : job.joblines ? [job.joblines] : [];
+ if (joblineSource.length === 0) return { jobline: [] };
+ return {
+ jobline: joblineSource.map((jl = {}) => ({
+ line_description: jl.line_desc || jl.line_description || "",
+ oem_part_no: jl.oem_partno || jl.oem_part_no || "",
+ alt_part_no: jl.alt_partno || jl.alt_part_no || "",
+ op_code_desc: jl.op_code_desc || "",
+ part_type: jl.part_type || "",
+ part_qty: jl.part_qty ?? jl.quantity ?? 0,
+ part_price: jl.act_price ?? jl.part_price ?? 0,
+ labor_type: jl.mod_lbr_ty || jl.labor_type || "",
+ labor_hours: jl.mod_lb_hrs ?? jl.labor_hours ?? 0,
+ labor_sale: jl.lbr_amt ?? jl.labor_sale ?? 0
+ }))
+ };
+ })(),
+ BillsDetails: (function () {
+ const billsSource = Array.isArray(job.bills) ? job.bills : job.bills ? [job.bills] : [];
+ if (billsSource.length === 0) return { BillDetails: [] };
+ return {
+ BillDetails: billsSource.map(
+ ({
+ billlines = [],
+ date = "",
+ is_credit_memo = false,
+ invoice_number = "",
+ isinhouse = false,
+ vendor = {}
+ } = {}) => ({
+ BillLines: {
+ BillLine: billlines.map((bl = {}) => ({
+ line_description: bl.line_desc || bl.line_description || "",
+ part_price: bl.actual_price ?? bl.part_price ?? bl.act_price ?? 0,
+ actual_cost: bl.actual_cost ?? 0,
+ cost_center: bl.cost_center || "",
+ deductedfromlbr: bl.deductedfromlbr || false,
+ part_qty: bl.quantity ?? bl.part_qty ?? 0,
+ oem_part_no: bl.oem_partno || bl.oem_part_no || "",
+ alt_part_no: bl.alt_partno || bl.alt_part_no || ""
+ }))
+ },
+ date,
+ is_credit_memo,
+ invoice_number,
+ isinhouse,
+ vendorName: vendor.name || ""
+ })
+ )
+ };
+ })(),
+ JobNotes: (function () {
+ const notesSource = Array.isArray(job.notes) ? job.notes : job.notes ? [job.notes] : [];
+ if (notesSource.length === 0) return { JobNote: [] };
+ return {
+ JobNote: notesSource.map((note = {}) => ({
+ created_at: note.created_at || "",
+ created_by: note.created_by || "",
+ critical: note.critical || false,
+ private: note.private || false,
+ text: note.text || "",
+ type: note.type || ""
+ }))
+ };
+ })(),
+ TimeTicketDetails: (function () {
+ const ticketSource = Array.isArray(job.timetickets)
+ ? job.timetickets
+ : job.timetickets
+ ? [job.timetickets]
+ : [];
+ if (ticketSource.length === 0) return { timeticket: [] };
+ return {
+ timeticket: ticketSource.map((ticket = {}) => ({
+ date: ticket.date || "",
+ employee:
+ ticket.employee && ticket.employee.employee_number
+ ? ticket.employee.employee_number
+ .trim()
+ .concat(" - ", ticket.employee.first_name.trim(), " ", ticket.employee.last_name.trim())
+ .trim()
+ : "",
+ productive_hrs: ticket.productivehrs ?? 0,
+ actual_hrs: ticket.actualhrs ?? 0,
+ cost_center: ticket.cost_center || "",
+ flat_rate: ticket.flat_rate || false,
+ rate: ticket.rate ?? 0,
+ ticket_cost: ticket.flat_rate
+ ? ticket.rate * (ticket.productivehrs || 0)
+ : ticket.rate * (ticket.actualhrs || 0)
+ }))
+ };
+ })(),
Sales: {
Labour: {
Aluminum: Dinero(job.job_totals.rates.laa.total).toFormat(DineroFormat),
@@ -636,42 +726,3 @@ const CreateCosts = (job) => {
}, 0)
};
};
-
-const CreateJobLines = (joblines) => {
- const repairLines = [];
- joblines.forEach((jobline) => {
- repairLines.push({
- line_description: jobline.line_desc,
- oem_part_no: jobline.oem_partno,
- alt_part_no: jobline.alt_partno,
- op_code_desc: jobline.op_code_desc,
- part_type: jobline.part_type,
- part_qty: jobline.part_qty,
- part_price: jobline.act_price,
- labor_type: jobline.mod_lbr_ty,
- labor_hours: jobline.mod_lb_hrs,
- labor_sale: jobline.lbr_amt
- });
- });
- return repairLines;
-};
-
-const CreateTimeTickets = (timetickets) => {
- const timeTickets = [];
- timetickets.forEach((ticket) => {
- timeTickets.push({
- date: ticket.date,
- employee: ticket.employee.employee_number
- .trim()
- .concat(" - ", ticket.employee.first_name.trim(), " ", ticket.employee.last_name.trim())
- .trim(),
- productive_hrs: ticket.productivehrs,
- actual_hrs: ticket.actualhrs,
- cost_center: ticket.cost_center,
- flat_rate: ticket.flat_rate,
- rate: ticket.rate,
- ticket_cost: ticket.flat_rate ? ticket.rate * ticket.productive_hrs : ticket.rate * ticket.actual_hrs
- });
- });
- return timeTickets;
-};
diff --git a/server/graphql-client/queries.js b/server/graphql-client/queries.js
index 6e1ccbac3..80a2871c8 100644
--- a/server/graphql-client/queries.js
+++ b/server/graphql-client/queries.js
@@ -1221,7 +1221,7 @@ query ENTEGRAL_EXPORT($bodyshopid: uuid!) {
}`;
exports.KAIZEN_QUERY = `query KAIZEN_EXPORT($start: timestamptz, $bodyshopid: uuid!, $end: timestamptz) {
- bodyshops_by_pk(id: $bodyshopid){
+ bodyshops_by_pk(id: $bodyshopid) {
id
shopname
address1
@@ -1249,15 +1249,24 @@ exports.KAIZEN_QUERY = `query KAIZEN_EXPORT($start: timestamptz, $bodyshopid: uu
bills {
billlines {
actual_cost
+ actual_price
cost_center
+ deductedfromlbr
id
+ line_desc
quantity
}
+ date
federal_tax_rate
id
is_credit_memo
+ invoice_number
+ isinhouse
local_tax_rate
state_tax_rate
+ vendor {
+ name
+ }
}
created_at
clm_no
@@ -1299,7 +1308,7 @@ exports.KAIZEN_QUERY = `query KAIZEN_EXPORT($start: timestamptz, $bodyshopid: uu
joblines(where: {removed: {_eq: false}}) {
act_price
alt_partno
- billlines(order_by: {bill: {date: desc_nulls_last}} limit: 1) {
+ billlines(order_by: {bill: {date: desc_nulls_last}}, limit: 1) {
actual_cost
actual_price
quantity
@@ -1322,8 +1331,8 @@ exports.KAIZEN_QUERY = `query KAIZEN_EXPORT($start: timestamptz, $bodyshopid: uu
mod_lbr_ty
oem_partno
op_code_desc
- parts_order_lines(order_by: {parts_order: {order_date: desc_nulls_last}} limit: 1){
- parts_order{
+ parts_order_lines(order_by: {parts_order: {order_date: desc_nulls_last}}, limit: 1) {
+ parts_order {
id
order_date
}
@@ -1342,6 +1351,14 @@ exports.KAIZEN_QUERY = `query KAIZEN_EXPORT($start: timestamptz, $bodyshopid: uu
jobid
totalliquidcost
}
+ notes {
+ created_at
+ created_by
+ critical
+ private
+ text
+ type
+ }
ownr_addr1
ownr_addr2
ownr_city
@@ -3149,11 +3166,10 @@ exports.DELETE_PHONE_NUMBER_OPT_OUT = `
}
`;
-
exports.INSERT_MEDIA_ANALYTICS = `
mutation INSERT_MEDIA_ANALYTICS($mediaObject: media_analytics_insert_input!) {
insert_media_analytics_one(object: $mediaObject) {
id
}
}
-`
\ No newline at end of file
+`;