CREATE OR REPLACE PROCEDURE APURAC_DELIVCLASSEM(
   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_VRCOTDOLAR    TRAB_APURACM.VRCOTDOLARAP%TYPE;
   V_CDCLASSE      TRAB_APURACM.CDCLASSEAP%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_VRDESCDEL     DELIVERYM.VRDESCDEL%TYPE;
   V_VRDESCSRV     DELIVERYM.VRDESCSRV%TYPE;

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

   V_NRMAXITNF     SERIENF.NRMAXITNF%TYPE;
   V_IDCONMAXITEM  SERIENF.IDCONMAXITEM%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;
BEGIN

   SELECT CDCLIENTE INTO V_CDCLIENTE
   FROM COMPANHIA
   WHERE CDCIA = P_CDCIA;

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

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

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

       GROUP BY CDCIAAP, NRDELIVERYAP, CDCLASSEAP, NRORDEMIS, VRCOTDOLARAP, IDTIPMANUALAP,
                CDFISCOPERAP, CDSUFXCFOPAP, IDSERVICOAP, NRSERVICOCIAFILIAP,CDCICLOAP, CDPRODUTOAP, DSSERVFATUAP,
                VRPUREASERVAP, VRPUDOLSERVAP, IDPRODSERVAP, QTPROPPRODINIAP, QTPROPPRODFINAP
       ORDER BY
          CDCIAAP, IDTIPMANUALAP, NRDELIVERYAP, CDCLASSEAP, VRCOTDOLARAP, CDFISCOPERAP, CDSUFXCFOPAP,
          IDSERVICOAP, NRSERVICOCIAFILIAP,CDCICLOAP, CDPRODUTOAP, DSSERVFATUAP, VRPUREASERVAP, VRPUDOLSERVAP,
          IDPRODSERVAP, NRORDEMIS) LOOP
       
        --Se A DELIVERYM for Nacional 
       IF CURS_APDELIVCLASSE.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 classe   (Na apuracao por DELIVERYM e classe, laca uma NF para cada DELIVERYM e Classe)              
              3. For uma nova DELIVERYM (Na apuracao por DELIVERYM e classe, laca uma NF para cada DELIVERYM e Classe)  
              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_APDELIVCLASSE.CDFISCOPERAP <> V_CDFISCOPER) OR
             (CURS_APDELIVCLASSE.CDCLASSEAP   <> V_CDCLASSE)   OR
             (CURS_APDELIVCLASSE.NRDELIVERYAP <> V_NRDELIVERY) OR
             ((((V_NRCOUNTPR = V_NRMAXITNF)   AND (CURS_APDELIVCLASSE.IDPRODSERVAP = 'P')) OR
             ((V_NRCOUNTSV = V_NRMAXSERVNF) AND (CURS_APDELIVCLASSE.IDPRODSERVAP = 'S'))) AND
             (V_IDCONMAXITEM = 'S')) OR
             ((CURS_APDELIVCLASSE.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_APDELIVCLASSE.CDFISCOPERAP;
             V_CDCLASSE    := CURS_APDELIVCLASSE.CDCLASSEAP;
             V_NRDELIVERY  := CURS_APDELIVCLASSE.NRDELIVERYAP;
             V_IDSERVICO   := CURS_APDELIVCLASSE.IDSERVICOAP;
             V_IDPRODSERVAP := CURS_APDELIVCLASSE.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', '01', 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_APDELIVCLASSE.CDPRODUTOAP, CURS_APDELIVCLASSE.IDTIPMANUALAP||CURS_APDELIVCLASSE.NRSERVICOCIAFILIAP,
                  CURS_APDELIVCLASSE.DSSERVFATUAP, 'N', CURS_APDELIVCLASSE.NRTOTASERVAP,
                  CURS_APDELIVCLASSE.VRPUREASERVAP, 0,
                  CURS_APDELIVCLASSE.NRTOTASERVAP * CURS_APDELIVCLASSE.VRPUREASERVAP,
                  CURS_APDELIVCLASSE.NRTOTASERVAP * CURS_APDELIVCLASSE.VRPUREASERVAP,
                  CURS_APDELIVCLASSE.NRTOTASERVAP * CURS_APDELIVCLASSE.VRPUREASERVAP, 0,
                  'N', V_NRLANCTONF, CURS_APDELIVCLASSE.CDFISCOPERAP,
                  CURS_APDELIVCLASSE.CDSUFXCFOPAP, '00000','00000',
                  CURS_APDELIVCLASSE.QTPROPPRODINIAP, CURS_APDELIVCLASSE.QTPROPPRODFINAP);

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

         IF CURS_APDELIVCLASSE.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_APDELIVCLASSE.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 classe   (Na apuracao por DELIVERYM e classe, laca uma NF para cada DELIVERYM e classe)
              3. For uma nova DELIVERYM (Na apuracao por DELIVERYM e classe, laca uma NF para cada DELIVERYM e classe)
              4. A cotacao do dolar mudar de uma linha do cursor para a outra
              5. For um Produto e tiver alcancado o maximo de Produtos em uma NF, e controlar quantidade maxima de Intens na NF
              6. For um Servico e tiver alcancado o maximo de Servicos em uma NF, e controlar quantidade maxima de Intens na NF
              7. 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_APDELIVCLASSE.CDFISCOPERAP <> V_CDFISCOPER) OR
             (CURS_APDELIVCLASSE.CDCLASSEAP   <> V_CDCLASSE)   OR
             (CURS_APDELIVCLASSE.NRDELIVERYAP <> V_NRDELIVERY) OR
             (CURS_APDELIVCLASSE.VRCOTDOLARAP <> V_VRCOTDOLAR) OR
             ((((V_NRCOUNTPR = V_NRMAXITNF)   AND (CURS_APDELIVCLASSE.IDPRODSERVAP = 'P')) OR
             ((V_NRCOUNTSV = V_NRMAXSERVNF) AND (CURS_APDELIVCLASSE.IDPRODSERVAP = 'S'))) AND
             (V_IDCONMAXITEM = 'S'))  OR
             ((CURS_APDELIVCLASSE.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_APDELIVCLASSE.CDFISCOPERAP;
             V_CDCLASSE    := CURS_APDELIVCLASSE.CDCLASSEAP;
             V_NRDELIVERY  := CURS_APDELIVCLASSE.NRDELIVERYAP;
             V_VRCOTDOLAR  := CURS_APDELIVCLASSE.VRCOTDOLARAP;
             V_IDSERVICO   := CURS_APDELIVCLASSE.IDSERVICOAP;
             V_IDPRODSERVAP := CURS_APDELIVCLASSE.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', '01', P_CDSERIE, P_IDTPIJURTRAN,
                     P_NRINSJURTRAN, 0, 'P', 'FAC', 'S', P_NRAPURACFATM, 'C');
          END IF;

          V_NRSEQITPROD := V_NRSEQITPROD + 1;

          V_VRINDICE := CURS_APDELIVCLASSE.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_APDELIVCLASSE.VRPUDOLSERVAP * V_VRINDICE;

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

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

         IF CURS_APDELIVCLASSE.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, 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, NRDELIVERYAP, 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 NRDELIVERYAP = C_TAXAAEROPORTO.NRDELIVERYAP
         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', '01', '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, 'T', 'T',C_TAXAAEROPORTO.CDCLASSEAP,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 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;
/