gohorsejobs/backend/migrations/019_create_job_payments_table.sql

76 lines
2.7 KiB
SQL

-- Migration: Create job_payments table
-- Description: Track payments for job postings
CREATE TABLE IF NOT EXISTS job_payments (
id UUID PRIMARY KEY DEFAULT uuid_generate_v7(),
job_id UUID NOT NULL,
user_id UUID,
-- Stripe
stripe_session_id VARCHAR(255),
stripe_payment_intent VARCHAR(255),
stripe_customer_id VARCHAR(255),
-- Amount
amount DECIMAL(12,2) NOT NULL,
currency VARCHAR(3) DEFAULT 'USD',
-- Status
status VARCHAR(20) DEFAULT 'pending' CHECK (status IN ('pending', 'completed', 'failed', 'refunded', 'expired')),
-- Billing Info
billing_type VARCHAR(20) CHECK (billing_type IN ('company', 'individual')),
billing_name VARCHAR(255),
billing_email VARCHAR(255),
billing_phone VARCHAR(50),
billing_address TEXT,
billing_city VARCHAR(100),
billing_state VARCHAR(100),
billing_zip VARCHAR(20),
billing_country VARCHAR(2) DEFAULT 'BR',
-- Job Posting Details
duration_days INT DEFAULT 30,
is_featured BOOLEAN DEFAULT false,
featured_price DECIMAL(12,2) DEFAULT 0,
-- Timestamps
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
paid_at TIMESTAMP,
expires_at TIMESTAMP,
-- Foreign key
FOREIGN KEY (job_id) REFERENCES jobs(id) ON DELETE CASCADE,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL
);
-- Indexes
CREATE INDEX idx_job_payments_job_id ON job_payments(job_id);
CREATE INDEX idx_job_payments_status ON job_payments(status);
CREATE INDEX idx_job_payments_stripe_session ON job_payments(stripe_session_id);
CREATE INDEX idx_job_payments_user ON job_payments(user_id);
-- Comments
COMMENT ON TABLE job_payments IS 'Payment records for job postings';
COMMENT ON COLUMN job_payments.duration_days IS 'How many days the job posting is active';
COMMENT ON COLUMN job_payments.is_featured IS 'Whether this is a featured/sponsored listing';
-- Add job_posting_price table for pricing configuration
CREATE TABLE IF NOT EXISTS job_posting_prices (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
description TEXT,
price DECIMAL(12,2) NOT NULL,
currency VARCHAR(3) DEFAULT 'USD',
duration_days INT DEFAULT 30,
is_featured BOOLEAN DEFAULT false,
stripe_price_id VARCHAR(255),
active BOOLEAN DEFAULT true,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Insert default pricing
INSERT INTO job_posting_prices (name, description, price, currency, duration_days, is_featured, active)
VALUES
('Standard Job Posting', 'Your job will be visible for 30 days', 32.61, 'USD', 30, false, true),
('Featured Job Posting', 'Your job will be featured and visible for 30 days', 47.61, 'USD', 30, true, true);