CREATE OR REPLACE
PROCEDURE CALCULOS_GPA(
    P_CDEMPRESA   IN  BEMATIVO.CDEMPRESA%TYPE,        -- Empresa
    P_CDGRUPOBEM  IN  BEMATIVO.CDGRUPOBEM%TYPE,       -- Grupo de Bem 
    P_TIPODEPREC  IN  BEMATIVO.CDTIPODEPREC%TYPE,     -- Tipo de Deprecicao
    P_REGIME      IN  BEMATIVO.CDREGIMEBEM%TYPE,      -- Regime 
    P_USADO       IN  BEMATIVO.IDNOVOUSABEM%TYPE,     -- Usado   
    P_MESUSADO    IN  BEMATIVO.QTMESUSOBEM%TYPE ,      -- Meses usados
    P_DEPRECIA    OUT GRUPOBEM.IDDEPRECIAGRBEM%TYPE,  -- Ret. saber se deprecia (Contabil)
    P_DEPRECIAFI  OUT GRUPOBEM.IDDEPRECIAGRBEM%TYPE,  -- Ret. saber se deprecia (Fiscal)
    P_MESES       OUT FLOAT,                          -- Ret. sab
    P_MESESFI     OUT FLOAT,                          -- Ret. sab
    P_VIDAUTIL    OUT FLOAT,                          -- Ret. Vida util  (Contabil)
    P_VIDAUTILFI  OUT FLOAT)                          -- Ret. Vida util  (Fiscal)
IS
   /* Variaveis para receber os dados do Grupo de Bem*/
   V_IDDEPRECIAGRBEM VARCHAR2(01);
   V_QTMESDEPREGRBEM FLOAT;
   V_IDDEPRECIAFISC  VARCHAR2(01);
   V_QTMESDEPREFISC  FLOAT;
   /* Variaveis para receber os dados do Tipo de Depreciacao */
   V_NRCOETIPODEP    FLOAT;
   V_VRTXINCFISTPDEP FLOAT;
   V_NRCOETIPODEPFIS FLOAT;
   V_VRTXINCFISTPFIS FLOAT;
   /* Variaveis para receber os dados do Regime */
   V_IDDEPREGBEM     VARCHAR2(01);
   V_IDDEPREGBEMFIS  VARCHAR2(01);
   /* Variaveis para Calculo vida util e meses */
   V_VIDAUTIL     FLOAT;
   V_TAXABASICA   FLOAT;
   V_VIDAUTILFI   FLOAT;
   V_TAXABASICAFI FLOAT;
   V_TAXACONT     FLOAT;
   V_MESCONT      FLOAT;
   V_TAXAFISC     FLOAT;
   V_MESFISC      FLOAT;
   V_MESUSADO     BEMATIVO.QTMESUSOBEM%TYPE;
   V_USADO        BEMATIVO.IDNOVOUSABEM%TYPE;
