CREATE OR REPLACE PROCEDURE APURAC_VOOCLASSEM(
   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_NRVOO        IN VARCHAR2 DEFAULT 'T',
   P_IDAGRUPSERV  IN SERVPLANOM.IDTIPSCBOSP%TYPE DEFAULT 'N',
   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_VRCOTDOLAR    TRAB_APURACM.VRCOTDOLARAP%TYPE;
   V_CDCLASSE      TRAB_APURACM.CDCLASSEAP%TYPE;
   V_NRVOO         TRAB_APURACM.NRVOOAP%TYPE;
   V_CDTRECHO      TRAB_APURACM.CDTRECHOAP%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_VRDESCDEL     DELIVERYM.VRDESCDEL%TYPE;
   V_VRDESCSRV     DELIVERYM.VRDESCSRV%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_NRLANCTONF := 'X';
   V_CDFISCOPER := 'X';
   V_CDCLASSE   := 'X';
   V_NRVOO      := 'X';
   V_CDTRECHO   := 'X';
   V_IDSERVICO  := 'X';
   V_VRCOTDOLAR := -1;

   V_NRSEQITPROD := 0;

   V_NOVANOTA := 'X';

   V_VRDESCDEL := 0;
   V_VRDESCSRV := 0;

   V_NRORDEMISPR := 0;
   V_NRORDEMISSV := V_NRMAXITNF;

   V_NRCOUNTPR   := 0;
   V_NRCOUNTSV   := 0;

   FOR CURS_APVOOCLASSE IN
      (SELECT CDCIAAP, CDCLASSEAP, NRVOOAP, CDTRECHOAP, VRCOTDOLARAP, IDTIPMANUALAP, CDFISCOPERAP, CDSUFXCFOPAP,
              IDSERVICOAP, NRSERVICOCIAFILIAP, 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, CDCLASSEAP, NRVOOAP, CDTRECHOAP, VRCOTDOLARAP, IDTIPMANUALAP, CDFISCOPERAP, CDSUFXCFOPAP,
                IDSERVICOAP, NRSERVICOCIAFILIAP, CDCICLOAP, CDPRODUTOAP, DSSERVFATUAP, VRPUREASERVAP, VRPUDOLSERVAP, IDPRODSERVAP,
                QTPROPPRODINIAP, QTPROPPRODFINAP
       ORDER BY CDCIAAP, IDTIPMANUALAP, CDCLASSEAP, NRVOOAP, CDTRECHOAP, VRCOTDOLARAP, CDFISCOPERAP, CDSUFXCFOPAP,
                IDSERVICOAP, NRSERVICOCIAFILIAP, CDCICLOAP, CDPRODUTOAP, DSSERVFATUAP, VRPUREASERVAP, VRPUDOLSERVAP, IDPRODSERVAP) LOOP

      IF CURS_APVOOCLASSE.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_APVOOCLASSE.CDCIAAP       AND
            CDFILIALAP            = P_FILIPROC                     AND
            NRAPURACFATAP         = P_NRAPURACFATM                  AND
            NRSERVICOCIAFILIAP    = CURS_APVOOCLASSE.NRSERVICOCIAFILIAP   AND
            CDCICLOAP               = CURS_APVOOCLASSE.CDCICLOAP AND
            NRVOOAP               = CURS_APVOOCLASSE.NRVOOAP       AND
            CDTRECHOAP            = CURS_APVOOCLASSE.CDTRECHOAP    AND
            CDCLASSEAP            = CURS_APVOOCLASSE.CDCLASSEAP    AND
            CDPRODUTOAP           = CURS_APVOOCLASSE.CDPRODUTOAP   AND
            IDTIPMANUALAP         = CURS_APVOOCLASSE.IDTIPMANUALAP AND
            IDPRODSERVAP          = CURS_APVOOCLASSE.IDPRODSERVAP  AND
            DSSERVFATUAP          = CURS_APVOOCLASSE.DSSERVFATUAP  AND
            (NVL(CDFISCOPERAP,0)  = NVL(CURS_APVOOCLASSE.CDFISCOPERAP,0))  AND
            (NVL(CDSUFXCFOPAP,0)  = NVL(CURS_APVOOCLASSE.CDSUFXCFOPAP,0))  AND
            (NVL(VRPUREASERVAP,0) = NVL(CURS_APVOOCLASSE.VRPUREASERVAP,0)) AND
            (NVL(VRPUDOLSERVAP,0) = NVL(CURS_APVOOCLASSE.VRPUDOLSERVAP,0));
   END LOOP;

   FOR CURS_APVOOCLASSE IN
      (SELECT CDCIAAP, VRCOTDOLARAP, NRVOOAP, CDTRECHOAP, CDCLASSEAP, CDFISCOPERAP, CDSUFXCFOPAP,
              IDSERVICOAP, NRSERVICOCIAFILIAP, CDCICLOAP, CDPRODUTOAP, DSSERVFATUAP, VRPUREASERVAP, VRPUDOLSERVAP,
              SUM(NRQTDESERVAP) NRTOTASERVAP,  NVL(SUM(VRDESCDELAP),0) VRDESCDELAP,
              IDTIPMANUALAP, IDPRODSERVAP, NRORDEMIS, QTPROPPRODINIAP, QTPROPPRODFINAP
       FROM TRAB_APURACM
       WHERE CDCIAAP       = P_CDCIA  AND
             CDFILIALAP    = P_FILIPROC AND
             NRAPURACFATAP = P_NRAPURACFATM AND
             ((INSTR(P_NRVOO, '_'||NRVOOAP) > 0) OR (P_NRVOO = 'T')) 

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

       --Se A DELIVERYM for Nacional 
       IF CURS_APVOOCLASSE.IDTIPMANUALAP = '1' THEN
       
          /************************************************************************************************************************
            Gera uma Nova Nota fiscal em um dos casos:
          
              1. Estiver apurando o primeiro servico (Primeiro dado do Cursor)
              2. Estiver um  novo Voo (No faturamento por Voo e Classe, uma nova NF e gerada a cada Voo e Classe, com os servicos do mesmo)
              3. Estiver uma nova Classe (No faturamento por Voo e Classe, uma nova NF e gerada a cada Voo e Classe, com os servicos do mesmo)
              4. For um Produto e tiver alcancado o maximo de Produtos em uma NF, e controlar quantidade maxima de Intens na NF
              5. For um Servico e tiver alcancado o maximo de Servicos em uma NF, e controlar quantidade maxima de Intens na NF
              6. Separa as NFs de Produto e de Servicos quando a empresa utilizar NF-E (Tela Parametros de DFS) e o municipio nao deve
                 da empresa nao deve utilizar convenio de NF-E (campo "Convenio NF-E" da tela "Municipio")
              
           *************************************************************************************************************************/
          IF (CURS_APVOOCLASSE.CDFISCOPERAP <> V_CDFISCOPER) OR
             (CURS_APVOOCLASSE.CDCLASSEAP   <> V_CDCLASSE)   OR
             (((CURS_APVOOCLASSE.NRVOOAP <> V_NRVOO) OR (CURS_APVOOCLASSE.CDTRECHOAP <> V_CDTRECHO)) AND
             (P_IDAGRUPSERV = 'N')) OR
             ((((V_NRCOUNTPR = V_NRMAXITNF)   AND (CURS_APVOOCLASSE.IDPRODSERVAP = 'P')) OR
             ((V_NRCOUNTSV = V_NRMAXSERVNF) AND (CURS_APVOOCLASSE.IDPRODSERVAP = 'S'))) AND
             (V_IDCONMAXITEM = 'S')) OR
             ((CURS_APVOOCLASSE.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_APVOOCLASSE.CDFISCOPERAP;
             V_CDCLASSE     := CURS_APVOOCLASSE.CDCLASSEAP;
             V_NRVOO        := CURS_APVOOCLASSE.NRVOOAP;
             V_CDTRECHO     := CURS_APVOOCLASSE.CDTRECHOAP;
             V_IDSERVICO    := CURS_APVOOCLASSE.IDSERVICOAP;
             V_IDPRODSERVAP := CURS_APVOOCLASSE.IDPRODSERVAP;

             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, P_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_APVOOCLASSE.CDPRODUTOAP, CURS_APVOOCLASSE.IDTIPMANUALAP||CURS_APVOOCLASSE.CDPRODUTOAP,
                  CURS_APVOOCLASSE.DSSERVFATUAP, 'N', CURS_APVOOCLASSE.NRTOTASERVAP,
                  CURS_APVOOCLASSE.VRPUREASERVAP, 0,
                  CURS_APVOOCLASSE.NRTOTASERVAP * CURS_APVOOCLASSE.VRPUREASERVAP,
                  CURS_APVOOCLASSE.NRTOTASERVAP * CURS_APVOOCLASSE.VRPUREASERVAP,
                  CURS_APVOOCLASSE.NRTOTASERVAP * CURS_APVOOCLASSE.VRPUREASERVAP, 0,
                  'N', V_NRLANCTONF, CURS_APVOOCLASSE.CDFISCOPERAP,
                  CURS_APVOOCLASSE.CDSUFXCFOPAP, '00000','00000',
                  CURS_APVOOCLASSE.QTPROPPRODINIAP, CURS_APVOOCLASSE.QTPROPPRODFINAP);

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

         IF CURS_APVOOCLASSE.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_APVOOCLASSE.IDTIPMANUALAP = '2' THEN
       
          /************************************************************************************************************************
            Gera uma Nova Nota fiscal em um dos casos:
          
              1. Estiver apurando o primeiro servico (Primeiro dado do Cursor)
              2. For um  novo Voo    (Na apuracao por Voo e Classe, gera uma nova NF para cada voo e Classe, com os servicos da mesma)
              2. For uma nova Classe (Na apuracao por Voo e Classe, gera uma nova NF para cada voo e Classe, com os servicos da mesma)
              3. A cotacao do dolar mudar de uma linha do cursor para a outra
              4. For um Produto e tiver alcancado o maximo de Produtos em uma NF, e controlar quantidade maxima de Intens na NF
              5. For um Servico e tiver alcancado o maximo de Servicos em uma NF, e controlar quantidade maxima de Intens na NF
              6. Separa as NFs de Produto e de Servicos quando a empresa utilizar NF-E (Tela Parametros de DFS) e o municipio nao deve
                 da empresa nao deve utilizar convenio de NF-E (campo "Convenio NF-E" da tela "Municipio")
              
           *************************************************************************************************************************/
          IF (CURS_APVOOCLASSE.CDFISCOPERAP <> V_CDFISCOPER) OR
             (CURS_APVOOCLASSE.CDCLASSEAP   <> V_CDCLASSE)   OR
             (((CURS_APVOOCLASSE.NRVOOAP <> V_NRVOO) OR (CURS_APVOOCLASSE.CDTRECHOAP <> V_CDTRECHO)) AND
             (P_IDAGRUPSERV = 'N')) OR
             (CURS_APVOOCLASSE.VRCOTDOLARAP <> V_VRCOTDOLAR) OR
             ((((V_NRCOUNTPR = V_NRMAXITNF)   AND (CURS_APVOOCLASSE.IDPRODSERVAP = 'P')) OR
             ((V_NRCOUNTSV = V_NRMAXSERVNF) AND (CURS_APVOOCLASSE.IDPRODSERVAP = 'S'))) AND
             (V_IDCONMAXITEM = 'S')) OR
             ((CURS_APVOOCLASSE.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_APVOOCLASSE.CDFISCOPERAP;
             V_CDCLASSE    := CURS_APVOOCLASSE.CDCLASSEAP;
             V_NRVOO       := CURS_APVOOCLASSE.NRVOOAP;
             V_CDTRECHO    := CURS_APVOOCLASSE.CDTRECHOAP;
             V_VRCOTDOLAR  := CURS_APVOOCLASSE.VRCOTDOLARAP;
             V_IDSERVICO   := CURS_APVOOCLASSE.IDSERVICOAP;
             V_IDPRODSERVAP := CURS_APVOOCLASSE.IDPRODSERVAP;

             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, P_CDSERIE, P_IDTPIJURTRAN,
                     P_NRINSJURTRAN, 0, 'P', 'FAC', 'S', P_NRAPURACFATM, 'C');
          END IF;

          V_NRSEQITPROD := V_NRSEQITPROD + 1;

          V_VRINDICE := CURS_APVOOCLASSE.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_APVOOCLASSE.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_APVOOCLASSE.CDPRODUTOAP, CURS_APVOOCLASSE.IDTIPMANUALAP||CURS_APVOOCLASSE.CDPRODUTOAP,
                  CURS_APVOOCLASSE.DSSERVFATUAP, 'N', CURS_APVOOCLASSE.NRTOTASERVAP,
                  V_VRUNITITEM, 0,
                  ROUND(CURS_APVOOCLASSE.NRTOTASERVAP * V_VRUNITITEM,2),
                  ROUND(CURS_APVOOCLASSE.NRTOTASERVAP * V_VRUNITITEM,2),
                  ROUND(CURS_APVOOCLASSE.NRTOTASERVAP * V_VRUNITITEM,2),
                  ROUND(CURS_APVOOCLASSE.NRTOTASERVAP * CURS_APVOOCLASSE.VRPUDOLSERVAP,2),
                  'N', V_NRLANCTONF, CURS_APVOOCLASSE.CDFISCOPERAP,
                  CURS_APVOOCLASSE.CDSUFXCFOPAP, '00000','00000',
                  CURS_APVOOCLASSE.QTPROPPRODINIAP, CURS_APVOOCLASSE.QTPROPPRODFINAP);

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

          IF CURS_APVOOCLASSE.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, NRVOOAP, CDTRECHOAP,CDCLASSEAP, 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, NRVOOAP, CDTRECHOAP, CDCLASSEAP, 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 NRVOOAP = C_TAXAAEROPORTO.NRVOOAP
         AND CDTRECHOAP = C_TAXAAEROPORTO.CDTRECHOAP
         AND CDCLASSEAP = C_TAXAAEROPORTO.CDCLASSEAP
         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, P_CDCIA, C_TAXAAEROPORTO.NRVOOAP, C_TAXAAEROPORTO.CDTRECHOAP,C_TAXAAEROPORTO.CDCLASSEAP,NULL,'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 NRVOOAP = C_TAXAAEROPORTO.NRVOOAP
           AND CDTRECHOAP = C_TAXAAEROPORTO.CDTRECHOAP
           AND CDCLASSEAP = C_TAXAAEROPORTO.CDCLASSEAP
           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;
/