| -- ============================================================================ | |
| -- Carboany Harness System β 리ν¬νΈ, AI μμ΄μ νΈ, μ μ° μ€ν€λ§ | |
| -- Migration: 006_reports_agents_settlements | |
| -- | |
| -- μ€κ³ μμΉ: | |
| -- 1. 리ν¬νΈ λ€λͺ©μ : NGMS, ESG Impact, κ°μ¬, Scope 3 μΈμ¦μ | |
| -- 2. AI μμ΄μ νΈ νμ€ν¬ ν: λΉλκΈ° μμ κ΄λ¦¬ | |
| -- 3. μ μ°: μμ₯(001)κ³Ό λ³λλ‘ μ£ΌκΈ°λ³ μ§κ³ μ μ° λ μ½λ | |
| -- ============================================================================ | |
| -- ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| -- 1. 리ν¬νΈ (Reports) | |
| -- μΊ νμΈ/μ΄λ²€νΈλ³ μμ±λ PDF/λ³΄κ³ μ λ©νλ°μ΄ν° | |
| -- ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| CREATE TABLE reports ( | |
| id UUID PRIMARY KEY DEFAULT gen_random_uuid(), | |
| campaign_id UUID REFERENCES campaigns(id), | |
| event_id UUID REFERENCES events(id), | |
| org_id UUID REFERENCES organizations(id), | |
| -- 리ν¬νΈ μ ν λ° μν | |
| report_type VARCHAR(30) NOT NULL | |
| CHECK (report_type IN ('ngms', 'esg_impact', 'audit', 'scope3_cert')), | |
| format VARCHAR(10) DEFAULT 'pdf' NOT NULL, | |
| status VARCHAR(20) DEFAULT 'generating' NOT NULL | |
| CHECK (status IN ('generating', 'completed', 'failed')), | |
| -- νμΌ μ 보 | |
| file_url VARCHAR(500), -- GCS κ²½λ‘ (μμ± μλ£ μ) | |
| page_count INT, | |
| generated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL | |
| ); | |
| CREATE INDEX idx_reports_campaign ON reports(campaign_id) WHERE campaign_id IS NOT NULL; | |
| CREATE INDEX idx_reports_event ON reports(event_id) WHERE event_id IS NOT NULL; | |
| CREATE INDEX idx_reports_org ON reports(org_id) WHERE org_id IS NOT NULL; | |
| CREATE INDEX idx_reports_type ON reports(report_type); | |
| -- ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| -- 2. AI μμ΄μ νΈ νμ€ν¬ (Agent Tasks) | |
| -- LLM κΈ°λ° λΉλκΈ° μμ ν β 리ν¬νΈ μμ±, λ°μ΄ν° λΆμ λ± | |
| -- ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| CREATE TABLE agent_tasks ( | |
| id UUID PRIMARY KEY DEFAULT gen_random_uuid(), | |
| agent_type VARCHAR(30) NOT NULL | |
| CHECK (agent_type IN ( | |
| 'report_gen', 'data_analysis', 'fraud_scan', | |
| 'methodology_match', 'notification', 'audit' | |
| )), | |
| title VARCHAR(300) NOT NULL, | |
| description TEXT, | |
| -- μν | |
| status VARCHAR(20) DEFAULT 'queued' NOT NULL | |
| CHECK (status IN ('queued', 'running', 'completed', 'failed', 'cancelled')), | |
| -- κ²°κ³Ό | |
| result JSONB, -- μμ΄μ νΈ μ€ν κ²°κ³Ό | |
| created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL, | |
| completed_at TIMESTAMPTZ | |
| ); | |
| CREATE INDEX idx_agent_tasks_status ON agent_tasks(status, created_at); | |
| CREATE INDEX idx_agent_tasks_type ON agent_tasks(agent_type); | |
| -- ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| -- 3. μ μ° λ μ½λ (Settlements) | |
| -- μΊ νμΈλ³ μ£ΌκΈ° μ μ° β μμ₯(settlement_ledger)μ μ§κ³ μ€λ μ· | |
| -- ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| CREATE TABLE settlements ( | |
| id UUID PRIMARY KEY DEFAULT gen_random_uuid(), | |
| campaign_id UUID NOT NULL REFERENCES campaigns(id), | |
| -- μ μ° κΈ°κ° | |
| period VARCHAR(20) NOT NULL, -- μ: '2026-04-W1', '2026-Q1' | |
| -- μ μ° κΈμ‘ | |
| total_credits DECIMAL(12, 2) NOT NULL, -- μ΄ ν¬λ λ§ (tCOβe) | |
| total_amount BIGINT NOT NULL, -- μ΄ μ μ° κΈμ‘ (KRW) | |
| user_share BIGINT NOT NULL, -- μ°Έμ¬μ 보μ (70%) | |
| platform_share BIGINT NOT NULL, -- νλ«νΌ μμλ£ (30%) | |
| participants INT DEFAULT 0, -- μ μ° λμ μ°Έμ¬μ μ | |
| -- μ§κΈ μ 보 | |
| payout_method VARCHAR(30) | |
| CHECK (payout_method IN ('naver_pay', 'welfare_mall', 'bank_transfer')), | |
| payout_ref VARCHAR(200), -- μΈλΆ κ²°μ νΈλμμ ID | |
| -- μν | |
| status VARCHAR(20) DEFAULT 'pending' NOT NULL | |
| CHECK (status IN ('pending', 'processing', 'completed', 'failed')), | |
| ledger_entry_id UUID, -- μμ₯ μ°κ²° (settlement_ledger.transaction_id) | |
| processed_at TIMESTAMPTZ, | |
| created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL | |
| ); | |
| CREATE INDEX idx_settlements_campaign ON settlements(campaign_id); | |
| CREATE INDEX idx_settlements_status ON settlements(status); | |
| CREATE INDEX idx_settlements_period ON settlements(campaign_id, period); | |