-- ============================================================
-- Ficha Técnica / Compras / Consumo — esquema completo
-- Banco: PostgreSQL 15+ com Supabase (schema auth disponível)
-- Uso: psql "$DATABASE_URL" -f deploy/schema.sql
-- ============================================================
-- NOTA: este script assume o schema `auth` do Supabase (auth.users).
-- Em uma instalação self-hosted do Supabase, ele já existe.
-- ============================================================
-- ROLES
CREATE TYPE public.app_role AS ENUM ('admin', 'gerente', 'cozinheiro');

CREATE TABLE public.profiles (
  id uuid PRIMARY KEY REFERENCES auth.users(id) ON DELETE CASCADE,
  nome text NOT NULL DEFAULT '',
  email text NOT NULL DEFAULT '',
  created_at timestamptz NOT NULL DEFAULT now()
);
GRANT SELECT, INSERT, UPDATE, DELETE ON public.profiles TO authenticated;
GRANT ALL ON public.profiles TO service_role;
ALTER TABLE public.profiles ENABLE ROW LEVEL SECURITY;
CREATE POLICY "profiles_select" ON public.profiles FOR SELECT TO authenticated USING (true);
CREATE POLICY "profiles_update_own" ON public.profiles FOR UPDATE TO authenticated USING (id = auth.uid()) WITH CHECK (id = auth.uid());

CREATE TABLE public.user_roles (
  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  user_id uuid NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
  role public.app_role NOT NULL,
  UNIQUE (user_id, role)
);
GRANT SELECT ON public.user_roles TO authenticated;
GRANT ALL ON public.user_roles TO service_role;
ALTER TABLE public.user_roles ENABLE ROW LEVEL SECURITY;

CREATE OR REPLACE FUNCTION public.has_role(_user_id uuid, _role public.app_role)
RETURNS boolean LANGUAGE sql STABLE SECURITY DEFINER SET search_path = public AS $$
  SELECT EXISTS (SELECT 1 FROM public.user_roles WHERE user_id = _user_id AND role = _role)
$$;

CREATE OR REPLACE FUNCTION public.pode_editar(_user_id uuid)
RETURNS boolean LANGUAGE sql STABLE SECURITY DEFINER SET search_path = public AS $$
  SELECT EXISTS (SELECT 1 FROM public.user_roles WHERE user_id = _user_id AND role IN ('admin','gerente'))
$$;

CREATE POLICY "user_roles_select" ON public.user_roles FOR SELECT TO authenticated USING (true);
CREATE POLICY "user_roles_admin_all" ON public.user_roles FOR ALL TO authenticated
  USING (public.has_role(auth.uid(), 'admin')) WITH CHECK (public.has_role(auth.uid(), 'admin'));

-- novo usuário: perfil + papel padrão
CREATE OR REPLACE FUNCTION public.handle_new_user()
RETURNS trigger LANGUAGE plpgsql SECURITY DEFINER SET search_path = public AS $$
BEGIN
  INSERT INTO public.profiles (id, nome, email)
  VALUES (NEW.id, COALESCE(NEW.raw_user_meta_data->>'nome', NEW.raw_user_meta_data->>'full_name', split_part(NEW.email,'@',1)), COALESCE(NEW.email,''))
  ON CONFLICT (id) DO NOTHING;
  INSERT INTO public.user_roles (user_id, role)
  VALUES (NEW.id, CASE WHEN (SELECT count(*) FROM public.user_roles) = 0 THEN 'admin'::public.app_role ELSE 'cozinheiro'::public.app_role END)
  ON CONFLICT DO NOTHING;
  RETURN NEW;
END;
$$;
CREATE TRIGGER on_auth_user_created AFTER INSERT ON auth.users
  FOR EACH ROW EXECUTE FUNCTION public.handle_new_user();

CREATE OR REPLACE FUNCTION public.set_updated_at()
RETURNS trigger LANGUAGE plpgsql SET search_path = public AS $$
BEGIN NEW.updated_at = now(); RETURN NEW; END; $$;

