🚀 Initial commit: Versão atual do TrackSteel APP

This commit is contained in:
2026-03-18 21:17:53 +00:00
commit bde410c9ad
633 changed files with 108150 additions and 0 deletions

View File

@@ -0,0 +1,147 @@
-- 1) Tipos (enums) para os campos de seleção
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'atribuicao_frequencia') THEN
CREATE TYPE public.atribuicao_frequencia AS ENUM ('horaria','2xdia','diaria','2xsemanal','semanal','quinzenal','mensal');
END IF;
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'atribuicao_metodo') THEN
CREATE TYPE public.atribuicao_metodo AS ENUM ('impresso','sistema','sistema-impresso','email','verbal');
END IF;
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'atribuicao_cliente') THEN
CREATE TYPE public.atribuicao_cliente AS ENUM ('interno','processo','obra','contrato','geral');
END IF;
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'atribuicao_importancia') THEN
CREATE TYPE public.atribuicao_importancia AS ENUM ('essencial','estrategico','suporte','informativo');
END IF;
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'atribuicao_duracao') THEN
CREATE TYPE public.atribuicao_duracao AS ENUM ('<=1 hora','2 horas','4 horas','8 horas');
END IF;
END$$;
-- 2) Função para checar admin ou função Diretoria
CREATE OR REPLACE FUNCTION public.is_admin_or_diretoria(_user_id uuid)
RETURNS boolean
LANGUAGE sql
STABLE
SECURITY DEFINER
SET search_path TO 'public'
AS $$
SELECT public.has_role(_user_id, 'admin'::app_role)
OR EXISTS (
SELECT 1
FROM public.profiles p
JOIN public.functions f ON f.id = p.function_id
WHERE p.id = _user_id
AND lower(f.name) LIKE 'diretoria%'
);
$$;
-- 3) Função para gerar abreviação (3 letras) do usuário
CREATE OR REPLACE FUNCTION public.generate_user_abbrev(_user_id uuid)
RETURNS text
LANGUAGE plpgsql
SECURITY DEFINER
SET search_path TO 'public'
AS $function$
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;
$function$;
-- 4) Tabela de Atribuições
CREATE TABLE IF NOT EXISTS public.atribuicoes (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
user_id uuid NOT NULL REFERENCES public.profiles(id) ON DELETE CASCADE,
user_abbrev char(3) NOT NULL DEFAULT 'USR',
attribution varchar(300) NOT NULL,
frequency public.atribuicao_frequencia NOT NULL,
method public.atribuicao_metodo NOT NULL,
client public.atribuicao_cliente NOT NULL,
importance public.atribuicao_importancia NOT NULL,
duration public.atribuicao_duracao NOT NULL,
created_by uuid NOT NULL REFERENCES public.profiles(id),
created_at timestamptz NOT NULL DEFAULT now(),
updated_at timestamptz NOT NULL DEFAULT now()
);
-- Índices úteis
CREATE INDEX IF NOT EXISTS idx_atribuicoes_user_id ON public.atribuicoes(user_id);
CREATE INDEX IF NOT EXISTS idx_atribuicoes_created_by ON public.atribuicoes(created_by);
CREATE INDEX IF NOT EXISTS idx_atribuicoes_created_at ON public.atribuicoes(created_at);
-- 5) Trigger para defaults (abreviação + updated_at)
CREATE OR REPLACE FUNCTION public.set_atribuicoes_defaults()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
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;
$function$;
DROP TRIGGER IF EXISTS trg_atribuicoes_defaults ON public.atribuicoes;
CREATE TRIGGER trg_atribuicoes_defaults
BEFORE INSERT OR UPDATE ON public.atribuicoes
FOR EACH ROW
EXECUTE FUNCTION public.set_atribuicoes_defaults();
-- 6) RLS
ALTER TABLE public.atribuicoes ENABLE ROW LEVEL SECURITY;
-- SELECT: Admin/Diretoria veem tudo; demais apenas suas próprias
DROP POLICY IF EXISTS "View own or admin/diretoria all" ON public.atribuicoes;
CREATE POLICY "View own or admin/diretoria all"
ON public.atribuicoes
FOR SELECT
USING ( public.is_admin_or_diretoria(auth.uid()) OR user_id = auth.uid() );
-- INSERT: apenas Admin/Diretoria e exige created_by = auth.uid()
DROP POLICY IF EXISTS "Only admin/diretoria can insert atribuições" ON public.atribuicoes;
CREATE POLICY "Only admin/diretoria can insert atribuições"
ON public.atribuicoes
FOR INSERT
WITH CHECK ( public.is_admin_or_diretoria(auth.uid()) AND created_by = auth.uid() );
-- UPDATE: apenas Admin/Diretoria
DROP POLICY IF EXISTS "Only admin/diretoria can update atribuições" ON public.atribuicoes;
CREATE POLICY "Only admin/diretoria can update atribuições"
ON public.atribuicoes
FOR UPDATE
USING ( public.is_admin_or_diretoria(auth.uid()) );
-- DELETE: apenas Admin/Diretoria
DROP POLICY IF EXISTS "Only admin/diretoria can delete atribuições" ON public.atribuicoes;
CREATE POLICY "Only admin/diretoria can delete atribuições"
ON public.atribuicoes
FOR DELETE
USING ( public.is_admin_or_diretoria(auth.uid()) );