CREATE OR REPLACE FUNCTION public.sp_listar_afiliacion_paginado(
    p_afiliado character varying,
    p_numero_documento character varying,
    p_plan_denominacion character varying,
    p_periodo character varying,
    p_numero_tarjeta character varying,
    p_estado character varying,
    p_pagina character varying,
    p_limit character varying,
    p_ref refcursor)
  RETURNS refcursor AS
$BODY$

Declare
--v_id numeric;
--v_numinf character varying;
v_scad varchar;
v_campos varchar;
v_tabla varchar;
v_where varchar;
v_count varchar;
v_col_count varchar;
--v_perfil varchar;

Begin

	p_pagina=(p_pagina::Integer-1)*p_limit::Integer;
	
	v_campos=' t1.id,t1.codigo,to_char(t1.fecha_inicio,''dd/mm/yyyy'')fecha_inicio,to_char(t1.fecha_vencimiento,''dd/mm/yyyy'')fecha_vencimiento,t2.tipo_documento,t2.numero_documento,
                t2.nombres,t2.apellido_paterno,t2.apellido_materno,
                t4.nombres nombres_tit,t4.apellido_paterno apellido_paterno_tit,t4.apellido_materno apellido_materno_tit,
                t6.razon_social,t8.plan_denominacion,t2.tipo_relacion,t8.periodo,t8.plan_costo, 
		(select string_agg(numero_tarjeta, '','') from tarjetas tar where tar.persona_id=t1.persona_id and estado=''1'') tarjeta,t2.flag_negativo,t1.estado  
                ';

	v_tabla='from afiliaciones t1
	inner join personas t2 on t1.persona_id=t2.id
	inner join plan_atenciones t8 on t1.plan_id=t8.id
	left join personas t4 on t1.titular_id=t4.id
	left join ubicacion_trabajos t5 on t1.ubicacion_id=t5.id
	left join empresas t6 on t5.ubicacion_empresa_id=t6.id
	left join unidad_producciones t7 on t5.ubicacion_unidad_id=t7.id';
	
	v_where = ' Where 1=1 /*t1.estado=''t''*/  ';
	
	If p_numero_documento<>'' Then
	 v_where:=v_where||'And t2.numero_documento ilike ''%'||p_numero_documento||'%'' ';
	End If;
	If p_plan_denominacion<>'' Then
	 v_where:=v_where||'And t8.plan_denominacion ilike ''%'||p_plan_denominacion||'%'' ';
	End If;
	If p_periodo<>'' Then
	 v_where:=v_where||'And t8.periodo ilike ''%'||p_periodo||'%'' ';
	End If;
	If p_afiliado<>'' Then
	 v_where:=v_where||'And t2.nombres||'' ''||t2.apellido_paterno||'' ''||t2.apellido_materno ilike ''%'||p_afiliado||'%'' ';
	End If;

	If p_numero_tarjeta<>'' Then
	 v_where:=v_where||'And (select string_agg(numero_tarjeta, '','') from tarjetas tar where tar.persona_id=t1.persona_id and estado=''1'') ilike ''%'||p_numero_tarjeta||'%'' ';
	End If;

	If p_estado<>'' Then
	 v_where:=v_where||'And t1.estado = '''||p_estado||''' ';
	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 '||v_campos||v_col_count||v_tabla||v_where||' Order By t1.id Desc LIMIT '||p_limit||' OFFSET '||p_pagina||';'; 
	else
		v_scad:='SELECT '||v_campos||v_col_count||v_tabla||v_where||' Order By t1.id Desc;'; 
	End If;
	
	--Raise Notice '%',v_scad;
	Open p_ref For Execute(v_scad);
	Return p_ref;
End

$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
