CREATE TABLE lesson_package_types ( id VARCHAR(64) PRIMARY KEY DEFAULT uuid_generate_v4(), name VARCHAR NOT NULL, description VARCHAR NOT NULL, package_type VARCHAR(64) NOT NULL, price NUMERIC(8,2), created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE lesson_package_purchases ( id VARCHAR(64) PRIMARY KEY DEFAULT uuid_generate_v4(), lesson_package_type_id VARCHAR(64) REFERENCES lesson_package_types(id) NOT NULL, user_id VARCHAR(64) REFERENCES users(id) NOT NULL, teacher_id VARCHAR(64) REFERENCES teachers(id), price NUMERIC(8,2), created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE lesson_bookings ( id VARCHAR(64) PRIMARY KEY DEFAULT uuid_generate_v4(), user_id VARCHAR(64) REFERENCES users(id) NOT NULL, lesson_type VARCHAR(64) NOT NULL, recurring BOOLEAN NOT NULL, lesson_length INTEGER NOT NULL, payment_style VARCHAR(64) NOT NULL, description VARCHAR, teacher_id VARCHAR(64) REFERENCES users(id) NOT NULL, card_presumed_ok BOOLEAN NOT NULL DEFAULT FALSE, sent_notices BOOLEAN NOT NULL DEFAULT FALSE, status VARCHAR, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE lesson_sessions ( id VARCHAR(64) PRIMARY KEY DEFAULT uuid_generate_v4(), music_session_id VARCHAR(64) REFERENCES music_sessions(id) NOT NULL, lesson_type VARCHAR(64) NOT NULL, teacher_id VARCHAR(64) REFERENCES users(id) NOT NULL, lesson_package_purchase_id VARCHAR(64) REFERENCES lesson_package_purchases(id), lesson_booking_id VARCHAR(64) REFERENCES lesson_bookings(id), duration INTEGER NOT NULL, price NUMERIC(8,2) NOT NULL, teacher_complete BOOLEAN DEFAULT FALSE NOT NULL, student_complete BOOLEAN DEFAULT FALSE NOT NULL, student_canceled BOOLEAN DEFAULT FALSE NOT NULL, teacher_canceled BOOLEAN DEFAULT FALSE NOT NULL, student_canceled_at TIMESTAMP, teacher_canceled_at TIMESTAMP, student_canceled_reason VARCHAR, teacher_canceled_reason VARCHAR, status VARCHAR, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ); ALTER TABLE notifications ADD COLUMN lesson_session_id VARCHAR(64) REFERENCES lesson_sessions(id); INSERT INTO lesson_package_types (id, name, description, package_type, price) VALUES ('single', 'Single Lesson', 'A single lesson purchased at the teacher''s price.', 'single', 0.00); INSERT INTO lesson_package_types (id, name, description, package_type, price) VALUES ('single-free', 'Free Lesson', 'A free, single lesson.', 'single-free', 0.00); INSERT INTO lesson_package_types (id, name, description, package_type, price) VALUES ('test-drive', 'Test Drive', 'Four reduced-price lessons which you can use to find that ideal teacher.', 'test-drive', 49.99); CREATE TABLE lesson_booking_slots ( id VARCHAR(64) PRIMARY KEY DEFAULT uuid_generate_v4(), lesson_booking_id VARCHAR(64) REFERENCES lesson_bookings(id) NOT NULL, slot_type VARCHAR(64) NOT NULL, preferred_day DATE, day_of_week INTEGER, hour INTEGER, minute INTEGER, timezone VARCHAR NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ); ALTER TABLE lesson_bookings ADD COLUMN default_slot VARCHAR(64) REFERENCES lesson_booking_slots(id); ALTER TABLE lesson_sessions ADD COLUMN slot VARCHAR(64) REFERENCES lesson_booking_slots(id); ALTER TABLE chat_messages ADD COLUMN target_user_id VARCHAR(64) REFERENCES users(id); ALTER TABLE chat_messages ADD COLUMN lesson_booking_id VARCHAR(64) REFERENCES lesson_bookings(id); ALTER TABLE users ADD COLUMN remaining_free_lessons INTEGER NOT NULL DEFAULT 1; ALTER TABLE users ADD COLUMN stored_credit_card BOOLEAN NOT NULL DEFAULT FALSE; ALTER TABLE users ADD COLUMN remaining_test_drives INTEGER NOT NULL DEFAULT 0; ALTER TABLE users ADD COLUMN stripe_token VARCHAR(200); ALTER TABLE users ADD COLUMN stripe_customer_id VARCHAR(200); ALTER TABLE users ADD COLUMN stripe_zip_code VARCHAR(200); ALTER TABLE sales ADD COLUMN stripe_charge_id VARCHAR(200);