-- ==============================================================================
-- SALONZB - DİKEY SAAS, GÖMÜLÜ FİNANS VE ERP SALON İŞLETİM SİSTEMİ
-- ÜRETİM SEVİYESİ MYSQL 8.0+ VERİTABANI ŞEMASI (SIFIR DEMO VERİ - DOĞRUDAN CANLI)
-- ==============================================================================

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ------------------------------------------------------------------------------
-- 1. SAAS KİRACI (TENANT) VE ŞUBE YÖNETİMİ
-- ------------------------------------------------------------------------------

CREATE TABLE IF NOT EXISTS tenants (
    id VARCHAR(36) PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    tax_title VARCHAR(255),
    tax_office VARCHAR(100),
    tax_number VARCHAR(20),
    subdomain VARCHAR(100) UNIQUE NOT NULL,
    plan_tier ENUM('SOLO', 'PRO', 'ENTERPRISE') NOT NULL DEFAULT 'PRO',
    fintech_enabled BOOLEAN NOT NULL DEFAULT TRUE,
    fintech_commission_rate DECIMAL(5, 4) NOT NULL DEFAULT 0.0085, -- %0.85 mikro platform payı
    ai_receptionist_enabled BOOLEAN NOT NULL DEFAULT TRUE,
    is_active BOOLEAN NOT NULL DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS branches (
    id VARCHAR(36) PRIMARY KEY,
    tenant_id VARCHAR(36) NOT NULL,
    name VARCHAR(255) NOT NULL,
    city VARCHAR(100) NOT NULL,
    district VARCHAR(100) NOT NULL,
    address TEXT,
    phone VARCHAR(30),
    is_main_branch BOOLEAN NOT NULL DEFAULT FALSE,
    working_hours_json JSON,
    is_active BOOLEAN NOT NULL DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
    INDEX idx_branches_tenant (tenant_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ------------------------------------------------------------------------------
-- 2. KULLANICI ROLLERİ VE YETKİLENDİRME (RBAC)
-- ------------------------------------------------------------------------------

CREATE TABLE IF NOT EXISTS users (
    id VARCHAR(36) PRIMARY KEY,
    tenant_id VARCHAR(36) NULL, -- SUPER_ADMIN için NULL olabilir
    branch_id VARCHAR(36) NULL,
    full_name VARCHAR(150) NOT NULL,
    email VARCHAR(150) NOT NULL,
    password_hash VARCHAR(255) NOT NULL,
    role ENUM('SUPER_ADMIN', 'OWNER', 'BRANCH_MANAGER', 'STYLIST', 'ASSISTANT', 'CASHIER') NOT NULL DEFAULT 'OWNER',
    phone VARCHAR(30),
    is_active BOOLEAN NOT NULL DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
    FOREIGN KEY (branch_id) REFERENCES branches(id) ON DELETE SET NULL,
    UNIQUE KEY uq_user_email (email),
    INDEX idx_users_tenant (tenant_id),
    INDEX idx_users_role (role)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS staff_profiles (
    id VARCHAR(36) PRIMARY KEY,
    user_id VARCHAR(36) NOT NULL UNIQUE,
    tenant_id VARCHAR(36) NOT NULL,
    branch_id VARCHAR(36) NOT NULL,
    title VARCHAR(100) NOT NULL,
    color_hex VARCHAR(10) DEFAULT '#4F46E5',
    base_salary DECIMAL(10, 2) DEFAULT 0.00,
    service_commission_rate DECIMAL(5, 2) DEFAULT 30.00,
    product_commission_rate DECIMAL(5, 2) DEFAULT 10.00,
    weekly_off_day VARCHAR(20) DEFAULT 'Sunday',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
    FOREIGN KEY (branch_id) REFERENCES branches(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ------------------------------------------------------------------------------
-- 3. 3D KAYNAK YÖNETİMİ: KABİNLER VE CİHAZLAR
-- ------------------------------------------------------------------------------

CREATE TABLE IF NOT EXISTS rooms (
    id VARCHAR(36) PRIMARY KEY,
    tenant_id VARCHAR(36) NOT NULL,
    branch_id VARCHAR(36) NOT NULL,
    name VARCHAR(100) NOT NULL,
    capacity INT NOT NULL DEFAULT 1,
    is_active BOOLEAN NOT NULL DEFAULT TRUE,
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
    FOREIGN KEY (branch_id) REFERENCES branches(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS devices (
    id VARCHAR(36) PRIMARY KEY,
    tenant_id VARCHAR(36) NOT NULL,
    branch_id VARCHAR(36) NOT NULL,
    name VARCHAR(150) NOT NULL,
    serial_number VARCHAR(100),
    total_shots_fired INT NOT NULL DEFAULT 0,
    max_recommended_shots INT DEFAULT 5000000,
    last_maintenance_date DATE NULL,
    next_maintenance_date DATE NULL,
    is_active BOOLEAN NOT NULL DEFAULT TRUE,
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
    FOREIGN KEY (branch_id) REFERENCES branches(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ------------------------------------------------------------------------------
-- 4. HİZMETLER VE BOM REÇETELERİ (KABİN SARFİYATI)
-- ------------------------------------------------------------------------------

CREATE TABLE IF NOT EXISTS services (
    id VARCHAR(36) PRIMARY KEY,
    tenant_id VARCHAR(36) NOT NULL,
    name VARCHAR(150) NOT NULL,
    category ENUM('HAIR', 'SKIN', 'LASER', 'NAIL', 'MASSAGE') NOT NULL DEFAULT 'HAIR',
    price DECIMAL(10, 2) NOT NULL,
    duration_minutes INT NOT NULL DEFAULT 45,
    split_app_minutes INT NOT NULL DEFAULT 35,
    split_wait_minutes INT NOT NULL DEFAULT 0,
    split_finish_minutes INT NOT NULL DEFAULT 0,
    requires_room BOOLEAN NOT NULL DEFAULT FALSE,
    requires_device BOOLEAN NOT NULL DEFAULT FALSE,
    required_device_type VARCHAR(100) NULL,
    deposit_required BOOLEAN NOT NULL DEFAULT FALSE,
    deposit_amount DECIMAL(10, 2) DEFAULT 0.00,
    is_active BOOLEAN NOT NULL DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS inventory_items (
    id VARCHAR(36) PRIMARY KEY,
    tenant_id VARCHAR(36) NOT NULL,
    branch_id VARCHAR(36) NOT NULL,
    barcode VARCHAR(100),
    name VARCHAR(200) NOT NULL,
    pool_type ENUM('RETAIL_ONLY', 'BACKBAR_ONLY', 'BOTH') NOT NULL DEFAULT 'BOTH',
    unit_type ENUM('PIECE', 'GRAM', 'MILLILITER') NOT NULL DEFAULT 'GRAM',
    retail_price DECIMAL(10, 2) DEFAULT 0.00,
    cost_price DECIMAL(10, 2) NOT NULL DEFAULT 0.00,
    current_stock DECIMAL(10, 2) NOT NULL DEFAULT 0.00,
    critical_threshold DECIMAL(10, 2) NOT NULL DEFAULT 100.00,
    monthly_consumption_avg DECIMAL(10, 2) DEFAULT 0.00,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
    FOREIGN KEY (branch_id) REFERENCES branches(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS service_recipes (
    id VARCHAR(36) PRIMARY KEY,
    service_id VARCHAR(36) NOT NULL,
    inventory_item_id VARCHAR(36) NOT NULL,
    default_quantity DECIMAL(8, 2) NOT NULL,
    unit_type ENUM('PIECE', 'GRAM', 'MILLILITER') NOT NULL,
    FOREIGN KEY (service_id) REFERENCES services(id) ON DELETE CASCADE,
    FOREIGN KEY (inventory_item_id) REFERENCES inventory_items(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ------------------------------------------------------------------------------
-- 5. CRM, FORMÜLLER VE DİJİTAL ONAM
-- ------------------------------------------------------------------------------

CREATE TABLE IF NOT EXISTS customers (
    id VARCHAR(36) PRIMARY KEY,
    tenant_id VARCHAR(36) NOT NULL,
    full_name VARCHAR(150) NOT NULL,
    phone_clean VARCHAR(20) NOT NULL,
    phone_masked VARCHAR(20) NOT NULL,
    email VARCHAR(150),
    gender ENUM('FEMALE', 'MALE', 'OTHER'),
    birth_date DATE,
    rfm_segment ENUM('VIP', 'LOYAL', 'AT_RISK', 'NEW', 'LOST') DEFAULT 'NEW',
    no_show_count INT NOT NULL DEFAULT 0,
    wallet_points DECIMAL(10, 2) DEFAULT 0.00,
    kvkk_approved BOOLEAN NOT NULL DEFAULT FALSE,
    iys_marketing_approved BOOLEAN NOT NULL DEFAULT FALSE,
    iys_approval_date TIMESTAMP NULL,
    notes TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
    INDEX idx_cust_phone (tenant_id, phone_clean)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS hair_color_formulas (
    id VARCHAR(36) PRIMARY KEY,
    customer_id VARCHAR(36) NOT NULL,
    staff_id VARCHAR(36) NOT NULL,
    dye_brand VARCHAR(100) NOT NULL,
    color_code VARCHAR(100) NOT NULL,
    formula_grams DECIMAL(6, 2) NOT NULL,
    oxidant_volume VARCHAR(20) NOT NULL,
    bleaching_wait_minutes INT DEFAULT 0,
    application_date DATE NOT NULL,
    notes TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS clinical_dossiers (
    id VARCHAR(36) PRIMARY KEY,
    customer_id VARCHAR(36) NOT NULL,
    staff_id VARCHAR(36) NOT NULL,
    fitzpatrick_type ENUM('TYPE_I', 'TYPE_II', 'TYPE_III', 'TYPE_IV', 'TYPE_V', 'TYPE_VI') NOT NULL,
    device_id VARCHAR(36),
    energy_joules DECIMAL(6, 2),
    shot_count INT,
    treatment_area VARCHAR(150),
    treatment_date DATE NOT NULL,
    notes TEXT,
    FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE CASCADE,
    FOREIGN KEY (device_id) REFERENCES devices(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS consent_documents (
    id VARCHAR(36) PRIMARY KEY,
    tenant_id VARCHAR(36) NOT NULL,
    customer_id VARCHAR(36) NOT NULL,
    document_type ENUM('KVKK_AYDINLATMA', 'LAZER_ONAM', 'INVASIV_ISLEM_ONAM', 'PAKET_SOZLESME') NOT NULL,
    signature_base64 LONGTEXT,
    otp_code VARCHAR(10),
    otp_verified_at TIMESTAMP NULL,
    ip_address VARCHAR(50),
    pdf_sealed_hash VARCHAR(128),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
    FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ------------------------------------------------------------------------------
-- 6. AKILLI RANDEVULAR VE 3D KAYNAK TAHSİSİ
-- ------------------------------------------------------------------------------

CREATE TABLE IF NOT EXISTS appointments (
    id VARCHAR(36) PRIMARY KEY,
    tenant_id VARCHAR(36) NOT NULL,
    branch_id VARCHAR(36) NOT NULL,
    customer_id VARCHAR(36) NOT NULL,
    service_id VARCHAR(36) NOT NULL,
    primary_staff_id VARCHAR(36) NOT NULL,
    assistant_staff_id VARCHAR(36) NULL,
    room_id VARCHAR(36) NULL,
    device_id VARCHAR(36) NULL,
    start_time DATETIME NOT NULL,
    end_time DATETIME NOT NULL,
    total_amount DECIMAL(10, 2) NOT NULL,
    deposit_amount DECIMAL(10, 2) NOT NULL DEFAULT 0.00,
    deposit_status ENUM('NOT_REQUIRED', 'PENDING', 'PAID', 'REFUNDED') NOT NULL DEFAULT 'NOT_REQUIRED',
    status ENUM('CONFIRMED', 'ARRIVED', 'IN_SERVICE', 'COMPLETED', 'CANCELLED', 'NO_SHOW') NOT NULL DEFAULT 'CONFIRMED',
    booking_channel ENUM('ONLINE_WIDGET', 'WHATSAPP_AI', 'PHONE_MANUAL', 'GOOGLE_RESERVE', 'WALK_IN') NOT NULL DEFAULT 'ONLINE_WIDGET',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
    FOREIGN KEY (branch_id) REFERENCES branches(id) ON DELETE CASCADE,
    FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE CASCADE,
    FOREIGN KEY (service_id) REFERENCES services(id) ON DELETE RESTRICT,
    INDEX idx_appt_time (tenant_id, start_time, end_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS appointment_resource_allocations (
    id VARCHAR(36) PRIMARY KEY,
    tenant_id VARCHAR(36) NOT NULL,
    appointment_id VARCHAR(36) NOT NULL,
    resource_type ENUM('STAFF', 'ROOM', 'DEVICE') NOT NULL,
    resource_id VARCHAR(36) NOT NULL,
    phase_type ENUM('APPLICATION', 'PROCESSING_WAIT', 'FINISHING') NOT NULL DEFAULT 'APPLICATION',
    start_time DATETIME NOT NULL,
    end_time DATETIME NOT NULL,
    is_active BOOLEAN NOT NULL DEFAULT TRUE,
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
    FOREIGN KEY (appointment_id) REFERENCES appointments(id) ON DELETE CASCADE,
    INDEX idx_resource_check (tenant_id, resource_id, start_time, end_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ------------------------------------------------------------------------------
-- 7. PAKET, SEANS VE ORANTI KİLİDİ
-- ------------------------------------------------------------------------------

CREATE TABLE IF NOT EXISTS packages (
    id VARCHAR(36) PRIMARY KEY,
    tenant_id VARCHAR(36) NOT NULL,
    title VARCHAR(200) NOT NULL,
    total_price DECIMAL(10, 2) NOT NULL,
    allowed_installments INT NOT NULL DEFAULT 4,
    validity_days INT NOT NULL DEFAULT 365,
    is_active BOOLEAN NOT NULL DEFAULT TRUE,
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS customer_packages (
    id VARCHAR(36) PRIMARY KEY,
    tenant_id VARCHAR(36) NOT NULL,
    customer_id VARCHAR(36) NOT NULL,
    package_id VARCHAR(36) NOT NULL,
    contract_number VARCHAR(50) UNIQUE NOT NULL,
    total_price DECIMAL(10, 2) NOT NULL,
    total_paid DECIMAL(10, 2) NOT NULL DEFAULT 0.00,
    total_sessions INT NOT NULL,
    completed_sessions INT NOT NULL DEFAULT 0,
    is_payment_ratio_locked BOOLEAN NOT NULL DEFAULT FALSE,
    deferred_revenue_balance DECIMAL(10, 2) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
    FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE CASCADE,
    FOREIGN KEY (package_id) REFERENCES packages(id) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ------------------------------------------------------------------------------
-- 8. ERP MODÜLLERİ (KASA, GİDER, TEDARİK, İK & BORDRO, DEMİRBAŞ)
-- ------------------------------------------------------------------------------

-- ERP 8.1: Kasa Gün Sonu ve Z-Raporu Mutabakatı
CREATE TABLE IF NOT EXISTS cash_registers (
    id VARCHAR(36) PRIMARY KEY,
    tenant_id VARCHAR(36) NOT NULL,
    branch_id VARCHAR(36) NOT NULL,
    opened_by_user_id VARCHAR(36) NOT NULL,
    closed_by_user_id VARCHAR(36) NULL,
    opening_cash DECIMAL(10, 2) NOT NULL DEFAULT 0.00,
    total_cash_in DECIMAL(10, 2) NOT NULL DEFAULT 0.00,
    total_pos_in DECIMAL(10, 2) NOT NULL DEFAULT 0.00,
    total_deposit_in DECIMAL(10, 2) NOT NULL DEFAULT 0.00,
    total_expense_out DECIMAL(10, 2) NOT NULL DEFAULT 0.00,
    expected_closing_cash DECIMAL(10, 2) NOT NULL DEFAULT 0.00,
    actual_closing_cash DECIMAL(10, 2) NULL,
    cash_difference DECIMAL(10, 2) NULL,
    z_report_number VARCHAR(50) NULL,
    status ENUM('OPEN', 'CLOSED') NOT NULL DEFAULT 'OPEN',
    opened_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    closed_at TIMESTAMP NULL,
    notes TEXT,
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
    FOREIGN KEY (branch_id) REFERENCES branches(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ERP 8.2: Masraf ve Gider Kalemleri
CREATE TABLE IF NOT EXISTS expenses (
    id VARCHAR(36) PRIMARY KEY,
    tenant_id VARCHAR(36) NOT NULL,
    branch_id VARCHAR(36) NOT NULL,
    user_id VARCHAR(36) NOT NULL,
    category ENUM('RENT', 'UTILITIES', 'SUPPLIES', 'STAFF_ADVANCE', 'TAX_LEGAL', 'MARKETING', 'MAINTENANCE', 'OTHER') NOT NULL,
    title VARCHAR(200) NOT NULL,
    amount DECIMAL(10, 2) NOT NULL,
    payment_method ENUM('CASH', 'BANK_TRANSFER', 'COMPANY_CARD') NOT NULL,
    document_no VARCHAR(100),
    expense_date DATE NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
    FOREIGN KEY (branch_id) REFERENCES branches(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ERP 8.3: Tedarikçi ve Satın Alma Yönetimi (Procurement)
CREATE TABLE IF NOT EXISTS suppliers (
    id VARCHAR(36) PRIMARY KEY,
    tenant_id VARCHAR(36) NOT NULL,
    company_name VARCHAR(200) NOT NULL,
    contact_name VARCHAR(150),
    phone VARCHAR(30),
    email VARCHAR(150),
    tax_office VARCHAR(100),
    tax_number VARCHAR(20),
    current_balance DECIMAL(10, 2) NOT NULL DEFAULT 0.00, -- Borç/Alacak
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS purchase_invoices (
    id VARCHAR(36) PRIMARY KEY,
    tenant_id VARCHAR(36) NOT NULL,
    branch_id VARCHAR(36) NOT NULL,
    supplier_id VARCHAR(36) NOT NULL,
    invoice_number VARCHAR(100) NOT NULL,
    invoice_date DATE NOT NULL,
    total_amount DECIMAL(10, 2) NOT NULL,
    tax_amount DECIMAL(10, 2) NOT NULL,
    is_received BOOLEAN NOT NULL DEFAULT FALSE,
    received_at TIMESTAMP NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
    FOREIGN KEY (supplier_id) REFERENCES suppliers(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ERP 8.4: İK, Puantaj ve Net Prim Bordrosu
CREATE TABLE IF NOT EXISTS payroll_records (
    id VARCHAR(36) PRIMARY KEY,
    tenant_id VARCHAR(36) NOT NULL,
    user_id VARCHAR(36) NOT NULL,
    period_year_month VARCHAR(7) NOT NULL, -- Örn: '2026-10'
    base_salary DECIMAL(10, 2) NOT NULL,
    service_commission_total DECIMAL(10, 2) NOT NULL DEFAULT 0.00,
    product_commission_total DECIMAL(10, 2) NOT NULL DEFAULT 0.00,
    advance_deductions DECIMAL(10, 2) NOT NULL DEFAULT 0.00,
    net_payable_salary DECIMAL(10, 2) NOT NULL,
    status ENUM('CALCULATED', 'APPROVED', 'PAID') NOT NULL DEFAULT 'CALCULATED',
    paid_at TIMESTAMP NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ERP 8.5: Şubeler Arası Stok Transferi
CREATE TABLE IF NOT EXISTS branch_transfers (
    id VARCHAR(36) PRIMARY KEY,
    tenant_id VARCHAR(36) NOT NULL,
    from_branch_id VARCHAR(36) NOT NULL,
    to_branch_id VARCHAR(36) NOT NULL,
    inventory_item_id VARCHAR(36) NOT NULL,
    quantity DECIMAL(10, 2) NOT NULL,
    unit_type ENUM('PIECE', 'GRAM', 'MILLILITER') NOT NULL,
    status ENUM('PENDING', 'IN_TRANSIT', 'RECEIVED', 'REJECTED') NOT NULL DEFAULT 'PENDING',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    received_at TIMESTAMP NULL,
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ------------------------------------------------------------------------------
-- 9. GÖMÜLÜ FİNTECH VE ÖKC POS (IYZICO / BEKO GMP3)
-- ------------------------------------------------------------------------------

CREATE TABLE IF NOT EXISTS sub_merchant_accounts (
    id VARCHAR(36) PRIMARY KEY,
    tenant_id VARCHAR(36) NOT NULL UNIQUE,
    provider ENUM('IYZICO', 'PAYTR') NOT NULL DEFAULT 'IYZICO',
    sub_merchant_key VARCHAR(100) NOT NULL,
    tax_number VARCHAR(20) NOT NULL,
    iban VARCHAR(40) NOT NULL,
    status ENUM('PENDING_APPROVAL', 'ACTIVE', 'SUSPENDED') NOT NULL DEFAULT 'ACTIVE',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS transactions (
    id VARCHAR(36) PRIMARY KEY,
    tenant_id VARCHAR(36) NOT NULL,
    branch_id VARCHAR(36) NOT NULL,
    appointment_id VARCHAR(36) NULL,
    customer_id VARCHAR(36) NOT NULL,
    type ENUM('ONLINE_DEPOSIT', 'PAY_BY_LINK', 'POS_TERMINAL', 'CASH') NOT NULL,
    total_amount DECIMAL(10, 2) NOT NULL,
    provider_fee DECIMAL(10, 2) NOT NULL,
    platform_micro_fee DECIMAL(10, 2) NOT NULL,
    salon_net_payout DECIMAL(10, 2) NOT NULL,
    status ENUM('BLOCKED', 'SETTLED', 'REFUNDED') NOT NULL DEFAULT 'BLOCKED',
    reference_id VARCHAR(150),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS fiscal_pos_receipts (
    id VARCHAR(36) PRIMARY KEY,
    tenant_id VARCHAR(36) NOT NULL,
    branch_id VARCHAR(36) NOT NULL,
    device_brand ENUM('BEKO_300TR', 'BEKO_400TR', 'PAVO', 'INGENICO') NOT NULL,
    protocol ENUM('GMP3', 'TOKENX_TSM', 'TCP_IP') NOT NULL DEFAULT 'TOKENX_TSM',
    total_amount DECIMAL(10, 2) NOT NULL,
    vat_8_amount DECIMAL(10, 2) DEFAULT 0.00,
    vat_20_amount DECIMAL(10, 2) DEFAULT 0.00,
    fiscal_receipt_no VARCHAR(50) NOT NULL,
    z_report_no VARCHAR(50) NOT NULL,
    e_archive_uuid VARCHAR(64) NULL,
    status ENUM('SUCCESS', 'FAILED') NOT NULL DEFAULT 'SUCCESS',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ------------------------------------------------------------------------------
-- 10. ÇAKIŞMA ÖNLEME STORED PROCEDURE (3D Kısıt Çözücü)
-- ------------------------------------------------------------------------------

DELIMITER //

DROP PROCEDURE IF EXISTS Check3DResourceCollision //

CREATE PROCEDURE Check3DResourceCollision(
    IN p_tenant_id VARCHAR(36),
    IN p_resource_id VARCHAR(36),
    IN p_start DATETIME,
    IN p_end DATETIME,
    OUT p_is_available BOOLEAN
)
BEGIN
    DECLARE v_count INT;
    
    SELECT COUNT(*) INTO v_count
    FROM appointment_resource_allocations
    WHERE tenant_id = p_tenant_id
      AND resource_id = p_resource_id
      AND is_active = TRUE
      AND NOT (end_time <= p_start OR start_time >= p_end);
      
    IF v_count = 0 THEN
        SET p_is_available = TRUE;
    ELSE
        SET p_is_available = FALSE;
    END IF;
END //

DELIMITER ;

-- ------------------------------------------------------------------------------
-- 11. SÜPER YÖNETİCİ MODÜL KATALOĞU VE VİTRİN FİYATLANDIRMA
-- ------------------------------------------------------------------------------

CREATE TABLE IF NOT EXISTS platform_modules (
    id VARCHAR(50) PRIMARY KEY,
    code VARCHAR(50) UNIQUE NOT NULL,
    name VARCHAR(255) NOT NULL,
    category VARCHAR(100) NOT NULL,
    description TEXT,
    price_monthly DECIMAL(10, 2) NOT NULL DEFAULT 0.00,
    price_yearly DECIMAL(10, 2) NOT NULL DEFAULT 0.00,
    is_showcase BOOLEAN NOT NULL DEFAULT TRUE,
    badge VARCHAR(50) DEFAULT 'POPÜLER',
    icon VARCHAR(50) DEFAULT 'layers',
    features_json JSON NULL,
    sort_order INT NOT NULL DEFAULT 0,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

SET FOREIGN_KEY_CHECKS = 1;
