Skouter mortgage estimates. Web application with view written in PHP and Vue, but controller and models in Go.
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

new.vue 4.7 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. <template>
  2. <div id="new" class="page">
  3. <h2>New Loan</h2>
  4. <section class="loans-list">
  5. <h3 v-for="(l, indx) in loans"
  6. :class="sel == indx ? 'sel' : ''"
  7. @click="() => sel = indx"
  8. >
  9. {{l.title}}
  10. </h3>
  11. <div class="add">
  12. <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"
  13. fill="currentColor" class="bi bi-plus" viewBox="0 0 16 16"> <path d="M8 4a.5.5 0
  14. 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
  15. 0 1 8 4z"/> </svg>
  16. </div>
  17. </section>
  18. <section class="form inputs">
  19. <h3>Borrower</h3>
  20. <label>Number of Borrowers</label>
  21. <input :value="loans[sel].borrowers"
  22. @input="(e) => loans[sel].borrowers = strip(e)">
  23. <label>Credit Score</label>
  24. <input :value="loans[sel].creditScore"
  25. @input="(e) => loans[sel].creditScore = strip(e)">
  26. <label>Monthly Income ($)</label>
  27. <input :value="loans[sel].mIncome"
  28. @input="(e) => loans[sel].mIncome = strip(e)">
  29. </section>
  30. <section class="radios form">
  31. <h3>Transaction Type</h3>
  32. <input type="radio" name="transaction_type" value="transaction"
  33. @input="e => loans[sel].transaction = 0"
  34. selected="loans[sel].transaction == 0">
  35. <label>Purchase</label>
  36. <input type="radio" name="transaction_type" value="refinance"
  37. @input="e => loans[sel].transaction = 1"
  38. selected="loans[sel].transaction == 1">
  39. <label>Refinance</label>
  40. </section>
  41. <section class="form inputs">
  42. <h3>Property Details</h3>
  43. <label>Price ($)</label>
  44. <input :value="loans[sel].price" @input="setPrice">
  45. <label>Type</label>
  46. <select id="" name="" v-model="loans[sel].property">
  47. <option value="attched">Single Family Attached</option>
  48. <option value="detached">Single Family Detached</option>
  49. <option value="lorise">Lo-rise (4 stories or less)</option>
  50. <option value="hirise">Hi-rise (over 4 stories)</option>
  51. </select>
  52. </section>
  53. <section class="radios form">
  54. <h3>Loan Type</h3>
  55. <input type="radio" name="loan_type" value="conv" v-model="loans[sel].type"
  56. >
  57. <label>Conventional</label>
  58. <input type="radio" name="loan_type" value="fha" v-model="loans[sel].type">
  59. <label>FHA</label>
  60. <input type="radio" name="loan_type" value="va" v-model="loans[sel].type">
  61. <label>VA</label>
  62. <input type="radio" name="loan_type" value="usda" v-model="loans[sel].type">
  63. <label>USDA</label>
  64. </section>
  65. <section class="form inputs">
  66. <h3>Loan Details</h3>
  67. <label>Loan Term (years)</label>
  68. <input :value="loans[sel].term"
  69. @input="(e) => loans[sel].term = parseInt(e.target.value.replace(/[^0-9]/g, ''))">
  70. <label>Loan Program</label>
  71. <select id="" name="" v-model="loans[sel].program">
  72. <option value="none">None</option>
  73. </select>
  74. <label>Loan to Value (%)</label>
  75. <input :value="loans[sel].ltv" @input="setLtv">
  76. <label>Loan Amount ($)</label>
  77. <input :value="loans[sel].amount"
  78. @input="setAmount">
  79. <label>Housing Expense DTI (%) - Optional</label>
  80. <input :value="loans[sel].housingDti" @input="setHousingDti">
  81. <label>Total DTI (%) - Optional</label>
  82. <input :value="loans[sel].dti" @input="setDti">
  83. </section>
  84. </div>
  85. </template>
  86. <script>
  87. // Strips non-digits from an input box event and returns it's rounded integer
  88. function strip(e) {
  89. return parseInt(e.target.value.replace(/\D/g, '') || 0)
  90. }
  91. function setLtv(e) {
  92. let ltv = strip(e)
  93. let loan = this.loans[this.sel]
  94. if (!loan.price) return
  95. if (ltv > 100) ltv = 100
  96. if (ltv < 0) ltv = 0
  97. loan.ltv = ltv
  98. loan.amount = Math.round(ltv / 100 * loan.price)
  99. }
  100. function setAmount(e) {
  101. let amount = strip(e)
  102. let loan = this.loans[this.sel]
  103. if (!loan.price) return
  104. if (amount > loan.price) amount = loan.price
  105. if (amount < 0) amount = 0
  106. loan.amount = amount
  107. loan.ltv = Math.round(amount / loan.price * 100)
  108. }
  109. function setPrice(e) {
  110. let loan = this.loans[this.sel]
  111. let value = strip(e)
  112. loan.price = value
  113. loan.amount = Math.round(loan.ltv / 100 * value)
  114. }
  115. function setDti(e) {
  116. let dti = strip(e)
  117. let loan = this.loans[this.sel]
  118. if (!loan.price) return
  119. if (dti > 100) dti = 100
  120. if (dti < 0) dti = 0
  121. loan.dti = dti
  122. }
  123. function setHousingDti(e) {
  124. let housingDti = strip(e)
  125. let loan = this.loans[this.sel]
  126. if (!loan.price) return
  127. if (housingDti > 100) housingDti = 100
  128. if (housingDti < 0) housingDti = 0
  129. loan.housingDti = housingDti
  130. }
  131. const loans = [
  132. {
  133. title: "Loan Example",
  134. property: "",
  135. transaction: 0,
  136. type: "",
  137. price: 0,
  138. term: 0,
  139. ltv: 0,
  140. borrowers: 0,
  141. creditScore: 0,
  142. mIncome: 0,
  143. dti: 0,
  144. housingDti: 0,
  145. amount: 0,
  146. program: "",
  147. pud: false,
  148. zip: ''
  149. },
  150. {
  151. title: "Another One",
  152. property: "",
  153. transaction: 0,
  154. type: "",
  155. price: 0,
  156. term: 0,
  157. ltv: 0,
  158. borrowers: 0,
  159. creditScore: 0,
  160. mIncome: 0,
  161. dti: 0,
  162. housingDti: 0,
  163. program: "",
  164. pud: true,
  165. zip: ''
  166. }
  167. ]
  168. const propertyTypes = [
  169. ]
  170. export default {
  171. methods: {
  172. setPrice, setLtv, setAmount, setDti, setHousingDti, strip
  173. },
  174. props: ['user'],
  175. data() {
  176. return {
  177. loans: loans, sel: 0, loan: loans[0],
  178. }
  179. }
  180. }
  181. </script>