CREATE OR REPLACE PROCEDURE APURAC_DELIVERYM(
   P_FILIAL    IN FILIAL.CDFILIAL%TYPE,
   P_FILIPROC  IN FILIAL.CDFILIAL%TYPE,
   P_CDCIA     IN COMPANHIA.CDCIA%TYPE,
   P_DTFECHAME IN DATE,
   P_DTINIAPUR IN DATE,
   P_DTFIMAPUR IN DATE,
   P_CDSERIE   IN SERIENF.CDSERIE%TYPE,
   P_IDTPIJURTRAN IN TRANSPORT.IDTPIJURTRAN%TYPE,
   P_NRINSJURTRAN IN TRANSPORT.NRINSJURTRAN%TYPE,
   P_NRAPURACFATM  IN NOTAFISCAL.NRAPURACFATM%TYPE,
   P_NRORG IN NUMBER DEFAULT 1)

AS

   V_NRSEQITPROD   NUMBER;

   V_CDCLIENTE     COMPANHIA.CDCLIENTE%TYPE;

   V_NRLANCTONF    VARCHAR(20);

   V_NRLANCTONFAP  VARCHAR(20);

   V_CDSERIE       SERIENF.CDSERIE%TYPE;

   V_VRCOTDOLAR    TRAB_APURACM.VRCOTDOLARAP%TYPE;
   V_NRDELIVERY    TRAB_APURACM.NRDELIVERYAP%TYPE;
   V_CDFISCOPER    TRAB_APURACM.CDFISCOPERAP%TYPE;
   V_IDSERVICO     TRAB_APURACM.IDSERVICOAP%TYPE;

   V_CDEMPRESA     FILIAL.CDEMPRESA%TYPE;
   V_CDINSCMUNI    FILIAL.CDINSCMUNI%TYPE;
   V_CDINSCESTA    FILIAL.CDINSCESTA%TYPE;

   V_IDTPIJURCLIE  CLIENTE.IDTPIJURCLIE%TYPE;
   V_NRINSJURCLIE  CLIENTE.NRINSJURCLIE%TYPE;

   V_NOVANOTA      VARCHAR(1);
   V_CONTADOR      SERIENF.NRMAXITNF%TYPE;

   V_VRINDICE      MOVINDICE.VRINDICE%TYPE;
   V_VRUNITITEM    ITEMPRODUTO.VRUNITITEM%TYPE;

   V_IDCONMAXITEM  SERIENF.IDCONMAXITEM%TYPE;
   V_NRMAXITNF     SERIENF.NRMAXITNF%TYPE;
   V_NRMAXSERVNF   SERIENF.NRMAXSERVNF%TYPE;

   V_NRORDEMISPR   TRAB_APURACM.NRORDEMIS%TYPE;
   V_NRORDEMISSV   TRAB_APURACM.NRORDEMIS%TYPE;
   V_NRORDEMIS     TRAB_APURACM.NRORDEMIS%TYPE;

   V_NRCOUNTPR     TRAB_APURACM.NRORDEMIS%TYPE;
   V_NRCOUNTSV     TRAB_APURACM.NRORDEMIS%TYPE;

   V_VRTAXAAERO    ITEMPRODUTO.VRUNITITEM%TYPE;
   V_VRTAXAAEME    ITEMPRODUTO.VRUNITITEM%TYPE;

   V_IDMUNIUTCONVNFE MUNICIPIO.IDMUNIUTCONVNFE%TYPE;
   V_IDEMPUTILIZANFE PARAMEMPRESA.IDEMPUTILIZANFE%TYPE;

   V_IDPRODSERVAP  TRAB_APURACM.IDPRODSERVAP%TYPE;

   V_COUNT_SERVICO NUMBER;
   
   V_CDTIPOOPERVENDA VARCHAR2(2);
