create or replace PROCEDURE EFETIVA_DISTRIBUICAO(
P_NRDISTPROD NUMBER,
P_OPERACAO VARCHAR2,
P_CDFILIPROC VARCHAR2,
P_CDOPERADOR VARCHAR2,
P_DATAPROC DATE,
P_DTRETIRADA DATE,
P_DTCARDAPIO DATE,
P_NRORG IN NUMBER,
P_NRCONTROLE VARCHAR2,
P_RETORNO OUT VARCHAR2,
P_NRLISTA_PROD IN NUMBER)

AS 
   /*VARIAVEIS*/
 
   /*NF de SaAda*/
   V_NFS_PRXLANCTONF  VARCHAR2(10);
   V_NFS_PRXLANCESTQ  VARCHAR2(10);
   V_NFS_CDALMOXARIFE VARCHAR2(6);
   V_NFS_CDLOCALESTOQ VARCHAR2(6);
   V_NFS_NRLOTEESTQ   VARCHAR2(20);
   V_NFS_NRSUBLOTE    VARCHAR2(4);
   V_NRLANCTODUP      VARCHAR2(10);
   V_IDSTATDOC        NUMBER;

   /*NF de Entrada*/
   V_NFE_PRXLANCTONF  VARCHAR2(10);
   V_NFE_PRXLANCESTQ  VARCHAR2(10);
   V_NFE_CDALMOXARIFE VARCHAR2(6);
   V_NFE_CDLOCALESTOQ VARCHAR2(6);
   V_NFE_NRLOTEESTQ   VARCHAR2(20);
   V_NFE_NRSUBLOTE    VARCHAR2(4);
   V_NF_ENTRADA       VARCHAR2(10); --CTRL DA NF DE ENTRADA NO MOMENTO DE DESFAZER O LANAAMENTO
   V_NF_SAIDA         VARCHAR2(10); --CTRL DA NF DE SAIDA NO MOMENTO DE DESFAZER O LANAAMENTO

   /*Retirada*/
   V_NRCARDAPIO       VARCHAR2(10);
   V_NRLANCTOEST      VARCHAR2(10);
   V_NRRETIRADA       VARCHAR2(10);
   V_NRSEQUITRETI     NUMBER;
   V_QTCONSUMIDA      FLOAT;
   V_CDALMOXARIFE     VARCHAR2(6);
   V_CDLOCALESTOQ     VARCHAR2(6);
   V_LOTEESTQ         VARCHAR2(20);
   V_SUBLOTE          VARCHAR2(4);

   V_CHAVE            VARCHAR2(20);
   V_CONTADOR         INTEGER;
   V_CDPRODUTO        VARCHAR2(10);
   V_GERA_RETIRADA    VARCHAR2(1);
   V_EST_CENTRAL      VARCHAR2(10);
   V_EST_AGREGADA     VARCHAR2(10);
   V_IDCNTRESTOQ      VARCHAR2(1);
   V_IDPRODATIV       VARCHAR2(1);
   V_FINALIZACAO      VARCHAR2(1);
   V_FILIAL_LANCESTQ  VARCHAR2(4);  
   V_EFETIVADO        VARCHAR2(1);
   V_CUSTO            FLOAT;
   V_IDPERLEFESRETPLA VARCHAR2(1);
   
   V_AGREGA_ANT VARCHAR2(4);

   /*SUBROTINAS*/
   /*Rotina para cAlculo do imposto*/
   PROCEDURE CRIAIMPOSTOS(P_CDFILIORI VARCHAR2,
                          P_NRLANCTONF VARCHAR2,
                          P_CDTIPOOPER VARCHAR2,
                          P_CDFILIDEST VARCHAR2,
                          P_DATAENTR DATE,
                          P_VRBASECALC FLOAT,
                          P_CDEMPRESAORI VARCHAR2,
                          P_CDPRODUTO VARCHAR2,
                          P_CDINSCESTA VARCHAR2,
                          P_SEQITPROD INTEGER)
   AS
      V_CDGRUPOFISC     VARCHAR2(3);
      V_INTERESTADO     VARCHAR2(1);
      V_CDPAISORI       VARCHAR2(4);
      V_CDPAISDEST      VARCHAR2(4);
      V_SGESTADOORI     VARCHAR2(2);
      V_SGESTADODEST    VARCHAR2(2);
      V_CDMUNICIPIOORI  VARCHAR2(4);
      V_CDMUNICIPIODEST VARCHAR2(4);
      V_NRALIQTEMP      VARCHAR2(18);
      V_VRPARDEDTMP     FLOAT;
      V_VRPREDBCTMP     FLOAT;
      V_VRALIQUTMP      FLOAT;
      V_VRPBCSTTMP      FLOAT;
      V_IDTRIMPSTTMP    VARCHAR2(1);
      V_DBTAXABC        FLOAT;
      V_DBTAXAAL        FLOAT;
      V_DBBASECALC      FLOAT;
      V_DBIMPOSTO       FLOAT;
      V_DBALIQOL        FLOAT;

   BEGIN
      /*Busca o grupo fiscal*/
      CONSULTA_GRUPOFISCAL('L', P_CDFILIDEST, NULL, 'E', P_CDTIPOOPER, V_CDGRUPOFISC);

      V_INTERESTADO := 'N';
      /*Verifica se o processo A interestadual*/
      SELECT MAX(O.CDPAIS) AS CDPAISORI, MAX(O.SGESTADO) AS SGESTADOORI, MAX(O.CDMUNICIPIO) AS CDMUNICIPIOORI,
             MAX(D.CDPAIS) AS CDPAISDEST, MAX(D.SGESTADO) AS SGESTADODEST, MAX(D.CDMUNICIPIO) AS CDMUNICIPIODEST
        INTO V_CDPAISORI, V_SGESTADOORI, V_CDMUNICIPIOORI,
             V_CDPAISDEST, V_SGESTADODEST, V_CDMUNICIPIODEST
        FROM ENDEFILI O CROSS JOIN ENDEFILI D
       WHERE O.CDFILIAL = P_CDFILIORI AND NVL(O.IDTPENDEFILI, 'P') = 'P' AND D.CDFILIAL = P_CDFILIDEST AND NVL(D.IDTPENDEFILI, 'P') = 'P'
         AND O.NRORG = P_NRORG AND D.NRORG = P_NRORG;

      IF (V_CDPAISORI = V_CDPAISDEST) AND (V_SGESTADOORI <> V_SGESTADODEST) THEN
         V_INTERESTADO := 'S';
      END IF;

      /*Preenche tabela temporAria com as incidAncias*/
      CONSULTA_INCIDENCIA ( 'E', P_CDEMPRESAORI, P_CDPRODUTO, P_CDINSCESTA, P_CDTIPOOPER, P_CDFILIORI, P_NRLANCTONF, V_CDGRUPOFISC, NULL, V_INTERESTADO,
                            NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);

      /*Percorre as incidAncias encontradas*/
      FOR C_INCID IN
      (SELECT CDIMPOTEMP, MAX(CDFISCTEMP) AS CDFISCTEMP,
              MAX(IDTRATIMPTMP) AS IDTRATIMPTMP, MAX(IDCONSISTENT) AS IDCONSISTENT, MAX(NVL(IDUTMUNIORIG, 'N')) AS IDUTMUNIORIG, MAX(IDIMPORECUP) AS IDIMPORECUP, 
              MAX(NVL(IDPREIMPENTR, 'N')) AS IDPREIMPENTR, MAX(IDORGARRECAD) AS IDORGARRECAD FROM INCITEMP IT, IMPOSTO IP
        WHERE (IT.NRINCITEMP = P_CDFILIORI||P_NRLANCTONF) AND (IP.CDIMPOSTO  = IT.CDIMPOTEMP) AND (IP.IDPRODNOTA = 'P') AND (IT.NRORG = P_NRORG)
      GROUP BY CDIMPOTEMP
      ) LOOP

         /*Busca alAquota do imposto*/
         CONSULTA_ALIQUOTA( C_INCID.CDIMPOTEMP, 'E', P_CDEMPRESAORI, P_CDPRODUTO, P_CDINSCESTA, V_CDPAISORI, V_SGESTADOORI, V_CDPAISDEST, V_SGESTADODEST,
                            V_CDMUNICIPIOORI, P_VRBASECALC, P_DATAENTR, P_CDFILIORI, P_NRLANCTONF, V_CDGRUPOFISC, P_CDTIPOOPER, NULL, NULL, NULL, NULL, NULL, NULL);

         SELECT NVL(MAX(NRALIQTEMP),0) AS NRALIQTEMP, NVL(MAX(VRPARDEDTMP),0) AS VRPARDEDTMP, NVL(MAX(VRPREDBCTMP),0) AS VRPREDBCTMP, 
                NVL(MAX(VRALIQUTMP),0) AS VRALIQUTMP, NVL(MAX(VRPBCSTTMP),0) AS VRPBCSTTMP, NVL(MAX(IDTRIMPSTTMP), '0') AS IDTRIMPSTTMP
           INTO V_NRALIQTEMP, V_VRPARDEDTMP,V_VRPREDBCTMP, V_VRALIQUTMP, V_VRPBCSTTMP, V_IDTRIMPSTTMP
           FROM ALIQTEMP
          WHERE (NRALIQTEMP = P_CDFILIORI||P_NRLANCTONF) AND NRORG = P_NRORG;

         IF C_INCID.CDFISCTEMP = '1' THEN
             V_DBTAXABC   := (100 - V_VRPREDBCTMP)/100;
             V_DBTAXAAL   := (V_VRALIQUTMP/100);
             V_DBBASECALC := P_VRBASECALC  * V_DBTAXAAL;
             V_DBIMPOSTO  := (V_DBBASECALC * V_DBTAXAAL) - V_DBTAXABC;
             V_DBALIQOL   := V_VRALIQUTMP;
          ELSE
             V_DBBASECALC := 0;
             V_DBIMPOSTO  := 0;
             V_DBALIQOL   := 0;
          END IF;

         INSERT INTO TRABITPROIMPOS(
            CDFILIMPOIT, NRLANCIMPOIT, NRSEQIMPOIT, CDIMPOSTOIT, NRSEQITPRO, CDFISCIMPOIT, CDSTRIBIMPOIT, CDFOPERIMPOIT, CDSCFOPIMPOIT, 
            VRALIQIMPOIT, VRREDBCIMPOIT, VRPDEDIMPOIT, VRCONTIMPOIT, VRBCALCIMPOIT, VRIMPOSIT, IDERRIMPOIT, IDAVISIMPOIT, IDVALORINFO, NRORG)
         VALUES(
            P_CDFILIORI, P_NRLANCTONF, P_SEQITPROD, C_INCID.CDIMPOTEMP, '1', C_INCID.CDFISCTEMP, '', '', '', V_DBALIQOL, V_VRPREDBCTMP, V_VRPARDEDTMP,
            V_DBBASECALC, V_DBBASECALC, V_DBIMPOSTO, '00000', '00000', 'N', P_NRORG);

         /*Atualiza a trab TOTAL apenas se jA existir o registro*/
         UPDATE TRABIMPOSNFTOT
         SET
           VRIMPOSTOT = VRIMPOSTOT + V_DBIMPOSTO,
           IDERROSTOT = '00000',
           IDAVISOSTOT = '00000',
           VRBCALIMPTOT = VRBCALIMPTOT + V_DBBASECALC
         WHERE
           CDFILIMPTOT = P_CDFILIORI AND
           NRLANCIMPTOT = P_NRLANCTONF AND
           CDIMPOSTOT = C_INCID.CDIMPOTEMP AND
           NRORG = P_NRORG;

         /*Insere na trab TOTAL apenas se o registro ainda nAo existir*/
         INSERT INTO TRABIMPOSNFTOT
         (CDFILIMPTOT, NRLANCIMPTOT, CDIMPOSTOT,
          VRIMPOSTOT, IDERROSTOT, IDAVISOSTOT,
          VRBCALIMPTOT, NRORG)
         SELECT P_CDFILIORI, P_NRLANCTONF, C_INCID.CDIMPOTEMP, V_DBIMPOSTO, '00000', '00000', V_DBBASECALC, P_NRORG
           FROM DUAL D
                LEFT JOIN TRABIMPOSNFTOT T ON T.CDFILIMPTOT = P_CDFILIORI AND T.NRLANCIMPTOT = P_NRLANCTONF AND T.CDIMPOSTOT = C_INCID.CDIMPOTEMP AND 
                                              T.NRORG = P_NRORG
          WHERE T.CDFILIMPTOT IS NULL AND T.NRORG = P_NRORG;

         /*Apaga tabela temporAria de alAquotas*/
         DELETE ALIQTEMP
         WHERE NRALIQTEMP = P_CDFILIORI || P_NRLANCTONF AND NRORG = P_NRORG;
      END LOOP;
      /*Apaga tabela temporAria de incidAncias*/
      DELETE INCITEMP
      WHERE NRINCITEMP = P_CDFILIORI || P_NRLANCTONF AND NRORG = P_NRORG;
      /*Apaga tabela temporAria de alAquotas*/
      DELETE ALIQTEMP
      WHERE NRALIQTEMP = P_CDFILIORI || P_NRLANCTONF AND NRORG = P_NRORG;
   END;

   /*Verifica inconsistAncias no estoque*/
   PROCEDURE VD_INCONS_EST(P_CDFILIAL VARCHAR2,
                           P_DATA VARCHAR2,
                           P_CDFILIPROC VARCHAR2,
                           P_NRLANCTOEST VARCHAR2)
   AS
   BEGIN
      FOR C_MOVIEST IN ( SELECT CDPRODUTO
                           FROM MOVILOTE M
                          WHERE NRMOVILOTE = P_CDFILIPROC || P_NRLANCTOEST AND NRORG = P_NRORG
          ) LOOP

             UPDATE ITLANCTOEST
                SET IDEVOLESTOQ = 'N'
              WHERE CDFILIMOVI = P_CDFILIAL AND
                    NRLANCESTQ = P_NRLANCTOEST AND
                    CDPRODUTO = C_MOVIEST.CDPRODUTO AND
                    NRORG = P_NRORG;

           END LOOP;
      /*Recalcula estoque*/
      ATUALIZA_ESTOQUE(P_CDFILIAL, P_DATA, SYSDATE, P_CDFILIPROC, P_NRLANCTOEST, null);
      DELETE FROM MOVILOTE WHERE NRMOVILOTE = P_CDFILIPROC || P_NRLANCTOEST AND NRORG = P_NRORG;
   END;

