CREATE OR REPLACE PROCEDURE GERA_CKLISTPRODINF_PREVISTO
(
P_CDFILIAL IN VARCHAR2,
P_DTPRODUCAO IN DATE,
P_CDSETOR IN VARCHAR2,
P_CDOPERADOR IN VARCHAR2,
P_NRORG IN NUMBER,
P_NRLISTAERROS OUT NUMBER
)
AS
   V_MAX_ANTECEDENCIA NUMBER;
   V_CHECKLISTS_PROCESSO NUMBER;
   
   V_CDMANCIA VARCHAR2(4); 
   V_DSMANUAL VARCHAR2(500);
   V_NRTIPONEGOCIOINF NUMBER;
   V_DSTIPONEGOCIOINF VARCHAR2(200);
   V_IDSITUAPROPCIA VARCHAR2(1); 
   V_DTINIVGMA DATE;
   V_DTFIMVGMA DATE;
   v_NUM_MENU_ATIVOS NUMBER;

   V_NRTABPRECO VARCHAR2(3);
   v_NUM_TABPRECO_ATIVAS NUMBER;

   V_NRSEQPRECO NUMBER;
   V_NUM_PRECOS_ITEMFAT NUMBER;

   V_NRORDEMERROS NUMBER;
   V_SEQ VARCHAR2(20);

   V_NUM_ITEMFAT NUMBER;
   V_NUM_SUBGRUPOS NUMBER;


   V_DATA VARCHAR2(20);
   V_DTDATA DATE;
   V_SGCIA VARCHAR2(20);
   V_CDCIA VARCHAR2(4);
   V_VOO VARCHAR2(50);   
   V_NRVOO VARCHAR2(5);
   V_CDTRECHO VARCHAR2(4);
   V_NRTURNOETD VARCHAR2(2);
   V_SGCLASSE VARCHAR2(20);
   V_CDCLASSE VARCHAR2(4);
   V_DSSERVICOCIAFILIPRECO VARCHAR2(500);
   V_NRSERVICOCIAFILIPRECO NUMBER;   
   V_DSSERVICOCIAFILI VARCHAR2(500);
   V_NRSERVICOCIAFILI NUMBER;
   V_IDCICLO VARCHAR2(20);
   V_CDCICLO VARCHAR2(4);
   V_DSSUBGRU VARCHAR2(500);
   V_CDSUBGRU VARCHAR2(10);
   V_NRSEQSUBGRUSEMAM NUMBER;

   V_QTSUBGRUPO FLOAT;  

   V_PADRAOCALC VARCHAR2(1); 
   V_QTPAXREF NUMBER;

   V_MSGERRO VARCHAR2(4000);

   /*Classifica receita, valida inconsistencias, insere em checklists*/
   PROCEDURE PROCESSA_RECEITA
   (
   P_CDRECEITA IN VARCHAR2,
   P_QTRECEITA IN FLOAT,
   P_CDSETORDEST IN VARCHAR2,
   P_NRCATEGORIAPRODDEST IN NUMBER,
   P_NRSUBCATEGORIAPRODDEST IN NUMBER,
   P_CDRECEITADEST IN VARCHAR2,
   P_QTRECEITADEST IN FLOAT,   
   P_DTPRODUCAODEST IN DATE,
   P_CDSETORROOT IN VARCHAR2,
   P_NRCATEGORIAPRODROOT IN NUMBER,
   P_NRSUBCATEGORIAPRODROOT IN NUMBER,
   P_CDRECEITAROOT IN VARCHAR2
   )
   AS
     V_CODRECEITA VARCHAR2(20);
     V_DSRECEITA VARCHAR2(250);
     V_IDRECFLEXIVEL VARCHAR2(1);
     V_NRVARIACAOREC NUMBER;
     V_QTRENDIMENTOREC FLOAT;      
     V_NRSEQUTILRECFLEX NUMBER;
     V_CONTEXTO_MSGERRO VARCHAR2(4000);
     V_VRFATOR FLOAT;

     V_DTPRODUCAOREC DATE;   

     V_CDSETOR VARCHAR2(4);
     V_NMSETOR VARCHAR2(200);
     V_NRTURNO VARCHAR2(2);
     V_NRCATEGORIAPROD NUMBER;   
     V_NMCATEGORIAPROD VARCHAR2(200);
     V_NRSUBCATEGORIAPROD NUMBER;
     V_NMSUBCATEGORIAPROD VARCHAR2(200);
     V_NRTIPOPROD NUMBER;
     V_DSTIPOPROD VARCHAR2(200);     
     V_NRDIASANTECEDENCIA NUMBER;
     V_QTRECEITA_PRODUZIR FLOAT;
     V_QTRECEITA_JA_PLANEJADA FLOAT;
   BEGIN
      V_CONTEXTO_MSGERRO := V_IDCICLO || '$$' ||
                            V_DSSUBGRU || '$$' ||
                            V_DSSERVICOCIAFILI || '$$' ||
                            V_SGCLASSE || '$$' ||
                            V_CDMANCIA || '$$' ||
                            V_DSMANUAL || '$$' ||
                            V_SGCIA    || '$$' ||
                            V_DATA;
      /*Busca informacoes da receita, fazendo as devidas consistencias*/
      DADOS_RECEITA_PRODUCAO(P_CDFILIAL, P_CDRECEITA, P_DTPRODUCAO,
                             P_CDOPERADOR, P_NRORG, 'M', V_CONTEXTO_MSGERRO,
                             P_NRLISTAERROS, V_NRORDEMERROS, 
                             V_CODRECEITA, V_DSRECEITA,
                             V_IDRECFLEXIVEL, V_NRVARIACAOREC, 
                             V_QTRENDIMENTOREC, V_NRSEQUTILRECFLEX);

      /*Classificacao da receita para producao*/
      CLASSIFICA_PROD_RECEITA(P_CDFILIAL, P_CDRECEITA, V_CDCIA, V_DTDATA, V_NRTURNOETD,
                              V_CDCLASSE, V_NRVOO, V_CDTRECHO, V_CDMANCIA, V_NRTIPONEGOCIOINF, 
                              V_NRSERVICOCIAFILI, V_CDSUBGRU, V_NRSEQSUBGRUSEMAM, V_CDCICLO, 
                              P_CDSETORDEST, P_NRCATEGORIAPRODDEST, P_NRSUBCATEGORIAPRODDEST, P_CDRECEITADEST,
                              P_CDSETORROOT, P_NRCATEGORIAPRODROOT, P_NRSUBCATEGORIAPRODROOT, P_CDRECEITAROOT,
                              P_NRORG, 
                              V_CDSETOR, V_NRCATEGORIAPROD, V_NRSUBCATEGORIAPROD, 
                              V_NRTIPOPROD, V_NRTURNO, V_NRDIASANTECEDENCIA);
      

      /*Se setor estiver vazio*/
      IF V_CDSETOR IS NULL THEN
         
         /*Receita [CDRECEITA] - [DSRECEITA] nao possui padrao de producao cadastrado para a unidade informada e tipo de negocio [DSTIPONEGOCIOINF] e e utilizada no ciclo [IDCICLO] do subgrupo [SUBGRUPO] do servico [SERVICO] da classe [CLASSE] do menu grid [CODMENU] - [MENU] da companhia [COMPANHIA] na data [DATA]*/
         INSERE_LISTA_ERROS(P_CDFILIAL,
                            'APPERRMSGSTR' || 'APP-00114' || '$$' ||
                            V_CODRECEITA || '$$' ||
                            V_DSRECEITA || '$$' ||
                            V_DSTIPONEGOCIOINF || '$$' ||
                            V_CONTEXTO_MSGERRO
                            || 'APPERRMSGEND',
                            P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
         V_NRORDEMERROS := V_NRORDEMERROS + 1;
                                    
      END IF;

      IF VERIF_VALOR_LISTA(V_CDSETOR, P_CDSETOR) IS NOT NULL THEN         
      
         /*Se tipo de producao estiver vazio*/
         IF V_NRTIPOPROD IS NULL THEN
            
            /*Receita [CDRECEITA] - [DSRECEITA] nao possui tipo de producao cadastrado para a unidade informada no ciclo [IDCICLO] do subgrupo [SUBGRUPO] do servico [SERVICO] da classe [CLASSE] do menu grid [CODMENU] - [MENU] da companhia [COMPANHIA] na data [DATA]*/
            INSERE_LISTA_ERROS(P_CDFILIAL,
                               'APPERRMSGSTR' || 'APP-00115' || '$$' ||
                               V_CODRECEITA || '$$' ||
                               V_DSRECEITA || '$$' ||
                               V_CONTEXTO_MSGERRO
                               || 'APPERRMSGEND',
                               P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
            V_NRORDEMERROS := V_NRORDEMERROS + 1;
                                       
         END IF;

         /*Se o turno estiver vazio*/
         IF V_CDSETOR IS NOT NULL AND V_NRTIPOPROD IS NOT NULL AND V_NRTURNO IS NULL THEN

            SELECT MAX(NMSETOR)
              INTO V_NMSETOR
              FROM SETOR
             WHERE CDSETOR = V_CDSETOR;

            SELECT MAX(DSTIPOPROD)
              INTO V_DSTIPOPROD
              FROM TIPOPROD
             WHERE NRTIPOPROD = V_NRTIPOPROD;

            SELECT MAX(NMCATEGORIAPROD)
              INTO V_NMCATEGORIAPROD
              FROM CATEGORIAPROD
             WHERE NRCATEGORIAPROD = V_NRCATEGORIAPROD;

            SELECT MAX(NMCATEGORIAPROD)
              INTO V_NMSUBCATEGORIAPROD
              FROM CATEGORIAPROD
             WHERE NRCATEGORIAPROD = V_NRSUBCATEGORIAPROD;
            
            /*Receita [CDRECEITA] - [DSRECEITA] nao possui fluxo de producao definido para a unidade informada, setor [NMSETOR], categoria [NMCATEGORIAPROD], subcategoria [NMSUBCATEGORIA], tipo de producao [DSTIPOPROD], voo [VOO] no ciclo [IDCICLO] do subgrupo [SUBGRUPO] do servico [SERVICO] da classe [CLASSE] do menu grid [CODMENU] - [MENU] da companhia [COMPANHIA] na data [DATA]*/
            INSERE_LISTA_ERROS(P_CDFILIAL,
                               'APPERRMSGSTR' || 'APP-00116' || '$$' ||
                               V_CODRECEITA || '$$' ||
                               V_DSRECEITA || '$$' ||
                               V_NMSETOR || '$$' ||
                               V_NMCATEGORIAPROD || '$$' ||
                               V_NMSUBCATEGORIAPROD || '$$' ||
                               V_DSTIPOPROD || '$$' ||
                               V_VOO || '$$' ||
                               V_CONTEXTO_MSGERRO
                               || 'APPERRMSGEND',
                               P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
            V_NRORDEMERROS := V_NRORDEMERROS + 1;
                                       
         END IF;
      END IF;
         
      V_DTPRODUCAOREC := V_DTDATA - NVL(V_NRDIASANTECEDENCIA, 0);

      V_QTRECEITA_PRODUZIR := P_QTRECEITA;
      
      /*Somente insere o checklist previsto para receitas a produzir nesta data e cujo setor difere da receita pai ou a data de producao e diferente da data do pai*/
      IF V_DTPRODUCAOREC = P_DTPRODUCAO AND 
         (P_CDSETORDEST IS NULL OR P_CDSETORDEST <> V_CDSETOR) THEN

         IF V_QTRECEITA_PRODUZIR > 0.0 AND ROUND(V_QTRECEITA_PRODUZIR, 3) = 0 THEN
            V_QTRECEITA_PRODUZIR := 0.001;
         ELSE
            V_QTRECEITA_PRODUZIR := ROUND(V_QTRECEITA_PRODUZIR, 3);
         END IF;        

         /*Somente inclui receitas que ainda nao tenham sido planejadas*/
         IF V_QTRECEITA_PRODUZIR > 0 AND VERIF_VALOR_LISTA(V_CDSETOR, P_CDSETOR) IS NOT NULL THEN
            INCLUI_RECEITA_CHECKLIST(P_CDFILIAL, V_CHECKLISTS_PROCESSO, V_DTPRODUCAOREC, 'PREVISTO',
                                     V_CDSETOR, V_NRTURNO, V_NRCATEGORIAPROD, V_NRSUBCATEGORIAPROD, V_NRTIPOPROD, V_NRTIPONEGOCIOINF,
                                     P_CDRECEITA, V_QTRECEITA_PRODUZIR, V_DTDATA, V_CDCIA, P_CDRECEITADEST, P_QTRECEITADEST,
                                     V_NRVOO, V_CDTRECHO, V_CDCLASSE, V_CDCICLO, V_NRSERVICOCIAFILIPRECO, P_CDOPERADOR, P_NRORG);
         END IF;
      END IF;

      V_VRFATOR := CASE WHEN V_QTRENDIMENTOREC = 0 THEN 0 ELSE P_QTRECEITA/V_QTRENDIMENTOREC END;

      /*Processa cada uma das subreceitas*/
      FOR CUR_SUB IN
      (
      SELECT SR.CDSUBRECEITA, V_VRFATOR * NVL(SR.QTRENDSUBREC,0) AS QUANTIDADE
        FROM SUBRECEITAM SR
       WHERE SR.CDRECEITA = P_CDRECEITA
         AND SR.NRVARIACAOREC = V_NRVARIACAOREC
         AND (V_IDRECFLEXIVEL = 'N' OR
              (COMPOSICAO_EM_PRODUCAO(P_CDFILIAL, P_CDRECEITA, P_NRORG, V_NRSEQUTILRECFLEX, SR.CDSUBRECEITA, 'S') = 'S') OR
              (V_NRSEQUTILRECFLEX IS NULL AND SR.IDPREFERENCIA = 'S')
             )
      ) LOOP
         PROCESSA_RECEITA(CUR_SUB.CDSUBRECEITA, CUR_SUB.QUANTIDADE, 
                          V_CDSETOR, V_NRCATEGORIAPROD, V_NRSUBCATEGORIAPROD, 
                          P_CDRECEITA, V_QTRECEITA_PRODUZIR, 
                          V_DTPRODUCAOREC, 
                          CASE WHEN P_CDRECEITAROOT IS NULL THEN V_CDSETOR ELSE P_CDSETORROOT END,
                          CASE WHEN P_CDRECEITAROOT IS NULL THEN V_NRCATEGORIAPROD ELSE P_NRCATEGORIAPRODROOT END,
                          CASE WHEN P_CDRECEITAROOT IS NULL THEN V_NRSUBCATEGORIAPROD ELSE P_NRSUBCATEGORIAPRODROOT END,
                          NVL(P_CDRECEITAROOT, P_CDRECEITA));
      END LOOP;
      
   END;

BEGIN
   V_MAX_ANTECEDENCIA := GET_MAX_ANTECEDENCIA_PROD(P_CDFILIAL);

   V_NRORDEMERROS := 1;

   /*Reserva uma lista para os checklists gerados neste processo*/
   NOVO_CODIGO_NT('LISTA', V_SEQ);
   V_CHECKLISTS_PROCESSO := TO_NUMBER(V_SEQ);

   FOR CUR_DATAS IN
   (
   SELECT NRPREVISAOPROD, DTPREVISAOPROD, IDPREVISAOPROD
     FROM PREVPAXPRODM
    WHERE CDFILIAL = P_CDFILIAL
      AND DTPREVISAOPROD BETWEEN P_DTPRODUCAO AND P_DTPRODUCAO + V_MAX_ANTECEDENCIA
   ) LOOP      
      V_DATA := TO_CHAR(CUR_DATAS.DTPREVISAOPROD, 'DD/MM/YYYY');
      V_DTDATA := CUR_DATAS.DTPREVISAOPROD;      

      /*A previsao do dia XX ainda nao foi aprovada*/
      IF CUR_DATAS.IDPREVISAOPROD <> 'A' THEN      
         INSERE_LISTA_ERROS(P_CDFILIAL, 'APPERRMSGSTR' || 'APP-00117' || '$$' || V_DATA || 'APPERRMSGEND',
                            P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
         V_NRORDEMERROS := V_NRORDEMERROS + 1;
      END IF;

      DBMS_OUTPUT.PUT_LINE('Dia: ' || V_DATA);
      FOR CUR_CIAS IN
      (
      SELECT C.SGCIA, P.CDCIA, NVL(CF.IDVINCULOMANUAL, 'N') AS IDVINCULOMANUAL
        FROM PREVPAXCIAPRODM P
             INNER JOIN COMPANHIA C ON C.CDCIA = P.CDCIA
             LEFT JOIN CIAFILI CF ON CF.CDFILIAL = P.CDFILIAL AND
                                     CF.CDCIA = P.CDCIA
       WHERE P.CDFILIAL = P_CDFILIAL
         AND P.NRPREVISAOPROD = CUR_DATAS.NRPREVISAOPROD
         AND EXISTS
             (
              SELECT 1
                FROM PREVPAXVOOPRODM PV
               WHERE PV.CDFILIAL = P_CDFILIAL
                 AND PV.NRPREVISAOPROD = P.NRPREVISAOPROD
                 AND PV.CDCIA = P.CDCIA
                 AND PV.IDPREVISAOPROD = 'A'
             )
      ) LOOP

         V_SGCIA := CUR_CIAS.SGCIA;
         V_CDCIA := CUR_CIAS.CDCIA;

         /*Verifica se a companhia possui menu grid aprovado e vigente*/
         SELECT COUNT(1)
           INTO V_NUM_MENU_ATIVOS
           FROM MANUALCIAM M
          WHERE M.CDFILIAL = P_CDFILIAL
            AND M.CDCIA = CUR_CIAS.CDCIA
            AND M.IDSITUAPROPCIA = 'A'
            AND CUR_DATAS.DTPREVISAOPROD BETWEEN M.DTINIVGMA AND M.DTFIMVGMA;

         IF V_NUM_MENU_ATIVOS = 0 THEN
            IF CUR_CIAS.IDVINCULOMANUAL = 'N' THEN
               CONTINUE;
            END IF;
            /*Nao ha menu grid vigente e aprovado para a companhia [SIGLA] na data [DATA]*/
            INSERE_LISTA_ERROS(P_CDFILIAL, 'APPERRMSGSTR' || 'APP-00118' || '$$' || V_SGCIA || '$$' || V_DATA || 'APPERRMSGEND',
                            P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
            V_NRORDEMERROS := V_NRORDEMERROS + 1;
         END IF;         

         /*Verifica se a companhia possui tabela de precos na data (por causa dos vinculos com subgrupos)*/
         SELECT MAX(NRTABPRECO), COUNT(1)
           INTO V_NRTABPRECO, V_NUM_TABPRECO_ATIVAS
           FROM TABPRECOSEM
          WHERE CDFILIAL = P_CDFILIAL
            AND CDCIA = CUR_CIAS.CDCIA
            AND CUR_DATAS.DTPREVISAOPROD BETWEEN DTINIVIGTAB AND DTFIMVIGTAB;

         IF V_NUM_TABPRECO_ATIVAS = 0 THEN
            /*Nao ha tabela de precos vigente para a companhia [SIGLA] na data [DATA]*/
            INSERE_LISTA_ERROS(P_CDFILIAL, 'APPERRMSGSTR' || 'APP-00121' || '$$' || V_SGCIA || '$$' || V_DATA || 'APPERRMSGEND',
                            P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
            V_NRORDEMERROS := V_NRORDEMERROS + 1;
         END IF;

         IF V_NUM_TABPRECO_ATIVAS > 1 THEN
            /*Ha mais de uma tabela de precos vigente para a companhia [SIGLA] na data [DATA]*/
            INSERE_LISTA_ERROS(P_CDFILIAL, 'APPERRMSGSTR' || 'APP-00122' || '$$' || V_SGCIA || '$$' || V_DATA || 'APPERRMSGEND',
                            P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
            V_NRORDEMERROS := V_NRORDEMERROS + 1;
         END IF;

         IF V_NUM_TABPRECO_ATIVAS <> 1 OR V_NUM_MENU_ATIVOS = 0 THEN
            CONTINUE;
         END IF;

         FOR CUR_VOOS IN
         (
         SELECT P.NRVOO, P.CDTRECHO, P.NRTURNOETD, P.CDEQUIP, P.IDPADRAOCALC
           FROM PREVPAXVOOPRODM P
                INNER JOIN VOOTRECHO V ON V.CDFILIAL = P.CDFILIAL AND
                                          V.CDCIA = P.CDCIA AND
                                          V.NRVOO = P.NRVOO AND
                                          V.CDTRECHO = P.CDTRECHO
                INNER JOIN BASE BO ON BO.CDBASE = V.CDBASEORI
                INNER JOIN BASE BD ON BD.CDBASE = V.CDBASEDES
          WHERE P.CDFILIAL = P_CDFILIAL
            AND P.NRPREVISAOPROD = CUR_DATAS.NRPREVISAOPROD
            AND P.CDCIA = CUR_CIAS.CDCIA
            AND P.IDPREVISAOPROD = 'A'
         ) LOOP
            
            V_VOO := CUR_CIAS.SGCIA||'-'||CUR_VOOS.NRVOO;
            V_NRVOO := CUR_VOOS.NRVOO;
            V_CDTRECHO := CUR_VOOS.CDTRECHO;
            V_NRTURNOETD := CUR_VOOS.NRTURNOETD;
            V_PADRAOCALC := CUR_VOOS.IDPADRAOCALC;

            DBMS_OUTPUT.PUT_LINE('Voo: ' || V_VOO);

            FOR CUR_CLASSES IN
            (
            SELECT P.CDCLASSE, P.QTPAXPREVINF, CL.SGCLASSE
              FROM PREVPAXCLAPRODM P
                   INNER JOIN CLASSE CL ON CL.CDCLASSE = P.CDCLASSE
             WHERE P.CDFILIAL = P_CDFILIAL
               AND P.NRPREVISAOPROD = CUR_DATAS.NRPREVISAOPROD
               AND P.CDCIA = CUR_CIAS.CDCIA
               AND P.NRVOO = CUR_VOOS.NRVOO
               AND P.CDTRECHO = CUR_VOOS.CDTRECHO
            ) LOOP

               V_SGCLASSE := CUR_CLASSES.SGCLASSE;
               V_CDCLASSE := CUR_CLASSES.CDCLASSE;

               DBMS_OUTPUT.PUT_LINE('Classe: ' || V_SGCLASSE);
               
               /*Considera apenas as classes com quantidade de passageiros informada*/
               IF NVL(CUR_CLASSES.QTPAXPREVINF, 0) = 0 THEN
                  CONTINUE;
               END IF;

               FOR CUR_ITENS_FAT IN
               ( SELECT P.NRSERVICOCIAFILI, P.CDCICLO, S.DSSERVICOCIAFILI, CI.IDCICLO, 0 AS QTSERVICOINF
                  FROM PAD_VOOEQUIPAMENTO P
                       INNER JOIN SERVICOCIAFILI S ON S.CDFILIAL = P.CDFILIAL AND
                                                      S.CDCIA = P.CDCIA AND
                                                      S.NRSERVICOCIAFILI = P.NRSERVICOCIAFILI
                       INNER JOIN CICLO CI ON CI.CDCICLO = P.CDCICLO
                       INNER JOIN SERVICOGEN G ON G.NRSERVICOGEN = S.NRSERVICOGEN
                 WHERE P.CDFILIAL = P_CDFILIAL
                   AND P.DTDATA = CUR_DATAS.DTPREVISAOPROD
                   AND P.IDORIGEM = 'V'
                   AND P.CDCIA = CUR_CIAS.CDCIA
                   AND P.NRVOO = CUR_VOOS.NRVOO
                   AND P.CDTRECHO = CUR_VOOS.CDTRECHO
                   AND P.CDCLASSE = CUR_CLASSES.CDCLASSE                   
                   AND P.CDCICLO = F_RETORNA_CICLOM(P.CDFILIAL,  P.CDCIA,  P.NRVOO,  P.CDTRECHO, CUR_DATAS.DTPREVISAOPROD,
                                                    P.NRSERVICOCIAFILI, P.CDCLASSE, P.CDCICLO)
                   AND G.IDSERVICO NOT IN ('2', '3', '5')
                   AND V_PADRAOCALC <> '5'
                UNION
                  SELECT P.NRSERVICOCIAFILI, P.CDCICLO, S.DSSERVICOCIAFILI, CI.IDCICLO, P.QTSERVICOINF
                    FROM PREVPAXSERVPRODM P
                         INNER JOIN SERVICOCIAFILI S ON S.CDFILIAL = P.CDFILIAL AND
                                                        S.CDCIA = P.CDCIA AND
                                                        S.NRSERVICOCIAFILI = P.NRSERVICOCIAFILI
                         INNER JOIN CICLO CI ON CI.CDCICLO = P.CDCICLO
                         INNER JOIN SERVICOGEN G ON G.NRSERVICOGEN = S.NRSERVICOGEN
                   WHERE P.CDFILIAL = P_CDFILIAL
                     AND P.NRPREVISAOPROD = CUR_DATAS.NRPREVISAOPROD
                     AND P.CDCIA = CUR_CIAS.CDCIA
                     AND P.NRVOO = CUR_VOOS.NRVOO
                     AND P.CDTRECHO = CUR_VOOS.CDTRECHO
                     AND P.CDCLASSE = CUR_CLASSES.CDCLASSE
                     AND G.IDSERVICO NOT IN ('2', '3', '5')
                     AND V_PADRAOCALC = '5'

               ) LOOP
                  V_DSSERVICOCIAFILIPRECO := CUR_ITENS_FAT.DSSERVICOCIAFILI;
                  V_NRSERVICOCIAFILIPRECO := CUR_ITENS_FAT.NRSERVICOCIAFILI;
                  V_IDCICLO := CUR_ITENS_FAT.IDCICLO;
                  V_CDCICLO := CUR_ITENS_FAT.CDCICLO;
                  V_QTPAXREF := CASE WHEN V_PADRAOCALC = '5' THEN CUR_ITENS_FAT.QTSERVICOINF ELSE CUR_CLASSES.QTPAXPREVINF END;
                  
                  DBMS_OUTPUT.PUT_LINE('Servico: ' || V_DSSERVICOCIAFILIPRECO || ' ' || V_IDCICLO);
                  /*Verifica se o item possui preco na tabela de preco ativa da companhia*/
                  SELECT MAX(P.NRSEQPRECO), COUNT(1)
                    INTO V_NRSEQPRECO, V_NUM_PRECOS_ITEMFAT
                    FROM PRECOSECIAM P
                   WHERE P.CDFILIAL = P_CDFILIAL AND
                         P.CDCIA = CUR_CIAS.CDCIA AND
                         P.NRTABPRECO = V_NRTABPRECO AND
                         P.NRSERVICOCIAFILI = CUR_ITENS_FAT.NRSERVICOCIAFILI AND
                         P.CDCLASSE = CUR_CLASSES.CDCLASSE AND
                         P.CDCICLO = CUR_ITENS_FAT.CDCICLO AND
                         CUR_DATAS.DTPREVISAOPROD BETWEEN P.DTINIVIGSE AND P.DTFIMVIGSE;

                  IF V_NUM_PRECOS_ITEMFAT > 1 THEN
                     /*Ha mais de um preco para o item de faturamento [NOME] da classe [CLASSE] do ciclo [IDCICLO] na tabela ativa da companhia [SIGLA] na data [DATA]*/
                     INSERE_LISTA_ERROS(P_CDFILIAL, 
                                        'APPERRMSGSTR' || 'APP-00123' || '$$' ||
                                        CUR_ITENS_FAT.DSSERVICOCIAFILI || '$$' ||
                                        CUR_CLASSES.SGCLASSE || '$$' ||
                                        CUR_ITENS_FAT.IDCICLO || '$$' ||
                                        V_SGCIA || '$$' || 
                                        V_DATA
                                        || 'APPERRMSGEND',
                                        P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
                     V_NRORDEMERROS := V_NRORDEMERROS + 1;
                  END IF;

                  IF V_NUM_PRECOS_ITEMFAT = 0 THEN
                     /*Nao ha preco para o item de faturamento [NOME] da classe [CLASSE] do ciclo [IDCICLO] na tabela ativa da companhia [SIGLA] na data [DATA]*/
                     INSERE_LISTA_ERROS(P_CDFILIAL, 
                                        'APPERRMSGSTR' || 'APP-00124' || '$$' ||
                                        CUR_ITENS_FAT.DSSERVICOCIAFILI || '$$' ||
                                        CUR_CLASSES.SGCLASSE || '$$' ||
                                        CUR_ITENS_FAT.IDCICLO || '$$' ||
                                        V_SGCIA || '$$' || 
                                        V_DATA
                                        || 'APPERRMSGEND',
                                        P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
                     V_NRORDEMERROS := V_NRORDEMERROS + 1;
                  END IF;

                  CONEXAO_COM_SUBGRU_PLANOVOOM(P_CDFILIAL, V_CDCIA, V_NRVOO, V_CDTRECHO, CUR_DATAS.DTPREVISAOPROD, 
                                       V_NRSERVICOCIAFILIPRECO, V_CDCLASSE, V_CDCICLO, CUR_DATAS.DTPREVISAOPROD, 
                                       'S', NULL, P_CDOPERADOR, P_NRORG, V_MSGERRO);
                  IF V_MSGERRO IS NOT NULL THEN
                     FOR CUR_MSERROS IN
                     (
                      SELECT REGEXP_SUBSTR(V_MSGERRO,'[^'||'>><<'||']+', 1, LEVEL) AS MSG FROM DUAL
                        CONNECT BY REGEXP_SUBSTR(V_MSGERRO, '[^'||'>><<'||']+', 1, LEVEL) IS NOT NULL
                     ) LOOP
                        INSERE_LISTA_ERROS(P_CDFILIAL, CUR_MSERROS.MSG, P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
                     END LOOP;
                  END IF;

                  IF (V_NUM_PRECOS_ITEMFAT <> 1) OR V_MSGERRO IS NOT NULL THEN
                     CONTINUE;
                  END IF;

                  V_NUM_SUBGRUPOS := 0;

                  FOR CUR_SUBGRUPOS IN
                  (
                  SELECT S.CDMANCIA, S.NRSERVICOCIAFILI, S.CDSUBGRU, S.NRSEQSUBGRUSEMAM, SG.IDPROPSUBSEMAM, SG.QTPROPSUBSEMAM, SE.DSSERVICOCIAFILI, 
                         SU.DSSUBGRU || ' (' || TO_CHAR(SG.DTINIVGSUMA, 'DD/MM/YYYY') || ' a ' || TO_CHAR(SG.DTFIMVGSUMA, 'DD/MM/YYYY') || ')' AS DSSUBGRU
                    FROM SUBGRUTABPRECOM S
                         INNER JOIN SERVICOCIAFILI SE ON SE.CDFILIAL = S.CDFILIAL AND
                                                         SE.CDCIA = S.CDCIA AND
                                                         SE.NRSERVICOCIAFILI = S.NRSERVICOCIAFILI
                         INNER JOIN SUBGRUSEMAM SG ON SG.CDFILIAL = S.CDFILIAL AND
                                                      SG.CDCIA = S.CDCIA AND
                                                      SG.CDMANCIA = S.CDMANCIA AND
                                                      SG.NRSERVICOCIAFILI = S.NRSERVICOCIAFILI AND
                                                      SG.CDCLASSE = S.CDCLASSE AND
                                                      SG.CDSUBGRU = S.CDSUBGRU AND
                                                      SG.NRSEQSUBGRUSEMAM = S.NRSEQSUBGRUSEMAM
                         INNER JOIN SUBGRUPOM SU ON SU.CDSUBGRU = SG.CDSUBGRU
                   WHERE S.CDFILIAL = P_CDFILIAL
                     AND S.CDCIA = CUR_CIAS.CDCIA
                     AND S.NRTABPRECO = V_NRTABPRECO
                     AND S.NRSERVICOCIAFILIPRECO = CUR_ITENS_FAT.NRSERVICOCIAFILI
                     AND S.CDCLASSE = CUR_CLASSES.CDCLASSE
                     AND S.CDCICLO = CUR_ITENS_FAT.CDCICLO 
                     AND S.NRSEQPRECO = V_NRSEQPRECO
                     AND CUR_DATAS.DTPREVISAOPROD BETWEEN SG.DTINIVGSUMA AND SG.DTFIMVGSUMA
                  ) LOOP
                     V_DSSERVICOCIAFILI := CUR_SUBGRUPOS.DSSERVICOCIAFILI;
                     V_NRSERVICOCIAFILI := CUR_SUBGRUPOS.NRSERVICOCIAFILI;
                     V_DSSUBGRU := CUR_SUBGRUPOS.DSSUBGRU;
                     V_CDSUBGRU := CUR_SUBGRUPOS.CDSUBGRU;
                     V_NRSEQSUBGRUSEMAM := CUR_SUBGRUPOS.NRSEQSUBGRUSEMAM;

                     V_NUM_SUBGRUPOS := V_NUM_SUBGRUPOS + 1;                    

                     /*Verifica se o menu do subgrupo esta aprovado e vigente*/
                     SELECT MAX(M.CDMANCIA), MAX(M.NRTIPONEGOCIOINF), MAX(M.DSMANUAL), MAX(M.IDSITUAPROPCIA), MAX(M.DTINIVGMA), MAX(DTFIMVGMA), MAX(DSTIPONEGOCIOINF)
                       INTO V_CDMANCIA, V_NRTIPONEGOCIOINF, V_DSMANUAL, V_IDSITUAPROPCIA, V_DTINIVGMA, V_DTFIMVGMA, V_DSTIPONEGOCIOINF
                       FROM MANUALCIAM M
                            LEFT JOIN TIPONEGOCIOINF T ON T.NRTIPONEGOCIOINF = M.NRTIPONEGOCIOINF
                      WHERE M.CDFILIAL = P_CDFILIAL
                        AND M.CDCIA = CUR_CIAS.CDCIA
                        AND M.CDMANCIA = CUR_SUBGRUPOS.CDMANCIA;

                     IF NVL(V_IDSITUAPROPCIA, 'E') <> 'A' THEN
                        /*Item de Faturamento [DSSERVICOCIAFILI] da classe [SGCLASSE] DO ciclo [IDCICLO] do voo [VOO] na data [DATA] vinculado ao menu [CDMANCIA] - [DSMANUAL] que nao esta aprovado*/
                        INSERE_LISTA_ERROS(P_CDFILIAL, 'APPERRMSGSTR' || 'APP-00144' || '$$' || 
                                                        V_DSSERVICOCIAFILIPRECO || '$$' ||
                                                        V_SGCLASSE || '$$' ||
                                                        V_IDCICLO || '$$' ||
                                                        V_VOO || '$$' ||
                                                        V_DATA || '$$' ||
                                                        V_CDMANCIA || '$$' ||
                                                        V_DSMANUAL
                                                        || 'APPERRMSGEND',
                                                        P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
                        V_NRORDEMERROS := V_NRORDEMERROS + 1;
                     END IF;

                     IF NOT (V_DTDATA BETWEEN V_DTINIVGMA AND V_DTFIMVGMA) THEN
                        /*Item de Faturamento [DSSERVICOCIAFILI] da classe [SGCLASSE] DO ciclo [IDCICLO] do voo [VOO] na data [DATA] vinculado ao menu [CDMANCIA] - [DSMANUAL] que nao esta vigente*/
                        INSERE_LISTA_ERROS(P_CDFILIAL, 'APPERRMSGSTR' || 'APP-00145' || '$$' || 
                                                        V_DSSERVICOCIAFILIPRECO || '$$' ||
                                                        V_SGCLASSE || '$$' ||
                                                        V_IDCICLO || '$$' ||
                                                        V_VOO || '$$' ||
                                                        V_DATA || '$$' ||
                                                        V_CDMANCIA || '$$' ||
                                                        V_DSMANUAL
                                                        || 'APPERRMSGEND',
                                                        P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
                        V_NRORDEMERROS := V_NRORDEMERROS + 1;
                     END IF;

                     IF V_NRTIPONEGOCIOINF IS NULL THEN
                        /*Tipo de negocio nao informado para o menu [CDMANCIA] - [DSMANUAL] da companhia [SIGLA]*/
                        INSERE_LISTA_ERROS(P_CDFILIAL, 'APPERRMSGSTR' || 'APP-00120' || '$$' || 
                                                        V_CDMANCIA || '$$' ||
                                                        V_DSMANUAL || '$$' ||
                                                        V_SGCIA
                                                        || 'APPERRMSGEND',
                                                        P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
                        V_NRORDEMERROS := V_NRORDEMERROS + 1;
                     END IF;

                     /*Se apresentou algum problema no menu*/
                     IF NVL(V_IDSITUAPROPCIA, 'E') <> 'A' OR
                        NOT (V_DTDATA BETWEEN V_DTINIVGMA AND V_DTFIMVGMA) OR
                        V_NRTIPONEGOCIOINF IS NULL THEN
                        CONTINUE;
                     END IF;

                     V_QTSUBGRUPO := 0;
                     IF CUR_SUBGRUPOS.IDPROPSUBSEMAM IS NULL THEN
                        /*Loading nao foi informado para o subgrupo [SUBGRUPO] do servico [SERVICO] da classe [CLASSE] do menu grid [CODMENU] - [MENU] da companhia [COMPANHIA] na data [DATA]*/
                        INSERE_LISTA_ERROS(P_CDFILIAL, 
                                           'APPERRMSGSTR' || 'APP-00125' || '$$' ||
                                           V_DSSUBGRU || '$$' ||
                                           V_DSSERVICOCIAFILI || '$$' ||
                                           V_SGCLASSE || '$$' ||
                                           V_CDMANCIA || '$$' ||
                                           V_DSMANUAL || '$$' ||
                                           V_SGCIA || '$$' ||
                                           V_DATA
                                           || 'APPERRMSGEND',
                                           P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
                        V_NRORDEMERROS := V_NRORDEMERROS + 1;
                     END IF;

                     IF NVL(CUR_SUBGRUPOS.QTPROPSUBSEMAM, 0) = 0 THEN
                        IF CUR_SUBGRUPOS.IDPROPSUBSEMAM IN ('2', '4', '5') THEN
                           /*Quantidade do loading nao foi informada para o subgrupo [SUBGRUPO] do servico [SERVICO] da classe [CLASSE] do menu grid [CODMENU] - [MENU] da companhia [COMPANHIA] na data [DATA]*/
                           INSERE_LISTA_ERROS(P_CDFILIAL, 
                                              'APPERRMSGSTR' || 'APP-00126' || '$$' ||
                                              V_DSSUBGRU || '$$' ||
                                              V_DSSERVICOCIAFILI || '$$' ||
                                              V_SGCLASSE || '$$' ||
                                              V_CDMANCIA || '$$' ||
                                              V_DSMANUAL || '$$' ||
                                              V_SGCIA || '$$' ||
                                              V_DATA
                                              || 'APPERRMSGEND',
                                              P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
                           V_NRORDEMERROS := V_NRORDEMERROS + 1;
                        END IF;
                     END IF;

                     IF CUR_SUBGRUPOS.IDPROPSUBSEMAM = '1' THEN
                        V_QTSUBGRUPO := V_QTPAXREF;
                     END IF;
                     IF CUR_SUBGRUPOS.IDPROPSUBSEMAM = '2' THEN
                        IF CUR_SUBGRUPOS.QTPROPSUBSEMAM > 0 THEN                           
                           V_QTSUBGRUPO := CEIL(V_QTPAXREF/CUR_SUBGRUPOS.QTPROPSUBSEMAM);
                        END IF;
                     END IF;
                     IF CUR_SUBGRUPOS.IDPROPSUBSEMAM = '3' THEN
                        SELECT MAX(QTSUBGRUPO)
                          INTO V_QTSUBGRUPO
                          FROM PROPSUBGRUSE
                          WHERE CDFILIAL  = P_CDFILIAL AND
                                CDCIA     = CUR_CIAS.CDCIA AND          
                                CDMANCIA = V_CDMANCIA AND
                                NRSERVICOCIAFILI = CUR_SUBGRUPOS.NRSERVICOCIAFILI AND
                                CDCLASSE  = CUR_CLASSES.CDCLASSE AND
                                CDSUBGRU  = CUR_SUBGRUPOS.CDSUBGRU AND
                                NRSEQSUBGRUSEMAM = CUR_SUBGRUPOS.NRSEQSUBGRUSEMAM AND
                                V_QTPAXREF BETWEEN QTPAXDE AND QTPAXATE;

                        IF V_QTSUBGRUPO = 0 THEN 
                          CONTINUE;
                        END IF;
                        
                        IF V_QTSUBGRUPO IS NULL THEN
                           /*Nao foi encontrada quantidade na tabela de loading do subgrupo [SUBGRUPO] do servico [SERVICO] da classe [CLASSE] do menu grid [CODMENU] - [MENU] para a quantidade de passageiros[QTPAX] do voo [VOO] na data [DATA]*/
                           INSERE_LISTA_ERROS(P_CDFILIAL, 
                                              'APPERRMSGSTR' || 'APP-00127' || '$$' ||
                                              V_DSSUBGRU || '$$' ||
                                              V_DSSERVICOCIAFILI || '$$' ||
                                              V_SGCLASSE || '$$' ||
                                              V_CDMANCIA || '$$' ||
                                              V_DSMANUAL || '$$' ||
                                              TO_CHAR(V_QTPAXREF)    || '$$' ||
                                              V_VOO || '$$' ||
                                              V_DATA
                                              || 'APPERRMSGEND',
                                              P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
                           V_NRORDEMERROS := V_NRORDEMERROS + 1;
                        END IF;
                     END IF;
                     IF CUR_SUBGRUPOS.IDPROPSUBSEMAM = '4' THEN
                        IF CUR_SUBGRUPOS.QTPROPSUBSEMAM > 0 THEN
                           
                           V_QTSUBGRUPO := ((V_QTPAXREF * CUR_SUBGRUPOS.QTPROPSUBSEMAM)/100);
                           IF (V_QTSUBGRUPO > 0) AND (V_QTSUBGRUPO < 1) THEN
                              V_QTSUBGRUPO := 1;
                           ELSE
                              V_QTSUBGRUPO := ROUND(V_QTSUBGRUPO);
                           END IF;

                        END IF;
                     END IF;
                     
                     IF CUR_SUBGRUPOS.IDPROPSUBSEMAM = '5' THEN                        
                        V_QTSUBGRUPO := NVL(CUR_SUBGRUPOS.QTPROPSUBSEMAM, 0);
                     END IF;

                     FOR CUR_RECEITAS IN
                     (
                        SELECT R.CDRECEITA, V_QTSUBGRUPO * R.QTRECSUMA AS QTRECEITA
                          FROM RECSUBSEMAM R
                         WHERE R.CDFILIAL = P_CDFILIAL
                           AND R.CDCIA = CUR_CIAS.CDCIA
                           AND R.CDMANCIA = V_CDMANCIA
                           AND R.NRSERVICOCIAFILI = CUR_SUBGRUPOS.NRSERVICOCIAFILI
                           AND R.CDCLASSE = CUR_CLASSES.CDCLASSE
                           AND R.CDSUBGRU = CUR_SUBGRUPOS.CDSUBGRU
                           AND R.NRSEQSUBGRUSEMAM = CUR_SUBGRUPOS.NRSEQSUBGRUSEMAM
                           AND R.CDCICLO = CUR_ITENS_FAT.CDCICLO
                     ) LOOP
                        /*Classifica receita, valida inconsistencias, insere em checklists*/
                        PROCESSA_RECEITA(CUR_RECEITAS.CDRECEITA, CUR_RECEITAS.QTRECEITA, 
                                         NULL, NULL, NULL, NULL, NULL, 
                                         NULL,
                                         NULL, NULL, NULL, NULL);
                     END LOOP;
                  END LOOP; /*---Fim loop de subgrupos*/

                  /*Se o item esta planejado mas nao possui subgrupos vinculads*/
                  IF V_NUM_SUBGRUPOS = 0 THEN
                     /*Item de Faturamento [DSSERVICOCIAFILI] da classe [SGCLASSE] DO ciclo [IDCICLO] do voo [VOO] na data [DATA] nao esta vinculado a subgrupos vigentes*/
                     INSERE_LISTA_ERROS(P_CDFILIAL, 'APPERRMSGSTR' || 'APP-00146' || '$$' ||
                                                     V_DSSERVICOCIAFILIPRECO || '$$' ||
                                                     V_SGCLASSE || '$$' ||
                                                     V_IDCICLO || '$$' ||
                                                     V_VOO || '$$' ||
                                                     V_DATA
                                                     || 'APPERRMSGEND',
                                                     P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
                     V_NRORDEMERROS := V_NRORDEMERROS + 1;
                  END IF;

               END LOOP; /*---Fim loop de itens de faturamento*/  
            END LOOP; /*---Fim loop de classes*/  
         END LOOP; /*---Fim loop de voos*/  
      END LOOP; /*---Fim loop de companhias*/  

      /*Apaga indicativo de calculo complementar para a data*/
      DELETE FROM PREVPAXGERARCOMPL
       WHERE CDFILIAL = P_CDFILIAL
         AND NRPREVISAOPROD = CUR_DATAS.NRPREVISAOPROD
         AND NRORG = P_NRORG;      

   END LOOP; /*---Fim loop de data*/

   /*Verifica se houve geracao complementar de checklists*/
   DETERMINA_CKLISTPRODINF_COMPL(P_CDFILIAL, V_CHECKLISTS_PROCESSO, P_DTPRODUCAO, P_CDOPERADOR, P_NRORG);
END;
/