-- EL PANEL VE EL RESPALDO DE CADA ESTACION (PLAN_INFRAESTRUCTURA, trabajo 4).
--
-- La estacion piloto estuvo con CERO lineas respaldadas y nadie lo vio: el
-- libro fiscal existia en UN solo disco. El deposito sabe cuanto tiene de cada
-- emisor y el latido sabe cuantos documentos lleva el libro; lo unico que
-- faltaba era ponerlos en la misma fila para que el operador de la imprenta lo
-- VEA sin preguntar.
--
-- RETURNS TABLE cambia de forma: DROP previo obligatorio (CREATE OR REPLACE no
-- cambia el tipo de retorno).

drop function fiscal.estaciones_vivas();

create function fiscal.estaciones_vivas()
returns table(
  rif text, razon_social text, nombre text, version text, equipo text,
  ultimo_latido timestamptz, minutos_sin_reportar int, pendientes int,
  pendientes_nube int, libro_integro boolean,
  respaldo_lineas int, respaldo_ultimo timestamptz, respaldo_atrasado boolean
)
language sql stable security definer set search_path to 'fiscal', 'public'
as $$
  select e.rif, e.razon_social, s.nombre, s.version, s.equipo, s.ultimo_latido,
         (extract(epoch from (now() - s.ultimo_latido)) / 60)::int,
         s.pendientes,
         (select count(*)::int from fiscal.cola_gustito c
           where c.emisor_id = e.id and c.estado = 'pendiente'),
         s.libro_integro,
         coalesce(r.lineas, 0),
         r.ultimo,
         -- Atrasado: el latido dice que el libro lleva documentos y el deposito
         -- va por detras (o vacio). La cabecera (seq 0) no cuenta como asiento.
         (coalesce(s.ultimo_documento, 0) > 0 and coalesce(r.max_seq, 0) < s.ultimo_documento)
    from fiscal.estaciones s
    join fiscal.emisores e on e.id = s.emisor_id
    left join lateral (
      select count(*)::int as lineas, max(re.recibido_en) as ultimo, max(re.seq) as max_seq
        from fiscal.respaldo re where re.emisor_id = e.id
    ) r on true
   order by s.ultimo_latido;
$$;
