diff --git a/.env.imex b/.env.production
similarity index 100%
rename from .env.imex
rename to .env.production
diff --git a/.env.rome b/.env.rome
deleted file mode 100644
index 9695644..0000000
--- a/.env.rome
+++ /dev/null
@@ -1,14 +0,0 @@
-VITE_COMPANY=ROME
-
-# Fire Base Config
-VITE_FIREBASE_CONFIG={ "apiKey": "AIzaSyAuLQR9SV5LsVxjU8wh9hvFLdhcAHU6cxE", "authDomain": "rome-prod-1.firebaseapp.com", "projectId": "rome-prod-1", "storageBucket": "rome-prod-1.appspot.com", "messagingSenderId": "147786367145", "appId": "1:147786367145:web:9d4cba68071c3f29a8a9b8", "measurementId": "G-G8Z9DRHTZS"}
-VITE_FIREBASE_CONFIG_TEST={ "apiKey": "AIzaSyAuLQR9SV5LsVxjU8wh9hvFLdhcAHU6cxE", "authDomain": "rome-prod-1.firebaseapp.com", "projectId": "rome-prod-1", "storageBucket": "rome-prod-1.appspot.com", "messagingSenderId": "147786367145", "appId": "1:147786367145:web:9d4cba68071c3f29a8a9b8", "measurementId": "G-G8Z9DRHTZS"}
-# GraphQL Config
-VITE_GRAPHQL_ENDPOINT=https://db.romeonline.io/v1/graphql
-VITE_GRAPHQL_ENDPOINT_TEST=https://db.test.romeonline.io/v1/graphql
-# Front End URL
-VITE_FE_URL=https://romeonline.io
-VITE_FE_URL_TEST=https://test.romeonline.io
-# API Url
-VITE_API_URL="https://api.romeonline.io"
-VITE_API_TEST_URL="https://test.api.romeonline.io"
\ No newline at end of file
diff --git a/README.md b/README.md
index 602d47b..c144c72 100644
--- a/README.md
+++ b/README.md
@@ -1,18 +1,6 @@
-# Shop Partner
-An electron app that is replacing the existing Bodyshop Partner that was a C#/WPF Application.
+# ESDP
-The purpose of this application is to:
-* Parse EMS files, and upload them to the IO back end.
-* Receive requests for EMS file parsing
-
-The following functionality will be coming:
-* Interact with QuickBooks desktop (Windows Only)
-* Paint scale integrations
-* Parts Price Changes for CCC
-
-Toggling between the Production and Test servers can be done by pressing `CTRL/CMD + SHIFT + T`, and then going to the application menu, and enabling test. The application will restart automatically.
-
-## Dev and Build Notes
-Unlike the main app, the dev mode will only connect to ImEX Online test data.
-
-Building the app will require specifying the company to build for. Those details are captured in their respective ENV and YAML files.
+# Outstanding Todos
+* Update certificates and signing.
+* Create S3 upload buckets
+* Create S3 EMS upload bucket.
\ No newline at end of file
diff --git a/build/com.convenient-brands.bodyshop-desktop.keepalive.plist b/build/com.convenient-brands.bodyshop-desktop.keepalive.plist
index e4e8635..6e23436 100644
--- a/build/com.convenient-brands.bodyshop-desktop.keepalive.plist
+++ b/build/com.convenient-brands.bodyshop-desktop.keepalive.plist
@@ -1,17 +1,17 @@
-
- Label
- com.convenientbrands.bodyshop-desktop.keepalive
- ProgramArguments
-
- Shop Partner Keep Alive
- imexmedia://keep-alive
-
- RunAtLoad
-
- StartInterval
- ${KEEP_ALIVE_INTERVAL_SECONDS}
-
+
+ Label
+ com.imex.esdp.keepalive
+ ProgramArguments
+
+ Shop Partner Keep Alive
+ imexmedia://keep-alive
+
+ RunAtLoad
+
+ StartInterval
+ ${KEEP_ALIVE_INTERVAL_SECONDS}
+
\ No newline at end of file
diff --git a/dev-app-update.yml b/dev-app-update.yml
index 8d30efd..bd74279 100644
--- a/dev-app-update.yml
+++ b/dev-app-update.yml
@@ -1,3 +1,3 @@
provider: s3
-bucket: imex-partner
+bucket: esdp
region: ca-central-1
diff --git a/electron-builder.rome.yml b/electron-builder.rome.yml
deleted file mode 100644
index ff0cbbb..0000000
--- a/electron-builder.rome.yml
+++ /dev/null
@@ -1,61 +0,0 @@
-appId: com.convenientbrands.bodyshop-desktop-rome
-copyright: Convenient Brands, LLC.
-productName: Rome Shop Partner
-generateUpdatesFilesForAllChannels: true
-
-directories:
- buildResources: build
-files:
- - "!**/.vscode/*"
- - "!**/.idea/*"
- - "!src/*"
- - "!electron.vite.config.{js,ts,mjs,cjs}"
- - "!{.eslintignore,.eslintrc.cjs,.prettierignore,.prettierrc.yaml,dev-app-update.yml,CHANGELOG.md,README.md}"
- - "!{.env,.env.*,.npmrc,pnpm-lock.yaml}"
- - "!{tsconfig.json,tsconfig.node.json,tsconfig.web.json}"
-asarUnpack:
- - resources/**
-win:
- executableName: ShopPartner
- icon: resources/ro-icon.png
- azureSignOptions:
- endpoint: https://eus.codesigning.azure.net
- certificateProfileName: ImEXRPS
- codeSigningAccountName: ImEX
- publisherName: ImEX Systems Inc.
-nsis:
- artifactName: rome-partner-${env.ARTIFACT_SUFFIX}${arch}.${ext}
- shortcutName: ${productName}
- uninstallDisplayName: ${productName}
- createDesktopShortcut: always
- include: "scripts/installer.nsh" # Reference NSIS script from scripts directory
-mac:
- entitlementsInherit: build/entitlements.mac.plist
- category: public.app-category.business
- icon: resources/ro-icon.png
- extendInfo:
- - NSCameraUsageDescription: Application requests access to the device's camera.
- - NSMicrophoneUsageDescription: Application requests access to the device's microphone.
- - NSDocumentsFolderUsageDescription: Application requests access to the user's Documents folder.
- - NSDownloadsFolderUsageDescription: Application requests access to the user's Downloads folder.
- - CFBundleURLTypes:
- - CFBundleTypeRole: Viewer # More specific role for protocol handling
- CFBundleURLName: com.convenientbrands.bodyshop-desktop-rome
- CFBundleURLSchemes:
- - imexmedia
- target:
- - target: default
- arch:
- - arm64
- - target: default
- arch:
- - x64
-dmg:
- artifactName: rome-partner-${env.ARTIFACT_SUFFIX}${arch}.${ext}
-appImage:
- artifactName: rome-partner-${env.ARTIFACT_SUFFIX}${arch}.${ext}
-npmRebuild: false
-publish:
- provider: s3
- bucket: rome-partner
- region: us-east-2
diff --git a/electron-builder.imex.yml b/electron-builder.yml
similarity index 77%
rename from electron-builder.imex.yml
rename to electron-builder.yml
index 57bbe37..4edf100 100644
--- a/electron-builder.imex.yml
+++ b/electron-builder.yml
@@ -1,6 +1,6 @@
-appId: com.convenientbrands.bodyshop-desktop-imex
-copyright: Convenient Brands, LLC.
-productName: ImEX Shop Partner
+appId: com.imex.esdp
+copyright: ImEX Systems Inc.
+productName: EMS Uploader
generateUpdatesFilesForAllChannels: true
directories:
@@ -16,7 +16,7 @@ files:
asarUnpack:
- resources/**
win:
- executableName: ShopPartner
+ executableName: EMSUploader
icon: resources/icon.png
azureSignOptions:
endpoint: https://eus.codesigning.azure.net
@@ -24,7 +24,7 @@ win:
codeSigningAccountName: ImEX
publisherName: ImEX Systems Inc.
nsis:
- artifactName: imex-partner-${env.ARTIFACT_SUFFIX}${arch}.${ext}
+ artifactName: esdp-${env.ARTIFACT_SUFFIX}${arch}.${ext}
shortcutName: ${productName}
uninstallDisplayName: ${productName}
createDesktopShortcut: always
@@ -39,9 +39,9 @@ mac:
- NSDownloadsFolderUsageDescription: Application requests access to the user's Downloads folder.
- CFBundleURLTypes:
- CFBundleTypeRole: Viewer # More specific role for protocol handling
- CFBundleURLName: com.convenientbrands.bodyshop-desktop-imex
+ CFBundleURLName: com.imex.esdp
CFBundleURLSchemes:
- - imexmedia
+ - esdp
target:
- target: default
arch:
@@ -50,11 +50,11 @@ mac:
arch:
- x64
dmg:
- artifactName: imex-partner-${env.ARTIFACT_SUFFIX}${arch}.${ext}
+ artifactName: esdp-${env.ARTIFACT_SUFFIX}${arch}.${ext}
appImage:
- artifactName: imex-partner-${env.ARTIFACT_SUFFIX}${arch}.${ext}
+ artifactName: esdp-${env.ARTIFACT_SUFFIX}${arch}.${ext}
npmRebuild: false
publish:
provider: s3
- bucket: imex-partner
+ bucket: esdp
region: ca-central-1
diff --git a/electron.vite.config.ts b/electron.vite.config.ts
index 1b90d23..8e3e1bf 100644
--- a/electron.vite.config.ts
+++ b/electron.vite.config.ts
@@ -11,12 +11,12 @@ export default defineConfig({
}),
sentryVitePlugin({
org: "imex",
- project: "imex-partner",
+ project: "esdp",
sourcemaps: {
filesToDeleteAfterUpload: ["**.js.map"],
},
release: {
- name: `bodyshop-desktop@${process.env.npm_package_version}`,
+ name: `esdp@${process.env.npm_package_version}`,
},
}),
],
diff --git a/package.json b/package.json
index 8042477..2ef7ec8 100644
--- a/package.json
+++ b/package.json
@@ -1,10 +1,10 @@
{
- "name": "bodyshop-desktop",
- "version": "1.0.8",
- "description": "Shop Management System Partner",
+ "name": "esdp",
+ "version": "0.0.1",
+ "description": "EMS Uploader",
"main": "./out/main/index.js",
- "author": "Convenient Brands, LLC",
- "homepage": "https://convenient-brands.com",
+ "author": "ImEX Systems Inc.",
+ "homepage": "https://imexsystems.ca",
"scripts": {
"format": "prettier --write .",
"lint": "eslint --cache .",
@@ -13,17 +13,13 @@
"typecheck": "npm run typecheck:node && npm run typecheck:web",
"start": "electron-vite preview",
"dev": "electron-vite dev",
- "build:imex": "node deploy/set-artifact-name.js electron-vite build --mode imex && node deploy/set-artifact-name.js electron-builder --config electron-builder.imex.yml",
- "build:rome": "node deploy/set-artifact-name.js electron-vite build --mode rome && node deploy/set-artifact-name.js electron-builder --config electron-builder.rome.yml",
- "build:imex:publish": "node deploy/set-artifact-name.js electron-vite build --mode imex && node deploy/set-artifact-name.js electron-builder --config electron-builder.imex.yml --publish always",
- "build:rome:publish": "node deploy/set-artifact-name.js electron-vite build --mode rome && node deploy/set-artifact-name.js electron-builder --config electron-builder.rome.yml --publish always",
- "build:imex:linux": "node deploy/set-artifact-name.js electron-vite build --mode imex && node deploy/set-artifact-name.js electron-builder --config electron-builder.imex.yml --linux",
- "build:rome:linux": "node deploy/set-artifact-name.js electron-vite build --mode rome && node deploy/set-artifact-name.js electron-builder --config electron-builder.rome.yml --linux",
+ "build": "node deploy/set-artifact-name.js electron-vite build && node deploy/set-artifact-name.js electron-builder ",
+ "build:publish": "node deploy/set-artifact-name.js electron-vite build && node deploy/set-artifact-name.js electron-builder --publish always",
+ "build:linux": "node deploy/set-artifact-name.js electron-vite build && node deploy/set-artifact-name.js electron-builder --linux",
"postinstall": "electron-builder install-app-deps",
"build:unpack": "node deploy/set-artifact-name.js electron-vite build --mode imex && node deploy/set-artifact-name.js electron-builder --dir",
"build:win": "node deploy/set-artifact-name.js electron-vite build --mode imex && node deploy/set-artifact-name.js electron-builder --win",
- "build:mac": "node deploy/set-artifact-name.js electron-vite build --mode imex && node deploy/set-artifact-name.js electron-builder --mac",
- "build:linux": "node deploy/set-artifact-name.js electron-vite build --mode imex && node deploy/set-artifact-name.js electron-builder --linux"
+ "build:mac": "node deploy/set-artifact-name.js electron-vite build --mode imex && node deploy/set-artifact-name.js electron-builder --mac"
},
"dependencies": {
"@apollo/client": "^3.13.6",
diff --git a/resources/Interop.QBFC16.dll b/resources/Interop.QBFC16.dll
deleted file mode 100644
index ba70ed2..0000000
Binary files a/resources/Interop.QBFC16.dll and /dev/null differ
diff --git a/resources/Interop.QBXMLRP2.dll b/resources/Interop.QBXMLRP2.dll
deleted file mode 100644
index c7863b7..0000000
Binary files a/resources/Interop.QBXMLRP2.dll and /dev/null differ
diff --git a/resources/QBFC16.dll b/resources/QBFC16.dll
deleted file mode 100644
index 95394f3..0000000
Binary files a/resources/QBFC16.dll and /dev/null differ
diff --git a/resources/ro-icon.png b/resources/ro-icon.png
deleted file mode 100644
index f9a7f41..0000000
Binary files a/resources/ro-icon.png and /dev/null differ
diff --git a/src/main/ems-parts-order/ems-parts-order-generate-ad1.ts b/src/main/ems-parts-order/ems-parts-order-generate-ad1.ts
deleted file mode 100644
index 03905e7..0000000
--- a/src/main/ems-parts-order/ems-parts-order-generate-ad1.ts
+++ /dev/null
@@ -1,158 +0,0 @@
-import { DBFFile } from "dbffile";
-import errorTypeCheck from "../../util/errorTypeCheck";
-import { ad1FieldLineDescriptors } from "../util/ems-interface/fielddescriptors/ad1-field-descriptors";
-import {
- deleteEmsFileIfExists,
- generateEmsOutFilePath,
-} from "../util/ems-util";
-import { EmsPartsOrder } from "./ems-parts-order-interfaces";
-
-const EmsPartsOrderGenerateAd1File = async (
- partsOrder: EmsPartsOrder,
-): Promise => {
- try {
- const records = [
- {
- INS_CO_ID: partsOrder.job.ins_co_nm,
- INS_CO_NM: partsOrder.job.ins_co_nm,
- INS_ADDR1: partsOrder.job.ins_addr1,
- INS_ADDR2: partsOrder.job.ins_addr2,
- INS_CITY: partsOrder.job.ins_city,
- INS_ST: partsOrder.job.ins_st,
- INS_ZIP: partsOrder.job.ins_zip,
- INS_CTRY: partsOrder.job.ins_ctry,
- INS_PH1: partsOrder.job.ins_ph1,
- INS_PH1X: partsOrder.job.ins_ph1x,
- INS_PH2: partsOrder.job.ins_ph2,
- INS_PH2X: partsOrder.job.ins_ph2x,
- INS_FAX: partsOrder.job.ins_fax,
- INS_FAXX: partsOrder.job.ins_faxx,
- INS_CT_LN: partsOrder.job.ins_ct_ln,
- INS_CT_FN: partsOrder.job.ins_ct_fn,
- INS_TITLE: partsOrder.job.ins_title,
- INS_CT_PH: partsOrder.job.ins_ct_ph,
- INS_CT_PHX: partsOrder.job.ins_ct_phx,
- INS_EA: partsOrder.job.ins_ea,
- INS_MEMO: partsOrder.job.ins_memo,
- POLICY_NO: partsOrder.job.policy_no,
- DED_AMT: partsOrder.job.ded_amt,
- DED_STATUS: partsOrder.job.ded_status,
- ASGN_NO: partsOrder.job.asgn_no,
- ASGN_DATE: partsOrder.job.asgn_date
- ? new Date(partsOrder.job.asgn_date)
- : null,
- ASGN_TYPE: partsOrder.job.asgn_type,
- CLM_NO: partsOrder.job.clm_no,
- CLM_OFC_ID: partsOrder.job.clm_ofc_id,
- CLM_OFC_NM: partsOrder.job.clm_ofc_nm,
- CLM_ADDR1: partsOrder.job.clm_addr1,
- CLM_ADDR2: partsOrder.job.clm_addr2,
- CLM_CITY: partsOrder.job.clm_city,
- CLM_ST: partsOrder.job.clm_st,
- CLM_ZIP: partsOrder.job.clm_zip,
- CLM_CTRY: partsOrder.job.clm_ctry,
- CLM_PH1: partsOrder.job.clm_ph1,
- CLM_PH1X: partsOrder.job.clm_ph1x,
- CLM_PH2: partsOrder.job.clm_ph2,
- CLM_PH2X: partsOrder.job.clm_ph2x,
- CLM_FAX: partsOrder.job.clm_fax,
- CLM_FAXX: partsOrder.job.clm_faxx,
- CLM_CT_LN: partsOrder.job.clm_ct_ln,
- CLM_CT_FN: partsOrder.job.clm_ct_fn,
- CLM_TITLE: partsOrder.job.clm_title,
- CLM_CT_PH: partsOrder.job.clm_ct_ph,
- CLM_CT_PHX: partsOrder.job.clm_ct_phx,
- CLM_EA: partsOrder.job.clm_ea,
- PAYEE_NMS: partsOrder.job.payee_nms,
- PAY_TYPE: partsOrder.job.pay_type,
- PAY_DATE: partsOrder.job.pay_date,
- PAY_CHKNM: null, // Explicitly set to null as in original code
- PAY_AMT: null, // Explicitly set to null as in original code
- PAY_MEMO: partsOrder.job.pay_memo,
- AGT_CO_ID: partsOrder.job.agt_co_id,
- AGT_CO_NM: partsOrder.job.agt_co_nm,
- AGT_ADDR1: partsOrder.job.agt_addr1,
- AGT_ADDR2: partsOrder.job.agt_addr2,
- AGT_CITY: partsOrder.job.agt_city,
- AGT_ST: partsOrder.job.agt_st,
- AGT_ZIP: partsOrder.job.agt_zip,
- AGT_CTRY: partsOrder.job.agt_ctry,
- AGT_PH1: partsOrder.job.agt_ph1,
- AGT_PH1X: partsOrder.job.agt_ph1x,
- AGT_PH2: partsOrder.job.agt_ph2,
- AGT_PH2X: partsOrder.job.agt_ph2x,
- AGT_FAX: partsOrder.job.agt_fax,
- AGT_FAXX: partsOrder.job.agt_faxx,
- AGT_CT_LN: partsOrder.job.agt_ct_ln,
- AGT_CT_FN: partsOrder.job.agt_ct_fn,
- AGT_CT_PH: partsOrder.job.agt_ct_ph,
- AGT_CT_PHX: partsOrder.job.agt_ct_phx,
- AGT_EA: partsOrder.job.agt_ea,
- AGT_LIC_NO: partsOrder.job.agt_lic_no,
- LOSS_DATE: partsOrder.job.loss_date
- ? new Date(partsOrder.job.loss_date)
- : null,
- LOSS_CAT: null, // Explicitly set to null as in original code
- LOSS_TYPE: null, // Explicitly set to null as in original code
- LOSS_DESC: partsOrder.job.loss_desc,
- THEFT_IND: null, // Explicitly set to null as in original code
- CAT_NO: partsOrder.job.cat_no,
- TLOS_IND: null, // Explicitly set to null as in original code
- LOSS_MEMO: partsOrder.job.loss_memo,
- CUST_PR: partsOrder.job.cust_pr,
- INSD_LN: partsOrder.job.insd_ln,
- INSD_FN: partsOrder.job.insd_fn,
- INSD_TITLE: partsOrder.job.insd_title,
- INSD_CO_NM: partsOrder.job.insd_co_nm,
- INSD_ADDR1: partsOrder.job.insd_addr1,
- INSD_ADDR2: partsOrder.job.insd_addr2,
- INSD_CITY: partsOrder.job.insd_city,
- INSD_ST: partsOrder.job.insd_st,
- INSD_ZIP: partsOrder.job.insd_zip,
- INSD_CTRY: partsOrder.job.insd_ctry,
- INSD_PH1: partsOrder.job.insd_ph1,
- INSD_PH1X: partsOrder.job.insd_ph1x,
- INSD_PH2: partsOrder.job.insd_ph2,
- INSD_PH2X: partsOrder.job.insd_ph2x,
- INSD_FAX: partsOrder.job.insd_fax,
- INSD_FAXX: partsOrder.job.insd_faxx,
- INSD_EA: partsOrder.job.insd_ea,
- OWNR_LN: partsOrder.job.ownr_ln,
- OWNR_FN: partsOrder.job.ownr_fn,
- OWNR_TITLE: partsOrder.job.ownr_title,
- OWNR_CO_NM: partsOrder.job.ownr_co_nm,
- OWNR_ADDR1: partsOrder.job.ownr_addr1,
- OWNR_ADDR2: partsOrder.job.ownr_addr2,
- OWNR_CITY: partsOrder.job.ownr_city,
- OWNR_ST: partsOrder.job.ownr_st,
- OWNR_ZIP: partsOrder.job.ownr_zip,
- OWNR_CTRY: partsOrder.job.ownr_ctry,
- OWNR_PH1: partsOrder.job.ownr_ph1,
- OWNR_PH1X: partsOrder.job.ownr_ph1x,
- OWNR_PH2: partsOrder.job.ownr_ph2,
- OWNR_PH2X: partsOrder.job.ownr_ph2x,
- OWNR_FAX: partsOrder.job.ownr_fax,
- OWNR_FAXX: partsOrder.job.ownr_faxx,
- OWNR_EA: partsOrder.job.ownr_ea,
- },
- ];
-
- await deleteEmsFileIfExists(
- generateEmsOutFilePath(`${partsOrder.job.ciecaid}.AD1`),
- );
-
- const dbf: DBFFile = await DBFFile.create(
- generateEmsOutFilePath(`${partsOrder.job.ciecaid}.AD1`),
- ad1FieldLineDescriptors,
- );
-
- await dbf.appendRecords(records);
- console.log(`${records.length} AD1 file records added.`);
- return true;
- } catch (error) {
- console.error("Error generating AD1 file:", errorTypeCheck(error));
- return false;
- }
-};
-
-export default EmsPartsOrderGenerateAd1File;
diff --git a/src/main/ems-parts-order/ems-parts-order-generate-ad2.ts b/src/main/ems-parts-order/ems-parts-order-generate-ad2.ts
deleted file mode 100644
index c90234e..0000000
--- a/src/main/ems-parts-order/ems-parts-order-generate-ad2.ts
+++ /dev/null
@@ -1,67 +0,0 @@
-import { DBFFile } from "dbffile";
-import errorTypeCheck from "../../util/errorTypeCheck";
-import { ad2FieldLineDescriptors } from "../util/ems-interface/fielddescriptors/ad2-field-descriptors";
-import {
- deleteEmsFileIfExists,
- generateEmsOutFilePath,
-} from "../util/ems-util";
-import { EmsPartsOrder } from "./ems-parts-order-interfaces";
-
-const EmsPartsOrderGenerateAd2File = async (
- partsOrder: EmsPartsOrder,
-): Promise => {
- try {
- const records = [
- {
- EST_CO_NM: partsOrder.job.est_co_nm,
- EST_ADDR1: partsOrder.job.est_addr1,
- EST_ADDR2: partsOrder.job.est_addr2,
- EST_CITY: partsOrder.job.est_city,
- EST_ST: partsOrder.job.est_st,
- EST_ZIP: partsOrder.job.est_zip,
- EST_CTRY: partsOrder.job.est_ctry,
- EST_PH1: partsOrder.job.est_ph1,
- EST_CT_LN: partsOrder.job.est_ct_ln,
- EST_CT_FN: partsOrder.job.est_ct_fn,
- EST_EA: partsOrder.job.est_ea,
- CLMT_ADDR1: partsOrder.job.clm_addr1,
- CLMT_ADDR2: partsOrder.job.clm_addr2,
- CLMT_CITY: partsOrder.job.clm_city,
- CLMT_ST: partsOrder.job.clm_st,
- CLMT_ZIP: partsOrder.job.clm_zip,
- CLMT_CTRY: partsOrder.job.clm_ctry,
- CLMT_PH1: partsOrder.job.clm_ph1,
- CLMT_PH1X: partsOrder.job.clm_ph1x,
- CLMT_PH2: partsOrder.job.clm_ph2,
- CLMT_PH2X: partsOrder.job.clm_ph2x,
- CLMT_FAX: partsOrder.job.clm_fax,
- CLMT_FAXX: partsOrder.job.clm_faxx,
- CLMT_LN: partsOrder.job.clm_ct_ln,
- CLMT_FN: partsOrder.job.clm_ct_fn,
- CLMT_TITLE: partsOrder.job.clm_title,
- CLMT_CT_PH: partsOrder.job.clm_ct_ph,
- CLMT_CT_PHX: partsOrder.job.clm_ct_phx,
- CLMT_EA: partsOrder.job.clm_ea,
- RF_CO_NM: partsOrder.job.bodyshop.shopname,
- },
- ];
-
- await deleteEmsFileIfExists(
- generateEmsOutFilePath(`${partsOrder.job.ciecaid}.AD2`),
- );
-
- const dbf: DBFFile = await DBFFile.create(
- generateEmsOutFilePath(`${partsOrder.job.ciecaid}.AD2`),
- ad2FieldLineDescriptors,
- );
-
- await dbf.appendRecords(records);
- console.log(`${records.length} AD2 file records added.`);
- return true;
- } catch (error) {
- console.error("Error generating AD2 file:", errorTypeCheck(error));
- return false;
- }
-};
-
-export default EmsPartsOrderGenerateAd2File;
diff --git a/src/main/ems-parts-order/ems-parts-order-generate-env.ts b/src/main/ems-parts-order/ems-parts-order-generate-env.ts
deleted file mode 100644
index 34b9ec5..0000000
--- a/src/main/ems-parts-order/ems-parts-order-generate-env.ts
+++ /dev/null
@@ -1,80 +0,0 @@
-import { DBFFile } from "dbffile";
-import errorTypeCheck from "../../util/errorTypeCheck";
-import { envFieldLineDescriptors } from "../util/ems-interface/fielddescriptors/env-field-descriptor";
-import {
- deleteEmsFileIfExists,
- generateEmsOutFilePath,
-} from "../util/ems-util";
-import { EmsPartsOrder } from "./ems-parts-order-interfaces";
-
-const EmsPartsOrderGenerateEnvFile = async (
- partsOrder: EmsPartsOrder,
-): Promise => {
- try {
- const dateNow = new Date();
- const formatTime = (date: Date): string =>
- `${date.getHours().toString().padStart(2, "0")}${date.getMinutes().toString().padStart(2, "0")}${date.getSeconds().toString().padStart(2, "0")}`;
-
- const {
- job: { ro_number, ciecaid },
- } = partsOrder;
-
- // Find the highest line_ind value
- const lineInds = partsOrder.parts_order_lines.map(
- (line) => line.jobline.line_ind,
- );
- const getNumber = (str: string): number => {
- const match = str.match(/(\d+)$/);
- return match ? parseInt(match[1], 10) : 0;
- };
- const highestLineInd = lineInds.reduce(
- (max, current) => (getNumber(current) > getNumber(max) ? current : max),
- lineInds[0] || "",
- );
-
- const records = [
- {
- EST_SYSTEM: "M",
- SW_VERSION: "25.3",
- DB_VERSION: "OCT_25_V",
- DB_DATE: dateNow,
- RO_ID: ro_number,
- ESTFILE_ID: ciecaid,
- SUPP_NO: highestLineInd ? getNumber(highestLineInd).toString() : "1",
- EST_CTRY: "CAN",
- TOP_SECRET: "00000000-0000-0000-0000-000000000000",
- TRANS_TYPE: highestLineInd ? highestLineInd.charAt(0) : "S",
- STATUS: false,
- CREATE_DT: dateNow,
- CREATE_TM: formatTime(dateNow),
- TRANSMT_DT: dateNow,
- TRANSMT_TM: formatTime(dateNow),
- INCL_ADMIN: true,
- INCL_VEH: true,
- INCL_EST: true,
- INCL_PROFL: false,
- INCL_TOTAL: false,
- INCL_VENDR: false,
- EMS_VER: "2.0",
- },
- ];
-
- await deleteEmsFileIfExists(
- generateEmsOutFilePath(`${partsOrder.job.ciecaid}.ENV`),
- );
-
- const dbf: DBFFile = await DBFFile.create(
- generateEmsOutFilePath(`${partsOrder.job.ciecaid}.ENV`),
- envFieldLineDescriptors,
- );
-
- await dbf.appendRecords(records);
- console.log(`${records.length} ENV file records added.`);
- return true;
- } catch (error) {
- console.error("Error generating ENV file:", errorTypeCheck(error));
- return false;
- }
-};
-
-export default EmsPartsOrderGenerateEnvFile;
diff --git a/src/main/ems-parts-order/ems-parts-order-generate-lin.ts b/src/main/ems-parts-order/ems-parts-order-generate-lin.ts
deleted file mode 100644
index 791909f..0000000
--- a/src/main/ems-parts-order/ems-parts-order-generate-lin.ts
+++ /dev/null
@@ -1,85 +0,0 @@
-import { DBFFile } from "dbffile";
-import errorTypeCheck from "../../util/errorTypeCheck";
-import {
- deleteEmsFileIfExists,
- generateEmsOutFilePath,
-} from "../util/ems-util";
-import { EmsPartsOrder } from "./ems-parts-order-interfaces";
-import { linFieldLineDescriptors } from "../util/ems-interface/fielddescriptors/lin-field-descriptors";
-
-const EmsPartsOrderGenerateLinFile = async (
- partsOrder: EmsPartsOrder,
-): Promise => {
- try {
- const records = partsOrder.parts_order_lines.map((partsOrderLine) => ({
- LINE_NO: partsOrderLine.jobline?.line_no,
- LINE_IND: partsOrderLine.jobline?.line_ind,
- LINE_REF: partsOrderLine.jobline?.line_ref,
- TRAN_CODE: partsOrderLine.jobline?.tran_code ?? "1",
- DB_REF: partsOrderLine.jobline?.db_ref,
- UNQ_SEQ: partsOrderLine.jobline?.unq_seq,
- PART_DES_J: false,
- LINE_DESC: partsOrderLine.jobline?.line_desc,
- PART_TYPE:
- partsOrderLine.priceChange === true
- ? partsOrderLine.part_type
- : partsOrderLine.jobline?.part_type,
- GLASS_FLAG: partsOrderLine.jobline?.glass_flag,
- OEM_PARTNO: partsOrderLine.jobline?.oem_partno,
- PRICE_INC: partsOrderLine.jobline?.price_inc,
- ALT_PART_I: partsOrderLine.jobline?.alt_part_i,
- TAX_PART: partsOrderLine.jobline?.tax_part,
- DB_PRICE: partsOrderLine.jobline?.db_price,
- ACT_PRICE:
- partsOrderLine.priceChange === true
- ? partsOrderLine.act_price
- : partsOrderLine.jobline?.act_price,
- PRICE_J: partsOrderLine.jobline?.price_j,
- CERT_PART: partsOrderLine.jobline?.cert_part,
- PART_QTY: partsOrderLine.jobline?.part_qty,
- ALT_CO_ID: partsOrderLine.jobline?.alt_co_id,
- ALT_PARTNO: partsOrderLine.jobline?.alt_partno,
- ALT_OVERRD: partsOrderLine.jobline?.alt_overrd,
- ALT_PARTM: partsOrderLine.jobline?.alt_partm,
- PRT_DSMK_P: partsOrderLine.jobline?.prt_dsmk_p,
- PRT_DSMK_M: partsOrderLine.jobline?.prt_dsmk_m,
- MOD_LBR_TY: partsOrderLine.jobline?.mod_lbr_ty,
- DB_HRS: partsOrderLine.jobline?.db_hrs,
- MOD_LB_HRS: partsOrderLine.jobline?.mod_lb_hrs,
- LBR_INC: partsOrderLine.jobline?.lbr_inc,
- LBR_OP: partsOrderLine.jobline?.lbr_op,
- LBR_HRS_J: partsOrderLine.jobline?.lbr_hrs_j,
- LBR_TYP_J: partsOrderLine.jobline?.lbr_typ_j,
- LBR_OP_J: partsOrderLine.jobline?.lbr_op_j,
- PAINT_STG: partsOrderLine.jobline?.paint_stg,
- PAINT_TONE: partsOrderLine.jobline?.paint_tone,
- LBR_TAX: partsOrderLine.jobline?.lbr_tax,
- LBR_AMT: partsOrderLine.jobline?.lbr_amt,
- MISC_AMT: partsOrderLine.jobline?.misc_amt,
- MISC_SUBLT: partsOrderLine.jobline?.misc_sublt,
- MISC_TAX: partsOrderLine.jobline?.misc_tax,
- BETT_TYPE: partsOrderLine.jobline?.bett_type,
- BETT_PCTG: partsOrderLine.jobline?.bett_pctg,
- BETT_AMT: partsOrderLine.jobline?.bett_amt,
- BETT_TAX: partsOrderLine.jobline?.bett_tax,
- }));
-
- await deleteEmsFileIfExists(
- generateEmsOutFilePath(`${partsOrder.job.ciecaid}.LIN`),
- );
-
- const dbf: DBFFile = await DBFFile.create(
- generateEmsOutFilePath(`${partsOrder.job.ciecaid}.LIN`),
- linFieldLineDescriptors,
- );
-
- await dbf.appendRecords(records);
- console.log(`${records.length} LIN file records added.`);
- return true;
- } catch (error) {
- console.error("Error generating LIN file:", errorTypeCheck(error));
- return false;
- }
-};
-
-export default EmsPartsOrderGenerateLinFile;
diff --git a/src/main/ems-parts-order/ems-parts-order-generate-pfh.ts b/src/main/ems-parts-order/ems-parts-order-generate-pfh.ts
deleted file mode 100644
index 689507c..0000000
--- a/src/main/ems-parts-order/ems-parts-order-generate-pfh.ts
+++ /dev/null
@@ -1,59 +0,0 @@
-import { DBFFile } from "dbffile";
-import errorTypeCheck from "../../util/errorTypeCheck";
-import {
- deleteEmsFileIfExists,
- generateEmsOutFilePath,
-} from "../util/ems-util";
-import { EmsPartsOrder } from "./ems-parts-order-interfaces";
-import { pfhFieldLineDescriptors } from "../util/ems-interface/fielddescriptors/pfh-field-descriptors";
-
-const EmsPartsOrderGeneratePfhFile = async (
- partsOrder: EmsPartsOrder,
-): Promise => {
- try {
- const records = [
- {
- ID_PRO_NAM: "REPAIR FACILITY", // Job.id_pro_nam?.Value
- TAX_PRETHR: (partsOrder.job.tax_prethr || 0) * 100,
- TAX_THRAMT: (partsOrder.job.tax_thramt || 0) * 100,
- TAX_PSTTHR: (partsOrder.job.tax_pstthr || 0) * 100,
- TAX_TOW_IN: true, // Job.tax_tow_in?.Value
- TAX_TOW_RT: (partsOrder.job.tax_tow_rt || 0) * 100,
- TAX_STR_IN: true, // Job.tax_str_in?.Value
- TAX_STR_RT: (partsOrder.job.tax_str_rt || 0) * 100,
- TAX_SUB_IN: true, // Job.tax_sub_in?.Value
- TAX_SUB_RT: (partsOrder.job.tax_sub_rt || 0) * 100,
- TAX_BTR_IN: true, // Job.tax_btr_in?.Value
- TAX_LBR_RT:
- (partsOrder.job.bodyshop?.bill_tax_rates?.state_tax_rate || 0) * 100,
- TAX_GST_RT:
- (partsOrder.job.bodyshop?.bill_tax_rates?.federal_tax_rate || 0) *
- 100,
- TAX_GST_IN: true, // Job.tax_gst_in?.Value
- ADJ_G_DISC: (partsOrder.job.adj_g_disc || 0) * 100,
- ADJ_TOWDIS: (partsOrder.job.adj_towdis || 0) * 100,
- ADJ_STRDIS: (partsOrder.job.adj_strdis || 0) * 100,
- ADJ_BTR_IN: null, // Job.adj_btr_in?.Value
- TAX_PREDIS: (partsOrder.job.tax_predis || 0) * 100,
- },
- ];
-
- await deleteEmsFileIfExists(
- generateEmsOutFilePath(`${partsOrder.job.ciecaid}.PFH`),
- );
-
- const dbf: DBFFile = await DBFFile.create(
- generateEmsOutFilePath(`${partsOrder.job.ciecaid}.PFH`),
- pfhFieldLineDescriptors,
- );
-
- await dbf.appendRecords(records);
- console.log(`${records.length} PFH file records added.`);
- return true;
- } catch (error) {
- console.error("Error generating PFH file:", errorTypeCheck(error));
- return false;
- }
-};
-
-export default EmsPartsOrderGeneratePfhFile;
diff --git a/src/main/ems-parts-order/ems-parts-order-generate-pfl.ts b/src/main/ems-parts-order/ems-parts-order-generate-pfl.ts
deleted file mode 100644
index ab3b8d9..0000000
--- a/src/main/ems-parts-order/ems-parts-order-generate-pfl.ts
+++ /dev/null
@@ -1,302 +0,0 @@
-import { DBFFile } from "dbffile";
-import errorTypeCheck from "../../util/errorTypeCheck";
-import { DecodedPflLine } from "../decoder/decode-pfl.interface";
-import { pflFieldLineDescriptors } from "../util/ems-interface/fielddescriptors/pfl-field-descriptors";
-import {
- deleteEmsFileIfExists,
- generateEmsOutFilePath,
-} from "../util/ems-util";
-import uppercaseObjectKeys from "../util/uppercaseObjectKeys";
-import { EmsPartsOrder } from "./ems-parts-order-interfaces";
-import _ from "lodash";
-
-const EmsPartsOrderGeneratePflFile = async (
- partsOrder: EmsPartsOrder,
-): Promise => {
- try {
- let records;
-
- if (partsOrder.job.cieca_pfl && !_.isEmpty(partsOrder.job.cieca_pfl)) {
- records = Object.keys(partsOrder.job.cieca_pfl).map((key) => {
- const record: DecodedPflLine = partsOrder.job.cieca_pfl[key];
- return uppercaseObjectKeys(record);
- });
- } else {
- //We don't have the PFL data for an old job, so make it manually.
-
- records = [
- {
- LBR_TYPE: "LAA",
- LBR_DESC: "",
- LBR_RATE: partsOrder.job.rate_laa,
- LBR_TAX_IN: true,
- LBR_TAXP: null, // Job.bodyshop.bill_tax_rates.state_tax_rate?.Value ?? 0,
- LBR_ADJP: 0,
- LBR_TX_TY1: null, //partsOrder.job.lbr_tx_ty1,
- LBR_TX_IN1: null, //partsOrder.job.lbr_tx_in1,
- LBR_TX_TY2: null, //partsOrder.job.lbr_tx_ty2,
- LBR_TX_IN2: null, //partsOrder.job.lbr_tx_in2,
- LBR_TX_TY3: null, //partsOrder.job.lbr_tx_ty3,
- LBR_TX_IN3: null, //partsOrder.job.lbr_tx_in3,
- LBR_TX_TY4: null, //partsOrder.job.lbr_tx_ty4,
- LBR_TX_IN4: null, //partsOrder.job.lbr_tx_in4,
- LBR_TX_TY5: null, //partsOrder.job.lbr_tx_ty5,
- LBR_TX_IN5: null, //partsOrder.job.lbr_tx_in5,
- },
- {
- LBR_TYPE: "LAB",
- LBR_DESC: "",
- LBR_RATE: partsOrder.job.rate_lab,
- LBR_TAX_IN: true,
- LBR_TAXP: null, // Job.bodyshop.bill_tax_rates.state_tax_rate?.Value ?? 0,
- LBR_ADJP: 0,
- LBR_TX_TY1: null, //partsOrder.job.lbr_tx_ty1,
- LBR_TX_IN1: null, //partsOrder.job.lbr_tx_in1,
- LBR_TX_TY2: null, //partsOrder.job.lbr_tx_ty2,
- LBR_TX_IN2: null, //partsOrder.job.lbr_tx_in2,
- LBR_TX_TY3: null, //partsOrder.job.lbr_tx_ty3,
- LBR_TX_IN3: null, //partsOrder.job.lbr_tx_in3,
- LBR_TX_TY4: null, //partsOrder.job.lbr_tx_ty4,
- LBR_TX_IN4: null, //partsOrder.job.lbr_tx_in4,
- LBR_TX_TY5: null, //partsOrder.job.lbr_tx_ty5,
- LBR_TX_IN5: null, //partsOrder.job.lbr_tx_in5,
- },
-
- {
- LBR_TYPE: "LAD",
- LBR_DESC: "",
- LBR_RATE: partsOrder.job.rate_lad,
- LBR_TAX_IN: true,
- LBR_TAXP: null, // Job.bodyshop.bill_tax_rates.state_tax_rate?.Value ?? 0,
- LBR_ADJP: 0,
- LBR_TX_TY1: null, //partsOrder.job.lbr_tx_ty1,
- LBR_TX_IN1: null, //partsOrder.job.lbr_tx_in1,
- LBR_TX_TY2: null, //partsOrder.job.lbr_tx_ty2,
- LBR_TX_IN2: null, //partsOrder.job.lbr_tx_in2,
- LBR_TX_TY3: null, //partsOrder.job.lbr_tx_ty3,
- LBR_TX_IN3: null, //partsOrder.job.lbr_tx_in3,
- LBR_TX_TY4: null, //partsOrder.job.lbr_tx_ty4,
- LBR_TX_IN4: null, //partsOrder.job.lbr_tx_in4,
- LBR_TX_TY5: null, //partsOrder.job.lbr_tx_ty5,
- LBR_TX_IN5: null, //partsOrder.job.lbr_tx_in5,
- },
- {
- LBR_TYPE: "LAE",
- LBR_DESC: "",
- LBR_RATE: partsOrder.job.rate_lae,
- LBR_TAX_IN: true,
- LBR_TAXP: null, // Job.bodyshop.bill_tax_rates.state_tax_rate?.Value ?? 0,
- LBR_ADJP: 0,
- LBR_TX_TY1: null, //partsOrder.job.lbr_tx_ty1,
- LBR_TX_IN1: null, //partsOrder.job.lbr_tx_in1,
- LBR_TX_TY2: null, //partsOrder.job.lbr_tx_ty2,
- LBR_TX_IN2: null, //partsOrder.job.lbr_tx_in2,
- LBR_TX_TY3: null, //partsOrder.job.lbr_tx_ty3,
- LBR_TX_IN3: null, //partsOrder.job.lbr_tx_in3,
- LBR_TX_TY4: null, //partsOrder.job.lbr_tx_ty4,
- LBR_TX_IN4: null, //partsOrder.job.lbr_tx_in4,
- LBR_TX_TY5: null, //partsOrder.job.lbr_tx_ty5,
- LBR_TX_IN5: null, //partsOrder.job.lbr_tx_in5,
- },
- {
- LBR_TYPE: "LAF",
- LBR_DESC: "",
- LBR_RATE: partsOrder.job.rate_laf,
- LBR_TAX_IN: true,
- LBR_TAXP: null, // Job.bodyshop.bill_tax_rates.state_tax_rate?.Value ?? 0,
- LBR_ADJP: 0,
- LBR_TX_TY1: null, //partsOrder.job.lbr_tx_ty1,
- LBR_TX_IN1: null, //partsOrder.job.lbr_tx_in1,
- LBR_TX_TY2: null, //partsOrder.job.lbr_tx_ty2,
- LBR_TX_IN2: null, //partsOrder.job.lbr_tx_in2,
- LBR_TX_TY3: null, //partsOrder.job.lbr_tx_ty3,
- LBR_TX_IN3: null, //partsOrder.job.lbr_tx_in3,
- LBR_TX_TY4: null, //partsOrder.job.lbr_tx_ty4,
- LBR_TX_IN4: null, //partsOrder.job.lbr_tx_in4,
- LBR_TX_TY5: null, //partsOrder.job.lbr_tx_ty5,
- LBR_TX_IN5: null, //partsOrder.job.lbr_tx_in5,
- },
- {
- LBR_TYPE: "LAG",
- LBR_DESC: "",
- LBR_RATE: partsOrder.job.rate_lag,
- LBR_TAX_IN: true,
- LBR_TAXP: null, // Job.bodyshop.bill_tax_rates.state_tax_rate?.Value ?? 0,
- LBR_ADJP: 0,
- LBR_TX_TY1: null, //partsOrder.job.lbr_tx_ty1,
- LBR_TX_IN1: null, //partsOrder.job.lbr_tx_in1,
- LBR_TX_TY2: null, //partsOrder.job.lbr_tx_ty2,
- LBR_TX_IN2: null, //partsOrder.job.lbr_tx_in2,
- LBR_TX_TY3: null, //partsOrder.job.lbr_tx_ty3,
- LBR_TX_IN3: null, //partsOrder.job.lbr_tx_in3,
- LBR_TX_TY4: null, //partsOrder.job.lbr_tx_ty4,
- LBR_TX_IN4: null, //partsOrder.job.lbr_tx_in4,
- LBR_TX_TY5: null, //partsOrder.job.lbr_tx_ty5,
- LBR_TX_IN5: null, //partsOrder.job.lbr_tx_in5,
- },
- {
- LBR_TYPE: "LAM",
- LBR_DESC: "",
- LBR_RATE: partsOrder.job.rate_lam,
- LBR_TAX_IN: true,
- LBR_TAXP: null, // Job.bodyshop.bill_tax_rates.state_tax_rate?.Value ?? 0,
- LBR_ADJP: 0,
- LBR_TX_TY1: null, //partsOrder.job.lbr_tx_ty1,
- LBR_TX_IN1: null, //partsOrder.job.lbr_tx_in1,
- LBR_TX_TY2: null, //partsOrder.job.lbr_tx_ty2,
- LBR_TX_IN2: null, //partsOrder.job.lbr_tx_in2,
- LBR_TX_TY3: null, //partsOrder.job.lbr_tx_ty3,
- LBR_TX_IN3: null, //partsOrder.job.lbr_tx_in3,
- LBR_TX_TY4: null, //partsOrder.job.lbr_tx_ty4,
- LBR_TX_IN4: null, //partsOrder.job.lbr_tx_in4,
- LBR_TX_TY5: null, //partsOrder.job.lbr_tx_ty5,
- LBR_TX_IN5: null, //partsOrder.job.lbr_tx_in5,
- },
- {
- LBR_TYPE: "LAR",
- LBR_DESC: "",
- LBR_RATE: partsOrder.job.rate_lar,
- LBR_TAX_IN: true,
- LBR_TAXP: null, // Job.bodyshop.bill_tax_rates.state_tax_rate?.Value ?? 0,
- LBR_ADJP: 0,
- LBR_TX_TY1: null, //partsOrder.job.lbr_tx_ty1,
- LBR_TX_IN1: null, //partsOrder.job.lbr_tx_in1,
- LBR_TX_TY2: null, //partsOrder.job.lbr_tx_ty2,
- LBR_TX_IN2: null, //partsOrder.job.lbr_tx_in2,
- LBR_TX_TY3: null, //partsOrder.job.lbr_tx_ty3,
- LBR_TX_IN3: null, //partsOrder.job.lbr_tx_in3,
- LBR_TX_TY4: null, //partsOrder.job.lbr_tx_ty4,
- LBR_TX_IN4: null, //partsOrder.job.lbr_tx_in4,
- LBR_TX_TY5: null, //partsOrder.job.lbr_tx_ty5,
- LBR_TX_IN5: null, //partsOrder.job.lbr_tx_in5,
- },
- {
- LBR_TYPE: "LAS",
- LBR_DESC: "",
- LBR_RATE: partsOrder.job.rate_las,
- LBR_TAX_IN: true,
- LBR_TAXP: null, // Job.bodyshop.bill_tax_rates.state_tax_rate?.Value ?? 0,
- LBR_ADJP: 0,
- LBR_TX_TY1: null, //partsOrder.job.lbr_tx_ty1,
- LBR_TX_IN1: null, //partsOrder.job.lbr_tx_in1,
- LBR_TX_TY2: null, //partsOrder.job.lbr_tx_ty2,
- LBR_TX_IN2: null, //partsOrder.job.lbr_tx_in2,
- LBR_TX_TY3: null, //partsOrder.job.lbr_tx_ty3,
- LBR_TX_IN3: null, //partsOrder.job.lbr_tx_in3,
- LBR_TX_TY4: null, //partsOrder.job.lbr_tx_ty4,
- LBR_TX_IN4: null, //partsOrder.job.lbr_tx_in4,
- LBR_TX_TY5: null, //partsOrder.job.lbr_tx_ty5,
- LBR_TX_IN5: null, //partsOrder.job.lbr_tx_in5,
- },
- {
- LBR_TYPE: "LAU",
- LBR_DESC: "",
- LBR_RATE: partsOrder.job.rate_lau,
- LBR_TAX_IN: true,
- LBR_TAXP: null, // Job.bodyshop.bill_tax_rates.state_tax_rate?.Value ?? 0,
- LBR_ADJP: 0,
- LBR_TX_TY1: null, //partsOrder.job.lbr_tx_ty1,
- LBR_TX_IN1: null, //partsOrder.job.lbr_tx_in1,
- LBR_TX_TY2: null, //partsOrder.job.lbr_tx_ty2,
- LBR_TX_IN2: null, //partsOrder.job.lbr_tx_in2,
- LBR_TX_TY3: null, //partsOrder.job.lbr_tx_ty3,
- LBR_TX_IN3: null, //partsOrder.job.lbr_tx_in3,
- LBR_TX_TY4: null, //partsOrder.job.lbr_tx_ty4,
- LBR_TX_IN4: null, //partsOrder.job.lbr_tx_in4,
- LBR_TX_TY5: null, //partsOrder.job.lbr_tx_ty5,
- LBR_TX_IN5: null, //partsOrder.job.lbr_tx_in5,
- },
- {
- LBR_TYPE: "LA1",
- LBR_DESC: "",
- LBR_RATE: partsOrder.job.rate_la1,
- LBR_TAX_IN: true,
- LBR_TAXP: null, // Job.bodyshop.bill_tax_rates.state_tax_rate?.Value ?? 0,
- LBR_ADJP: 0,
- LBR_TX_TY1: null, //partsOrder.job.lbr_tx_ty1,
- LBR_TX_IN1: null, //partsOrder.job.lbr_tx_in1,
- LBR_TX_TY2: null, //partsOrder.job.lbr_tx_ty2,
- LBR_TX_IN2: null, //partsOrder.job.lbr_tx_in2,
- LBR_TX_TY3: null, //partsOrder.job.lbr_tx_ty3,
- LBR_TX_IN3: null, //partsOrder.job.lbr_tx_in3,
- LBR_TX_TY4: null, //partsOrder.job.lbr_tx_ty4,
- LBR_TX_IN4: null, //partsOrder.job.lbr_tx_in4,
- LBR_TX_TY5: null, //partsOrder.job.lbr_tx_ty5,
- LBR_TX_IN5: null, //partsOrder.job.lbr_tx_in5,
- },
- {
- LBR_TYPE: "LA2",
- LBR_DESC: "",
- LBR_RATE: partsOrder.job.rate_la2,
- LBR_TAX_IN: true,
- LBR_TAXP: null, // Job.bodyshop.bill_tax_rates.state_tax_rate?.Value ?? 0,
- LBR_ADJP: 0,
- LBR_TX_TY1: null, //partsOrder.job.lbr_tx_ty1,
- LBR_TX_IN1: null, //partsOrder.job.lbr_tx_in1,
- LBR_TX_TY2: null, //partsOrder.job.lbr_tx_ty2,
- LBR_TX_IN2: null, //partsOrder.job.lbr_tx_in2,
- LBR_TX_TY3: null, //partsOrder.job.lbr_tx_ty3,
- LBR_TX_IN3: null, //partsOrder.job.lbr_tx_in3,
- LBR_TX_TY4: null, //partsOrder.job.lbr_tx_ty4,
- LBR_TX_IN4: null, //partsOrder.job.lbr_tx_in4,
- LBR_TX_TY5: null, //partsOrder.job.lbr_tx_ty5,
- LBR_TX_IN5: null, //partsOrder.job.lbr_tx_in5,
- },
- {
- LBR_TYPE: "LA3",
- LBR_DESC: "",
- LBR_RATE: partsOrder.job.rate_la3,
- LBR_TAX_IN: true,
- LBR_TAXP: null, // Job.bodyshop.bill_tax_rates.state_tax_rate?.Value ?? 0,
- LBR_ADJP: 0,
- LBR_TX_TY1: null, //partsOrder.job.lbr_tx_ty1,
- LBR_TX_IN1: null, //partsOrder.job.lbr_tx_in1,
- LBR_TX_TY2: null, //partsOrder.job.lbr_tx_ty2,
- LBR_TX_IN2: null, //partsOrder.job.lbr_tx_in2,
- LBR_TX_TY3: null, //partsOrder.job.lbr_tx_ty3,
- LBR_TX_IN3: null, //partsOrder.job.lbr_tx_in3,
- LBR_TX_TY4: null, //partsOrder.job.lbr_tx_ty4,
- LBR_TX_IN4: null, //partsOrder.job.lbr_tx_in4,
- LBR_TX_TY5: null, //partsOrder.job.lbr_tx_ty5,
- LBR_TX_IN5: null, //partsOrder.job.lbr_tx_in5,
- },
- {
- LBR_TYPE: "LA4",
- LBR_DESC: "",
- LBR_RATE: partsOrder.job.rate_la4,
- LBR_TAX_IN: true,
- LBR_TAXP: null, // Job.bodyshop.bill_tax_rates.state_tax_rate?.Value ?? 0,
- LBR_ADJP: 0,
- LBR_TX_TY1: null, //partsOrder.job.lbr_tx_ty1,
- LBR_TX_IN1: null, //partsOrder.job.lbr_tx_in1,
- LBR_TX_TY2: null, //partsOrder.job.lbr_tx_ty2,
- LBR_TX_IN2: null, //partsOrder.job.lbr_tx_in2,
- LBR_TX_TY3: null, //partsOrder.job.lbr_tx_ty3,
- LBR_TX_IN3: null, //partsOrder.job.lbr_tx_in3,
- LBR_TX_TY4: null, //partsOrder.job.lbr_tx_ty4,
- LBR_TX_IN4: null, //partsOrder.job.lbr_tx_in4,
- LBR_TX_TY5: null, //partsOrder.job.lbr_tx_ty5,
- LBR_TX_IN5: null, //partsOrder.job.lbr_tx_in5,
- },
- ];
- }
-
- await deleteEmsFileIfExists(
- generateEmsOutFilePath(`${partsOrder.job.ciecaid}.PFL`),
- );
-
- const dbf: DBFFile = await DBFFile.create(
- generateEmsOutFilePath(`${partsOrder.job.ciecaid}.PFL`),
- pflFieldLineDescriptors,
- );
-
- await dbf.appendRecords(records);
- console.log(`${records.length} PFL file records added.`);
- return true;
- } catch (error) {
- console.error("Error generating PFL file:", errorTypeCheck(error));
- return false;
- }
-};
-
-export default EmsPartsOrderGeneratePflFile;
diff --git a/src/main/ems-parts-order/ems-parts-order-generate-pfm.ts b/src/main/ems-parts-order/ems-parts-order-generate-pfm.ts
deleted file mode 100644
index 2a3a501..0000000
--- a/src/main/ems-parts-order/ems-parts-order-generate-pfm.ts
+++ /dev/null
@@ -1,105 +0,0 @@
-import { DBFFile } from "dbffile";
-import _ from "lodash";
-import errorTypeCheck from "../../util/errorTypeCheck";
-import { DecodedPfmLine } from "../decoder/decode-pfm.interface";
-import { pfmFieldLineDescriptors } from "../util/ems-interface/fielddescriptors/pfm-field-descriptors";
-import {
- deleteEmsFileIfExists,
- generateEmsOutFilePath,
-} from "../util/ems-util";
-import uppercaseObjectKeys from "../util/uppercaseObjectKeys";
-import { EmsPartsOrder } from "./ems-parts-order-interfaces";
-
-const EmsPartsOrderGeneratePfmFile = async (
- partsOrder: EmsPartsOrder,
-): Promise => {
- try {
- let records;
- if (partsOrder.job.materials && !_.isEmpty(partsOrder.job.materials)) {
- records = Object.keys(partsOrder.job.materials).map((key) => {
- const record: DecodedPfmLine = partsOrder.job.materials[key];
- return uppercaseObjectKeys(record);
- });
- } else {
- //Older records may not have materials, especially for ImEX.
- records = [
- {
- MATL_TYPE: "MAPA",
- CAL_CODE: null,
- CAL_DESC: null,
- CAL_MAXDLR: 0,
- CAL_PRIP: 0,
- CAL_SECP: 0,
- MAT_CALP: 0,
- CAL_PRETHR: 0,
- CAL_PSTTHR: 0,
- CAL_THRAMT: 0,
- CAL_LBRMIN: 0,
- CAL_LBRMAX: 0,
- CAL_LBRRTE: partsOrder.job.rate_mapa,
- CAL_OPCODE: null,
- TAX_IND: true,
- MAT_TAXP: null,
- MAT_ADJP: null,
- MAT_TX_TY1: null,
- MAT_TX_IN1: null,
- MAT_TX_TY2: null,
- MAT_TX_IN2: null,
- MAT_TX_TY3: null,
- MAT_TX_IN3: null,
- MAT_TX_TY4: null,
- MAT_TX_IN4: null,
- MAT_TX_TY5: null,
- MAT_TX_IN5: null,
- },
- {
- MATL_TYPE: "MASH",
- CAL_CODE: null,
- CAL_DESC: null,
- CAL_MAXDLR: 0,
- CAL_PRIP: 0,
- CAL_SECP: 0,
- MAT_CALP: 0,
- CAL_PRETHR: 0,
- CAL_PSTTHR: 0,
- CAL_THRAMT: 0,
- CAL_LBRMIN: 0,
- CAL_LBRMAX: 0,
- CAL_LBRRTE: partsOrder.job.rate_mash,
- CAL_OPCODE: null,
- TAX_IND: true,
- MAT_TAXP: null,
- MAT_ADJP: null,
- MAT_TX_TY1: null,
- MAT_TX_IN1: null,
- MAT_TX_TY2: null,
- MAT_TX_IN2: null,
- MAT_TX_TY3: null,
- MAT_TX_IN3: null,
- MAT_TX_TY4: null,
- MAT_TX_IN4: null,
- MAT_TX_TY5: null,
- MAT_TX_IN5: null,
- },
- ];
- }
-
- await deleteEmsFileIfExists(
- generateEmsOutFilePath(`${partsOrder.job.ciecaid}.PFM`),
- );
-
- const dbf: DBFFile = await DBFFile.create(
- generateEmsOutFilePath(`${partsOrder.job.ciecaid}.PFM`),
- pfmFieldLineDescriptors,
- );
-
- await dbf.appendRecords(records);
- console.log(`${records.length} PFM file records added.`);
- return true;
- } catch (error) {
- console.error("Error generating PFM file:", errorTypeCheck(error));
- return false;
- }
-};
-
-export default EmsPartsOrderGeneratePfmFile;
diff --git a/src/main/ems-parts-order/ems-parts-order-generate-pfo.ts b/src/main/ems-parts-order/ems-parts-order-generate-pfo.ts
deleted file mode 100644
index 2ff6d9b..0000000
--- a/src/main/ems-parts-order/ems-parts-order-generate-pfo.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import { DBFFile } from "dbffile";
-import errorTypeCheck from "../../util/errorTypeCheck";
-import { pfoFieldLineDescriptors } from "../util/ems-interface/fielddescriptors/pfo-field-descriptors";
-import {
- deleteEmsFileIfExists,
- generateEmsOutFilePath,
-} from "../util/ems-util";
-import { EmsPartsOrder } from "./ems-parts-order-interfaces";
-
-const EmsPartsOrderGeneratePfoFile = async (
- partsOrder: EmsPartsOrder,
-): Promise => {
- try {
- const records = []; //This was kept blank previously as well.
-
- await deleteEmsFileIfExists(
- generateEmsOutFilePath(`${partsOrder.job.ciecaid}.PFO`),
- );
-
- const dbf: DBFFile = await DBFFile.create(
- generateEmsOutFilePath(`${partsOrder.job.ciecaid}.PFO`),
- pfoFieldLineDescriptors,
- );
-
- await dbf.appendRecords(records);
- console.log(`${records.length} PFO file records added.`);
- return true;
- } catch (error) {
- console.error("Error generating PFO file:", errorTypeCheck(error));
- return false;
- }
-};
-
-export default EmsPartsOrderGeneratePfoFile;
diff --git a/src/main/ems-parts-order/ems-parts-order-generate-pfp.ts b/src/main/ems-parts-order/ems-parts-order-generate-pfp.ts
deleted file mode 100644
index 9e8ac97..0000000
--- a/src/main/ems-parts-order/ems-parts-order-generate-pfp.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-import { DBFFile } from "dbffile";
-import errorTypeCheck from "../../util/errorTypeCheck";
-import { DecodedPfpLine } from "../decoder/decode-pfp.interface";
-import { pfpFieldLineDescriptors } from "../util/ems-interface/fielddescriptors/pfp-field-descriptors";
-import {
- deleteEmsFileIfExists,
- generateEmsOutFilePath,
-} from "../util/ems-util";
-import uppercaseObjectKeys from "../util/uppercaseObjectKeys";
-import { EmsPartsOrder } from "./ems-parts-order-interfaces";
-
-const EmsPartsOrderGeneratePfpFile = async (
- partsOrder: EmsPartsOrder,
-): Promise => {
- try {
- const records = Object.keys(partsOrder.job.parts_tax_rates).map((key) => {
- const record: DecodedPfpLine = partsOrder.job.parts_tax_rates[key];
- return uppercaseObjectKeys(record);
- });
-
- await deleteEmsFileIfExists(
- generateEmsOutFilePath(`${partsOrder.job.ciecaid}.PFP`),
- );
-
- const dbf: DBFFile = await DBFFile.create(
- generateEmsOutFilePath(`${partsOrder.job.ciecaid}.PFP`),
- pfpFieldLineDescriptors,
- );
-
- await dbf.appendRecords(records);
- console.log(`${records.length} PFP file records added.`);
- return true;
- } catch (error) {
- console.error("Error generating PFP file:", errorTypeCheck(error));
- return false;
- }
-};
-
-export default EmsPartsOrderGeneratePfpFile;
diff --git a/src/main/ems-parts-order/ems-parts-order-generate-pft.ts b/src/main/ems-parts-order/ems-parts-order-generate-pft.ts
deleted file mode 100644
index 893ddaf..0000000
--- a/src/main/ems-parts-order/ems-parts-order-generate-pft.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import { DBFFile } from "dbffile";
-import errorTypeCheck from "../../util/errorTypeCheck";
-import { pftFieldLineDescriptors } from "../util/ems-interface/fielddescriptors/pft-field-descriptor";
-import {
- deleteEmsFileIfExists,
- generateEmsOutFilePath,
-} from "../util/ems-util";
-import { EmsPartsOrder } from "./ems-parts-order-interfaces";
-
-const EmsPartsOrderGeneratePftFile = async (
- partsOrder: EmsPartsOrder,
-): Promise => {
- try {
- const records = []; //Left blank intentionally as per previous code.
-
- await deleteEmsFileIfExists(
- generateEmsOutFilePath(`${partsOrder.job.ciecaid}.PFT`),
- );
-
- const dbf: DBFFile = await DBFFile.create(
- generateEmsOutFilePath(`${partsOrder.job.ciecaid}.PFT`),
- pftFieldLineDescriptors,
- );
-
- await dbf.appendRecords(records);
- console.log(`${records.length} PFT file records added.`);
- return true;
- } catch (error) {
- console.error("Error generating PFT file:", errorTypeCheck(error));
- return false;
- }
-};
-
-export default EmsPartsOrderGeneratePftFile;
diff --git a/src/main/ems-parts-order/ems-parts-order-generate-stl.ts b/src/main/ems-parts-order/ems-parts-order-generate-stl.ts
deleted file mode 100644
index 485c75e..0000000
--- a/src/main/ems-parts-order/ems-parts-order-generate-stl.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import { DBFFile } from "dbffile";
-import errorTypeCheck from "../../util/errorTypeCheck";
-import { DecodedStlLine } from "../decoder/decode-stl.interface";
-import { stlFieldLineDescriptors } from "../util/ems-interface/fielddescriptors/stl-field-descriptors";
-import {
- deleteEmsFileIfExists,
- generateEmsOutFilePath,
-} from "../util/ems-util";
-import uppercaseObjectKeys from "../util/uppercaseObjectKeys";
-import { EmsPartsOrder } from "./ems-parts-order-interfaces";
-
-const EmsPartsOrderGenerateStlFile = async (
- partsOrder: EmsPartsOrder,
-): Promise => {
- try {
- //TODO: Add CIECA STL to parts order.
- const records = Object.keys(partsOrder.job.cieca_stl?.data).map((key) => {
- const record: DecodedStlLine = partsOrder.job.cieca_stl.data[key];
- return uppercaseObjectKeys(record);
- });
-
- await deleteEmsFileIfExists(
- generateEmsOutFilePath(`${partsOrder.job.ciecaid}.STL`),
- );
-
- const dbf: DBFFile = await DBFFile.create(
- generateEmsOutFilePath(`${partsOrder.job.ciecaid}.STL`),
- stlFieldLineDescriptors,
- );
-
- await dbf.appendRecords(records);
- console.log(`${records.length} STL file records added.`);
- return true;
- } catch (error) {
- console.error("Error generating STL file:", errorTypeCheck(error));
- return false;
- }
-};
-
-export default EmsPartsOrderGenerateStlFile;
diff --git a/src/main/ems-parts-order/ems-parts-order-generate-ttl.ts b/src/main/ems-parts-order/ems-parts-order-generate-ttl.ts
deleted file mode 100644
index 9e56333..0000000
--- a/src/main/ems-parts-order/ems-parts-order-generate-ttl.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-import { DBFFile } from "dbffile";
-import errorTypeCheck from "../../util/errorTypeCheck";
-import { ttlFieldLineDescriptors } from "../util/ems-interface/fielddescriptors/ttl-field-descriptors";
-import {
- deleteEmsFileIfExists,
- generateEmsOutFilePath,
-} from "../util/ems-util";
-import uppercaseObjectKeys from "../util/uppercaseObjectKeys";
-import { EmsPartsOrder } from "./ems-parts-order-interfaces";
-
-const EmsPartsOrderGenerateTtlFile = async (
- partsOrder: EmsPartsOrder,
-): Promise => {
- try {
- //TODO: Add CIECA STL to parts order.
- const records = uppercaseObjectKeys(partsOrder.job.cieca_ttl?.data);
-
- await deleteEmsFileIfExists(
- generateEmsOutFilePath(`${partsOrder.job.ciecaid}.TTL`),
- );
-
- const dbf: DBFFile = await DBFFile.create(
- generateEmsOutFilePath(`${partsOrder.job.ciecaid}.TTL`),
- ttlFieldLineDescriptors,
- );
-
- await dbf.appendRecords([records]);
- console.log(`${records.length} TTL file records added.`);
- return true;
- } catch (error) {
- console.error("Error generating TTL file:", errorTypeCheck(error));
- return false;
- }
-};
-
-export default EmsPartsOrderGenerateTtlFile;
diff --git a/src/main/ems-parts-order/ems-parts-order-generate-veh.ts b/src/main/ems-parts-order/ems-parts-order-generate-veh.ts
deleted file mode 100644
index 791b365..0000000
--- a/src/main/ems-parts-order/ems-parts-order-generate-veh.ts
+++ /dev/null
@@ -1,65 +0,0 @@
-import { DBFFile } from "dbffile";
-import errorTypeCheck from "../../util/errorTypeCheck";
-import { vehFieldLineDescriptors } from "../util/ems-interface/fielddescriptors/veh-field-descriptors";
-import {
- deleteEmsFileIfExists,
- generateEmsOutFilePath,
-} from "../util/ems-util";
-import { EmsPartsOrder } from "./ems-parts-order-interfaces";
-
-const EmsPartsOrderGenerateVehFile = async (
- partsOrder: EmsPartsOrder,
-): Promise => {
- try {
- const records = [
- {
- IMPACT_1: partsOrder.job.area_of_damage?.impact1 || null,
- IMPACT_2: partsOrder.job.area_of_damage?.impact2 || null,
- DMG_MEMO: null,
- DB_V_CODE: "",
- PLATE_NO: partsOrder.job.plate_no || null,
- PLATE_ST: partsOrder.job.plate_st || null,
- V_VIN: partsOrder.job.v_vin || null,
- V_COND: "",
- V_PROD_DT: "",
- V_MODEL_YR: partsOrder.job.v_model_yr || null,
- V_MAKECODE: "",
- V_MAKEDESC: partsOrder.job.v_make_desc || null,
- V_MODEL: partsOrder.job.v_model_desc || null,
- V_TYPE: partsOrder.job.vehicle?.v_type || null,
- V_BSTYLE: partsOrder.job.vehicle?.v_bstyle || null,
- V_TRIMCODE: partsOrder.job.vehicle?.v_trimcode || null,
- TRIM_COLOR: partsOrder.job.vehicle?.trim_color || null,
- V_MLDGCODE: partsOrder.job.vehicle?.v_mldgcode || null,
- V_ENGINE: partsOrder.job.vehicle?.v_engine || null,
- V_MILEAGE: partsOrder.job.vehicle?.v_mileage || null,
- V_OPTIONS: null,
- V_COLOR: partsOrder.job.vehicle?.v_color || null,
- V_TONE: Number(partsOrder.job.vehicle?.v_tone) || null,
- V_STAGE: null,
- PAINT_CD1: partsOrder.job.vehicle?.v_paint_codes?.paint_cd1 || "",
- PAINT_CD2: partsOrder.job.vehicle?.v_paint_codes?.paint_cd2 || "",
- PAINT_CD3: partsOrder.job.vehicle?.v_paint_codes?.paint_cd3 || "",
- V_MEMO: null,
- },
- ];
-
- await deleteEmsFileIfExists(
- generateEmsOutFilePath(`${partsOrder.job.ciecaid}.VEH`),
- );
-
- const dbf: DBFFile = await DBFFile.create(
- generateEmsOutFilePath(`${partsOrder.job.ciecaid}.VEH`),
- vehFieldLineDescriptors,
- );
-
- await dbf.appendRecords(records);
- console.log(`${records.length} VEH file records added.`);
- return true;
- } catch (error) {
- console.error("Error generating VEH file:", errorTypeCheck(error));
- return false;
- }
-};
-
-export default EmsPartsOrderGenerateVehFile;
diff --git a/src/main/ems-parts-order/ems-parts-order-handler.ts b/src/main/ems-parts-order/ems-parts-order-handler.ts
deleted file mode 100644
index 4471f2b..0000000
--- a/src/main/ems-parts-order/ems-parts-order-handler.ts
+++ /dev/null
@@ -1,83 +0,0 @@
-import log from "electron-log/main";
-import express from "express";
-import _ from "lodash";
-import errorTypeCheck from "../../util/errorTypeCheck";
-import store from "../store/store";
-import createdDirectoryIfNotExist from "../util/createDirectoryIfNotExist";
-import EmsPartsOrderGenerateAd1File from "./ems-parts-order-generate-ad1";
-import EmsPartsOrderGenerateAd2File from "./ems-parts-order-generate-ad2";
-import EmsPartsOrderGenerateEnvFile from "./ems-parts-order-generate-env";
-import EmsPartsOrderGenerateLinFile from "./ems-parts-order-generate-lin";
-import EmsPartsOrderGeneratePfhFile from "./ems-parts-order-generate-pfh";
-import EmsPartsOrderGeneratePflFile from "./ems-parts-order-generate-pfl";
-import EmsPartsOrderGeneratePfmFile from "./ems-parts-order-generate-pfm";
-import EmsPartsOrderGeneratePfoFile from "./ems-parts-order-generate-pfo";
-import EmsPartsOrderGeneratePfpFile from "./ems-parts-order-generate-pfp";
-import EmsPartsOrderGeneratePftFile from "./ems-parts-order-generate-pft";
-import EmsPartsOrderGenerateStlFile from "./ems-parts-order-generate-stl";
-import EmsPartsOrderGenerateTtlFile from "./ems-parts-order-generate-ttl";
-import EmsPartsOrderGenerateVehFile from "./ems-parts-order-generate-veh";
-import { EmsPartsOrder } from "./ems-parts-order-interfaces";
-
-const handleEMSPartsOrder = async (
- req: express.Request,
- res: express.Response,
-): Promise => {
- //Route handler here only.
-
- const partsOrderBody = req.body as EmsPartsOrder;
- try {
- await generateEMSPartsOrder(partsOrderBody);
- res.status(200).json({ success: true });
- } catch (error) {
- log.error("Error generating parts price change", errorTypeCheck(error));
- res.status(500).json({
- success: false,
- error: "Error generating parts price change.",
- ...errorTypeCheck(error),
- });
- }
- return;
-};
-
-const generateEMSPartsOrder = async (
- partsOrder: EmsPartsOrder,
-): Promise => {
- log.debug(" Generating parts price change");
- //Check to make sure that the EMS Output file path exists. If it doesn't, create it. If it's not set, abandon ship.
-
- const emsOutFilePath: string | null = store.get("settings.emsOutFilePath");
- if (_.isEmpty(emsOutFilePath) || emsOutFilePath === null) {
- log.error("EMS Out file path is not set");
- throw new Error("EMS Out file path is not set");
- }
- try {
- createdDirectoryIfNotExist(emsOutFilePath);
-
- //Generate all required files: ad1, ad2, veh, lin, pfh, pfl, pfm,pfo, pfp, pft, stl, ttl
- await EmsPartsOrderGenerateAd1File(partsOrder);
- await EmsPartsOrderGenerateAd2File(partsOrder);
- await EmsPartsOrderGenerateVehFile(partsOrder);
- await EmsPartsOrderGenerateLinFile(partsOrder);
- await EmsPartsOrderGeneratePfhFile(partsOrder);
- await EmsPartsOrderGeneratePflFile(partsOrder);
- await EmsPartsOrderGeneratePfmFile(partsOrder);
- await EmsPartsOrderGeneratePfoFile(partsOrder);
- await EmsPartsOrderGeneratePfpFile(partsOrder);
- await EmsPartsOrderGeneratePftFile(partsOrder);
- await EmsPartsOrderGenerateStlFile(partsOrder);
- await EmsPartsOrderGenerateTtlFile(partsOrder);
-
- await EmsPartsOrderGenerateEnvFile(partsOrder);
-
- log.info(
- "EMS Parts Order files generated successfully for " +
- partsOrder.job.ciecaid,
- );
- } catch (error) {
- log.error("Error generating parts price change", errorTypeCheck(error));
- throw error;
- }
-};
-
-export { handleEMSPartsOrder };
diff --git a/src/main/ems-parts-order/ems-parts-order-interfaces.ts b/src/main/ems-parts-order/ems-parts-order-interfaces.ts
deleted file mode 100644
index 264032e..0000000
--- a/src/main/ems-parts-order/ems-parts-order-interfaces.ts
+++ /dev/null
@@ -1,322 +0,0 @@
-import { CiecaPfl } from "../decoder/decode-pfl.interface";
-import { DecodedPfmLine } from "../decoder/decode-pfm.interface";
-import { DecodedPfpLine } from "../decoder/decode-pfp.interface";
-import { DecodedStlLine } from "../decoder/decode-stl.interface";
-import { DecodedTtlLine } from "../decoder/decode-ttl.interface";
-
-export interface TaxRate {
- prt_type: string;
- prt_discp: number;
- prt_mktyp: boolean;
- prt_mkupp: number;
- prt_tax_in: boolean;
- prt_tax_rt: number;
-}
-
-export interface BillTaxRates {
- local_tax_rate: number;
- state_tax_rate: number;
- federal_tax_rate: number;
-}
-
-export interface PaintCodes {
- paint_cd1: string | null;
- paint_cd2: string | null;
- paint_cd3: string | null;
-}
-
-export interface AreaOfDamage {
- impact1: string;
- impact2: string | null;
-}
-
-// Jobline export interface
-export interface Jobline {
- tran_code: string;
- act_price: number;
- db_ref: string;
- db_price: number;
- db_hrs: number;
- glass_flag: boolean;
- id: string;
- lbr_amt: number;
- lbr_hrs_j: boolean;
- lbr_inc: boolean;
- lbr_op: string;
- lbr_op_j: boolean;
- lbr_tax: boolean;
- lbr_typ_j: boolean;
- line_desc: string;
- line_ind: string;
- line_no: number;
- line_ref: number;
- location: string | null;
- misc_amt: number;
- misc_sublt: boolean;
- misc_tax: boolean;
- mod_lb_hrs: number;
- mod_lbr_ty: string;
- oem_partno: string;
- op_code_desc: string;
- paint_stg: number;
- paint_tone: number;
- part_qty: number;
- part_type: string;
- price_inc: boolean;
- price_j: boolean;
- prt_dsmk_m: number;
- prt_dsmk_p: number;
- tax_part: boolean;
- unq_seq: number;
- alt_co_id: string | null;
- alt_overrd: boolean;
- alt_part_i: boolean;
- alt_partm: string | null;
- alt_partno: string | null;
- bett_amt: number;
- bett_pctg: number;
- bett_tax: boolean;
- bett_type: string | null;
- cert_part: boolean;
- est_seq: string | null;
- part_descj: boolean;
-}
-
-// Parts Order Line export interface
-export interface PartsOrderLine {
- jobline: Jobline;
- act_price: number;
- id: string;
- db_price: number;
- line_desc: string;
- quantity: number;
- part_type: string;
- priceChange: boolean;
-}
-
-// Vehicle export interface
-export interface Vehicle {
- v_bstyle: string;
- v_type: string;
- v_trimcode: string | null;
- v_tone: string;
- v_stage: string;
- v_prod_dt: string | null;
- v_options: string | null;
- v_paint_codes: PaintCodes;
- v_model_yr: string;
- v_model_desc: string;
- v_mldgcode: string | null;
- v_makecode: string;
- v_make_desc: string;
- v_engine: string;
- v_cond: string;
- v_color: string | null;
- trim_color: string | null;
- shopid: string;
- plate_no: string;
- plate_st: string;
- db_v_code: string;
- v_vin: string;
-}
-
-// Bodyshop export interface
-export interface Bodyshop {
- shopname: string;
- bill_tax_rates: BillTaxRates;
-}
-
-// Job export interface
-export interface Job {
- bodyshop: Bodyshop;
- ro_number: string;
- clm_no: string;
- asgn_no: string;
- asgn_date: string;
- state_tax_rate: number | null;
- area_of_damage: AreaOfDamage;
- asgn_type: string | null;
- ciecaid: string;
- cieca_pfl: CiecaPfl;
- clm_addr1: string | null;
- clm_city: string | null;
- clm_addr2: string | null;
- clm_ct_fn: string | null;
- clm_ct_ln: string | null;
- clm_ct_ph: string | null;
- clm_ct_phx: string | null;
- clm_ctry: string | null;
- clm_ea: string | null;
- clm_fax: string | null;
- clm_faxx: string | null;
- clm_ofc_id: string | null;
- clm_ofc_nm: string | null;
- clm_ph1: string | null;
- clm_ph1x: string | null;
- clm_ph2: string | null;
- clm_ph2x: string | null;
- clm_st: string | null;
- clm_title: string | null;
- clm_total: number;
- clm_zip: string | null;
- ded_amt: number;
- est_addr1: string | null;
- est_addr2: string | null;
- est_city: string | null;
- est_co_nm: string | null;
- est_ct_fn: string;
- est_ctry: string | null;
- est_ct_ln: string;
- est_ea: string;
- est_ph1: string | null;
- est_st: string | null;
- est_zip: string | null;
- g_bett_amt: number;
- id: string;
- ins_addr1: string | null;
- ins_city: string | null;
- ins_addr2: string | null;
- ins_co_id: string | null;
- ins_co_nm: string;
- ins_ct_fn: string | null;
- ins_ct_ln: string | null;
- ins_ct_ph: string | null;
- ins_ct_phx: string | null;
- ins_ctry: string | null;
- ins_ea: string | null;
- ins_fax: string | null;
- ins_faxx: string | null;
- ins_memo: string | null;
- ins_ph1: string | null;
- ins_ph1x: string | null;
- ins_ph2: string | null;
- ins_ph2x: string | null;
- ins_st: string | null;
- ins_title: string | null;
- ins_zip: string | null;
- insd_addr1: string;
- insd_addr2: string | null;
- insd_city: string;
- insd_co_nm: string | null;
- insd_ctry: string | null;
- insd_ea: string | null;
- insd_fax: string | null;
- insd_faxx: string | null;
- insd_fn: string;
- insd_ln: string;
- insd_ph1: string;
- insd_ph1x: string | null;
- insd_ph2: string;
- insd_ph2x: string | null;
- insd_st: string;
- insd_title: string | null;
- insd_zip: string;
- loss_cat: string;
- loss_date: string;
- loss_desc: string;
- loss_of_use: string | null;
- loss_type: string;
- ownr_addr1: string;
- ownr_addr2: string | null;
- ownr_city: string;
- ownr_co_nm: string | null;
- ownr_ctry: string | null;
- ownr_ea: string | null;
- ownr_fax: string | null;
- ownr_faxx: string | null;
- ownr_ph1: string;
- ownr_fn: string;
- ownr_ln: string;
- ownr_ph1x: string | null;
- ownr_ph2: string;
- ownr_ph2x: string | null;
- ownr_st: string;
- ownr_title: string | null;
- ownr_zip: string;
- parts_tax_rates: Record;
- pay_amt: number;
- pay_date: string | null;
- pay_type: string | null;
- pay_chknm: string;
- payee_nms: string | null;
- plate_no: string;
- plate_st: string;
- po_number: string | null;
- policy_no: string;
- tax_lbr_rt: number;
- tax_levies_rt: number;
- tax_paint_mat_rt: number;
- tax_predis: number;
- tax_prethr: number;
- tax_pstthr: number;
- tax_registration_number: string | null;
- tax_str_rt: number;
- tax_shop_mat_rt: number;
- tax_sub_rt: number;
- tax_thramt: number;
- tax_tow_rt: number;
- theft_ind: boolean;
- tlos_ind: boolean;
- towin: boolean;
- v_color: string | null;
- v_make_desc: string;
- v_model_desc: string;
- v_model_yr: string;
- v_vin: string;
- vehicle: Vehicle;
- agt_zip: string | null;
- agt_st: string | null;
- agt_ph2x: string | null;
- agt_ph2: string | null;
- agt_ph1x: string | null;
- agt_ph1: string | null;
- agt_lic_no: string | null;
- agt_faxx: string | null;
- agt_fax: string | null;
- agt_ea: string | null;
- agt_ctry: string | null;
- agt_ct_phx: string | null;
- agt_ct_ph: string | null;
- agt_ct_ln: string | null;
- agt_ct_fn: string | null;
- agt_co_nm: string | null;
- agt_co_id: string | null;
- agt_city: string | null;
- agt_addr1: string | null;
- agt_addr2: string | null;
- adj_g_disc: number;
- rate_matd: number | null;
- rate_mash: number;
- rate_mapa: number;
- rate_mahw: number;
- rate_macs: number;
- rate_mabl: number | null;
- rate_ma3s: number;
- rate_ma2t: number;
- rate_ma2s: number;
- rate_lau: number;
- rate_las: number;
- rate_lar: number;
- rate_lam: number;
- rate_lag: number;
- rate_laf: number;
- rate_lae: number | null;
- rate_lad: number | null;
- rate_lab: number;
- rate_laa: number;
- rate_la4: number;
- rate_la3: number;
- rate_la2: number;
- rate_la1: number;
- materials: Record;
- cieca_stl: {
- data: Array;
- };
- cieca_ttl: { data: DecodedTtlLine };
-}
-
-// Main Parts Order export interface
-export interface EmsPartsOrder {
- parts_order_lines: PartsOrderLine[];
- job: Job;
-}
diff --git a/src/main/http-server/http-server.ts b/src/main/http-server/http-server.ts
deleted file mode 100644
index ef407ea..0000000
--- a/src/main/http-server/http-server.ts
+++ /dev/null
@@ -1,210 +0,0 @@
-import cors from "cors";
-import { app } from "electron";
-import log from "electron-log/main";
-import express from "express";
-import http from "http";
-import errorTypeCheck from "../../util/errorTypeCheck";
-import ImportJob from "../decoder/decoder";
-import folderScan from "../decoder/folder-scan";
-import { handleEMSPartsOrder } from "../ems-parts-order/ems-parts-order-handler";
-import { handleShopMetaDataFetch } from "../ipc/ipcMainHandler.user";
-import { handlePartsPriceChangeRequest } from "../ppc/ppc-handler";
-import { handleQuickBookRequest } from "../quickbooks-desktop/quickbooks-desktop";
-
-export default class LocalServer {
- private readonly app: express.Application;
- private server: http.Server | null;
- private PORT = 1337;
-
- constructor() {
- this.server = null;
- this.app = express();
- this.configureMiddleware();
- this.configureRoutes();
- }
-
- private configureMiddleware(): void {
- const allowedOrigins = [
- "http://localhost",
- "https://localhost",
- "http://localhost:3000",
- "https://localhost:3000",
- "https://test.imex.online",
- "https://imex.online",
- "https://test.romeonline.io",
- "https://romeonline.io",
- "https://www.test.imex.online",
- "https://www.imex.online",
- "https://www.test.romeonline.io",
- "https://www.romeonline.io",
- ];
-
- this.app.use(
- cors({
- origin: (origin, callback) => {
- // Allow requests with no origin (like mobile apps, curl requests)
- if (!origin) return callback(null, true);
-
- if (allowedOrigins.indexOf(origin) !== -1) {
- return callback(null, true);
- } else {
- return callback(null, false);
- }
- },
- credentials: true,
- }),
- );
-
- // Parse JSON bodies
- this.app.use(express.json());
- this.app.use(express.urlencoded());
-
- //Add logger Middleware
- this.app.use((req, res, next) => {
- const startTime = Date.now();
- const requestId = Math.random().toString(36).substring(2, 15);
-
- // Log request details
- log.info(
- `[HTTP Server] [${requestId}] Request: ${req.method} ${req.url}`,
- );
- log.info(
- `[HTTP Server] [${requestId}] Headers: ${JSON.stringify(req.headers)}`,
- );
-
- // Log request body if it exists
- if (req.body && Object.keys(req.body).length > 0) {
- log.info(
- `[HTTP Server] [${requestId}] Body: ${JSON.stringify(req.body)}`,
- );
- }
-
- // Capture the original methods
- const originalSend = res.send;
- const originalJson = res.json;
-
- // Override send method to log response
- res.send = function (body): express.Response {
- log.info(`[HTTP Server] [${requestId}] Response body: ${body}`);
- log.info(
- `[HTTP Server] [${requestId}] Response time: ${Date.now() - startTime}ms`,
- );
- return originalSend.call(this, body);
- };
-
- // Override json method to log response
- res.json = function (body): express.Response {
- log.info(
- `[HTTP Server] [${requestId}] Response body: ${JSON.stringify(body)}`,
- );
- log.info(
- `[HTTP Server] [${requestId}] Response time: ${Date.now() - startTime}ms`,
- );
- return originalJson.call(this, body);
- };
-
- next();
- });
- }
-
- private configureRoutes(): void {
- // Basic health check endpoint
- this.app.get("/health", (_req: express.Request, res: express.Response) => {
- res.status(200).json({ status: "ok" });
- });
- this.app.post("/ping", (_req, res) => {
- res.status(200).json({
- appVer: app.getVersion(),
- qbPath: app.getPath("userData"), //TODO: Resolve to actual QB file path.
- });
- });
-
- this.app.post("/qb", handleQuickBookRequest);
- this.app.post("/scan", async (_req, res): Promise => {
- log.debug("[HTTP Server] Scan request received");
- const files = await folderScan();
- res.status(200).json(files);
- return;
- });
- this.app.post("/ppc", handlePartsPriceChangeRequest);
- this.app.post("/oec", handleEMSPartsOrder);
- this.app.post(
- "/import",
- async (req: express.Request, res: express.Response) => {
- log.debug("[HTTP Server] Import request received");
- const { filepath } = req.body;
- if (!filepath) {
- res.status(400).json({ error: "filepath is required" });
- return;
- }
- try {
- await ImportJob(filepath);
- res.status(200).json({ success: true });
- } catch (error) {
- log.error(
- "[HTTP Server] Error importing file",
- errorTypeCheck(error),
- );
- res.status(500).json({
- success: false,
- error: "Error importing file",
- ...errorTypeCheck(error),
- });
- }
- },
- );
- this.app.post(
- "/refresh",
- async (_req: express.Request, res: express.Response) => {
- log.debug("[HTTP Server] Refresh request received");
- try {
- await handleShopMetaDataFetch(true);
- res.status(200).json({ success: true });
- } catch (error) {
- log.error(
- "[HTTP Server] Error refreshing shop metadata",
- errorTypeCheck(error),
- );
- res.status(500).json({
- success: false,
- error: "Error importing file",
- ...errorTypeCheck(error),
- });
- }
- },
- );
-
- // Add more routes as needed
- }
-
- public start(): void {
- try {
- this.server = http.createServer(this.app);
-
- this.server.on("error", (error: NodeJS.ErrnoException) => {
- if (error.code === "EADDRINUSE") {
- log.error(
- `[HTTP Server] Port ${this.PORT} is already in use. Please use a different port.`,
- );
- } else {
- log.error(`[HTTP Server] Server error: ${error.message}`);
- }
- });
-
- this.server.listen(this.PORT, () => {
- log.info(
- `[HTTP Server] Local HTTP server running on port ${this.PORT}`,
- );
- });
- } catch (error: unknown) {
- log.error("[HTTP Server] Error starting server", errorTypeCheck(error));
- }
- }
-
- public stop(): void {
- if (this.server) {
- this.server.close();
- log.info("[HTTP Server] Local HTTP server stopped");
- }
- }
-}
diff --git a/src/main/index.ts b/src/main/index.ts
index 32be798..da1d177 100644
--- a/src/main/index.ts
+++ b/src/main/index.ts
@@ -14,7 +14,6 @@ import log from "electron-log/main";
import { autoUpdater } from "electron-updater";
import path, { join } from "path";
import imexAppIcon from "../../resources/icon.png?asset";
-import romeAppIcon from "../../resources/ro-icon.png?asset";
import {
default as ErrorTypeCheck,
@@ -22,11 +21,8 @@ import {
} from "../util/errorTypeCheck";
import ipcTypes from "../util/ipcTypes.json";
import ImportJob from "./decoder/decoder";
-import LocalServer from "./http-server/http-server";
-import store from "./store/store";
-import { checkForAppUpdates } from "./util/checkForAppUpdates";
-import { getMainWindow } from "./util/toRenderer";
-import { GetAllEnvFiles } from "./watcher/watcher";
+
+import { dumpMemoryStatsToFile } from "../util/memUsage";
import {
isKeepAliveAgentInstalled,
setupKeepAliveAgent,
@@ -35,11 +31,13 @@ import {
isKeepAliveTaskInstalled,
setupKeepAliveTask,
} from "./setup-keep-alive-task";
+import store from "./store/store";
+import { checkForAppUpdates } from "./util/checkForAppUpdates";
import ensureWindowOnScreen from "./util/ensureWindowOnScreen";
-import ongoingMemoryDump, { dumpMemoryStatsToFile } from "../util/memUsage";
+import { getMainWindow } from "./util/toRenderer";
+import { GetAllEnvFiles } from "./watcher/watcher";
-const appIconToUse =
- import.meta.env.VITE_COMPANY === "IMEX" ? imexAppIcon : romeAppIcon;
+const appIconToUse = imexAppIcon;
Sentry.init({
dsn: "https://ba41d22656999a8c1fd63bcb7df98650@o492140.ingest.us.sentry.io/4509074139447296",
@@ -54,11 +52,10 @@ log.transports.console.format =
"[{y}-{m}-{d} {h}:{i}:{s}.{ms}] [{level}] [PID:{processId}] {text}";
log.transports.file.maxSize = 50 * 1024 * 1024; // 50 MB
const isMac: boolean = process.platform === "darwin";
-const protocol: string = "imexmedia";
+const protocol: string = "esdp";
let isAppQuitting = false; //Needed on Mac as an override to allow us to fully quit the app.
let isKeepAliveLaunch = false; // Track if launched via keep-alive
// Initialize the server
-const localServer = new LocalServer();
const gotTheLock = app.requestSingleInstanceLock();
if (!gotTheLock) {
@@ -95,7 +92,7 @@ function createWindow(): void {
icon: appIconToUse,
}
: {}),
- title: "Shop Partner",
+ title: "EMS Uploader",
webPreferences: {
preload: join(__dirname, "../preload/index.js"),
sandbox: false,
@@ -425,13 +422,6 @@ function createWindow(): void {
if (!isKeepAliveLaunch) {
mainWindow.show(); // Show only if not a keep-alive launch
}
- //Start the HTTP server.
- // Start the local HTTP server
- try {
- localServer.start();
- } catch (error) {
- log.error("Failed to start HTTP server:", errorTypeCheck(error));
- }
});
mainWindow.on("close", (event: Electron.Event) => {
@@ -476,7 +466,7 @@ app.whenReady().then(async () => {
log.debug("App is ready, initializing shortcuts and protocol handlers.");
if (platform.isWindows) {
- app.setAppUserModelId("Shop Partner");
+ app.setAppUserModelId("esdp");
}
app.on("browser-window-created", (_, window) => {
@@ -508,17 +498,8 @@ app.whenReady().then(async () => {
//Dynamically load ipcMain handlers once ready.
try {
- const { initializeCronTasks } = await import("./ipc/ipcMainConfig");
+ await import("./ipc/ipcMainConfig");
log.debug("Successfully loaded ipcMainConfig");
-
- try {
- await initializeCronTasks();
- log.info("Cron tasks initialized successfully");
- } catch (error) {
- log.warn("Non-fatal: Failed to initialize cron tasks", {
- ...ErrorTypeCheck(error),
- });
- }
} catch (error) {
log.error("Fatal: Failed to load ipcMainConfig", {
...ErrorTypeCheck(error),
@@ -599,7 +580,6 @@ app.whenReady().then(async () => {
//The update itself will run when the bodyshop record is queried to know what release channel to use.
openMainWindow();
- ongoingMemoryDump();
app.on("activate", function () {
openMainWindow();
@@ -661,7 +641,6 @@ ipcMain.on(ipcTypes.toMain.updates.apply, () => {
});
function preQuitMethods(): void {
- localServer.stop();
const currentSetting = store.get("app.openOnStartup") as boolean;
if (!import.meta.env.DEV) {
app.setLoginItemSettings({
diff --git a/src/main/ipc/ipcMainConfig.ts b/src/main/ipc/ipcMainConfig.ts
index fba4f99..4a8e298 100644
--- a/src/main/ipc/ipcMainConfig.ts
+++ b/src/main/ipc/ipcMainConfig.ts
@@ -27,27 +27,6 @@ import {
ipcMainHandleAuthStateChanged,
ipMainHandleResetPassword,
} from "./ipcMainHandler.user";
-import cron from "node-cron";
-import { PaintScaleConfig, PaintScaleType } from "../../util/types/paintScale";
-import { ppgInputHandler, ppgOutputHandler } from "./paintScaleHandlers/PPG";
-
-const initializeCronTasks = async () => {
- try {
- // Fetch input and output configurations
- const inputConfigs = await SettingsPaintScaleInputConfigsGet();
- const outputConfigs = await SettingsPaintScaleOutputConfigsGet();
-
- // Start input cron tasks
- await handlePaintScaleInputCron(inputConfigs);
- log.info("Initialized input cron tasks on app startup");
-
- // Start output cron tasks
- await handlePaintScaleOutputCron(outputConfigs);
- log.info("Initialized output cron tasks on app startup");
- } catch (error) {
- log.error("Error initializing cron tasks on app startup:", error);
- }
-};
// Log all IPC messages and their payloads
const logIpcMessages = (): void => {
@@ -71,75 +50,6 @@ const logIpcMessages = (): void => {
});
};
-// Input handler map
-const inputTypeHandlers: Partial<
- Record Promise>
-> = {
- [PaintScaleType.PPG]: ppgInputHandler,
- // Add other input type handlers as needed
-};
-
-// Output handler map
-const outputTypeHandlers: Partial<
- Record Promise>
-> = {
- [PaintScaleType.PPG]: ppgOutputHandler,
- // Add other output type handlers as needed
-};
-
-// Default handler for unsupported types
-const defaultHandler = async (config: PaintScaleConfig) => {
- log.debug(
- `No handler defined for type ${config.type} in config ${config.id}`,
- );
-};
-
-// Input cron job management
-let inputCronTasks: { [id: string]: cron.ScheduledTask } = {};
-
-const handlePaintScaleInputCron = async (configs: PaintScaleConfig[]) => {
- Object.values(inputCronTasks).forEach((task) => task.stop());
- inputCronTasks = {};
-
- const validConfigs = configs.filter(
- (config) => config.path && config.path.trim() !== "",
- );
-
- validConfigs.forEach((config) => {
- const cronExpression = `*/${config.pollingInterval} * * * *`;
- inputCronTasks[config.id] = cron.schedule(cronExpression, async () => {
- const handler = inputTypeHandlers[config.type] || defaultHandler;
- await handler(config);
- });
- log.info(
- `Started input cron task for config ${config.id} (type: ${config.type}) with interval ${config.pollingInterval}m`,
- );
- });
-};
-
-// Output cron job management
-let outputCronTasks: { [id: string]: cron.ScheduledTask } = {};
-
-const handlePaintScaleOutputCron = async (configs: PaintScaleConfig[]) => {
- Object.values(outputCronTasks).forEach((task) => task.stop());
- outputCronTasks = {};
-
- const validConfigs = configs.filter(
- (config) => config.path && config.path.trim() !== "",
- );
-
- validConfigs.forEach((config) => {
- const cronExpression = `*/${config.pollingInterval} * * * *`;
- outputCronTasks[config.id] = cron.schedule(cronExpression, async () => {
- const handler = outputTypeHandlers[config.type] || defaultHandler;
- await handler(config);
- });
- log.info(
- `Started output cron task for config ${config.id} (type: ${config.type}) with interval ${config.pollingInterval}m`,
- );
- });
-};
-
// Existing IPC handlers...
ipcMain.on(ipcTypes.toMain.test, () =>
@@ -230,25 +140,6 @@ ipcMain.handle(
SettingsPaintScaleOutputPathSet,
);
-// IPC handlers for updating paint scale cron
-ipcMain.on(
- ipcTypes.toMain.settings.paintScale.updateInputCron,
- (_event, configs: PaintScaleConfig[]) => {
- handlePaintScaleInputCron(configs).catch((error) => {
- log.error(`Error handling paint scale input cron for configs: ${error}`);
- });
- },
-);
-
-ipcMain.on(
- ipcTypes.toMain.settings.paintScale.updateOutputCron,
- (_event, configs: PaintScaleConfig[]) => {
- handlePaintScaleOutputCron(configs).catch((error) => {
- log.error(`Error handling paint scale output cron for configs: ${error}`);
- });
- },
-);
-
ipcMain.handle(ipcTypes.toMain.user.getActiveShop, () => {
return store.get("app.bodyshop.shopname");
});
@@ -273,6 +164,4 @@ ipcMain.on(ipcTypes.toMain.updates.download, () => {
});
});
-export { initializeCronTasks };
-
logIpcMessages();
diff --git a/src/main/ppc/ppc-generate-env.ts b/src/main/ppc/ppc-generate-env.ts
deleted file mode 100644
index 94f8c7a..0000000
--- a/src/main/ppc/ppc-generate-env.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import { DBFFile } from "dbffile";
-import { envFieldLineDescriptors } from "../util/ems-interface/fielddescriptors/env-field-descriptor";
-import { deleteEmsFileIfExists, generatePpcFilePath } from "../util/ems-util";
-import { PpcJob } from "./ppc-handler";
-
-const GenerateEnvFile = async (job: PpcJob): Promise => {
- const records = [
- {
- EST_SYSTEM: "C",
- RO_ID: job.ro_number,
- ESTFILE_ID: job.ciecaid,
- STATUS: false,
- INCL_ADMIN: true,
- INCL_VEH: true,
- INCL_EST: true,
- INCL_PROFL: true,
- INCL_TOTAL: true,
- INCL_VENDR: false,
- },
- ];
-
- await deleteEmsFileIfExists(generatePpcFilePath(`${job.ciecaid}.ENV`));
-
- const dbf = await DBFFile.create(
- generatePpcFilePath(`${job.ciecaid}.ENV`),
- envFieldLineDescriptors,
- );
-
- await dbf.appendRecords(records);
- console.log(`${records.length} LIN file records added.`);
- return true;
-};
-
-export default GenerateEnvFile;
diff --git a/src/main/ppc/ppc-generate-lin.ts b/src/main/ppc/ppc-generate-lin.ts
deleted file mode 100644
index 98c10f1..0000000
--- a/src/main/ppc/ppc-generate-lin.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import { DBFFile } from "dbffile";
-import { linFieldDescriptors } from "../util/ems-interface/fielddescriptors/lin-field-descriptor";
-import { deleteEmsFileIfExists, generatePpcFilePath } from "../util/ems-util";
-import { PpcJob } from "./ppc-handler";
-import errorTypeCheck from "../../util/errorTypeCheck";
-
-const GenerateLinFile = async (job: PpcJob): Promise => {
- try {
- const records = job.joblines.map((line) => {
- return {
- //TODO: There are missing types here. May require server side updates, but we are missing things like LINE_NO, LINE_IND, etc.
- TRAN_CODE: "2",
- UNQ_SEQ: line.unq_seq,
- ACT_PRICE: line.act_price,
- };
- });
-
- await deleteEmsFileIfExists(generatePpcFilePath(`${job.ciecaid}.LIN`));
-
- const dbf = await DBFFile.create(
- generatePpcFilePath(`${job.ciecaid}.LIN`),
- linFieldDescriptors,
- );
-
- await dbf.appendRecords(records);
- console.log(`${records.length} LIN file records added.`);
- return true;
- } catch (error) {
- console.error("Error generating PPC LIN file", errorTypeCheck(error));
- throw error;
- }
-};
-
-export default GenerateLinFile;
diff --git a/src/main/ppc/ppc-handler.ts b/src/main/ppc/ppc-handler.ts
deleted file mode 100644
index 78d8f9d..0000000
--- a/src/main/ppc/ppc-handler.ts
+++ /dev/null
@@ -1,67 +0,0 @@
-import { UUID } from "crypto";
-import log from "electron-log/main";
-import express from "express";
-import _ from "lodash";
-import errorTypeCheck from "../../util/errorTypeCheck";
-import store from "../store/store";
-import createdDirectoryIfNotExist from "../util/createDirectoryIfNotExist";
-import GenerateEnvFile from "./ppc-generate-env";
-import GenerateLinFile from "./ppc-generate-lin";
-
-const handlePartsPriceChangeRequest = async (
- req: express.Request,
- res: express.Response,
-): Promise => {
- //Route handler here only.
-
- const job = req.body as PpcJob;
- try {
- await generatePartsPriceChange(job);
- res.status(200).json({ success: true });
- } catch (error) {
- log.error("Error generating parts price change", errorTypeCheck(error));
- res.status(500).json({
- success: false,
- error: "Error generating parts price change.",
- ...errorTypeCheck(error),
- });
- }
- return;
-};
-
-const generatePartsPriceChange = async (job: PpcJob): Promise => {
- log.debug(" Generating parts price change");
- //Check to make sure that the PPC Output file path exists. If it doesn't, create it. If it's not set, abandon ship.
-
- const ppcOutFilePath: string | null = store.get("settings.ppcFilePath");
- if (_.isEmpty(ppcOutFilePath) || ppcOutFilePath === null) {
- log.error("PPC file path is not set");
- throw new Error("PPC file path is not set");
- }
- try {
- createdDirectoryIfNotExist(ppcOutFilePath);
-
- await GenerateLinFile(job);
- await GenerateEnvFile(job);
- } catch (error) {
- log.error("Error generating parts price change", errorTypeCheck(error));
- throw error;
- }
-};
-export interface PpcJob {
- id: UUID;
- ciecaid: string;
- ro_number: string;
- joblines: {
- removed: boolean;
- act_price_before_ppc: number | null;
- id: string;
- act_price: number;
- unq_seq: string; //TODO: Might be a number.
- }[];
- bodyshop: {
- timezone: string;
- };
-}
-
-export { handlePartsPriceChangeRequest };
diff --git a/src/main/quickbooks-desktop/QuickbooksConnector.cs b/src/main/quickbooks-desktop/QuickbooksConnector.cs
deleted file mode 100644
index 7d102bf..0000000
--- a/src/main/quickbooks-desktop/QuickbooksConnector.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-using System;
-using Interop.QBFC16; // Ensure this matches your DLL version
-
-public class QuickBooksConnector
-{
- public string ProcessQBXML(string qbxmlRequest)
- {
- try
- {
- QBSessionManager sessionManager = new QBSessionManager();
- sessionManager.OpenConnection("", "YourAppName");
- sessionManager.BeginSession("", ENOpenMode.omDontCare);
-
- IMsgSetRequest requestMsgSet = sessionManager.CreateMsgSetRequest("US", 13, 0);
- requestMsgSet.AppendXML(qbxmlRequest);
-
- IMsgSetResponse responseMsgSet = sessionManager.DoRequests(requestMsgSet);
- string qbxmlResponse = responseMsgSet.ToXMLString();
-
- sessionManager.EndSession();
- sessionManager.CloseConnection();
-
- return qbxmlResponse;
- }
- catch (Exception ex)
- {
- return $"Error: {ex.Message}";
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/quickbooks-desktop/quickbooks-desktop.ts b/src/main/quickbooks-desktop/quickbooks-desktop.ts
deleted file mode 100644
index 68a1c76..0000000
--- a/src/main/quickbooks-desktop/quickbooks-desktop.ts
+++ /dev/null
@@ -1,130 +0,0 @@
-import log from "electron-log/main";
-
-import { UUID } from "crypto";
-import { Request, Response } from "express";
-import _ from "lodash";
-import errorTypeCheck from "../../util/errorTypeCheck";
-
-// eslint-disable-next-line @typescript-eslint/no-explicit-any
-let Winax: any; // Declare Winax as any to avoid TypeScript errors on non-Windows platforms
-
-if (process.platform === "win32") {
- // eslint-disable-next-line @typescript-eslint/no-require-imports
- Winax = require("winax");
-}
-
-export async function handleQuickBookRequest(
- req: Request,
- res: Response,
-): Promise {
- if (process.platform !== "win32") {
- res.status(500).json({
- error: "QuickBooks Desktop integration is only available on Windows",
- });
- return;
- }
-
- const QbFilePath: string = `C:\\Users\\PatrickFic\\Development\\FRODO COLLISION.QBW`;
- // ||
- // (store.get("settings.qbFilePath") as string) F
-
- if (_.isEmpty(QbFilePath)) {
- res.status(400).json({ error: "Quickbooks file path not set" });
- return;
- }
-
- const qbxmlRequestList = req.body as Array<{
- id: UUID;
- okStatusCodes: Array;
- qbxml: string;
- }>;
-
- const returnResponse: Array<{
- Id: UUID;
- Success: boolean;
- ErrorMessage: string;
- }> = [];
-
- //Connect to the QuickBooks File
- let requestProcessor;
- try {
- requestProcessor = new Winax.Object("QBXMLRP2.RequestProcessor.2");
- requestProcessor.OpenConnection(QbFilePath, "ShopPartnerActualRequest");
- } catch (error) {
- log.error(
- "Error instnatiating QuickBooks Request Processor",
- QbFilePath,
- errorTypeCheck(error),
- );
- res.status(500).json({ error: "Error connecting to QuickBooks" });
- return;
- }
-
- const ticket = requestProcessor.BeginSession(QbFilePath, 2); //2 indicated qbFileOpenModeDoNotCare
- log.info("Quickbooks Ticket", ticket);
- for (const qbxmlRequest of qbxmlRequestList) {
- try {
- //TODO: Refactor to not create a new connection every time.
- const QuickBooksResponse = requestProcessor.ProcessRequest(
- ticket,
- qbxmlRequest.qbxml,
- );
- log.info("QuickBooks Raw Response: ", QuickBooksResponse);
- returnResponse.push({
- Id: qbxmlRequest.id,
- Success:
- QuickBooksResponse.StatusCode === "0" ||
- qbxmlRequest.okStatusCodes.includes(QuickBooksResponse.StatusCode),
- ErrorMessage: QuickBooksResponse,
- });
- } catch (error) {
- log.error(
- "Error running transaction",
- ticket,
- qbxmlRequest,
- errorTypeCheck(error),
- );
- }
- }
- requestProcessor.EndSession(ticket);
- requestProcessor.CloseConnection();
- res.json(qbxmlRequestList);
-}
-
-//This set of functions works.
-export function TestQB(): void {
- if (process.platform !== "win32") {
- log.warn("TestQB is only available on Windows");
- return;
- }
- let requestProcessor, ticket;
- try {
- requestProcessor = new Winax.Object("QBXMLRP.RequestProcessor.1");
- requestProcessor.OpenConnection("", "ShopPartnerOneoFf");
-
- ticket = requestProcessor.BeginSession("", 2); //2 indicated qbFileOOpenModeDoNotCare
-
- requestProcessor.ProcessRequest(
- ticket,
- `
-
-
-
-
-`,
- );
- } catch (error) {
- log.error(
- "Error instnatiating QuickBooks Request Processor",
-
- errorTypeCheck(error),
- );
-
- return;
- }
-
- log.log("Ticket", ticket);
- requestProcessor.EndSession(ticket);
- requestProcessor.CloseConnection();
- return;
-}
diff --git a/src/main/store/store.ts b/src/main/store/store.ts
index 62968bd..0199452 100644
--- a/src/main/store/store.ts
+++ b/src/main/store/store.ts
@@ -5,11 +5,7 @@ const store = new Store({
settings: {
runOnStartup: true,
filepaths: [],
- ppcFilePath: null,
- emsOutFilePath: null,
- qbFilePath: "",
runWatcherOnStartup: true,
- enableMemDebug: false,
polling: {
enabled: false,
interval: 30000,
@@ -25,9 +21,6 @@ const store = new Store({
user: null,
isTest: false,
bodyshop: {},
- masterdata: {
- opcodes: null,
- },
},
},
});
diff --git a/src/renderer/index.html b/src/renderer/index.html
index 05d34b0..8f79d5e 100644
--- a/src/renderer/index.html
+++ b/src/renderer/index.html
@@ -2,7 +2,7 @@
- Shop Partner
+ EMS Uploader