setup_database.sql 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. CREATE DATABASE IF NOT EXISTS inventory_db;
  2. USE inventory_db;
  3. CREATE TABLE IF NOT EXISTS items (
  4. id INT(11) AUTO_INCREMENT PRIMARY KEY,
  5. name VARCHAR(255) NOT NULL,
  6. description TEXT,
  7. serial_number VARCHAR(100) NULL,
  8. picture VARCHAR(255) NULL,
  9. quantity INT(11) NOT NULL DEFAULT 0,
  10. price DECIMAL(10,2) NOT NULL DEFAULT 0.00,
  11. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  12. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
  13. );
  14. CREATE TABLE IF NOT EXISTS rental_prices (
  15. id INT(11) AUTO_INCREMENT PRIMARY KEY,
  16. item_id INT(11) NOT NULL,
  17. client_id INT(11) NULL,
  18. start_date DATE NOT NULL,
  19. end_date DATE NOT NULL,
  20. daily_price DECIMAL(10,2) NOT NULL DEFAULT 0.00,
  21. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  22. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  23. FOREIGN KEY (item_id) REFERENCES items(id) ON DELETE CASCADE,
  24. FOREIGN KEY (client_id) REFERENCES clients(id) ON DELETE SET NULL,
  25. INDEX idx_item_dates (item_id, start_date, end_date)
  26. );
  27. CREATE TABLE IF NOT EXISTS attachments (
  28. id INT(11) AUTO_INCREMENT PRIMARY KEY,
  29. item_id INT(11) NOT NULL,
  30. filename VARCHAR(255) NOT NULL,
  31. original_name VARCHAR(255) NOT NULL,
  32. file_type ENUM('receipt', 'warranty', 'other') NOT NULL DEFAULT 'other',
  33. file_path VARCHAR(255) NOT NULL,
  34. file_size INT(11) NOT NULL,
  35. mime_type VARCHAR(100) NOT NULL,
  36. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  37. FOREIGN KEY (item_id) REFERENCES items(id) ON DELETE CASCADE,
  38. INDEX idx_item_type (item_id, file_type)
  39. );
  40. CREATE TABLE IF NOT EXISTS clients (
  41. id INT(11) AUTO_INCREMENT PRIMARY KEY,
  42. company_name VARCHAR(255) NULL,
  43. y_tunnus VARCHAR(255) NULL,
  44. first_name VARCHAR(100) NOT NULL,
  45. last_name VARCHAR(100) NOT NULL,
  46. email VARCHAR(255) NOT NULL UNIQUE,
  47. phone VARCHAR(20) NULL,
  48. address VARCHAR(255) NULL,
  49. city VARCHAR(100) NULL,
  50. state VARCHAR(100) NULL,
  51. postal_code VARCHAR(20) NULL,
  52. country VARCHAR(100) NULL,
  53. notes TEXT NULL,
  54. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  55. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  56. INDEX idx_email (email),
  57. INDEX idx_name (last_name, first_name),
  58. INDEX idx_y_tunnus (y_tunnus)
  59. );
  60. CREATE TABLE IF NOT EXISTS contact_persons (
  61. id INT(11) AUTO_INCREMENT PRIMARY KEY,
  62. client_id INT(11) NOT NULL,
  63. first_name VARCHAR(100) NOT NULL,
  64. last_name VARCHAR(100) NOT NULL,
  65. email VARCHAR(255) NULL,
  66. phone VARCHAR(20) NULL,
  67. position VARCHAR(100) NULL,
  68. is_primary BOOLEAN DEFAULT FALSE,
  69. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  70. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  71. FOREIGN KEY (client_id) REFERENCES clients(id) ON DELETE CASCADE,
  72. INDEX idx_client_primary (client_id, is_primary),
  73. INDEX idx_name (last_name, first_name)
  74. );
  75. CREATE TABLE IF NOT EXISTS invoices (
  76. id INT(11) AUTO_INCREMENT PRIMARY KEY,
  77. client_id INT(11) NOT NULL,
  78. invoice_number VARCHAR(50) NOT NULL UNIQUE,
  79. issue_date DATE NOT NULL,
  80. due_date DATE NOT NULL,
  81. status ENUM('draft', 'sent', 'paid', 'overdue', 'cancelled') DEFAULT 'draft',
  82. subtotal DECIMAL(10,2) NOT NULL DEFAULT 0.00,
  83. tax_amount DECIMAL(10,2) NOT NULL DEFAULT 0.00,
  84. total_amount DECIMAL(10,2) NOT NULL DEFAULT 0.00,
  85. notes TEXT NULL,
  86. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  87. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  88. FOREIGN KEY (client_id) REFERENCES clients(id) ON DELETE RESTRICT,
  89. INDEX idx_client_status (client_id, status),
  90. INDEX idx_invoice_number (invoice_number),
  91. INDEX idx_due_date (due_date)
  92. );
  93. CREATE TABLE IF NOT EXISTS invoice_items (
  94. id INT(11) AUTO_INCREMENT PRIMARY KEY,
  95. invoice_id INT(11) NOT NULL,
  96. item_id INT(11) NOT NULL,
  97. description VARCHAR(255) NOT NULL,
  98. quantity DECIMAL(10,2) NOT NULL DEFAULT 1.00,
  99. unit_price DECIMAL(10,2) NOT NULL DEFAULT 0.00,
  100. line_total DECIMAL(10,2) NOT NULL DEFAULT 0.00,
  101. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  102. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  103. FOREIGN KEY (invoice_id) REFERENCES invoices(id) ON DELETE CASCADE,
  104. FOREIGN KEY (item_id) REFERENCES items(id) ON DELETE RESTRICT,
  105. INDEX idx_invoice (invoice_id),
  106. INDEX idx_item (item_id)
  107. );
  108. CREATE TABLE IF NOT EXISTS payments (
  109. id INT(11) AUTO_INCREMENT PRIMARY KEY,
  110. invoice_id INT(11) NULL,
  111. client_id INT(11) NOT NULL,
  112. payment_date DATE NOT NULL,
  113. amount DECIMAL(10,2) NOT NULL DEFAULT 0.00,
  114. payment_method ENUM('cash', 'check', 'credit_card', 'bank_transfer', 'other') DEFAULT 'cash',
  115. reference_number VARCHAR(50) NULL,
  116. notes TEXT NULL,
  117. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  118. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  119. FOREIGN KEY (invoice_id) REFERENCES invoices(id) ON DELETE SET NULL,
  120. FOREIGN KEY (client_id) REFERENCES clients(id) ON DELETE RESTRICT,
  121. INDEX idx_invoice (invoice_id),
  122. INDEX idx_client (client_id),
  123. INDEX idx_payment_date (payment_date)
  124. );
  125. CREATE TABLE IF NOT EXISTS chart_of_accounts (
  126. id INT(11) AUTO_INCREMENT PRIMARY KEY,
  127. account_number VARCHAR(20) NOT NULL UNIQUE,
  128. account_name VARCHAR(255) NOT NULL,
  129. account_type ENUM('asset', 'liability', 'equity', 'revenue', 'expense') NOT NULL,
  130. parent_id INT(11) NULL,
  131. description TEXT NULL,
  132. opening_balance DECIMAL(10,2) DEFAULT 0.00,
  133. current_balance DECIMAL(10,2) DEFAULT 0.00,
  134. is_active BOOLEAN DEFAULT TRUE,
  135. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  136. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  137. FOREIGN KEY (parent_id) REFERENCES chart_of_accounts(id) ON DELETE SET NULL,
  138. INDEX idx_account_type (account_type),
  139. INDEX idx_parent (parent_id),
  140. INDEX idx_account_number (account_number)
  141. );
  142. CREATE TABLE IF NOT EXISTS journal_entries (
  143. id INT(11) AUTO_INCREMENT PRIMARY KEY,
  144. entry_number VARCHAR(50) NOT NULL UNIQUE,
  145. entry_date DATE NOT NULL,
  146. description TEXT NULL,
  147. reference_number VARCHAR(50) NULL,
  148. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  149. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  150. INDEX idx_entry_date (entry_date),
  151. INDEX idx_entry_number (entry_number)
  152. );
  153. CREATE TABLE IF NOT EXISTS account_transactions (
  154. id INT(11) AUTO_INCREMENT PRIMARY KEY,
  155. journal_entry_id INT(11) NOT NULL,
  156. account_id INT(11) NOT NULL,
  157. debit_amount DECIMAL(10,2) DEFAULT 0.00,
  158. credit_amount DECIMAL(10,2) DEFAULT 0.00,
  159. description TEXT NULL,
  160. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  161. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  162. FOREIGN KEY (journal_entry_id) REFERENCES journal_entries(id) ON DELETE CASCADE,
  163. FOREIGN KEY (account_id) REFERENCES chart_of_accounts(id) ON DELETE RESTRICT,
  164. INDEX idx_journal_entry (journal_entry_id),
  165. INDEX idx_account (account_id),
  166. INDEX idx_debit_credit (debit_amount, credit_amount)
  167. );
  168. CREATE TABLE IF NOT EXISTS users (
  169. id INT(11) AUTO_INCREMENT PRIMARY KEY,
  170. username VARCHAR(50) NOT NULL UNIQUE,
  171. email VARCHAR(255) NOT NULL UNIQUE,
  172. password_hash VARCHAR(255) NOT NULL,
  173. first_name VARCHAR(100) NOT NULL,
  174. last_name VARCHAR(100) NOT NULL,
  175. role ENUM('admin', 'manager', 'user') DEFAULT 'user',
  176. is_active BOOLEAN DEFAULT TRUE,
  177. last_login TIMESTAMP NULL,
  178. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  179. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  180. INDEX idx_username (username),
  181. INDEX idx_email (email),
  182. INDEX idx_role (role),
  183. INDEX idx_active (is_active)
  184. );
  185. CREATE TABLE IF NOT EXISTS projects (
  186. id INT(11) AUTO_INCREMENT PRIMARY KEY,
  187. customer_id INT(11) NOT NULL,
  188. project_name VARCHAR(255) NOT NULL,
  189. description TEXT NULL,
  190. status ENUM('planning', 'in_progress', 'completed', 'on_hold', 'cancelled') DEFAULT 'planning',
  191. start_date DATE NULL,
  192. end_date DATE NULL,
  193. budget DECIMAL(10,2) NULL,
  194. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  195. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  196. FOREIGN KEY (customer_id) REFERENCES clients(id) ON DELETE CASCADE,
  197. INDEX idx_customer (customer_id),
  198. INDEX idx_status (status),
  199. INDEX idx_dates (start_date, end_date)
  200. );
  201. CREATE TABLE IF NOT EXISTS subprojects (
  202. id INT(11) AUTO_INCREMENT PRIMARY KEY,
  203. project_id INT(11) NOT NULL,
  204. subproject_name VARCHAR(255) NOT NULL,
  205. description TEXT NULL,
  206. status ENUM('planning', 'in_progress', 'completed', 'on_hold', 'cancelled') DEFAULT 'planning',
  207. start_date DATE NULL,
  208. end_date DATE NULL,
  209. budget DECIMAL(10,2) NULL,
  210. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  211. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  212. FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE,
  213. INDEX idx_project (project_id),
  214. INDEX idx_status (status),
  215. INDEX idx_dates (start_date, end_date)
  216. );
  217. INSERT INTO items (name, description, quantity, price) VALUES
  218. ('Laptop', 'Dell XPS 15 laptop', 5, 1299.99),
  219. ('Mouse', 'Wireless optical mouse', 20, 25.50),
  220. ('Keyboard', 'Mechanical keyboard', 15, 89.99);