CREATE OR REPLACE FUNCTION public.sp_listar_factura_paginado(
    p_fecha_ini character varying,
    p_fecha_fin character varying,
    p_tipo character varying,
    p_serie character varying,
    p_numero character varying,
    p_razon_social character varying,
    p_estado_pago character varying,
    p_anulado 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

/*
select sp_listar_factura_paginado('07-07-2020','','','','','','','','1','10','ref_cursor');fetch all in ref_cursor
select sp_listar_factura_paginado('','','','','','','','','1','10','ref_cursor');

select sp_listar_pesaje_carreta_paginado('01-01-2020','11-07-2020','131','14','1','10','ref_cursor');


SELECT f.id, f.fac_serie, f.fac_numero, f.fac_tipo, f.fac_fecha, f.fac_cod_tributario, f.fac_destinatario, 
        f.fac_subtotal, f.fac_impuesto, f.fac_total, f.fac_estado_pago, f.fac_anulado, m.denominacion, replace(u.email, '@felmo.com', '') 
  FROM public.facturas f
  Inner Join tabla_maestras m On m.id = f.fac_caja_id
  Inner Join users u On u.id = f.id_usuario 
limit 10;  
*/


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

	--select * from facturas limit 10
	--select * from personas limit 10
	--select * from afiliaciones limit 10
	
	v_campos=' f.id, f.fac_serie, f.fac_numero, f.fac_tipo, f.fac_fecha, f.fac_cod_tributario, f.fac_destinatario, 
        f.fac_subtotal, f.fac_impuesto, f.fac_total, f.fac_estado_pago, f.fac_anulado, m.denominacion caja, replace(replace(u.email, ''@felmo.pe'', ''''), ''@felmo.com'', '''') usuario, f.fac_estado_sunat sunat, f.fac_ruta_comprobante pdf,
	(select string_agg(DISTINCT t2_.plan_denominacion, '','')
	from afiliaciones t1_
	inner join plan_atenciones t2_ on t1_.plan_id=t2_.id
	left join personas t3_ on t3_.id=t1_.persona_id
	where t3_.numero_documento=f.fac_cod_tributario
	And t1_.estado=''1''
	And t2_.plan_estado=''A'')plan_denominacion
         ';
        
	v_tabla='FROM public.facturas f
		  Inner Join tabla_maestras m On m.id = f.fac_caja_id
		  Inner Join users u On u.id = f.id_usuario ';

	v_where = ' Where 1 = 1 ';

	If p_fecha_ini<>'' Then
	 v_where:=v_where||'And f.fac_fecha >= '''||p_fecha_ini||' :00:00'' ';
	End If;


	If p_fecha_fin<>'' Then
	 v_where:=v_where||'And f.fac_fecha <= '''||p_fecha_fin||' :23:59'' ';
	End If;

	If p_tipo<>'' Then
	 v_where:=v_where||' And f.fac_tipo = '''||p_tipo||''' '; 
	End If;

	If p_serie<>'' Then
	 v_where:=v_where||' And f.fac_serie ilike '''||p_serie||'%'' '; 
	End If;
	
	If p_numero<>'' Then
	 v_where:=v_where||' And f.fac_numero = '''||p_numero||''' '; 
	End If;

	If p_razon_social<>'' Then
	 v_where:=v_where||' And f.fac_destinatario ilike ''%'||p_razon_social||'%'' '; 
	End If;	

	If p_estado_pago<>'' then
	 v_where:=v_where||' And f.fac_estado_pago = '''||p_estado_pago||''' '; 
	End If;

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

$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
