Files
0pt/sql/017_document_credits.sql
T
admin bd1c20edb2
CI (SIAX Cloud) / integration (push) Skipped
CI (SIAX Cloud) / sonar (push) Skipped
masterplan-lock / check (push) Successful in 5s
Security Scan (SIAX Cloud) / security (push) Successful in 15s
CI (SIAX Cloud) / security (push) Successful in 16s
CI (SIAX Cloud) / sonar (pull_request) Skipped
masterplan-lock / check (pull_request) Successful in 7s
Security Scan (SIAX Cloud) / security (pull_request) Successful in 21s
CI (SIAX Cloud) / security (pull_request) Successful in 25s
CI (SIAX Cloud) / quality (push) Successful in 1m17s
CI (SIAX Cloud) / integration (pull_request) Successful in 54s
CI (SIAX Cloud) / quality (pull_request) Successful in 1m7s
feat: add guarded document workbench foundations
2026-11-02 01:26:36 +01:00

42 lines
2.2 KiB
SQL

-- Internal credit ledger foundation; no public payment or credit-grant route.
CREATE TABLE IF NOT EXISTS opt_credit_accounts (
tenant_id text PRIMARY KEY CHECK (length(tenant_id) > 0),
available bigint NOT NULL DEFAULT 0 CHECK (available >= 0 AND available <= 9007199254740991),
reserved bigint NOT NULL DEFAULT 0 CHECK (reserved >= 0 AND reserved <= 9007199254740991)
);
CREATE TABLE IF NOT EXISTS opt_credit_reservations (
tenant_id text NOT NULL REFERENCES opt_credit_accounts(tenant_id),
reservation_id text NOT NULL CHECK (length(reservation_id) > 0),
amount bigint NOT NULL CHECK (amount > 0 AND amount <= 9007199254740991),
status text NOT NULL CHECK (status IN ('reserved', 'settled', 'released')),
settled_amount bigint CHECK (settled_amount >= 0 AND settled_amount <= amount),
PRIMARY KEY (tenant_id, reservation_id)
);
CREATE TABLE IF NOT EXISTS opt_credit_events (
event_id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
tenant_id text NOT NULL REFERENCES opt_credit_accounts(tenant_id),
idempotency_key text NOT NULL CHECK (length(idempotency_key) > 0),
kind text NOT NULL CHECK (kind IN ('verified_payment', 'reserve', 'settle', 'release')),
amount bigint NOT NULL CHECK (amount >= 0 AND amount <= 9007199254740991),
reference text NOT NULL CHECK (length(reference) > 0),
created_at timestamptz NOT NULL DEFAULT now(),
UNIQUE (tenant_id, idempotency_key)
);
-- A single external payment cannot fund multiple tenants or grants.
CREATE UNIQUE INDEX IF NOT EXISTS opt_credit_verified_payment_reference
ON opt_credit_events(reference) WHERE kind = 'verified_payment';
-- Server-owned price snapshot. Never read price or credits from PAY0 metadata.
CREATE TABLE IF NOT EXISTS opt_credit_purchases (
tenant_id text NOT NULL CHECK (length(tenant_id) > 0),
purchase_id text NOT NULL CHECK (length(purchase_id) > 0),
checkout_session_id text NOT NULL UNIQUE CHECK (length(checkout_session_id) > 0),
amount_minor bigint NOT NULL CHECK (amount_minor > 0 AND amount_minor <= 9007199254740991),
currency text NOT NULL CHECK (currency ~ '^[A-Z]{3}$'),
credits bigint NOT NULL CHECK (credits > 0 AND credits <= 9007199254740991),
created_at timestamptz NOT NULL DEFAULT now(),
PRIMARY KEY (tenant_id, purchase_id)
);