BEGIN
  /*VERIFICA SE JA FOI EFETIVADA A DISTRIBUICAO*/
   SELECT IDEFETIVADA 
     INTO V_EFETIVADO
     FROM DISTPROD 
    WHERE NRDISTPROD = P_NRDISTPROD
      AND NRORG = P_NRORG;
       
    /*  
    DELETE LISTA WHERE NRLISTA = 1;
    INSERT INTO LISTA (CDLISTA, NRLISTA)
    (SELECT CDLISTA, 1 AS NRLISTA FROM LISTA WHERE NRLISTA = P_NRLISTA_PROD);
    UPDATE DISTPROD
       SET IDGERAREQUI = 'N'
     WHERE NRDISTPROD = P_NRDISTPROD;
    RETURN;*/      
     
   IF P_OPERACAO = 'G' THEN
      IF V_EFETIVADO = 'S' THEN
         UPDATE DISTPROD
            SET IDGERAREQUI = 'N'
          WHERE NRDISTPROD = P_NRDISTPROD;
         RETURN;
      END IF;
      
      /*verifica a posicao de estoque dos produtos a serem retirados na central ao efetivar a distribuiAAo*/
      BEGIN 
      SELECT MIN(B.CDPRODUTO) INTO V_EST_CENTRAL FROM (
        SELECT S.CDCENTRAL, S.CDPRODUTO, MAX(NVL(POS.QTESTDIACON, 0.0)) QTESTDIACON, SUM(NVL(ROUND(S.QTTOTPRATO,5), 0)) AS QTPRODUTO
          FROM ( -- CARREGA PRODUTO ACABADO
              (SELECT D.CDCENTRAL, SUM(CF.QTTOTPRATO) AS QTTOTPRATO, CF.CDPRODPRODUCAO AS CDPRODUTO
                 FROM CARDDISTPROD C
                INNER JOIN DISTPROD D ON D.NRDISTPROD = C.NRDISTPROD
                INNER JOIN CNFDISTCARD CF ON CF.NRDISTCARD = C.NRDISTCARD
                INNER JOIN LISTA L ON L.CDLISTA = CF.CDPRODPRODUCAO
                                  AND L.NRLISTA = P_NRLISTA_PROD
                WHERE D.NRDISTPROD = P_NRDISTPROD
               GROUP BY D.CDCENTRAL, CF.CDPRODPRODUCAO)

                UNION ALL

               SELECT D.CDCENTRAL, SUM(PP.QTTOTPRODUTO) AS QTTOTPRATO, PP.CDPRODUTO
                 FROM PRODDISTPROD PP 
                INNER JOIN DISTPROD D ON (D.NRDISTPROD = PP.NRDISTPROD)
                INNER JOIN LISTA L ON L.CDLISTA = PP.CDPRODUTO AND L.NRLISTA = P_NRLISTA_PROD
                WHERE D.NRDISTPROD = P_NRDISTPROD AND 
                      D.NRORG = P_NRORG AND
                      (PP.IDTIPOPROD <> 'ENTREGADIRETA' OR (PP.IDTIPOPROD = 'ENTREGADIRETA' AND D.CDCENTRAL = PP.CDFILIAL)) 
                GROUP BY D.CDCENTRAL, PP.CDPRODUTO) S
          LEFT JOIN ( SELECT PC.CDPRODUTO, PC.QTESTDIACON
                       FROM POSESTCONS PC
                      WHERE PC.CDFILIAL  = P_CDFILIPROC
                        AND PC.DTPOSESTCON = (SELECT MAX(P.DTPOSESTCON)
                                                FROM POSESTCONS P
                                               WHERE P.CDFILIAL = P_CDFILIPROC
                                                 AND P.CDPRODUTO = PC.CDPRODUTO
                                                 AND P.DTPOSESTCON <= TO_DATE(P_DTCARDAPIO) +1)
                    ) POS ON POS.CDPRODUTO = S.CDPRODUTO
         WHERE S.CDPRODUTO IS NOT NULL
           AND S.QTTOTPRATO > 0 -- NAFO JUSTIFICA VALIDAR PRODUTO COM QUANTIDADE IGUAL A ZERO.
         GROUP BY S.CDCENTRAL, S.CDPRODUTO
        HAVING (MAX(NVL(ROUND(POS.QTESTDIACON,5), 0.0)) - SUM(NVL(ROUND(S.QTTOTPRATO,5), 0)) < 0))B;-- OR 
         --NVL(CUSTO_PRODUTO(S.CDCENTRAL, S.CDPRODUTO, 
         --DECODE(PF.CDTIPCUSTEST, '', '03', PF.CDTIPCUSTEST), P_DTCARDAPIO, SYSDATE) , 0) = 0)B; -- ACRESCENTA VALIDACAO DE CUSTO DE PRODUTO ZERADO
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
              V_EST_CENTRAL := NULL;
      END;

      IF V_EST_CENTRAL IS NOT NULL THEN
         P_RETORNO := 'ERR_EST_CENTRAL';
         UPDATE DISTPROD
            SET IDGERAREQUI = 'N'
          WHERE NRDISTPROD = P_NRDISTPROD;
         RETURN;
      END IF;

      /*Verifica se a rotina irA gerar retirada automAtica para a(s) filial(ais) agregada(s)*/
      BEGIN
         SELECT CASE WHEN DTINIPROD = DTFINPROD THEN 'S' ELSE 'N' END
           INTO V_GERA_RETIRADA
           FROM DISTPROD
          WHERE NRDISTPROD = P_NRDISTPROD;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            UPDATE DISTPROD
               SET IDGERAREQUI = 'N'
             WHERE NRDISTPROD = P_NRDISTPROD;
            RETURN;
      END;

      /*Busca as informaAAues de distribuiAAo por serviAo*/
      FOR C_NOTAFISCAL IN
      (
         SELECT A.CDCENTRAL, FC.CDEMPRESA, FC.CDSERIE,
                A.CDFILIAL,  FA.CDEMPRESA AS CDEMPRESAAGREG, FA.CDSERIE AS CDSERIEAGREG,
                A.CDSERVFILI, FA.CDINSCESTA, PPC.CDTPDISTRSAID,
                PPF.CDTPDISTRENTR, PFA.IDUTILLOTE,
                PPF.CDTPRETIPADR, PPF.IDRETENTRDIR,
                SUM(A.VRTOTAL) AS VRTOTAL,
                SE.IDUTRETIPRAT
           FROM(

         SELECT D.CDCENTRAL, C.CDFILIAL, C.CDSERVFILI, 
                SUM(CDI.QTTOTPRATO * NVL(CUSTO_PRODUTO(D.CDCENTRAL, CDI.CDPRODPRODUCAO, 
                    DECODE(PF.CDTIPCUSTEST, '', '03', PF.CDTIPCUSTEST), P_DTCARDAPIO, SYSDATE) , 0)) AS VRTOTAL
           FROM DISTPROD D
           LEFT JOIN PARAMFILIAL PF ON PF.CDFILIAL = D.CDCENTRAL
          INNER JOIN CARDDISTPROD C ON C.NRDISTPROD = D.NRDISTPROD
          INNER JOIN CNFDISTCARD CDI ON CDI.NRDISTCARD = C.NRDISTCARD
          INNER JOIN LISTA L ON L.CDLISTA = CDI.CDPRODPRODUCAO AND L.NRLISTA = P_NRLISTA_PROD
          WHERE D.NRDISTPROD = P_NRDISTPROD AND D.NRORG = P_NRORG AND CDI.QTTOTPRATO > 0 AND
                NVL(CUSTO_PRODUTO(D.CDCENTRAL, CDI.CDPRODPRODUCAO, 
                    DECODE(PF.CDTIPCUSTEST, '', '03', PF.CDTIPCUSTEST), P_DTCARDAPIO, SYSDATE) , 0) > 0
          GROUP BY D.CDCENTRAL, C.CDFILIAL, C.CDSERVFILI
          
          UNION ALL

         SELECT B.CDCENTRAL, B.CDFILIAL, B.CDSERVFILI, SUM(B.QTTOTPRODUTO * B.VALOR) AS VRTOTAL
           FROM (SELECT D.CDCENTRAL, PP.CDFILIAL, PP.CDSERVFILI, SUM(ROUND(PP.QTTOTPRODUTO,5)) AS QTTOTPRODUTO ,PP.CDPRODUTO, 
                        NVL(CUSTO_PRODUTO(D.CDCENTRAL, PP.CDPRODUTO, DECODE(PF.CDTIPCUSTEST, '', '03', PF.CDTIPCUSTEST), P_DTCARDAPIO, SYSDATE), 0) AS VALOR        
                   FROM PRODDISTPROD PP 
                  INNER JOIN DISTPROD D ON (D.NRDISTPROD = PP.NRDISTPROD)
                  INNER JOIN LISTA L ON L.CDLISTA = PP.CDPRODUTO AND L.NRLISTA = P_NRLISTA_PROD
                   LEFT JOIN PARAMFILIAL PF ON PF.CDFILIAL = D.CDCENTRAL               
                  WHERE D.NRDISTPROD = P_NRDISTPROD AND 
                        D.NRORG = P_NRORG AND
                        PP.IDTIPOPROD <> 'ENTREGADIRETA' AND PP.QTTOTPRODUTO > 0 AND 
                        NVL(CUSTO_PRODUTO(D.CDCENTRAL, PP.CDPRODUTO, DECODE(PF.CDTIPCUSTEST, '', '03', PF.CDTIPCUSTEST), P_DTCARDAPIO, SYSDATE), 0) > 0 
                  GROUP BY D.CDCENTRAL, PP.CDFILIAL, PP.CDSERVFILI, PP.CDPRODUTO,
                           NVL(CUSTO_PRODUTO(D.CDCENTRAL, PP.CDPRODUTO, DECODE(PF.CDTIPCUSTEST, '', '03', PF.CDTIPCUSTEST), P_DTCARDAPIO, SYSDATE), 0)) B
           LEFT JOIN ( SELECT PC.CDPRODUTO, PC.QTESTDIACON
                         FROM POSESTCONS PC
                        WHERE PC.CDFILIAL = P_CDFILIPROC
                          AND PC.DTPOSESTCON = (SELECT MAX(P.DTPOSESTCON)
                                                  FROM POSESTCONS P
                                                 WHERE P.CDFILIAL = P_CDFILIPROC
                                                   AND P.CDPRODUTO = PC.CDPRODUTO
                                                   AND P.DTPOSESTCON <= TO_DATE(P_DTCARDAPIO) +1)
                     ) POS ON POS.CDPRODUTO = B.CDPRODUTO   
          WHERE B.QTTOTPRODUTO <= ROUND(POS.QTESTDIACON,5)
          GROUP BY B.CDCENTRAL, B.CDFILIAL, B.CDSERVFILI) A
           LEFT JOIN PARAMPLANEJA PPC ON PPC.CDFILIAL = A.CDCENTRAL
           LEFT JOIN PARAMPLANEJA PPF ON PPF.CDFILIAL = A.CDFILIAL
           LEFT JOIN PARAMFILIAL PFA ON PFA.CDFILIAL = A.CDFILIAL
          INNER JOIN FILIAL FC ON FC.CDFILIAL = A.CDCENTRAL
          INNER JOIN FILIAL FA ON FA.CDFILIAL = A.CDFILIAL
          INNER JOIN SERVICO SE ON SE.CDFILIAL = A.CDFILIAL
                                   AND SE.CDSERVFILI = A.CDSERVFILI
          GROUP BY A.CDCENTRAL, FC.CDEMPRESA, FC.CDSERIE,
                A.CDFILIAL,  FA.CDEMPRESA, FA.CDSERIE,
                A.CDSERVFILI, FA.CDINSCESTA, PPC.CDTPDISTRSAID,
                PPF.CDTPDISTRENTR, PFA.IDUTILLOTE,
                PPF.CDTPRETIPADR, PPF.IDRETENTRDIR,
                SE.IDUTRETIPRAT
      ) LOOP

         /****************************************/
         /****Nota Fiscal de SaAda****************/
         /****************************************/
         
         DBMS_OUTPUT.PUT_LINE('INICIAL LANAAMENTO DE NOTA FISCAL');   
         
      IF(C_NOTAFISCAL.CDFILIAL <> C_NOTAFISCAL.CDCENTRAL) THEN
         NOVO_CODIGO_NT('LANCNF/FILIAL'||P_CDFILIPROC, V_CHAVE);
         V_NFS_PRXLANCTONF := SUBSTR(V_CHAVE,11,10);

         NOVO_CODIGO_NT('LANCTOEST'||P_CDFILIPROC, V_CHAVE);
         V_NFS_PRXLANCESTQ := SUBSTR(V_CHAVE,11,10);
                                 
         DBMS_OUTPUT.PUT_LINE('ABRE NFS ' || V_NFS_PRXLANCTONF || ' COM LANAAMENTO ' || V_NFS_PRXLANCESTQ);
        
         /*Corpo da nota fiscal*/
         GERA_NOTAFISCAL_CORPO
         (P_CDFILIPROC,
          C_NOTAFISCAL.CDCENTRAL,
          C_NOTAFISCAL.CDEMPRESA,
          C_NOTAFISCAL.CDTPDISTRSAID,
          C_NOTAFISCAL.CDSERIE,
          C_NOTAFISCAL.CDFILIAL,
          P_DATAPROC,
          'DFS',
          V_NFS_PRXLANCTONF,
          V_NFS_PRXLANCESTQ,
          'S',
          NULL,
          V_NFS_PRXLANCTONF,
          NULL,
          NULL,
          NULL,
          NULL,
          NULL,
          NULL,
          NULL,
          NULL,
          NULL,
          NULL,
          NULL,
          V_NFS_PRXLANCESTQ,
          NULL,
          NULL,
          NULL,
          P_DATAPROC,
          NULL);

          /****************************************/
         /****Nota Fiscal de Entrada**************/
         /****************************************/
         NOVO_CODIGO_NT('LANCNF/FILIAL'||P_CDFILIPROC, V_CHAVE);
         V_NFE_PRXLANCTONF := SUBSTR(V_CHAVE,11,10);

         NOVO_CODIGO_NT('LANCTOEST'||P_CDFILIPROC, V_CHAVE);
         V_NFE_PRXLANCESTQ := SUBSTR(V_CHAVE,11,10);
         
         DBMS_OUTPUT.PUT_LINE('ABRE NFE ' || V_NFE_PRXLANCTONF || ' COM LANAAMENTO ' || V_NFE_PRXLANCESTQ);

         GERA_NOTAFISCAL_CORPO_ENTRADA(
          P_CDFILIPROC,
          C_NOTAFISCAL.CDFILIAL,
          C_NOTAFISCAL.CDEMPRESAAGREG,
          C_NOTAFISCAL.CDTPDISTRENTR,
          C_NOTAFISCAL.CDSERIEAGREG,
          C_NOTAFISCAL.CDCENTRAL,
          P_DATAPROC,
          'DFE',
          C_NOTAFISCAL.VRTOTAL,
          V_NFE_PRXLANCTONF,
          V_NFE_PRXLANCESTQ,
          'S',
          NULL,
          V_NFE_PRXLANCTONF,
          NULL,
          NULL,
          NULL,
          NULL,
          NULL,
          NULL,
          NULL,
          NULL,
          NULL,
          NULL,
          NULL,
          V_NFE_PRXLANCESTQ,
          NULL,
          NULL,
          NULL,
          NULL,
          NULL,
          NULL);

         V_CONTADOR := 1;
      ELSE 
         V_NFS_PRXLANCESTQ := NULL;
         V_NFE_PRXLANCESTQ := NULL;
      END IF;
         /****************************************/
         /****Retirada****************************/
         /****************************************/
         IF V_GERA_RETIRADA = 'S' THEN
            V_FILIAL_LANCESTQ := P_CDFILIPROC;
            -- DBMS_OUTPUT.PUT_LINE('incluindo retirada para a filial E SERVICO ' || C_NOTAFISCAL.CDFILIAL || C_NOTAFISCAL.CDSERVFILI);
            /*Verifica se existe cardApio para a data de retirada*/
            BEGIN
               SELECT NRCARDAPIO
                  INTO V_NRCARDAPIO
               FROM CARDADIA
               WHERE (CDFILIAL   = C_NOTAFISCAL.CDFILIAL)
                 AND (CDSERVFILI = C_NOTAFISCAL.CDSERVFILI)
                 AND (DTCARDAPIO = P_DTRETIRADA)
                 AND NRORG = P_NRORG;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                   V_NRCARDAPIO := NULL;
                   V_NRRETIRADA := NULL;
            END;

            /*Se existe cardApio, verifica se existe retirada correspondente*/
            IF V_NRCARDAPIO IS NOT NULL THEN
                 SELECT MAX(RE.NRLANCESTQ), MAX(RE.NRRETIRADA), MAX(LE.CDFILIAL)
                  INTO V_NRLANCTOEST, V_NRRETIRADA, V_FILIAL_LANCESTQ
                  FROM RETIRADA RE 
                 INNER JOIN LANCTOESTOQ LE ON (RE.CDFILIAL = LE.CDFILIMOVI AND RE.NRLANCESTQ = LE.NRLANCESTQ AND RE.CDFILANCESTQ = LE.CDFILIAL)
                 WHERE RE.CDFILIAL = C_NOTAFISCAL.CDFILIAL
                   AND RE.NRCARDAPIO = V_NRCARDAPIO
                   AND RE.DTRETIRADA = P_DTRETIRADA
                   AND RE.NRORG = P_NRORG;

            /*Inclui novo cardApio, caso nAo exista*/
            ELSE
               NOVO_CODIGO_NT('CARDAPIO'||C_NOTAFISCAL.CDFILIAL, V_CHAVE, 1);
               V_NRCARDAPIO := SUBSTR(V_CHAVE, 11, 10);
               INSERT INTO CARDADIA
                  (CDFILIAL, NRCARDAPIO, CDSERVFILI,
                   CDOPERADOR, DTCARDAPIO, DTMESCARD, NRORG)
               VALUES
                  (C_NOTAFISCAL.CDFILIAL, V_NRCARDAPIO, C_NOTAFISCAL.CDSERVFILI,
                   P_CDOPERADOR, P_DTRETIRADA, ADD_MONTHS(LAST_DAY(P_DTRETIRADA), -1) + 1, P_NRORG);
            END IF;

            /*Inclui nova retirada, caso nAo exista*/
            IF V_NRRETIRADA IS NULL THEN
               V_FILIAL_LANCESTQ := P_CDFILIPROC;
               /*Inclui lanAamento de estoque da retirada*/
               NOVO_CODIGO_NT('LANCTOEST'||P_CDFILIPROC, V_CHAVE, 1);
               V_NRLANCTOEST := SUBSTR(V_CHAVE, 11, 10);

               INSERT INTO LANCTOESTOQ
                 (CDFILIAL, NRLANCESTQ, IDTPLANCTO,
                  DTLANCESTQ, DSLANCESTQ, IDALTCUSMED,
                  NRLANCTONF, CDFILIMOVI, CDOPERADOR,
                  CDALMOXARIFE,  CDLOCALESTOQ, NRORG)
               VALUES
                 (P_CDFILIPROC, V_NRLANCTOEST, '3',
                  P_DTRETIRADA, '', 'N',
                  NULL, C_NOTAFISCAL.CDFILIAL, P_CDOPERADOR,
                  ' ', ' ', P_NRORG);

               /*Inclui a retirada*/               
               NOVO_CODIGO_NT('RETIRADA'||C_NOTAFISCAL.CDFILIAL, V_CHAVE, 1);
               V_NRRETIRADA := SUBSTR(V_CHAVE, 11, 10);
               INSERT INTO RETIRADA
                  (CDFILIAL, NRRETIRADA, NRCARDAPIO,
                   DTRETIRADA, CDFILANCESTQ, NRLANCESTQ, IDRETIPRAT, NRORG, NRREQUEXTRRE)
               VALUES
                  (C_NOTAFISCAL.CDFILIAL, V_NRRETIRADA, V_NRCARDAPIO,
                   P_DTRETIRADA, P_CDFILIPROC, V_NRLANCTOEST, C_NOTAFISCAL.IDUTRETIPRAT, P_NRORG, '0000000000');

               V_NRSEQUITRETI := 0;
               
               DBMS_OUTPUT.PUT_LINE('INSERE RETIRADA (' || V_NRRETIRADA || ') PARA FILIAL ' || C_NOTAFISCAL.CDFILIAL || ' COM LANAAMENTO ' || V_NRLANCTOEST);

            /*Caso a retirada exista, busca o prAximo sequencial para itens*/
            ELSE
               SELECT MAX(NRSEQUITRETI)
                  INTO V_NRSEQUITRETI
               FROM ITEMRETI
               WHERE CDFILIAL = C_NOTAFISCAL.CDFILIAL
                 AND NRRETIRADA = V_NRRETIRADA
                 AND NRCARDAPIO = V_NRCARDAPIO
                 AND NRORG = P_NRORG;

              IF V_NRSEQUITRETI IS NULL THEN
                 V_NRSEQUITRETI := 0;
              END IF;

              V_NRSEQUITRETI := V_NRSEQUITRETI + 1;
               
              DBMS_OUTPUT.PUT_LINE('REAPROVEITA RETIRADA (' || V_NRRETIRADA || ') PARA FILIAL ' || C_NOTAFISCAL.CDFILIAL);
            END IF;
         END IF;

         FOR C_ITNOTAFISCAL IN
            (SELECT CDPRODPRODUCAO, CDARVPROD, NMPRODUTO,
                    CDPRODESTO,
                    SUM(QTTOTPRATO) AS QTTOTPRATO,
                    SUM(QTTOTPRATO * VRCUSTO) AS CUSTO_TOTAL,
                    MAX(VRFATOCONV) AS VRFATOCONV, TIPOREQ, TIPOPROD,
                    DECODE(C_NOTAFISCAL.IDUTRETIPRAT, 'N', '', CDTIPOPRAT) CDTIPOPRAT, 
                    DECODE(C_NOTAFISCAL.IDUTRETIPRAT, 'N', '', CDPRATO) CDPRATO, 
                    DECODE(C_NOTAFISCAL.IDUTRETIPRAT, 'N', '', CDFILAUXPRAT) CDFILAUXPRAT
               FROM
                    (SELECT CDI.CDPRODPRODUCAO, PO.CDARVPROD, PO.NMPRODUTO,
                            CDI.QTTOTPRATO,
                            NVL(CUSTO_PRODUTO(D.CDCENTRAL, CDI.CDPRODPRODUCAO,
                                  DECODE(PF.CDTIPCUSTEST, '', '03', PF.CDTIPCUSTEST),
                                P_DTCARDAPIO, SYSDATE),
                            0) AS VRCUSTO,
                            NVL(CASE WHEN PO.VRFATOCONV = 0 THEN 1 ELSE PO.VRFATOCONV END, 1) AS VRFATOCONV,
                           PO.CDPRODESTO, 'P' AS TIPOREQ, 'P' AS TIPOPROD,
                           CDI.CDTIPOPRAT, CDI.CDPRATO, CDI.CDFILAUXPRAT
                      FROM DISTPROD D
                      LEFT JOIN PARAMFILIAL PF ON PF.CDFILIAL = D.CDCENTRAL
                     INNER JOIN CARDDISTPROD C ON C.NRDISTPROD = D.NRDISTPROD
                     INNER JOIN CNFDISTCARD CDI ON CDI.NRDISTCARD = C.NRDISTCARD
                     INNER JOIN LISTA L ON L.CDLISTA = CDI.CDPRODPRODUCAO
                                       AND L.NRLISTA = P_NRLISTA_PROD
                     INNER JOIN PRODUTO PO ON PO.CDPRODUTO = CDI.CDPRODPRODUCAO
                     WHERE D.NRDISTPROD = P_NRDISTPROD AND D.NRORG = P_NRORG
                       AND NVL(CUSTO_PRODUTO(D.CDCENTRAL, CDI.CDPRODPRODUCAO,
                           DECODE(PF.CDTIPCUSTEST, '', '03', PF.CDTIPCUSTEST),
                           P_DTCARDAPIO, SYSDATE),0) > 0
                       AND C.CDFILIAL = C_NOTAFISCAL.CDFILIAL
                       AND C.CDSERVFILI = C_NOTAFISCAL.CDSERVFILI
        
                     UNION ALL

                    SELECT B.CDPRODPRODUCAO, B.CDARVPROD, B.NMPRODUTO, B.QTTOTPRATO, 
                           B.VRCUSTO,B.VRFATOCONV, B.CDPRODESTO, B.TIPOREQ,
                           B.TIPOPROD, B.CDTIPOPRAT, B.CDPRATO, B.CDFILAUXPRAT
                      FROM
                   (SELECT PP.CDPRODUTO AS CDPRODPRODUCAO, P.CDARVPROD, P.NMPRODUTO, SUM(ROUND(PP.QTTOTPRODUTO,5)) AS QTTOTPRATO, 
                           NVL(CUSTO_PRODUTO(D.CDCENTRAL, PP.CDPRODUTO, 
                               DECODE(PF.CDTIPCUSTEST, '', '03', PF.CDTIPCUSTEST), P_DTCARDAPIO, SYSDATE), 0) AS VRCUSTO,
                           NVL(CASE WHEN P.VRFATOCONV = 0 THEN 1 ELSE P.VRFATOCONV END, 1) AS VRFATOCONV,
                           P.CDPRODESTO, DECODE(PP.IDTIPOPROD, 'ENTREGADIRETA','E','P')  AS TIPOREQ,
                           'D' AS TIPOPROD,
                           PP.CDTIPOPRAT, PP.CDPRATO, PP.CDFILAUXPRAT
                      FROM (SELECT PRODDISTPROD.*, CDFILIAL AS UNIDADECUSTO 
                              FROM PRODDISTPROD 
                             WHERE IDTIPOPROD = 'ENTREGADIRETA' AND NRDISTPROD = P_NRDISTPROD AND NVL(IDEFETIVADA, 'N') = 'N'
                             UNION ALL
                            SELECT PRODDISTPROD.*, DISTPROD.CDCENTRAL AS UNIDADECUSTO
                              FROM DISTPROD, PRODDISTPROD 
                             INNER JOIN LISTA L ON L.CDLISTA = PRODDISTPROD.CDPRODUTO AND L.NRLISTA = P_NRLISTA_PROD 
                             WHERE DISTPROD.NRDISTPROD = P_NRDISTPROD
                               AND IDTIPOPROD <> 'ENTREGADIRETA' AND PRODDISTPROD.NRDISTPROD = DISTPROD.NRDISTPROD) PP 
                      INNER JOIN DISTPROD D ON (D.NRDISTPROD = PP.NRDISTPROD)
                       LEFT JOIN PARAMFILIAL PF ON PF.CDFILIAL = D.CDCENTRAL
                      INNER JOIN PRODUTO P ON (PP.CDPRODUTO = P.CDPRODUTO)
                      WHERE D.NRDISTPROD = P_NRDISTPROD AND 
                            D.NRORG = P_NRORG AND
                            PP.CDFILIAL = C_NOTAFISCAL.CDFILIAL AND
                            PP.CDSERVFILI = C_NOTAFISCAL.CDSERVFILI AND
                            NVL(CUSTO_PRODUTO(PP.UNIDADECUSTO, PP.CDPRODUTO, 
                                DECODE(PF.CDTIPCUSTEST, '', '03', PF.CDTIPCUSTEST), P_DTCARDAPIO, SYSDATE), 0) > 0
                      GROUP BY PP.CDPRODUTO, P.CDARVPROD, P.NMPRODUTO, 
                            NVL(CUSTO_PRODUTO(D.CDCENTRAL, PP.CDPRODUTO, 
                                DECODE(PF.CDTIPCUSTEST, '', '03', PF.CDTIPCUSTEST), P_DTCARDAPIO, SYSDATE), 0),
                            NVL(CASE WHEN P.VRFATOCONV = 0 THEN 1 ELSE P.VRFATOCONV END, 1),
                            P.CDPRODESTO, DECODE(PP.IDTIPOPROD, 'ENTREGADIRETA','E','P'),
                            PP.CDTIPOPRAT, PP.CDPRATO, PP.CDFILAUXPRAT
                           ) B
                 LEFT JOIN ( SELECT PC.CDPRODUTO, PC.QTESTDIACON
                               FROM POSESTCONS PC
                              WHERE PC.CDFILIAL = P_CDFILIPROC
                                AND PC.DTPOSESTCON = (SELECT MAX(P.DTPOSESTCON)
                                                        FROM POSESTCONS P
                                                       WHERE P.CDFILIAL = P_CDFILIPROC
                                                         AND P.CDPRODUTO = PC.CDPRODUTO
                                                         AND P.DTPOSESTCON <= TO_DATE(P_DTCARDAPIO) +1)
                           ) POS ON POS.CDPRODUTO = B.CDPRODPRODUCAO   
                     WHERE (B.QTTOTPRATO <=  ROUND(POS.QTESTDIACON,5) OR B.TIPOREQ = 'E'))
              WHERE QTTOTPRATO > 0 
              GROUP BY CDPRODPRODUCAO, CDARVPROD, NMPRODUTO,
                    CDPRODESTO, TIPOREQ, TIPOPROD, 
                    CDTIPOPRAT, CDPRATO, CDFILAUXPRAT)LOOP

            /****************************************/
            /****Nota Fiscal de SaAda****************/
            /****************************************/
            DBMS_OUTPUT.PUT_LINE('INSERE ITENS RETIRADA');
        IF(C_NOTAFISCAL.CDFILIAL <> C_NOTAFISCAL.CDCENTRAL) THEN
           BEGIN
            /*Inclui o produto na relaAAo com a filial, caso nAo exista*/
             SELECT CDPRODUTO, IDCNTRESTOQ, IDPRODATIV
                INTO V_CDPRODUTO, V_IDCNTRESTOQ, V_IDPRODATIV
                FROM PRODFILI
               WHERE CDFILIAL = C_NOTAFISCAL.CDCENTRAL
                 AND CDPRODUTO = C_ITNOTAFISCAL.CDPRODPRODUCAO
                 AND NRORG = P_NRORG;

            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  INSERT INTO PRODFILI
                  (CDFILIAL, CDPRODUTO, IDCNTRESTOQ, IDPRODATIV, NRORG)
                  VALUES
                  (C_NOTAFISCAL.CDCENTRAL, C_ITNOTAFISCAL.CDPRODPRODUCAO, 'S', 'A', P_NRORG);
            END;
            IF (V_IDCNTRESTOQ = 'N') OR (V_IDPRODATIV = 'I') THEN
               UPDATE PRODFILI
                  SET IDCNTRESTOQ = 'S',
                      IDPRODATIV  = 'A'
                WHERE CDFILIAL  = C_NOTAFISCAL.CDCENTRAL
                  AND CDPRODUTO = C_ITNOTAFISCAL.CDPRODPRODUCAO
                  AND NRORG = P_NRORG;
            END IF;

            BEGIN
              SELECT CDPRODUTO, IDCNTRESTOQ, IDPRODATIV
                INTO V_CDPRODUTO, V_IDCNTRESTOQ, V_IDPRODATIV
                FROM PRODFILI
               WHERE CDFILIAL = C_NOTAFISCAL.CDFILIAL
                 AND CDPRODUTO = C_ITNOTAFISCAL.CDPRODPRODUCAO
                 AND NRORG = P_NRORG;

            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  INSERT INTO PRODFILI
                  (CDFILIAL, CDPRODUTO, IDCNTRESTOQ, IDPRODATIV, NRORG)
                  VALUES
                  (C_NOTAFISCAL.CDFILIAL, C_ITNOTAFISCAL.CDPRODPRODUCAO, 'S', 'A', P_NRORG);
            END;
            IF (V_IDCNTRESTOQ = 'N') OR (V_IDPRODATIV = 'I') THEN
               UPDATE PRODFILI
                  SET IDCNTRESTOQ = 'S',
                      IDPRODATIV  = 'A'
                WHERE CDFILIAL  = C_NOTAFISCAL.CDFILIAL
                  AND CDPRODUTO = C_ITNOTAFISCAL.CDPRODPRODUCAO
                  AND NRORG = P_NRORG;
            END IF;
            /*Busca as informaAAues de lote, almoxarifado e local*/
            SELECT MAX(IT.CDALMOXARIFE), MAX(IT.CDLOCALESTOQ), MAX(IT.NRLOTEESTQ), MAX(IT.NRSUBLOTE)
              INTO V_NFS_CDALMOXARIFE, V_NFS_CDLOCALESTOQ, V_NFS_NRLOTEESTQ, V_NFS_NRSUBLOTE
              FROM ITLANCTOEST IT, PRODACABAPRATO PR
             WHERE (PR.CDFILIAL       = C_NOTAFISCAL.CDCENTRAL)
               AND (PR.CDPRODACABADO  = C_ITNOTAFISCAL.CDPRODPRODUCAO)
               AND (PR.DTRETIRADALANC = P_DATAPROC       )
               AND (IT.CDFILIAL       = PR.CDFILIAL      )
               AND (IT.NRLANCESTQ     = PR.NRLANCESTQENTR)
               AND (IT.NRSEQUITEM     = PR.NRSEQUITEM    )
               AND (IT.CDPRODUTO      = PR.CDPRODACABADO )
               AND (IT.NRORG = P_NRORG);
            /*INSERE NA NOTA APENAS ITENS DE PRODUCAO OU DISTRIBUICAO, NAO INSERE OS ITENS DE ENTREGA DIRETA QUE SERAO APENAS RETIRADOS NAS UNIDADES*/
            IF (C_ITNOTAFISCAL.TIPOREQ = 'P') THEN
              V_CUSTO := CASE WHEN NVL(C_ITNOTAFISCAL.QTTOTPRATO, 0) = 0 THEN 0 ELSE C_ITNOTAFISCAL.CUSTO_TOTAL/C_ITNOTAFISCAL.QTTOTPRATO END;
              -- DBMS_OUTPUT.PUT_LINE('incluindo item na nota fiscal de saAda da filial ' ||C_NOTAFISCAL.CDFILIAL || ' ITEM ' || C_ITNOTAFISCAL.CDPRODPRODUCAO);
              /*Inclui item na nota fiscal*/
              GERA_NOTAFISCAL_PRODUTO
              (P_CDFILIPROC,
               V_NFS_PRXLANCTONF,
               C_ITNOTAFISCAL.CDPRODPRODUCAO,
               C_ITNOTAFISCAL.CDARVPROD,
               C_ITNOTAFISCAL.NMPRODUTO,
               C_ITNOTAFISCAL.QTTOTPRATO,
               V_CUSTO,
               0,
               NULL,
               NULL,
               NULL,
               NULL,
               NULL,
               NULL,
               V_NFS_CDALMOXARIFE,
               V_NFS_CDLOCALESTOQ,
               V_NFS_NRLOTEESTQ,
               V_NFS_NRSUBLOTE,
               'S',
               NULL,
               0,
               NULL,
               NULL,
               NULL,
               NULL);

              /****************************************/
              /****Nota Fiscal de Entrada**************/
              /****************************************/
              /*Identifica o local no estoque*/
              LOCALESTOQUE_PADRAO(C_NOTAFISCAL.CDFILIAL, C_ITNOTAFISCAL.CDPRODPRODUCAO,
                                  V_NFE_CDALMOXARIFE, V_NFE_CDLOCALESTOQ);
              IF V_NFE_CDALMOXARIFE IS NULL THEN
                 V_NFE_CDALMOXARIFE := ' ';
              END IF;
              IF V_NFE_CDLOCALESTOQ IS NULL THEN
                 V_NFE_CDLOCALESTOQ := ' ';
              END IF;

              /*Consulta o nAmero do lote e sublote*/
              CONSULTA_LOTE(C_NOTAFISCAL.IDUTILLOTE, C_NOTAFISCAL.CDFILIAL, V_NFE_CDALMOXARIFE,
                            V_NFE_CDLOCALESTOQ, C_ITNOTAFISCAL.CDPRODPRODUCAO,
                            V_NFE_NRLOTEESTQ, V_NFE_NRSUBLOTE);

              --DBMS_OUTPUT.PUT_LINE('incluindo item na nota fiscal de ENTRADA da filial custo'|| V_CUSTO||' ' ||C_NOTAFISCAL.CDFILIAL ||' servico' ||C_NOTAFISCAL.CDSERVFILI || ' ITEM ' ||C_ITNOTAFISCAL.CDPRODPRODUCAO);

              /*Inclui item na nota fiscal*/
              GERA_NOTAFISCAL_PRODUTO
              (P_CDFILIPROC,
               V_NFE_PRXLANCTONF,
               C_ITNOTAFISCAL.CDPRODPRODUCAO,
               C_ITNOTAFISCAL.CDARVPROD,
               C_ITNOTAFISCAL.NMPRODUTO,
               C_ITNOTAFISCAL.QTTOTPRATO,
               V_CUSTO,
               0,
               NULL,
               NULL,
               NULL,
               NULL,
               NULL,
               NULL,
               V_NFE_CDALMOXARIFE,
               V_NFE_CDLOCALESTOQ,
               V_NFE_NRLOTEESTQ,
               V_NFE_NRSUBLOTE,
               'S',
               NULL,
               0,
               NULL,
               NULL,
               NULL,
               NULL);

              DBMS_OUTPUT.PUT_LINE('INSERE ITEM (' || C_ITNOTAFISCAL.CDPRODPRODUCAO || ') NA NFE E NFS FILIAL ');

              CRIAIMPOSTOS(C_NOTAFISCAL.CDFILIAL,
                           V_NFE_PRXLANCTONF,
                           C_NOTAFISCAL.CDTPDISTRENTR,
                           C_NOTAFISCAL.CDCENTRAL,
                           P_DATAPROC,
                           C_NOTAFISCAL.VRTOTAL,
                           C_NOTAFISCAL.CDEMPRESAAGREG,
                           C_ITNOTAFISCAL.CDPRODPRODUCAO,
                           C_NOTAFISCAL.CDINSCESTA,
                           V_CONTADOR);

              V_CONTADOR := V_CONTADOR + 1;
            END IF;
        END IF;

           /****************************************/
           /****Retirada****************************/
           /****************************************/
           IF (V_GERA_RETIRADA = 'S' AND (C_ITNOTAFISCAL.TIPOREQ = 'P' OR C_NOTAFISCAL.IDRETENTRDIR = 'S')) THEN

              DBMS_OUTPUT.PUT_LINE('INSERE ITEM TBM NA RETIRADA DA FILIAL ');

               /*Normaliza valor do produto pelo fator de conversAo*/
               V_QTCONSUMIDA := ROUND((C_ITNOTAFISCAL.QTTOTPRATO * C_ITNOTAFISCAL.VRFATOCONV), 5);

               /*Inclui o item se o consumo for maior que zero*/
               IF V_QTCONSUMIDA > 0 THEN

                  /*Identifica o local no estoque*/
                  LOCALESTOQUE_PADRAO(C_NOTAFISCAL.CDFILIAL, C_ITNOTAFISCAL.CDPRODPRODUCAO,
                                      V_CDALMOXARIFE, V_CDLOCALESTOQ);
                  IF V_CDALMOXARIFE IS NULL THEN
                     V_CDALMOXARIFE := ' ';
                  END IF;
                  IF V_CDLOCALESTOQ IS NULL THEN
                     V_CDLOCALESTOQ := ' ';
                  END IF;

                  /*Consulta o nAmero do lote e sublote*/
                  CONSULTA_LOTE(C_NOTAFISCAL.IDUTILLOTE, C_NOTAFISCAL.CDFILIAL, V_CDALMOXARIFE,
                                V_CDLOCALESTOQ, C_ITNOTAFISCAL.CDPRODPRODUCAO,
                                V_LOTEESTQ, V_SUBLOTE);

                  -- DBMS_OUTPUT.PUT_LINE('ITLANCTOEST FILIPROC FILIAL ' ||V_NRLANCTOEST||' '|| P_CDFILIPROC || C_NOTAFISCAL.CDFILIAL);
                  /*Item do lanAamento do estoque*/
                  INSERT INTO ITLANCTOEST
                     (CDFILIAL, NRLANCESTQ, NRSEQUITEM,
                      CDPRODUTO, QTLANCTOEST, VRUNILANCTO,
                      VRTOTLANCTO, IDTIPOMOVI, DTLANCMOVI,
                      IDORDEMCLC, QTTOTLANCTO, CDFILIMOVI,
                      CDPRODMOVI, IDEVOLESTOQ, CDALMOXARIFE,
                      CDLOCALESTOQ, NRLOTEESTQ, NRSUBLOTE, CDTIPORETI, NRORG)
                  VALUES
                     (V_FILIAL_LANCESTQ, V_NRLANCTOEST, LPAD(V_NRSEQUITRETI, 4, '0'),
                      C_ITNOTAFISCAL.CDPRODPRODUCAO, V_QTCONSUMIDA, V_CUSTO,
                      V_CUSTO * V_QTCONSUMIDA, '3', P_DTRETIRADA,
                      '9', V_QTCONSUMIDA, C_NOTAFISCAL.CDFILIAL,
                      C_ITNOTAFISCAL.CDPRODESTO, 'S', V_CDALMOXARIFE,
                      V_CDLOCALESTOQ, V_LOTEESTQ, V_SUBLOTE,  C_NOTAFISCAL.CDTPRETIPADR, P_NRORG);

                  /*Insere item na retirada*/
                  INSERT INTO ITEMRETI
                     (CDFILIAL, NRRETIRADA, NRCARDAPIO,
                      NRSEQUITRETI, CDPRODUTO, QTPREVISRETI,
                      QTEXTRARETI, QTDEVOLVRETI, QTRETIRADA,
                      CDFIITLANEST, NRLANCESTQ, NRSEQUITEM, CDTIPORETI, NRORG,
                      CDTIPOPRAT, CDPRATO, CDFILAUXPRAT)
                  VALUES
                     (C_NOTAFISCAL.CDFILIAL, V_NRRETIRADA, V_NRCARDAPIO,
                      LPAD(V_NRSEQUITRETI, 4, '0'), C_ITNOTAFISCAL.CDPRODPRODUCAO, V_QTCONSUMIDA,
                      0, 0, V_QTCONSUMIDA,
                      V_FILIAL_LANCESTQ, V_NRLANCTOEST, LPAD(V_NRSEQUITRETI, 4, '0'), C_NOTAFISCAL.CDTPRETIPADR, P_NRORG,
                      C_ITNOTAFISCAL.CDTIPOPRAT, C_ITNOTAFISCAL.CDPRATO, C_ITNOTAFISCAL.CDFILAUXPRAT);
                      
                    UPDATE PRODDISTPROD
                       SET CDFILANCTO = P_CDFILIPROC,
                           NRRETIRADA = V_NRRETIRADA,
                           IDEFETIVADA = 'S'
                     WHERE NRDISTPROD = P_NRDISTPROD
                       AND CDFILIAL = C_NOTAFISCAL.CDFILIAL
                       AND CDSERVFILI = C_NOTAFISCAL.CDSERVFILI
                       AND NRORG = P_NRORG
                       AND (CDPRODUTO = C_ITNOTAFISCAL.CDPRODPRODUCAO
                       AND IDTIPOPROD = 'ENTREGADIRETA');
               END IF;

               V_NRSEQUITRETI := V_NRSEQUITRETI + 1;
            END IF;

         END LOOP;
          --DBMS_OUTPUT.PUT_LINE('incluindo fechamento saida da filial ' ||C_NOTAFISCAL.CDFILIAL);
         /*Gera o fechamento da nota fiscal de saAda*/
          IF(C_NOTAFISCAL.CDFILIAL <> C_NOTAFISCAL.CDCENTRAL) THEN
             GERA_NOTAFISCAL_FECHAMENTO(
              P_CDFILIPROC,
              V_NFS_PRXLANCTONF,
              P_DATAPROC,
              V_NFS_PRXLANCESTQ,
              'S',
              P_CDOPERADOR);
    
              --DBMS_OUTPUT.PUT_LINE('incluindo fechamento entrada da filial ' ||C_NOTAFISCAL.CDFILIAL || ' servico ' || C_NOTAFISCAL.CDSERVFILI);
    
             /*Gera o fechamento da nota fiscal de entrada*/
             GERA_FECHAMENTO_NFENTRADA
             (P_CDFILIPROC,
              V_NFE_PRXLANCTONF,
              P_DATAPROC,
              V_NFE_PRXLANCESTQ,
              P_CDOPERADOR);
    
              DBMS_OUTPUT.PUT_LINE('REALIZA FECHAMENTO DAS NF E ATUALIZA STATUS DO ITEM');
              
              
          END IF;
          
         UPDATE CNFDISTCARD
            SET CDFILANCTO = P_CDFILIPROC,
                NRLANCESTQSAID = V_NFS_PRXLANCESTQ,
                NRLANCESTQENTR = V_NFE_PRXLANCESTQ,
                NRRETIRADA = V_NRRETIRADA,
                IDEFETIVADA = 'S'
          WHERE NRORG = P_NRORG
            AND CDPRODPRODUCAO IN (SELECT CDLISTA FROM LISTA WHERE NRLISTA = P_NRLISTA_PROD)
            AND NRDISTCARD IN (SELECT DISTINCT C.NRDISTCARD FROM CARDDISTPROD C
                                INNER JOIN CNFDISTCARD CDI ON CDI.NRDISTCARD = C.NRDISTCARD
                                INNER JOIN LISTA L ON L.CDLISTA = CDI.CDPRODPRODUCAO
                                                  AND L.NRLISTA = P_NRLISTA_PROD
                                WHERE C.NRDISTPROD = P_NRDISTPROD
                                  AND C.CDFILIAL = C_NOTAFISCAL.CDFILIAL
                                  AND C.CDSERVFILI = C_NOTAFISCAL.CDSERVFILI
                                  AND C.NRORG = P_NRORG);

         UPDATE PRODDISTPROD
            SET CDFILANCTO = P_CDFILIPROC,
                NRLANCESTQSAID = V_NFS_PRXLANCESTQ,
                NRLANCESTQENTR = V_NFE_PRXLANCESTQ,
                NRRETIRADA = V_NRRETIRADA,
                IDEFETIVADA = 'S'
          WHERE NRDISTPROD = P_NRDISTPROD
            AND CDFILIAL = C_NOTAFISCAL.CDFILIAL
            AND CDSERVFILI = C_NOTAFISCAL.CDSERVFILI
            AND NRORG = P_NRORG
            AND CDPRODUTO IN (SELECT CDLISTA FROM LISTA WHERE NRLISTA = P_NRLISTA_PROD);
           
         /*Atualiza estoque da filial*/
         ATUALIZA_ESTOQUE(C_NOTAFISCAL.CDFILIAL, P_DTRETIRADA, SYSDATE, V_FILIAL_LANCESTQ, V_NRLANCTOEST, null);

         /*Atualiza estoque da central*/
         ATUALIZA_ESTOQUE(C_NOTAFISCAL.CDCENTRAL, P_DTRETIRADA, SYSDATE, V_FILIAL_LANCESTQ, V_NRLANCTOEST, null);
         /*Verifica inconsistAncias do cardApio*/
         VD_INCONS_EST(C_NOTAFISCAL.CDFILIAL, P_DTRETIRADA, V_FILIAL_LANCESTQ, V_NRLANCTOEST);
      END LOOP;


      /* REALIZA RETIRADA DOS PRODUTOS DE ENTREGA DIRETA NAS FILIAIS/SERVICOS QUE NAFO GERARAM NENHUMA NOTA DE DISTRIBUICAO*/
      IF V_GERA_RETIRADA = 'S' THEN
         FOR C_PROD_ENT_DIR IN ( 
            SELECT DISTINCT P.CDFILIAL, P.CDSERVFILI, PPA.CDTPRETIPADR,PFA.IDUTILLOTE, SE.IDUTRETIPRAT
             FROM PRODDISTPROD P                       
            INNER JOIN PARAMPLANEJA PPA ON PPA.CDFILIAL = P.CDFILIAL
                                       AND PPA.IDRETENTRDIR = 'S'
            INNER JOIN PARAMFILIAL PFA ON PFA.CDFILIAL = P.CDFILIAL
            INNER JOIN SERVICO SE ON SE.CDFILIAL = P.CDFILIAL
                                     AND SE.CDSERVFILI = P.CDSERVFILI
            WHERE P.NRDISTPROD = P_NRDISTPROD
              AND P.NRORG = P_NRORG
              AND IDTIPOPROD = 'ENTREGADIRETA'
              AND NVL(P.IDEFETIVADA, 'N') = 'N'
              AND NOT EXISTS (SELECT C.CDFILIAL, C.CDSERVFILI
                                FROM CARDDISTPROD C
                               INNER JOIN CNFDISTCARD CDC ON CDC.NRDISTCARD = C.NRDISTCARD
                               WHERE C.NRDISTPROD = P_NRDISTPROD
                                 AND C.NRORG = P_NRORG
                                 AND C.CDFILIAL = P.CDFILIAL
                                 AND C.CDSERVFILI = P.CDSERVFILI
                                 AND CDC.NRLANCESTQSAID IS NOT NULL)) LOOP

            V_FILIAL_LANCESTQ := P_CDFILIPROC;
            /*Verifica se existe cardApio para a data de retirada*/
            BEGIN
               SELECT NRCARDAPIO
                  INTO V_NRCARDAPIO
               FROM CARDADIA
               WHERE (CDFILIAL   = C_PROD_ENT_DIR.CDFILIAL)
                 AND (CDSERVFILI = C_PROD_ENT_DIR.CDSERVFILI)
                 AND (DTCARDAPIO = P_DTRETIRADA)
                 AND NRORG = P_NRORG;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                   V_NRCARDAPIO := NULL;
                   V_NRRETIRADA := NULL;
            END;
                 /*Se existe cardApio, verifica se existe retirada correspondente*/
            IF V_NRCARDAPIO IS NOT NULL THEN
                 SELECT MAX(RE.NRLANCESTQ), MAX(RE.NRRETIRADA), MAX(LE.CDFILIAL)
                  INTO V_NRLANCTOEST, V_NRRETIRADA, V_FILIAL_LANCESTQ
                  FROM RETIRADA RE INNER JOIN LANCTOESTOQ LE ON (RE.CDFILIAL = LE.CDFILIMOVI AND RE.NRLANCESTQ = LE.NRLANCESTQ)
                 WHERE RE.CDFILIAL = C_PROD_ENT_DIR.CDFILIAL
                   AND RE.NRCARDAPIO = V_NRCARDAPIO
                   AND RE.DTRETIRADA = P_DTRETIRADA
                   AND RE.NRORG = P_NRORG;
                 /*Inclui novo cardApio, caso nAo exista*/
            ELSE
            
               NOVO_CODIGO_NT('CARDAPIO'||C_PROD_ENT_DIR.CDFILIAL, V_CHAVE, 1);
               V_NRCARDAPIO := SUBSTR(V_CHAVE, 11, 10);
               INSERT INTO CARDADIA
                  (CDFILIAL, NRCARDAPIO, CDSERVFILI,
                   CDOPERADOR, DTCARDAPIO, DTMESCARD, NRORG)
               VALUES
                  (C_PROD_ENT_DIR.CDFILIAL, V_NRCARDAPIO, C_PROD_ENT_DIR.CDSERVFILI,
                   P_CDOPERADOR, P_DTRETIRADA, ADD_MONTHS(LAST_DAY(P_DTRETIRADA), -1) + 1, P_NRORG);
            END IF;
                 /*Inclui nova retirada, caso nAo exista*/
            IF V_NRRETIRADA IS NULL THEN
               V_FILIAL_LANCESTQ := P_CDFILIPROC;
               /*Inclui lanAamento de estoque da retirada*/
               NOVO_CODIGO_NT('LANCTOEST'||P_CDFILIPROC, V_CHAVE, 1);
               V_NRLANCTOEST := SUBSTR(V_CHAVE, 11, 10);
               INSERT INTO LANCTOESTOQ
                 (CDFILIAL, NRLANCESTQ, IDTPLANCTO,
                  DTLANCESTQ, DSLANCESTQ, IDALTCUSMED,
                  NRLANCTONF, CDFILIMOVI, CDOPERADOR,
                  CDALMOXARIFE,  CDLOCALESTOQ, NRORG)
               VALUES
                 (P_CDFILIPROC, V_NRLANCTOEST, '3',
                  P_DTRETIRADA, '', 'N',
                  NULL, C_PROD_ENT_DIR.CDFILIAL, P_CDOPERADOR,
                  ' ', ' ', P_NRORG);
                    /*Inclui a retirada*/
               NOVO_CODIGO_NT('RETIRADA'||C_PROD_ENT_DIR.CDFILIAL, V_CHAVE, 1);
               V_NRRETIRADA := SUBSTR(V_CHAVE, 11, 10);
               
               INSERT INTO RETIRADA
                  (CDFILIAL, NRRETIRADA, NRCARDAPIO,
                   DTRETIRADA, CDFILANCESTQ, NRLANCESTQ, IDRETIPRAT, NRORG, NRREQUEXTRRE)
               VALUES
  /**/             (C_PROD_ENT_DIR.CDFILIAL, V_NRRETIRADA, V_NRCARDAPIO,
                   P_DTRETIRADA, P_CDFILIPROC, V_NRLANCTOEST, C_PROD_ENT_DIR.IDUTRETIPRAT, P_NRORG, '0000000000');
                    V_NRSEQUITRETI := 0;
                 /*Caso a retirada exista, busca o prAximo sequencial para itens*/
            ELSE
               SELECT MAX(NRSEQUITRETI)
                  INTO V_NRSEQUITRETI
               FROM ITEMRETI
               WHERE CDFILIAL = C_PROD_ENT_DIR.CDFILIAL
                 AND NRRETIRADA = V_NRRETIRADA
                 AND NRCARDAPIO = V_NRCARDAPIO
                 AND NRORG = P_NRORG;
                   IF V_NRSEQUITRETI IS NULL THEN
                 V_NRSEQUITRETI := 0;
              END IF;
                   V_NRSEQUITRETI := V_NRSEQUITRETI + 1;
            END IF;
      
            /*GERA RETIRADA DOS ITENS DAS FILIAIS QUE SO POSSUEM PRODUTOS DE ENTREGA DIRETA*/

            FOR C_ITEM_ENT_DIR_PROD IN ( 
                SELECT D.CDCENTRAL,PP.CDPRODUTO AS CDPRODPRODUCAO, SUM(PP.QTTOTPRODUTO) AS QTTOTPRATO, P.CDPRODESTO,
                       (SUM(PP.QTTOTPRODUTO) * SUM(NVL(CUSTO_PRODUTO(D.CDCENTRAL, PP.CDPRODUTO, 
                       DECODE(PF.CDTIPCUSTEST, '', '03', PF.CDTIPCUSTEST), P_DTCARDAPIO, SYSDATE), 0))) AS CUSTO_TOTAL,
                       NVL(CASE WHEN P.VRFATOCONV = 0 THEN 1 ELSE P.VRFATOCONV END, 1) AS VRFATOCONV,
                       DECODE(C_PROD_ENT_DIR.IDUTRETIPRAT, 'N', '', PP.CDTIPOPRAT) CDTIPOPRAT, 
                       DECODE(C_PROD_ENT_DIR.IDUTRETIPRAT, 'N', '', PP.CDPRATO) CDPRATO, 
                       DECODE(C_PROD_ENT_DIR.IDUTRETIPRAT, 'N', '', PP.CDFILAUXPRAT) CDFILAUXPRAT
                  FROM DISTPROD D 
                 INNER JOIN PRODDISTPROD PP ON D.NRDISTPROD = PP.NRDISTPROD
                 INNER JOIN PRODUTO P ON (PP.CDPRODUTO = P.CDPRODUTO) AND (PP.NRORG = P.NRORG)
                  LEFT JOIN PARAMFILIAL PF ON PF.CDFILIAL = D.CDCENTRAL
                 WHERE D.NRDISTPROD = P_NRDISTPROD
                   AND PP.NRDISTPROD = P_NRDISTPROD
                   AND PP.NRORG = P_NRORG
                   AND PP.CDFILIAL = C_PROD_ENT_DIR.CDFILIAL
                   AND PP.CDSERVFILI = C_PROD_ENT_DIR.CDSERVFILI
                   AND PP.IDTIPOPROD = 'ENTREGADIRETA'
                   AND NVL(PP.IDEFETIVADA, 'N') = 'N'
                 GROUP BY D.CDCENTRAL, PP.CDPRODUTO, P.VRFATOCONV, P.CDPRODESTO, PP.CDTIPOPRAT, PP.CDPRATO, PP.CDFILAUXPRAT
            ) LOOP
                                          
               SELECT MAX(IT.CDALMOXARIFE), MAX(IT.CDLOCALESTOQ), MAX(IT.NRLOTEESTQ), MAX(IT.NRSUBLOTE)
                 INTO V_NFS_CDALMOXARIFE, V_NFS_CDLOCALESTOQ, V_NFS_NRLOTEESTQ, V_NFS_NRSUBLOTE
                 FROM ITLANCTOEST IT, PRODACABAPRATO PR
                WHERE (PR.CDFILIAL       = C_ITEM_ENT_DIR_PROD.CDCENTRAL)
                  AND (PR.CDPRODACABADO  = C_ITEM_ENT_DIR_PROD.CDPRODPRODUCAO)
                  AND (PR.DTRETIRADALANC = P_DATAPROC       )
                  AND (IT.CDFILIAL       = PR.CDFILIAL      )
                  AND (IT.NRLANCESTQ     = PR.NRLANCESTQENTR)
                  AND (IT.NRSEQUITEM     = PR.NRSEQUITEM    )
                  AND (IT.CDPRODUTO      = PR.CDPRODACABADO )
                  AND (IT.NRORG = P_NRORG);
      
               V_CUSTO := CASE WHEN NVL(C_ITEM_ENT_DIR_PROD.QTTOTPRATO, 0) = 0 THEN 0 ELSE C_ITEM_ENT_DIR_PROD.CUSTO_TOTAL/C_ITEM_ENT_DIR_PROD.QTTOTPRATO END;
               /*Normaliza valor do produto pelo fator de conversAo*/
               V_QTCONSUMIDA := ROUND((C_ITEM_ENT_DIR_PROD.QTTOTPRATO * C_ITEM_ENT_DIR_PROD.VRFATOCONV), 5);
      
               /*Inclui o item se o consumo for maior que zero*/
               IF V_QTCONSUMIDA > 0 THEN
      
                  /*Identifica o local no estoque*/
                  LOCALESTOQUE_PADRAO(C_PROD_ENT_DIR.CDFILIAL, C_ITEM_ENT_DIR_PROD.CDPRODPRODUCAO,
                                      V_CDALMOXARIFE, V_CDLOCALESTOQ);
                  IF V_CDALMOXARIFE IS NULL THEN
                     V_CDALMOXARIFE := ' ';
                  END IF;
                  IF V_CDLOCALESTOQ IS NULL THEN
                     V_CDLOCALESTOQ := ' ';
                  END IF;
      
                  /*Consulta o nAmero do lote e sublote*/
                  CONSULTA_LOTE(C_PROD_ENT_DIR.IDUTILLOTE, C_PROD_ENT_DIR.CDFILIAL, V_CDALMOXARIFE,
                                V_CDLOCALESTOQ, C_ITEM_ENT_DIR_PROD.CDPRODPRODUCAO,
                                V_LOTEESTQ, V_SUBLOTE);
      
                  -- DBMS_OUTPUT.PUT_LINE('ITLANCTOEST FILIPROC FILIAL ' ||V_NRLANCTOEST||' '|| P_CDFILIPROC || C_PROD_ENT_DIR.CDFILIAL);
                  /*Item do lanAamento do estoque*/
                  INSERT INTO ITLANCTOEST
                     (CDFILIAL, NRLANCESTQ, NRSEQUITEM,
                      CDPRODUTO, QTLANCTOEST, VRUNILANCTO,
                      VRTOTLANCTO, IDTIPOMOVI, DTLANCMOVI,
                      IDORDEMCLC, QTTOTLANCTO, CDFILIMOVI,
                      CDPRODMOVI, IDEVOLESTOQ, CDALMOXARIFE,
                      CDLOCALESTOQ, NRLOTEESTQ, NRSUBLOTE, CDTIPORETI, NRORG)
                  VALUES
                     (V_FILIAL_LANCESTQ, V_NRLANCTOEST, LPAD(V_NRSEQUITRETI, 4, '0'),
                      C_ITEM_ENT_DIR_PROD.CDPRODPRODUCAO, V_QTCONSUMIDA, V_CUSTO,
                      V_CUSTO * V_QTCONSUMIDA, '3', P_DTRETIRADA,
                      '9', V_QTCONSUMIDA, C_PROD_ENT_DIR.CDFILIAL,
                      C_ITEM_ENT_DIR_PROD.CDPRODESTO, 'S', V_CDALMOXARIFE,
                      V_CDLOCALESTOQ, V_LOTEESTQ, V_SUBLOTE,  C_PROD_ENT_DIR.CDTPRETIPADR, P_NRORG);
      
                  /*Insere item na retirada*/
                  INSERT INTO ITEMRETI
                     (CDFILIAL, NRRETIRADA, NRCARDAPIO,
                      NRSEQUITRETI, CDPRODUTO, QTPREVISRETI,
                      QTEXTRARETI, QTDEVOLVRETI, QTRETIRADA,
                      CDFIITLANEST, NRLANCESTQ, NRSEQUITEM, CDTIPORETI, NRORG,
                      CDTIPOPRAT, CDPRATO, CDFILAUXPRAT)
                  VALUES
                     (C_PROD_ENT_DIR.CDFILIAL, V_NRRETIRADA, V_NRCARDAPIO,
                      LPAD(V_NRSEQUITRETI, 4, '0'), C_ITEM_ENT_DIR_PROD.CDPRODPRODUCAO, V_QTCONSUMIDA,
                      0, 0, V_QTCONSUMIDA,
                      V_FILIAL_LANCESTQ, V_NRLANCTOEST, LPAD(V_NRSEQUITRETI, 4, '0'), C_PROD_ENT_DIR.CDTPRETIPADR, P_NRORG,
                      C_ITEM_ENT_DIR_PROD.CDTIPOPRAT, C_ITEM_ENT_DIR_PROD.CDPRATO, C_ITEM_ENT_DIR_PROD.CDFILAUXPRAT);

               END IF;
      
               V_NRSEQUITRETI := V_NRSEQUITRETI + 1;

                UPDATE PRODDISTPROD
                   SET CDFILANCTO = P_CDFILIPROC,
                       NRRETIRADA = V_NRRETIRADA,
                       IDEFETIVADA = 'S'
                 WHERE NRDISTPROD = P_NRDISTPROD
                   AND CDFILIAL = C_PROD_ENT_DIR.CDFILIAL
                   AND CDSERVFILI = C_PROD_ENT_DIR.CDSERVFILI
                   AND NRORG = P_NRORG
                   AND CDPRODUTO = C_ITEM_ENT_DIR_PROD.CDPRODPRODUCAO;
            END LOOP;
      
      
            /*Atualiza estoque da filial*/
            ATUALIZA_ESTOQUE(C_PROD_ENT_DIR.CDFILIAL, P_DTRETIRADA, SYSDATE, V_FILIAL_LANCESTQ, V_NRLANCTOEST, null);
      
            VD_INCONS_EST(C_PROD_ENT_DIR.CDFILIAL, P_DTRETIRADA, V_FILIAL_LANCESTQ, V_NRLANCTOEST);
         END LOOP;
      ELSE 
            /*Atualiza efetivaAAo dos itens mesmo nAo realizando a retirada*/
            UPDATE PRODDISTPROD
               SET IDEFETIVADA = 'S'
             WHERE NRDISTPROD = P_NRDISTPROD
               AND IDTIPOPROD = 'ENTREGADIRETA'
               AND NRORG = P_NRORG;
      END IF;  
      /* FIM REALIZA RETIRADA DOS PRODUTOS DE ENTREGA DIRETA NAS FILIAIS/SERVICOS QUE NAFO GERARAM NENHUMA NOTA DE DISTRIBUICAO*/


      /*Indica efetivaAAo da distribuiAAo se houve algum produto incluAda na nf*/
     -- IF V_NFS_PRXLANCESTQ IS NOT NULL THEN
     BEGIN 
        SELECT DISTINCT A.IDEFETIVADA INTO V_EFETIVADO
          FROM (SELECT NVL(IDEFETIVADA, 'N') IDEFETIVADA, CDPRODPRODUCAO AS CDPRODUTO,
                       ROUND(SUM(NVL(QTTOTPRATO, 0)),5) AS QTTOTPRATO
                 FROM CNFDISTCARD CDC
                INNER JOIN CARDDISTPROD C ON C.NRDISTPROD = P_NRDISTPROD
                                         AND C.NRDISTCARD = CDC.NRDISTCARD
                WHERE NVL(IDEFETIVADA, 'N') = 'N'
                  AND QTTOTPRATO > 0
                GROUP BY IDEFETIVADA, CDPRODPRODUCAO
                
                UNION ALL

                SELECT NVL(IDEFETIVADA, 'N') IDEFETIVADA, CDPRODUTO, ROUND(SUM(NVL(QTTOTPRODUTO, 0)),5) AS QTTOTPRATO
                  FROM PRODDISTPROD
                 WHERE NRDISTPROD = P_NRDISTPROD
                   AND IDTIPOPROD <> 'ENTREGADIRETA'
                   AND NVL(IDEFETIVADA, 'N') = 'N'
                   AND QTTOTPRODUTO > 0
                 GROUP BY IDEFETIVADA, CDPRODUTO ) A 
          INNER JOIN DISTPROD D ON D.NRDISTPROD = P_NRDISTPROD
           LEFT JOIN PARAMFILIAL PF ON PF.CDFILIAL = D.CDCENTRAL
           LEFT JOIN (SELECT PC.CDPRODUTO, ROUND(NVL(PC.QTESTDIACON, 0),5) AS QTESTDIACON
                       FROM POSESTCONS PC
                      WHERE PC.CDFILIAL  = P_CDFILIPROC
                        AND PC.DTPOSESTCON = (SELECT MAX(P.DTPOSESTCON)
                                                FROM POSESTCONS P
                                               WHERE P.CDFILIAL = P_CDFILIPROC
                                                 AND P.CDPRODUTO = PC.CDPRODUTO
                                                 AND P.DTPOSESTCON <= TO_DATE(P_DTCARDAPIO) +1)
                    ) POS ON POS.CDPRODUTO = A.CDPRODUTO
          WHERE A.QTTOTPRATO > 0
            AND POS.QTESTDIACON >= A.QTTOTPRATO
            AND NVL(CUSTO_PRODUTO(D.CDCENTRAL, A.CDPRODUTO, 
                              DECODE(PF.CDTIPCUSTEST, '', '03', PF.CDTIPCUSTEST), P_DTCARDAPIO, SYSDATE) , 0) > 0;
							  
	 EXCEPTION
		  WHEN NO_DATA_FOUND THEN 
			V_EFETIVADO := NULL;
      END;
      
      IF V_EFETIVADO IS NULL THEN 
        UPDATE DISTPROD
           SET IDEFETIVADA = 'S', IDGERAREQUI = 'N' 
         WHERE NRDISTPROD = P_NRDISTPROD;
      ELSE 
        UPDATE DISTPROD
           SET IDEFETIVADA = 'N', IDGERAREQUI = 'N' 
         WHERE NRDISTPROD = P_NRDISTPROD;
      END IF;
      
    /*  ELSE 
        P_RETORNO := 'ERR_SEM_ITEM';
        UPDATE DISTPROD
           SET IDGERAREQUI = 'N' 
         WHERE NRDISTPROD = P_NRDISTPROD;
        END IF;*/



   /******************************************************
      DESFAZER LANAAMENTOS
   *******************************************************/
   ELSE /*Desfaz os lanAamentos das notas fiscais e retirada gerados*/
      BEGIN
         SELECT DISTINCT IDEFETIVADA INTO V_EFETIVADO
          FROM (SELECT NVL(IDEFETIVADA, 'N') IDEFETIVADA
                 FROM CNFDISTCARD CDC
                INNER JOIN CARDDISTPROD C ON C.NRDISTPROD = P_NRDISTPROD
                                         AND C.NRDISTCARD = CDC.NRDISTCARD
                
                UNION ALL
                
                SELECT NVL(IDEFETIVADA, 'N') IDEFETIVADA
                  FROM PRODDISTPROD
                 WHERE NRDISTPROD = P_NRDISTPROD) A
          WHERE IDEFETIVADA = 'S';
		  
	 EXCEPTION
		  WHEN NO_DATA_FOUND THEN 
			V_EFETIVADO := NULL;
      END;
          
      IF V_EFETIVADO IS NULL THEN
         UPDATE DISTPROD
            SET IDGERAREQUI = 'N'
          WHERE NRDISTPROD = P_NRDISTPROD;
         RETURN;
      ELSE
         UPDATE DISTPROD
            SET IDGERAREQUI = 'S'
          WHERE NRDISTPROD = P_NRDISTPROD;
      END IF;

        /*Verifica se a rotina irA gerar retirada automAtica para a(s) filial(ais) agregada(s)*/
        BEGIN
           SELECT CASE WHEN DTINIPROD = DTFINPROD THEN 'S' ELSE 'N' END
             INTO V_GERA_RETIRADA
             FROM DISTPROD
            WHERE NRDISTPROD = P_NRDISTPROD;
        EXCEPTION
           WHEN NO_DATA_FOUND THEN
              UPDATE DISTPROD
                 SET IDGERAREQUI = 'N'
               WHERE NRDISTPROD = P_NRDISTPROD;
              RETURN;
        END;

      V_NF_ENTRADA := NULL;
      V_NF_SAIDA   := NULL;
      
      FOR C_DESFAZNF IN
      (
         SELECT DISTINCT D.CDCENTRAL, CD.CDFILIAL, CD.CDSERVFILI, CD.CDFILANCTO,
                CD.NRLANCESTQSAID, CD.NRLANCESTQENTR, CD.NRRETIRADA,
                R.NRCARDAPIO, R.NRLANCESTQ, R.DTRETIRADA,
                LS.NRLANCTONF AS NRLANCTONFSAID, NS.CDTIPOOPER AS CDTIPOOPERSAID,
                LE.NRLANCTONF AS NRLANCTONFENTR, NE.CDTIPOOPER AS CDTIPOOPERENTR,
                NE.IDSTATUS AS IDSTATUSENTR, NS.IDSTATUS AS IDSTATUSSAID,
                NS.IDBLOQUEADO, NS.CDFILIEMIT, NS.NRLANCTBDOC, NS.NRNOTAFISC,
                NS.DTEMISSAO, NS.VRNOTAFISC, NS.IDENTRSAIDOP, NS.CDEMPRESA,
                NS.CDFILIRECE, NS.IDSTATUSNFE, NS.DTENTRSAID, LC.NRLANCCONT, 
                CD.CDPRODUTO, CD.NRDISTCARD
           FROM (SELECT CDFILIAL, CDSERVFILI, CDFILANCTO, NRLANCESTQSAID, NRLANCESTQENTR, NRRETIRADA, CDPRODUTO, NRDISTCARD
                   FROM(SELECT C.CDFILIAL, C.CDSERVFILI, NVL(C.CDFILANCTO, CDC.CDFILANCTO) AS CDFILANCTO, 
                               NVL(C.NRLANCESTQSAID, CDC.NRLANCESTQSAID) AS NRLANCESTQSAID, 
                               NVL(C.NRLANCESTQENTR, CDC.NRLANCESTQENTR) AS NRLANCESTQENTR, 
                               NVL(C.NRRETIRADA, CDC.NRRETIRADA) AS NRRETIRADA, 
                               CDC.CDPRODPRODUCAO AS CDPRODUTO, CDC.NRDISTCARD
                          FROM CARDDISTPROD C
                         INNER JOIN CNFDISTCARD CDC ON CDC.NRDISTCARD = C.NRDISTCARD
                         INNER JOIN LISTA L ON L.CDLISTA = CDC.CDPRODPRODUCAO AND L.NRLISTA = P_NRLISTA_PROD
                         WHERE NRDISTPROD = P_NRDISTPROD
                        UNION ALL
                        SELECT DISTINCT CDFILIAL, CDSERVFILI, CDFILANCTO, NRLANCESTQSAID, NRLANCESTQENTR, NRRETIRADA ,
                               PRODDISTPROD.CDPRODUTO, NULL AS NRDISTCARD
                          FROM PRODDISTPROD 
                         INNER JOIN LISTA L ON L.CDLISTA = PRODDISTPROD.CDPRODUTO AND L.NRLISTA = P_NRLISTA_PROD
                         WHERE NRDISTPROD = P_NRDISTPROD 
                           AND IDTIPOPROD <> 'ENTREGADIRETA')
                ) CD
          INNER JOIN DISTPROD D ON D.NRDISTPROD = P_NRDISTPROD
           LEFT JOIN RETIRADA R     ON R.CDFILIAL = CD.CDFILIAL AND
                                       R.NRRETIRADA = CD.NRRETIRADA AND
									   R.CDFILANCESTQ = CD.CDFILANCTO
           LEFT JOIN LANCTOESTOQ LS ON LS.CDFILIAL = CD.CDFILANCTO AND
                                       LS.NRLANCESTQ = CD.NRLANCESTQSAID AND
									 --  LS.CDFILIMOVI = CD.CDFILIAL
                                     LS.CDFILIMOVI = CD.CDFILANCTO
           LEFT JOIN NOTAFISCAL NS  ON NS.CDFILIAL = LS.CDFILIAL AND
                                       NS.NRLANCTONF = LS.NRLANCTONF
           LEFT JOIN LANCTOESTOQ LE ON LE.CDFILIAL = CD.CDFILANCTO AND
                                       LE.NRLANCESTQ = CD.NRLANCESTQENTR AND
									   LE.CDFILIMOVI = CD.CDFILIAL
           LEFT JOIN NOTAFISCAL NE  ON NE.CDFILIAL = LE.CDFILIAL AND
                                       NE.NRLANCTONF = LE.NRLANCTONF
           LEFT JOIN PARAMFILIAL PF ON PF.CDFILIAL = CD.CDFILIAL
           LEFT JOIN LANCCONT LC    ON LC.CDEMPRESA = NS.CDEMPRESA AND
                                       LC.NRLANCCONT = NS.NRLANCTBDOC
          ORDER BY LS.NRLANCTONF, LE.NRLANCTONF
      ) LOOP

        /*SE A DISTRIBUIAAFO NAO GEROU RETIRADA AUTOMATICA ENTAO VALIDA A POSICAO DE ESTOQUE
          ANTES DE APAGAR A NFE */ 
        IF V_GERA_RETIRADA = 'N' AND (V_AGREGA_ANT IS NULL OR V_AGREGA_ANT <> C_DESFAZNF.CDFILIRECE)
            AND C_DESFAZNF.DTENTRSAID IS NOT NULL THEN
            /*verifica a posicao de estoque dos produtos a filial agregada que terAFAo sua entrada desfeita ao cancelar a distribuiAFAAFAo*/
            BEGIN
            SELECT B.CDPRODUTO INTO V_EST_AGREGADA FROM (
              SELECT S.CDCENTRAL, S.CDPRODUTO, MAX(NVL(POS.QTESTDIACON, 0.0)) QTESTDIACON, SUM(NVL(ROUND(S.QTTOTPRATO,5), 0)) AS QTPRODUTO
                FROM ( -- CARREGA PRODUTO ACABADO
                    (SELECT D.CDCENTRAL, SUM(CF.QTTOTPRATO) QTTOTPRATO, CF.CDPRODPRODUCAO AS CDPRODUTO
                       FROM CARDDISTPROD C
                      INNER JOIN DISTPROD D ON D.NRDISTPROD = C.NRDISTPROD
                      INNER JOIN CNFDISTCARD CF ON CF.NRDISTCARD = C.NRDISTCARD 
                                               AND CF.CDPRODPRODUCAO = C_DESFAZNF.CDPRODUTO
                      WHERE D.NRDISTPROD = P_NRDISTPROD
                        AND C.CDFILIAL = C_DESFAZNF.CDFILIAL
                        AND C.CDSERVFILI = C_DESFAZNF.CDSERVFILI
                      GROUP BY D.CDCENTRAL, CF.CDPRODPRODUCAO) 
                      
                      UNION ALL
      
                     SELECT D.CDCENTRAL, SUM(PP.QTTOTPRODUTO) AS QTTOTPRATO, PP.CDPRODUTO
                       FROM PRODDISTPROD PP                      
                      INNER JOIN DISTPROD D ON (D.NRDISTPROD = PP.NRDISTPROD)
                      WHERE D.NRDISTPROD = P_NRDISTPROD AND 
                            D.NRORG = P_NRORG AND 
                            PP.CDFILIAL = C_DESFAZNF.CDFILIRECE AND
                            PP.CDSERVFILI = C_DESFAZNF.CDSERVFILI AND
                            PP.IDTIPOPROD <> 'ENTREGADIRETA' AND
                            PP.CDPRODUTO = C_DESFAZNF.CDPRODUTO
                     GROUP BY D.CDCENTRAL, PP.CDPRODUTO) S
                     LEFT JOIN ( SELECT PC.CDPRODUTO, PC.QTESTDIACON
                                  FROM POSESTCONS PC
                                 WHERE PC.CDFILIAL  = C_DESFAZNF.CDFILIRECE
                                   AND PC.DTPOSESTCON =
                                  (SELECT MAX(P.DTPOSESTCON)
                                     FROM POSESTCONS P
                                    WHERE P.CDFILIAL = C_DESFAZNF.CDFILIRECE
                                      AND P.CDPRODUTO = PC.CDPRODUTO
                                      AND P.DTPOSESTCON <= TO_DATE(C_DESFAZNF.DTENTRSAID) +1)
                              ) POS ON POS.CDPRODUTO = S.CDPRODUTO
                      WHERE S.CDPRODUTO IS NOT NULL
                        AND ROWNUM = 1
                     GROUP BY S.CDCENTRAL, S.CDPRODUTO
                     HAVING MAX(NVL(ROUND(POS.QTESTDIACON,5), 0.0)) - SUM(NVL(ROUND(S.QTTOTPRATO,5), 0)) < 0) B;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_EST_AGREGADA := NULL;
               END;

            IF V_EST_AGREGADA IS NOT NULL THEN
               P_RETORNO := 'ERR_EST_AGREGADA';
               UPDATE DISTPROD
                  SET IDGERAREQUI = 'N'
                WHERE NRDISTPROD = P_NRDISTPROD;
               RETURN;
            END IF;
            
            V_AGREGA_ANT := C_DESFAZNF.CDFILIRECE;
        END IF;

         /******************************************************
            RETIRADA
         *******************************************************/
         /*Confere se jA existem efetivos lanAados para clientes*/
         FOR C_EFETIVOS IN
         (SELECT 1
            FROM CARDADIA C
                 LEFT JOIN PARAMFILIAL PF ON PF.CDFILIAL = C.CDFILIAL
                 LEFT JOIN EFETCLIE EF ON EF.CDFILIAL = C.CDFILIAL AND
                                          EF.DTEFETCLIE = C.DTCARDAPIO AND
                                          EF.CDSERVFILI = C.CDSERVFILI
           WHERE C.CDFILIAL = C_DESFAZNF.CDFILIAL
             AND C.NRCARDAPIO = C_DESFAZNF.NRCARDAPIO
             AND PF.DSPARAMFATFI = 'S'
             AND EF.NRAPURACFAT IS NOT NULL
             AND C.NRORG = P_NRORG
             AND (EF.QTCOMEFETCLI IS NOT NULL OR EF.QTDOAEFETCLI IS NOT NULL OR EF.QTFUNEFETCLI IS NOT NULL)
         ) LOOP
            P_RETORNO := 'ERR_EFET_FATU;';
            UPDATE DISTPROD
               SET IDGERAREQUI = 'N'
             WHERE NRDISTPROD = P_NRDISTPROD;
            RETURN;
         END LOOP;

         /*Apaga os itens da retirada*/
         DELETE FROM ITEMRETI
         WHERE CDFILIAL = C_DESFAZNF.CDFILIAL
           AND NRRETIRADA = C_DESFAZNF.NRRETIRADA
           AND NRORG = P_NRORG
           AND NRCARDAPIO = C_DESFAZNF.NRCARDAPIO
           AND CDPRODUTO = C_DESFAZNF.CDPRODUTO;

        BEGIN 
          SELECT DISTINCT NRRETIRADA
            INTO V_NRRETIRADA
            FROM ITEMRETI
         WHERE CDFILIAL = C_DESFAZNF.CDFILIAL
           AND NRRETIRADA = C_DESFAZNF.NRRETIRADA
           AND NRORG = P_NRORG
           AND NRCARDAPIO = C_DESFAZNF.NRCARDAPIO;            
        EXCEPTION
            WHEN NO_DATA_FOUND THEN
               /*Apaga a retirada*/
               DELETE FROM RETIRADA
                WHERE CDFILIAL = C_DESFAZNF.CDFILIAL
                  AND NRRETIRADA = C_DESFAZNF.NRRETIRADA
                  AND NRORG = P_NRORG;
         END;
         
         /*Apaga os itens do lanAamento de estoque da retirada*/
         DELETE FROM ITLANCTOEST
          WHERE CDFILIMOVI = C_DESFAZNF.CDFILIAL
            AND NRLANCESTQ = C_DESFAZNF.NRLANCESTQ
            AND NRORG = P_NRORG
           AND CDPRODUTO = C_DESFAZNF.CDPRODUTO;

         BEGIN 
          SELECT DISTINCT NRLANCESTQ
            INTO V_NRLANCTOEST
            FROM ITLANCTOEST
           WHERE CDFILIMOVI = C_DESFAZNF.CDFILIAL
             AND NRLANCESTQ = C_DESFAZNF.NRLANCESTQ
             AND NRORG = P_NRORG;            
       EXCEPTION
            WHEN NO_DATA_FOUND THEN 
           /*Apaga o lanAamento de estoque da retirada*/
           DELETE FROM LANCTOESTOQ
            WHERE CDFILIMOVI = C_DESFAZNF.CDFILIAL
              AND NRLANCESTQ = C_DESFAZNF.NRLANCESTQ
              AND NRORG = P_NRORG;
        END;

         /*Recalcula estoque*/
         ATUALIZA_ESTOQUE(C_DESFAZNF.CDFILIAL, C_DESFAZNF.DTRETIRADA, C_DESFAZNF.DTRETIRADA, C_DESFAZNF.CDFILANCTO, C_DESFAZNF.NRLANCESTQ, null);

         /*Verifica irregularidade no estoque*/
         VD_INCONS_EST(C_DESFAZNF.CDFILIAL, C_DESFAZNF.DTRETIRADA, C_DESFAZNF.CDFILANCTO, C_DESFAZNF.NRLANCESTQ);

         UPDATE CARDADIA
            SET QTCLIEFETCAR = NULL, QTFUNEFETCAR = NULL,
                QTDOAEFETCAR = NULL, QTCOMEFETCAR = NULL
          WHERE CDFILIAL = C_DESFAZNF.CDFILIAL
            AND NRCARDAPIO = C_DESFAZNF.NRCARDAPIO
            AND NRORG = P_NRORG;

         UPDATE COMPCARD
            SET QTCOMEFETPRA = NULL, QTPRODUZPRAT = NULL
          WHERE CDFILIAL = C_DESFAZNF.CDFILIAL
            AND NRCARDAPIO = C_DESFAZNF.NRCARDAPIO
            AND NRORG = P_NRORG;

		 BEGIN 
            SELECT IDPERLEFESRETPLA INTO V_IDPERLEFESRETPLA
              FROM PARAMPLANEJA
             WHERE CDFILIAL = C_DESFAZNF.CDFILIAL;
         END;
             
         IF V_IDPERLEFESRETPLA = 'N' THEN
			 UPDATE EFETCLIE
				SET QTCOMEFETCLI = NULL, QTFUNEFETCLI = NULL,
					QTDOAEFETCLI = NULL
			  WHERE CDFILIAL = C_DESFAZNF.CDFILIAL
				AND CDSERVFILI = C_DESFAZNF.CDSERVFILI
				AND DTEFETCLIE = C_DESFAZNF.DTRETIRADA
				AND NRORG = P_NRORG;
         END IF;

         /*Apaga as informaAAues de NF e retiradas dos cardApios distribuidos*/
         UPDATE CARDDISTPROD
            SET CDFILANCTO = NULL,
                NRLANCESTQSAID = NULL,
                NRLANCESTQENTR = NULL,
                NRRETIRADA = NULL
          WHERE NRDISTPROD = P_NRDISTPROD
            AND CDFILIAL = C_DESFAZNF.CDFILIAL
            AND CDSERVFILI = C_DESFAZNF.CDSERVFILI
            AND NRORG = P_NRORG;
            
            
         UPDATE CNFDISTCARD
            SET CDFILANCTO = NULL,
                NRLANCESTQSAID = NULL,
                NRLANCESTQENTR = NULL,
                NRRETIRADA = NULL,
                IDEFETIVADA = 'N'
          WHERE NRDISTCARD IN (SELECT DISTINCT C.NRDISTCARD FROM CARDDISTPROD C
                                     INNER JOIN CNFDISTCARD CDI ON CDI.NRDISTCARD = C.NRDISTCARD
                                           -- AND CDI.CDPRODPRODUCAO = C_DESFAZNF.CDPRODUTO
                                      INNER JOIN LISTA L ON L.CDLISTA = CDI.CDPRODPRODUCAO
                                                       AND L.NRLISTA = P_NRLISTA_PROD
                                     WHERE C.NRDISTPROD = P_NRDISTPROD
                                       AND C.CDFILIAL = C_DESFAZNF.CDFILIAL
                                       AND C.CDSERVFILI = C_DESFAZNF.CDSERVFILI
                                       AND C.NRORG = P_NRORG)
            AND CDPRODPRODUCAO IN (SELECT CDLISTA FROM LISTA WHERE NRLISTA = P_NRLISTA_PROD)
            AND NRORG = P_NRORG;

         UPDATE PRODDISTPROD
            SET CDFILANCTO = NULL,
                NRLANCESTQSAID = NULL,
                NRLANCESTQENTR = NULL,
                NRRETIRADA = NULL, 
                IDEFETIVADA = 'N'
          WHERE NRDISTPROD = P_NRDISTPROD
            AND CDFILIAL = C_DESFAZNF.CDFILIAL
            AND CDSERVFILI = C_DESFAZNF.CDSERVFILI
            AND CDPRODUTO IN (SELECT CDLISTA FROM LISTA WHERE NRLISTA = P_NRLISTA_PROD)
            AND NRORG = P_NRORG;
         /******************************************************
            NOTA FISCAL DE ENTRADA
         *******************************************************/         
         IF C_DESFAZNF.NRLANCTONFENTR <> V_NF_ENTRADA OR V_NF_ENTRADA IS NULL THEN
             /*Verifica se a nota fiscal estA aprovada/ emitida*/
             IF C_DESFAZNF.IDSTATUSENTR IN ('A', 'E') THEN
                P_RETORNO := 'ERR_NFAPROV;' || C_DESFAZNF.CDFILANCTO || C_DESFAZNF.NRLANCTONFENTR;
                UPDATE DISTPROD
                   SET IDGERAREQUI = 'N'
                 WHERE NRDISTPROD = P_NRDISTPROD;
                RETURN;
             END IF;
    
             /*Bloqueia NFs de origem*/
             FOR C_ITNFBLOQ IN
             (
                SELECT CDFILIALIT, NRLANCTONFIT
                  FROM ITEMNOTAFISC
                 WHERE CDFILIAL = C_DESFAZNF.CDFILANCTO AND
                       NRLANCTONF = C_DESFAZNF.NRLANCTONFENTR AND
                       NRORG = P_NRORG
             ) LOOP
                UPDATE NOTAFISCAL
                   SET IDBLOQUEADO = 'N'
                 WHERE CDFILIAL   = C_ITNFBLOQ.CDFILIALIT
                   AND NRLANCTONF = C_ITNFBLOQ.NRLANCTONFIT
                   AND IDSTATUS   = 'P'
                   AND IDENTRSAIDOP = 'E'
                   AND NRORG = P_NRORG;
             END LOOP;
    
             /*Apaga NFs de devoluAAo (se tiver)*/
             FOR C_NFDEVO IN
             (
                SELECT DISTINCT I.CDFILIAL, I.NRLANCTONF
                  FROM ITEMNOTAFISC I
                       INNER JOIN NOTAFISCAL N ON I.CDFILIAL = N.CDFILIAL AND
                                                  I.NRLANCTONF = N.NRLANCTONF
                 WHERE I.CDFILIALIT = C_DESFAZNF.CDFILANCTO
                   AND I.NRLANCTONFIT = C_DESFAZNF.NRLANCTONFENTR
                   AND N.CDTIPOOPER = C_DESFAZNF.CDTIPOOPERENTR
                   AND N.IDSTATUS = 'P'
                   AND I.NRORG = P_NRORG
             ) LOOP
                DELETA_NF(C_NFDEVO.CDFILIAL, C_NFDEVO.NRLANCTONF, 'I');
                DELETA_NF(C_NFDEVO.CDFILIAL, C_NFDEVO.NRLANCTONF, 'C');
             END LOOP;
    
             /*Apaga itens da nota fiscal de transferAncia*/
             DELETE FROM ITEMNOTATRANSF
              WHERE CDFILIALITTRANS = C_DESFAZNF.CDFILANCTO
                AND NRLANCTONFITTRA = C_DESFAZNF.NRLANCTONFENTR
                AND NRORG = P_NRORG;
    
             DELETA_NF(C_DESFAZNF.CDFILANCTO, C_DESFAZNF.NRLANCTONFENTR, 'I');
    
             /*Recalcula estoque*/
             ATUALIZA_ESTOQUE(C_DESFAZNF.CDFILIAL, C_DESFAZNF.DTENTRSAID, C_DESFAZNF.DTENTRSAID, C_DESFAZNF.CDFILANCTO, C_DESFAZNF.NRLANCESTQENTR, null);
    
             DELETA_NF(C_DESFAZNF.CDFILANCTO, C_DESFAZNF.NRLANCTONFENTR, 'C');
             
             V_NF_ENTRADA := C_DESFAZNF.NRLANCTONFENTR;
         END IF;

         /******************************************************
            NOTA FISCAL DE SAADA
         *******************************************************/
         IF C_DESFAZNF.NRLANCTONFSAID <> V_NF_SAIDA OR V_NF_SAIDA IS NULL THEN
           IF C_DESFAZNF.IDENTRSAIDOP = 'S' THEN
              /*Verifica bloqueio na nota fiscal*/
              IF NOT (C_DESFAZNF.IDSTATUSNFE IN ('P', 'R')) THEN
                 P_RETORNO := 'ERR_NFEBLOQ;' || C_DESFAZNF.CDFILANCTO || C_DESFAZNF.NRLANCTONFSAID;
                 UPDATE DISTPROD
                    SET IDGERAREQUI = 'N'
                  WHERE NRDISTPROD = P_NRDISTPROD;
                 RETURN;
              END IF;
              
             /*Verifica se a nota fiscal estA aprovada/ emitida*/
             IF C_DESFAZNF.IDSTATUSSAID IN ('A', 'E') THEN
                P_RETORNO := 'ERR_NFAPROV;' || C_DESFAZNF.CDFILANCTO || C_DESFAZNF.NRLANCTONFSAID;
                UPDATE DISTPROD
                   SET IDGERAREQUI = 'N'
                 WHERE NRDISTPROD = P_NRDISTPROD;
                RETURN;
             END IF;
  
              /*Verifica existAncia de duplicata lanAada para a NF*/
              BEGIN
                 SELECT MAX(CR.NRLANCTODUP)
                   INTO V_NRLANCTODUP
                   FROM CONTARECEBER CR
                        INNER JOIN BOLETRECEBER BO ON BO.CDFILIAL = CR.CDFILIBOLREC AND
                                                      BO.NRLANBOLREC = CR.NRLANBOLREC
                  WHERE (CR.CDFILIAL    = C_DESFAZNF.CDFILANCTO)
                    AND (CR.NRLANCTONF  = C_DESFAZNF.NRLANCTONFSAID)
                    AND (BO.IDSTATBREC  = 'A')
                    AND (CR.NRLANCTODUP IS NOT NULL)
                    AND CR.NRORG = P_NRORG;
              EXCEPTION
                 WHEN NO_DATA_FOUND THEN
                    V_NRLANCTODUP := NULL;
              END;
  
              IF V_NRLANCTODUP IS NOT NULL THEN
                 P_RETORNO := 'ERR_NCANCENT;' || C_DESFAZNF.CDFILANCTO || C_DESFAZNF.NRLANCTONFSAID;
                 UPDATE DISTPROD
                    SET IDGERAREQUI = 'N'
                  WHERE NRDISTPROD = P_NRDISTPROD;
                 RETURN;
              END IF;
  
              /*Verifica status financeiro do documento*/
              CANCELA_DADOS_FINANCEIRO(C_DESFAZNF.CDFILANCTO,
                                       C_DESFAZNF.NRLANCTONFSAID,
                                       'S',
                                       V_IDSTATDOC);
  
  
              IF (V_IDSTATDOC = 0) THEN
                 DELETA_NF(C_DESFAZNF.CDFILANCTO, C_DESFAZNF.NRLANCTONFSAID, 'I');
  
                 /*Recalcula estoque*/
                 ATUALIZA_ESTOQUE(C_DESFAZNF.CDCENTRAL, C_DESFAZNF.DTENTRSAID, C_DESFAZNF.DTENTRSAID, C_DESFAZNF.CDFILANCTO, C_DESFAZNF.NRLANCESTQSAID, null);
  
                 DELETA_NF(C_DESFAZNF.CDFILANCTO, C_DESFAZNF.NRLANCTONFSAID, 'C');
              ELSE
  
                 IF V_IDSTATDOC = 1 THEN
                    P_RETORNO := 'ERR_MS03;'; -- BOLETO BAIXADO
                 ELSIF V_IDSTATDOC = 2 THEN
                    P_RETORNO := 'ERR_MS04;'; -- CONTA PARCELA
                 ELSIF V_IDSTATDOC = 4 THEN
                    P_RETORNO := 'ERR_MS06;'; -- AJUSTE DO BOLETO
                 ELSIF V_IDSTATDOC = 5 THEN
                    P_RETORNO := 'ERR_MS07;'; -- BOLETO EMITIDO
                 ELSIF V_IDSTATDOC = 6 THEN
                    P_RETORNO := 'ERR_MS08;'; -- BOLETO COM CNAB
                 ELSIF V_IDSTATDOC = 7 THEN
                    P_RETORNO := 'ERR_MS09;'; -- BOLETO ASSOCIADO
                 ELSIF V_IDSTATDOC = 8 THEN
                    P_RETORNO := 'ERR_MS11;'; -- CRADITO UTILIZADO
                 END IF;
                 UPDATE DISTPROD
                    SET IDGERAREQUI = 'N'
                  WHERE NRDISTPROD = P_NRDISTPROD;
                 RETURN;
              END IF;
           END IF;
           
           V_NF_SAIDA := C_DESFAZNF.NRLANCTONFSAID;
        END IF;

      END LOOP;

      /*Indica efetivaAAo da distribuiAAo*/
      BEGIN
         SELECT COUNT(IDEFETIVADA) INTO V_EFETIVADO
          FROM (SELECT IDEFETIVADA/*, CDPRODPRODUCAO AS CDPRODUTO,
                       SUM(QTTOTPRATO) AS QTTOTPRATO*/
                 FROM CNFDISTCARD CDC
                INNER JOIN CARDDISTPROD C ON C.NRDISTPROD = P_NRDISTPROD
                                         AND C.NRDISTCARD = CDC.NRDISTCARD
                WHERE NVL(IDEFETIVADA, 'N') = 'N'
                GROUP BY IDEFETIVADA, CDPRODPRODUCAO
                
                UNION ALL
                
               SELECT IDEFETIVADA /*, CDPRODUTO, SUM(QTTOTPRODUTO) AS QTTOTPRATO*/
                 FROM PRODDISTPROD
                WHERE NRDISTPROD = P_NRDISTPROD
                  AND IDTIPOPROD <> 'ENTREGADIRETA'
                  AND NVL(IDEFETIVADA, 'N') = 'N'
                GROUP BY IDEFETIVADA, CDPRODUTO ) A;
      END;
      
      IF V_EFETIVADO = '0' THEN
        UPDATE DISTPROD
           SET IDEFETIVADA = 'S',
               IDGERAREQUI = 'N' 
         WHERE NRDISTPROD = P_NRDISTPROD;
      ELSE 
        UPDATE DISTPROD
           SET IDEFETIVADA = 'N',
               IDGERAREQUI = 'N' 
         WHERE NRDISTPROD = P_NRDISTPROD;
      END IF;
      
      /*Verificar se tem algum item evoluAdo para manter ou nAo a retirada dos itens de entrega direta. */
      BEGIN
         SELECT COUNT(IDEFETIVADA) INTO V_EFETIVADO
          FROM (SELECT IDEFETIVADA
                 FROM CNFDISTCARD CDC
                INNER JOIN CARDDISTPROD C ON C.NRDISTPROD = P_NRDISTPROD
                                         AND C.NRDISTCARD = CDC.NRDISTCARD
                WHERE NVL(IDEFETIVADA, 'N') = 'S'
                GROUP BY IDEFETIVADA, CDPRODPRODUCAO
                
                UNION ALL
                
               SELECT IDEFETIVADA
                 FROM PRODDISTPROD
                WHERE NRDISTPROD = P_NRDISTPROD
                  AND IDTIPOPROD <> 'ENTREGADIRETA'
                  AND NVL(IDEFETIVADA, 'N') = 'S'
                GROUP BY IDEFETIVADA, CDPRODUTO ) A;
      END;
      
      IF V_EFETIVADO = '0' THEN
          /* DESFAZ A RETIRADA DOS PRODUTOS DE ENTREGA DIRETA NAS FILIAIS/SERVICOS */
          IF V_GERA_RETIRADA = 'S' THEN
            FOR C_DESFAZ_RET_ENTDIR IN
            (
               SELECT DISTINCT P.CDFILIAL, P.CDSERVFILI, P.NRRETIRADA, R.DTRETIRADA, 
                      R.NRLANCESTQ, R.CDFILANCESTQ AS CDFILANCTO, P.CDPRODUTO
                   FROM PRODDISTPROD P                       
                  INNER JOIN PARAMPLANEJA PPA ON PPA.CDFILIAL = P.CDFILIAL
                                             AND PPA.IDRETENTRDIR = 'S'
                  INNER JOIN RETIRADA R ON R.CDFILIAL = P.CDFILIAL
                                       AND R.NRRETIRADA = P.NRRETIRADA
                                       AND R.NRORG = P.NRORG
                  WHERE P.NRDISTPROD = P_NRDISTPROD
                    AND P.NRORG = P_NRORG
                    AND IDTIPOPROD = 'ENTREGADIRETA'
                    AND NVL(P.IDEFETIVADA, 'N') = 'S'
            ) LOOP
            
              /*Apaga as informaAFAAFAues de retirada*/
               UPDATE PRODDISTPROD
                  SET CDFILANCTO = NULL, 
                      NRRETIRADA = NULL, 
                      IDEFETIVADA = 'N'
                WHERE NRDISTPROD = P_NRDISTPROD
                  AND CDFILIAL = C_DESFAZ_RET_ENTDIR.CDFILIAL
                  AND CDSERVFILI = C_DESFAZ_RET_ENTDIR.CDSERVFILI
                  AND CDPRODUTO = C_DESFAZ_RET_ENTDIR.CDPRODUTO 
                  AND CDFILANCTO = C_DESFAZ_RET_ENTDIR.CDFILANCTO
                  AND NRRETIRADA = C_DESFAZ_RET_ENTDIR.NRRETIRADA
                  AND IDTIPOPROD = 'ENTREGADIRETA'
                  AND NRORG = P_NRORG;
    
               /*Apaga os itens da retirada*/
               DELETE FROM ITEMRETI
               WHERE CDFILIAL = C_DESFAZ_RET_ENTDIR.CDFILIAL
                 AND NRRETIRADA = C_DESFAZ_RET_ENTDIR.NRRETIRADA
                 AND CDPRODUTO = C_DESFAZ_RET_ENTDIR.CDPRODUTO
                 AND NRORG = P_NRORG;
    
              BEGIN 
                SELECT DISTINCT NRRETIRADA
                  INTO V_NRRETIRADA
                  FROM ITEMRETI
               WHERE CDFILIAL = C_DESFAZ_RET_ENTDIR.CDFILIAL
                 AND NRRETIRADA = C_DESFAZ_RET_ENTDIR.NRRETIRADA
                 AND NRORG = P_NRORG;            
              EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     /*Apaga a retirada*/
                     DELETE FROM RETIRADA
                      WHERE CDFILIAL = C_DESFAZ_RET_ENTDIR.CDFILIAL
                        AND NRRETIRADA = C_DESFAZ_RET_ENTDIR.NRRETIRADA
                        AND NRORG = P_NRORG;
              END;
    
               /*Apaga os itens do lanAFAamento de estoque da retirada*/
               DELETE FROM ITLANCTOEST
                WHERE CDFILIMOVI = C_DESFAZ_RET_ENTDIR.CDFILIAL
                  AND NRLANCESTQ = C_DESFAZ_RET_ENTDIR.NRLANCESTQ
                  AND NRORG = P_NRORG
                 AND CDPRODUTO = C_DESFAZ_RET_ENTDIR.CDPRODUTO;
    
               BEGIN 
                SELECT DISTINCT NRLANCESTQ
                  INTO V_NRLANCTOEST
                  FROM ITLANCTOEST
                 WHERE CDFILIMOVI = C_DESFAZ_RET_ENTDIR.CDFILIAL
                   AND NRLANCESTQ = C_DESFAZ_RET_ENTDIR.NRLANCESTQ
                   AND NRORG = P_NRORG;            
             EXCEPTION
                  WHEN NO_DATA_FOUND THEN 
                 /*Apaga o lanAFAamento de estoque da retirada*/
                 DELETE FROM LANCTOESTOQ
                  WHERE CDFILIMOVI = C_DESFAZ_RET_ENTDIR.CDFILIAL
                    AND NRLANCESTQ = C_DESFAZ_RET_ENTDIR.NRLANCESTQ
                    AND NRORG = P_NRORG;
              END;
    
               /*Recalcula estoque*/
               ATUALIZA_ESTOQUE(C_DESFAZ_RET_ENTDIR.CDFILIAL, C_DESFAZ_RET_ENTDIR.DTRETIRADA, C_DESFAZ_RET_ENTDIR.DTRETIRADA, C_DESFAZ_RET_ENTDIR.CDFILANCTO, C_DESFAZ_RET_ENTDIR.NRLANCESTQ, null);
    
               /*Verifica irregularidade no estoque*/
               VD_INCONS_EST(C_DESFAZ_RET_ENTDIR.CDFILIAL, C_DESFAZ_RET_ENTDIR.DTRETIRADA, C_DESFAZ_RET_ENTDIR.CDFILANCTO, C_DESFAZ_RET_ENTDIR.NRLANCESTQ);
    
    
            END LOOP;
          END IF;
          /* FIM DESFAZ A RETIRADA DOS PRODUTOS DE ENTREGA DIRETA NAS FILIAIS/SERVICOS */
      END IF;
   END IF;
END;