CarboAny / database /migrations /005_events.sql
Esketch's picture
deploy: [P4] Strangler Pattern API Adapter Release (Orphan Clean Build v2)
daaf9d7
Raw
History Blame Contribute Delete
4.23 kB
-- ============================================================================
-- 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';