drop table almacenaje;
CREATE TABLE almacenaje (
    al_id serial NOT NULL,
    al_idoper integer,
    al_idusu integer,
    al_idsitem integer,
    al_idcontr integer,
    al_canti numeric(15,5) DEFAULT 0,
    al_impdolar numeric(15,5) DEFAULT 0,
    al_importe numeric(15,5) DEFAULT 0,
    al_fecing date,
    al_fech date,
    al_ultfac date,
    al_retiro date,
    al_dias integer,
    al_tiprod integer,
    al_tarifa numeric(15,5) DEFAULT 0,
    al_total numeric(15,5) DEFAULT 0,
    al_estado smallint DEFAULT 1,
    al_leyenda text
);
ALTER TABLE public.almacenaje OWNER TO zona;



CREATE or REPLACE FUNCTION carga_almacenaje(date, date, integer) RETURNS boolean
    AS $_$
declare
desde		 alias for $1;
hasta		 alias for $2;
usuario		 alias for $3;
ret 		 boolean;
registro	 record;
regi		 record;
regi2		 record;
regi3		 record;
contrato	 int4;
tarifa	 	 numeric;
elusu		 int4;
cantdias	 int4;
begin

ret:='f';
contrato:=-1;
tarifa:=-1;

select (hasta-desde)::int4 into cantdias;

for registro in select 
    * from unifun where unif_usuario=1
    loop
    if(int4eq(usuario,0::int4)) then
	    for regi in select 
		* from subitem,operaciones  where sitem_deposito=registro.unif_codigo and op_id=sitem_idoper and date_ge(op_fechain,desde) and date_le(op_fechain,hasta) and op_estado=101
		loop
		ret:='t';
		select tari_idcontr,tari_importe into contrato,tarifa from tarifas where tari_usuario=regi.sitem_directo and idartdetipp(tiprodsitem(regi.sitem_id))=tari_idart	and estadocontr(tari_idcontr)=1 and tari_fhasta>=hasta;
		if found then 
		    if numeric_eq(tarifa,0::numeric) then
			select valtarico(tari_usuario,tari_idart,0::numeric,0::int2,hasta::date,tari_idcontr,tari_orden) into tarifa from tarifas where tari_usuario=regi.sitem_directo and idartdetipp(tiprodsitem(regi.sitem_id))=tari_idart	and estadocontr(tari_idcontr)=1 and tari_fhasta>=hasta;
		    end if;
		end if;

		if contrato is null then 
		    contrato:=-1;
		end if;

		if tarifa is null then 
		    tarifa:=-1;
		end if;

		delete from almacenaje where al_idsitem=regi.sitem_id;
		insert into almacenaje (al_fech,al_idoper,al_idusu,al_idsitem,al_idcontr,al_canti,al_impdolar,al_fecing,al_ultfac,al_tiprod,al_tarifa,al_leyenda) values (hasta,regi.op_id,regi.sitem_directo,regi.sitem_id,contrato,regi.sitem_canting,regi.sitem_imp_dolar,regi.op_fechain,regi.op_fechain,tiprodsitem(regi.sitem_id),tarifa,traigo_codarticu(regi.sitem_id));
	    end loop; 
	else
	    for regi in select 
		* from subitem,operaciones where sitem_deposito=registro.unif_codigo and sitem_directo=usuario and op_id=sitem_idoper and date_ge(op_fechain,desde) and date_le(op_fechain,hasta) and op_estado=101
		loop
		ret:='t';
		select tari_idcontr,tari_importe into contrato,tarifa from tarifas where tari_usuario=regi.sitem_directo and idartdetipp(tiprodsitem(regi.sitem_id))=tari_idart	and estadocontr(tari_idcontr)=1 and tari_fhasta>=hasta;
		if found then 
		    if numeric_eq(tarifa,0::numeric) then
			select valtarico(tari_usuario,tari_idart,0::numeric,0::int2,hasta::date,tari_idcontr,tari_orden) into tarifa from tarifas where tari_usuario=regi.sitem_directo and idartdetipp(tiprodsitem(regi.sitem_id))=tari_idart	and estadocontr(tari_idcontr)=1 and tari_fhasta>=hasta;
		    end if;
		end if;
		if contrato is null then 
		    contrato:=-1;
		end if;

		if tarifa is null then 
		    tarifa:=-1;
		end if;

		delete from almacenaje where al_idsitem=regi.sitem_id;
		insert into almacenaje (al_fech,al_idoper,al_idusu,al_idsitem,al_idcontr,al_canti,al_impdolar,al_fecing,al_ultfac,al_tiprod,al_tarifa,al_leyenda) values (hasta,regi.op_id,regi.sitem_directo,regi.sitem_id,contrato,regi.sitem_canting,regi.sitem_imp_dolar,regi.op_fechain,regi.op_fechain,tiprodsitem(regi.sitem_id),tarifa,traigo_codarticu(regi.sitem_id));
	    end loop; 
    end if;
end loop; 

update almacenaje set al_retiro=fechainretsitem(al_idsitem) where al_estado=1;
update almacenaje set al_importe=al_impdolar*cotpeso(date(now())) where al_estado=1 and al_impdolar is not null;
update almacenaje set al_dias=(al_retiro-al_ultfac)::int4 where al_estado=1 and al_retiro is not null;
update almacenaje set al_dias=(al_fech-al_ultfac)::int4 where al_estado=1 and al_retiro is null;

for regi3 in select al_idusu, sum(al_importe) as totfob from almacenaje where al_estado=1 and al_tiprod not in (4,5,6,7,8,9,32) group by 1
    loop
    if numeric_gt(regi3.totfob,500000::numeric) then
    tarifa:=0.0057;
      else
	if numeric_gt(regi3.totfob,200000::numeric) then
	    tarifa:=0.0076;
	  else
	    tarifa:=0.0096;
	end if;
    end if;
update almacenaje set al_tarifa=tarifa, al_total=(tarifa * al_importe / cantdias * al_dias) where al_estado=1 and al_importe is not null and al_idusu=regi3.al_idusu and al_tiprod not in (4,5,6,7,8,9,32);
end loop; 

update almacenaje set al_total=(al_tarifa * al_dias) where al_estado=1 and al_tiprod in (4,5,6,7,8,9,32);
update almacenaje set al_tarifa=-1 where al_estado=1 and al_tarifa in (null,0);
update almacenaje set al_total=-100 where al_estado=1 and al_total in (null,0);
update almacenaje set al_dias=-1 where al_estado=1 and al_dias in (null,0);

return ret;
end;$_$
    LANGUAGE plpgsql;


ALTER FUNCTION public.carga_almacenaje(date, date, integer) OWNER TO zona;




