-- Copyright (C) 2026 Moko Consulting -- SPDX-License-Identifier: GPL-3.0-or-later -- Authored-by: Moko Consulting CREATE TABLE IF NOT EXISTS `#__mokosuitebooking_locations` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `name` VARCHAR(255) NOT NULL, `address` VARCHAR(500) NOT NULL DEFAULT '', `phone` VARCHAR(50) NOT NULL DEFAULT '', `email` VARCHAR(255) NOT NULL DEFAULT '', `timezone` VARCHAR(50) NOT NULL DEFAULT 'America/New_York', `operating_hours` JSON DEFAULT NULL, `published` TINYINT NOT NULL DEFAULT 1, `ordering` INT NOT NULL DEFAULT 0, `created` DATETIME NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS `#__mokosuitebooking_staff` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `contact_id` INT DEFAULT NULL, `name` VARCHAR(255) NOT NULL, `email` VARCHAR(255) NOT NULL DEFAULT '', `phone` VARCHAR(50) NOT NULL DEFAULT '', `title` VARCHAR(255) NOT NULL DEFAULT '', `bio` TEXT, `photo` VARCHAR(500) NOT NULL DEFAULT '', `color` VARCHAR(7) NOT NULL DEFAULT '#3788d8', `location_id` INT UNSIGNED DEFAULT NULL, `published` TINYINT NOT NULL DEFAULT 1, `ordering` INT NOT NULL DEFAULT 0, `created` DATETIME NOT NULL, PRIMARY KEY (`id`), KEY `idx_contact` (`contact_id`), KEY `idx_location` (`location_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS `#__mokosuitebooking_services` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `name` VARCHAR(255) NOT NULL, `description` TEXT, `category` VARCHAR(100) NOT NULL DEFAULT '', `duration_minutes` SMALLINT UNSIGNED NOT NULL DEFAULT 60, `buffer_before` SMALLINT UNSIGNED NOT NULL DEFAULT 0, `buffer_after` SMALLINT UNSIGNED NOT NULL DEFAULT 0, `price` DECIMAL(10,2) NOT NULL DEFAULT 0.00, `deposit_required` DECIMAL(10,2) NOT NULL DEFAULT 0.00, `max_participants` SMALLINT UNSIGNED NOT NULL DEFAULT 1, `color` VARCHAR(7) NOT NULL DEFAULT '#3788d8', `published` TINYINT NOT NULL DEFAULT 1, `ordering` INT NOT NULL DEFAULT 0, `created` DATETIME NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS `#__mokosuitebooking_schedules` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `staff_id` INT UNSIGNED NOT NULL, `day_of_week` TINYINT UNSIGNED NOT NULL, `start_time` TIME NOT NULL, `end_time` TIME NOT NULL, `location_id` INT UNSIGNED DEFAULT NULL, `effective_from` DATE DEFAULT NULL, `effective_to` DATE DEFAULT NULL, `published` TINYINT NOT NULL DEFAULT 1, PRIMARY KEY (`id`), KEY `idx_staff` (`staff_id`), KEY `idx_day` (`day_of_week`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS `#__mokosuitebooking_availability_overrides` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `staff_id` INT UNSIGNED NOT NULL, `override_date` DATE NOT NULL, `available` TINYINT NOT NULL DEFAULT 0, `start_time` TIME DEFAULT NULL, `end_time` TIME DEFAULT NULL, `reason` VARCHAR(255) NOT NULL DEFAULT '', `created` DATETIME NOT NULL, PRIMARY KEY (`id`), KEY `idx_staff` (`staff_id`), KEY `idx_date` (`override_date`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS `#__mokosuitebooking_bookings` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `booking_ref` VARCHAR(20) NOT NULL, `client_contact_id` INT DEFAULT NULL, `client_name` VARCHAR(255) NOT NULL, `client_email` VARCHAR(255) NOT NULL DEFAULT '', `client_phone` VARCHAR(50) NOT NULL DEFAULT '', `staff_id` INT UNSIGNED DEFAULT NULL, `location_id` INT UNSIGNED DEFAULT NULL, `status` ENUM('pending','confirmed','in_progress','completed','cancelled','no_show') NOT NULL DEFAULT 'pending', `booking_date` DATE NOT NULL, `start_time` TIME NOT NULL, `end_time` TIME NOT NULL, `total_price` DECIMAL(10,2) NOT NULL DEFAULT 0.00, `deposit_paid` DECIMAL(10,2) NOT NULL DEFAULT 0.00, `payment_status` ENUM('pending','partial','paid','refunded') NOT NULL DEFAULT 'pending', `source` ENUM('admin','online','phone','walkin') NOT NULL DEFAULT 'admin', `notes` TEXT, `reminder_sent` TINYINT NOT NULL DEFAULT 0, `created` DATETIME NOT NULL, `created_by` INT NOT NULL DEFAULT 0, PRIMARY KEY (`id`), UNIQUE KEY `idx_ref` (`booking_ref`), KEY `idx_client` (`client_contact_id`), KEY `idx_staff` (`staff_id`), KEY `idx_status` (`status`), KEY `idx_date` (`booking_date`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS `#__mokosuitebooking_booking_services` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `booking_id` INT UNSIGNED NOT NULL, `service_id` INT UNSIGNED NOT NULL, `price` DECIMAL(10,2) NOT NULL DEFAULT 0.00, `duration_minutes` SMALLINT UNSIGNED NOT NULL DEFAULT 60, PRIMARY KEY (`id`), KEY `idx_booking` (`booking_id`), KEY `idx_service` (`service_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS `#__mokosuitebooking_waitlist` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `client_contact_id` INT DEFAULT NULL, `client_name` VARCHAR(255) NOT NULL, `client_email` VARCHAR(255) NOT NULL DEFAULT '', `service_id` INT UNSIGNED DEFAULT NULL, `staff_id` INT UNSIGNED DEFAULT NULL, `preferred_date` DATE DEFAULT NULL, `status` ENUM('waiting','notified','booked','expired','cancelled') NOT NULL DEFAULT 'waiting', `notes` TEXT, `created` DATETIME NOT NULL, PRIMARY KEY (`id`), KEY `idx_status` (`status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;