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