-- FORNECEDORES
CREATE TABLE public.fornecedores (
  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  nome text NOT NULL,
  cnpj text,
  contato text,
  telefone text,
  email text,
  prazo_entrega_dias integer NOT NULL DEFAULT 3,
  ativo boolean NOT NULL DEFAULT true,
  created_at timestamptz NOT NULL DEFAULT now(),
  updated_at timestamptz NOT NULL DEFAULT now()
);
GRANT SELECT, INSERT, UPDATE, DELETE ON public.fornecedores TO authenticated;
GRANT ALL ON public.fornecedores TO service_role;
ALTER TABLE public.fornecedores ENABLE ROW LEVEL SECURITY;
CREATE POLICY "fornecedores_select" ON public.fornecedores FOR SELECT TO authenticated USING (true);
CREATE POLICY "fornecedores_write" ON public.fornecedores FOR ALL TO authenticated
  USING (public.pode_editar(auth.uid())) WITH CHECK (public.pode_editar(auth.uid()));
CREATE TRIGGER trg_fornecedores_updated BEFORE UPDATE ON public.fornecedores FOR EACH ROW EXECUTE FUNCTION public.set_updated_at();

-- INSUMOS
CREATE TABLE public.insumos (
  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  nome text NOT NULL,
  categoria text NOT NULL DEFAULT 'Geral',
  unidade text NOT NULL DEFAULT 'kg',
  custo_unitario numeric(12,4) NOT NULL DEFAULT 0,
  estoque_atual numeric(12,3) NOT NULL DEFAULT 0,
  estoque_minimo numeric(12,3) NOT NULL DEFAULT 0,
  fornecedor_id uuid REFERENCES public.fornecedores(id) ON DELETE SET NULL,
  ativo boolean NOT NULL DEFAULT true,
  created_at timestamptz NOT NULL DEFAULT now(),
  updated_at timestamptz NOT NULL DEFAULT now()
);
GRANT SELECT, INSERT, UPDATE, DELETE ON public.insumos TO authenticated;
GRANT ALL ON public.insumos TO service_role;
ALTER TABLE public.insumos ENABLE ROW LEVEL SECURITY;
CREATE POLICY "insumos_select" ON public.insumos FOR SELECT TO authenticated USING (true);
CREATE POLICY "insumos_write" ON public.insumos FOR ALL TO authenticated
  USING (public.pode_editar(auth.uid())) WITH CHECK (public.pode_editar(auth.uid()));
CREATE TRIGGER trg_insumos_updated BEFORE UPDATE ON public.insumos FOR EACH ROW EXECUTE FUNCTION public.set_updated_at();

-- FICHAS TECNICAS
CREATE TABLE public.fichas_tecnicas (
  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  nome text NOT NULL,
  categoria text NOT NULL DEFAULT 'Prato principal',
  rendimento numeric(12,3) NOT NULL DEFAULT 1,
  unidade_rendimento text NOT NULL DEFAULT 'porções',
  modo_preparo text,
  preco_venda numeric(12,2) NOT NULL DEFAULT 0,
  ativo boolean NOT NULL DEFAULT true,
  created_at timestamptz NOT NULL DEFAULT now(),
  updated_at timestamptz NOT NULL DEFAULT now()
);
GRANT SELECT, INSERT, UPDATE, DELETE ON public.fichas_tecnicas TO authenticated;
GRANT ALL ON public.fichas_tecnicas TO service_role;
ALTER TABLE public.fichas_tecnicas ENABLE ROW LEVEL SECURITY;
CREATE POLICY "fichas_select" ON public.fichas_tecnicas FOR SELECT TO authenticated USING (true);
CREATE POLICY "fichas_write" ON public.fichas_tecnicas FOR ALL TO authenticated
  USING (public.pode_editar(auth.uid())) WITH CHECK (public.pode_editar(auth.uid()));
CREATE TRIGGER trg_fichas_updated BEFORE UPDATE ON public.fichas_tecnicas FOR EACH ROW EXECUTE FUNCTION public.set_updated_at();

CREATE TABLE public.ficha_itens (
  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  ficha_id uuid NOT NULL REFERENCES public.fichas_tecnicas(id) ON DELETE CASCADE,
  insumo_id uuid NOT NULL REFERENCES public.insumos(id) ON DELETE RESTRICT,
  quantidade numeric(12,4) NOT NULL DEFAULT 0,
  perda_percentual numeric(5,2) NOT NULL DEFAULT 0,
  created_at timestamptz NOT NULL DEFAULT now()
);
GRANT SELECT, INSERT, UPDATE, DELETE ON public.ficha_itens TO authenticated;
GRANT ALL ON public.ficha_itens TO service_role;
ALTER TABLE public.ficha_itens ENABLE ROW LEVEL SECURITY;
CREATE POLICY "ficha_itens_select" ON public.ficha_itens FOR SELECT TO authenticated USING (true);
CREATE POLICY "ficha_itens_write" ON public.ficha_itens FOR ALL TO authenticated
  USING (public.pode_editar(auth.uid())) WITH CHECK (public.pode_editar(auth.uid()));

