|
- <template>
- <div v-if="valid">
-
- <section class="form inputs">
- <h3>Monthly Payment - ${{format(totalMonthly)}}</h3>
- <label>Loan payment: ${{format(loanPayment)}}</label>
- <label v-if="loan.mi.monthly">
- Mortgage insurance: ${{format(loan.amount*loan.mi.rate/100/12)}}
- </label>
- <label>Property taxes: ${{format(loan.tax)}}</label>
- <label>Homeowner's Insurance: ${{format(loan.hoi)}}</label>
- <label v-if="loan.hazard">
- Hazard insurance: ${{format(loan.hazard)}}
- </label>
- </section>
-
- <section class="form inputs">
- <h3>Cash to Close - ${{format(cashToClose)}}</h3>
- <label>Closing costs: ${{format(fees)}}</label>
- <label v-if="credits">Credits: ${{credits}}</label>
- <label>Down payment: ${{format(downpayment)}}</label>
- <label v-if="!loan.mi.monthly">
- Mortgage insurance: ${{format(loan.amount*loan.mi.rate/100)}}
- </label>
- </section>
-
- <section class="form inputs">
- <button :disabled="saved" @click="create">Save Estimate</button>
- <button>Generate PDF</button>
- </section>
-
- </div>
- </template>
-
- <script setup>
- import { ref, computed, onMounted } from 'vue'
- import { format } from '../../helpers.js'
- let valid = ref(false)
- let saved = ref(false)
- const props = defineProps(['downpayment', 'loan', 'token', 'estimate'])
-
- function amortize(principle, rate, periods) {
- return principle * rate*(1+rate)**periods / ((1+rate)**periods - 1)
- }
-
- const loanPayment = computed(() => {
- return amortize(props.loan.amount,
- props.loan.interest / 100 / 12,
- props.loan.term*12)
- })
-
- const totalMonthly = computed (() => {
- let total = loanPayment.value +
- props.loan.tax +
- props.loan.hoi +
- props.loan.hazard
-
- if (props.loan.mi.monthly) {
- total = total + props.loan.mi.rate/100*(props.loan.amount)
- }
- return total
- })
-
- // Closing costs
- const fees = computed(() => {
- return props.loan.fees.reduce((total, x) => {
- return x.amount > 0 ? total + x.amount : 0
- }, 0
- )
- })
-
- const credits = computed(() => {
- return props.loan.fees.reduce((total, x) => {
- return x.amount < 0 ? total + x.amount : 0
- }, 0
- )
- })
-
- const cashToClose = computed(() => {
- let total = fees.value + credits.value + props.downpayment
- if (!props.loan.mi.monthly) {
- total = total + props.loan.mi.rate/100*(props.loan.amount)
- }
-
- return total
- })
-
- function validate() {
- fetch(`/api/estimate/validate`,
- {method: 'POST',
- body: JSON.stringify(props.estimate),
- headers: {
- "Accept": "application/json",
- "Authorization": `Bearer ${props.token}`,
- },
- }).then(resp => {
- if (resp.ok && resp.status == 200) {
- valid.value = true
- return
- } else {
- // resp.text().then(t => this.errors = [t])
- // window.location.hash = 'new'
- }
- })
-
- }
-
- function create() {
- saved.value = true
- fetch(`/api/estimate`,
- {method: 'POST',
- body: JSON.stringify(props.estimate),
- headers: {
- "Accept": "application/json",
- "Authorization": `Bearer ${props.token}`,
- },
- }).then(resp => {
- if (resp.ok && resp.status == 200) {
- saved.value = true
- return
- } else {
- // resp.text().then(t => this.errors = [t])
- // window.location.hash = 'new'
- resp.text().then(t => console.log(t))
- saved.value = false
- }
- })
-
- }
-
- onMounted(() => {validate()})
-
- </script>
|