using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using DotNetDBF; using Newtonsoft.Json.Linq; namespace BodyshopPartner.Utils { public static class OEConnection { private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); private static string workingDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); private static string emsBasePath = workingDirectory + @"\EmsBase"; private static string TempEmsDir = Properties.Settings.Default.EmsExportPath; private static Encoding DbfFileCharEncoding = Encoding.ASCII; private static byte DbfFileSignature = DBFSignature.DBase3; //DBFSignature.WithMemo; private static byte DbfFileLanguageDriver = 0; //0x37; public static void SendToOEConnection(dynamic PartsOrder) { Directory.CreateDirectory(TempEmsDir); GenerateAd1File(PartsOrder.job); GenerateAd2File(PartsOrder.job); GenerateVehFile(PartsOrder.job); GenerateLinFile(PartsOrder.job, PartsOrder); GeneratePfhFile(PartsOrder.job); GeneratePflFile(PartsOrder.job); GeneratePfmFile(PartsOrder.job); GeneratePfoFile(PartsOrder.job); GeneratePfpFile(PartsOrder.job); GeneratePftFile(PartsOrder.job); GenerateStlFile(PartsOrder.job); GenerateTtlFile(PartsOrder.job); GenerateEnvFile(PartsOrder.job); logger.Debug("All files created."); } public static DBFField[] ReadDbfFields(string dbfFilePath) { using (var blankEmsFileStream = File.Open(dbfFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { using (var reader = new DBFReader(blankEmsFileStream)) { return reader.Fields; } } } public static string GetSupplementNumber(dynamic Job) { //*** TODO return "1"; } public static string GenerateFileName(dynamic Job) { return Job.ciecaid?.Value; //if (string.IsNullOrEmpty(Job.clm_no?.Value)) { return Job.ro_number?.Value; } //return Job.clm_no; } public static void GenerateAd1File(dynamic Job) { try { DBFField[] StandardEmsFields = ReadDbfFields(emsBasePath + @"\EMSA.AD1"); using (var fileStream = File.Create(TempEmsDir + $@"\{GenerateFileName(Job)}.AD1")) { using (var writer = new DBFWriter()) { writer.CharEncoding = DbfFileCharEncoding; writer.Signature = DbfFileSignature; writer.LanguageDriver = DbfFileLanguageDriver; writer.Fields = StandardEmsFields; writer.Fields[20] = new DBFField("INS_MEMO", NativeDbType.Char, 20); writer.Fields[53] = new DBFField("PAY_MEMO", NativeDbType.Char, 20); writer.Fields[81] = new DBFField("LOSS_MEMO", NativeDbType.Char, 20); writer.AddRecord( Job.ins_co_nm?.Value, //Ins CO ID Job.ins_co_nm?.Value, Job.ins_addr1?.Value, Job.ins_addr2?.Value, Job.ins_city?.Value, Job.ins_st?.Value, Job.ins_zip?.Value, Job.ins_ctry?.Value, Job.ins_ph1?.Value, Job.ins_ph1x?.Value, Job.ins_ph2?.Value, Job.ins_ph2x?.Value, Job.ins_fax?.Value, Job.ins_faxx?.Value, Job.ins_ct_ln?.Value, Job.ins_ct_fn?.Value, Job.ins_title?.Value, Job.ins_ct_ph?.Value, Job.ins_ct_phx?.Value, Job.ins_ea?.Value, Job.ins_memo?.Value, Job.policy_no?.Value, Job.ded_amt?.Value, Job.ded_status?.Value, Job.asgn_no?.Value, string.IsNullOrEmpty(Job.asgn_date?.Value) ? null : DateTime.Parse(Job.asgn_date?.Value), Job.asgn_type?.Value, Job.clm_no?.Value, Job.clm_ofc_id?.Value, Job.clm_ofc_nm?.Value, Job.clm_addr1?.Value, Job.clm_addr2?.Value, Job.clm_city?.Value, Job.clm_st?.Value, Job.clm_zip?.Value, Job.clm_ctry?.Value, Job.clm_ph1?.Value, Job.clm_ph1x?.Value, Job.clm_ph2?.Value, Job.clm_ph2x?.Value, Job.clm_fax?.Value, Job.clm_faxx?.Value, Job.clm_ct_ln?.Value, Job.clm_ct_fn?.Value, Job.clm_title?.Value, Job.clm_ct_ph?.Value, Job.clm_ct_phx?.Value, Job.clm_ea?.Value, Job.payee_nms?.Value, Job.pay_type?.Value, Job.pay_date?.Value, null,//Job.pay_chknm?.Value, null,//Job.pay_amt?.Value, Job.pay_memo?.Value, Job.agt_co_id?.Value, Job.agt_co_nm?.Value, Job.agt_addr1?.Value, Job.agt_addr2?.Value, Job.agt_city?.Value, Job.agt_st?.Value, Job.agt_zip?.Value, Job.agt_ctry?.Value, Job.agt_ph1?.Value, Job.agt_ph1x?.Value, Job.agt_ph2?.Value, Job.agt_ph2x?.Value, Job.agt_fax?.Value, Job.agt_faxx?.Value, Job.agt_ct_ln?.Value, Job.agt_ct_fn?.Value, Job.agt_ct_ph?.Value, Job.agt_ct_phx?.Value, Job.agt_ea?.Value, Job.agt_lic_no?.Value, string.IsNullOrEmpty(Job.loss_date?.Value) ? null : DateTime.Parse(Job.loss_date?.Value), null,//Job.loss_cat?.Value, null,//Job.loss_type?.Value, Job.loss_desc?.Value, null,//Job.theft_ind?.Value, Job.cat_no?.Value, null, //Job.tlos_ind?.Value, Job.loss_memo?.Value, Job.cust_pr?.Value, Job.insd_ln?.Value, Job.insd_fn?.Value, Job.insd_title?.Value, Job.insd_co_nm?.Value, Job.insd_addr1?.Value, Job.insd_addr2?.Value, Job.insd_city?.Value, Job.insd_st?.Value, Job.insd_zip?.Value, Job.insd_ctry?.Value, Job.insd_ph1?.Value, Job.insd_ph1x?.Value, Job.insd_ph2?.Value, Job.insd_ph2x?.Value, Job.insd_fax?.Value, Job.insd_faxx?.Value, Job.insd_ea?.Value, Job.ownr_ln?.Value, Job.ownr_fn?.Value, Job.ownr_title?.Value, Job.ownr_co_nm?.Value, Job.ownr_addr1?.Value, Job.ownr_addr2?.Value, Job.ownr_city?.Value, Job.ownr_st?.Value, Job.ownr_zip?.Value, Job.ownr_ctry?.Value, Job.ownr_ph1?.Value, Job.ownr_ph1x?.Value, Job.ownr_ph2?.Value, Job.ownr_ph2x?.Value, Job.ownr_fax?.Value, Job.ownr_faxx?.Value, Job.ownr_ea.Value ); ; writer.Write(fileStream); } } } catch (Exception ex) { logger.Error(ex, "Error when creating AD1 file."); throw ex; } } public static void GenerateAd2File(dynamic Job) { try { DBFField[] StandardEmsFields = ReadDbfFields(emsBasePath + @"\EMSB.AD2"); using (var fileStream = File.Create(TempEmsDir + $@"\{GenerateFileName(Job)}.AD2")) { using (var writer = new DBFWriter()) { writer.CharEncoding = DbfFileCharEncoding; writer.Signature = DbfFileSignature; writer.LanguageDriver = DbfFileLanguageDriver; writer.Fields = StandardEmsFields; writer.Fields[77] = new DBFField("RO_AUTH", NativeDbType.Char, 20); writer.AddRecord( Job.clmt_ln?.Value, Job.clmt_fn?.Value, Job.clmt_title?.Value, Job.clmt_co_nm?.Value, Job.clmt_addr1?.Value, Job.clmt_addr2?.Value, Job.clmt_city?.Value, Job.clmt_st?.Value, Job.clmt_zip?.Value, Job.clmt_ctry?.Value, Job.clmt_ph1?.Value, Job.clmt_ph1x?.Value, Job.clmt_ph2?.Value, Job.clmt_ph2x?.Value, Job.clmt_fax?.Value, Job.clmt_faxx?.Value, Job.clmt_ea?.Value, Job.est_co_id?.Value, Job.est_co_nm?.Value, Job.est_addr1?.Value, Job.est_addr2?.Value, Job.est_city?.Value, Job.est_st?.Value, Job.est_zip?.Value, Job.est_ctry?.Value, Job.est_ph1?.Value, Job.est_ph1x?.Value, Job.est_ph2?.Value, Job.est_ph2x?.Value, Job.est_fax?.Value, Job.est_faxx?.Value, Job.est_ct_ln?.Value, Job.est_ct_fn?.Value, Job.est_ea?.Value, Job.est_lic_no?.Value, Job.est_fileno?.Value, Job.insp_ct_ln?.Value, Job.insp_ct_fn?.Value, Job.insp_addr1?.Value, Job.insp_addr2?.Value, Job.insp_city?.Value, Job.insp_st?.Value, Job.insp_zip?.Value, Job.insp_ctry?.Value, Job.insp_ph1?.Value, Job.insp_ph1x?.Value, Job.insp_ph2?.Value, Job.insp_ph2x?.Value, Job.insp_fax?.Value, Job.insp_faxx?.Value, Job.insp_ea?.Value, Job.insp_code?.Value, Job.insp_desc?.Value, Job.insp_date?.Value, Job.insp_time?.Value, Job.rf_co_id?.Value, "B&M Autocraft", //Job.rf_co_nm?.Value, Job.rf_addr1?.Value, Job.rf_addr2?.Value, Job.rf_city?.Value, Job.rf_st?.Value, Job.rf_zip?.Value, Job.rf_ctry?.Value, Job.rf_ph1?.Value, Job.rf_ph1x?.Value, Job.rf_ph2?.Value, Job.rf_ph2x?.Value, Job.rf_fax?.Value, Job.rf_faxx?.Value, Job.rf_ct_ln?.Value, Job.rf_ct_fn?.Value, Job.rf_ea?.Value, Job.rf_tax_id?.Value, Job.rf_lic_no?.Value, Job.rf_bar_no?.Value, Job.ro_in_date?.Value, Job.ro_in_time?.Value, Job.ro_auth?.Value,// Job.tar_date?.Value, Job.tar_time?.Value, Job.ro_cmpdate?.Value, Job.ro_cmptime?.Value, Job.date_out?.Value, Job.time_out?.Value, Job.rf_estimtr?.Value, Job.mktg_type?.Value, Job.mktg_src?.Value, Job.loc_nm?.Value, Job.loc_addr1?.Value, Job.loc_addr2?.Value, Job.loc_city?.Value, Job.loc_st?.Value, Job.loc_zip?.Value, Job.loc_ctry?.Value, Job.loc_ph1?.Value, Job.loc_ph1x?.Value, Job.loc_ph2?.Value, Job.loc_ph2x?.Value, Job.loc_fax?.Value, Job.loc_faxx?.Value, Job.loc_ct_ln?.Value, Job.loc_ct_fn?.Value, Job.loc_title?.Value, Job.loc_ph?.Value, Job.loc_phx?.Value, Job.loc_ea?.Value ); ; writer.Write(fileStream); } } } catch (Exception ex) { logger.Error(ex, "Error when creating AD2 file."); throw ex; } } public static void GenerateLinFile(dynamic Job, dynamic PartsOrder) { try { DBFField[] StandardEmsFields = ReadDbfFields(emsBasePath + @"\EMS.LIN"); using (var fileStream = File.Create(TempEmsDir + $@"\{GenerateFileName(Job)}.LIN")) { using (var writer = new DBFWriter()) { writer.CharEncoding = DbfFileCharEncoding; writer.Signature = DbfFileSignature; writer.LanguageDriver = DbfFileLanguageDriver; writer.Fields = StandardEmsFields; foreach (var partsOrderLine in PartsOrder.parts_order_lines) { writer.AddRecord( partsOrderLine.jobline?.line_no?.Value, partsOrderLine.jobline?.line_ind?.Value, partsOrderLine.jobline?.line_ref?.Value, partsOrderLine.jobline?.tran_code?.Value ?? "1", partsOrderLine.jobline?.db_ref?.Value, partsOrderLine.jobline?.unq_seq?.Value, partsOrderLine.jobline?.who_pays?.Value, partsOrderLine.jobline?.line_desc?.Value, partsOrderLine.jobline?.part_type?.Value, false, //partsOrderLine.jobline?.part_descj?.Value, partsOrderLine.jobline?.glass_flag?.Value, partsOrderLine.jobline?.oem_partno?.Value, partsOrderLine.jobline?.price_inc?.Value, partsOrderLine.jobline?.alt_part_i?.Value, partsOrderLine.jobline?.tax_part?.Value, partsOrderLine.jobline?.db_price?.Value, partsOrderLine.priceChange?.Value == true? partsOrderLine.act_price?.Value : partsOrderLine.jobline?.act_price?.Value, partsOrderLine.jobline?.price_j?.Value, partsOrderLine.jobline?.cert_part?.Value, partsOrderLine.jobline?.part_qty?.Value, partsOrderLine.jobline?.alt_co_id?.Value, partsOrderLine.jobline?.alt_partno?.Value, partsOrderLine.jobline?.alt_overrd?.Value, partsOrderLine.jobline?.alt_partm?.Value, partsOrderLine.jobline?.prt_dsmk_p?.Value, partsOrderLine.jobline?.prt_dsmk_m?.Value, partsOrderLine.jobline?.mod_lbr_ty?.Value, partsOrderLine.jobline?.db_hrs?.Value, partsOrderLine.jobline?.mod_lb_hrs?.Value, partsOrderLine.jobline?.lbr_inc?.Value, partsOrderLine.jobline?.lbr_op?.Value, partsOrderLine.jobline?.lbr_hrs_j?.Value, partsOrderLine.jobline?.lbr_typ_j?.Value, partsOrderLine.jobline?.lbr_op_j?.Value, partsOrderLine.jobline?.paint_stg?.Value, partsOrderLine.jobline?.paint_tone?.Value, partsOrderLine.jobline?.lbr_tax?.Value, partsOrderLine.jobline?.lbr_amt?.Value, partsOrderLine.jobline?.misc_amt?.Value, partsOrderLine.jobline?.misc_sublt?.Value, partsOrderLine.jobline?.misc_tax?.Value, partsOrderLine.jobline?.bett_type?.Value, partsOrderLine.jobline?.bett_pctg?.Value, partsOrderLine.jobline?.bett_amt?.Value, partsOrderLine.jobline?.bett_tax?.Value ); ; } writer.Write(fileStream); } } } catch (Exception ex) { logger.Error(ex, "Error when creating LIN file."); throw ex; } } public static void GenerateEnvFile(dynamic Job) { try { DBFField[] StandardEmsFields = ReadDbfFields(emsBasePath + @"\EMS.ENV"); using (var fileStream = File.Create(TempEmsDir + $@"\{GenerateFileName(Job)}.ENV")) { using (var writer = new DBFWriter()) { writer.CharEncoding = DbfFileCharEncoding; writer.Signature = DbfFileSignature; writer.LanguageDriver = DbfFileLanguageDriver; writer.Fields = StandardEmsFields; writer.AddRecord( "M",//EST_SYSTEM, "UM7.1",//"21.3",//SW_VERSION, "MAY_17_V0607",//"OCT_21_V",//DB_VERSION, DateTime.Now,//DB_DATE "",//UNQFILE_ID, Job.ro_number?.Value,//RO_ID, Job.ciecaid?.Value,//ESTFILE_ID, GetSupplementNumber(Job),//SUPP_NO, "CAN", //EST_CTRY, ";0000000;0;0000000;0;0000000;",//TOP_SECRET, "",//H_TRANS_ID, "",//H_CTRL_NO, "S",//TRANS_TYPE, false,//STATUS, DateTime.Now,//CREATE_DT, DateTime.Now.ToString("HHmmss"),//CREATE_TM, DateTime.Now,//TRANSMT_DT, DateTime.Now.ToString("HHmmss"),//TRANSMT_TM, true,//INCL_ADMIN, true,//INCL_VEH, true,//INCL_EST, true,//INCL_PROFL, true,//INCL_TOTAL, false,//INCL_VENDR, "2.0"//EMS_VER, ); ; writer.Write(fileStream); } } } catch (Exception ex) { logger.Error(ex, "Error when creating ENV file."); throw ex; } } public static void GenerateVehFile(dynamic Job) { try { DBFField[] StandardEmsFields = ReadDbfFields(emsBasePath + @"\EMSV.VEH"); using (var fileStream = File.Create(TempEmsDir + $@"\{GenerateFileName(Job)}.VEH")) { using (var writer = new DBFWriter()) { writer.CharEncoding = DbfFileCharEncoding; writer.Signature = DbfFileSignature; writer.LanguageDriver = DbfFileLanguageDriver; writer.Fields = StandardEmsFields; writer.Fields[2] = new DBFField("DMG_MEMO", NativeDbType.Char, 20); writer.Fields[20] = new DBFField("V_OPTIONS", NativeDbType.Char, 20); writer.Fields[27] = new DBFField("V_MEMO", NativeDbType.Char, 20); writer.AddRecord( Job.area_of_impact?.impact_1?.Value,//IMPACT_1, Job.area_of_impact?.impact_2?.Value,//IMPACT_2, null,//DMG_MEMO, "",//DB_V_CODE, Job.plate_no?.Value,//PLATE_NO, Job.plate_st?.Value,//PLATE_ST, Job.v_vin?.Value,//V_VIN, "",//V_COND, "",//V_PROD_DT, Job.v_model_yr?.Value,//V_MODEL_YR, "",//V_MAKECODE, Job.v_make_desc?.Value,//V_MAKEDESC, Job.v_model_desc?.Value,//V_MODEL, Job.vehicle?.v_type?.Value,//V_TYPE, Job.vehicle?.v_bstyle?.Value,//V_BSTYLE, Job.vehicle?.v_trimcode?.Value,//V_TRIMCODE, Job.vehicle?.trim_color?.Value,//TRIM_COLOR, Job.vehicle?.v_mldgcode?.Value,//V_MLDGCODE, Job.vehicle?.v_engine?.Value,//V_ENGINE, Job.vehicle?.v_mileage?.Value,//V_MILEAGE, Job.vehicle?.v_options?.Value,//V_OPTIONS, Job.vehicle?.v_color?.Value,//V_COLOR, Job.vehicle?.v_tone?.Value,//V_TONE, Job.vehicle?.v_stage?.Value,//V_STAGE, Job.vehicle?.v_paint_codes?.paint_cd1?.Value,//PAINT_CD1, Job.vehicle?.v_paint_codes?.paint_cd2?.Value,//PAINT_CD2, Job.vehicle?.v_paint_codes?.paint_cd3?.Value,//PAINT_CD3, Job.vehicle?.v_memo?.Value//V_MEMO, ); ; writer.Write(fileStream); } } } catch (Exception ex) { logger.Error(ex, "Error when creating Veh file."); throw ex; } } public static void GeneratePfhFile(dynamic Job) { try { DBFField[] StandardEmsFields = ReadDbfFields(emsBasePath + @"\EMS.PFH"); using (var fileStream = File.Create(TempEmsDir + $@"\{GenerateFileName(Job)}.PFH")) { using (var writer = new DBFWriter()) { writer.CharEncoding = DbfFileCharEncoding; writer.Signature = DbfFileSignature; writer.LanguageDriver = DbfFileLanguageDriver; writer.Fields = StandardEmsFields; writer.AddRecord( "REPAIR FACILITY",//Job.id_pro_nam?.Value, (Job.tax_prethr?.Value ?? 0) * 100, (Job.tax_thramt?.Value ?? 0) * 100, (Job.tax_pstthr?.Value ?? 0) * 100, true,//(Job.tax_tow_in?.Value ?? 0) * 100, (Job.tax_tow_rt?.Value ?? 0) * 100, true,//(Job.tax_str_in?.Value ?? 0) * 100, (Job.tax_str_rt?.Value ?? 0) * 100, true,//(Job.tax_sub_in?.Value ?? 0) * 100, (Job.tax_sub_rt?.Value ?? 0) * 100, true,//(Job.tax_btr_in?.Value ?? 0) * 100, (Job.bodyshop?.bill_tax_rates?.state_tax_rate?.Value ?? 0) * 100, (Job.bodyshop?.bill_tax_rates?.federal_tax_rate?.Value ?? 0) * 100, true,//(Job.tax_gst_in?.Value ?? 0) * 100, (Job.adj_g_disc?.Value ?? 0) * 100, (Job.adj_towdis?.Value ?? 0) * 100, (Job.adj_strdis?.Value ?? 0) * 100, null, //(Job.adj_btr_in?.Value ?? 0) * 100, (Job.tax_predis?.Value ?? 0) * 100 ); ; writer.Write(fileStream); } } } catch (Exception ex) { logger.Error(ex, "Error when creating PFH file."); throw ex; } } public static void GeneratePflFile(dynamic Job) { try { DBFField[] StandardEmsFields = ReadDbfFields(emsBasePath + @"\EMS.PFL"); using (var fileStream = File.Create(TempEmsDir + $@"\{GenerateFileName(Job)}.PFL")) { using (var writer = new DBFWriter()) { writer.CharEncoding = DbfFileCharEncoding; writer.Signature = DbfFileSignature; writer.LanguageDriver = DbfFileLanguageDriver; writer.Fields = StandardEmsFields; writer.AddRecord( "LAB", //LBR_TYPE "LABOR-BODY", //LBR_DESC Job.rate_lab?.Value, //LBR_RATE true, //LBR_TAX_IN (Job.bodyshop?.bill_tax_rates?.state_tax_rate?.Value ?? 0), //LBR_TAXP 0, //LBR_ADJP Job.lbr_tx_ty1?.Value, //LBR_TX_TY1 Job.lbr_tx_in1?.Value, //LBR_TX_IN1 Job.lbr_tx_ty2?.Value, //LBR_TX_TY2 Job.lbr_tx_in2?.Value, //LBR_TX_IN2 Job.lbr_tx_ty3?.Value, //LBR_TX_TY3 Job.lbr_tx_in3?.Value, //LBR_TX_IN3 Job.lbr_tx_ty4?.Value, //LBR_TX_TY4 Job.lbr_tx_in4?.Value, //LBR_TX_IN4 Job.lbr_tx_ty5?.Value, //LBR_TX_TY5 Job.lbr_tx_in5?.Value //LBR_TX_IN5 ); ; writer.AddRecord( "LAS", //LBR_TYPE "LABOR-BODY_S", //LBR_DESC Job.rate_las?.Value, //LBR_RATE true, //LBR_TAX_IN (Job.bodyshop?.bill_tax_rates?.state_tax_rate?.Value ?? 0), //LBR_TAXP 0, //LBR_ADJP Job.lbr_tx_ty1?.Value, //LBR_TX_TY1 Job.lbr_tx_in1?.Value, //LBR_TX_IN1 Job.lbr_tx_ty2?.Value, //LBR_TX_TY2 Job.lbr_tx_in2?.Value, //LBR_TX_IN2 Job.lbr_tx_ty3?.Value, //LBR_TX_TY3 Job.lbr_tx_in3?.Value, //LBR_TX_IN3 Job.lbr_tx_ty4?.Value, //LBR_TX_TY4 Job.lbr_tx_in4?.Value, //LBR_TX_IN4 Job.lbr_tx_ty5?.Value, //LBR_TX_TY5 Job.lbr_tx_in5?.Value //LBR_TX_IN5 ); ; writer.AddRecord( "LAR", //LBR_TYPE "LABOR-REFINISH", //LBR_DESC Job.rate_lar?.Value, //LBR_RATE true, //LBR_TAX_IN (Job.bodyshop?.bill_tax_rates?.state_tax_rate?.Value ?? 0), //LBR_TAXP 0, //LBR_ADJP Job.lbr_tx_ty1?.Value, //LBR_TX_TY1 Job.lbr_tx_in1?.Value, //LBR_TX_IN1 Job.lbr_tx_ty2?.Value, //LBR_TX_TY2 Job.lbr_tx_in2?.Value, //LBR_TX_IN2 Job.lbr_tx_ty3?.Value, //LBR_TX_TY3 Job.lbr_tx_in3?.Value, //LBR_TX_IN3 Job.lbr_tx_ty4?.Value, //LBR_TX_TY4 Job.lbr_tx_in4?.Value, //LBR_TX_IN4 Job.lbr_tx_ty5?.Value, //LBR_TX_TY5 Job.lbr_tx_in5?.Value //LBR_TX_IN5 ); ; writer.AddRecord( "LAG", //LBR_TYPE "LABOR-GLASS", //LBR_DESC Job.rate_lag?.Value, //LBR_RATE true, //LBR_TAX_IN (Job.bodyshop?.bill_tax_rates?.state_tax_rate?.Value ?? 0), //LBR_TAXP 0, //LBR_ADJP Job.lbr_tx_ty1?.Value, //LBR_TX_TY1 Job.lbr_tx_in1?.Value, //LBR_TX_IN1 Job.lbr_tx_ty2?.Value, //LBR_TX_TY2 Job.lbr_tx_in2?.Value, //LBR_TX_IN2 Job.lbr_tx_ty3?.Value, //LBR_TX_TY3 Job.lbr_tx_in3?.Value, //LBR_TX_IN3 Job.lbr_tx_ty4?.Value, //LBR_TX_TY4 Job.lbr_tx_in4?.Value, //LBR_TX_IN4 Job.lbr_tx_ty5?.Value, //LBR_TX_TY5 Job.lbr_tx_in5?.Value //LBR_TX_IN5 ); ; writer.AddRecord( "LAF", //LBR_TYPE "LABOR-FRAME", //LBR_DESC Job.rate_laf?.Value, //LBR_RATE true, //LBR_TAX_IN (Job.bodyshop?.bill_tax_rates?.state_tax_rate?.Value ?? 0), //LBR_TAXP 0, //LBR_ADJP Job.lbr_tx_ty1?.Value, //LBR_TX_TY1 Job.lbr_tx_in1?.Value, //LBR_TX_IN1 Job.lbr_tx_ty2?.Value, //LBR_TX_TY2 Job.lbr_tx_in2?.Value, //LBR_TX_IN2 Job.lbr_tx_ty3?.Value, //LBR_TX_TY3 Job.lbr_tx_in3?.Value, //LBR_TX_IN3 Job.lbr_tx_ty4?.Value, //LBR_TX_TY4 Job.lbr_tx_in4?.Value, //LBR_TX_IN4 Job.lbr_tx_ty5?.Value, //LBR_TX_TY5 Job.lbr_tx_in5?.Value //LBR_TX_IN5 ); ; writer.AddRecord( "LAM", //LBR_TYPE "LABOR-MECHANICAL", //LBR_DESC Job.rate_lam?.Value, //LBR_RATE true, //LBR_TAX_IN (Job.bodyshop?.bill_tax_rates?.state_tax_rate?.Value ?? 0), //LBR_TAXP 0, //LBR_ADJP Job.lbr_tx_ty1?.Value, //LBR_TX_TY1 Job.lbr_tx_in1?.Value, //LBR_TX_IN1 Job.lbr_tx_ty2?.Value, //LBR_TX_TY2 Job.lbr_tx_in2?.Value, //LBR_TX_IN2 Job.lbr_tx_ty3?.Value, //LBR_TX_TY3 Job.lbr_tx_in3?.Value, //LBR_TX_IN3 Job.lbr_tx_ty4?.Value, //LBR_TX_TY4 Job.lbr_tx_in4?.Value, //LBR_TX_IN4 Job.lbr_tx_ty5?.Value, //LBR_TX_TY5 Job.lbr_tx_in5?.Value //LBR_TX_IN5 ); ; writer.AddRecord( "LAU", //LBR_TYPE "LABOR-PDR", //LBR_DESC Job.rate_lau?.Value, //LBR_RATE true, //LBR_TAX_IN (Job.bodyshop?.bill_tax_rates?.state_tax_rate?.Value ?? 0), //LBR_TAXP 0, //LBR_ADJP Job.lbr_tx_ty1?.Value, //LBR_TX_TY1 Job.lbr_tx_in1?.Value, //LBR_TX_IN1 Job.lbr_tx_ty2?.Value, //LBR_TX_TY2 Job.lbr_tx_in2?.Value, //LBR_TX_IN2 Job.lbr_tx_ty3?.Value, //LBR_TX_TY3 Job.lbr_tx_in3?.Value, //LBR_TX_IN3 Job.lbr_tx_ty4?.Value, //LBR_TX_TY4 Job.lbr_tx_in4?.Value, //LBR_TX_IN4 Job.lbr_tx_ty5?.Value, //LBR_TX_TY5 Job.lbr_tx_in5?.Value //LBR_TX_IN5 ); ; writer.AddRecord( "LA3", //LBR_TYPE "LABOR-ALUMINUM", //LBR_DESC Job.rate_la3?.Value, //LBR_RATE true, //LBR_TAX_IN (Job.bodyshop?.bill_tax_rates?.state_tax_rate?.Value ?? 0), //LBR_TAXP 0, //LBR_ADJP Job.lbr_tx_ty1?.Value, //LBR_TX_TY1 Job.lbr_tx_in1?.Value, //LBR_TX_IN1 Job.lbr_tx_ty2?.Value, //LBR_TX_TY2 Job.lbr_tx_in2?.Value, //LBR_TX_IN2 Job.lbr_tx_ty3?.Value, //LBR_TX_TY3 Job.lbr_tx_in3?.Value, //LBR_TX_IN3 Job.lbr_tx_ty4?.Value, //LBR_TX_TY4 Job.lbr_tx_in4?.Value, //LBR_TX_IN4 Job.lbr_tx_ty5?.Value, //LBR_TX_TY5 Job.lbr_tx_in5?.Value //LBR_TX_IN5 ); ; writer.AddRecord( "LA4", //LBR_TYPE "LABOR-CARBON FIBER", //LBR_DESC Job.rate_la4?.Value, //LBR_RATE true, //LBR_TAX_IN (Job.bodyshop?.bill_tax_rates?.state_tax_rate?.Value ?? 0), //LBR_TAXP 0, //LBR_ADJP Job.lbr_tx_ty1?.Value, //LBR_TX_TY1 Job.lbr_tx_in1?.Value, //LBR_TX_IN1 Job.lbr_tx_ty2?.Value, //LBR_TX_TY2 Job.lbr_tx_in2?.Value, //LBR_TX_IN2 Job.lbr_tx_ty3?.Value, //LBR_TX_TY3 Job.lbr_tx_in3?.Value, //LBR_TX_IN3 Job.lbr_tx_ty4?.Value, //LBR_TX_TY4 Job.lbr_tx_in4?.Value, //LBR_TX_IN4 Job.lbr_tx_ty5?.Value, //LBR_TX_TY5 Job.lbr_tx_in5?.Value //LBR_TX_IN5 ); ; writer.AddRecord( "LA1", //LBR_TYPE "LABOR-USER DEFINED 1", //LBR_DESC Job.rate_la1?.Value, //LBR_RATE true, //LBR_TAX_IN (Job.bodyshop?.bill_tax_rates?.state_tax_rate?.Value ?? 0), //LBR_TAXP 0, //LBR_ADJP Job.lbr_tx_ty1?.Value, //LBR_TX_TY1 Job.lbr_tx_in1?.Value, //LBR_TX_IN1 Job.lbr_tx_ty2?.Value, //LBR_TX_TY2 Job.lbr_tx_in2?.Value, //LBR_TX_IN2 Job.lbr_tx_ty3?.Value, //LBR_TX_TY3 Job.lbr_tx_in3?.Value, //LBR_TX_IN3 Job.lbr_tx_ty4?.Value, //LBR_TX_TY4 Job.lbr_tx_in4?.Value, //LBR_TX_IN4 Job.lbr_tx_ty5?.Value, //LBR_TX_TY5 Job.lbr_tx_in5?.Value //LBR_TX_IN5 ); ; writer.AddRecord( "LA2", //LBR_TYPE "LABOR-USER DEFINED 2", //LBR_DESC Job.rate_la2?.Value, //LBR_RATE true, //LBR_TAX_IN (Job.bodyshop?.bill_tax_rates?.state_tax_rate?.Value ?? 0), //LBR_TAXP 0, //LBR_ADJP Job.lbr_tx_ty1?.Value, //LBR_TX_TY1 Job.lbr_tx_in1?.Value, //LBR_TX_IN1 Job.lbr_tx_ty2?.Value, //LBR_TX_TY2 Job.lbr_tx_in2?.Value, //LBR_TX_IN2 Job.lbr_tx_ty3?.Value, //LBR_TX_TY3 Job.lbr_tx_in3?.Value, //LBR_TX_IN3 Job.lbr_tx_ty4?.Value, //LBR_TX_TY4 Job.lbr_tx_in4?.Value, //LBR_TX_IN4 Job.lbr_tx_ty5?.Value, //LBR_TX_TY5 Job.lbr_tx_in5?.Value //LBR_TX_IN5 ); ; writer.Write(fileStream); } } } catch (Exception ex) { logger.Error(ex, "Error when creating PFH file."); throw ex; } } public static void GeneratePfmFile(dynamic Job) { try { DBFField[] StandardEmsFields = ReadDbfFields(emsBasePath + @"\EMS.PFM"); using (var fileStream = File.Create(TempEmsDir + $@"\{GenerateFileName(Job)}.PFM")) { using (var writer = new DBFWriter()) { writer.CharEncoding = DbfFileCharEncoding; writer.Signature = DbfFileSignature; writer.LanguageDriver = DbfFileLanguageDriver; writer.Fields = StandardEmsFields; writer.AddRecord( "MAPA", //MATL_TYPE Job.CAL_CODE?.Value, //CAL_CODE Job.CAL_DESC?.Value, //CAL_DESC 0, //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 Job.rate_mapa?.Value, //CAL_LBRRTE Job.CAL_OPCODE?.Value, //CAL_OPCODE true, //TAX_IND Job.bodyshop?.bill_tax_rates?.state_tax_rate.Value ?? 0, //MAT_TAXP Job.MAT_ADJP?.Value ?? 0, //MAT_ADJP Job.MAT_TX_TY1?.Value, //MAT_TX_TY1 Job.MAT_TX_IN1?.Value, //MAT_TX_IN1 Job.MAT_TX_TY2?.Value, //MAT_TX_TY2 Job.MAT_TX_IN2?.Value, //MAT_TX_IN2 Job.MAT_TX_TY3?.Value, //MAT_TX_TY3 Job.MAT_TX_IN3?.Value, //MAT_TX_IN3 Job.MAT_TX_TY4?.Value, //MAT_TX_TY4 Job.MAT_TX_IN4?.Value, //MAT_TX_IN4 Job.MAT_TX_TY5?.Value, //MAT_TX_TY5 Job.MAT_TX_IN5?.Value //MAT_TX_IN5 ); ; writer.AddRecord( "MASH", //MATL_TYPE Job.CAL_CODE?.Value, //CAL_CODE Job.CAL_DESC?.Value, //CAL_DESC 0, //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 Job.rate_mash?.Value, //CAL_LBRRTE Job.CAL_OPCODE?.Value, //CAL_OPCODE true, //TAX_IND Job.MAT_TAXP?.Value, //MAT_TAXP Job.MAT_ADJP?.Value, //MAT_ADJP Job.MAT_TX_TY1?.Value, //MAT_TX_TY1 Job.MAT_TX_IN1?.Value, //MAT_TX_IN1 Job.MAT_TX_TY2?.Value, //MAT_TX_TY2 Job.MAT_TX_IN2?.Value, //MAT_TX_IN2 Job.MAT_TX_TY3?.Value, //MAT_TX_TY3 Job.MAT_TX_IN3?.Value, //MAT_TX_IN3 Job.MAT_TX_TY4?.Value, //MAT_TX_TY4 Job.MAT_TX_IN4?.Value, //MAT_TX_IN4 Job.MAT_TX_TY5?.Value, //MAT_TX_TY5 Job.MAT_TX_IN5?.Value //MAT_TX_IN5 ); ; writer.Write(fileStream); } } } catch (Exception ex) { logger.Error(ex, "Error when creating PFM file."); throw ex; } } public static void GeneratePfoFile(dynamic Job) { try { DBFField[] StandardEmsFields = ReadDbfFields(emsBasePath + @"\EMS.PFO"); using (var fileStream = File.Create(TempEmsDir + $@"\{GenerateFileName(Job)}.PFO")) { using (var writer = new DBFWriter()) { writer.CharEncoding = DbfFileCharEncoding; writer.Signature = DbfFileSignature; writer.LanguageDriver = DbfFileLanguageDriver; writer.Fields = StandardEmsFields; writer.Write(fileStream); } } } catch (Exception ex) { logger.Error(ex, "Error when creating PFO file."); throw ex; } } public static void GeneratePfpFile(dynamic Job) { try { DBFField[] StandardEmsFields = ReadDbfFields(emsBasePath + @"\EMS.PFP"); using (var fileStream = File.Create(TempEmsDir + $@"\{GenerateFileName(Job)}.PFP")) { using (var writer = new DBFWriter()) { writer.CharEncoding = DbfFileCharEncoding; writer.Signature = DbfFileSignature; writer.LanguageDriver = DbfFileLanguageDriver; writer.Fields = StandardEmsFields; writer.AddRecord( "PAN", //PRT_TYPE Job.parts_tax_rates?.PAN?.prt_tax_in?.Value, //PRT_TAX_IN Job.parts_tax_rates?.PAN?.prt_tax_rt?.Value, //PRT_TAX_RT Job.parts_tax_rates?.PAN?.prt_mkupp?.Value, //PRT_MKUPP Job.parts_tax_rates?.PAN?.prt_mktyp?.Value, //PRT_MKTYP Job.parts_tax_rates?.PAN?.prt_discp?.Value, //PRT_DISCP Job.parts_tax_rates?.PAN?.prt_tx_ty1?.Value, //PRT_TX_TY1 Job.parts_tax_rates?.PAN?.prt_tx_in1?.Value, //PRT_TX_IN1 Job.parts_tax_rates?.PAN?.prt_tx_ty2?.Value, //PRT_TX_TY2 Job.parts_tax_rates?.PAN?.prt_tx_in2?.Value, //PRT_TX_IN2 Job.parts_tax_rates?.PAN?.prt_tx_ty3?.Value, //PRT_TX_TY3 Job.parts_tax_rates?.PAN?.prt_tx_in3?.Value, //PRT_TX_IN3 Job.parts_tax_rates?.PAN?.prt_tx_ty4?.Value, //PRT_TX_TY4 Job.parts_tax_rates?.PAN?.prt_tx_in4?.Value, //PRT_TX_IN4 Job.parts_tax_rates?.PAN?.prt_tx_ty5?.Value, //PRT_TX_TY5 Job.parts_tax_rates?.PAN?.prt_tx_in5?.Value //PRT_TX_IN5 ); ; writer.AddRecord( "PAL", //PRT_TYPE Job.parts_tax_rates?.PAL?.prt_tax_in?.Value, //PRT_TAX_IN Job.parts_tax_rates?.PAL?.prt_tax_rt?.Value, //PRT_TAX_RT Job.parts_tax_rates?.PAL?.prt_mkupp?.Value, //PRT_MKUPP Job.parts_tax_rates?.PAL?.prt_mktyp?.Value, //PRT_MKTYP Job.parts_tax_rates?.PAL?.prt_discp?.Value, //PRT_DISCP Job.parts_tax_rates?.PAL?.prt_tx_ty1?.Value, //PRT_TX_TY1 Job.parts_tax_rates?.PAL?.prt_tx_in1?.Value, //PRT_TX_IN1 Job.parts_tax_rates?.PAL?.prt_tx_ty2?.Value, //PRT_TX_TY2 Job.parts_tax_rates?.PAL?.prt_tx_in2?.Value, //PRT_TX_IN2 Job.parts_tax_rates?.PAL?.prt_tx_ty3?.Value, //PRT_TX_TY3 Job.parts_tax_rates?.PAL?.prt_tx_in3?.Value, //PRT_TX_IN3 Job.parts_tax_rates?.PAL?.prt_tx_ty4?.Value, //PRT_TX_TY4 Job.parts_tax_rates?.PAL?.prt_tx_in4?.Value, //PRT_TX_IN4 Job.parts_tax_rates?.PAL?.prt_tx_ty5?.Value, //PRT_TX_TY5 Job.parts_tax_rates?.PAL?.prt_tx_in5?.Value //PRT_TX_IN5 ); ; writer.AddRecord( "PAR", //PRT_TYPE Job.parts_tax_rates?.PAR?.prt_tax_in?.Value, //PRT_TAX_IN Job.parts_tax_rates?.PAR?.prt_tax_rt?.Value, //PRT_TAX_RT Job.parts_tax_rates?.PAR?.prt_mkupp?.Value, //PRT_MKUPP Job.parts_tax_rates?.PAR?.prt_mktyp?.Value, //PRT_MKTYP Job.parts_tax_rates?.PAR?.prt_discp?.Value, //PRT_DISCP Job.parts_tax_rates?.PAR?.prt_tx_ty1?.Value, //PRT_TX_TY1 Job.parts_tax_rates?.PAR?.prt_tx_in1?.Value, //PRT_TX_IN1 Job.parts_tax_rates?.PAR?.prt_tx_ty2?.Value, //PRT_TX_TY2 Job.parts_tax_rates?.PAR?.prt_tx_in2?.Value, //PRT_TX_IN2 Job.parts_tax_rates?.PAR?.prt_tx_ty3?.Value, //PRT_TX_TY3 Job.parts_tax_rates?.PAR?.prt_tx_in3?.Value, //PRT_TX_IN3 Job.parts_tax_rates?.PAR?.prt_tx_ty4?.Value, //PRT_TX_TY4 Job.parts_tax_rates?.PAR?.prt_tx_in4?.Value, //PRT_TX_IN4 Job.parts_tax_rates?.PAR?.prt_tx_ty5?.Value, //PRT_TX_TY5 Job.parts_tax_rates?.PAR?.prt_tx_in5?.Value //PRT_TX_IN5 ); ; writer.AddRecord( "PAC", //PRT_TYPE Job.parts_tax_rates?.PAC?.prt_tax_in?.Value, //PRT_TAX_IN Job.parts_tax_rates?.PAC?.prt_tax_rt?.Value, //PRT_TAX_RT Job.parts_tax_rates?.PAC?.prt_mkupp?.Value, //PRT_MKUPP Job.parts_tax_rates?.PAC?.prt_mktyp?.Value, //PRT_MKTYP Job.parts_tax_rates?.PAC?.prt_discp?.Value, //PRT_DISCP Job.parts_tax_rates?.PAC?.prt_tx_ty1?.Value, //PRT_TX_TY1 Job.parts_tax_rates?.PAC?.prt_tx_in1?.Value, //PRT_TX_IN1 Job.parts_tax_rates?.PAC?.prt_tx_ty2?.Value, //PRT_TX_TY2 Job.parts_tax_rates?.PAC?.prt_tx_in2?.Value, //PRT_TX_IN2 Job.parts_tax_rates?.PAC?.prt_tx_ty3?.Value, //PRT_TX_TY3 Job.parts_tax_rates?.PAC?.prt_tx_in3?.Value, //PRT_TX_IN3 Job.parts_tax_rates?.PAC?.prt_tx_ty4?.Value, //PRT_TX_TY4 Job.parts_tax_rates?.PAC?.prt_tx_in4?.Value, //PRT_TX_IN4 Job.parts_tax_rates?.PAC?.prt_tx_ty5?.Value, //PRT_TX_TY5 Job.parts_tax_rates?.PAC?.prt_tx_in5?.Value //PRT_TX_IN5 ); ; writer.AddRecord( "PAM", //PRT_TYPE Job.parts_tax_rates?.PAM?.prt_tax_in?.Value, //PRT_TAX_IN Job.parts_tax_rates?.PAM?.prt_tax_rt?.Value, //PRT_TAX_RT Job.parts_tax_rates?.PAM?.prt_mkupp?.Value, //PRT_MKUPP Job.parts_tax_rates?.PAM?.prt_mktyp?.Value, //PRT_MKTYP Job.parts_tax_rates?.PAM?.prt_discp?.Value, //PRT_DISCP Job.parts_tax_rates?.PAM?.prt_tx_ty1?.Value, //PRT_TX_TY1 Job.parts_tax_rates?.PAM?.prt_tx_in1?.Value, //PRT_TX_IN1 Job.parts_tax_rates?.PAM?.prt_tx_ty2?.Value, //PRT_TX_TY2 Job.parts_tax_rates?.PAM?.prt_tx_in2?.Value, //PRT_TX_IN2 Job.parts_tax_rates?.PAM?.prt_tx_ty3?.Value, //PRT_TX_TY3 Job.parts_tax_rates?.PAM?.prt_tx_in3?.Value, //PRT_TX_IN3 Job.parts_tax_rates?.PAM?.prt_tx_ty4?.Value, //PRT_TX_TY4 Job.parts_tax_rates?.PAM?.prt_tx_in4?.Value, //PRT_TX_IN4 Job.parts_tax_rates?.PAM?.prt_tx_ty5?.Value, //PRT_TX_TY5 Job.parts_tax_rates?.PAM?.prt_tx_in5?.Value //PRT_TX_IN5 ); ; writer.AddRecord( "PAS", //PRT_TYPE Job.parts_tax_rates?.PAS?.prt_tax_in?.Value, //PRT_TAX_IN Job.parts_tax_rates?.PAS?.prt_tax_rt?.Value, //PRT_TAX_RT Job.parts_tax_rates?.PAS?.prt_mkupp?.Value, //PRT_MKUPP Job.parts_tax_rates?.PAS?.prt_mktyp?.Value, //PRT_MKTYP Job.parts_tax_rates?.PAS?.prt_discp?.Value, //PRT_DISCP Job.parts_tax_rates?.PAS?.prt_tx_ty1?.Value, //PRT_TX_TY1 Job.parts_tax_rates?.PAS?.prt_tx_in1?.Value, //PRT_TX_IN1 Job.parts_tax_rates?.PAS?.prt_tx_ty2?.Value, //PRT_TX_TY2 Job.parts_tax_rates?.PAS?.prt_tx_in2?.Value, //PRT_TX_IN2 Job.parts_tax_rates?.PAS?.prt_tx_ty3?.Value, //PRT_TX_TY3 Job.parts_tax_rates?.PAS?.prt_tx_in3?.Value, //PRT_TX_IN3 Job.parts_tax_rates?.PAS?.prt_tx_ty4?.Value, //PRT_TX_TY4 Job.parts_tax_rates?.PAS?.prt_tx_in4?.Value, //PRT_TX_IN4 Job.parts_tax_rates?.PAS?.prt_tx_ty5?.Value, //PRT_TX_TY5 Job.parts_tax_rates?.PAS?.prt_tx_in5?.Value //PRT_TX_IN5 ); ; writer.AddRecord( "PAA", //PRT_TYPE Job.parts_tax_rates?.PAA?.prt_tax_in?.Value, //PRT_TAX_IN Job.parts_tax_rates?.PAA?.prt_tax_rt?.Value, //PRT_TAX_RT Job.parts_tax_rates?.PAA?.prt_mkupp?.Value, //PRT_MKUPP Job.parts_tax_rates?.PAA?.prt_mktyp?.Value, //PRT_MKTYP Job.parts_tax_rates?.PAA?.prt_discp?.Value, //PRT_DISCP Job.parts_tax_rates?.PAA?.prt_tx_ty1?.Value, //PRT_TX_TY1 Job.parts_tax_rates?.PAA?.prt_tx_in1?.Value, //PRT_TX_IN1 Job.parts_tax_rates?.PAA?.prt_tx_ty2?.Value, //PRT_TX_TY2 Job.parts_tax_rates?.PAA?.prt_tx_in2?.Value, //PRT_TX_IN2 Job.parts_tax_rates?.PAA?.prt_tx_ty3?.Value, //PRT_TX_TY3 Job.parts_tax_rates?.PAA?.prt_tx_in3?.Value, //PRT_TX_IN3 Job.parts_tax_rates?.PAA?.prt_tx_ty4?.Value, //PRT_TX_TY4 Job.parts_tax_rates?.PAA?.prt_tx_in4?.Value, //PRT_TX_IN4 Job.parts_tax_rates?.PAA?.prt_tx_ty5?.Value, //PRT_TX_TY5 Job.parts_tax_rates?.PAA?.prt_tx_in5?.Value //PRT_TX_IN5 ); ; writer.Write(fileStream); } } } catch (Exception ex) { logger.Error(ex, "Error when creating PFP file."); throw ex; } } public static void GeneratePftFile(dynamic Job) { try { DBFField[] StandardEmsFields = ReadDbfFields(emsBasePath + @"\EMS.PFT"); using (var fileStream = File.Create(TempEmsDir + $@"\{GenerateFileName(Job)}.PFT")) { using (var writer = new DBFWriter()) { writer.CharEncoding = DbfFileCharEncoding; writer.Signature = DbfFileSignature; writer.LanguageDriver = DbfFileLanguageDriver; writer.Fields = StandardEmsFields; writer.Write(fileStream); } } } catch (Exception ex) { logger.Error(ex, "Error when creating PFT file."); throw ex; } } public static void GenerateStlFile(dynamic Job) { try { DBFField[] StandardEmsFields = ReadDbfFields(emsBasePath + @"\EMS.STL"); using (var fileStream = File.Create(TempEmsDir + $@"\{GenerateFileName(Job)}.STL")) { using (var writer = new DBFWriter()) { writer.CharEncoding = DbfFileCharEncoding; writer.Signature = DbfFileSignature; writer.LanguageDriver = DbfFileLanguageDriver; writer.Fields = StandardEmsFields; writer.AddRecord( "LA", //TTL_TYPE "LAB", //TTL_TYPECD (Job.job_totals?.rates?.lab?.total?.amount?.Value ?? 0) / 100, //T_AMT Job.job_totals?.rates?.lab?.hours?.Value ?? 0, //T_HRS Job.t_addlbr?.Value ?? 0, //T_ADDLBR Job.t_discamt?.Value ?? 0, //T_DISCAMT Job.t_mkupamt?.Value ?? 0, //T_MKUPAMT Job.t_gdiscamt?.Value ?? 0, //T_GDISCAMT Job.tax_amt?.Value ?? 0, //TAX_AMT Job.nt_amt?.Value ?? 0, //NT_AMT Job.nt_hrs?.Value ?? 0, //NT_HRS Job.nt_addlbr?.Value ?? 0, //NT_ADDLBR Job.nt_disc?.Value ?? 0, //NT_DISC Job.nt_mkup?.Value ?? 0, //NT_MKUP Job.nt_gdis?.Value ?? 0, //NT_GDIS Job.ttl_typamt?.Value ?? 0, //TTL_TYPAMT Job.ttl_hrs?.Value ?? 0, //TTL_HRS Job.ttl_amt?.Value ?? 0 //TTL_AMT ); writer.AddRecord( "LA", //TTL_TYPE "LAS", //TTL_TYPECD (Job.job_totals?.rates?.las?.total?.amount?.Value ?? 0) / 100, //T_AMT Job.job_totals?.rates?.las?.hours?.Value ?? 0, //T_HRS Job.t_addlbr?.Value ?? 0, //T_ADDLBR Job.t_discamt?.Value ?? 0, //T_DISCAMT Job.t_mkupamt?.Value ?? 0, //T_MKUPAMT Job.t_gdiscamt?.Value ?? 0, //T_GDISCAMT Job.tax_amt?.Value ?? 0, //TAX_AMT Job.nt_amt?.Value ?? 0, //NT_AMT Job.nt_hrs?.Value ?? 0, //NT_HRS Job.nt_addlbr?.Value ?? 0, //NT_ADDLBR Job.nt_disc?.Value ?? 0, //NT_DISC Job.nt_mkup?.Value ?? 0, //NT_MKUP Job.nt_gdis?.Value ?? 0, //NT_GDIS Job.ttl_typamt?.Value ?? 0, //TTL_TYPAMT Job.ttl_hrs?.Value ?? 0, //TTL_HRS Job.ttl_amt?.Value ?? 0 //TTL_AMT ); writer.AddRecord( "LA", //TTL_TYPE "LAR", //TTL_TYPECD (Job.job_totals?.rates?.lar?.total?.amount?.Value ?? 0) / 100, //T_AMT Job.job_totals?.rates?.lar?.hours?.Value ?? 0, //T_HRS Job.t_addlbr?.Value ?? 0, //T_ADDLBR Job.t_discamt?.Value ?? 0, //T_DISCAMT Job.t_mkupamt?.Value ?? 0, //T_MKUPAMT Job.t_gdiscamt?.Value ?? 0, //T_GDISCAMT Job.tax_amt?.Value ?? 0, //TAX_AMT Job.nt_amt?.Value ?? 0, //NT_AMT Job.nt_hrs?.Value ?? 0, //NT_HRS Job.nt_addlbr?.Value ?? 0, //NT_ADDLBR Job.nt_disc?.Value ?? 0, //NT_DISC Job.nt_mkup?.Value ?? 0, //NT_MKUP Job.nt_gdis?.Value ?? 0, //NT_GDIS Job.ttl_typamt?.Value ?? 0, //TTL_TYPAMT Job.ttl_hrs?.Value ?? 0, //TTL_HRS Job.ttl_amt?.Value ?? 0 //TTL_AMT ); writer.AddRecord( "LA", //TTL_TYPE "LAG", //TTL_TYPECD (Job.job_totals?.rates?.lag?.total?.amount?.Value ?? 0) / 100, //T_AMT Job.job_totals?.rates?.lag?.hours?.Value ?? 0, //T_HRS Job.t_addlbr?.Value ?? 0, //T_ADDLBR Job.t_discamt?.Value ?? 0, //T_DISCAMT Job.t_mkupamt?.Value ?? 0, //T_MKUPAMT Job.t_gdiscamt?.Value ?? 0, //T_GDISCAMT Job.tax_amt?.Value ?? 0, //TAX_AMT Job.nt_amt?.Value ?? 0, //NT_AMT Job.nt_hrs?.Value ?? 0, //NT_HRS Job.nt_addlbr?.Value ?? 0, //NT_ADDLBR Job.nt_disc?.Value ?? 0, //NT_DISC Job.nt_mkup?.Value ?? 0, //NT_MKUP Job.nt_gdis?.Value ?? 0, //NT_GDIS Job.ttl_typamt?.Value ?? 0, //TTL_TYPAMT Job.ttl_hrs?.Value ?? 0, //TTL_HRS Job.ttl_amt?.Value ?? 0 //TTL_AMT ); writer.AddRecord( "LA", //TTL_TYPE "LAF", //TTL_TYPECD (Job.job_totals?.rates?.laf?.total?.amount?.Value ?? 0) / 100, //T_AMT Job.job_totals?.rates?.laf?.hours?.Value ?? 0, //T_HRS Job.t_addlbr?.Value ?? 0, //T_ADDLBR Job.t_discamt?.Value ?? 0, //T_DISCAMT Job.t_mkupamt?.Value ?? 0, //T_MKUPAMT Job.t_gdiscamt?.Value ?? 0, //T_GDISCAMT Job.tax_amt?.Value ?? 0, //TAX_AMT Job.nt_amt?.Value ?? 0, //NT_AMT Job.nt_hrs?.Value ?? 0, //NT_HRS Job.nt_addlbr?.Value ?? 0, //NT_ADDLBR Job.nt_disc?.Value ?? 0, //NT_DISC Job.nt_mkup?.Value ?? 0, //NT_MKUP Job.nt_gdis?.Value ?? 0, //NT_GDIS Job.ttl_typamt?.Value ?? 0, //TTL_TYPAMT Job.ttl_hrs?.Value ?? 0, //TTL_HRS Job.ttl_amt?.Value ?? 0 //TTL_AMT ); writer.AddRecord( "LA", //TTL_TYPE "LAM", //TTL_TYPECD (Job.job_totals?.rates?.lam?.total?.amount?.Value ?? 0) / 100, //T_AMT Job.job_totals?.rates?.lam?.hours?.Value ?? 0, //T_HRS Job.t_addlbr?.Value ?? 0, //T_ADDLBR Job.t_discamt?.Value ?? 0, //T_DISCAMT Job.t_mkupamt?.Value ?? 0, //T_MKUPAMT Job.t_gdiscamt?.Value ?? 0, //T_GDISCAMT Job.tax_amt?.Value ?? 0, //TAX_AMT Job.nt_amt?.Value ?? 0, //NT_AMT Job.nt_hrs?.Value ?? 0, //NT_HRS Job.nt_addlbr?.Value ?? 0, //NT_ADDLBR Job.nt_disc?.Value ?? 0, //NT_DISC Job.nt_mkup?.Value ?? 0, //NT_MKUP Job.nt_gdis?.Value ?? 0, //NT_GDIS Job.ttl_typamt?.Value ?? 0, //TTL_TYPAMT Job.ttl_hrs?.Value ?? 0, //TTL_HRS Job.ttl_amt?.Value ?? 0 //TTL_AMT ); writer.AddRecord( "LA", //TTL_TYPE "LAU", //TTL_TYPECD (Job.job_totals?.rates?.lau?.total?.amount?.Value ?? 0) / 100, //T_AMT Job.job_totals?.rates?.lau?.hours?.Value ?? 0, //T_HRS Job.t_addlbr?.Value ?? 0, //T_ADDLBR Job.t_discamt?.Value ?? 0, //T_DISCAMT Job.t_mkupamt?.Value ?? 0, //T_MKUPAMT Job.t_gdiscamt?.Value ?? 0, //T_GDISCAMT Job.tax_amt?.Value ?? 0, //TAX_AMT Job.nt_amt?.Value ?? 0, //NT_AMT Job.nt_hrs?.Value ?? 0, //NT_HRS Job.nt_addlbr?.Value ?? 0, //NT_ADDLBR Job.nt_disc?.Value ?? 0, //NT_DISC Job.nt_mkup?.Value ?? 0, //NT_MKUP Job.nt_gdis?.Value ?? 0, //NT_GDIS Job.ttl_typamt?.Value ?? 0, //TTL_TYPAMT Job.ttl_hrs?.Value ?? 0, //TTL_HRS Job.ttl_amt?.Value ?? 0 //TTL_AMT ); writer.AddRecord( "LA", //TTL_TYPE "LA1", //TTL_TYPECD (Job.job_totals?.rates?.la1?.total?.amount?.Value ?? 0) / 100, //T_AMT Job.job_totals?.rates?.la1?.hours?.Value ?? 0, //T_HRS Job.t_addlbr?.Value ?? 0, //T_ADDLBR Job.t_discamt?.Value ?? 0, //T_DISCAMT Job.t_mkupamt?.Value ?? 0, //T_MKUPAMT Job.t_gdiscamt?.Value ?? 0, //T_GDISCAMT Job.tax_amt?.Value ?? 0, //TAX_AMT Job.nt_amt?.Value ?? 0, //NT_AMT Job.nt_hrs?.Value ?? 0, //NT_HRS Job.nt_addlbr?.Value ?? 0, //NT_ADDLBR Job.nt_disc?.Value ?? 0, //NT_DISC Job.nt_mkup?.Value ?? 0, //NT_MKUP Job.nt_gdis?.Value ?? 0, //NT_GDIS Job.ttl_typamt?.Value ?? 0, //TTL_TYPAMT Job.ttl_hrs?.Value ?? 0, //TTL_HRS Job.ttl_amt?.Value ?? 0 //TTL_AMT ); writer.AddRecord( "LA", //TTL_TYPE "LA2", //TTL_TYPECD (Job.job_totals?.rates?.la2?.total?.amount?.Value ?? 0) / 100, //T_AMT Job.job_totals?.rates?.la2?.hours?.Value ?? 0, //T_HRS Job.t_addlbr?.Value ?? 0, //T_ADDLBR Job.t_discamt?.Value ?? 0, //T_DISCAMT Job.t_mkupamt?.Value ?? 0, //T_MKUPAMT Job.t_gdiscamt?.Value ?? 0, //T_GDISCAMT Job.tax_amt?.Value ?? 0, //TAX_AMT Job.nt_amt?.Value ?? 0, //NT_AMT Job.nt_hrs?.Value ?? 0, //NT_HRS Job.nt_addlbr?.Value ?? 0, //NT_ADDLBR Job.nt_disc?.Value ?? 0, //NT_DISC Job.nt_mkup?.Value ?? 0, //NT_MKUP Job.nt_gdis?.Value ?? 0, //NT_GDIS Job.ttl_typamt?.Value ?? 0, //TTL_TYPAMT Job.ttl_hrs?.Value ?? 0, //TTL_HRS Job.ttl_amt?.Value ?? 0 //TTL_AMT ); writer.AddRecord( "LA", //TTL_TYPE "LA3", //TTL_TYPECD (Job.job_totals?.rates?.la3?.total?.amount?.Value ?? 0) / 100, //T_AMT Job.job_totals?.rates?.la3?.hours?.Value ?? 0, //T_HRS Job.t_addlbr?.Value ?? 0, //T_ADDLBR Job.t_discamt?.Value ?? 0, //T_DISCAMT Job.t_mkupamt?.Value ?? 0, //T_MKUPAMT Job.t_gdiscamt?.Value ?? 0, //T_GDISCAMT Job.tax_amt?.Value ?? 0, //TAX_AMT Job.nt_amt?.Value ?? 0, //NT_AMT Job.nt_hrs?.Value ?? 0, //NT_HRS Job.nt_addlbr?.Value ?? 0, //NT_ADDLBR Job.nt_disc?.Value ?? 0, //NT_DISC Job.nt_mkup?.Value ?? 0, //NT_MKUP Job.nt_gdis?.Value ?? 0, //NT_GDIS Job.ttl_typamt?.Value ?? 0, //TTL_TYPAMT Job.ttl_hrs?.Value ?? 0, //TTL_HRS Job.ttl_amt?.Value ?? 0 //TTL_AMT ); writer.AddRecord( "LA", //TTL_TYPE "LA4", //TTL_TYPECD (Job.job_totals?.rates?.la4?.total?.amount?.Value ?? 0) / 100, //T_AMT Job.job_totals?.rates?.la4?.hours?.Value ?? 0, //T_HRS Job.t_addlbr?.Value ?? 0, //T_ADDLBR Job.t_discamt?.Value ?? 0, //T_DISCAMT Job.t_mkupamt?.Value ?? 0, //T_MKUPAMT Job.t_gdiscamt?.Value ?? 0, //T_GDISCAMT Job.tax_amt?.Value ?? 0, //TAX_AMT Job.nt_amt?.Value ?? 0, //NT_AMT Job.nt_hrs?.Value ?? 0, //NT_HRS Job.nt_addlbr?.Value ?? 0, //NT_ADDLBR Job.nt_disc?.Value ?? 0, //NT_DISC Job.nt_mkup?.Value ?? 0, //NT_MKUP Job.nt_gdis?.Value ?? 0, //NT_GDIS Job.ttl_typamt?.Value ?? 0, //TTL_TYPAMT Job.ttl_hrs?.Value ?? 0, //TTL_HRS Job.ttl_amt?.Value ?? 0 //TTL_AMT ); writer.AddRecord( "LA", //TTL_TYPE "LAD", //TTL_TYPECD (Job.job_totals?.rates?.lad?.total?.amount?.Value ?? 0) / 100, //T_AMT Job.job_totals?.rates?.lad?.hours?.Value ?? 0, //T_HRS Job.t_addlbr?.Value ?? 0, //T_ADDLBR Job.t_discamt?.Value ?? 0, //T_DISCAMT Job.t_mkupamt?.Value ?? 0, //T_MKUPAMT Job.t_gdiscamt?.Value ?? 0, //T_GDISCAMT Job.tax_amt?.Value ?? 0, //TAX_AMT Job.nt_amt?.Value ?? 0, //NT_AMT Job.nt_hrs?.Value ?? 0, //NT_HRS Job.nt_addlbr?.Value ?? 0, //NT_ADDLBR Job.nt_disc?.Value ?? 0, //NT_DISC Job.nt_mkup?.Value ?? 0, //NT_MKUP Job.nt_gdis?.Value ?? 0, //NT_GDIS Job.ttl_typamt?.Value ?? 0, //TTL_TYPAMT Job.ttl_hrs?.Value ?? 0, //TTL_HRS Job.ttl_amt?.Value ?? 0 //TTL_AMT ); writer.AddRecord( "LA", //TTL_TYPE "LAE", //TTL_TYPECD (Job.job_totals?.rates?.lae?.total?.amount?.Value ?? 0) / 100, //T_AMT Job.job_totals?.rates?.lae?.hours?.Value ?? 0, //T_HRS Job.t_addlbr?.Value ?? 0, //T_ADDLBR Job.t_discamt?.Value ?? 0, //T_DISCAMT Job.t_mkupamt?.Value ?? 0, //T_MKUPAMT Job.t_gdiscamt?.Value ?? 0, //T_GDISCAMT Job.tax_amt?.Value ?? 0, //TAX_AMT Job.nt_amt?.Value ?? 0, //NT_AMT Job.nt_hrs?.Value ?? 0, //NT_HRS Job.nt_addlbr?.Value ?? 0, //NT_ADDLBR Job.nt_disc?.Value ?? 0, //NT_DISC Job.nt_mkup?.Value ?? 0, //NT_MKUP Job.nt_gdis?.Value ?? 0, //NT_GDIS Job.ttl_typamt?.Value ?? 0, //TTL_TYPAMT Job.ttl_hrs?.Value ?? 0, //TTL_HRS Job.ttl_amt?.Value ?? 0 //TTL_AMT ); writer.AddRecord( "LA", //TTL_TYPE "LAT", //TTL_TYPECD (Job.job_totals?.rates?.rates_subtotal?.total?.amount?.Value ?? 0) / 100, //T_AMT Job.job_totals?.rates?.rates_subtotal?.hours?.Value ?? 0, //T_HRS **** THIS MAY NEED TO BE ADDED LATER Job.t_addlbr?.Value ?? 0, //T_ADDLBR Job.t_discamt?.Value ?? 0, //T_DISCAMT Job.t_mkupamt?.Value ?? 0, //T_MKUPAMT Job.t_gdiscamt?.Value ?? 0, //T_GDISCAMT Job.tax_amt?.Value ?? 0, //TAX_AMT Job.nt_amt?.Value ?? 0, //NT_AMTs Job.nt_hrs?.Value ?? 0, //NT_HRS Job.nt_addlbr?.Value ?? 0, //NT_ADDLBR Job.nt_disc?.Value ?? 0, //NT_DISC Job.nt_mkup?.Value ?? 0, //NT_MKUP Job.nt_gdis?.Value ?? 0, //NT_GDIS Job.ttl_typamt?.Value ?? 0, //TTL_TYPAMT Job.ttl_hrs?.Value ?? 0, //TTL_HRS ** THIS MAY NEED TO BE ADDED LATER. Job.ttl_amt?.Value ?? 0 //TTL_AMT ); writer.AddRecord( "PA", //TTL_TYPE "PAN", //TTL_TYPECD (Job.job_totals?.parts?.parts?.list?.PAN?.total?.amount?.Value ?? 0) / 100, //T_AMT Job.job_totals?.parts?.parts?.list?.PAN?.hours?.Value ?? 0, //T_HRS Job.t_addlbr?.Value ?? 0, //T_ADDLBR Job.t_discamt?.Value ?? 0, //T_DISCAMT Job.t_mkupamt?.Value ?? 0, //T_MKUPAMT Job.t_gdiscamt?.Value ?? 0, //T_GDISCAMT Job.tax_amt?.Value ?? 0, //TAX_AMT Job.nt_amt?.Value ?? 0, //NT_AMT Job.nt_hrs?.Value ?? 0, //NT_HRS Job.nt_addlbr?.Value ?? 0, //NT_ADDLBR Job.nt_disc?.Value ?? 0, //NT_DISC Job.nt_mkup?.Value ?? 0, //NT_MKUP Job.nt_gdis?.Value ?? 0, //NT_GDIS Job.ttl_typamt?.Value ?? 0, //TTL_TYPAMT Job.ttl_hrs?.Value ?? 0, //TTL_HRS Job.ttl_amt?.Value ?? 0 //TTL_AMT ); writer.AddRecord( "PA", //TTL_TYPE "PAA", //TTL_TYPECD (Job.job_totals?.parts?.parts?.list?.PAA?.total?.amount?.Value ?? 0) / 100, //T_AMT Job.job_totals?.parts?.parts?.list?.PAA?.hours?.Value ?? 0, //T_HRS Job.t_addlbr?.Value ?? 0, //T_ADDLBR Job.t_discamt?.Value ?? 0, //T_DISCAMT Job.t_mkupamt?.Value ?? 0, //T_MKUPAMT Job.t_gdiscamt?.Value ?? 0, //T_GDISCAMT Job.tax_amt?.Value ?? 0, //TAX_AMT Job.nt_amt?.Value ?? 0, //NT_AMT Job.nt_hrs?.Value ?? 0, //NT_HRS Job.nt_addlbr?.Value ?? 0, //NT_ADDLBR Job.nt_disc?.Value ?? 0, //NT_DISC Job.nt_mkup?.Value ?? 0, //NT_MKUP Job.nt_gdis?.Value ?? 0, //NT_GDIS Job.ttl_typamt?.Value ?? 0, //TTL_TYPAMT Job.ttl_hrs?.Value ?? 0, //TTL_HRS Job.ttl_amt?.Value ?? 0 //TTL_AMT ); writer.AddRecord( "PA", //TTL_TYPE "PAM", //TTL_TYPECD (Job.job_totals?.parts?.parts?.list?.PAM?.total?.amount?.Value ?? 0) / 100, //T_AMT Job.job_totals?.parts?.parts?.list?.PAM?.hours?.Value ?? 0, //T_HRS Job.t_addlbr?.Value ?? 0, //T_ADDLBR Job.t_discamt?.Value ?? 0, //T_DISCAMT Job.t_mkupamt?.Value ?? 0, //T_MKUPAMT Job.t_gdiscamt?.Value ?? 0, //T_GDISCAMT Job.tax_amt?.Value ?? 0, //TAX_AMT Job.nt_amt?.Value ?? 0, //NT_AMT Job.nt_hrs?.Value ?? 0, //NT_HRS Job.nt_addlbr?.Value ?? 0, //NT_ADDLBR Job.nt_disc?.Value ?? 0, //NT_DISC Job.nt_mkup?.Value ?? 0, //NT_MKUP Job.nt_gdis?.Value ?? 0, //NT_GDIS Job.ttl_typamt?.Value ?? 0, //TTL_TYPAMT Job.ttl_hrs?.Value ?? 0, //TTL_HRS Job.ttl_amt?.Value ?? 0 //TTL_AMT ); writer.AddRecord( "PA", //TTL_TYPE "PAL", //TTL_TYPECD (Job.job_totals?.parts?.parts?.list?.PAL?.total?.amount?.Value ?? 0) / 100, //T_AMT Job.job_totals?.parts?.parts?.list?.PAL?.hours?.Value ?? 0, //T_HRS Job.t_addlbr?.Value ?? 0, //T_ADDLBR Job.t_discamt?.Value ?? 0, //T_DISCAMT Job.t_mkupamt?.Value ?? 0, //T_MKUPAMT Job.t_gdiscamt?.Value ?? 0, //T_GDISCAMT Job.tax_amt?.Value ?? 0, //TAX_AMT Job.nt_amt?.Value ?? 0, //NT_AMT Job.nt_hrs?.Value ?? 0, //NT_HRS Job.nt_addlbr?.Value ?? 0, //NT_ADDLBR Job.nt_disc?.Value ?? 0, //NT_DISC Job.nt_mkup?.Value ?? 0, //NT_MKUP Job.nt_gdis?.Value ?? 0, //NT_GDIS Job.ttl_typamt?.Value ?? 0, //TTL_TYPAMT Job.ttl_hrs?.Value ?? 0, //TTL_HRS Job.ttl_amt?.Value ?? 0 //TTL_AMT ); writer.AddRecord( "PA", //TTL_TYPE "PAR", //TTL_TYPECD (Job.job_totals?.parts?.parts?.list?.PAR?.total?.amount?.Value ?? 0) / 100, //T_AMT Job.job_totals?.parts?.parts?.list?.PAR?.hours?.Value ?? 0, //T_HRS Job.t_addlbr?.Value ?? 0, //T_ADDLBR Job.t_discamt?.Value ?? 0, //T_DISCAMT Job.t_mkupamt?.Value ?? 0, //T_MKUPAMT Job.t_gdiscamt?.Value ?? 0, //T_GDISCAMT Job.tax_amt?.Value ?? 0, //TAX_AMT Job.nt_amt?.Value ?? 0, //NT_AMT Job.nt_hrs?.Value ?? 0, //NT_HRS Job.nt_addlbr?.Value ?? 0, //NT_ADDLBR Job.nt_disc?.Value ?? 0, //NT_DISC Job.nt_mkup?.Value ?? 0, //NT_MKUP Job.nt_gdis?.Value ?? 0, //NT_GDIS Job.ttl_typamt?.Value ?? 0, //TTL_TYPAMT Job.ttl_hrs?.Value ?? 0, //TTL_HRS Job.ttl_amt?.Value ?? 0 //TTL_AMT ); writer.AddRecord( "PA", //TTL_TYPE "PAC", //TTL_TYPECD (Job.job_totals?.parts?.parts?.list?.PAC?.total?.amount?.Value ?? 0) / 100, //T_AMT Job.job_totals?.parts?.parts?.list?.PAC?.hours?.Value ?? 0, //T_HRS Job.t_addlbr?.Value ?? 0, //T_ADDLBR Job.t_discamt?.Value ?? 0, //T_DISCAMT Job.t_mkupamt?.Value ?? 0, //T_MKUPAMT Job.t_gdiscamt?.Value ?? 0, //T_GDISCAMT Job.tax_amt?.Value ?? 0, //TAX_AMT Job.nt_amt?.Value ?? 0, //NT_AMT Job.nt_hrs?.Value ?? 0, //NT_HRS Job.nt_addlbr?.Value ?? 0, //NT_ADDLBR Job.nt_disc?.Value ?? 0, //NT_DISC Job.nt_mkup?.Value ?? 0, //NT_MKUP Job.nt_gdis?.Value ?? 0, //NT_GDIS Job.ttl_typamt?.Value ?? 0, //TTL_TYPAMT Job.ttl_hrs?.Value ?? 0, //TTL_HRS Job.ttl_amt?.Value ?? 0 //TTL_AMT ); writer.AddRecord( "PA", //TTL_TYPE "PAS", //TTL_TYPECD (Job.job_totals?.parts?.sublets?.PAS?.total?.amount?.Value ?? 0) / 100, //T_AMT Job.job_totals?.parts?.sublets?.PAS?.hours?.Value ?? 0, //T_HRS Job.t_addlbr?.Value ?? 0, //T_ADDLBR Job.t_discamt?.Value ?? 0, //T_DISCAMT Job.t_mkupamt?.Value ?? 0, //T_MKUPAMT Job.t_gdiscamt?.Value ?? 0, //T_GDISCAMT Job.tax_amt?.Value ?? 0, //TAX_AMT Job.nt_amt?.Value ?? 0, //NT_AMT Job.nt_hrs?.Value ?? 0, //NT_HRS Job.nt_addlbr?.Value ?? 0, //NT_ADDLBR Job.nt_disc?.Value ?? 0, //NT_DISC Job.nt_mkup?.Value ?? 0, //NT_MKUP Job.nt_gdis?.Value ?? 0, //NT_GDIS Job.ttl_typamt?.Value ?? 0, //TTL_TYPAMT Job.ttl_hrs?.Value ?? 0, //TTL_HRS Job.ttl_amt?.Value ?? 0 //TTL_AMT ); writer.AddRecord( "PA", //TTL_TYPE "PAT", //TTL_TYPECD (Job.job_totals?.parts?.parts?.total?.amount?.Value ?? 0) / 100, //T_AMT Job.job_totals?.parts?.parts?.list?.PAT?.hours?.Value ?? 0, //T_HRS Job.t_addlbr?.Value ?? 0, //T_ADDLBR Job.t_discamt?.Value ?? 0, //T_DISCAMT Job.t_mkupamt?.Value ?? 0, //T_MKUPAMT Job.t_gdiscamt?.Value ?? 0, //T_GDISCAMT Job.tax_amt?.Value ?? 0, //TAX_AMT Job.nt_amt?.Value ?? 0, //NT_AMT Job.nt_hrs?.Value ?? 0, //NT_HRS Job.nt_addlbr?.Value ?? 0, //NT_ADDLBR Job.nt_disc?.Value ?? 0, //NT_DISC Job.nt_mkup?.Value ?? 0, //NT_MKUP Job.nt_gdis?.Value ?? 0, //NT_GDIS Job.ttl_typamt?.Value ?? 0, //TTL_TYPAMT Job.ttl_hrs?.Value ?? 0, //TTL_HRS Job.ttl_amt?.Value ?? 0 //TTL_AMT ); writer.AddRecord( "OTAC", //TTL_TYPE "MAT", //TTL_TYPECD ((Job.job_totals?.rates?.mapa?.total?.amount?.Value ?? 0) / 100) + (Job.job_totals?.rates?.mash?.total?.amount?.Value ?? 0) / 100, //T_AMT Job.job_totals?.parts?.parts?.list?.PAN?.hours?.Value ?? 0, //T_HRS Job.t_addlbr?.Value ?? 0, //T_ADDLBR Job.t_discamt?.Value ?? 0, //T_DISCAMT Job.t_mkupamt?.Value ?? 0, //T_MKUPAMT Job.t_gdiscamt?.Value ?? 0, //T_GDISCAMT Job.tax_amt?.Value ?? 0, //TAX_AMT Job.nt_amt?.Value ?? 0, //NT_AMT Job.nt_hrs?.Value ?? 0, //NT_HRS Job.nt_addlbr?.Value ?? 0, //NT_ADDLBR Job.nt_disc?.Value ?? 0, //NT_DISC Job.nt_mkup?.Value ?? 0, //NT_MKUP Job.nt_gdis?.Value ?? 0, //NT_GDIS Job.ttl_typamt?.Value ?? 0, //TTL_TYPAMT Job.ttl_hrs?.Value ?? 0, //TTL_HRS Job.ttl_amt?.Value ?? 0 //TTL_AMT ); writer.AddRecord( "TOT", //TTL_TYPE null, //TTL_TYPECD (Job.job_totals?.ttoals?.subtotal?.amount?.Value ?? 0 / 100), //T_AMT 0, //T_HRS Job.t_addlbr?.Value ?? 0, //T_ADDLBR Job.t_discamt?.Value ?? 0, //T_DISCAMT Job.t_mkupamt?.Value ?? 0, //T_MKUPAMT Job.t_gdiscamt?.Value ?? 0, //T_GDISCAMT Job.tax_amt?.Value ?? 0, //TAX_AMT Job.nt_amt?.Value ?? 0, //NT_AMT Job.nt_hrs?.Value ?? 0, //NT_HRS Job.nt_addlbr?.Value ?? 0, //NT_ADDLBR Job.nt_disc?.Value ?? 0, //NT_DISC Job.nt_mkup?.Value ?? 0, //NT_MKUP Job.nt_gdis?.Value ?? 0, //NT_GDIS Job.ttl_typamt?.Value ?? 0, //TTL_TYPAMT Job.ttl_hrs?.Value ?? 0, //TTL_HRS Job.ttl_amt?.Value ?? 0 //TTL_AMT ); writer.Write(fileStream); } } } catch (Exception ex) { logger.Error(ex, "Error when creating STL file.");throw ex; } } public static void GenerateTtlFile(dynamic Job) { try { DBFField[] StandardEmsFields = ReadDbfFields(emsBasePath + @"\EMS.TTL"); using (var fileStream = File.Create(TempEmsDir + $@"\{GenerateFileName(Job)}.TTL")) { using (var writer = new DBFWriter()) { writer.CharEncoding = DbfFileCharEncoding; writer.Signature = DbfFileSignature; writer.LanguageDriver = DbfFileLanguageDriver; writer.Fields = StandardEmsFields; writer.AddRecord( (Job.job_totals?.totals?.net_repairs?.amount?.Value ?? 0) / 100, //G_TTL_AMT Job.depreciation_taxes?.Value ?? 0, //G_BETT_AMT 0, //G_RPD_AMT Job.ded_amt?.Value ?? 0, //G_DED_AMT (Job.job_totals?.totals?.custPayable?.amount?.Value ?? 0) / 100 , //G_CUST_AMT 0, //G_AA_AMT (Job.job_totals?.totals?.net_repairs?.amount?.Value ?? 0) / 100, //N_TTL_AMT 0, //PREV_NET 0, //SUPP_AMT 0, //N_SUPP_AMT 0, //G_UPD_AMT 0, //G_TTL_DISC Job.job_totals?.totals?.state_tax?.amount?.Value / 100 ?? 0, //G_TAX Job.job_totals?.totals?.federal_tax?.amount?.Value / 100 ?? 0 //GST_AMT ); ; writer.Write(fileStream); } } } catch (Exception ex) { logger.Error(ex, "Error when creating TTL file."); throw ex; } } } }