|
- <template>
- <div id="new" class="page">
-
- <h2>New Loan</h2>
-
- <section class="loans-list">
-
- <h3 v-for="(l, indx) in estimate.loans"
- :class="sel == indx ? 'sel' : ''"
- @click="() => sel = indx"
- >
- {{l.title}}
- </h3>
-
- <div class="add">
- <svg @click="create"
- xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor"
- class="bi bi-plus" viewBox="0 0 16 16"> <path d="M8 4a.5.5 0 0 1 .5.5v3h3a.5.5 0
- 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3A.5.5 0 0 1 8 4z"/> </svg>
- </div>
- </section>
-
- <loan-details v-if="hash == '#new'"
- :estimate="estimate"
- :loans="estimate.loans"
- :sel="sel"
- :loan="loan"
- :token="token"
-
- @update:name="(name) => loan.title = name"
- @del="del"
- @update:borrowerNum="(b) => estimate.borrower.num = b"
- @update:borrowerCredit="(c) => estimate.borrower.credit = c"
- @update:borrowerIncome="(m) => estimate.borrower.income = Math.round(m*100)"
- @update:transaction="(t) => estimate.transaction = t"
- @update:occupancy="(t) => estimate.occupancy = t"
- @update:price="setPrice"
- @update:property="(p) => estimate.property = p"
-
- @update:loanType="changeLoanType"
- @update:term="(lt) => loan.term = lt"
- @update:program="(p) => loan.program = p"
- @update:ltv="setLtv"
- @update:amount="setAmount"
- @update:housingDti="setHousingDti"
- @update:dti="setDti"
- @update:hoi="(hoi) => loan.hoi = Math.round(hoi*100)"
- @update:interest="(i) => loan.interest = i"
- @update:interestDays="(d) => estimate.loans[sel].interestDays = d"
- @update:hazardEscrow="(h) => estimate.loans[sel].hazardEscrow = h"
- @update:hazard="(h) => loan.hazard = Math.round(h * 100)"
- @update:taxEscrow="(t) => estimate.loans[sel].taxEscrow = t"
- @update:tax="(t) => loan.tax = Math.round(t*100)"
- @update:manualMI="perc => loan.mi.rate = perc"
- @toggle:manualMIMonthly=
- "() => estimate.loans[sel].mi.monthly = !estimate.loans[sel].mi.monthly"
- @continue="generate"
- />
- <loan-summary v-if="hash == '#new/summary'"
- :loan="loan"
- :downpayment="estimate.price - loan.amount"
- :token="token"
- :estimate="estimate"
- @update="(e) => estimate = e" />
-
- </div>
- </template>
-
- <script>
- import { stripLetters, strip, stripInt, stripPerc } from "../../helpers.js"
- import LoanDetails from "./details.vue"
- import LoanSummary from "./summary.vue"
-
- // The default values of a new loan
- const example = {
- title: "Example",
- type: {},
- term: 0,
- ltv: 0, // Loan to home value ratio
- dti: 0,
- housingDti: 0,
- amount: 0,
- interest: 0,
- interestDays: 0,
- hazard: 0, // Hazard insurance monthly payment
- hazardEscrow: 0, // Hazard insurance escrow in months (0 is none)
- tax: 0, // Real Estate taxes monthly payment
- taxEscrow: 0, // Months to escrow (0 is none)
- hoi: 10000, // Home owner's association monthly fee
- program: "",
- pud: true, // Property under development
- zip: '',
- fees: [],
- }
-
- // The default loans on a new estimate
- const loans = [
- Object.assign({mi: { monthly: false, rate: 0 }, type: {}}, example)
- ]
-
- // Default estimate fields
- let estimate = {
- property: "",
- transaction: "",
- occupancy: "",
- price: 0,
- borrower: {num: 0, credit: 0, income: 0},
- loans: loans,
- }
-
- function loan() {
- return this.estimate.loans[this.sel]
- }
-
- // Clone loan from initial example as a new loan
- function create() {
- this.estimate.loans.push(
- Object.assign(
- {mi: { monthly: false, rate: 0 }, type: {}},
- example, {fees: this.createFees()}
- )
- )
-
- // Move current loan to last inserted
- this.sel = this.estimate.loans.length - 1
- }
-
-
- function createFees() {
- return this.fees.map(f => Object.assign({}, f))
- }
-
-
- function del() {
- if (this.estimate.loans.length > 1) {
- let x = this.sel
- this.sel = 0
- this.estimate.loans.splice(x, 1)
- }
- }
-
- // Updates the property price for all loans and their fee amounts.
- function setPrice(value) {
- this.estimate.price = Math.round(value*100)
- this.estimate.loans[this.sel].fees.forEach(fee => {
- if (fee.perc) fee.amount = Math.round(fee.perc * value)
- })
- this.estimate.loans.forEach(l => {l.ltv = 0; l.amount = 0})
- }
-
-
- // Changes loan.ltv's <input> and data() values, then syncs with data.amount
- function setLtv(e) {
- let ltv = strip(e)
- if (!this.estimate.price) return
-
- if (ltv > 100) ltv = 100
- if (ltv < 0) ltv = 0
-
- this.loan.ltv = ltv
- let num = ltv / 100 * this.estimate.price
- this.loan.amount = Math.round(num)
- }
-
- // Changes loan.amount\'s <input> and data() values, then syncs with data.ltv
- // Loan amount is in cents but LTV is in decimals so some rounding needs to be done.
- function setAmount(e) {
- let amount = strip(e) * 100
- if (!this.estimate.price) return
-
- if (amount > this.estimate.price) amount = this.estimate.price
- if (amount < 0) amount = 0
-
- this.loan.amount = Math.round(amount)
- let num = amount / this.estimate.price
- this.loan.ltv = Math.round(num*100)
- }
-
- function setDti(e) {
- let dti = strip(e)
- let loan = this.estimate.loans[this.sel]
- if (!loan.price) return
-
- if (dti > 100) dti = 100
- if (dti < 0) dti = 0
-
- e.target.value = dti
- loan.dti = dti
- }
-
- function setHousingDti(e) {
- let housingDti = strip(e)
- let loan = this.estimate.loans[this.sel]
- if (!loan.price) return
-
- if (housingDti > 100) housingDti = 100
- if (housingDti < 0) housingDti = 0
-
- e.target.value = housingDti
- loan.housingDti = housingDti
- }
-
- function changeLoanType(id) {
- if (id == this.loan.type.id) return
-
- // Set mandatory upfront MIP in fees if type is FHA
- let i = this.loan.fees.findIndex(
- l => l.required && l.name == "FHA Upfront MIP"
- )
- if (id == 2) {
- this.loan.fees.push({
- amount: Math.round(this.estimate.price*1.75/100),
- perc: 1.75,
- name: "FHA Upfront MIP",
- type: "Required",
- id: 0,
- required: true
- })
- } else if (i >= 0) {
- this.loan.fees.splice(i, 1)
- }
-
- this.loan.type.id = id
- }
-
- function generate() {
- window.location.hash = 'new/summary'
- }
-
- // Percentage values of fees always take precedent over amounts. The conversion
- // happens in setPrice()
- export default {
- components: { LoanSummary, LoanDetails },
- methods: {
- generate, createFees, del, create, setPrice, setLtv, setAmount,
- setDti, setHousingDti, changeLoanType
- },
- computed: { loan },
- props: ['user', 'fees', 'token'],
- data() {
- return {
- estimate: estimate,
- sel: 0,
- errors: [],
- hash: window.location.hash
- }
- },
- created() {
- this.estimate.loans.forEach(l => l.fees = this.createFees())
- window.addEventListener("hashchange",
- () => this.hash = window.location.hash)
- }
- }
- </script>
|