
CREATE OR REPLACE FUNCTION public.sp_crud_caja_ingreso(
    accion character varying,
    p_id_usuario integer,
    p_id_caja_ingreso_soles integer,
    p_id_caja_soles integer,
    p_saldo_inicial_soles character varying,
    p_total_recaudado_soles character varying,
    p_saldo_total_soles character varying,
    p_id_caja_ingreso_dolares integer,
    p_id_caja_dolares integer,
    p_saldo_inicial_dolares character varying,
    p_total_recaudado_dolares character varying,
    p_saldo_total_dolares character varying,
    p_estado character varying)
  RETURNS character varying AS
$BODY$
declare
	cantidad_caja integer;
	p_saldo_inicial_soles_ decimal;
	p_saldo_inicial_dolares_ decimal;

	p_saldo_total_soles_ decimal;
	p_saldo_total_dolares_ decimal;

	reg_soles          	RECORD;
	cur_caja_soles 		CURSOR FOR SELECT id FROM caja_cobranzas where estado='1' and id_moneda=113 ORDER BY 1 desc;
	reg_dolares          	RECORD;
	cur_caja_dolares	CURSOR FOR SELECT id FROM caja_cobranzas where estado='1' and id_moneda=114 ORDER BY 1 desc;
begin

	Case accion
		When 'i' then
			select count(id) into cantidad_caja from caja_cobranzas where id_caja=p_id_caja_soles And estado = '1';
			if cantidad_caja=0 Then
				select saldo_total into p_saldo_inicial_soles_ from caja_cobranzas where id_moneda=113 and estado!='0' and fecha_fin is not null order by fecha_fin desc,id desc limit 1;
				Insert Into caja_cobranzas (id_usuario, id_caja, saldo_inicial, total_recaudado,saldo_total,fecha_inicio,estado,created_at,id_moneda,id_tipo_movimiento,observacion)
				Values (p_id_usuario,p_id_caja_soles,coalesce(p_saldo_inicial_soles_,0),to_number( p_total_recaudado_soles,'9999999999.99'),to_number( p_saldo_total_soles,'9999999999.99'),now(),p_estado,now(),113,147,'Cobranza');
				p_id_caja_ingreso_soles := (SELECT currval('caja_cobranzas_id_seq'));
			End if;

			select count(id) into cantidad_caja from caja_cobranzas where id_caja=p_id_caja_dolares And estado = '1';
			if cantidad_caja=0 Then
				select saldo_total into p_saldo_inicial_dolares_ from caja_cobranzas where id_moneda=114 and estado!='0' and fecha_fin is not null order by fecha_fin desc,id desc limit 1;
				Insert Into caja_cobranzas (id_usuario, id_caja, saldo_inicial, total_recaudado,saldo_total,fecha_inicio,estado,created_at,id_moneda,id_tipo_movimiento,observacion)
				Values (p_id_usuario,p_id_caja_dolares,coalesce(p_saldo_inicial_dolares_,0),to_number( p_total_recaudado_dolares,'9999999999.99'),to_number( p_saldo_total_dolares,'9999999999.99'),now(),p_estado,now(),114,147,'Cobranza');
				p_id_caja_ingreso_dolares := (SELECT currval('caja_cobranzas_id_seq'));
			End if;
			
		When 'u' then

			/******************SOLES***************************/

			select saldo_total into p_saldo_inicial_soles_ from caja_cobranzas where id_moneda=113 and estado!='0' and fecha_fin is not null order by fecha_fin desc,id desc limit 1;
		
			update caja_cobranzas t1 set 
			estado=2,
			saldo_inicial=p_saldo_inicial_soles_,
			total_recaudado=
			(select coalesce(Sum(fac_total),0) from facturas where fac_caja_id=t1.id_caja And fac_anulado='N' And fac_fecha >= fecha_inicio And fac_fecha <= (case when fecha_fin is null then now() else fecha_fin end))--fac_total
			+
			(select coalesce(Sum(adelanto),0) from adelantos where id_caja=t1.id_caja and estado='A' and coalesce(id_cronograma_detalle,0)=0 And fecha_hora >= fecha_inicio  And fecha_hora <= (case when fecha_fin is null then now() else fecha_fin end) )--adelanto
			-
			(select coalesce(round(sum(t4_.adelanto)::decimal,2),0)adelanto from facturas t1_
			inner join factura_detalles t2_ on t1_.fac_tipo=t2_.facd_tipo and t1_.fac_serie=t2_.facd_serie and t1_.fac_numero=t2_.facd_numero
			inner join cronograma_detalles t3_ on t3_.fac_tipo=t2_.facd_tipo and t3_.fac_serie=t2_.facd_serie and t3_.fac_numero=t2_.facd_numero and t3_.nro_cuota=t2_.facd_item
			inner join adelantos t4_ on t3_.id=t4_.id_cronograma_detalle And t4_.id_moneda = t1.id_moneda
			where t1_.fac_anulado='N' And t1_.fac_caja_id=t1.id_caja  And t1_.fac_fecha >= fecha_inicio And t1_.fac_fecha <= (case when fecha_fin is null then now() else fecha_fin end))--adelanto_descontado
			+
			(select coalesce(round(sum(t4_.adelanto)::decimal,2),0)adelanto
			from facturas t1_
			inner join factura_detalles t2_ on t1_.fac_tipo=t2_.facd_tipo and t1_.fac_serie=t2_.facd_serie and t1_.fac_numero=t2_.facd_numero
			inner join cronograma_detalles t3_ on t3_.fac_tipo=t2_.facd_tipo and t3_.fac_serie=t2_.facd_serie and t3_.fac_numero=t2_.facd_numero and t3_.nro_cuota=t2_.facd_item
			inner join adelantos t4_ on t3_.id=t4_.id_cronograma_detalle And t4_.id_moneda = t1.id_moneda
			where t1_.fac_anulado='N' And t1_.fac_caja_id=t1.id_caja  And t1_.fac_fecha >= fecha_inicio  And t1_.fac_fecha <= (case when fecha_fin is null then now() else fecha_fin end) and to_char(t4_.fecha,'dd-mm-yyyy')=to_char(t1_.fac_fecha,'dd-mm-yyyy'))--adelanto_hoy
			,
			saldo_total=
			(
			(select coalesce(Sum(fac_total),0) from facturas where fac_caja_id=t1.id_caja And fac_anulado='N' And fac_fecha >= fecha_inicio And fac_fecha <= (case when fecha_fin is null then now() else fecha_fin end))--fac_total
			+
			(select coalesce(Sum(adelanto),0) from adelantos where id_caja=t1.id_caja and estado='A' and coalesce(id_cronograma_detalle,0)=0 And fecha_hora >= fecha_inicio  And fecha_hora <= (case when fecha_fin is null then now() else fecha_fin end) )--adelanto
			-
			(select coalesce(round(sum(t4_.adelanto)::decimal,2),0)adelanto from facturas t1_
			inner join factura_detalles t2_ on t1_.fac_tipo=t2_.facd_tipo and t1_.fac_serie=t2_.facd_serie and t1_.fac_numero=t2_.facd_numero
			inner join cronograma_detalles t3_ on t3_.fac_tipo=t2_.facd_tipo and t3_.fac_serie=t2_.facd_serie and t3_.fac_numero=t2_.facd_numero and t3_.nro_cuota=t2_.facd_item
			inner join adelantos t4_ on t3_.id=t4_.id_cronograma_detalle And t4_.id_moneda = t1.id_moneda
			where t1_.fac_anulado='N' And t1_.fac_caja_id=t1.id_caja  And t1_.fac_fecha >= fecha_inicio And t1_.fac_fecha <= (case when fecha_fin is null then now() else fecha_fin end))--adelanto_descontado
			+
			(select coalesce(round(sum(t4_.adelanto)::decimal,2),0)adelanto
			from facturas t1_
			inner join factura_detalles t2_ on t1_.fac_tipo=t2_.facd_tipo and t1_.fac_serie=t2_.facd_serie and t1_.fac_numero=t2_.facd_numero
			inner join cronograma_detalles t3_ on t3_.fac_tipo=t2_.facd_tipo and t3_.fac_serie=t2_.facd_serie and t3_.fac_numero=t2_.facd_numero and t3_.nro_cuota=t2_.facd_item
			inner join adelantos t4_ on t3_.id=t4_.id_cronograma_detalle And t4_.id_moneda = t1.id_moneda
			where t1_.fac_anulado='N' And t1_.fac_caja_id=t1.id_caja  And t1_.fac_fecha >= fecha_inicio  And t1_.fac_fecha <= (case when fecha_fin is null then now() else fecha_fin end) and to_char(t4_.fecha,'dd-mm-yyyy')=to_char(t1_.fac_fecha,'dd-mm-yyyy'))--adelanto_hoy
			+
			p_saldo_inicial_soles_
			)
			,
			fecha_fin=now(),
			updated_at=now() 
			where id=p_id_caja_ingreso_soles;

			select saldo_total into p_saldo_total_soles_ from caja_cobranzas where id=p_id_caja_ingreso_soles;

				OPEN cur_caja_soles;
				LOOP
				FETCH cur_caja_soles INTO reg_soles;
				EXIT WHEN NOT FOUND;
					update caja_cobranzas set saldo_inicial=p_saldo_total_soles_ where id=reg_soles.id;
				END LOOP;

			/******************DOLARES***************************/

			select saldo_total into p_saldo_inicial_dolares_ from caja_cobranzas where id_moneda=114 and estado!='0' and fecha_fin is not null order by fecha_fin desc,id desc limit 1;

			update caja_cobranzas t1 set 
			estado=2,
			saldo_inicial=p_saldo_inicial_dolares_,
			total_recaudado=
			(select coalesce(Sum(fac_total),0) from facturas where fac_caja_id=t1.id_caja And fac_anulado='N' And fac_fecha >= fecha_inicio And fac_fecha <= (case when fecha_fin is null then now() else fecha_fin end))--fac_total
			+
			(select coalesce(Sum(adelanto),0) from adelantos where id_caja=t1.id_caja and estado='A' and coalesce(id_cronograma_detalle,0)=0 And fecha_hora >= fecha_inicio  And fecha_hora <= (case when fecha_fin is null then now() else fecha_fin end) )--adelanto
			-
			(select coalesce(round(sum(t4_.adelanto)::decimal,2),0)adelanto from facturas t1_
			inner join factura_detalles t2_ on t1_.fac_tipo=t2_.facd_tipo and t1_.fac_serie=t2_.facd_serie and t1_.fac_numero=t2_.facd_numero
			inner join cronograma_detalles t3_ on t3_.fac_tipo=t2_.facd_tipo and t3_.fac_serie=t2_.facd_serie and t3_.fac_numero=t2_.facd_numero and t3_.nro_cuota=t2_.facd_item
			inner join adelantos t4_ on t3_.id=t4_.id_cronograma_detalle And t4_.id_moneda = t1.id_moneda
			where t1_.fac_anulado='N' And t1_.fac_caja_id=t1.id_caja  And t1_.fac_fecha >= fecha_inicio And t1_.fac_fecha <= (case when fecha_fin is null then now() else fecha_fin end))--adelanto_descontado
			+
			(select coalesce(round(sum(t4_.adelanto)::decimal,2),0)adelanto
			from facturas t1_
			inner join factura_detalles t2_ on t1_.fac_tipo=t2_.facd_tipo and t1_.fac_serie=t2_.facd_serie and t1_.fac_numero=t2_.facd_numero
			inner join cronograma_detalles t3_ on t3_.fac_tipo=t2_.facd_tipo and t3_.fac_serie=t2_.facd_serie and t3_.fac_numero=t2_.facd_numero and t3_.nro_cuota=t2_.facd_item
			inner join adelantos t4_ on t3_.id=t4_.id_cronograma_detalle And t4_.id_moneda = t1.id_moneda
			where t1_.fac_anulado='N' And t1_.fac_caja_id=t1.id_caja  And t1_.fac_fecha >= fecha_inicio  And t1_.fac_fecha <= (case when fecha_fin is null then now() else fecha_fin end) and to_char(t4_.fecha,'dd-mm-yyyy')=to_char(t1_.fac_fecha,'dd-mm-yyyy'))--adelanto_hoy
			,
			saldo_total=
			(
			(select coalesce(Sum(fac_total),0) from facturas where fac_caja_id=t1.id_caja And fac_anulado='N' And fac_fecha >= fecha_inicio And fac_fecha <= (case when fecha_fin is null then now() else fecha_fin end))--fac_total
			+
			(select coalesce(Sum(adelanto),0) from adelantos where id_caja=t1.id_caja and estado='A' and coalesce(id_cronograma_detalle,0)=0 And fecha_hora >= fecha_inicio  And fecha_hora <= (case when fecha_fin is null then now() else fecha_fin end) )--adelanto			
			-
			(select coalesce(round(sum(t4_.adelanto)::decimal,2),0)adelanto from facturas t1_
			inner join factura_detalles t2_ on t1_.fac_tipo=t2_.facd_tipo and t1_.fac_serie=t2_.facd_serie and t1_.fac_numero=t2_.facd_numero
			inner join cronograma_detalles t3_ on t3_.fac_tipo=t2_.facd_tipo and t3_.fac_serie=t2_.facd_serie and t3_.fac_numero=t2_.facd_numero and t3_.nro_cuota=t2_.facd_item
			inner join adelantos t4_ on t3_.id=t4_.id_cronograma_detalle And t4_.id_moneda = t1.id_moneda
			where t1_.fac_anulado='N' And t1_.fac_caja_id=t1.id_caja  And t1_.fac_fecha >= fecha_inicio And t1_.fac_fecha <= (case when fecha_fin is null then now() else fecha_fin end))--adelanto_descontado
			+
			(select coalesce(round(sum(t4_.adelanto)::decimal,2),0)adelanto
			from facturas t1_
			inner join factura_detalles t2_ on t1_.fac_tipo=t2_.facd_tipo and t1_.fac_serie=t2_.facd_serie and t1_.fac_numero=t2_.facd_numero
			inner join cronograma_detalles t3_ on t3_.fac_tipo=t2_.facd_tipo and t3_.fac_serie=t2_.facd_serie and t3_.fac_numero=t2_.facd_numero and t3_.nro_cuota=t2_.facd_item
			inner join adelantos t4_ on t3_.id=t4_.id_cronograma_detalle And t4_.id_moneda = t1.id_moneda
			where t1_.fac_anulado='N' And t1_.fac_caja_id=t1.id_caja  And t1_.fac_fecha >= fecha_inicio  And t1_.fac_fecha <= (case when fecha_fin is null then now() else fecha_fin end) and to_char(t4_.fecha,'dd-mm-yyyy')=to_char(t1_.fac_fecha,'dd-mm-yyyy'))--adelanto_hoy
			+
			p_saldo_inicial_dolares_
			)
			,
			fecha_fin=now(),
			updated_at=now() 
			where id=p_id_caja_ingreso_dolares;

			select saldo_total into p_saldo_total_dolares_ from caja_cobranzas where id=p_id_caja_ingreso_dolares;

				OPEN cur_caja_dolares;
				LOOP
				FETCH cur_caja_dolares INTO reg_dolares;
				EXIT WHEN NOT FOUND;
					update caja_cobranzas set saldo_inicial=p_saldo_total_dolares_ where id=reg_dolares.id;
				END LOOP;
			
		When 'ul' then
			update caja_cobranzas set 
			id_usuario_contabilidad=p_id_usuario,
			saldo_liquidado=to_number( p_saldo_total_soles,'9999999999.99'),
			observacion=p_estado
			where id=p_id_caja_ingreso_soles;

			update caja_cobranzas set 
			id_usuario_contabilidad=p_id_usuario,
			saldo_liquidado=to_number( p_saldo_total_dolares,'9999999999.99'),
			observacion=p_estado
			where id=p_id_caja_ingreso_dolares;
			
		End Case;
				
	return p_id_caja_ingreso_soles;
end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
