schema.sql 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. CREATE DATABASE IF NOT EXISTS radionica3d;
  2. USE radionica3d;
  3. -- Materials table
  4. CREATE TABLE IF NOT EXISTS materials (
  5. id INT AUTO_INCREMENT PRIMARY KEY,
  6. name_en VARCHAR(100) NOT NULL,
  7. name_ru VARCHAR(100),
  8. name_me VARCHAR(100),
  9. desc_en TEXT,
  10. desc_ru TEXT,
  11. desc_me TEXT,
  12. price_per_cm3 DECIMAL(10, 2) DEFAULT 0.00,
  13. is_active BOOLEAN DEFAULT TRUE,
  14. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  15. );
  16. -- Services table
  17. CREATE TABLE IF NOT EXISTS services (
  18. id INT AUTO_INCREMENT PRIMARY KEY,
  19. name_en VARCHAR(100) NOT NULL,
  20. name_ru VARCHAR(100),
  21. name_me VARCHAR(100),
  22. desc_en TEXT,
  23. desc_ru TEXT,
  24. desc_me TEXT,
  25. tech_type VARCHAR(50), -- e.g., FDM, SLA
  26. is_active BOOLEAN DEFAULT TRUE,
  27. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  28. );
  29. -- Users table
  30. CREATE TABLE IF NOT EXISTS users (
  31. id INT AUTO_INCREMENT PRIMARY KEY,
  32. email VARCHAR(150) NOT NULL UNIQUE,
  33. password_hash VARCHAR(255) NOT NULL,
  34. first_name VARCHAR(100),
  35. last_name VARCHAR(100),
  36. phone VARCHAR(20),
  37. shipping_address TEXT,
  38. role VARCHAR(20) DEFAULT 'user', -- user, admin
  39. ip_address VARCHAR(45), -- Supports IPv6
  40. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  41. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
  42. );
  43. -- Password reset tokens
  44. CREATE TABLE IF NOT EXISTS password_reset_tokens (
  45. id INT AUTO_INCREMENT PRIMARY KEY,
  46. user_id INT NOT NULL,
  47. token VARCHAR(255) NOT NULL UNIQUE,
  48. expires_at TIMESTAMP NOT NULL,
  49. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  50. FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
  51. );
  52. -- Orders table
  53. CREATE TABLE IF NOT EXISTS orders (
  54. id INT AUTO_INCREMENT PRIMARY KEY,
  55. user_id INT NULL,
  56. first_name VARCHAR(100) NOT NULL,
  57. last_name VARCHAR(100) NOT NULL,
  58. phone VARCHAR(20) NOT NULL,
  59. email VARCHAR(150) NOT NULL,
  60. shipping_address TEXT NOT NULL,
  61. model_link TEXT,
  62. status VARCHAR(50) DEFAULT 'pending', -- pending, processing, shipped, completed, cancelled
  63. total_price DECIMAL(10, 2) DEFAULT NULL, -- To be filled by admin later
  64. estimated_price DECIMAL(10, 2) DEFAULT NULL,
  65. material_name VARCHAR(100) NULL, -- Factual Snapshot
  66. material_price DECIMAL(10, 4) DEFAULT NULL, -- Factual Snapshot
  67. allow_portfolio BOOLEAN DEFAULT FALSE,
  68. quantity INT DEFAULT 1,
  69. notes TEXT,
  70. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  71. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  72. FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL
  73. );
  74. -- Order Files table
  75. CREATE TABLE IF NOT EXISTS order_files (
  76. id INT AUTO_INCREMENT PRIMARY KEY,
  77. order_id INT NOT NULL,
  78. filename VARCHAR(255) NOT NULL,
  79. file_path VARCHAR(512) NOT NULL,
  80. file_size INT,
  81. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  82. FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE
  83. );
  84. -- Order Photos table (for reports and portfolio)
  85. CREATE TABLE IF NOT EXISTS order_photos (
  86. id INT AUTO_INCREMENT PRIMARY KEY,
  87. order_id INT NOT NULL,
  88. file_path VARCHAR(512) NOT NULL,
  89. is_public BOOLEAN DEFAULT FALSE, -- Only if allow_portfolio on order is true
  90. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  91. FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE
  92. );
  93. -- Initial Data Migration
  94. INSERT INTO materials (name_en, name_ru, name_me, desc_en, desc_ru, desc_me, price_per_cm3) VALUES
  95. ('PLA Plastic', 'PLA Пластик', 'PLA Plastika', 'Biodegradable, ideal for prototypes', 'Биоразлагаемый, идеален для прототипов', 'Biorazgradiva, idealna za prototipove', 0.04),
  96. ('ABS Plastic', 'ABS Пластик', 'ABS Plastika', 'Durable, impact resistant', 'Прочный, ударостойкий', 'Izdržljiva, otporna na udarce', 0.05),
  97. ('PETG Plastic', 'PETG Пластик', 'PETG Plastika', 'High chemical resistance', 'Высокая химическая стойкость', 'Visoka hemijska otpornost', 0.06),
  98. ('Photopolymer Resin', 'Фотополимерная смола', 'Fotopolimerna smola', 'Maximum detail and surface quality', 'Максимальная детализация и качество поверхности', 'Maksimalna detaljnost i kvalitet površine', 0.12);
  99. INSERT INTO services (name_en, name_ru, name_me, desc_en, desc_ru, desc_me, tech_type) VALUES
  100. ('FDM Printing', 'FDM Печать', 'FDM Štampa', 'Fast and durable parts made from high-strength engineering plastics. Ideal for functional prototypes and industrial components.', 'Быстрые и прочные детали из высокопрочных инженерных пластиков. Идеально для функциональных прототипов и промышленных узлов.', 'Brzi i izdržljivi djelovi od visokootporne inženjerske plastike. Idealno za funkcionalne prototipove i industrijske komponente.', 'FDM'),
  101. ('SLA Printing', 'SLA Печать', 'SLA Štampa', 'Maximum detail and smooth surface for professional prototypes and high-precision models.', 'Максимальная детализация и гладкость поверхности для профессиональных прототипов и высокоточных моделей.', 'Maksimalna detaljnost i glatka površina za profesionalne prototipove i modele visoke preciznosti.', 'SLA');