memleketmeselesi/migrations/0004_officials_and_reports.sql
Mukan Erkin 2498e75594 init: memleketmeselesi platform — API + migrations
FastAPI + PostgreSQL 16. KYC, issue sistemi, permission/group yönetimi,
session yönetimi, API client auth (kışla kapısı), officials/persons CRUD.
Migration 0001–0013 dahil.
2026-04-27 23:06:59 +03:00

137 lines
4.7 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- Seçimler
CREATE TYPE election_type AS ENUM (
'genel', 'yerel', 'cumhurbaskanligi', 'referandum'
);
CREATE TABLE elections (
id BIGSERIAL PRIMARY KEY,
name TEXT NOT NULL,
held_at DATE NOT NULL,
type election_type NOT NULL
);
-- Görevdeki yetkililer
CREATE TABLE officials (
id BIGSERIAL PRIMARY KEY,
person_id BIGINT NOT NULL REFERENCES persons(id) ON DELETE RESTRICT,
unit_id BIGINT NOT NULL REFERENCES administrative_units(id),
title TEXT NOT NULL,
started_at DATE NOT NULL,
ended_at DATE,
election_id BIGINT REFERENCES elections(id) ON DELETE SET NULL
);
CREATE INDEX idx_officials_person ON officials(person_id);
CREATE INDEX idx_officials_unit ON officials(unit_id);
-- Yetkili karnesi (periyodik hesaplanan)
CREATE TABLE official_stats (
id BIGSERIAL PRIMARY KEY,
official_id BIGINT NOT NULL REFERENCES officials(id) ON DELETE CASCADE,
period_start DATE NOT NULL,
period_end DATE,
open_at_start INT NOT NULL DEFAULT 0,
new_during INT NOT NULL DEFAULT 0,
resolved INT NOT NULL DEFAULT 0,
rejected INT NOT NULL DEFAULT 0,
score NUMERIC(5, 2),
computed_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
UNIQUE (official_id, period_start)
);
CREATE INDEX idx_official_stats_official ON official_stats(official_id);
-- Sorumluluk kural tablosu (AI + moderatör için)
CREATE TABLE issue_category_unit_rules (
id BIGSERIAL PRIMARY KEY,
category_id BIGINT NOT NULL REFERENCES issue_categories(id) ON DELETE CASCADE,
unit_type_id BIGINT NOT NULL REFERENCES administrative_unit_types(id) ON DELETE CASCADE,
location_type location_type NOT NULL,
confidence SMALLINT NOT NULL DEFAULT 80 CHECK (confidence BETWEEN 0 AND 100),
legal_basis TEXT,
notes TEXT,
UNIQUE (category_id, unit_type_id, location_type)
);
-- Mevzuat (RAG için)
CREATE TABLE legislation (
id BIGSERIAL PRIMARY KEY,
title TEXT NOT NULL,
number TEXT,
published_at DATE,
body TEXT NOT NULL,
embedding_done BOOLEAN NOT NULL DEFAULT FALSE,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
-- Rapor türleri
CREATE TABLE report_types (
id BIGSERIAL PRIMARY KEY,
name TEXT NOT NULL,
slug TEXT NOT NULL UNIQUE,
description TEXT,
is_active BOOLEAN NOT NULL DEFAULT TRUE
);
-- Rapor türü ↔ veri kaynağı
CREATE TABLE report_data_sources (
id BIGSERIAL PRIMARY KEY,
name TEXT NOT NULL UNIQUE, -- "issue", "vote", "official_stat"
unit_price NUMERIC(10, 6) NOT NULL,
description TEXT
);
CREATE TABLE report_type_sources (
report_type_id BIGINT NOT NULL REFERENCES report_types(id) ON DELETE CASCADE,
data_source_id BIGINT NOT NULL REFERENCES report_data_sources(id) ON DELETE CASCADE,
is_required BOOLEAN NOT NULL DEFAULT TRUE,
PRIMARY KEY (report_type_id, data_source_id)
);
-- Rapor siparişleri
CREATE TYPE report_order_status AS ENUM (
'draft', 'pending_payment', 'processing', 'ready', 'failed', 'expired'
);
CREATE TABLE report_orders (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL REFERENCES users(id),
report_type_id BIGINT NOT NULL REFERENCES report_types(id),
parameters JSONB NOT NULL DEFAULT '{}',
row_counts JSONB NOT NULL DEFAULT '{}',
calculated_price NUMERIC(10, 2) NOT NULL DEFAULT 0,
status report_order_status NOT NULL DEFAULT 'draft',
paid_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_report_orders_user ON report_orders(user_id);
CREATE INDEX idx_report_orders_status ON report_orders(status);
-- Üretilen rapor dosyaları
CREATE TABLE report_outputs (
id BIGSERIAL PRIMARY KEY,
order_id BIGINT NOT NULL UNIQUE REFERENCES report_orders(id) ON DELETE CASCADE,
file_path TEXT NOT NULL,
file_size BIGINT NOT NULL DEFAULT 0,
expires_at TIMESTAMPTZ NOT NULL,
download_count SMALLINT NOT NULL DEFAULT 0,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
-- Ödemeler
CREATE TYPE payment_status AS ENUM ('pending', 'success', 'failed', 'refunded');
CREATE TABLE payments (
id BIGSERIAL PRIMARY KEY,
order_id BIGINT NOT NULL REFERENCES report_orders(id),
user_id BIGINT NOT NULL REFERENCES users(id),
amount NUMERIC(10, 2) NOT NULL,
provider TEXT NOT NULL,
provider_ref TEXT,
status payment_status NOT NULL DEFAULT 'pending',
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_payments_order ON payments(order_id);
CREATE INDEX idx_payments_user ON payments(user_id);