
CREATE OR REPLACE FUNCTION public.sp_listar_calificacion_paginado(
    p_fecha_ini character varying,
    p_fecha_fin character varying,
    p_id_area character varying,
    p_estado character varying,
    p_id_puntuacion character varying,
    p_pagina character varying,
    p_limit character varying,
    p_ref refcursor)
  RETURNS refcursor AS
$BODY$

Declare

v_scad varchar;
v_campos varchar;
v_tabla varchar;
v_where varchar;
v_count varchar;
v_col_count varchar;

Begin

	p_pagina=(p_pagina::Integer-1)*p_limit::Integer;

	if p_id_area = '100' Then
		v_campos=' 
			t0.id,t1.id id_ingreso_vehiculo,
			case when t2.val_persona=0 then ''RUC'' else t3.tipo_documento end tipo_documento,
			case when t2.val_persona=0 then t5.ruc else t3.numero_documento end numero_documento,
			case when t2.val_persona=0 then t5.nombre_comercial else t2.val_pac_nombre end persona,
			t1.placa var1,(select distinct ejes from vehiculos where placa=t1.placa and estado=''1'' order by 1 desc limit 1)var2,1 var3 ';

		v_tabla='from ingreso_vehiculos t1
			left join calificaciones t0 on t1.id=t0.id_ingreso_vehiculo  
			inner join valorizaciones t2 on t1.aten_establecimiento=t2.val_aten_estab And t1.aten_numero=t2.val_aten_codigo
			left join personas t3 on t2.val_persona=t3.id
			left join ubicacion_trabajos t4 on t2.val_ubicacion=t4.id
			left join empresas t5 on t5.id=t4.ubicacion_empresa_id ';
		
		v_where = ' Where t2.val_estab=1 
			And t1.placa!=''''
			And t2.val_anulado=''N'' 
			And t2.val_codigo = coalesce(t2.val_codigo_i,t2.val_codigo) 
			And t1.fecha_salida is null ';

		If p_fecha_ini<>'' Then
		 v_where:=v_where||'And t1.fecha_ingreso >= '''||p_fecha_ini||' :00:00'' ';
		End If;
		If p_fecha_fin<>'' Then
		 v_where:=v_where||'And t1.fecha_ingreso <= '''||p_fecha_fin||' :23:59'' ';
		End If;

	End if;
	
	if p_id_area in('1','7') Then
		v_campos=' 
			t0.id,t1.id id_ingreso_vehiculo,
			t3.tipo_documento,
			t3.numero_documento,
			t3.nombres||'' ''||t3.apellido_paterno||'' ''||t3.apellido_materno persona,
			t1.plan_denominacion var1,t1.periodo var2,2 var3 ';

		v_tabla='from plan_atenciones t1
			left join calificaciones t0 on t1.id=t0.id_plan  
			inner join afiliaciones t2 on t1.id=t2.plan_id and coalesce(t2.titular_id,0)=0 
			left join personas t3 on t2.persona_id=t3.id
			left join ubicacion_trabajos t4 on t2.ubicacion_id=t4.id
			left join empresas t5 on t4.ubicacion_empresa_id=t5.id

			inner join declaracion_proveedor_productos t6 on t1.id=t6.id_plan
			inner join declaracion_proveedores t7 on t6.id_declaracion_proveedor=t7.id

			';
		
		v_where = ' Where t1.plan_estado=''A''
			And t2.estado=''1'' ';

		If p_id_area<>'0' Then
		
		v_where:=v_where||'And t1.plan_area='||p_id_area;
		
		End If;

		If p_fecha_ini<>'' Then
		 v_where:=v_where||'And t7.fecha_hora >= '''||p_fecha_ini||' :00:00'' ';
		End If;
		If p_fecha_fin<>'' Then
		 v_where:=v_where||'And t7.fecha_hora <= '''||p_fecha_fin||' :23:59'' ';
		End If;

	End if;
	
	
	
	If p_estado<>'0' Then
		If p_estado='1' Then
			v_where:=v_where||' And t0.id is not null';
		End If;
		
		If p_estado='2' Then
			v_where:=v_where||' And t0.id is null';
		End If;
	End If;
	
	If p_id_puntuacion<>'0' Then
	 v_where:=v_where||' And '||p_id_puntuacion||' in (
						select 
						case 
							when sum(puntaje::int)>=5 and sum(puntaje::int)<=10 then 1
							when sum(puntaje::int)=11 then 2
							when sum(puntaje::int)>=12 and sum(puntaje::int)<=13 then 3
							when sum(puntaje::int)>=14 and sum(puntaje::int)<=17 then 4
							when sum(puntaje::int)>=18 and sum(puntaje::int)<=20 then 5
						end puntaje
						from calificacion_productos
						where id_calificacion=t0.id
						group by id_producto
						)';
	End If;
	
	EXECUTE ('SELECT count(1) '||v_tabla||v_where) INTO v_count;
	v_col_count:=' ,'||v_count||' as TotalRows ';

	If v_count::Integer > p_limit::Integer then
		v_scad:='SELECT distinct '||v_campos||v_col_count||v_tabla||v_where||' Order By t1.id Asc LIMIT '||p_limit||' OFFSET '||p_pagina||';'; 
	else
		v_scad:='SELECT distinct '||v_campos||v_col_count||v_tabla||v_where||' Order By t1.id Asc;'; 
	End If;
	
	--Raise Notice '%',v_scad;
	Open p_ref For Execute(v_scad);
	Return p_ref;
End

$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

