dbo.Imperium_cumplimientos_2024

Description

Properties

Name Value
ANSI Nulls ON

True

Quoted Identifier ON

True

Encrypted

False

Execute As
Assembly

Parameters

12
Name Data Type Length Description
@p_contratista int 4
@cumplimiento int 4
@p_contratistas_subcontratistas char 1
@p_ultimo_mes_anteriores char 1
@p_cual_es_ultimo int 4
@p_cuantos_meses_tomar int 4
@periodo_txt char 50
@pendientes float 8
@ingresados float 8
@verificados float 8
@rechazados float 8
@totales float 8

SQL Script

Copy
SET QUOTED_IDENTIFIER, ANSI_NULLS ON
GO
-- =============================================
-- Author: Marita Soria 
-- Create date: 28/06/2023
-- Description: Calcula Porcentaje de cumplimiento de Imperium: 
--              - Se puede pedir de documentos propios del Contratista / de los Subcontratistas o Todo (Completo: contratista y subcontratistas) 
--                (@p_contratistas_subcontratistas C o S o T)
--              - Del ultimo mes o de los meses anteriores a ese ultimo que quieren 
--                (@p_ultimo_mes_anteriores U o A) 
--              - que mes tomamos como ultimo?
--                (@p_cual_es_ultimo) -- 1 = PeriodoVencido 
           -- 2 = PeriodoMenosDos, 
           -- etc 
--     - cantidad de meses a tomar cuando se pide Anteriores
--                (@p_cuantos_meses_tomar)
-- =============================================
/*

exec [Imperium_cumplimientos] 10072, @cumplimiento output, 'T','A',2,1 
declare @hhh1 int,
@per varchar(50),
@pendientes FLOAT,
@ingresados FLOAT ,
@verificados FLOAT ,
@rechazados FLOAT ,
@totales FLOAT  
exec [Imperium_cumplimientos_2024] 8920, @hhh1 output, 'T','A',2,1,
@per output, 
@pendientes output,
@ingresados output ,
@verificados output ,
@rechazados output ,
@totales output
select @per as periodo, 
@hhh1 as cumplimiento, 
@pendientes as pendientes,
@ingresados as ingresados ,
@verificados as verificados ,
@rechazados as rechazados,
@totales as totales 



declare @hhh1 int
exec [Imperium_cumplimientos] 8920, @hhh1 output, 'T','A',2,1
select @hhh1

select * from ln_contrapartes where contraparte = 191515

exec [Imperium_cumplimientos] 7900, @hhh1 output, 'S','U',1 
exec [Imperium_cumplimientos] 7900, @hhh1 output, 'T','U',1 
exec [Imperium_cumplimientos] 7900, @hhh1 output, 'C','A',1,12 
exec [Imperium_cumplimientos] 7900, @hhh1 output, 'S','A',1,12



declare @hhh1 int
exec [Imperium_cumplimientos] 10072, @hhh1 output, 'T','A',2,1
--exec [Imperium_cumplimientos] 10072, @hhh1 output, 'T','A',1,12
select @hhh1

select id_imperium from ln_contrapartes where contraparte = 183617
select * from led_docs where contratista_1 = 7900 and led_docs.contratista != led_docs.contratista_1
*/



CREATE OR ALTER PROCEDURE dbo.Imperium_cumplimientos_2024 
 @p_contratista int, 
 @cumplimiento int output,
 @p_contratistas_subcontratistas char(1) = 'C', -- C = contratista, S = Subcontratistas, T = Todo (Completo: contratista y subcontratistas)
 @p_ultimo_mes_anteriores char(1) = 'U', -- U = ultimo mes (toma como mes lo indicado en: @p_cual_es_ultimo) 
                                         -- A = meses anteriores 
 @p_cual_es_ultimo int = 1,              /* que mes tomamos como ultimo?
  1 = PeriodoVencido 
  2 = PeriodoMenosDos, 
  etc 
  */

 @p_cuantos_meses_tomar int = 11,     -- cantidad de meses a tomar cuando se pide Anteriores
 @periodo_txt char(50) output,  -- Muestra que periodo esta tomando 
 @pendientes FLOAT output,
 @ingresados FLOAT output,
 @verificados FLOAT output,
 @rechazados FLOAT output,
 @totales FLOAT output 
                                                 
