dbo.monitoreo_lista

Description

Properties

Name Value
ANSI Nulls ON

True

Quoted Identifier ON

True

Encrypted

False

Execute As
Assembly

Parameters

4
Name Data Type Length Description
@p_client_id int 4
@p_activo bit 1
@p_parte int 4
@p_cuit varchar 20

SQL Script

Copy
SET QUOTED_IDENTIFIER, ANSI_NULLS ON
GO

/*
exec [monitoreo_lista] 806892136,1
exec [monitoreo_lista] 806892136,0
exec monitoreo_lista '2254875',1,1,'20336165009'

select * from clientes where cliente = 110864291
SELECT fecha, tabla, id_tabla, id_monitoreo
  FROM monitoreos_resultados
 WHERE Cuit = '30710074611'
   and Fecha > getdate() - 365 
   and Fecha > '2022-02-23'
   and seccion_mantenimiento in (select item from dbo.DelimitedSplit8K( '10,11,18,2,6,8,9',',')) 
 order by fecha desc, id_monitoreo desc




*/

/*
Se pasa como parámetro el código de cliente,
devuelve la lista de todos los CUITs en monitoreo aún vigente,
y la fecha de última novedad encontrada (si es del último año)

va devolviendo de a 1000 cuits, porque cuando son muchos, tarda demasiado y el php muere por timeout
mandar como tercer paramentro: parte 1, despues 2, despues 3.... hasta que en el campo mas_datos devuelva

06/02/2025: No se devuelve mas de a grupos. Pero se devuelven solo 5000 registros, porque la Datatable se marea con mas de 5000 

*/



CREATE OR ALTER PROCEDURE dbo.monitoreo_lista
@p_client_id int, 
@p_activo bit = 1,
@p_parte int = 1, 
@p_cuit varchar(20) = null 

AS

