🚀 Initial commit: Versão atual do TrackSteel APP
This commit is contained in:
@@ -0,0 +1,137 @@
|
||||
|
||||
-- 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();
|
||||
Reference in New Issue
Block a user