---MANEJADOR DE CONSECUTIVOS DEL MODULO DE PROYECTOS
Create or replace package PryConsec is

   Function Siguiente(pCia in varchar2, pClase in varchar2, pBloque in varchar2) return number;

   Procedure DatosClase(pCia in Varchar2, pClase in Varchar2, pInicio out Number, pCantidad out Number);

   Procedure RegistraBloque(pCia in varchar2, pClase in varchar2, pBloque in varchar2, pInicio in number, pCantidad in number);

   Procedure AsignaBloque(pCia in varchar2, pClase in varchar2, pBloque in varchar2, 
                          pInicio out Number, pCant out Number);

   Function ConsExistBloq(pCia in Varchar2, pBloque in Varchar2, pClase in Varchar2, 
                          pCons in Number) Return Boolean;

End PryConsec;
/

Create or replace package body PryConsec is

   Function Siguiente(pCia in varchar2, pClase in varchar2, pBloque in varchar2) return number is
      pragma autonomous_transaction;
      Vcons PryBloques.actual%type;

      cursor BloqueA is
         Select actual
         from PryBloques
         where Cia    = pCia
           and Clase  = pClase
           and Bloque = pBloque
           and actual < inicio + cantidad
         order by inicio
         for update of actual;
   Begin
      open BloqueA;
      fetch bloqueA into vCons;

      if vCons is not null then
         update PryBloques
            set actual=actual+1
         where current of BloqueA;

      end if;

      close BloqueA;

      If vCons Is Null Then
         raise_application_error(-20001,'AVISO <PryConsec.Siguiente>: El Consecutivo bloque '||pCia||
                                        '-'||pClase||'-'||pBloque||' no existe.');
      End If;

      commit;

      return Vcons;
   End Siguiente;

   --Retorna el valor siguiente a aplicar a una clase
   Function Siguiente(pCia in varchar2, pClase in varchar2, pCant in number default 1) return number is
      pragma autonomous_transaction;
      Vcons PryConsecutivo.Documento%type;
   Begin
      update PryConsecutivo
         set Documento = Documento + pCant
      where Cia   = pCia
        and Clase = pClase
      returning Documento-pCant into vCons;

     commit;

     if vCons is null then
         raise_application_error(-20002,'AVISO <PryConsec.Siguiente>: El Consecutivo '||pCia||
                                        '-'||pClase||' no existe!');
     end if;
     return Vcons;
   End Siguiente;

   Procedure DatosClase(pCia in Varchar2, pClase in Varchar2, pInicio out Number, pCantidad out Number) Is
   Begin
      Select Documento, DocsBloque
        Into pInicio, pCantidad
      From PryConsecutivo
      Where Cia   = pCia
        And Clase = pClase;
   Exception
      When No_Data_Found Then
         Raise_Application_Error(-20003,'AVISO <PryConsec.DatosClase>: El Consecutivo '||pCia||'-'||pClase||' no existe.');
   End DatosClase;

   Procedure RegistraBloque(pCia in varchar2, pClase in varchar2, pBloque in varchar2, pInicio in number, pCantidad in number) is
   Begin
      insert into PryBloques(Cia, Clase, BLOQUE, INICIO, ACTUAL, CANTIDAD)
                     values (pCia, pClase, pBloque, pInicio, pInicio, pCantidad);
   End RegistraBloque;

   Procedure AsignaBloque(pCia in varchar2, pClase in varchar2, pBloque in varchar2, 
                          pInicio out Number, pCant out Number) is
   Begin
      DatosClase(pCia, pClase, pInicio, pCant);
      pInicio := Siguiente(pCia, pClase, pCant);
      RegistraBloque(pCia, pClase, pBloque, pInicio, pCant);
   End AsignaBloque;

   Function ConsExistBloq(pCia in Varchar2, pBloque in Varchar2, pClase in Varchar2, 
                          pCons in Number) Return Boolean Is

      Cursor Bloques Is Select 1
                        From PryBloques
                        Where Cia    = pCia
                          And Bloque = pBloque
                          And Clase  = pClase
                          And pCons Between Inicio And Inicio + Cantidad - 1;

      vDummy Number(1);
   Begin
      Open Bloques;
      Fetch Bloques Into vDummy;
      Close Bloques;

      Return vDummy Is Not Null;       
   End ConsExistBloq;
End PryConsec;
/