Refactor PPC to pull out reusable componenets.
This commit is contained in:
38
src/main/ems-parts-order/ems-parts-order-generate-env.ts
Normal file
38
src/main/ems-parts-order/ems-parts-order-generate-env.ts
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
import { DBFFile } from "dbffile";
|
||||||
|
import { envFieldLineDescriptors } from "../util/ems-interface/fielddescriptors/env-field-descriptor";
|
||||||
|
import { deleteEmsFileIfExists, generatePpcFilePath } from "../util/ems-util";
|
||||||
|
import { EmsPartsOrder } from "./ems-parts-order-interfaces";
|
||||||
|
|
||||||
|
const EmsPartsOrderGenerateEnvFile = async (
|
||||||
|
partsOrder: EmsPartsOrder,
|
||||||
|
): Promise<boolean> => {
|
||||||
|
const records = [
|
||||||
|
{
|
||||||
|
EST_SYSTEM: "C",
|
||||||
|
RO_ID: partsOrder.job.ro_number,
|
||||||
|
ESTFILE_ID: partsOrder.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(`${partsOrder.job.ciecaid}.ENV`),
|
||||||
|
);
|
||||||
|
|
||||||
|
const dbf = await DBFFile.create(
|
||||||
|
generatePpcFilePath(`${partsOrder.job.ciecaid}.ENV`),
|
||||||
|
envFieldLineDescriptors,
|
||||||
|
);
|
||||||
|
|
||||||
|
await dbf.appendRecords(records);
|
||||||
|
console.log(`${records.length} LIN file records added.`);
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default EmsPartsOrderGenerateEnvFile;
|
||||||
53
src/main/ems-parts-order/ems-parts-order-handler.ts
Normal file
53
src/main/ems-parts-order/ems-parts-order-handler.ts
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
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 EmsPartsOrderGenerateEnvFile from "./ems-parts-order-generate-env";
|
||||||
|
import { EmsPartsOrder } from "./ems-parts-order-interfaces";
|
||||||
|
|
||||||
|
const handleEMSPartsOrder = async (
|
||||||
|
req: express.Request,
|
||||||
|
res: express.Response,
|
||||||
|
): Promise<void> => {
|
||||||
|
//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<void> => {
|
||||||
|
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 EmsPartsOrderGenerateEnvFile(partsOrder);
|
||||||
|
} catch (error) {
|
||||||
|
log.error("Error generating parts price change", errorTypeCheck(error));
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export { handleEMSPartsOrder };
|
||||||
308
src/main/ems-parts-order/ems-parts-order-interfaces.ts
Normal file
308
src/main/ems-parts-order/ems-parts-order-interfaces.ts
Normal file
@@ -0,0 +1,308 @@
|
|||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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;
|
||||||
|
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<string, TaxRate>;
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Main Parts Order export interface
|
||||||
|
export interface EmsPartsOrder {
|
||||||
|
parts_order_lines: PartsOrderLine[];
|
||||||
|
job: Job;
|
||||||
|
}
|
||||||
@@ -8,6 +8,7 @@ import ImportJob from "../decoder/decoder";
|
|||||||
import folderScan from "../decoder/folder-scan";
|
import folderScan from "../decoder/folder-scan";
|
||||||
import { handlePartsPariceChangeRequest } from "../ppc/ppc-handler";
|
import { handlePartsPariceChangeRequest } from "../ppc/ppc-handler";
|
||||||
import { handleQuickBookRequest } from "../quickbooks-desktop/quickbooks-desktop";
|
import { handleQuickBookRequest } from "../quickbooks-desktop/quickbooks-desktop";
|
||||||
|
import { handleEMSPartsOrder } from "../ems-parts-order/ems-parts-order-handler";
|
||||||
|
|
||||||
export default class LocalServer {
|
export default class LocalServer {
|
||||||
private app: express.Application;
|
private app: express.Application;
|
||||||
@@ -119,6 +120,7 @@ export default class LocalServer {
|
|||||||
return;
|
return;
|
||||||
});
|
});
|
||||||
this.app.post("/ppc", handlePartsPariceChangeRequest);
|
this.app.post("/ppc", handlePartsPariceChangeRequest);
|
||||||
|
this.app.post("/oec", handleEMSPartsOrder);
|
||||||
this.app.post(
|
this.app.post(
|
||||||
"/import",
|
"/import",
|
||||||
async (req: express.Request, res: express.Response) => {
|
async (req: express.Request, res: express.Response) => {
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ import {
|
|||||||
SettingsWatchedFilePathsRemove,
|
SettingsWatchedFilePathsRemove,
|
||||||
SettingsWatcherPollingGet,
|
SettingsWatcherPollingGet,
|
||||||
SettingsWatcherPollingSet,
|
SettingsWatcherPollingSet,
|
||||||
|
SettingEmsOutFilPathSet,
|
||||||
|
SettingEmsOutFilPathGet,
|
||||||
} from "./ipcMainHandler.settings";
|
} from "./ipcMainHandler.settings";
|
||||||
import {
|
import {
|
||||||
ipcMainHandleAuthStateChanged,
|
ipcMainHandleAuthStateChanged,
|
||||||
@@ -98,6 +100,14 @@ ipcMain.handle(
|
|||||||
|
|
||||||
ipcMain.handle(ipcTypes.toMain.settings.getPpcFilePath, SettingsPpcFilPathGet);
|
ipcMain.handle(ipcTypes.toMain.settings.getPpcFilePath, SettingsPpcFilPathGet);
|
||||||
ipcMain.handle(ipcTypes.toMain.settings.setPpcFilePath, SettingsPpcFilPathSet);
|
ipcMain.handle(ipcTypes.toMain.settings.setPpcFilePath, SettingsPpcFilPathSet);
|
||||||
|
ipcMain.handle(
|
||||||
|
ipcTypes.toMain.settings.getEmsOutFilePath,
|
||||||
|
SettingEmsOutFilPathGet,
|
||||||
|
);
|
||||||
|
ipcMain.handle(
|
||||||
|
ipcTypes.toMain.settings.setEmsOutFilePath,
|
||||||
|
SettingEmsOutFilPathSet,
|
||||||
|
);
|
||||||
|
|
||||||
ipcMain.handle(ipcTypes.toMain.user.getActiveShop, () => {
|
ipcMain.handle(ipcTypes.toMain.user.getActiveShop, () => {
|
||||||
return store.get("app.bodyshop.shopname");
|
return store.get("app.bodyshop.shopname");
|
||||||
|
|||||||
@@ -96,6 +96,27 @@ const SettingsPpcFilPathSet = async (): Promise<string> => {
|
|||||||
return (Store.get("settings.ppcFilePath") as string) || "";
|
return (Store.get("settings.ppcFilePath") as string) || "";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const SettingEmsOutFilPathGet = async (): Promise<string> => {
|
||||||
|
const emsOutFilePath: string = Store.get("settings.emsOutFilePath");
|
||||||
|
return emsOutFilePath;
|
||||||
|
};
|
||||||
|
const SettingEmsOutFilPathSet = async (): Promise<string> => {
|
||||||
|
const mainWindow = getMainWindow();
|
||||||
|
if (!mainWindow) {
|
||||||
|
log.error("No main window found when trying to open dialog");
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
const result = await dialog.showOpenDialog(mainWindow, {
|
||||||
|
properties: ["openDirectory"],
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!result.canceled) {
|
||||||
|
Store.set("settings.emsOutFilePath", result.filePaths[0]); //There should only ever be on directory that was selected.
|
||||||
|
}
|
||||||
|
|
||||||
|
return (Store.get("settings.emsOutFilePath") as string) || "";
|
||||||
|
};
|
||||||
|
|
||||||
export {
|
export {
|
||||||
SettingsPpcFilPathGet,
|
SettingsPpcFilPathGet,
|
||||||
SettingsPpcFilPathSet,
|
SettingsPpcFilPathSet,
|
||||||
@@ -104,4 +125,6 @@ export {
|
|||||||
SettingsWatchedFilePathsRemove,
|
SettingsWatchedFilePathsRemove,
|
||||||
SettingsWatcherPollingGet,
|
SettingsWatcherPollingGet,
|
||||||
SettingsWatcherPollingSet,
|
SettingsWatcherPollingSet,
|
||||||
|
SettingEmsOutFilPathGet,
|
||||||
|
SettingEmsOutFilPathSet,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
import { DBFFile, FieldDescriptor } from "dbffile";
|
import { DBFFile } from "dbffile";
|
||||||
import {
|
import { envFieldLineDescriptors } from "../util/ems-interface/fielddescriptors/env-field-descriptor";
|
||||||
deleteEmsFileIfExists,
|
import { deleteEmsFileIfExists, generatePpcFilePath } from "../util/ems-util";
|
||||||
generatePpcFilePath,
|
|
||||||
} from "./ppc-generate-file";
|
|
||||||
import { PpcJob } from "./ppc-handler";
|
import { PpcJob } from "./ppc-handler";
|
||||||
|
|
||||||
const GenerateEnvFile = async (job: PpcJob): Promise<boolean> => {
|
const GenerateEnvFile = async (job: PpcJob): Promise<boolean> => {
|
||||||
@@ -20,7 +18,6 @@ const GenerateEnvFile = async (job: PpcJob): Promise<boolean> => {
|
|||||||
INCL_VENDR: false,
|
INCL_VENDR: false,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
//Check if it already exists, delete it if so.
|
|
||||||
|
|
||||||
await deleteEmsFileIfExists(generatePpcFilePath(`${job.ciecaid}.ENV`));
|
await deleteEmsFileIfExists(generatePpcFilePath(`${job.ciecaid}.ENV`));
|
||||||
|
|
||||||
@@ -35,157 +32,3 @@ const GenerateEnvFile = async (job: PpcJob): Promise<boolean> => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export default GenerateEnvFile;
|
export default GenerateEnvFile;
|
||||||
|
|
||||||
//Taken from a set of CCC ems files.
|
|
||||||
const envFieldLineDescriptors: FieldDescriptor[] = [
|
|
||||||
{
|
|
||||||
name: "EST_SYSTEM",
|
|
||||||
type: "C",
|
|
||||||
size: 1,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "SW_VERSION",
|
|
||||||
type: "C",
|
|
||||||
size: 10,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "DB_VERSION",
|
|
||||||
type: "C",
|
|
||||||
size: 12,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "DB_DATE",
|
|
||||||
type: "D",
|
|
||||||
size: 8,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "UNQFILE_ID",
|
|
||||||
type: "C",
|
|
||||||
size: 8,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "RO_ID",
|
|
||||||
type: "C",
|
|
||||||
size: 8,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "ESTFILE_ID",
|
|
||||||
type: "C",
|
|
||||||
size: 38,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "SUPP_NO",
|
|
||||||
type: "C",
|
|
||||||
size: 3,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "EST_CTRY",
|
|
||||||
type: "C",
|
|
||||||
size: 3,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "TOP_SECRET",
|
|
||||||
type: "C",
|
|
||||||
size: 80,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "H_TRANS_ID",
|
|
||||||
type: "C",
|
|
||||||
size: 9,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "H_CTRL_NO",
|
|
||||||
type: "C",
|
|
||||||
size: 9,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "TRANS_TYPE",
|
|
||||||
type: "C",
|
|
||||||
size: 1,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "STATUS",
|
|
||||||
type: "L",
|
|
||||||
size: 1,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "CREATE_DT",
|
|
||||||
type: "D",
|
|
||||||
size: 8,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "CREATE_TM",
|
|
||||||
type: "C",
|
|
||||||
size: 6,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "TRANSMT_DT",
|
|
||||||
type: "D",
|
|
||||||
size: 8,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "TRANSMT_TM",
|
|
||||||
type: "C",
|
|
||||||
size: 6,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "INCL_ADMIN",
|
|
||||||
type: "L",
|
|
||||||
size: 1,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "INCL_VEH",
|
|
||||||
type: "L",
|
|
||||||
size: 1,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "INCL_EST",
|
|
||||||
type: "L",
|
|
||||||
size: 1,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "INCL_PROFL",
|
|
||||||
type: "L",
|
|
||||||
size: 1,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "INCL_TOTAL",
|
|
||||||
type: "L",
|
|
||||||
size: 1,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "INCL_VENDR",
|
|
||||||
type: "L",
|
|
||||||
size: 1,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "EMS_VER",
|
|
||||||
type: "C",
|
|
||||||
size: 5,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
import { DBFFile, FieldDescriptor } from "dbffile";
|
import { DBFFile } from "dbffile";
|
||||||
import {
|
import { linFieldDescriptors } from "../util/ems-interface/fielddescriptors/lin-field-descriptor";
|
||||||
deleteEmsFileIfExists,
|
import { deleteEmsFileIfExists, generatePpcFilePath } from "../util/ems-util";
|
||||||
generatePpcFilePath,
|
|
||||||
} from "./ppc-generate-file";
|
|
||||||
import { PpcJob } from "./ppc-handler";
|
import { PpcJob } from "./ppc-handler";
|
||||||
|
|
||||||
const GenerateLinFile = async (job: PpcJob): Promise<boolean> => {
|
const GenerateLinFile = async (job: PpcJob): Promise<boolean> => {
|
||||||
@@ -14,7 +12,6 @@ const GenerateLinFile = async (job: PpcJob): Promise<boolean> => {
|
|||||||
ACT_PRICE: line.act_price,
|
ACT_PRICE: line.act_price,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
//Check if it already exists, delete it if so.
|
|
||||||
|
|
||||||
await deleteEmsFileIfExists(generatePpcFilePath(`${job.ciecaid}.LIN`));
|
await deleteEmsFileIfExists(generatePpcFilePath(`${job.ciecaid}.LIN`));
|
||||||
|
|
||||||
@@ -29,277 +26,3 @@ const GenerateLinFile = async (job: PpcJob): Promise<boolean> => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export default GenerateLinFile;
|
export default GenerateLinFile;
|
||||||
|
|
||||||
//Taken from a set of CCC ems files.
|
|
||||||
const linFieldDescriptors: FieldDescriptor[] = [
|
|
||||||
{
|
|
||||||
name: "LINE_NO",
|
|
||||||
type: "N",
|
|
||||||
size: 3,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "LINE_IND",
|
|
||||||
type: "C",
|
|
||||||
size: 3,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "LINE_REF",
|
|
||||||
type: "N",
|
|
||||||
size: 3,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "TRAN_CODE",
|
|
||||||
type: "C",
|
|
||||||
size: 1,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "DB_REF",
|
|
||||||
type: "C",
|
|
||||||
size: 7,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "UNQ_SEQ",
|
|
||||||
type: "N",
|
|
||||||
size: 4,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "WHO_PAYS",
|
|
||||||
type: "C",
|
|
||||||
size: 2,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "LINE_DESC",
|
|
||||||
type: "C",
|
|
||||||
size: 40,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "PART_TYPE",
|
|
||||||
type: "C",
|
|
||||||
size: 4,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "PART_DES_J",
|
|
||||||
type: "L",
|
|
||||||
size: 1,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "GLASS_FLAG",
|
|
||||||
type: "L",
|
|
||||||
size: 1,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "OEM_PARTNO",
|
|
||||||
type: "C",
|
|
||||||
size: 25,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "PRICE_INC",
|
|
||||||
type: "L",
|
|
||||||
size: 1,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "ALT_PART_I",
|
|
||||||
type: "L",
|
|
||||||
size: 1,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "TAX_PART",
|
|
||||||
type: "L",
|
|
||||||
size: 1,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "DB_PRICE",
|
|
||||||
type: "N",
|
|
||||||
size: 9,
|
|
||||||
decimalPlaces: 2,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "ACT_PRICE",
|
|
||||||
type: "N",
|
|
||||||
size: 9,
|
|
||||||
decimalPlaces: 2,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "PRICE_J",
|
|
||||||
type: "L",
|
|
||||||
size: 1,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "CERT_PART",
|
|
||||||
type: "L",
|
|
||||||
size: 1,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "PART_QTY",
|
|
||||||
type: "N",
|
|
||||||
size: 2,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "ALT_CO_ID",
|
|
||||||
type: "C",
|
|
||||||
size: 20,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "ALT_PARTNO",
|
|
||||||
type: "C",
|
|
||||||
size: 25,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "ALT_OVERRD",
|
|
||||||
type: "L",
|
|
||||||
size: 1,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "ALT_PARTM",
|
|
||||||
type: "C",
|
|
||||||
size: 45,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "PRT_DSMK_P",
|
|
||||||
type: "N",
|
|
||||||
size: 7,
|
|
||||||
decimalPlaces: 2,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "PRT_DSMK_M",
|
|
||||||
type: "N",
|
|
||||||
size: 9,
|
|
||||||
decimalPlaces: 2,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "MOD_LBR_TY",
|
|
||||||
type: "C",
|
|
||||||
size: 4,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "DB_HRS",
|
|
||||||
type: "N",
|
|
||||||
size: 5,
|
|
||||||
decimalPlaces: 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "MOD_LB_HRS",
|
|
||||||
type: "N",
|
|
||||||
size: 5,
|
|
||||||
decimalPlaces: 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "LBR_INC",
|
|
||||||
type: "L",
|
|
||||||
size: 1,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "LBR_OP",
|
|
||||||
type: "C",
|
|
||||||
size: 4,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "LBR_HRS_J",
|
|
||||||
type: "L",
|
|
||||||
size: 1,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "LBR_TYP_J",
|
|
||||||
type: "L",
|
|
||||||
size: 1,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "LBR_OP_J",
|
|
||||||
type: "L",
|
|
||||||
size: 1,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "PAINT_STG",
|
|
||||||
type: "N",
|
|
||||||
size: 1,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "PAINT_TONE",
|
|
||||||
type: "N",
|
|
||||||
size: 1,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "LBR_TAX",
|
|
||||||
type: "L",
|
|
||||||
size: 1,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "LBR_AMT",
|
|
||||||
type: "N",
|
|
||||||
size: 9,
|
|
||||||
decimalPlaces: 2,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "MISC_AMT",
|
|
||||||
type: "N",
|
|
||||||
size: 9,
|
|
||||||
decimalPlaces: 2,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "MISC_SUBLT",
|
|
||||||
type: "L",
|
|
||||||
size: 1,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "MISC_TAX",
|
|
||||||
type: "L",
|
|
||||||
size: 1,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "BETT_TYPE",
|
|
||||||
type: "C",
|
|
||||||
size: 4,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "BETT_PCTG",
|
|
||||||
type: "N",
|
|
||||||
size: 8,
|
|
||||||
decimalPlaces: 4,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "BETT_AMT",
|
|
||||||
type: "N",
|
|
||||||
size: 9,
|
|
||||||
decimalPlaces: 2,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "BETT_TAX",
|
|
||||||
type: "L",
|
|
||||||
size: 1,
|
|
||||||
decimalPlaces: 0,
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
import { UUID } from "crypto";
|
import { UUID } from "crypto";
|
||||||
import log from "electron-log/main";
|
import log from "electron-log/main";
|
||||||
import express from "express";
|
import express from "express";
|
||||||
import fs from "fs";
|
|
||||||
import _ from "lodash";
|
import _ from "lodash";
|
||||||
import path from "path";
|
|
||||||
import errorTypeCheck from "../../util/errorTypeCheck";
|
import errorTypeCheck from "../../util/errorTypeCheck";
|
||||||
import store from "../store/store";
|
import store from "../store/store";
|
||||||
import GenerateLinFile from "./ppc-generate-lin";
|
import createdDirectoryIfNotExist from "../util/createDirectoryIfNotExist";
|
||||||
import GenerateEnvFile from "./ppc-generate-env";
|
import GenerateEnvFile from "./ppc-generate-env";
|
||||||
|
import GenerateLinFile from "./ppc-generate-lin";
|
||||||
|
|
||||||
const handlePartsPariceChangeRequest = async (
|
const handlePartsPariceChangeRequest = async (
|
||||||
req: express.Request,
|
req: express.Request,
|
||||||
@@ -40,12 +39,8 @@ const generatePartsPriceChange = async (job: PpcJob): Promise<void> => {
|
|||||||
throw new Error("PPC file path is not set");
|
throw new Error("PPC file path is not set");
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
//If the directory doesn't exist, create it.
|
createdDirectoryIfNotExist(ppcOutFilePath);
|
||||||
const directoryPath = path.dirname(ppcOutFilePath);
|
|
||||||
if (!fs.existsSync(directoryPath)) {
|
|
||||||
log.info(`Directory does not exist. Creating: ${directoryPath}`);
|
|
||||||
fs.mkdirSync(directoryPath, { recursive: true });
|
|
||||||
}
|
|
||||||
await GenerateLinFile(job);
|
await GenerateLinFile(job);
|
||||||
await GenerateEnvFile(job);
|
await GenerateEnvFile(job);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ const store = new Store({
|
|||||||
runOnStartup: true,
|
runOnStartup: true,
|
||||||
filepaths: [],
|
filepaths: [],
|
||||||
ppcFilePath: null,
|
ppcFilePath: null,
|
||||||
|
emsOutFilePath: null,
|
||||||
qbFilePath: "",
|
qbFilePath: "",
|
||||||
runWatcherOnStartup: true,
|
runWatcherOnStartup: true,
|
||||||
polling: {
|
polling: {
|
||||||
|
|||||||
21
src/main/util/createDirectoryIfNotExist.ts
Normal file
21
src/main/util/createDirectoryIfNotExist.ts
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
import log from "electron-log/main";
|
||||||
|
import fs from "fs";
|
||||||
|
import path from "path";
|
||||||
|
import errorTypeCheck from "../../util/errorTypeCheck";
|
||||||
|
|
||||||
|
const createdDirectoryIfNotExist = async (dirpath: string) => {
|
||||||
|
try {
|
||||||
|
const directoryPath = path.dirname(dirpath);
|
||||||
|
if (!fs.existsSync(directoryPath)) {
|
||||||
|
log.info(`Directory does not exist. Creating: ${directoryPath}`);
|
||||||
|
fs.mkdirSync(directoryPath, { recursive: true });
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
log.error("Error creating directory as needed", errorTypeCheck(error));
|
||||||
|
throw new Error(
|
||||||
|
"Error creating directory: " + errorTypeCheck(error).message,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export default createdDirectoryIfNotExist;
|
||||||
@@ -0,0 +1,154 @@
|
|||||||
|
import { FieldDescriptor } from "dbffile";
|
||||||
|
|
||||||
|
export const envFieldLineDescriptors: FieldDescriptor[] = [
|
||||||
|
{
|
||||||
|
name: "EST_SYSTEM",
|
||||||
|
type: "C",
|
||||||
|
size: 1,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "SW_VERSION",
|
||||||
|
type: "C",
|
||||||
|
size: 10,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "DB_VERSION",
|
||||||
|
type: "C",
|
||||||
|
size: 12,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "DB_DATE",
|
||||||
|
type: "D",
|
||||||
|
size: 8,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "UNQFILE_ID",
|
||||||
|
type: "C",
|
||||||
|
size: 8,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "RO_ID",
|
||||||
|
type: "C",
|
||||||
|
size: 8,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "ESTFILE_ID",
|
||||||
|
type: "C",
|
||||||
|
size: 38,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "SUPP_NO",
|
||||||
|
type: "C",
|
||||||
|
size: 3,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "EST_CTRY",
|
||||||
|
type: "C",
|
||||||
|
size: 3,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "TOP_SECRET",
|
||||||
|
type: "C",
|
||||||
|
size: 80,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "H_TRANS_ID",
|
||||||
|
type: "C",
|
||||||
|
size: 9,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "H_CTRL_NO",
|
||||||
|
type: "C",
|
||||||
|
size: 9,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "TRANS_TYPE",
|
||||||
|
type: "C",
|
||||||
|
size: 1,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "STATUS",
|
||||||
|
type: "L",
|
||||||
|
size: 1,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "CREATE_DT",
|
||||||
|
type: "D",
|
||||||
|
size: 8,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "CREATE_TM",
|
||||||
|
type: "C",
|
||||||
|
size: 6,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "TRANSMT_DT",
|
||||||
|
type: "D",
|
||||||
|
size: 8,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "TRANSMT_TM",
|
||||||
|
type: "C",
|
||||||
|
size: 6,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "INCL_ADMIN",
|
||||||
|
type: "L",
|
||||||
|
size: 1,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "INCL_VEH",
|
||||||
|
type: "L",
|
||||||
|
size: 1,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "INCL_EST",
|
||||||
|
type: "L",
|
||||||
|
size: 1,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "INCL_PROFL",
|
||||||
|
type: "L",
|
||||||
|
size: 1,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "INCL_TOTAL",
|
||||||
|
type: "L",
|
||||||
|
size: 1,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "INCL_VENDR",
|
||||||
|
type: "L",
|
||||||
|
size: 1,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "EMS_VER",
|
||||||
|
type: "C",
|
||||||
|
size: 5,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
];
|
||||||
@@ -0,0 +1,274 @@
|
|||||||
|
import { FieldDescriptor } from "dbffile";
|
||||||
|
|
||||||
|
export const linFieldDescriptors: FieldDescriptor[] = [
|
||||||
|
{
|
||||||
|
name: "LINE_NO",
|
||||||
|
type: "N",
|
||||||
|
size: 3,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "LINE_IND",
|
||||||
|
type: "C",
|
||||||
|
size: 3,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "LINE_REF",
|
||||||
|
type: "N",
|
||||||
|
size: 3,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "TRAN_CODE",
|
||||||
|
type: "C",
|
||||||
|
size: 1,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "DB_REF",
|
||||||
|
type: "C",
|
||||||
|
size: 7,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "UNQ_SEQ",
|
||||||
|
type: "N",
|
||||||
|
size: 4,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "WHO_PAYS",
|
||||||
|
type: "C",
|
||||||
|
size: 2,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "LINE_DESC",
|
||||||
|
type: "C",
|
||||||
|
size: 40,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "PART_TYPE",
|
||||||
|
type: "C",
|
||||||
|
size: 4,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "PART_DES_J",
|
||||||
|
type: "L",
|
||||||
|
size: 1,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "GLASS_FLAG",
|
||||||
|
type: "L",
|
||||||
|
size: 1,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "OEM_PARTNO",
|
||||||
|
type: "C",
|
||||||
|
size: 25,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "PRICE_INC",
|
||||||
|
type: "L",
|
||||||
|
size: 1,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "ALT_PART_I",
|
||||||
|
type: "L",
|
||||||
|
size: 1,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "TAX_PART",
|
||||||
|
type: "L",
|
||||||
|
size: 1,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "DB_PRICE",
|
||||||
|
type: "N",
|
||||||
|
size: 9,
|
||||||
|
decimalPlaces: 2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "ACT_PRICE",
|
||||||
|
type: "N",
|
||||||
|
size: 9,
|
||||||
|
decimalPlaces: 2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "PRICE_J",
|
||||||
|
type: "L",
|
||||||
|
size: 1,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "CERT_PART",
|
||||||
|
type: "L",
|
||||||
|
size: 1,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "PART_QTY",
|
||||||
|
type: "N",
|
||||||
|
size: 2,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "ALT_CO_ID",
|
||||||
|
type: "C",
|
||||||
|
size: 20,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "ALT_PARTNO",
|
||||||
|
type: "C",
|
||||||
|
size: 25,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "ALT_OVERRD",
|
||||||
|
type: "L",
|
||||||
|
size: 1,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "ALT_PARTM",
|
||||||
|
type: "C",
|
||||||
|
size: 45,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "PRT_DSMK_P",
|
||||||
|
type: "N",
|
||||||
|
size: 7,
|
||||||
|
decimalPlaces: 2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "PRT_DSMK_M",
|
||||||
|
type: "N",
|
||||||
|
size: 9,
|
||||||
|
decimalPlaces: 2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "MOD_LBR_TY",
|
||||||
|
type: "C",
|
||||||
|
size: 4,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "DB_HRS",
|
||||||
|
type: "N",
|
||||||
|
size: 5,
|
||||||
|
decimalPlaces: 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "MOD_LB_HRS",
|
||||||
|
type: "N",
|
||||||
|
size: 5,
|
||||||
|
decimalPlaces: 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "LBR_INC",
|
||||||
|
type: "L",
|
||||||
|
size: 1,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "LBR_OP",
|
||||||
|
type: "C",
|
||||||
|
size: 4,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "LBR_HRS_J",
|
||||||
|
type: "L",
|
||||||
|
size: 1,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "LBR_TYP_J",
|
||||||
|
type: "L",
|
||||||
|
size: 1,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "LBR_OP_J",
|
||||||
|
type: "L",
|
||||||
|
size: 1,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "PAINT_STG",
|
||||||
|
type: "N",
|
||||||
|
size: 1,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "PAINT_TONE",
|
||||||
|
type: "N",
|
||||||
|
size: 1,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "LBR_TAX",
|
||||||
|
type: "L",
|
||||||
|
size: 1,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "LBR_AMT",
|
||||||
|
type: "N",
|
||||||
|
size: 9,
|
||||||
|
decimalPlaces: 2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "MISC_AMT",
|
||||||
|
type: "N",
|
||||||
|
size: 9,
|
||||||
|
decimalPlaces: 2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "MISC_SUBLT",
|
||||||
|
type: "L",
|
||||||
|
size: 1,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "MISC_TAX",
|
||||||
|
type: "L",
|
||||||
|
size: 1,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "BETT_TYPE",
|
||||||
|
type: "C",
|
||||||
|
size: 4,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "BETT_PCTG",
|
||||||
|
type: "N",
|
||||||
|
size: 8,
|
||||||
|
decimalPlaces: 4,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "BETT_AMT",
|
||||||
|
type: "N",
|
||||||
|
size: 9,
|
||||||
|
decimalPlaces: 2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "BETT_TAX",
|
||||||
|
type: "L",
|
||||||
|
size: 1,
|
||||||
|
decimalPlaces: 0,
|
||||||
|
},
|
||||||
|
];
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
import path from "path";
|
import path from "path";
|
||||||
import store from "../store/store";
|
import store from "../store/store";
|
||||||
import fs from "fs";
|
import fs from "fs";
|
||||||
|
|
||||||
const generatePpcFilePath = (filename: string): string => {
|
const generatePpcFilePath = (filename: string): string => {
|
||||||
const ppcOutFilePath: string | null = store.get("settings.ppcFilePath");
|
const ppcOutFilePath: string | null = store.get("settings.ppcFilePath");
|
||||||
if (!ppcOutFilePath) {
|
if (!ppcOutFilePath) {
|
||||||
@@ -9,6 +10,14 @@ const generatePpcFilePath = (filename: string): string => {
|
|||||||
return path.resolve(ppcOutFilePath, filename);
|
return path.resolve(ppcOutFilePath, filename);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const generateEmsOutFilePath = (filename: string): string => {
|
||||||
|
const emsOutFilePath: string | null = store.get("settings.emsOutFilePath");
|
||||||
|
if (!emsOutFilePath) {
|
||||||
|
throw new Error("EMS Out file path is not set");
|
||||||
|
}
|
||||||
|
return path.resolve(emsOutFilePath, filename);
|
||||||
|
};
|
||||||
|
|
||||||
const deleteEmsFileIfExists = async (filename: string): Promise<void> => {
|
const deleteEmsFileIfExists = async (filename: string): Promise<void> => {
|
||||||
// Check if the file exists and delete it if it does
|
// Check if the file exists and delete it if it does
|
||||||
try {
|
try {
|
||||||
@@ -16,7 +25,7 @@ const deleteEmsFileIfExists = async (filename: string): Promise<void> => {
|
|||||||
await fs.promises.unlink(filename); // Delete the file
|
await fs.promises.unlink(filename); // Delete the file
|
||||||
console.log(`Existing file at ${filename} deleted.`);
|
console.log(`Existing file at ${filename} deleted.`);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (err.code !== "ENOENT") {
|
if ((err as NodeJS.ErrnoException).code !== "ENOENT") {
|
||||||
// If the error is not "file not found", rethrow it
|
// If the error is not "file not found", rethrow it
|
||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
@@ -24,4 +33,4 @@ const deleteEmsFileIfExists = async (filename: string): Promise<void> => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export { generatePpcFilePath, deleteEmsFileIfExists };
|
export { generatePpcFilePath, generateEmsOutFilePath, deleteEmsFileIfExists };
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
import { FolderOpenFilled } from "@ant-design/icons";
|
||||||
|
import { Button, Card, Input, Space } from "antd";
|
||||||
|
import { useEffect, useState } from "react";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
import ipcTypes from "../../../../util/ipcTypes.json";
|
||||||
|
|
||||||
|
const SettingsEmsOutFilePath: React.FC = () => {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
const [emsFilePath, setEmsFilePath] = useState<string | null>(null);
|
||||||
|
|
||||||
|
const getPollingStateFromStore = (): void => {
|
||||||
|
window.electron.ipcRenderer
|
||||||
|
.invoke(ipcTypes.toMain.settings.getEmsOutFilePath)
|
||||||
|
.then((filePath: string | null) => {
|
||||||
|
setEmsFilePath(filePath);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
//Get state first time it renders.
|
||||||
|
useEffect(() => {
|
||||||
|
getPollingStateFromStore();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const handlePathChange = (): void => {
|
||||||
|
window.electron.ipcRenderer
|
||||||
|
.invoke(ipcTypes.toMain.settings.setEmsOutFilePath)
|
||||||
|
.then((filePath: string | null) => {
|
||||||
|
setEmsFilePath(filePath);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Card title={t("settings.labels.emsOutFilePath")}>
|
||||||
|
<Space wrap>
|
||||||
|
<Input
|
||||||
|
value={emsFilePath || ""}
|
||||||
|
placeholder={t("settings.labels.emsOutFilePath")}
|
||||||
|
disabled
|
||||||
|
/>
|
||||||
|
<Button onClick={handlePathChange} icon={<FolderOpenFilled />} />
|
||||||
|
</Space>
|
||||||
|
</Card>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
export default SettingsEmsOutFilePath;
|
||||||
@@ -3,6 +3,7 @@ import SettingsWatchedPaths from "./Settings.WatchedPaths";
|
|||||||
import SettingsWatcher from "./Settings.Watcher";
|
import SettingsWatcher from "./Settings.Watcher";
|
||||||
import Welcome from "../Welcome/Welcome";
|
import Welcome from "../Welcome/Welcome";
|
||||||
import SettingsPpcFilepath from "./Settings.PpcFilePath";
|
import SettingsPpcFilepath from "./Settings.PpcFilePath";
|
||||||
|
import SettingsEmsOutFilePath from "./Settings.EmsOutFilePath";
|
||||||
|
|
||||||
const Settings: React.FC = () => {
|
const Settings: React.FC = () => {
|
||||||
console.log("is test?", window.api.isTest());
|
console.log("is test?", window.api.isTest());
|
||||||
@@ -20,6 +21,9 @@ const Settings: React.FC = () => {
|
|||||||
<Col span={12}>
|
<Col span={12}>
|
||||||
<SettingsPpcFilepath />
|
<SettingsPpcFilepath />
|
||||||
</Col>
|
</Col>
|
||||||
|
<Col span={12}>
|
||||||
|
<SettingsEmsOutFilePath />
|
||||||
|
</Col>
|
||||||
</Row>
|
</Row>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -20,6 +20,8 @@
|
|||||||
"add": "toMain_settings_filepaths_add",
|
"add": "toMain_settings_filepaths_add",
|
||||||
"remove": "toMain_settings_filepaths_remove"
|
"remove": "toMain_settings_filepaths_remove"
|
||||||
},
|
},
|
||||||
|
"getEmsOutFilePath": "toMain_settings_filepaths_getEmsOutFilePath",
|
||||||
|
"setEmsOutFilePath": "toMain_settings_filepaths_setEmsOutFilePath",
|
||||||
"getPpcFilePath": "toMain_settings_filepaths_getPpcFilePath",
|
"getPpcFilePath": "toMain_settings_filepaths_getPpcFilePath",
|
||||||
"setPpcFilePath": "toMain_settings_filepaths_setPpcFilePath",
|
"setPpcFilePath": "toMain_settings_filepaths_setPpcFilePath",
|
||||||
"watcher": {
|
"watcher": {
|
||||||
|
|||||||
Reference in New Issue
Block a user