<template> <div> <section class="form inputs"> <h3>Loan</h3> <label>Name</label> <input :value="loan.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.borrower.num" @input="(e) => $emit('update:borrowerNum', stripInt(e))"> <label>Credit Score</label> <input :value="estimate.borrower.credit" @input="(e) => $emit('update:borrowerCredit', stripInt(e))"> <label>Monthly Income ($)</label> <input :value="estimate.borrower.income/100" @input="(e) => $emit('update:borrowerIncome', strip(e))"> </section> <section class="radios form"> <h3>Transaction Type</h3> <input selected type="radio" name="transaction_type" :selected="estimate.transaction == 'Purchase'" :value="estimate.transaction" @input="() => $emit('update:transaction', 'Purchase')" > <label>Purchase</label> <input type="radio" name="transaction_type" :selected="estimate.transaction == 'Refinance'" :value="estimate.transaction" @input="() => $emit('update:transaction', 'Refinance')" > <label>Refinance</label> </section> <section class="radios form"> <h3>Occupancy</h3> <input type="radio" name="occupancy" :value="estimate.occupancy" @input="() => $emit('update:occupancy', 'Primary')" > <label>Primary</label> <input type="radio" name="occupancy" :value="estimate.occupancy" @input="() => $emit('update:occupancy', 'Secondary')" > <label>Secondary</label> <input type="radio" name="occupancy" :value="estimate.occupancy" @input="() => $emit('update:occupancy', 'Residential')" > <label>Residential</label> </section> <section class="form inputs"> <h3>Property Details</h3> <label>Price ($)</label> <input :value="estimate.price/100" @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="Single Attached">Single Family Attached</option> <option value="Single Detached">Single Family Detached</option> <option value="Condo Lo-rise">Lo-rise (4 stories or less)</option> <option value="Condo Hi-rise">Hi-rise (over 4 stories)</option> </select> </section> <section class="radios form"> <h3>Loan Type</h3> <input type="radio" name="loan_type" :checked="loan.type.id == 1" value="1" @change="(e) => $emit('update:loanType', 1)" > <label>Conventional</label> <input type="radio" name="loan_type" value="2" :checked="loan.type.id == 2" @change="(e) => $emit('update:loanType', 2)"> <label>FHA</label> <input type="radio" name="loan_type" value="3" :checked="loan.type.id == 3" @change="(e) => $emit('update:loanType', 3)"> <label>VA</label> <input type="radio" name="loan_type" value="4" :checked="loan.type.id == 4" @change="(e) => $emit('update:loanType', 4)"> <label>USDA</label> </section> <section class="form inputs"> <h3>Loan Details</h3> <label>Loan Term (years)</label> <input :value="loan.term" @input="(e) => $emit('update:term', stripInt(e))"> <label>Loan Program</label> <select id="" name="" :value="loan.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 / 100" @input="(e) => $emit('update:amount', e)"> <label>Housing Expense DTI (%) - Optional</label> <input :value="loan.housingDti" @input="(e) => $emit('update:housingDti', e)"> <label>Total DTI (%) - Optional</label> <input :value="loan.dti" @input="(e) => $emit('update:dti', e)"> <label>Home Owner's Association ($/month)</label> <input :value="loan.hoi / 100" @input="(e) => { $emit('update:hoi', strip(e)) }"> <label>Interest Rate (%)</label> <input :value="loan.interest" @input="(e) => { $emit('update:interest', stripPerc(e)) }"> <label>Days of Interest</label> <input :value="loan.interestDays" @input="(e) => $emit('update:interestDays', stripInt(e))"> <label>Hazard Insurance Escrow (months)</label> <input :value="loan.hazardEscrow" @input="(e) => { $emit('update:hazardEscrow', stripInt(e)) }"> <label>Hazard Insurance ($/month)</label> <input :value="loan.hazard / 100" @input="(e) => $emit('update:hazard', strip(e))"> <label>Real Estate Tax Escrow (months)</label> <input :value="loan.taxEscrow" @input="e => $emit('update:taxEscrow', stripInt(e))"> <label>Real Estate Tax ($/month)</label> <input :value="loan.tax/100" @input="(e) => $emit('update:tax', strip(e))"> </section> <section class="form inputs"> <h3>Fees</h3> <div v-for="(fee, indx) in loan.fees" :key="fee.name + indx" class="fee" :class="fee.required && 'required'" > <label> ${{(fee.amount / 100).toFixed(2)}} {{ fee.perc ? ` ${fee.perc}%` : ''}} - {{fee.name}}<br> {{fee.type}} </label> <img v-if="!fee.required" width="21" height="21" src="/assets/image/icon/x-red.svg" @click="() => loan.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="loan.mi.monthly" @change="e => $emit('toggle:manualMIMonthly')" /> <label>monthly</label> </div> <div class="row"> <input :value="loan.mi.rate" @input="e => $emit('update:manualMI', stripPerc(e))" /> </div> </section> <section class="form inputs"> <button @click="validate">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.loan.fees.push(fee) this.newFee = null } function validate() { fetch(`/api/estimate/validate`, {method: 'POST', body: JSON.stringify(this.estimate), headers: { "Accept": "application/json", "Authorization": `Bearer ${this.token}`, }, }).then(resp => { if (resp.ok && resp.status == 200) { this.errors = [] this.$emit('continue') return } else { resp.text().then(t => this.errors = [t]) } }) } function generate() { const errors = this.validate() if (errors.length) { this.errors = errors return } } export default { components: { FeeDialog }, methods: { strip, stripInt, stripLetters, stripPerc, createFee, addFee, validate, generate }, props: ['estimate', 'loan', 'token'], // Loan updates assume the currently selected loan is being modified, and // $emit has no need to clarify. emits: [ 'del', 'update:name', 'update:borrowerNum', 'update:borrowerCredit', 'update:borrowerIncome', 'update:transaction', 'update:occupancy', 'update:price', 'update:property', // Loan specific emits 'update:loanType', 'update:term', 'update:program', 'update:ltv', 'update:amount', 'update:housingDti', 'update:dti', 'update:hoi', '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>