BEGIN
   IF P_USADO IS NULL THEN
      V_USADO := 'N';
   ELSE 
      V_USADO := P_USADO;
   END IF;
   
   IF V_USADO = 'U' THEN
      IF P_MESUSADO IS NULL THEN
         V_MESUSADO := 0;
      ELSE 
         V_MESUSADO := P_MESUSADO;
      END IF;
   ELSE
      V_MESUSADO := 0;
   END IF;   
   
   /*RECEBE DADOS DO GRUPO DE BEM */
   BEGIN
      SELECT NVL(IDDEPRECIAGRBEM,'N'), NVL(QTMESDEPREGRBEM,1), NVL(IDDEPRECIAFISC,'N'), NVL(QTMESDEPREFISC,1)
        INTO V_IDDEPRECIAGRBEM, V_QTMESDEPREGRBEM, V_IDDEPRECIAFISC, V_QTMESDEPREFISC
        FROM GRUPOBEM
       WHERE CDEMPRESA = P_CDEMPRESA
         AND CDGRUPOBEM = P_CDGRUPOBEM;
   EXCEPTION   
      WHEN NO_DATA_FOUND THEN
        V_IDDEPRECIAGRBEM := 'N';
        V_QTMESDEPREGRBEM := 1;
        V_IDDEPRECIAFISC  := 'N';
        V_QTMESDEPREFISC  := 1;
   END;
   /*RECEBE DADOS DO TIPO DE DEPRECIACAO */
   BEGIN
      SELECT NVL(NRCOETIPODEP,1), NVL(VRTXINCFISTPDEP,0), NVL(NRCOETIPODEPFIS,1), NVL(VRTXINCFISTPFIS,0)
        INTO V_NRCOETIPODEP, V_VRTXINCFISTPDEP, V_NRCOETIPODEPFIS, V_VRTXINCFISTPFIS
        FROM TIPODEPREC
       WHERE CDEMPRESA = P_CDEMPRESA
         AND CDTIPODEPREC = P_TIPODEPREC;   
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
        V_NRCOETIPODEP    := 1;
        V_VRTXINCFISTPDEP := 0;
        V_NRCOETIPODEPFIS := 1;
        V_VRTXINCFISTPFIS := 0;
   END;
   /*RECEBE DADOS DO REGIME */
   BEGIN 
      SELECT IDDEPREGBEM, IDDEPREGBEMFIS 
        INTO V_IDDEPREGBEM, V_IDDEPREGBEMFIS
        FROM REGIMEBEM
       WHERE CDEMPRESA = P_CDEMPRESA
         AND CDREGIMEBEM = P_REGIME;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
      V_IDDEPREGBEM    := 'N';
      V_IDDEPREGBEMFIS := 'N';
   END;
   /*1 - Verificar se sofre depreciacao */
   /*Contabil*/
   IF V_IDDEPRECIAGRBEM = 'S'  AND  V_IDDEPREGBEM = 'S' THEN
      P_DEPRECIA := 'S';
   ELSE 
      P_DEPRECIA := 'N';
   END IF;
  ----------------------------------------
  /*Fiscal*/
   IF V_IDDEPRECIAFISC = 'S'  AND  V_IDDEPREGBEMFIS = 'S' THEN
      P_DEPRECIAFI := 'S';
   ELSE 
      P_DEPRECIAFI := 'N';
   END IF;
  /*2 - Calculos de depreciacao */ 
  /*Contabil*/
  IF V_USADO = 'N' THEN
     V_VIDAUTIL := V_QTMESDEPREGRBEM;
  ELSE
     V_VIDAUTIL := V_QTMESDEPREGRBEM;
  END IF;
  ----------------------------------------
  /*Fiscal*/
  IF V_USADO = 'N' THEN
     V_VIDAUTIL := V_QTMESDEPREGRBEM;
  ELSE
     V_VIDAUTIL := V_QTMESDEPREGRBEM;
  END IF;
  /*3 - Calculo da Vida Util */ 
  /*Contabil*/ 
  IF V_VIDAUTIL > 0 THEN
     V_TAXABASICA := (100/V_VIDAUTIL)*12;
     V_TAXABASICA := V_TAXABASICA + (V_TAXABASICA * (V_VRTXINCFISTPDEP/100));
     V_TAXACONT :=  V_TAXABASICA * V_NRCOETIPODEP;
     V_MESCONT :=   (100/V_TAXACONT)*12;
  ELSE
     V_VIDAUTIL := 1;
     V_TAXABASICA := (100/V_VIDAUTIL)*12;
     V_TAXABASICA := V_TAXABASICA + (V_TAXABASICA * (V_VRTXINCFISTPDEP/100));
     V_TAXACONT :=  V_TAXABASICA * V_NRCOETIPODEP;
     V_MESCONT :=   (100/V_TAXACONT)*12;
  END IF;
  P_MESES :=  ROUND(V_MESCONT, 2);
  P_VIDAUTIL := ROUND(V_TAXACONT, 2);
  ----------------------------------------
  /*Fiscal*/    
   IF V_VIDAUTILFI > 0 THEN
     V_TAXABASICAFI := (100/V_VIDAUTILFI)*12;
     V_TAXABASICAFI := V_TAXABASICAFI + (V_TAXABASICAFI * (V_VRTXINCFISTPFIS/100));
     V_TAXAFISC :=  V_TAXABASICAFI * V_NRCOETIPODEPFIS;
     V_MESFISC :=   (100/V_TAXAFISC)*12;
  ELSE
     V_VIDAUTILFI := 1;
     V_TAXABASICAFI := (100/V_VIDAUTILFI)*12;
     V_TAXABASICAFI := V_TAXABASICAFI + (V_TAXABASICAFI * (V_VRTXINCFISTPFIS/100));
     V_TAXAFISC :=  V_TAXABASICAFI * V_NRCOETIPODEPFIS;
     V_MESFISC:=   (100/V_TAXAFISC)*12;
  END IF; 
  P_MESESFI := ROUND(V_MESFISC, 2);  
  P_VIDAUTILFI := ROUND(V_TAXAFISC, 2);  
END;
/