Compare commits

...

19 Commits

Author SHA1 Message Date
Allan Carr
dafe9de753 IO-3450 Grammer Correction
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-11-25 18:10:10 -08:00
Allan Carr
78a8474a24 IO-3450 Additional Crisp Segments
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-11-25 17:56:19 -08:00
Dave Richer
123066f1cd Merged in release/2025-11-21 (pull request #2671)
Release/2025 11 21 into Master-AIO - IO-3435 IO-3445 IO-3440 IO-3446
2025-11-21 19:19:15 +00:00
Allan Carr
a153cca3c0 Merged in feature/IO-3440-Payment-By-Date-Excel (pull request #2669)
IO-3440 Payment By Date - Excel
2025-11-21 00:26:54 +00:00
Allan Carr
35c7c32c8e IO-3440 Payment By Date - Excel
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-11-20 16:29:05 -08:00
Allan Carr
6d6b64ebc3 Merged in feature/IO-3446-Kaizen-Datapump-Extension (pull request #2667)
IO-3446 Kaizen Datapump Extension

Approved-by: Dave Richer
2025-11-20 19:53:47 +00:00
Patrick Fic
338d8e2136 Merged in feature/media-analytics-logging (pull request #2663)
Add unique/dupe columns to media analytics.

Approved-by: Dave Richer
2025-11-19 19:26:00 +00:00
Allan Carr
6674206b4f Merged in feature/IO-3440-Payment-By-Date-Excel (pull request #2665)
IO-3440 Payment By Date - Excel

Approved-by: Dave Richer
2025-11-19 19:16:31 +00:00
Allan Carr
c46ad521d1 Merged in feature/IO-3445-RBAC-BILL-ENTER (pull request #2664)
IO-3445 RBAC Bill:Enter

Approved-by: Dave Richer
2025-11-19 19:13:26 +00:00
Allan Carr
66e5bec4d8 IO-3440 Payment By Date - Excel
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-11-18 17:05:42 -08:00
Allan Carr
0d3161ef84 IO-3445 RBAC Bill:Enter
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-11-18 16:47:26 -08:00
Patrick Fic
1cd11bdc18 Add unique/dupe columns to media analytics. 2025-11-17 16:42:39 -08:00
Patrick Fic
9cce2696e2 Merge branch 'master-AIO' into feature/media-analytics-logging 2025-11-17 16:31:04 -08:00
Patrick Fic
508d32d2d9 Merged in feature/media-analytics-logging (pull request #2661)
Add indexes for media analytics.
2025-11-12 04:36:26 +00:00
Patrick Fic
cccc307862 Add indexes for media analytics. 2025-11-11 20:35:59 -08:00
Patrick Fic
0772139a60 Merged in feature/media-analytics-logging (pull request #2659)
Add trigger to remove fk violations for media analytics.
2025-11-10 23:38:58 +00:00
Patrick Fic
70028c8be6 Add trigger to remove fk violations for media analytics. 2025-11-10 15:38:17 -08:00
Allan Carr
3dc22bfdab Merged in feature/IO-3435-SpeedPrint-Filtering-in-Config (pull request #2657)
IO-3435 SpeedPrint Filtering in Config

Approved-by: Dave Richer
2025-11-10 19:31:55 +00:00
Allan Carr
f3ee421030 IO-3435 SpeedPrint Filtering in Config
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2025-11-10 11:23:49 -08:00
30 changed files with 152 additions and 21 deletions

View File

@@ -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);
}}
>
<BillFormContainer form={form} disableInvNumber={billEnterModal.context.disableInvNumber} />
<RbacWrapper action="bills:enter">
<BillFormContainer form={form} disableInvNumber={billEnterModal.context.disableInvNumber} />
</RbacWrapper>
</Form>
</Modal>
);

View File

@@ -4,10 +4,18 @@ import { useTranslation } from "react-i18next";
import { TemplateList } from "../../utils/TemplateConstants";
import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component";
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
import InstanceRenderManager from "../../utils/instanceRenderMgr";
export default function ShopInfoSpeedPrint() {
const { t } = useTranslation();
const TemplateListGenerated = TemplateList("job");
const allTemplates = TemplateList("job");
const TemplateListGenerated = InstanceRenderManager({
imex: Object.fromEntries(
Object.entries(allTemplates).filter(([, { enhanced_payroll }]) => !enhanced_payroll)
),
rome: allTemplates
});
return (
<Form.List name={["speedprint"]}>
{(fields, { add, remove, move }) => {

View File

@@ -50,7 +50,7 @@ import {
} from "./user.actions";
import UserActionTypes from "./user.types";
//import * as amplitude from '@amplitude/analytics-browser';
import posthog from 'posthog-js';
import posthog from "posthog-js";
const fpPromise = FingerprintJS.load();
@@ -269,11 +269,11 @@ export function* signInSuccessSaga({ payload }) {
instanceSeg,
...(isParts
? [
InstanceRenderManager({
imex: "ImexPartsManagement",
rome: "RomePartsManagement"
})
]
InstanceRenderManager({
imex: "ImexPartsManagement",
rome: "RomePartsManagement"
})
]
: [])
];
window.$crisp.push(["set", "session:segments", [segs]]);
@@ -375,17 +375,31 @@ export function* SetAuthLevelFromShopDetails({ payload }) {
const isParts = yield select((state) => state.application.isPartsEntry === true);
const instanceSeg = InstanceRenderManager({ imex: "imex", rome: "rome" });
let featureSegments;
if (payload.features?.allAccess === true) {
featureSegments = ["allAccess"];
} else {
const featureKeys = Object.keys(payload.features).filter(
(key) =>
payload.features[key] === true ||
(typeof payload.features[key] === "string" && !isNaN(Date.parse(payload.features[key])))
);
featureSegments = ["basic", ...featureKeys];
}
const featureSegments =
payload.features?.allAccess === true
? ["allAccess"]
: [
"basic",
...Object.keys(payload.features).filter(
(key) =>
payload.features[key] === true ||
(typeof payload.features[key] === "string" && !isNaN(Date.parse(payload.features[key])))
)
];
const additionalSegments = [
payload.cdk_dealerid && "CDK",
payload.pbs_serialnumber && "PBS",
// payload.rr_dealerid && "Reynolds",
payload.accountingconfig.qbo === true && "QBO",
payload.accountingconfig.qbo === false &&
!payload.cdk_dealerid &&
!payload.pbs_serialnumber &&
// !payload.rr_dealerid &&
"QBD"
].filter(Boolean);
featureSegments.push(...additionalSegments);
const regionSeg = payload.region_config ? `region:${payload.region_config}` : null;
const segments = [instanceSeg, ...(regionSeg ? [regionSeg] : []), ...featureSegments];

View File

@@ -3209,6 +3209,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",

View File

@@ -3209,6 +3209,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": "",

View File

@@ -3209,6 +3209,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": "",

View File

@@ -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_excel",
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"),

View File

@@ -0,0 +1,5 @@
alter table "public"."media_analytics_detail" drop constraint "media_analytics_detail_jobid_fkey",
add constraint "media_analytics_detail_jobid_fkey"
foreign key ("jobid")
references "public"."jobs"
("id") on update restrict on delete restrict;

View File

@@ -0,0 +1,5 @@
alter table "public"."media_analytics_detail" drop constraint "media_analytics_detail_jobid_fkey",
add constraint "media_analytics_detail_jobid_fkey"
foreign key ("jobid")
references "public"."jobs"
("id") on update set null on delete set null;

View File

@@ -0,0 +1,23 @@
-- Could not auto-generate a down migration.
-- Please write an appropriate down migration for the SQL below:
-- CREATE OR REPLACE FUNCTION set_fk_to_null_if_invalid_media_analytics()
-- RETURNS TRIGGER AS $$
-- BEGIN
-- -- Check if the foreign key value is not NULL
-- IF NEW.jobid IS NOT NULL THEN
-- -- Check if the corresponding record exists in the parent table
-- IF NOT EXISTS (SELECT 1 FROM jobs WHERE id = NEW.jobid) THEN
-- -- If it doesn't exist, set the foreign key to NULL
-- NEW.jobid = NULL;
-- END IF;
-- END IF;
--
-- -- Return the (potentially modified) record to be inserted/updated
-- RETURN NEW;
-- END;
-- $$ LANGUAGE plpgsql;
--
-- CREATE TRIGGER media_analytics_fk_null
-- BEFORE INSERT OR UPDATE ON media_analytics_detail
-- FOR EACH ROW
-- EXECUTE FUNCTION set_fk_to_null_if_invalid_media_analytics();

View File

@@ -0,0 +1,21 @@
CREATE OR REPLACE FUNCTION set_fk_to_null_if_invalid_media_analytics()
RETURNS TRIGGER AS $$
BEGIN
-- Check if the foreign key value is not NULL
IF NEW.jobid IS NOT NULL THEN
-- Check if the corresponding record exists in the parent table
IF NOT EXISTS (SELECT 1 FROM jobs WHERE id = NEW.jobid) THEN
-- If it doesn't exist, set the foreign key to NULL
NEW.jobid = NULL;
END IF;
END IF;
-- Return the (potentially modified) record to be inserted/updated
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER media_analytics_fk_null
BEFORE INSERT OR UPDATE ON media_analytics_detail
FOR EACH ROW
EXECUTE FUNCTION set_fk_to_null_if_invalid_media_analytics();

View File

@@ -0,0 +1 @@
DROP INDEX IF EXISTS "public"."media_analytics_detail_bodyshopid";

View File

@@ -0,0 +1,2 @@
CREATE INDEX "media_analytics_detail_bodyshopid" on
"public"."media_analytics_detail" using btree ("bodyshopid");

View File

@@ -0,0 +1 @@
DROP INDEX IF EXISTS "public"."media_analytics_detail_jobid";

View File

@@ -0,0 +1,2 @@
CREATE INDEX "media_analytics_detail_jobid" on
"public"."media_analytics_detail" using btree ("jobid");

View File

@@ -0,0 +1 @@
DROP INDEX IF EXISTS "public"."media_analytics_detail_media_analytics";

View File

@@ -0,0 +1,2 @@
CREATE INDEX "media_analytics_detail_media_analytics" on
"public"."media_analytics_detail" using btree ("media_analytics_id");

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"."media_analytics" add column "unique_documents" numeric
-- null;

View File

@@ -0,0 +1,2 @@
alter table "public"."media_analytics" add column "unique_documents" numeric
null;

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"."media_analytics" add column "duplicate_documents" numeric
-- null;

View File

@@ -0,0 +1,2 @@
alter table "public"."media_analytics" add column "duplicate_documents" numeric
null;

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"."media_analytics_detail" add column "unique_documents" numeric
-- null;

View File

@@ -0,0 +1,2 @@
alter table "public"."media_analytics_detail" add column "unique_documents" numeric
null;

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"."media_analytics_detail" add column "duplicate_documents" numeric
-- null;

View File

@@ -0,0 +1,2 @@
alter table "public"."media_analytics_detail" add column "duplicate_documents" numeric
null;

View File

@@ -0,0 +1 @@
alter table "public"."media_analytics_detail" rename column "unique_document_count" to "unique_documents";

View File

@@ -0,0 +1 @@
alter table "public"."media_analytics_detail" rename column "unique_documents" to "unique_document_count";

View File

@@ -0,0 +1 @@
alter table "public"."media_analytics_detail" rename column "duplicate_count" to "duplicate_documents";

View File

@@ -0,0 +1 @@
alter table "public"."media_analytics_detail" rename column "duplicate_documents" to "duplicate_count";

View File

@@ -81,8 +81,8 @@ const alternateTransportChangedBuilder = (data) => {
* @returns {{app: {jobId, jobRoNumber: *, bodyShopId: *, key: string, body: string, variables: Object, recipients: *[]}, email: {jobId, jobRoNumber: *, bodyShopName: *, body: string, recipients: *[]}, fcm: {recipients: *[]}}}
*/
const billPostedBuilder = (data) => {
const facing = data?.data?.isinhouse ? "in-house" : "vendor";
const body = `An ${facing} ${data?.data?.is_credit_memo ? "credit memo" : "bill"} has been posted.`.trim();
const facing = data?.data?.isinhouse ? "An In House" : "A Vendor";
const body = `${facing} ${data?.data?.is_credit_memo ? "credit memo" : "bill"} has been posted.`.trim();
return buildNotification(data, "notifications.job.billPosted", body, {
isInHouse: data?.data?.isinhouse,