Skouter mortgage estimates. Web application with view written in PHP and Vue, but controller and models in Go.
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

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>