-- COMPRAS
CREATE TABLE public.pedidos_compra (
  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  fornecedor_id uuid REFERENCES public.fornecedores(id) ON DELETE SET NULL,
  numero serial,
  status text NOT NULL DEFAULT 'rascunho',
  data_pedido date NOT NULL DEFAULT current_date,
  data_prevista date,
  observacao text,
  created_by uuid REFERENCES auth.users(id) ON DELETE SET NULL,
  created_at timestamptz NOT NULL DEFAULT now(),
  updated_at timestamptz NOT NULL DEFAULT now()
);
GRANT SELECT, INSERT, UPDATE, DELETE ON public.pedidos_compra TO authenticated;
GRANT ALL ON public.pedidos_compra TO service_role;
ALTER TABLE public.pedidos_compra ENABLE ROW LEVEL SECURITY;
CREATE POLICY "pedidos_select" ON public.pedidos_compra FOR SELECT TO authenticated USING (true);
CREATE POLICY "pedidos_write" ON public.pedidos_compra FOR ALL TO authenticated
  USING (public.pode_editar(auth.uid())) WITH CHECK (public.pode_editar(auth.uid()));
CREATE TRIGGER trg_pedidos_updated BEFORE UPDATE ON public.pedidos_compra FOR EACH ROW EXECUTE FUNCTION public.set_updated_at();

CREATE TABLE public.pedido_itens (
  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  pedido_id uuid NOT NULL REFERENCES public.pedidos_compra(id) ON DELETE CASCADE,
  insumo_id uuid NOT NULL REFERENCES public.insumos(id) ON DELETE RESTRICT,
  quantidade numeric(12,3) NOT NULL DEFAULT 0,
  custo_unitario numeric(12,4) NOT NULL DEFAULT 0,
  created_at timestamptz NOT NULL DEFAULT now()
);
GRANT SELECT, INSERT, UPDATE, DELETE ON public.pedido_itens TO authenticated;
GRANT ALL ON public.pedido_itens TO service_role;
ALTER TABLE public.pedido_itens ENABLE ROW LEVEL SECURITY;
CREATE POLICY "pedido_itens_select" ON public.pedido_itens FOR SELECT TO authenticated USING (true);
CREATE POLICY "pedido_itens_write" ON public.pedido_itens FOR ALL TO authenticated
  USING (public.pode_editar(auth.uid())) WITH CHECK (public.pode_editar(auth.uid()));

-- ESTOQUE
CREATE TABLE public.movimentos_estoque (
  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  insumo_id uuid NOT NULL REFERENCES public.insumos(id) ON DELETE CASCADE,
  tipo text NOT NULL DEFAULT 'entrada',
  quantidade numeric(12,3) NOT NULL DEFAULT 0,
  custo_unitario numeric(12,4) NOT NULL DEFAULT 0,
  origem text NOT NULL DEFAULT 'manual',
  observacao text,
  created_by uuid REFERENCES auth.users(id) ON DELETE SET NULL,
  created_at timestamptz NOT NULL DEFAULT now()
);
GRANT SELECT, INSERT, UPDATE, DELETE ON public.movimentos_estoque TO authenticated;
GRANT ALL ON public.movimentos_estoque TO service_role;
ALTER TABLE public.movimentos_estoque ENABLE ROW LEVEL SECURITY;
CREATE POLICY "movimentos_select" ON public.movimentos_estoque FOR SELECT TO authenticated USING (true);
CREATE POLICY "movimentos_write" ON public.movimentos_estoque FOR ALL TO authenticated
  USING (public.pode_editar(auth.uid())) WITH CHECK (public.pode_editar(auth.uid()));

