<template> <div> <section class="form inputs"> <h3>Loan</h3> <label>Name</label> <input :value="loans[sel].title" required @input="(e) => $emit('update:name', stripLetters(e))"> <button @click="() => $emit('del')">Delete</button> </section> <section class="form inputs"> <div class="hint"> <img class="icon" src="/assets/image/icon/question-circle.svg" alt=""> <div class="tooltip"> <p>Assumes borrower is not self employed, not bankrupt in the past 7 years, a citizen, and intends to occupy the property.</p> </div> </div> <h3>Borrower</h3> <label>Number of Borrowers</label> <input :value="estimate.borrowers" @input="(e) => $emit('update:borrowers', stripInt(e))"> <label>Credit Score</label> <input :value="estimate.creditScore" @input="(e) => $emit('update:creditScore', stripInt(e))"> <label>Monthly Income ($)</label> <input :value="estimate.mIncome" @input="(e) => $emit('update:mIncome', strip(e))"> </section> <section class="radios form"> <h3>Transaction Type</h3> <input selected type="radio" name="transaction_type" value="0" :value="estimate.transaction" @input="() => $emit('update:transaction', 0)" > <label>Purchase</label> <input type="radio" name="transaction_type" value="1" :value="estimate.transaction" @input="() => $emit('update:transaction', 1)" > <label>Refinance</label> </section> <section class="form inputs"> <h3>Property Details</h3> <label>Price ($)</label> <input :value="estimate.price" @input="(e) => $emit('update:price', strip(e))"> <label>Type</label> <select id="" name="" :value="estimate.property" @change="(e) => $emit('update:property', e.target.value)"> <option value="attched">Single Family Attached</option> <option value="detached">Single Family Detached</option> <option value="lorise">Lo-rise (4 stories or less)</option> <option value="hirise">Hi-rise (over 4 stories)</option> </select> </section> <section class="radios form"> <h3>Loan Type</h3> <input type="radio" name="loan_type" value="conv" @change="(e) => $emit('update:loanType', e.target.value)" > <label>Conventional</label> <input type="radio" name="loan_type" value="fha" :checked="loans[sel].type == 'fha'" @change="(e) => $emit('update:loanType', e.target.value)"> <label>FHA</label> <input type="radio" name="loan_type" value="va" :checked="loans[sel].type == 'va'" @change="(e) => $emit('update:loanType', e.target.value)"> <label>VA</label> <input type="radio" name="loan_type" value="usda" :checked="loans[sel].type == 'usda'" @change="(e) => $emit('update:loanType', e.target.value)"> <label>USDA</label> </section> <section class="form inputs"> <h3>Loan Details</h3> <label>Loan Term (years)</label> <input :value="loans[sel].term" @input="(e) => $emit('update:term', stripInt(e))"> <label>Loan Program</label> <select id="" name="" :value="loans[sel].program" @change="(e) => $emit('update:program', e.target.value)"> <option value="none">None</option> </select> <label>Loan to Value (%)</label> <input :value="loan.ltv" @input="(e) => $emit('update:ltv', e)"> <label>Loan Amount ($)</label> <input :value="loan.amount" @input="(e) => $emit('update:amount', e)"> <label>Housing Expense DTI (%) - Optional</label> <input :value="loans[sel].housingDti" @input="(e) => $emit('update:housingDti', e)"> <label>Total DTI (%) - Optional</label> <input :value="loans[sel].dti" @input="(e) => $emit('update:dti', e)"> <label>Home Owner's Association ($/month)</label> <input :value="loans[sel].hoa" @input="(e) => { $emit('update:hoa', strip(e)) }"> <label>Interest Rate (%)</label> <input :value="loans[sel].interest" @input="(e) => { $emit('update:interest', stripPerc(e)) }"> <label>Days of Interest</label> <input :value="loans[sel].interestDays" @input="(e) => $emit('update:interestDays', stripInt(e))"> <label>Hazard Insurance Escrow (months)</label> <input :value="loans[sel].hazardEscrow" @input="(e) => { $emit('update:hazardEscrow', stripInt(e)) }"> <label>Hazard Insurance ($/month)</label> <input :value="loans[sel].hazard" @input="(e) => $emit('update:hazard', strip(e))"> <label>Real Estate Tax Escrow (months)</label> <input :value="loans[sel].taxEscrow" @input="e => $emit('update:taxEscrow', stripInt(e))"> <label>Real Estate Tax ($/month)</label> <input :value="loans[sel].tax" @input="(e) => $emit('update:tax', strip(e))"> </section> <section class="form inputs"> <h3>Fees</h3> <div v-for="(fee, indx) in estimate.loans[sel].fees" :key="fee.name + indx" class="fee" > <label> ${{fee.amount}}{{ fee.perc ? ` ${fee.perc}%` : ''}} - {{fee.name}}<br> {{fee.type}} </label> <img width="21" height="21" src="/assets/image/icon/x-red.svg" @click="() => estimate.loans[sel].fees.splice(indx, 1)"> </div> <button @click="resetFees">Reset</button> <button @click="createFee">New</button> </section> <fee-dialog v-if="newFee" :heading="'New Fee'" :initial="{}" :price="estimate.price" @close="() => newFee = null" @save="addFee" /> <section class="form inputs mi"> <h3>Mortgage Insurance</h3> <div class="row"> <input checked type="radio" name="mi"/><label>Manual %</label> <input type="checkbox" :checked="loans[sel].mi.monthly" @change="e => $emit('toggle:manualMIMonthly')" /> <label>monthly</label> </div> <div class="row"> <input :value="loans[sel].mi.rate" @input="e => $emit('update:manualMI', stripPerc(e))" /> </div> </section> <section class="form inputs"> <button @click="() => validate() && $emit('continue')">Continue</button> <ul class="errors"> <li v-for="e in errors">{{e}}</li> </ul> </section> </div> </template> <script> import FeeDialog from "../fee-dialog.vue" import { stripLetters, strip, stripInt, stripPerc } from "../../helpers.js" const newFee = { name: '', type: '', amount: 0, perc: 0 } // Setup this.newFee for the creation dialog function createFee() { this.newFee = Object.assign({}, newFee) } // If valid, add the current this.newFee to the array of fees and reset // this.newFee to null function addFee(fee, isDebit) { if (!isDebit) fee.amount = fee.amount * -1 this.estimate.loans[this.sel].fees.push(fee) this.newFee = null } function validate() { let errors = [] const estimate = this.estimate // Alternative attribute names for error messages const names = { term: "loan term", ltv: "loan to value", hazard: "hazard insurance", hazardEscrow: "hazard insurance escrow", } if (!estimate.property) { errors.push("Missing property type.") } else if (!estimate.price) { errors.push("Missing property price.") } else if (!estimate.borrowers) { errors.push("Missing number of borrowers.") } else if (!estimate.creditScore) { errors.push("Missing credit score.") } else if (!estimate.mIncome) { errors.push("Missing monthly income.") } estimate.loans.forEach(l => { if (errors.length) return if (!l.amount) { errors.push(`${l.title} Loan amount cannot be zero`) } else if (!l.interest) { errors.push(`${l.title} Interest rate cannot be zero`) } else if (!l.term) { errors.push(`${l.title} Loan term cannot be zero`) } }) if (errors.length) { this.errors = errors return false } return true } function generate() { const errors = this.validate() if (errors.length) { this.errors = errors return } window.location.hash = 'new/summary' } export default { components: { FeeDialog }, methods: { strip, stripInt, stripLetters, stripPerc, createFee, addFee, validate, generate }, props: ['estimate', 'loans', 'sel', 'loan'], // Loan updates assume the currently selected loan is being modified, and // $emit has no need to clarify. emits: [ 'del', 'update:name', 'update:borrowers', 'update:creditScore', 'update:mIncome', 'update:transaction', 'update:price', 'update:property', // Loan specific emits 'update:loanType', 'update:term', 'update:program', 'update:ltv', 'update:amount', 'update:housingDti', 'update:dti', 'update:hoa', 'update:interest', 'update:interestDays', 'update:hazardEscrow', 'update:hazard', 'update:taxEscrow', 'update:tax', 'update:manualMI', 'toggle:manualMIMonthly', 'continue' ], data() { return { newFee: null, errors: [], hash: window.location.hash } }, created() { } } </script>