CREATE OR REPLACE PROCEDURE GERA_SOLEMERGPROD_CKLISTS
(
P_CDFILIAL IN VARCHAR2,
P_NRSOLEMERGPROD IN NUMBER,
P_CDOPERADOR IN VARCHAR2,
P_NRORG IN NUMBER,
P_NRLISTAERROS OUT NUMBER
)
AS
   V_DTPRODUCAO DATE;

   V_SEQ VARCHAR2(20);   
   V_CHECKLISTS_PROCESSO NUMBER;
   V_NRORDEMERROS NUMBER;

   V_HRQUEBRA VARCHAR2(4);
   V_HRETD VARCHAR2(4);

   V_NRTIPONEGOCIOINF NUMBER;
   V_DSTIPONEGOCIOINF VARCHAR2(200);
   V_DATA VARCHAR2(20);   
   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_HRQUEBRACIA VARCHAR2(4);
   V_HRQUEBRAFILI VARCHAR2(4);
   V_SGCLASSE VARCHAR2(20);
   V_CDCLASSE VARCHAR2(4);
   V_DSSERVICOCIAFILIPRECO VARCHAR2(500);
   V_NRSERVICOCIAFILIPRECO NUMBER;
   V_IDCICLO VARCHAR2(20);
   V_CDCICLO VARCHAR2(4);

   V_NRCKLISTPRODINF NUMBER;

   V_NRCKLISTSOLEMERGPROD NUMBER;

   /*Classifica receita, valida inconsistencias, insere em checklists*/
   PROCEDURE PROCESSA_RECEITA
   (
   P_CDRECEITA IN VARCHAR2,
   P_QTRECEITA IN FLOAT   
   )
   AS
     V_CODRECEITA VARCHAR2(20);
     V_DSRECEITA VARCHAR2(250);
     V_IDRECFLEXIVEL VARCHAR2(1);
     V_NRVARIACAOREC NUMBER;
     V_QTRENDIMENTOREC FLOAT;      
     V_NRSEQUTILRECFLEX NUMBER;

     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      
      /*Busca informacoes da receita, fazendo as devidas consistencias*/
      DADOS_RECEITA_PRODUCAO(P_CDFILIAL, P_CDRECEITA, V_DTPRODUCAO,
                             P_CDOPERADOR, P_NRORG, 'R', NULL,
                             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_DTPRODUCAO, V_NRTURNOETD, 
                              V_CDCLASSE, V_NRVOO, V_CDTRECHO, NULL, V_NRTIPONEGOCIOINF,
                              NULL, NULL, NULL, V_CDCICLO, 
                              NULL, NULL, NULL, NULL,
                              NULL, NULL, NULL, NULL, 
                              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-00135' || '$$' ||
                            V_CODRECEITA || '$$' ||
                            V_DSRECEITA || '$$' ||
                            NVL(V_DSTIPONEGOCIOINF, '-')
                            || 'APPERRMSGEND',
                            P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
         V_NRORDEMERROS := V_NRORDEMERROS + 1;
                                    
      END IF;
      
      /*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] e companhia [COMPANHIA]*/
         INSERE_LISTA_ERROS(P_CDFILIAL,
                            'APPERRMSGSTR' || 'APP-00136' || '$$' ||
                            V_CODRECEITA || '$$' ||
                            V_DSRECEITA || '$$' ||
                            V_SGCLASSE || '$$' ||
                            V_SGCIA
                            || '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] e voo [VOO]*/
         INSERE_LISTA_ERROS(P_CDFILIAL,
                            'APPERRMSGSTR' || 'APP-00137' || '$$' ||
                            V_CODRECEITA || '$$' ||
                            V_DSRECEITA || '$$' ||
                            V_NMSETOR || '$$' ||
                            V_NMCATEGORIAPROD || '$$' ||
                            NVL(V_NMSUBCATEGORIAPROD, '-') || '$$' ||
                            V_DSTIPOPROD || '$$' ||
                            V_VOO
                            || 'APPERRMSGEND',
                            P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
         V_NRORDEMERROS := V_NRORDEMERROS + 1;
                                    
      END IF;
      
      V_DTPRODUCAOREC := V_DTPRODUCAO;

      V_QTRECEITA_PRODUZIR := P_QTRECEITA;
      
      /*Somente inclui receitas que ainda nao tenham sido planejadas*/
      IF V_QTRECEITA_PRODUZIR > 0 THEN
         INCLUI_RECEITA_CHECKLIST(P_CDFILIAL, V_CHECKLISTS_PROCESSO, V_DTPRODUCAOREC, 'EMERGENCIAL',
                                  V_CDSETOR, V_NRTURNO, V_NRCATEGORIAPROD, V_NRSUBCATEGORIAPROD, V_NRTIPOPROD, V_NRTIPONEGOCIOINF,
                                  P_CDRECEITA, V_QTRECEITA_PRODUZIR, V_DTPRODUCAO, V_CDCIA, NULL, NULL,
                                  V_NRVOO, V_CDTRECHO, V_CDCLASSE, V_CDCICLO, V_NRSERVICOCIAFILIPRECO, P_CDOPERADOR, P_NRORG);
      END IF;      
   END;
BEGIN
   SELECT MAX(DTPRODUCAO)
     INTO V_DTPRODUCAO
     FROM SOLEMERGPROD
    WHERE CDFILIAL = P_CDFILIAL
      AND NRSOLEMERGPROD = P_NRSOLEMERGPROD;

   IF V_DTPRODUCAO IS NULL THEN
      RETURN;
   END IF;

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


   V_DATA := TO_CHAR(V_DTPRODUCAO, 'DD/MM/YYYY');
   
   FOR CUR_DEST_REC IN
   (
      SELECT R.CDRECEITA, D.CDCIA, C.SGCIA, D.DTATENDIMENTO, D.NRVOO, D.CDTRECHO,
             D.CDCLASSE, CL.SGCLASSE, D.CDCICLO, CI.IDCICLO, D.NRTIPONEGOCIOINF, TN.DSTIPONEGOCIOINF,
             D.NRSERVICOCIAFILI, S.DSSERVICOCIAFILI, D.QTRECEITA
        FROM DESTSOLEMERGPROD D
             INNER JOIN RECSOLEMERGPROD R ON R.CDFILIAL = D.CDFILIAL AND
                                             R.NRRECSOLEMERGPROD = D.NRRECSOLEMERGPROD
             INNER JOIN COMPANHIA C ON C.CDCIA = D.CDCIA
             INNER JOIN CLASSE CL ON CL.CDCLASSE = D.CDCLASSE
             LEFT JOIN CICLO CI ON CI.CDCICLO = D.CDCICLO
             LEFT JOIN TIPONEGOCIOINF TN ON TN.NRTIPONEGOCIOINF = D.NRTIPONEGOCIOINF
             LEFT JOIN SERVICOCIAFILI S ON S.CDFILIAL = D.CDFILIAL AND
                                           S.CDCIA = D.CDCIA AND
                                           S.NRSERVICOCIAFILI = D.NRSERVICOCIAFILI
       WHERE D.CDFILIAL = P_CDFILIAL
         AND R.NRSOLEMERGPROD = P_NRSOLEMERGPROD
   ) LOOP
      
      V_NRTIPONEGOCIOINF := CUR_DEST_REC.NRTIPONEGOCIOINF;
      V_DSTIPONEGOCIOINF := CUR_DEST_REC.DSTIPONEGOCIOINF;      
      V_SGCIA := CUR_DEST_REC.SGCIA;
      V_CDCIA := CUR_DEST_REC.CDCIA;
      V_VOO := V_SGCIA || '-' || CUR_DEST_REC.NRVOO;
      V_NRVOO := CUR_DEST_REC.NRVOO;
      V_CDTRECHO := CUR_DEST_REC.CDTRECHO;      
      V_SGCLASSE := CUR_DEST_REC.SGCLASSE;
      V_CDCLASSE := CUR_DEST_REC.CDCLASSE;
      V_DSSERVICOCIAFILIPRECO := CUR_DEST_REC.DSSERVICOCIAFILI;
      V_NRSERVICOCIAFILIPRECO := CUR_DEST_REC.NRSERVICOCIAFILI;
      V_IDCICLO := CUR_DEST_REC.IDCICLO;
      V_CDCICLO := CUR_DEST_REC.CDCICLO;

      /*Turno ETD*/
      SELECT MAX(VD.HRETD) HRETD          
        INTO V_HRETD
        FROM VOOTRECHODATA VD
       WHERE VD.CDFILIAL = P_CDFILIAL 
         AND VD.CDCIA = CUR_DEST_REC.CDCIA
         AND VD.NRVOO = CUR_DEST_REC.NRVOO
         AND VD.CDTRECHO = CUR_DEST_REC.CDTRECHO
         AND V_DTPRODUCAO BETWEEN VD.DTINIVIGENCIA AND NVL(VD.DTFIMVIGENCIA, V_DTPRODUCAO);


      SELECT MAX(HRQUEBRAETD)
        INTO V_HRQUEBRACIA
        FROM CIAFILI
       WHERE CDFILIAL = P_CDFILIAL
         AND CDCIA = V_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 V_HRQUEBRA IS NULL THEN
         /*Nao ha horario de quebra definido para companhia [SGCIA]*/
         INSERE_LISTA_ERROS(P_CDFILIAL, 'APPERRMSGSTR' || 'APP-00142' || '$$' || V_SGCIA || 'APPERRMSGEND',
                            P_CDOPERADOR, P_NRORG, P_NRLISTAERROS);
         RETURN;
      END IF;

      IF V_HRETD IS NULL THEN
         /*Nao ha horario de decolagem definido para o voo [VOO]*/
         INSERE_LISTA_ERROS(P_CDFILIAL, 'APPERRMSGSTR' || 'APP-00143' || '$$' || V_VOO ||  'APPERRMSGEND',
                            P_CDOPERADOR, P_NRORG, P_NRLISTAERROS);
         RETURN;
      END IF;


      V_HRQUEBRA := '1800';

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

      PROCESSA_RECEITA(CUR_DEST_REC.CDRECEITA, CUR_DEST_REC.QTRECEITA);
   END LOOP;
   FOR C_LISTA IN    
   (
      SELECT CDLISTA FROM LISTA L WHERE L.NRLISTA = V_CHECKLISTS_PROCESSO
   ) LOOP
      /*Busca os checklists gerados*/
      SELECT MAX(NRCKLISTPRODINF)
       INTO V_NRCKLISTPRODINF
       FROM CKLISTPRODINF C
      WHERE C.CDFILIAL = P_CDFILIAL
        AND C.NRCKLISTPRODINF = C_LISTA.CDLISTA;

      IF V_NRCKLISTPRODINF IS NULL THEN
        CONTINUE;
      END IF;

      /*Insere o checklist relacionado a solicitacao emergencial*/
      NOVO_CODIGO_NT('CKLISTSOLEMERGPROD' || P_CDFILIAL, V_SEQ);
      V_NRCKLISTSOLEMERGPROD := TO_NUMBER(V_SEQ);

      INSERT INTO CKLISTSOLEMERGPROD
      (CDFILIAL, NRCKLISTSOLEMERGPROD, NRSOLEMERGPROD,
      NRCKLISTPRODINF, 
      NRORG, NRORGINCLUSAO, NRORGULTATU,  
      DTINCLUSAO, DTULTATU,  
      CDOPERINCLUSAO, CDOPERULTATU, IDATIVO)
      VALUES
      (P_CDFILIAL, V_NRCKLISTSOLEMERGPROD, P_NRSOLEMERGPROD,
      V_NRCKLISTPRODINF,
      P_NRORG, P_NRORG, P_NRORG,  
      SYSDATE, SYSDATE,  
      P_CDOPERADOR, P_CDOPERADOR, 'S');   
   END LOOP;
END;
/