mirror of
https://github.com/renee-png/acmcc.git
synced 2026-06-21 01:40:01 +00:00
183fe0a93c
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
43 lines
1.8 KiB
SQL
43 lines
1.8 KiB
SQL
|
|
-- Add void tracking columns
|
|
ALTER TABLE public.signature_envelopes
|
|
ADD COLUMN IF NOT EXISTS voided_at timestamptz,
|
|
ADD COLUMN IF NOT EXISTS voided_reason text,
|
|
ADD COLUMN IF NOT EXISTS voided_by uuid;
|
|
|
|
-- Signature field placements
|
|
CREATE TABLE IF NOT EXISTS public.signature_fields (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
envelope_id uuid NOT NULL REFERENCES public.signature_envelopes(id) ON DELETE CASCADE,
|
|
recipient_id uuid NOT NULL REFERENCES public.signature_recipients(id) ON DELETE CASCADE,
|
|
field_type text NOT NULL CHECK (field_type IN ('signature', 'date', 'name', 'initials')),
|
|
page_number integer NOT NULL DEFAULT 1,
|
|
x_ratio numeric NOT NULL, -- 0..1 from left
|
|
y_ratio numeric NOT NULL, -- 0..1 from top (UI coord)
|
|
width_ratio numeric NOT NULL DEFAULT 0.20,
|
|
height_ratio numeric NOT NULL DEFAULT 0.05,
|
|
required boolean NOT NULL DEFAULT true,
|
|
created_at timestamptz NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_signature_fields_envelope ON public.signature_fields(envelope_id);
|
|
CREATE INDEX IF NOT EXISTS idx_signature_fields_recipient ON public.signature_fields(recipient_id);
|
|
|
|
ALTER TABLE public.signature_fields ENABLE ROW LEVEL SECURITY;
|
|
|
|
CREATE POLICY "Staff manage signature fields"
|
|
ON public.signature_fields
|
|
FOR ALL
|
|
TO authenticated
|
|
USING (public.has_role(auth.uid(), 'admin'::public.app_role) OR public.has_role(auth.uid(), 'manager'::public.app_role))
|
|
WITH CHECK (public.has_role(auth.uid(), 'admin'::public.app_role) OR public.has_role(auth.uid(), 'manager'::public.app_role));
|
|
|
|
CREATE POLICY "Recipients view their fields"
|
|
ON public.signature_fields
|
|
FOR SELECT
|
|
USING (EXISTS (
|
|
SELECT 1 FROM public.signature_recipients r
|
|
WHERE r.id = signature_fields.recipient_id
|
|
AND (r.user_id = auth.uid() OR lower(r.email) = lower(auth.email()))
|
|
));
|