CREATE OR REPLACE PROCEDURE AUMENTA_PERCENTUAL_PRECO(
  P_CDFILIAL         IN FILIAL.CDFILIAL%TYPE,
  P_CDCIA            IN COMPANHIA.CDCIA%TYPE,
  P_NRTABPRECO       IN TABPRECOSEM.NRTABPRECO%TYPE,
  P_GERATABELA       IN VARCHAR2,
  P_NOMETABELA       IN VARCHAR2,
  P_NRSERVICOCIAFILI IN VARCHAR2,
  P_VRPERCENTUAL     IN FLOAT,
  P_DATAINIVIGENCIA  IN DATE,
  P_DATAFIMVIGENCIA  IN DATE,
  P_CDOPERADOR IN VARCHAR2,
  P_NRORG IN NUMBER DEFAULT 1,
  P_CDMANCIA IN VARCHAR2,
  P_NRLISTAERROS OUT NUMBER 
)
AS

   V_CDCLASSE  VARCHAR2(04);
   V_SEQUENCIAL VARCHAR2(20);
   V_NRTABPRECO VARCHAR2(03);
   V_TABELAS_NO_PERIODO NUMBER;
   V_IDVINCULOMANUAL VARCHAR2(1);
   V_CDMANCIA VARCHAR2(4);
   V_SERVICO VARCHAR2(2000);
   V_IDPROPORCAO VARCHAR2(1);
   V_QTPROPORCAO FLOAT;
   V_IDPROPSUBSEMAM VARCHAR2(1); 
   V_QTPROPSUBSEMAM FLOAT;
   V_NUMERO_MANUAIS NUMBER;
   
   V_QTSUBGRU NUMBER;   
   
   V_NUM_PROPORCOES NUMBER;
   V_CDSUBGRU VARCHAR2(10);   
   V_SUBGRUTABPRECOM NUMBER;
