Skouter mortgage estimates. Web application with view written in PHP and Vue, but controller and models in Go.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

231 lines
6.5 KiB

  1. /* Precision for all money amounts assumes cents are excluded. */
  2. CREATE TABLE address (
  3. id INT AUTO_INCREMENT,
  4. full_address VARCHAR(200) NOT NULL,
  5. street VARCHAR(40) NOT NULL,
  6. city VARCHAR(40) NOT NULL,
  7. region VARCHAR(40) NOT NULL,
  8. country VARCHAR(40) NOT NULL,
  9. zip VARCHAR(10) NOT NULL,
  10. PRIMARY KEY (`id`)
  11. );
  12. CREATE TABLE branch (
  13. id INT AUTO_INCREMENT,
  14. name VARCHAR(40) NOT NULL,
  15. type ENUM('NMLS', 'FSRA') NOT NULL,
  16. letterhead BLOB(102400) NOT NULL DEFAULT 0,
  17. num VARCHAR(40) NOT NULL,
  18. phone VARCHAR(20) NOT NULL,
  19. address INT NOT NULL,
  20. PRIMARY KEY (id),
  21. FOREIGN KEY (address) REFERENCES address(id)
  22. );
  23. CREATE TABLE user (
  24. id INT AUTO_INCREMENT,
  25. email VARCHAR(40) UNIQUE NOT NULL,
  26. first_name VARCHAR(30) NOT NULL,
  27. last_name VARCHAR(30) NOT NULL,
  28. customer_id VARCHAR(255) NOT NULL DEFAULT '',
  29. phone VARCHAR(20) NOT NULL DEFAULT '',
  30. address INT NOT NULL,
  31. password CHAR(64) NOT NULL,
  32. verified BOOLEAN,
  33. newsletter BOOLEAN DEFAULT 0,
  34. branch_id INT DEFAULT NULL,
  35. avatar BLOB(102400) NOT NULL DEFAULT 0,
  36. letterhead BLOB(102400) NOT NULL DEFAULT 0,
  37. /* The password should be a SHA256 hash in hex format. It's length doesn't
  38. * vary */
  39. country ENUM('Canada', 'USA') NOT NULL,
  40. title ENUM('Loan Officer',
  41. 'Branch Manager',
  42. 'Mortgage Broker',
  43. 'Executive',
  44. 'Other') NOT NULL,
  45. status ENUM('Unsubscribed',
  46. 'Trial',
  47. 'Free',
  48. 'Subscriber',
  49. 'Branch',
  50. 'Admin') DEFAULT 'Trial',
  51. role ENUM('User', 'Manager', 'Admin') NOT NULL,
  52. created DATETIME,
  53. last_login DATETIME,
  54. PRIMARY KEY (`id`),
  55. FOREIGN KEY (branch_id) REFERENCES branch(id),
  56. FOREIGN KEY (address) REFERENCES address(id)
  57. );
  58. CREATE TABLE subscription (
  59. id INT AUTO_INCREMENT,
  60. stripe_id VARCHAR(255) DEFAULT '',
  61. user_id INT,
  62. customer_id VARCHAR(255) NOT NULL,
  63. price_id VARCHAR(255) NOT NULL,
  64. /* Key used by stripejs */
  65. client_secret VARCHAR(255) NOT NULL,
  66. status ENUM('incomplete',
  67. 'incomplete_expired',
  68. 'trialing',
  69. 'active',
  70. 'past_due',
  71. 'canceled',
  72. 'unpaid'),
  73. payment_status VARCHAR(50) NOT NULL,
  74. current_period_end INT DEFAULT 0,
  75. current_period_start INT DEFAULT 0,
  76. PRIMARY KEY (`id`),
  77. FOREIGN KEY (user_id) REFERENCES user(id)
  78. );
  79. CREATE TABLE license (
  80. id INT AUTO_INCREMENT,
  81. user_id INT NOT NULL,
  82. type ENUM('NMLS', 'FSRA', 'Other'),
  83. num VARCHAR(40) NOT NULL,
  84. PRIMARY KEY (`id`),
  85. FOREIGN KEY (user_id) REFERENCES user(id)
  86. ON DELETE CASCADE
  87. ON UPDATE RESTRICT
  88. );
  89. /* Officers or managers may need to create new loan types with custom settings.
  90. * Types with branch_id and user_id values of 0 will be general cases. */
  91. CREATE TABLE loan_type (
  92. id INT AUTO_INCREMENT,
  93. branch_id INT,
  94. user_id INT,
  95. name VARCHAR(30) UNIQUE NOT NULL,
  96. FOREIGN KEY (branch_id) REFERENCES branch(id),
  97. FOREIGN KEY (user_id) REFERENCES user(id),
  98. PRIMARY KEY (`id`)
  99. );
  100. CREATE TABLE estimate (
  101. id INT AUTO_INCREMENT,
  102. user_id INT NOT NULL,
  103. transaction ENUM('Purchase', 'Refinance'),
  104. price INT NOT NULL,
  105. property ENUM('Single Detached',
  106. 'Single Attached',
  107. 'Condo Lo-rise',
  108. 'Condo Hi-rise'),
  109. occupancy ENUM('Primary', 'Secondary', 'Investment'),
  110. zip VARCHAR(10),
  111. pud BOOLEAN, /* Property under development */
  112. PRIMARY KEY (`id`)
  113. );
  114. CREATE TABLE borrower (
  115. id INT AUTO_INCREMENT,
  116. credit_score SMALLINT NOT NULL,
  117. monthly_income INT NOT NULL,
  118. num TINYINT NOT NULL, /* Number of people borrowing. */
  119. estimate_id INT UNIQUE NOT NULL,
  120. PRIMARY KEY (`id`),
  121. FOREIGN KEY (estimate_id) REFERENCES estimate(id)
  122. ON DELETE CASCADE
  123. );
  124. CREATE TABLE estimate_template (
  125. id INT AUTO_INCREMENT,
  126. estimate_id INT UNIQUE NOT NULL,
  127. user_id INT NOT NULL, /* User who created the template */
  128. branch_id INT NOT NULL DEFAULT 0,
  129. /* Specific branch allowed to use it. 0 is only user. */
  130. PRIMARY KEY (`id`),
  131. FOREIGN KEY (estimate_id) REFERENCES estimate(id)
  132. );
  133. CREATE TABLE loan (
  134. id INT AUTO_INCREMENT,
  135. estimate_id INT NOT NULL,
  136. type_id INT NOT NULL,
  137. amount INT NOT NULL,
  138. term INT, /* In years */
  139. interest FLOAT(5, 2) DEFAULT 0, /* Percentage to 2 decimal places */
  140. ltv FLOAT(5, 2) DEFAULT 0,
  141. dti FLOAT(5, 2) DEFAULT 1,
  142. hoi INT DEFAULT 0, /* Home owner's insurance annual payments */
  143. hazard INT DEFAULT 0, /* Hazard insurance annual payments */
  144. tax INT DEFAULT 0, /* Real estate taxes */
  145. name VARCHAR(30) DEFAULT '',
  146. PRIMARY KEY (`id`),
  147. FOREIGN KEY (estimate_id) REFERENCES estimate(id) ON DELETE CASCADE,
  148. FOREIGN KEY (type_id) REFERENCES loan_type(id)
  149. ON DELETE CASCADE
  150. ON UPDATE RESTRICT
  151. );
  152. CREATE TABLE mi (
  153. id INT AUTO_INCREMENT,
  154. loan_id INT,
  155. type VARCHAR(10) NOT NULL DEFAULT "",
  156. label VARCHAR(30) NOT NULL DEFAULT "",
  157. lender VARCHAR(20) NOT NULL DEFAULT "",
  158. rate INT DEFAULT 0,
  159. premium INT DEFAULT 0,
  160. upfront INT DEFAULT 0,
  161. five_year_total INT DEFAULT 0,
  162. initial_premium INT DEFAULT 0,
  163. initial_rate INT DEFAULT 0,
  164. initial_amount INT DEFAULT 0,
  165. PRIMARY KEY (`id`),
  166. FOREIGN KEY (loan_id) REFERENCES loan(id)
  167. ON DELETE CASCADE
  168. );
  169. /* template = true fees are saved for users or branches. If template or default
  170. * are true, estimate_id should be null. */
  171. CREATE TABLE fee (
  172. id INT AUTO_INCREMENT NOT NULL,
  173. loan_id INT,
  174. amount INT NOT NULL,
  175. perc SMALLINT, /* Percentage of sale price instead of amount */
  176. type ENUM('Government', 'Title', 'Required', 'Lender', 'Other'),
  177. notes VARCHAR(255),
  178. name VARCHAR(30),
  179. /* Group heading shown in report */
  180. category VARCHAR(60),
  181. PRIMARY KEY (`id`),
  182. FOREIGN KEY (loan_id) REFERENCES loan(id)
  183. ON DELETE CASCADE
  184. );
  185. /* Templates to be reused by users or branches. Either user_id or branch_id must
  186. * be non-null.*/
  187. CREATE TABLE fee_template (
  188. id INT AUTO_INCREMENT,
  189. user_id INT NOT NULL,
  190. branch_id INT,
  191. amount INT NOT NULL,
  192. perc SMALLINT NOT NULL,
  193. /* Percentage of sale price instead of amount */
  194. type ENUM('Government', 'Title', 'Required', 'Lender', 'Other'),
  195. notes VARCHAR(255) NOT NULL,
  196. name VARCHAR(30) NOT NULL,
  197. /* Group heading shown in report */
  198. category VARCHAR(60) NOT NULL DEFAULT "",
  199. auto BOOLEAN NOT NULL,
  200. /* If fee should be automatically applied */
  201. PRIMARY KEY (`id`),
  202. FOREIGN KEY (user_id) REFERENCES user(id),
  203. FOREIGN KEY (branch_id) REFERENCES branch(id)
  204. );
  205. CREATE TABLE estimate_result (
  206. id INT AUTO_INCREMENT,
  207. loan_id INT UNIQUE NOT NULL,
  208. loan_payment INT NOT NULL,
  209. total_monthly INT NOT NULL,
  210. total_fees INT NOT NULL,
  211. total_credits INT NOT NULL,
  212. cash_to_close INT NOT NULL,
  213. PRIMARY KEY (`id`),
  214. FOREIGN KEY (loan_id) REFERENCES loan(id) ON DELETE CASCADE
  215. );