-- aplica o movimento no saldo do insumo
CREATE OR REPLACE FUNCTION public.aplicar_movimento()
RETURNS trigger LANGUAGE plpgsql SECURITY DEFINER SET search_path = public AS $$
BEGIN
  IF NEW.tipo = 'entrada' THEN
    UPDATE public.insumos SET estoque_atual = estoque_atual + NEW.quantidade,
      custo_unitario = CASE WHEN NEW.custo_unitario > 0 THEN NEW.custo_unitario ELSE custo_unitario END
      WHERE id = NEW.insumo_id;
  ELSIF NEW.tipo = 'saida' THEN
    UPDATE public.insumos SET estoque_atual = estoque_atual - NEW.quantidade WHERE id = NEW.insumo_id;
  ELSE
    UPDATE public.insumos SET estoque_atual = NEW.quantidade WHERE id = NEW.insumo_id;
  END IF;
  RETURN NEW;
END; $$;
CREATE TRIGGER trg_aplicar_movimento AFTER INSERT ON public.movimentos_estoque
  FOR EACH ROW EXECUTE FUNCTION public.aplicar_movimento();

-- CONSUMO / PRODUCAO
CREATE TABLE public.producoes (
  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  ficha_id uuid NOT NULL REFERENCES public.fichas_tecnicas(id) ON DELETE RESTRICT,
  quantidade numeric(12,3) NOT NULL DEFAULT 1,
  data date NOT NULL DEFAULT current_date,
  observacao text,
  created_by uuid REFERENCES auth.users(id) ON DELETE SET NULL,
  created_at timestamptz NOT NULL DEFAULT now()
);
GRANT SELECT, INSERT, UPDATE, DELETE ON public.producoes TO authenticated;
GRANT ALL ON public.producoes TO service_role;
ALTER TABLE public.producoes ENABLE ROW LEVEL SECURITY;
CREATE POLICY "producoes_select" ON public.producoes FOR SELECT TO authenticated USING (true);
CREATE POLICY "producoes_insert" ON public.producoes FOR INSERT TO authenticated WITH CHECK (auth.uid() IS NOT NULL);
CREATE POLICY "producoes_update" ON public.producoes FOR UPDATE TO authenticated
  USING (public.pode_editar(auth.uid()) OR created_by = auth.uid())
  WITH CHECK (public.pode_editar(auth.uid()) OR created_by = auth.uid());
CREATE POLICY "producoes_delete" ON public.producoes FOR DELETE TO authenticated
  USING (public.pode_editar(auth.uid()) OR created_by = auth.uid());

-- baixa automática de estoque conforme a ficha técnica
CREATE OR REPLACE FUNCTION public.baixar_estoque_producao()
RETURNS trigger LANGUAGE plpgsql SECURITY DEFINER SET search_path = public AS $$
DECLARE item record;
BEGIN
  FOR item IN
    SELECT fi.insumo_id, fi.quantidade * (1 + fi.perda_percentual/100.0) AS qtd
    FROM public.ficha_itens fi WHERE fi.ficha_id = NEW.ficha_id
  LOOP
    INSERT INTO public.movimentos_estoque (insumo_id, tipo, quantidade, origem, observacao, created_by)
    VALUES (item.insumo_id, 'saida', item.qtd * NEW.quantidade, 'producao', 'Baixa automática por produção', NEW.created_by);
  END LOOP;
  RETURN NEW;
END; $$;
CREATE TRIGGER trg_baixar_estoque_producao AFTER INSERT ON public.producoes
  FOR EACH ROW EXECUTE FUNCTION public.baixar_estoque_producao();

-- DADOS DE DEMONSTRACAO
INSERT INTO public.fornecedores (id, nome, cnpj, contato, telefone, email, prazo_entrega_dias) VALUES
 ('11111111-1111-1111-1111-111111111101','Hortifruti Vale Verde','12.345.678/0001-90','Marcos Lima','(11) 3344-1200','contato@valeverde.com.br',2),
 ('11111111-1111-1111-1111-111111111102','Frigorífico Boa Carne','23.456.789/0001-01','Ana Souza','(11) 3355-4400','vendas@boacarne.com.br',3),
 ('11111111-1111-1111-1111-111111111103','Distribuidora Secos & Molhados','34.567.890/0001-12','Paulo Reis','(11) 3366-7788','pedidos@secosmolhados.com.br',5),
 ('11111111-1111-1111-1111-111111111104','Laticínios Serra Azul','45.678.901/0001-23','Carla Nunes','(11) 3377-9900','comercial@serraazul.com.br',4);

