|
- <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>
|