From e2cf14d10ac430124b8f4541040e5548614ecc76 Mon Sep 17 00:00:00 2001 From: Immanuel Onyeka <immanuel@onyeka.ca> Date: Mon, 7 Nov 2022 18:06:27 -0500 Subject: [PATCH] Add MI and HOA fields --- components/mi.vue | 5 ++ components/new.vue | 119 +++++++++++++++++++++++++-------------------- 2 files changed, 72 insertions(+), 52 deletions(-) create mode 100644 components/mi.vue diff --git a/components/mi.vue b/components/mi.vue new file mode 100644 index 0000000..17a6529 --- /dev/null +++ b/components/mi.vue @@ -0,0 +1,5 @@ +<template> +</template> + +<script> +</script> diff --git a/components/new.vue b/components/new.vue index f334c38..1a1a8e6 100644 --- a/components/new.vue +++ b/components/new.vue @@ -41,10 +41,10 @@ class="bi bi-plus" viewBox="0 0 16 16"> <path d="M8 4a.5.5 0 0 1 .5.5v3h3a.5.5 0 <h3>Borrower</h3> <label>Number of Borrowers</label> <input :value="estimate.borrowers" -@input="(e) => estimate.borrowers = strip(e)"> +@input="(e) => estimate.borrowers = stripInt(e)"> <label>Credit Score</label> <input :value="estimate.creditScore" -@input="(e) => estimate.creditScore = strip(e)"> +@input="(e) => estimate.creditScore = stripInt(e)"> <label>Monthly Income ($)</label> <input :value="estimate.mIncome" @input="(e) => estimate.mIncome = strip(e)"> @@ -53,11 +53,11 @@ class="bi bi-plus" viewBox="0 0 16 16"> <path d="M8 4a.5.5 0 0 1 .5.5v3h3a.5.5 0 <section class="radios form"> <h3>Transaction Type</h3> -<input type="radio" name="transaction_type" value="transaction" +<input type="radio" name="transaction_type" value="estimate.transaction" @input="e => estimate.transaction = 0" selected="estimate.transaction == 0"> <label>Purchase</label> -<input type="radio" name="transaction_type" value="refinance" +<input type="radio" name="transaction_type" value="estimate.refinance" @input="e => estimate.transaction = 1" selected="estimate.transaction == 1"> <label>Refinance</label> @@ -109,46 +109,42 @@ selected="estimate.transaction == 1"> <input :value="loans[sel].housingDti" @input="setHousingDti"> <label>Total DTI (%) - Optional</label> <input :value="loans[sel].dti" @input="setDti"> +<label>Home Owner's Association ($/month)</label> +<input :value="loans[sel].hoa" +@input="(e) => { loans[sel].hoa = strip(e) }"> + <label>Interest Rate (%)</label> -<input :value="loans[sel].interest" @input="setInterest"> +<input :value="loans[sel].interest" +@input="(e) => { loans[sel].interest = stripPerc(e) }"> <label>Days of Interest</label> -<input :value="loans[sel].interestDays" @input="setInterestDays"> - -<label>Hazard Insurance Escrowed?</label> -<input type="checkbox" :value="loans[sel].hazardEscrowed" @input=""> -<label>Months to Escrow Hazard Insurance</label> -<input :value="loans[sel].hazardMonths" @input=""> -<label>Hazard Insurance ($/monthly)</label> -<input :value="loans[sel].hazard" @input="setHazard"> - -<label>Taxes Escrowed?</label> -<input type="checkbox" :value="loans[sel].taxEscrowed" @input=""> -<label>Months to Escrow Real Estate Tax</label> -<input :value="loans[sel].taxEscrow" @input=""> -<label>Real Estate Tax ($/monthly)</label> -<input :value="loans[sel].tax" @input="setTax"> +<input :value="loans[sel].interestDays" +@input="(e) => {loans[sel].interestDays = stripInt(e)}"> + +<label>Hazard Insurance Escrow (months)</label> +<input :value="loans[sel].hazardEscrow" +@input="(e) => {loans[sel].hazardEscrow = stripInt(e)}"> +<label>Hazard Insurance ($/month)</label> +<input :value="loans[sel].hazard" +@input="(e) => {loans[sel].hazard = strip(e)}"> + +<label>Real Estate Tax Escrow (months)</label> +<input :value="loans[sel].taxEscrow" +@input="e => {loans[sel].taxEscrow = stripInt(e)}"> +<label>Real Estate Tax ($/month)</label> +<input :value="loans[sel].tax" +@input="(e) => {loans[sel].tax = strip(e)}"> </section> -<section class="form inputs"> -<h3>Interest Rates</h3> -<label>Loan Term (years)</label> -<input :value="loans[sel].term" -@input="(e) => loans[sel].term = strip(e)"> - -<label>Loan Program</label> -<select id="" name="" v-model="loans[sel].program"> - <option value="none">None</option> -</select> - -<label>Loan to Value (%)</label> -<input :value="loans[sel].ltv" @input="setLtv"> -<label>Loan Amount ($)</label> -<input :value="loans[sel].amount" -@input="setAmount"> -<label>Housing Expense DTI (%) - Optional</label> -<input :value="loans[sel].housingDti" @input="setHousingDti"> -<label>Total DTI (%) - Optional</label> -<input :value="loans[sel].dti" @input="setDti"> +<section class="form radios"> +<h3>Mortgage Insurance</h3> +<input type="radio" name="transaction_type" value="transaction" +@input="e => estimate.transaction = 0" +selected="estimate.transaction == 0"> +<label>National MI</label> +<input type="radio" name="transaction_type" value="refinance" +@input="e => estimate.transaction = 1" +selected="estimate.transaction == 1"> +<label>MGIC</label> </section> </div> @@ -166,11 +162,10 @@ const example = { interest: 0, interestDays: 0, hazard: 0, // Hazard insurance monthly payment - hazardMonths: 0, // Hazard insurance months - hazardEscrowed: true, // If hazard insurance is escrowed + hazardEscrow: 0, // Hazard insurance escrow in months (0 is none) tax: 0, // Real Estate taxes monthly payment - taxEscrow: 0, // Months to escrow - taxEscrowed: true, // If tax is escrowed + taxEscrow: 0, // Months to escrow (0 is none) + hoa: 0, // Home owner's association monthly fee program: "", pud: true, // Property under development zip: '' @@ -196,13 +191,36 @@ function create() { this.estimate.loans.push(Object.assign({}, loans[0])) } -// Strips non-digits from an input box event and returns it's rounded integer +// Strips non-digits from an input box event and returns it's rounded integer. +// It also preserves current valid entry (.) function strip(e) { + let valid = e.target.value.match(/\d+\.?\d?\d?/)?.[0] ?? "" + e.target.value = valid + return Number(valid || 0) +} + +function stripInt(e) { let value = parseInt(e.target.value.replace(/\D/g, '') || 0) e.target.value = value return value } +function stripPerc(e) { + let num = strip(e) + + if (num > 100) { + num = 100 + e.target.value = num + } + + if (num < 0) { + num = 0 + e.target.value = num + } + + return num +} + function stripLetters(e) { let value = (e.target.value.replace(/[^\w\s]/g, '').slice(0, 20) || '') e.target.value = value @@ -227,8 +245,7 @@ function setLtv(e) { if (ltv < 0) ltv = 0 loan.ltv = ltv - e.target.value = ltv - loan.amount = Math.round(ltv / 100 * this.estimate.price) + loan.amount = (ltv / 100 * this.estimate.price).toFixed(2) } // Changes loan.amount's <input> and data() values, then syncs with data.ltv @@ -241,15 +258,13 @@ function setAmount(e) { if (amount < 0) amount = 0 loan.amount = amount - e.target.value = amount - loan.ltv = Math.round(amount / this.estimate.price * 100) + loan.ltv = (amount / this.estimate.price * 100).toFixed(2) } // Updates the property price for all loans function setPrice(e) { let value = strip(e) this.estimate.price = value - e.target.value = value } function setDti(e) { @@ -278,8 +293,8 @@ function setHousingDti(e) { export default { methods: { - setPrice, setLtv, setAmount, setDti, setHousingDti, - strip, stripLetters, del, create + setPrice, setLtv, setAmount, setDti, setHousingDti, strip, stripInt, + stripLetters, stripPerc, del, create }, props: ['user'], data() {