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 index 8fad9fb..72775c5 100644 --- a/src/main/ems-parts-order/ems-parts-order-generate-pfl.ts +++ b/src/main/ems-parts-order/ems-parts-order-generate-pfl.ts @@ -13,10 +13,272 @@ const EmsPartsOrderGeneratePflFile = async ( partsOrder: EmsPartsOrder, ): Promise => { try { - const records = Object.keys(partsOrder.job.cieca_pfl).map((key) => { - const record: DecodedPflLine = partsOrder.job.cieca_pfl[key]; - return uppercaseObjectKeys(record); - }); + let records; + + if (partsOrder.job.cieca_pfl) { + 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`), 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 index 4e20301..008a724 100644 --- a/src/main/ems-parts-order/ems-parts-order-generate-pfm.ts +++ b/src/main/ems-parts-order/ems-parts-order-generate-pfm.ts @@ -13,10 +13,75 @@ const EmsPartsOrderGeneratePfmFile = async ( partsOrder: EmsPartsOrder, ): Promise => { try { - const records = Object.keys(partsOrder.job.materials).map((key) => { - const record: DecodedPfmLine = partsOrder.job.materials[key]; - return uppercaseObjectKeys(record); - }); + let records; + if (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`), 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 index aff8db5..9e8ac97 100644 --- a/src/main/ems-parts-order/ems-parts-order-generate-pfp.ts +++ b/src/main/ems-parts-order/ems-parts-order-generate-pfp.ts @@ -1,6 +1,6 @@ import { DBFFile } from "dbffile"; import errorTypeCheck from "../../util/errorTypeCheck"; -import { DecodedPfmLine } from "../decoder/decode-pfm.interface"; +import { DecodedPfpLine } from "../decoder/decode-pfp.interface"; import { pfpFieldLineDescriptors } from "../util/ems-interface/fielddescriptors/pfp-field-descriptors"; import { deleteEmsFileIfExists, @@ -13,8 +13,8 @@ const EmsPartsOrderGeneratePfpFile = async ( partsOrder: EmsPartsOrder, ): Promise => { try { - const records = Object.keys(partsOrder.job.materials).map((key) => { - const record: DecodedPfmLine = partsOrder.job.materials[key]; + const records = Object.keys(partsOrder.job.parts_tax_rates).map((key) => { + const record: DecodedPfpLine = partsOrder.job.parts_tax_rates[key]; return uppercaseObjectKeys(record); }); 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 new file mode 100644 index 0000000..893ddaf --- /dev/null +++ b/src/main/ems-parts-order/ems-parts-order-generate-pft.ts @@ -0,0 +1,34 @@ +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 new file mode 100644 index 0000000..485c75e --- /dev/null +++ b/src/main/ems-parts-order/ems-parts-order-generate-stl.ts @@ -0,0 +1,40 @@ +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 new file mode 100644 index 0000000..a59e79f --- /dev/null +++ b/src/main/ems-parts-order/ems-parts-order-generate-ttl.ts @@ -0,0 +1,36 @@ +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-handler.ts b/src/main/ems-parts-order/ems-parts-order-handler.ts index 4eb3334..4471f2b 100644 --- a/src/main/ems-parts-order/ems-parts-order-handler.ts +++ b/src/main/ems-parts-order/ems-parts-order-handler.ts @@ -8,12 +8,16 @@ 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 EmsPartsOrderGenerateVehFile from "./ems-parts-order-generate-veh"; -import { EmsPartsOrder } from "./ems-parts-order-interfaces"; 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, @@ -60,8 +64,16 @@ const generateEMSPartsOrder = async ( 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; diff --git a/src/main/ems-parts-order/ems-parts-order-interfaces.ts b/src/main/ems-parts-order/ems-parts-order-interfaces.ts index 4726b14..6cf9174 100644 --- a/src/main/ems-parts-order/ems-parts-order-interfaces.ts +++ b/src/main/ems-parts-order/ems-parts-order-interfaces.ts @@ -1,4 +1,8 @@ -import { CiecaPfl, DecodedPflLine } from "../decoder/decode-pfl.interface"; +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; @@ -228,7 +232,7 @@ export interface Job { ownr_st: string; ownr_title: string | null; ownr_zip: string; - parts_tax_rates: Record; + parts_tax_rates: Record; pay_amt: number; pay_date: string | null; pay_type: string | null; @@ -304,6 +308,10 @@ export interface Job { rate_la2: number; rate_la1: number; materials: Record; + cieca_stl: { + data: Array; + }; + cieca_ttl: { data: DecodedTtlLine }; } // Main Parts Order export interface diff --git a/src/main/util/ems-interface/fielddescriptors/pft-field-descriptor.ts b/src/main/util/ems-interface/fielddescriptors/pft-field-descriptor.ts new file mode 100644 index 0000000..5dc2fb5 --- /dev/null +++ b/src/main/util/ems-interface/fielddescriptors/pft-field-descriptor.ts @@ -0,0 +1,760 @@ +import { FieldDescriptor } from "dbffile"; + +export const pftFieldLineDescriptors: FieldDescriptor[] = [ + { + name: "TAX_TYPE1", + type: "C", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY1_TIER1", + type: "N", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY1_THRES1", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY1_RATE1", + type: "N", + size: 8, + decimalPlaces: 4, + }, + { + name: "TY1_SUR1", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY1_TIER2", + type: "N", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY1_THRES2", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY1_RATE2", + type: "N", + size: 8, + decimalPlaces: 4, + }, + { + name: "TY1_SUR2", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY1_TIER3", + type: "N", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY1_THRES3", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY1_RATE3", + type: "N", + size: 8, + decimalPlaces: 4, + }, + { + name: "TY1_SUR3", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY1_TIER4", + type: "N", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY1_THRES4", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY1_RATE4", + type: "N", + size: 8, + decimalPlaces: 4, + }, + { + name: "TY1_SUR4", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY1_TIER5", + type: "N", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY1_THRES5", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY1_RATE5", + type: "N", + size: 8, + decimalPlaces: 4, + }, + { + name: "TY1_SUR5", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TAX_TYPE2", + type: "C", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY2_TIER1", + type: "N", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY2_THRES1", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY2_RATE1", + type: "N", + size: 8, + decimalPlaces: 4, + }, + { + name: "TY2_SUR1", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY2_TIER2", + type: "N", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY2_THRES2", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY2_RATE2", + type: "N", + size: 8, + decimalPlaces: 4, + }, + { + name: "TY2_SUR2", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY2_TIER3", + type: "N", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY2_THRES3", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY2_RATE3", + type: "N", + size: 8, + decimalPlaces: 4, + }, + { + name: "TY2_SUR3", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY2_TIER4", + type: "N", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY2_THRES4", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY2_RATE4", + type: "N", + size: 8, + decimalPlaces: 4, + }, + { + name: "TY2_SUR4", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY2_TIER5", + type: "N", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY2_THRES5", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY2_RATE5", + type: "N", + size: 8, + decimalPlaces: 4, + }, + { + name: "TY2_SUR5", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TAX_TYPE3", + type: "C", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY3_TIER1", + type: "N", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY3_THRES1", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY3_RATE1", + type: "N", + size: 8, + decimalPlaces: 4, + }, + { + name: "TY3_SUR1", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY3_TIER2", + type: "N", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY3_THRES2", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY3_RATE2", + type: "N", + size: 8, + decimalPlaces: 4, + }, + { + name: "TY3_SUR2", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY3_TIER3", + type: "N", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY3_THRES3", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY3_RATE3", + type: "N", + size: 8, + decimalPlaces: 4, + }, + { + name: "TY3_SUR3", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY3_TIER4", + type: "N", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY3_THRES4", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY3_RATE4", + type: "N", + size: 8, + decimalPlaces: 4, + }, + { + name: "TY3_SUR4", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY3_TIER5", + type: "N", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY3_THRES5", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY3_RATE5", + type: "N", + size: 8, + decimalPlaces: 4, + }, + { + name: "TY3_SUR5", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TAX_TYPE4", + type: "C", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY4_TIER1", + type: "N", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY4_THRES1", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY4_RATE1", + type: "N", + size: 8, + decimalPlaces: 4, + }, + { + name: "TY4_SUR1", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY4_TIER2", + type: "N", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY4_THRES2", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY4_RATE2", + type: "N", + size: 8, + decimalPlaces: 4, + }, + { + name: "TY4_SUR2", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY4_TIER3", + type: "N", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY4_THRES3", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY4_RATE3", + type: "N", + size: 8, + decimalPlaces: 4, + }, + { + name: "TY4_SUR3", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY4_TIER4", + type: "N", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY4_THRES4", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY4_RATE4", + type: "N", + size: 8, + decimalPlaces: 4, + }, + { + name: "TY4_SUR4", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY4_TIER5", + type: "N", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY4_THRES5", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY4_RATE5", + type: "N", + size: 8, + decimalPlaces: 4, + }, + { + name: "TY4_SUR5", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TAX_TYPE5", + type: "C", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY5_TIER1", + type: "N", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY5_THRES1", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY5_RATE1", + type: "N", + size: 8, + decimalPlaces: 4, + }, + { + name: "TY5_SUR1", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY5_TIER2", + type: "N", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY5_THRES2", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY5_RATE2", + type: "N", + size: 8, + decimalPlaces: 4, + }, + { + name: "TY5_SUR2", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY5_TIER3", + type: "N", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY5_THRES3", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY5_RATE3", + type: "N", + size: 8, + decimalPlaces: 4, + }, + { + name: "TY5_SUR3", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY5_TIER4", + type: "N", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY5_THRES4", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY5_RATE4", + type: "N", + size: 8, + decimalPlaces: 4, + }, + { + name: "TY5_SUR4", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY5_TIER5", + type: "N", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY5_THRES5", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY5_RATE5", + type: "N", + size: 8, + decimalPlaces: 4, + }, + { + name: "TY5_SUR5", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TAX_TYPE6", + type: "C", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY6_TIER1", + type: "N", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY6_THRES1", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY6_RATE1", + type: "N", + size: 8, + decimalPlaces: 4, + }, + { + name: "TY6_SUR1", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY6_TIER2", + type: "N", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY6_THRES2", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY6_RATE2", + type: "N", + size: 8, + decimalPlaces: 4, + }, + { + name: "TY6_SUR2", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY6_TIER3", + type: "N", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY6_THRES3", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY6_RATE3", + type: "N", + size: 8, + decimalPlaces: 4, + }, + { + name: "TY6_SUR3", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY6_TIER4", + type: "N", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY6_THRES4", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY6_RATE4", + type: "N", + size: 8, + decimalPlaces: 4, + }, + { + name: "TY6_SUR4", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY6_TIER5", + type: "N", + size: 2, + decimalPlaces: 0, + }, + { + name: "TY6_THRES5", + type: "N", + size: 7, + decimalPlaces: 2, + }, + { + name: "TY6_RATE5", + type: "N", + size: 8, + decimalPlaces: 4, + }, + { + name: "TY6_SUR5", + type: "N", + size: 7, + decimalPlaces: 2, + }, +]; diff --git a/src/main/util/ems-interface/fielddescriptors/stl-field-descriptors.ts b/src/main/util/ems-interface/fielddescriptors/stl-field-descriptors.ts new file mode 100644 index 0000000..7cfe201 --- /dev/null +++ b/src/main/util/ems-interface/fielddescriptors/stl-field-descriptors.ts @@ -0,0 +1,112 @@ +import { FieldDescriptor } from "dbffile"; + +export const stlFieldLineDescriptors: FieldDescriptor[] = [ + { + name: "TTL_TYPE", + type: "C", + size: 4, + decimalPlaces: 0, + }, + { + name: "TTL_TYPECD", + type: "C", + size: 4, + decimalPlaces: 0, + }, + { + name: "T_AMT", + type: "N", + size: 9, + decimalPlaces: 2, + }, + { + name: "T_HRS", + type: "N", + size: 5, + decimalPlaces: 1, + }, + { + name: "T_ADDLBR", + type: "N", + size: 9, + decimalPlaces: 2, + }, + { + name: "T_DISCAMT", + type: "N", + size: 9, + decimalPlaces: 2, + }, + { + name: "T_MKUPAMT", + type: "N", + size: 9, + decimalPlaces: 2, + }, + { + name: "T_GDISCAMT", + type: "N", + size: 9, + decimalPlaces: 2, + }, + { + name: "TAX_AMT", + type: "N", + size: 9, + decimalPlaces: 2, + }, + { + name: "NT_AMT", + type: "N", + size: 9, + decimalPlaces: 2, + }, + { + name: "NT_HRS", + type: "N", + size: 5, + decimalPlaces: 1, + }, + { + name: "NT_ADDLBR", + type: "N", + size: 9, + decimalPlaces: 2, + }, + { + name: "NT_DISC", + type: "N", + size: 9, + decimalPlaces: 2, + }, + { + name: "NT_MKUP", + type: "N", + size: 9, + decimalPlaces: 2, + }, + { + name: "NT_GDIS", + type: "N", + size: 9, + decimalPlaces: 2, + }, + { + name: "TTL_TYPAMT", + type: "N", + size: 9, + decimalPlaces: 2, + }, + { + name: "TTL_HRS", + type: "N", + size: 5, + decimalPlaces: 1, + }, + { + name: "TTL_AMT", + type: "N", + size: 9, + decimalPlaces: 2, + }, +]; diff --git a/src/main/util/ems-interface/fielddescriptors/ttl-field-descriptors.ts b/src/main/util/ems-interface/fielddescriptors/ttl-field-descriptors.ts new file mode 100644 index 0000000..e69d65b --- /dev/null +++ b/src/main/util/ems-interface/fielddescriptors/ttl-field-descriptors.ts @@ -0,0 +1,88 @@ +import { FieldDescriptor } from "dbffile"; + +export const ttlFieldLineDescriptors: FieldDescriptor[] = [ + { + name: "G_TTL_AMT", + type: "N", + size: 10, + decimalPlaces: 2, + }, + { + name: "G_BETT_AMT", + type: "N", + size: 10, + decimalPlaces: 2, + }, + { + name: "G_RPD_AMT", + type: "N", + size: 10, + decimalPlaces: 2, + }, + { + name: "G_DED_AMT", + type: "N", + size: 10, + decimalPlaces: 2, + }, + { + name: "G_CUST_AMT", + type: "N", + size: 10, + decimalPlaces: 2, + }, + { + name: "G_AA_AMT", + type: "N", + size: 10, + decimalPlaces: 2, + }, + { + name: "N_TTL_AMT", + type: "N", + size: 10, + decimalPlaces: 2, + }, + { + name: "PREV_NET", + type: "N", + size: 10, + decimalPlaces: 2, + }, + { + name: "SUPP_AMT", + type: "N", + size: 10, + decimalPlaces: 2, + }, + { + name: "N_SUPP_ANT", + type: "N", + size: 10, + decimalPlaces: 2, + }, + { + name: "G_UPD_AMT", + type: "N", + size: 10, + decimalPlaces: 2, + }, + { + name: "G_TTL_DISC", + type: "N", + size: 10, + decimalPlaces: 2, + }, + { + name: "G_TAX", + type: "N", + size: 10, + decimalPlaces: 2, + }, + { + name: "GST_AMT", + type: "N", + size: 10, + decimalPlaces: 2, + }, +];