-- Diferencias en cantidades que pueda tener las existencias de inventario contra el movimiento
drop table xx;
create table xx as
select  a.cod_cia, a.cod_bodega, a.cod_articulo, a.cod_lote, a.medida,
        sum(decode(a.tip_movto,'E',a.can_articulo,-a.can_articulo)) cantmed, 0 cantidad
from inv_detmovimiento a,inv_encabmovimiento b
where a.cod_cia=b.cod_cia
and   a.cod_cia='001'
and   a.sucursal=b.sucursal
and   a.tip_movto=b.tip_movto
and   a.cod_movto=b.cod_movto
and   a.num_docto=b.num_docto
and   b.estado='D'
group by a.cod_cia, a.cod_bodega, a.cod_articulo, a.cod_lote, a.medida;

update xx set cantidad=cantmed;
commit;

-- Busca si hay transacciones en medidas diferentes a la estandar del articulo
select a.cod_cia cia, a.cod_articulo articulo, a.medida medart, x.cod_bodega bodega, x.cod_lote lote,
       x.medida medtra, x.cantidad
from xx x, inv_articulo a
where x.cod_cia=a.cod_cia
  and x.cod_articulo=a.cod_articulo
  and x.medida!=a.medida
  and x.cantidad!=0;

-- Si es necesario se corre este script para estandarizar las cantidades a una medida
begin
   for a in (select x.cod_cia, x.cod_articulo, x.cod_lote, a.medida medidaart, x.medida, x.cantmed
             from xx x, inv_articulo a
             where x.cod_cia=a.cod_cia
             and x.cod_articulo=a.cod_articulo
             and x.medida!=a.medida
             and x.cantmed!=0)
   loop
      update xx set cantidad=convmedida.convertir(a.cantmed, a.medida, a.medidaart)
      where cod_cia=a.cod_cia
        and cod_articulo=a.cod_articulo
        and medida=a.medida
        and cod_lote=a.cod_lote;
   end loop;
   commit;

end;
/

update inv_detmovimiento set medida='UND'
 where medida='MTR' and cod_articulo='7441117216954';



-- Ahora si un resumen sin medidas (cantidades estandar)
drop table xx1;
create table xx1 as
select cod_cia, cod_bodega, cod_articulo, cod_lote, sum(cantidad) cantidad
from xx
group by cod_cia, cod_bodega, cod_articulo, cod_lote;

-- Consulta para ver todas las diferencias
select a.cod_bodega bod, a.cod_articulo, a.cod_lote lote, a.can_existe exisbod,
       b.cantidad existra, greatest(b.cantidad-a.can_existe, -a.can_existe) delta
from inv_lote_artic_bodega a,xx1 b
where a.cod_cia=b.cod_cia
  and a.cod_bodega=b.cod_bodega
  and a.cod_articulo=b.cod_articulo
  and a.cod_lote=b.cod_lote
  and a.can_existe<>b.cantidad
  and a.cod_bodega='001';
  --and b.cantidad<0;

-- Actualiza las existencias de acuerdo a las diferencias encontradas
-- Solo se debe ejecutar si se considera necesario.
declare cursor difs is 
   select a.cod_cia, a.cod_bodega, a.cod_articulo, a.cod_lote, a.can_existe, b.cantidad,
          greatest(b.cantidad-a.can_existe, -a.can_existe) ajuste,
          decode(a.can_existe,0,0,a.cos_total/a.can_existe) cos_promedio
   from inv_lote_artic_bodega a, xx1 b
   where a.cod_cia=b.cod_cia
   and a.cod_bodega=b.cod_bodega
   and a.cod_bodega='001'
   and a.cod_articulo=b.cod_articulo
   and a.cod_lote=b.cod_lote
   and a.can_existe<>b.cantidad
   and greatest(b.cantidad-a.can_existe, -a.can_existe)!=0;
begin
  for d in difs
  loop
     update inv_lote_artic_Bodega
        set can_existe=can_existe+d.ajuste,
            cos_total=cos_total+d.ajuste*d.cos_promedio,
            can_apartado=least(d.can_existe+d.ajuste, can_apartado)
     where cod_cia=d.cod_cia
     and   cod_bodega=d.cod_bodega
     and   cod_articulo=d.cod_articulo
     and   cod_lote = d.cod_lote;
  end loop;
  commit;
end;
/

-- Para verificar los totales en el articulo
select cod_bodega, cod_lote, can_existe, cos_total
from inv_lote_artic_bodega
where cod_articulo='110050';


select cod_lote, can_apartado, can_existe 
from inv_lote_artic_bodega
where cod_bodega='700' and cod_articulo='7441117240508'
and cod_lote='B';


-- Diferencias en valores que pueda tener las existencias de inventario contra el movimiento
drop table xx;
create table xx as
select  a.cod_cia, a.cod_bodega, a.cod_articulo, a.cod_lote,
        sum(decode(a.tip_movto,'E',a.sub_total,-a.sub_total)) monto
