CREATE OR REPLACE PROCEDURE IDENTIFICA_PENDPARAMPROD
(
P_CDFILIAL IN VARCHAR,
P_CDCIA IN VARCHAR2,
P_DTINICIO IN DATE,
P_DTFIM IN DATE,
P_CDSETOR IN VARCHAR2,
P_CDOPERADOR IN VARCHAR2,
P_NRORG IN NUMBER,
P_NRLISTAERROS OUT NUMBER
)
AS
   V_DTDATA DATE;
   V_CHAVEDATA VARCHAR2(10);
   V_NRORDEMERROS NUMBER;
   V_HRQUEBRACIA VARCHAR2(4);
   V_HRQUEBRAFILI VARCHAR2(4);
   V_HRQUEBRA VARCHAR2(4);
   V_HRETD VARCHAR2(4);
   V_NRTURNOETD VARCHAR2(2);
   V_CDCIA VARCHAR2(4);   
   V_NRVOO VARCHAR2(5);
   V_VOO VARCHAR2(200);
   V_CDTRECHO VARCHAR2(4);
   V_CDMANCIA VARCHAR2(4);
   V_NRTIPONEGOCIOINF NUMBER;
   V_DSTIPONEGOCIOINF VARCHAR2(250);
   V_CDCLASSE VARCHAR2(4);
   V_SGCLASSE VARCHAR2(20);
   V_NRSERVICOCIAFILI NUMBER;
   V_CDSUBGRU VARCHAR2(10);
   V_NRSEQSUBGRUSEMAM NUMBER;
   V_CDCICLO VARCHAR2(4);

   PROCEDURE VALIDA_PARAMPROD_RECEITA(P_CDRECEITA IN VARCHAR2, 
                                      P_CDSETORDEST IN VARCHAR2,
                                      P_NRCATEGORIAPRODDEST IN VARCHAR2,
                                      P_NRSUBCATEGORIAPRODDEST IN VARCHAR2,
                                      P_CDRECEITADEST IN VARCHAR2,
                                      P_CDSETORROOT IN VARCHAR2,
                                      P_NRCATEGORIAPRODROOT IN VARCHAR2,
                                      P_NRSUBCATEGORIAPRODROOT IN VARCHAR2,
                                      P_CDRECEITAROOT IN VARCHAR2)
   AS
      V_NRLISTAERROS_TMP NUMBER;
      V_NRORDEM_TMP NUMBER;
      V_CODRECEITA VARCHAR2(20);
      V_DSRECEITA  VARCHAR2(500);
      V_IDRECFLEXIVEL VARCHAR2(1);
      V_NRVARIACAOREC NUMBER;
      V_QTRENDIMENTOREC FLOAT;
      V_NRSEQUTILRECFLEX NUMBER;
      V_CDSETOR VARCHAR2(4); 
      V_NMSETOR VARCHAR2(250);
      V_NRCATEGORIAPROD NUMBER;
      V_NMCATEGORIAPROD VARCHAR2(250);
      V_NRSUBCATEGORIAPROD NUMBER;
      V_NMSUBCATEGORIAPROD VARCHAR2(250);
      V_NRTIPOPROD NUMBER;
      V_DSTIPOPROD VARCHAR2(250);
      V_NRTURNO VARCHAR2(2); 
      V_NRDIASANTECEDENCIA NUMBER;
      V_CDSETOR_CADASTRO VARCHAR2(20);
   BEGIN
      DADOS_RECEITA_PRODUCAO(P_CDFILIAL, P_CDRECEITA, V_DTDATA,P_CDOPERADOR, P_NRORG,
                             'R',NULL,V_NRLISTAERROS_TMP, V_NRORDEM_TMP,
                             V_CODRECEITA, V_DSRECEITA, V_IDRECFLEXIVEL, V_NRVARIACAOREC,
                             V_QTRENDIMENTOREC, V_NRSEQUTILRECFLEX);

      SELECT MAX(V_CDSETOR_CADASTRO)
        INTO V_CDSETOR_CADASTRO
        FROM RECEITAM
       WHERE CDRECEITA = P_CDRECEITA;

      /*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]*/
         INSERE_LISTA_ERROS(P_CDFILIAL,
                            'APPERRMSGSTR' || 'APP-00147' || '$$' ||
                            V_CODRECEITA || '$$' ||
                            V_DSRECEITA || '$$' ||
                            V_DSTIPONEGOCIOINF
                            || 'APPERRMSGEND',
                            P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS,
                            P_CDRECEITA || '|' || V_CHAVEDATA || '|',
                            'CDRECEITA|DTDATA|SGCIA_NRVOO');
         V_NRORDEMERROS := V_NRORDEMERROS + 1;
                                    
      END IF;

      IF VERIF_VALOR_LISTA(NVL(V_CDSETOR, V_CDSETOR_CADASTRO), 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 Na classe [CLASSE]*/
            INSERE_LISTA_ERROS(P_CDFILIAL,
                               'APPERRMSGSTR' || 'APP-00148' || '$$' ||
                               V_CODRECEITA || '$$' ||
                               V_DSRECEITA || '$$' ||
                               V_SGCLASSE
                               || 'APPERRMSGEND',
                               P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS, 
                               P_CDRECEITA || '|' || V_CHAVEDATA || '|' || V_VOO, 
                               'CDRECEITA|DTDATA|SGCIA_NRVOO');
            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] e tipo de producao [DSTIPOPROD]*/
            INSERE_LISTA_ERROS(P_CDFILIAL,
                               'APPERRMSGSTR' || 'APP-00149' || '$$' ||
                               V_CODRECEITA || '$$' ||
                               V_DSRECEITA || '$$' ||
                               V_NMSETOR || '$$' ||
                               V_NMCATEGORIAPROD || '$$' ||
                               V_NMSUBCATEGORIAPROD || '$$' ||
                               V_DSTIPOPROD
                               || 'APPERRMSGEND',
                               P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS, 
                               P_CDRECEITA || '|' || V_CHAVEDATA || '|' || V_VOO, 
                               'CDRECEITA|DTDATA|SGCIA_NRVOO');
            V_NRORDEMERROS := V_NRORDEMERROS + 1;                                       
         END IF;
      END IF;
      /*Processa cada uma das subreceitas*/
      FOR CUR_SUB IN
      (
       SELECT SR.CDSUBRECEITA
         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
          VALIDA_PARAMPROD_RECEITA(CUR_SUB.CDSUBRECEITA, V_CDSETOR, V_NRCATEGORIAPROD, V_NRSUBCATEGORIAPROD, P_CDRECEITA, 
                                   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_NRORDEMERROS := 1;

   FOR CUR_DATAS IN
   (SELECT DTDATA
      FROM DATA
     WHERE DTDATA BETWEEN P_DTINICIO AND P_DTFIM
   ) LOOP
      V_DTDATA := CUR_DATAS.DTDATA;
      V_CHAVEDATA := TO_CHAR(CUR_DATAS.DTDATA, 'YYYYMMDD');
      FOR CUR_VOOS IN
      (
         SELECT C.SGCIA || '-' || VT.NRVOO AS VOO, VT.CDCIA, VT.NRVOO, VT.CDTRECHO, VTD.HRETD, VTD.CDEQUIP
           FROM VOOTRECHO VT
                INNER JOIN VOO VO ON VO.CDFILIAL = VT.CDFILIAL AND
                                     VO.CDCIA = VT.CDCIA AND
                                     VO.NRVOO = VT.NRVOO
                INNER JOIN COMPANHIA C ON C.CDCIA = VT.CDCIA                
                INNER JOIN VOOTRECHODATA VTD ON VTD.CDFILIAL = VT.CDFILIAL AND
                                                VTD.CDCIA = VT.CDCIA AND
                                                VTD.NRVOO = VT.NRVOO AND
                                                VTD.CDTRECHO = VT.CDTRECHO AND
                                                CUR_DATAS.DTDATA BETWEEN VTD.DTINIVIGENCIA AND NVL(VTD.DTFIMVIGENCIA, CUR_DATAS.DTDATA)
          WHERE VT.CDFILIAL = P_CDFILIAL
            AND VERIF_VALOR_LISTA(VT.CDCIA, P_CDCIA) IS NOT NULL
            AND VO.IDCONSIDERAPLANPROD = 'S'
            AND VOO_DECOLA_DATA(VT.CDFILIAL, VT.CDCIA, VT.NRVOO, VT.CDTRECHO, CUR_DATAS.DTDATA) = 'S'
      ) LOOP
         V_HRETD := CUR_VOOS.HRETD;
         V_NRVOO := CUR_VOOS.NRVOO;
         V_CDTRECHO := CUR_VOOS.CDTRECHO;
         V_CDCIA := CUR_VOOS.CDCIA;
         V_VOO := CUR_VOOS.VOO;

         SELECT MAX(HRQUEBRAETD)
           INTO V_HRQUEBRACIA
           FROM CIAFILI
          WHERE CDFILIAL = P_CDFILIAL
            AND CDCIA = CUR_VOOS.CDCIA;

         V_HRQUEBRA := V_HRQUEBRACIA;

         IF V_HRQUEBRA IS NULL THEN
            SELECT MAX(HRQUEBRAETD)
              INTO V_HRQUEBRAFILI
              FROM PARAMCOMIS
             WHERE CDFILIAL = P_CDFILIAL;   

            V_HRQUEBRA := V_HRQUEBRAFILI;
         END IF;         

         IF NVL(V_HRETD, '0000') BETWEEN '0000' AND V_HRQUEBRA THEN
            V_NRTURNOETD := '01';
         ELSE
            V_NRTURNOETD := '02';
         END IF;

         FOR CUR_ITENS_FAT IN
         (
            SELECT P.NRSERVICOCIAFILI, P.CDCLASSE, CL.SGCLASSE, P.CDCICLO, CI.IDCICLO, T.NRTABPRECO, PR.NRSEQPRECO
               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 CLASSE CL ON CL.CDCLASSE = P.CDCLASSE
                    INNER JOIN CICLO CI ON CI.CDCICLO = P.CDCICLO
                    INNER JOIN SERVICOGEN G ON G.NRSERVICOGEN = S.NRSERVICOGEN
                    INNER JOIN TABPRECOSEM T ON T.CDFILIAL = P.CDFILIAL AND
                                                T.CDCIA = P.CDCIA AND
                                                CUR_DATAS.DTDATA BETWEEN T.DTINIVIGTAB AND T.DTFIMVIGTAB
                    INNER JOIN PRECOSECIAM PR ON PR.CDFILIAL = T.CDFILIAL AND
                                                 PR.CDCIA = T.CDCIA AND
                                                 PR.NRTABPRECO = T.NRTABPRECO AND
                                                 PR.NRSERVICOCIAFILI = P.NRSERVICOCIAFILI AND
                                                 PR.CDCLASSE = P.CDCLASSE AND
                                                 PR.CDCICLO = P.CDCICLO AND
                                                 CUR_DATAS.DTDATA BETWEEN PR.DTINIVIGSE AND PR.DTFIMVIGSE
              WHERE P.CDFILIAL = P_CDFILIAL
                AND P.DTDATA = CUR_DATAS.DTDATA
                AND P.IDORIGEM = 'V'
                AND P.CDCIA = CUR_VOOS.CDCIA
                AND P.NRVOO = CUR_VOOS.NRVOO
                AND P.CDTRECHO = CUR_VOOS.CDTRECHO
                AND EXISTS
                    (SELECT CDCLASSE
                       FROM CONFIGVOO
                      WHERE CDFILIAL = P.CDFILIAL
                        AND CDCIA = P.CDCIA
                        AND NRVOO = P.NRVOO
                        AND CDTRECHO = P.CDTRECHO
                        AND CDCLASSE = P.CDCLASSE

                      UNION ALL

                     SELECT CDCLASSE
                       FROM CONFIGEQUI C
                      WHERE CDFILIAL = P.CDFILIAL
                        AND CDCIA = P.CDCIA
                        AND CDCLASSE = P.CDCLASSE
                        AND CDEQUIP = CUR_VOOS.CDEQUIP
                        AND NOT EXISTS (SELECT 1
                                          FROM CONFIGVOO
                                         WHERE CDFILIAL = P.CDFILIAL
                                           AND CDCIA = P.CDCIA
                                           AND NRVOO = P.NRVOO
                                           AND CDTRECHO = P.CDTRECHO))
                AND P.CDCICLO = F_RETORNA_CICLOM(P.CDFILIAL,  P.CDCIA,  P.NRVOO,  P.CDTRECHO, CUR_DATAS.DTDATA,
                                                 P.NRSERVICOCIAFILI, P.CDCLASSE, P.CDCICLO)
                AND G.IDSERVICO NOT IN ('2', '3', '5')
         ) LOOP
            V_SGCLASSE := CUR_ITENS_FAT.SGCLASSE;
            V_CDCLASSE := CUR_ITENS_FAT.CDCLASSE;            
            V_CDCICLO := CUR_ITENS_FAT.CDCICLO;

            FOR CUR_SUBGRU IN
            (
               SELECT S.CDMANCIA, M.NRTIPONEGOCIOINF, TN.DSTIPONEGOCIOINF, 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 MANUALCIAM M ON M.CDFILIAL = S.CDFILIAL AND
                                                    M.CDCIA = S.CDCIA AND
                                                    M.CDMANCIA = S.CDMANCIA
                         LEFT JOIN TIPONEGOCIOINF TN ON TN.NRTIPONEGOCIOINF = M.NRTIPONEGOCIOINF
                         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_VOOS.CDCIA
                     AND S.NRTABPRECO = CUR_ITENS_FAT.NRTABPRECO
                     AND S.NRSERVICOCIAFILIPRECO = CUR_ITENS_FAT.NRSERVICOCIAFILI
                     AND S.CDCLASSE = CUR_ITENS_FAT.CDCLASSE
                     AND S.CDCICLO = CUR_ITENS_FAT.CDCICLO 
                     AND S.NRSEQPRECO = CUR_ITENS_FAT.NRSEQPRECO
                     AND M.IDSITUAPROPCIA = 'A'
                     AND CUR_DATAS.DTDATA BETWEEN M.DTINIVGMA AND M.DTFIMVGMA
                     AND CUR_DATAS.DTDATA BETWEEN SG.DTINIVGSUMA AND SG.DTFIMVGSUMA
            ) LOOP
               V_CDMANCIA := CUR_SUBGRU.CDMANCIA;
               V_NRTIPONEGOCIOINF := CUR_SUBGRU.NRTIPONEGOCIOINF;
               V_DSTIPONEGOCIOINF := CUR_SUBGRU.DSTIPONEGOCIOINF;               
               V_NRSERVICOCIAFILI := CUR_SUBGRU.NRSERVICOCIAFILI;               
               V_CDSUBGRU := CUR_SUBGRU.CDSUBGRU;
               V_NRSEQSUBGRUSEMAM := CUR_SUBGRU.NRSEQSUBGRUSEMAM;

               FOR CUR_RECEITAS IN
               (
                  SELECT R.CDRECEITA
                    FROM RECSUBSEMAM R
                   WHERE R.CDFILIAL = P_CDFILIAL
                     AND R.CDCIA = CUR_VOOS.CDCIA
                     AND R.CDMANCIA = CUR_SUBGRU.CDMANCIA
                     AND R.NRSERVICOCIAFILI = CUR_SUBGRU.NRSERVICOCIAFILI
                     AND R.CDCLASSE = CUR_ITENS_FAT.CDCLASSE
                     AND R.CDSUBGRU = CUR_SUBGRU.CDSUBGRU
                     AND R.NRSEQSUBGRUSEMAM = CUR_SUBGRU.NRSEQSUBGRUSEMAM
                     AND R.CDCICLO = CUR_ITENS_FAT.CDCICLO
               ) LOOP 
                  VALIDA_PARAMPROD_RECEITA(CUR_RECEITAS.CDRECEITA, 
                                           NULL, NULL, NULL, NULL, 
                                           NULL, NULL, NULL, NULL);
               END LOOP;
            END LOOP;
         END LOOP;
      END LOOP;
   END LOOP;
END;
/