-- 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 PACKAGE desgloce IS
   procedure agregar_denominacion(valor in number);
   function obtener_valor(indice in number) return number;
   function obtener_cantidad(indice in number) return number;
   procedure acumular_cantidad(x in number);
   function obtener_primer_moneda(saldo in number) return number;
   function obtener_siguiente_moneda(saldo in number) return number;
   function total_denominaciones return number;
END;
/

CREATE OR REPLACE PACKAGE BODY desgloce IS
   Type TRecord is Record (valor Number, cantidad Number);
   Type TTable  is Table Of TRecord index by binary_integer;
   monedas TTable;
   actual  number(2):=0;
   cantidad_denominaciones number(2):=0;
   procedure agregar_denominacion(valor in number) is
   begin
      cantidad_denominaciones:=cantidad_denominaciones+1;
      monedas(cantidad_denominaciones).valor:=valor;
      monedas(cantidad_denominaciones).cantidad:=0;
   end;
   function obtener_valor(indice in number) return number is
   begin
      return monedas(indice).valor;
   end;
   function obtener_cantidad(indice in number) return number is
   begin
      return monedas(indice).cantidad;
   end;
   procedure acumular_cantidad(x in number) is
   begin
      monedas(actual).cantidad:=monedas(actual).cantidad+x;
   end;
   function obtener_primer_moneda(saldo in number) return number is
   begin
      actual:=cantidad_denominaciones;
      for i in reverse 1..cantidad_denominaciones-1
      loop
         exit when saldo>=monedas(i).valor;
         actual:=i;
      end loop;
      return monedas(actual).valor;
   end;
   function obtener_siguiente_moneda(saldo in number) return number is
      mayor number:=actual-1;
   begin
      for i in reverse 1..mayor
      loop
         actual:=i;
         exit when saldo>=monedas(i).valor;
      end loop;
      return monedas(actual).valor;
   end;
   function total_denominaciones return number is
   begin
      return cantidad_denominaciones;
   end;
END;
/

GRANT EXECUTE ON DESGLOCE TO PUBLIC;
