138 lines
3.5 KiB
PL/PgSQL
138 lines
3.5 KiB
PL/PgSQL
|
|
-- 1. Remover tabela e tipos existentes se existirem
|
|
DROP TABLE IF EXISTS public.atribuicoes CASCADE;
|
|
DROP TYPE IF EXISTS public.frequency_type CASCADE;
|
|
DROP TYPE IF EXISTS public.method_type CASCADE;
|
|
DROP TYPE IF EXISTS public.client_type CASCADE;
|
|
DROP TYPE IF EXISTS public.importance_type CASCADE;
|
|
DROP TYPE IF EXISTS public.duration_type CASCADE;
|
|
|
|
-- 2. Criar novos tipos ENUM
|
|
CREATE TYPE public.frequency_type AS ENUM (
|
|
'horaria',
|
|
'2xdia',
|
|
'diaria',
|
|
'2xsemanal',
|
|
'semanal',
|
|
'quinzenal',
|
|
'mensal'
|
|
);
|
|
|
|
CREATE TYPE public.method_type AS ENUM (
|
|
'impresso',
|
|
'sistema',
|
|
'sistema-impresso',
|
|
'email',
|
|
'verbal'
|
|
);
|
|
|
|
CREATE TYPE public.client_type AS ENUM (
|
|
'interno',
|
|
'processo',
|
|
'obra',
|
|
'contrato',
|
|
'geral'
|
|
);
|
|
|
|
CREATE TYPE public.importance_type AS ENUM (
|
|
'essencial',
|
|
'estrategico',
|
|
'suporte',
|
|
'informativo'
|
|
);
|
|
|
|
CREATE TYPE public.duration_type AS ENUM (
|
|
'<=1 hora',
|
|
'2 horas',
|
|
'4 horas',
|
|
'8 horas'
|
|
);
|
|
|
|
-- 3. Criar nova tabela atribuicoes
|
|
CREATE TABLE public.atribuicoes (
|
|
id UUID NOT NULL DEFAULT gen_random_uuid() PRIMARY KEY,
|
|
user_id UUID NOT NULL,
|
|
user_abbrev CHAR(3) NOT NULL DEFAULT 'USR',
|
|
attribution VARCHAR(300) NOT NULL,
|
|
frequency frequency_type NOT NULL,
|
|
method method_type NOT NULL,
|
|
client client_type NOT NULL,
|
|
importance importance_type NOT NULL,
|
|
duration duration_type NOT NULL,
|
|
created_by UUID NOT NULL,
|
|
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
|
|
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now()
|
|
);
|
|
|
|
-- 4. Habilitar RLS
|
|
ALTER TABLE public.atribuicoes ENABLE ROW LEVEL SECURITY;
|
|
|
|
-- 5. Criar políticas RLS
|
|
CREATE POLICY "View own or admin/diretoria all" ON public.atribuicoes
|
|
FOR SELECT USING (
|
|
is_admin_or_diretoria(auth.uid()) OR user_id = auth.uid()
|
|
);
|
|
|
|
CREATE POLICY "Only admin/diretoria can insert atribuições" ON public.atribuicoes
|
|
FOR INSERT WITH CHECK (
|
|
is_admin_or_diretoria(auth.uid()) AND created_by = auth.uid()
|
|
);
|
|
|
|
CREATE POLICY "Only admin/diretoria can update atribuições" ON public.atribuicoes
|
|
FOR UPDATE USING (is_admin_or_diretoria(auth.uid()));
|
|
|
|
CREATE POLICY "Only admin/diretoria can delete atribuições" ON public.atribuicoes
|
|
FOR DELETE USING (is_admin_or_diretoria(auth.uid()));
|
|
|
|
-- 6. Função para gerar abreviação automática do usuário
|
|
CREATE OR REPLACE FUNCTION public.generate_user_abbrev(_user_id UUID)
|
|
RETURNS TEXT
|
|
LANGUAGE plpgsql
|
|
SECURITY DEFINER
|
|
SET search_path = public
|
|
AS $$
|
|
DECLARE
|
|
name_text TEXT;
|
|
abbrev TEXT;
|
|
BEGIN
|
|
SELECT COALESCE(NULLIF(trim(p.full_name), ''), split_part(p.email, '@', 1))
|
|
INTO name_text
|
|
FROM public.profiles p
|
|
WHERE p.id = _user_id;
|
|
|
|
IF name_text IS NULL OR name_text = '' THEN
|
|
RETURN 'USR';
|
|
END IF;
|
|
|
|
abbrev := upper(substring(regexp_replace(name_text, '[^A-Za-z0-9]', '', 'g') from 1 for 3));
|
|
IF length(abbrev) < 3 THEN
|
|
abbrev := rpad(abbrev, 3, 'X');
|
|
END IF;
|
|
|
|
RETURN abbrev;
|
|
END;
|
|
$$;
|
|
|
|
-- 7. Trigger para definir valores padrão
|
|
CREATE OR REPLACE FUNCTION public.set_atribuicoes_defaults()
|
|
RETURNS TRIGGER
|
|
LANGUAGE plpgsql
|
|
AS $$
|
|
BEGIN
|
|
-- Ajustar abreviação se vier vazia ou inválida
|
|
IF NEW.user_abbrev IS NULL OR length(btrim(NEW.user_abbrev)) <> 3 THEN
|
|
NEW.user_abbrev := upper(substring(public.generate_user_abbrev(NEW.user_id) from 1 for 3));
|
|
ELSE
|
|
NEW.user_abbrev := upper(NEW.user_abbrev);
|
|
END IF;
|
|
|
|
NEW.updated_at := now();
|
|
RETURN NEW;
|
|
END;
|
|
$$;
|
|
|
|
CREATE TRIGGER set_atribuicoes_defaults_trigger
|
|
BEFORE INSERT OR UPDATE ON public.atribuicoes
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION public.set_atribuicoes_defaults();
|