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 BodyshopUploader.Utils.Decoder { class EstimateDecoder { public static class CIECAEstimateImport { private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); /// /// Decode the set of estimate files based on the creation of an envelope file. /// /// Full path to the envelope file that was created/updated. /// public static dynamic DecodeEstimate(string FilePath) { dynamic ret = new JObject(); ret.ciecaid = Path.GetFileNameWithoutExtension(FilePath); string _dir = Path.GetDirectoryName(FilePath) + @"\"; ParseAd1File(ref ret, _dir); ParseVehFile(ref ret, _dir); //ParseStlFile(ref ret, _dir); //ParseTtlFile(ref ret, _dir); //ParseLinFile(ref ret, _dir); return ret; } public static void ParseAd1File(ref dynamic j, string RootFilePath) { if (string.IsNullOrWhiteSpace(j.ciecaid.Value)) { return; } logger.Trace(@"Parsing AD1 at: {0}{1}", RootFilePath, j.ciecaid.Value); int retryNumber = 0; while (retryNumber < 11) { try { using (Stream fis = File.Open(RootFilePath + j.ciecaid.Value + "A.ad1", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { var reader = new DBFReader(fis); reader.SetSelectFields(new string[] { "INS_CO_ID","INS_CO_NM","INS_ADDR1","INS_ADDR2","INS_CITY","INS_ST","INS_ZIP","INS_CTRY", "INS_EA","POLICY_NO","DED_AMT","DED_STATUS","ASGN_NO","ASGN_DATE","ASGN_TYPE","CLM_NO","CLM_OFC_ID","CLM_OFC_NM","CLM_ADDR1", "CLM_ADDR2","CLM_CITY","CLM_ST","CLM_ZIP","CLM_CTRY","CLM_PH1","CLM_PH1X","CLM_PH2","CLM_PH2X","CLM_FAX","CLM_FAXX","CLM_CT_LN", "CLM_CT_FN","CLM_TITLE","CLM_CT_PH","CLM_CT_PHX","CLM_EA","PAYEE_NMS","PAY_TYPE","PAY_DATE","PAY_CHKNM","PAY_AMT","AGT_CO_ID","AGT_CO_NM", "AGT_ADDR1","AGT_ADDR2","AGT_CITY","AGT_ST","AGT_ZIP","AGT_CTRY","AGT_PH1","AGT_PH1X","AGT_PH2","AGT_PH2X","AGT_FAX","AGT_FAXX","AGT_CT_LN", "AGT_CT_FN","AGT_CT_PH","AGT_CT_PHX","AGT_EA","AGT_LIC_NO", "LOSS_DATE","LOSS_CAT","LOSS_TYPE","LOSS_DESC","THEFT_IND","CAT_NO", "TLOS_IND","CUST_PR","INSD_LN","INSD_FN","INSD_TITLE","INSD_CO_NM","INSD_ADDR1","INSD_ADDR2","INSD_CITY","INSD_ST","INSD_ZIP", "INSD_CTRY","INSD_PH1","INSD_PH1X","INSD_PH2","INSD_PH2X","INSD_FAX","INSD_FAXX","INSD_EA","OWNR_LN","OWNR_FN","OWNR_TITLE","OWNR_CO_NM", "OWNR_ADDR1","OWNR_ADDR2","OWNR_CITY","OWNR_ST","OWNR_ZIP","OWNR_CTRY","OWNR_PH1","OWNR_PH1X","OWNR_PH2","OWNR_PH2X","OWNR_FAX","OWNR_FAXX", "OWNR_EA", "INS_PH1","INS_PH1X","INS_PH2","INS_PH2X","INS_FAX","INS_FAXX","INS_CT_LN","INS_CT_FN","INS_TITLE","INS_CT_PH","INS_CT_PHX" }); var readValues = reader.NextRecord(); j.ins_co_id = readValues[0]?.ToString(); j.ins_co_nm = readValues[1]?.ToString(); j.ins_addr1 = readValues[2]?.ToString(); j.ins_addr2 = readValues[3]?.ToString(); j.ins_city = readValues[4]?.ToString(); j.ins_st = readValues[5]?.ToString(); j.ins_zip = readValues[6]?.ToString(); j.ins_ctry = readValues[7]?.ToString(); j.ins_ea = readValues[8]?.ToString(); j.policy_no = readValues[9]?.ToString(); j.ded_amt = readValues[10]?.ToString(); j.ded_status = readValues[11]?.ToString(); j.asgn_no = readValues[12]?.ToString(); j.asgn_date = readValues[13]?.ToString(); j.asgn_type = readValues[14]?.ToString(); j.clm_no = readValues[15]?.ToString(); j.clm_ofc_id = readValues[16]?.ToString(); j.clm_ofc_nm = readValues[17]?.ToString(); j.clm_addr1 = readValues[18]?.ToString(); j.clm_addr2 = readValues[19]?.ToString(); j.clm_city = readValues[20]?.ToString(); j.clm_st = readValues[21]?.ToString(); j.clm_zip = readValues[22]?.ToString(); j.clm_ctry = readValues[23]?.ToString(); j.clm_ph1 = readValues[24]?.ToString(); j.clm_ph1x = readValues[25]?.ToString(); j.clm_ph2 = readValues[26]?.ToString(); j.clm_ph2x = readValues[27]?.ToString(); j.clm_fax = readValues[28]?.ToString(); j.clm_faxx = readValues[29]?.ToString(); j.clm_ct_ln = readValues[30]?.ToString(); j.clm_ct_fn = readValues[31]?.ToString(); j.clm_title = readValues[32]?.ToString(); j.clm_ct_ph = readValues[33]?.ToString(); j.clm_ct_phx = readValues[34]?.ToString(); j.clm_ea = readValues[35]?.ToString(); j.payee_nms = readValues[36]?.ToString(); j.pay_type = readValues[37]?.ToString(); j.pay_date = readValues[38]?.ToString(); j.pay_chknm = readValues[39]?.ToString(); j.pay_amt = readValues[40]?.ToString(); j.agt_co_id = readValues[41]?.ToString(); j.agt_co_nm = readValues[42]?.ToString(); j.agt_addr1 = readValues[43]?.ToString(); j.agt_addr2 = readValues[44]?.ToString(); j.agt_city = readValues[45]?.ToString(); j.agt_st = readValues[46]?.ToString(); j.agt_zip = readValues[47]?.ToString(); j.agt_ctry = readValues[48]?.ToString(); j.agt_ph1 = readValues[49]?.ToString(); j.agt_ph1x = readValues[50]?.ToString(); j.agt_ph2 = readValues[51]?.ToString(); j.agt_ph2x = readValues[52]?.ToString(); j.agt_fax = readValues[53]?.ToString(); j.agt_faxx = readValues[54]?.ToString(); j.agt_ct_ln = readValues[55]?.ToString(); j.agt_ct_fn = readValues[56]?.ToString(); j.agt_ct_ph = readValues[57]?.ToString(); j.agt_ct_phx = readValues[58]?.ToString(); j.agt_ea = readValues[59]?.ToString(); j.agt_lic_no = readValues[60]?.ToString(); j.loss_date = readValues[61]?.ToString(); j.loss_type = readValues[62]?.ToString(); j.loss_desc = readValues[63]?.ToString(); j.theft_ind = readValues[64]?.ToString(); //BOOL j.cat_no = readValues[65]?.ToString(); j.tlos_ind = readValues[66]?.ToString(); j.cust_pr = readValues[67]?.ToString(); j.insd_ln = readValues[68]?.ToString(); j.insd_fn = readValues[69]?.ToString(); j.insd_title = readValues[70]?.ToString(); j.insd_co_nm = readValues[71]?.ToString(); j.insd_addr1 = readValues[72]?.ToString(); j.insd_addr2 = readValues[73]?.ToString(); j.insd_city = readValues[74]?.ToString(); j.insd_st = readValues[75]?.ToString(); j.insd_zip = readValues[76]?.ToString(); j.insd_ctry = readValues[77]?.ToString(); j.insd_ph1 = readValues[78]?.ToString(); j.insd_ph1x = readValues[79]?.ToString(); j.insd_ph2 = readValues[80]?.ToString(); j.insd_ph2x = readValues[81]?.ToString(); j.insd_fax = readValues[82]?.ToString(); j.insd_faxx = readValues[82]?.ToString(); j.insd_ea = readValues[83]?.ToString(); j.ownr_ln = readValues[84]?.ToString(); j.ownr_fn = readValues[85]?.ToString(); j.ownr_title = readValues[86]?.ToString(); j.ownr_co_nm = readValues[87]?.ToString(); j.ownr_addr1 = readValues[88]?.ToString(); j.ownr_addr2 = readValues[89]?.ToString(); j.ownr_city = readValues[90]?.ToString(); j.ownr_st = readValues[91]?.ToString(); j.ownr_zip = readValues[92]?.ToString(); j.ownr_ctry = readValues[93]?.ToString(); j.ownr_ph1 = readValues[94]?.ToString(); j.ownr_ph1x = readValues[95]?.ToString(); j.ownr_ph2 = readValues[96]?.ToString(); j.ownr_ph2x = readValues[97]?.ToString(); j.ownr_fax = readValues[98]?.ToString(); j.ownr_faxx = readValues[99]?.ToString(); j.ownr_ea = readValues[100]?.ToString(); j.ins_ph1 = readValues[101]?.ToString(); j.ins_ph1x = readValues[102]?.ToString(); j.ins_ph2 = readValues[103]?.ToString(); j.ins_ph2x = readValues[104]?.ToString(); j.ins_fax = readValues[105]?.ToString(); j.ins_faxx = readValues[106]?.ToString(); j.ins_ct_ln = readValues[107]?.ToString(); j.ins_ct_fn = readValues[108]?.ToString(); j.ins_title = readValues[109]?.ToString(); j.ins_ct_ph = readValues[110]?.ToString(); j.ins_ct_phx = readValues[111]?.ToString(); return; } } catch (IOException ex) { logger.Trace(ex, "Unable to open AD1 file. Retrying. "); retryNumber++; Thread.Sleep(3000); } } } public static void ParseVehFile(ref dynamic j, string RootFilePath) { if (string.IsNullOrWhiteSpace(j.ciecaid.Value)) { return; } logger.Trace(@"Parsing Veh at: {0}{1}", RootFilePath, j.ciecaid.Value); int retryNumber = 0; while (retryNumber < 11) { try { using (Stream fis = File.Open(RootFilePath + j.ciecaid.Value + "v.veh", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { dynamic v = new JObject(); var reader = new DBFReader(fis); reader.SetSelectFields(new string[] { "IMPACT_1", "IMPACT_2", "DB_V_CODE", "PLATE_NO", "PLATE_ST", "V_VIN", "V_COND", "V_PROD_DT", "V_MODEL_YR", "V_MAKECODE", "V_MAKEDESC", "V_MODEL", "V_TYPE", // "V_BSTYLE", "V_TRIMCODE", "TRIM_COLOR", "V_MLDGCODE", "V_ENGINE", "V_COLOR", "V_TONE", "V_STAGE", "PAINT_CD1", "PAINT_CD2", "PAINT_CD3" }); var readValues = reader.NextRecord(); dynamic d = new JObject(); d.impact1 = readValues[0]?.ToString(); d.impact2 = readValues[1]?.ToString(); j.area_of_damage = d; v.db_v_code = readValues[2]?.ToString(); v.plate_no = readValues[3]?.ToString(); v.plate_st = readValues[4]?.ToString(); v.v_vin = readValues[5]?.ToString(); v.v_cond = readValues[6]?.ToString(); v.v_prod_dt = readValues[7]?.ToString(); v.v_model_yr = readValues[8]?.ToString(); v.v_makecode = readValues[9]?.ToString(); v.v_make_desc = readValues[10]?.ToString(); v.v_model_desc = readValues[11]?.ToString(); v.v_type = readValues[12]?.ToString(); v.v_bstyle = readValues[13]?.ToString(); v.v_trimcode = readValues[14]?.ToString(); v.trim_color = readValues[15]?.ToString(); v.v_mldgcode = readValues[16]?.ToString(); v.v_engine = readValues[17]?.ToString(); // v.v_options = readValues[18]?.ToString(); v.v_color = readValues[18]?.ToString(); v.v_tone = readValues[19]?.ToString(); v.v_stage = readValues[20]?.ToString(); dynamic p = new JObject(); p.paint_cd1 = readValues[21]?.ToString(); p.paint_cd2 = readValues[22]?.ToString(); p.paint_cd3 = readValues[23]?.ToString(); v.v_paint_codes = p; j.vehicle = new JObject(); j.vehicle.data = v; } return; } catch (IOException ex) { logger.Trace(ex, "Unable to open VEH file. Retrying. "); retryNumber++; Thread.Sleep(3000); } } } public static void ParseTtlFile(ref dynamic j, string RootFilePath) { if (string.IsNullOrWhiteSpace(j.ciecaid.Value)) { return; } logger.Trace(@"Parsing Ttl at: {0}{1}", RootFilePath, j.ciecaid.Value); int retryNumber = 0; while (retryNumber < 11) { try { using (Stream fis = File.Open(RootFilePath + j.ciecaid.Value + ".ttl", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { var reader = new DBFReader(fis); reader.SetSelectFields(new string[] { "G_TTL_AMT" }); var readValues = reader.NextRecord(); j.Claim_Total = Convert.ToDecimal(readValues[0].ToString()); } return; } catch (IOException ex) { logger.Trace(ex, "Unable to open TTL file. Retrying. "); retryNumber++; Thread.Sleep(3000); } } } public static void ParseStlFile(ref dynamic j, string RootFilePath) { if (string.IsNullOrWhiteSpace(j.ciecaid.Value)) { return; } logger.Trace(@"Parsing Ttl at: {0}{1}", RootFilePath, j.ciecaid.Value); int retryNumber = 0; while (retryNumber < 11) { try { using (Stream fis = File.Open(RootFilePath + j.ciecaid.Value + ".stl", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { var reader = new DBFReader(fis); reader.SetSelectFields(new string[] { "TTL_TYPECD", "T_HRS" }); var _rc = reader.RecordCount; for (var i = 0; i < _rc; i++) { var readValues = reader.NextRecord(); switch (readValues[0]) { //Labor Code case "LAB": j.BodyHrs = Convert.ToDecimal(readValues[1]); break; case "LAR": j.RefHrs = Convert.ToDecimal(readValues[1]); break; } } } return; } catch (IOException ex) { logger.Trace(ex, "Unable to open STL file. Retrying. "); retryNumber++; Thread.Sleep(3000); } } } public static void ParseLinFile(ref dynamic j, string RootFilePath) { if (string.IsNullOrWhiteSpace(j.ciecaid.Value)) { return; } logger.Trace(@"Parsing Ttl at: {0}{1}", RootFilePath, j.ciecaid.Value); //j.JobSublets = new List(); string _maxSupp = ""; int retryNumber = 0; while (retryNumber < 11) { try { using (Stream fis = File.Open(RootFilePath + j.ciecaid.Value + ".lin", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { var reader = new DBFReader(fis); reader.SetSelectFields(new string[] { "PART_TYPE", "LINE_DESC", "UNQ_SEQ", "LINE_IND" }); var _rc = reader.RecordCount; for (var i = 0; i < _rc; i++) { var readValues = reader.NextRecord(); //Find Max Supplement Number if (string.Compare(_maxSupp, readValues[3].ToString()) < 0) { _maxSupp = readValues[3].ToString(); } switch (readValues[3]) { //Labor Code case "PAS": case "PASL": //j.JobSublets.Add(new JobSublet() //{ // SubletDesc = readValues[1].ToString(), // Unq_Seq = Convert.ToInt32(readValues[2]) //}); break; } } } j.MaxSupplement = _maxSupp; return; } catch (IOException ex) { logger.Trace(ex, "Unable to open LIN file. Retrying. "); retryNumber++; Thread.Sleep(3000); } } } } } }