diff --git a/.gitignore b/.gitignore
index fa3b71a..ab47aa1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -113,4 +113,6 @@ firebase/.env
deploy.ps1
-macbuild.sh
\ No newline at end of file
+macbuild.sh
+Usage.md
+dist-electron
diff --git a/dist-electron/main.cjs b/dist-electron/main.cjs
index 6cea20e..cd1e1fa 100644
--- a/dist-electron/main.cjs
+++ b/dist-electron/main.cjs
@@ -1,4 +1,4 @@
-var p=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Pe=p((xr,wt)=>{wt.exports={webcontent:"webcontent-send",quit:"quit-app",test:{start:"test-start"},app:{toMain:{setAcceptableInsCoNm:"setAcceptableInsCoNm",setUserName:"setUserName",track:"analytics_track",checkForUpdates:"app_checkForUpdates",downloadUpdates:"app_downloadUpdates",installUpdates:"app_installupdates",getReleaseNotes:"app_getReleaseNotes",getAppVersion:"app_getApVersion",importJob:"app_importJob",setReleaseChannel:"app_setReleaseChannel",scrubEstimate:"app_scrubEstimate",openExternalWindow:"app_openExternalWindow",setInsRuleSet:"app_setInsRuleSet",log:{info:"app_logInfo",debug:"app_logDebug",warn:"app_logWarn",error:"app_logError",silly:"app_logSilly"}},toRenderer:{updateAvailable:"app_updateAvailable",downloadProgress:"app_downloadProgress",signOut:"app_signOut",setReleaseNotes:"app_setReleaseNotes",appVersion:"app_appVersion",scrubResults:"app_scrubResults",scrubError:"app_scrubError"}},store:{get:"store__get",getAll:"store_getAll",set:"store_set",response:"store_response"},fileScan:{toMain:{scanFilePaths:"fileScan__scanFilePaths",importJob:"fileScan__importJob",deleteAllEms:"filescan_deleteAllEms"},toRenderer:{scanFilePathsResponse:"fileScan__scanFilePathsResponse"}},fileWatcher:{toMain:{filepathsGet:"filewatcher__filepathsget",start:"filewatcher__start",stop:"filewatcher__stop",addPath:"filewatcher__addPath",removePath:"filewatcher__removePath",setPolling:"filewatcher__setPolling"},toRenderer:{filepathsList:"filewatcher__filepathslist",startSuccess:"filewatcher__start-success",startFailure:"filewatcher__start-failure",stopSuccess:"filewatcher__stop-success",error:"filewatcher__error",getPolling:"filewatcher__getPolling"}},audit:{toMain:{browseForFile:"audit__browseForFile",runAudit:"audit__runAudit",readFile:"audit__readFile"},toRenderer:{auditFilePath:"audit__filepath",auditClaimsArray:"audit_claimsArray",auditError:"audit__auditError"}},estimate:{toRenderer:{estimateDecodeStart:"estimatedecode__start",estimateDecodeSuccess:"estimatedecode__success",estimateDecodeFailure:"estimatedecode__failure",getCloseDate:"getclosedate"}}}});var P=p(Ne=>{Ne.default=Pe()});var y=p(Ae=>{var{randomUUID:bt}=require("crypto"),yt=require("electron-store"),Rt=new yt({defaults:{deviceId:bt(),showChangeLog:!0,enableNotifications:!0,filePaths:[],accepted_ins_co:[],runWatcherOnStartup:!0,polling:{enabled:!1,pollingInterval:3e4},ins_rule_set:null}});Ae.store=Rt});var ae=p(Ie=>{var{Notification:Pt}=require("electron"),Nt=require("path"),{store:At}=y();function It(e){At.get("enableNotifications")&&Pt({icon:Nt.join(__dirname,"../../src/assets/logo512.png"),...e}).show()}Ie.NewNotification=It});var Se=p(ve=>{var M=require("moment"),vt=[{title:"V1",range:[M("2010-01-01"),M("2023-04-01")]},{title:"V2",range:[M("2023-04-01"),M("2024-09-01")]},{title:"V3",range:[M("2024-09-01"),M("2040-01-01")]}];function St(e){let t=e?M(e):M();return vt.find(a=>t.isSameOrAfter(a.range[0])&&t.isBefore(a.range[1]))?.title}ve.WhichRulesetToApply=St});var Fe=p(Ee=>{var{DBFFile:kr}=require("dbffile"),Wr=require("path"),Ur=require("lodash"),Vr=require("electron-log"),{store:Br}=y(),{BrowserWindow:$r}=require("electron"),Jr=P();Ee.claimsClerk=({jobline:e,joblines:t})=>Et.map(a=>a({jobline:e,joblines:t})).filter(a=>a!==null);var Et=[({jobline:e,joblines:t})=>e.db_hrs!==0&&e.mod_lb_hrs!==e.db_hrs&&e.lbr_inc===!1&&e.lbr_hrs_j===!0?{key:"Manual labor Time Change",alert:`
+var p=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Pe=p((Tr,Rt)=>{Rt.exports={webcontent:"webcontent-send",quit:"quit-app",test:{start:"test-start"},app:{toMain:{setAcceptableInsCoNm:"setAcceptableInsCoNm",setUserName:"setUserName",track:"analytics_track",checkForUpdates:"app_checkForUpdates",downloadUpdates:"app_downloadUpdates",installUpdates:"app_installupdates",getReleaseNotes:"app_getReleaseNotes",getAppVersion:"app_getApVersion",importJob:"app_importJob",setReleaseChannel:"app_setReleaseChannel",scrubEstimate:"app_scrubEstimate",openExternalWindow:"app_openExternalWindow",setInsRuleSet:"app_setInsRuleSet",log:{info:"app_logInfo",debug:"app_logDebug",warn:"app_logWarn",error:"app_logError",silly:"app_logSilly"}},toRenderer:{updateAvailable:"app_updateAvailable",downloadProgress:"app_downloadProgress",signOut:"app_signOut",setReleaseNotes:"app_setReleaseNotes",appVersion:"app_appVersion",scrubResults:"app_scrubResults",scrubError:"app_scrubError"}},store:{get:"store__get",getAll:"store_getAll",set:"store_set",response:"store_response"},fileScan:{toMain:{scanFilePaths:"fileScan__scanFilePaths",importJob:"fileScan__importJob",deleteAllEms:"filescan_deleteAllEms"},toRenderer:{scanFilePathsResponse:"fileScan__scanFilePathsResponse"}},fileWatcher:{toMain:{filepathsGet:"filewatcher__filepathsget",start:"filewatcher__start",stop:"filewatcher__stop",addPath:"filewatcher__addPath",removePath:"filewatcher__removePath",setPolling:"filewatcher__setPolling"},toRenderer:{filepathsList:"filewatcher__filepathslist",startSuccess:"filewatcher__start-success",startFailure:"filewatcher__start-failure",stopSuccess:"filewatcher__stop-success",error:"filewatcher__error",getPolling:"filewatcher__getPolling"}},audit:{toMain:{browseForFile:"audit__browseForFile",runAudit:"audit__runAudit",readFile:"audit__readFile"},toRenderer:{auditFilePath:"audit__filepath",auditClaimsArray:"audit_claimsArray",auditError:"audit__auditError"}},estimate:{toRenderer:{estimateDecodeStart:"estimatedecode__start",estimateDecodeSuccess:"estimatedecode__success",estimateDecodeFailure:"estimatedecode__failure",getCloseDate:"getclosedate"}}}});var P=p(Ne=>{Ne.default=Pe()});var R=p(Ae=>{var{randomUUID:bt}=require("crypto"),Pt=require("electron-store"),Nt=new Pt({defaults:{deviceId:bt(),showChangeLog:!0,enableNotifications:!0,filePaths:[],accepted_ins_co:[],runWatcherOnStartup:!0,polling:{enabled:!1,pollingInterval:3e4},ins_rule_set:null}});Ae.store=Nt});var ae=p(Ie=>{var{Notification:At}=require("electron"),It=require("path"),{store:vt}=R();function St(e){vt.get("enableNotifications")&&At({icon:It.join(__dirname,"../../src/assets/logo512.png"),...e}).show()}Ie.NewNotification=St});var Se=p(ve=>{var L=require("moment"),Et=[{title:"V1",range:[L("2010-01-01"),L("2023-04-01")]},{title:"V2",range:[L("2023-04-01"),L("2024-09-01")]},{title:"V3",range:[L("2024-09-01"),L("2040-01-01")]}];function Ct(e){let t=e?L(e):L();return Et.find(a=>t.isSameOrAfter(a.range[0])&&t.isBefore(a.range[1]))?.title}ve.WhichRulesetToApply=Ct});var Ce=p(Ee=>{var{DBFFile:kr}=require("dbffile"),Ur=require("path"),Vr=require("lodash"),Br=require("electron-log"),{store:$r}=R(),{BrowserWindow:Gr}=require("electron"),Jr=P();Ee.claimsClerk=({jobline:e,joblines:t})=>Lt.map(a=>a({jobline:e,joblines:t})).filter(a=>a!==null);var Lt=[({jobline:e,joblines:t})=>e.db_hrs!==0&&e.mod_lb_hrs!==e.db_hrs&&e.lbr_inc===!1&&e.lbr_hrs_j===!0?{key:"Manual labor Time Change",alert:`
Labor time manually changed from original CEG time.
- This could possibly be denied by MPI.
@@ -35,7 +35,7 @@ var p=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Pe=p((xr,wt)=>
- NOTE: You do not need to show MPI your cost on this part, only retail.
-
`}:null,({jobline:e,joblines:t})=>{if((e.part_type==="PAA"||e.part_type==="PAL")&&e.alt_partno&&e.act_price
o.line_no===e.line_no);if(!t[r+1]?.line_desc.includes("price"))return{key:"Missing pricematch explanation",alert:"In that explanation line (900501) we are looking for the words \u201Cpricematch\u201D or \u201Cprice\u201D & \u201Cmatch\u201D.
"}}return null},({jobline:e,joblines:t})=>null,({jobline:e,joblines:t})=>e.part_type&&e.part_qty!==1?{key:"Quantity Changed",alert:`
+
`}:null,({jobline:e,joblines:t})=>{if((e.part_type==="PAA"||e.part_type==="PAL")&&e.alt_partno&&e.act_prices.line_no===e.line_no);if(!t[r+1]?.line_desc.includes("price"))return{key:"Missing pricematch explanation",alert:"In that explanation line (900501) we are looking for the words \u201Cpricematch\u201D or \u201Cprice\u201D & \u201Cmatch\u201D.
"}}return null},({jobline:e,joblines:t})=>null,({jobline:e,joblines:t})=>e.part_type&&e.part_qty!==1?{key:"Quantity Changed",alert:`
Quantity manual change detected.
-
@@ -48,7 +48,7 @@ var p=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Pe=p((xr,wt)=>
calculation.
-
`}:null]});var J=p(K=>{var{DBFFile:R}=require("dbffile"),Q=require("path"),N=require("lodash"),m=require("electron-log"),{store:oe}=y(),{BrowserWindow:Le}=require("electron"),xe=P(),{NewNotification:Me}=ae(),{WhichRulesetToApply:Ft}=Se(),{claimsClerk:Yr}=Fe();async function Mt(e){let t=Q.parse(e),r=Q.join(t.dir,t.name),a=await qe(r);Le.getAllWindows()[0].webContents.send(xe.default.estimate.toRenderer.getCloseDate,{filepath:e,clm_no:a.CLM_NO})}async function Ct(e,t){let r=await Te(e,!1,t),a=Le.getAllWindows()[0];r&&!r.ERROR?(a.webContents.send(xe.default.estimate.toRenderer.estimateDecodeSuccess,r),m.info(`Sent job for upload. ${r.clm_no}`),Me({title:"Job Uploaded",body:"A new job has been uploaded."})):(m.info(`Ignored job. ${r.ERROR}`),Me({title:"Job Ignored",body:r.ERROR}))}K.ImportJobWithCloseDate=Ct;async function Te(e,t=!1,r=null){let a=Q.parse(e),o=Q.join(a.dir,a.name),n={...await qe(o),...await Tt(o),...await qt(o),...await Dt(o,r),...await Ot(o),...await Wt(o),...await xt(o),...await kt(o),...t?{filePath:e}:{}},i=await Lt(o);n.rates=[...n.rates||[],...n.mat_rates||[]],delete n.mat_rates,n.insp_date=i.INSP_DATE;let g=oe.get("ins_rule_set");(n.OWNR_FN===""||!n.OWNR_FN)&&(n.OWNR_FN=i.CLMT_FN),(n.OWNR_LN===""||!n.OWNR_LN)&&(n.OWNR_LN=i.CLMT_LN),g==="SGI"&&((n.OWNR_FN===""||!n.OWNR_FN)&&(n.OWNR_FN=n.INSD_FN),(n.OWNR_LN===""||!n.OWNR_LN)&&(n.OWNR_LN=n.INSD_LN)),n.OWNR_CO_NM&&(n.OWNR_LN=`${n.OWNR_LN} ${n.OWNR_CO_NM}`),delete n.OWNR_CO_NM,delete n.INSD_LN,delete n.INSD_FN;let _=oe.get("accepted_ins_co"),f;return _.includes(n.INS_CO_NM)?n.CLM_NO?g==="MPI"&&!(n.CLM_NO.match("-01$")||n.CLM_NO.match("-99$"))?(m.info("Job ignored. This is not a -01 or -99 claim. Claim #. "+n.CLM_NO),f={ERROR:"Job ignored. This is not a -01 or -99 claim. Claim #. "+n.CLM_NO}):(delete n.LOSS_TYPE,f=N.transform(n,function(O,L,x){O[x.toLowerCase()]=L})):(m.info("Job ignored. No claim #. "),f={ERROR:"An unique claim number must be set for all jobs sent to RPS."}):f={ERROR:`Insurance Company Name is not valid for RPS. (${n.INS_CO_NM||"No name set"})`},f}async function qe(e){let t;try{t=await R.open(`${e}A.AD1`)}catch(r){m.error("Error opening AD1 File.",r),t=await R.open(`${e}.AD1`),t&&m.log("Found AD1 file using regular CIECA Id.")}finally{if(!t)return{};let r=await t.readRecords(1);return N.pick(r[0],["INS_CO_NM","DED_AMT","CLM_NO","LOSS_DATE","LOSS_TYPE","LOSS_DESC","THEFT_IND","TLOS_IND","INSD_LN","INSD_FN","OWNR_LN","OWNR_FN","OWNR_CO_NM","OWNR_ADDR1","OWNR_CITY","OWNR_PH1"])}}async function Lt(e){let t;try{t=await R.open(`${e}B.AD2`)}catch(r){m.error("Error opening AD2 File.",r),t=await R.open(`${e}.AD2`),t&&m.log("Found AD2 file using regular CIECA Id.")}finally{if(!t)return{};let r=await t.readRecords(1);return N.pick(r[0],["CLMT_LN","CLMT_FN","INSP_DATE"])}}async function xt(e){let t;try{t=await R.open(`${e}.PFH`)}catch(r){m.error("Error opening PFH File.",r)}finally{if(!t)return{};let r=await t.readRecords(1);return N.pick(r[0],["ID_PRO_NAM"])}}async function Tt(e){let t;try{t=await R.open(`${e}V.VEH`)}catch(r){m.error("Error opening VEH File.",r),t=await R.open(`${e}.VEH`),t&&m.log("Found VEH file using regular CIECA Id.")}finally{if(!t)return{};let r=await t.readRecords(1);return N.pick(r[0],["IMPACT_1","IMPACT_2","V_VIN","V_MODEL_YR","V_MAKEDESC","V_MODEL","V_TYPE","V_MILEAGE","V_STAGE"])}}async function qt(e){let r=await(await R.open(`${e}.TTL`)).readRecords(1);return{clm_total:r[0].G_TTL_AMT,supp_amt:r[0].SUPP_AMT,g_bett_amt:r[0].G_BETT_AMT}}async function Dt(e,t){let o=(await(await R.open(`${e}.LIN`)).readRecords()).map(i=>N.transform(N.pick(i,["LINE_NO","LINE_IND","LINE_REF","DB_REF","UNQ_SEQ","LINE_DESC","PART_TYPE","PRT_DSMK_M","OEM_PARTNO","PRICE_INC","TAX_PART","DB_PRICE","ACT_PRICE","PART_QTY","PRICE_J","GLASS_FLAG","CERT_PART","ALT_PARTNO","PRT_DSMK_P","MOD_LBR_TY","DB_HRS","MOD_LB_HRS","LBR_INC","LBR_OP","LBR_HRS_J","LBR_OP_J","LBR_AMT","MISC_AMT"]),function(g,_,f){if(f==="UNQ_SEQ"){g[f.toLowerCase()]=_.toString();return}g[f.toLowerCase()]=_})),n=oe.get("ins_rule_set");return o.map(i=>{switch(i.ignore=!1,n){case"MPI":case"SGI":switch(Ft(t)){case"V1":i=De(i,o);break;case"V2":i=Oe(i,o);break;case"V3":i=Ce(i,o);break;default:i=Ce(i,o);break}break;default:m.info("Using default ruleset (MPI).");break}return i}),{joblines:{data:o}}}async function Ot(e){return{rates:(await(await R.open(`${e}.PFL`)).readRecords()).map(o=>N.pick(o,["LBR_TYPE","LBR_DESC","LBR_RATE"]))}}async function kt(e){return{totals:(await(await R.open(`${e}.STL`)).readRecords()).map(o=>N.pick(o,["TTL_TYPECD","T_AMT","T_HRS","NT_HRS"]))}}async function Wt(e){return{mat_rates:(await(await R.open(`${e}.PFM`)).readRecords()).map(o=>N.pick(o,["MATL_TYPE","CAL_PRETHR"]))}}K.DecodeEstimate=Te;K.ImportJob=Mt;function De(e,t){if(e.part_type==="PAN"&&e.line_desc.toLowerCase().includes("wheel")&&Math.abs(e.prt_dsmk_m)===Math.round(e.act_price/2*100)/100&&(m.info(`Jobline '${e.line_desc}' ignored due to wheel repair.`),e.ignore=!0),e.part_type==="PAN"&&e.db_price!==e.act_price&&e.db_price!==0&&(e.db_price=e.act_price),(e.part_type==="PAA"||e.part_type==="PAL"||e.part_type==="PAN")&&e.db_price===0&&(e.ignore=!0),e.part_type!=="PAL"&&e.act_price===0&&e.price_j&&(m.info(`Jobline '${e.line_desc}' ignored because it was manually changed to 0..`),e.ignore=!0),e.line_desc.toLowerCase().includes("glass")&&e.oem_partno.match("[A-Z]{2}[0-9]{5,6}[A-Z]{3}")&&(console.log(e.line_desc,"NAGS Line ignored"),e.ignore=!0),(!e.part_type||e.db_ref.startsWith("900")||e.line_desc.toLowerCase().startsWith("urethane")||e.line_desc.toLowerCase().startsWith("w/shield adhesive")||e.line_desc.toLowerCase().includes("tire")&&!e.line_desc.toLowerCase().includes("sensor")&&!e.line_desc.toLowerCase().includes("label")||e.line_desc.toLowerCase().startsWith("hazardous")||e.line_desc.toLowerCase().startsWith("detail")||e.line_desc.toLowerCase().startsWith("clean")||e.part_type.toUpperCase()==="PAS"||e.part_type.toUpperCase()==="PASL"||e.part_type.toUpperCase()==="PAE")&&(e.ignore=!0),e.db_ref==="900511"&&e.prt_dsmk_p!==50){e.ignore=!1,e.act_price=e.prt_dsmk_m;let r=t.find(a=>parseInt(a.unq_seq)===e.line_ref);r&&r.ignore&&(e.ignore=!0)}return e.oem_partno.toLowerCase().includes("/rps-exclude")?e.ignore=!0:e.oem_partno.toLowerCase().includes("/rps")&&(e.ignore=!1),e}function Oe(e,t){return De(e,t),e.mod_lbr_ty?.toUpperCase()==="LAG"&&(e.ignore=!0),Ut.some(r=>e.line_desc.toLowerCase().includes(r))&&(e.ignore=!0),Vt.some(r=>e.line_desc.toLowerCase().includes(r))&&(e.ignore=!0),e}function Ce(e,t){return Oe(e,t),e}var Ut=["seat belt","air bag bolt","air bag cable reel","air bag center sensor","air bag clock","air bag coil","air bag control","air bag diagnostic","air bag driver","air bag ecs","air bag harness","air bag impact","air bag label","air bag module","air bag nut","air bag rollover","air bag rotary coupler","air bag safing sensor","air bag satellite sensor","air bag screw","air bag seat","air bag warning","air bag ocs","air bag opds","air bag sensor","air bag occupant","air bag pass","air bag system air bag terminal","air bag side","side air bag","air bag weight","air bag steering","air bag decal","air bag switch","air bag pressure","air bag pig","air bag whiplash","air bag spiral","air bag restraint","air bag wire harness","drivers knee air bag","drivers seat air bag","inform label air bag","pass air bag wire","air bag extension","air bag caution","connector air bag","curtain air bag","air bag sdm","air bag cover","air bag srs","air bag light sensor","knee air bag","air bag contact","air bag crash","air bag lwr","air bag pad","air bag suspension","air bag spacer","back air bag","air bag reel","air bag discriminating","air bag curtain","air bag initiator","air bag positive","engine wiring harness for air bag","air bag wiring","air bag combination","air bag connector","air bag plug","rear air bag","air bag clip","air bag gas","air bag bracket","suspension air bag","passenger air bag"],Vt=["frt sunroof assembly","frt sunroof glass assembly","frt sunroof glass panel","frt sunroof panel","frt sunroof sliding panel","rear sunroof glass assembly","rear sunroof glass panel","sunroof assembly","sunroof glass assembly","sunroof glass panel","sunroof sliding panel"]});var Ve=p(Ue=>{var T=require("electron-log"),Bt=require("axios"),ne=require("path"),{BrowserWindow:ke}=require("electron"),{default:se}=P(),{promises:We}=require("fs"),{autoUpdater:$t}=require("electron-updater"),{store:Jt}=y();async function Gt(e,t){try{let r=T.transports.file.getFile().path,a=ne.dirname(r),o=ne.join(a,"esjson");await We.mkdir(o,{recursive:!0});let n=ne.join(o,`${t}.json`);return await We.writeFile(n,JSON.stringify(e,null,2),"utf8"),T.debug(`Job object written to: ${n}`),console.log(`Job object written to: ${n}`),n}catch(r){throw T.error("Error writing job object to logs folder:",r),r}}async function Yt({job:e}){let t="Imex2",r="Patrick",a=$t.channel,o;switch(a){case"alpha":o="https://4284-79287.el-alt.com";break;case"beta":o="https://4284-79073.el-alt.com";break;default:o="https://insurtechtoolkit.com";break}T.log(`Estimate Scrubber URL: [${a} |`,o);let n="87330f61-412b-4251-baaa-d026565b23c5";try{let i=e?.bodyshop?.es_api_key;if(!e){console.error("No job provided to ScrubEstimate");return}let g;switch(Jt.get("ins_rule_set")){case"MPI":g="ATAM";break;case"SGI":g="SAAR";break;default:g="ATAM";break}e.sending_entity_id=n,e.sending_entity_accept_terms_of_use=!0,e.association_switch=g,e.rf_zip=e.bodyshop.zip_post,e.rf_ph1=e.bodyshop.phone,e.g_ttl_amt=e.clm_total,e.source_system="M",e.v_mileage=e.v_mileage?.toString()||"",delete e.clm_total,delete e.bodyshop,e.rates&&Array.isArray(e.rates)&&e.rates.forEach(w=>{w.MATL_TYPE&&(w.MAT_TYPE=w.MATL_TYPE,delete w.MATL_TYPE)}),e.rates&&Array.isArray(e.rates)&&(e.rates=e.rates.map(w=>{let F={};for(let[k,W]of Object.entries(w))F[k.toLowerCase()]=W;return F})),e.totals&&Array.isArray(e.totals)&&(e.totals=e.totals.map(w=>{let F={};for(let[k,W]of Object.entries(w))F[k.toLowerCase()]=W;return F}));let _=`RPS-Scrub-${i}-${e.clm_no}-${Date.now()}`;try{await Gt(e,_)}catch(w){T.error("Failed to write job to logs folder:",w)}let f=new FormData,O=JSON.stringify(e);f.append("file",new Blob([O],{type:"application/json"}),`${_}.json`);let L=await Bt.post(`${o}/api/sendems`,f,{auth:{username:t,password:r},headers:{...f.getHeaders?f.getHeaders():{},APIkey:i}}),x=L?.data?.report_link,z=`https://insurtechtoolkit.com/pcontactUs.aspx?apiKey=${i}&file=${_}.json`;return ke.getAllWindows()[0].webContents.send(se.app.toRenderer.scrubResults,{jobid:e.id,items:L.data?.identified_item,pdfUrl:x,reportIssueUrl:z}),x}catch(i){T.error("Error while scrubbing estimate:",i,i.stack),T.error("Error Response Data:",i.response?.data);let g=ke.getAllWindows()[0];i.status===400?g.webContents.send(se.app.toRenderer.scrubError,{message:i.response?.data||"Error encountered sending estimate to Estimate Scrubber."}):i.status===401&&g.webContents.send(se.app.toRenderer.scrubError,{message:"Authentication with Estimate Scrubber failed."})}}Ue.ScrubEstimate=Yt});var $e=p(Z=>{var Ht=require("chokidar"),ie=P(),zt=require("path"),{ImportJob:Qt}=J(),{BrowserWindow:le}=require("electron"),{store:X}=y(),{NewNotification:de}=ae(),I=require("electron-log"),C;async function Kt(){let e=X.get("filePaths")||[];if(I.info("Use polling? ",X.get("polling").enabled),e.length===0)return de({title:"RPS Watcher cannot start",body:"Please set the appropriate file paths and try again."}),I.warn("Cannot start watcher. No file paths set."),[];if(C)try{I.info("Trying to close watcher - it already existed."),await C.close(),I.info("Watcher closed successfully!")}catch(t){I.error("Error trying to close Watcher.",t)}return C=Ht.watch(e,{ignored:(t,r)=>{let a=zt.parse(t);return a.ext!==""&&a.ext.toUpperCase()!==".ENV"},usePolling:X.get("polling").enabled||!1,interval:X.get("polling").pollingInterval||1e3,persistent:!0,ignoreInitial:!0,awaitWriteFinish:{pollInterval:500,stabilityThreshold:2e3}}),C.on("add",async function(t){console.log("File",t,"has been added"),Be(t)}).on("change",async function(t){console.log("File",t,"has been changed"),Be(t)}).on("error",function(t){I.error("Error in Watcher",t);let r=le.getFocusedWindow();r&&r.webContents.send(ie.default.fileWatcher.toRenderer.error,t)}).on("ready",Xt).on("raw",function(t,r,a){}),e}function Xt(){I.info("Watcher ready!"),le.getAllWindows()[0].webContents.send(ie.default.fileWatcher.toRenderer.startSuccess),de({title:"RPS Watcher Started",body:"Newly exported estimates will be automatically uploaded."}),I.info("Confirmed watched paths:",C.getWatched())}async function Zt(){C&&(await C.close(),I.info("Watcher stopped."),le.getAllWindows()[0].webContents.send(ie.default.fileWatcher.toRenderer.stopSuccess),de({title:"RPS Watcher Stopped",body:"Estimates will not be automatically uploaded."}))}Z.StartWatcher=Kt;Z.StopWatcher=Zt;Z.watcher=C;async function Be(e){await Qt(e)}});var ce=p(()=>{var jt=require("path"),er=require("fs"),Je=jt.join(__dirname,"..","dist-electron","main.cjs"),tr=!require("electron-is-dev")&&er.existsSync(Je);tr?require(Je):Ge()});var He=p(()=>{var{ipcMain:G,dialog:rr}=require("electron"),{StartWatcher:ar,StopWatcher:ue}=$e(),S=P(),{mainWindow:or}=ce(),nr=require("lodash"),{store:v}=y(),Ye=require("path");G.on(S.default.fileWatcher.toMain.filepathsGet,async(e,t)=>{e.reply(S.default.fileWatcher.toRenderer.filepathsList,v.get("filePaths"))});G.on(S.default.fileWatcher.toMain.start,async(e,t)=>{(t&&t.startup&&v.get("runWatcherOnStartup")||!t)&&ar(),e.sender.send(S.default.fileWatcher.toRenderer.filepathsList,v.get("filePaths"))});G.on(S.default.fileWatcher.toMain.stop,async(e,t)=>{ue()});G.on(S.default.fileWatcher.toMain.addPath,async(e,t)=>{let r=await rr.showOpenDialog(or,{properties:["openDirectory"]});ue(),v.set("filePaths",nr.union(r.filePaths,v.get("filePaths")));let a=v.get("filePaths");e.sender.send(S.default.fileWatcher.toRenderer.filepathsList,a)});G.on(S.default.fileWatcher.toMain.removePath,async(e,t)=>{ue(),v.set("filePaths",v.get("filePaths").filter(a=>{let o=Ye.parse(a),n=Ye.parse(t);return o.dir+o.base!==n.dir+n.base}));let r=v.get("filePaths");e.sender.send(S.default.fileWatcher.toRenderer.filepathsList,r)})});var Xe=p(fe=>{var Qe=require("path"),sr=require("fs"),{store:Ke}=y(),ze=require("electron-log"),pe=sr.promises,{DecodeEstimate:ir}=J();async function lr(){ze.info("Scanning all local estimates..");let e=await cr(),t=await dr(e),r=t.filter(a=>!a.ERROR);return ze.log("Number of estimates filtered on file scan due to error: ",t.length-r.length),r}async function dr(e){return await Promise.all(e.map(async t=>await ir(t,!0)))}async function cr(){let e=Ke.get("filePaths"),t=[];return await Promise.all(e.map(async r=>{(await pe.readdir(r)).filter(o=>o.toUpperCase().includes(".ENV")).map(o=>(t.push(Qe.join(r,o)),null))})),t}async function ur(){try{let e=Ke.get("filePaths"),t=[];return await Promise.all(e.map(async r=>{(await pe.readdir(r)).map(o=>(t.push(Qe.join(r,o)),null))})),await Promise.all(t.map(async r=>{await pe.unlink(r)})),!0}catch{return!1}}fe.GetListOfEstimates=lr;fe.DeleteAllEms=ur});var je=p(()=>{var{ipcMain:ge}=require("electron"),Y=P(),{ImportJob:pr}=J(),{GetListOfEstimates:Ze,DeleteAllEms:fr}=Xe();ge.on(Y.default.fileScan.toMain.scanFilePaths,async(e,t)=>{let r=await Ze();e.reply(Y.default.fileScan.toRenderer.scanFilePathsResponse,r)});ge.on(Y.default.fileScan.toMain.importJob,async(e,t)=>{await pr(t)});ge.on(Y.default.fileScan.toMain.deleteAllEms,async(e,t)=>{await fr();let r=await Ze();e.reply(Y.default.fileScan.toRenderer.scanFilePathsResponse,r)})});var ot=p(()=>{var{ipcMain:et,dialog:gr}=require("electron"),U=P(),{mainWindow:hr}=ce(),aa=require("lodash"),{store:tt}=y(),oa=require("path"),rt=require("node-xlsx"),at=require("electron-log");et.on(U.default.audit.toMain.browseForFile,async(e,{sheetName:t})=>{let r=await gr.showOpenDialog(hr,{filters:[{extensions:["xls","xlsx"],name:"Excel Files"}],properties:["openFile"]});if(!r.canceled)try{var a=rt.parse(r.filePaths[0],{cellDates:!0});tt.set("auditFilePath",r.filePaths),e.sender.send(U.default.audit.toRenderer.auditFilePath,{filePath:r.filePaths[0],sheets:a.map(o=>o.name)})}catch(o){console.log("Got some sort of err",o),at.error("Error when trying to read audit xlsx file",o),e.sender.send(U.default.audit.toRenderer.auditError,o.meFssage)}});et.on(U.default.audit.toMain.runAudit,async(e,{sheetName:t})=>{try{let a=tt.get("auditFilePath");var r=rt.parse(a[0],{cellDates:!0});let o=r.find(s=>s.name===t),n=[],i,g,_,f,O,L,x,z,re,w,F,k,W,be,ye,Re;o.data.forEach(s=>{if(!i&&s[0]==="Claim Number")i=!0,_=s.findIndex(d=>d==="Claim Number"),f=s.findIndex(d=>d==="Ready for Pay Date"),O=s.findIndex(d=>d==="Vehicle Year"),L=s.findIndex(d=>d==="Vehicle Make"),x=s.findIndex(d=>d==="Vehicle Model"),z=s.findIndex(d=>d==="Under 20K"),re=s.findIndex(d=>d==="OE Part Prices"),w=s.findIndex(d=>d==="AM Part Prices"),F=s.findIndex(d=>d==="Recycled Part Prices"),k=s.findIndex(d=>d==="Reman & Other Part Prices"),W=s.findIndex(d=>d==="(a) Eligible OEM Part Prices"),be=s.findIndex(d=>d==="(b) Eligible Actual Part Prices"),ye=s.findIndex(d=>d==="(e) Expected RPS $ "),Re=s.findIndex(d=>d==="(f) Actual RPS $");else if(i&&!g&&s[0]&&s[0]!=="Grand Total"){let d={clm_no:s[_].startsWith("00")?s[_].slice(2):s[_],close_date:s[f],v_model_yr:s[O],v_makedesc:s[L],v_model:s[x],under20kmiles:s[z],pan_total:s[re],paa_total:s[w],pal_total:s[F],pam_total:s[k],eligible_db_price_total:Math.round((s[W]+Number.EPSILON)*100)/100,eligible_act_price_total:Math.round((s[be]+Number.EPSILON)*100)/100,expected_rps_dollars:Math.round((s[ye]+Number.EPSILON)*100)/100,actual_rps_dollars:Math.round((s[Re]+Number.EPSILON)*100)/100};n.push(d)}}),e.sender.send(U.default.audit.toRenderer.auditClaimsArray,n)}catch(a){console.log("ot some sort of err",a),at.error("Error when trying to read audit xlsx file",a),e.sender.send(U.default.audit.toRenderer.auditError,a.message)}})});var he=p((ia,mr)=>{mr.exports={"1.0.9":{title:"Release Notes for 1.0.9",date:"11/17/2020",notes:`New Features:
+ `}:null]});var G=p(K=>{var{DBFFile:b}=require("dbffile"),Q=require("path"),N=require("lodash"),h=require("electron-log"),{store:se}=R(),{BrowserWindow:Me}=require("electron"),xe=P(),{NewNotification:Le}=ae(),{WhichRulesetToApply:Ft}=Se(),{claimsClerk:Yr}=Ce();async function Mt(e){let t=Q.parse(e),r=Q.join(t.dir,t.name),a=await qe(r);Me.getAllWindows()[0].webContents.send(xe.default.estimate.toRenderer.getCloseDate,{filepath:e,clm_no:a.CLM_NO})}async function xt(e,t){let r=await Te(e,!1,t),a=Me.getAllWindows()[0];r&&!r.ERROR?(a.webContents.send(xe.default.estimate.toRenderer.estimateDecodeSuccess,r),h.info(`Sent job for upload. ${r.clm_no}`),Le({title:"Job Uploaded",body:"A new job has been uploaded."})):(h.info(`Ignored job. ${r.ERROR}`),Le({title:"Job Ignored",body:r.ERROR}))}K.ImportJobWithCloseDate=xt;async function Te(e,t=!1,r=null){let a=Q.parse(e),s=Q.join(a.dir,a.name),o={...await qe(s),...await Dt(s),...await Ot(s),...await Wt(s,r),...await kt(s),...await Vt(s),...await qt(s),...await Ut(s),...t?{filePath:e}:{}},i=await Tt(s);o.rates=[...o.rates||[],...o.mat_rates||[]],delete o.mat_rates,o.insp_date=i.INSP_DATE;let g=se.get("ins_rule_set");(o.OWNR_FN===""||!o.OWNR_FN)&&(o.OWNR_FN=i.CLMT_FN),(o.OWNR_LN===""||!o.OWNR_LN)&&(o.OWNR_LN=i.CLMT_LN),g==="SGI"&&((o.OWNR_FN===""||!o.OWNR_FN)&&(o.OWNR_FN=o.INSD_FN),(o.OWNR_LN===""||!o.OWNR_LN)&&(o.OWNR_LN=o.INSD_LN)),o.OWNR_CO_NM&&(o.OWNR_LN=`${o.OWNR_LN} ${o.OWNR_CO_NM}`),delete o.OWNR_CO_NM,delete o.INSD_LN,delete o.INSD_FN;let _=se.get("accepted_ins_co"),f;return _.includes(o.INS_CO_NM)?o.CLM_NO?g==="MPI"&&!(o.CLM_NO.match("-01$")||o.CLM_NO.match("-99$"))?(h.info("Job ignored. This is not a -01 or -99 claim. Claim #. "+o.CLM_NO),f={ERROR:"Job ignored. This is not a -01 or -99 claim. Claim #. "+o.CLM_NO}):(delete o.LOSS_TYPE,f=N.transform(o,function(W,M,x){W[x.toLowerCase()]=M})):(h.info("Job ignored. No claim #. "),f={ERROR:"An unique claim number must be set for all jobs sent to RPS."}):f={ERROR:`Insurance Company Name is not valid for RPS. (${o.INS_CO_NM||"No name set"})`},f}async function qe(e){let t;try{t=await b.open(`${e}A.AD1`)}catch(r){h.error("Error opening AD1 File.",r),t=await b.open(`${e}.AD1`),t&&h.log("Found AD1 file using regular CIECA Id.")}finally{if(!t)return{};let r=await t.readRecords(1);return N.pick(r[0],["INS_CO_NM","DED_AMT","CLM_NO","LOSS_DATE","LOSS_TYPE","LOSS_DESC","THEFT_IND","TLOS_IND","INSD_LN","INSD_FN","OWNR_LN","OWNR_FN","OWNR_CO_NM","OWNR_ADDR1","OWNR_CITY","OWNR_PH1"])}}async function Tt(e){let t;try{t=await b.open(`${e}B.AD2`)}catch(r){h.error("Error opening AD2 File.",r),t=await b.open(`${e}.AD2`),t&&h.log("Found AD2 file using regular CIECA Id.")}finally{if(!t)return{};let r=await t.readRecords(1);return N.pick(r[0],["CLMT_LN","CLMT_FN","INSP_DATE"])}}async function qt(e){let t;try{t=await b.open(`${e}.PFH`)}catch(r){h.error("Error opening PFH File.",r)}finally{if(!t)return{};let r=await t.readRecords(1);return N.pick(r[0],["ID_PRO_NAM"])}}async function Dt(e){let t;try{t=await b.open(`${e}V.VEH`)}catch(r){h.error("Error opening VEH File.",r),t=await b.open(`${e}.VEH`),t&&h.log("Found VEH file using regular CIECA Id.")}finally{if(!t)return{};let r=await t.readRecords(1);return N.pick(r[0],["IMPACT_1","IMPACT_2","V_VIN","V_MODEL_YR","V_MAKEDESC","V_MODEL","V_TYPE","V_MILEAGE","V_STAGE"])}}async function Ot(e){let r=await(await b.open(`${e}.TTL`)).readRecords(1);return{clm_total:r[0].G_TTL_AMT,supp_amt:r[0].SUPP_AMT,g_bett_amt:r[0].G_BETT_AMT}}async function Wt(e,t){let s=(await(await b.open(`${e}.LIN`)).readRecords()).map(i=>N.transform(N.pick(i,["LINE_NO","LINE_IND","LINE_REF","DB_REF","UNQ_SEQ","LINE_DESC","PART_TYPE","PRT_DSMK_M","OEM_PARTNO","PRICE_INC","TAX_PART","DB_PRICE","ACT_PRICE","PART_QTY","PRICE_J","GLASS_FLAG","CERT_PART","ALT_PARTNO","PRT_DSMK_P","MOD_LBR_TY","DB_HRS","MOD_LB_HRS","LBR_INC","LBR_OP","LBR_HRS_J","LBR_OP_J","LBR_AMT","MISC_AMT"]),function(g,_,f){if(f==="UNQ_SEQ"){g[f.toLowerCase()]=_.toString();return}g[f.toLowerCase()]=_})),o=se.get("ins_rule_set");return s.map(i=>{switch(i.ignore=!1,o){case"SGI":i=Bt(i,s);break;case"MPI":switch(Ft(t)){case"V1":i=De(i,s);break;case"V2":i=Oe(i,s);break;case"V3":i=Fe(i,s);break;default:i=Fe(i,s);break}break;default:h.info("Using default ruleset (MPI).");break}return i}),{joblines:{data:s}}}async function kt(e){return{rates:(await(await b.open(`${e}.PFL`)).readRecords()).map(s=>N.pick(s,["LBR_TYPE","LBR_DESC","LBR_RATE"]))}}async function Ut(e){return{totals:(await(await b.open(`${e}.STL`)).readRecords()).map(s=>N.pick(s,["TTL_TYPECD","T_AMT","T_HRS","NT_HRS"]))}}async function Vt(e){return{mat_rates:(await(await b.open(`${e}.PFM`)).readRecords()).map(s=>N.pick(s,["MATL_TYPE","CAL_PRETHR"]))}}K.DecodeEstimate=Te;K.ImportJob=Mt;function De(e,t){if((e.part_type==="PAN"||e.part_type==="PAA")&&e.line_desc.toLowerCase().includes("wheel")&&Math.abs(e.prt_dsmk_m)===Math.round(e.act_price/2*100)/100&&(h.info(`Jobline '${e.line_desc}' ignored due to wheel repair.`),e.ignore=!0),e.part_type==="PAN"&&e.db_price!==e.act_price&&e.db_price!==0&&(e.db_price=e.act_price),(e.part_type==="PAA"||e.part_type==="PAL"||e.part_type==="PAN")&&e.db_price===0&&(e.ignore=!0),e.part_type!=="PAL"&&e.act_price===0&&e.price_j&&(h.info(`Jobline '${e.line_desc}' ignored because it was manually changed to 0..`),e.ignore=!0),e.line_desc.toLowerCase().includes("glass")&&e.oem_partno.match("[A-Z]{2}[0-9]{5,6}[A-Z]{3}")&&(console.log(e.line_desc,"NAGS Line ignored"),e.ignore=!0),(!e.part_type||e.db_ref.startsWith("900")||e.line_desc.toLowerCase().startsWith("urethane")||e.line_desc.toLowerCase().startsWith("w/shield adhesive")||e.line_desc.toLowerCase().includes("tire")&&!e.line_desc.toLowerCase().includes("sensor")&&!e.line_desc.toLowerCase().includes("label")||e.line_desc.toLowerCase().startsWith("hazardous")||e.line_desc.toLowerCase().startsWith("detail")||e.line_desc.toLowerCase().startsWith("clean")||e.part_type.toUpperCase()==="PAS"||e.part_type.toUpperCase()==="PASL"||e.part_type.toUpperCase()==="PAE")&&(e.ignore=!0),e.db_ref==="900511"&&e.prt_dsmk_p!==50){e.ignore=!1,e.act_price=e.prt_dsmk_m;let r=t.find(a=>parseInt(a.unq_seq)===e.line_ref);r&&r.ignore&&(e.ignore=!0)}return e.oem_partno.toLowerCase().includes("/rps-exclude")?e.ignore=!0:e.oem_partno.toLowerCase().includes("/rps")&&(e.ignore=!1),e}function Oe(e,t){return De(e,t),e.mod_lbr_ty?.toUpperCase()==="LAG"&&(e.ignore=!0),We.some(r=>e.line_desc.toLowerCase().includes(r))&&(e.ignore=!0),ke.some(r=>e.line_desc.toLowerCase().includes(r))&&(e.ignore=!0),e}function Fe(e,t){return Oe(e,t),e}function Bt(e,t){if(e.part_type==="PAN"&&e.db_price!==e.act_price&&e.db_price!==0&&(e.db_price=e.act_price),(e.part_type==="PAA"||e.part_type==="PAL"||e.part_type==="PAN")&&e.db_price===0&&(e.ignore=!0),e.part_type!=="PAL"&&e.act_price===0&&e.price_j&&(h.info(`Jobline '${e.line_desc}' ignored because it was manually changed to 0..`),e.ignore=!0),e.line_desc.toLowerCase().includes("glass")&&e.oem_partno.match("[A-Z]{2}[0-9]{5,6}[A-Z]{3}")&&(console.log(e.line_desc,"NAGS Line ignored"),e.ignore=!0),(!e.part_type||e.db_ref.startsWith("900")||e.line_desc.toLowerCase().startsWith("urethane")||e.line_desc.toLowerCase().startsWith("w/shield adhesive")||e.line_desc.toLowerCase().includes("tire")&&!e.line_desc.toLowerCase().includes("sensor")&&!e.line_desc.toLowerCase().includes("label")||e.line_desc.toLowerCase().startsWith("hazardous")||e.line_desc.toLowerCase().startsWith("detail")||e.line_desc.toLowerCase().startsWith("clean")||e.part_type.toUpperCase()==="PAS"||e.part_type.toUpperCase()==="PASL"||e.part_type.toUpperCase()==="PAE")&&(e.ignore=!0),e.db_ref==="900511"&&e.prt_dsmk_p!==50){e.ignore=!1,e.act_price=e.prt_dsmk_m;let r=t.find(a=>parseInt(a.unq_seq)===e.line_ref);r&&r.ignore&&(e.ignore=!0)}return e.oem_partno.toLowerCase().includes("/rps-exclude")?e.ignore=!0:e.oem_partno.toLowerCase().includes("/rps")&&(e.ignore=!1),e.mod_lbr_ty?.toUpperCase()==="LAG"&&(e.ignore=!0),We.some(r=>e.line_desc.toLowerCase().includes(r))&&(e.ignore=!0),ke.some(r=>e.line_desc.toLowerCase().includes(r))&&(e.ignore=!0),e.line_desc.toUpperCase().includes("USED PARTS THRESHOLD")&&(e.ignore=!1),e}var We=["seat belt","air bag bolt","air bag cable reel","air bag center sensor","air bag clock","air bag coil","air bag control","air bag diagnostic","air bag driver","air bag ecs","air bag harness","air bag impact","air bag label","air bag module","air bag nut","air bag rollover","air bag rotary coupler","air bag safing sensor","air bag satellite sensor","air bag screw","air bag seat","air bag warning","air bag ocs","air bag opds","air bag sensor","air bag occupant","air bag pass","air bag system air bag terminal","air bag side","side air bag","air bag weight","air bag steering","air bag decal","air bag switch","air bag pressure","air bag pig","air bag whiplash","air bag spiral","air bag restraint","air bag wire harness","drivers knee air bag","drivers seat air bag","inform label air bag","pass air bag wire","air bag extension","air bag caution","connector air bag","curtain air bag","air bag sdm","air bag cover","air bag srs","air bag light sensor","knee air bag","air bag contact","air bag crash","air bag lwr","air bag pad","air bag suspension","air bag spacer","back air bag","air bag reel","air bag discriminating","air bag curtain","air bag initiator","air bag positive","engine wiring harness for air bag","air bag wiring","air bag combination","air bag connector","air bag plug","rear air bag","air bag clip","air bag gas","air bag bracket","suspension air bag","passenger air bag"],ke=["frt sunroof assembly","frt sunroof glass assembly","frt sunroof glass panel","frt sunroof panel","frt sunroof sliding panel","rear sunroof glass assembly","rear sunroof glass panel","sunroof assembly","sunroof glass assembly","sunroof glass panel","sunroof sliding panel"]});var $e=p(Be=>{var T=require("electron-log"),$t=require("axios"),oe=require("path"),{BrowserWindow:Ue}=require("electron"),{default:ne}=P(),{promises:Ve}=require("fs"),{autoUpdater:Gt}=require("electron-updater"),{store:Jt}=R();async function Ht(e,t){try{let r=T.transports.file.getFile().path,a=oe.dirname(r),s=oe.join(a,"esjson");await Ve.mkdir(s,{recursive:!0});let o=oe.join(s,`${t}.json`);return await Ve.writeFile(o,JSON.stringify(e,null,2),"utf8"),T.debug(`Job object written to: ${o}`),console.log(`Job object written to: ${o}`),o}catch(r){throw T.error("Error writing job object to logs folder:",r),r}}async function Yt({job:e}){let t="Imex2",r="Patrick",a=Gt.channel,s;switch(a){case"alpha":s="https://4284-79287.el-alt.com";break;case"beta":s="https://4284-79073.el-alt.com";break;default:s="https://insurtechtoolkit.com";break}T.log(`Estimate Scrubber URL: [${a} |`,s);let o="87330f61-412b-4251-baaa-d026565b23c5";try{let i=e?.bodyshop?.es_api_key;if(!e){console.error("No job provided to ScrubEstimate");return}let g;switch(Jt.get("ins_rule_set")){case"MPI":g="ATAM";break;case"SGI":g="SAAR";break;default:g="ATAM";break}e.sending_entity_id=o,e.sending_entity_accept_terms_of_use=!0,e.association_switch=g,e.rf_zip=e.bodyshop.zip_post,e.rf_ph1=e.bodyshop.phone,e.g_ttl_amt=e.clm_total,e.source_system="M",e.v_mileage=e.v_mileage?.toString()||"",delete e.clm_total,delete e.bodyshop,e.rates&&Array.isArray(e.rates)&&e.rates.forEach(w=>{w.MATL_TYPE&&(w.MAT_TYPE=w.MATL_TYPE,delete w.MATL_TYPE)}),e.rates&&Array.isArray(e.rates)&&(e.rates=e.rates.map(w=>{let C={};for(let[k,U]of Object.entries(w))C[k.toLowerCase()]=U;return C})),e.totals&&Array.isArray(e.totals)&&(e.totals=e.totals.map(w=>{let C={};for(let[k,U]of Object.entries(w))C[k.toLowerCase()]=U;return C}));let _=`RPS-Scrub-${i}-${e.clm_no}-${Date.now()}`;try{await Ht(e,_)}catch(w){T.error("Failed to write job to logs folder:",w)}let f=new FormData,W=JSON.stringify(e);f.append("file",new Blob([W],{type:"application/json"}),`${_}.json`);let M=await $t.post(`${s}/api/sendems`,f,{auth:{username:t,password:r},headers:{...f.getHeaders?f.getHeaders():{},APIkey:i}}),x=M?.data?.report_link,z=`https://insurtechtoolkit.com/pcontactUs.aspx?apiKey=${i}&file=${_}.json`;return Ue.getAllWindows()[0].webContents.send(ne.app.toRenderer.scrubResults,{jobid:e.id,items:M.data?.identified_item,pdfUrl:x,reportIssueUrl:z}),x}catch(i){T.error("Error while scrubbing estimate:",i,i.stack),T.error("Error Response Data:",i.response?.data);let g=Ue.getAllWindows()[0];i.status===400?g.webContents.send(ne.app.toRenderer.scrubError,{message:i.response?.data||"Error encountered sending estimate to Estimate Scrubber."}):i.status===401&&g.webContents.send(ne.app.toRenderer.scrubError,{message:"Authentication with Estimate Scrubber failed."})}}Be.ScrubEstimate=Yt});var Je=p(Z=>{var zt=require("chokidar"),ie=P(),Qt=require("path"),{ImportJob:Kt}=G(),{BrowserWindow:le}=require("electron"),{store:X}=R(),{NewNotification:de}=ae(),I=require("electron-log"),F;async function Xt(){let e=X.get("filePaths")||[];if(I.info("Use polling? ",X.get("polling").enabled),e.length===0)return de({title:"RPS Watcher cannot start",body:"Please set the appropriate file paths and try again."}),I.warn("Cannot start watcher. No file paths set."),[];if(F)try{I.info("Trying to close watcher - it already existed."),await F.close(),I.info("Watcher closed successfully!")}catch(t){I.error("Error trying to close Watcher.",t)}return F=zt.watch(e,{ignored:(t,r)=>{let a=Qt.parse(t);return a.ext!==""&&a.ext.toUpperCase()!==".ENV"},usePolling:X.get("polling").enabled||!1,interval:X.get("polling").pollingInterval||1e3,persistent:!0,ignoreInitial:!0,awaitWriteFinish:{pollInterval:500,stabilityThreshold:2e3}}),F.on("add",async function(t){console.log("File",t,"has been added"),Ge(t)}).on("change",async function(t){console.log("File",t,"has been changed"),Ge(t)}).on("error",function(t){I.error("Error in Watcher",t);let r=le.getFocusedWindow();r&&r.webContents.send(ie.default.fileWatcher.toRenderer.error,t)}).on("ready",Zt).on("raw",function(t,r,a){}),e}function Zt(){I.info("Watcher ready!"),le.getAllWindows()[0].webContents.send(ie.default.fileWatcher.toRenderer.startSuccess),de({title:"RPS Watcher Started",body:"Newly exported estimates will be automatically uploaded."}),I.info("Confirmed watched paths:",F.getWatched())}async function jt(){F&&(await F.close(),I.info("Watcher stopped."),le.getAllWindows()[0].webContents.send(ie.default.fileWatcher.toRenderer.stopSuccess),de({title:"RPS Watcher Stopped",body:"Estimates will not be automatically uploaded."}))}Z.StartWatcher=Xt;Z.StopWatcher=jt;Z.watcher=F;async function Ge(e){await Kt(e)}});var ce=p(()=>{var er=require("path"),tr=require("fs"),He=er.join(__dirname,"..","dist-electron","main.cjs"),rr=!require("electron-is-dev")&&tr.existsSync(He);rr?require(He):Ye()});var Qe=p(()=>{var{ipcMain:J,dialog:ar}=require("electron"),{StartWatcher:sr,StopWatcher:ue}=Je(),S=P(),{mainWindow:or}=ce(),nr=require("lodash"),{store:v}=R(),ze=require("path");J.on(S.default.fileWatcher.toMain.filepathsGet,async(e,t)=>{e.reply(S.default.fileWatcher.toRenderer.filepathsList,v.get("filePaths"))});J.on(S.default.fileWatcher.toMain.start,async(e,t)=>{(t&&t.startup&&v.get("runWatcherOnStartup")||!t)&&sr(),e.sender.send(S.default.fileWatcher.toRenderer.filepathsList,v.get("filePaths"))});J.on(S.default.fileWatcher.toMain.stop,async(e,t)=>{ue()});J.on(S.default.fileWatcher.toMain.addPath,async(e,t)=>{let r=await ar.showOpenDialog(or,{properties:["openDirectory"]});ue(),v.set("filePaths",nr.union(r.filePaths,v.get("filePaths")));let a=v.get("filePaths");e.sender.send(S.default.fileWatcher.toRenderer.filepathsList,a)});J.on(S.default.fileWatcher.toMain.removePath,async(e,t)=>{ue(),v.set("filePaths",v.get("filePaths").filter(a=>{let s=ze.parse(a),o=ze.parse(t);return s.dir+s.base!==o.dir+o.base}));let r=v.get("filePaths");e.sender.send(S.default.fileWatcher.toRenderer.filepathsList,r)})});var je=p(fe=>{var Xe=require("path"),ir=require("fs"),{store:Ze}=R(),Ke=require("electron-log"),pe=ir.promises,{DecodeEstimate:lr}=G();async function dr(){Ke.info("Scanning all local estimates..");let e=await ur(),t=await cr(e),r=t.filter(a=>!a.ERROR);return Ke.log("Number of estimates filtered on file scan due to error: ",t.length-r.length),r}async function cr(e){return await Promise.all(e.map(async t=>await lr(t,!0)))}async function ur(){let e=Ze.get("filePaths"),t=[];return await Promise.all(e.map(async r=>{(await pe.readdir(r)).filter(s=>s.toUpperCase().includes(".ENV")).map(s=>(t.push(Xe.join(r,s)),null))})),t}async function pr(){try{let e=Ze.get("filePaths"),t=[];return await Promise.all(e.map(async r=>{(await pe.readdir(r)).map(s=>(t.push(Xe.join(r,s)),null))})),await Promise.all(t.map(async r=>{await pe.unlink(r)})),!0}catch{return!1}}fe.GetListOfEstimates=dr;fe.DeleteAllEms=pr});var tt=p(()=>{var{ipcMain:ge}=require("electron"),H=P(),{ImportJob:fr}=G(),{GetListOfEstimates:et,DeleteAllEms:gr}=je();ge.on(H.default.fileScan.toMain.scanFilePaths,async(e,t)=>{let r=await et();e.reply(H.default.fileScan.toRenderer.scanFilePathsResponse,r)});ge.on(H.default.fileScan.toMain.importJob,async(e,t)=>{await fr(t)});ge.on(H.default.fileScan.toMain.deleteAllEms,async(e,t)=>{await gr();let r=await et();e.reply(H.default.fileScan.toRenderer.scanFilePathsResponse,r)})});var nt=p(()=>{var{ipcMain:rt,dialog:hr}=require("electron"),V=P(),{mainWindow:mr}=ce(),sa=require("lodash"),{store:at}=R(),oa=require("path"),st=require("node-xlsx"),ot=require("electron-log");rt.on(V.default.audit.toMain.browseForFile,async(e,{sheetName:t})=>{let r=await hr.showOpenDialog(mr,{filters:[{extensions:["xls","xlsx"],name:"Excel Files"}],properties:["openFile"]});if(!r.canceled)try{var a=st.parse(r.filePaths[0],{cellDates:!0});at.set("auditFilePath",r.filePaths),e.sender.send(V.default.audit.toRenderer.auditFilePath,{filePath:r.filePaths[0],sheets:a.map(s=>s.name)})}catch(s){console.log("Got some sort of err",s),ot.error("Error when trying to read audit xlsx file",s),e.sender.send(V.default.audit.toRenderer.auditError,s.meFssage)}});rt.on(V.default.audit.toMain.runAudit,async(e,{sheetName:t})=>{try{let a=at.get("auditFilePath");var r=st.parse(a[0],{cellDates:!0});let s=r.find(n=>n.name===t),o=[],i,g,_,f,W,M,x,z,re,w,C,k,U,ye,Re,be;s.data.forEach(n=>{if(!i&&n[0]==="Claim Number")i=!0,_=n.findIndex(d=>d==="Claim Number"),f=n.findIndex(d=>d==="Ready for Pay Date"),W=n.findIndex(d=>d==="Vehicle Year"),M=n.findIndex(d=>d==="Vehicle Make"),x=n.findIndex(d=>d==="Vehicle Model"),z=n.findIndex(d=>d==="Under 20K"),re=n.findIndex(d=>d==="OE Part Prices"),w=n.findIndex(d=>d==="AM Part Prices"),C=n.findIndex(d=>d==="Recycled Part Prices"),k=n.findIndex(d=>d==="Reman & Other Part Prices"),U=n.findIndex(d=>d==="(a) Eligible OEM Part Prices"),ye=n.findIndex(d=>d==="(b) Eligible Actual Part Prices"),Re=n.findIndex(d=>d==="(e) Expected RPS $ "),be=n.findIndex(d=>d==="(f) Actual RPS $");else if(i&&!g&&n[0]&&n[0]!=="Grand Total"){let d={clm_no:n[_].startsWith("00")?n[_].slice(2):n[_],close_date:n[f],v_model_yr:n[W],v_makedesc:n[M],v_model:n[x],under20kmiles:n[z],pan_total:n[re],paa_total:n[w],pal_total:n[C],pam_total:n[k],eligible_db_price_total:Math.round((n[U]+Number.EPSILON)*100)/100,eligible_act_price_total:Math.round((n[ye]+Number.EPSILON)*100)/100,expected_rps_dollars:Math.round((n[Re]+Number.EPSILON)*100)/100,actual_rps_dollars:Math.round((n[be]+Number.EPSILON)*100)/100};o.push(d)}}),e.sender.send(V.default.audit.toRenderer.auditClaimsArray,o)}catch(a){console.log("ot some sort of err",a),ot.error("Error when trying to read audit xlsx file",a),e.sender.send(V.default.audit.toRenderer.auditError,a.message)}})});var he=p((la,_r)=>{_r.exports={"1.0.9":{title:"Release Notes for 1.0.9",date:"11/17/2020",notes:`New Features:
- Vehicles with mileage under 20,000kms will now be included in Watcher filtering criteria.
- Savings on OEM parts will always default to the user enter price and override the estimating system price.
- Wheel related lines will no longer be automatically ignored.
@@ -169,4 +169,10 @@ Improvements:\r
* Added a floating shortcut to run 1 month and 3 month reports.\r
\r
Improvements:\r
-* Added better indicators for quantities and negative RPS values.`}}});var nt=p(()=>{var{ipcMain:h,app:_r,app:wr,BrowserWindow:br}=require("electron"),{default:u}=P(),{store:q}=y(),j=require("electron-log"),{ImportJobWithCloseDate:yr}=J(),{ScrubEstimate:Rr}=Ve();He();je();ot();console.log("*** Added IPC Handlers ***");h.on("test",async(e,t)=>{console.log("Received test IPC Command"),e.reply("test-toRenderer",{status:0,message:null})});h.on(u.app.toMain.setAcceptableInsCoNm,(e,t)=>{q.set("accepted_ins_co",t)});h.on(u.store.get,(e,t)=>{let r=q.get(t);e.sender.send(u.store.response,{[t]:r})});h.on(u.store.set,(e,t,r)=>{q.set(t,r);let a=q.get();e.sender.send(u.store.response,a)});h.on(u.store.getAll,(e,t)=>{let r=q.get();e.sender.send(u.store.response,r)});h.on(u.app.toMain.getReleaseNotes,(e,t)=>{if(q.get("showChangeLog")){let a=he()[_r.getVersion()];e.sender.send(u.app.toRenderer.setReleaseNotes,a)}else e.sender.send(u.app.toRenderer.setReleaseNotes,null)});h.on(u.app.toMain.importJob,(e,{filepath:t,close_date:r})=>{yr(t,r)});h.on(u.app.toMain.log.debug,(e,...t)=>{j.debug(t)});h.on(u.app.toMain.log.info,(e,...t)=>{j.info(t)});h.on(u.app.toMain.log.warn,(e,...t)=>{j.warn(t)});h.on(u.app.toMain.log.error,(e,...t)=>{j.error(t)});h.on(u.app.toMain.getAppVersion,(e,t)=>{e.sender.send(u.app.toRenderer.appVersion,wr.getVersion())});h.handle(u.app.toMain.scrubEstimate,(e,{job:t})=>Rr({job:t}));h.on(u.app.toMain.openExternalWindow,(e,t)=>{let r=new br({width:1200,height:800,webPreferences:{nodeIntegration:!1,contextIsolation:!0}});r.loadURL(t),r.webContents.setWindowOpenHandler(({url:a})=>(require("electron").shell.openExternal(a),{action:"deny"}))});h.on(u.app.toMain.setInsRuleSet,(e,t)=>{q.set("ins_rule_set",t)})});var ut=p(()=>{var{ipcMain:it}=require("electron"),st=require("electron-log"),{default:lt}=P(),dt=require("@amplitude/analytics-node"),{store:Pr}=y(),Nr=Pr.get("deviceId"),{app:Ar}=require("electron"),ct;dt.init("a733ff926aef84f93baf95e66b5dcb75");it.on(lt.app.toMain.setUserName,(e,t)=>{ct=t});it.on(lt.app.toMain.track,(e,t)=>{st.log("Analytics Event",t);let{event:r,...a}=t;try{dt.track(r,a,{device_id:Nr,user_id:ct,app_version:Ar.getVersion()})}catch(o){st.error(o)}})});var Ge=p(_t=>{var D=require("path"),{app:c,BrowserWindow:_e,Tray:Ir,Menu:we,ipcMain:H,dialog:vr,shell:me,globalShortcut:pt}=require("electron"),$=require("electron-is-dev"),{default:A}=P(),{store:ee}=y(),{autoUpdater:b}=require("electron-updater"),E=require("electron-log"),Sr=require("electron-context-menu"),Er=require("@sentry/electron/main"),B=!0;nt();ut();Er.init({dsn:"https://9840e0f304124299e379d9347e12d2e6@o492140.ingest.sentry.io/4505728058523648",ignoreErrors:["SimpleURLLoaderWrapper","Cannot read properties of null (reading 'webContents')","EBUSY: resource busy or locked"]});b.autoDownload=!0;b.logger=E;b.logger.transports.file.level="info";E.info("App starting...",c.getVersion());var gt,ht;if($){let e=require("electron-devtools-installer");gt=e.default,ht=e.REACT_DEVELOPER_TOOLS}var Fr=we.buildFromTemplate([{label:"File",submenu:[{label:"Relaunch",click(){c.exit(),c.relaunch()}},{label:"Clear Settings",click(){ee.reset("filePaths"),l.webContents.session.clearStorageData()}},{label:"Sign Out",click(){l.webContents.send(A.app.toRenderer.signOut)}},{label:"Exit",click(){c.quit()}}]},{label:$?"DEVELOPMENT -- HELP":"Help",submenu:[{label:"Rescue",click(){me.openExternal("http://imexrescue.com")}},{label:`Check for Updates (currently ${c.getVersion()})`,click(){te()}},{label:"Show Release Notes",click(){l.webContents.send(A.app.toRenderer.setReleaseNotes,he()[c.getVersion()])}},{label:"Open Config File",click(){me.openPath(ee.path)}},{label:"Open Log File",click(){me.openPath(D.join(c.getPath("appData"),"ImeX RPS\\logs"))}},...B?[{label:"Toggle DevTools",accelerator:"CmdOrCtrl+Alt+I",click(){l&&l.webContents.toggleDevTools()}}]:[],{label:"Third Party Notices",click(){Cr()}}]}]),l,V,ft=null;Sr({showInspectElement:B});function mt(){we.setApplicationMenu(Fr);let e=c.getAppPath(),t=$?D.join(e,"electron","preload-src.js"):D.join(e,"dist-electron","preload.cjs");if(l=new _e({title:`ImEX RPS ${c.getVersion()}`,icon:D.join(e,"src","assets","logo192.png"),webPreferences:{nodeIntegration:!1,enableRemoteModule:!1,webSecurity:!0,worldSafeExecuteJavaScript:!0,contextIsolation:!0,devTools:B,preload:t}}),!c.requestSingleInstanceLock())c.quit();else{if(c.on("second-instance",(a,o,n)=>{l&&(l.isMinimized()&&l.restore(),l.show(),l.focus(),l.maximize())}),$)l.loadURL("http://localhost:3000");else{let a=D.join(e,"build","index.html");l.loadFile(a)}l.on("minimize",function(a){a.preventDefault(),l.hide(),ft||(ft=Mr())}),H.on(A.quit,(a,o)=>{c.isQuiting=!0,c.quit()}),B&&l.webContents.openDevTools({mode:"detach"}),l.maximize(),B&&(pt.register("CommandOrControl+Shift+I",()=>{l.webContents.toggleDevTools()}),pt.register("CommandOrControl+Alt+I",()=>{l.webContents.toggleDevTools()}))}}_t.mainWindow=l;c.whenReady().then(()=>{mt(),$&&(console.log(`Path to Settings File: ${ee.path}`),console.log(`Path to Log File: ${E.log}`),gt(ht).then(e=>console.log(`Added Extension: ${e}`)).catch(e=>console.log(`An error occurred: , ${e}`))),setInterval(()=>{te()},1e3*60*30)});$?c.setAppUserModelId(process.execPath):c.setAppUserModelId("com.imex.rps");c.on("window-all-closed",()=>{process.platform!=="darwin"&&c.quit()});c.on("activate",()=>{console.log("Activate"),_e.getAllWindows().length===0&&mt()});function Mr(){let e=c.getAppPath(),t=new Ir(D.join(e,"src","assets","logo192.png")),r=we.buildFromTemplate([{label:"Show",click:function(){l.show()}},{label:"Exit",click:function(){c.isQuiting=!0,c.quit()}}]);return t.on("double-click",function(a){l.show(),l.maximize()}),t.setToolTip(`ImEX RPS ${c.getVersion()}`),t.setContextMenu(r),t}function te(){try{b.checkForUpdates()}catch(e){E.error("Error checking for updates",e)}}function Cr(){if(V){V.show();return}V=new _e({width:900,height:700,title:"Third Party Notices",webPreferences:{nodeIntegration:!1,contextIsolation:!0,devTools:B}});let e=c.getAppPath();V.loadURL(`file://${D.join(e,"electron","licenses.txt")}`),V.on("closed",()=>{V=null})}b.on("update-available",e=>{E.log("Update available.",e),l&&l.webContents.send(A.app.toRenderer.updateAvailable,e)});b.on("update-not-available",e=>{E.log("Update not available.",e)});b.on("error",(e,t)=>{E.log("Error in auto-updater.",e,t)});H.on(A.app.toMain.setReleaseChannel,(e,t)=>{b.channel=t,te()});H.on(A.app.toMain.checkForUpdates,(e,t)=>{te()});H.on(A.app.toMain.downloadUpdates,(e,t)=>{b.downloadUpdate()});H.on(A.app.toMain.installUpdates,(e,t)=>{b.quitAndInstall(!0,!0)});b.on("download-progress",e=>{E.log("Download Progress:",e),l&&l.webContents.send(A.app.toRenderer.downloadProgress,e)});b.on("update-downloaded",(e,t)=>{l&&l.webContents.send(A.app.toRenderer.downloadProgress,{...e,percent:100}),vr.showMessageBox({type:"info",title:"ImeX RPS Update Manager",message:`ImEX RPS is ready to update to Version ${e.version}. It is highly recommended that you update immediately. Would you like to update now? RPS will automatically restart.`,buttons:["Yes","No"]}).then(({response:r})=>{r===0?(ee.set("showChangeLog",!0),b.quitAndInstall(!0,!0)):E.warn("Updated ignored.")})})});module.exports=Ge();
+* Added better indicators for quantities and negative RPS values.`},"1.6.0-beta.2":{title:"Release Notes for 1.6.0-beta.2",date:"05/04/2026",notes:`New Features:\r
+* Added projected targets for SGI claims.\r
+`},"1.6.0-beta.3":{title:"Release Notes for 1.6.0-beta.3",date:"05/05/2026",notes:`New Features:\r
+* Added a toggle for SGI RCC Claims to set targets to $0.\r
+* Added handling for used parts thresholds for SGI claims. Please re-import previous jobs for accurate scoring.`},"1.6.0-beta.4":{title:"Release Notes for 1.6.0-beta.4",date:"05/07/2026",notes:`Bug Fix:\r
+* Resolved an issue for vehicles under 20,000 kms returning a target for SGI vehicles.\r
+`}}});var it=p(()=>{var{ipcMain:m,app:wr,app:yr,BrowserWindow:Rr}=require("electron"),{default:u}=P(),{store:q}=R(),j=require("electron-log"),{ImportJobWithCloseDate:br}=G(),{ScrubEstimate:Pr}=$e();Qe();tt();nt();console.log("*** Added IPC Handlers ***");m.on("test",async(e,t)=>{console.log("Received test IPC Command"),e.reply("test-toRenderer",{status:0,message:null})});m.on(u.app.toMain.setAcceptableInsCoNm,(e,t)=>{q.set("accepted_ins_co",t)});m.on(u.store.get,(e,t)=>{let r=q.get(t);e.sender.send(u.store.response,{[t]:r})});m.on(u.store.set,(e,t,r)=>{q.set(t,r);let a=q.get();e.sender.send(u.store.response,a)});m.on(u.store.getAll,(e,t)=>{let r=q.get();e.sender.send(u.store.response,r)});m.on(u.app.toMain.getReleaseNotes,(e,t)=>{if(q.get("showChangeLog")){let a=he()[wr.getVersion()];e.sender.send(u.app.toRenderer.setReleaseNotes,a)}else e.sender.send(u.app.toRenderer.setReleaseNotes,null)});m.on(u.app.toMain.importJob,(e,{filepath:t,close_date:r})=>{br(t,r)});m.on(u.app.toMain.log.debug,(e,...t)=>{j.debug(t)});m.on(u.app.toMain.log.info,(e,...t)=>{j.info(t)});m.on(u.app.toMain.log.warn,(e,...t)=>{j.warn(t)});m.on(u.app.toMain.log.error,(e,...t)=>{j.error(t)});m.on(u.app.toMain.getAppVersion,(e,t)=>{e.sender.send(u.app.toRenderer.appVersion,yr.getVersion())});m.handle(u.app.toMain.scrubEstimate,(e,{job:t})=>Pr({job:t}));m.on(u.app.toMain.openExternalWindow,(e,t)=>{let r=new Rr({width:1200,height:800,webPreferences:{nodeIntegration:!1,contextIsolation:!0}});r.loadURL(t),r.webContents.setWindowOpenHandler(({url:a})=>(require("electron").shell.openExternal(a),{action:"deny"}))});m.on(u.app.toMain.setInsRuleSet,(e,t)=>{q.set("ins_rule_set",t)})});var ft=p(()=>{var{ipcMain:dt}=require("electron"),lt=require("electron-log"),{default:ct}=P(),ut=require("@amplitude/analytics-node"),{store:Nr}=R(),Ar=Nr.get("deviceId"),{app:Ir}=require("electron"),pt;ut.init("a733ff926aef84f93baf95e66b5dcb75");dt.on(ct.app.toMain.setUserName,(e,t)=>{pt=t});dt.on(ct.app.toMain.track,(e,t)=>{lt.log("Analytics Event",t);let{event:r,...a}=t;try{ut.track(r,a,{device_id:Ar,user_id:pt,app_version:Ir.getVersion()})}catch(s){lt.error(s)}})});var Ye=p(yt=>{var D=require("path"),{app:c,BrowserWindow:_e,Tray:vr,Menu:we,ipcMain:Y,dialog:Sr,shell:me,globalShortcut:gt}=require("electron"),O=require("electron-is-dev"),{default:A}=P(),{store:ee}=R(),{autoUpdater:y}=require("electron-updater"),E=require("electron-log"),Er=require("electron-context-menu"),Cr=require("@sentry/electron/main"),$=O||process.env.ELECTRON_ENABLE_DEVTOOLS==="1";it();ft();Cr.init({dsn:"https://9840e0f304124299e379d9347e12d2e6@o492140.ingest.sentry.io/4505728058523648",ignoreErrors:["SimpleURLLoaderWrapper","Cannot read properties of null (reading 'webContents')","EBUSY: resource busy or locked"]});y.autoDownload=!0;y.logger=E;y.logger.transports.file.level="info";E.info("App starting...",c.getVersion());var mt,_t;if(O){let e=require("electron-devtools-installer");mt=e.default,_t=e.REACT_DEVELOPER_TOOLS}var Lr=we.buildFromTemplate([{label:"File",submenu:[{label:"Relaunch",click(){c.exit(),c.relaunch()}},{label:"Clear Settings",click(){ee.reset("filePaths"),l.webContents.session.clearStorageData()}},{label:"Sign Out",click(){l.webContents.send(A.app.toRenderer.signOut)}},{label:"Exit",click(){c.quit()}}]},{label:O?"DEVELOPMENT -- HELP":"Help",submenu:[{label:"Rescue",click(){me.openExternal("http://imexrescue.com")}},{label:`Check for Updates (currently ${c.getVersion()})`,click(){te()}},{label:"Show Release Notes",click(){l.webContents.send(A.app.toRenderer.setReleaseNotes,he()[c.getVersion()])}},{label:"Open Config File",click(){me.openPath(ee.path)}},{label:"Open Log File",click(){me.openPath(D.join(c.getPath("appData"),"ImeX RPS\\logs"))}},...$?[{label:"Toggle DevTools",accelerator:"CmdOrCtrl+Alt+I",click(){l&&l.webContents.toggleDevTools()}}]:[],{label:"Third Party Notices",click(){Mr()}}]}]),l,B,ht=null;Er({showInspectElement:$});function wt(){we.setApplicationMenu(Lr);let e=c.getAppPath(),t=O?D.join(e,"electron","preload-src.js"):D.join(e,"dist-electron","preload.cjs");if(l=new _e({title:`ImEX RPS ${c.getVersion()}`,icon:D.join(e,"src","assets","logo192.png"),webPreferences:{nodeIntegration:!1,enableRemoteModule:!1,webSecurity:!0,worldSafeExecuteJavaScript:!0,contextIsolation:!0,devTools:$,preload:t}}),!c.requestSingleInstanceLock())c.quit();else{if(c.on("second-instance",(a,s,o)=>{l&&(l.isMinimized()&&l.restore(),l.show(),l.focus(),l.maximize())}),O)l.loadURL("http://localhost:3000");else{let a=D.join(e,"build","index.html");l.loadFile(a)}l.on("minimize",function(a){a.preventDefault(),l.hide(),ht||(ht=Fr())}),Y.on(A.quit,(a,s)=>{c.isQuiting=!0,c.quit()}),$&&l.webContents.openDevTools({}),l.maximize(),$&&(gt.register("CommandOrControl+Shift+I",()=>{l.webContents.toggleDevTools()}),gt.register("CommandOrControl+Alt+I",()=>{l.webContents.toggleDevTools()}))}}yt.mainWindow=l;c.whenReady().then(()=>{wt(),O&&(console.log(`Path to Settings File: ${ee.path}`),console.log(`Path to Log File: ${E.log}`),mt(_t).then(e=>console.log(`Added Extension: ${e}`)).catch(e=>console.log(`An error occurred: , ${e}`))),setInterval(()=>{te()},1e3*60*30)});O?c.setAppUserModelId(process.execPath):c.setAppUserModelId("com.imex.rps");c.on("window-all-closed",()=>{process.platform!=="darwin"&&c.quit()});c.on("activate",()=>{console.log("Activate"),_e.getAllWindows().length===0&&wt()});function Fr(){let e=c.getAppPath(),t=new vr(D.join(e,"src","assets","logo192.png")),r=we.buildFromTemplate([{label:"Show",click:function(){l.show()}},{label:"Exit",click:function(){c.isQuiting=!0,c.quit()}}]);return t.on("double-click",function(a){l.show(),l.maximize()}),t.setToolTip(`ImEX RPS ${c.getVersion()}`),t.setContextMenu(r),t}function te(){try{y.checkForUpdates()}catch(e){E.error("Error checking for updates",e)}}function Mr(){if(B){B.show();return}B=new _e({width:900,height:700,title:"Third Party Notices",webPreferences:{nodeIntegration:!1,contextIsolation:!0,devTools:$}});let e=c.getAppPath();B.loadURL(`file://${D.join(e,"electron","licenses.txt")}`),B.on("closed",()=>{B=null})}y.on("update-available",e=>{E.log("Update available.",e),l&&l.webContents.send(A.app.toRenderer.updateAvailable,e)});y.on("update-not-available",e=>{E.log("Update not available.",e)});y.on("error",(e,t)=>{E.log("Error in auto-updater.",e,t)});Y.on(A.app.toMain.setReleaseChannel,(e,t)=>{y.channel=t,te()});Y.on(A.app.toMain.checkForUpdates,(e,t)=>{te()});Y.on(A.app.toMain.downloadUpdates,(e,t)=>{y.downloadUpdate()});Y.on(A.app.toMain.installUpdates,(e,t)=>{y.quitAndInstall(!0,!0)});y.on("download-progress",e=>{E.log("Download Progress:",e),l&&l.webContents.send(A.app.toRenderer.downloadProgress,e)});y.on("update-downloaded",(e,t)=>{l&&l.webContents.send(A.app.toRenderer.downloadProgress,{...e,percent:100}),Sr.showMessageBox({type:"info",title:"ImeX RPS Update Manager",message:`ImEX RPS is ready to update to Version ${e.version}. It is highly recommended that you update immediately. Would you like to update now? RPS will automatically restart.`,buttons:["Yes","No"]}).then(({response:r})=>{r===0?(ee.set("showChangeLog",!0),y.quitAndInstall(!0,!0)):E.warn("Updated ignored.")})})});module.exports=Ye();