AS
BEGIN

 SET NOCOUNT ON;
 DECLARE @rate FLOAT

 if (@p_cual_es_ultimo is null or @p_cual_es_ultimo < 0) set @p_cual_es_ultimo = 1
 if (@p_cuantos_meses_tomar is null or @p_cuantos_meses_tomar <= 0) set @p_cuantos_meses_tomar = 11

 declare @periodo_desde1 date = null
 declare @periodo_hasta1 date = null
 
 declare @periodo_desde int 
 declare @periodo_hasta int = dbo.PeriodoAdelantado() 

 declare @meses int 
 set @meses = @p_cual_es_ultimo * (-1)
 set @periodo_hasta1 = convert(date, substring(convert(char,@periodo_hasta),1,4)+'-'+substring(convert(char,@periodo_hasta),5,2)+'-01')
 set @periodo_hasta1 = dateadd(m,@meses,@periodo_hasta1)

 if (@p_ultimo_mes_anteriores = 'U') 
 begin
  set @periodo_hasta  = convert(int,convert(char(6),replace(@periodo_hasta1,'-',''))) 
  set @periodo_desde = @periodo_hasta -- solo ultimo 
 end 
 else 
 begin -- Meses anteriores 
     
  -- set @periodo_hasta1 = dateadd(m,-1,@periodo_hasta1) -- hasta: uno menos que el que consideramos ultimo 
                  -- MAL PORQUE SE PARABA UN MES MENOS DEL QUE PEDIMOS
                  -- (servia cuando se pedian ultimos 12 meses, pero lo que hay que hacer es cuando se llama mandarle como parametro 2,12
  -- desde: tantos meses para atras solicitados
  set @meses = (@p_cuantos_meses_tomar-1) * (-1)
  set @periodo_desde1  = dateadd(m,@meses,@periodo_hasta1)
  set @periodo_hasta  = convert(int,convert(char(6),replace(@periodo_hasta1,'-',''))) 
  set @periodo_desde  = convert(int,convert(char(6),replace(@periodo_desde1,'-',''))) 
 end 

 if (@periodo_desde < dbo.PeriodoAnual()) set @periodo_desde = dbo.PeriodoAnual()
 if (@periodo_hasta < dbo.PeriodoAnual()) set @periodo_hasta = dbo.PeriodoAnual()

 select @periodo_desde desde, @periodo_hasta hasta, @meses as cuantos_meses
 declare @periodo_txt1 varchar(50) = null 
 declare @periodo_txt2 varchar(50) = null 

 if (@periodo_desde = @periodo_hasta) 
 begin
  set @periodo_txt = @periodo_desde
  set @periodo_txt = SUBSTRING(@periodo_txt,5,2)+'/'+substring(@periodo_txt,1,4)
 end
 else 
 begin 
  set @periodo_txt1 = @periodo_desde
  set @periodo_txt1 = SUBSTRING(@periodo_txt1,5,2)+'/'+substring(@periodo_txt1,1,4)
  set @periodo_txt2 = @periodo_hasta
  set @periodo_txt2 = SUBSTRING(@periodo_txt2,5,2)+'/'+substring(@periodo_txt2,1,4)
  set @periodo_txt = @periodo_txt1 + ' - ' + @periodo_txt2
 end 
 
 declare @estado char(1), @cantidad float

 set @pendientes  = 0
 set @ingresados  = 0
 set @verificados = 0
 set @rechazados  = 0
 set @totales     = 0

 if (@p_contratistas_subcontratistas = 'C') 
 begin

 DECLARE C_cantidades CURSOR FOR
  
    SELECT led_docs.estado_doc, COUNT(*) as cantidad
    FROM led_docs INNER JOIN led_contratista_periodo 
     ON (led_docs.contratista = led_contratista_periodo.contratista
      AND led_docs.periodo = led_contratista_periodo.periodo)
     INNER JOIN led_contratistas ON led_docs.contratista = led_contratistas.contratista
     INNER JOIN led_cliente_contratista ON
      (led_docs.tipo_doc = led_cliente_contratista.tipo_doc
      AND led_contratistas.tipo_contratista = led_cliente_contratista.tipo_contratista
      AND led_contratistas.cliente = led_cliente_contratista.cliente
      AND ISNULL(led_cliente_contratista.afecta_compliance, 0) > 0)
    WHERE led_docs.contratista = @p_contratista and led_docs.contratista = led_docs.contratista_1
    AND led_docs.periodo BETWEEN @periodo_desde AND @periodo_hasta
    AND led_docs.doc_id_lista IS NULL 
    group by led_docs.estado_doc
    
    union all 
    SELECT led_docs.estado_doc, COUNT(*) as cantidad
    FROM led_docs INNER JOIN led_empleados_periodo 
     ON (led_docs.empleado = led_empleados_periodo.empleado
      AND led_docs.periodo = led_empleados_periodo.periodo)
     INNER JOIN led_empleados ON led_docs.empleado = led_empleados.empleado
     INNER JOIN led_cliente_empleado ON
      (led_docs.tipo_doc = led_cliente_empleado.tipo_doc
      AND led_empleados.tipo_empleado = led_cliente_empleado.tipo_empleado
      AND led_empleados.cliente = led_cliente_empleado.cliente
      AND ISNULL(led_cliente_empleado.afecta_compliance, 0) > 0)
    WHERE led_docs.contratista = @p_contratista and led_docs.contratista = led_docs.contratista_1
    AND led_docs.periodo BETWEEN @periodo_desde AND @periodo_hasta
    AND led_docs.doc_id_lista IS NULL
    group by led_docs.estado_doc

    union all 
    SELECT led_docs.estado_doc, COUNT(*) as cantidad
    FROM led_docs INNER JOIN led_vehiculos_periodo 
     ON (led_docs.vehiculo = led_vehiculos_periodo.vehiculo
      AND led_docs.periodo = led_vehiculos_periodo.periodo)
     INNER JOIN led_vehiculos ON led_docs.vehiculo = led_vehiculos.vehiculo
     INNER JOIN led_cliente_vehiculo ON
      (led_docs.tipo_doc = led_cliente_vehiculo.tipo_doc
      AND led_vehiculos.tipo_vehiculo = led_cliente_vehiculo.tipo_vehiculo
      AND led_vehiculos.cliente = led_cliente_vehiculo.cliente
      AND ISNULL(led_cliente_vehiculo.afecta_compliance, 0) > 0)
    WHERE led_docs.contratista = @p_contratista and led_docs.contratista = led_docs.contratista_1
    AND led_docs.periodo BETWEEN @periodo_desde AND @periodo_hasta
    AND led_docs.doc_id_lista IS NULL
    group by led_docs.estado_doc

  OPEN C_cantidades 
  FETCH NEXT FROM C_cantidades INTO @estado, @cantidad
  WHILE @@fetch_status = 0
  BEGIN
   if @estado = 'V' set @verificados = @verificados + @cantidad
   if @estado = 'N' set @pendientes  = @pendientes  + @cantidad
   if @estado = 'I' set @ingresados  = @ingresados  + @cantidad
   if @estado = 'R' set @rechazados  = @rechazados  + @cantidad
   if @estado in ('V','N','I','R') set @totales  =  @totales + @cantidad
   FETCH NEXT FROM C_cantidades INTO @estado, @cantidad

  END 
  CLOSE C_cantidades
  DEALLOCATE C_cantidades
 end 

 if (@p_contratistas_subcontratistas = 'S') 
 begin

  DECLARE C_cantidades_2 CURSOR FOR
    SELECT led_docs.estado_doc, COUNT(*) as cantidad
    FROM led_docs INNER JOIN led_empleados_periodo 
     ON (led_docs.empleado = led_empleados_periodo.empleado
      AND led_docs.periodo = led_empleados_periodo.periodo)
     INNER JOIN led_empleados ON led_docs.empleado = led_empleados.empleado
     INNER JOIN led_cliente_empleado ON
      (led_docs.tipo_doc = led_cliente_empleado.tipo_doc
      AND led_empleados.tipo_empleado = led_cliente_empleado.tipo_empleado
      AND led_empleados.cliente = led_cliente_empleado.cliente
      AND ISNULL(led_cliente_empleado.afecta_compliance, 0) > 0)
    WHERE led_docs.contratista_1 = @p_contratista and led_docs.contratista != led_docs.contratista_1
    AND led_docs.periodo BETWEEN @periodo_desde AND @periodo_hasta
    AND led_docs.doc_id_lista IS NULL
    group by led_docs.estado_doc

    union all 
    SELECT led_docs.estado_doc, COUNT(*) as cantidad
    FROM led_docs INNER JOIN led_vehiculos_periodo 
     ON (led_docs.vehiculo = led_vehiculos_periodo.vehiculo
      AND led_docs.periodo = led_vehiculos_periodo.periodo)
     INNER JOIN led_vehiculos ON led_docs.vehiculo = led_vehiculos.vehiculo
     INNER JOIN led_cliente_vehiculo ON
      (led_docs.tipo_doc = led_cliente_vehiculo.tipo_doc
      AND led_vehiculos.tipo_vehiculo = led_cliente_vehiculo.tipo_vehiculo
      AND led_vehiculos.cliente = led_cliente_vehiculo.cliente
      AND ISNULL(led_cliente_vehiculo.afecta_compliance, 0) > 0)
    WHERE led_docs.contratista_1 = @p_contratista and led_docs.contratista != led_docs.contratista_1
    AND led_docs.periodo BETWEEN @periodo_desde AND @periodo_hasta
    AND led_docs.doc_id_lista IS NULL
    group by led_docs.estado_doc

    UNION ALL
    SELECT led_docs.estado_doc, COUNT(*) as cantidad
    FROM led_docs INNER JOIN led_subcontratista_periodo 
     ON (led_docs.contratista = led_subcontratista_periodo.subcontratista
      AND led_docs.periodo = led_subcontratista_periodo.periodo)
     INNER JOIN led_contratistas ON led_docs.contratista = led_contratistas.contratista
     INNER JOIN led_cliente_contratista ON
      (led_docs.tipo_doc = led_cliente_contratista.tipo_doc
      AND led_contratistas.tipo_contratista = led_cliente_contratista.tipo_contratista
      AND led_contratistas.cliente = led_cliente_contratista.cliente
      AND ISNULL(led_cliente_contratista.afecta_compliance, 0) > 0)
    WHERE led_docs.contratista_1 = @p_contratista and led_docs.contratista != led_docs.contratista_1
    AND led_docs.periodo BETWEEN @periodo_desde AND @periodo_hasta
    AND led_docs.estado_doc = 'V'
    AND led_docs.doc_id_lista IS NULL
    group by led_docs.estado_doc

    
  OPEN C_cantidades_2 
  FETCH NEXT FROM C_cantidades_2 INTO @estado, @cantidad
  WHILE @@fetch_status = 0
  BEGIN
   if @estado = 'V' set @verificados = @verificados + @cantidad
   if @estado = 'N' set @pendientes  = @pendientes  + @cantidad
   if @estado = 'I' set @ingresados  = @ingresados  + @cantidad
   if @estado = 'R' set @rechazados  = @rechazados  + @cantidad
   if @estado in ('V','N','I','R') set @totales  =  @totales + @cantidad
   FETCH NEXT FROM C_cantidades_2 INTO @estado, @cantidad
  END 
  CLOSE C_cantidades_2
  DEALLOCATE C_cantidades_2

 end


 if (@p_contratistas_subcontratistas = 'T')  -- Todo
 begin
 
   DECLARE C_cantidades_3 CURSOR FOR
    SELECT led_docs.estado_doc, COUNT(*) as cantidad
    FROM led_docs INNER JOIN led_contratista_periodo 
     ON (led_docs.contratista = led_contratista_periodo.contratista
      AND led_docs.periodo = led_contratista_periodo.periodo)
     INNER JOIN led_contratistas ON led_docs.contratista = led_contratistas.contratista
     INNER JOIN led_cliente_contratista ON
      (led_docs.tipo_doc = led_cliente_contratista.tipo_doc
      AND led_contratistas.tipo_contratista = led_cliente_contratista.tipo_contratista
      AND led_contratistas.cliente = led_cliente_contratista.cliente
      AND ISNULL(led_cliente_contratista.afecta_compliance, 0) > 0)
    WHERE led_docs.contratista_1 = @p_contratista
    AND led_docs.periodo BETWEEN @periodo_desde AND @periodo_hasta
    AND led_docs.doc_id_lista IS NULL 
    GROUP BY led_docs.estado_doc

    union all 
    SELECT led_docs.estado_doc, COUNT(*) as cantidad
    FROM led_docs INNER JOIN led_empleados_periodo 
     ON (led_docs.empleado = led_empleados_periodo.empleado
      AND led_docs.periodo = led_empleados_periodo.periodo)
     INNER JOIN led_empleados ON led_docs.empleado = led_empleados.empleado
     INNER JOIN led_cliente_empleado ON
      (led_docs.tipo_doc = led_cliente_empleado.tipo_doc
      AND led_empleados.tipo_empleado = led_cliente_empleado.tipo_empleado
      AND led_empleados.cliente = led_cliente_empleado.cliente
      AND ISNULL(led_cliente_empleado.afecta_compliance, 0) > 0)
    WHERE led_docs.contratista_1 = @p_contratista
    AND led_docs.periodo BETWEEN @periodo_desde AND @periodo_hasta
    AND led_docs.doc_id_lista IS NULL
    GROUP BY led_docs.estado_doc

    union all 
    SELECT led_docs.estado_doc, COUNT(*) as cantidad
    FROM led_docs INNER JOIN led_vehiculos_periodo 
     ON (led_docs.vehiculo = led_vehiculos_periodo.vehiculo
      AND led_docs.periodo = led_vehiculos_periodo.periodo)
     INNER JOIN led_vehiculos ON led_docs.vehiculo = led_vehiculos.vehiculo
     INNER JOIN led_cliente_vehiculo ON
      (led_docs.tipo_doc = led_cliente_vehiculo.tipo_doc
      AND led_vehiculos.tipo_vehiculo = led_cliente_vehiculo.tipo_vehiculo
      AND led_vehiculos.cliente = led_cliente_vehiculo.cliente
      AND ISNULL(led_cliente_vehiculo.afecta_compliance, 0) > 0)
    WHERE led_docs.contratista_1 = @p_contratista
    AND led_docs.periodo BETWEEN @periodo_desde AND @periodo_hasta
    AND led_docs.doc_id_lista IS NULL
    GROUP BY led_docs.estado_doc

    union all 
    SELECT led_docs.estado_doc, COUNT(*) as cantidad
    FROM led_docs INNER JOIN led_subcontratista_periodo 
     ON (led_docs.contratista = led_subcontratista_periodo.subcontratista
      AND led_docs.periodo = led_subcontratista_periodo.periodo)
     INNER JOIN led_contratistas ON led_docs.contratista = led_contratistas.contratista
     INNER JOIN led_cliente_contratista ON
      (led_docs.tipo_doc = led_cliente_contratista.tipo_doc
      AND led_contratistas.tipo_contratista = led_cliente_contratista.tipo_contratista
      AND led_contratistas.cliente = led_cliente_contratista.cliente
      AND ISNULL(led_cliente_contratista.afecta_compliance, 0) > 0)
    WHERE led_docs.contratista_1 = @p_contratista
    AND led_docs.periodo BETWEEN @periodo_desde AND @periodo_hasta
    AND led_docs.doc_id_lista IS NULL
    GROUP BY led_docs.estado_doc


  OPEN C_cantidades_3 
  FETCH NEXT FROM C_cantidades_3 INTO @estado, @cantidad
  WHILE @@fetch_status = 0
  BEGIN
   if @estado = 'V' set @verificados = @verificados + @cantidad
   if @estado = 'N' set @pendientes  = @pendientes  + @cantidad
   if @estado = 'I' set @ingresados  = @ingresados  + @cantidad
   if @estado = 'R' set @rechazados  = @rechazados  + @cantidad
   if @estado in ('V','N','I','R') set @totales  =  @totales + @cantidad
   FETCH NEXT FROM C_cantidades_3 INTO @estado, @cantidad
  END 
  CLOSE C_cantidades_3
  DEALLOCATE C_cantidades_3
 end 




 IF (@totales > 0) BEGIN
  --SET @rate = ROUND(@verificados / @totales * 100, 0)
  SET @rate = floor(@verificados / @totales * 100) --> redondea para abajo 99.99 = 99
  SET @cumplimiento = CAST(@rate AS int)
 END ELSE
  SET @cumplimiento = null

 select @p_contratistas_subcontratistas as 'Cont./Subcont./Todos', @p_ultimo_mes_anteriores as 'Ultimo/Anteriores', @periodo_hasta as hasta, 
 @verificados as verificados, @totales as totales, @cumplimiento as cumplimiento
 
 
END

GO