-- DERECHOS DE AUTOR ING. MARCO T. GONZALEZ
-- DESARROLLO CREATIVO S.A.
-- LICENCIA DE USO A DENEINSA
-- SECRETO COMERCIAL PROTEGIDO POR ACUERDO DE NO DIVULGACION

CREATE OR REPLACE TRIGGER ACTUALIZA_COMPROMETIDO
AFTER INSERT OR UPDATE OR DELETE ON Inv_DetMovimiento
FOR EACH ROW
WHEN (NEW.TIP_MOVTO='S')
Declare
   cantidad number(14,4);
   procedure Actualizar(Pcia in char, Pbod in char, Part in varchar2, Plot in varchar2,
                        Pmed in varchar2, PCant in number) is
      Vmed      inv_articulo.medida%type;
      Vcant     inv_lote_artic_bodega.can_apartado%type:=Pcant;
   Begin
      if Pcant!=0 then
         Vmed:=Conversion.ObtMedida(Pcia, Part);
         if Vmed!=Pmed then
            Conversion.Fijar_medida(1, Vmed);
            Vcant:=Conversion.Factor_estandar(Pcant, Pmed);
         end if;
         update inv_lote_artic_bodega
            Set can_apartado=Can_apartado+VCant
         where cod_cia=Pcia
           and cod_bodega=Pbod
           and cod_articulo=Part
           and cod_lote=Plot;
         if sql%notfound then
            insert into inv_lote_artic_bodega
                (cod_cia, cod_bodega, cod_lote, cod_articulo,
                 can_existe, can_entrada, can_salida,can_apartado)
               values (Pcia, Pbod, Plot, Part, 0, 0, 0, Vcant);
         end if;
      end if;
   End;
BEGIN
   -- Suponemos que no cambiaron (cod_cia, cod_bodega, cod_lote, cod_articulo, medida)
   Cantidad:=0;
   If Inserting Then
      if :new.estado = 'C' then
         Actualizar(:new.cod_cia, :new.cod_bodega, :new.cod_articulo, :new.cod_lote,
                    :new.medida, :new.can_articulo-:new.can_despachada);
      end if;
   elsif Updating then
      if :new.estado = 'C' then
         Cantidad:=:new.can_articulo-:new.can_despachada;
      end if;
      if :old.estado = 'C' then
         Cantidad:=Cantidad-:old.can_articulo+:old.can_despachada;
      end if;
      Actualizar(:old.cod_cia, :old.cod_bodega, :old.cod_articulo, :old.cod_lote,
                 :old.medida, Cantidad);
   elsif Deleting then
      if :old.estado = 'C' then
         Actualizar(:old.cod_cia, :old.cod_bodega, :old.cod_articulo, :old.cod_lote,
                    :old.medida, -:old.can_articulo+:old.can_despachada);
      end if;
   end if;
END;
/
