-- Token pricing and usage schema for Calls Analyser. -- Run in Supabase SQL editor or include in your migration flow. -- The application should use a server-side Supabase key with service_role access. create table if not exists public.model_pricing ( id bigserial primary key, provider text not null, model_key text not null, currency text not null default 'USD', input_cost_per_1m numeric(12, 6) not null default 0, output_cost_per_1m numeric(12, 6) not null default 0, input_price_per_1m numeric(12, 6) not null default 0, output_price_per_1m numeric(12, 6) not null default 0, effective_from date not null default current_date, effective_to date, is_active boolean not null default true, created_at timestamptz not null default now() ); create index if not exists idx_model_pricing_lookup on public.model_pricing (provider, model_key, is_active, effective_from desc); create table if not exists public.analysis_usage ( id bigserial primary key, tenant_id text not null, call_unique_id text not null, call_started_at timestamptz, call_user text, caller_id text, destination text, duration_seconds integer, prompt_key text not null, custom_fragment_hash text not null default '', provider_name text not null, model_key text not null, mode text not null, cache_hit boolean not null default false, prompt_token_count integer not null default 0, candidates_token_count integer not null default 0, thoughts_token_count integer not null default 0, total_token_count integer not null default 0, input_cost_per_1m_snapshot numeric(12, 6) not null default 0, output_cost_per_1m_snapshot numeric(12, 6) not null default 0, input_price_per_1m_snapshot numeric(12, 6) not null default 0, output_price_per_1m_snapshot numeric(12, 6) not null default 0, estimated_cost numeric(14, 8) not null default 0, estimated_client_price numeric(14, 8) not null default 0, currency text not null default 'USD', analysis_result_cache_key text, created_at timestamptz not null default now() ); create index if not exists idx_analysis_usage_tenant_created on public.analysis_usage (tenant_id, created_at desc); create index if not exists idx_analysis_usage_call on public.analysis_usage (tenant_id, call_unique_id); alter table public.model_pricing enable row level security; alter table public.analysis_usage enable row level security; grant select on public.model_pricing to service_role; grant insert, select on public.analysis_usage to service_role; grant usage, select on sequence public.model_pricing_id_seq to service_role; grant usage, select on sequence public.analysis_usage_id_seq to service_role; insert into public.model_pricing ( provider, model_key, currency, input_cost_per_1m, output_cost_per_1m, input_price_per_1m, output_price_per_1m, effective_from ) values ( 'gemini', 'models/gemini-test', 'USD', 0, 0, 0, 0, current_date ) on conflict do nothing;