-- ============================================================
-- Gustito Xpress — al CERRAR (cobrar) una mesa, sus pedidos quedan "entregado".
--
-- "Ventas de hoy" y el reporte cuentan pedidos en estado 'entregado'. Los de
-- MESA se quedaban en 'confirmado/preparando/listo' aunque la mesa ya se cobro
-- y cerro, asi que NO contaban como venta. Ahora, cuando la cuenta pasa a
-- 'cerrada', sus pedidos (no cancelados) pasan a 'entregado': cuentan como
-- venta y salen de la cocina. Trigger = cubre cualquier via de cierre
-- (cobrar_y_cerrar_mesa, verificar_pago_cliente, cerrar_cuenta_mesa).
-- ============================================================
create or replace function public.tg_mesa_cerrada_entregar()
returns trigger language plpgsql security definer set search_path to 'public' as $$
begin
  if new.estado = 'cerrada' and old.estado is distinct from 'cerrada' then
    update public.pedidos
       set estado = 'entregado', entregado_en = now()
     where cuenta_id = new.id and estado not in ('entregado', 'cancelado');
  end if;
  return null;
end $$;

drop trigger if exists trg_mesa_cerrada_entregar on public.cuentas_mesa;
create trigger trg_mesa_cerrada_entregar
  after update on public.cuentas_mesa
  for each row execute function public.tg_mesa_cerrada_entregar();

-- Backfill: mesas YA cerradas cuyos pedidos quedaron sin entregar (para que el
-- historial/reportes cuadren). Solo toca los que no estan entregados/cancelados.
update public.pedidos p
   set estado = 'entregado', entregado_en = coalesce(p.entregado_en, now())
  from public.cuentas_mesa c
 where c.id = p.cuenta_id and c.estado = 'cerrada'
   and p.estado not in ('entregado', 'cancelado');