BEGIN
   SELECT MAX(CDCLIENTE), MAX(CDTIPOOPERVENDA) 
     INTO V_CDCLIENTE, V_CDTIPOOPERVENDA
   FROM COMPANHIA
   WHERE CDCIA = P_CDCIA;
   
   IF V_CDTIPOOPERVENDA IS NULL THEN
      V_CDTIPOOPERVENDA := '01';
   END IF;

   SELECT CDEMPRESA, CDINSCMUNI, CDINSCESTA
   INTO V_CDEMPRESA, V_CDINSCMUNI, V_CDINSCESTA
   FROM FILIAL
   WHERE CDFILIAL = P_FILIAL;

   SELECT IDTPIJURCLIE, NRINSJURCLIE
   INTO V_IDTPIJURCLIE, V_NRINSJURCLIE
   FROM CLIENTE
   WHERE CDCLIENTE = V_CDCLIENTE;

   SELECT NVL(NRMAXITNF, 10), NVL(NRMAXSERVNF, 5),
          IDCONMAXITEM
   INTO V_NRMAXITNF, V_NRMAXSERVNF, V_IDCONMAXITEM
   FROM SERIENF
   WHERE CDEMPRESA  = V_CDEMPRESA  AND
         CDINSCESTA = V_CDINSCESTA AND
         CDINSCMUNI = V_CDINSCMUNI AND
         CDSERIE    = P_CDSERIE;

  SELECT NVL(MI.IDMUNIUTCONVNFE, 'N') AS IDMUNIUTCONVNFE, NVL(PE.IDEMPUTILIZANFE, 'N') IDEMPUTILIZANFE
    INTO V_IDMUNIUTCONVNFE, V_IDEMPUTILIZANFE
    FROM EMPRESA EP, MUNICIPIO MI, PARAMEMPRESA PE
   WHERE EP.CDEMPRESA = V_CDEMPRESA
     AND EP.CDEMPRESA = PE.CDEMPRESA(+)
     AND EP.CDPAIS = MI.CDPAIS
     AND EP.SGESTADO = MI.SGESTADO
     AND EP.CDMUNICIPIO = MI.CDMUNICIPIO;         

   V_CONTADOR := 0;

   V_NRLANCTONF := 'X';
   V_CDFISCOPER := 'X';
   V_NRDELIVERY := -1;
   V_IDSERVICO  := 'X';
   V_VRCOTDOLAR := -1;

   V_NRSEQITPROD := 0;

   V_NOVANOTA := 'X';

   V_NRORDEMISPR := 0;
   V_NRORDEMISSV := V_NRMAXITNF;

   V_NRCOUNTPR   := 0;
   V_NRCOUNTSV   := 0;

   FOR CURS_APDELIVERYM IN
      (SELECT CDCIAAP, NRDELIVERYAP, IDTIPMANUALAP, VRCOTDOLARAP, CDFISCOPERAP, CDSUFXCFOPAP,
              IDSERVICOAP, NRSERVICOCIAFILIAP, CDCLASSEAP, CDCICLOAP, CDPRODUTOAP, DSSERVFATUAP,
              VRPUREASERVAP, VRPUDOLSERVAP, IDPRODSERVAP, QTPROPPRODINIAP, QTPROPPRODFINAP
       FROM TRAB_APURACM
       WHERE CDCIAAP       = P_CDCIA  AND
             CDFILIALAP    = P_FILIPROC AND
             NRAPURACFATAP = P_NRAPURACFATM

       GROUP BY CDCIAAP, NRDELIVERYAP, IDTIPMANUALAP, VRCOTDOLARAP, CDFISCOPERAP, CDSUFXCFOPAP,
                IDSERVICOAP, NRSERVICOCIAFILIAP, CDCLASSEAP, CDCICLOAP, CDPRODUTOAP, DSSERVFATUAP,
                VRPUREASERVAP, VRPUDOLSERVAP, IDPRODSERVAP, QTPROPPRODINIAP, QTPROPPRODFINAP
       ORDER BY
           CDCIAAP, IDTIPMANUALAP, NRDELIVERYAP, VRCOTDOLARAP, CDFISCOPERAP, CDSUFXCFOPAP,
           IDSERVICOAP, NRSERVICOCIAFILIAP, CDCLASSEAP, CDCICLOAP, CDPRODUTOAP, DSSERVFATUAP,
           VRPUREASERVAP, VRPUDOLSERVAP, IDPRODSERVAP) LOOP


      IF CURS_APDELIVERYM.IDPRODSERVAP = 'S' THEN
         V_NRCOUNTSV := V_NRCOUNTSV + 1;
         IF V_NRCOUNTSV > V_NRMAXSERVNF THEN
            V_NRORDEMISSV := V_NRORDEMISSV + V_NRMAXITNF + 1;
            V_NRCOUNTSV   := 1;
         ELSE
            V_NRORDEMISSV := V_NRORDEMISSV + 1;
         END IF;
         V_NRORDEMIS := V_NRORDEMISSV;
      ELSE
         V_NRCOUNTPR := V_NRCOUNTPR + 1;
         IF V_IDCONMAXITEM <> 'N' THEN
            IF V_NRCOUNTPR > V_NRMAXITNF THEN
               V_NRORDEMISPR := V_NRORDEMISPR + V_NRMAXSERVNF + 1;
               V_NRCOUNTPR   := 1;
            ELSE
               V_NRORDEMISPR := V_NRORDEMISPR + 1;
            END IF;
         ELSE
            V_NRORDEMISPR := V_NRORDEMISPR + V_NRMAXSERVNF + 1;
            V_NRCOUNTPR   := 1;
         END IF;
         V_NRORDEMIS := V_NRORDEMISPR;
      END IF;

      UPDATE TRAB_APURACM
      SET NRORDEMIS = V_NRORDEMIS
      WHERE CDCIAAP               = CURS_APDELIVERYM.CDCIAAP       AND
            CDFILIALAP            = P_FILIPROC                      AND
            NRAPURACFATAP         = P_NRAPURACFATM                 AND
            NRSERVICOCIAFILIAP    = CURS_APDELIVERYM.NRSERVICOCIAFILIAP  AND
            CDCLASSEAP            = CURS_APDELIVERYM.CDCLASSEAP AND
            CDCICLOAP             = CURS_APDELIVERYM.CDCICLOAP AND
            NRDELIVERYAP          = CURS_APDELIVERYM.NRDELIVERYAP  AND
            CDPRODUTOAP           = CURS_APDELIVERYM.CDPRODUTOAP   AND
            IDTIPMANUALAP         = CURS_APDELIVERYM.IDTIPMANUALAP AND
            IDPRODSERVAP          = CURS_APDELIVERYM.IDPRODSERVAP  AND
            DSSERVFATUAP          = CURS_APDELIVERYM.DSSERVFATUAP  AND
            VRCOTDOLARAP          = CURS_APDELIVERYM.VRCOTDOLARAP  AND
            IDSERVICOAP           = CURS_APDELIVERYM.IDSERVICOAP   AND
            (NVL(CDFISCOPERAP,0)  = NVL(CURS_APDELIVERYM.CDFISCOPERAP,0))  AND
            (NVL(CDSUFXCFOPAP,0)  = NVL(CURS_APDELIVERYM.CDSUFXCFOPAP,0))  AND
            (NVL(VRPUREASERVAP,0) = NVL(CURS_APDELIVERYM.VRPUREASERVAP,0)) AND
            (NVL(VRPUDOLSERVAP,0) = NVL(CURS_APDELIVERYM.VRPUDOLSERVAP,0));
   END LOOP;

   FOR CURS_APDELIVERYM IN
      (SELECT CDCIAAP, VRCOTDOLARAP, NRDELIVERYAP, CDFISCOPERAP, CDSUFXCFOPAP, IDSERVICOAP,
              NRSERVICOCIAFILIAP, CDCLASSEAP, CDCICLOAP, CDPRODUTOAP, DSSERVFATUAP, VRPUREASERVAP,
              VRPUDOLSERVAP, SUM(NRQTDESERVAP) NRTOTASERVAP,
              NVL(SUM(VRDESCDELAP),0) VRDESCDELAP, NVL(SUM(VRDESCSRVAP),0) VRDESCSRVAP,
              IDTIPMANUALAP, NRORDEMIS, IDPRODSERVAP, QTPROPPRODINIAP, QTPROPPRODFINAP
       FROM TRAB_APURACM
       WHERE CDCIAAP       = P_CDCIA  AND
             CDFILIALAP    = P_FILIPROC AND
             NRAPURACFATAP = P_NRAPURACFATM 

       GROUP BY CDCIAAP, NRDELIVERYAP, NRORDEMIS, IDTIPMANUALAP, VRCOTDOLARAP, CDFISCOPERAP, CDSUFXCFOPAP,
                IDSERVICOAP, NRSERVICOCIAFILIAP, CDCLASSEAP, CDCICLOAP, CDPRODUTOAP, DSSERVFATUAP,
                VRPUREASERVAP, VRPUDOLSERVAP, IDPRODSERVAP, QTPROPPRODINIAP, QTPROPPRODFINAP
       ORDER BY
          CDCIAAP, IDTIPMANUALAP, NRDELIVERYAP, VRCOTDOLARAP, CDFISCOPERAP, CDSUFXCFOPAP, IDSERVICOAP,
          NRSERVICOCIAFILIAP, CDCLASSEAP, CDCICLOAP, CDPRODUTOAP, DSSERVFATUAP, VRPUREASERVAP,
          VRPUDOLSERVAP, NRORDEMIS, IDPRODSERVAP) LOOP

       --Se A DELIVERYM for Nacional 
       IF CURS_APDELIVERYM.IDTIPMANUALAP = '1' THEN
       
       
        /************************************************************************************************************************
            Gera uma Nova Nota fiscal em um dos casos:
                        
              1. Estiver apurando o primeiro servico (Primeiro dado do Cursor)
              2. For uma nova DELIVERYM (Na apuracao por DELIVERYM, laca uma NF para cada DELIVERYM)              
              3. For um Produto e tiver alcancado o maximo de Produtos em uma NF, e controlar quantidade maxima de Intens na NF
              4. For um Servico e tiver alcancado o maximo de Servicos em uma NF, e controlar quantidade maxima de Intens na NF
              5. Separa as NFs de Produto e de Servicos quando a empresa utilizar NF-E (Tela Parametros de DFS) e o municipio 
                 da empresa nao deve utilizar convenio de NF-E (campo "Convenio NF-E" da tela "Municipio")
              
         *************************************************************************************************************************/
          IF (CURS_APDELIVERYM.CDFISCOPERAP <> V_CDFISCOPER) OR
             (CURS_APDELIVERYM.NRDELIVERYAP <> V_NRDELIVERY) OR
             ((((V_NRCOUNTPR = V_NRMAXITNF)   AND (CURS_APDELIVERYM.IDPRODSERVAP = 'P')) OR
             ((V_NRCOUNTSV = V_NRMAXSERVNF) AND (CURS_APDELIVERYM.IDPRODSERVAP = 'S'))) AND
             (V_IDCONMAXITEM = 'S')) OR
            ((CURS_APDELIVERYM.IDPRODSERVAP <> V_IDPRODSERVAP) AND (V_IDMUNIUTCONVNFE = 'N') AND
            (V_IDEMPUTILIZANFE = 'S')) THEN

             V_NOVANOTA  := ' ';
             V_NRCOUNTPR := 0;
             V_NRCOUNTSV := 0;

             /* a procedure novo_codigo gera o novo sequencial e tambem
                confirma a inclusao da nota anterior, pois existe um COMMIT
                dentro da novo_codigo */

             NOVO_CODIGO('LANCNF/FILIAL' || P_FILIPROC,V_NRLANCTONF);
             V_NRLANCTONF  := SUBSTR(V_NRLANCTONF,11,10);

             V_NRSEQITPROD := 0;

             V_CDFISCOPER  := CURS_APDELIVERYM.CDFISCOPERAP;
             V_NRDELIVERY  := CURS_APDELIVERYM.NRDELIVERYAP;
             V_IDSERVICO   := CURS_APDELIVERYM.IDSERVICOAP;
             V_IDPRODSERVAP := CURS_APDELIVERYM.IDPRODSERVAP;

             /*************************************************
               A pedido da Sky Chefs, quando for uma NF com 
               Servicos, deve conter a Serie 'A'. Portanto,
               a serie de codigo 'A' deve estar cadastrada 
               na tela "Serie de Documentos Fiscais de Saida".
               
               Devido a uma Customizacao nao aprovada, este
               parametro teve que ser passado fixo no codigo,
               a pedido da propria Sky Chefs.
             **************************************************/
             IF CURS_APDELIVERYM.IDPRODSERVAP = 'S' THEN
                V_CDSERIE := 'A';
             ELSE
                V_CDSERIE := P_CDSERIE;
             END IF;

             INSERT INTO NOTAFISCAL (CDFILIAL, NRLANCTONF, CDEMPRESA,
                                     CDINSCESTA, CDINSCMUNI, CDFILIEMIT,
                                     CDFILIRECE, IDTPIJURNF, NRINSJURNF,
                                     CDFORNECED, CDCLIENTE, IDERROS, IDAVISOS,
                                     IDBLOQUEADO, IDDOCFISCAL, IDDOCFINANC,
                                     NRNOTAFISC, DTENTRSAID,
                                     VRPRODUTOS, VRNOTAFISC, DTINIAPUFISC,
                                     DTAPROVACAO, CDOPERAPRO, DTCONTABIL,
                                     NRPLACAVEIC, SGUFVEIC, IDPGTOFRETE,
                                     DSQTDEVOLU, DSESPECVOLU, DSMARCAVOLU,
                                     DSNUMEVOLU, VRPBRUTOVOLU, VRPLIQUVOLU,
                                     IDENTRSAIDOP, CDTIPOOPER, CDSERIE, IDTPIJURTRAN,
                                     NRINSJURTRAN, VRTTMOEDESTR, IDSTATUS,
                                     IDSISTEMA, IDDOCFATUR, NRAPURACFATM, IDORIGDESTNF)
             VALUES (P_FILIPROC, V_NRLANCTONF, V_CDEMPRESA,
                     V_CDINSCESTA, V_CDINSCMUNI, P_FILIAL,
                     NULL, V_IDTPIJURCLIE, V_NRINSJURCLIE,
                     NULL, V_CDCLIENTE, NULL, NULL,
                     'N', 'N', 'N',
                     ' ', P_DTFECHAME,
                     0, 0, P_DTINIAPUR,
                     NULL, NULL, NULL,
                     NULL, NULL, NULL,
                     NULL, NULL, NULL,
                     NULL, 0, 0,
                     'S', V_CDTIPOOPERVENDA, V_CDSERIE, P_IDTPIJURTRAN,
                     P_NRINSJURTRAN, 0, 'P', 'FAC', 'S', P_NRAPURACFATM, 'C');
          END IF;

          V_NRSEQITPROD := V_NRSEQITPROD + 1;

          INSERT INTO ITEMPRODUTO (CDFILIAL, NRSEQITPROD,
                                   CDPRODUTO, CDPRODEMIS,
                                   DSPRODEMIS, IDATUVRESTOQ, QTITEMPROD,
                                   VRUNITITEM, VRDESCITEM, VRTOTAITEM,
                                   VRCONTITEM, VRBRUTITEM, VRITMOEDESTR,
                                   IDCONFORITEM, NRLANCTONF, CDFISOPEITEM,
                                   CDSUFXCFOPPR,
                                   IDERROSITEM, IDAVISOSITEM,
                                   QTPROPPRODINI, QTPROPPRODFIN)
          VALUES (P_FILIPROC, LPAD(TO_CHAR(V_NRSEQITPROD),4,'0'),
                  CURS_APDELIVERYM.CDPRODUTOAP, CURS_APDELIVERYM.IDTIPMANUALAP||CURS_APDELIVERYM.CDPRODUTOAP,
                  CURS_APDELIVERYM.DSSERVFATUAP, 'N', CURS_APDELIVERYM.NRTOTASERVAP,
                  CURS_APDELIVERYM.VRPUREASERVAP, 0,
                  CURS_APDELIVERYM.NRTOTASERVAP * CURS_APDELIVERYM.VRPUREASERVAP,
                  CURS_APDELIVERYM.NRTOTASERVAP * CURS_APDELIVERYM.VRPUREASERVAP,
                  CURS_APDELIVERYM.NRTOTASERVAP * CURS_APDELIVERYM.VRPUREASERVAP, 0,
                  'N', V_NRLANCTONF, CURS_APDELIVERYM.CDFISCOPERAP,
                  CURS_APDELIVERYM.CDSUFXCFOPAP, '00000','00000',
                  CURS_APDELIVERYM.QTPROPPRODINIAP, CURS_APDELIVERYM.QTPROPPRODFINAP);

          UPDATE TRAB_APURACM
          SET NRLANCTONFAP = V_NRLANCTONF
          WHERE CDCIAAP        = CURS_APDELIVERYM.CDCIAAP       AND
                CDFILIALAP     = P_FILIPROC                    AND
                NRAPURACFATAP  = P_NRAPURACFATM                 AND
                NRSERVICOCIAFILIAP    = CURS_APDELIVERYM.NRSERVICOCIAFILIAP   AND
                CDCLASSEAP     = CURS_APDELIVERYM.CDCLASSEAP AND
                CDCICLOAP      = CURS_APDELIVERYM.CDCICLOAP AND
                NRDELIVERYAP   = CURS_APDELIVERYM.NRDELIVERYAP  AND
                CDPRODUTOAP    = CURS_APDELIVERYM.CDPRODUTOAP   AND
                IDTIPMANUALAP  = CURS_APDELIVERYM.IDTIPMANUALAP AND
                DSSERVFATUAP   = CURS_APDELIVERYM.DSSERVFATUAP  AND
                (CDFISCOPERAP  = CURS_APDELIVERYM.CDFISCOPERAP  OR
                 CURS_APDELIVERYM.CDFISCOPERAP IS NULL)         AND
                (CDSUFXCFOPAP  = CURS_APDELIVERYM.CDSUFXCFOPAP  OR
                 CURS_APDELIVERYM.CDSUFXCFOPAP IS NULL)         AND
                (VRPUREASERVAP = CURS_APDELIVERYM.VRPUREASERVAP OR
                 CURS_APDELIVERYM.VRPUREASERVAP IS NULL)        AND
                NRLANCTONFAP IS NULL;

          IF CURS_APDELIVERYM.IDPRODSERVAP = 'S' THEN
             V_NRCOUNTSV := V_NRCOUNTSV + 1;
          ELSE
             V_NRCOUNTPR := V_NRCOUNTPR + 1;
          END IF;

      --Se A DELIVERYM for Internacional (Faturamento em Dolar)
      ELSIF CURS_APDELIVERYM.IDTIPMANUALAP = '2' THEN
      
         /*********************************************************************************************************************************
            Gera uma Nova Nota fiscal em um dos casos:
          
              1. Estiver apurando o primeiro servico (Primeiro dado do Cursor)
              2. For uma nova DELIVERYM (Na apuracao por DELIVERYM, laca uma NF para cada DELIVERYM)
              2. A cotacao do dolar mudar de uma linha do cursor para a outra
              3. For um Produto e tiver alcancado o maximo de Produtos em uma NF, e controlar quantidade maxima de Intens na NF
              4. For um Servico e tiver alcancado o maximo de Servicos em uma NF, e controlar quantidade maxima de Intens na NF
              5. Separa as NFs de Produto e de Servicos quando a empresa utilizar NF-E (Tela Parametros de DFS) e o municipio 
                 da empresa nao deve utilizar convenio de NF-E (campo "Convenio NF-E" da tela "Municipio")
              
         **********************************************************************************************************************************/ 
         IF (CURS_APDELIVERYM.CDFISCOPERAP <> V_CDFISCOPER) OR
            (CURS_APDELIVERYM.NRDELIVERYAP <> V_NRDELIVERY) OR
            (CURS_APDELIVERYM.VRCOTDOLARAP <> V_VRCOTDOLAR) OR
            ((((V_NRCOUNTPR = V_NRMAXITNF)   AND (CURS_APDELIVERYM.IDPRODSERVAP = 'P')) OR
            ((V_NRCOUNTSV = V_NRMAXSERVNF) AND (CURS_APDELIVERYM.IDPRODSERVAP = 'S'))) AND
            (V_IDCONMAXITEM = 'S')) OR
            ((CURS_APDELIVERYM.IDPRODSERVAP <> V_IDPRODSERVAP) AND (V_IDMUNIUTCONVNFE = 'N') AND
            (V_IDEMPUTILIZANFE = 'S')) THEN

            V_NOVANOTA  := ' ';
            V_NRCOUNTPR := 0;
            V_NRCOUNTSV := 0;

            /* a procedure novo_codigo gera o novo sequencial e tambem
               confirma a inclusao da nota anterior, pois existe um COMMIT
               dentro da novo_codigo */

            NOVO_CODIGO('LANCNF/FILIAL' || P_FILIPROC,V_NRLANCTONF);
            V_NRLANCTONF  := SUBSTR(V_NRLANCTONF,11,10);

            V_NRSEQITPROD := 0;

            V_CDFISCOPER  := CURS_APDELIVERYM.CDFISCOPERAP;
            V_NRDELIVERY  := CURS_APDELIVERYM.NRDELIVERYAP;
            V_VRCOTDOLAR  := CURS_APDELIVERYM.VRCOTDOLARAP;
            V_IDSERVICO   := CURS_APDELIVERYM.IDSERVICOAP;
            V_IDPRODSERVAP := CURS_APDELIVERYM.IDPRODSERVAP;

            /*************************************************
               A pedido da Sky Chefs, quando for uma NF com 
               Servicos, deve conter a Serie 'A'. Portanto,
               a serie de codigo 'A' deve estar cadastrada 
               na tela "Serie de Documentos Fiscais de Saida".
               
               Devido a uma Customizacao nao aprovada, este
               parametro teve que ser passado fixo no codigo,
               a pedido da propria Sky Chefs.
             **************************************************/
            IF CURS_APDELIVERYM.IDPRODSERVAP = 'S' THEN
               V_CDSERIE := 'A';
            ELSE
               V_CDSERIE := P_CDSERIE;
            END IF;

            INSERT INTO NOTAFISCAL (CDFILIAL, NRLANCTONF, CDEMPRESA,
                                    CDINSCESTA, CDINSCMUNI, CDFILIEMIT,
                                    CDFILIRECE, IDTPIJURNF, NRINSJURNF,
                                    CDFORNECED, CDCLIENTE, IDERROS, IDAVISOS,
                                    IDBLOQUEADO, IDDOCFISCAL, IDDOCFINANC,
                                    NRNOTAFISC, DTENTRSAID,
                                    VRPRODUTOS, VRNOTAFISC, DTINIAPUFISC,
                                    DTAPROVACAO, CDOPERAPRO, DTCONTABIL,
                                    NRPLACAVEIC, SGUFVEIC, IDPGTOFRETE,
                                    DSQTDEVOLU, DSESPECVOLU, DSMARCAVOLU,
                                    DSNUMEVOLU, VRPBRUTOVOLU, VRPLIQUVOLU,
                                    IDENTRSAIDOP, CDTIPOOPER, CDSERIE, IDTPIJURTRAN,
                                    NRINSJURTRAN, VRTTMOEDESTR, IDSTATUS,
                                    IDSISTEMA, IDDOCFATUR, NRAPURACFATM, IDORIGDESTNF)
            VALUES (P_FILIPROC, V_NRLANCTONF, V_CDEMPRESA,
                    V_CDINSCESTA, V_CDINSCMUNI, P_FILIAL,
                    NULL, V_IDTPIJURCLIE, V_NRINSJURCLIE,
                    NULL, V_CDCLIENTE, NULL, NULL,
                    'N', 'N', 'N',
                    ' ', P_DTFECHAME,
                    0, 0, P_DTINIAPUR,
                    NULL, NULL, NULL,
                    NULL, NULL, NULL,
                    NULL, NULL, NULL,
                    NULL, 0, 0,
                    'S', V_CDTIPOOPERVENDA, V_CDSERIE, P_IDTPIJURTRAN,
                    P_NRINSJURTRAN, 0, 'P', 'FAC', 'S', P_NRAPURACFATM, 'C');
         END IF;

         V_NRSEQITPROD := V_NRSEQITPROD + 1;

         V_VRINDICE := CURS_APDELIVERYM.VRCOTDOLARAP;

         IF V_VRINDICE IS NULL THEN
            RAISE_APPLICATION_ERROR(-20501, 'APPERRMSGSTR' || 'APP-00034' || 'APPERRMSGEND', TRUE);
            /*'Indice financeiro nao cadastrado para a companhia.', True);*/
         END IF;

         V_VRUNITITEM := CURS_APDELIVERYM.VRPUDOLSERVAP * V_VRINDICE;

         INSERT INTO ITEMPRODUTO (CDFILIAL, NRSEQITPROD,
                                  CDPRODUTO, CDPRODEMIS,
                                  DSPRODEMIS, IDATUVRESTOQ, QTITEMPROD,
                                  VRUNITITEM, VRDESCITEM, VRTOTAITEM,
                                  VRCONTITEM, VRBRUTITEM, VRITMOEDESTR,
                                  IDCONFORITEM, NRLANCTONF, CDFISOPEITEM,
                                  CDSUFXCFOPPR,
                                  IDERROSITEM, IDAVISOSITEM,
                                  QTPROPPRODINI, QTPROPPRODFIN)
         VALUES (P_FILIPROC, LPAD(TO_CHAR(V_NRSEQITPROD),4,'0'),
                 CURS_APDELIVERYM.CDPRODUTOAP, CURS_APDELIVERYM.IDTIPMANUALAP||CURS_APDELIVERYM.CDPRODUTOAP,
                 CURS_APDELIVERYM.DSSERVFATUAP, 'N', CURS_APDELIVERYM.NRTOTASERVAP,
                 V_VRUNITITEM, 0,
                 ROUND(CURS_APDELIVERYM.NRTOTASERVAP * V_VRUNITITEM,2),
                 ROUND(CURS_APDELIVERYM.NRTOTASERVAP * V_VRUNITITEM,2),
                 ROUND(CURS_APDELIVERYM.NRTOTASERVAP * V_VRUNITITEM,2),
                 ROUND(CURS_APDELIVERYM.NRTOTASERVAP * CURS_APDELIVERYM.VRPUDOLSERVAP,2),
                 'N', V_NRLANCTONF, CURS_APDELIVERYM.CDFISCOPERAP,
                 CURS_APDELIVERYM.CDSUFXCFOPAP, '00000','00000',
                 CURS_APDELIVERYM.QTPROPPRODINIAP, CURS_APDELIVERYM.QTPROPPRODFINAP);

          UPDATE TRAB_APURACM
          SET NRLANCTONFAP = V_NRLANCTONF
          WHERE CDCIAAP        = CURS_APDELIVERYM.CDCIAAP       AND
                CDFILIALAP     = P_FILIPROC                    AND
                NRAPURACFATAP  = P_NRAPURACFATM                 AND
                NRSERVICOCIAFILIAP    = CURS_APDELIVERYM.NRSERVICOCIAFILIAP   AND
                CDCLASSEAP     = CURS_APDELIVERYM.CDCLASSEAP AND
                CDCICLOAP      = CURS_APDELIVERYM.CDCICLOAP AND
                NRDELIVERYAP   = CURS_APDELIVERYM.NRDELIVERYAP  AND
                CDPRODUTOAP    = CURS_APDELIVERYM.CDPRODUTOAP   AND
                IDTIPMANUALAP  = CURS_APDELIVERYM.IDTIPMANUALAP AND
                DSSERVFATUAP   = CURS_APDELIVERYM.DSSERVFATUAP  AND
                (VRCOTDOLARAP  = CURS_APDELIVERYM.VRCOTDOLARAP  OR
                 CURS_APDELIVERYM.VRCOTDOLARAP IS NULL)         AND
                (CDFISCOPERAP  = CURS_APDELIVERYM.CDFISCOPERAP  OR
                 CURS_APDELIVERYM.CDFISCOPERAP IS NULL)         AND
                (CDSUFXCFOPAP  = CURS_APDELIVERYM.CDSUFXCFOPAP  OR
                 CURS_APDELIVERYM.CDSUFXCFOPAP IS NULL)         AND
                (VRPUDOLSERVAP = CURS_APDELIVERYM.VRPUDOLSERVAP OR
                 CURS_APDELIVERYM.VRPUDOLSERVAP IS NULL)        AND
                NRLANCTONFAP IS NULL;

          IF CURS_APDELIVERYM.IDPRODSERVAP = 'S' THEN
             V_NRCOUNTSV := V_NRCOUNTSV + 1;
          ELSE
             V_NRCOUNTPR := V_NRCOUNTPR + 1;
          END IF;
      END IF;
   END LOOP;

   /* RETORNA VALOR DA TAXA POR VOO E TRECHO*/
   FOR C_TAXAAEROPORTO IN
     (SELECT CDCIAAP, NRDELIVERYAP, IDTIPMANUALAP,SUM(NVL(VRTXAERORAP, 0)) AS VRTXAERORAP, SUM(NVL(VRTXAERODAP, 0)) AS VRTXAERODAP
        FROM TRAB_APURACM
       WHERE CDCIAAP = P_CDCIA
         AND CDFILIALAP = P_FILIPROC
         AND NRAPURACFATAP = P_NRAPURACFATM
       GROUP BY CDCIAAP, NRDELIVERYAP, IDTIPMANUALAP) LOOP

      /*-----------------------------------------------
         Dentre as NFs geradas durante a apuracao,
         busca a mais recente que contiver "Servicos"
         (Handling, por exemplo).
      -----------------------------------------------*/

      SELECT COUNT(1)
        INTO V_COUNT_SERVICO
        FROM TRAB_APURACM
       WHERE CDCIAAP = C_TAXAAEROPORTO.CDCIAAP
         AND NRDELIVERYAP = C_TAXAAEROPORTO.NRDELIVERYAP
         AND NRAPURACFATAP = P_NRAPURACFATM
         AND IDPRODSERVAP = 'S';


      /*************************************************************************
         se V_NRLANCTONFAP estiver vazio, nao foi gerada nenhuma NF com servicos,
         portanto uma nova NF de vservicos deve ser criada para a inclusao da
         taxa de aeroporto.
      **************************************************************************/
      IF (V_COUNT_SERVICO > 0) THEN

         NOVO_CODIGO('LANCNF/FILIAL' || P_FILIPROC,V_NRLANCTONF);
         V_NRLANCTONF  := SUBSTR(V_NRLANCTONF, 11, 10);

         INSERT INTO NOTAFISCAL (CDFILIAL, NRLANCTONF, CDEMPRESA,
                                 CDINSCESTA, CDINSCMUNI, CDFILIEMIT,
                                 CDFILIRECE, IDTPIJURNF, NRINSJURNF,
                                 CDFORNECED, CDCLIENTE, IDERROS, IDAVISOS,
                                 IDBLOQUEADO, IDDOCFISCAL, IDDOCFINANC,
                                 NRNOTAFISC, DTENTRSAID,
                                 VRPRODUTOS, VRNOTAFISC, DTINIAPUFISC,
                                 DTAPROVACAO, CDOPERAPRO, DTCONTABIL,
                                 NRPLACAVEIC, SGUFVEIC, IDPGTOFRETE,
                                 DSQTDEVOLU, DSESPECVOLU, DSMARCAVOLU,
                                 DSNUMEVOLU, VRPBRUTOVOLU, VRPLIQUVOLU,
                                 IDENTRSAIDOP, CDTIPOOPER, CDSERIE, IDTPIJURTRAN,
                                 NRINSJURTRAN, VRTTMOEDESTR, IDSTATUS,
                                 IDSISTEMA, IDDOCFATUR, NRAPURACFATM, IDORIGDESTNF)
         VALUES (P_FILIPROC, V_NRLANCTONF, V_CDEMPRESA,
                 V_CDINSCESTA, V_CDINSCMUNI, P_FILIAL,
                 NULL, V_IDTPIJURCLIE, V_NRINSJURCLIE,
                 NULL, V_CDCLIENTE, NULL, NULL,
                 'N', 'N', 'N',
                 ' ', P_DTFECHAME,
                 0, 0, P_DTINIAPUR,
                 NULL, NULL, NULL,
                 NULL, NULL, NULL,
                 NULL, NULL, NULL,
                 NULL, 0, 0,
                 'S', V_CDTIPOOPERVENDA, 'A', P_IDTPIJURTRAN,
                 P_NRINSJURTRAN, 0, 'P', 'FAC', 'S', P_NRAPURACFATM, 'C');

         --Calcula a Taxa de Aeroporto na nova Nota Fiscal de Servicos
         CALCULA_TAXAAEROPORTO(P_FILIAL, P_FILIPROC, V_NRLANCTONF, C_TAXAAEROPORTO.IDTIPMANUALAP, C_TAXAAEROPORTO.VRTXAERORAP, C_TAXAAEROPORTO.VRTXAERODAP);

         APURAC_DADOSADICM(P_FILIAL, P_FILIPROC, V_NRLANCTONF, C_TAXAAEROPORTO.CDCIAAP,'T' ,'T' ,'T',C_TAXAAEROPORTO.NRDELIVERYAP,'T','T','T');

      /*************************************************************************
         se V_NRLANCTONFAP nao estiver vazio, o mesmo contem a NF mais recente,
         dentre as geradas nesta Apuracao, que contenha servicos. Nesta
         NF sera incluida a Taxa de Aeroporto.
      **************************************************************************/
      ELSE
         SELECT MAX(NRLANCTONFAP)
           INTO V_NRLANCTONFAP
         FROM TRAB_APURACM
         WHERE CDCIAAP = C_TAXAAEROPORTO.CDCIAAP
           AND NRDELIVERYAP = C_TAXAAEROPORTO.NRDELIVERYAP
           AND NRAPURACFATAP = P_NRAPURACFATM
           AND IDPRODSERVAP = 'P';
         IF (V_NRLANCTONFAP  IS not NULL) THEN
            --Calcula a Taxa de Aeroporto na NF de servicos atual
            CALCULA_TAXAAEROPORTO(P_FILIAL, P_FILIPROC, V_NRLANCTONFAP, C_TAXAAEROPORTO.IDTIPMANUALAP, C_TAXAAEROPORTO.VRTXAERORAP, C_TAXAAEROPORTO.VRTXAERODAP);

         END IF;
      END IF;
   END LOOP;

   FOR C_CALCULANOTAPROD IN
      (SELECT NRLANCTONF
         FROM NOTAFISCAL
        WHERE CDFILIAL = P_FILIPROC
          AND NRAPURACFATM = P_NRAPURACFATM) LOOP

      CALCULA_DESCONTOSM(P_FILIAL, P_FILIPROC, C_CALCULANOTAPROD.NRLANCTONF, P_CDCIA, P_NRAPURACFATM);

      APURAC_FECHM(P_FILIAL, P_FILIPROC, C_CALCULANOTAPROD.NRLANCTONF, P_CDCIA, P_DTFECHAME, P_DTINIAPUR, P_DTFIMAPUR);

   END LOOP;
END;
/