CREATE OR REPLACE PROCEDURE GERA_PLANAPREINF_CKLISTS
(
P_CDFILIAL IN VARCHAR2,
P_NRPLANAPREINF IN NUMBER,
P_CDOPERADOR IN VARCHAR2,
P_NRORG IN NUMBER,
P_NRLISTAERROS OUT NUMBER
) 
AS
   V_DTPLANAPREINF DATE;

   V_SEQ VARCHAR2(20);
   V_CHECKLISTS_PROCESSO NUMBER;

   V_CDMANCIA VARCHAR2(4); 
   V_DSMANUAL VARCHAR2(500);
   V_NRTIPONEGOCIOINF NUMBER;
   V_DSTIPONEGOCIOINF VARCHAR2(200);
   V_NRORDEMERROS NUMBER;


   V_DATA VARCHAR2(20);   
   V_SGCIA VARCHAR2(20);
   V_CDCIA VARCHAR2(4);
   V_NRTURNOETD VARCHAR2(2);
   V_SGCLASSE VARCHAR2(20);
   V_CDCLASSE VARCHAR2(4);   
   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_NRCKLISTPLANAPREINF NUMBER;

   /*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;   
   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, V_DTPLANAPREINF,
                             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_DTPLANAPREINF, V_NRTURNOETD, 
                              V_CDCLASSE, NULL, NULL, 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;
      
      /*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] 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_CONTEXTO_MSGERRO
                            || 'APPERRMSGEND',
                            P_CDOPERADOR, P_NRORG, P_NRLISTAERROS, V_NRORDEMERROS);
         V_NRORDEMERROS := V_NRORDEMERROS + 1;
                                    
      END IF;
      
      V_DTPRODUCAOREC := V_DTPLANAPREINF - NVL(V_NRDIASANTECEDENCIA, 0);

      V_QTRECEITA_PRODUZIR := P_QTRECEITA;
         
      /*Somente inclui receitas que ainda nao tenham sido planejadas*/
      IF (P_CDSETORDEST IS NULL OR P_CDSETORDEST <> V_CDSETOR) THEN
        IF V_QTRECEITA_PRODUZIR > 0 THEN
           INCLUI_RECEITA_CHECKLIST(P_CDFILIAL, V_CHECKLISTS_PROCESSO, V_DTPRODUCAOREC, 'APRESENTACAO',
                                    V_CDSETOR, V_NRTURNO, V_NRCATEGORIAPROD, V_NRSUBCATEGORIAPROD, V_NRTIPOPROD, V_NRTIPONEGOCIOINF,
                                    P_CDRECEITA, V_QTRECEITA_PRODUZIR, V_DTPLANAPREINF, V_CDCIA, P_CDRECEITADEST, P_QTRECEITADEST,
                                    NULL, NULL, V_CDCLASSE, V_CDCICLO, NULL, 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

   SELECT MAX(DTPLANAPREINF)
     INTO V_DTPLANAPREINF
     FROM PLANAPREINF
    WHERE CDFILIAL = P_CDFILIAL
      AND NRPLANAPREINF = P_NRPLANAPREINF;

   IF V_DTPLANAPREINF 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_DTPLANAPREINF, 'DD/MM/YYYY');

   /*>>>>>MUDAR<<<<<<<*/
   V_NRTURNOETD := '01';

   FOR CUR_ITENS IN
   (
   SELECT I.CDFILIAL, I.CDCIA, COM.SGCIA, I.CDMANCIA, M.DSMANUAL, TN.NRTIPONEGOCIOINF, TN.DSTIPONEGOCIOINF,
          I.NRSERVICOCIAFILI, S.DSSERVICOCIAFILI, I.CDCLASSE, CL.SGCLASSE,
          I.CDSUBGRU, 
          SG.DSSUBGRU || ' (' || TO_CHAR(SU.DTINIVGSUMA, 'DD/MM/YYYY') || ' a ' || TO_CHAR(SU.DTFIMVGSUMA, 'DD/MM/YYYY') || ')' AS DSSUBGRU,
          I.NRSEQSUBGRUSEMAM,
          I.CDCICLO, CI.IDCICLO, I.QTSUBGRU
     FROM ITPLANAPREINF I
          INNER JOIN CICLOSUBGRUSEMAM C ON C.CDFILIAL = I.CDFILIAL AND
                                           C.CDCIA = I.CDCIA AND
                                           C.CDMANCIA = I.CDMANCIA AND
                                           C.NRSERVICOCIAFILI = I.NRSERVICOCIAFILI AND
                                           C.CDCLASSE = I.CDCLASSE AND
                                           C.CDSUBGRU = I.CDSUBGRU AND
                                           C.NRSEQSUBGRUSEMAM = I.NRSEQSUBGRUSEMAM AND
                                           C.CDCICLO = I.CDCICLO
          INNER JOIN SUBGRUSEMAM SU ON SU.CDFILIAL = I.CDFILIAL AND
                                           SU.CDCIA = I.CDCIA AND
                                           SU.CDMANCIA = I.CDMANCIA AND
                                           SU.NRSERVICOCIAFILI = I.NRSERVICOCIAFILI AND
                                           SU.CDCLASSE = I.CDCLASSE AND
                                           SU.CDSUBGRU = I.CDSUBGRU AND
                                           SU.NRSEQSUBGRUSEMAM = I.NRSEQSUBGRUSEMAM
          INNER JOIN SUBGRUPOM SG ON SG.CDSUBGRU = SU.CDSUBGRU                                           
          INNER JOIN COMPANHIA COM ON COM.CDCIA = C.CDCIA
          INNER JOIN MANUALCIAM M ON M.CDFILIAL = C.CDFILIAL AND
                                     M.CDCIA = C.CDCIA AND
                                     M.CDMANCIA = C.CDMANCIA
          INNER JOIN SERVICOCIAFILI S ON S.CDFILIAL = C.CDFILIAL AND
                                         S.CDCIA = C.CDCIA AND
                                         S.NRSERVICOCIAFILI = C.NRSERVICOCIAFILI
          INNER JOIN CLASSE CL ON CL.CDCLASSE = C.CDCLASSE
          INNER JOIN SUBGRUPOM SG ON SG.CDSUBGRU = C.CDSUBGRU
          INNER JOIN CICLO CI ON CI.CDCICLO = C.CDCICLO          
          LEFT JOIN TIPONEGOCIOINF TN ON TN.NRTIPONEGOCIOINF = M.NRTIPONEGOCIOINF
    WHERE I.CDFILIAL = P_CDFILIAL
      AND I.NRPLANAPREINF = P_NRPLANAPREINF
      AND I.QTSUBGRU > 0
   ) LOOP
      
      V_SGCIA := CUR_ITENS.SGCIA;
      V_CDCIA := CUR_ITENS.CDCIA;
      V_CDMANCIA := CUR_ITENS.CDMANCIA;
      V_DSMANUAL := CUR_ITENS.DSMANUAL;
      V_DSTIPONEGOCIOINF := CUR_ITENS.DSTIPONEGOCIOINF;
      V_NRTIPONEGOCIOINF := CUR_ITENS.NRTIPONEGOCIOINF;
      V_SGCLASSE := CUR_ITENS.SGCLASSE;      
      V_CDCLASSE := CUR_ITENS.CDCLASSE;
      V_DSSERVICOCIAFILI := CUR_ITENS.DSSERVICOCIAFILI;
      V_NRSERVICOCIAFILI := CUR_ITENS.NRSERVICOCIAFILI;
      V_IDCICLO := CUR_ITENS.IDCICLO;
      V_CDCICLO := CUR_ITENS.CDCICLO;
      V_DSSUBGRU := CUR_ITENS.DSSUBGRU;
      V_CDSUBGRU := CUR_ITENS.CDSUBGRU;
      V_NRSEQSUBGRUSEMAM := CUR_ITENS.NRSEQSUBGRUSEMAM;

      FOR CUR_RECEITAS IN
      (
         SELECT R.CDRECEITA, CUR_ITENS.QTSUBGRU * R.QTRECSUMA AS QTRECEITA
           FROM RECSUBSEMAM R
          WHERE R.CDFILIAL = P_CDFILIAL
            AND R.CDCIA = CUR_ITENS.CDCIA
            AND R.CDMANCIA = CUR_ITENS.CDMANCIA
            AND R.NRSERVICOCIAFILI = CUR_ITENS.NRSERVICOCIAFILI
            AND R.CDCLASSE = CUR_ITENS.CDCLASSE
            AND R.CDSUBGRU = CUR_ITENS.CDSUBGRU
            AND R.NRSEQSUBGRUSEMAM = CUR_ITENS.NRSEQSUBGRUSEMAM
            AND R.CDCICLO = CUR_ITENS.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; /*Fim do loop de receitas*/
   END LOOP; /*Fim do loop de subgrupos*/

   /*Busca os checklists gerados*/
   FOR CUR_CKLISTS IN
   (
      SELECT C.NRCKLISTPRODINF
        FROM CKLISTPRODINF C
             INNER JOIN (SELECT CDLISTA FROM LISTA L WHERE L.NRLISTA = V_CHECKLISTS_PROCESSO) L ON TO_NUMBER(L.CDLISTA) = C.NRCKLISTPRODINF
       WHERE C.CDFILIAL = P_CDFILIAL         
   ) LOOP
      
      /*Insere o checklist relacionado ao planejamento da producao*/
      NOVO_CODIGO_NT('CKLISTPLANAPREINF' || P_CDFILIAL, V_SEQ);
      V_NRCKLISTPLANAPREINF := TO_NUMBER(V_SEQ);

      INSERT INTO CKLISTPLANAPREINF
      (CDFILIAL, NRCKLISTPLANAPREINF, NRPLANAPREINF,
      NRCKLISTPRODINF, 
      NRORG, NRORGINCLUSAO, NRORGULTATU,  
      DTINCLUSAO, DTULTATU,  
      CDOPERINCLUSAO, CDOPERULTATU, IDATIVO)
      VALUES
      (P_CDFILIAL, V_NRCKLISTPLANAPREINF, P_NRPLANAPREINF,
      CUR_CKLISTS.NRCKLISTPRODINF,
      P_NRORG, P_NRORG, P_NRORG,  
      SYSDATE, SYSDATE,  
      P_CDOPERADOR, P_CDOPERADOR, 'S');
   END LOOP;
END;
/