108 lines
3.0 KiB
PL/PgSQL
108 lines
3.0 KiB
PL/PgSQL
|
|
-- 1) Sequência para geração do código "EQ-001"
|
|
CREATE SEQUENCE IF NOT EXISTS public.equipamentos_codigo_seq START 1;
|
|
|
|
-- 2) Tabela principal
|
|
CREATE TABLE IF NOT EXISTS public.equipamentos (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
codigo text UNIQUE NOT NULL,
|
|
descricao text NOT NULL,
|
|
capacidade text,
|
|
quantidade integer NOT NULL DEFAULT 1,
|
|
local_estoque text NOT NULL,
|
|
propriedade text NOT NULL DEFAULT 'proprio',
|
|
validade_calibracao date,
|
|
certificado_calibracao text,
|
|
periodicidade_calibracao integer,
|
|
of_number text,
|
|
destino_outro text,
|
|
data_saida date,
|
|
retirado_por uuid,
|
|
data_retorno date,
|
|
devolvido_por uuid,
|
|
observacoes text,
|
|
created_by uuid,
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
updated_at timestamptz NOT NULL DEFAULT now()
|
|
);
|
|
|
|
-- 3) Função/trigger para definir codigo e created_by no insert
|
|
CREATE OR REPLACE FUNCTION public.equipamentos_before_insert()
|
|
RETURNS trigger
|
|
LANGUAGE plpgsql
|
|
AS $$
|
|
BEGIN
|
|
IF NEW.codigo IS NULL OR length(trim(NEW.codigo)) = 0 THEN
|
|
NEW.codigo := 'EQ-' || lpad(nextval('public.equipamentos_codigo_seq')::text, 3, '0');
|
|
END IF;
|
|
|
|
IF NEW.created_by IS NULL THEN
|
|
NEW.created_by := auth.uid();
|
|
END IF;
|
|
|
|
RETURN NEW;
|
|
END;
|
|
$$;
|
|
|
|
-- 4) Função/trigger para atualizar updated_at no update
|
|
CREATE OR REPLACE FUNCTION public.set_updated_at()
|
|
RETURNS trigger
|
|
LANGUAGE plpgsql
|
|
AS $$
|
|
BEGIN
|
|
NEW.updated_at := now();
|
|
RETURN NEW;
|
|
END;
|
|
$$;
|
|
|
|
-- 5) Criação dos triggers
|
|
DROP TRIGGER IF EXISTS equipamentos_set_defaults ON public.equipamentos;
|
|
CREATE TRIGGER equipamentos_set_defaults
|
|
BEFORE INSERT ON public.equipamentos
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION public.equipamentos_before_insert();
|
|
|
|
DROP TRIGGER IF EXISTS equipamentos_updated_at ON public.equipamentos;
|
|
CREATE TRIGGER equipamentos_updated_at
|
|
BEFORE UPDATE ON public.equipamentos
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION public.set_updated_at();
|
|
|
|
-- 6) RLS e políticas
|
|
ALTER TABLE public.equipamentos ENABLE ROW LEVEL SECURITY;
|
|
|
|
DROP POLICY IF EXISTS "Equipamentos select" ON public.equipamentos;
|
|
CREATE POLICY "Equipamentos select"
|
|
ON public.equipamentos
|
|
FOR SELECT
|
|
USING (auth.uid() IS NOT NULL);
|
|
|
|
DROP POLICY IF EXISTS "Equipamentos insert" ON public.equipamentos;
|
|
CREATE POLICY "Equipamentos insert"
|
|
ON public.equipamentos
|
|
FOR INSERT
|
|
WITH CHECK (auth.uid() IS NOT NULL);
|
|
|
|
DROP POLICY IF EXISTS "Equipamentos update" ON public.equipamentos;
|
|
CREATE POLICY "Equipamentos update"
|
|
ON public.equipamentos
|
|
FOR UPDATE
|
|
USING (auth.uid() IS NOT NULL);
|
|
|
|
DROP POLICY IF EXISTS "Equipamentos delete" ON public.equipamentos;
|
|
CREATE POLICY "Equipamentos delete"
|
|
ON public.equipamentos
|
|
FOR DELETE
|
|
USING (auth.uid() IS NOT NULL);
|
|
|
|
-- 7) Registrar recurso na tabela de interface (para controle de acesso por recurso)
|
|
DO $$
|
|
BEGIN
|
|
IF NOT EXISTS (
|
|
SELECT 1 FROM public.interface_resources WHERE resource_key = 'equipamentos'
|
|
) THEN
|
|
INSERT INTO public.interface_resources (resource_name, resource_key, route_path, icon_name, created_at, updated_at)
|
|
VALUES ('Equipamentos', 'equipamentos', '/equipamentos', 'Wrench', now(), now());
|
|
END IF;
|
|
END $$;
|