-- =============================================================================
-- Reporte de pagos para que el DUEÑO pueda filtrar por metodo (ej. Pago Movil)
-- y ver cada pago individual con su referencia, para cruzarlo contra su estado
-- de cuenta real. Unifica las 2 fuentes de pago que hoy viven separadas:
-- `pagos` (pickup/delivery/mostrador) y `pagos_mesa` (cuentas de mesa).
-- Pedido por Gilberto 2026-07-22, junto con la subida de comprobante en el POS.
-- =============================================================================

CREATE OR REPLACE FUNCTION public.reporte_pagos(p_restaurante_id uuid, p_desde timestamptz, p_metodo text DEFAULT NULL)
RETURNS TABLE(
  origen text,
  fecha timestamptz,
  descripcion text,
  metodo text,
  monto_usd numeric,
  referencia text,
  comprobante_url text,
  estado text
)
LANGUAGE plpgsql
STABLE SECURITY DEFINER
SET search_path TO 'public'
AS $function$
begin
  if not (fn_es_dueno_de(p_restaurante_id) or fn_es_admin()) then
    raise exception 'Sin permiso';
  end if;

  return query
  select 'pedido'::text as origen, p.recibido_en as fecha, p.codigo as descripcion, pg.metodo, pg.monto_usd,
         pg.referencia, pg.comprobante_url, pg.estado
    from public.pagos pg
    join public.pedidos p on p.id = pg.pedido_id
   where p.restaurante_id = p_restaurante_id
     and p.recibido_en >= p_desde
     and (p_metodo is null or pg.metodo = p_metodo)
  union all
  select 'mesa'::text, pm.creado_en, 'Mesa ' || c.mesa, pm.metodo, pm.monto_usd, pm.referencia, pm.comprobante_url,
         case when pm.verificado then 'confirmado' else 'verificando' end
    from public.pagos_mesa pm
    join public.cuentas_mesa c on c.id = pm.cuenta_id
   where pm.restaurante_id = p_restaurante_id
     and pm.creado_en >= p_desde
     and (p_metodo is null or pm.metodo = p_metodo)
  order by fecha desc;
end;
$function$
;