BEGIN 
 
    SET NOCOUNT ON;
 declare @mas_datos int = 0

 /* 06/02/2025: No se hacen más los grupos de a 1000, se dicidió que solo tome 5000 reg 
 
  declare @cuits table (id int identity, cuit varchar(50)) 
  if @p_activo = 1 
  begin
  insert into @cuits (cuit)
  select distinct cuit from monitoreos where cliente = @p_client_id 
  and monitoreos.visible = 1
  and monitoreos.fecha_desde <= getdate() and monitoreos.fecha_vigencia_mantenimiento >= getdate()
  and monitoreos.cuit = iif(@p_cuit is null, monitoreos.cuit, @p_cuit) 
  order by cuit
  end
  else 
  begin
  insert into @cuits (cuit)
  select distinct cuit from monitoreos where cliente = @p_client_id 
  and (monitoreos.visible = 0 or monitoreos.fecha_vigencia_mantenimiento < getdate())
  and monitoreos.cuit = iif(@p_cuit is null, monitoreos.cuit, @p_cuit) 
  and not exists (select * 
                    from monitoreos mb 
    where mb.cliente = monitoreos.cliente and mb.cuit = monitoreos.cuit 
                    and mb.seccion_mantenimiento = monitoreos.seccion_mantenimiento 
    and mb.visible = 1 and mb.fecha_vigencia_mantenimiento >= getdate()) 
  order by cuit
  end 
  declare @mas_datos int = 0
  if (select COUNT(*) from @cuits
       where id between (@p_parte * 1000) - 999 and (@p_parte * 1000)) = 0
  begin
   select @mas_datos as mas_datos, 'sin datos' as error
   return
  end 
 
  if (select COUNT(*) from @cuits
       where id > (@p_parte * 1000)) > 0 
  begin
   set @mas_datos = 1
  end 
  */


 /*
  select 
  nombre_persona,
  cuit,
  convert(date,iif(max(monitoreos.fecha_ultimo_procesamiento) < getdate()-365,null, max(monitoreos.fecha_ultimo_procesamiento))) as ultima_novedad, 
  convert(date,max(monitoreos.fecha_vigencia_mantenimiento)) as fin_monitoreo
 
  from monitoreos 
 
  left join padrones on (padrones.identificacion = cuit and 
                         padrones.habilitado = 1 and 
     padrones.identificador in (select identificador from identificadores where country_code = 'AR'))
 
  where monitoreos.cliente = @p_client_id 
  and monitoreos.visible = 1
  and monitoreos.fecha_desde <= getdate() and monitoreos.fecha_vigencia_mantenimiento >= getdate()
  --and (monitoreos.fecha_ultimo_procesamiento is null or monitoreos.fecha_ultimo_procesamiento between monitoreos.fecha_desde and monitoreos.fecha_vigencia_mantenimiento)
  group by cuit, nombre_persona 
  order by ultima_novedad desc, nombre_persona asc
  */


 declare @resultado table (nombre_persona varchar(500), cuit varchar(22), identificador varchar(20), id_padron int, 
                           ultima_novedad date, fin_monitoreo date, inicio_monitoreo date, 
                           lista varchar(512),comentarios varchar(max),trazabilidad varchar(max)) 
 declare @nombre varchar(500),
      @cuit varchar(22), 
   @ultima_novedad date, 
   @fin_monitoreo date, 
   @inicio_monitoreo date, 
   @seccion int, 
   @lista varchar(512),
   @comentarios varchar(max), 
   @trazabilidad varchar(max)
 declare @fecha datetime, @tabla varchar(100), @id_tabla int, @id_monitoreo int
 if @p_activo = 1 
 begin 
 declare @fecha_modificacion date 
 declare C_Cursor CURSOR FOR 
  select  
  nombre_persona,
  cuit, identificadores.abreviatura, padrones.id_padron,
  dd.lista_secciones as lista, 
  dd2.comentarios, dd3.trazabilidad, 
  MAX(convert(date,fecha_desde)) as fecha_desde, 
  MAX(convert(date,fecha_vigencia_mantenimiento)) as fin_monitoreo,

  MAX(convert(date,fecha_modificacion)) as fecha_modificacion
  from monitoreos 
 
  left join padrones on (padrones.identificacion = cuit and 
          padrones.habilitado = 1 and 
          padrones.identificador in (select identificador from identificadores where country_code = 'AR'))

  left join identificadores on (identificadores.identificador = padrones.identificador)          

  left join (select cliente as cli_sec, cuit as cuit_sec, fecha_vigencia_mantenimiento as fin, lista_secciones=STUFF(
        (SELECT distinct ','+seccion_mantenimiento  AS [text()]
        FROM monitoreos XT
        WHERE XT.cuit = T.cuit and XT.cliente = T.cliente and XT.visible = 1
        order by [text()]
        FOR XML PATH('')), 1,1, '') 
      FROM monitoreos T where T.visible = 1
      GROUP BY cliente, cuit, visible, fecha_vigencia_mantenimiento) dd
            on (dd.cuit_sec = monitoreos.cuit  
             and dd.cli_sec = monitoreos.cliente
          and dd.fin >= getdate())

  left join (select cliente as cli_sec, cuit as cuit_sec, fecha_vigencia_mantenimiento as fin, comentarios=STUFF(
        (SELECT distinct '|'+observaciones_cliente  AS [text()]
        FROM monitoreos XT
        WHERE XT.cuit = T.cuit and XT.cliente = T.cliente and XT.visible = 1
        order by [text()]
        FOR XML PATH('')), 1,1, '') 
      FROM monitoreos T where T.visible = 1
      GROUP BY cliente, cuit, fecha_vigencia_mantenimiento) dd2
            on (dd2.cuit_sec = monitoreos.cuit  
             and dd2.cli_sec = monitoreos.cliente
          and dd2.fin >= getdate())

  left join (select cliente as cli_sec, cuit as cuit_sec, trazabilidad=STUFF(
     (SELECT '|'+ convert(varchar,created,103) + ' ' + iif(last_name is null and first_name is null, username, 
       isnull(last_name,'') + ' ' + isnull(first_name,'')) + ': ' + 
             detalle  AS [text()]
      FROM trazabilidad_monitoreos XT
      left join users on users.user_id = XT.user_id
      WHERE XT.cuit = T.cuit and XT.cliente = T.cliente
      order by created desc
      FOR XML PATH('')), 1,1, '') 
    FROM trazabilidad_monitoreos T 
    GROUP BY cliente, cuit
    ) dd3
      on (dd3.cuit_sec = monitoreos.cuit  
       and dd3.cli_sec = monitoreos.cliente
       )



  where monitoreos.cliente = @p_client_id 
  and monitoreos.visible = 1
  and monitoreos.fecha_desde <= getdate() and monitoreos.fecha_vigencia_mantenimiento >= getdate()
  and nombre_persona is not null -- para saber que existe en padron
  --and cuit in (select cuit from @cuits where id between (@p_parte * 1000) - 999 and (@p_parte * 1000))
  and monitoreos.cuit = iif(@p_cuit is null, monitoreos.cuit, @p_cuit) 

  --order by nombre_persona
  --order by cuit
  group by  
  nombre_persona,
  cuit, identificadores.abreviatura, padrones.id_padron,
  dd.lista_secciones, 
  dd2.comentarios, 
  dd3.trazabilidad
  order by fecha_modificacion desc 
  

 end
 else
 begin 

 declare C_Cursor CURSOR FOR 
  select  
  nombre_persona,
  cuit, identificadores.abreviatura, padrones.id_padron,
  dd.lista_secciones as lista, 
  dd2.comentarios, 
  dd3.trazabilidad, 
  MAX(convert(date,fecha_desde)) as fecha_desde, 
  MAX(convert(date,fecha_vigencia_mantenimiento)) as fin_monitoreo,
  MAX(convert(date,fecha_modificacion)) as fecha_modificacion
  from monitoreos 
 
  left join padrones on (padrones.identificacion = cuit and 
          padrones.habilitado = 1 and 
          padrones.identificador in (select identificador from identificadores where country_code = 'AR'))

  left join identificadores on (identificadores.identificador = padrones.identificador)          


  left join (select cliente as cli_sec, cuit as cuit_sec, fecha_vigencia_mantenimiento as fin, lista_secciones=STUFF(
        (SELECT distinct ','+seccion_mantenimiento  AS [text()]
        FROM monitoreos XT
        WHERE XT.cuit = T.cuit and XT.cliente = T.cliente and XT.visible = 0
        and not exists (select * from monitoreos mb where mb.cliente = XT.cliente and mb.cuit = XT.cuit and mb.seccion_mantenimiento = XT.seccion_mantenimiento and mb.visible = 1 and mb.fecha_vigencia_mantenimiento >= getdate()) 

        order by [text()]
        FOR XML PATH('')), 1,1, '') 
      FROM monitoreos T where T.visible = 0
      GROUP BY cliente, cuit, visible, fecha_vigencia_mantenimiento) dd
            on (dd.cuit_sec = monitoreos.cuit  
             and dd.cli_sec = monitoreos.cliente
          and dd.fin >= getdate())

  left join (select cliente as cli_sec, cuit as cuit_sec, fecha_vigencia_mantenimiento as fin, comentarios=STUFF(
        (SELECT distinct '|'+observaciones_cliente  AS [text()]
        FROM monitoreos XT
        WHERE XT.cuit = T.cuit and XT.cliente = T.cliente and XT.visible = 0
        and not exists (select * from monitoreos mb where mb.cliente = XT.cliente and mb.cuit = XT.cuit and mb.seccion_mantenimiento = XT.seccion_mantenimiento and mb.visible = 1 and mb.fecha_vigencia_mantenimiento >= getdate()) 
        order by [text()]
        FOR XML PATH('')), 1,1, '') 
      FROM monitoreos T where T.visible = 0
      GROUP BY cliente, cuit, visible, fecha_vigencia_mantenimiento) dd2
            on (dd2.cuit_sec = monitoreos.cuit  
             and dd2.cli_sec = monitoreos.cliente
          and dd2.fin >= getdate())
  
  left join (select cliente as cli_sec, cuit as cuit_sec, trazabilidad=STUFF(
     (SELECT '|'+ convert(varchar,created,103) + ' ' + iif(last_name is null and first_name is null, username, 
       isnull(last_name,'') + ' ' + isnull(first_name,'')) + ': ' + 
             detalle  AS [text()]
      FROM trazabilidad_monitoreos XT
      left join users on users.user_id = XT.user_id
      WHERE XT.cuit = T.cuit and XT.cliente = T.cliente
      order by created desc
      FOR XML PATH('')), 1,1, '') 
    FROM trazabilidad_monitoreos T 
    GROUP BY cliente, cuit
    ) dd3
      on (dd3.cuit_sec = monitoreos.cuit  
       and dd3.cli_sec = monitoreos.cliente
       )

  where monitoreos.cliente = @p_client_id 
  and nombre_persona is not null -- para saber que existe en padron
  and (monitoreos.visible = 0 or monitoreos.fecha_vigencia_mantenimiento < getdate())
  -- Si vencieron hace mas de 1 año, chau, no los mostramos... 
  and monitoreos.fecha_vigencia_mantenimiento >= getdate() - 365
  -- 
  and not exists (select * from monitoreos mb where mb.cliente = monitoreos.cliente and mb.cuit = monitoreos.cuit and mb.seccion_mantenimiento = monitoreos.seccion_mantenimiento and mb.visible = 1 and mb.fecha_vigencia_mantenimiento >= getdate()) 
  --and cuit in (select cuit from @cuits where id between (@p_parte * 1000) - 999 and (@p_parte * 1000))
        and monitoreos.cuit = iif(@p_cuit is null, monitoreos.cuit, @p_cuit) 

  --order by nombre_persona
  --order by cuit
  group by  
  nombre_persona,
  cuit, identificadores.abreviatura, padrones.id_padron,
  dd.lista_secciones,
  dd2.comentarios, 
  dd3.trazabilidad
  order by fecha_modificacion desc 


 end 

 declare @identificador varchar(20), @id_padron int 
 OPEN C_Cursor
 FETCH NEXT FROM C_Cursor INTO @nombre, @cuit, @identificador, @id_padron, @lista, @comentarios, @trazabilidad, @inicio_monitoreo, @fin_monitoreo, @fecha_modificacion 
 WHILE @@fetch_status = 0
 BEGIN 
  
  insert into @resultado(nombre_persona, cuit, identificador, id_padron,
                            ultima_novedad, fin_monitoreo, inicio_monitoreo,
                            lista,comentarios,trazabilidad)  
       values (@nombre, @cuit,@identificador,@id_padron, null, @fin_monitoreo, @inicio_monitoreo, @lista, @comentarios,@trazabilidad)

  if @p_activo = 1 or @p_activo = 0 -- 07/02/2025: solo se hacia para activos, pero ahora se hace para inactivos también 
  begin
   --> Busco fecha de ultima novedad 
   -- las fechas de novedad las corroboramos con las novedades registradas en monitoreos_resultados, 
   -- porque por ejemplo de cendeu tenemos que filtrar que haya cambiado la situacion
   -- y además solo tenemos que mostrar novedades informadas en el último año (y que sean posteriores al inicio del monitoreo de ese cuit)
   declare C_Resultados CURSOR FOR 
   SELECT fecha, tabla, id_tabla, id_monitoreo
     FROM monitoreos_resultados
    WHERE Cuit = @cuit
      and Fecha > getdate() - 365 
      and Fecha > @inicio_monitoreo
      and seccion_mantenimiento in (select convert(varchar,item) from dbo.DelimitedSplit8K( @lista,',')) 
    order by fecha desc, id_monitoreo desc

   OPEN C_Resultados
   FETCH NEXT FROM C_Resultados INTO @fecha, @tabla, @id_tabla, @id_monitoreo

   WHILE @@fetch_status = 0
   BEGIN 
    if (@tabla like 'cendeu%') -- veo si cambio la situacion con respecto al mes anterior
    begin
     if not exists (select * from cendeu a 
        left join cendeu b on (b.iden = a.iden and convert(int,a.codigo_ent) = convert(int,b.codigo_ent) and b.vigente = 1  
              and b.fec_inf = (select max(fec_inf) 
                   from cendeu c  
                     where c.iden = a.iden and convert(int,a.codigo_ent) = convert(int,c.codigo_ent)
                    and c.fec_inf < a.fec_inf)) 
     where a.id_cendeu = @id_tabla and a.vigente = 1 
     and (b.iden is null or convert(int,b.situacion) != convert(int,a.situacion)))
     begin 
      -- si no hay cambio de situacion o deuda nueva sigo buscando 
      FETCH NEXT FROM C_Resultados INTO @fecha, @tabla, @id_tabla, @id_monitoreo
      continue 
     end
    end 
    UPDATE @resultado set ultima_novedad = @fecha where cuit = @cuit 
    break
   END 
   CLOSE C_Resultados
   DEALLOCATE C_Resultados 
  end
  FETCH NEXT FROM C_Cursor INTO @nombre, @cuit, @identificador, @id_padron, @lista, @comentarios, @trazabilidad, @inicio_monitoreo, @fin_monitoreo, @fecha_modificacion 

 END 
 CLOSE C_Cursor
 DEALLOCATE C_Cursor 
 

 declare @total_registros int = 0 
 /*
  if @p_activo = 1 
  select @total_registros = 
     COUNT(distinct cuit) from monitoreos
  left join padrones on (padrones.identificacion = cuit and 
     padrones.habilitado = 1 and 
     padrones.identificador in (select identificador from identificadores where country_code = 'AR'))
  where monitoreos.cliente = @p_client_id 
  and monitoreos.visible = 1
  and monitoreos.fecha_desde <= getdate() and monitoreos.fecha_vigencia_mantenimiento >= getdate()
  and nombre_persona is not null  
  and monitoreos.cuit = iif(@p_cuit is null, monitoreos.cuit, @p_cuit) 
  else 
  select @total_registros = 
     COUNT(distinct cuit) from monitoreos
  left join padrones on (padrones.identificacion = cuit and 
     padrones.habilitado = 1 and 
     padrones.identificador in (select identificador from identificadores where country_code = 'AR'))
  where monitoreos.cliente = @p_client_id 
  and nombre_persona is not null -- para saber que existe en padron
  and (monitoreos.visible = 0 or monitoreos.fecha_vigencia_mantenimiento < getdate())
  and not exists (select * from monitoreos mb where mb.cliente = monitoreos.cliente and mb.cuit = monitoreos.cuit and mb.seccion_mantenimiento = monitoreos.seccion_mantenimiento and mb.visible = 1 and mb.fecha_vigencia_mantenimiento >= getdate()) 
         and monitoreos.cuit = iif(@p_cuit is null, monitoreos.cuit, @p_cuit) 
  */

 select @total_registros = COUNT(distinct cuit) from @resultado
 if @total_registros > 5000 
     set @mas_datos = 1

 select top 5000 nombre_persona, cuit, identificador, id_padron, ultima_novedad as ultima_novedad_ymd, convert(varchar,ultima_novedad,103) as ultima_novedad,
              fin_monitoreo as fin_monitoreo_ymd, convert(varchar,fin_monitoreo,103) as fin_monitoreo, 
                    lista,comentarios,trazabilidad,
           @mas_datos as mas_datos, null as error, @total_registros as total_registros
 from @resultado 
 order by ultima_novedad_ymd desc, nombre_persona 

   
END

GO

Used By

No items found