CREATE OR REPLACE FUNCTION public.sp_listar_solicitud_paginado(
    p_id_usuario character varying,
    p_numero_documento character varying,
    p_nombre character varying,
    p_fecha_desde character varying,
    p_fecha_hasta character varying,
    p_id_estado 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;
	
	v_campos=' t1.id,to_char(t1.fecha_solicitud,''dd-mm-yyyy'') fecha_solicitud,t2.nombres,t2.apellido_paterno,t2.apellido_materno,
	t2.numero_documento,t1.monto_solicitado,t1.monto_valorizado,t1.monto_aprobado,t3.denominacion motivo,t4.denominacion moneda,
	t5.denominacion periodo,t5.codigo periodo_valor,t1.tiempo_pago,t1.nro_cuota,t1.id_estado,''FELMO'' origen';

	v_tabla='from solicitudes t1
		inner join personas t2 on t1.id_persona=t2.id
		inner join tabla_maestras t3 on t1.id_motivo=t3.id
		inner join tabla_maestras t4 on t1.id_moneda=t4.id
		inner join tabla_maestras t5 on t1.freecuencia_pago=t5.id
		';
	
	v_where = ' Where t1.eliminado=''N'' ';

	
	If p_fecha_desde<>'' Then
	 v_where:=v_where||'And t1.fecha_solicitud >= '''||p_fecha_desde||' :00:00'' ';
	End If;
	If p_fecha_hasta<>'' Then
	 v_where:=v_where||'And t1.fecha_solicitud <= '''||p_fecha_hasta||' :23:59'' ';
	End If;
	
	If p_id_usuario<>'0' Then
	 v_where:=v_where||' And t1.id_usuario = '|| p_id_usuario;
	End If;

	If p_id_estado<>'0' Then
		If p_id_estado='3,5' Then
			v_where:=v_where||' And t1.id_estado in('|| p_id_estado ||')';
		Else
			v_where:=v_where||' And t1.id_estado = '|| p_id_estado;
		End If;
	End If;
	
	If p_numero_documento<>'' Then
	 v_where:=v_where||' And t2.numero_documento like ''%'||p_numero_documento||'%'' ';
	End If;

	If p_nombre<>'' Then
	 v_where:=v_where||' And trim(t2.apellido_paterno)||'' ''||trim(t2.apellido_materno)||'' ''||trim(t2.nombres) ilike ''%'||p_nombre||'%'' '; 
	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;