BEGIN   
   IF P_GERATABELA = 'N' THEN

      UPDATE PRECOSECIAM
         SET VRPRESERV  = ROUND(( NVL(VRPRESERV,0) * ((P_VRPERCENTUAL/100) + 1) ), 2),
             VRPRESERVD = ROUND(( NVL(VRPRESERVD,0) * ((P_VRPERCENTUAL/100) + 1) ), 2)
       WHERE CDFILIAL   = P_CDFILIAL
         AND CDCIA      = P_CDCIA
         AND NRTABPRECO = P_NRTABPRECO
         AND ((INSTR(P_NRSERVICOCIAFILI,NRSERVICOCIAFILI||'/'||CDCLASSE||'/'||CDCICLO||'_')  > 0) OR (P_NRSERVICOCIAFILI = 'T'));

      UPDATE PROPRECOSEM
         SET VRPRESERVPRO  = ROUND(NVL(VRPRESERVPRO,0) * ((P_VRPERCENTUAL/100) + 1), 2),
             VRPRESERVDPRO = ROUND(NVL(VRPRESERVDPRO,0) * ((P_VRPERCENTUAL/100) + 1), 2)
       WHERE CDFILIAL   = P_CDFILIAL
         AND CDCIA      = P_CDCIA
         AND NRTABPRECO = P_NRTABPRECO
         AND ((INSTR(P_NRSERVICOCIAFILI,NRSERVICOCIAFILI||'/'||CDCLASSE||'/'||CDCICLO||'_')  > 0) OR (P_NRSERVICOCIAFILI = 'T'));
      
      UPDATE SUBGRUTABPRECOM
         SET VRPRECOSUBGRU = ROUND(NVL(VRPRECOSUBGRU, 0.0) * ((P_VRPERCENTUAL/100) + 1), 2),
             VRPRECOSUBGRUD = ROUND(NVL(VRPRECOSUBGRUD, 0.0) * ((P_VRPERCENTUAL/100) + 1), 2)
        WHERE CDFILIAL   = P_CDFILIAL
         AND CDCIA      = P_CDCIA
         AND NRTABPRECO = P_NRTABPRECO
         AND ((INSTR(P_NRSERVICOCIAFILI,NRSERVICOCIAFILIPRECO||'/'||CDCLASSE||'/'||CDCICLO||'_')  > 0) OR (P_NRSERVICOCIAFILI = 'T'));
   ELSE
      SELECT MAX(IDVINCULOMANUAL)
       INTO V_IDVINCULOMANUAL
       FROM CIAFILI
      WHERE CDFILIAL = P_CDFILIAL
        AND CDCIA = P_CDCIA;

      SELECT MAX(CDMANCIA)
        INTO V_CDMANCIA
        from TABPRECOSEM
        WHERE CDFILIAL = P_CDFILIAL
          AND CDCIA = P_CDCIA
          AND NRTABPRECO = P_NRTABPRECO;

      NOVO_CODIGO('TABELA/PRECO' || P_CDFILIAL || P_CDCIA, V_SEQUENCIAL);
      V_NRTABPRECO := SUBSTR(V_SEQUENCIAL, -3);
      
      SELECT COUNT(1)
        INTO V_TABELAS_NO_PERIODO
        FROM TABPRECOSEM
       WHERE CDFILIAL = P_CDFILIAL
         AND CDCIA = P_CDCIA
         AND (P_DATAINIVIGENCIA BETWEEN DTINIVIGTAB AND DTFIMVIGTAB OR
              P_DATAFIMVIGENCIA BETWEEN DTINIVIGTAB AND DTFIMVIGTAB OR
              DTINIVIGTAB BETWEEN P_DATAINIVIGENCIA AND P_DATAFIMVIGENCIA OR
              DTFIMVIGTAB BETWEEN P_DATAINIVIGENCIA AND P_DATAFIMVIGENCIA);

      IF V_TABELAS_NO_PERIODO > 0 THEN
        /*Operacao bloqueada. Ja existe tabela de preco cadastrada para este periodo.*/
        RAISE_APPLICATION_ERROR(-20000,'APPERRMSGSTR' || 'APP-00064'||  'APPERRMSGEND');
      END IF;

      INSERT INTO TABPRECOSEM
      (CDFILIAL, CDCIA, NRTABPRECO,NMTABPRECO,
       DTINIVIGTAB, DTFIMVIGTAB,
       NRORG, NRORGINCLUSAO, NRORGULTATU,
       CDOPERINCLUSAO, CDOPERULTATU,
       DTINCLUSAO, DTULTATU, IDATIVO)
      VALUES
      (P_CDFILIAL, P_CDCIA, V_NRTABPRECO, P_NOMETABELA,
       P_DATAINIVIGENCIA, P_DATAFIMVIGENCIA,
       P_NRORG, P_NRORG, P_NRORG,
       P_CDOPERADOR, P_CDOPERADOR,
       SYSDATE, SYSDATE, 'S');

      FOR CUR_MAN IN (
      SELECT CDMANCIA
        FROM MANUALCIAM
       WHERE CDFILIAL = P_CDFILIAL
         AND CDCIA = P_CDCIA
         AND IDSITUAPROPCIA IN ('A', 'P')
         AND INSTR(P_CDMANCIA, CDMANCIA) > 0
      ) LOOP
         INSERT INTO TABPRECOMENUGRID
         (CDFILIAL, CDCIA, NRTABPRECO, CDMANCIA,
          NRORG, NRORGINCLUSAO, NRORGULTATU,
          DTINCLUSAO, DTULTATU,
          CDOPERINCLUSAO, CDOPERULTATU, IDATIVO)
         VALUES
         (P_CDFILIAL, P_CDCIA, V_NRTABPRECO, CUR_MAN.CDMANCIA,
          P_NRORG, P_NRORG, P_NRORG,
          SYSDATE, SYSDATE,
          P_CDOPERADOR, P_CDOPERADOR, 'S');
      END LOOP;

      FOR CUR_ITENS IN
      (
        SELECT I.NRSERVICOCIAFILI, I.CDCLASSE, I.CDCICLO,
               I.IDPROPORCAO, I.QTPROPORCAO, 
               SCF.DSSERVICOCIAFILI, CL.SGCLASSE, CI.IDCICLO, I.NRSEQPRECO,
               P_DATAINIVIGENCIA, P_DATAFIMVIGENCIA, SG.IDSERVICO,
               NVL(I.VRPRESERV,0) AS VRPRESERV,
               NVL(I.VRPRESERVD,0) AS VRPRESERVD
        FROM (SELECT CDFILIAL, CDCIA, NRTABPRECO, NRSERVICOCIAFILI, CDCLASSE, CDCICLO, NRSEQPRECO, IDPROPORCAO, QTPROPORCAO,
                     VRPRESERV, VRPRESERVD
                FROM
              (
              SELECT CDFILIAL, CDCIA, NRTABPRECO, NRSERVICOCIAFILI, CDCLASSE, CDCICLO, NRSEQPRECO, IDPROPORCAO, QTPROPORCAO,
                     ROUND(( NVL(VRPRESERV,0) * ((P_VRPERCENTUAL/100) + 1) ), 2) AS VRPRESERV,
                     ROUND(( NVL(VRPRESERVD,0) * ((P_VRPERCENTUAL/100) + 1) ), 2) AS VRPRESERVD,
                     ROW_NUMBER() OVER(PARTITION BY CDFILIAL, CDCIA, NRTABPRECO, NRSERVICOCIAFILI, CDCLASSE, CDCICLO
                                           ORDER BY DTINIVIGSE, DTFIMVIGSE) AS ORDEM,
                     COUNT(1) OVER(PARTITION BY CDFILIAL, CDCIA, NRTABPRECO, NRSERVICOCIAFILI, CDCLASSE, CDCICLO) AS QUANTIDADE                             
                FROM PRECOSECIAM
               WHERE CDFILIAL = P_CDFILIAL
                 AND CDCIA = P_CDCIA
                 AND NRTABPRECO = P_NRTABPRECO
              )
              WHERE ORDEM = QUANTIDADE) I
             INNER JOIN SERVICOCIAFILI SCF ON SCF.CDFILIAL = I.CDFILIAL AND
                                                 SCF.CDCIA = I.CDCIA AND
                                                 SCF.NRSERVICOCIAFILI  = I.NRSERVICOCIAFILI
             INNER JOIN SERVICOGEN SG ON SG.NRSERVICOGEN = SCF.NRSERVICOGEN
             INNER JOIN CLASSE CL ON CL.CDCLASSE = I.CDCLASSE
             INNER JOIN CICLO CI ON CI.CDCICLO = I.CDCICLO
       WHERE I.CDFILIAL   = P_CDFILIAL
         AND I.CDCIA      = P_CDCIA
         AND I.NRTABPRECO = P_NRTABPRECO         
         AND ((INSTR(P_NRSERVICOCIAFILI,I.NRSERVICOCIAFILI||'/'||I.CDCLASSE||'/'||I.CDCICLO||'_')  > 0) OR (P_NRSERVICOCIAFILI = 'T'))
      ) LOOP

        V_IDPROPORCAO := CUR_ITENS.IDPROPORCAO;
        V_QTPROPORCAO := CUR_ITENS.QTPROPORCAO;
        /*Servico $param[0] da classe $param[1] e ciclo $param[2]*/
        V_SERVICO := CUR_ITENS.DSSERVICOCIAFILI||'$$'||CUR_ITENS.SGCLASSE||'$$'||CUR_ITENS.IDCICLO;

        IF V_IDVINCULOMANUAL = 'S' AND 
           CUR_ITENS.IDSERVICO NOT IN ('3', '5') THEN
           SELECT MAX(CDMANCIA), COUNT(1)             
             INTO V_CDMANCIA, V_NUMERO_MANUAIS
             FROM (SELECT DISTINCT P.CDMANCIA 
                     FROM PRECOSESUBGRU P 
                               INNER JOIN TABPRECOMENUGRID T ON T.CDFILIAL = P.CDFILIAL AND T.CDCIA = P.CDCIA AND T.CDMANCIA = P.CDMANCIA
                    WHERE T.CDFILIAL = P_CDFILIAL
                      AND T.CDCIA = P_CDCIA
                      AND T.NRTABPRECO = V_NRTABPRECO 
                      AND P.CDFILIAL = P_CDFILIAL
                      AND P.CDCIA = P_CDCIA
                      AND INSTR(P_CDMANCIA, P.CDMANCIA) > 0
                      AND P.NRSERVICOCIAFILIPRECO = CUR_ITENS.NRSERVICOCIAFILI
                      AND P.CDCLASSE = CUR_ITENS.CDCLASSE
                      AND P.CDCICLO = CUR_ITENS.CDCICLO);
                    
           IF V_NUMERO_MANUAIS > 1 THEN              
              INSERE_LISTA_ERROS(P_CDFILIAL, 'APPERRMSGSTR'||'APP-00069'||'$$'||V_SERVICO||'APPERRMSGEND', P_CDOPERADOR, P_NRORG, P_NRLISTAERROS);
              CONTINUE;
           ELSIF V_NUMERO_MANUAIS = 0 THEN              
              INSERE_LISTA_ERROS(P_CDFILIAL, 'APPERRMSGSTR'||'APP-00070'||'$$'||V_SERVICO||'APPERRMSGEND', P_CDOPERADOR, P_NRORG, P_NRLISTAERROS);
              CONTINUE;
           END IF;
        END IF;

        INSERT INTO PRECOSECIAM
        (CDFILIAL, CDCIA, NRTABPRECO, NRSERVICOCIAFILI,
         CDCLASSE, CDCICLO,
         IDPROPORCAO, QTPROPORCAO,NRSEQPRECO,
         DTINIVIGSE, DTFIMVIGSE,
         VRPRESERV, VRPRESERVD, CDMANCIA,
         NRORG, NRORGINCLUSAO, NRORGULTATU,
         CDOPERINCLUSAO, CDOPERULTATU,
         DTINCLUSAO, DTULTATU, IDATIVO)
        VALUES
        (P_CDFILIAL, P_CDCIA, V_NRTABPRECO, CUR_ITENS.NRSERVICOCIAFILI,
         CUR_ITENS.CDCLASSE, CUR_ITENS.CDCICLO,
         V_IDPROPORCAO, V_QTPROPORCAO, CUR_ITENS.NRSEQPRECO,
         P_DATAINIVIGENCIA, P_DATAFIMVIGENCIA,
         CUR_ITENS.VRPRESERV, CUR_ITENS.VRPRESERVD, V_CDMANCIA,
         P_NRORG,P_NRORG, P_NRORG,
         P_CDOPERADOR, P_CDOPERADOR,
         SYSDATE, SYSDATE, 'S');

        /*Preenche subgrupos vinculados ao item de faturamento*/
        IF V_IDVINCULOMANUAL = 'S' AND 
           CUR_ITENS.IDSERVICO NOT IN ('3', '5') THEN           

           V_NUM_PROPORCOES := 0;
           FOR CUR_SUB IN 
           (
           SELECT S.NRSERVICOCIAFILI, S.CDSUBGRU, S.NRSEQSUBGRUSEMAM, S.IDPROPSUBSEMAM, S.QTPROPSUBSEMAM
             FROM PRECOSESUBGRU P INNER JOIN SUBGRUSEMAM S ON S.CDFILIAL = P.CDFILIAL AND
                                                                  S.CDCIA = P.CDCIA AND
                                                                  S.CDMANCIA = P.CDMANCIA AND
                                                                  S.NRSERVICOCIAFILI = P.NRSERVICOCIAFILI AND
                                                                  S.CDCLASSE = P.CDCLASSE AND
                                                                  S.CDSUBGRU = P.CDSUBGRU AND
                                                                  S.NRSEQSUBGRUSEMAM = P.NRSEQSUBGRUSEMAM
                                  INNER JOIN MANUALCIAM M ON M.CDFILIAL = P.CDFILIAL AND
                                                             M.CDCIA = P.CDCIA AND
                                                             M.CDMANCIA = P.CDMANCIA
            WHERE P.CDFILIAL = P_CDFILIAL
              AND P.CDCIA = P_CDCIA
              AND P.CDMANCIA = V_CDMANCIA
              AND P.CDCLASSE = CUR_ITENS.CDCLASSE              
              AND P.CDCICLO = CUR_ITENS.CDCICLO
              AND P.NRSERVICOCIAFILIPRECO = CUR_ITENS.NRSERVICOCIAFILI
              AND (M.IDSITUAPROPCIA = 'P' OR 
                  (P_DATAINIVIGENCIA BETWEEN S.DTINIVGSUMA AND S.DTFIMVGSUMA OR
                   P_DATAFIMVIGENCIA BETWEEN S.DTINIVGSUMA AND S.DTFIMVGSUMA OR
                   S.DTINIVGSUMA BETWEEN P_DATAINIVIGENCIA AND P_DATAFIMVIGENCIA OR
                   S.DTFIMVGSUMA BETWEEN P_DATAINIVIGENCIA AND P_DATAFIMVIGENCIA))
           ) LOOP
              NOVO_CODIGO_NT('SUBGRUTABPRECOM' || P_CDFILIAL || P_CDCIA||V_NRTABPRECO || TO_CHAR(CUR_ITENS.NRSEQPRECO), V_SEQUENCIAL);
              V_SUBGRUTABPRECOM := TO_NUMBER(V_SEQUENCIAL);

              INSERT INTO SUBGRUTABPRECOM
              (CDFILIAL, CDCIA, NRTABPRECO, NRSERVICOCIAFILIPRECO, 
               CDCLASSE, CDCICLO, NRSEQPRECO,
               NRSUBGRUTABPRECOM, CDMANCIA, NRSERVICOCIAFILI, CDSUBGRU, NRSEQSUBGRUSEMAM,
               IDPROPSUBSEMAM, QTPROPSUBSEMAM, 
               NRORG, NRORGINCLUSAO, NRORGULTATU,
               DTINCLUSAO, DTULTATU,
               CDOPERINCLUSAO, CDOPERULTATU, IDATIVO)
              VALUES
              (P_CDFILIAL, P_CDCIA, V_NRTABPRECO, CUR_ITENS.NRSERVICOCIAFILI,
               CUR_ITENS.CDCLASSE, CUR_ITENS.CDCICLO, CUR_ITENS.NRSEQPRECO,
               V_SUBGRUTABPRECOM, V_CDMANCIA, CUR_SUB.NRSERVICOCIAFILI, CUR_SUB.CDSUBGRU, CUR_SUB.NRSEQSUBGRUSEMAM,
               CUR_SUB.IDPROPSUBSEMAM, CUR_SUB.QTPROPSUBSEMAM,
               P_NRORG,P_NRORG,P_NRORG,
               SYSDATE, SYSDATE,
               P_CDOPERADOR, P_CDOPERADOR, 'S');

              V_NUM_PROPORCOES := V_NUM_PROPORCOES + 1;
           END LOOP;
           
           IF V_NUM_PROPORCOES = 0 THEN           
              DELETE FROM PRECOSECIAM 
               WHERE CDFILIAL = P_CDFILIAL
                 AND CDCIA = P_CDCIA
                 AND NRTABPRECO = V_NRTABPRECO
                 AND NRSERVICOCIAFILI = CUR_ITENS.NRSERVICOCIAFILI
                 AND CDCLASSE = CUR_ITENS.CDCLASSE
                 AND CDCICLO = CUR_ITENS.CDCICLO
                 AND NRSEQPRECO = CUR_ITENS.NRSEQPRECO;                 
              /* Item de faturamento $param[0] da classe $param[1] e ciclo $param[2] nao vinculado a subgrupos do menu grid $param[3]. */
              INSERE_LISTA_ERROS(P_CDFILIAL, 'APPERRMSGSTR' || 'APP-00072'|| '$$' || V_SERVICO || '$$' || V_CDMANCIA || 'APPERRMSGEND', P_CDOPERADOR, P_NRORG, P_NRLISTAERROS);
              CONTINUE;
           END IF;
           
        END IF;

        IF (V_IDVINCULOMANUAL <> 'S') OR  
           (CUR_ITENS.IDSERVICO IN ('3', '5')) THEN
          INSERT INTO PROPORCAOPRECO
          (CDFILIAL, CDCIA, NRTABPRECO,
           NRSERVICOCIAFILI, CDCLASSE, CDCICLO,
           NRSEQPRECO, QTPAXDE, QTPAXATE, QTSERVICO,
           NRORG, NRORGINCLUSAO, NRORGULTATU,
           CDOPERINCLUSAO, CDOPERULTATU,
           DTINCLUSAO, DTULTATU, IDATIVO)
          SELECT I.CDFILIAL, I.CDCIA, V_NRTABPRECO,
                 I.NRSERVICOCIAFILI, I.CDCLASSE, I.CDCICLO,
                 I.NRSEQPRECO, I.QTPAXDE, I.QTPAXATE, I.QTSERVICO,
                 P_NRORG, P_NRORG, P_NRORG,
                 P_CDOPERADOR, P_CDOPERADOR,
                 SYSDATE, SYSDATE, 'S'
            FROM PROPORCAOPRECO I
           WHERE I.CDFILIAL   = P_CDFILIAL
             AND I.CDCIA      = P_CDCIA
             AND I.NRTABPRECO = P_NRTABPRECO
             AND I.NRSERVICOCIAFILI = CUR_ITENS.NRSERVICOCIAFILI
             AND I.CDCLASSE = CUR_ITENS.CDCLASSE
             AND I.CDCICLO = CUR_ITENS.CDCICLO
             AND I.NRSEQPRECO = CUR_ITENS.NRSEQPRECO;
        END IF;

        INSERT INTO PROPRECOSEM
        (CDFILIAL, CDCIA, NRTABPRECO, NRSERVICOCIAFILI,
         CDCLASSE, CDCICLO, NRSEQPRECO, QTPAXINICIAL, QTPAXFINAL,
         VRPRESERVPRO, VRPRESERVDPRO,
         NRORG, NRORGINCLUSAO, NRORGULTATU,
         CDOPERINCLUSAO, CDOPERULTATU,
         DTINCLUSAO, DTULTATU, IDATIVO)
        SELECT I.CDFILIAL, I.CDCIA, V_NRTABPRECO, I.NRSERVICOCIAFILI,
               I.CDCLASSE, I.CDCICLO, I.NRSEQPRECO, I.QTPAXINICIAL, I.QTPAXFINAL,
               ROUND(NVL(I.VRPRESERVPRO,0) * ((P_VRPERCENTUAL/100) + 1), 2),
               ROUND(NVL(I.VRPRESERVDPRO,0) * ((P_VRPERCENTUAL/100) + 1), 2),
               P_NRORG, P_NRORG, P_NRORG,
               P_CDOPERADOR, P_CDOPERADOR,
               SYSDATE, SYSDATE, 'S'
          FROM PROPRECOSEM I
         WHERE I.CDFILIAL   = P_CDFILIAL
           AND I.CDCIA      = P_CDCIA
           AND I.NRTABPRECO = P_NRTABPRECO
           AND I.NRSERVICOCIAFILI = CUR_ITENS.NRSERVICOCIAFILI
           AND I.CDCLASSE = CUR_ITENS.CDCLASSE
           AND I.CDCICLO  = CUR_ITENS.CDCICLO
           AND I.NRSEQPRECO = CUR_ITENS.NRSEQPRECO;       
        
      END LOOP;
   END IF;
END;
/