diff --git a/database/schema.sql b/database/schema.sql index c1a5231..13ec457 100644 --- a/database/schema.sql +++ b/database/schema.sql @@ -15,7 +15,13 @@ CREATE TABLE IF NOT EXISTS bots ( webhook_secret VARCHAR(64) NOT NULL UNIQUE, status ENUM('active','paused','error') NOT NULL DEFAULT 'paused', welcome_text TEXT DEFAULT NULL, + support_text TEXT DEFAULT NULL, pay_text TEXT DEFAULT NULL, + card_pay_enabled TINYINT(1) NOT NULL DEFAULT 1, + btc_pay_enabled TINYINT(1) NOT NULL DEFAULT 0, + balance_pay_enabled TINYINT(1) NOT NULL DEFAULT 1, + referral_enabled TINYINT(1) NOT NULL DEFAULT 1, + referral_percent DECIMAL(8,2) NOT NULL DEFAULT 5.00, min_add INT NOT NULL DEFAULT 1, max_add INT NOT NULL DEFAULT 19, order_ttl_minutes INT NOT NULL DEFAULT 30, @@ -30,12 +36,30 @@ CREATE TABLE IF NOT EXISTS bot_users ( username VARCHAR(190) DEFAULT NULL, first_name VARCHAR(190) DEFAULT NULL, last_name VARCHAR(190) DEFAULT NULL, + referrer_bot_user_id INT DEFAULT NULL, + balance DECIMAL(12,2) NOT NULL DEFAULT 0.00, state VARCHAR(80) DEFAULT NULL, state_data JSON DEFAULT NULL, last_seen_at TIMESTAMP NULL DEFAULT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uniq_bot_tg (bot_id, telegram_id), - KEY idx_bot_users_bot (bot_id) + KEY idx_bot_users_bot (bot_id), + KEY idx_bot_users_referrer (referrer_bot_user_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS balance_ledger ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + bot_id INT NOT NULL, + bot_user_id INT NOT NULL, + amount DECIMAL(12,2) NOT NULL, + direction ENUM('credit','debit') NOT NULL, + source ENUM('referral','topup','refund','order','manual') NOT NULL, + order_id INT DEFAULT NULL, + comment TEXT DEFAULT NULL, + created_by INT DEFAULT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + KEY idx_balance_user (bot_id, bot_user_id), + KEY idx_balance_order (order_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS shop_cities ( @@ -64,6 +88,8 @@ CREATE TABLE IF NOT EXISTS shop_products ( bot_id INT NOT NULL, name VARCHAR(190) NOT NULL, description TEXT DEFAULT NULL, + photo_file_id VARCHAR(255) DEFAULT NULL, + photo_path VARCHAR(255) DEFAULT NULL, sort_order INT NOT NULL DEFAULT 100, is_active TINYINT(1) NOT NULL DEFAULT 1, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, @@ -75,7 +101,7 @@ CREATE TABLE IF NOT EXISTS shop_product_variants ( bot_id INT NOT NULL, product_id INT NOT NULL, name VARCHAR(190) NOT NULL, - price INT NOT NULL, + price DECIMAL(12,2) NOT NULL, stock INT DEFAULT NULL, sort_order INT NOT NULL DEFAULT 100, is_active TINYINT(1) NOT NULL DEFAULT 1, @@ -83,18 +109,40 @@ CREATE TABLE IF NOT EXISTS shop_product_variants ( KEY idx_variants_bot_product (bot_id, product_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +CREATE TABLE IF NOT EXISTS shop_stock_items ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + bot_id INT NOT NULL, + product_id INT NOT NULL, + variant_id INT NOT NULL, + city_id INT DEFAULT NULL, + district_id INT DEFAULT NULL, + title VARCHAR(190) DEFAULT NULL, + delivery_text MEDIUMTEXT DEFAULT NULL, + photo_file_id VARCHAR(255) DEFAULT NULL, + file_id VARCHAR(255) DEFAULT NULL, + status ENUM('available','reserved','delivered','disabled') NOT NULL DEFAULT 'available', + reserved_order_id INT DEFAULT NULL, + delivered_order_id INT DEFAULT NULL, + reserved_at DATETIME DEFAULT NULL, + delivered_at DATETIME DEFAULT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + KEY idx_stock_lookup (bot_id, variant_id, city_id, district_id, status), + KEY idx_stock_orders (reserved_order_id, delivered_order_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + CREATE TABLE IF NOT EXISTS shop_payment_methods ( id INT AUTO_INCREMENT PRIMARY KEY, bot_id INT NOT NULL, title VARCHAR(190) NOT NULL, - type ENUM('card','sbp','bank') NOT NULL DEFAULT 'card', + type ENUM('card','sbp','bank','bitcoin') NOT NULL DEFAULT 'card', bank_name VARCHAR(190) DEFAULT NULL, card_number VARCHAR(80) DEFAULT NULL, recipient_name VARCHAR(190) DEFAULT NULL, sbp_phone VARCHAR(80) DEFAULT NULL, - min_amount INT DEFAULT NULL, - max_amount INT DEFAULT NULL, - daily_limit INT DEFAULT NULL, + btc_address VARCHAR(190) DEFAULT NULL, + min_amount DECIMAL(12,2) DEFAULT NULL, + max_amount DECIMAL(12,2) DEFAULT NULL, + daily_limit DECIMAL(12,2) DEFAULT NULL, is_online TINYINT(1) NOT NULL DEFAULT 1, is_active TINYINT(1) NOT NULL DEFAULT 1, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, @@ -110,17 +158,52 @@ CREATE TABLE IF NOT EXISTS shop_orders ( district_id INT NOT NULL, product_id INT NOT NULL, variant_id INT NOT NULL, + stock_item_id BIGINT DEFAULT NULL, payment_method_id INT DEFAULT NULL, - base_amount INT NOT NULL, - random_increment INT NOT NULL DEFAULT 0, - final_amount INT NOT NULL, - status ENUM('waiting_pay','paid','rejected','expired','cancelled') NOT NULL DEFAULT 'waiting_pay', + payment_type ENUM('balance','card','bitcoin') DEFAULT NULL, + base_amount DECIMAL(12,2) NOT NULL, + random_increment DECIMAL(12,2) NOT NULL DEFAULT 0.00, + final_amount DECIMAL(12,2) NOT NULL, + status ENUM('draft','waiting_payment','payment_review','paid','delivered','cancelled','refunded','expired','rejected') NOT NULL DEFAULT 'waiting_payment', expires_at DATETIME NOT NULL, paid_at DATETIME DEFAULT NULL, + delivered_at DATETIME DEFAULT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, KEY idx_orders_bot_status (bot_id, status), - KEY idx_orders_amount (bot_id, final_amount, status) + KEY idx_orders_amount (bot_id, final_amount, status), + KEY idx_orders_user (bot_id, bot_user_id), + KEY idx_orders_stock (stock_item_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS shop_payments ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + bot_id INT NOT NULL, + order_id INT NOT NULL, + bot_user_id INT NOT NULL, + method_id INT DEFAULT NULL, + type ENUM('balance','card','bitcoin') NOT NULL, + amount DECIMAL(12,2) NOT NULL, + status ENUM('created','review','confirmed','rejected','cancelled') NOT NULL DEFAULT 'created', + external_hash VARCHAR(255) DEFAULT NULL, + operator_comment TEXT DEFAULT NULL, + confirmed_by INT DEFAULT NULL, + confirmed_at DATETIME DEFAULT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + KEY idx_payments_order (order_id), + KEY idx_payments_status (bot_id, status) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS support_tickets ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + bot_id INT NOT NULL, + bot_user_id INT NOT NULL, + status ENUM('open','answered','closed') NOT NULL DEFAULT 'open', + subject VARCHAR(190) DEFAULT NULL, + last_message TEXT DEFAULT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + KEY idx_support_bot_status (bot_id, status) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS telegram_updates ( @@ -132,6 +215,19 @@ CREATE TABLE IF NOT EXISTS telegram_updates ( KEY idx_tg_updates_bot (bot_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +CREATE TABLE IF NOT EXISTS audit_logs ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + bot_id INT DEFAULT NULL, + user_id INT DEFAULT NULL, + bot_user_id INT DEFAULT NULL, + order_id INT DEFAULT NULL, + action VARCHAR(190) NOT NULL, + details TEXT DEFAULT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + KEY idx_audit_bot (bot_id), + KEY idx_audit_order (order_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + CREATE TABLE IF NOT EXISTS admin_logs ( id BIGINT AUTO_INCREMENT PRIMARY KEY, user_id INT DEFAULT NULL,