Files
accounted/supabase/migrations/20260402010000_provider_consents.sql
T
Mattsson d5410a518f Mobile view fixes (#188)
* fix: make new user checklist mobile responsive

Adjust spacing, padding, typography, and indentation for small screens
so the onboarding welcome screen works well on mobile devices.

* fix: make expenses and bookkeeping verification views mobile responsive

- Expenses/new: stack form grids on mobile, replace line items table with
  card layout, full-width action buttons
- Expenses/[id]: stack header and actions, card layout for line items and
  payments, single-column info grid on mobile
- JournalEntryList: unify verification lines into card layout for all
  screen sizes, hide redundant line descriptions that duplicate account
  name or entry description, stack filter bar and action buttons on mobile

* fix: remove stray )); in provider_consents migration

Syntax error on line 35 caused MIGRATIONS_FAILED on the Supabase staging branch.

* fix: enhance mobile responsiveness for invoices page and update dialog styles
2026-04-07 15:53:30 +02:00

112 lines
4.0 KiB
SQL

-- Provider consents for direct accounting provider integrations
-- Replaces the external dependency on the Arcim Sync gateway
-- Provider consents (one per connected accounting company)
CREATE TABLE IF NOT EXISTS provider_consents (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
company_id UUID NOT NULL REFERENCES companies(id) ON DELETE CASCADE,
name TEXT NOT NULL,
status INTEGER NOT NULL DEFAULT 0, -- 0=Created, 1=Accepted, 2=Revoked, 3=Inactive
provider TEXT, -- fortnox, visma, briox, bokio, bjornlunden
org_number TEXT,
company_name TEXT,
etag TEXT NOT NULL DEFAULT gen_random_uuid()::text,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
expires_at TIMESTAMPTZ
);
CREATE INDEX idx_provider_consents_company ON provider_consents(company_id);
CREATE INDEX idx_provider_consents_company_provider ON provider_consents(company_id, provider);
ALTER TABLE provider_consents ENABLE ROW LEVEL SECURITY;
CREATE POLICY provider_consents_select ON provider_consents
FOR SELECT USING (company_id IN (SELECT public.user_company_ids()));
CREATE POLICY provider_consents_insert ON provider_consents
FOR INSERT WITH CHECK (company_id IN (SELECT public.user_company_ids()));
CREATE POLICY provider_consents_update ON provider_consents
FOR UPDATE USING (company_id IN (SELECT public.user_company_ids()));
CREATE POLICY provider_consents_delete ON provider_consents
FOR DELETE USING (company_id IN (SELECT public.user_company_ids()));
CREATE TRIGGER update_provider_consents_updated_at
BEFORE UPDATE ON provider_consents
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
-- Encrypted token storage for provider OAuth/API tokens
CREATE TABLE IF NOT EXISTS provider_consent_tokens (
consent_id UUID PRIMARY KEY REFERENCES provider_consents(id) ON DELETE CASCADE,
provider TEXT NOT NULL,
access_token TEXT NOT NULL,
refresh_token TEXT,
token_expires_at TIMESTAMPTZ,
provider_company_id TEXT,
scopes TEXT,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
ALTER TABLE provider_consent_tokens ENABLE ROW LEVEL SECURITY;
CREATE POLICY provider_consent_tokens_select ON provider_consent_tokens
FOR SELECT USING (consent_id IN (
SELECT id FROM provider_consents WHERE company_id IN (
SELECT company_id FROM team_members WHERE user_id = auth.uid()
)
));
CREATE POLICY provider_consent_tokens_insert ON provider_consent_tokens
FOR INSERT WITH CHECK (consent_id IN (
SELECT id FROM provider_consents WHERE company_id IN (
SELECT company_id FROM team_members WHERE user_id = auth.uid()
)
));
CREATE POLICY provider_consent_tokens_update ON provider_consent_tokens
FOR UPDATE USING (consent_id IN (
SELECT id FROM provider_consents WHERE company_id IN (
SELECT company_id FROM team_members WHERE user_id = auth.uid()
)
));
CREATE TRIGGER update_provider_consent_tokens_updated_at
BEFORE UPDATE ON provider_consent_tokens
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
-- One-time codes for OAuth callback validation
CREATE TABLE IF NOT EXISTS provider_otc (
code TEXT PRIMARY KEY,
consent_id UUID NOT NULL REFERENCES provider_consents(id) ON DELETE CASCADE,
expires_at TIMESTAMPTZ NOT NULL,
used_at TIMESTAMPTZ
);
CREATE INDEX idx_provider_otc_consent ON provider_otc(consent_id);
ALTER TABLE provider_otc ENABLE ROW LEVEL SECURITY;
CREATE POLICY provider_otc_select ON provider_otc
FOR SELECT USING (consent_id IN (
SELECT id FROM provider_consents WHERE company_id IN (
SELECT company_id FROM team_members WHERE user_id = auth.uid()
)
));
CREATE POLICY provider_otc_insert ON provider_otc
FOR INSERT WITH CHECK (consent_id IN (
SELECT id FROM provider_consents WHERE company_id IN (
SELECT company_id FROM team_members WHERE user_id = auth.uid()
)
));
CREATE POLICY provider_otc_update ON provider_otc
FOR UPDATE USING (consent_id IN (
SELECT id FROM provider_consents WHERE company_id IN (
SELECT company_id FROM team_members WHERE user_id = auth.uid()
)
));