| -- ============================================================================ | |
| -- 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'; | |