from inv_detmovimiento a,inv_encabmovimiento b
where a.cod_cia=b.cod_cia
and   a.cod_cia='001'
and   a.sucursal=b.sucursal
and   a.tip_movto=b.tip_movto
and   a.cod_movto=b.cod_movto
and   a.num_docto=b.num_docto
and   b.estado='D'
group by a.cod_cia, a.cod_bodega, a.cod_articulo, a.cod_lote;


-- Consulta para ver todas las diferencias
select a.cod_bodega bod, a.cod_articulo, a.cod_lote lote, a.cos_total totbod,
       b.monto tottra, greatest(b.monto-a.cos_total, -cos_total) delta
from inv_lote_artic_bodega a,xx b
where a.cod_cia=b.cod_cia
  and a.cod_bodega=b.cod_bodega
  and a.cod_articulo=b.cod_articulo
  and a.cod_lote=b.cod_lote
  and a.cos_total<>b.monto;
  --and a.cod_bodega not in ('001','051','700');
  --and b.cantidad<0;

-- Actualiza los costos de acuerdo a las diferencias encontradas
-- Solo se debe ejecutar si se considera necesario.
declare cursor difs is 
   select a.cod_cia, a.cod_bodega, a.cod_articulo, a.cod_lote, a.cos_total, b.monto,
          greatest(b.monto-a.cos_total, -a.cos_total) ajuste
   from inv_lote_artic_bodega a, xx b
   where a.cod_cia=b.cod_cia
   and a.cod_bodega=b.cod_bodega
   --and a.cod_bodega='052'
   and a.cod_articulo=b.cod_articulo
   and a.cod_lote=b.cod_lote
   and a.cos_total<>b.monto
   and greatest(b.monto-a.cos_total, -a.cos_total)!=0;
begin
  for d in difs
  loop
     update inv_lote_artic_Bodega
        set cos_total=cos_total+d.ajuste
     where cod_cia=d.cod_cia
     and   cod_bodega=d.cod_bodega
     and   cod_articulo=d.cod_articulo
     and   cod_lote = d.cod_lote;
  end loop;
  commit;
end;
/

-- Ajusta negativos ojo no usar;
declare
   cursor negs is
      select a.cod_bodega bod, a.cod_articulo, a.cod_lote lote, a.cos_total totbod,
            b.monto tottra, b.monto-a.cos_total delta
      from inv_lote_artic_bodega a, xx b
      where a.cod_cia=b.cod_cia
      and a.cod_bodega=b.cod_bodega
      and a.cod_articulo=b.cod_articulo
      and a.cod_lote=b.cod_lote
      and a.cos_total>b.monto;
begin
   for d in negs
   loop
     update inv_detmovimiento
        set sub_total=sub_total+d.delta
     where tip_movto='S' and rownum=1
       and cod_bodega=d.bod and cod_lote=d.lote
       and cod_articulo=d.cod_articulo
       and sub_total>abs(d.delta);
   end loop;
   commit;
end;
/

select cod_articulo, sub_total
from inv_detmovimiento d
where d.cod_cia='001'
  and d.cod_articulo='LM7QD'
  and d.tip_movto='S'
and exists (select 1 from inv_encabmovimiento e
            where e.cod_cia=d.cod_cia
              and e.sucursal=d.sucursal
              and e.tip_movto=d.tip_movto
              and e.cod_movto=d.cod_movto
              and e.num_docto=d.num_docto
              and e.estado='D')
order by d.sub_total desc;

 update inv_detmovimiento set sub_total=sub_total-1000
 where cod_cia='001'
   and tip_movto='S'
   and cod_articulo='LM7QD'
   and sub_total=2032;

-- ajusta positivos en valor con existencia 0
declare
   cursor negs is
      select a.cod_bodega bod, a.cod_articulo, a.cod_lote lote, a.cos_total totbod,
            b.monto tottra, b.monto-a.cos_total delta
      from inv_lote_artic_bodega a, xx b
      where a.cod_cia=b.cod_cia
      and a.cod_bodega=b.cod_bodega
      and a.cod_articulo=b.cod_articulo
      and a.cod_lote=b.cod_lote
      and a.cos_total<b.monto;
begin
   for d in negs
   loop
     update inv_detmovimiento
        set sub_total=sub_total+d.delta
     where tip_movto='S' and rownum=1
       and cod_bodega=d.bod and cod_lote=d.lote
       and cod_articulo=d.cod_articulo;
   end loop;
   commit;
end;
/


-- Costos inconsistentes
select cod_cia, cod_bodega, cod_articulo, cod_lote, can_existe, cos_total
from inv_lote_artic_bodega
where (cos_total<0) or (cos_total>0 and can_existe=0) or (can_existe>0 and cos_total=0);

select tip_movto, can_articulo, sub_total
from inv_detmovimiento
where cod_articulo='105050' and cod_lote='V01/07' and cod_bodega='001'
order by tip_movto;

update inv_detmovimiento set sub_total=4500
where cod_articulo='105050' and cod_lote='V01/07'  and cod_bodega='001' and sub_total like '7935%';