INSERT INTO public.insumos (id, nome, categoria, unidade, custo_unitario, estoque_atual, estoque_minimo, fornecedor_id) VALUES
 ('22222222-2222-2222-2222-222222222201','Filé mignon','Carnes','kg',89.9000,18.500,10.000,'11111111-1111-1111-1111-111111111102'),
 ('22222222-2222-2222-2222-222222222202','Peito de frango','Carnes','kg',22.5000,32.000,15.000,'11111111-1111-1111-1111-111111111102'),
 ('22222222-2222-2222-2222-222222222203','Arroz arbóreo','Secos','kg',18.9000,25.000,12.000,'11111111-1111-1111-1111-111111111103'),
 ('22222222-2222-2222-2222-222222222204','Cebola','Hortifruti','kg',5.4000,14.000,8.000,'11111111-1111-1111-1111-111111111101'),
 ('22222222-2222-2222-2222-222222222205','Alho','Hortifruti','kg',32.0000,3.200,4.000,'11111111-1111-1111-1111-111111111101'),
 ('22222222-2222-2222-2222-222222222206','Creme de leite fresco','Laticínios','L',24.9000,9.000,6.000,'11111111-1111-1111-1111-111111111104'),
 ('22222222-2222-2222-2222-222222222207','Queijo parmesão','Laticínios','kg',72.0000,4.500,5.000,'11111111-1111-1111-1111-111111111104'),
 ('22222222-2222-2222-2222-222222222208','Manteiga','Laticínios','kg',48.0000,7.000,4.000,'11111111-1111-1111-1111-111111111104'),
 ('22222222-2222-2222-2222-222222222209','Azeite extra virgem','Mercearia','L',54.0000,6.000,3.000,'11111111-1111-1111-1111-111111111103'),
 ('22222222-2222-2222-2222-222222222210','Tomate italiano','Hortifruti','kg',9.8000,11.000,8.000,'11111111-1111-1111-1111-111111111101'),
 ('22222222-2222-2222-2222-222222222211','Farinha de trigo','Secos','kg',6.2000,40.000,20.000,'11111111-1111-1111-1111-111111111103'),
 ('22222222-2222-2222-2222-222222222212','Vinho branco seco','Bebidas','L',34.0000,5.000,3.000,'11111111-1111-1111-1111-111111111103');

INSERT INTO public.fichas_tecnicas (id, nome, categoria, rendimento, unidade_rendimento, modo_preparo, preco_venda) VALUES
 ('33333333-3333-3333-3333-333333333301','Risoto de Parmesão','Prato principal',4,'porções','Refogue a cebola e o alho na manteiga, acrescente o arroz arbóreo, deglaceie com vinho branco e cozinhe adicionando caldo aos poucos. Finalize com creme de leite e parmesão.',68.00),
 ('33333333-3333-3333-3333-333333333302','Filé ao Molho Madeira','Prato principal',2,'porções','Sele o filé mignon na manteiga, reserve. No mesmo fundo prepare o molho com cebola, vinho e creme de leite. Sirva imediatamente.',96.00),
 ('33333333-3333-3333-3333-333333333303','Frango Grelhado com Legumes','Prato principal',4,'porções','Tempere o peito de frango com alho e azeite, grelhe e sirva com tomate confitado.',52.00),
 ('33333333-3333-3333-3333-333333333304','Molho de Tomate da Casa','Base',5,'litros','Refogue cebola e alho no azeite, adicione o tomate italiano e cozinhe em fogo baixo por 90 minutos.',0.00);

