-- ============================================================================ -- Carboany Harness System — ESG 이벤트 스키마 -- Migration: 005_events -- -- 설계 원칙: -- 1. 이벤트 = 스폰서 기업의 ESG 활동 프로젝트 (캠페인과 별도) -- 2. 참여자별 검증: event_verifications로 개별 인증 관리 -- 3. SaaS 수수료: 이벤트별 과금 기록 (saas_fee_paid) -- ============================================================================ -- ──────────────────────────────────────────────────────────────────────────── -- 1. ESG 이벤트 (Events) -- 기업 ESG 활동 프로젝트 — 나무 심기, 폐기물 수거 등 -- ──────────────────────────────────────────────────────────────────────────── CREATE TABLE events ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), org_id UUID NOT NULL REFERENCES organizations(id), title VARCHAR(300) NOT NULL, event_type VARCHAR(30) CHECK (event_type IN ( 'tree_planting', 'waste_collection', 'energy_saving', 'water_saving', 'recycling', 'carbon_offset', 'other' )), status VARCHAR(20) DEFAULT 'draft' NOT NULL CHECK (status IN ('draft', 'active', 'completed', 'cancelled')), -- 기간 start_date DATE NOT NULL, end_date DATE NOT NULL, CONSTRAINT chk_event_dates CHECK (end_date >= start_date), -- 참여 목표 target_participants INT DEFAULT 0, -- 환경 성과 지표 co2_reduction_kg DECIMAL(10, 2) DEFAULT 0, waste_collected_kg DECIMAL(10, 2), trees_planted INT, -- 보상/과금 eco_points BIGINT DEFAULT 0, -- 지급된 에코포인트 총량 saas_fee_paid BIGINT DEFAULT 0, -- SaaS 사용 수수료 (KRW) created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL, updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL ); CREATE INDEX idx_events_org ON events(org_id); CREATE INDEX idx_events_status ON events(status); CREATE INDEX idx_events_dates ON events(start_date, end_date); -- ──────────────────────────────────────────────────────────────────────────── -- 2. 이벤트 참여 인증 (Event Verifications) -- 이벤트 참여자 개별 활동 인증 기록 -- ──────────────────────────────────────────────────────────────────────────── CREATE TABLE event_verifications ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), event_id UUID NOT NULL REFERENCES events(id) ON DELETE CASCADE, user_id UUID NOT NULL REFERENCES users(id), -- 인증 데이터 type VARCHAR(20) CHECK (type IN ('photo', 'gps', 'receipt', 'manual')), payload_url VARCHAR(500), -- GCS 경로 value VARCHAR(300), -- 인증 값 (예: "5.2kg", "3그루") -- 상태 status VARCHAR(20) DEFAULT 'pending' NOT NULL CHECK (status IN ('pending', 'verified', 'rejected')), verified_at TIMESTAMPTZ, created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL ); CREATE INDEX idx_event_verify_event ON event_verifications(event_id); CREATE INDEX idx_event_verify_user ON event_verifications(user_id); CREATE INDEX idx_event_verify_status ON event_verifications(status) WHERE status = 'pending';