fix(recovery): restore source removed by production documentation merge
This commit is contained in:
@@ -0,0 +1,137 @@
|
||||
-- 0pt — initial schema (docs/03-data-model.md). Postgres + pgvector.
|
||||
-- Amounts in öre (integer). Every fact links to bridge_provenance.
|
||||
CREATE EXTENSION IF NOT EXISTS vector;
|
||||
CREATE EXTENSION IF NOT EXISTS pgcrypto;
|
||||
|
||||
-- ── Data entities ───────────────────────────────────────────────
|
||||
CREATE TABLE IF NOT EXISTS dim_source (
|
||||
source_id text PRIMARY KEY,
|
||||
name text NOT NULL,
|
||||
market text,
|
||||
access text, -- api | bulk | authorized_web | licensed
|
||||
licence text,
|
||||
cadence text,
|
||||
url text
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS dim_company (
|
||||
org_nr text PRIMARY KEY,
|
||||
market text NOT NULL,
|
||||
lei text,
|
||||
name text NOT NULL,
|
||||
status text,
|
||||
nace text,
|
||||
registered_at date,
|
||||
address jsonb,
|
||||
website text,
|
||||
updated_at timestamptz NOT NULL DEFAULT now(),
|
||||
created_at timestamptz NOT NULL DEFAULT now()
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS fact_financials (
|
||||
org_nr text REFERENCES dim_company(org_nr),
|
||||
fiscal_year int NOT NULL,
|
||||
revenue bigint, result bigint, employees int,
|
||||
source_id text REFERENCES dim_source(source_id),
|
||||
PRIMARY KEY (org_nr, fiscal_year)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS dim_contact (
|
||||
contact_id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
org_nr text REFERENCES dim_company(org_nr),
|
||||
name text, role text, email text, phone text, linkedin text,
|
||||
updated_at timestamptz NOT NULL DEFAULT now()
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS dim_ubo (
|
||||
ubo_id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
org_nr text REFERENCES dim_company(org_nr),
|
||||
owner text, share numeric(5,2)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS dim_vehicle (
|
||||
vin text PRIMARY KEY,
|
||||
market text NOT NULL,
|
||||
reg_plate text, make text, model text, year int,
|
||||
owner_org text REFERENCES dim_company(org_nr),
|
||||
specs jsonb,
|
||||
updated_at timestamptz NOT NULL DEFAULT now()
|
||||
);
|
||||
|
||||
-- ── Provenance (the signature) ──────────────────────────────────
|
||||
CREATE TABLE IF NOT EXISTS bridge_provenance (
|
||||
field_id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
entity_type text NOT NULL, -- company|contact|vehicle|financials
|
||||
entity_key text NOT NULL,
|
||||
field_name text NOT NULL,
|
||||
source_id text REFERENCES dim_source(source_id),
|
||||
freshness date,
|
||||
confidence numeric(4,3) NOT NULL,
|
||||
level smallint NOT NULL, -- 0 unavailable/licensed,1 single,2 partial,3 corroborated
|
||||
agreed_sources int DEFAULT 1,
|
||||
UNIQUE (entity_type, entity_key, field_name)
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS idx_prov_entity ON bridge_provenance (entity_type, entity_key);
|
||||
|
||||
-- ── Platform tables ─────────────────────────────────────────────
|
||||
CREATE TABLE IF NOT EXISTS orgs (
|
||||
org_id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
name text NOT NULL, created_at timestamptz DEFAULT now()
|
||||
);
|
||||
CREATE TABLE IF NOT EXISTS users (
|
||||
user_id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
org_id uuid REFERENCES orgs(org_id),
|
||||
email text UNIQUE NOT NULL,
|
||||
role text NOT NULL DEFAULT 'member',
|
||||
created_at timestamptz DEFAULT now()
|
||||
);
|
||||
CREATE TABLE IF NOT EXISTS orders (
|
||||
order_id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
org_id uuid REFERENCES orgs(org_id),
|
||||
flow text NOT NULL,
|
||||
status text NOT NULL DEFAULT 'draft',
|
||||
config jsonb NOT NULL,
|
||||
total_ore bigint, deposit_ore bigint, balance_ore bigint,
|
||||
est_days int, est_confidence numeric(4,3),
|
||||
created_at timestamptz DEFAULT now(), updated_at timestamptz DEFAULT now()
|
||||
);
|
||||
CREATE TABLE IF NOT EXISTS jobs (
|
||||
job_id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
order_id uuid REFERENCES orders(order_id),
|
||||
stage text, pct numeric(5,2) DEFAULT 0, state text DEFAULT 'queued',
|
||||
metrics jsonb, started_at timestamptz, finished_at timestamptz
|
||||
);
|
||||
CREATE TABLE IF NOT EXISTS deliveries (
|
||||
delivery_id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
order_id uuid REFERENCES orders(order_id),
|
||||
formats text[], destinations text[],
|
||||
record_count int, avg_confidence numeric(4,3),
|
||||
quality_report jsonb, provenance_export_url text, files jsonb,
|
||||
created_at timestamptz DEFAULT now()
|
||||
);
|
||||
CREATE TABLE IF NOT EXISTS subscriptions (
|
||||
sub_id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
order_id uuid REFERENCES orders(order_id),
|
||||
cadence text, webhook_url text, status text DEFAULT 'active', next_run_at timestamptz
|
||||
);
|
||||
CREATE TABLE IF NOT EXISTS files (
|
||||
file_id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
org_id uuid REFERENCES orgs(org_id), order_id uuid REFERENCES orders(order_id),
|
||||
name text, mime text, bytes bigint, r2_key text, created_at timestamptz DEFAULT now()
|
||||
);
|
||||
CREATE TABLE IF NOT EXISTS db_grants (
|
||||
grant_id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
org_id uuid REFERENCES orgs(org_id), order_id uuid REFERENCES orders(order_id),
|
||||
conn_encrypted bytea NOT NULL, scope text, expires_at timestamptz, revoked_at timestamptz,
|
||||
created_at timestamptz DEFAULT now()
|
||||
);
|
||||
CREATE TABLE IF NOT EXISTS payments (
|
||||
payment_id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
order_id uuid REFERENCES orders(order_id),
|
||||
kind text, amount_ore bigint, stripe_ref text, status text,
|
||||
created_at timestamptz DEFAULT now()
|
||||
);
|
||||
CREATE TABLE IF NOT EXISTS audit_log (
|
||||
id bigserial PRIMARY KEY,
|
||||
actor text, action text, target text, meta jsonb, at timestamptz DEFAULT now()
|
||||
);
|
||||
Reference in New Issue
Block a user