INSERT INTO public.ficha_itens (ficha_id, insumo_id, quantidade, perda_percentual) VALUES
 ('33333333-3333-3333-3333-333333333301','22222222-2222-2222-2222-222222222203',0.4000,2),
 ('33333333-3333-3333-3333-333333333301','22222222-2222-2222-2222-222222222207',0.1200,0),
 ('33333333-3333-3333-3333-333333333301','22222222-2222-2222-2222-222222222208',0.0800,0),
 ('33333333-3333-3333-3333-333333333301','22222222-2222-2222-2222-222222222204',0.1000,12),
 ('33333333-3333-3333-3333-333333333301','22222222-2222-2222-2222-222222222212',0.1500,0),
 ('33333333-3333-3333-3333-333333333301','22222222-2222-2222-2222-222222222206',0.2000,0),
 ('33333333-3333-3333-3333-333333333302','22222222-2222-2222-2222-222222222201',0.4000,8),
 ('33333333-3333-3333-3333-333333333302','22222222-2222-2222-2222-222222222208',0.0500,0),
 ('33333333-3333-3333-3333-333333333302','22222222-2222-2222-2222-222222222212',0.1000,0),
 ('33333333-3333-3333-3333-333333333302','22222222-2222-2222-2222-222222222206',0.1500,0),
 ('33333333-3333-3333-3333-333333333303','22222222-2222-2222-2222-222222222202',0.7000,10),
 ('33333333-3333-3333-3333-333333333303','22222222-2222-2222-2222-222222222209',0.0600,0),
 ('33333333-3333-3333-3333-333333333303','22222222-2222-2222-2222-222222222205',0.0200,15),
 ('33333333-3333-3333-3333-333333333303','22222222-2222-2222-2222-222222222210',0.5000,10),
 ('33333333-3333-3333-3333-333333333304','22222222-2222-2222-2222-222222222210',6.0000,12),
 ('33333333-3333-3333-3333-333333333304','22222222-2222-2222-2222-222222222204',0.5000,12),
 ('33333333-3333-3333-3333-333333333304','22222222-2222-2222-2222-222222222205',0.0800,15),
 ('33333333-3333-3333-3333-333333333304','22222222-2222-2222-2222-222222222209',0.1500,0);

INSERT INTO public.pedidos_compra (id, fornecedor_id, status, data_pedido, data_prevista, observacao) VALUES
 ('44444444-4444-4444-4444-444444444401','11111111-1111-1111-1111-111111111102','recebido', current_date - 6, current_date - 3,'Reposição semanal de proteínas'),
 ('44444444-4444-4444-4444-444444444402','11111111-1111-1111-1111-111111111101','aprovado', current_date - 1, current_date + 1,'Hortifruti da semana'),
 ('44444444-4444-4444-4444-444444444403','11111111-1111-1111-1111-111111111104','rascunho', current_date, current_date + 4,'Cotação de laticínios');

INSERT INTO public.pedido_itens (pedido_id, insumo_id, quantidade, custo_unitario) VALUES
 ('44444444-4444-4444-4444-444444444401','22222222-2222-2222-2222-222222222201',10.000,89.9000),
 ('44444444-4444-4444-4444-444444444401','22222222-2222-2222-2222-222222222202',20.000,22.5000),
 ('44444444-4444-4444-4444-444444444402','22222222-2222-2222-2222-222222222204',15.000,5.4000),
 ('44444444-4444-4444-4444-444444444402','22222222-2222-2222-2222-222222222210',12.000,9.8000),
 ('44444444-4444-4444-4444-444444444402','22222222-2222-2222-2222-222222222205',4.000,32.0000),
 ('44444444-4444-4444-4444-444444444403','22222222-2222-2222-2222-222222222207',6.000,72.0000),
 ('44444444-4444-4444-4444-444444444403','22222222-2222-2222-2222-222222222206',10.000,24.9000);

INSERT INTO public.producoes (ficha_id, quantidade, data, observacao) VALUES
 ('33333333-3333-3333-3333-333333333301',6, current_date - 2,'Serviço do jantar'),
 ('33333333-3333-3333-3333-333333333303',8, current_date - 1,'Almoço executivo'),
 ('33333333-3333-3333-3333-333333333302',4, current_date,'Jantar à la carte');REVOKE ALL ON FUNCTION public.handle_new_user() FROM PUBLIC, anon, authenticated;
REVOKE ALL ON FUNCTION public.set_updated_at() FROM PUBLIC, anon, authenticated;
REVOKE ALL ON FUNCTION public.aplicar_movimento() FROM PUBLIC, anon, authenticated;
REVOKE ALL ON FUNCTION public.baixar_estoque_producao() FROM PUBLIC, anon, authenticated;
REVOKE ALL ON FUNCTION public.has_role(uuid, public.app_role) FROM PUBLIC, anon;
REVOKE ALL ON FUNCTION public.pode_editar(uuid) FROM PUBLIC, anon;
GRANT EXECUTE ON FUNCTION public.has_role(uuid, public.app_role) TO authenticated;
GRANT EXECUTE ON FUNCTION public.pode_editar(uuid) TO authenticated;