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