(function(){
const root=document.getElementById("vt-finance-runtime")
const runtime=root.querySelector("#vf-runtime")
let activeModule="dashboard"
function setStatus(module){ root.querySelector("#vf-status-module").innerText="Module "+module }
function renderDashboard(){
const price=parseFloat(root.querySelector("#vf-price").value)
const ltv=parseFloat(root.querySelector("#vf-ltv").value)/100
const rate=parseFloat(root.querySelector("#vf-rate").value)/100/12
const amort=parseFloat(root.querySelector("#vf-amort").value)*12
const loan=price*ltv
const payment=(loan*rate)/(1-Math.pow(1+rate,-amort))
const annualDebt=payment*12
const rent=parseFloat(root.querySelector("#vf-rent").value)
const sf=parseFloat(root.querySelector("#vf-sf").value)
const gross=rent*sf*12
const vacancy=parseFloat(root.querySelector("#vf-vacancy").value)/100
const exp=parseFloat(root.querySelector("#vf-expense").value)/100
const egi=gross*(1-vacancy)
const noi=egi*(1-exp)
const dscr=noi/annualDebt
runtime.innerHTML= "
| Loan Amount | "+loan.toFixed(0)+" |
|---|---|
| Monthly Payment | "+payment.toFixed(0)+" |
| NOI | "+noi.toFixed(0)+" |
| DSCR | "+dscr.toFixed(2)+" |
"
}
function renderAmortization(){
const price=parseFloat(root.querySelector("#vf-price").value)
const ltv=parseFloat(root.querySelector("#vf-ltv").value)/100
const rate=parseFloat(root.querySelector("#vf-rate").value)/100/12
const amort=parseFloat(root.querySelector("#vf-amort").value)*12
let balance=price*ltv
const payment=(balance*rate)/(1-Math.pow(1+rate,-amort))
let rows="
| Month | Interest | Principal | Balance |
|---|---|---|---|
| "+m+" | "+interest.toFixed(0)+" | "+principal.toFixed(0)+" | "+balance.toFixed(0)+" |
"
runtime.innerHTML=rows
}
function renderModule(name){
activeModule=name
setStatus(name)
if(name==="dashboard"){renderDashboard();return}
if(name==="amortization"){renderAmortization();return}
runtime.innerHTML="
"
}
root.querySelectorAll(".vf-module").forEach(btn=>{
btn.addEventListener("click",function(){
root.querySelectorAll(".vf-module").forEach(b=>b.classList.remove("active"))
this.classList.add("active")
renderModule(this.dataset.module)
})
})
root.querySelectorAll(".vf-input-registry input").forEach(input=>{
input.addEventListener("input",function(){
renderModule(activeModule)
})
})
renderDashboard()
})()
