Skouter mortgage estimates. Web application with view written in PHP and Vue, but controller and models in Go.
 
 
 
 
 
 

139 rindas
4.0 KiB

  1. /* Precision for all money amounts assumes cents are excluded. */
  2. CREATE TABLE branch (
  3. id INT AUTO_INCREMENT,
  4. type ENUM('NMLS', 'FSRA') NOT NULL,
  5. num VARCHAR(40) NOT NULL,
  6. PRIMARY KEY (id)
  7. );
  8. CREATE TABLE user (
  9. id INT AUTO_INCREMENT,
  10. email VARCHAR(40) UNIQUE NOT NULL,
  11. first_name VARCHAR(30) NOT NULL,
  12. last_name VARCHAR(30) NOT NULL,
  13. password CHAR(64) NOT NULL,
  14. verified BOOLEAN,
  15. branch_id INT NULL,
  16. /* The password should be a SHA256 hash in hex format. It's length doesn't
  17. * vary */
  18. country ENUM('Canada', 'USA'),
  19. title ENUM('Loan Officer',
  20. 'Branch Manager',
  21. 'Mortgage Broker',
  22. 'Other'),
  23. status ENUM('Trial',
  24. 'Free',
  25. 'Subscribed',
  26. 'Branch',
  27. 'Admin'),
  28. PRIMARY KEY (`id`),
  29. FOREIGN KEY (branch_id) REFERENCES branch(id)
  30. );
  31. CREATE TABLE license (
  32. id INT AUTO_INCREMENT,
  33. user_id INT NOT NULL,
  34. type ENUM('NMLS', 'FSRA'),
  35. num VARCHAR(40) NOT NULL,
  36. PRIMARY KEY (`id`),
  37. FOREIGN KEY (user_id) REFERENCES user(id)
  38. ON DELETE CASCADE
  39. ON UPDATE RESTRICT
  40. );
  41. /* Officers or managers may need to create new loan types with custom settings.
  42. * Types with branch_id and user_id values of 0 will be general cases. */
  43. CREATE TABLE loan_type (
  44. id INT AUTO_INCREMENT,
  45. branch_id INT NOT NULL,
  46. user_id INT NOT NULL,
  47. name VARCHAR(30) UNIQUE NOT NULL,
  48. /* FOREIGN KEY (branch_id) REFERENCES branch(id), */
  49. /* FOREIGN KEY (user_id) REFERENCES user(id), */
  50. PRIMARY KEY (`id`)
  51. );
  52. CREATE TABLE borrower (
  53. id INT AUTO_INCREMENT,
  54. credit_score SMALLINT NOT NULL,
  55. monthly_income INT NOT NULL,
  56. num TINYINT NOT NULL, /* Number of people borrowing. */
  57. PRIMARY KEY (`id`)
  58. );
  59. CREATE TABLE estimate (
  60. id INT AUTO_INCREMENT,
  61. user_id INT NOT NULL,
  62. borrower_id INT NOT NULL,
  63. transaction ENUM('Purchase', 'Refinance'),
  64. price INT NOT NULL,
  65. property ENUM('Single Detached',
  66. 'Single Attached',
  67. 'Condo Lo-rise',
  68. 'Condo Hi-rise'),
  69. occupancy ENUM('Primary', 'Secondary', 'Investment'),
  70. zip VARCHAR(10),
  71. pud BOOLEAN, /* Property under development */
  72. PRIMARY KEY (`id`),
  73. FOREIGN KEY (borrower_id) REFERENCES borrower(id)
  74. );
  75. CREATE TABLE loan (
  76. id INT AUTO_INCREMENT,
  77. estimate_id INT NOT NULL,
  78. type_id INT NOT NULL,
  79. amount INT NOT NULL,
  80. term INT, /* In years */
  81. interest INT, /* Per year, precise to 2 decimals */
  82. ltv FLOAT(5, 2) DEFAULT 0,
  83. dti FLOAT(5, 2) DEFAULT 1,
  84. hoi INT DEFAULT 0, /* Hazard insurance annual payments */
  85. mi_name VARCHAR(50) NOT NULL,
  86. /* Mortgage insurance title shown in menu */
  87. mi_amount INT, /* Mortgage insurance amount */
  88. lender VARCHAR(30) DEFAULT '',
  89. name VARCHAR(30) DEFAULT '',
  90. PRIMARY KEY (`id`),
  91. FOREIGN KEY (estimate_id) REFERENCES estimate(id),
  92. FOREIGN KEY (type_id) REFERENCES loan_type(id)
  93. ON UPDATE RESTRICT
  94. );
  95. /* template = true fees are saved for users or branches. If template or default
  96. * are true, estimate_id should be null.*/
  97. CREATE TABLE fee (
  98. id INT AUTO_INCREMENT NOT NULL,
  99. loan_id INT,
  100. amount INT NOT NULL,
  101. perc SMALLINT, /* Percentage of sale price instead of amount */
  102. type ENUM('Goverment', 'Title', 'Required', 'Lender', 'Other'),
  103. notes VARCHAR(255),
  104. name VARCHAR(30),
  105. /* Group heading shown in report */
  106. category VARCHAR(60),
  107. PRIMARY KEY (`id`),
  108. FOREIGN KEY (loan_id) REFERENCES loan(id)
  109. );
  110. /* Templates to be reused by users or branches. Either user_id or branch_id must
  111. * be non-null.*/
  112. CREATE TABLE fee_template (
  113. id INT AUTO_INCREMENT,
  114. user_id INT NOT NULL,
  115. branch_id INT NOT NULL,
  116. amount INT NOT NULL,
  117. perc SMALLINT NOT NULL,
  118. /* Percentage of sale price instead of amount */
  119. type ENUM('Goverment', 'Title', 'Required', 'Lender', 'Other'),
  120. notes VARCHAR(255) NOT NULL,
  121. name VARCHAR(30) NOT NULL,
  122. /* Group heading shown in report */
  123. category VARCHAR(60) NOT NULL,
  124. auto BOOLEAN NOT NULL,
  125. /* If fee should be automatically applied */
  126. PRIMARY KEY (`id`),
  127. FOREIGN KEY (user_id) REFERENCES user(id),
  128. FOREIGN KEY (branch_id) REFERENCES branch(id)
  129. );