Untitled

 avatar
unknown
mysql
2 months ago
53 kB
5
Indexable
-- V1__Comprehensive_Schema.sql

-- Comprehensive ERP Schema for Altec Mechanical Group
-- Includes indexes for performance optimization and liberal application-time periods

SET NAMES utf8mb4;

-- Shift Type Table
CREATE TABLE shift_type (
  shift_type_id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50) NOT NULL UNIQUE,
  start_time TIME NOT NULL,
  end_time TIME NOT NULL,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to   TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Initial shift types
INSERT INTO shift_type (name, start_time, end_time) VALUES
  ('Morning', '07:00:00', '15:00:00'),
  ('Regular', '09:00:00', '17:00:00'),
  ('Late',    '11:00:00', '19:00:00');

-- Role Table
CREATE TABLE role (
  role_id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50) NOT NULL UNIQUE,
  description TEXT DEFAULT NULL,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to   TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Add an index on name for faster lookups
CREATE INDEX idx_role_name ON role (name);

-- Permission Table
CREATE TABLE permission (
  permission_id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50) NOT NULL UNIQUE,
  description TEXT DEFAULT NULL,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to   TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Add an index on name for faster lookups
CREATE INDEX idx_permission_name ON permission (name);

-- Role Hierarchy Table
CREATE TABLE role_hierarchy (
  parent_role_id INT NOT NULL,
  child_role_id INT NOT NULL,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  PRIMARY KEY (parent_role_id, child_role_id, effective_from),
  FOREIGN KEY (parent_role_id) REFERENCES role(role_id),
  FOREIGN KEY (child_role_id) REFERENCES role(role_id),
  valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to   TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Account Type Table
CREATE TABLE account_type (
  account_type_id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50) NOT NULL UNIQUE,
  description VARCHAR(255) DEFAULT NULL,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to   TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Add an index on name for faster lookups
CREATE INDEX idx_account_type_name ON account_type (name);

-- Transaction Type Lookup Table
CREATE TABLE transaction_type (
  transaction_type_id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50) NOT NULL UNIQUE,
  description VARCHAR(255) DEFAULT NULL,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to   TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Add an index on name for faster lookups
CREATE INDEX idx_transaction_type_name ON transaction_type (name);

-- Event Type Lookup Table
CREATE TABLE event_type (
  event_type_id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50) NOT NULL UNIQUE,
  description VARCHAR(255) DEFAULT NULL,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to   TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Add an index on name for faster lookups
CREATE INDEX idx_event_type_name ON event_type (name);

-- Artifact Type Lookup Table
CREATE TABLE artifact_type (
  artifact_type_id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50) NOT NULL UNIQUE,
  description VARCHAR(255) DEFAULT NULL,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to   TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Add an index on name for faster lookups
CREATE INDEX idx_artifact_type_name ON artifact_type (name);

-- Entity Table for Multi-Entity Support
CREATE TABLE entity (
  entity_id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(100) NOT NULL UNIQUE,
  description VARCHAR(255) DEFAULT NULL,
  is_active TINYINT(1) NOT NULL DEFAULT 1,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  valid_from  TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to    TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Add index on is_active for quick filtering
CREATE INDEX idx_entity_is_active ON entity (is_active);

-- Main Tables

-- User Account Table
CREATE TABLE user_account (
  user_id INT AUTO_INCREMENT PRIMARY KEY,
  username VARCHAR(50) NOT NULL UNIQUE,
  password_hash VARCHAR(255) NOT NULL,
  full_name VARCHAR(100) NOT NULL,
  email VARCHAR(100) DEFAULT NULL,
  phone VARCHAR(20) DEFAULT NULL,
  avatar_url VARCHAR(255) DEFAULT NULL,
  is_active TINYINT(1) NOT NULL DEFAULT 1,
  is_anonymized TINYINT(1) NOT NULL DEFAULT 0,
  is_deleted TINYINT(1) NOT NULL DEFAULT 0,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  valid_from  TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to    TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for User Account
CREATE INDEX idx_user_account_username ON user_account (username);
CREATE INDEX idx_user_account_email ON user_account (email);
CREATE INDEX idx_user_account_is_active ON user_account (is_active);

-- User Permission Table
CREATE TABLE user_permission (
  user_id INT NOT NULL,
  permission_id INT NOT NULL,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  PRIMARY KEY (user_id, permission_id, effective_from),
  FOREIGN KEY (user_id) REFERENCES user_account(user_id),
  FOREIGN KEY (permission_id) REFERENCES permission(permission_id),
  valid_from  TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to    TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Worker Table
CREATE TABLE worker (
  worker_id INT AUTO_INCREMENT PRIMARY KEY,
  user_id INT NOT NULL UNIQUE,
  employee_code VARCHAR(50) UNIQUE,
  hire_date DATE DEFAULT NULL,
  termination_date DATE DEFAULT NULL,
  is_deleted TINYINT(1) NOT NULL DEFAULT 0,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  valid_from  TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to    TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to),
  FOREIGN KEY (user_id) REFERENCES user_account(user_id)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Worker
CREATE INDEX idx_worker_user_id ON worker (user_id);
CREATE INDEX idx_worker_employee_code ON worker (employee_code);

-- User Role Table
CREATE TABLE user_role (
  user_id INT NOT NULL,
  role_id INT NOT NULL,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  PRIMARY KEY (user_id, role_id, effective_from),
  FOREIGN KEY (user_id) REFERENCES user_account(user_id),
  FOREIGN KEY (role_id) REFERENCES role(role_id),
  valid_from  TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to    TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Role Permission Table
CREATE TABLE role_permission (
  role_id INT NOT NULL,
  permission_id INT NOT NULL,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  PRIMARY KEY (role_id, permission_id, effective_from),
  FOREIGN KEY (role_id) REFERENCES role(role_id),
  FOREIGN KEY (permission_id) REFERENCES permission(permission_id),
  valid_from  TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to    TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Crew Table
CREATE TABLE crew (
  crew_id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(100) NOT NULL,
  is_active TINYINT(1) NOT NULL DEFAULT 1,
  is_deleted TINYINT(1) NOT NULL DEFAULT 0,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  valid_from  TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to    TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Crew
CREATE INDEX idx_crew_name ON crew (name);
CREATE INDEX idx_crew_is_active ON crew (is_active);

-- Crew Shift Table
CREATE TABLE crew_shift (
  crew_shift_id INT AUTO_INCREMENT PRIMARY KEY,
  crew_id INT NOT NULL,
  shift_type_id INT NOT NULL,
  start_date DATE NOT NULL,
  end_date DATE DEFAULT NULL,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  valid_from  TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to    TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to),
  FOREIGN KEY (crew_id) REFERENCES crew(crew_id),
  FOREIGN KEY (shift_type_id) REFERENCES shift_type(shift_type_id)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Crew Shift
CREATE INDEX idx_crew_shift_crew_id ON crew_shift (crew_id);
CREATE INDEX idx_crew_shift_shift_type_id ON crew_shift (shift_type_id);
CREATE INDEX idx_crew_shift_start_date ON crew_shift (start_date);

-- Crew Member Table
CREATE TABLE crew_member (
  crew_member_id INT AUTO_INCREMENT PRIMARY KEY,
  crew_id INT NOT NULL,
  worker_id INT NOT NULL,
  role_id INT NOT NULL,
  start_date DATE NOT NULL,
  end_date DATE DEFAULT NULL,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  valid_from  TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to    TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to),
  FOREIGN KEY (crew_id) REFERENCES crew(crew_id),
  FOREIGN KEY (worker_id) REFERENCES worker(worker_id),
  FOREIGN KEY (role_id) REFERENCES role(role_id)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Crew Member
CREATE INDEX idx_crew_member_crew_id ON crew_member (crew_id);
CREATE INDEX idx_crew_member_worker_id ON crew_member (worker_id);
CREATE INDEX idx_crew_member_role_id ON crew_member (role_id);

-- Shift Change Request Table
CREATE TABLE shift_change_request (
  request_id INT AUTO_INCREMENT PRIMARY KEY,
  worker_id INT NOT NULL,
  from_shift_type_id INT NOT NULL,
  to_shift_type_id INT NOT NULL,
  requested_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  processed_by INT DEFAULT NULL,
  processed_at TIMESTAMP DEFAULT NULL,
  notes TEXT DEFAULT NULL,
  current_state VARCHAR(50) NOT NULL DEFAULT 'INITIATED',
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  FOREIGN KEY (worker_id) REFERENCES worker(worker_id),
  FOREIGN KEY (from_shift_type_id) REFERENCES shift_type(shift_type_id),
  FOREIGN KEY (to_shift_type_id) REFERENCES shift_type(shift_type_id),
  FOREIGN KEY (processed_by) REFERENCES user_account(user_id),
  valid_from  TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to    TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Shift Change Request
CREATE INDEX idx_shift_change_request_worker_id ON shift_change_request (worker_id);
CREATE INDEX idx_shift_change_request_current_state ON shift_change_request (current_state);

-- Job Site Table
CREATE TABLE job_site (
  job_site_id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(200) NOT NULL,
  address VARCHAR(255) DEFAULT NULL,
  latitude DECIMAL(10,7) DEFAULT NULL,
  longitude DECIMAL(10,7) DEFAULT NULL,
  created_by INT NOT NULL,
  is_deleted TINYINT(1) NOT NULL DEFAULT 0,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  valid_from  TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to    TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to),
  FOREIGN KEY (created_by) REFERENCES user_account(user_id)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Job Site
CREATE INDEX idx_job_site_name ON job_site (name);
CREATE INDEX idx_job_site_created_by ON job_site (created_by);

-- Timeline Event Table
CREATE TABLE timeline_event (
  event_id INT AUTO_INCREMENT PRIMARY KEY,
  job_site_id INT NOT NULL,
  event_type_id INT NOT NULL,
  reference_id INT NOT NULL,
  event_timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  valid_from  TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to    TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to),
  FOREIGN KEY (job_site_id) REFERENCES job_site(job_site_id),
  FOREIGN KEY (event_type_id) REFERENCES event_type(event_type_id)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Timeline Event
CREATE INDEX idx_timeline_event_job_site_id ON timeline_event (job_site_id);
CREATE INDEX idx_timeline_event_event_type_id ON timeline_event (event_type_id);
CREATE INDEX idx_timeline_event_reference_id ON timeline_event (reference_id);

-- Post Table
CREATE TABLE post (
  post_id INT AUTO_INCREMENT PRIMARY KEY,
  job_site_id INT NOT NULL,
  author_id INT NOT NULL,
  content TEXT NOT NULL,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  is_public TINYINT(1) NOT NULL DEFAULT 0,
  public_access_token VARCHAR(64) DEFAULT NULL,
  is_deleted TINYINT(1) NOT NULL DEFAULT 0,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  valid_from  TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to    TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to),
  FOREIGN KEY (job_site_id) REFERENCES job_site(job_site_id),
  FOREIGN KEY (author_id) REFERENCES user_account(user_id)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Post
CREATE INDEX idx_post_job_site_id ON post (job_site_id);
CREATE INDEX idx_post_author_id ON post (author_id);
CREATE INDEX idx_post_created_at ON post (created_at);

-- Daily Report Table
CREATE TABLE daily_report (
  report_id INT AUTO_INCREMENT PRIMARY KEY,
  worker_id INT NOT NULL,
  job_site_id INT NOT NULL,
  report_date DATE NOT NULL,
  summary TEXT DEFAULT NULL,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  is_deleted TINYINT(1) NOT NULL DEFAULT 0,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to),
  FOREIGN KEY (worker_id) REFERENCES worker(worker_id),
  FOREIGN KEY (job_site_id) REFERENCES job_site(job_site_id)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Daily Report
CREATE INDEX idx_daily_report_worker_id ON daily_report (worker_id);
CREATE INDEX idx_daily_report_job_site_id ON daily_report (job_site_id);
CREATE INDEX idx_daily_report_report_date ON daily_report (report_date);

-- Artifact Table
CREATE TABLE artifact (
  artifact_id INT AUTO_INCREMENT PRIMARY KEY,
  artifact_type_id INT NOT NULL,
  created_by INT NOT NULL,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  media_url VARCHAR(255) DEFAULT NULL,
  content TEXT DEFAULT NULL,
  is_deleted TINYINT(1) NOT NULL DEFAULT 0,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to),
  FOREIGN KEY (artifact_type_id) REFERENCES artifact_type(artifact_type_id),
  FOREIGN KEY (created_by) REFERENCES user_account(user_id)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Artifact
CREATE INDEX idx_artifact_artifact_type_id ON artifact (artifact_type_id);
CREATE INDEX idx_artifact_created_by ON artifact (created_by);
CREATE INDEX idx_artifact_created_at ON artifact (created_at);

-- GPS Log Entry Table
CREATE TABLE gps_log_entry (
  gps_log_entry_id INT AUTO_INCREMENT PRIMARY KEY,
  worker_id INT NOT NULL,
  latitude DECIMAL(10,7) NOT NULL,
  longitude DECIMAL(10,7) NOT NULL,
  log_timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  accuracy DECIMAL(5,2) DEFAULT NULL,
  altitude DECIMAL(8,2) DEFAULT NULL,
  speed DECIMAL(5,2) DEFAULT NULL,
  is_deleted TINYINT(1) NOT NULL DEFAULT 0,
  is_clock_in_out TINYINT(1) NOT NULL DEFAULT 0,
  valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to),
  FOREIGN KEY (worker_id) REFERENCES worker(worker_id)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for GPS Log Entry
CREATE INDEX idx_gps_log_entry_worker_id ON gps_log_entry (worker_id);
CREATE INDEX idx_gps_log_entry_log_timestamp ON gps_log_entry (log_timestamp);
CREATE INDEX idx_gps_log_entry_is_clock_in_out ON gps_log_entry (is_clock_in_out);

-- Post Artifact Mapping
CREATE TABLE post_artifact (
  post_id INT NOT NULL,
  artifact_id INT NOT NULL,
  PRIMARY KEY (post_id, artifact_id),
  FOREIGN KEY (post_id) REFERENCES post(post_id),
  FOREIGN KEY (artifact_id) REFERENCES artifact(artifact_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Daily Report Artifact Mapping
CREATE TABLE daily_report_artifact (
  report_id INT NOT NULL,
  artifact_id INT NOT NULL,
  PRIMARY KEY (report_id, artifact_id),
  FOREIGN KEY (report_id) REFERENCES daily_report(report_id),
  FOREIGN KEY (artifact_id) REFERENCES artifact(artifact_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Blueprint Table
CREATE TABLE blueprint (
  blueprint_id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(200) NOT NULL,
  description TEXT DEFAULT NULL,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  is_deleted TINYINT(1) NOT NULL DEFAULT 0,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Blueprint
CREATE INDEX idx_blueprint_name ON blueprint (name);

-- Blueprint Segment Table
CREATE TABLE blueprint_segment (
  segment_id INT AUTO_INCREMENT PRIMARY KEY,
  blueprint_id INT NOT NULL,
  name VARCHAR(200) NOT NULL,
  description TEXT DEFAULT NULL,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  is_deleted TINYINT(1) NOT NULL DEFAULT 0,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to),
  FOREIGN KEY (blueprint_id) REFERENCES blueprint(blueprint_id)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Blueprint Segment
CREATE INDEX idx_blueprint_segment_blueprint_id ON blueprint_segment (blueprint_id);
CREATE INDEX idx_blueprint_segment_name ON blueprint_segment (name);

-- Task Table
CREATE TABLE task (
  task_id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(200) NOT NULL,
  description TEXT DEFAULT NULL,
  estimated_hours DECIMAL(5,2) DEFAULT NULL,
  trade VARCHAR(50) DEFAULT NULL,
  created_by INT NOT NULL,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  blueprint_segment_id INT DEFAULT NULL,
  is_deleted TINYINT(1) NOT NULL DEFAULT 0,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to),
  FOREIGN KEY (created_by) REFERENCES user_account(user_id),
  FOREIGN KEY (blueprint_segment_id) REFERENCES blueprint_segment(segment_id)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Task
CREATE INDEX idx_task_name ON task (name);
CREATE INDEX idx_task_created_by ON task (created_by);
CREATE INDEX idx_task_blueprint_segment_id ON task (blueprint_segment_id);

-- Task Dependency Table
CREATE TABLE task_dependency (
  task_id INT NOT NULL,
  depends_on_task_id INT NOT NULL,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  PRIMARY KEY (task_id, depends_on_task_id, effective_from),
  FOREIGN KEY (task_id) REFERENCES task(task_id),
  FOREIGN KEY (depends_on_task_id) REFERENCES task(task_id),
  valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Assignment Table
CREATE TABLE assignment (
  assignment_id INT AUTO_INCREMENT PRIMARY KEY,
  crew_id INT NOT NULL,
  scheduled_date DATE NOT NULL,
  shift_type_id INT NOT NULL,
  notes TEXT DEFAULT NULL,
  assigned_by INT NOT NULL,
  assigned_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  is_deleted TINYINT(1) NOT NULL DEFAULT 0,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  valid_from  TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to    TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to),
  FOREIGN KEY (crew_id) REFERENCES crew(crew_id),
  FOREIGN KEY (shift_type_id) REFERENCES shift_type(shift_type_id),
  FOREIGN KEY (assigned_by) REFERENCES user_account(user_id)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Assignment
CREATE INDEX idx_assignment_crew_id ON assignment (crew_id);
CREATE INDEX idx_assignment_scheduled_date ON assignment (scheduled_date);
CREATE INDEX idx_assignment_shift_type_id ON assignment (shift_type_id);

-- Assignment Task Mapping
CREATE TABLE assignment_task (
  assignment_id INT NOT NULL,
  task_id INT NOT NULL,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  PRIMARY KEY (assignment_id, task_id, effective_from),
  FOREIGN KEY (assignment_id) REFERENCES assignment(assignment_id),
  FOREIGN KEY (task_id) REFERENCES task(task_id),
  valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Weekly Timesheet Table
CREATE TABLE weekly_timesheet (
  timesheet_id INT AUTO_INCREMENT PRIMARY KEY,
  worker_id INT NOT NULL,
  week_start_date DATE NOT NULL,
  submitted_at TIMESTAMP DEFAULT NULL,
  approved_by INT DEFAULT NULL,
  approved_at TIMESTAMP DEFAULT NULL,
  total_hours DECIMAL(5,2) DEFAULT NULL,
  is_deleted TINYINT(1) NOT NULL DEFAULT 0,
  current_state VARCHAR(50) NOT NULL DEFAULT 'PENDING',
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  valid_from  TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to    TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to),
  FOREIGN KEY (worker_id) REFERENCES worker(worker_id),
  FOREIGN KEY (approved_by) REFERENCES user_account(user_id)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Weekly Timesheet
CREATE INDEX idx_weekly_timesheet_worker_id ON weekly_timesheet (worker_id);
CREATE INDEX idx_weekly_timesheet_week_start_date ON weekly_timesheet (week_start_date);
CREATE INDEX idx_weekly_timesheet_current_state ON weekly_timesheet (current_state);

-- Time Entry Table
CREATE TABLE time_entry (
  time_entry_id INT AUTO_INCREMENT PRIMARY KEY,
  timesheet_id INT NOT NULL,
  date DATE NOT NULL,
  clock_in_time TIMESTAMP DEFAULT NULL,
  clock_out_time TIMESTAMP DEFAULT NULL,
  clock_in_gps_log_entry_id INT DEFAULT NULL,
  clock_out_gps_log_entry_id INT DEFAULT NULL,
  shift_type_id INT NOT NULL,
  approved_by INT DEFAULT NULL,
  approved_at TIMESTAMP DEFAULT NULL,
  total_hours DECIMAL(5,2) DEFAULT NULL,
  notes TEXT DEFAULT NULL,
  is_deleted TINYINT(1) NOT NULL DEFAULT 0,
  current_state VARCHAR(50) NOT NULL DEFAULT 'PENDING',
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to),
  FOREIGN KEY (timesheet_id) REFERENCES weekly_timesheet(timesheet_id),
  FOREIGN KEY (clock_in_gps_log_entry_id) REFERENCES gps_log_entry(gps_log_entry_id),
  FOREIGN KEY (clock_out_gps_log_entry_id) REFERENCES gps_log_entry(gps_log_entry_id),
  FOREIGN KEY (shift_type_id) REFERENCES shift_type(shift_type_id),
  FOREIGN KEY (approved_by) REFERENCES user_account(user_id)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Time Entry
CREATE INDEX idx_time_entry_timesheet_id ON time_entry (timesheet_id);
CREATE INDEX idx_time_entry_date ON time_entry (date);
CREATE INDEX idx_time_entry_shift_type_id ON time_entry (shift_type_id);
CREATE INDEX idx_time_entry_current_state ON time_entry (current_state);

-- Inventory Item Table
CREATE TABLE inventory_item (
  item_id INT AUTO_INCREMENT PRIMARY KEY,
  item_code VARCHAR(50) NOT NULL UNIQUE,
  name VARCHAR(200) NOT NULL,
  description TEXT DEFAULT NULL,
  unit_price DECIMAL(10,2) NOT NULL,
  reorder_level DECIMAL(10,2) DEFAULT NULL,
  safety_stock_level DECIMAL(10,2) DEFAULT NULL,
  is_active TINYINT(1) NOT NULL DEFAULT 1,
  is_deleted TINYINT(1) NOT NULL DEFAULT 0,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  valid_from  TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to    TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Inventory Item
CREATE INDEX idx_inventory_item_item_code ON inventory_item (item_code);
CREATE INDEX idx_inventory_item_name ON inventory_item (name);
CREATE INDEX idx_inventory_item_is_active ON inventory_item (is_active);

-- Inventory Location Table
CREATE TABLE inventory_location (
  location_id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(100) NOT NULL,
  address VARCHAR(255) DEFAULT NULL,
  is_active TINYINT(1) NOT NULL DEFAULT 1,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to   TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Inventory Location
CREATE INDEX idx_inventory_location_name ON inventory_location (name);
CREATE INDEX idx_inventory_location_is_active ON inventory_location (is_active);

-- Inventory Stock Table
CREATE TABLE inventory_stock (
  stock_id INT AUTO_INCREMENT PRIMARY KEY,
  item_id INT NOT NULL,
  location_id INT NOT NULL,
  quantity_on_hand DECIMAL(10,2) NOT NULL DEFAULT 0.00,
  serial_number VARCHAR(20) DEFAULT NULL,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  FOREIGN KEY (item_id) REFERENCES inventory_item(item_id),
  FOREIGN KEY (location_id) REFERENCES inventory_location(location_id),
  valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to   TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Inventory Stock
CREATE INDEX idx_inventory_stock_item_id ON inventory_stock (item_id);
CREATE INDEX idx_inventory_stock_serial_number ON inventory_stock (serial_number);

-- Inventory Transaction Table
CREATE TABLE inventory_transaction (
  transaction_id INT AUTO_INCREMENT PRIMARY KEY,
  journal_entry_id INT DEFAULT NULL,
  item_id INT NOT NULL,
  from_location_id INT DEFAULT NULL,
  to_location_id INT DEFAULT NULL,
  quantity DECIMAL(10,2) NOT NULL,
  transaction_timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  transaction_type_id INT NOT NULL,
  initiated_by INT NOT NULL,
  notes TEXT DEFAULT NULL,
  is_deleted TINYINT(1) NOT NULL DEFAULT 0,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  valid_from  TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to    TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to),
  FOREIGN KEY (item_id) REFERENCES inventory_item(item_id),
  FOREIGN KEY (from_location_id) REFERENCES inventory_location(location_id),
  FOREIGN KEY (to_location_id) REFERENCES inventory_location(location_id),
  FOREIGN KEY (initiated_by) REFERENCES user_account(user_id),
  FOREIGN KEY (transaction_type_id) REFERENCES transaction_type(transaction_type_id)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Inventory Transaction
CREATE INDEX idx_inventory_transaction_item_id ON inventory_transaction (item_id);
CREATE INDEX idx_inventory_transaction_transaction_type_id ON inventory_transaction (transaction_type_id);
CREATE INDEX idx_inventory_transaction_transaction_timestamp ON inventory_transaction (transaction_timestamp);

-- Supplier Table
CREATE TABLE supplier (
  supplier_id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(200) NOT NULL,
  contact_info TEXT DEFAULT NULL,
  is_deleted TINYINT(1) NOT NULL DEFAULT 0,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Supplier
CREATE INDEX idx_supplier_name ON supplier (name);

-- Supplier Item Mapping
CREATE TABLE supplier_item (
  supplier_item_id INT AUTO_INCREMENT PRIMARY KEY,
  supplier_id INT NOT NULL,
  inventory_item_id INT NOT NULL,
  confirmed_price DECIMAL(10,2) NOT NULL,
  last_confirmed_date DATE NOT NULL,
  lead_time_days INT DEFAULT NULL,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  FOREIGN KEY (supplier_id) REFERENCES supplier(supplier_id),
  FOREIGN KEY (inventory_item_id) REFERENCES inventory_item(item_id),
  valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Supplier Item
CREATE INDEX idx_supplier_item_supplier_id ON supplier_item (supplier_id);
CREATE INDEX idx_supplier_item_inventory_item_id ON supplier_item (inventory_item_id);

-- Reorder Table
CREATE TABLE reorder (
  request_id INT AUTO_INCREMENT PRIMARY KEY,
  inventory_item_id INT NOT NULL,
  supplier_id INT NOT NULL,
  requested_quantity DECIMAL(10,2) NOT NULL,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to),
  FOREIGN KEY (inventory_item_id) REFERENCES inventory_item(item_id),
  FOREIGN KEY (supplier_id) REFERENCES supplier(supplier_id)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Reorder
CREATE INDEX idx_reorder_inventory_item_id ON reorder (inventory_item_id);
CREATE INDEX idx_reorder_supplier_id ON reorder (supplier_id);

-- Purchase Order Table
CREATE TABLE purchase_order (
  purchase_order_id INT AUTO_INCREMENT PRIMARY KEY,
  supplier_id INT NOT NULL,
  order_timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  expected_delivery_date TIMESTAMP DEFAULT NULL,
  is_deleted TINYINT(1) NOT NULL DEFAULT 0,
  current_state VARCHAR(50) NOT NULL DEFAULT 'DRAFT',
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  valid_from  TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to    TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to),
  FOREIGN KEY (supplier_id) REFERENCES supplier(supplier_id)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Purchase Order
CREATE INDEX idx_purchase_order_supplier_id ON purchase_order (supplier_id);
CREATE INDEX idx_purchase_order_current_state ON purchase_order (current_state);

-- Purchase Order Line Table
CREATE TABLE purchase_order_line (
  line_id INT AUTO_INCREMENT PRIMARY KEY,
  purchase_order_id INT NOT NULL,
  item_id INT NOT NULL,
  quantity DECIMAL(10,2) NOT NULL,
  unit_price DECIMAL(10,2) NOT NULL,
  received_quantity DECIMAL(10,2) NOT NULL DEFAULT 0,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  FOREIGN KEY (purchase_order_id) REFERENCES purchase_order(purchase_order_id),
  FOREIGN KEY (item_id) REFERENCES inventory_item(item_id),
  valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to   TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Purchase Order Line
CREATE INDEX idx_purchase_order_line_purchase_order_id ON purchase_order_line (purchase_order_id);
CREATE INDEX idx_purchase_order_line_item_id ON purchase_order_line (item_id);

-- Return Transaction Table
CREATE TABLE return_transaction (
  return_id INT AUTO_INCREMENT PRIMARY KEY,
  item_id INT NOT NULL,
  quantity DECIMAL(10,2) NOT NULL,
  return_reason TEXT DEFAULT NULL,
  return_timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  initiated_by INT NOT NULL,
  is_deleted TINYINT(1) NOT NULL DEFAULT 0,
  current_state VARCHAR(50) NOT NULL DEFAULT 'INITIATED',
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  valid_from  TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to    TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to),
  FOREIGN KEY (item_id) REFERENCES inventory_item(item_id),
  FOREIGN KEY (initiated_by) REFERENCES user_account(user_id)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Return Transaction
CREATE INDEX idx_return_transaction_item_id ON return_transaction (item_id);
CREATE INDEX idx_return_transaction_initiated_by ON return_transaction (initiated_by);
CREATE INDEX idx_return_transaction_current_state ON return_transaction (current_state);

-- Account Table
CREATE TABLE account (
  account_id INT AUTO_INCREMENT PRIMARY KEY,
  entity_id INT NOT NULL,
  account_code VARCHAR(20) NOT NULL UNIQUE,
  name VARCHAR(100) NOT NULL,
  account_type_id INT NOT NULL,
  parent_account_id INT DEFAULT NULL,
  is_active TINYINT(1) NOT NULL DEFAULT 1,
  is_deleted TINYINT(1) NOT NULL DEFAULT 0,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (effective_from, effective_to),
  valid_from  TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to    TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (valid_from, valid_to),
  FOREIGN KEY (entity_id) REFERENCES entity(entity_id),
  FOREIGN KEY (account_type_id) REFERENCES account_type(account_type_id),
  FOREIGN KEY (parent_account_id) REFERENCES account(account_id)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Account
CREATE INDEX idx_account_account_code ON account (account_code);
CREATE INDEX idx_account_name ON account (name);
CREATE INDEX idx_account_account_type_id ON account (account_type_id);
CREATE INDEX idx_account_is_active ON account (is_active);

-- Journal Entry Table
CREATE TABLE journal_entry (
  journal_entry_id INT AUTO_INCREMENT PRIMARY KEY,
  entity_id INT NOT NULL,
  description VARCHAR(255) DEFAULT NULL,
  entry_timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  created_by INT NOT NULL,
  is_deleted TINYINT(1) NOT NULL DEFAULT 0,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period(effective_from, effective_to),
  valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to   TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME(valid_from, valid_to),
  FOREIGN KEY (entity_id) REFERENCES entity(entity_id),
  FOREIGN KEY (created_by) REFERENCES user_account(user_id)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Journal Entry
CREATE INDEX idx_journal_entry_entity_id ON journal_entry (entity_id);
CREATE INDEX idx_journal_entry_created_by ON journal_entry (created_by);
CREATE INDEX idx_journal_entry_entry_timestamp ON journal_entry (entry_timestamp);

-- Journal Entry Line Table
CREATE TABLE journal_entry_line (
  journal_entry_line_id INT AUTO_INCREMENT PRIMARY KEY,
  journal_entry_id INT NOT NULL,
  account_id INT NOT NULL,
  amount DECIMAL(10,2) NOT NULL,
  is_debit TINYINT(1) NOT NULL,
  description VARCHAR(255) DEFAULT NULL,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period(effective_from, effective_to),
  valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to   TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME(valid_from, valid_to),
  FOREIGN KEY (journal_entry_id) REFERENCES journal_entry(journal_entry_id),
  FOREIGN KEY (account_id) REFERENCES account(account_id)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Journal Entry Line
CREATE INDEX idx_journal_entry_line_journal_entry_id ON journal_entry_line (journal_entry_id);
CREATE INDEX idx_journal_entry_line_account_id ON journal_entry_line (account_id);

-- Journal Entry Mapping Table
CREATE TABLE journal_entry_mapping (
  mapping_id INT AUTO_INCREMENT PRIMARY KEY,
  entity_type VARCHAR(50) NOT NULL,
  entity_id INT NOT NULL,
  journal_entry_id INT NOT NULL,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period(effective_from, effective_to),
  FOREIGN KEY (journal_entry_id) REFERENCES journal_entry(journal_entry_id),
  valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to   TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME(valid_from, valid_to)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Journal Entry Mapping
CREATE INDEX idx_journal_entry_mapping_entity_type_entity_id ON journal_entry_mapping (entity_type, entity_id);
CREATE INDEX idx_journal_entry_mapping_journal_entry_id ON journal_entry_mapping (journal_entry_id);

-- Vehicle Table
CREATE TABLE vehicle (
  vehicle_id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(100) NOT NULL,
  purchase_date DATE NOT NULL,
  cost DECIMAL(10,2) NOT NULL,
  depreciation DECIMAL(10,2) DEFAULT NULL,
  is_deleted TINYINT(1) NOT NULL DEFAULT 0,
  current_state VARCHAR(50) NOT NULL DEFAULT 'ACTIVE',
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period(effective_from, effective_to),
  valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME(valid_from, valid_to)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Vehicle
CREATE INDEX idx_vehicle_name ON vehicle (name);
CREATE INDEX idx_vehicle_current_state ON vehicle (current_state);

-- Vehicle Maintenance Table
CREATE TABLE vehicle_maintenance (
  maintenance_id INT AUTO_INCREMENT PRIMARY KEY,
  vehicle_id INT NOT NULL,
  maintenance_timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  description TEXT DEFAULT NULL,
  cost DECIMAL(10,2) NOT NULL,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period(effective_from, effective_to),
  valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME(valid_from, valid_to),
  FOREIGN KEY (vehicle_id) REFERENCES vehicle(vehicle_id)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Vehicle Maintenance
CREATE INDEX idx_vehicle_maintenance_vehicle_id ON vehicle_maintenance (vehicle_id);
CREATE INDEX idx_vehicle_maintenance_maintenance_timestamp ON vehicle_maintenance (maintenance_timestamp);

-- Estimate Table
CREATE TABLE estimate (
  estimate_id INT AUTO_INCREMENT PRIMARY KEY,
  task_id INT DEFAULT NULL,
  details TEXT DEFAULT NULL,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  is_deleted TINYINT(1) NOT NULL DEFAULT 0,
  current_state VARCHAR(50) NOT NULL DEFAULT 'DRAFT',
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period(effective_from, effective_to),
  FOREIGN KEY (task_id) REFERENCES task(task_id),
  valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME(valid_from, valid_to)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Estimate
CREATE INDEX idx_estimate_task_id ON estimate (task_id);
CREATE INDEX idx_estimate_current_state ON estimate (current_state);

-- Proposal Table
CREATE TABLE proposal (
  proposal_id INT AUTO_INCREMENT PRIMARY KEY,
  estimate_id INT DEFAULT NULL,
  details TEXT DEFAULT NULL,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  is_deleted TINYINT(1) NOT NULL DEFAULT 0,
  current_state VARCHAR(50) NOT NULL DEFAULT 'DRAFT',
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period(effective_from, effective_to),
  FOREIGN KEY (estimate_id) REFERENCES estimate(estimate_id) ON DELETE SET NULL,
  valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME(valid_from, valid_to)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Proposal
CREATE INDEX idx_proposal_estimate_id ON proposal (estimate_id);
CREATE INDEX idx_proposal_current_state ON proposal (current_state);

-- Bid Table
CREATE TABLE bid (
  bid_id INT AUTO_INCREMENT PRIMARY KEY,
  proposal_id INT DEFAULT NULL,
  amount DECIMAL(10,2) NOT NULL,
  details TEXT DEFAULT NULL,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  is_deleted TINYINT(1) NOT NULL DEFAULT 0,
  current_state VARCHAR(50) NOT NULL DEFAULT 'PREPARED',
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period(effective_from, effective_to),
  FOREIGN KEY (proposal_id) REFERENCES proposal(proposal_id) ON DELETE SET NULL,
  valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME(valid_from, valid_to)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Bid
CREATE INDEX idx_bid_proposal_id ON bid (proposal_id);
CREATE INDEX idx_bid_current_state ON bid (current_state);

-- Contract Table
CREATE TABLE contract (
  contract_id INT AUTO_INCREMENT PRIMARY KEY,
  bid_id INT DEFAULT NULL,
  details TEXT DEFAULT NULL,
  effective_date DATE NOT NULL,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  is_deleted TINYINT(1) NOT NULL DEFAULT 0,
  current_state VARCHAR(50) NOT NULL DEFAULT 'DRAFT',
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period(effective_from, effective_to),
  FOREIGN KEY (bid_id) REFERENCES bid(bid_id) ON DELETE SET NULL,
  valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME(valid_from, valid_to)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Contract
CREATE INDEX idx_contract_bid_id ON contract (bid_id);
CREATE INDEX idx_contract_current_state ON contract (current_state);

-- Notification Table
CREATE TABLE notification (
  notification_id INT AUTO_INCREMENT PRIMARY KEY,
  recipient_user_id INT NOT NULL,
  message TEXT NOT NULL,
  notification_type VARCHAR(50) NOT NULL,
  is_read TINYINT(1) NOT NULL DEFAULT 0,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period(effective_from, effective_to),
  FOREIGN KEY (recipient_user_id) REFERENCES user_account(user_id),
  valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME(valid_from, valid_to)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Notification
CREATE INDEX idx_notification_recipient_user_id ON notification (recipient_user_id);
CREATE INDEX idx_notification_is_read ON notification (is_read);

-- Points Transaction Table
CREATE TABLE points_transaction (
  transaction_id INT AUTO_INCREMENT PRIMARY KEY,
  worker_id INT NOT NULL,
  points INT NOT NULL,
  description VARCHAR(255) DEFAULT NULL,
  timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period(effective_from, effective_to),
  FOREIGN KEY (worker_id) REFERENCES worker(worker_id),
  valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME(valid_from, valid_to)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Points Transaction
CREATE INDEX idx_points_transaction_worker_id ON points_transaction (worker_id);
CREATE INDEX idx_points_transaction_timestamp ON points_transaction (timestamp);

-- Client Log Entry Table
CREATE TABLE client_log_entry (
  log_id INT AUTO_INCREMENT PRIMARY KEY,
  user_id INT DEFAULT NULL,
  device_id VARCHAR(255) DEFAULT NULL,
  timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  log_level VARCHAR(50) NOT NULL,
  message TEXT NOT NULL,
  exception TEXT DEFAULT NULL,
  stack_trace TEXT DEFAULT NULL,
  app_version VARCHAR(50) DEFAULT NULL,
  os_version VARCHAR(50) DEFAULT NULL,
  device_model VARCHAR(100) DEFAULT NULL,
  additional_data JSON DEFAULT NULL,
  is_deleted TINYINT(1) NOT NULL DEFAULT 0,
  effective_from DATE NOT NULL DEFAULT '1970-01-01',
  effective_to DATE NOT NULL DEFAULT '9999-12-31',
  PERIOD FOR valid_period (`effective_from`, `effective_to`),
  valid_from  TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
  valid_to    TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (`valid_from`, `valid_to`),
  FOREIGN KEY (user_id) REFERENCES user_account(user_id)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
WITH SYSTEM VERSIONING;

-- Indexes for Client Log Entry
CREATE INDEX idx_client_log_entry_user_id ON client_log_entry (user_id);
CREATE INDEX idx_client_log_entry_device_id ON client_log_entry (device_id);
CREATE INDEX idx_client_log_entry_timestamp ON client_log_entry (timestamp);
CREATE INDEX idx_client_log_entry_log_level ON client_log_entry (log_level);

-- Final Notes
-- System-versioned tables store row-level history with explicit versioning columns.
-- Application-time periods added to enable business logic based on validity periods.
-- Soft deletes implemented with is_deleted columns.
-- Time zone awareness enabled by using TIMESTAMP data types.
-- Multi-entity support for future subsidiaries.

-- End of V1__Comprehensive_Schema.sql
Editor is loading...
Leave a Comment