-- ============================================================
-- Gustito Xpress — HISTORIAL DE MESAS (registro de mesas cobradas y liberadas).
--
-- Al cobrar y liberar, la cuenta pasa a 'cerrada' y desaparece de
-- mis_cuentas_mesa (que solo trae las activas). No habia donde ver el
-- registro. Esta RPC lista las cuentas CERRADAS del restaurante en un
-- rango de dias, con su total, lo cobrado por partes, mesero y personas.
-- ============================================================
create or replace function public.historial_mesas(p_restaurante_id uuid, p_dias int default 1)
returns table(
  id uuid, mesa text, abierta_en timestamptz, cerrada_en timestamptz,
  total_usd numeric, cobrado_usd numeric, n_pedidos int,
  mesero_nombre text, comensales int, modo_cuenta text, metodo_pago text, tasa_bs numeric
)
language sql stable security definer set search_path to 'public'
as $function$
  select c.id, c.mesa, c.abierta_en, c.cerrada_en,
    coalesce((select sum(p.total_usd) from public.pedidos p where p.cuenta_id = c.id and p.estado <> 'cancelado'), 0),
    coalesce((select sum(pm.monto_usd) from public.pagos_mesa pm where pm.cuenta_id = c.id), 0),
    (select count(*)::int from public.pedidos p where p.cuenta_id = c.id and p.estado <> 'cancelado'),
    c.mesero_nombre, c.comensales, c.modo_cuenta, c.metodo_pago, r.tasa_bs
  from public.cuentas_mesa c
  join public.restaurantes r on r.id = c.restaurante_id
  where c.restaurante_id = p_restaurante_id
    and c.estado = 'cerrada'
    and c.cerrada_en >= now() - make_interval(days => greatest(1, coalesce(p_dias, 1)))
    and (fn_es_staff_de(c.restaurante_id) or fn_es_admin())
  order by c.cerrada_en desc;
$function$;
grant execute on function public.historial_mesas(uuid, int) to authenticated;
